halmac_api_88xx.c 203 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617
  1. #include "halmac_88xx_cfg.h"
  2. /**
  3. * halmac_init_adapter_para_88xx() - int halmac adapter
  4. * @pHalmac_adapter
  5. *
  6. * SD1 internal use
  7. *
  8. * Author : KaiYuan Chang/Ivan Lin
  9. * Return : VOID
  10. */
  11. VOID
  12. halmac_init_adapter_para_88xx(
  13. IN PHALMAC_ADAPTER pHalmac_adapter
  14. )
  15. {
  16. pHalmac_adapter->api_record.array_wptr = 0;
  17. pHalmac_adapter->pHalAdapter_backup = pHalmac_adapter;
  18. pHalmac_adapter->pHalEfuse_map = (u8 *)NULL;
  19. pHalmac_adapter->hal_efuse_map_valid = _FALSE;
  20. pHalmac_adapter->efuse_end = 0;
  21. pHalmac_adapter->pHal_mac_addr[0].Address_L_H.Address_Low = 0;
  22. pHalmac_adapter->pHal_mac_addr[0].Address_L_H.Address_High = 0;
  23. pHalmac_adapter->pHal_mac_addr[1].Address_L_H.Address_Low = 0;
  24. pHalmac_adapter->pHal_mac_addr[1].Address_L_H.Address_High = 0;
  25. pHalmac_adapter->pHal_bss_addr[0].Address_L_H.Address_Low = 0;
  26. pHalmac_adapter->pHal_bss_addr[0].Address_L_H.Address_High = 0;
  27. pHalmac_adapter->pHal_bss_addr[1].Address_L_H.Address_Low = 0;
  28. pHalmac_adapter->pHal_bss_addr[1].Address_L_H.Address_High = 0;
  29. pHalmac_adapter->low_clk = _FALSE;
  30. pHalmac_adapter->max_download_size = HALMAC_FW_MAX_DL_SIZE_88XX;
  31. /* Init LPS Option */
  32. pHalmac_adapter->fwlps_option.mode = 0x01; /*0:Active 1:LPS 2:WMMPS*/
  33. pHalmac_adapter->fwlps_option.awake_interval = 1;
  34. pHalmac_adapter->fwlps_option.enter_32K = 1;
  35. pHalmac_adapter->fwlps_option.clk_request = 0;
  36. pHalmac_adapter->fwlps_option.rlbm = 0;
  37. pHalmac_adapter->fwlps_option.smart_ps = 0;
  38. pHalmac_adapter->fwlps_option.awake_interval = 1;
  39. pHalmac_adapter->fwlps_option.all_queue_uapsd = 0;
  40. pHalmac_adapter->fwlps_option.pwr_state = 0;
  41. pHalmac_adapter->fwlps_option.low_pwr_rx_beacon = 0;
  42. pHalmac_adapter->fwlps_option.ant_auto_switch = 0;
  43. pHalmac_adapter->fwlps_option.ps_allow_bt_high_Priority = 0;
  44. pHalmac_adapter->fwlps_option.protect_bcn = 0;
  45. pHalmac_adapter->fwlps_option.silence_period = 0;
  46. pHalmac_adapter->fwlps_option.fast_bt_connect = 0;
  47. pHalmac_adapter->fwlps_option.two_antenna_en = 0;
  48. pHalmac_adapter->fwlps_option.adopt_user_Setting = 1;
  49. pHalmac_adapter->fwlps_option.drv_bcn_early_shift = 0;
  50. pHalmac_adapter->config_para_info.pCfg_para_buf = NULL;
  51. pHalmac_adapter->config_para_info.pPara_buf_w = NULL;
  52. pHalmac_adapter->config_para_info.para_num = 0;
  53. pHalmac_adapter->config_para_info.full_fifo_mode = _FALSE;
  54. pHalmac_adapter->config_para_info.para_buf_size = 0;
  55. pHalmac_adapter->config_para_info.avai_para_buf_size = 0;
  56. pHalmac_adapter->config_para_info.offset_accumulation = 0;
  57. pHalmac_adapter->config_para_info.value_accumulation = 0;
  58. pHalmac_adapter->config_para_info.datapack_segment = 0;
  59. pHalmac_adapter->ch_sw_info.ch_info_buf = NULL;
  60. pHalmac_adapter->ch_sw_info.ch_info_buf_w = NULL;
  61. pHalmac_adapter->ch_sw_info.extra_info_en = 0;
  62. pHalmac_adapter->ch_sw_info.buf_size = 0;
  63. pHalmac_adapter->ch_sw_info.avai_buf_size = 0;
  64. pHalmac_adapter->ch_sw_info.total_size = 0;
  65. pHalmac_adapter->ch_sw_info.ch_num = 0;
  66. pHalmac_adapter->drv_info_size = 0;
  67. PLATFORM_RTL_MEMSET(pHalmac_adapter->pDriver_adapter, pHalmac_adapter->api_record.api_array, HALMAC_API_STUFF, sizeof(pHalmac_adapter->api_record.api_array));
  68. pHalmac_adapter->txff_allocation.tx_fifo_pg_num = 0;
  69. pHalmac_adapter->txff_allocation.ac_q_pg_num = 0;
  70. pHalmac_adapter->txff_allocation.rsvd_pg_bndy = 0;
  71. pHalmac_adapter->txff_allocation.rsvd_drv_pg_bndy = 0;
  72. pHalmac_adapter->txff_allocation.rsvd_h2c_extra_info_pg_bndy = 0;
  73. pHalmac_adapter->txff_allocation.rsvd_h2c_queue_pg_bndy = 0;
  74. pHalmac_adapter->txff_allocation.rsvd_cpu_instr_pg_bndy = 0;
  75. pHalmac_adapter->txff_allocation.rsvd_fw_txbuff_pg_bndy = 0;
  76. pHalmac_adapter->txff_allocation.pub_queue_pg_num = 0;
  77. pHalmac_adapter->txff_allocation.high_queue_pg_num = 0;
  78. pHalmac_adapter->txff_allocation.low_queue_pg_num = 0;
  79. pHalmac_adapter->txff_allocation.normal_queue_pg_num = 0;
  80. pHalmac_adapter->txff_allocation.extra_queue_pg_num = 0;
  81. pHalmac_adapter->txff_allocation.la_mode = HALMAC_LA_MODE_DISABLE;
  82. pHalmac_adapter->txff_allocation.rx_fifo_expanding_mode = HALMAC_RX_FIFO_EXPANDING_MODE_DISABLE;
  83. pHalmac_adapter->sdio_cmd53_4byte = HALMAC_SDIO_CMD53_4BYTE_MODE_DISABLE;
  84. pHalmac_adapter->sdio_hw_info.io_hi_speed_flag = 0;
  85. pHalmac_adapter->sdio_hw_info.spec_ver = HALMAC_SDIO_SPEC_VER_2_00;
  86. pHalmac_adapter->sdio_hw_info.clock_speed = 50;
  87. halmac_init_adapter_dynamic_para_88xx(pHalmac_adapter);
  88. halmac_init_state_machine_88xx(pHalmac_adapter);
  89. }
  90. /**
  91. * halmac_init_adapter_dynamic_para_88xx() - int halmac adapter
  92. * @pHalmac_adapter
  93. *
  94. * SD1 internal use
  95. *
  96. * Author : KaiYuan Chang/Ivan Lin
  97. * Return : VOID
  98. */
  99. VOID
  100. halmac_init_adapter_dynamic_para_88xx(
  101. IN PHALMAC_ADAPTER pHalmac_adapter
  102. )
  103. {
  104. pHalmac_adapter->h2c_packet_seq = 0;
  105. pHalmac_adapter->h2c_buf_free_space = 0;
  106. pHalmac_adapter->gen_info_valid = _FALSE;
  107. }
  108. /**
  109. * halmac_init_state_machine_88xx() - init halmac software state machine
  110. * @pHalmac_adapter
  111. *
  112. * SD1 internal use.
  113. *
  114. * Author : KaiYuan Chang/Ivan Lin
  115. * Return : VOID
  116. */
  117. VOID
  118. halmac_init_state_machine_88xx(
  119. IN PHALMAC_ADAPTER pHalmac_adapter
  120. )
  121. {
  122. PHALMAC_STATE pState = &(pHalmac_adapter->halmac_state);
  123. halmac_init_offload_feature_state_machine_88xx(pHalmac_adapter);
  124. pState->api_state = HALMAC_API_STATE_INIT;
  125. pState->dlfw_state = HALMAC_DLFW_NONE;
  126. pState->mac_power = HALMAC_MAC_POWER_OFF;
  127. pState->ps_state = HALMAC_PS_STATE_UNDEFINE;
  128. }
  129. /**
  130. * halmac_mount_api_88xx() - attach functions to function pointer
  131. * @pHalmac_adapter
  132. *
  133. * SD1 internal use
  134. *
  135. * Author : KaiYuan Chang/Ivan Lin
  136. * Return : HALMAC_RET_STATUS
  137. */
  138. HALMAC_RET_STATUS
  139. halmac_mount_api_88xx(
  140. IN PHALMAC_ADAPTER pHalmac_adapter
  141. )
  142. {
  143. VOID *pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  144. PHALMAC_API pHalmac_api = (PHALMAC_API)NULL;
  145. pHalmac_adapter->pHalmac_api = (PHALMAC_API)PLATFORM_RTL_MALLOC(pDriver_adapter, sizeof(HALMAC_API));
  146. if (NULL == pHalmac_adapter->pHalmac_api)
  147. return HALMAC_RET_MALLOC_FAIL;
  148. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  149. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ALWAYS, HALMAC_SVN_VER_88XX"\n");
  150. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ALWAYS, "HALMAC_MAJOR_VER_88XX = %x\n", HALMAC_MAJOR_VER_88XX);
  151. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ALWAYS, "HALMAC_PROTOTYPE_88XX = %x\n", HALMAC_PROTOTYPE_VER_88XX);
  152. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ALWAYS, "HALMAC_MINOR_VER_88XX = %x\n", HALMAC_MINOR_VER_88XX);
  153. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ALWAYS, "HALMAC_PATCH_VER_88XX = %x\n", HALMAC_PATCH_VER_88XX);
  154. /* Mount function pointer */
  155. pHalmac_api->halmac_download_firmware = halmac_download_firmware_88xx;
  156. pHalmac_api->halmac_free_download_firmware = halmac_free_download_firmware_88xx;
  157. pHalmac_api->halmac_get_fw_version = halmac_get_fw_version_88xx;
  158. pHalmac_api->halmac_cfg_mac_addr = halmac_cfg_mac_addr_88xx;
  159. pHalmac_api->halmac_cfg_bssid = halmac_cfg_bssid_88xx;
  160. pHalmac_api->halmac_cfg_multicast_addr = halmac_cfg_multicast_addr_88xx;
  161. pHalmac_api->halmac_pre_init_system_cfg = halmac_pre_init_system_cfg_88xx;
  162. pHalmac_api->halmac_init_system_cfg = halmac_init_system_cfg_88xx;
  163. pHalmac_api->halmac_init_edca_cfg = halmac_init_edca_cfg_88xx;
  164. pHalmac_api->halmac_cfg_operation_mode = halmac_cfg_operation_mode_88xx;
  165. pHalmac_api->halmac_cfg_ch_bw = halmac_cfg_ch_bw_88xx;
  166. pHalmac_api->halmac_cfg_bw = halmac_cfg_bw_88xx;
  167. pHalmac_api->halmac_init_wmac_cfg = halmac_init_wmac_cfg_88xx;
  168. pHalmac_api->halmac_init_mac_cfg = halmac_init_mac_cfg_88xx;
  169. pHalmac_api->halmac_init_sdio_cfg = halmac_init_sdio_cfg_88xx;
  170. pHalmac_api->halmac_init_usb_cfg = halmac_init_usb_cfg_88xx;
  171. pHalmac_api->halmac_init_pcie_cfg = halmac_init_pcie_cfg_88xx;
  172. pHalmac_api->halmac_deinit_sdio_cfg = halmac_deinit_sdio_cfg_88xx;
  173. pHalmac_api->halmac_deinit_usb_cfg = halmac_deinit_usb_cfg_88xx;
  174. pHalmac_api->halmac_deinit_pcie_cfg = halmac_deinit_pcie_cfg_88xx;
  175. pHalmac_api->halmac_dump_efuse_map = halmac_dump_efuse_map_88xx;
  176. pHalmac_api->halmac_dump_efuse_map_bt = halmac_dump_efuse_map_bt_88xx;
  177. pHalmac_api->halmac_write_efuse_bt = halmac_write_efuse_bt_88xx;
  178. pHalmac_api->halmac_dump_logical_efuse_map = halmac_dump_logical_efuse_map_88xx;
  179. pHalmac_api->halmac_pg_efuse_by_map = halmac_pg_efuse_by_map_88xx;
  180. pHalmac_api->halmac_get_efuse_size = halmac_get_efuse_size_88xx;
  181. pHalmac_api->halmac_get_efuse_available_size = halmac_get_efuse_available_size_88xx;
  182. pHalmac_api->halmac_get_c2h_info = halmac_get_c2h_info_88xx;
  183. pHalmac_api->halmac_get_logical_efuse_size = halmac_get_logical_efuse_size_88xx;
  184. pHalmac_api->halmac_write_logical_efuse = halmac_write_logical_efuse_88xx;
  185. pHalmac_api->halmac_read_logical_efuse = halmac_read_logical_efuse_88xx;
  186. pHalmac_api->halmac_cfg_fwlps_option = halmac_cfg_fwlps_option_88xx;
  187. pHalmac_api->halmac_cfg_fwips_option = halmac_cfg_fwips_option_88xx;
  188. pHalmac_api->halmac_enter_wowlan = halmac_enter_wowlan_88xx;
  189. pHalmac_api->halmac_leave_wowlan = halmac_leave_wowlan_88xx;
  190. pHalmac_api->halmac_enter_ps = halmac_enter_ps_88xx;
  191. pHalmac_api->halmac_leave_ps = halmac_leave_ps_88xx;
  192. pHalmac_api->halmac_h2c_lb = halmac_h2c_lb_88xx;
  193. pHalmac_api->halmac_debug = halmac_debug_88xx;
  194. pHalmac_api->halmac_cfg_parameter = halmac_cfg_parameter_88xx;
  195. pHalmac_api->halmac_update_datapack = halmac_update_datapack_88xx;
  196. pHalmac_api->halmac_run_datapack = halmac_run_datapack_88xx;
  197. pHalmac_api->halmac_cfg_drv_info = halmac_cfg_drv_info_88xx;
  198. pHalmac_api->halmac_send_bt_coex = halmac_send_bt_coex_88xx;
  199. pHalmac_api->halmac_verify_platform_api = halmac_verify_platform_api_88xx;
  200. pHalmac_api->halmac_update_packet = halmac_update_packet_88xx;
  201. pHalmac_api->halmac_bcn_ie_filter = halmac_bcn_ie_filter_88xx;
  202. pHalmac_api->halmac_cfg_txbf = halmac_cfg_txbf_88xx;
  203. pHalmac_api->halmac_cfg_mumimo = halmac_cfg_mumimo_88xx;
  204. pHalmac_api->halmac_cfg_sounding = halmac_cfg_sounding_88xx;
  205. pHalmac_api->halmac_del_sounding = halmac_del_sounding_88xx;
  206. pHalmac_api->halmac_su_bfer_entry_init = halmac_su_bfer_entry_init_88xx;
  207. pHalmac_api->halmac_su_bfee_entry_init = halmac_su_bfee_entry_init_88xx;
  208. pHalmac_api->halmac_mu_bfer_entry_init = halmac_mu_bfer_entry_init_88xx;
  209. pHalmac_api->halmac_mu_bfee_entry_init = halmac_mu_bfee_entry_init_88xx;
  210. pHalmac_api->halmac_su_bfer_entry_del = halmac_su_bfer_entry_del_88xx;
  211. pHalmac_api->halmac_su_bfee_entry_del = halmac_su_bfee_entry_del_88xx;
  212. pHalmac_api->halmac_mu_bfer_entry_del = halmac_mu_bfer_entry_del_88xx;
  213. pHalmac_api->halmac_mu_bfee_entry_del = halmac_mu_bfee_entry_del_88xx;
  214. pHalmac_api->halmac_add_ch_info = halmac_add_ch_info_88xx;
  215. pHalmac_api->halmac_add_extra_ch_info = halmac_add_extra_ch_info_88xx;
  216. pHalmac_api->halmac_ctrl_ch_switch = halmac_ctrl_ch_switch_88xx;
  217. pHalmac_api->halmac_p2pps = halmac_p2pps_88xx;
  218. pHalmac_api->halmac_clear_ch_info = halmac_clear_ch_info_88xx;
  219. pHalmac_api->halmac_send_general_info = halmac_send_general_info_88xx;
  220. pHalmac_api->halmac_start_iqk = halmac_start_iqk_88xx;
  221. pHalmac_api->halmac_ctrl_pwr_tracking = halmac_ctrl_pwr_tracking_88xx;
  222. pHalmac_api->halmac_psd = halmac_psd_88xx;
  223. pHalmac_api->halmac_cfg_la_mode = halmac_cfg_la_mode_88xx;
  224. pHalmac_api->halmac_cfg_rx_fifo_expanding_mode = halmac_cfg_rx_fifo_expanding_mode_88xx;
  225. pHalmac_api->halmac_config_security = halmac_config_security_88xx;
  226. pHalmac_api->halmac_get_used_cam_entry_num = halmac_get_used_cam_entry_num_88xx;
  227. pHalmac_api->halmac_read_cam_entry = halmac_read_cam_entry_88xx;
  228. pHalmac_api->halmac_write_cam = halmac_write_cam_88xx;
  229. pHalmac_api->halmac_clear_cam_entry = halmac_clear_cam_entry_88xx;
  230. pHalmac_api->halmac_get_hw_value = halmac_get_hw_value_88xx;
  231. pHalmac_api->halmac_set_hw_value = halmac_set_hw_value_88xx;
  232. pHalmac_api->halmac_cfg_drv_rsvd_pg_num = halmac_cfg_drv_rsvd_pg_num_88xx;
  233. pHalmac_api->halmac_get_chip_version = halmac_get_chip_version_88xx;
  234. pHalmac_api->halmac_query_status = halmac_query_status_88xx;
  235. pHalmac_api->halmac_reset_feature = halmac_reset_feature_88xx;
  236. pHalmac_api->halmac_check_fw_status = halmac_check_fw_status_88xx;
  237. pHalmac_api->halmac_dump_fw_dmem = halmac_dump_fw_dmem_88xx;
  238. pHalmac_api->halmac_cfg_max_dl_size = halmac_cfg_max_dl_size_88xx;
  239. pHalmac_api->halmac_dump_fifo = halmac_dump_fifo_88xx;
  240. pHalmac_api->halmac_get_fifo_size = halmac_get_fifo_size_88xx;
  241. pHalmac_api->halmac_chk_txdesc = halmac_chk_txdesc_88xx;
  242. pHalmac_api->halmac_dl_drv_rsvd_page = halmac_dl_drv_rsvd_page_88xx;
  243. pHalmac_api->halmac_cfg_csi_rate = halmac_cfg_csi_rate_88xx;
  244. pHalmac_api->halmac_sdio_cmd53_4byte = halmac_sdio_cmd53_4byte_88xx;
  245. pHalmac_api->halmac_sdio_hw_info = halmac_sdio_hw_info_88xx;
  246. pHalmac_api->halmac_txfifo_is_empty = halmac_txfifo_is_empty_88xx;
  247. if (HALMAC_INTERFACE_SDIO == pHalmac_adapter->halmac_interface) {
  248. pHalmac_api->halmac_cfg_rx_aggregation = halmac_cfg_rx_aggregation_88xx_sdio;
  249. pHalmac_api->halmac_init_interface_cfg = halmac_init_sdio_cfg_88xx;
  250. pHalmac_api->halmac_deinit_interface_cfg = halmac_deinit_sdio_cfg_88xx;
  251. pHalmac_api->halmac_reg_read_8 = halmac_reg_read_8_sdio_88xx;
  252. pHalmac_api->halmac_reg_write_8 = halmac_reg_write_8_sdio_88xx;
  253. pHalmac_api->halmac_reg_read_16 = halmac_reg_read_16_sdio_88xx;
  254. pHalmac_api->halmac_reg_write_16 = halmac_reg_write_16_sdio_88xx;
  255. pHalmac_api->halmac_reg_read_32 = halmac_reg_read_32_sdio_88xx;
  256. pHalmac_api->halmac_reg_write_32 = halmac_reg_write_32_sdio_88xx;
  257. pHalmac_api->halmac_reg_read_indirect_32 = halmac_reg_read_indirect_32_sdio_88xx;
  258. pHalmac_api->halmac_reg_sdio_cmd53_read_n = halmac_reg_read_nbyte_sdio_88xx;
  259. } else if (HALMAC_INTERFACE_USB == pHalmac_adapter->halmac_interface) {
  260. pHalmac_api->halmac_cfg_rx_aggregation = halmac_cfg_rx_aggregation_88xx_usb;
  261. pHalmac_api->halmac_init_interface_cfg = halmac_init_usb_cfg_88xx;
  262. pHalmac_api->halmac_deinit_interface_cfg = halmac_deinit_usb_cfg_88xx;
  263. pHalmac_api->halmac_reg_read_8 = halmac_reg_read_8_usb_88xx;
  264. pHalmac_api->halmac_reg_write_8 = halmac_reg_write_8_usb_88xx;
  265. pHalmac_api->halmac_reg_read_16 = halmac_reg_read_16_usb_88xx;
  266. pHalmac_api->halmac_reg_write_16 = halmac_reg_write_16_usb_88xx;
  267. pHalmac_api->halmac_reg_read_32 = halmac_reg_read_32_usb_88xx;
  268. pHalmac_api->halmac_reg_write_32 = halmac_reg_write_32_usb_88xx;
  269. } else if (HALMAC_INTERFACE_PCIE == pHalmac_adapter->halmac_interface) {
  270. pHalmac_api->halmac_cfg_rx_aggregation = halmac_cfg_rx_aggregation_88xx_pcie;
  271. pHalmac_api->halmac_init_interface_cfg = halmac_init_pcie_cfg_88xx;
  272. pHalmac_api->halmac_deinit_interface_cfg = halmac_deinit_pcie_cfg_88xx;
  273. pHalmac_api->halmac_reg_read_8 = halmac_reg_read_8_pcie_88xx;
  274. pHalmac_api->halmac_reg_write_8 = halmac_reg_write_8_pcie_88xx;
  275. pHalmac_api->halmac_reg_read_16 = halmac_reg_read_16_pcie_88xx;
  276. pHalmac_api->halmac_reg_write_16 = halmac_reg_write_16_pcie_88xx;
  277. pHalmac_api->halmac_reg_read_32 = halmac_reg_read_32_pcie_88xx;
  278. pHalmac_api->halmac_reg_write_32 = halmac_reg_write_32_pcie_88xx;
  279. } else {
  280. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "Set halmac io function Error!!\n");
  281. }
  282. pHalmac_api->halmac_set_bulkout_num = halmac_set_bulkout_num_88xx;
  283. pHalmac_api->halmac_get_sdio_tx_addr = halmac_get_sdio_tx_addr_88xx;
  284. pHalmac_api->halmac_get_usb_bulkout_id = halmac_get_usb_bulkout_id_88xx;
  285. pHalmac_api->halmac_timer_2s = halmac_timer_2s_88xx;
  286. pHalmac_api->halmac_fill_txdesc_checksum = halmac_fill_txdesc_check_sum_88xx;
  287. if (HALMAC_CHIP_ID_8822B == pHalmac_adapter->chip_id) {
  288. #if HALMAC_8822B_SUPPORT
  289. /*mount 8822b function and data*/
  290. halmac_mount_api_8822b(pHalmac_adapter);
  291. #endif
  292. } else if (HALMAC_CHIP_ID_8821C == pHalmac_adapter->chip_id) {
  293. #if HALMAC_8821C_SUPPORT
  294. /*mount 8822b function and data*/
  295. halmac_mount_api_8821c(pHalmac_adapter);
  296. #endif
  297. } else {
  298. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "Chip ID undefine!!\n");
  299. return HALMAC_RET_CHIP_NOT_SUPPORT;
  300. }
  301. #if HALMAC_PLATFORM_TESTPROGRAM
  302. pHalmac_api->halmac_write_efuse = halmac_write_efuse_88xx;
  303. pHalmac_api->halmac_read_efuse = halmac_read_efuse_88xx;
  304. pHalmac_api->halmac_switch_efuse_bank = halmac_switch_efuse_bank_88xx;
  305. pHalmac_api->halmac_gen_txdesc = halmac_gen_tx_desc_88xx;
  306. pHalmac_api->halmac_txdesc_parser = halmac_tx_desc_parser_88xx;
  307. pHalmac_api->halmac_rxdesc_parser = halmac_rx_desc_parser_88xx;
  308. pHalmac_api->halmac_get_txdesc_size = halmac_get_txdesc_size_88xx;
  309. pHalmac_api->halmac_send_packet = halmac_send_packet_88xx;
  310. pHalmac_api->halmac_parse_packet = halmac_parse_packet_88xx;
  311. pHalmac_api->halmac_get_pcie_packet = halmac_get_pcie_packet_88xx;
  312. pHalmac_api->halmac_gen_txagg_desc = halmac_gen_txagg_desc_88xx;
  313. pHalmac_api->halmac_bb_reg_read = halmac_bb_reg_read_88xx;
  314. pHalmac_api->halmac_bb_reg_write = halmac_bb_reg_write_88xx;
  315. pHalmac_api->halmac_rf_reg_read = halmac_rf_ac_reg_read_88xx;
  316. pHalmac_api->halmac_rf_reg_write = halmac_rf_ac_reg_write_88xx;
  317. pHalmac_api->halmac_init_antenna_selection = halmac_init_antenna_selection_88xx;
  318. pHalmac_api->halmac_bb_preconfig = halmac_bb_preconfig_88xx;
  319. pHalmac_api->halmac_init_crystal_capacity = halmac_init_crystal_capacity_88xx;
  320. pHalmac_api->halmac_trx_antenna_setting = halmac_trx_antenna_setting_88xx;
  321. pHalmac_api->halmac_himr_setting_sdio = halmac_himr_setting_88xx_sdio;
  322. pHalmac_api->halmac_send_beacon = halmac_send_beacon_88xx;
  323. pHalmac_api->halmac_stop_beacon = halmac_stop_beacon_88xx;
  324. pHalmac_api->halmac_check_trx_status = halmac_check_trx_status_88xx;
  325. pHalmac_api->halmac_set_agg_num = halmac_set_agg_num_88xx;
  326. pHalmac_api->halmac_get_management_txdesc = halmac_get_management_txdesc_88xx;
  327. pHalmac_api->halmac_send_control = halmac_send_control_88xx;
  328. pHalmac_api->halmac_send_hiqueue = halmac_send_hiqueue_88xx;
  329. pHalmac_api->halmac_media_status_rpt = halmac_media_status_rpt_88xx;
  330. pHalmac_api->halmac_timer_10ms = halmac_timer_10ms_88xx;
  331. pHalmac_api->halmac_download_firmware_fpag = halmac_download_firmware_fpga_88xx;
  332. pHalmac_api->halmac_download_rom_fpga = halmac_download_rom_fpga_88xx;
  333. pHalmac_api->halmac_download_flash = halmac_download_flash_88xx;
  334. pHalmac_api->halmac_erase_flash = halmac_erase_flash_88xx;
  335. pHalmac_api->halmac_check_flash = halmac_check_flash_88xx;
  336. pHalmac_api->halmac_send_nlo = halmac_send_nlo_88xx;
  337. pHalmac_api->halmac_dump_cam_table = halmac_dump_cam_table_88xx;
  338. pHalmac_api->halmac_load_cam_table = halmac_load_cam_table_88xx;
  339. pHalmac_api->halmac_get_chip_type = halmac_get_chip_type_88xx;
  340. pHalmac_api->halmac_get_rx_agg_num = halmac_get_rx_agg_num_88xx;
  341. pHalmac_api->halmac_check_rx_scsi_resp = halmac_check_rx_scsi_resp_88xx_usb;
  342. pHalmac_api->halmac_get_hcpwm = halmac_get_hcpwm_88xx;
  343. pHalmac_api->halmac_get_hcpwm2 = halmac_get_hcpwm2_88xx;
  344. pHalmac_api->halmac_set_hrpwm = halmac_set_hrpwm_88xx;
  345. pHalmac_api->halmac_set_hrpwm2 = halmac_set_hrpwm2_88xx;
  346. #if HALMAC_8822B_SUPPORT
  347. if (pHalmac_adapter->chip_id == HALMAC_CHIP_ID_8822B)
  348. pHalmac_api->halmac_run_pwrseq = halmac_run_pwrseq_8822b;
  349. #endif
  350. #if HALMAC_8821C_SUPPORT
  351. if (pHalmac_adapter->chip_id == HALMAC_CHIP_ID_8821C)
  352. pHalmac_api->halmac_run_pwrseq = halmac_run_pwrseq_8821c;
  353. #endif
  354. if (HALMAC_INTERFACE_SDIO == pHalmac_adapter->halmac_interface) {
  355. pHalmac_api->halmac_reg_read_8 = halmac_reg_read_8_sdio_88xx;
  356. pHalmac_api->halmac_reg_write_8 = halmac_reg_write_8_sdio_88xx;
  357. pHalmac_api->halmac_reg_read_16 = halmac_reg_read_16_sdio_88xx;
  358. pHalmac_api->halmac_reg_write_16 = halmac_reg_write_16_sdio_88xx;
  359. pHalmac_api->halmac_reg_read_32 = halmac_reg_read_32_sdio_88xx;
  360. pHalmac_api->halmac_reg_write_32 = halmac_reg_write_32_sdio_88xx;
  361. }
  362. #endif
  363. return HALMAC_RET_SUCCESS;
  364. }
  365. /**
  366. * halmac_download_firmware_88xx() - download Firmware
  367. * @pHalmac_adapter : the adapter of halmac
  368. * @pHamacl_fw : firmware bin
  369. * @halmac_fw_size : firmware size
  370. * Author : KaiYuan Chang/Ivan Lin
  371. * Return : HALMAC_RET_STATUS
  372. * More details of status code can be found in prototype document
  373. */
  374. HALMAC_RET_STATUS
  375. halmac_download_firmware_88xx(
  376. IN PHALMAC_ADAPTER pHalmac_adapter,
  377. IN u8 *pHamacl_fw,
  378. IN u32 halmac_fw_size
  379. )
  380. {
  381. u8 value8;
  382. u8 *pFile_ptr;
  383. u16 value16;
  384. u32 restore_index = 0;
  385. u32 halmac_h2c_ver = 0, fw_h2c_ver = 0;
  386. u32 iram_pkt_size, dmem_pkt_size, eram_pkt_size = 0;
  387. VOID *pDriver_adapter = NULL;
  388. PHALMAC_API pHalmac_api;
  389. HALMAC_RESTORE_INFO restore_info[DLFW_RESTORE_REG_NUM_88XX];
  390. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  391. return HALMAC_RET_ADAPTER_INVALID;
  392. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  393. return HALMAC_RET_API_INVALID;
  394. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_DOWNLOAD_FIRMWARE);
  395. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  396. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  397. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_download_firmware_88xx ==========>\n");
  398. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_download_firmware_88xx start!!\n");
  399. if (halmac_fw_size > HALMAC_FW_SIZE_MAX_88XX || halmac_fw_size < HALMAC_FWHDR_SIZE_88XX) {
  400. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "FW size error!\n");
  401. return HALMAC_RET_FW_SIZE_ERR;
  402. }
  403. fw_h2c_ver = rtk_le32_to_cpu(*((u32 *)(pHamacl_fw + HALMAC_FWHDR_OFFSET_H2C_FORMAT_VER_88XX)));
  404. halmac_h2c_ver = H2C_FORMAT_VERSION;
  405. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac h2c/c2h format = %x, fw h2c/c2h format = %x!!\n", halmac_h2c_ver, fw_h2c_ver);
  406. if (fw_h2c_ver != halmac_h2c_ver)
  407. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_WARN, "[WARN]H2C/C2H version between HALMAC and FW is compatible!!\n");
  408. pHalmac_adapter->halmac_state.dlfw_state = HALMAC_DLFW_NONE;
  409. value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_SYS_FUNC_EN + 1);
  410. value8 = (u8)(value8 & ~(BIT(2)));
  411. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_SYS_FUNC_EN + 1, value8); /* Disable CPU reset */
  412. value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_RSV_CTRL + 1);
  413. value8 = (u8)(value8 & ~(BIT(0)));
  414. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_RSV_CTRL + 1, value8);
  415. restore_info[restore_index].length = 1;
  416. restore_info[restore_index].mac_register = REG_TXDMA_PQ_MAP + 1;
  417. restore_info[restore_index].value = HALMAC_REG_READ_8(pHalmac_adapter, REG_TXDMA_PQ_MAP + 1);
  418. restore_index++;
  419. value8 = HALMAC_DMA_MAPPING_HIGH << 6;
  420. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_TXDMA_PQ_MAP + 1, value8); /* set HIQ to hi priority */
  421. /* DLFW only use HIQ, map HIQ to hi priority */
  422. pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_HI] = HALMAC_DMA_MAPPING_HIGH;
  423. restore_info[restore_index].length = 1;
  424. restore_info[restore_index].mac_register = REG_CR;
  425. restore_info[restore_index].value = HALMAC_REG_READ_8(pHalmac_adapter, REG_CR);
  426. restore_index++;
  427. restore_info[restore_index].length = 4;
  428. restore_info[restore_index].mac_register = REG_H2CQ_CSR;
  429. restore_info[restore_index].value = BIT(31);
  430. restore_index++;
  431. value8 = BIT_HCI_TXDMA_EN | BIT_TXDMA_EN;
  432. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_CR, value8);
  433. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_H2CQ_CSR, BIT(31));
  434. /* Config hi priority queue and public priority queue page number (only for DLFW) */
  435. restore_info[restore_index].length = 2;
  436. restore_info[restore_index].mac_register = REG_FIFOPAGE_INFO_1;
  437. restore_info[restore_index].value = HALMAC_REG_READ_16(pHalmac_adapter, REG_FIFOPAGE_INFO_1);
  438. restore_index++;
  439. restore_info[restore_index].length = 4;
  440. restore_info[restore_index].mac_register = REG_RQPN_CTRL_2;
  441. restore_info[restore_index].value = HALMAC_REG_READ_32(pHalmac_adapter, REG_RQPN_CTRL_2) | BIT(31);
  442. restore_index++;
  443. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_INFO_1, 0x200);
  444. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_RQPN_CTRL_2, restore_info[restore_index - 1].value);
  445. if (HALMAC_INTERFACE_SDIO == pHalmac_adapter->halmac_interface) {
  446. HALMAC_REG_READ_32(pHalmac_adapter, REG_SDIO_FREE_TXPG);
  447. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_SDIO_TX_CTRL, 0x00000000);
  448. }
  449. halmac_update_fw_info_88xx(pHalmac_adapter, pHamacl_fw, halmac_fw_size);
  450. dmem_pkt_size = *((u32 *)(pHamacl_fw + HALMAC_FWHDR_OFFSET_DMEM_SIZE_88XX));
  451. iram_pkt_size = *((u32 *)(pHamacl_fw + HALMAC_FWHDR_OFFSET_IRAM_SIZE_88XX));
  452. if (0 != ((*(pHamacl_fw + HALMAC_FWHDR_OFFSET_MEM_USAGE_88XX)) & BIT(4)))
  453. eram_pkt_size = *((u32 *)(pHamacl_fw + HALMAC_FWHDR_OFFSET_ERAM_SIZE_88XX));
  454. dmem_pkt_size = rtk_le32_to_cpu(dmem_pkt_size);
  455. iram_pkt_size = rtk_le32_to_cpu(iram_pkt_size);
  456. eram_pkt_size = rtk_le32_to_cpu(eram_pkt_size);
  457. dmem_pkt_size += HALMAC_FW_CHKSUM_DUMMY_SIZE_88XX;
  458. iram_pkt_size += HALMAC_FW_CHKSUM_DUMMY_SIZE_88XX;
  459. if (0 != eram_pkt_size)
  460. eram_pkt_size += HALMAC_FW_CHKSUM_DUMMY_SIZE_88XX;
  461. if (halmac_fw_size != (HALMAC_FWHDR_SIZE_88XX + dmem_pkt_size + iram_pkt_size + eram_pkt_size)) {
  462. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "FW size mismatch the real fw size!\n");
  463. goto DLFW_FAIL;
  464. }
  465. value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_CR + 1);
  466. restore_info[restore_index].length = 1;
  467. restore_info[restore_index].mac_register = REG_CR + 1;
  468. restore_info[restore_index].value = value8;
  469. restore_index++;
  470. value8 = (u8)(value8 | BIT(0));
  471. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_CR + 1, value8); /* Enable SW TX beacon */
  472. value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_BCN_CTRL);
  473. restore_info[restore_index].length = 1;
  474. restore_info[restore_index].mac_register = REG_BCN_CTRL;
  475. restore_info[restore_index].value = value8;
  476. restore_index++;
  477. value8 = (u8)((value8 & (~BIT(3))) | BIT(4));
  478. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_BCN_CTRL, value8); /* Disable beacon related functions */
  479. value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_FWHW_TXQ_CTRL + 2);
  480. restore_info[restore_index].length = 1;
  481. restore_info[restore_index].mac_register = REG_FWHW_TXQ_CTRL + 2;
  482. restore_info[restore_index].value = value8;
  483. restore_index++;
  484. value8 = (u8)(value8 & ~(BIT(6)));
  485. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_FWHW_TXQ_CTRL + 2, value8); /* Disable ptcl tx bcnq */
  486. restore_info[restore_index].length = 2;
  487. restore_info[restore_index].mac_register = REG_FIFOPAGE_CTRL_2;
  488. restore_info[restore_index].value = HALMAC_REG_READ_16(pHalmac_adapter, REG_FIFOPAGE_CTRL_2) | BIT(15);
  489. restore_index++;
  490. value16 = 0x8000;
  491. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_CTRL_2, value16); /* Set beacon header to 0 */
  492. value16 = (u16)(HALMAC_REG_READ_16(pHalmac_adapter, REG_MCUFW_CTRL) & 0x3800);
  493. value16 |= BIT(0);
  494. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_MCUFW_CTRL, value16); /* MCU/FW setting */
  495. value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_CPU_DMEM_CON + 2);
  496. value8 &= ~(BIT(0));
  497. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_CPU_DMEM_CON + 2, value8);
  498. value8 |= BIT(0);
  499. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_CPU_DMEM_CON + 2, value8);
  500. /* Download to DMEM */
  501. pFile_ptr = pHamacl_fw + HALMAC_FWHDR_SIZE_88XX;
  502. /* if (HALMAC_RET_SUCCESS != halmac_dlfw_to_mem_88xx(pHalmac_adapter, pFile_ptr, HALMAC_OCPBASE_DMEM_88XX, dmem_pkt_size)) */
  503. if (HALMAC_RET_SUCCESS != halmac_dlfw_to_mem_88xx(pHalmac_adapter, pFile_ptr,
  504. rtk_le32_to_cpu(*((u32 *)(pHamacl_fw + HALMAC_FWHDR_OFFSET_DMEM_ADDR_88XX))) & ~(BIT(31)), dmem_pkt_size))
  505. goto DLFW_END;
  506. /* Download to IMEM */
  507. pFile_ptr = pHamacl_fw + HALMAC_FWHDR_SIZE_88XX + dmem_pkt_size;
  508. /* if (HALMAC_RET_SUCCESS != halmac_dlfw_to_mem_88xx(pHalmac_adapter, pFile_ptr, HALMAC_OCPBASE_IMEM_88XX, iram_pkt_size)) */
  509. if (HALMAC_RET_SUCCESS != halmac_dlfw_to_mem_88xx(pHalmac_adapter, pFile_ptr,
  510. rtk_le32_to_cpu(*((u32 *)(pHamacl_fw + HALMAC_FWHDR_OFFSET_IRAM_ADDR_88XX))) & ~(BIT(31)), iram_pkt_size))
  511. goto DLFW_END;
  512. /* Download to EMEM */
  513. if (0 != eram_pkt_size) {
  514. pFile_ptr = pHamacl_fw + HALMAC_FWHDR_SIZE_88XX + dmem_pkt_size + iram_pkt_size;
  515. if (HALMAC_RET_SUCCESS != halmac_dlfw_to_mem_88xx(pHalmac_adapter, pFile_ptr,
  516. rtk_le32_to_cpu(*((u32 *)(pHamacl_fw + HALMAC_FWHDR_OFFSET_EMEM_ADDR_88XX))) & ~(BIT(31)), eram_pkt_size))
  517. goto DLFW_END;
  518. }
  519. halmac_init_offload_feature_state_machine_88xx(pHalmac_adapter);
  520. DLFW_END:
  521. halmac_restore_mac_register_88xx(pHalmac_adapter, restore_info, DLFW_RESTORE_REG_NUM_88XX);
  522. if (HALMAC_RET_SUCCESS != halmac_dlfw_end_flow_88xx(pHalmac_adapter))
  523. goto DLFW_FAIL;
  524. pHalmac_adapter->halmac_state.dlfw_state = HALMAC_DLFW_DONE;
  525. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_download_firmware_88xx <==========\n");
  526. return HALMAC_RET_SUCCESS;
  527. DLFW_FAIL:
  528. /* Disable FWDL_EN */
  529. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_MCUFW_CTRL, (u8)(HALMAC_REG_READ_8(pHalmac_adapter, REG_MCUFW_CTRL) & ~(BIT(0))));
  530. return HALMAC_RET_DLFW_FAIL;
  531. }
  532. /**
  533. * halmac_free_download_firmware_88xx() - download specific memory firmware
  534. * @pHalmac_adapter
  535. * @dlfw_mem : memory selection
  536. * @pHamacl_fw : firmware bin
  537. * @halmac_fw_size : firmware size
  538. * Author : KaiYuan Chang/Ivan Lin
  539. * Return : HALMAC_RET_STATUS
  540. */
  541. HALMAC_RET_STATUS
  542. halmac_free_download_firmware_88xx(
  543. IN PHALMAC_ADAPTER pHalmac_adapter,
  544. IN HALMAC_DLFW_MEM dlfw_mem,
  545. IN u8 *pHamacl_fw,
  546. IN u32 halmac_fw_size
  547. )
  548. {
  549. u8 tx_pause_backup;
  550. u8 *pFile_ptr;
  551. u16 bcn_head_backup;
  552. u32 iram_pkt_size, dmem_pkt_size, eram_pkt_size = 0;
  553. VOID *pDriver_adapter = NULL;
  554. HALMAC_RET_STATUS status = HALMAC_RET_DLFW_FAIL;
  555. PHALMAC_API pHalmac_api;
  556. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  557. return HALMAC_RET_ADAPTER_INVALID;
  558. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  559. return HALMAC_RET_API_INVALID;
  560. if (HALMAC_RET_SUCCESS != halmac_fw_validate(pHalmac_adapter))
  561. return HALMAC_RET_NO_DLFW;
  562. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  563. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  564. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "[TRACE]halmac_free_download_firmware_88xx ==========>\n");
  565. if (halmac_fw_size > HALMAC_FW_SIZE_MAX_88XX || halmac_fw_size < HALMAC_FWHDR_SIZE_88XX) {
  566. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "[ERR]FW size error!\n");
  567. return HALMAC_RET_FW_SIZE_ERR;
  568. }
  569. dmem_pkt_size = *((u32 *)(pHamacl_fw + HALMAC_FWHDR_OFFSET_DMEM_SIZE_88XX));
  570. iram_pkt_size = *((u32 *)(pHamacl_fw + HALMAC_FWHDR_OFFSET_IRAM_SIZE_88XX));
  571. if (0 != ((*(pHamacl_fw + HALMAC_FWHDR_OFFSET_MEM_USAGE_88XX)) & BIT(4)))
  572. eram_pkt_size = *((u32 *)(pHamacl_fw + HALMAC_FWHDR_OFFSET_ERAM_SIZE_88XX));
  573. dmem_pkt_size = rtk_le32_to_cpu(dmem_pkt_size);
  574. iram_pkt_size = rtk_le32_to_cpu(iram_pkt_size);
  575. eram_pkt_size = rtk_le32_to_cpu(eram_pkt_size);
  576. dmem_pkt_size += HALMAC_FW_CHKSUM_DUMMY_SIZE_88XX;
  577. iram_pkt_size += HALMAC_FW_CHKSUM_DUMMY_SIZE_88XX;
  578. if (0 != eram_pkt_size)
  579. eram_pkt_size += HALMAC_FW_CHKSUM_DUMMY_SIZE_88XX;
  580. if (halmac_fw_size != (HALMAC_FWHDR_SIZE_88XX + dmem_pkt_size + iram_pkt_size + eram_pkt_size)) {
  581. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "[ERR]FW size mismatch the real fw size!\n");
  582. return HALMAC_RET_DLFW_FAIL;
  583. }
  584. tx_pause_backup = HALMAC_REG_READ_8(pHalmac_adapter, REG_TXPAUSE);
  585. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_TXPAUSE, tx_pause_backup | BIT(7));
  586. bcn_head_backup = HALMAC_REG_READ_16(pHalmac_adapter, REG_FIFOPAGE_CTRL_2) | BIT(15);
  587. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_CTRL_2, 0x8000);
  588. if (0 != eram_pkt_size) {
  589. pFile_ptr = pHamacl_fw + HALMAC_FWHDR_SIZE_88XX + dmem_pkt_size + iram_pkt_size;
  590. status = halmac_dlfw_to_mem_88xx(pHalmac_adapter, pFile_ptr,
  591. rtk_le32_to_cpu(*((u32 *)(pHamacl_fw + HALMAC_FWHDR_OFFSET_EMEM_ADDR_88XX))) & ~(BIT(31)), eram_pkt_size);
  592. if (HALMAC_RET_SUCCESS != status)
  593. goto DL_FREE_FW_END;
  594. }
  595. status = halmac_free_dl_fw_end_flow_88xx(pHalmac_adapter);
  596. DL_FREE_FW_END:
  597. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_TXPAUSE, tx_pause_backup);
  598. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_CTRL_2, bcn_head_backup);
  599. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "[TRACE]halmac_free_download_firmware_88xx <==========\n");
  600. return status;
  601. }
  602. /**
  603. * halmac_get_fw_version_88xx() - get FW version
  604. * @pHalmac_adapter : the adapter of halmac
  605. * @pFw_version : fw version info
  606. * Author : Ivan Lin
  607. * Return : HALMAC_RET_STATUS
  608. * More details of status code can be found in prototype document
  609. */
  610. HALMAC_RET_STATUS
  611. halmac_get_fw_version_88xx(
  612. IN PHALMAC_ADAPTER pHalmac_adapter,
  613. OUT PHALMAC_FW_VERSION pFw_version
  614. )
  615. {
  616. PHALMAC_FW_VERSION pFw_info = &(pHalmac_adapter->fw_version);
  617. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  618. return HALMAC_RET_ADAPTER_INVALID;
  619. if (pFw_version == NULL)
  620. return HALMAC_RET_NULL_POINTER;
  621. if (pHalmac_adapter->halmac_state.dlfw_state == HALMAC_DLFW_NONE) {
  622. return HALMAC_RET_NO_DLFW;
  623. } else {
  624. pFw_version->version = pFw_info->version;
  625. pFw_version->sub_version = pFw_info->sub_version;
  626. pFw_version->sub_index = pFw_info->sub_index;
  627. pFw_version->h2c_version = pFw_info->h2c_version;
  628. pFw_version->build_time.month = pFw_info->build_time.month;
  629. pFw_version->build_time.date = pFw_info->build_time.date;
  630. pFw_version->build_time.hour = pFw_info->build_time.hour;
  631. pFw_version->build_time.min = pFw_info->build_time.min;
  632. pFw_version->build_time.year = pFw_info->build_time.year;
  633. }
  634. return HALMAC_RET_SUCCESS;
  635. }
  636. /**
  637. * halmac_cfg_mac_addr_88xx() - config mac address
  638. * @pHalmac_adapter : the adapter of halmac
  639. * @halmac_port : 0 for port0, 1 for port1, 2 for port2, 3 for port3, 4 for port4
  640. * @pHal_address : mac address
  641. * Author : KaiYuan Chang/Ivan Lin
  642. * Return : HALMAC_RET_STATUS
  643. * More details of status code can be found in prototype document
  644. */
  645. HALMAC_RET_STATUS
  646. halmac_cfg_mac_addr_88xx(
  647. IN PHALMAC_ADAPTER pHalmac_adapter,
  648. IN u8 halmac_port,
  649. IN PHALMAC_WLAN_ADDR pHal_address
  650. )
  651. {
  652. u16 mac_address_H;
  653. u32 mac_address_L;
  654. VOID *pDriver_adapter = NULL;
  655. PHALMAC_API pHalmac_api;
  656. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  657. return HALMAC_RET_ADAPTER_INVALID;
  658. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  659. return HALMAC_RET_API_INVALID;
  660. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  661. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  662. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "[TRACE]halmac_cfg_mac_addr_88xx ==========>\n");
  663. if (halmac_port >= HALMAC_PORTIDMAX) {
  664. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "[ERR]port index > 5\n");
  665. return HALMAC_RET_PORT_NOT_SUPPORT;
  666. }
  667. mac_address_L = pHal_address->Address_L_H.Address_Low;
  668. mac_address_H = pHal_address->Address_L_H.Address_High;
  669. mac_address_L = rtk_le32_to_cpu(mac_address_L);
  670. mac_address_H = rtk_le16_to_cpu(mac_address_H);
  671. pHalmac_adapter->pHal_mac_addr[halmac_port].Address_L_H.Address_Low = mac_address_L;
  672. pHalmac_adapter->pHal_mac_addr[halmac_port].Address_L_H.Address_High = mac_address_H;
  673. switch (halmac_port) {
  674. case HALMAC_PORTID0:
  675. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_MACID, mac_address_L);
  676. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_MACID + 4, mac_address_H);
  677. break;
  678. case HALMAC_PORTID1:
  679. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_MACID1, mac_address_L);
  680. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_MACID1 + 4, mac_address_H);
  681. break;
  682. case HALMAC_PORTID2:
  683. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_MACID2, mac_address_L);
  684. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_MACID2 + 4, mac_address_H);
  685. break;
  686. case HALMAC_PORTID3:
  687. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_MACID3, mac_address_L);
  688. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_MACID3 + 4, mac_address_H);
  689. break;
  690. case HALMAC_PORTID4:
  691. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_MACID4, mac_address_L);
  692. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_MACID4 + 4, mac_address_H);
  693. break;
  694. default:
  695. break;
  696. }
  697. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "[TRACE]halmac_cfg_mac_addr_88xx <==========\n");
  698. return HALMAC_RET_SUCCESS;
  699. }
  700. /**
  701. * halmac_cfg_bssid_88xx() - config BSSID
  702. * @pHalmac_adapter : the adapter of halmac
  703. * @halmac_port : 0 for port0, 1 for port1, 2 for port2, 3 for port3, 4 for port4
  704. * @pHal_address : bssid
  705. * Author : KaiYuan Chang/Ivan Lin
  706. * Return : HALMAC_RET_STATUS
  707. * More details of status code can be found in prototype document
  708. */
  709. HALMAC_RET_STATUS
  710. halmac_cfg_bssid_88xx(
  711. IN PHALMAC_ADAPTER pHalmac_adapter,
  712. IN u8 halmac_port,
  713. IN PHALMAC_WLAN_ADDR pHal_address
  714. )
  715. {
  716. u16 bssid_address_H;
  717. u32 bssid_address_L;
  718. VOID *pDriver_adapter = NULL;
  719. PHALMAC_API pHalmac_api;
  720. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  721. return HALMAC_RET_ADAPTER_INVALID;
  722. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  723. return HALMAC_RET_API_INVALID;
  724. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  725. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  726. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "[TRACE]halmac_cfg_bssid_88xx ==========>\n");
  727. if (halmac_port >= HALMAC_PORTIDMAX) {
  728. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "[ERR]port index > 5\n");
  729. return HALMAC_RET_PORT_NOT_SUPPORT;
  730. }
  731. bssid_address_L = pHal_address->Address_L_H.Address_Low;
  732. bssid_address_H = pHal_address->Address_L_H.Address_High;
  733. bssid_address_L = rtk_le32_to_cpu(bssid_address_L);
  734. bssid_address_H = rtk_le16_to_cpu(bssid_address_H);
  735. pHalmac_adapter->pHal_bss_addr[halmac_port].Address_L_H.Address_Low = bssid_address_L;
  736. pHalmac_adapter->pHal_bss_addr[halmac_port].Address_L_H.Address_High = bssid_address_H;
  737. switch (halmac_port) {
  738. case HALMAC_PORTID0:
  739. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_BSSID, bssid_address_L);
  740. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_BSSID + 4, bssid_address_H);
  741. break;
  742. case HALMAC_PORTID1:
  743. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_BSSID1, bssid_address_L);
  744. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_BSSID1 + 4, bssid_address_H);
  745. break;
  746. case HALMAC_PORTID2:
  747. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_BSSID2, bssid_address_L);
  748. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_BSSID2 + 4, bssid_address_H);
  749. break;
  750. case HALMAC_PORTID3:
  751. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_BSSID3, bssid_address_L);
  752. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_BSSID3 + 4, bssid_address_H);
  753. break;
  754. case HALMAC_PORTID4:
  755. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_BSSID4, bssid_address_L);
  756. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_BSSID4 + 4, bssid_address_H);
  757. break;
  758. default:
  759. break;
  760. }
  761. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "[TRACE]halmac_cfg_bssid_88xx <==========\n");
  762. return HALMAC_RET_SUCCESS;
  763. }
  764. /**
  765. * halmac_cfg_multicast_addr_88xx() - config multicast address
  766. * @pHalmac_adapter : the adapter of halmac
  767. * @pHal_address : multicast address
  768. * Author : KaiYuan Chang/Ivan Lin
  769. * Return : HALMAC_RET_STATUS
  770. * More details of status code can be found in prototype document
  771. */
  772. HALMAC_RET_STATUS
  773. halmac_cfg_multicast_addr_88xx(
  774. IN PHALMAC_ADAPTER pHalmac_adapter,
  775. IN PHALMAC_WLAN_ADDR pHal_address
  776. )
  777. {
  778. u16 address_H;
  779. u32 address_L;
  780. VOID *pDriver_adapter = NULL;
  781. PHALMAC_API pHalmac_api;
  782. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  783. return HALMAC_RET_ADAPTER_INVALID;
  784. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  785. return HALMAC_RET_API_INVALID;
  786. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CFG_MULTICAST_ADDR);
  787. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  788. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  789. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_cfg_multicast_addr_88xx ==========>\n");
  790. address_L = pHal_address->Address_L_H.Address_Low;
  791. address_H = pHal_address->Address_L_H.Address_High;
  792. address_L = rtk_le32_to_cpu(address_L);
  793. address_H = rtk_le16_to_cpu(address_H);
  794. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_MAR, address_L);
  795. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_MAR + 4, address_H);
  796. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_cfg_multicast_addr_88xx <==========\n");
  797. return HALMAC_RET_SUCCESS;
  798. }
  799. /**
  800. * halmac_pre_init_system_cfg_88xx() - pre-init system config
  801. * @pHalmac_adapter : the adapter of halmac
  802. * Author : KaiYuan Chang/Ivan Lin
  803. * Return : HALMAC_RET_STATUS
  804. * More details of status code can be found in prototype document
  805. */
  806. HALMAC_RET_STATUS
  807. halmac_pre_init_system_cfg_88xx(
  808. IN PHALMAC_ADAPTER pHalmac_adapter
  809. )
  810. {
  811. u32 value32, counter;
  812. VOID *pDriver_adapter = NULL;
  813. PHALMAC_API pHalmac_api;
  814. u8 enable_bb;
  815. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  816. return HALMAC_RET_ADAPTER_INVALID;
  817. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  818. return HALMAC_RET_API_INVALID;
  819. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_PRE_INIT_SYSTEM_CFG);
  820. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  821. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  822. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_pre_init_system_cfg ==========>\n");
  823. if (HALMAC_INTERFACE_SDIO == pHalmac_adapter->halmac_interface) {
  824. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_SDIO_HSUS_CTRL, HALMAC_REG_READ_8(pHalmac_adapter, REG_SDIO_HSUS_CTRL) & ~(BIT(0)));
  825. counter = 10000;
  826. while (!(HALMAC_REG_READ_8(pHalmac_adapter, REG_SDIO_HSUS_CTRL) & 0x02)) {
  827. counter--;
  828. if (counter == 0)
  829. return HALMAC_RET_SDIO_LEAVE_SUSPEND_FAIL;
  830. }
  831. if (pHalmac_adapter->sdio_hw_info.spec_ver == HALMAC_SDIO_SPEC_VER_3_00)
  832. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_HCI_OPT_CTRL + 2, HALMAC_REG_READ_8(pHalmac_adapter, REG_HCI_OPT_CTRL + 2) | BIT(2));
  833. else
  834. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_HCI_OPT_CTRL + 2, HALMAC_REG_READ_8(pHalmac_adapter, REG_HCI_OPT_CTRL + 2) & ~(BIT(2)));
  835. } else if (HALMAC_INTERFACE_USB == pHalmac_adapter->halmac_interface) {
  836. if (HALMAC_REG_READ_8(pHalmac_adapter, REG_SYS_CFG2 + 3) == 0x20) /* usb3.0 */
  837. HALMAC_REG_WRITE_8(pHalmac_adapter, 0xFE5B, HALMAC_REG_READ_8(pHalmac_adapter, 0xFE5B) | BIT(4));
  838. }
  839. /* Config PIN Mux */
  840. value32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_PAD_CTRL1);
  841. value32 = value32 & (~(BIT(28) | BIT(29)));
  842. value32 = value32 | BIT(28) | BIT(29);
  843. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_PAD_CTRL1, value32);
  844. value32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_LED_CFG);
  845. value32 = value32 & (~(BIT(25) | BIT(26)));
  846. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_LED_CFG, value32);
  847. value32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_GPIO_MUXCFG);
  848. value32 = value32 & (~(BIT(2)));
  849. value32 = value32 | BIT(2);
  850. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_GPIO_MUXCFG, value32);
  851. enable_bb = _FALSE;
  852. halmac_set_hw_value_88xx(pHalmac_adapter, HALMAC_HW_EN_BB_RF, &enable_bb);
  853. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_pre_init_system_cfg <==========\n");
  854. return HALMAC_RET_SUCCESS;
  855. }
  856. /**
  857. * halmac_init_system_cfg_88xx() - init system config
  858. * @pHalmac_adapter : the adapter of halmac
  859. * Author : KaiYuan Chang/Ivan Lin
  860. * Return : HALMAC_RET_STATUS
  861. * More details of status code can be found in prototype document
  862. */
  863. HALMAC_RET_STATUS
  864. halmac_init_system_cfg_88xx(
  865. IN PHALMAC_ADAPTER pHalmac_adapter
  866. )
  867. {
  868. VOID *pDriver_adapter = NULL;
  869. PHALMAC_API pHalmac_api;
  870. u32 temp = 0;
  871. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  872. return HALMAC_RET_ADAPTER_INVALID;
  873. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  874. return HALMAC_RET_API_INVALID;
  875. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_INIT_SYSTEM_CFG);
  876. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  877. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  878. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_init_system_cfg ==========>\n");
  879. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_SYS_FUNC_EN + 1, HALMAC_FUNCTION_ENABLE_88XX);
  880. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_SYS_SDIO_CTRL, (u32)(HALMAC_REG_READ_32(pHalmac_adapter, REG_SYS_SDIO_CTRL) | BIT_LTE_MUX_CTRL_PATH));
  881. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_CPU_DMEM_CON, (u32)(HALMAC_REG_READ_32(pHalmac_adapter, REG_CPU_DMEM_CON) | BIT_WL_PLATFORM_RST));
  882. /*disable boot-from-flash for driver's DL FW*/
  883. temp = HALMAC_REG_READ_32(pHalmac_adapter, REG_MCUFW_CTRL);
  884. if (temp & BIT_BOOT_FSPI_EN) {
  885. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_MCUFW_CTRL, temp & (~BIT_BOOT_FSPI_EN));
  886. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_GPIO_MUXCFG, HALMAC_REG_READ_32(pHalmac_adapter, REG_GPIO_MUXCFG) & (~BIT_FSPI_EN));
  887. }
  888. /* pHalmac_api->halmac_init_h2c(pHalmac_adapter); */
  889. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_init_system_cfg <==========\n");
  890. return HALMAC_RET_SUCCESS;
  891. }
  892. /**
  893. * halmac_init_edca_cfg_88xx() - init EDCA config
  894. * @pHalmac_adapter : the adapter of halmac
  895. * Author : KaiYuan Chang/Ivan Lin
  896. * Return : HALMAC_RET_STATUS
  897. * More details of status code can be found in prototype document
  898. */
  899. HALMAC_RET_STATUS
  900. halmac_init_edca_cfg_88xx(
  901. IN PHALMAC_ADAPTER pHalmac_adapter
  902. )
  903. {
  904. u8 value8;
  905. u32 value32;
  906. VOID *pDriver_adapter = NULL;
  907. PHALMAC_API pHalmac_api;
  908. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  909. return HALMAC_RET_ADAPTER_INVALID;
  910. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  911. return HALMAC_RET_API_INVALID;
  912. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_INIT_EDCA_CFG);
  913. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  914. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  915. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_init_edca_cfg_88xx ==========>\n");
  916. /* Clear TX pause */
  917. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_TXPAUSE, 0x0000);
  918. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_SLOT, HALMAC_SLOT_TIME_88XX);
  919. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_PIFS, HALMAC_PIFS_TIME_88XX);
  920. value32 = HALMAC_SIFS_CCK_CTX_88XX | (HALMAC_SIFS_OFDM_CTX_88XX << BIT_SHIFT_SIFS_OFDM_CTX) |
  921. (HALMAC_SIFS_CCK_TRX_88XX << BIT_SHIFT_SIFS_CCK_TRX) | (HALMAC_SIFS_OFDM_TRX_88XX << BIT_SHIFT_SIFS_OFDM_TRX);
  922. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_SIFS, value32);
  923. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_EDCA_VO_PARAM, HALMAC_REG_READ_32(pHalmac_adapter, REG_EDCA_VO_PARAM) & 0xFFFF);
  924. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_EDCA_VO_PARAM + 2, HALMAC_VO_TXOP_LIMIT_88XX);
  925. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_EDCA_VI_PARAM + 2, HALMAC_VI_TXOP_LIMIT_88XX);
  926. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_RD_NAV_NXT, HALMAC_RDG_NAV_88XX | (HALMAC_TXOP_NAV_88XX << 16));
  927. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_RXTSF_OFFSET_CCK, HALMAC_CCK_RX_TSF_88XX | (HALMAC_OFDM_RX_TSF_88XX) << 8);
  928. value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_RD_CTRL + 1);
  929. value8 |= (BIT_VOQ_RD_INIT_EN | BIT_VIQ_RD_INIT_EN | BIT_BEQ_RD_INIT_EN);
  930. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_RD_CTRL + 1, value8);
  931. /* Set beacon cotnrol - enable TSF and other related functions */
  932. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_BCN_CTRL, (u8)(HALMAC_REG_READ_8(pHalmac_adapter, REG_BCN_CTRL) | BIT_EN_BCN_FUNCTION));
  933. /* Set send beacon related registers */
  934. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_TBTT_PROHIBIT, HALMAC_TBTT_PROHIBIT_88XX | (HALMAC_TBTT_HOLD_TIME_88XX << BIT_SHIFT_TBTT_HOLD_TIME_AP));
  935. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_DRVERLYINT, HALMAC_DRIVER_EARLY_INT_88XX);
  936. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_BCNDMATIM, HALMAC_BEACON_DMA_TIM_88XX);
  937. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_init_edca_cfg_88xx <==========\n");
  938. return HALMAC_RET_SUCCESS;
  939. }
  940. /**
  941. * halmac_init_wmac_cfg_88xx() - init wmac config
  942. * @pHalmac_adapter : the adapter of halmac
  943. * Author : KaiYuan Chang/Ivan Lin
  944. * Return : HALMAC_RET_STATUS
  945. * More details of status code can be found in prototype document
  946. */
  947. HALMAC_RET_STATUS
  948. halmac_init_wmac_cfg_88xx(
  949. IN PHALMAC_ADAPTER pHalmac_adapter
  950. )
  951. {
  952. VOID *pDriver_adapter = NULL;
  953. PHALMAC_API pHalmac_api;
  954. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  955. return HALMAC_RET_ADAPTER_INVALID;
  956. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  957. return HALMAC_RET_API_INVALID;
  958. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_INIT_WMAC_CFG);
  959. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  960. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  961. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_init_wmac_cfg_88xx ==========>\n");
  962. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_RXFLTMAP0, HALMAC_RX_FILTER0_88XX);
  963. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_RXFLTMAP, HALMAC_RX_FILTER_88XX);
  964. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_RCR, HALMAC_RCR_CONFIG_88XX);
  965. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_RX_PKT_LIMIT, HALMAC_RXPKT_MAX_SIZE_BASE512);
  966. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_TCR + 1, (u8)(HALMAC_REG_READ_8(pHalmac_adapter, REG_TCR + 1) | 0x30));
  967. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_TCR + 2, 0x30);
  968. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_TCR + 1, 0x00);
  969. #if HALMAC_8821C_SUPPORT
  970. if (HALMAC_CHIP_ID_8821C == pHalmac_adapter->chip_id)
  971. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_ACKTO_CCK, HALMAC_ACK_TO_CCK_88XX);
  972. #endif
  973. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_WMAC_OPTION_FUNCTION + 8, 0x30810041);
  974. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_WMAC_OPTION_FUNCTION + 4, 0x50802080);
  975. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_WL2LTECOEX_INDIRECT_ACCESS_CTRL_V1, 0xC00F0038);
  976. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_init_wmac_cfg_88xx <==========\n");
  977. return HALMAC_RET_SUCCESS;
  978. }
  979. /**
  980. * halmac_init_mac_cfg_88xx() - config page1~page7 register
  981. * @pHalmac_adapter : the adapter of halmac
  982. * @mode : trx mode
  983. * Author : KaiYuan Chang/Ivan Lin
  984. * Return : HALMAC_RET_STATUS
  985. * More details of status code can be found in prototype document
  986. */
  987. HALMAC_RET_STATUS
  988. halmac_init_mac_cfg_88xx(
  989. IN PHALMAC_ADAPTER pHalmac_adapter,
  990. IN HALMAC_TRX_MODE mode
  991. )
  992. {
  993. VOID *pDriver_adapter = NULL;
  994. PHALMAC_API pHalmac_api;
  995. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  996. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  997. return HALMAC_RET_ADAPTER_INVALID;
  998. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  999. return HALMAC_RET_API_INVALID;
  1000. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_INIT_MAC_CFG);
  1001. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1002. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  1003. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_init_mac_cfg_88xx ==========>mode = %d\n", mode);
  1004. status = pHalmac_api->halmac_init_trx_cfg(pHalmac_adapter, mode);
  1005. if (HALMAC_RET_SUCCESS != status) {
  1006. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_init_trx_cfg errorr = %x\n", status);
  1007. return status;
  1008. }
  1009. #if 1
  1010. status = pHalmac_api->halmac_init_protocol_cfg(pHalmac_adapter);
  1011. if (HALMAC_RET_SUCCESS != status) {
  1012. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_init_protocol_cfg_88xx error = %x\n", status);
  1013. return status;
  1014. }
  1015. status = halmac_init_edca_cfg_88xx(pHalmac_adapter);
  1016. if (HALMAC_RET_SUCCESS != status) {
  1017. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_init_edca_cfg_88xx error = %x\n", status);
  1018. return status;
  1019. }
  1020. status = halmac_init_wmac_cfg_88xx(pHalmac_adapter);
  1021. if (HALMAC_RET_SUCCESS != status) {
  1022. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_init_wmac_cfg_88xx error = %x\n", status);
  1023. return status;
  1024. }
  1025. #endif
  1026. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_init_mac_cfg_88xx <==========\n");
  1027. return status;
  1028. }
  1029. /**
  1030. * halmac_cfg_operation_mode_88xx() - config operation mode
  1031. * @pHalmac_adapter : the adapter of halmac
  1032. * @wireless_mode : 802.11 standard(b/g/n/ac¡K)
  1033. * Author : KaiYuan Chang/Ivan Lin
  1034. * Return : HALMAC_RET_STATUS
  1035. * More details of status code can be found in prototype document
  1036. */
  1037. HALMAC_RET_STATUS
  1038. halmac_cfg_operation_mode_88xx(
  1039. IN PHALMAC_ADAPTER pHalmac_adapter,
  1040. IN HALMAC_WIRELESS_MODE wireless_mode
  1041. )
  1042. {
  1043. VOID *pDriver_adapter = NULL;
  1044. HALMAC_WIRELESS_MODE wireless_mode_local = HALMAC_WIRELESS_MODE_UNDEFINE;
  1045. wireless_mode_local = wireless_mode;
  1046. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1047. return HALMAC_RET_ADAPTER_INVALID;
  1048. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1049. return HALMAC_RET_API_INVALID;
  1050. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CFG_OPERATION_MODE);
  1051. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1052. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_cfg_operation_mode_88xx ==========>wireless_mode = %d\n", wireless_mode);
  1053. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_cfg_operation_mode_88xx <==========\n");
  1054. return HALMAC_RET_SUCCESS;
  1055. }
  1056. /**
  1057. * halmac_cfg_ch_bw_88xx() - config channel & bandwidth
  1058. * @pHalmac_adapter : the adapter of halmac
  1059. * @channel : WLAN channel, support 2.4G & 5G
  1060. * @pri_ch_idx : primary channel index, idx1, idx2, idx3, idx4
  1061. * @bw : band width, 20, 40, 80, 160, 5 ,10
  1062. * Author : KaiYuan Chang
  1063. * Return : HALMAC_RET_STATUS
  1064. * More details of status code can be found in prototype document
  1065. */
  1066. HALMAC_RET_STATUS
  1067. halmac_cfg_ch_bw_88xx(
  1068. IN PHALMAC_ADAPTER pHalmac_adapter,
  1069. IN u8 channel,
  1070. IN HALMAC_PRI_CH_IDX pri_ch_idx,
  1071. IN HALMAC_BW bw
  1072. )
  1073. {
  1074. VOID *pDriver_adapter = NULL;
  1075. PHALMAC_API pHalmac_api;
  1076. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1077. return HALMAC_RET_ADAPTER_INVALID;
  1078. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1079. return HALMAC_RET_API_INVALID;
  1080. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CFG_CH_BW);
  1081. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1082. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  1083. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_cfg_ch_bw_88xx ==========>ch = %d, idx=%d, bw=%d\n", channel, pri_ch_idx, bw);
  1084. halmac_cfg_pri_ch_idx_88xx(pHalmac_adapter, pri_ch_idx);
  1085. halmac_cfg_bw_88xx(pHalmac_adapter, bw);
  1086. halmac_cfg_ch_88xx(pHalmac_adapter, channel);
  1087. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_cfg_ch_bw_88xx <==========\n");
  1088. return HALMAC_RET_SUCCESS;
  1089. }
  1090. HALMAC_RET_STATUS
  1091. halmac_cfg_ch_88xx(
  1092. IN PHALMAC_ADAPTER pHalmac_adapter,
  1093. IN u8 channel
  1094. )
  1095. {
  1096. u8 value8;
  1097. VOID *pDriver_adapter = NULL;
  1098. PHALMAC_API pHalmac_api;
  1099. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1100. return HALMAC_RET_ADAPTER_INVALID;
  1101. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1102. return HALMAC_RET_API_INVALID;
  1103. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CFG_CH_BW);
  1104. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1105. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  1106. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_cfg_ch_88xx ==========>ch = %d\n", channel);
  1107. value8 = HALMAC_REG_READ_8(pHalmac_adapter, REG_CCK_CHECK);
  1108. value8 = value8 & (~(BIT(7)));
  1109. if (channel > 35)
  1110. value8 = value8 | BIT(7);
  1111. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_CCK_CHECK, value8);
  1112. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_cfg_ch_88xx <==========\n");
  1113. return HALMAC_RET_SUCCESS;
  1114. }
  1115. HALMAC_RET_STATUS
  1116. halmac_cfg_pri_ch_idx_88xx(
  1117. IN PHALMAC_ADAPTER pHalmac_adapter,
  1118. IN HALMAC_PRI_CH_IDX pri_ch_idx
  1119. )
  1120. {
  1121. u8 txsc_40 = 0, txsc_20 = 0;
  1122. VOID *pDriver_adapter = NULL;
  1123. PHALMAC_API pHalmac_api;
  1124. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1125. return HALMAC_RET_ADAPTER_INVALID;
  1126. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1127. return HALMAC_RET_API_INVALID;
  1128. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CFG_CH_BW);
  1129. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1130. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  1131. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_cfg_pri_ch_idx_88xx ==========> idx=%d\n", pri_ch_idx);
  1132. txsc_20 = pri_ch_idx;
  1133. if ((HALMAC_CH_IDX_1 == txsc_20) || (HALMAC_CH_IDX_3 == txsc_20))
  1134. txsc_40 = 9;
  1135. else
  1136. txsc_40 = 10;
  1137. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_DATA_SC, BIT_TXSC_20M(txsc_20) | BIT_TXSC_40M(txsc_40));
  1138. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_cfg_pri_ch_idx_88xx <==========\n");
  1139. return HALMAC_RET_SUCCESS;
  1140. }
  1141. /**
  1142. * halmac_cfg_bw_88xx() - config bandwidth
  1143. * @pHalmac_adapter : the adapter of halmac
  1144. * @bw : band width, 20, 40, 80, 160, 5 ,10
  1145. * Author : KaiYuan Chang
  1146. * Return : HALMAC_RET_STATUS
  1147. * More details of status code can be found in prototype document
  1148. */
  1149. HALMAC_RET_STATUS
  1150. halmac_cfg_bw_88xx(
  1151. IN PHALMAC_ADAPTER pHalmac_adapter,
  1152. IN HALMAC_BW bw
  1153. )
  1154. {
  1155. u32 value32;
  1156. VOID *pDriver_adapter = NULL;
  1157. PHALMAC_API pHalmac_api;
  1158. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1159. return HALMAC_RET_ADAPTER_INVALID;
  1160. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1161. return HALMAC_RET_API_INVALID;
  1162. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CFG_BW);
  1163. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1164. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  1165. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_cfg_bw_88xx ==========>bw=%d\n", bw);
  1166. /* RF Mode */
  1167. value32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_WMAC_TRXPTCL_CTL);
  1168. value32 = value32 & (~(BIT(7) | BIT(8)));
  1169. switch (bw) {
  1170. case HALMAC_BW_80:
  1171. value32 = value32 | BIT(7);
  1172. break;
  1173. case HALMAC_BW_40:
  1174. value32 = value32 | BIT(8);
  1175. break;
  1176. case HALMAC_BW_20:
  1177. case HALMAC_BW_10:
  1178. case HALMAC_BW_5:
  1179. break;
  1180. default:
  1181. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_cfg_bw_88xx switch case not support\n");
  1182. break;
  1183. }
  1184. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_WMAC_TRXPTCL_CTL, value32);
  1185. /* MAC CLK */
  1186. value32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_AFE_CTRL1);
  1187. value32 = (value32 & (~(BIT(20) | BIT(21)))) | (HALMAC_MAC_CLOCK_HW_DEF_80M << BIT_SHIFT_MAC_CLK_SEL);
  1188. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_AFE_CTRL1, value32);
  1189. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_USTIME_TSF, HALMAC_MAC_CLOCK_88XX);
  1190. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_USTIME_EDCA, HALMAC_MAC_CLOCK_88XX);
  1191. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_cfg_bw_88xx <==========\n");
  1192. return HALMAC_RET_SUCCESS;
  1193. }
  1194. /**
  1195. * halmac_dump_efuse_map_88xx() - dump "physical" efuse map
  1196. * @pHalmac_adapter : the adapter of halmac
  1197. * @cfg : dump efuse method
  1198. * Author : Ivan Lin/KaiYuan Chang
  1199. * Return : HALMAC_RET_STATUS
  1200. * More details of status code can be found in prototype document
  1201. */
  1202. HALMAC_RET_STATUS
  1203. halmac_dump_efuse_map_88xx(
  1204. IN PHALMAC_ADAPTER pHalmac_adapter,
  1205. IN HALMAC_EFUSE_READ_CFG cfg
  1206. )
  1207. {
  1208. VOID *pDriver_adapter = NULL;
  1209. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  1210. HALMAC_CMD_PROCESS_STATUS *pProcess_status = &(pHalmac_adapter->halmac_state.efuse_state_set.process_status);
  1211. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1212. return HALMAC_RET_ADAPTER_INVALID;
  1213. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1214. return HALMAC_RET_API_INVALID;
  1215. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_DUMP_EFUSE_MAP);
  1216. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1217. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_dump_efuse_map_88xx ==========>cfg=%d\n", cfg);
  1218. if (HALMAC_CMD_PROCESS_SENDING == *pProcess_status) {
  1219. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Wait event(dump efuse)...\n");
  1220. return HALMAC_RET_BUSY_STATE;
  1221. }
  1222. if (HALMAC_EFUSE_CMD_CONSTRUCT_IDLE != halmac_query_efuse_curr_state_88xx(pHalmac_adapter)) {
  1223. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Not idle state(dump efuse)...\n");
  1224. return HALMAC_RET_ERROR_STATE;
  1225. }
  1226. if (HALMAC_MAC_POWER_OFF == pHalmac_adapter->halmac_state.mac_power)
  1227. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_WARN, "[WARN]Dump efuse in suspend mode\n");
  1228. *pProcess_status = HALMAC_CMD_PROCESS_IDLE;
  1229. pHalmac_adapter->event_trigger.physical_efuse_map = 1;
  1230. status = halmac_func_switch_efuse_bank_88xx(pHalmac_adapter, HALMAC_EFUSE_BANK_WIFI);
  1231. if (HALMAC_RET_SUCCESS != status) {
  1232. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac_func_switch_efuse_bank error = %x\n", status);
  1233. return status;
  1234. }
  1235. status = halmac_dump_efuse_88xx(pHalmac_adapter, cfg);
  1236. if (HALMAC_RET_SUCCESS != status) {
  1237. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac_read_efuse error = %x\n", status);
  1238. return status;
  1239. }
  1240. if (_TRUE == pHalmac_adapter->hal_efuse_map_valid) {
  1241. *pProcess_status = HALMAC_CMD_PROCESS_DONE;
  1242. PLATFORM_EVENT_INDICATION(pDriver_adapter, HALMAC_FEATURE_DUMP_PHYSICAL_EFUSE, *pProcess_status,
  1243. pHalmac_adapter->pHalEfuse_map, pHalmac_adapter->hw_config_info.efuse_size);
  1244. pHalmac_adapter->event_trigger.physical_efuse_map = 0;
  1245. }
  1246. if (HALMAC_RET_SUCCESS != halmac_transition_efuse_state_88xx(pHalmac_adapter, HALMAC_EFUSE_CMD_CONSTRUCT_IDLE))
  1247. return HALMAC_RET_ERROR_STATE;
  1248. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_TRACE, "halmac_dump_efuse_map_88xx <==========\n");
  1249. return HALMAC_RET_SUCCESS;
  1250. }
  1251. /**
  1252. * halmac_dump_efuse_map_bt_88xx() - dump "BT physical" efuse map
  1253. * @pHalmac_adapter : the adapter of halmac
  1254. * @halmac_efuse_bank : bt efuse bank
  1255. * @bt_efuse_map_size : bt efuse map size. get from halmac_get_efuse_size API
  1256. * @pBT_efuse_map : bt efuse map
  1257. * Author : Soar / Ivan Lin
  1258. * Return : HALMAC_RET_STATUS
  1259. * More details of status code can be found in prototype document
  1260. */
  1261. HALMAC_RET_STATUS
  1262. halmac_dump_efuse_map_bt_88xx(
  1263. IN PHALMAC_ADAPTER pHalmac_adapter,
  1264. IN HALMAC_EFUSE_BANK halmac_efuse_bank,
  1265. IN u32 bt_efuse_map_size,
  1266. OUT u8 *pBT_efuse_map
  1267. )
  1268. {
  1269. VOID *pDriver_adapter = NULL;
  1270. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  1271. HALMAC_CMD_PROCESS_STATUS *pProcess_status = &(pHalmac_adapter->halmac_state.efuse_state_set.process_status);
  1272. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1273. return HALMAC_RET_ADAPTER_INVALID;
  1274. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1275. return HALMAC_RET_API_INVALID;
  1276. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_DUMP_EFUSE_MAP_BT);
  1277. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1278. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_dump_efuse_map_bt_88xx ==========>\n");
  1279. if (pHalmac_adapter->hw_config_info.bt_efuse_size != bt_efuse_map_size)
  1280. return HALMAC_RET_EFUSE_SIZE_INCORRECT;
  1281. if ((halmac_efuse_bank >= HALMAC_EFUSE_BANK_MAX) || (halmac_efuse_bank == HALMAC_EFUSE_BANK_WIFI)) {
  1282. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "Undefined BT bank\n");
  1283. return HALMAC_RET_EFUSE_BANK_INCORRECT;
  1284. }
  1285. if (HALMAC_CMD_PROCESS_SENDING == *pProcess_status) {
  1286. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Wait event(dump efuse)...\n");
  1287. return HALMAC_RET_BUSY_STATE;
  1288. }
  1289. if (HALMAC_EFUSE_CMD_CONSTRUCT_IDLE != halmac_query_efuse_curr_state_88xx(pHalmac_adapter)) {
  1290. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Not idle state(dump efuse)...\n");
  1291. return HALMAC_RET_ERROR_STATE;
  1292. }
  1293. status = halmac_func_switch_efuse_bank_88xx(pHalmac_adapter, halmac_efuse_bank);
  1294. if (HALMAC_RET_SUCCESS != status) {
  1295. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac_func_switch_efuse_bank error = %x\n", status);
  1296. return status;
  1297. }
  1298. status = halmac_read_hw_efuse_88xx(pHalmac_adapter, 0, bt_efuse_map_size, pBT_efuse_map);
  1299. if (HALMAC_RET_SUCCESS != status) {
  1300. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac_read_hw_efuse_88xx error = %x\n", status);
  1301. return status;
  1302. }
  1303. if (HALMAC_RET_SUCCESS != halmac_transition_efuse_state_88xx(pHalmac_adapter, HALMAC_EFUSE_CMD_CONSTRUCT_IDLE))
  1304. return HALMAC_RET_ERROR_STATE;
  1305. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_TRACE, "halmac_dump_efuse_map_bt_88xx <==========\n");
  1306. return HALMAC_RET_SUCCESS;
  1307. }
  1308. /**
  1309. * halmac_write_efuse_bt_88xx() - write "BT physical" efuse offset
  1310. * @pHalmac_adapter : the adapter of halmac
  1311. * @halmac_offset : offset
  1312. * @halmac_value : Write value
  1313. * @pBT_efuse_map : bt efuse map
  1314. * Author : Soar
  1315. * Return : HALMAC_RET_STATUS
  1316. * More details of status code can be found in prototype document
  1317. */
  1318. HALMAC_RET_STATUS
  1319. halmac_write_efuse_bt_88xx(
  1320. IN PHALMAC_ADAPTER pHalmac_adapter,
  1321. IN u32 halmac_offset,
  1322. IN u8 halmac_value,
  1323. IN HALMAC_EFUSE_BANK halmac_efuse_bank
  1324. )
  1325. {
  1326. VOID *pDriver_adapter = NULL;
  1327. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  1328. HALMAC_CMD_PROCESS_STATUS *pProcess_status = &(pHalmac_adapter->halmac_state.efuse_state_set.process_status);
  1329. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1330. return HALMAC_RET_ADAPTER_INVALID;
  1331. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1332. return HALMAC_RET_API_INVALID;
  1333. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_WRITE_EFUSE_BT);
  1334. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1335. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_TRACE, "halmac_write_efuse_bt_88xx ==========>\n");
  1336. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_TRACE, "offset : %X value : %X Bank : %X\n", halmac_offset, halmac_value, halmac_efuse_bank);
  1337. if (HALMAC_CMD_PROCESS_SENDING == *pProcess_status) {
  1338. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Wait/Rcvd event(dump efuse)...\n");
  1339. return HALMAC_RET_BUSY_STATE;
  1340. }
  1341. if (HALMAC_EFUSE_CMD_CONSTRUCT_IDLE != halmac_query_efuse_curr_state_88xx(pHalmac_adapter)) {
  1342. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Not idle state(dump efuse)...\n");
  1343. return HALMAC_RET_ERROR_STATE;
  1344. }
  1345. if (halmac_offset >= pHalmac_adapter->hw_config_info.efuse_size) {
  1346. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "Offset is too large\n");
  1347. return HALMAC_RET_EFUSE_SIZE_INCORRECT;
  1348. }
  1349. if ((halmac_efuse_bank > HALMAC_EFUSE_BANK_MAX) || (halmac_efuse_bank == HALMAC_EFUSE_BANK_WIFI)) {
  1350. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "Undefined BT bank\n");
  1351. return HALMAC_RET_EFUSE_BANK_INCORRECT;
  1352. }
  1353. status = halmac_func_switch_efuse_bank_88xx(pHalmac_adapter, halmac_efuse_bank);
  1354. if (HALMAC_RET_SUCCESS != status) {
  1355. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac_func_switch_efuse_bank error = %x\n", status);
  1356. return status;
  1357. }
  1358. status = halmac_func_write_efuse_88xx(pHalmac_adapter, halmac_offset, halmac_value);
  1359. if (HALMAC_RET_SUCCESS != status) {
  1360. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac_func_write_efuse error = %x\n", status);
  1361. return status;
  1362. }
  1363. if (HALMAC_RET_SUCCESS != halmac_transition_efuse_state_88xx(pHalmac_adapter, HALMAC_EFUSE_CMD_CONSTRUCT_IDLE))
  1364. return HALMAC_RET_ERROR_STATE;
  1365. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_TRACE, "halmac_write_efuse_bt_88xx <==========\n");
  1366. return HALMAC_RET_SUCCESS;
  1367. }
  1368. /**
  1369. * halmac_get_efuse_available_size_88xx() - get efuse available size
  1370. * @pHalmac_adapter : the adapter of halmac
  1371. * @halmac_size : physical efuse available size
  1372. * Author : Soar
  1373. * Return : HALMAC_RET_STATUS
  1374. * More details of status code can be found in prototype document
  1375. */
  1376. HALMAC_RET_STATUS
  1377. halmac_get_efuse_available_size_88xx(
  1378. IN PHALMAC_ADAPTER pHalmac_adapter,
  1379. OUT u32 *halmac_size
  1380. )
  1381. {
  1382. HALMAC_RET_STATUS status;
  1383. VOID *pDriver_adapter = NULL;
  1384. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1385. return HALMAC_RET_ADAPTER_INVALID;
  1386. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1387. return HALMAC_RET_API_INVALID;
  1388. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1389. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_TRACE, "halmac_get_efuse_available_size_88xx ==========>\n");
  1390. status = halmac_dump_logical_efuse_map_88xx(pHalmac_adapter, HALMAC_EFUSE_R_DRV);
  1391. if (HALMAC_RET_SUCCESS != status)
  1392. return status;
  1393. *halmac_size = pHalmac_adapter->hw_config_info.efuse_size - HALMAC_PROTECTED_EFUSE_SIZE_88XX - pHalmac_adapter->efuse_end;
  1394. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_TRACE, "halmac_get_efuse_available_size_88xx <==========\n");
  1395. return HALMAC_RET_SUCCESS;
  1396. }
  1397. /**
  1398. * halmac_get_efuse_size_88xx() - get "physical" efuse size
  1399. * @pHalmac_adapter : the adapter of halmac
  1400. * @halmac_size : physical efuse size
  1401. * Author : Ivan Lin/KaiYuan Chang
  1402. * Return : HALMAC_RET_STATUS
  1403. * More details of status code can be found in prototype document
  1404. */
  1405. HALMAC_RET_STATUS
  1406. halmac_get_efuse_size_88xx(
  1407. IN PHALMAC_ADAPTER pHalmac_adapter,
  1408. OUT u32 *halmac_size
  1409. )
  1410. {
  1411. VOID *pDriver_adapter = NULL;
  1412. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1413. return HALMAC_RET_ADAPTER_INVALID;
  1414. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1415. return HALMAC_RET_API_INVALID;
  1416. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_GET_EFUSE_SIZE);
  1417. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1418. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_TRACE, "halmac_get_efuse_size_88xx ==========>\n");
  1419. *halmac_size = pHalmac_adapter->hw_config_info.efuse_size;
  1420. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_TRACE, "halmac_get_efuse_size_88xx <==========\n");
  1421. return HALMAC_RET_SUCCESS;
  1422. }
  1423. /**
  1424. * halmac_get_logical_efuse_size_88xx() - get "logical" efuse size
  1425. * @pHalmac_adapter : the adapter of halmac
  1426. * @halmac_size : logical efuse size
  1427. * Author : Ivan Lin/KaiYuan Chang
  1428. * Return : HALMAC_RET_STATUS
  1429. * More details of status code can be found in prototype document
  1430. */
  1431. HALMAC_RET_STATUS
  1432. halmac_get_logical_efuse_size_88xx(
  1433. IN PHALMAC_ADAPTER pHalmac_adapter,
  1434. OUT u32 *halmac_size
  1435. )
  1436. {
  1437. VOID *pDriver_adapter = NULL;
  1438. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1439. return HALMAC_RET_ADAPTER_INVALID;
  1440. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1441. return HALMAC_RET_API_INVALID;
  1442. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_GET_LOGICAL_EFUSE_SIZE);
  1443. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1444. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_TRACE, "halmac_get_logical_efuse_size_88xx ==========>\n");
  1445. *halmac_size = pHalmac_adapter->hw_config_info.eeprom_size;
  1446. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_TRACE, "halmac_get_logical_efuse_size_88xx <==========\n");
  1447. return HALMAC_RET_SUCCESS;
  1448. }
  1449. /**
  1450. * halmac_dump_logical_efuse_map_88xx() - dump "logical" efuse map
  1451. * @pHalmac_adapter : the adapter of halmac
  1452. * @cfg : dump efuse method
  1453. * Author : Soar
  1454. * Return : HALMAC_RET_STATUS
  1455. * More details of status code can be found in prototype document
  1456. */
  1457. HALMAC_RET_STATUS
  1458. halmac_dump_logical_efuse_map_88xx(
  1459. IN PHALMAC_ADAPTER pHalmac_adapter,
  1460. IN HALMAC_EFUSE_READ_CFG cfg
  1461. )
  1462. {
  1463. u8 *pEeprom_map = NULL;
  1464. u32 eeprom_size = pHalmac_adapter->hw_config_info.eeprom_size;
  1465. VOID *pDriver_adapter = NULL;
  1466. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  1467. HALMAC_CMD_PROCESS_STATUS *pProcess_status = &(pHalmac_adapter->halmac_state.efuse_state_set.process_status);
  1468. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1469. return HALMAC_RET_ADAPTER_INVALID;
  1470. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1471. return HALMAC_RET_API_INVALID;
  1472. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_DUMP_LOGICAL_EFUSE_MAP);
  1473. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1474. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_TRACE, "halmac_dump_logical_efuse_map_88xx ==========>cfg = %d\n", cfg);
  1475. if (HALMAC_CMD_PROCESS_SENDING == *pProcess_status) {
  1476. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Wait/Rcvd event(dump efuse)...\n");
  1477. return HALMAC_RET_BUSY_STATE;
  1478. }
  1479. if (HALMAC_EFUSE_CMD_CONSTRUCT_IDLE != halmac_query_efuse_curr_state_88xx(pHalmac_adapter)) {
  1480. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Not idle state(dump efuse)...\n");
  1481. return HALMAC_RET_ERROR_STATE;
  1482. }
  1483. if (HALMAC_MAC_POWER_OFF == pHalmac_adapter->halmac_state.mac_power)
  1484. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_WARN, "[WARN]Dump logical efuse in suspend mode\n");
  1485. *pProcess_status = HALMAC_CMD_PROCESS_IDLE;
  1486. pHalmac_adapter->event_trigger.logical_efuse_map = 1;
  1487. status = halmac_func_switch_efuse_bank_88xx(pHalmac_adapter, HALMAC_EFUSE_BANK_WIFI);
  1488. if (HALMAC_RET_SUCCESS != status) {
  1489. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac_func_switch_efuse_bank error = %x\n", status);
  1490. return status;
  1491. }
  1492. status = halmac_dump_efuse_88xx(pHalmac_adapter, cfg);
  1493. if (HALMAC_RET_SUCCESS != status) {
  1494. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac_eeprom_parser_88xx error = %x\n", status);
  1495. return status;
  1496. }
  1497. if (_TRUE == pHalmac_adapter->hal_efuse_map_valid) {
  1498. *pProcess_status = HALMAC_CMD_PROCESS_DONE;
  1499. pEeprom_map = (u8 *)PLATFORM_RTL_MALLOC(pDriver_adapter, eeprom_size);
  1500. if (NULL == pEeprom_map) {
  1501. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac allocate local eeprom map Fail!!\n");
  1502. return HALMAC_RET_MALLOC_FAIL;
  1503. }
  1504. PLATFORM_RTL_MEMSET(pDriver_adapter, pEeprom_map, 0xFF, eeprom_size);
  1505. if (HALMAC_RET_SUCCESS != halmac_eeprom_parser_88xx(pHalmac_adapter, pHalmac_adapter->pHalEfuse_map, pEeprom_map))
  1506. return HALMAC_RET_EEPROM_PARSING_FAIL;
  1507. PLATFORM_EVENT_INDICATION(pDriver_adapter, HALMAC_FEATURE_DUMP_LOGICAL_EFUSE, *pProcess_status, pEeprom_map, eeprom_size);
  1508. pHalmac_adapter->event_trigger.logical_efuse_map = 0;
  1509. PLATFORM_RTL_FREE(pDriver_adapter, pEeprom_map, eeprom_size);
  1510. }
  1511. if (HALMAC_RET_SUCCESS != halmac_transition_efuse_state_88xx(pHalmac_adapter, HALMAC_EFUSE_CMD_CONSTRUCT_IDLE))
  1512. return HALMAC_RET_ERROR_STATE;
  1513. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_TRACE, "halmac_dump_logical_efuse_map_88xx <==========\n");
  1514. return HALMAC_RET_SUCCESS;
  1515. }
  1516. /**
  1517. * halmac_read_logical_efuse_88xx() - read logical efuse map 1 byte
  1518. * @pHalmac_adapter : the adapter of halmac
  1519. * @halmac_offset : offset
  1520. * @pValue : 1 byte efuse value
  1521. * Author : Soar
  1522. * Return : HALMAC_RET_STATUS
  1523. * More details of status code can be found in prototype document
  1524. */
  1525. HALMAC_RET_STATUS
  1526. halmac_read_logical_efuse_88xx(
  1527. IN PHALMAC_ADAPTER pHalmac_adapter,
  1528. IN u32 halmac_offset,
  1529. OUT u8 *pValue
  1530. )
  1531. {
  1532. u8 *pEeprom_map = NULL;
  1533. u32 eeprom_size = pHalmac_adapter->hw_config_info.eeprom_size;
  1534. VOID *pDriver_adapter = NULL;
  1535. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  1536. HALMAC_CMD_PROCESS_STATUS *pProcess_status = &(pHalmac_adapter->halmac_state.efuse_state_set.process_status);
  1537. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1538. return HALMAC_RET_ADAPTER_INVALID;
  1539. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1540. return HALMAC_RET_API_INVALID;
  1541. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_READ_LOGICAL_EFUSE);
  1542. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1543. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_TRACE, "halmac_read_logical_efuse_88xx ==========>\n");
  1544. if (halmac_offset >= eeprom_size) {
  1545. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "Offset is too large\n");
  1546. return HALMAC_RET_EFUSE_SIZE_INCORRECT;
  1547. }
  1548. if (HALMAC_CMD_PROCESS_SENDING == *pProcess_status) {
  1549. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Wait/Rcvd event(dump efuse)...\n");
  1550. return HALMAC_RET_BUSY_STATE;
  1551. }
  1552. if (HALMAC_EFUSE_CMD_CONSTRUCT_IDLE != halmac_query_efuse_curr_state_88xx(pHalmac_adapter)) {
  1553. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Not idle state(dump efuse)...\n");
  1554. return HALMAC_RET_ERROR_STATE;
  1555. }
  1556. status = halmac_func_switch_efuse_bank_88xx(pHalmac_adapter, HALMAC_EFUSE_BANK_WIFI);
  1557. if (HALMAC_RET_SUCCESS != status) {
  1558. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac_func_switch_efuse_bank error = %x\n", status);
  1559. return status;
  1560. }
  1561. pEeprom_map = (u8 *)PLATFORM_RTL_MALLOC(pDriver_adapter, eeprom_size);
  1562. if (NULL == pEeprom_map) {
  1563. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac allocate local eeprom map Fail!!\n");
  1564. return HALMAC_RET_MALLOC_FAIL;
  1565. }
  1566. PLATFORM_RTL_MEMSET(pDriver_adapter, pEeprom_map, 0xFF, eeprom_size);
  1567. status = halmac_read_logical_efuse_map_88xx(pHalmac_adapter, pEeprom_map);
  1568. if (HALMAC_RET_SUCCESS != status) {
  1569. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac_read_logical_efuse_map error = %x\n", status);
  1570. PLATFORM_RTL_FREE(pDriver_adapter, pEeprom_map, eeprom_size);
  1571. return status;
  1572. }
  1573. *pValue = *(pEeprom_map + halmac_offset);
  1574. if (HALMAC_RET_SUCCESS != halmac_transition_efuse_state_88xx(pHalmac_adapter, HALMAC_EFUSE_CMD_CONSTRUCT_IDLE)) {
  1575. PLATFORM_RTL_FREE(pDriver_adapter, pEeprom_map, eeprom_size);
  1576. return HALMAC_RET_ERROR_STATE;
  1577. }
  1578. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_TRACE, "halmac_read_logical_efuse_88xx <==========\n");
  1579. PLATFORM_RTL_FREE(pDriver_adapter, pEeprom_map, eeprom_size);
  1580. return HALMAC_RET_SUCCESS;
  1581. }
  1582. /**
  1583. * halmac_write_logical_efuse_88xx() - write "logical" efuse offset
  1584. * @pHalmac_adapter : the adapter of halmac
  1585. * @halmac_offset : offset
  1586. * @halmac_value : value
  1587. * Author : Soar
  1588. * Return : HALMAC_RET_STATUS
  1589. * More details of status code can be found in prototype document
  1590. */
  1591. HALMAC_RET_STATUS
  1592. halmac_write_logical_efuse_88xx(
  1593. IN PHALMAC_ADAPTER pHalmac_adapter,
  1594. IN u32 halmac_offset,
  1595. IN u8 halmac_value
  1596. )
  1597. {
  1598. VOID *pDriver_adapter = NULL;
  1599. PHALMAC_API pHalmac_api;
  1600. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  1601. HALMAC_CMD_PROCESS_STATUS *pProcess_status = &(pHalmac_adapter->halmac_state.efuse_state_set.process_status);
  1602. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1603. return HALMAC_RET_ADAPTER_INVALID;
  1604. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1605. return HALMAC_RET_API_INVALID;
  1606. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_WRITE_LOGICAL_EFUSE);
  1607. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1608. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  1609. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_TRACE, "halmac_write_logical_efuse_88xx ==========>\n");
  1610. if (halmac_offset >= pHalmac_adapter->hw_config_info.eeprom_size) {
  1611. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "Offset is too large\n");
  1612. return HALMAC_RET_EFUSE_SIZE_INCORRECT;
  1613. }
  1614. if (HALMAC_CMD_PROCESS_SENDING == *pProcess_status) {
  1615. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Wait/Rcvd event(dump efuse)...\n");
  1616. return HALMAC_RET_BUSY_STATE;
  1617. }
  1618. if (HALMAC_EFUSE_CMD_CONSTRUCT_IDLE != halmac_query_efuse_curr_state_88xx(pHalmac_adapter)) {
  1619. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Not idle state(dump efuse)...\n");
  1620. return HALMAC_RET_ERROR_STATE;
  1621. }
  1622. status = halmac_func_switch_efuse_bank_88xx(pHalmac_adapter, HALMAC_EFUSE_BANK_WIFI);
  1623. if (HALMAC_RET_SUCCESS != status) {
  1624. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac_func_switch_efuse_bank error = %x\n", status);
  1625. return status;
  1626. }
  1627. status = halmac_func_write_logical_efuse_88xx(pHalmac_adapter, halmac_offset, halmac_value);
  1628. if (HALMAC_RET_SUCCESS != status) {
  1629. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac_write_logical_efuse error = %x\n", status);
  1630. return status;
  1631. }
  1632. if (HALMAC_RET_SUCCESS != halmac_transition_efuse_state_88xx(pHalmac_adapter, HALMAC_EFUSE_CMD_CONSTRUCT_IDLE))
  1633. return HALMAC_RET_ERROR_STATE;
  1634. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_TRACE, "halmac_write_logical_efuse_88xx <==========\n");
  1635. return HALMAC_RET_SUCCESS;
  1636. }
  1637. /**
  1638. * halmac_pg_efuse_by_map_88xx() - pg logical efuse by map
  1639. * @pHalmac_adapter : the adapter of halmac
  1640. * @pPg_efuse_info : efuse map information
  1641. * @cfg : dump efuse method
  1642. * Author : Soar
  1643. * Return : HALMAC_RET_STATUS
  1644. * More details of status code can be found in prototype document
  1645. */
  1646. HALMAC_RET_STATUS
  1647. halmac_pg_efuse_by_map_88xx(
  1648. IN PHALMAC_ADAPTER pHalmac_adapter,
  1649. IN PHALMAC_PG_EFUSE_INFO pPg_efuse_info,
  1650. IN HALMAC_EFUSE_READ_CFG cfg
  1651. )
  1652. {
  1653. VOID *pDriver_adapter = NULL;
  1654. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  1655. HALMAC_CMD_PROCESS_STATUS *pProcess_status = &(pHalmac_adapter->halmac_state.efuse_state_set.process_status);
  1656. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1657. return HALMAC_RET_ADAPTER_INVALID;
  1658. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1659. return HALMAC_RET_API_INVALID;
  1660. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_PG_EFUSE_BY_MAP);
  1661. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1662. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_TRACE, "halmac_pg_efuse_by_map_88xx ==========>\n");
  1663. if (pPg_efuse_info->efuse_map_size != pHalmac_adapter->hw_config_info.eeprom_size) {
  1664. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "efuse_map_size is incorrect, should be %d bytes\n", pHalmac_adapter->hw_config_info.eeprom_size);
  1665. return HALMAC_RET_EFUSE_SIZE_INCORRECT;
  1666. }
  1667. if ((pPg_efuse_info->efuse_map_size & 0xF) > 0) {
  1668. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "efuse_map_size should be multiple of 16\n");
  1669. return HALMAC_RET_EFUSE_SIZE_INCORRECT;
  1670. }
  1671. if (pPg_efuse_info->efuse_mask_size != pPg_efuse_info->efuse_map_size >> 4) {
  1672. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "efuse_mask_size is incorrect, should be %d bytes\n", pPg_efuse_info->efuse_map_size >> 4);
  1673. return HALMAC_RET_EFUSE_SIZE_INCORRECT;
  1674. }
  1675. if (NULL == pPg_efuse_info->pEfuse_map) {
  1676. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "efuse_map is NULL\n");
  1677. return HALMAC_RET_NULL_POINTER;
  1678. }
  1679. if (NULL == pPg_efuse_info->pEfuse_mask) {
  1680. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "efuse_mask is NULL\n");
  1681. return HALMAC_RET_NULL_POINTER;
  1682. }
  1683. if (HALMAC_CMD_PROCESS_SENDING == *pProcess_status) {
  1684. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Wait/Rcvd event(dump efuse)...\n");
  1685. return HALMAC_RET_BUSY_STATE;
  1686. }
  1687. if (HALMAC_EFUSE_CMD_CONSTRUCT_IDLE != halmac_query_efuse_curr_state_88xx(pHalmac_adapter)) {
  1688. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Not idle state(dump efuse)...\n");
  1689. return HALMAC_RET_ERROR_STATE;
  1690. }
  1691. status = halmac_func_switch_efuse_bank_88xx(pHalmac_adapter, HALMAC_EFUSE_BANK_WIFI);
  1692. if (HALMAC_RET_SUCCESS != status) {
  1693. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac_func_switch_efuse_bank error = %x\n", status);
  1694. return status;
  1695. }
  1696. status = halmac_func_pg_efuse_by_map_88xx(pHalmac_adapter, pPg_efuse_info, cfg);
  1697. if (HALMAC_RET_SUCCESS != status) {
  1698. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac_pg_efuse_by_map error = %x\n", status);
  1699. return status;
  1700. }
  1701. if (HALMAC_RET_SUCCESS != halmac_transition_efuse_state_88xx(pHalmac_adapter, HALMAC_EFUSE_CMD_CONSTRUCT_IDLE))
  1702. return HALMAC_RET_ERROR_STATE;
  1703. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_TRACE, "halmac_pg_efuse_by_map_88xx <==========\n");
  1704. return HALMAC_RET_SUCCESS;
  1705. }
  1706. /**
  1707. * halmac_get_c2h_info_88xx() - process halmac C2H packet
  1708. * @pHalmac_adapter : the adapter of halmac
  1709. * @halmac_buf : RX Packet pointer
  1710. * @halmac_size : RX Packet size
  1711. * Author : KaiYuan Chang/Ivan Lin
  1712. *
  1713. * Used to process c2h packet info from RX path. After receiving the packet,
  1714. * user need to call this api and pass the packet pointer.
  1715. *
  1716. * Return : HALMAC_RET_STATUS
  1717. * More details of status code can be found in prototype document
  1718. */
  1719. HALMAC_RET_STATUS
  1720. halmac_get_c2h_info_88xx(
  1721. IN PHALMAC_ADAPTER pHalmac_adapter,
  1722. IN u8 *halmac_buf,
  1723. IN u32 halmac_size
  1724. )
  1725. {
  1726. VOID *pDriver_adapter = NULL;
  1727. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  1728. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1729. return HALMAC_RET_ADAPTER_INVALID;
  1730. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1731. return HALMAC_RET_API_INVALID;
  1732. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_GET_C2H_INFO);
  1733. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1734. /* PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_get_c2h_info_88xx ==========>\n"); */
  1735. /* Check if it is C2H packet */
  1736. if (_TRUE == GET_RX_DESC_C2H(halmac_buf)) {
  1737. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "C2H packet, start parsing!\n");
  1738. status = halmac_parse_c2h_packet_88xx(pHalmac_adapter, halmac_buf, halmac_size);
  1739. if (HALMAC_RET_SUCCESS != status) {
  1740. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_EFUSE, HALMAC_DBG_ERR, "halmac_parse_c2h_packet_88xx error = %x\n", status);
  1741. return status;
  1742. }
  1743. }
  1744. /* PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_get_c2h_info_88xx <==========\n"); */
  1745. return HALMAC_RET_SUCCESS;
  1746. }
  1747. HALMAC_RET_STATUS
  1748. halmac_cfg_fwlps_option_88xx(
  1749. IN PHALMAC_ADAPTER pHalmac_adapter,
  1750. IN PHALMAC_FWLPS_OPTION pLps_option
  1751. )
  1752. {
  1753. VOID *pDriver_adapter = NULL;
  1754. PHALMAC_FWLPS_OPTION pHal_fwlps_option;
  1755. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1756. return HALMAC_RET_ADAPTER_INVALID;
  1757. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1758. return HALMAC_RET_API_INVALID;
  1759. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CFG_FWLPS_OPTION);
  1760. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1761. pHal_fwlps_option = &(pHalmac_adapter->fwlps_option);
  1762. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_TRACE, "halmac_cfg_fwlps_option_88xx ==========>\n");
  1763. pHal_fwlps_option->mode = pLps_option->mode;
  1764. pHal_fwlps_option->clk_request = pLps_option->clk_request;
  1765. pHal_fwlps_option->rlbm = pLps_option->rlbm;
  1766. pHal_fwlps_option->smart_ps = pLps_option->smart_ps;
  1767. pHal_fwlps_option->awake_interval = pLps_option->awake_interval;
  1768. pHal_fwlps_option->all_queue_uapsd = pLps_option->all_queue_uapsd;
  1769. pHal_fwlps_option->pwr_state = pLps_option->pwr_state;
  1770. pHal_fwlps_option->low_pwr_rx_beacon = pLps_option->low_pwr_rx_beacon;
  1771. pHal_fwlps_option->ant_auto_switch = pLps_option->ant_auto_switch;
  1772. pHal_fwlps_option->ps_allow_bt_high_Priority = pLps_option->ps_allow_bt_high_Priority;
  1773. pHal_fwlps_option->protect_bcn = pLps_option->protect_bcn;
  1774. pHal_fwlps_option->silence_period = pLps_option->silence_period;
  1775. pHal_fwlps_option->fast_bt_connect = pLps_option->fast_bt_connect;
  1776. pHal_fwlps_option->two_antenna_en = pLps_option->two_antenna_en;
  1777. pHal_fwlps_option->adopt_user_Setting = pLps_option->adopt_user_Setting;
  1778. pHal_fwlps_option->drv_bcn_early_shift = pLps_option->drv_bcn_early_shift;
  1779. pHal_fwlps_option->enter_32K = pLps_option->enter_32K;
  1780. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_TRACE, "halmac_cfg_fwlps_option_88xx <==========\n");
  1781. return HALMAC_RET_SUCCESS;
  1782. }
  1783. HALMAC_RET_STATUS
  1784. halmac_cfg_fwips_option_88xx(
  1785. IN PHALMAC_ADAPTER pHalmac_adapter,
  1786. IN PHALMAC_FWIPS_OPTION pIps_option
  1787. )
  1788. {
  1789. VOID *pDriver_adapter = NULL;
  1790. PHALMAC_FWIPS_OPTION pIps_option_local;
  1791. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1792. return HALMAC_RET_ADAPTER_INVALID;
  1793. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1794. return HALMAC_RET_API_INVALID;
  1795. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CFG_FWIPS_OPTION);
  1796. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1797. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_TRACE, "halmac_cfg_fwips_option_88xx ==========>\n");
  1798. pIps_option_local = pIps_option;
  1799. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_TRACE, "halmac_cfg_fwips_option_88xx <==========\n");
  1800. return HALMAC_RET_SUCCESS;
  1801. }
  1802. HALMAC_RET_STATUS
  1803. halmac_enter_wowlan_88xx(
  1804. IN PHALMAC_ADAPTER pHalmac_adapter,
  1805. IN PHALMAC_WOWLAN_OPTION pWowlan_option
  1806. )
  1807. {
  1808. VOID *pDriver_adapter = NULL;
  1809. PHALMAC_WOWLAN_OPTION pWowlan_option_local;
  1810. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1811. return HALMAC_RET_ADAPTER_INVALID;
  1812. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1813. return HALMAC_RET_API_INVALID;
  1814. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_ENTER_WOWLAN);
  1815. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1816. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_TRACE, "halmac_enter_wowlan_88xx ==========>\n");
  1817. pWowlan_option_local = pWowlan_option;
  1818. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_TRACE, "halmac_enter_wowlan_88xx <==========\n");
  1819. return HALMAC_RET_SUCCESS;
  1820. }
  1821. HALMAC_RET_STATUS
  1822. halmac_leave_wowlan_88xx(
  1823. IN PHALMAC_ADAPTER pHalmac_adapter
  1824. )
  1825. {
  1826. VOID *pDriver_adapter = NULL;
  1827. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1828. return HALMAC_RET_ADAPTER_INVALID;
  1829. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1830. return HALMAC_RET_API_INVALID;
  1831. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_LEAVE_WOWLAN);
  1832. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1833. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_TRACE, "halmac_leave_wowlan_88xx ==========>\n");
  1834. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_TRACE, "halmac_leave_wowlan_88xx <==========\n");
  1835. return HALMAC_RET_SUCCESS;
  1836. }
  1837. HALMAC_RET_STATUS
  1838. halmac_enter_ps_88xx(
  1839. IN PHALMAC_ADAPTER pHalmac_adapter,
  1840. IN HALMAC_PS_STATE ps_state
  1841. )
  1842. {
  1843. u8 rpwm;
  1844. VOID *pDriver_adapter = NULL;
  1845. PHALMAC_API pHalmac_api;
  1846. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  1847. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1848. return HALMAC_RET_ADAPTER_INVALID;
  1849. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1850. return HALMAC_RET_API_INVALID;
  1851. if (HALMAC_RET_SUCCESS != halmac_fw_validate(pHalmac_adapter))
  1852. return HALMAC_RET_NO_DLFW;
  1853. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_ENTER_PS);
  1854. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1855. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  1856. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_TRACE, "halmac_enter_ps_88xx ==========>\n");
  1857. if (ps_state == pHalmac_adapter->halmac_state.ps_state) {
  1858. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_ERR, "power state is already in PS State!!\n");
  1859. return HALMAC_RET_SUCCESS;
  1860. }
  1861. if (HALMAC_PS_STATE_LPS == ps_state) {
  1862. status = halmac_send_h2c_set_pwr_mode_88xx(pHalmac_adapter, &(pHalmac_adapter->fwlps_option));
  1863. if (HALMAC_RET_SUCCESS != status) {
  1864. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_ERR, "halmac_send_h2c_set_pwr_mode_88xx error = %x!!\n", status);
  1865. return status;
  1866. }
  1867. } else if (HALMAC_PS_STATE_IPS == ps_state) {
  1868. }
  1869. pHalmac_adapter->halmac_state.ps_state = ps_state;
  1870. /* Enter 32K */
  1871. if (HALMAC_INTERFACE_SDIO == pHalmac_adapter->halmac_interface) {
  1872. if (_TRUE == pHalmac_adapter->fwlps_option.enter_32K) {
  1873. rpwm = (u8)(((pHalmac_adapter->rpwm_record ^ (BIT(7))) | (BIT(0))) & 0x81);
  1874. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_SDIO_HRPWM1, rpwm);
  1875. pHalmac_adapter->low_clk = _TRUE;
  1876. }
  1877. } else if (HALMAC_INTERFACE_USB == pHalmac_adapter->halmac_interface) {
  1878. if (_TRUE == pHalmac_adapter->fwlps_option.enter_32K) {
  1879. rpwm = (u8)(((pHalmac_adapter->rpwm_record ^ (BIT(7))) | (BIT(0))) & 0x81);
  1880. HALMAC_REG_WRITE_8(pHalmac_adapter, 0xFE58, rpwm);
  1881. pHalmac_adapter->low_clk = _TRUE;
  1882. }
  1883. }
  1884. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_TRACE, "halmac_enter_ps_88xx <==========\n");
  1885. return HALMAC_RET_SUCCESS;
  1886. }
  1887. HALMAC_RET_STATUS
  1888. halmac_leave_ps_88xx(
  1889. IN PHALMAC_ADAPTER pHalmac_adapter
  1890. )
  1891. {
  1892. u8 rpwm, cpwm;
  1893. u32 counter;
  1894. VOID *pDriver_adapter = NULL;
  1895. PHALMAC_API pHalmac_api;
  1896. HALMAC_FWLPS_OPTION fw_lps_option;
  1897. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  1898. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1899. return HALMAC_RET_ADAPTER_INVALID;
  1900. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1901. return HALMAC_RET_API_INVALID;
  1902. if (HALMAC_RET_SUCCESS != halmac_fw_validate(pHalmac_adapter))
  1903. return HALMAC_RET_NO_DLFW;
  1904. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_LEAVE_PS);
  1905. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1906. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  1907. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_TRACE, "halmac_leave_ps_88xx ==========>\n");
  1908. if (HALMAC_PS_STATE_ACT == pHalmac_adapter->halmac_state.ps_state) {
  1909. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_ERR, "power state is already in active!!\n");
  1910. return HALMAC_RET_SUCCESS;
  1911. }
  1912. if (_TRUE == pHalmac_adapter->low_clk) {
  1913. cpwm = HALMAC_REG_READ_8(pHalmac_adapter, REG_SDIO_HRPWM1);
  1914. rpwm = (u8)(((pHalmac_adapter->rpwm_record ^ (BIT(7))) | (BIT(6))) & 0xC0);
  1915. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_SDIO_HRPWM1, rpwm);
  1916. cpwm = (u8)((cpwm ^ BIT(7)) & BIT(7));
  1917. counter = 100;
  1918. while (cpwm != (HALMAC_REG_READ_8(pHalmac_adapter, REG_SDIO_HRPWM1) & BIT(7))) {
  1919. PLATFORM_RTL_DELAY_US(pDriver_adapter, 50);
  1920. counter--;
  1921. if (0 == counter)
  1922. return HALMAC_RET_CHANGE_PS_FAIL;
  1923. }
  1924. pHalmac_adapter->low_clk = _FALSE;
  1925. }
  1926. PLATFORM_RTL_MEMCPY(pDriver_adapter, &fw_lps_option, &(pHalmac_adapter->fwlps_option), sizeof(HALMAC_FWLPS_OPTION));
  1927. fw_lps_option.mode = 0;
  1928. status = halmac_send_h2c_set_pwr_mode_88xx(pHalmac_adapter, &(fw_lps_option));
  1929. if (HALMAC_RET_SUCCESS != status) {
  1930. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_ERR, "halmac_send_h2c_set_pwr_mode_88xx error!!=%x\n", status);
  1931. return status;
  1932. }
  1933. pHalmac_adapter->halmac_state.ps_state = HALMAC_PS_STATE_ACT;
  1934. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_PWR, HALMAC_DBG_TRACE, "halmac_leave_ps_88xx <==========\n");
  1935. return HALMAC_RET_SUCCESS;
  1936. }
  1937. /**
  1938. * (debug API)halmac_h2c_lb_88xx() - send h2c loopback packet
  1939. * @pHalmac_adapter : the adapter of halmac
  1940. * Author : KaiYuan Chang/Ivan Lin
  1941. * Return : HALMAC_RET_STATUS
  1942. * More details of status code can be found in prototype document
  1943. */
  1944. HALMAC_RET_STATUS
  1945. halmac_h2c_lb_88xx(
  1946. IN PHALMAC_ADAPTER pHalmac_adapter
  1947. )
  1948. {
  1949. VOID *pDriver_adapter = NULL;
  1950. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1951. return HALMAC_RET_ADAPTER_INVALID;
  1952. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1953. return HALMAC_RET_API_INVALID;
  1954. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_H2C_LB);
  1955. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1956. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_h2c_lb_88xx ==========>\n");
  1957. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_h2c_lb_88xx <==========\n");
  1958. return HALMAC_RET_SUCCESS;
  1959. }
  1960. /**
  1961. * halmac_debug_88xx() - dump information for debugging
  1962. * @pHalmac_adapter : the adapter of halmac
  1963. * Author : KaiYuan Chang/Ivan Lin
  1964. * Return : HALMAC_RET_STATUS
  1965. * More details of status code can be found in prototype document
  1966. */
  1967. HALMAC_RET_STATUS
  1968. halmac_debug_88xx(
  1969. IN PHALMAC_ADAPTER pHalmac_adapter
  1970. )
  1971. {
  1972. u8 temp8 = 0;
  1973. u32 i = 0, temp32 = 0;
  1974. VOID *pDriver_adapter = NULL;
  1975. PHALMAC_API pHalmac_api;
  1976. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  1977. return HALMAC_RET_ADAPTER_INVALID;
  1978. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  1979. return HALMAC_RET_API_INVALID;
  1980. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_DEBUG);
  1981. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  1982. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  1983. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_debug_88xx ==========>\n");
  1984. if (HALMAC_INTERFACE_SDIO == pHalmac_adapter->halmac_interface) {
  1985. /* Dump CCCR, it needs new platform api */
  1986. /*Dump SDIO Local Register, use CMD52*/
  1987. for (i = 0x10250000; i < 0x102500ff; i++) {
  1988. temp8 = PLATFORM_SDIO_CMD52_READ(pHalmac_adapter, i);
  1989. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_debug: sdio[%x]=%x\n", i, temp8);
  1990. }
  1991. /*Dump MAC Register*/
  1992. for (i = 0x0000; i < 0x17ff; i++) {
  1993. temp8 = PLATFORM_SDIO_CMD52_READ(pHalmac_adapter, i);
  1994. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_debug: mac[%x]=%x\n", i, temp8);
  1995. }
  1996. /*Check RX Fifo status*/
  1997. i = REG_RXFF_PTR_V1;
  1998. temp8 = PLATFORM_SDIO_CMD52_READ(pHalmac_adapter, i);
  1999. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_debug: mac[%x]=%x\n", i, temp8);
  2000. i = REG_RXFF_WTR_V1;
  2001. temp8 = PLATFORM_SDIO_CMD52_READ(pHalmac_adapter, i);
  2002. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_debug: mac[%x]=%x\n", i, temp8);
  2003. i = REG_RXFF_PTR_V1;
  2004. temp8 = PLATFORM_SDIO_CMD52_READ(pHalmac_adapter, i);
  2005. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_debug: mac[%x]=%x\n", i, temp8);
  2006. i = REG_RXFF_WTR_V1;
  2007. temp8 = PLATFORM_SDIO_CMD52_READ(pHalmac_adapter, i);
  2008. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_debug: mac[%x]=%x\n", i, temp8);
  2009. } else {
  2010. /*Dump MAC Register*/
  2011. for (i = 0x0000; i < 0x17fc; i += 4) {
  2012. temp32 = HALMAC_REG_READ_32(pHalmac_adapter, i);
  2013. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_debug: mac[%x]=%x\n", i, temp32);
  2014. }
  2015. /*Check RX Fifo status*/
  2016. i = REG_RXFF_PTR_V1;
  2017. temp32 = HALMAC_REG_READ_32(pHalmac_adapter, i);
  2018. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_debug: mac[%x]=%x\n", i, temp32);
  2019. i = REG_RXFF_WTR_V1;
  2020. temp32 = HALMAC_REG_READ_32(pHalmac_adapter, i);
  2021. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_debug: mac[%x]=%x\n", i, temp32);
  2022. i = REG_RXFF_PTR_V1;
  2023. temp32 = HALMAC_REG_READ_32(pHalmac_adapter, i);
  2024. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_debug: mac[%x]=%x\n", i, temp32);
  2025. i = REG_RXFF_WTR_V1;
  2026. temp32 = HALMAC_REG_READ_32(pHalmac_adapter, i);
  2027. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_debug: mac[%x]=%x\n", i, temp32);
  2028. }
  2029. /* TODO: Add check register code, including MAC CLK, CPU CLK */
  2030. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_debug_88xx <==========\n");
  2031. return HALMAC_RET_SUCCESS;
  2032. }
  2033. /**
  2034. * halmac_cfg_parameter_88xx() - config parameter by FW
  2035. * @pHalmac_adapter : the adapter of halmac
  2036. * @para_info : cmd id, content
  2037. * @full_fifo : parameter information
  2038. *
  2039. * If msk_en = _TRUE, the format of array is {reg_info, mask, value}.
  2040. * If msk_en =_FAUSE, the format of array is {reg_info, value}
  2041. * The format of reg_info is
  2042. * reg_info[31]=rf_reg, 0: MAC_BB reg, 1: RF reg
  2043. * reg_info[27:24]=rf_path, 0: path_A, 1: path_B
  2044. * if rf_reg=0(MAC_BB reg), rf_path is meaningless.
  2045. * ref_info[15:0]=offset
  2046. *
  2047. * Example: msk_en = _FALSE
  2048. * {0x8100000a, 0x00001122}
  2049. * =>Set RF register, path_B, offset 0xA to 0x00001122
  2050. * {0x00000824, 0x11224433}
  2051. * =>Set MAC_BB register, offset 0x800 to 0x11224433
  2052. *
  2053. * Note : full fifo mode only for init flow
  2054. *
  2055. * Author : KaiYuan Chang/Ivan Lin
  2056. * Return : HALMAC_RET_STATUS
  2057. * More details of status code can be found in prototype document
  2058. */
  2059. HALMAC_RET_STATUS
  2060. halmac_cfg_parameter_88xx(
  2061. IN PHALMAC_ADAPTER pHalmac_adapter,
  2062. IN PHALMAC_PHY_PARAMETER_INFO para_info,
  2063. IN u8 full_fifo
  2064. )
  2065. {
  2066. VOID *pDriver_adapter = NULL;
  2067. HALMAC_RET_STATUS ret_status = HALMAC_RET_SUCCESS;
  2068. HALMAC_CMD_PROCESS_STATUS *pProcess_status = &(pHalmac_adapter->halmac_state.cfg_para_state_set.process_status);
  2069. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  2070. return HALMAC_RET_ADAPTER_INVALID;
  2071. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  2072. return HALMAC_RET_API_INVALID;
  2073. if (HALMAC_RET_SUCCESS != halmac_fw_validate(pHalmac_adapter))
  2074. return HALMAC_RET_NO_DLFW;
  2075. if (pHalmac_adapter->fw_version.h2c_version < 4)
  2076. return HALMAC_RET_FW_NO_SUPPORT;
  2077. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CFG_PARAMETER);
  2078. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  2079. /* PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_cfg_parameter_88xx ==========>\n"); */
  2080. if (HALMAC_DLFW_NONE == pHalmac_adapter->halmac_state.dlfw_state) {
  2081. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_cfg_parameter_88xx Fail due to DLFW NONE!!\n");
  2082. return HALMAC_RET_DLFW_FAIL;
  2083. }
  2084. if (HALMAC_CMD_PROCESS_SENDING == *pProcess_status) {
  2085. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Wait event(cfg para)...\n");
  2086. return HALMAC_RET_BUSY_STATE;
  2087. }
  2088. if ((HALMAC_CFG_PARA_CMD_CONSTRUCT_IDLE != halmac_query_cfg_para_curr_state_88xx(pHalmac_adapter)) &&
  2089. (HALMAC_CFG_PARA_CMD_CONSTRUCT_CONSTRUCTING != halmac_query_cfg_para_curr_state_88xx(pHalmac_adapter))) {
  2090. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Not idle state(cfg para)...\n");
  2091. return HALMAC_RET_BUSY_STATE;
  2092. }
  2093. *pProcess_status = HALMAC_CMD_PROCESS_IDLE;
  2094. ret_status = halmac_send_h2c_phy_parameter_88xx(pHalmac_adapter, para_info, full_fifo);
  2095. if (HALMAC_RET_SUCCESS != ret_status) {
  2096. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_send_h2c_phy_parameter_88xx Fail!! = %x\n", ret_status);
  2097. return ret_status;
  2098. }
  2099. /* PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_cfg_parameter_88xx <==========\n"); */
  2100. return ret_status;
  2101. }
  2102. /**
  2103. * halmac_update_packet_88xx() - send specific packet to FW
  2104. * @pHalmac_adapter : the adapter of halmac
  2105. * @pkt_id : packet id, to know the purpose of this packet
  2106. * @pkt : packet
  2107. * @pkt_size : packet size
  2108. *
  2109. * Note : TX_DESC is not included in the pkt
  2110. *
  2111. * Author : KaiYuan Chang/Ivan Lin
  2112. * Return : HALMAC_RET_STATUS
  2113. * More details of status code can be found in prototype document
  2114. */
  2115. HALMAC_RET_STATUS
  2116. halmac_update_packet_88xx(
  2117. IN PHALMAC_ADAPTER pHalmac_adapter,
  2118. IN HALMAC_PACKET_ID pkt_id,
  2119. IN u8 *pkt,
  2120. IN u32 pkt_size
  2121. )
  2122. {
  2123. VOID *pDriver_adapter = NULL;
  2124. PHALMAC_API pHalmac_api;
  2125. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  2126. HALMAC_CMD_PROCESS_STATUS *pProcess_status = &(pHalmac_adapter->halmac_state.update_packet_set.process_status);
  2127. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  2128. return HALMAC_RET_ADAPTER_INVALID;
  2129. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  2130. return HALMAC_RET_API_INVALID;
  2131. if (HALMAC_RET_SUCCESS != halmac_fw_validate(pHalmac_adapter))
  2132. return HALMAC_RET_NO_DLFW;
  2133. if (pHalmac_adapter->fw_version.h2c_version < 4)
  2134. return HALMAC_RET_FW_NO_SUPPORT;
  2135. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_UPDATE_PACKET);
  2136. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  2137. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  2138. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_update_packet_88xx ==========>\n");
  2139. if (HALMAC_CMD_PROCESS_SENDING == *pProcess_status) {
  2140. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Wait event(update_packet)...\n");
  2141. return HALMAC_RET_BUSY_STATE;
  2142. }
  2143. *pProcess_status = HALMAC_CMD_PROCESS_SENDING;
  2144. status = halmac_send_h2c_update_packet_88xx(pHalmac_adapter, pkt_id, pkt, pkt_size);
  2145. if (HALMAC_RET_SUCCESS != status) {
  2146. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_send_h2c_update_packet_88xx packet = %x, fail = %x!!\n", pkt_id, status);
  2147. return status;
  2148. }
  2149. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_update_packet_88xx <==========\n");
  2150. return HALMAC_RET_SUCCESS;
  2151. }
  2152. HALMAC_RET_STATUS
  2153. halmac_bcn_ie_filter_88xx(
  2154. IN PHALMAC_ADAPTER pHalmac_adapter,
  2155. IN PHALMAC_BCN_IE_INFO pBcn_ie_info
  2156. )
  2157. {
  2158. VOID *pDriver_adapter = NULL;
  2159. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  2160. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  2161. return HALMAC_RET_ADAPTER_INVALID;
  2162. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  2163. return HALMAC_RET_API_INVALID;
  2164. if (HALMAC_RET_SUCCESS != halmac_fw_validate(pHalmac_adapter))
  2165. return HALMAC_RET_NO_DLFW;
  2166. if (pHalmac_adapter->fw_version.h2c_version < 4)
  2167. return HALMAC_RET_FW_NO_SUPPORT;
  2168. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_BCN_IE_FILTER);
  2169. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  2170. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_bcn_ie_filter_88xx ==========>\n");
  2171. status = halmac_send_h2c_update_bcn_parse_info_88xx(pHalmac_adapter, pBcn_ie_info);
  2172. if (HALMAC_RET_SUCCESS != status) {
  2173. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_send_h2c_update_bcn_parse_info_88xx fail = %x\n", status);
  2174. return status;
  2175. }
  2176. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_bcn_ie_filter_88xx <==========\n");
  2177. return HALMAC_RET_SUCCESS;
  2178. }
  2179. HALMAC_RET_STATUS
  2180. halmac_update_datapack_88xx(
  2181. IN PHALMAC_ADAPTER pHalmac_adapter,
  2182. IN HALMAC_DATA_TYPE halmac_data_type,
  2183. IN PHALMAC_PHY_PARAMETER_INFO para_info
  2184. )
  2185. {
  2186. VOID *pDriver_adapter = NULL;
  2187. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  2188. return HALMAC_RET_ADAPTER_INVALID;
  2189. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  2190. return HALMAC_RET_API_INVALID;
  2191. if (HALMAC_RET_SUCCESS != halmac_fw_validate(pHalmac_adapter))
  2192. return HALMAC_RET_NO_DLFW;
  2193. if (pHalmac_adapter->fw_version.h2c_version < 4)
  2194. return HALMAC_RET_FW_NO_SUPPORT;
  2195. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "[TRACE]halmac_update_datapack_88xx ==========>\n");
  2196. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  2197. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "[TRACE]halmac_update_datapack_88xx <==========\n");
  2198. return HALMAC_RET_SUCCESS;
  2199. }
  2200. HALMAC_RET_STATUS
  2201. halmac_run_datapack_88xx(
  2202. IN PHALMAC_ADAPTER pHalmac_adapter,
  2203. IN HALMAC_DATA_TYPE halmac_data_type
  2204. )
  2205. {
  2206. VOID *pDriver_adapter = NULL;
  2207. HALMAC_RET_STATUS ret_status = HALMAC_RET_SUCCESS;
  2208. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  2209. return HALMAC_RET_ADAPTER_INVALID;
  2210. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  2211. return HALMAC_RET_API_INVALID;
  2212. if (HALMAC_RET_SUCCESS != halmac_fw_validate(pHalmac_adapter))
  2213. return HALMAC_RET_NO_DLFW;
  2214. if (pHalmac_adapter->fw_version.h2c_version < 4)
  2215. return HALMAC_RET_FW_NO_SUPPORT;
  2216. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_RUN_DATAPACK);
  2217. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  2218. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_run_datapack_88xx ==========>\n");
  2219. ret_status = halmac_send_h2c_run_datapack_88xx(pHalmac_adapter, halmac_data_type);
  2220. if (HALMAC_RET_SUCCESS != ret_status) {
  2221. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_send_h2c_run_datapack_88xx Fail, datatype = %x, status = %x!!\n", halmac_data_type, ret_status);
  2222. return ret_status;
  2223. }
  2224. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_update_datapack_88xx <==========\n");
  2225. return HALMAC_RET_SUCCESS;
  2226. }
  2227. /**
  2228. * halmac_cfg_drv_info_88xx() - config driver info
  2229. * @pHalmac_adapter : the adapter of halmac
  2230. * @halmac_drv_info : driver information selection
  2231. * Author : KaiYuan Chang/Ivan Lin
  2232. * Return : HALMAC_RET_STATUS
  2233. * More details of status code can be found in prototype document
  2234. */
  2235. HALMAC_RET_STATUS
  2236. halmac_cfg_drv_info_88xx(
  2237. IN PHALMAC_ADAPTER pHalmac_adapter,
  2238. IN HALMAC_DRV_INFO halmac_drv_info
  2239. )
  2240. {
  2241. u8 drv_info_size = 0;
  2242. u8 phy_status_en = 0;
  2243. u8 sniffer_en = 0;
  2244. u8 plcp_hdr_en = 0;
  2245. u32 value32;
  2246. VOID *pDriver_adapter = NULL;
  2247. PHALMAC_API pHalmac_api;
  2248. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  2249. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  2250. return HALMAC_RET_ADAPTER_INVALID;
  2251. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  2252. return HALMAC_RET_API_INVALID;
  2253. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CFG_DRV_INFO);
  2254. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  2255. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  2256. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_cfg_drv_info_88xx ==========>\n");
  2257. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_cfg_drv_info = %d\n", halmac_drv_info);
  2258. switch (halmac_drv_info) {
  2259. case HALMAC_DRV_INFO_NONE:
  2260. drv_info_size = 0;
  2261. phy_status_en = 0;
  2262. sniffer_en = 0;
  2263. plcp_hdr_en = 0;
  2264. break;
  2265. case HALMAC_DRV_INFO_PHY_STATUS:
  2266. drv_info_size = 4;
  2267. phy_status_en = 1;
  2268. sniffer_en = 0;
  2269. plcp_hdr_en = 0;
  2270. break;
  2271. case HALMAC_DRV_INFO_PHY_SNIFFER:
  2272. drv_info_size = 5; /* phy status 4byte, sniffer info 1byte */
  2273. phy_status_en = 1;
  2274. sniffer_en = 1;
  2275. plcp_hdr_en = 0;
  2276. break;
  2277. case HALMAC_DRV_INFO_PHY_PLCP:
  2278. drv_info_size = 6; /* phy status 4byte, plcp header 2byte */
  2279. phy_status_en = 1;
  2280. sniffer_en = 0;
  2281. plcp_hdr_en = 1;
  2282. break;
  2283. default:
  2284. status = HALMAC_RET_SW_CASE_NOT_SUPPORT;
  2285. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_cfg_drv_info_88xx error = %x\n", status);
  2286. return status;
  2287. }
  2288. if (HALMAC_RX_FIFO_EXPANDING_MODE_DISABLE != pHalmac_adapter->txff_allocation.rx_fifo_expanding_mode)
  2289. drv_info_size = HALMAC_RX_DESC_DUMMY_SIZE_MAX_88XX >> 3;
  2290. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_RX_DRVINFO_SZ, drv_info_size);
  2291. pHalmac_adapter->drv_info_size = drv_info_size;
  2292. value32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_RCR);
  2293. value32 = (value32 & (~BIT_APP_PHYSTS));
  2294. if (1 == phy_status_en)
  2295. value32 = value32 | BIT_APP_PHYSTS;
  2296. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_RCR, value32);
  2297. value32 = HALMAC_REG_READ_32(pHalmac_adapter, REG_WMAC_OPTION_FUNCTION + 4);
  2298. value32 = (value32 & (~(BIT(8) | BIT(9))));
  2299. if (1 == sniffer_en)
  2300. value32 = value32 | BIT(9);
  2301. if (1 == plcp_hdr_en)
  2302. value32 = value32 | BIT(8);
  2303. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_WMAC_OPTION_FUNCTION + 4, value32);
  2304. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_cfg_drv_info_88xx <==========\n");
  2305. return HALMAC_RET_SUCCESS;
  2306. }
  2307. HALMAC_RET_STATUS
  2308. halmac_send_bt_coex_88xx(
  2309. IN PHALMAC_ADAPTER pHalmac_adapter,
  2310. IN u8 *pBt_buf,
  2311. IN u32 bt_size,
  2312. IN u8 ack
  2313. )
  2314. {
  2315. VOID *pDriver_adapter = NULL;
  2316. PHALMAC_API pHalmac_api;
  2317. HALMAC_RET_STATUS ret_status = HALMAC_RET_SUCCESS;
  2318. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  2319. return HALMAC_RET_ADAPTER_INVALID;
  2320. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  2321. return HALMAC_RET_API_INVALID;
  2322. if (HALMAC_RET_SUCCESS != halmac_fw_validate(pHalmac_adapter))
  2323. return HALMAC_RET_NO_DLFW;
  2324. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_SEND_BT_COEX);
  2325. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  2326. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  2327. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_send_bt_coex_88xx ==========>\n");
  2328. ret_status = halmac_send_bt_coex_cmd_88xx(pHalmac_adapter, pBt_buf, bt_size, ack);
  2329. if (HALMAC_RET_SUCCESS != ret_status) {
  2330. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_send_bt_coex_cmd_88xx Fail = %x!!\n", ret_status);
  2331. return ret_status;
  2332. }
  2333. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_send_bt_coex_88xx <==========\n");
  2334. return HALMAC_RET_SUCCESS;
  2335. }
  2336. /**
  2337. * (debug API)halmac_verify_platform_api_88xx() - verify platform api
  2338. * @pHalmac_adapter : the adapter of halmac
  2339. * Author : KaiYuan Chang/Ivan Lin
  2340. * Return : HALMAC_RET_STATUS
  2341. * More details of status code can be found in prototype document
  2342. */
  2343. HALMAC_RET_STATUS
  2344. halmac_verify_platform_api_88xx(
  2345. IN PHALMAC_ADAPTER pHalmac_adapter
  2346. )
  2347. {
  2348. VOID *pDriver_adapter = NULL;
  2349. HALMAC_RET_STATUS ret_status = HALMAC_RET_SUCCESS;
  2350. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  2351. return HALMAC_RET_ADAPTER_INVALID;
  2352. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  2353. return HALMAC_RET_API_INVALID;
  2354. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_VERIFY_PLATFORM_API);
  2355. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  2356. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_verify_platform_api_88xx ==========>\n");
  2357. ret_status = halmac_verify_io_88xx(pHalmac_adapter);
  2358. if (HALMAC_RET_SUCCESS != ret_status)
  2359. return ret_status;
  2360. if (HALMAC_LA_MODE_FULL != pHalmac_adapter->txff_allocation.la_mode)
  2361. ret_status = halmac_verify_send_rsvd_page_88xx(pHalmac_adapter);
  2362. if (HALMAC_RET_SUCCESS != ret_status)
  2363. return ret_status;
  2364. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_verify_platform_api_88xx <==========\n");
  2365. return ret_status;
  2366. }
  2367. HALMAC_RET_STATUS
  2368. halmac_send_original_h2c_88xx(
  2369. IN PHALMAC_ADAPTER pHalmac_adapter,
  2370. IN u8 *original_h2c,
  2371. IN u16 *seq,
  2372. IN u8 ack
  2373. )
  2374. {
  2375. VOID *pDriver_adapter = NULL;
  2376. PHALMAC_API pHalmac_api;
  2377. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  2378. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  2379. return HALMAC_RET_ADAPTER_INVALID;
  2380. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  2381. return HALMAC_RET_API_INVALID;
  2382. if (HALMAC_RET_SUCCESS != halmac_fw_validate(pHalmac_adapter))
  2383. return HALMAC_RET_NO_DLFW;
  2384. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_SEND_ORIGINAL_H2C);
  2385. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  2386. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  2387. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_send_original_h2c_88xx ==========>\n");
  2388. status = halmac_func_send_original_h2c_88xx(pHalmac_adapter, original_h2c, seq, ack);
  2389. if (HALMAC_RET_SUCCESS != status) {
  2390. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_send_original_h2c FAIL = %x!!\n", status);
  2391. return status;
  2392. }
  2393. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_send_original_h2c_88xx <==========\n");
  2394. return HALMAC_RET_SUCCESS;
  2395. }
  2396. HALMAC_RET_STATUS
  2397. halmac_timer_2s_88xx(
  2398. IN PHALMAC_ADAPTER pHalmac_adapter
  2399. )
  2400. {
  2401. VOID *pDriver_adapter = NULL;
  2402. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  2403. return HALMAC_RET_ADAPTER_INVALID;
  2404. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  2405. return HALMAC_RET_API_INVALID;
  2406. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  2407. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_timer_2s_88xx ==========>\n");
  2408. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_timer_2s_88xx <==========\n");
  2409. return HALMAC_RET_SUCCESS;
  2410. }
  2411. /**
  2412. * halmac_fill_txdesc_check_sum_88xx() - fill in tx desc check sum
  2413. * @pHalmac_adapter : the adapter of halmac
  2414. * @pCur_desc : tx desc packet
  2415. * Author : KaiYuan Chang/Ivan Lin
  2416. * Return : HALMAC_RET_STATUS
  2417. * More details of status code can be found in prototype document
  2418. */
  2419. HALMAC_RET_STATUS
  2420. halmac_fill_txdesc_check_sum_88xx(
  2421. IN PHALMAC_ADAPTER pHalmac_adapter,
  2422. INOUT u8 *pCur_desc
  2423. )
  2424. {
  2425. u16 chk_result = 0;
  2426. u16 *pData = (u16 *)NULL;
  2427. u32 i;
  2428. VOID *pDriver_adapter = NULL;
  2429. PHALMAC_API pHalmac_api;
  2430. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  2431. return HALMAC_RET_ADAPTER_INVALID;
  2432. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  2433. return HALMAC_RET_API_INVALID;
  2434. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_FILL_TXDESC_CHECKSUM);
  2435. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  2436. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  2437. if (NULL == pCur_desc) {
  2438. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_fill_txdesc_check_sum_88xx NULL PTR");
  2439. return HALMAC_RET_NULL_POINTER;
  2440. }
  2441. SET_TX_DESC_TXDESC_CHECKSUM(pCur_desc, 0x0000);
  2442. pData = (u16 *)(pCur_desc);
  2443. /* HW clculates only 32byte */
  2444. for (i = 0; i < 8; i++)
  2445. chk_result ^= (*(pData + 2 * i) ^ *(pData + (2 * i + 1)));
  2446. /* *(pData + 2 * i) & *(pData + (2 * i + 1) have endain issue*/
  2447. /* Process eniadn issue after checksum calculation */
  2448. chk_result = rtk_le16_to_cpu(chk_result);
  2449. SET_TX_DESC_TXDESC_CHECKSUM(pCur_desc, chk_result);
  2450. return HALMAC_RET_SUCCESS;
  2451. }
  2452. /**
  2453. * halmac_dump_fifo_88xx() - dump fifo data
  2454. * @pHalmac_adapter : the adapter of halmac
  2455. * @halmac_fifo_sel : FIFO selection
  2456. * @halmac_start_addr : start address of selected FIFO
  2457. * @halmac_fifo_dump_size : dump size of selected FIFO
  2458. * @pFifo_map : FIFO data
  2459. *
  2460. * Note : before dump fifo, user need to call halmac_get_fifo_size to
  2461. * get fifo size. Then input this size to halmac_dump_fifo.
  2462. *
  2463. * Author : Ivan Lin/KaiYuan Chang
  2464. * Return : HALMAC_RET_STATUS
  2465. * More details of status code can be found in prototype document
  2466. */
  2467. HALMAC_RET_STATUS
  2468. halmac_dump_fifo_88xx(
  2469. IN PHALMAC_ADAPTER pHalmac_adapter,
  2470. IN HAL_FIFO_SEL halmac_fifo_sel,
  2471. IN u32 halmac_start_addr,
  2472. IN u32 halmac_fifo_dump_size,
  2473. OUT u8 *pFifo_map
  2474. )
  2475. {
  2476. VOID *pDriver_adapter = NULL;
  2477. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  2478. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  2479. return HALMAC_RET_ADAPTER_INVALID;
  2480. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  2481. return HALMAC_RET_API_INVALID;
  2482. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_DUMP_FIFO);
  2483. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  2484. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_dump_fifo_88xx ==========>\n");
  2485. if (HAL_FIFO_SEL_TX == halmac_fifo_sel && (halmac_start_addr + halmac_fifo_dump_size) > pHalmac_adapter->hw_config_info.tx_fifo_size) {
  2486. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "TX fifo dump size is too large\n");
  2487. return HALMAC_RET_DUMP_FIFOSIZE_INCORRECT;
  2488. }
  2489. if (HAL_FIFO_SEL_RX == halmac_fifo_sel && (halmac_start_addr + halmac_fifo_dump_size) > pHalmac_adapter->hw_config_info.rx_fifo_size) {
  2490. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "RX fifo dump size is too large\n");
  2491. return HALMAC_RET_DUMP_FIFOSIZE_INCORRECT;
  2492. }
  2493. if (0 != (halmac_fifo_dump_size & (4 - 1))) {
  2494. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_fifo_dump_size shall 4byte align\n");
  2495. return HALMAC_RET_DUMP_FIFOSIZE_INCORRECT;
  2496. }
  2497. if (NULL == pFifo_map) {
  2498. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "pFifo_map address is NULL\n");
  2499. return HALMAC_RET_NULL_POINTER;
  2500. }
  2501. status = halmac_buffer_read_88xx(pHalmac_adapter, halmac_start_addr, halmac_fifo_dump_size, halmac_fifo_sel, pFifo_map);
  2502. if (HALMAC_RET_SUCCESS != status) {
  2503. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_buffer_read_88xx error = %x\n", status);
  2504. return status;
  2505. }
  2506. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_dump_fifo_88xx <==========\n");
  2507. return HALMAC_RET_SUCCESS;
  2508. }
  2509. /**
  2510. * halmac_get_fifo_size_88xx() - get fifo size
  2511. * @pHalmac_adapter : the adapter of halmac
  2512. * @halmac_fifo_sel : FIFO selection
  2513. * Author : Ivan Lin/KaiYuan Chang
  2514. * Return : u32
  2515. * More details of status code can be found in prototype document
  2516. */
  2517. u32
  2518. halmac_get_fifo_size_88xx(
  2519. IN PHALMAC_ADAPTER pHalmac_adapter,
  2520. IN HAL_FIFO_SEL halmac_fifo_sel
  2521. )
  2522. {
  2523. u32 fifo_size = 0;
  2524. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  2525. return HALMAC_RET_ADAPTER_INVALID;
  2526. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  2527. return HALMAC_RET_API_INVALID;
  2528. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_GET_FIFO_SIZE);
  2529. if (HAL_FIFO_SEL_TX == halmac_fifo_sel)
  2530. fifo_size = pHalmac_adapter->hw_config_info.tx_fifo_size;
  2531. else if (HAL_FIFO_SEL_RX == halmac_fifo_sel)
  2532. fifo_size = pHalmac_adapter->hw_config_info.rx_fifo_size;
  2533. else if (HAL_FIFO_SEL_RSVD_PAGE == halmac_fifo_sel)
  2534. fifo_size = ((pHalmac_adapter->hw_config_info.tx_fifo_size >> HALMAC_TX_PAGE_SIZE_2_POWER_88XX)
  2535. - pHalmac_adapter->txff_allocation.rsvd_pg_bndy) << HALMAC_TX_PAGE_SIZE_2_POWER_88XX;
  2536. else if (HAL_FIFO_SEL_REPORT == halmac_fifo_sel)
  2537. fifo_size = 65536;
  2538. else if (HAL_FIFO_SEL_LLT == halmac_fifo_sel)
  2539. fifo_size = 65536;
  2540. return fifo_size;
  2541. }
  2542. /**
  2543. * halmac_cfg_txbf_88xx() - enable/disable specific user's txbf
  2544. * @pHalmac_adapter : the adapter of halmac
  2545. * @userid : su bfee userid = 0 or 1 to apply TXBF
  2546. * @bw : the sounding bandwidth
  2547. * @txbf_en : 0: disable TXBF, 1: enable TXBF
  2548. * Author : chunchu
  2549. * Return : HALMAC_RET_STATUS
  2550. * More details of status code can be found in prototype document
  2551. */
  2552. HALMAC_RET_STATUS
  2553. halmac_cfg_txbf_88xx(
  2554. IN PHALMAC_ADAPTER pHalmac_adapter,
  2555. IN u8 userid,
  2556. IN HALMAC_BW bw,
  2557. IN u8 txbf_en
  2558. )
  2559. {
  2560. u16 temp42C = 0;
  2561. VOID *pDriver_adapter = NULL;
  2562. PHALMAC_API pHalmac_api;
  2563. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  2564. return HALMAC_RET_ADAPTER_INVALID;
  2565. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  2566. return HALMAC_RET_API_INVALID;
  2567. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CFG_TXBF);
  2568. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  2569. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  2570. if (txbf_en) {
  2571. switch (bw) {
  2572. case HALMAC_BW_80:
  2573. temp42C |= BIT_R_TXBF0_80M;
  2574. case HALMAC_BW_40:
  2575. temp42C |= BIT_R_TXBF0_40M;
  2576. case HALMAC_BW_20:
  2577. temp42C |= BIT_R_TXBF0_20M;
  2578. break;
  2579. default:
  2580. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_ERR, "halmac_cfg_txbf_88xx invalid TXBF BW setting 0x%x of userid %d\n", bw, userid);
  2581. return HALMAC_RET_INVALID_SOUNDING_SETTING;
  2582. }
  2583. }
  2584. switch (userid) {
  2585. case 0:
  2586. temp42C |= HALMAC_REG_READ_16(pHalmac_adapter, REG_TXBF_CTRL) & ~(BIT_R_TXBF0_20M | BIT_R_TXBF0_40M | BIT_R_TXBF0_80M);
  2587. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_TXBF_CTRL, temp42C);
  2588. break;
  2589. case 1:
  2590. temp42C |= HALMAC_REG_READ_16(pHalmac_adapter, REG_TXBF_CTRL + 2) & ~(BIT_R_TXBF0_20M | BIT_R_TXBF0_40M | BIT_R_TXBF0_80M);
  2591. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_TXBF_CTRL + 2, temp42C);
  2592. break;
  2593. default:
  2594. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_ERR, "halmac_cfg_txbf_88xx invalid userid %d\n", userid);
  2595. return HALMAC_RET_INVALID_SOUNDING_SETTING;
  2596. }
  2597. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_TRACE, "halmac_cfg_txbf_88xx, txbf_en = %x <==========\n", txbf_en);
  2598. return HALMAC_RET_SUCCESS;
  2599. }
  2600. /**
  2601. * halmac_cfg_mumimo_88xx() -config mumimo
  2602. * @pHalmac_adapter : the adapter of halmac
  2603. * @pCfgmu : parameters to configure MU PPDU Tx/Rx
  2604. * Author : chunchu
  2605. * Return : HALMAC_RET_STATUS
  2606. * More details of status code can be found in prototype document
  2607. */
  2608. HALMAC_RET_STATUS
  2609. halmac_cfg_mumimo_88xx(
  2610. IN PHALMAC_ADAPTER pHalmac_adapter,
  2611. IN PHALMAC_CFG_MUMIMO_PARA pCfgmu
  2612. )
  2613. {
  2614. VOID *pDriver_adapter = NULL;
  2615. PHALMAC_API pHalmac_api;
  2616. u8 i, idx, id0, id1, gid, mu_tab_sel;
  2617. u8 mu_tab_valid = 0;
  2618. u32 gid_valid[6] = {0};
  2619. u8 temp14C0 = 0;
  2620. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  2621. return HALMAC_RET_ADAPTER_INVALID;
  2622. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  2623. return HALMAC_RET_API_INVALID;
  2624. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CFG_MUMIMO);
  2625. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  2626. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  2627. if (pCfgmu->role == HAL_BFEE) {
  2628. /*config MU BFEE*/
  2629. temp14C0 = HALMAC_REG_READ_8(pHalmac_adapter, REG_MU_TX_CTL) & ~BIT_MASK_R_MU_TABLE_VALID;
  2630. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_MU_TX_CTL, (temp14C0|BIT(0)|BIT(1)) & ~(BIT(7))); /*enable MU table 0 and 1, disable MU TX*/
  2631. /*config GID valid table and user position table*/
  2632. mu_tab_sel = HALMAC_REG_READ_8(pHalmac_adapter, REG_MU_TX_CTL+1) & ~(BIT(0)|BIT(1)|BIT(2));
  2633. for (i = 0; i < 2; i++) {
  2634. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_MU_TX_CTL+1, mu_tab_sel | i);
  2635. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_MU_STA_GID_VLD, pCfgmu->given_gid_tab[i]);
  2636. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_MU_STA_USER_POS_INFO, pCfgmu->given_user_pos[i*2]);
  2637. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_MU_STA_USER_POS_INFO+4, pCfgmu->given_user_pos[i*2+1]);
  2638. }
  2639. } else {
  2640. /*config MU BFER*/
  2641. if (_FALSE == pCfgmu->mu_tx_en) {
  2642. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_MU_TX_CTL, HALMAC_REG_READ_8(pHalmac_adapter, REG_MU_TX_CTL) & ~(BIT(7)));
  2643. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_TRACE, "halmac_cfg_mumimo_88xx disable mu tx <==========\n");
  2644. return HALMAC_RET_SUCCESS;
  2645. }
  2646. /*Transform BB grouping bitmap[14:0] to MAC GID_valid table*/
  2647. for (idx = 0; idx < 15; idx++) {
  2648. if (idx < 5) {
  2649. /*grouping_bitmap bit0~4, MU_STA0 with MUSTA1~5*/
  2650. id0 = 0;
  2651. id1 = (u8)(idx + 1);
  2652. } else if (idx < 9) {
  2653. /*grouping_bitmap bit5~8, MU_STA1 with MUSTA2~5*/
  2654. id0 = 1;
  2655. id1 = (u8)(idx - 3);
  2656. } else if (idx < 12) {
  2657. /*grouping_bitmap bit9~11, MU_STA2 with MUSTA3~5*/
  2658. id0 = 2;
  2659. id1 = (u8)(idx - 6);
  2660. } else if (idx < 14) {
  2661. /*grouping_bitmap bit12~13, MU_STA3 with MUSTA4~5*/
  2662. id0 = 3;
  2663. id1 = (u8)(idx - 8);
  2664. } else {
  2665. /*grouping_bitmap bit14, MU_STA4 with MUSTA5*/
  2666. id0 = 4;
  2667. id1 = (u8)(idx - 9);
  2668. }
  2669. if (pCfgmu->grouping_bitmap & BIT(idx)) {
  2670. /*Pair 1*/
  2671. gid = (idx << 1) + 1;
  2672. gid_valid[id0] |= (BIT(gid));
  2673. gid_valid[id1] |= (BIT(gid));
  2674. /*Pair 2*/
  2675. gid += 1;
  2676. gid_valid[id0] |= (BIT(gid));
  2677. gid_valid[id1] |= (BIT(gid));
  2678. } else {
  2679. /*Pair 1*/
  2680. gid = (idx << 1) + 1;
  2681. gid_valid[id0] &= ~(BIT(gid));
  2682. gid_valid[id1] &= ~(BIT(gid));
  2683. /*Pair 2*/
  2684. gid += 1;
  2685. gid_valid[id0] &= ~(BIT(gid));
  2686. gid_valid[id1] &= ~(BIT(gid));
  2687. }
  2688. }
  2689. /*set MU STA GID valid TABLE*/
  2690. mu_tab_sel = HALMAC_REG_READ_8(pHalmac_adapter, REG_MU_TX_CTL+1) & ~(BIT(0)|BIT(1)|BIT(2));
  2691. for (idx = 0; idx < 6; idx++) {
  2692. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_MU_TX_CTL+1, idx | mu_tab_sel);
  2693. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_MU_STA_GID_VLD, gid_valid[idx]);
  2694. }
  2695. /*To validate the sounding successful MU STA and enable MU TX*/
  2696. for (i = 0; i < 6; i++) {
  2697. if (_TRUE == pCfgmu->sounding_sts[i])
  2698. mu_tab_valid |= BIT(i);
  2699. }
  2700. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_MU_TX_CTL, mu_tab_valid | BIT(7));
  2701. }
  2702. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_TRACE, "halmac_cfg_mumimo_88xx <==========\n");
  2703. return HALMAC_RET_SUCCESS;
  2704. }
  2705. /**
  2706. * halmac_cfg_sounding_88xx() - configure general sounding
  2707. * @pHalmac_adapter : the adapter of halmac
  2708. * @role : driver's role, BFer or BFee
  2709. * @datarate : set ndpa tx rate if driver is BFer, or set csi response rate if driver is BFee
  2710. * Author : chunchu
  2711. * Return : HALMAC_RET_STATUS
  2712. * More details of status code can be found in prototype document
  2713. */
  2714. HALMAC_RET_STATUS
  2715. halmac_cfg_sounding_88xx(
  2716. IN PHALMAC_ADAPTER pHalmac_adapter,
  2717. IN HALMAC_SND_ROLE role,
  2718. IN HALMAC_DATA_RATE datarate
  2719. )
  2720. {
  2721. VOID *pDriver_adapter = NULL;
  2722. PHALMAC_API pHalmac_api;
  2723. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  2724. return HALMAC_RET_ADAPTER_INVALID;
  2725. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  2726. return HALMAC_RET_API_INVALID;
  2727. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CFG_SOUNDING);
  2728. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  2729. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  2730. switch (role) {
  2731. case HAL_BFER:
  2732. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_TXBF_CTRL, HALMAC_REG_READ_32(pHalmac_adapter, REG_TXBF_CTRL) | BIT_R_ENABLE_NDPA
  2733. | BIT_USE_NDPA_PARAMETER | BIT_R_EN_NDPA_INT | BIT_DIS_NDP_BFEN);
  2734. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_NDPA_RATE, datarate);
  2735. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_NDPA_OPT_CTRL, HALMAC_REG_READ_8(pHalmac_adapter, REG_NDPA_OPT_CTRL) & (~(BIT(0) | BIT(1))));
  2736. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_SND_PTCL_CTRL + 1, 0x2 | BIT(7)); /*service file length 2 bytes; fix non-STA1 csi start offset */
  2737. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_SND_PTCL_CTRL + 2, 0x2);
  2738. break;
  2739. case HAL_BFEE:
  2740. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_SND_PTCL_CTRL, 0xDB);
  2741. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_SND_PTCL_CTRL + 3, 0x50);
  2742. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_BBPSF_CTRL + 3, HALMAC_OFDM54 | BIT(6)); //use ndpa rx rate to decide csi rate
  2743. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_RRSR, HALMAC_REG_READ_16(pHalmac_adapter, REG_RRSR) | BIT(datarate));
  2744. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_RXFLTMAP1, HALMAC_REG_READ_8(pHalmac_adapter, REG_RXFLTMAP1) & (~(BIT(4)))); /*RXFF do not accept BF Rpt Poll, avoid CSI crc error*/
  2745. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_RXFLTMAP4, HALMAC_REG_READ_8(pHalmac_adapter, REG_RXFLTMAP4) & (~(BIT(4)))); /*FWFF do not accept BF Rpt Poll, avoid CSI crc error*/
  2746. break;
  2747. default:
  2748. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_ERR, "halmac_cfg_sounding_88xx invalid role\n");
  2749. return HALMAC_RET_INVALID_SOUNDING_SETTING;
  2750. }
  2751. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_TRACE, "halmac_cfg_sounding_88xx <==========\n");
  2752. return HALMAC_RET_SUCCESS;
  2753. }
  2754. /**
  2755. * halmac_del_sounding_88xx() - reset general sounding
  2756. * @pHalmac_adapter : the adapter of halmac
  2757. * @role : driver's role, BFer or BFee
  2758. * Author : chunchu
  2759. * Return : HALMAC_RET_STATUS
  2760. * More details of status code can be found in prototype document
  2761. */
  2762. HALMAC_RET_STATUS
  2763. halmac_del_sounding_88xx(
  2764. IN PHALMAC_ADAPTER pHalmac_adapter,
  2765. IN HALMAC_SND_ROLE role
  2766. )
  2767. {
  2768. VOID *pDriver_adapter = NULL;
  2769. PHALMAC_API pHalmac_api;
  2770. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  2771. return HALMAC_RET_ADAPTER_INVALID;
  2772. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  2773. return HALMAC_RET_API_INVALID;
  2774. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_DEL_SOUNDING);
  2775. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  2776. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  2777. switch (role) {
  2778. case HAL_BFER:
  2779. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_TXBF_CTRL + 3, 0);
  2780. break;
  2781. case HAL_BFEE:
  2782. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_SND_PTCL_CTRL, 0);
  2783. break;
  2784. default:
  2785. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_ERR, "halmac_del_sounding_88xx invalid role\n");
  2786. return HALMAC_RET_INVALID_SOUNDING_SETTING;
  2787. }
  2788. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_TRACE, "halmac_del_sounding_88xx <==========\n");
  2789. return HALMAC_RET_SUCCESS;
  2790. }
  2791. /**
  2792. * halmac_su_bfee_entry_init_88xx() - config SU beamformee's registers
  2793. * @pHalmac_adapter : the adapter of halmac
  2794. * @userid : SU bfee userid = 0 or 1 to be added
  2795. * @paid : partial AID of this bfee
  2796. * Author : chunchu
  2797. * Return : HALMAC_RET_STATUS
  2798. * More details of status code can be found in prototype document
  2799. */
  2800. HALMAC_RET_STATUS
  2801. halmac_su_bfee_entry_init_88xx(
  2802. IN PHALMAC_ADAPTER pHalmac_adapter,
  2803. IN u8 userid,
  2804. IN u16 paid
  2805. )
  2806. {
  2807. u16 temp42C = 0;
  2808. VOID *pDriver_adapter = NULL;
  2809. PHALMAC_API pHalmac_api;
  2810. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  2811. return HALMAC_RET_ADAPTER_INVALID;
  2812. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  2813. return HALMAC_RET_API_INVALID;
  2814. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_SU_BFEE_ENTRY_INIT);
  2815. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  2816. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  2817. switch (userid) {
  2818. case 0:
  2819. temp42C = HALMAC_REG_READ_16(pHalmac_adapter, REG_TXBF_CTRL) & ~(BIT_MASK_R_TXBF0_AID | BIT_R_TXBF0_20M | BIT_R_TXBF0_40M | BIT_R_TXBF0_80M);
  2820. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_TXBF_CTRL, temp42C | paid);
  2821. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_ASSOCIATED_BFMEE_SEL, paid);
  2822. break;
  2823. case 1:
  2824. temp42C = HALMAC_REG_READ_16(pHalmac_adapter, REG_TXBF_CTRL + 2) & ~(BIT_MASK_R_TXBF1_AID | BIT_R_TXBF0_20M | BIT_R_TXBF0_40M | BIT_R_TXBF0_80M);
  2825. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_TXBF_CTRL + 2, temp42C | paid);
  2826. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_ASSOCIATED_BFMEE_SEL + 2, paid | BIT(9));
  2827. break;
  2828. default:
  2829. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_ERR, "halmac_su_bfee_entry_init_88xx invalid userid %d\n", userid);
  2830. return HALMAC_RET_INVALID_SOUNDING_SETTING;
  2831. }
  2832. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_TRACE, "halmac_su_bfee_entry_init_88xx <==========\n");
  2833. return HALMAC_RET_SUCCESS;
  2834. }
  2835. /**
  2836. * halmac_su_bfee_entry_init_88xx() - config SU beamformer's registers
  2837. * @pHalmac_adapter : the adapter of halmac
  2838. * @pSu_bfer_init : parameters to configure SU BFER entry
  2839. * Author : chunchu
  2840. * Return : HALMAC_RET_STATUS
  2841. * More details of status code can be found in prototype document
  2842. */
  2843. HALMAC_RET_STATUS
  2844. halmac_su_bfer_entry_init_88xx(
  2845. IN PHALMAC_ADAPTER pHalmac_adapter,
  2846. IN PHALMAC_SU_BFER_INIT_PARA pSu_bfer_init
  2847. )
  2848. {
  2849. u16 mac_address_H;
  2850. u32 mac_address_L;
  2851. VOID *pDriver_adapter = NULL;
  2852. PHALMAC_API pHalmac_api;
  2853. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  2854. return HALMAC_RET_ADAPTER_INVALID;
  2855. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  2856. return HALMAC_RET_API_INVALID;
  2857. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_SU_BFER_ENTRY_INIT);
  2858. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  2859. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  2860. /* mac_address_L = bfer_address.Address_L_H.Address_Low; */
  2861. /* mac_address_H = bfer_address.Address_L_H.Address_High; */
  2862. mac_address_L = rtk_le32_to_cpu(pSu_bfer_init->bfer_address.Address_L_H.Address_Low);
  2863. mac_address_H = rtk_le16_to_cpu(pSu_bfer_init->bfer_address.Address_L_H.Address_High);
  2864. switch (pSu_bfer_init->userid) {
  2865. case 0:
  2866. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_ASSOCIATED_BFMER0_INFO, mac_address_L);
  2867. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_ASSOCIATED_BFMER0_INFO + 4, mac_address_H);
  2868. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_ASSOCIATED_BFMER0_INFO + 6, pSu_bfer_init->paid);
  2869. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_TX_CSI_RPT_PARAM_BW20, pSu_bfer_init->csi_para);
  2870. break;
  2871. case 1:
  2872. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_ASSOCIATED_BFMER1_INFO, mac_address_L);
  2873. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_ASSOCIATED_BFMER1_INFO + 4, mac_address_H);
  2874. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_ASSOCIATED_BFMER1_INFO + 6, pSu_bfer_init->paid);
  2875. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_TX_CSI_RPT_PARAM_BW20 + 2, pSu_bfer_init->csi_para);
  2876. break;
  2877. default:
  2878. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_ERR, "halmac_su_bfer_entry_init_88xx invalid userid %d\n", pSu_bfer_init->userid);
  2879. return HALMAC_RET_INVALID_SOUNDING_SETTING;
  2880. }
  2881. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_TRACE, "halmac_su_bfer_entry_init_88xx <==========\n");
  2882. return HALMAC_RET_SUCCESS;
  2883. }
  2884. /**
  2885. * halmac_mu_bfee_entry_init_88xx() - config MU beamformee's registers
  2886. * @pHalmac_adapter : the adapter of halmac
  2887. * @pMu_bfee_init : parameters to configure MU BFEE entry
  2888. * Author : chunchu
  2889. * Return : HALMAC_RET_STATUS
  2890. * More details of status code can be found in prototype document
  2891. */
  2892. HALMAC_RET_STATUS
  2893. halmac_mu_bfee_entry_init_88xx(
  2894. IN PHALMAC_ADAPTER pHalmac_adapter,
  2895. IN PHALMAC_MU_BFEE_INIT_PARA pMu_bfee_init
  2896. )
  2897. {
  2898. u16 temp168X = 0, temp14C0;
  2899. VOID *pDriver_adapter = NULL;
  2900. PHALMAC_API pHalmac_api;
  2901. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  2902. return HALMAC_RET_ADAPTER_INVALID;
  2903. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  2904. return HALMAC_RET_API_INVALID;
  2905. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_MU_BFEE_ENTRY_INIT);
  2906. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  2907. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  2908. temp168X |= pMu_bfee_init->paid | BIT(9);
  2909. HALMAC_REG_WRITE_16(pHalmac_adapter, (0x1680 + pMu_bfee_init->userid * 2), temp168X);
  2910. temp14C0 = HALMAC_REG_READ_16(pHalmac_adapter, REG_MU_TX_CTL) & ~(BIT(8)|BIT(9)|BIT(10));
  2911. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_MU_TX_CTL, temp14C0|((pMu_bfee_init->userid-2)<<8));
  2912. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_MU_STA_GID_VLD, 0);
  2913. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_MU_STA_USER_POS_INFO, pMu_bfee_init->user_position_l);
  2914. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_MU_STA_USER_POS_INFO+4, pMu_bfee_init->user_position_h);
  2915. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_TRACE, "halmac_mu_bfee_entry_init_88xx <==========\n");
  2916. return HALMAC_RET_SUCCESS;
  2917. }
  2918. /**
  2919. * halmac_mu_bfer_entry_init_88xx() - config MU beamformer's registers
  2920. * @pHalmac_adapter : the adapter of halmac
  2921. * @pMu_bfer_init : parameters to configure MU BFER entry
  2922. * Author : chunchu
  2923. * Return : HALMAC_RET_STATUS
  2924. * More details of status code can be found in prototype document
  2925. */
  2926. HALMAC_RET_STATUS
  2927. halmac_mu_bfer_entry_init_88xx(
  2928. IN PHALMAC_ADAPTER pHalmac_adapter,
  2929. IN PHALMAC_MU_BFER_INIT_PARA pMu_bfer_init
  2930. )
  2931. {
  2932. u16 temp1680 = 0;
  2933. u16 mac_address_H;
  2934. u32 mac_address_L;
  2935. VOID *pDriver_adapter = NULL;
  2936. PHALMAC_API pHalmac_api;
  2937. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  2938. return HALMAC_RET_ADAPTER_INVALID;
  2939. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  2940. return HALMAC_RET_API_INVALID;
  2941. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_MU_BFER_ENTRY_INIT);
  2942. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  2943. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  2944. /* mac_address_L = pHalmac_adapter->snd_info.bfer_address.Address_L_H.Address_Low; */
  2945. /* mac_address_H = pHalmac_adapter->snd_info.bfer_address.Address_L_H.Address_High; */
  2946. mac_address_L = rtk_le32_to_cpu(pMu_bfer_init->bfer_address.Address_L_H.Address_Low);
  2947. mac_address_H = rtk_le16_to_cpu(pMu_bfer_init->bfer_address.Address_L_H.Address_High);
  2948. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_ASSOCIATED_BFMER0_INFO, mac_address_L);
  2949. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_ASSOCIATED_BFMER0_INFO + 4, mac_address_H);
  2950. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_ASSOCIATED_BFMER0_INFO + 6, pMu_bfer_init->paid);
  2951. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_TX_CSI_RPT_PARAM_BW20, pMu_bfer_init->csi_para);
  2952. temp1680 = HALMAC_REG_READ_16(pHalmac_adapter, 0x1680) & 0xC000;
  2953. temp1680 |= pMu_bfer_init->my_aid | (pMu_bfer_init->csi_length_sel << 12);
  2954. HALMAC_REG_WRITE_16(pHalmac_adapter, 0x1680, temp1680);
  2955. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_TRACE, "halmac_mu_bfer_entry_init_88xx <==========\n");
  2956. return HALMAC_RET_SUCCESS;
  2957. }
  2958. /**
  2959. * halmac_su_bfee_entry_del_88xx() - reset SU beamformee's registers
  2960. * @pHalmac_adapter : the adapter of halmac
  2961. * @userid : the SU BFee userid to be deleted
  2962. * Author : chunchu
  2963. * Return : HALMAC_RET_STATUS
  2964. * More details of status code can be found in prototype document
  2965. */
  2966. HALMAC_RET_STATUS
  2967. halmac_su_bfee_entry_del_88xx(
  2968. IN PHALMAC_ADAPTER pHalmac_adapter,
  2969. IN u8 userid
  2970. )
  2971. {
  2972. VOID *pDriver_adapter = NULL;
  2973. PHALMAC_API pHalmac_api;
  2974. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  2975. return HALMAC_RET_ADAPTER_INVALID;
  2976. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  2977. return HALMAC_RET_API_INVALID;
  2978. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_SU_BFEE_ENTRY_DEL);
  2979. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  2980. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  2981. switch (userid) {
  2982. case 0:
  2983. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_TXBF_CTRL, HALMAC_REG_READ_16(pHalmac_adapter, REG_TXBF_CTRL) &
  2984. ~(BIT_MASK_R_TXBF0_AID | BIT_R_TXBF0_20M | BIT_R_TXBF0_40M | BIT_R_TXBF0_80M));
  2985. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_ASSOCIATED_BFMEE_SEL, 0);
  2986. break;
  2987. case 1:
  2988. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_TXBF_CTRL + 2, HALMAC_REG_READ_16(pHalmac_adapter, REG_TXBF_CTRL + 2) &
  2989. ~(BIT_MASK_R_TXBF1_AID | BIT_R_TXBF0_20M | BIT_R_TXBF0_40M | BIT_R_TXBF0_80M));
  2990. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_ASSOCIATED_BFMEE_SEL + 2, 0);
  2991. break;
  2992. default:
  2993. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_ERR, "halmac_su_bfee_entry_del_88xx invalid userid %d\n", userid);
  2994. return HALMAC_RET_INVALID_SOUNDING_SETTING;
  2995. }
  2996. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_TRACE, "halmac_su_bfee_entry_del_88xx <==========\n");
  2997. return HALMAC_RET_SUCCESS;
  2998. }
  2999. /**
  3000. * halmac_su_bfee_entry_del_88xx() - reset SU beamformer's registers
  3001. * @pHalmac_adapter : the adapter of halmac
  3002. * @userid : the SU BFer userid to be deleted
  3003. * Author : chunchu
  3004. * Return : HALMAC_RET_STATUS
  3005. * More details of status code can be found in prototype document
  3006. */
  3007. HALMAC_RET_STATUS
  3008. halmac_su_bfer_entry_del_88xx(
  3009. IN PHALMAC_ADAPTER pHalmac_adapter,
  3010. IN u8 userid
  3011. )
  3012. {
  3013. VOID *pDriver_adapter = NULL;
  3014. PHALMAC_API pHalmac_api;
  3015. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  3016. return HALMAC_RET_ADAPTER_INVALID;
  3017. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  3018. return HALMAC_RET_API_INVALID;
  3019. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_SU_BFER_ENTRY_DEL);
  3020. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3021. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  3022. switch (userid) {
  3023. case 0:
  3024. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_ASSOCIATED_BFMER0_INFO, 0);
  3025. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_ASSOCIATED_BFMER0_INFO + 4, 0);
  3026. break;
  3027. case 1:
  3028. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_ASSOCIATED_BFMER1_INFO, 0);
  3029. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_ASSOCIATED_BFMER1_INFO + 4, 0);
  3030. break;
  3031. default:
  3032. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_ERR, "halmac_su_bfer_entry_del_88xx invalid userid %d\n", userid);
  3033. return HALMAC_RET_INVALID_SOUNDING_SETTING;
  3034. }
  3035. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_TRACE, "halmac_su_bfer_entry_del_88xx <==========\n");
  3036. return HALMAC_RET_SUCCESS;
  3037. }
  3038. /**
  3039. * halmac_mu_bfee_entry_del_88xx() - reset MU beamformee's registers
  3040. * @pHalmac_adapter : the adapter of halmac
  3041. * @userid : the MU STA userid to be deleted
  3042. * Author : chunchu
  3043. * Return : HALMAC_RET_STATUS
  3044. * More details of status code can be found in prototype document
  3045. */
  3046. HALMAC_RET_STATUS
  3047. halmac_mu_bfee_entry_del_88xx(
  3048. IN PHALMAC_ADAPTER pHalmac_adapter,
  3049. IN u8 userid
  3050. )
  3051. {
  3052. VOID *pDriver_adapter = NULL;
  3053. PHALMAC_API pHalmac_api;
  3054. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  3055. return HALMAC_RET_ADAPTER_INVALID;
  3056. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  3057. return HALMAC_RET_API_INVALID;
  3058. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_MU_BFEE_ENTRY_DEL);
  3059. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3060. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  3061. HALMAC_REG_WRITE_16(pHalmac_adapter, 0x1680 + userid * 2, 0);
  3062. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_MU_TX_CTL, HALMAC_REG_READ_8(pHalmac_adapter, REG_MU_TX_CTL) & ~(BIT(userid-2)));
  3063. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_TRACE, "halmac_mu_bfee_entry_del_88xx <==========\n");
  3064. return HALMAC_RET_SUCCESS;
  3065. }
  3066. /**
  3067. * halmac_mu_bfer_entry_del_88xx() -reset MU beamformer's registers
  3068. * @pHalmac_adapter : the adapter of halmac
  3069. * Author : chunchu
  3070. * Return : HALMAC_RET_STATUS
  3071. * More details of status code can be found in prototype document
  3072. */
  3073. HALMAC_RET_STATUS
  3074. halmac_mu_bfer_entry_del_88xx(
  3075. IN PHALMAC_ADAPTER pHalmac_adapter
  3076. )
  3077. {
  3078. VOID *pDriver_adapter = NULL;
  3079. PHALMAC_API pHalmac_api;
  3080. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  3081. return HALMAC_RET_ADAPTER_INVALID;
  3082. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  3083. return HALMAC_RET_API_INVALID;
  3084. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_MU_BFER_ENTRY_DEL);
  3085. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3086. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  3087. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_ASSOCIATED_BFMER0_INFO, 0);
  3088. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_ASSOCIATED_BFMER0_INFO + 4, 0);
  3089. HALMAC_REG_WRITE_16(pHalmac_adapter, 0x1680, 0);
  3090. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_MU_TX_CTL, 0);
  3091. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_TRACE, "halmac_mu_bfer_entry_del_88xx <==========\n");
  3092. return HALMAC_RET_SUCCESS;
  3093. }
  3094. /**
  3095. * halmac_add_ch_info_88xx() -add channel information
  3096. * @pHalmac_adapter : the adapter of halmac
  3097. * @pCh_info : channel information
  3098. * Author : KaiYuan Chang/Ivan Lin
  3099. * Return : HALMAC_RET_STATUS
  3100. * More details of status code can be found in prototype document
  3101. */
  3102. HALMAC_RET_STATUS
  3103. halmac_add_ch_info_88xx(
  3104. IN PHALMAC_ADAPTER pHalmac_adapter,
  3105. IN PHALMAC_CH_INFO pCh_info
  3106. )
  3107. {
  3108. VOID *pDriver_adapter = NULL;
  3109. PHALMAC_CS_INFO pCh_sw_info;
  3110. HALMAC_SCAN_CMD_CONSTRUCT_STATE state_scan;
  3111. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  3112. return HALMAC_RET_ADAPTER_INVALID;
  3113. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  3114. return HALMAC_RET_API_INVALID;
  3115. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3116. pCh_sw_info = &(pHalmac_adapter->ch_sw_info);
  3117. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "[TRACE]halmac_add_ch_info_88xx ==========>\n");
  3118. if (HALMAC_GEN_INFO_SENT != pHalmac_adapter->halmac_state.dlfw_state) {
  3119. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "[ERR]halmac_add_ch_info_88xx: gen_info is not send to FW!!!!\n");
  3120. return HALMAC_RET_GEN_INFO_NOT_SENT;
  3121. }
  3122. state_scan = halmac_query_scan_curr_state_88xx(pHalmac_adapter);
  3123. if ((HALMAC_SCAN_CMD_CONSTRUCT_BUFFER_CLEARED != state_scan) && (HALMAC_SCAN_CMD_CONSTRUCT_CONSTRUCTING != state_scan)) {
  3124. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_WARN, "[WARN]Scan machine fail(add ch info)...\n");
  3125. return HALMAC_RET_ERROR_STATE;
  3126. }
  3127. if (NULL == pCh_sw_info->ch_info_buf) {
  3128. pCh_sw_info->ch_info_buf = (u8 *)PLATFORM_RTL_MALLOC(pDriver_adapter, HALMAC_EXTRA_INFO_BUFF_SIZE_88XX);
  3129. if (NULL == pCh_sw_info->ch_info_buf)
  3130. return HALMAC_RET_NULL_POINTER;
  3131. pCh_sw_info->ch_info_buf_w = pCh_sw_info->ch_info_buf;
  3132. pCh_sw_info->buf_size = HALMAC_EXTRA_INFO_BUFF_SIZE_88XX;
  3133. pCh_sw_info->avai_buf_size = HALMAC_EXTRA_INFO_BUFF_SIZE_88XX;
  3134. pCh_sw_info->total_size = 0;
  3135. pCh_sw_info->extra_info_en = 0;
  3136. pCh_sw_info->ch_num = 0;
  3137. }
  3138. if (1 == pCh_sw_info->extra_info_en) {
  3139. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "[ERR]halmac_add_ch_info_88xx: construct sequence wrong!!\n");
  3140. return HALMAC_RET_CH_SW_SEQ_WRONG;
  3141. }
  3142. if (4 > pCh_sw_info->avai_buf_size) {
  3143. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "[ERR]halmac_add_ch_info_88xx: no available buffer!!\n");
  3144. return HALMAC_RET_CH_SW_NO_BUF;
  3145. }
  3146. if (HALMAC_RET_SUCCESS != halmac_transition_scan_state_88xx(pHalmac_adapter, HALMAC_SCAN_CMD_CONSTRUCT_CONSTRUCTING))
  3147. return HALMAC_RET_ERROR_STATE;
  3148. CHANNEL_INFO_SET_CHANNEL(pCh_sw_info->ch_info_buf_w, pCh_info->channel);
  3149. CHANNEL_INFO_SET_PRI_CH_IDX(pCh_sw_info->ch_info_buf_w, pCh_info->pri_ch_idx);
  3150. CHANNEL_INFO_SET_BANDWIDTH(pCh_sw_info->ch_info_buf_w, pCh_info->bw);
  3151. CHANNEL_INFO_SET_TIMEOUT(pCh_sw_info->ch_info_buf_w, pCh_info->timeout);
  3152. CHANNEL_INFO_SET_ACTION_ID(pCh_sw_info->ch_info_buf_w, pCh_info->action_id);
  3153. CHANNEL_INFO_SET_CH_EXTRA_INFO(pCh_sw_info->ch_info_buf_w, pCh_info->extra_info);
  3154. pCh_sw_info->avai_buf_size = pCh_sw_info->avai_buf_size - 4;
  3155. pCh_sw_info->total_size = pCh_sw_info->total_size + 4;
  3156. pCh_sw_info->ch_num++;
  3157. pCh_sw_info->extra_info_en = pCh_info->extra_info;
  3158. pCh_sw_info->ch_info_buf_w = pCh_sw_info->ch_info_buf_w + 4;
  3159. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "[TRACE]halmac_add_ch_info_88xx <==========\n");
  3160. return HALMAC_RET_SUCCESS;
  3161. }
  3162. /**
  3163. * halmac_add_extra_ch_info_88xx() -add extra channel information
  3164. * @pHalmac_adapter : the adapter of halmac
  3165. * @pCh_extra_info : extra channel information
  3166. * Author : KaiYuan Chang/Ivan Lin
  3167. * Return : HALMAC_RET_STATUS
  3168. * More details of status code can be found in prototype document
  3169. */
  3170. HALMAC_RET_STATUS
  3171. halmac_add_extra_ch_info_88xx(
  3172. IN PHALMAC_ADAPTER pHalmac_adapter,
  3173. IN PHALMAC_CH_EXTRA_INFO pCh_extra_info
  3174. )
  3175. {
  3176. VOID *pDriver_adapter = NULL;
  3177. PHALMAC_CS_INFO pCh_sw_info;
  3178. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  3179. return HALMAC_RET_ADAPTER_INVALID;
  3180. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  3181. return HALMAC_RET_API_INVALID;
  3182. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_ADD_EXTRA_CH_INFO);
  3183. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3184. pCh_sw_info = &(pHalmac_adapter->ch_sw_info);
  3185. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_add_extra_ch_info_88xx ==========>\n");
  3186. if (NULL == pCh_sw_info->ch_info_buf) {
  3187. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_add_extra_ch_info_88xx: NULL==pCh_sw_info->ch_info_buf!!\n");
  3188. return HALMAC_RET_CH_SW_SEQ_WRONG;
  3189. }
  3190. if (0 == pCh_sw_info->extra_info_en) {
  3191. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_add_extra_ch_info_88xx: construct sequence wrong!!\n");
  3192. return HALMAC_RET_CH_SW_SEQ_WRONG;
  3193. }
  3194. if (pCh_sw_info->avai_buf_size < (u32)(pCh_extra_info->extra_info_size + 2)) {/* 2:ch_extra_info_id, ch_extra_info, ch_extra_info_size are totally 2Byte */
  3195. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_add_extra_ch_info_88xx: no available buffer!!\n");
  3196. return HALMAC_RET_CH_SW_NO_BUF;
  3197. }
  3198. if (HALMAC_SCAN_CMD_CONSTRUCT_CONSTRUCTING != halmac_query_scan_curr_state_88xx(pHalmac_adapter)) {
  3199. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Scan machine fail(add extra ch info)...\n");
  3200. return HALMAC_RET_ERROR_STATE;
  3201. }
  3202. if (HALMAC_RET_SUCCESS != halmac_transition_scan_state_88xx(pHalmac_adapter, HALMAC_SCAN_CMD_CONSTRUCT_CONSTRUCTING))
  3203. return HALMAC_RET_ERROR_STATE;
  3204. CH_EXTRA_INFO_SET_CH_EXTRA_INFO_ID(pCh_sw_info->ch_info_buf_w, pCh_extra_info->extra_action_id);
  3205. CH_EXTRA_INFO_SET_CH_EXTRA_INFO(pCh_sw_info->ch_info_buf_w, pCh_extra_info->extra_info);
  3206. CH_EXTRA_INFO_SET_CH_EXTRA_INFO_SIZE(pCh_sw_info->ch_info_buf_w, pCh_extra_info->extra_info_size);
  3207. PLATFORM_RTL_MEMCPY(pDriver_adapter, pCh_sw_info->ch_info_buf_w + 2, pCh_extra_info->extra_info_data, pCh_extra_info->extra_info_size);
  3208. pCh_sw_info->avai_buf_size = pCh_sw_info->avai_buf_size - (2 + pCh_extra_info->extra_info_size);
  3209. pCh_sw_info->total_size = pCh_sw_info->total_size + (2 + pCh_extra_info->extra_info_size);
  3210. pCh_sw_info->extra_info_en = pCh_extra_info->extra_info;
  3211. pCh_sw_info->ch_info_buf_w = pCh_sw_info->ch_info_buf_w + (2 + pCh_extra_info->extra_info_size);
  3212. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_add_extra_ch_info_88xx <==========\n");
  3213. return HALMAC_RET_SUCCESS;
  3214. }
  3215. /**
  3216. * halmac_ctrl_ch_switch_88xx() -send channel switch cmd
  3217. * @pHalmac_adapter : the adapter of halmac
  3218. * @pCs_option : channel switch config
  3219. * Author : KaiYuan Chang/Ivan Lin
  3220. * Return : HALMAC_RET_STATUS
  3221. * More details of status code can be found in prototype document
  3222. */
  3223. HALMAC_RET_STATUS
  3224. halmac_ctrl_ch_switch_88xx(
  3225. IN PHALMAC_ADAPTER pHalmac_adapter,
  3226. IN PHALMAC_CH_SWITCH_OPTION pCs_option
  3227. )
  3228. {
  3229. VOID *pDriver_adapter = NULL;
  3230. PHALMAC_API pHalmac_api;
  3231. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  3232. HALMAC_SCAN_CMD_CONSTRUCT_STATE state_scan;
  3233. HALMAC_CMD_PROCESS_STATUS *pProcess_status = &(pHalmac_adapter->halmac_state.scan_state_set.process_status);
  3234. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  3235. return HALMAC_RET_ADAPTER_INVALID;
  3236. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  3237. return HALMAC_RET_API_INVALID;
  3238. if (HALMAC_RET_SUCCESS != halmac_fw_validate(pHalmac_adapter))
  3239. return HALMAC_RET_NO_DLFW;
  3240. if (pHalmac_adapter->fw_version.h2c_version < 4)
  3241. return HALMAC_RET_FW_NO_SUPPORT;
  3242. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CTRL_CH_SWITCH);
  3243. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3244. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  3245. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_ctrl_ch_switch_88xx pCs_option->switch_en = %d==========>\n", pCs_option->switch_en);
  3246. if (_FALSE == pCs_option->switch_en)
  3247. *pProcess_status = HALMAC_CMD_PROCESS_IDLE;
  3248. if ((HALMAC_CMD_PROCESS_SENDING == *pProcess_status) || (HALMAC_CMD_PROCESS_RCVD == *pProcess_status)) {
  3249. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Wait event(ctrl ch switch)...\n");
  3250. return HALMAC_RET_BUSY_STATE;
  3251. }
  3252. state_scan = halmac_query_scan_curr_state_88xx(pHalmac_adapter);
  3253. if (_TRUE == pCs_option->switch_en) {
  3254. if (HALMAC_SCAN_CMD_CONSTRUCT_CONSTRUCTING != state_scan) {
  3255. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_ctrl_ch_switch_88xx(on) invalid in state %x\n", state_scan);
  3256. return HALMAC_RET_ERROR_STATE;
  3257. }
  3258. } else {
  3259. if (HALMAC_SCAN_CMD_CONSTRUCT_BUFFER_CLEARED != state_scan) {
  3260. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_ctrl_ch_switch_88xx(off) invalid in state %x\n", state_scan);
  3261. return HALMAC_RET_ERROR_STATE;
  3262. }
  3263. }
  3264. status = halmac_func_ctrl_ch_switch_88xx(pHalmac_adapter, pCs_option);
  3265. if (HALMAC_RET_SUCCESS != status) {
  3266. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_ctrl_ch_switch FAIL = %x!!\n", status);
  3267. return status;
  3268. }
  3269. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_ctrl_ch_switch_88xx <==========\n");
  3270. return HALMAC_RET_SUCCESS;
  3271. }
  3272. /**
  3273. * halmac_clear_ch_info_88xx() -clear channel information
  3274. * @pHalmac_adapter : the adapter of halmac
  3275. * Author : KaiYuan Chang/Ivan Lin
  3276. * Return : HALMAC_RET_STATUS
  3277. * More details of status code can be found in prototype document
  3278. */
  3279. HALMAC_RET_STATUS
  3280. halmac_clear_ch_info_88xx(
  3281. IN PHALMAC_ADAPTER pHalmac_adapter
  3282. )
  3283. {
  3284. VOID *pDriver_adapter = NULL;
  3285. PHALMAC_API pHalmac_api;
  3286. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  3287. return HALMAC_RET_ADAPTER_INVALID;
  3288. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  3289. return HALMAC_RET_API_INVALID;
  3290. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CLEAR_CH_INFO);
  3291. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3292. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  3293. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_clear_ch_info_88xx ==========>\n");
  3294. if (HALMAC_SCAN_CMD_CONSTRUCT_H2C_SENT == halmac_query_scan_curr_state_88xx(pHalmac_adapter)) {
  3295. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Scan machine fail(clear ch info)...\n");
  3296. return HALMAC_RET_ERROR_STATE;
  3297. }
  3298. if (HALMAC_RET_SUCCESS != halmac_transition_scan_state_88xx(pHalmac_adapter, HALMAC_SCAN_CMD_CONSTRUCT_BUFFER_CLEARED))
  3299. return HALMAC_RET_ERROR_STATE;
  3300. PLATFORM_RTL_FREE(pDriver_adapter, pHalmac_adapter->ch_sw_info.ch_info_buf, pHalmac_adapter->ch_sw_info.buf_size);
  3301. pHalmac_adapter->ch_sw_info.ch_info_buf = NULL;
  3302. pHalmac_adapter->ch_sw_info.ch_info_buf_w = NULL;
  3303. pHalmac_adapter->ch_sw_info.extra_info_en = 0;
  3304. pHalmac_adapter->ch_sw_info.buf_size = 0;
  3305. pHalmac_adapter->ch_sw_info.avai_buf_size = 0;
  3306. pHalmac_adapter->ch_sw_info.total_size = 0;
  3307. pHalmac_adapter->ch_sw_info.ch_num = 0;
  3308. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_clear_ch_info_88xx <==========\n");
  3309. return HALMAC_RET_SUCCESS;
  3310. }
  3311. HALMAC_RET_STATUS
  3312. halmac_p2pps_88xx(
  3313. IN PHALMAC_ADAPTER pHalmac_adapter,
  3314. IN PHALMAC_P2PPS pP2PPS
  3315. )
  3316. {
  3317. VOID *pDriver_adapter = NULL;
  3318. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  3319. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  3320. return HALMAC_RET_ADAPTER_INVALID;
  3321. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  3322. return HALMAC_RET_API_INVALID;
  3323. if (HALMAC_RET_SUCCESS != halmac_fw_validate(pHalmac_adapter))
  3324. return HALMAC_RET_NO_DLFW;
  3325. if (pHalmac_adapter->fw_version.h2c_version < 6)
  3326. return HALMAC_RET_FW_NO_SUPPORT;
  3327. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3328. status = halmac_func_p2pps_88xx(pHalmac_adapter, pP2PPS);
  3329. if (HALMAC_RET_SUCCESS != status) {
  3330. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "[ERR]halmac_p2pps FAIL = %x!!\n", status);
  3331. return status;
  3332. }
  3333. return HALMAC_RET_SUCCESS;
  3334. }
  3335. static HALMAC_RET_STATUS
  3336. halmac_func_p2pps_88xx(
  3337. IN PHALMAC_ADAPTER pHalmac_adapter,
  3338. IN PHALMAC_P2PPS pP2PPS
  3339. )
  3340. {
  3341. u8 pH2c_buff[HALMAC_H2C_CMD_SIZE_88XX] = { 0 };
  3342. u16 h2c_seq_mum = 0;
  3343. VOID *pDriver_adapter = NULL;
  3344. PHALMAC_API pHalmac_api;
  3345. HALMAC_H2C_HEADER_INFO h2c_header_info;
  3346. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  3347. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "[TRACE]halmac_p2pps !!\n");
  3348. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3349. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  3350. P2PPS_SET_OFFLOAD_EN(pH2c_buff, pP2PPS->offload_en);
  3351. P2PPS_SET_ROLE(pH2c_buff, pP2PPS->role);
  3352. P2PPS_SET_CTWINDOW_EN(pH2c_buff, pP2PPS->ctwindow_en);
  3353. P2PPS_SET_NOA_EN(pH2c_buff, pP2PPS->noa_en);
  3354. P2PPS_SET_NOA_SEL(pH2c_buff, pP2PPS->noa_sel);
  3355. P2PPS_SET_ALLSTASLEEP(pH2c_buff, pP2PPS->all_sta_sleep);
  3356. P2PPS_SET_DISCOVERY(pH2c_buff, pP2PPS->discovery);
  3357. P2PPS_SET_P2P_PORT_ID(pH2c_buff, pP2PPS->p2p_port_id);
  3358. P2PPS_SET_P2P_GROUP(pH2c_buff, pP2PPS->p2p_group);
  3359. P2PPS_SET_P2P_MACID(pH2c_buff, pP2PPS->p2p_macid);
  3360. P2PPS_SET_CTWINDOW_LENGTH(pH2c_buff, pP2PPS->ctwindow_length);
  3361. P2PPS_SET_NOA_DURATION_PARA(pH2c_buff, pP2PPS->noa_duration_para);
  3362. P2PPS_SET_NOA_INTERVAL_PARA(pH2c_buff, pP2PPS->noa_interval_para);
  3363. P2PPS_SET_NOA_START_TIME_PARA(pH2c_buff, pP2PPS->noa_start_time_para);
  3364. P2PPS_SET_NOA_COUNT_PARA(pH2c_buff, pP2PPS->noa_count_para);
  3365. h2c_header_info.sub_cmd_id = SUB_CMD_ID_P2PPS;
  3366. h2c_header_info.content_size = 24;
  3367. h2c_header_info.ack = _FALSE;
  3368. halmac_set_fw_offload_h2c_header_88xx(pHalmac_adapter, pH2c_buff, &h2c_header_info, &h2c_seq_mum);
  3369. status = halmac_send_h2c_pkt_88xx(pHalmac_adapter, pH2c_buff, HALMAC_H2C_CMD_SIZE_88XX, _FALSE);
  3370. if (HALMAC_RET_SUCCESS != status)
  3371. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "[ERR]halmac_send_h2c_p2pps_88xx Fail = %x!!\n", status);
  3372. return status;
  3373. }
  3374. /**
  3375. * halmac_send_general_info_88xx() -send general information to FW
  3376. * @pHalmac_adapter : the adapter of halmac
  3377. * @pGeneral_info : general information
  3378. * Author : KaiYuan Chang/Ivan Lin
  3379. * Return : HALMAC_RET_STATUS
  3380. * More details of status code can be found in prototype document
  3381. */
  3382. HALMAC_RET_STATUS
  3383. halmac_send_general_info_88xx(
  3384. IN PHALMAC_ADAPTER pHalmac_adapter,
  3385. IN PHALMAC_GENERAL_INFO pGeneral_info
  3386. )
  3387. {
  3388. VOID *pDriver_adapter = NULL;
  3389. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  3390. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  3391. return HALMAC_RET_ADAPTER_INVALID;
  3392. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  3393. return HALMAC_RET_API_INVALID;
  3394. if (HALMAC_RET_SUCCESS != halmac_fw_validate(pHalmac_adapter))
  3395. return HALMAC_RET_NO_DLFW;
  3396. if (pHalmac_adapter->fw_version.h2c_version < 4)
  3397. return HALMAC_RET_FW_NO_SUPPORT;
  3398. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_SEND_GENERAL_INFO);
  3399. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3400. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_send_general_info_88xx ==========>\n");
  3401. if (HALMAC_DLFW_NONE == pHalmac_adapter->halmac_state.dlfw_state) {
  3402. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_send_general_info_88xx Fail due to DLFW NONE!!\n");
  3403. return HALMAC_RET_DLFW_FAIL;
  3404. }
  3405. status = halmac_func_send_general_info_88xx(pHalmac_adapter, pGeneral_info);
  3406. if (HALMAC_RET_SUCCESS != status) {
  3407. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_send_general_info error = %x\n", status);
  3408. return status;
  3409. }
  3410. if (HALMAC_DLFW_DONE == pHalmac_adapter->halmac_state.dlfw_state)
  3411. pHalmac_adapter->halmac_state.dlfw_state = HALMAC_GEN_INFO_SENT;
  3412. pHalmac_adapter->gen_info_valid = _TRUE;
  3413. PLATFORM_RTL_MEMCPY(pDriver_adapter, &(pHalmac_adapter->general_info), pGeneral_info, sizeof(HALMAC_GENERAL_INFO));
  3414. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_send_general_info_88xx <==========\n");
  3415. return HALMAC_RET_SUCCESS;
  3416. }
  3417. /**
  3418. * halmac_start_iqk_88xx() -trigger FW IQK
  3419. * @pHalmac_adapter : the adapter of halmac
  3420. * @pIqk_para : IQK parameter
  3421. * Author : KaiYuan Chang/Ivan Lin
  3422. * Return : HALMAC_RET_STATUS
  3423. * More details of status code can be found in prototype document
  3424. */
  3425. HALMAC_RET_STATUS
  3426. halmac_start_iqk_88xx(
  3427. IN PHALMAC_ADAPTER pHalmac_adapter,
  3428. IN PHALMAC_IQK_PARA pIqk_para
  3429. )
  3430. {
  3431. u8 pH2c_buff[HALMAC_H2C_CMD_SIZE_88XX] = { 0 };
  3432. u16 h2c_seq_num = 0;
  3433. VOID *pDriver_adapter = NULL;
  3434. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  3435. HALMAC_H2C_HEADER_INFO h2c_header_info;
  3436. HALMAC_CMD_PROCESS_STATUS *pProcess_status = &(pHalmac_adapter->halmac_state.iqk_set.process_status);
  3437. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  3438. return HALMAC_RET_ADAPTER_INVALID;
  3439. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  3440. return HALMAC_RET_API_INVALID;
  3441. if (HALMAC_RET_SUCCESS != halmac_fw_validate(pHalmac_adapter))
  3442. return HALMAC_RET_NO_DLFW;
  3443. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_START_IQK);
  3444. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3445. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_start_iqk_88xx ==========>\n");
  3446. if (HALMAC_CMD_PROCESS_SENDING == *pProcess_status) {
  3447. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Wait event(iqk)...\n");
  3448. return HALMAC_RET_BUSY_STATE;
  3449. }
  3450. *pProcess_status = HALMAC_CMD_PROCESS_SENDING;
  3451. IQK_SET_CLEAR(pH2c_buff, pIqk_para->clear);
  3452. IQK_SET_SEGMENT_IQK(pH2c_buff, pIqk_para->segment_iqk);
  3453. h2c_header_info.sub_cmd_id = SUB_CMD_ID_IQK;
  3454. h2c_header_info.content_size = 1;
  3455. h2c_header_info.ack = _TRUE;
  3456. halmac_set_fw_offload_h2c_header_88xx(pHalmac_adapter, pH2c_buff, &h2c_header_info, &h2c_seq_num);
  3457. pHalmac_adapter->halmac_state.iqk_set.seq_num = h2c_seq_num;
  3458. status = halmac_send_h2c_pkt_88xx(pHalmac_adapter, pH2c_buff, HALMAC_H2C_CMD_SIZE_88XX, _TRUE);
  3459. if (HALMAC_RET_SUCCESS != status) {
  3460. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_send_h2c_pkt_88xx Fail = %x!!\n", status);
  3461. return status;
  3462. }
  3463. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_start_iqk_88xx <==========\n");
  3464. return HALMAC_RET_SUCCESS;
  3465. }
  3466. /**
  3467. * halmac_ctrl_pwr_tracking_88xx() -trigger FW power tracking
  3468. * @pHalmac_adapter : the adapter of halmac
  3469. * @pPwr_tracking_opt : power tracking option
  3470. * Author : KaiYuan Chang/Ivan Lin
  3471. * Return : HALMAC_RET_STATUS
  3472. * More details of status code can be found in prototype document
  3473. */
  3474. HALMAC_RET_STATUS
  3475. halmac_ctrl_pwr_tracking_88xx(
  3476. IN PHALMAC_ADAPTER pHalmac_adapter,
  3477. IN PHALMAC_PWR_TRACKING_OPTION pPwr_tracking_opt
  3478. )
  3479. {
  3480. u8 pH2c_buff[HALMAC_H2C_CMD_SIZE_88XX] = { 0 };
  3481. u16 h2c_seq_mum = 0;
  3482. VOID *pDriver_adapter = NULL;
  3483. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  3484. HALMAC_H2C_HEADER_INFO h2c_header_info;
  3485. HALMAC_CMD_PROCESS_STATUS *pProcess_status = &(pHalmac_adapter->halmac_state.power_tracking_set.process_status);
  3486. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  3487. return HALMAC_RET_ADAPTER_INVALID;
  3488. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  3489. return HALMAC_RET_API_INVALID;
  3490. if (HALMAC_RET_SUCCESS != halmac_fw_validate(pHalmac_adapter))
  3491. return HALMAC_RET_NO_DLFW;
  3492. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CTRL_PWR_TRACKING);
  3493. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3494. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_start_iqk_88xx ==========>\n");
  3495. if (HALMAC_CMD_PROCESS_SENDING == *pProcess_status) {
  3496. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Wait event(pwr tracking)...\n");
  3497. return HALMAC_RET_BUSY_STATE;
  3498. }
  3499. *pProcess_status = HALMAC_CMD_PROCESS_SENDING;
  3500. POWER_TRACKING_SET_TYPE(pH2c_buff, pPwr_tracking_opt->type);
  3501. POWER_TRACKING_SET_BBSWING_INDEX(pH2c_buff, pPwr_tracking_opt->bbswing_index);
  3502. POWER_TRACKING_SET_ENABLE_A(pH2c_buff, pPwr_tracking_opt->pwr_tracking_para[HALMAC_RF_PATH_A].enable);
  3503. POWER_TRACKING_SET_TX_PWR_INDEX_A(pH2c_buff, pPwr_tracking_opt->pwr_tracking_para[HALMAC_RF_PATH_A].tx_pwr_index);
  3504. POWER_TRACKING_SET_PWR_TRACKING_OFFSET_VALUE_A(pH2c_buff, pPwr_tracking_opt->pwr_tracking_para[HALMAC_RF_PATH_A].pwr_tracking_offset_value);
  3505. POWER_TRACKING_SET_TSSI_VALUE_A(pH2c_buff, pPwr_tracking_opt->pwr_tracking_para[HALMAC_RF_PATH_A].tssi_value);
  3506. POWER_TRACKING_SET_ENABLE_B(pH2c_buff, pPwr_tracking_opt->pwr_tracking_para[HALMAC_RF_PATH_B].enable);
  3507. POWER_TRACKING_SET_TX_PWR_INDEX_B(pH2c_buff, pPwr_tracking_opt->pwr_tracking_para[HALMAC_RF_PATH_B].tx_pwr_index);
  3508. POWER_TRACKING_SET_PWR_TRACKING_OFFSET_VALUE_B(pH2c_buff, pPwr_tracking_opt->pwr_tracking_para[HALMAC_RF_PATH_B].pwr_tracking_offset_value);
  3509. POWER_TRACKING_SET_TSSI_VALUE_B(pH2c_buff, pPwr_tracking_opt->pwr_tracking_para[HALMAC_RF_PATH_B].tssi_value);
  3510. POWER_TRACKING_SET_ENABLE_C(pH2c_buff, pPwr_tracking_opt->pwr_tracking_para[HALMAC_RF_PATH_C].enable);
  3511. POWER_TRACKING_SET_TX_PWR_INDEX_C(pH2c_buff, pPwr_tracking_opt->pwr_tracking_para[HALMAC_RF_PATH_C].tx_pwr_index);
  3512. POWER_TRACKING_SET_PWR_TRACKING_OFFSET_VALUE_C(pH2c_buff, pPwr_tracking_opt->pwr_tracking_para[HALMAC_RF_PATH_C].pwr_tracking_offset_value);
  3513. POWER_TRACKING_SET_TSSI_VALUE_C(pH2c_buff, pPwr_tracking_opt->pwr_tracking_para[HALMAC_RF_PATH_C].tssi_value);
  3514. POWER_TRACKING_SET_ENABLE_D(pH2c_buff, pPwr_tracking_opt->pwr_tracking_para[HALMAC_RF_PATH_D].enable);
  3515. POWER_TRACKING_SET_TX_PWR_INDEX_D(pH2c_buff, pPwr_tracking_opt->pwr_tracking_para[HALMAC_RF_PATH_D].tx_pwr_index);
  3516. POWER_TRACKING_SET_PWR_TRACKING_OFFSET_VALUE_D(pH2c_buff, pPwr_tracking_opt->pwr_tracking_para[HALMAC_RF_PATH_D].pwr_tracking_offset_value);
  3517. POWER_TRACKING_SET_TSSI_VALUE_D(pH2c_buff, pPwr_tracking_opt->pwr_tracking_para[HALMAC_RF_PATH_D].tssi_value);
  3518. h2c_header_info.sub_cmd_id = SUB_CMD_ID_POWER_TRACKING;
  3519. h2c_header_info.content_size = 20;
  3520. h2c_header_info.ack = _TRUE;
  3521. halmac_set_fw_offload_h2c_header_88xx(pHalmac_adapter, pH2c_buff, &h2c_header_info, &h2c_seq_mum);
  3522. pHalmac_adapter->halmac_state.power_tracking_set.seq_num = h2c_seq_mum;
  3523. status = halmac_send_h2c_pkt_88xx(pHalmac_adapter, pH2c_buff, HALMAC_H2C_CMD_SIZE_88XX, _TRUE);
  3524. if (HALMAC_RET_SUCCESS != status) {
  3525. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_send_h2c_pkt_88xx Fail = %x!!\n", status);
  3526. return status;
  3527. }
  3528. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_start_iqk_88xx <==========\n");
  3529. return HALMAC_RET_SUCCESS;
  3530. }
  3531. /**
  3532. * halmac_query_status_88xx() -query the offload feature status
  3533. * @pHalmac_adapter : the adapter of halmac
  3534. * @feature_id : feature_id
  3535. * @pProcess_status : feature_status
  3536. * @data : data buffer
  3537. * @size : data size
  3538. *
  3539. * Note :
  3540. * If user wants to know the data size, use can allocate zero
  3541. * size buffer first. If this size less than the data size, halmac
  3542. * will return HALMAC_RET_BUFFER_TOO_SMALL. User need to
  3543. * re-allocate data buffer with correct data size.
  3544. *
  3545. * Author : Ivan Lin/KaiYuan Chang
  3546. * Return : HALMAC_RET_STATUS
  3547. * More details of status code can be found in prototype document
  3548. */
  3549. HALMAC_RET_STATUS
  3550. halmac_query_status_88xx(
  3551. IN PHALMAC_ADAPTER pHalmac_adapter,
  3552. IN HALMAC_FEATURE_ID feature_id,
  3553. OUT HALMAC_CMD_PROCESS_STATUS *pProcess_status,
  3554. INOUT u8 *data,
  3555. INOUT u32 *size
  3556. )
  3557. {
  3558. VOID *pDriver_adapter = NULL;
  3559. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  3560. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  3561. return HALMAC_RET_ADAPTER_INVALID;
  3562. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  3563. return HALMAC_RET_API_INVALID;
  3564. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_QUERY_STATE);
  3565. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3566. /* PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_query_status_88xx ==========>\n"); */
  3567. if (NULL == pProcess_status) {
  3568. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "null pointer!!\n");
  3569. return HALMAC_RET_NULL_POINTER;
  3570. }
  3571. switch (feature_id) {
  3572. case HALMAC_FEATURE_CFG_PARA:
  3573. status = halmac_query_cfg_para_status_88xx(pHalmac_adapter, pProcess_status, data, size);
  3574. break;
  3575. case HALMAC_FEATURE_DUMP_PHYSICAL_EFUSE:
  3576. status = halmac_query_dump_physical_efuse_status_88xx(pHalmac_adapter, pProcess_status, data, size);
  3577. break;
  3578. case HALMAC_FEATURE_DUMP_LOGICAL_EFUSE:
  3579. status = halmac_query_dump_logical_efuse_status_88xx(pHalmac_adapter, pProcess_status, data, size);
  3580. break;
  3581. case HALMAC_FEATURE_CHANNEL_SWITCH:
  3582. status = halmac_query_channel_switch_status_88xx(pHalmac_adapter, pProcess_status, data, size);
  3583. break;
  3584. case HALMAC_FEATURE_UPDATE_PACKET:
  3585. status = halmac_query_update_packet_status_88xx(pHalmac_adapter, pProcess_status, data, size);
  3586. break;
  3587. case HALMAC_FEATURE_IQK:
  3588. status = halmac_query_iqk_status_88xx(pHalmac_adapter, pProcess_status, data, size);
  3589. break;
  3590. case HALMAC_FEATURE_POWER_TRACKING:
  3591. status = halmac_query_power_tracking_status_88xx(pHalmac_adapter, pProcess_status, data, size);
  3592. break;
  3593. case HALMAC_FEATURE_PSD:
  3594. status = halmac_query_psd_status_88xx(pHalmac_adapter, pProcess_status, data, size);
  3595. break;
  3596. default:
  3597. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_ERR, "halmac_query_status_88xx invalid feature id %d\n", feature_id);
  3598. return HALMAC_RET_INVALID_FEATURE_ID;
  3599. }
  3600. /* PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_query_status_88xx <==========\n"); */
  3601. return status;
  3602. }
  3603. /**
  3604. * halmac_reset_feature_88xx() -reset async api cmd status
  3605. * @pHalmac_adapter : the adapter of halmac
  3606. * @feature_id : feature_id
  3607. * Author : Ivan Lin/KaiYuan Chang
  3608. * Return : HALMAC_RET_STATUS.
  3609. * More details of status code can be found in prototype document
  3610. */
  3611. HALMAC_RET_STATUS
  3612. halmac_reset_feature_88xx(
  3613. IN PHALMAC_ADAPTER pHalmac_adapter,
  3614. IN HALMAC_FEATURE_ID feature_id
  3615. )
  3616. {
  3617. VOID *pDriver_adapter = NULL;
  3618. PHALMAC_STATE pState = &(pHalmac_adapter->halmac_state);
  3619. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  3620. return HALMAC_RET_ADAPTER_INVALID;
  3621. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  3622. return HALMAC_RET_API_INVALID;
  3623. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_RESET_FEATURE);
  3624. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3625. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_reset_feature_88xx ==========>\n");
  3626. switch (feature_id) {
  3627. case HALMAC_FEATURE_CFG_PARA:
  3628. pState->cfg_para_state_set.process_status = HALMAC_CMD_PROCESS_IDLE;
  3629. pState->cfg_para_state_set.cfg_para_cmd_construct_state = HALMAC_CFG_PARA_CMD_CONSTRUCT_IDLE;
  3630. break;
  3631. case HALMAC_FEATURE_DUMP_PHYSICAL_EFUSE:
  3632. case HALMAC_FEATURE_DUMP_LOGICAL_EFUSE:
  3633. pState->efuse_state_set.process_status = HALMAC_CMD_PROCESS_IDLE;
  3634. pState->efuse_state_set.efuse_cmd_construct_state = HALMAC_EFUSE_CMD_CONSTRUCT_IDLE;
  3635. break;
  3636. case HALMAC_FEATURE_CHANNEL_SWITCH:
  3637. pState->scan_state_set.process_status = HALMAC_CMD_PROCESS_IDLE;
  3638. pState->scan_state_set.scan_cmd_construct_state = HALMAC_SCAN_CMD_CONSTRUCT_IDLE;
  3639. break;
  3640. case HALMAC_FEATURE_UPDATE_PACKET:
  3641. pState->update_packet_set.process_status = HALMAC_CMD_PROCESS_IDLE;
  3642. break;
  3643. case HALMAC_FEATURE_ALL:
  3644. pState->cfg_para_state_set.process_status = HALMAC_CMD_PROCESS_IDLE;
  3645. pState->cfg_para_state_set.cfg_para_cmd_construct_state = HALMAC_CFG_PARA_CMD_CONSTRUCT_IDLE;
  3646. pState->efuse_state_set.process_status = HALMAC_CMD_PROCESS_IDLE;
  3647. pState->efuse_state_set.efuse_cmd_construct_state = HALMAC_EFUSE_CMD_CONSTRUCT_IDLE;
  3648. pState->scan_state_set.process_status = HALMAC_CMD_PROCESS_IDLE;
  3649. pState->scan_state_set.scan_cmd_construct_state = HALMAC_SCAN_CMD_CONSTRUCT_IDLE;
  3650. pState->update_packet_set.process_status = HALMAC_CMD_PROCESS_IDLE;
  3651. break;
  3652. default:
  3653. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_ERR, "halmac_reset_feature_88xx invalid feature id %d\n", feature_id);
  3654. return HALMAC_RET_INVALID_FEATURE_ID;
  3655. }
  3656. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_reset_feature_88xx <==========\n");
  3657. return HALMAC_RET_SUCCESS;
  3658. }
  3659. /**
  3660. * halmac_check_fw_status_88xx() -check fw status
  3661. * @pHalmac_adapter : the adapter of halmac
  3662. * @fw_status : fw status
  3663. * Author : KaiYuan Chang/Ivan Lin
  3664. * Return : HALMAC_RET_STATUS
  3665. * More details of status code can be found in prototype document
  3666. */
  3667. HALMAC_RET_STATUS
  3668. halmac_check_fw_status_88xx(
  3669. IN PHALMAC_ADAPTER pHalmac_adapter,
  3670. OUT u8 *fw_status
  3671. )
  3672. {
  3673. u32 value32 = 0, value32_backup = 0, i = 0;
  3674. VOID *pDriver_adapter = NULL;
  3675. PHALMAC_API pHalmac_api;
  3676. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  3677. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  3678. return HALMAC_RET_ADAPTER_INVALID;
  3679. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  3680. return HALMAC_RET_API_INVALID;
  3681. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CHECK_FW_STATUS);
  3682. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3683. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  3684. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_check_fw_status_88xx ==========>\n");
  3685. value32 = PLATFORM_REG_READ_32(pDriver_adapter, REG_FW_DBG6);
  3686. if (0 != value32) {
  3687. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_check_fw_status REG_FW_DBG6 !=0\n");
  3688. *fw_status = _FALSE;
  3689. return status;
  3690. }
  3691. value32_backup = PLATFORM_REG_READ_32(pDriver_adapter, REG_FW_DBG7);
  3692. for (i = 0; i <= 10; i++) {
  3693. value32 = PLATFORM_REG_READ_32(pDriver_adapter, REG_FW_DBG7);
  3694. if (value32_backup != value32) {
  3695. break;
  3696. } else {
  3697. if (10 == i) {
  3698. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_check_fw_status Polling FW PC fail\n");
  3699. *fw_status = _FALSE;
  3700. return status;
  3701. }
  3702. }
  3703. }
  3704. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_check_fw_status_88xx <==========\n");
  3705. return status;
  3706. }
  3707. HALMAC_RET_STATUS
  3708. halmac_dump_fw_dmem_88xx(
  3709. IN PHALMAC_ADAPTER pHalmac_adapter,
  3710. INOUT u8 *dmem,
  3711. INOUT u32 *size
  3712. )
  3713. {
  3714. VOID *pDriver_adapter = NULL;
  3715. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  3716. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  3717. return HALMAC_RET_ADAPTER_INVALID;
  3718. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  3719. return HALMAC_RET_API_INVALID;
  3720. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_DUMP_FW_DMEM);
  3721. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3722. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_dump_fw_dmem_88xx ==========>\n");
  3723. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_dump_fw_dmem_88xx <==========\n");
  3724. return status;
  3725. }
  3726. /**
  3727. * halmac_cfg_max_dl_size_88xx() - config max download FW size
  3728. * @pHalmac_adapter : the adapter of halmac
  3729. * @size : max download fw size
  3730. *
  3731. * Halmac uses this setting to set max packet size for
  3732. * download FW.
  3733. * If user has not called this API, halmac use default
  3734. * setting for download FW
  3735. * Note1 : size need multiple of 2
  3736. * Note2 : max size is 31K
  3737. *
  3738. * Author : Ivan Lin/KaiYuan Chang
  3739. * Return : HALMAC_RET_STATUS
  3740. * More details of status code can be found in prototype document
  3741. */
  3742. HALMAC_RET_STATUS
  3743. halmac_cfg_max_dl_size_88xx(
  3744. IN PHALMAC_ADAPTER pHalmac_adapter,
  3745. IN u32 size
  3746. )
  3747. {
  3748. VOID *pDriver_adapter = NULL;
  3749. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  3750. return HALMAC_RET_ADAPTER_INVALID;
  3751. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  3752. return HALMAC_RET_API_INVALID;
  3753. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CFG_MAX_DL_SIZE);
  3754. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3755. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_FW, HALMAC_DBG_TRACE, "halmac_cfg_max_dl_size_88xx ==========>\n");
  3756. if (size > HALMAC_FW_CFG_MAX_DL_SIZE_MAX_88XX) {
  3757. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_FW, HALMAC_DBG_ERR, "size > HALMAC_FW_CFG_MAX_DL_SIZE_MAX!\n");
  3758. return HALMAC_RET_CFG_DLFW_SIZE_FAIL;
  3759. }
  3760. if (0 != (size & (2 - 1))) {
  3761. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_FW, HALMAC_DBG_ERR, "size is not power of 2!\n");
  3762. return HALMAC_RET_CFG_DLFW_SIZE_FAIL;
  3763. }
  3764. pHalmac_adapter->max_download_size = size;
  3765. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_FW, HALMAC_DBG_TRACE, "Cfg max size is : %X\n", size);
  3766. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_FW, HALMAC_DBG_TRACE, "halmac_cfg_max_dl_size_88xx <==========\n");
  3767. return HALMAC_RET_SUCCESS;
  3768. }
  3769. /**
  3770. * halmac_psd_88xx() - trigger fw psd
  3771. * @pHalmac_adapter : the adapter of halmac
  3772. * @start_psd : start PSD
  3773. * @end_psd : end PSD
  3774. * Author : KaiYuan Chang/Ivan Lin
  3775. * Return : HALMAC_RET_STATUS
  3776. * More details of status code can be found in prototype document
  3777. */
  3778. HALMAC_RET_STATUS
  3779. halmac_psd_88xx(
  3780. IN PHALMAC_ADAPTER pHalmac_adapter,
  3781. IN u16 start_psd,
  3782. IN u16 end_psd
  3783. )
  3784. {
  3785. u8 pH2c_buff[HALMAC_H2C_CMD_SIZE_88XX] = { 0 };
  3786. u16 h2c_seq_mum = 0;
  3787. VOID *pDriver_adapter = NULL;
  3788. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  3789. HALMAC_H2C_HEADER_INFO h2c_header_info;
  3790. HALMAC_CMD_PROCESS_STATUS *pProcess_status = &(pHalmac_adapter->halmac_state.psd_set.process_status);
  3791. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  3792. return HALMAC_RET_ADAPTER_INVALID;
  3793. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  3794. return HALMAC_RET_API_INVALID;
  3795. if (HALMAC_RET_SUCCESS != halmac_fw_validate(pHalmac_adapter))
  3796. return HALMAC_RET_NO_DLFW;
  3797. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_PSD);
  3798. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3799. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_psd_88xx ==========>\n");
  3800. if (HALMAC_CMD_PROCESS_SENDING == *pProcess_status) {
  3801. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "Wait event(psd)...\n");
  3802. return HALMAC_RET_BUSY_STATE;
  3803. }
  3804. if (NULL != pHalmac_adapter->halmac_state.psd_set.pData) {
  3805. PLATFORM_RTL_FREE(pDriver_adapter, pHalmac_adapter->halmac_state.psd_set.pData, pHalmac_adapter->halmac_state.psd_set.data_size);
  3806. pHalmac_adapter->halmac_state.psd_set.pData = (u8 *)NULL;
  3807. }
  3808. pHalmac_adapter->halmac_state.psd_set.data_size = 0;
  3809. pHalmac_adapter->halmac_state.psd_set.segment_size = 0;
  3810. *pProcess_status = HALMAC_CMD_PROCESS_SENDING;
  3811. PSD_SET_START_PSD(pH2c_buff, start_psd);
  3812. PSD_SET_END_PSD(pH2c_buff, end_psd);
  3813. h2c_header_info.sub_cmd_id = SUB_CMD_ID_PSD;
  3814. h2c_header_info.content_size = 4;
  3815. h2c_header_info.ack = _TRUE;
  3816. halmac_set_fw_offload_h2c_header_88xx(pHalmac_adapter, pH2c_buff, &h2c_header_info, &h2c_seq_mum);
  3817. status = halmac_send_h2c_pkt_88xx(pHalmac_adapter, pH2c_buff, HALMAC_H2C_CMD_SIZE_88XX, _TRUE);
  3818. if (HALMAC_RET_SUCCESS != status) {
  3819. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_send_h2c_pkt_88xx Fail = %x!!\n", status);
  3820. return status;
  3821. }
  3822. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_psd_88xx <==========\n");
  3823. return HALMAC_RET_SUCCESS;
  3824. }
  3825. /**
  3826. * halmac_cfg_la_mode_88xx() - config la mode
  3827. * @pHalmac_adapter : the adapter of halmac
  3828. * @la_mode :
  3829. * disable : no TXFF space reserved for LA debug
  3830. * partial : partial TXFF space is reserved for LA debug
  3831. * full : all TXFF space is reserved for LA debug
  3832. * Author : KaiYuan Chang
  3833. * Return : HALMAC_RET_STATUS
  3834. * More details of status code can be found in prototype document
  3835. */
  3836. HALMAC_RET_STATUS
  3837. halmac_cfg_la_mode_88xx(
  3838. IN PHALMAC_ADAPTER pHalmac_adapter,
  3839. IN HALMAC_LA_MODE la_mode
  3840. )
  3841. {
  3842. VOID *pDriver_adapter = NULL;
  3843. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  3844. return HALMAC_RET_ADAPTER_INVALID;
  3845. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  3846. return HALMAC_RET_API_INVALID;
  3847. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CFG_LA_MODE);
  3848. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3849. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_cfg_la_mode_88xx ==========>la_mode = %d\n", la_mode);
  3850. pHalmac_adapter->txff_allocation.la_mode = la_mode;
  3851. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_cfg_la_mode_88xx <==========\n");
  3852. return HALMAC_RET_SUCCESS;
  3853. }
  3854. /**
  3855. * halmac_cfg_rx_fifo_expanding_mode_88xx() - rx fifo expanding
  3856. * @pHalmac_adapter : the adapter of halmac
  3857. * @la_mode :
  3858. * disable : normal mode
  3859. * 1 block : Rx FIFO + 1 FIFO block; Tx fifo - 1 FIFO block
  3860. * 2 block : Rx FIFO + 2 FIFO block; Tx fifo - 2 FIFO block
  3861. * 3 block : Rx FIFO + 3 FIFO block; Tx fifo - 3 FIFO block
  3862. * Author : Soar
  3863. * Return : HALMAC_RET_STATUS
  3864. * More details of status code can be found in prototype document
  3865. */
  3866. HALMAC_RET_STATUS
  3867. halmac_cfg_rx_fifo_expanding_mode_88xx(
  3868. IN PHALMAC_ADAPTER pHalmac_adapter,
  3869. IN HALMAC_RX_FIFO_EXPANDING_MODE rx_fifo_expanding_mode
  3870. )
  3871. {
  3872. VOID *pDriver_adapter = NULL;
  3873. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  3874. return HALMAC_RET_ADAPTER_INVALID;
  3875. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  3876. return HALMAC_RET_API_INVALID;
  3877. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CFG_RX_FIFO_EXPANDING_MODE);
  3878. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3879. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_cfg_rx_fifo_expanding_mode_88xx ==========>rx_fifo_expanding_mode = %d\n", rx_fifo_expanding_mode);
  3880. pHalmac_adapter->txff_allocation.rx_fifo_expanding_mode = rx_fifo_expanding_mode;
  3881. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_cfg_rx_fifo_expanding_mode_88xx <==========\n");
  3882. return HALMAC_RET_SUCCESS;
  3883. }
  3884. HALMAC_RET_STATUS
  3885. halmac_config_security_88xx(
  3886. IN PHALMAC_ADAPTER pHalmac_adapter,
  3887. IN PHALMAC_SECURITY_SETTING pSec_setting
  3888. )
  3889. {
  3890. PHALMAC_API pHalmac_api;
  3891. VOID *pDriver_adapter = NULL;
  3892. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  3893. return HALMAC_RET_ADAPTER_INVALID;
  3894. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  3895. return HALMAC_RET_API_INVALID;
  3896. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  3897. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3898. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_COMMON, HALMAC_DBG_TRACE, "halmac_config_security_88xx ==========>\n");
  3899. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_CR, (u16)(HALMAC_REG_READ_16(pHalmac_adapter, REG_CR) | BIT_MAC_SEC_EN));
  3900. if (1 == pSec_setting->tx_encryption)
  3901. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_SECCFG, HALMAC_REG_READ_8(pHalmac_adapter, REG_SECCFG) | BIT(2));
  3902. else
  3903. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_SECCFG, HALMAC_REG_READ_8(pHalmac_adapter, REG_SECCFG) & ~(BIT(2)));
  3904. if (1 == pSec_setting->rx_decryption)
  3905. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_SECCFG, HALMAC_REG_READ_8(pHalmac_adapter, REG_SECCFG) | BIT(3));
  3906. else
  3907. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_SECCFG, HALMAC_REG_READ_8(pHalmac_adapter, REG_SECCFG) & ~(BIT(3)));
  3908. if (1 == pSec_setting->bip_enable) {
  3909. if (HALMAC_CHIP_ID_8822B == pHalmac_adapter->chip_id)
  3910. return HALMAC_RET_BIP_NO_SUPPORT;
  3911. #if HALMAC_8821C_SUPPORT
  3912. if (1 == pSec_setting->tx_encryption)
  3913. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_WSEC_OPTION + 2, HALMAC_REG_READ_8(pHalmac_adapter, REG_WSEC_OPTION + 2) | (BIT(3) | BIT(5)));
  3914. else
  3915. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_WSEC_OPTION + 2, HALMAC_REG_READ_8(pHalmac_adapter, REG_WSEC_OPTION + 2) & ~(BIT(3) | BIT(5)));
  3916. if (1 == pSec_setting->rx_decryption)
  3917. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_WSEC_OPTION + 2, HALMAC_REG_READ_8(pHalmac_adapter, REG_WSEC_OPTION + 2) | (BIT(4) | BIT(6)));
  3918. else
  3919. HALMAC_REG_WRITE_8(pHalmac_adapter, REG_WSEC_OPTION + 2, HALMAC_REG_READ_8(pHalmac_adapter, REG_WSEC_OPTION + 2) & ~(BIT(4) | BIT(6)));
  3920. #endif
  3921. }
  3922. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_COMMON, HALMAC_DBG_TRACE, "halmac_config_security_88xx <==========\n");
  3923. return HALMAC_RET_SUCCESS;
  3924. }
  3925. u8
  3926. halmac_get_used_cam_entry_num_88xx(
  3927. IN PHALMAC_ADAPTER pHalmac_adapter,
  3928. IN HAL_SECURITY_TYPE sec_type
  3929. )
  3930. {
  3931. u8 entry_num;
  3932. VOID *pDriver_adapter = NULL;
  3933. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3934. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_COMMON, HALMAC_DBG_TRACE, "halmac_get_used_cam_entry_num_88xx ==========>\n");
  3935. switch (sec_type) {
  3936. case HAL_SECURITY_TYPE_WEP40:
  3937. case HAL_SECURITY_TYPE_WEP104:
  3938. case HAL_SECURITY_TYPE_TKIP:
  3939. case HAL_SECURITY_TYPE_AES128:
  3940. case HAL_SECURITY_TYPE_GCMP128:
  3941. case HAL_SECURITY_TYPE_GCMSMS4:
  3942. case HAL_SECURITY_TYPE_BIP:
  3943. entry_num = 1;
  3944. break;
  3945. case HAL_SECURITY_TYPE_WAPI:
  3946. case HAL_SECURITY_TYPE_AES256:
  3947. case HAL_SECURITY_TYPE_GCMP256:
  3948. entry_num = 2;
  3949. break;
  3950. default:
  3951. entry_num = 0;
  3952. break;
  3953. }
  3954. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_COMMON, HALMAC_DBG_TRACE, "halmac_get_used_cam_entry_num_88xx <==========\n");
  3955. return entry_num;
  3956. }
  3957. HALMAC_RET_STATUS
  3958. halmac_write_cam_88xx(
  3959. IN PHALMAC_ADAPTER pHalmac_adapter,
  3960. IN u32 entry_index,
  3961. IN PHALMAC_CAM_ENTRY_INFO pCam_entry_info
  3962. )
  3963. {
  3964. u32 i;
  3965. u32 command = 0x80010000;
  3966. PHALMAC_API pHalmac_api;
  3967. VOID *pDriver_adapter = NULL;
  3968. PHALMAC_CAM_ENTRY_FORMAT pCam_entry_format = NULL;
  3969. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  3970. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  3971. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_COMMON, HALMAC_DBG_TRACE, "[TRACE]halmac_write_cam_88xx ==========>\n");
  3972. if (entry_index >= pHalmac_adapter->hw_config_info.cam_entry_num)
  3973. return HALMAC_RET_ENTRY_INDEX_ERROR;
  3974. if (pCam_entry_info->key_id > 3)
  3975. return HALMAC_RET_FAIL;
  3976. pCam_entry_format = (PHALMAC_CAM_ENTRY_FORMAT)PLATFORM_RTL_MALLOC(pDriver_adapter, sizeof(*pCam_entry_format));
  3977. if (NULL == pCam_entry_format)
  3978. return HALMAC_RET_NULL_POINTER;
  3979. PLATFORM_RTL_MEMSET(pDriver_adapter, pCam_entry_format, 0x00, sizeof(*pCam_entry_format));
  3980. pCam_entry_format->key_id = pCam_entry_info->key_id;
  3981. pCam_entry_format->valid = pCam_entry_info->valid;
  3982. PLATFORM_RTL_MEMCPY(pDriver_adapter, pCam_entry_format->mac_address, pCam_entry_info->mac_address, 6);
  3983. PLATFORM_RTL_MEMCPY(pDriver_adapter, pCam_entry_format->key, pCam_entry_info->key, 16);
  3984. switch (pCam_entry_info->security_type) {
  3985. case HAL_SECURITY_TYPE_NONE:
  3986. pCam_entry_format->type = 0;
  3987. break;
  3988. case HAL_SECURITY_TYPE_WEP40:
  3989. pCam_entry_format->type = 1;
  3990. break;
  3991. case HAL_SECURITY_TYPE_WEP104:
  3992. pCam_entry_format->type = 5;
  3993. break;
  3994. case HAL_SECURITY_TYPE_TKIP:
  3995. pCam_entry_format->type = 2;
  3996. break;
  3997. case HAL_SECURITY_TYPE_AES128:
  3998. pCam_entry_format->type = 4;
  3999. break;
  4000. case HAL_SECURITY_TYPE_WAPI:
  4001. pCam_entry_format->type = 6;
  4002. break;
  4003. case HAL_SECURITY_TYPE_AES256:
  4004. pCam_entry_format->type = 4;
  4005. pCam_entry_format->ext_sectype = 1;
  4006. break;
  4007. case HAL_SECURITY_TYPE_GCMP128:
  4008. pCam_entry_format->type = 7;
  4009. break;
  4010. case HAL_SECURITY_TYPE_GCMP256:
  4011. case HAL_SECURITY_TYPE_GCMSMS4:
  4012. pCam_entry_format->type = 7;
  4013. pCam_entry_format->ext_sectype = 1;
  4014. break;
  4015. case HAL_SECURITY_TYPE_BIP:
  4016. pCam_entry_format->type = (1 == pCam_entry_info->unicast) ? 4 : 0;
  4017. pCam_entry_format->mgnt = 1;
  4018. pCam_entry_format->grp = (1 == pCam_entry_info->unicast) ? 0 : 1;
  4019. break;
  4020. default:
  4021. PLATFORM_RTL_FREE(pDriver_adapter, pCam_entry_format, sizeof(*pCam_entry_format));
  4022. return HALMAC_RET_FAIL;
  4023. }
  4024. for (i = 0; i < 8; i++) {
  4025. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_CAMWRITE, *((u32 *)pCam_entry_format + i));
  4026. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_CAMCMD, command | ((entry_index << 3) + i));
  4027. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_COMMON, HALMAC_DBG_TRACE, "[TRACE]1 - CAM entry format : %X\n", *((u32 *)pCam_entry_format + i));
  4028. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_COMMON, HALMAC_DBG_TRACE, "[TRACE]1 - REG_CAMCMD : %X\n", command | ((entry_index << 3) + i));
  4029. }
  4030. if (HAL_SECURITY_TYPE_WAPI == pCam_entry_info->security_type || HAL_SECURITY_TYPE_AES256 == pCam_entry_info->security_type ||
  4031. HAL_SECURITY_TYPE_GCMP256 == pCam_entry_info->security_type || HAL_SECURITY_TYPE_GCMSMS4 == pCam_entry_info->security_type) {
  4032. pCam_entry_format->mic = 1;
  4033. PLATFORM_RTL_MEMCPY(pDriver_adapter, pCam_entry_format->key, pCam_entry_info->key_ext, 16);
  4034. for (i = 0; i < 8; i++) {
  4035. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_CAMWRITE, *((u32 *)pCam_entry_format + i));
  4036. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_CAMCMD, command | (((entry_index + 1) << 3) + i));
  4037. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_COMMON, HALMAC_DBG_TRACE, "[TRACE]2 - CAM entry format : %X\n", *((u32 *)pCam_entry_format + i));
  4038. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_COMMON, HALMAC_DBG_TRACE, "[TRACE]2 - REG_CAMCMD : %X\n", command | (((entry_index + 1) << 3) + i));
  4039. }
  4040. }
  4041. PLATFORM_RTL_FREE(pDriver_adapter, pCam_entry_format, sizeof(*pCam_entry_format));
  4042. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_COMMON, HALMAC_DBG_TRACE, "[TRACE]halmac_write_cam_88xx <==========\n");
  4043. return HALMAC_RET_SUCCESS;
  4044. }
  4045. HALMAC_RET_STATUS
  4046. halmac_read_cam_entry_88xx(
  4047. IN PHALMAC_ADAPTER pHalmac_adapter,
  4048. IN u32 entry_index,
  4049. OUT PHALMAC_CAM_ENTRY_FORMAT pContent
  4050. )
  4051. {
  4052. u32 i;
  4053. u32 command = 0x80000000;
  4054. PHALMAC_API pHalmac_api;
  4055. VOID *pDriver_adapter = NULL;
  4056. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  4057. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  4058. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_COMMON, HALMAC_DBG_TRACE, "halmac_read_cam_entry_88xx ==========>\n");
  4059. if (entry_index >= pHalmac_adapter->hw_config_info.cam_entry_num)
  4060. return HALMAC_RET_ENTRY_INDEX_ERROR;
  4061. for (i = 0; i < 8; i++) {
  4062. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_CAMCMD, command | ((entry_index << 3) + i));
  4063. *((u32 *)pContent + i) = HALMAC_REG_READ_32(pHalmac_adapter, REG_CAMREAD);
  4064. }
  4065. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_COMMON, HALMAC_DBG_TRACE, "halmac_read_cam_entry_88xx <==========\n");
  4066. return HALMAC_RET_SUCCESS;
  4067. }
  4068. HALMAC_RET_STATUS
  4069. halmac_clear_cam_entry_88xx(
  4070. IN PHALMAC_ADAPTER pHalmac_adapter,
  4071. IN u32 entry_index
  4072. )
  4073. {
  4074. u32 i;
  4075. u32 command = 0x80010000;
  4076. VOID *pDriver_adapter = NULL;
  4077. PHALMAC_API pHalmac_api;
  4078. PHALMAC_CAM_ENTRY_FORMAT pCam_entry_format;
  4079. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  4080. return HALMAC_RET_ADAPTER_INVALID;
  4081. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  4082. return HALMAC_RET_API_INVALID;
  4083. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  4084. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  4085. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "[TRACE]halmac_clear_security_cam_88xx ==========>\n");
  4086. if (entry_index >= pHalmac_adapter->hw_config_info.cam_entry_num)
  4087. return HALMAC_RET_ENTRY_INDEX_ERROR;
  4088. pCam_entry_format = (PHALMAC_CAM_ENTRY_FORMAT)PLATFORM_RTL_MALLOC(pDriver_adapter, sizeof(*pCam_entry_format));
  4089. if (NULL == pCam_entry_format)
  4090. return HALMAC_RET_NULL_POINTER;
  4091. PLATFORM_RTL_MEMSET(pDriver_adapter, pCam_entry_format, 0x00, sizeof(*pCam_entry_format));
  4092. for (i = 0; i < 8; i++) {
  4093. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_CAMWRITE, *((u32 *)pCam_entry_format + i));
  4094. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_CAMCMD, command | ((entry_index << 3) + i));
  4095. }
  4096. PLATFORM_RTL_FREE(pDriver_adapter, pCam_entry_format, sizeof(*pCam_entry_format));
  4097. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "[TRACE]halmac_clear_security_cam_88xx <==========\n");
  4098. return HALMAC_RET_SUCCESS;
  4099. }
  4100. /**
  4101. * halmac_get_hw_value_88xx() -get hw config value
  4102. * @pHalmac_adapter : the adapter of halmac
  4103. * @hw_id : hw id for driver to query
  4104. * @pvalue : hw value, reference table to get data type
  4105. * Author : KaiYuan Chang / Ivan Lin
  4106. * Return : HALMAC_RET_STATUS
  4107. * More details of status code can be found in prototype document
  4108. */
  4109. HALMAC_RET_STATUS
  4110. halmac_get_hw_value_88xx(
  4111. IN PHALMAC_ADAPTER pHalmac_adapter,
  4112. IN HALMAC_HW_ID hw_id,
  4113. OUT VOID *pvalue
  4114. )
  4115. {
  4116. VOID *pDriver_adapter = NULL;
  4117. HALMAC_RET_STATUS status = HALMAC_RET_SUCCESS;
  4118. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  4119. return HALMAC_RET_ADAPTER_INVALID;
  4120. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  4121. return HALMAC_RET_API_INVALID;
  4122. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_GET_HW_VALUE);
  4123. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  4124. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_get_hw_value_88xx ==========>\n");
  4125. if (NULL == pvalue) {
  4126. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_get_hw_value_88xx (NULL ==pvalue)==========>\n");
  4127. return HALMAC_RET_NULL_POINTER;
  4128. }
  4129. switch (hw_id) {
  4130. case HALMAC_HW_RQPN_MAPPING:
  4131. ((PHALMAC_RQPN_MAP)pvalue)->dma_map_vo = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VO];
  4132. ((PHALMAC_RQPN_MAP)pvalue)->dma_map_vi = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_VI];
  4133. ((PHALMAC_RQPN_MAP)pvalue)->dma_map_be = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BE];
  4134. ((PHALMAC_RQPN_MAP)pvalue)->dma_map_bk = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_BK];
  4135. ((PHALMAC_RQPN_MAP)pvalue)->dma_map_mg = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_MG];
  4136. ((PHALMAC_RQPN_MAP)pvalue)->dma_map_hi = pHalmac_adapter->halmac_ptcl_queue[HALMAC_PTCL_QUEUE_HI];
  4137. break;
  4138. case HALMAC_HW_EFUSE_SIZE:
  4139. *(u32 *)pvalue = pHalmac_adapter->hw_config_info.efuse_size;
  4140. break;
  4141. case HALMAC_HW_EEPROM_SIZE:
  4142. *(u32 *)pvalue = pHalmac_adapter->hw_config_info.eeprom_size;
  4143. break;
  4144. case HALMAC_HW_BT_BANK_EFUSE_SIZE:
  4145. *(u32 *)pvalue = pHalmac_adapter->hw_config_info.bt_efuse_size;
  4146. break;
  4147. case HALMAC_HW_BT_BANK1_EFUSE_SIZE:
  4148. case HALMAC_HW_BT_BANK2_EFUSE_SIZE:
  4149. *(u32 *)pvalue = 0;
  4150. break;
  4151. case HALMAC_HW_TXFIFO_SIZE:
  4152. *(u32 *)pvalue = pHalmac_adapter->hw_config_info.tx_fifo_size;
  4153. break;
  4154. case HALMAC_HW_RSVD_PG_BNDY:
  4155. *(u16 *)pvalue = pHalmac_adapter->txff_allocation.rsvd_drv_pg_bndy;
  4156. break;
  4157. case HALMAC_HW_CAM_ENTRY_NUM:
  4158. *(u8 *)pvalue = pHalmac_adapter->hw_config_info.cam_entry_num;
  4159. break;
  4160. case HALMAC_HW_WLAN_EFUSE_AVAILABLE_SIZE: /*Remove later*/
  4161. status = halmac_dump_logical_efuse_map_88xx(pHalmac_adapter, HALMAC_EFUSE_R_DRV);
  4162. if (HALMAC_RET_SUCCESS != status)
  4163. return status;
  4164. *(u32 *)pvalue = pHalmac_adapter->hw_config_info.efuse_size - HALMAC_PROTECTED_EFUSE_SIZE_88XX - pHalmac_adapter->efuse_end;
  4165. break;
  4166. case HALMAC_HW_IC_VERSION:
  4167. *(u8 *)pvalue = pHalmac_adapter->chip_version;
  4168. break;
  4169. case HALMAC_HW_PAGE_SIZE:
  4170. *(u32 *)pvalue = pHalmac_adapter->hw_config_info.page_size;
  4171. break;
  4172. case HALMAC_HW_TX_AGG_ALIGN_SIZE:
  4173. *(u16 *)pvalue = pHalmac_adapter->hw_config_info.tx_align_size;
  4174. break;
  4175. case HALMAC_HW_RX_AGG_ALIGN_SIZE:
  4176. *(u8 *)pvalue = 8;
  4177. break;
  4178. case HALMAC_HW_DRV_INFO_SIZE:
  4179. *(u8 *)pvalue = pHalmac_adapter->drv_info_size;
  4180. break;
  4181. case HALMAC_HW_TXFF_ALLOCATION:
  4182. PLATFORM_RTL_MEMCPY(pDriver_adapter, pvalue, &(pHalmac_adapter->txff_allocation), sizeof(HALMAC_TXFF_ALLOCATION));
  4183. break;
  4184. case HALMAC_HW_TX_DESC_SIZE:
  4185. *(u32 *)pvalue = pHalmac_adapter->hw_config_info.txdesc_size;
  4186. break;
  4187. case HALMAC_HW_RX_DESC_SIZE:
  4188. *(u32 *)pvalue = pHalmac_adapter->hw_config_info.rxdesc_size;
  4189. break;
  4190. default:
  4191. return HALMAC_RET_PARA_NOT_SUPPORT;
  4192. }
  4193. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_get_hw_value_88xx <==========\n");
  4194. return HALMAC_RET_SUCCESS;
  4195. }
  4196. /**
  4197. * halmac_set_hw_value_88xx() -set hw config value
  4198. * @pHalmac_adapter : the adapter of halmac
  4199. * @hw_id : hw id for driver to config
  4200. * @pvalue : hw value, reference table to get data type
  4201. * Author : KaiYuan Chang / Ivan Lin
  4202. * Return : HALMAC_RET_STATUS
  4203. * More details of status code can be found in prototype document
  4204. */
  4205. HALMAC_RET_STATUS
  4206. halmac_set_hw_value_88xx(
  4207. IN PHALMAC_ADAPTER pHalmac_adapter,
  4208. IN HALMAC_HW_ID hw_id,
  4209. IN VOID *pvalue
  4210. )
  4211. {
  4212. VOID *pDriver_adapter = NULL;
  4213. HALMAC_RET_STATUS status;
  4214. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  4215. return HALMAC_RET_ADAPTER_INVALID;
  4216. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  4217. return HALMAC_RET_API_INVALID;
  4218. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_GET_HW_VALUE);
  4219. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  4220. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_set_hw_value_88xx ==========>\n");
  4221. if (NULL == pvalue) {
  4222. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_ERR, "halmac_set_hw_value_88xx (NULL == pvalue)==========>\n");
  4223. return HALMAC_RET_NULL_POINTER;
  4224. }
  4225. switch (hw_id) {
  4226. case HALMAC_HW_USB_MODE:
  4227. status = halmac_set_usb_mode_88xx(pHalmac_adapter, *(HALMAC_USB_MODE *)pvalue);
  4228. if (HALMAC_RET_SUCCESS != status)
  4229. return status;
  4230. break;
  4231. case HALMAC_HW_SEQ_EN:
  4232. /*if (_TRUE == hw_seq_en) {
  4233. } else {
  4234. }*/
  4235. break;
  4236. case HALMAC_HW_BANDWIDTH:
  4237. halmac_cfg_bw_88xx(pHalmac_adapter, *(HALMAC_BW *)pvalue);
  4238. break;
  4239. case HALMAC_HW_CHANNEL:
  4240. halmac_cfg_ch_88xx(pHalmac_adapter, *(u8 *)pvalue);
  4241. break;
  4242. case HALMAC_HW_PRI_CHANNEL_IDX:
  4243. halmac_cfg_pri_ch_idx_88xx(pHalmac_adapter, *(HALMAC_PRI_CH_IDX *)pvalue);
  4244. break;
  4245. case HALMAC_HW_EN_BB_RF:
  4246. halmac_enable_bb_rf_88xx(pHalmac_adapter, *(u8 *)pvalue);
  4247. break;
  4248. case HALMAC_HW_SDIO_TX_PAGE_THRESHOLD:
  4249. halmac_config_sdio_tx_page_threshold_88xx(pHalmac_adapter, (PHALMAC_TX_PAGE_THRESHOLD_INFO)pvalue);
  4250. break;
  4251. case HALMAC_HW_AMPDU_CONFIG:
  4252. halmac_config_ampdu_88xx(pHalmac_adapter, (PHALMAC_AMPDU_CONFIG)pvalue);
  4253. break;
  4254. default:
  4255. return HALMAC_RET_PARA_NOT_SUPPORT;
  4256. }
  4257. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_set_hw_value_88xx <==========\n");
  4258. return HALMAC_RET_SUCCESS;
  4259. }
  4260. /**
  4261. * halmac_cfg_drv_rsvd_pg_num_88xx() -config reserved page number for driver
  4262. * @pHalmac_adapter : the adapter of halmac
  4263. * @pg_num : page number
  4264. * Author : KaiYuan Chang
  4265. * Return : HALMAC_RET_STATUS
  4266. * More details of status code can be found in prototype document
  4267. */
  4268. HALMAC_RET_STATUS
  4269. halmac_cfg_drv_rsvd_pg_num_88xx(
  4270. IN PHALMAC_ADAPTER pHalmac_adapter,
  4271. IN HALMAC_DRV_RSVD_PG_NUM pg_num
  4272. )
  4273. {
  4274. VOID *pDriver_adapter = NULL;
  4275. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  4276. return HALMAC_RET_ADAPTER_INVALID;
  4277. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  4278. return HALMAC_RET_API_INVALID;
  4279. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CFG_DRV_RSVD_PG_NUM);
  4280. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  4281. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_cfg_drv_rsvd_pg_num_88xx ==========>pg_num = %d\n", pg_num);
  4282. switch (pg_num) {
  4283. case HALMAC_RSVD_PG_NUM16:
  4284. pHalmac_adapter->txff_allocation.rsvd_drv_pg_num = 16;
  4285. break;
  4286. case HALMAC_RSVD_PG_NUM24:
  4287. pHalmac_adapter->txff_allocation.rsvd_drv_pg_num = 24;
  4288. break;
  4289. case HALMAC_RSVD_PG_NUM32:
  4290. pHalmac_adapter->txff_allocation.rsvd_drv_pg_num = 32;
  4291. break;
  4292. }
  4293. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_cfg_drv_rsvd_pg_num_88xx <==========\n");
  4294. return HALMAC_RET_SUCCESS;
  4295. }
  4296. HALMAC_RET_STATUS
  4297. halmac_get_chip_version_88xx(
  4298. IN PHALMAC_ADAPTER pHalmac_adapter,
  4299. IN PHALMAC_VER pVersion
  4300. )
  4301. {
  4302. VOID *pDriver_adapter = NULL;
  4303. PHALMAC_API pHalmac_api;
  4304. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  4305. return HALMAC_RET_ADAPTER_INVALID;
  4306. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  4307. return HALMAC_RET_API_INVALID;
  4308. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  4309. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  4310. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_get_chip_version_88xx ==========>\n");
  4311. pVersion->major_ver = (u8)HALMAC_MAJOR_VER_88XX;
  4312. pVersion->prototype_ver = (u8)HALMAC_PROTOTYPE_VER_88XX;
  4313. pVersion->minor_ver = (u8)HALMAC_MINOR_VER_88XX;
  4314. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_H2C, HALMAC_DBG_TRACE, "halmac_get_chip_version_88xx <==========\n");
  4315. return HALMAC_RET_SUCCESS;
  4316. }
  4317. /**
  4318. * halmac_chk_txdesc_88xx() -check if the tx packet format is incorrect
  4319. * @pHalmac_adapter : the adapter of halmac
  4320. * @halmac_buf : tx Packet buffer, tx desc is included
  4321. * @halmac_size : tx packet size
  4322. * Author : KaiYuan Chang
  4323. * Return : HALMAC_RET_STATUS
  4324. * More details of status code can be found in prototype document
  4325. */
  4326. HALMAC_RET_STATUS
  4327. halmac_chk_txdesc_88xx(
  4328. IN PHALMAC_ADAPTER pHalmac_adapter,
  4329. IN u8 *pHalmac_buf,
  4330. IN u32 halmac_size
  4331. )
  4332. {
  4333. VOID *pDriver_adapter = NULL;
  4334. PHALMAC_API pHalmac_api;
  4335. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  4336. return HALMAC_RET_ADAPTER_INVALID;
  4337. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  4338. return HALMAC_RET_API_INVALID;
  4339. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  4340. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  4341. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_chk_txdesc_88xx ==========>\n");
  4342. if (_TRUE == GET_TX_DESC_BMC(pHalmac_buf))
  4343. if (_TRUE == GET_TX_DESC_AGG_EN(pHalmac_buf))
  4344. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "TxDesc: Agg should not be set when BMC\n");
  4345. if (halmac_size < (GET_TX_DESC_TXPKTSIZE(pHalmac_buf) + GET_TX_DESC_OFFSET(pHalmac_buf)))
  4346. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "TxDesc: PktSize too small\n");
  4347. /* PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_WARN, "halmac_chk_txdesc_88xx <==========\n"); */
  4348. return HALMAC_RET_SUCCESS;
  4349. }
  4350. /**
  4351. * halmac_dl_drv_rsvd_page_88xx() - download packet to rsvd page
  4352. * @pHalmac_adapter : the adapter of halmac
  4353. * @pg_offset : page offset of driver's rsvd page
  4354. * @halmac_buf : data to be downloaded, tx_desc is not included
  4355. * @halmac_size : data size to be downloaded
  4356. * Author : KaiYuan Chang
  4357. * Return : HALMAC_RET_STATUS
  4358. * More details of status code can be found in prototype document
  4359. */
  4360. HALMAC_RET_STATUS
  4361. halmac_dl_drv_rsvd_page_88xx(
  4362. IN PHALMAC_ADAPTER pHalmac_adapter,
  4363. IN u8 pg_offset,
  4364. IN u8 *pHalmac_buf,
  4365. IN u32 halmac_size
  4366. )
  4367. {
  4368. VOID *pDriver_adapter = NULL;
  4369. PHALMAC_API pHalmac_api;
  4370. HALMAC_RET_STATUS ret_status;
  4371. u16 drv_pg_bndy = 0;
  4372. u32 dl_pg_num = 0;
  4373. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  4374. return HALMAC_RET_ADAPTER_INVALID;
  4375. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  4376. return HALMAC_RET_API_INVALID;
  4377. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_DL_DRV_RSVD_PG);
  4378. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  4379. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  4380. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_dl_drv_rsvd_page_88xx ==========>\n");
  4381. /*check boundary and size valid*/
  4382. dl_pg_num = halmac_size/pHalmac_adapter->hw_config_info.page_size + ((halmac_size & (pHalmac_adapter->hw_config_info.page_size - 1)) ? 1 : 0);
  4383. if (pg_offset + dl_pg_num > pHalmac_adapter->txff_allocation.rsvd_drv_pg_num) {
  4384. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "[ERROR] driver download offset or size error ==========>\n");
  4385. return HALMAC_RET_DRV_DL_ERR;
  4386. }
  4387. /*update to target download boundary*/
  4388. drv_pg_bndy = pHalmac_adapter->txff_allocation.rsvd_drv_pg_bndy + pg_offset;
  4389. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_CTRL_2, (u16)(drv_pg_bndy & BIT_MASK_BCN_HEAD_1_V1));
  4390. ret_status = halmac_download_rsvd_page_88xx(pHalmac_adapter, pHalmac_buf, halmac_size);
  4391. /*restore to original bundary*/
  4392. if (HALMAC_RET_SUCCESS != ret_status) {
  4393. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_ERR, "halmac_download_rsvd_page_88xx Fail = %x!!\n", ret_status);
  4394. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_CTRL_2, (u16)(pHalmac_adapter->txff_allocation.rsvd_pg_bndy & BIT_MASK_BCN_HEAD_1_V1));
  4395. return ret_status;
  4396. }
  4397. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_FIFOPAGE_CTRL_2, (u16)(pHalmac_adapter->txff_allocation.rsvd_pg_bndy & BIT_MASK_BCN_HEAD_1_V1));
  4398. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_INIT, HALMAC_DBG_TRACE, "halmac_dl_drv_rsvd_page_88xx < ==========\n");
  4399. return HALMAC_RET_SUCCESS;
  4400. }
  4401. /**
  4402. * halmac_cfg_csi_rate_88xx() - config CSI frame Tx rate
  4403. * @pHalmac_adapter : the adapter of halmac
  4404. * @rssi : rssi in decimal value
  4405. * @current_rate : current CSI frame rate
  4406. * @fixrate_en : enable to fix CSI frame in VHT rate, otherwise legacy OFDM rate
  4407. * @new_rate : API returns the final CSI frame rate
  4408. * Author : chunchu
  4409. * Return : HALMAC_RET_STATUS
  4410. * More details of status code can be found in prototype document
  4411. */
  4412. HALMAC_RET_STATUS
  4413. halmac_cfg_csi_rate_88xx(
  4414. IN PHALMAC_ADAPTER pHalmac_adapter,
  4415. IN u8 rssi,
  4416. IN u8 current_rate,
  4417. IN u8 fixrate_en,
  4418. OUT u8 *new_rate
  4419. )
  4420. {
  4421. VOID *pDriver_adapter = NULL;
  4422. PHALMAC_API pHalmac_api;
  4423. u32 temp_csi_setting;
  4424. u16 current_rrsr;
  4425. if (HALMAC_RET_SUCCESS != halmac_adapter_validate(pHalmac_adapter))
  4426. return HALMAC_RET_ADAPTER_INVALID;
  4427. if (HALMAC_RET_SUCCESS != halmac_api_validate(pHalmac_adapter))
  4428. return HALMAC_RET_API_INVALID;
  4429. halmac_api_record_id_88xx(pHalmac_adapter, HALMAC_API_CFG_CSI_RATE);
  4430. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  4431. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  4432. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_SND, HALMAC_DBG_TRACE, "halmac_cfg_csi_rate_88xx ==========>\n");
  4433. #if HALMAC_8821C_SUPPORT
  4434. if (pHalmac_adapter->chip_id == HALMAC_CHIP_ID_8821C) {
  4435. if (fixrate_en) {
  4436. temp_csi_setting = HALMAC_REG_READ_32(pHalmac_adapter, REG_BBPSF_CTRL) & ~(BIT_MASK_WMAC_CSI_RATE << BIT_SHIFT_WMAC_CSI_RATE);
  4437. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_BBPSF_CTRL, temp_csi_setting | BIT_CSI_FORCE_RATE_EN | BIT_CSI_RSC(1) | BIT_WMAC_CSI_RATE(HALMAC_VHT_NSS1_MCS3));
  4438. *new_rate = HALMAC_VHT_NSS1_MCS3;
  4439. return HALMAC_RET_SUCCESS;
  4440. }
  4441. }
  4442. temp_csi_setting = HALMAC_REG_READ_32(pHalmac_adapter, REG_BBPSF_CTRL) & ~(BIT_MASK_WMAC_CSI_RATE << BIT_SHIFT_WMAC_CSI_RATE) & ~BIT_CSI_FORCE_RATE_EN;
  4443. #else
  4444. temp_csi_setting = HALMAC_REG_READ_32(pHalmac_adapter, REG_BBPSF_CTRL) & ~(BIT_MASK_WMAC_CSI_RATE << BIT_SHIFT_WMAC_CSI_RATE);
  4445. #endif
  4446. current_rrsr = HALMAC_REG_READ_16(pHalmac_adapter, REG_RRSR);
  4447. if (rssi >= 40) {
  4448. if (current_rate != HALMAC_OFDM54) {
  4449. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_RRSR, current_rrsr | BIT(HALMAC_OFDM54));
  4450. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_BBPSF_CTRL, temp_csi_setting | BIT_WMAC_CSI_RATE(HALMAC_OFDM54));
  4451. }
  4452. *new_rate = HALMAC_OFDM54;
  4453. return HALMAC_RET_SUCCESS;
  4454. } else {
  4455. if (current_rate != HALMAC_OFDM24) {
  4456. HALMAC_REG_WRITE_16(pHalmac_adapter, REG_RRSR, current_rrsr & ~(BIT(HALMAC_OFDM54)));
  4457. HALMAC_REG_WRITE_32(pHalmac_adapter, REG_BBPSF_CTRL, temp_csi_setting | BIT_WMAC_CSI_RATE(HALMAC_OFDM24));
  4458. }
  4459. *new_rate = HALMAC_OFDM24;
  4460. return HALMAC_RET_SUCCESS;
  4461. }
  4462. }
  4463. /**
  4464. * halmac_txfifo_is_empty_88xx() -check if txfifo is empty
  4465. * @pHalmac_adapter : the adapter of halmac
  4466. * Author : Ivan Lin
  4467. * Return : HALMAC_RET_STATUS
  4468. * More details of status code can be found in prototype document
  4469. */
  4470. HALMAC_RET_STATUS
  4471. halmac_txfifo_is_empty_88xx(
  4472. IN PHALMAC_ADAPTER pHalmac_adapter,
  4473. IN u32 chk_num
  4474. )
  4475. {
  4476. u32 counter;
  4477. VOID *pDriver_adapter = NULL;
  4478. PHALMAC_API pHalmac_api;
  4479. pDriver_adapter = pHalmac_adapter->pDriver_adapter;
  4480. pHalmac_api = (PHALMAC_API)pHalmac_adapter->pHalmac_api;
  4481. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_COMMON, HALMAC_DBG_TRACE, "halmac_txfifo_is_empty_88xx ==========>\n");
  4482. counter = (chk_num <= 10) ? 10 : chk_num;
  4483. do {
  4484. if (0xFF != HALMAC_REG_READ_8(pHalmac_adapter, REG_TXPKT_EMPTY))
  4485. return HALMAC_RET_TXFIFO_NO_EMPTY;
  4486. if (0x07 != (HALMAC_REG_READ_8(pHalmac_adapter, REG_TXPKT_EMPTY + 1) & 0x07))
  4487. return HALMAC_RET_TXFIFO_NO_EMPTY;
  4488. counter--;
  4489. } while (0 != counter);
  4490. PLATFORM_MSG_PRINT(pDriver_adapter, HALMAC_MSG_COMMON, HALMAC_DBG_TRACE, "halmac_txfifo_is_empty_88xx <==========\n");
  4491. return HALMAC_RET_SUCCESS;
  4492. }