halbtc8821c2ant.c 175 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103
  1. /* ************************************************************
  2. * Description:
  3. *
  4. * This file is for RTL8821C Co-exist mechanism
  5. *
  6. * History
  7. * 2012/11/15 Cosa first check in.
  8. *
  9. * ************************************************************ */
  10. /* ************************************************************
  11. * include files
  12. * ************************************************************ */
  13. #include "mp_precomp.h"
  14. #if (BT_SUPPORT == 1 && COEX_SUPPORT == 1)
  15. #if (RTL8821C_SUPPORT == 1)
  16. /* ************************************************************
  17. * Global variables, these are static variables
  18. * ************************************************************ */
  19. static u8 *trace_buf = &gl_btc_trace_buf[0];
  20. static struct coex_dm_8821c_2ant glcoex_dm_8821c_2ant;
  21. static struct coex_dm_8821c_2ant *coex_dm = &glcoex_dm_8821c_2ant;
  22. static struct coex_sta_8821c_2ant glcoex_sta_8821c_2ant;
  23. static struct coex_sta_8821c_2ant *coex_sta = &glcoex_sta_8821c_2ant;
  24. static struct psdscan_sta_8821c_2ant gl_psd_scan_8821c_2ant;
  25. static struct psdscan_sta_8821c_2ant *psd_scan = &gl_psd_scan_8821c_2ant;
  26. static struct rfe_type_8821c_2ant gl_rfe_type_8821c_2ant;
  27. static struct rfe_type_8821c_2ant *rfe_type = &gl_rfe_type_8821c_2ant;
  28. const char *const glbt_info_src_8821c_2ant[] = {
  29. "BT Info[wifi fw]",
  30. "BT Info[bt rsp]",
  31. "BT Info[bt auto report]",
  32. };
  33. u32 glcoex_ver_date_8821c_2ant = 20170310;
  34. u32 glcoex_ver_8821c_2ant = 0x12;
  35. u32 glcoex_ver_btdesired_8821c_2ant = 0x11;
  36. /* ************************************************************
  37. * local function proto type if needed
  38. * ************************************************************
  39. * ************************************************************
  40. * local function start with halbtc8821c2ant_
  41. * ************************************************************ */
  42. u8 halbtc8821c2ant_bt_rssi_state(IN struct btc_coexist *btcoexist,
  43. u8 *ppre_bt_rssi_state, u8 level_num,
  44. u8 rssi_thresh, u8 rssi_thresh1)
  45. {
  46. s32 bt_rssi = 0;
  47. u8 bt_rssi_state = *ppre_bt_rssi_state;
  48. bt_rssi = coex_sta->bt_rssi;
  49. if (level_num == 2) {
  50. if ((*ppre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
  51. (*ppre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
  52. if (bt_rssi >= (rssi_thresh +
  53. BTC_RSSI_COEX_THRESH_TOL_8821C_2ANT))
  54. bt_rssi_state = BTC_RSSI_STATE_HIGH;
  55. else
  56. bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
  57. } else {
  58. if (bt_rssi < rssi_thresh)
  59. bt_rssi_state = BTC_RSSI_STATE_LOW;
  60. else
  61. bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
  62. }
  63. } else if (level_num == 3) {
  64. if (rssi_thresh > rssi_thresh1) {
  65. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  66. "[BTCoex], BT Rssi thresh error!!\n");
  67. BTC_TRACE(trace_buf);
  68. return *ppre_bt_rssi_state;
  69. }
  70. if ((*ppre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
  71. (*ppre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
  72. if (bt_rssi >= (rssi_thresh +
  73. BTC_RSSI_COEX_THRESH_TOL_8821C_2ANT))
  74. bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
  75. else
  76. bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
  77. } else if ((*ppre_bt_rssi_state == BTC_RSSI_STATE_MEDIUM) ||
  78. (*ppre_bt_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
  79. if (bt_rssi >= (rssi_thresh1 +
  80. BTC_RSSI_COEX_THRESH_TOL_8821C_2ANT))
  81. bt_rssi_state = BTC_RSSI_STATE_HIGH;
  82. else if (bt_rssi < rssi_thresh)
  83. bt_rssi_state = BTC_RSSI_STATE_LOW;
  84. else
  85. bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
  86. } else {
  87. if (bt_rssi < rssi_thresh1)
  88. bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
  89. else
  90. bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
  91. }
  92. }
  93. *ppre_bt_rssi_state = bt_rssi_state;
  94. return bt_rssi_state;
  95. }
  96. u8 halbtc8821c2ant_wifi_rssi_state(IN struct btc_coexist *btcoexist,
  97. IN u8 *pprewifi_rssi_state, IN u8 level_num, IN u8 rssi_thresh,
  98. IN u8 rssi_thresh1)
  99. {
  100. s32 wifi_rssi = 0;
  101. u8 wifi_rssi_state = *pprewifi_rssi_state;
  102. btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
  103. if (level_num == 2) {
  104. if ((*pprewifi_rssi_state == BTC_RSSI_STATE_LOW) ||
  105. (*pprewifi_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
  106. if (wifi_rssi >= (rssi_thresh +
  107. BTC_RSSI_COEX_THRESH_TOL_8821C_2ANT))
  108. wifi_rssi_state = BTC_RSSI_STATE_HIGH;
  109. else
  110. wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
  111. } else {
  112. if (wifi_rssi < rssi_thresh)
  113. wifi_rssi_state = BTC_RSSI_STATE_LOW;
  114. else
  115. wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
  116. }
  117. } else if (level_num == 3) {
  118. if (rssi_thresh > rssi_thresh1) {
  119. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  120. "[BTCoex], wifi RSSI thresh error!!\n");
  121. BTC_TRACE(trace_buf);
  122. return *pprewifi_rssi_state;
  123. }
  124. if ((*pprewifi_rssi_state == BTC_RSSI_STATE_LOW) ||
  125. (*pprewifi_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
  126. if (wifi_rssi >= (rssi_thresh +
  127. BTC_RSSI_COEX_THRESH_TOL_8821C_2ANT))
  128. wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
  129. else
  130. wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
  131. } else if ((*pprewifi_rssi_state == BTC_RSSI_STATE_MEDIUM) ||
  132. (*pprewifi_rssi_state == BTC_RSSI_STATE_STAY_MEDIUM)) {
  133. if (wifi_rssi >= (rssi_thresh1 +
  134. BTC_RSSI_COEX_THRESH_TOL_8821C_2ANT))
  135. wifi_rssi_state = BTC_RSSI_STATE_HIGH;
  136. else if (wifi_rssi < rssi_thresh)
  137. wifi_rssi_state = BTC_RSSI_STATE_LOW;
  138. else
  139. wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
  140. } else {
  141. if (wifi_rssi < rssi_thresh1)
  142. wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
  143. else
  144. wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
  145. }
  146. }
  147. *pprewifi_rssi_state = wifi_rssi_state;
  148. return wifi_rssi_state;
  149. }
  150. void halbtc8821c2ant_coex_switch_threshold(IN struct btc_coexist *btcoexist,
  151. IN u8 isolation_measuared)
  152. {
  153. s8 interference_wl_tx = 0, interference_bt_tx = 0;
  154. interference_wl_tx = BT_8821C_2ANT_WIFI_MAX_TX_POWER -
  155. isolation_measuared;
  156. interference_bt_tx = BT_8821C_2ANT_BT_MAX_TX_POWER -
  157. isolation_measuared;
  158. coex_sta->wifi_coex_thres = BT_8821C_2ANT_WIFI_RSSI_COEXSWITCH_THRES1;
  159. coex_sta->wifi_coex_thres2 = BT_8821C_2ANT_WIFI_RSSI_COEXSWITCH_THRES2;
  160. coex_sta->bt_coex_thres = BT_8821C_2ANT_BT_RSSI_COEXSWITCH_THRES1;
  161. coex_sta->bt_coex_thres2 = BT_8821C_2ANT_BT_RSSI_COEXSWITCH_THRES2;
  162. /*
  163. coex_sta->wifi_coex_thres = interference_wl_tx + BT_8821C_2ANT_WIFI_SIR_THRES1;
  164. coex_sta->wifi_coex_thres2 = interference_wl_tx + BT_8821C_2ANT_WIFI_SIR_THRES2;
  165. coex_sta->bt_coex_thres = interference_bt_tx + BT_8821C_2ANT_BT_SIR_THRES1;
  166. coex_sta->bt_coex_thres2 = interference_bt_tx + BT_8821C_2ANT_BT_SIR_THRES2;
  167. */
  168. /*
  169. if ( BT_8821C_2ANT_WIFI_RSSI_COEXSWITCH_THRES1 < (isolation_measuared -
  170. BT_8821C_2ANT_DEFAULT_ISOLATION) )
  171. coex_sta->wifi_coex_thres = BT_8821C_2ANT_WIFI_RSSI_COEXSWITCH_THRES1;
  172. else
  173. coex_sta->wifi_coex_thres = BT_8821C_2ANT_WIFI_RSSI_COEXSWITCH_THRES1 - (isolation_measuared -
  174. BT_8821C_2ANT_DEFAULT_ISOLATION);
  175. if ( BT_8821C_2ANT_BT_RSSI_COEXSWITCH_THRES1 < (isolation_measuared -
  176. BT_8821C_2ANT_DEFAULT_ISOLATION) )
  177. coex_sta->bt_coex_thres = BT_8821C_2ANT_BT_RSSI_COEXSWITCH_THRES1;
  178. else
  179. coex_sta->bt_coex_thres = BT_8821C_2ANT_BT_RSSI_COEXSWITCH_THRES1 - (isolation_measuared -
  180. BT_8821C_2ANT_DEFAULT_ISOLATION);
  181. */
  182. }
  183. void halbtc8821c2ant_limited_rx(IN struct btc_coexist *btcoexist,
  184. IN boolean force_exec, IN boolean rej_ap_agg_pkt,
  185. IN boolean bt_ctrl_agg_buf_size, IN u8 agg_buf_size)
  186. {
  187. boolean reject_rx_agg = rej_ap_agg_pkt;
  188. boolean bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size;
  189. u8 rx_agg_size = agg_buf_size;
  190. /* ============================================ */
  191. /* Rx Aggregation related setting */
  192. /* ============================================ */
  193. btcoexist->btc_set(btcoexist, BTC_SET_BL_TO_REJ_AP_AGG_PKT,
  194. &reject_rx_agg);
  195. /* decide BT control aggregation buf size or not */
  196. btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_CTRL_AGG_SIZE,
  197. &bt_ctrl_rx_agg_size);
  198. /* aggregation buf size, only work when BT control Rx aggregation size. */
  199. btcoexist->btc_set(btcoexist, BTC_SET_U1_AGG_BUF_SIZE, &rx_agg_size);
  200. /* real update aggregation setting */
  201. btcoexist->btc_set(btcoexist, BTC_SET_ACT_AGGREGATE_CTRL, NULL);
  202. }
  203. void halbtc8821c2ant_query_bt_info(IN struct btc_coexist *btcoexist)
  204. {
  205. u8 h2c_parameter[1] = {0};
  206. if (coex_sta->bt_disabled) {
  207. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  208. "[BTCoex], No query BT info because BT is disabled!\n");
  209. BTC_TRACE(trace_buf);
  210. return;
  211. }
  212. h2c_parameter[0] |= BIT(0); /* trigger */
  213. btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
  214. }
  215. void halbtc8821c2ant_monitor_bt_ctr(IN struct btc_coexist *btcoexist)
  216. {
  217. u32 reg_hp_txrx, reg_lp_txrx, u32tmp;
  218. u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0;
  219. static u8 num_of_bt_counter_chk = 0, cnt_slave = 0, cnt_overhead = 0,
  220. cnt_autoslot_hang = 0;
  221. struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
  222. reg_hp_txrx = 0x770;
  223. reg_lp_txrx = 0x774;
  224. u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx);
  225. reg_hp_tx = u32tmp & MASKLWORD;
  226. reg_hp_rx = (u32tmp & MASKHWORD) >> 16;
  227. u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx);
  228. reg_lp_tx = u32tmp & MASKLWORD;
  229. reg_lp_rx = (u32tmp & MASKHWORD) >> 16;
  230. coex_sta->high_priority_tx = reg_hp_tx;
  231. coex_sta->high_priority_rx = reg_hp_rx;
  232. coex_sta->low_priority_tx = reg_lp_tx;
  233. coex_sta->low_priority_rx = reg_lp_rx;
  234. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  235. "[BTCoex], Hi-Pri Rx/Tx: %d/%d, Lo-Pri Rx/Tx: %d/%d\n",
  236. reg_hp_rx, reg_hp_tx, reg_lp_rx, reg_lp_tx);
  237. BTC_TRACE(trace_buf);
  238. if (BT_8821C_2ANT_BT_STATUS_NON_CONNECTED_IDLE ==
  239. coex_dm->bt_status) {
  240. if (coex_sta->high_priority_rx >= 15) {
  241. if (cnt_overhead < 3)
  242. cnt_overhead++;
  243. if (cnt_overhead == 3)
  244. coex_sta->is_hiPri_rx_overhead = TRUE;
  245. } else {
  246. if (cnt_overhead > 0)
  247. cnt_overhead--;
  248. if (cnt_overhead == 0)
  249. coex_sta->is_hiPri_rx_overhead = FALSE;
  250. }
  251. } else
  252. coex_sta->is_hiPri_rx_overhead = FALSE;
  253. /* reset counter */
  254. btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
  255. if ((coex_sta->low_priority_tx > 1150) &&
  256. (!coex_sta->c2h_bt_inquiry_page))
  257. coex_sta->pop_event_cnt++;
  258. if ((coex_sta->low_priority_rx >= 1150) &&
  259. (coex_sta->low_priority_rx >= coex_sta->low_priority_tx)
  260. && (!coex_sta->under_ips)
  261. && (!coex_sta->c2h_bt_inquiry_page)
  262. && ((bt_link_info->a2dp_exist) || (bt_link_info->pan_exist))) {
  263. if (cnt_slave >= 2) {
  264. bt_link_info->slave_role = TRUE;
  265. cnt_slave = 2;
  266. } else
  267. cnt_slave++;
  268. } else {
  269. if (cnt_slave == 0) {
  270. bt_link_info->slave_role = FALSE;
  271. cnt_slave = 0;
  272. } else
  273. cnt_slave--;
  274. }
  275. if (coex_sta->is_tdma_btautoslot) {
  276. if ((coex_sta->low_priority_tx >= 1300) &&
  277. (coex_sta->low_priority_rx <= 150)) {
  278. if (cnt_autoslot_hang >= 2) {
  279. coex_sta->is_tdma_btautoslot_hang = TRUE;
  280. cnt_autoslot_hang = 2;
  281. } else
  282. cnt_autoslot_hang++;
  283. } else {
  284. if (cnt_autoslot_hang == 0) {
  285. coex_sta->is_tdma_btautoslot_hang = FALSE;
  286. cnt_autoslot_hang = 0;
  287. } else
  288. cnt_autoslot_hang--;
  289. }
  290. }
  291. if (coex_sta->sco_exist) {
  292. if ((coex_sta->high_priority_tx >= 400) &&
  293. (coex_sta->high_priority_rx >= 400))
  294. coex_sta->is_eSCO_mode = FALSE;
  295. else
  296. coex_sta->is_eSCO_mode = TRUE;
  297. }
  298. if (bt_link_info->hid_only) {
  299. if (coex_sta->low_priority_rx > 50)
  300. coex_sta->is_hid_low_pri_tx_overhead = true;
  301. else
  302. coex_sta->is_hid_low_pri_tx_overhead = false;
  303. }
  304. if (!coex_sta->bt_disabled) {
  305. if ((coex_sta->high_priority_tx == 0) &&
  306. (coex_sta->high_priority_rx == 0) &&
  307. (coex_sta->low_priority_tx == 0) &&
  308. (coex_sta->low_priority_rx == 0)) {
  309. num_of_bt_counter_chk++;
  310. if (num_of_bt_counter_chk >= 3) {
  311. halbtc8821c2ant_query_bt_info(btcoexist);
  312. num_of_bt_counter_chk = 0;
  313. }
  314. }
  315. }
  316. }
  317. void halbtc8821c2ant_monitor_wifi_ctr(IN struct btc_coexist *btcoexist)
  318. {
  319. #if 1
  320. s32 wifi_rssi = 0;
  321. boolean wifi_busy = FALSE, wifi_under_b_mode = FALSE,
  322. wifi_scan = FALSE;
  323. boolean bt_idle = FALSE, wl_idle = FALSE;
  324. static u8 cck_lock_counter = 0, wl_noisy_count0 = 0,
  325. wl_noisy_count1 = 3, wl_noisy_count2 = 0;
  326. u32 total_cnt, reg_val1, reg_val2, cck_cnt;
  327. u32 cnt_crcok = 0, cnt_crcerr = 0;
  328. static u8 cnt = 0;
  329. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
  330. btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
  331. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE,
  332. &wifi_under_b_mode);
  333. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &wifi_scan);
  334. coex_sta->crc_ok_cck = btcoexist->btc_phydm_query_PHY_counter(
  335. btcoexist,
  336. PHYDM_INFO_CRC32_OK_CCK);
  337. coex_sta->crc_ok_11g = btcoexist->btc_phydm_query_PHY_counter(
  338. btcoexist,
  339. PHYDM_INFO_CRC32_OK_LEGACY);
  340. coex_sta->crc_ok_11n = btcoexist->btc_phydm_query_PHY_counter(
  341. btcoexist,
  342. PHYDM_INFO_CRC32_OK_HT);
  343. coex_sta->crc_ok_11n_vht =
  344. btcoexist->btc_phydm_query_PHY_counter(
  345. btcoexist,
  346. PHYDM_INFO_CRC32_OK_VHT);
  347. coex_sta->crc_err_cck = btcoexist->btc_phydm_query_PHY_counter(
  348. btcoexist, PHYDM_INFO_CRC32_ERROR_CCK);
  349. coex_sta->crc_err_11g = btcoexist->btc_phydm_query_PHY_counter(
  350. btcoexist, PHYDM_INFO_CRC32_ERROR_LEGACY);
  351. coex_sta->crc_err_11n = btcoexist->btc_phydm_query_PHY_counter(
  352. btcoexist, PHYDM_INFO_CRC32_ERROR_HT);
  353. coex_sta->crc_err_11n_vht =
  354. btcoexist->btc_phydm_query_PHY_counter(
  355. btcoexist,
  356. PHYDM_INFO_CRC32_ERROR_VHT);
  357. cnt_crcok = coex_sta->crc_ok_cck + coex_sta->crc_ok_11g
  358. + coex_sta->crc_ok_11n
  359. + coex_sta->crc_ok_11n_vht;
  360. cnt_crcerr = coex_sta->crc_err_cck + coex_sta->crc_err_11g
  361. + coex_sta->crc_err_11n
  362. + coex_sta->crc_err_11n_vht;
  363. if ((wifi_busy) && (cnt_crcerr != 0)) {
  364. coex_sta->now_crc_ratio = cnt_crcok/cnt_crcerr;
  365. if (cnt == 0)
  366. coex_sta->acc_crc_ratio = coex_sta->now_crc_ratio;
  367. else
  368. coex_sta->acc_crc_ratio = (coex_sta->acc_crc_ratio * 7 +
  369. coex_sta->now_crc_ratio * 3)/10;
  370. if (cnt >= 10)
  371. cnt = 0;
  372. else
  373. cnt++;
  374. }
  375. cck_cnt = coex_sta->crc_ok_cck + coex_sta->crc_err_cck;
  376. if ((coex_dm->bt_status ==
  377. BT_8821C_2ANT_BT_STATUS_NON_CONNECTED_IDLE) ||
  378. (coex_dm->bt_status ==
  379. BT_8821C_2ANT_BT_STATUS_CONNECTED_IDLE) ||
  380. (coex_sta->bt_disabled))
  381. bt_idle = TRUE;
  382. if (cck_cnt > 250) {
  383. if (wl_noisy_count2 < 3)
  384. wl_noisy_count2++;
  385. if (wl_noisy_count2 == 3) {
  386. wl_noisy_count0 = 0;
  387. wl_noisy_count1 = 0;
  388. }
  389. } else if (cck_cnt < 50) {
  390. if (wl_noisy_count0 < 3)
  391. wl_noisy_count0++;
  392. if (wl_noisy_count0 == 3) {
  393. wl_noisy_count1 = 0;
  394. wl_noisy_count2 = 0;
  395. }
  396. } else {
  397. if (wl_noisy_count1 < 3)
  398. wl_noisy_count1++;
  399. if (wl_noisy_count1 == 3) {
  400. wl_noisy_count0 = 0;
  401. wl_noisy_count2 = 0;
  402. }
  403. }
  404. if (wl_noisy_count2 == 3)
  405. coex_sta->wl_noisy_level = 2;
  406. else if (wl_noisy_count1 == 3)
  407. coex_sta->wl_noisy_level = 1;
  408. else
  409. coex_sta->wl_noisy_level = 0;
  410. if ((wifi_busy) && (wifi_rssi >= 30) && (!wifi_under_b_mode)) {
  411. total_cnt = cnt_crcok;
  412. if ((coex_dm->bt_status ==
  413. BT_8821C_1ANT_BT_STATUS_ACL_BUSY) ||
  414. (coex_dm->bt_status ==
  415. BT_8821C_1ANT_BT_STATUS_ACL_SCO_BUSY) ||
  416. (coex_dm->bt_status ==
  417. BT_8821C_1ANT_BT_STATUS_SCO_BUSY)) {
  418. if (coex_sta->crc_ok_cck > (total_cnt -
  419. coex_sta->crc_ok_cck)) {
  420. if (cck_lock_counter < 3)
  421. cck_lock_counter++;
  422. } else {
  423. if (cck_lock_counter > 0)
  424. cck_lock_counter--;
  425. }
  426. } else {
  427. if (cck_lock_counter > 0)
  428. cck_lock_counter--;
  429. }
  430. } else {
  431. if (cck_lock_counter > 0)
  432. cck_lock_counter--;
  433. }
  434. if (!coex_sta->pre_ccklock) {
  435. if (cck_lock_counter >= 3)
  436. coex_sta->cck_lock = TRUE;
  437. else
  438. coex_sta->cck_lock = FALSE;
  439. } else {
  440. if (cck_lock_counter == 0)
  441. coex_sta->cck_lock = FALSE;
  442. else
  443. coex_sta->cck_lock = TRUE;
  444. }
  445. if (coex_sta->cck_lock)
  446. coex_sta->cck_ever_lock = TRUE;
  447. coex_sta->pre_ccklock = coex_sta->cck_lock;
  448. #endif
  449. }
  450. void halbtc8821c2ant_update_bt_link_info(IN struct btc_coexist *btcoexist)
  451. {
  452. struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
  453. boolean bt_hs_on = FALSE;
  454. boolean bt_busy = FALSE;
  455. coex_sta->num_of_profile = 0;
  456. /* set link exist status */
  457. if (!(coex_sta->bt_info & BT_INFO_8821C_1ANT_B_CONNECTION)) {
  458. coex_sta->bt_link_exist = FALSE;
  459. coex_sta->pan_exist = FALSE;
  460. coex_sta->a2dp_exist = FALSE;
  461. coex_sta->hid_exist = FALSE;
  462. coex_sta->sco_exist = FALSE;
  463. } else { /* connection exists */
  464. coex_sta->bt_link_exist = TRUE;
  465. if (coex_sta->bt_info & BT_INFO_8821C_1ANT_B_FTP) {
  466. coex_sta->pan_exist = TRUE;
  467. coex_sta->num_of_profile++;
  468. } else
  469. coex_sta->pan_exist = FALSE;
  470. if (coex_sta->bt_info & BT_INFO_8821C_1ANT_B_A2DP) {
  471. coex_sta->a2dp_exist = TRUE;
  472. coex_sta->num_of_profile++;
  473. } else
  474. coex_sta->a2dp_exist = FALSE;
  475. if (coex_sta->bt_info & BT_INFO_8821C_1ANT_B_HID) {
  476. coex_sta->hid_exist = TRUE;
  477. coex_sta->num_of_profile++;
  478. } else
  479. coex_sta->hid_exist = FALSE;
  480. if (coex_sta->bt_info & BT_INFO_8821C_1ANT_B_SCO_ESCO) {
  481. coex_sta->sco_exist = TRUE;
  482. coex_sta->num_of_profile++;
  483. } else
  484. coex_sta->sco_exist = FALSE;
  485. }
  486. btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
  487. bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
  488. bt_link_info->sco_exist = coex_sta->sco_exist;
  489. bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
  490. bt_link_info->pan_exist = coex_sta->pan_exist;
  491. bt_link_info->hid_exist = coex_sta->hid_exist;
  492. bt_link_info->acl_busy = coex_sta->acl_busy;
  493. /* work around for HS mode. */
  494. if (bt_hs_on) {
  495. bt_link_info->pan_exist = TRUE;
  496. bt_link_info->bt_link_exist = TRUE;
  497. }
  498. /* check if Sco only */
  499. if (bt_link_info->sco_exist &&
  500. !bt_link_info->a2dp_exist &&
  501. !bt_link_info->pan_exist &&
  502. !bt_link_info->hid_exist)
  503. bt_link_info->sco_only = TRUE;
  504. else
  505. bt_link_info->sco_only = FALSE;
  506. /* check if A2dp only */
  507. if (!bt_link_info->sco_exist &&
  508. bt_link_info->a2dp_exist &&
  509. !bt_link_info->pan_exist &&
  510. !bt_link_info->hid_exist)
  511. bt_link_info->a2dp_only = TRUE;
  512. else
  513. bt_link_info->a2dp_only = FALSE;
  514. /* check if Pan only */
  515. if (!bt_link_info->sco_exist &&
  516. !bt_link_info->a2dp_exist &&
  517. bt_link_info->pan_exist &&
  518. !bt_link_info->hid_exist)
  519. bt_link_info->pan_only = TRUE;
  520. else
  521. bt_link_info->pan_only = FALSE;
  522. /* check if Hid only */
  523. if (!bt_link_info->sco_exist &&
  524. !bt_link_info->a2dp_exist &&
  525. !bt_link_info->pan_exist &&
  526. bt_link_info->hid_exist)
  527. bt_link_info->hid_only = TRUE;
  528. else
  529. bt_link_info->hid_only = FALSE;
  530. if (coex_sta->bt_info & BT_INFO_8821C_2ANT_B_INQ_PAGE) {
  531. coex_dm->bt_status = BT_8821C_2ANT_BT_STATUS_INQ_PAGE;
  532. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  533. "[BTCoex], BtInfoNotify(), BT Inq/page!!!\n");
  534. } else if (!(coex_sta->bt_info & BT_INFO_8821C_2ANT_B_CONNECTION)) {
  535. coex_dm->bt_status = BT_8821C_2ANT_BT_STATUS_NON_CONNECTED_IDLE;
  536. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  537. "[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n");
  538. } else if (coex_sta->bt_info == BT_INFO_8821C_2ANT_B_CONNECTION) {
  539. /* connection exists but no busy */
  540. coex_dm->bt_status = BT_8821C_2ANT_BT_STATUS_CONNECTED_IDLE;
  541. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  542. "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");
  543. } else if (((coex_sta->bt_info & BT_INFO_8821C_2ANT_B_SCO_ESCO) ||
  544. (coex_sta->bt_info & BT_INFO_8821C_2ANT_B_SCO_BUSY)) &&
  545. (coex_sta->bt_info & BT_INFO_8821C_2ANT_B_ACL_BUSY)) {
  546. coex_dm->bt_status = BT_8821C_2ANT_BT_STATUS_ACL_SCO_BUSY;
  547. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  548. "[BTCoex], BtInfoNotify(), BT ACL SCO busy!!!\n");
  549. } else if ((coex_sta->bt_info & BT_INFO_8821C_2ANT_B_SCO_ESCO) ||
  550. (coex_sta->bt_info & BT_INFO_8821C_2ANT_B_SCO_BUSY)) {
  551. coex_dm->bt_status = BT_8821C_2ANT_BT_STATUS_SCO_BUSY;
  552. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  553. "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");
  554. } else if (coex_sta->bt_info & BT_INFO_8821C_2ANT_B_ACL_BUSY) {
  555. coex_dm->bt_status = BT_8821C_2ANT_BT_STATUS_ACL_BUSY;
  556. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  557. "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");
  558. } else {
  559. coex_dm->bt_status = BT_8821C_2ANT_BT_STATUS_MAX;
  560. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  561. "[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n");
  562. }
  563. BTC_TRACE(trace_buf);
  564. if ((BT_8821C_2ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
  565. (BT_8821C_2ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
  566. (BT_8821C_2ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status))
  567. bt_busy = TRUE;
  568. else
  569. bt_busy = FALSE;
  570. btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
  571. }
  572. void halbtc8821c2ant_update_wifi_channel_info(IN struct btc_coexist *btcoexist,
  573. IN u8 type)
  574. {
  575. u8 h2c_parameter[3] = {0};
  576. u32 wifi_bw;
  577. u8 wifi_central_chnl;
  578. /* only 2.4G we need to inform bt the chnl mask */
  579. btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_CENTRAL_CHNL,
  580. &wifi_central_chnl);
  581. if ((BTC_MEDIA_CONNECT == type) &&
  582. (wifi_central_chnl <= 14)) {
  583. h2c_parameter[0] =
  584. 0x1; /* enable BT AFH skip WL channel for 8821c because BT Rx LO interference */
  585. /* h2c_parameter[0] = 0x0; */
  586. h2c_parameter[1] = wifi_central_chnl;
  587. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
  588. if (BTC_WIFI_BW_HT40 == wifi_bw)
  589. h2c_parameter[2] = 0x30;
  590. else
  591. h2c_parameter[2] = 0x20;
  592. }
  593. coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
  594. coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
  595. coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
  596. btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
  597. }
  598. void halbtc8821c2ant_set_fw_dac_swing_level(IN struct btc_coexist *btcoexist,
  599. IN u8 dac_swing_lvl)
  600. {
  601. u8 h2c_parameter[1] = {0};
  602. /* There are several type of dacswing */
  603. /* 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6 */
  604. h2c_parameter[0] = dac_swing_lvl;
  605. btcoexist->btc_fill_h2c(btcoexist, 0x64, 1, h2c_parameter);
  606. }
  607. void halbtc8821c2ant_fw_dac_swing_lvl(IN struct btc_coexist *btcoexist,
  608. IN boolean force_exec, IN u8 fw_dac_swing_lvl)
  609. {
  610. coex_dm->cur_fw_dac_swing_lvl = fw_dac_swing_lvl;
  611. if (!force_exec) {
  612. if (coex_dm->pre_fw_dac_swing_lvl ==
  613. coex_dm->cur_fw_dac_swing_lvl)
  614. return;
  615. }
  616. halbtc8821c2ant_set_fw_dac_swing_level(btcoexist,
  617. coex_dm->cur_fw_dac_swing_lvl);
  618. coex_dm->pre_fw_dac_swing_lvl = coex_dm->cur_fw_dac_swing_lvl;
  619. }
  620. void halbtc8821c2ant_set_fw_dec_bt_pwr(IN struct btc_coexist *btcoexist,
  621. IN u8 dec_bt_pwr_lvl)
  622. {
  623. u8 h2c_parameter[1] = {0};
  624. h2c_parameter[0] = dec_bt_pwr_lvl;
  625. #if 0
  626. btcoexist->btc_fill_h2c(btcoexist, 0x62, 1, h2c_parameter);
  627. #endif
  628. }
  629. void halbtc8821c2ant_dec_bt_pwr(IN struct btc_coexist *btcoexist,
  630. IN boolean force_exec, IN u8 dec_bt_pwr_lvl)
  631. {
  632. coex_dm->cur_bt_dec_pwr_lvl = dec_bt_pwr_lvl;
  633. if (!force_exec) {
  634. if (coex_dm->pre_bt_dec_pwr_lvl == coex_dm->cur_bt_dec_pwr_lvl)
  635. return;
  636. }
  637. halbtc8821c2ant_set_fw_dec_bt_pwr(btcoexist,
  638. coex_dm->cur_bt_dec_pwr_lvl);
  639. coex_dm->pre_bt_dec_pwr_lvl = coex_dm->cur_bt_dec_pwr_lvl;
  640. }
  641. void halbtc8821c2ant_low_penalty_ra(IN struct btc_coexist *btcoexist,
  642. IN boolean force_exec, IN boolean low_penalty_ra)
  643. {
  644. #if 1
  645. coex_dm->cur_low_penalty_ra = low_penalty_ra;
  646. if (!force_exec) {
  647. if (coex_dm->pre_low_penalty_ra ==
  648. coex_dm->cur_low_penalty_ra)
  649. return;
  650. }
  651. if (low_penalty_ra)
  652. btcoexist->btc_phydm_modify_RA_PCR_threshold(btcoexist, 0, 15);
  653. else
  654. btcoexist->btc_phydm_modify_RA_PCR_threshold(btcoexist, 0, 0);
  655. coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
  656. #endif
  657. }
  658. void halbtc8821c2ant_set_bt_auto_report(IN struct btc_coexist *btcoexist,
  659. IN boolean enable_auto_report)
  660. {
  661. u8 h2c_parameter[1] = {0};
  662. h2c_parameter[0] = 0;
  663. if (enable_auto_report)
  664. h2c_parameter[0] |= BIT(0);
  665. btcoexist->btc_fill_h2c(btcoexist, 0x68, 1, h2c_parameter);
  666. }
  667. void halbtc8821c2ant_bt_auto_report(IN struct btc_coexist *btcoexist,
  668. IN boolean force_exec, IN boolean enable_auto_report)
  669. {
  670. coex_dm->cur_bt_auto_report = enable_auto_report;
  671. if (!force_exec) {
  672. if (coex_dm->pre_bt_auto_report == coex_dm->cur_bt_auto_report)
  673. return;
  674. }
  675. halbtc8821c2ant_set_bt_auto_report(btcoexist,
  676. coex_dm->cur_bt_auto_report);
  677. coex_dm->pre_bt_auto_report = coex_dm->cur_bt_auto_report;
  678. }
  679. void halbtc8821c2ant_write_score_board(
  680. IN struct btc_coexist *btcoexist,
  681. IN u16 bitpos,
  682. IN boolean state
  683. )
  684. {
  685. static u16 originalval = 0x8002;
  686. if (state)
  687. originalval = originalval | bitpos;
  688. else
  689. originalval = originalval & (~bitpos);
  690. btcoexist->btc_write_2byte(btcoexist, 0xaa, originalval);
  691. }
  692. void halbtc8821c2ant_read_score_board(
  693. IN struct btc_coexist *btcoexist,
  694. IN u16 *score_board_val
  695. )
  696. {
  697. *score_board_val = (btcoexist->btc_read_2byte(btcoexist,
  698. 0xaa)) & 0x7fff;
  699. }
  700. void halbtc8821c2ant_post_state_to_bt(
  701. IN struct btc_coexist *btcoexist,
  702. IN u16 type,
  703. IN boolean state
  704. )
  705. {
  706. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  707. "[BTCoex], halbtc8821c2ant_post_state_to_bt: type = %d, state =%d\n",
  708. type, state);
  709. BTC_TRACE(trace_buf);
  710. halbtc8821c2ant_write_score_board(btcoexist, (u16) type, state);
  711. }
  712. boolean halbtc8821c2ant_is_wifibt_status_changed(IN struct btc_coexist
  713. *btcoexist)
  714. {
  715. static boolean pre_wifi_busy = FALSE, pre_under_4way = FALSE,
  716. pre_bt_hs_on = FALSE, pre_bt_off = FALSE,
  717. pre_bt_slave = FALSE, pre_hid_low_pri_tx_overhead = FALSE,
  718. pre_wifi_under_lps = FALSE;
  719. static u8 pre_hid_busy_num = 0, pre_wl_noisy_level = 0,
  720. pre_bt_setup_link = FALSE;
  721. boolean wifi_busy = FALSE, under_4way = FALSE, bt_hs_on = FALSE;
  722. boolean wifi_connected = FALSE;
  723. struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
  724. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
  725. &wifi_connected);
  726. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
  727. btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
  728. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
  729. &under_4way);
  730. if (coex_sta->bt_disabled != pre_bt_off) {
  731. pre_bt_off = coex_sta->bt_disabled;
  732. if (coex_sta->bt_disabled)
  733. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  734. "[BTCoex], BT is disabled !!\n");
  735. else
  736. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  737. "[BTCoex], BT is enabled !!\n");
  738. BTC_TRACE(trace_buf);
  739. coex_sta->bt_coex_supported_feature = 0;
  740. coex_sta->bt_coex_supported_version = 0;
  741. coex_sta->bt_ble_scan_type = 0;
  742. coex_sta->bt_ble_scan_para[0] = 0;
  743. coex_sta->bt_ble_scan_para[1] = 0;
  744. coex_sta->bt_ble_scan_para[2] = 0;
  745. coex_sta->bt_reg_vendor_ac = 0xffff;
  746. coex_sta->bt_reg_vendor_ae = 0xffff;
  747. return TRUE;
  748. }
  749. if (wifi_connected) {
  750. if (wifi_busy != pre_wifi_busy) {
  751. pre_wifi_busy = wifi_busy;
  752. if (wifi_busy)
  753. halbtc8821c2ant_post_state_to_bt(btcoexist,
  754. BT_8821C_2ANT_SCOREBOARD_UNDERTEST, TRUE);
  755. else
  756. halbtc8821c2ant_post_state_to_bt(btcoexist,
  757. BT_8821C_2ANT_SCOREBOARD_UNDERTEST, FALSE);
  758. return TRUE;
  759. }
  760. if (under_4way != pre_under_4way) {
  761. pre_under_4way = under_4way;
  762. return TRUE;
  763. }
  764. if (bt_hs_on != pre_bt_hs_on) {
  765. pre_bt_hs_on = bt_hs_on;
  766. return TRUE;
  767. }
  768. if (coex_sta->wl_noisy_level != pre_wl_noisy_level) {
  769. pre_wl_noisy_level = coex_sta->wl_noisy_level;
  770. return TRUE;
  771. }
  772. if (coex_sta->under_lps != pre_wifi_under_lps) {
  773. pre_wifi_under_lps = coex_sta->under_lps;
  774. if (coex_sta->under_lps == TRUE)
  775. return TRUE;
  776. }
  777. }
  778. if (!coex_sta->bt_disabled) {
  779. if (coex_sta->hid_busy_num != pre_hid_busy_num) {
  780. pre_hid_busy_num = coex_sta->hid_busy_num;
  781. return TRUE;
  782. }
  783. if (bt_link_info->slave_role != pre_bt_slave) {
  784. pre_bt_slave = bt_link_info->slave_role;
  785. return TRUE;
  786. }
  787. if (pre_hid_low_pri_tx_overhead != coex_sta->is_hid_low_pri_tx_overhead) {
  788. pre_hid_low_pri_tx_overhead = coex_sta->is_hid_low_pri_tx_overhead;
  789. return TRUE;
  790. }
  791. if (pre_bt_setup_link != coex_sta->is_setupLink) {
  792. pre_bt_setup_link = coex_sta->is_setupLink;
  793. return TRUE;
  794. }
  795. }
  796. return FALSE;
  797. }
  798. void halbtc8821c2ant_monitor_bt_enable_disable(IN struct btc_coexist *btcoexist)
  799. {
  800. static u32 bt_disable_cnt = 0;
  801. boolean bt_active = TRUE, bt_disabled = FALSE, wifi_under_5g = FALSE;
  802. u16 u16tmp;
  803. /* This function check if bt is disabled */
  804. #if 0
  805. if (coex_sta->high_priority_tx == 0 &&
  806. coex_sta->high_priority_rx == 0 &&
  807. coex_sta->low_priority_tx == 0 &&
  808. coex_sta->low_priority_rx == 0)
  809. bt_active = FALSE;
  810. if (coex_sta->high_priority_tx == 0xffff &&
  811. coex_sta->high_priority_rx == 0xffff &&
  812. coex_sta->low_priority_tx == 0xffff &&
  813. coex_sta->low_priority_rx == 0xffff)
  814. bt_active = FALSE;
  815. #else
  816. /* Read BT on/off status from scoreboard[1], enable this only if BT patch support this feature */
  817. halbtc8821c2ant_read_score_board(btcoexist, &u16tmp);
  818. bt_active = u16tmp & BIT(1);
  819. #endif
  820. if (bt_active) {
  821. bt_disable_cnt = 0;
  822. bt_disabled = FALSE;
  823. btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
  824. &bt_disabled);
  825. } else {
  826. bt_disable_cnt++;
  827. if (bt_disable_cnt >= 2) {
  828. bt_disabled = TRUE;
  829. bt_disable_cnt = 2;
  830. }
  831. btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_DISABLE,
  832. &bt_disabled);
  833. }
  834. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
  835. if ((wifi_under_5g) || (bt_disabled))
  836. halbtc8821c2ant_low_penalty_ra(btcoexist, NORMAL_EXEC, FALSE);
  837. else
  838. halbtc8821c2ant_low_penalty_ra(btcoexist, NORMAL_EXEC, TRUE);
  839. if (coex_sta->bt_disabled != bt_disabled) {
  840. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  841. "[BTCoex], BT is from %s to %s!!\n",
  842. (coex_sta->bt_disabled ? "disabled" : "enabled"),
  843. (bt_disabled ? "disabled" : "enabled"));
  844. BTC_TRACE(trace_buf);
  845. coex_sta->bt_disabled = bt_disabled;
  846. }
  847. }
  848. void halbtc8821c2ant_enable_gnt_to_gpio(IN struct btc_coexist *btcoexist,
  849. boolean isenable)
  850. {
  851. #if BT_8821C_2ANT_COEX_DBG
  852. static u8 bitVal[5] = {0, 0, 0, 0, 0};
  853. static boolean state = FALSE;
  854. /*
  855. if (state ==isenable)
  856. return;
  857. else
  858. state = isenable;
  859. */
  860. if (isenable) {
  861. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  862. "[BTCoex], enable_gnt_to_gpio!!\n");
  863. BTC_TRACE(trace_buf);
  864. /* enable GNT_WL, GNT_BT to GPIO for debug */
  865. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x73, 0x8, 0x1);
  866. /* store original value */
  867. bitVal[0] = (btcoexist->btc_read_1byte(btcoexist,
  868. 0x66) & BIT(4)) >> 4; /*0x66[4] */
  869. bitVal[1] = (btcoexist->btc_read_1byte(btcoexist,
  870. 0x67) & BIT(0)); /*0x66[8] */
  871. bitVal[2] = (btcoexist->btc_read_1byte(btcoexist,
  872. 0x42) & BIT(3)) >> 3; /*0x40[19] */
  873. bitVal[3] = (btcoexist->btc_read_1byte(btcoexist,
  874. 0x65) & BIT(7)) >> 7; /*0x64[15] */
  875. bitVal[4] = (btcoexist->btc_read_1byte(btcoexist,
  876. 0x72) & BIT(2)) >> 2; /*0x70[18] */
  877. /* switch GPIO Mux */
  878. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x66, BIT(4),
  879. 0x0); /*0x66[4] = 0 */
  880. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, BIT(0),
  881. 0x0); /*0x66[8] = 0 */
  882. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x42, BIT(3),
  883. 0x0); /*0x40[19] = 0 */
  884. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x65, BIT(7),
  885. 0x0); /*0x64[15] = 0 */
  886. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x72, BIT(2),
  887. 0x0); /*0x70[18] = 0 */
  888. } else {
  889. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  890. "[BTCoex], disable_gnt_to_gpio!!\n");
  891. BTC_TRACE(trace_buf);
  892. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x73, 0x8, 0x0);
  893. /* Restore original value */
  894. /* switch GPIO Mux */
  895. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x66, BIT(4),
  896. bitVal[0]); /*0x66[4] = 0 */
  897. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, BIT(0),
  898. bitVal[1]); /*0x66[8] = 0 */
  899. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x42, BIT(3),
  900. bitVal[2]); /*0x40[19] = 0 */
  901. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x65, BIT(7),
  902. bitVal[3]); /*0x64[15] = 0 */
  903. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x72, BIT(2),
  904. bitVal[4]); /*0x70[18] = 0 */
  905. }
  906. #endif
  907. }
  908. u32 halbtc8821c2ant_ltecoex_indirect_read_reg(IN struct btc_coexist *btcoexist,
  909. IN u16 reg_addr)
  910. {
  911. u32 j = 0, delay_count = 0;
  912. while (1) {
  913. if ((btcoexist->btc_read_1byte(btcoexist, 0x1703)&BIT(5)) == 0) {
  914. delay_ms(50);
  915. delay_count++;
  916. if (delay_count >= 10) {
  917. delay_count = 0;
  918. break;
  919. }
  920. } else
  921. break;
  922. }
  923. /* wait for ready bit before access 0x1700 */
  924. btcoexist->btc_write_4byte(btcoexist, 0x1700, 0x800F0000 | reg_addr);
  925. return btcoexist->btc_read_4byte(btcoexist,
  926. 0x1708); /* get read data */
  927. }
  928. void halbtc8821c2ant_ltecoex_indirect_write_reg(IN struct btc_coexist
  929. *btcoexist,
  930. IN u16 reg_addr, IN u32 bit_mask, IN u32 reg_value)
  931. {
  932. u32 val, i = 0, j = 0, bitpos = 0, delay_count = 0;
  933. if (bit_mask == 0x0)
  934. return;
  935. if (bit_mask == 0xffffffff) {
  936. /* wait for ready bit before access 0x1700/0x1704 */
  937. while (1) {
  938. if ((btcoexist->btc_read_1byte(btcoexist, 0x1703)&BIT(5)) == 0) {
  939. delay_ms(50);
  940. delay_count++;
  941. if (delay_count >= 10) {
  942. delay_count = 0;
  943. break;
  944. }
  945. } else
  946. break;
  947. }
  948. btcoexist->btc_write_4byte(btcoexist, 0x1704,
  949. reg_value); /* put write data */
  950. btcoexist->btc_write_4byte(btcoexist, 0x1700,
  951. 0xc00F0000 | reg_addr);
  952. } else {
  953. for (i = 0; i <= 31; i++) {
  954. if (((bit_mask >> i) & 0x1) == 0x1) {
  955. bitpos = i;
  956. break;
  957. }
  958. }
  959. /* read back register value before write */
  960. val = halbtc8821c2ant_ltecoex_indirect_read_reg(btcoexist,
  961. reg_addr);
  962. val = (val & (~bit_mask)) | (reg_value << bitpos);
  963. /* wait for ready bit before access 0x1700/0x1704 */
  964. while (1) {
  965. if ((btcoexist->btc_read_1byte(btcoexist, 0x1703)&BIT(5)) == 0) {
  966. delay_ms(50);
  967. delay_count++;
  968. if (delay_count >= 10) {
  969. delay_count = 0;
  970. break;
  971. }
  972. } else
  973. break;
  974. }
  975. btcoexist->btc_write_4byte(btcoexist, 0x1704,
  976. val); /* put write data */
  977. btcoexist->btc_write_4byte(btcoexist, 0x1700,
  978. 0xc00F0000 | reg_addr);
  979. }
  980. }
  981. void halbtc8821c2ant_ltecoex_enable(IN struct btc_coexist *btcoexist,
  982. IN boolean enable)
  983. {
  984. u8 val;
  985. val = (enable) ? 1 : 0;
  986. halbtc8821c2ant_ltecoex_indirect_write_reg(btcoexist, 0x38, 0x80,
  987. val); /* 0x38[7] */
  988. }
  989. void halbtc8821c2ant_ltecoex_pathcontrol_owner(IN struct btc_coexist *btcoexist,
  990. IN boolean wifi_control)
  991. {
  992. u8 val;
  993. val = (wifi_control) ? 1 : 0;
  994. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x73, 0x4,
  995. val); /* 0x70[26] */
  996. }
  997. void halbtc8821c2ant_ltecoex_set_gnt_bt(IN struct btc_coexist *btcoexist,
  998. IN u8 control_block, IN boolean sw_control, IN u8 state)
  999. {
  1000. u32 val = 0, val_orig = 0;
  1001. if (!sw_control)
  1002. val = 0x0;
  1003. else if (state & 0x1)
  1004. val = 0x3;
  1005. else
  1006. val = 0x1;
  1007. val_orig = halbtc8821c2ant_ltecoex_indirect_read_reg(btcoexist,
  1008. 0x38);
  1009. switch (control_block) {
  1010. case BT_8821C_2ANT_GNT_BLOCK_RFC_BB:
  1011. default:
  1012. val = ((val << 14) | (val << 10)) | (val_orig & 0xffff33ff);
  1013. break;
  1014. case BT_8821C_2ANT_GNT_BLOCK_RFC:
  1015. val = (val << 14) | (val_orig & 0xffff3fff);
  1016. break;
  1017. case BT_8821C_2ANT_GNT_BLOCK_BB:
  1018. val = (val << 10) | (val_orig & 0xfffff3ff);
  1019. break;
  1020. }
  1021. halbtc8821c2ant_ltecoex_indirect_write_reg(btcoexist,
  1022. 0x38, 0xffffffff, val);
  1023. }
  1024. void halbtc8821c2ant_ltecoex_set_gnt_wl(IN struct btc_coexist *btcoexist,
  1025. IN u8 control_block, IN boolean sw_control, IN u8 state)
  1026. {
  1027. u32 val = 0, val_orig = 0;
  1028. if (!sw_control)
  1029. val = 0x0;
  1030. else if (state & 0x1)
  1031. val = 0x3;
  1032. else
  1033. val = 0x1;
  1034. val_orig = halbtc8821c2ant_ltecoex_indirect_read_reg(btcoexist,
  1035. 0x38);
  1036. switch (control_block) {
  1037. case BT_8821C_2ANT_GNT_BLOCK_RFC_BB:
  1038. default:
  1039. val = ((val << 12) | (val << 8)) | (val_orig & 0xffffccff);
  1040. break;
  1041. case BT_8821C_2ANT_GNT_BLOCK_RFC:
  1042. val = (val << 12) | (val_orig & 0xffffcfff);
  1043. break;
  1044. case BT_8821C_2ANT_GNT_BLOCK_BB:
  1045. val = (val << 8) | (val_orig & 0xfffffcff);
  1046. break;
  1047. }
  1048. halbtc8821c2ant_ltecoex_indirect_write_reg(btcoexist,
  1049. 0x38, 0xffffffff, val);
  1050. }
  1051. void halbtc8821c2ant_ltecoex_set_coex_table(IN struct btc_coexist *btcoexist,
  1052. IN u8 table_type, IN u16 table_content)
  1053. {
  1054. u16 reg_addr = 0x0000;
  1055. switch (table_type) {
  1056. case BT_8821C_2ANT_CTT_WL_VS_LTE:
  1057. reg_addr = 0xa0;
  1058. break;
  1059. case BT_8821C_2ANT_CTT_BT_VS_LTE:
  1060. reg_addr = 0xa4;
  1061. break;
  1062. }
  1063. if (reg_addr != 0x0000)
  1064. halbtc8821c2ant_ltecoex_indirect_write_reg(btcoexist, reg_addr,
  1065. 0xffff, table_content); /* 0xa0[15:0] or 0xa4[15:0] */
  1066. }
  1067. void halbtc8821c2ant_ltecoex_set_break_table(IN struct btc_coexist *btcoexist,
  1068. IN u8 table_type, IN u8 table_content)
  1069. {
  1070. u16 reg_addr = 0x0000;
  1071. switch (table_type) {
  1072. case BT_8821C_2ANT_LBTT_WL_BREAK_LTE:
  1073. reg_addr = 0xa8;
  1074. break;
  1075. case BT_8821C_2ANT_LBTT_BT_BREAK_LTE:
  1076. reg_addr = 0xac;
  1077. break;
  1078. case BT_8821C_2ANT_LBTT_LTE_BREAK_WL:
  1079. reg_addr = 0xb0;
  1080. break;
  1081. case BT_8821C_2ANT_LBTT_LTE_BREAK_BT:
  1082. reg_addr = 0xb4;
  1083. break;
  1084. }
  1085. if (reg_addr != 0x0000)
  1086. halbtc8821c2ant_ltecoex_indirect_write_reg(btcoexist, reg_addr,
  1087. 0xff, table_content); /* 0xa8[15:0] or 0xb4[15:0] */
  1088. }
  1089. void halbtc8821c2ant_set_wltoggle_coex_table(IN struct btc_coexist *btcoexist,
  1090. IN boolean force_exec, IN u8 interval,
  1091. IN u8 val0x6c4_b0, IN u8 val0x6c4_b1, IN u8 val0x6c4_b2,
  1092. IN u8 val0x6c4_b3)
  1093. {
  1094. static u8 pre_h2c_parameter[6] = {0};
  1095. u8 cur_h2c_parameter[6] = {0};
  1096. u8 i, match_cnt = 0;
  1097. cur_h2c_parameter[0] = 0x7; /* op_code, 0x7= wlan toggle slot*/
  1098. cur_h2c_parameter[1] = interval;
  1099. cur_h2c_parameter[2] = val0x6c4_b0;
  1100. cur_h2c_parameter[3] = val0x6c4_b1;
  1101. cur_h2c_parameter[4] = val0x6c4_b2;
  1102. cur_h2c_parameter[5] = val0x6c4_b3;
  1103. if (!force_exec) {
  1104. for (i = 1; i <= 5; i++) {
  1105. if (cur_h2c_parameter[i] != pre_h2c_parameter[i])
  1106. break;
  1107. match_cnt++;
  1108. }
  1109. if (match_cnt == 5)
  1110. return;
  1111. }
  1112. for (i = 1; i <= 5; i++)
  1113. pre_h2c_parameter[i] = cur_h2c_parameter[i];
  1114. btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, cur_h2c_parameter);
  1115. }
  1116. void halbtc8821c2ant_set_coex_table(IN struct btc_coexist *btcoexist,
  1117. IN u32 val0x6c0, IN u32 val0x6c4, IN u32 val0x6c8, IN u8 val0x6cc)
  1118. {
  1119. btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
  1120. btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
  1121. btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
  1122. btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
  1123. }
  1124. void halbtc8821c2ant_coex_table(IN struct btc_coexist *btcoexist,
  1125. IN boolean force_exec, IN u32 val0x6c0, IN u32 val0x6c4,
  1126. IN u32 val0x6c8, IN u8 val0x6cc)
  1127. {
  1128. coex_dm->cur_val0x6c0 = val0x6c0;
  1129. coex_dm->cur_val0x6c4 = val0x6c4;
  1130. coex_dm->cur_val0x6c8 = val0x6c8;
  1131. coex_dm->cur_val0x6cc = val0x6cc;
  1132. if (!force_exec) {
  1133. if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) &&
  1134. (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) &&
  1135. (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) &&
  1136. (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc))
  1137. return;
  1138. }
  1139. halbtc8821c2ant_set_coex_table(btcoexist, val0x6c0, val0x6c4, val0x6c8,
  1140. val0x6cc);
  1141. coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0;
  1142. coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4;
  1143. coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8;
  1144. coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc;
  1145. }
  1146. void halbtc8821c2ant_coex_table_with_type(IN struct btc_coexist *btcoexist,
  1147. IN boolean force_exec, IN u8 type)
  1148. {
  1149. u32 break_table;
  1150. u8 select_table;
  1151. coex_sta->coex_table_type = type;
  1152. if (coex_sta->concurrent_rx_mode_on == TRUE) {
  1153. break_table = 0xf0ffffff; /* set WL hi-pri can break BT */
  1154. select_table =
  1155. 0xb; /* set Tx response = Hi-Pri (ex: Transmitting ACK,BA,CTS) */
  1156. } else {
  1157. break_table = 0xffffff;
  1158. select_table = 0x3;
  1159. }
  1160. switch (type) {
  1161. case 0:
  1162. halbtc8821c2ant_coex_table(btcoexist, force_exec,
  1163. 0xffffffff, 0xffffffff, break_table, select_table);
  1164. break;
  1165. case 1:
  1166. halbtc8821c2ant_coex_table(btcoexist, force_exec,
  1167. 0x55555555, 0x5a5a5a5a, break_table, select_table);
  1168. break;
  1169. case 2:
  1170. halbtc8821c2ant_coex_table(btcoexist, force_exec,
  1171. 0x5a5a5a5a, 0x5a5a5a5a, break_table, select_table);
  1172. break;
  1173. case 3:
  1174. halbtc8821c2ant_coex_table(btcoexist, force_exec,
  1175. 0x55555555, 0x5a5a5a5a, break_table, select_table);
  1176. break;
  1177. case 4:
  1178. halbtc8821c2ant_coex_table(btcoexist, force_exec,
  1179. 0x55555555, 0x5a5a5a5a, break_table, select_table);
  1180. break;
  1181. case 5:
  1182. halbtc8821c2ant_coex_table(btcoexist, force_exec,
  1183. 0x55555555, 0x55555555, break_table, select_table);
  1184. break;
  1185. case 6:
  1186. halbtc8821c2ant_coex_table(btcoexist, force_exec,
  1187. 0xa5555555, 0xfafafafa, break_table, select_table);
  1188. break;
  1189. case 7:
  1190. halbtc8821c2ant_coex_table(btcoexist, force_exec,
  1191. 0xa5555555, 0xaa5a5a5a, break_table, select_table);
  1192. break;
  1193. case 8:
  1194. halbtc8821c2ant_coex_table(btcoexist, force_exec,
  1195. 0x55555555, 0xfafa5afa, break_table, select_table);
  1196. break;
  1197. case 9:
  1198. halbtc8821c2ant_coex_table(btcoexist, force_exec,
  1199. 0x5a5a5a5a, 0xaaaa5aaa, break_table, select_table);
  1200. break;
  1201. default:
  1202. break;
  1203. }
  1204. }
  1205. void halbtc8821c2ant_set_fw_ignore_wlan_act(IN struct btc_coexist *btcoexist,
  1206. IN boolean enable)
  1207. {
  1208. u8 h2c_parameter[1] = {0};
  1209. if (enable) {
  1210. h2c_parameter[0] |= BIT(0); /* function enable */
  1211. }
  1212. btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
  1213. }
  1214. void halbtc8821c2ant_ignore_wlan_act(IN struct btc_coexist *btcoexist,
  1215. IN boolean force_exec, IN boolean enable)
  1216. {
  1217. coex_dm->cur_ignore_wlan_act = enable;
  1218. if (!force_exec) {
  1219. if (coex_dm->pre_ignore_wlan_act ==
  1220. coex_dm->cur_ignore_wlan_act)
  1221. return;
  1222. }
  1223. halbtc8821c2ant_set_fw_ignore_wlan_act(btcoexist, enable);
  1224. coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
  1225. }
  1226. void halbtc8821c2ant_set_lps_rpwm(IN struct btc_coexist *btcoexist,
  1227. IN u8 lps_val, IN u8 rpwm_val)
  1228. {
  1229. u8 lps = lps_val;
  1230. u8 rpwm = rpwm_val;
  1231. btcoexist->btc_set(btcoexist, BTC_SET_U1_LPS_VAL, &lps);
  1232. btcoexist->btc_set(btcoexist, BTC_SET_U1_RPWM_VAL, &rpwm);
  1233. }
  1234. void halbtc8821c2ant_lps_rpwm(IN struct btc_coexist *btcoexist,
  1235. IN boolean force_exec, IN u8 lps_val, IN u8 rpwm_val)
  1236. {
  1237. coex_dm->cur_lps = lps_val;
  1238. coex_dm->cur_rpwm = rpwm_val;
  1239. if (!force_exec) {
  1240. if ((coex_dm->pre_lps == coex_dm->cur_lps) &&
  1241. (coex_dm->pre_rpwm == coex_dm->cur_rpwm))
  1242. return;
  1243. }
  1244. halbtc8821c2ant_set_lps_rpwm(btcoexist, lps_val, rpwm_val);
  1245. coex_dm->pre_lps = coex_dm->cur_lps;
  1246. coex_dm->pre_rpwm = coex_dm->cur_rpwm;
  1247. }
  1248. void halbtc8821c2ant_ps_tdma_check_for_power_save_state(
  1249. IN struct btc_coexist *btcoexist, IN boolean new_ps_state)
  1250. {
  1251. u8 lps_mode = 0x0;
  1252. u8 h2c_parameter[5] = {0, 0, 0, 0x40, 0};
  1253. btcoexist->btc_get(btcoexist, BTC_GET_U1_LPS_MODE, &lps_mode);
  1254. if (lps_mode) { /* already under LPS state */
  1255. if (new_ps_state) {
  1256. /* keep state under LPS, do nothing. */
  1257. } else {
  1258. /* will leave LPS state, turn off psTdma first */
  1259. /*halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE,
  1260. 8); */
  1261. btcoexist->btc_fill_h2c(btcoexist, 0x60, 5,
  1262. h2c_parameter);
  1263. }
  1264. } else { /* NO PS state */
  1265. if (new_ps_state) {
  1266. /* will enter LPS state, turn off psTdma first */
  1267. /*halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE,
  1268. 8);*/
  1269. btcoexist->btc_fill_h2c(btcoexist, 0x60, 5,
  1270. h2c_parameter);
  1271. } else {
  1272. /* keep state under NO PS state, do nothing. */
  1273. }
  1274. }
  1275. }
  1276. boolean halbtc8821c2ant_power_save_state(IN struct btc_coexist *btcoexist,
  1277. IN u8 ps_type, IN u8 lps_val, IN u8 rpwm_val)
  1278. {
  1279. boolean low_pwr_disable = FALSE, result = TRUE;
  1280. switch (ps_type) {
  1281. case BTC_PS_WIFI_NATIVE:
  1282. coex_sta->force_lps_ctrl = FALSE;
  1283. /* recover to original 32k low power setting */
  1284. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  1285. "[BTCoex], halbtc8821c2ant_power_save_state == BTC_PS_WIFI_NATIVE\n");
  1286. BTC_TRACE(trace_buf);
  1287. low_pwr_disable = FALSE;
  1288. btcoexist->btc_set(btcoexist,
  1289. BTC_SET_ACT_DISABLE_LOW_POWER,
  1290. &low_pwr_disable);
  1291. btcoexist->btc_set(btcoexist, BTC_SET_ACT_NORMAL_LPS,
  1292. NULL);
  1293. break;
  1294. case BTC_PS_LPS_ON:
  1295. coex_sta->force_lps_ctrl = TRUE;
  1296. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  1297. "[BTCoex], halbtc8821c2ant_power_save_state == BTC_PS_LPS_ON\n");
  1298. BTC_TRACE(trace_buf);
  1299. halbtc8821c2ant_ps_tdma_check_for_power_save_state(
  1300. btcoexist, TRUE);
  1301. halbtc8821c2ant_lps_rpwm(btcoexist, NORMAL_EXEC,
  1302. lps_val, rpwm_val);
  1303. /* when coex force to enter LPS, do not enter 32k low power. */
  1304. low_pwr_disable = TRUE;
  1305. btcoexist->btc_set(btcoexist,
  1306. BTC_SET_ACT_DISABLE_LOW_POWER,
  1307. &low_pwr_disable);
  1308. /* power save must executed before psTdma. */
  1309. btcoexist->btc_set(btcoexist, BTC_SET_ACT_ENTER_LPS,
  1310. NULL);
  1311. break;
  1312. case BTC_PS_LPS_OFF:
  1313. coex_sta->force_lps_ctrl = TRUE;
  1314. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  1315. "[BTCoex], halbtc8821c2ant_power_save_state == BTC_PS_LPS_OFF\n");
  1316. BTC_TRACE(trace_buf);
  1317. halbtc8821c2ant_ps_tdma_check_for_power_save_state(
  1318. btcoexist, FALSE);
  1319. result = btcoexist->btc_set(btcoexist, BTC_SET_ACT_LEAVE_LPS,
  1320. NULL);
  1321. break;
  1322. default:
  1323. break;
  1324. }
  1325. return result;
  1326. }
  1327. void halbtc8821c2ant_set_fw_pstdma(IN struct btc_coexist *btcoexist,
  1328. IN u8 byte1, IN u8 byte2, IN u8 byte3, IN u8 byte4, IN u8 byte5)
  1329. {
  1330. u8 h2c_parameter[5] = {0};
  1331. u8 real_byte1 = byte1, real_byte5 = byte5;
  1332. boolean ap_enable = FALSE, result = FALSE;
  1333. struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
  1334. if (byte5 & BIT(2))
  1335. coex_sta->is_tdma_btautoslot = TRUE;
  1336. else
  1337. coex_sta->is_tdma_btautoslot = FALSE;
  1338. /* release bt-auto slot for auto-slot hang is detected!! */
  1339. if (coex_sta->is_tdma_btautoslot)
  1340. if ((coex_sta->is_tdma_btautoslot_hang) ||
  1341. (bt_link_info->slave_role))
  1342. byte5 = byte5 & 0xfb;
  1343. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE,
  1344. &ap_enable);
  1345. if ((ap_enable) && (byte1 & BIT(4) && !(byte1 & BIT(5)))) {
  1346. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  1347. "[BTCoex], halbtc8821c2ant_set_fw_pstdma == FW for AP mode\n");
  1348. BTC_TRACE(trace_buf);
  1349. real_byte1 &= ~BIT(4);
  1350. real_byte1 |= BIT(5);
  1351. real_byte5 |= BIT(5);
  1352. real_byte5 &= ~BIT(6);
  1353. halbtc8821c2ant_power_save_state(btcoexist,
  1354. BTC_PS_WIFI_NATIVE, 0x0, 0x0);
  1355. } else if (byte1 & BIT(4) && !(byte1 & BIT(5))) {
  1356. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  1357. "[BTCoex], halbtc8821c2ant_set_fw_pstdma == Force LPS Leave (byte1 = 0x%x)\n", byte1);
  1358. BTC_TRACE(trace_buf);
  1359. #if 0
  1360. halbtc8821c2ant_power_save_state(
  1361. btcoexist, BTC_PS_LPS_ON, 0x50, 0x4);
  1362. #endif
  1363. if (!halbtc8821c2ant_power_save_state(btcoexist, BTC_PS_LPS_OFF, 0x50, 0x4))
  1364. result = TRUE;
  1365. } else {
  1366. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  1367. "[BTCoex], halbtc8821c2ant_set_fw_pstdma == Native LPS (byte1 = 0x%x)\n", byte1);
  1368. BTC_TRACE(trace_buf);
  1369. halbtc8821c2ant_power_save_state(btcoexist, BTC_PS_WIFI_NATIVE,
  1370. 0x0,
  1371. 0x0);
  1372. }
  1373. coex_sta->is_set_ps_state_fail = result;
  1374. if (!coex_sta->is_set_ps_state_fail) {
  1375. h2c_parameter[0] = real_byte1;
  1376. h2c_parameter[1] = byte2;
  1377. h2c_parameter[2] = byte3;
  1378. h2c_parameter[3] = byte4;
  1379. h2c_parameter[4] = real_byte5;
  1380. coex_dm->ps_tdma_para[0] = real_byte1;
  1381. coex_dm->ps_tdma_para[1] = byte2;
  1382. coex_dm->ps_tdma_para[2] = byte3;
  1383. coex_dm->ps_tdma_para[3] = byte4;
  1384. coex_dm->ps_tdma_para[4] = real_byte5;
  1385. btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
  1386. } else {
  1387. coex_sta->cnt_set_ps_state_fail++;
  1388. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  1389. "[BTCoex], halbtc8821c2ant_set_fw_pstdma == Force Leave LPS Fail (cnt = %d)\n",
  1390. coex_sta->cnt_set_ps_state_fail);
  1391. BTC_TRACE(trace_buf);
  1392. }
  1393. }
  1394. void halbtc8821c2ant_ps_tdma(IN struct btc_coexist *btcoexist,
  1395. IN boolean force_exec, IN boolean turn_on, IN u8 type)
  1396. {
  1397. static u8 psTdmaByte4Modify = 0x0, pre_psTdmaByte4Modify = 0x0;
  1398. struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
  1399. coex_dm->cur_ps_tdma_on = turn_on;
  1400. coex_dm->cur_ps_tdma = type;
  1401. /* 0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) */
  1402. if (bt_link_info->slave_role)
  1403. psTdmaByte4Modify = 0x1;
  1404. else
  1405. psTdmaByte4Modify = 0x0;
  1406. if (pre_psTdmaByte4Modify != psTdmaByte4Modify) {
  1407. force_exec = TRUE;
  1408. pre_psTdmaByte4Modify = psTdmaByte4Modify;
  1409. }
  1410. if (!force_exec) {
  1411. if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
  1412. (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma)) {
  1413. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  1414. "[BTCoex], Skip TDMA because no change TDMA(%s, %d)\n",
  1415. (coex_dm->cur_ps_tdma_on ? "on" : "off"),
  1416. coex_dm->cur_ps_tdma);
  1417. BTC_TRACE(trace_buf);
  1418. return;
  1419. }
  1420. }
  1421. if (coex_dm->cur_ps_tdma_on) {
  1422. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  1423. "[BTCoex], ********** TDMA(on, %d) **********\n",
  1424. coex_dm->cur_ps_tdma);
  1425. BTC_TRACE(trace_buf);
  1426. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x550, 0x8,
  1427. 0x1); /* enable TBTT nterrupt */
  1428. } else {
  1429. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  1430. "[BTCoex], ********** TDMA(off, %d) **********\n",
  1431. coex_dm->cur_ps_tdma);
  1432. BTC_TRACE(trace_buf);
  1433. }
  1434. if (turn_on) {
  1435. switch (type) {
  1436. case 1:
  1437. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x61,
  1438. 0x10, 0x03, 0x91,
  1439. 0x54 | psTdmaByte4Modify);
  1440. break;
  1441. case 2:
  1442. default:
  1443. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x61,
  1444. 0x35, 0x03, 0x11,
  1445. 0x11 | psTdmaByte4Modify);
  1446. break;
  1447. case 3:
  1448. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x61,
  1449. 0x30, 0x3, 0x91,
  1450. 0x10 | psTdmaByte4Modify);
  1451. break;
  1452. case 4:
  1453. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x61,
  1454. 0x21, 0x3, 0x91,
  1455. 0x10 | psTdmaByte4Modify);
  1456. break;
  1457. case 5:
  1458. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x61,
  1459. 0x25, 0x3, 0x91,
  1460. 0x10 | psTdmaByte4Modify);
  1461. break;
  1462. case 6:
  1463. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x61,
  1464. 0x10, 0x3, 0x91,
  1465. 0x10 | psTdmaByte4Modify);
  1466. break;
  1467. case 7:
  1468. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x61,
  1469. 0x20, 0x3, 0x91,
  1470. 0x10 | psTdmaByte4Modify);
  1471. break;
  1472. case 8:
  1473. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x61,
  1474. 0x15, 0x03, 0x11,
  1475. 0x11);
  1476. break;
  1477. case 10:
  1478. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x61,
  1479. 0x30, 0x03, 0x11,
  1480. 0x10);
  1481. break;
  1482. case 11:
  1483. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x61,
  1484. 0x35, 0x03, 0x11,
  1485. 0x10 | psTdmaByte4Modify);
  1486. break;
  1487. case 12:
  1488. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x61,
  1489. 0x35, 0x03, 0x11, 0x11);
  1490. break;
  1491. case 13:
  1492. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x61,
  1493. 0x1c, 0x03, 0x11,
  1494. 0x10 | psTdmaByte4Modify);
  1495. break;
  1496. case 14:
  1497. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x61,
  1498. 0x20, 0x03, 0x11,
  1499. 0x11);
  1500. break;
  1501. case 15:
  1502. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x61,
  1503. 0x10, 0x03, 0x11,
  1504. 0x14);
  1505. break;
  1506. case 16:
  1507. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x61,
  1508. 0x10, 0x03, 0x11,
  1509. 0x15);
  1510. break;
  1511. case 21:
  1512. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x61,
  1513. 0x30, 0x03, 0x11,
  1514. 0x10);
  1515. break;
  1516. case 22:
  1517. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x61,
  1518. 0x25, 0x03, 0x11,
  1519. 0x10);
  1520. break;
  1521. case 23:
  1522. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x61,
  1523. 0x10, 0x03, 0x11,
  1524. 0x10);
  1525. break;
  1526. case 51:
  1527. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x61,
  1528. 0x10, 0x03, 0x91,
  1529. 0x10 | psTdmaByte4Modify);
  1530. break;
  1531. case 101:
  1532. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x51,
  1533. 0x10, 0x03, 0x10,
  1534. 0x54 | psTdmaByte4Modify);
  1535. break;
  1536. case 102:
  1537. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x61,
  1538. 0x35, 0x03, 0x11,
  1539. 0x11 | psTdmaByte4Modify);
  1540. break;
  1541. case 103:
  1542. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x51,
  1543. 0x30, 0x3, 0x10,
  1544. 0x50 | psTdmaByte4Modify);
  1545. break;
  1546. case 104:
  1547. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x51,
  1548. 0x21, 0x3, 0x10,
  1549. 0x50 | psTdmaByte4Modify);
  1550. break;
  1551. case 105:
  1552. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x51,
  1553. 0x30, 0x3, 0x10,
  1554. 0x50 | psTdmaByte4Modify);
  1555. break;
  1556. case 106:
  1557. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x51,
  1558. 0x10, 0x3, 0x10,
  1559. 0x50 | psTdmaByte4Modify);
  1560. break;
  1561. case 107:
  1562. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x51,
  1563. 0x10, 0x7, 0x10,
  1564. 0x54 | psTdmaByte4Modify);
  1565. break;
  1566. case 108:
  1567. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x51,
  1568. 0x30, 0x3, 0x10,
  1569. 0x50 | psTdmaByte4Modify);
  1570. break;
  1571. case 109:
  1572. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x51,
  1573. 0x10, 0x03, 0x10,
  1574. 0x54 | psTdmaByte4Modify);
  1575. break;
  1576. case 110:
  1577. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x51,
  1578. 0x30, 0x03, 0x10,
  1579. 0x50 | psTdmaByte4Modify);
  1580. break;
  1581. case 111:
  1582. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x61,
  1583. 0x25, 0x03, 0x11,
  1584. 0x11 | psTdmaByte4Modify);
  1585. break;
  1586. case 151:
  1587. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x51,
  1588. 0x10, 0x03, 0x10,
  1589. 0x50 | psTdmaByte4Modify);
  1590. break;
  1591. }
  1592. } else {
  1593. /* disable PS tdma */
  1594. switch (type) {
  1595. case 0:
  1596. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x0,
  1597. 0x0, 0x0, 0x40, 0x0);
  1598. break;
  1599. case 1:
  1600. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x0,
  1601. 0x0, 0x0, 0x48, 0x0);
  1602. break;
  1603. default:
  1604. halbtc8821c2ant_set_fw_pstdma(btcoexist, 0x0,
  1605. 0x0, 0x0, 0x40, 0x0);
  1606. break;
  1607. }
  1608. }
  1609. if (!coex_sta->is_set_ps_state_fail) {
  1610. /* update pre state */
  1611. coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
  1612. coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
  1613. }
  1614. }
  1615. void halbtc8821c2ant_set_int_block(IN struct btc_coexist *btcoexist,
  1616. IN boolean force_exec, IN u8 pos_type)
  1617. {
  1618. #if 0
  1619. u8 regval_0xcba;
  1620. u32 u32tmp1 = 0;
  1621. coex_dm->cur_int_block_status = pos_type;
  1622. if (!force_exec) {
  1623. if (coex_dm->pre_int_block_status ==
  1624. coex_dm->cur_int_block_status)
  1625. return;
  1626. }
  1627. coex_dm->pre_int_block_status = coex_dm->cur_int_block_status;
  1628. regval_0xcba = btcoexist->btc_read_1byte(btcoexist, 0xcba);
  1629. switch (pos_type) {
  1630. case BT_8821C_1ANT_INT_BLOCK_SWITCH_TO_WLG_OF_BTG:
  1631. regval_0xcba = (regval_0xcba | BIT(0)) & (~(BIT(
  1632. 2))); /* 0xcb8[16] = 1, 0xcb8[18] = 0, WL_G select BTG */
  1633. regval_0xcba = regval_0xcba & 0x0f;
  1634. /*btcoexist->btc_write_1byte_bitmask(btcoexist, 0xc1d, 0x0f, 0x5); */ /* Gain Table */
  1635. /*btcoexist->btc_write_1byte_bitmask(btcoexist, 0xa9e, 0x0f, 0x2); */ /* CCK Gain Table */
  1636. break;
  1637. case BT_8821C_1ANT_INT_BLOCK_SWITCH_TO_WLG_OF_WLAG:
  1638. regval_0xcba = regval_0xcba & (~(BIT(2) | BIT(
  1639. 0))); /* 0xcb8[16] = 0, 0xcb8[18] = 0, WL_G select WLAG */
  1640. /* regval_0xcba = regval_0xcba | BIT(4) | BIT(5) ; */ /* 0xcb8[21:20] = 2b'11, WL_G @ WLAG on */
  1641. /* regval_0xcba = (regval_0xcba | BIT(6)) & (~(BIT(7)) ) ; */ /* 0xcb8[23:22] = 2b'01, WL_A @ WLAG off */
  1642. /*btcoexist->btc_write_1byte_bitmask(btcoexist, 0xc1d, 0x0f, 0x0); */ /* Gain Table */
  1643. /*btcoexist->btc_write_1byte_bitmask(btcoexist, 0xa9e, 0x0f, 0x6); */ /* CCK Gain Table */
  1644. break;
  1645. case BT_8821C_1ANT_INT_BLOCK_SWITCH_TO_WLA_OF_WLAG:
  1646. regval_0xcba = regval_0xcba & (~(BIT(2) | BIT(
  1647. 0))); /* 0xcb8[16] = 0, 0xcb8[18] = 0, WL_G select WLAG */
  1648. /*regval_0xcba = (regval_0xcba | BIT(4)) & (~(BIT(5))); */ /* 0xcb8[21:20] = 2b'01, WL_G @ WLAG off */
  1649. /*regval_0xcba = regval_0xcba | BIT(6) | BIT(7); */ /* 0xcb8[23:22] = 2b'11, WL_A @ WLAG on */
  1650. break;
  1651. }
  1652. btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcba, 0xff,
  1653. regval_0xcba);
  1654. u32tmp1 = btcoexist->btc_read_4byte(btcoexist, 0xcb8);
  1655. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  1656. "[BTCoex], ********** (After Int Block setup) 0xcb8 = 0x%08x **********\n",
  1657. u32tmp1);
  1658. BTC_TRACE(trace_buf);
  1659. #endif
  1660. }
  1661. void halbtc8821c2ant_set_ext_band_switch(IN struct btc_coexist *btcoexist,
  1662. IN boolean force_exec, IN u8 pos_type)
  1663. {
  1664. #if 0
  1665. boolean switch_polatiry_inverse = FALSE;
  1666. u8 regval_0xcb6;
  1667. u32 u32tmp1 = 0, u32tmp2 = 0;
  1668. if (!rfe_type->ext_band_switch_exist)
  1669. return;
  1670. coex_dm->cur_ext_band_switch_status = pos_type;
  1671. if (!force_exec) {
  1672. if (coex_dm->pre_ext_band_switch_status ==
  1673. coex_dm->cur_ext_band_switch_status)
  1674. return;
  1675. }
  1676. coex_dm->pre_ext_band_switch_status =
  1677. coex_dm->cur_ext_band_switch_status;
  1678. /* swap control polarity if use different switch control polarity*/
  1679. switch_polatiry_inverse = (rfe_type->ext_band_switch_ctrl_polarity == 1
  1680. ? ~switch_polatiry_inverse : switch_polatiry_inverse);
  1681. /*swap control polarity for WL_A, default polarity 0xcb4[21] = 0 && 0xcb4[23] = 1 is for WL_G */
  1682. switch_polatiry_inverse = (pos_type ==
  1683. BT_8821C_2ANT_EXT_BAND_SWITCH_TO_WLA ? ~switch_polatiry_inverse
  1684. : switch_polatiry_inverse);
  1685. regval_0xcb6 = btcoexist->btc_read_1byte(btcoexist, 0xcb6);
  1686. /* for normal switch polrity, 0xcb4[21] =1 && 0xcb4[23] = 0 for WL_A, vice versa */
  1687. regval_0xcb6 = (switch_polatiry_inverse == 1 ? ((regval_0xcb6 & (~(BIT(
  1688. 7)))) | BIT(5)) : ((regval_0xcb6 & (~(BIT(5)))) | BIT(7)));
  1689. btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb6, 0xff,
  1690. regval_0xcb6);
  1691. u32tmp1 = btcoexist->btc_read_4byte(btcoexist, 0xcb0);
  1692. u32tmp2 = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
  1693. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  1694. "[BTCoex], ********** (After Ext Band switch setup) 0xcb0 = 0x%08x, 0xcb4 = 0x%08x**********\n",
  1695. u32tmp1, u32tmp2);
  1696. BTC_TRACE(trace_buf);
  1697. #endif
  1698. }
  1699. void halbtc8821c2ant_set_ext_ant_switch(IN struct btc_coexist *btcoexist,
  1700. IN boolean force_exec, IN u8 ctrl_type, IN u8 pos_type)
  1701. {
  1702. struct btc_board_info *board_info = &btcoexist->board_info;
  1703. boolean switch_polatiry_inverse = FALSE;
  1704. u8 regval_0xcb7 = 0, regval_0x64;
  1705. u32 u32tmp1 = 0, u32tmp2 = 0, u32tmp3 = 0;
  1706. if (!rfe_type->ext_ant_switch_exist)
  1707. return;
  1708. coex_dm->cur_ext_ant_switch_status = (ctrl_type << 8) + pos_type;
  1709. if (!force_exec) {
  1710. if (coex_dm->pre_ext_ant_switch_status ==
  1711. coex_dm->cur_ext_ant_switch_status)
  1712. return;
  1713. }
  1714. coex_dm->pre_ext_ant_switch_status = coex_dm->cur_ext_ant_switch_status;
  1715. /* swap control polarity if use different switch control polarity*/
  1716. /* Normal switch polarity for DPDT, 0xcb4[29:28] = 2b'01 => BTG to Main, WLG to Aux, 0xcb4[29:28] = 2b'10 => BTG to Aux, WLG to Main */
  1717. /* Normal switch polarity for SPDT, 0xcb4[29:28] = 2b'01 => Ant to BTG, 0xcb4[29:28] = 2b'10 => Ant to WLG */
  1718. if (rfe_type->ext_ant_switch_ctrl_polarity)
  1719. switch_polatiry_inverse = ~switch_polatiry_inverse;
  1720. /* swap control polarity if 1-Ant at Aux */
  1721. if (rfe_type->ant_at_main_port == FALSE)
  1722. switch_polatiry_inverse = ~switch_polatiry_inverse;
  1723. switch (pos_type) {
  1724. default:
  1725. case BT_8821C_2ANT_EXT_ANT_SWITCH_MAIN_TO_BT:
  1726. case BT_8821C_2ANT_EXT_ANT_SWITCH_MAIN_TO_NOCARE:
  1727. case BT_8821C_2ANT_EXT_ANT_SWITCH_MAIN_TO_WLA:
  1728. break;
  1729. case BT_8821C_2ANT_EXT_ANT_SWITCH_MAIN_TO_WLG:
  1730. if (!rfe_type->wlg_Locate_at_btg)
  1731. switch_polatiry_inverse = ~switch_polatiry_inverse;
  1732. break;
  1733. }
  1734. if (board_info->ant_div_cfg)
  1735. ctrl_type = BT_8821C_2ANT_EXT_ANT_SWITCH_CTRL_BY_ANTDIV;
  1736. switch (ctrl_type) {
  1737. default:
  1738. case BT_8821C_2ANT_EXT_ANT_SWITCH_CTRL_BY_BBSW:
  1739. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e,
  1740. 0x80, 0x0); /* 0x4c[23] = 0 */
  1741. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4f,
  1742. 0x01, 0x1); /* 0x4c[24] = 1 */
  1743. btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb4,
  1744. 0xff, 0x77); /* BB SW, DPDT use RFE_ctrl8 and RFE_ctrl9 as control pin */
  1745. regval_0xcb7 = (switch_polatiry_inverse == FALSE ?
  1746. 0x1 : 0x2); /* 0xcb4[29:28] = 2b'01 for no switch_polatiry_inverse, DPDT_SEL_N =1, DPDT_SEL_P =0 */
  1747. btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,
  1748. 0x30, regval_0xcb7);
  1749. break;
  1750. case BT_8821C_2ANT_EXT_ANT_SWITCH_CTRL_BY_PTA:
  1751. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e,
  1752. 0x80, 0x0); /* 0x4c[23] = 0 */
  1753. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4f,
  1754. 0x01, 0x1); /* 0x4c[24] = 1 */
  1755. btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb4,
  1756. 0xff, 0x66); /* PTA, DPDT use RFE_ctrl8 and RFE_ctrl9 as control pin */
  1757. regval_0xcb7 = (switch_polatiry_inverse == FALSE ?
  1758. 0x2 : 0x1); /* 0xcb4[29:28] = 2b'10 for no switch_polatiry_inverse, DPDT_SEL_N =1, DPDT_SEL_P =0 @ GNT_BT=1 */
  1759. btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb7,
  1760. 0x30, regval_0xcb7);
  1761. break;
  1762. case BT_8821C_2ANT_EXT_ANT_SWITCH_CTRL_BY_ANTDIV:
  1763. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e,
  1764. 0x80, 0x0); /* 0x4c[23] = 0 */
  1765. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4f,
  1766. 0x01, 0x1); /* 0x4c[24] = 1 */
  1767. btcoexist->btc_write_1byte_bitmask(btcoexist, 0xcb4,
  1768. 0xff, 0x88); /* */
  1769. /* no regval_0xcb7 setup required, because antenna switch control value by antenna diversity */
  1770. break;
  1771. case BT_8821C_2ANT_EXT_ANT_SWITCH_CTRL_BY_MAC:
  1772. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e,
  1773. 0x80, 0x1); /* 0x4c[23] = 1 */
  1774. regval_0x64 = (switch_polatiry_inverse == FALSE ? 0x0 :
  1775. 0x1); /* 0x64[0] = 1b'0 for no switch_polatiry_inverse, DPDT_SEL_N =1, DPDT_SEL_P =0 */
  1776. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x64, 0x1,
  1777. regval_0x64);
  1778. break;
  1779. case BT_8821C_2ANT_EXT_ANT_SWITCH_CTRL_BY_BT:
  1780. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4e,
  1781. 0x80, 0x0); /* 0x4c[23] = 0 */
  1782. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4f,
  1783. 0x01, 0x0); /* 0x4c[24] = 0 */
  1784. /* no setup required, because antenna switch control value by BT vendor 0x1c[1:0] */
  1785. break;
  1786. }
  1787. /* PAPE, LNA_ON control by BT while WLAN off for current leakage issue */
  1788. if (ctrl_type == BT_8821C_2ANT_EXT_ANT_SWITCH_CTRL_BY_BT) {
  1789. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20,
  1790. 0x0); /* PAPE 0x64[29] = 0 */
  1791. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x10,
  1792. 0x0); /* LNA_ON 0x64[28] = 0 */
  1793. } else {
  1794. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20,
  1795. 0x1); /* PAPE 0x64[29] = 1 */
  1796. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x10,
  1797. 0x1); /* LNA_ON 0x64[28] = 1 */
  1798. }
  1799. #if BT_8821C_2ANT_COEX_DBG
  1800. u32tmp1 = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
  1801. u32tmp2 = btcoexist->btc_read_4byte(btcoexist, 0x4c);
  1802. u32tmp3 = btcoexist->btc_read_4byte(btcoexist, 0x64) & 0xff;
  1803. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  1804. "[BTCoex], (After Ext Ant switch setup) 0xcb4 = 0x%08x, 0x4c = 0x%08x, 0x64= 0x%02x\n",
  1805. u32tmp1, u32tmp2, u32tmp3);
  1806. BTC_TRACE(trace_buf);
  1807. #endif
  1808. }
  1809. void halbtc8821c2ant_set_rfe_type(IN struct btc_coexist *btcoexist)
  1810. {
  1811. struct btc_board_info *board_info = &btcoexist->board_info;
  1812. /* the following setup should be got from Efuse in the future */
  1813. rfe_type->rfe_module_type = board_info->rfe_type & 0x1f;
  1814. rfe_type->ext_ant_switch_ctrl_polarity = 0;
  1815. switch (rfe_type->rfe_module_type) {
  1816. case 0:
  1817. default:
  1818. rfe_type->ext_ant_switch_exist = TRUE;
  1819. rfe_type->ext_ant_switch_type =
  1820. BT_8821C_2ANT_EXT_ANT_SWITCH_USE_DPDT; /*2-Ant, DPDT, WLG*/
  1821. rfe_type->wlg_Locate_at_btg = FALSE;
  1822. rfe_type->ant_at_main_port = TRUE;
  1823. break;
  1824. case 1:
  1825. rfe_type->ext_ant_switch_exist = TRUE;
  1826. rfe_type->ext_ant_switch_type =
  1827. BT_8821C_2ANT_EXT_ANT_SWITCH_USE_SPDT; /*1-Ant, Main, WLG */
  1828. rfe_type->wlg_Locate_at_btg = FALSE;
  1829. rfe_type->ant_at_main_port = TRUE;
  1830. break;
  1831. case 2:
  1832. rfe_type->ext_ant_switch_exist = TRUE;
  1833. rfe_type->ext_ant_switch_type =
  1834. BT_8821C_2ANT_EXT_ANT_SWITCH_USE_SPDT; /*1-Ant, Main, BTG */
  1835. rfe_type->wlg_Locate_at_btg = TRUE;
  1836. rfe_type->ant_at_main_port = TRUE;
  1837. break;
  1838. case 3:
  1839. rfe_type->ext_ant_switch_exist = TRUE;
  1840. rfe_type->ext_ant_switch_type =
  1841. BT_8821C_2ANT_EXT_ANT_SWITCH_USE_DPDT; /*1-Ant, Aux, DPDT, WLG */
  1842. rfe_type->wlg_Locate_at_btg = FALSE;
  1843. rfe_type->ant_at_main_port = FALSE;
  1844. break;
  1845. case 4:
  1846. rfe_type->ext_ant_switch_exist = TRUE;
  1847. rfe_type->ext_ant_switch_type =
  1848. BT_8821C_2ANT_EXT_ANT_SWITCH_USE_DPDT; /*1-Ant, Aux, DPDT, BTG */
  1849. rfe_type->wlg_Locate_at_btg = TRUE;
  1850. rfe_type->ant_at_main_port = FALSE;
  1851. break;
  1852. case 5:
  1853. rfe_type->ext_ant_switch_exist = FALSE; /*2-Ant, no switch, WLG*/
  1854. rfe_type->ext_ant_switch_type =
  1855. BT_8821C_2ANT_EXT_ANT_SWITCH_NONE;
  1856. rfe_type->wlg_Locate_at_btg = FALSE;
  1857. rfe_type->ant_at_main_port = TRUE;
  1858. break;
  1859. case 6:
  1860. rfe_type->ext_ant_switch_exist = FALSE; /*2-Ant, no switch, WLG*/
  1861. rfe_type->ext_ant_switch_type =
  1862. BT_8821C_2ANT_EXT_ANT_SWITCH_NONE;
  1863. rfe_type->wlg_Locate_at_btg = FALSE;
  1864. rfe_type->ant_at_main_port = TRUE;
  1865. break;
  1866. case 7:
  1867. rfe_type->ext_ant_switch_exist = TRUE; /*2-Ant, DPDT, BTG*/
  1868. rfe_type->ext_ant_switch_type =
  1869. BT_8821C_2ANT_EXT_ANT_SWITCH_USE_DPDT;
  1870. rfe_type->wlg_Locate_at_btg = TRUE;
  1871. rfe_type->ant_at_main_port = TRUE;
  1872. break;
  1873. }
  1874. #if 0
  1875. if (rfe_type->wlg_Locate_at_btg)
  1876. halbtc8821c2ant_set_int_block(btcoexist, FORCE_EXEC,
  1877. BT_8821C_2ANT_INT_BLOCK_SWITCH_TO_WLG_OF_BTG);
  1878. else
  1879. halbtc8821c2ant_set_int_block(btcoexist, FORCE_EXEC,
  1880. BT_8821C_2ANT_INT_BLOCK_SWITCH_TO_WLG_OF_WLAG);
  1881. #endif
  1882. }
  1883. void halbtc8821c2ant_set_ant_path(IN struct btc_coexist *btcoexist,
  1884. IN u8 ant_pos_type, IN boolean force_exec,
  1885. IN u8 phase)
  1886. {
  1887. struct btc_board_info *board_info = &btcoexist->board_info;
  1888. u32 cnt_bt_cal_chk = 0;
  1889. boolean is_in_mp_mode = FALSE;
  1890. u8 u8tmp = 0;
  1891. u32 u32tmp1 = 0, u32tmp2 = 0, u32tmp3 = 0;
  1892. u16 u16tmp1 = 0;
  1893. u32tmp1 = halbtc8821c2ant_ltecoex_indirect_read_reg(btcoexist,
  1894. 0x38);
  1895. /* To avoid indirect access fail */
  1896. if (((u32tmp1 & 0xf000) >> 12) != ((u32tmp1 & 0x0f00) >> 8)) {
  1897. force_exec = TRUE;
  1898. coex_sta->gnt_error_cnt++;
  1899. }
  1900. #if BT_8821C_2ANT_COEX_DBG
  1901. u32tmp2 = halbtc8821c2ant_ltecoex_indirect_read_reg(btcoexist,
  1902. 0x54);
  1903. u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x73);
  1904. u32tmp3 = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
  1905. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  1906. "[BTCoex], (Before Ant Setup) 0xcb4 = 0x%x, 0x73 = 0x%x, 0x38= 0x%x, 0x54= 0x%x\n",
  1907. u32tmp3, u8tmp, u32tmp1, u32tmp2);
  1908. BTC_TRACE(trace_buf);
  1909. #endif
  1910. coex_dm->cur_ant_pos_type = (ant_pos_type << 8) + phase;
  1911. if (!force_exec) {
  1912. if (coex_dm->cur_ant_pos_type == coex_dm->pre_ant_pos_type)
  1913. return;
  1914. }
  1915. coex_dm->pre_ant_pos_type = coex_dm->cur_ant_pos_type;
  1916. switch (phase) {
  1917. case BT_8821C_2ANT_PHASE_COEX_POWERON:
  1918. /* set Path control owner to WL at initial step */
  1919. halbtc8821c2ant_ltecoex_pathcontrol_owner(btcoexist,
  1920. BT_8821C_2ANT_PCO_BTSIDE);
  1921. /* set GNT_BT to SW high */
  1922. halbtc8821c2ant_ltecoex_set_gnt_bt(btcoexist,
  1923. BT_8821C_2ANT_GNT_BLOCK_RFC_BB,
  1924. BT_8821C_2ANT_GNT_TYPE_CTRL_BY_SW,
  1925. BT_8821C_2ANT_SIG_STA_SET_TO_HIGH);
  1926. /* Set GNT_WL to SW high */
  1927. halbtc8821c2ant_ltecoex_set_gnt_wl(btcoexist,
  1928. BT_8821C_2ANT_GNT_BLOCK_RFC_BB,
  1929. BT_8821C_2ANT_GNT_TYPE_CTRL_BY_SW,
  1930. BT_8821C_2ANT_SIG_STA_SET_TO_HIGH);
  1931. if (BTC_ANT_PATH_AUTO == ant_pos_type) {
  1932. if (board_info->btdm_ant_pos ==
  1933. BTC_ANTENNA_AT_MAIN_PORT)
  1934. ant_pos_type =
  1935. BTC_ANT_WIFI_AT_MAIN;
  1936. else
  1937. ant_pos_type =
  1938. BTC_ANT_WIFI_AT_AUX;
  1939. }
  1940. coex_sta->run_time_state = FALSE;
  1941. break;
  1942. case BT_8821C_2ANT_PHASE_COEX_INIT:
  1943. /* Disable LTE Coex Function in WiFi side (this should be on if LTE coex is required) */
  1944. halbtc8821c2ant_ltecoex_enable(btcoexist, 0x0);
  1945. /* GNT_WL_LTE always = 1 (this should be config if LTE coex is required) */
  1946. halbtc8821c2ant_ltecoex_set_coex_table(
  1947. btcoexist,
  1948. BT_8821C_2ANT_CTT_WL_VS_LTE,
  1949. 0xffff);
  1950. /* GNT_BT_LTE always = 1 (this should be config if LTE coex is required) */
  1951. halbtc8821c2ant_ltecoex_set_coex_table(
  1952. btcoexist,
  1953. BT_8821C_2ANT_CTT_BT_VS_LTE,
  1954. 0xffff);
  1955. /* Wait If BT IQK running, because Path control owner is at BT during BT IQK (setup by WiFi firmware) */
  1956. while (cnt_bt_cal_chk <= 20) {
  1957. u8tmp = btcoexist->btc_read_1byte(
  1958. btcoexist, 0x49c);
  1959. cnt_bt_cal_chk++;
  1960. if (u8tmp & BIT(1)) {
  1961. BTC_SPRINTF(trace_buf,
  1962. BT_TMP_BUF_SIZE,
  1963. "[BTCoex], ########### BT is calibrating (wait cnt=%d) ###########\n",
  1964. cnt_bt_cal_chk);
  1965. BTC_TRACE(trace_buf);
  1966. delay_ms(50);
  1967. } else {
  1968. BTC_SPRINTF(trace_buf,
  1969. BT_TMP_BUF_SIZE,
  1970. "[BTCoex], ********** BT is NOT calibrating (wait cnt=%d)**********\n",
  1971. cnt_bt_cal_chk);
  1972. BTC_TRACE(trace_buf);
  1973. break;
  1974. }
  1975. }
  1976. /* set Path control owner to WL at initial step */
  1977. halbtc8821c2ant_ltecoex_pathcontrol_owner(
  1978. btcoexist,
  1979. BT_8821C_2ANT_PCO_WLSIDE);
  1980. /* set GNT_BT to SW high */
  1981. halbtc8821c2ant_ltecoex_set_gnt_bt(btcoexist,
  1982. BT_8821C_2ANT_GNT_BLOCK_RFC_BB,
  1983. BT_8821C_2ANT_GNT_TYPE_CTRL_BY_SW,
  1984. BT_8821C_2ANT_SIG_STA_SET_TO_HIGH);
  1985. /* Set GNT_WL to SW high */
  1986. halbtc8821c2ant_ltecoex_set_gnt_wl(btcoexist,
  1987. BT_8821C_2ANT_GNT_BLOCK_RFC_BB,
  1988. BT_8821C_2ANT_GNT_TYPE_CTRL_BY_SW,
  1989. BT_8821C_2ANT_SIG_STA_SET_TO_HIGH);
  1990. coex_sta->run_time_state = FALSE;
  1991. if (BTC_ANT_PATH_AUTO == ant_pos_type) {
  1992. if (board_info->btdm_ant_pos ==
  1993. BTC_ANTENNA_AT_MAIN_PORT)
  1994. ant_pos_type =
  1995. BTC_ANT_WIFI_AT_MAIN;
  1996. else
  1997. ant_pos_type =
  1998. BTC_ANT_WIFI_AT_AUX;
  1999. }
  2000. break;
  2001. case BT_8821C_2ANT_PHASE_WLANONLY_INIT:
  2002. /* Disable LTE Coex Function in WiFi side (this should be on if LTE coex is required) */
  2003. halbtc8821c2ant_ltecoex_enable(btcoexist, 0x0);
  2004. /* GNT_WL_LTE always = 1 (this should be config if LTE coex is required) */
  2005. halbtc8821c2ant_ltecoex_set_coex_table(
  2006. btcoexist,
  2007. BT_8821C_2ANT_CTT_WL_VS_LTE,
  2008. 0xffff);
  2009. /* GNT_BT_LTE always = 1 (this should be config if LTE coex is required) */
  2010. halbtc8821c2ant_ltecoex_set_coex_table(
  2011. btcoexist,
  2012. BT_8821C_2ANT_CTT_BT_VS_LTE,
  2013. 0xffff);
  2014. /* set Path control owner to WL at initial step */
  2015. halbtc8821c2ant_ltecoex_pathcontrol_owner(
  2016. btcoexist,
  2017. BT_8821C_2ANT_PCO_WLSIDE);
  2018. /* set GNT_BT to SW Low */
  2019. halbtc8821c2ant_ltecoex_set_gnt_bt(btcoexist,
  2020. BT_8821C_2ANT_GNT_BLOCK_RFC_BB,
  2021. BT_8821C_2ANT_GNT_TYPE_CTRL_BY_SW,
  2022. BT_8821C_2ANT_SIG_STA_SET_TO_LOW);
  2023. /* Set GNT_WL to SW high */
  2024. halbtc8821c2ant_ltecoex_set_gnt_wl(btcoexist,
  2025. BT_8821C_2ANT_GNT_BLOCK_RFC_BB,
  2026. BT_8821C_2ANT_GNT_TYPE_CTRL_BY_SW,
  2027. BT_8821C_2ANT_SIG_STA_SET_TO_HIGH);
  2028. coex_sta->run_time_state = FALSE;
  2029. if (BTC_ANT_PATH_AUTO == ant_pos_type) {
  2030. if (board_info->btdm_ant_pos ==
  2031. BTC_ANTENNA_AT_MAIN_PORT)
  2032. ant_pos_type =
  2033. BTC_ANT_WIFI_AT_MAIN;
  2034. else
  2035. ant_pos_type =
  2036. BTC_ANT_WIFI_AT_AUX;
  2037. }
  2038. break;
  2039. case BT_8821C_2ANT_PHASE_WLAN_OFF:
  2040. /* Disable LTE Coex Function in WiFi side */
  2041. halbtc8821c2ant_ltecoex_enable(btcoexist, 0x0);
  2042. /* set Path control owner to BT */
  2043. halbtc8821c2ant_ltecoex_pathcontrol_owner(
  2044. btcoexist,
  2045. BT_8821C_2ANT_PCO_BTSIDE);
  2046. /* Set Ext Ant Switch to BT control at wifi off step */
  2047. halbtc8821c2ant_set_ext_ant_switch(btcoexist,
  2048. FORCE_EXEC,
  2049. BT_8821C_2ANT_EXT_ANT_SWITCH_CTRL_BY_BT,
  2050. BT_8821C_2ANT_EXT_ANT_SWITCH_MAIN_TO_NOCARE);
  2051. coex_sta->run_time_state = FALSE;
  2052. break;
  2053. case BT_8821C_2ANT_PHASE_2G_RUNTIME:
  2054. case BT_8821C_2ANT_PHASE_2G_RUNTIME_CONCURRENT:
  2055. while (cnt_bt_cal_chk <= 20) {
  2056. /* 0x49c[0]=1 WL IQK, 0x49c[1]=1 BT IQK*/
  2057. u8tmp = btcoexist->btc_read_1byte(btcoexist,
  2058. 0x49c);
  2059. cnt_bt_cal_chk++;
  2060. if (u8tmp & BIT(0)) {
  2061. BTC_SPRINTF(trace_buf,
  2062. BT_TMP_BUF_SIZE,
  2063. "[BTCoex], ########### WL is IQK (wait cnt=%d)\n",
  2064. cnt_bt_cal_chk);
  2065. BTC_TRACE(trace_buf);
  2066. delay_ms(50);
  2067. } else if (u8tmp & BIT(1)) {
  2068. BTC_SPRINTF(trace_buf,
  2069. BT_TMP_BUF_SIZE,
  2070. "[BTCoex], ########### BT is IQK (wait cnt=%d)\n",
  2071. cnt_bt_cal_chk);
  2072. BTC_TRACE(trace_buf);
  2073. delay_ms(50);
  2074. } else {
  2075. BTC_SPRINTF(trace_buf,
  2076. BT_TMP_BUF_SIZE,
  2077. "[BTCoex], ********** WL and BT is NOT IQK (wait cnt=%d)\n",
  2078. cnt_bt_cal_chk);
  2079. BTC_TRACE(trace_buf);
  2080. break;
  2081. }
  2082. }
  2083. /* set Path control owner to WL at runtime step */
  2084. halbtc8821c2ant_ltecoex_pathcontrol_owner(
  2085. btcoexist,
  2086. BT_8821C_2ANT_PCO_WLSIDE);
  2087. if (phase ==
  2088. BT_8821C_2ANT_PHASE_2G_RUNTIME_CONCURRENT) {
  2089. /* set GNT_BT to PTA */
  2090. halbtc8821c2ant_ltecoex_set_gnt_bt(
  2091. btcoexist,
  2092. BT_8821C_2ANT_GNT_BLOCK_RFC_BB,
  2093. BT_8821C_2ANT_GNT_TYPE_CTRL_BY_PTA,
  2094. BT_8821C_2ANT_SIG_STA_SET_BY_HW);
  2095. /* Set GNT_WL to SW High */
  2096. halbtc8821c2ant_ltecoex_set_gnt_wl(
  2097. btcoexist,
  2098. BT_8821C_2ANT_GNT_BLOCK_RFC_BB,
  2099. BT_8821C_2ANT_GNT_TYPE_CTRL_BY_SW,
  2100. BT_8821C_2ANT_SIG_STA_SET_TO_HIGH);
  2101. } else {
  2102. /* set GNT_BT to PTA */
  2103. halbtc8821c2ant_ltecoex_set_gnt_bt(
  2104. btcoexist,
  2105. BT_8821C_2ANT_GNT_BLOCK_RFC_BB,
  2106. BT_8821C_2ANT_GNT_TYPE_CTRL_BY_PTA,
  2107. BT_8821C_2ANT_SIG_STA_SET_BY_HW);
  2108. /* Set GNT_WL to PTA */
  2109. halbtc8821c2ant_ltecoex_set_gnt_wl(
  2110. btcoexist,
  2111. BT_8821C_2ANT_GNT_BLOCK_RFC_BB,
  2112. BT_8821C_2ANT_GNT_TYPE_CTRL_BY_PTA,
  2113. BT_8821C_2ANT_SIG_STA_SET_BY_HW);
  2114. }
  2115. coex_sta->run_time_state = TRUE;
  2116. if (rfe_type->wlg_Locate_at_btg)
  2117. halbtc8821c2ant_set_int_block(btcoexist,
  2118. NORMAL_EXEC,
  2119. BT_8821C_2ANT_INT_BLOCK_SWITCH_TO_WLG_OF_BTG);
  2120. else
  2121. halbtc8821c2ant_set_int_block(btcoexist,
  2122. NORMAL_EXEC,
  2123. BT_8821C_2ANT_INT_BLOCK_SWITCH_TO_WLG_OF_WLAG);
  2124. if (BTC_ANT_PATH_AUTO == ant_pos_type) {
  2125. if (board_info->btdm_ant_pos ==
  2126. BTC_ANTENNA_AT_MAIN_PORT)
  2127. ant_pos_type =
  2128. BTC_ANT_WIFI_AT_MAIN;
  2129. else
  2130. ant_pos_type =
  2131. BTC_ANT_WIFI_AT_AUX;
  2132. }
  2133. break;
  2134. case BT_8821C_2ANT_PHASE_5G_RUNTIME:
  2135. /* set Path control owner to WL at runtime step */
  2136. halbtc8821c2ant_ltecoex_pathcontrol_owner(
  2137. btcoexist,
  2138. BT_8821C_2ANT_PCO_WLSIDE);
  2139. /* set GNT_BT to SW Hi */
  2140. halbtc8821c2ant_ltecoex_set_gnt_bt(btcoexist,
  2141. BT_8821C_2ANT_GNT_BLOCK_RFC_BB,
  2142. BT_8821C_2ANT_GNT_TYPE_CTRL_BY_PTA,
  2143. BT_8821C_2ANT_SIG_STA_SET_BY_HW);
  2144. /* Set GNT_WL to SW Hi */
  2145. halbtc8821c2ant_ltecoex_set_gnt_wl(btcoexist,
  2146. BT_8821C_2ANT_GNT_BLOCK_RFC_BB,
  2147. BT_8821C_2ANT_GNT_TYPE_CTRL_BY_SW,
  2148. BT_8821C_2ANT_SIG_STA_SET_TO_HIGH);
  2149. coex_sta->run_time_state = TRUE;
  2150. halbtc8821c2ant_set_int_block(btcoexist,
  2151. NORMAL_EXEC,
  2152. BT_8821C_2ANT_INT_BLOCK_SWITCH_TO_WLA_OF_WLAG);
  2153. if (BTC_ANT_PATH_AUTO == ant_pos_type) {
  2154. if (board_info->btdm_ant_pos ==
  2155. BTC_ANTENNA_AT_MAIN_PORT)
  2156. ant_pos_type =
  2157. BTC_ANT_WIFI_AT_MAIN;
  2158. else
  2159. ant_pos_type =
  2160. BTC_ANT_WIFI_AT_AUX;
  2161. }
  2162. break;
  2163. case BT_8821C_2ANT_PHASE_BTMPMODE:
  2164. /* Disable LTE Coex Function in WiFi side */
  2165. halbtc8821c2ant_ltecoex_enable(btcoexist, 0x0);
  2166. /* set Path control owner to WL */
  2167. halbtc8821c2ant_ltecoex_pathcontrol_owner(
  2168. btcoexist,
  2169. BT_8821C_2ANT_PCO_WLSIDE);
  2170. /* set GNT_BT to SW Hi */
  2171. halbtc8821c2ant_ltecoex_set_gnt_bt(btcoexist,
  2172. BT_8821C_2ANT_GNT_BLOCK_RFC_BB,
  2173. BT_8821C_2ANT_GNT_TYPE_CTRL_BY_SW,
  2174. BT_8821C_2ANT_SIG_STA_SET_TO_HIGH);
  2175. /* Set GNT_WL to SW Lo */
  2176. halbtc8821c2ant_ltecoex_set_gnt_wl(btcoexist,
  2177. BT_8821C_2ANT_GNT_BLOCK_RFC_BB,
  2178. BT_8821C_2ANT_GNT_TYPE_CTRL_BY_SW,
  2179. BT_8821C_2ANT_SIG_STA_SET_TO_LOW);
  2180. coex_sta->run_time_state = FALSE;
  2181. if (BTC_ANT_PATH_AUTO == ant_pos_type) {
  2182. if (board_info->btdm_ant_pos ==
  2183. BTC_ANTENNA_AT_MAIN_PORT)
  2184. ant_pos_type =
  2185. BTC_ANT_WIFI_AT_MAIN;
  2186. else
  2187. ant_pos_type =
  2188. BTC_ANT_WIFI_AT_AUX;
  2189. }
  2190. break;
  2191. case BT_8821C_2ANT_PHASE_ANTENNA_DET:
  2192. halbtc8821c2ant_ltecoex_pathcontrol_owner(btcoexist,
  2193. BT_8821C_2ANT_PCO_WLSIDE);
  2194. /* set GNT_BT to high */
  2195. halbtc8821c2ant_ltecoex_set_gnt_bt(btcoexist,
  2196. BT_8821C_2ANT_GNT_BLOCK_RFC_BB,
  2197. BT_8821C_2ANT_GNT_TYPE_CTRL_BY_SW,
  2198. BT_8821C_2ANT_SIG_STA_SET_TO_HIGH);
  2199. /* Set GNT_WL to high */
  2200. halbtc8821c2ant_ltecoex_set_gnt_wl(btcoexist,
  2201. BT_8821C_2ANT_GNT_BLOCK_RFC_BB,
  2202. BT_8821C_2ANT_GNT_TYPE_CTRL_BY_SW,
  2203. BT_8821C_2ANT_SIG_STA_SET_TO_HIGH);
  2204. if (BTC_ANT_PATH_AUTO == ant_pos_type) {
  2205. if (board_info->btdm_ant_pos ==
  2206. BTC_ANTENNA_AT_MAIN_PORT)
  2207. ant_pos_type =
  2208. BTC_ANT_WIFI_AT_MAIN;
  2209. else
  2210. ant_pos_type =
  2211. BTC_ANT_WIFI_AT_AUX;
  2212. }
  2213. coex_sta->run_time_state = FALSE;
  2214. break;
  2215. }
  2216. if (phase != BT_8821C_2ANT_PHASE_WLAN_OFF) {
  2217. switch (ant_pos_type) {
  2218. default:
  2219. case BTC_ANT_WIFI_AT_MAIN
  2220. :
  2221. halbtc8821c2ant_set_ext_ant_switch(
  2222. btcoexist,
  2223. force_exec,
  2224. BT_8821C_2ANT_EXT_ANT_SWITCH_CTRL_BY_BBSW,
  2225. BT_8821C_2ANT_EXT_ANT_SWITCH_MAIN_TO_WLG);
  2226. break;
  2227. case BTC_ANT_WIFI_AT_AUX
  2228. :
  2229. halbtc8821c2ant_set_ext_ant_switch(
  2230. btcoexist,
  2231. force_exec,
  2232. BT_8821C_2ANT_EXT_ANT_SWITCH_CTRL_BY_BBSW,
  2233. BT_8821C_2ANT_EXT_ANT_SWITCH_MAIN_TO_BT);
  2234. break;
  2235. case BTC_ANT_WIFI_AT_DIVERSITY
  2236. :
  2237. halbtc8821c2ant_set_ext_ant_switch(
  2238. btcoexist,
  2239. force_exec,
  2240. BT_8821C_2ANT_EXT_ANT_SWITCH_CTRL_BY_ANTDIV,
  2241. BT_8821C_2ANT_EXT_ANT_SWITCH_MAIN_TO_NOCARE);
  2242. break;
  2243. }
  2244. }
  2245. #if BT_8821C_2ANT_COEX_DBG
  2246. u32tmp1 = halbtc8821c2ant_ltecoex_indirect_read_reg(btcoexist, 0x38);
  2247. u32tmp2 = halbtc8821c2ant_ltecoex_indirect_read_reg(btcoexist, 0x54);
  2248. u32tmp3 = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
  2249. u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x73);
  2250. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2251. "[BTCoex], (After Ant-Setup phase---%d) 0xcb4 = 0x%x, 0x73 = 0x%x, 0x38= 0x%x, 0x54= 0x%x\n",
  2252. phase, u32tmp3, u8tmp, u32tmp1, u32tmp2);
  2253. BTC_TRACE(trace_buf);
  2254. #endif
  2255. }
  2256. u8 halbtc8821c2ant_action_algorithm(IN struct btc_coexist *btcoexist)
  2257. {
  2258. struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
  2259. boolean bt_hs_on = FALSE;
  2260. u8 algorithm = BT_8821C_2ANT_COEX_ALGO_UNDEFINED;
  2261. u8 num_of_diff_profile = 0;
  2262. btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
  2263. if (!bt_link_info->bt_link_exist) {
  2264. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2265. "[BTCoex], No BT link exists!!!\n");
  2266. BTC_TRACE(trace_buf);
  2267. return algorithm;
  2268. }
  2269. if (bt_link_info->sco_exist)
  2270. num_of_diff_profile++;
  2271. if (bt_link_info->hid_exist)
  2272. num_of_diff_profile++;
  2273. if (bt_link_info->pan_exist)
  2274. num_of_diff_profile++;
  2275. if (bt_link_info->a2dp_exist)
  2276. num_of_diff_profile++;
  2277. if (num_of_diff_profile == 0) {
  2278. if (bt_link_info->acl_busy) {
  2279. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2280. "[BTCoex], No-Profile busy\n");
  2281. BTC_TRACE(trace_buf);
  2282. algorithm = BT_8821C_2ANT_COEX_ALGO_NOPROFILEBUSY;
  2283. }
  2284. } else if ((bt_link_info->a2dp_exist) && (coex_sta->is_bt_a2dp_sink)) {
  2285. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2286. "[BTCoex], A2DP Sink\n");
  2287. BTC_TRACE(trace_buf);
  2288. algorithm = BT_8821C_2ANT_COEX_ALGO_A2DPSINK;
  2289. } else if (num_of_diff_profile == 1) {
  2290. if (bt_link_info->sco_exist) {
  2291. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2292. "[BTCoex], SCO only\n");
  2293. BTC_TRACE(trace_buf);
  2294. algorithm = BT_8821C_2ANT_COEX_ALGO_SCO;
  2295. } else {
  2296. if (bt_link_info->hid_exist) {
  2297. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2298. "[BTCoex], HID only\n");
  2299. BTC_TRACE(trace_buf);
  2300. algorithm = BT_8821C_2ANT_COEX_ALGO_HID;
  2301. } else if (bt_link_info->a2dp_exist) {
  2302. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2303. "[BTCoex], A2DP only\n");
  2304. BTC_TRACE(trace_buf);
  2305. algorithm = BT_8821C_2ANT_COEX_ALGO_A2DP;
  2306. } else if (bt_link_info->pan_exist) {
  2307. if (bt_hs_on) {
  2308. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2309. "[BTCoex], PAN(HS) only\n");
  2310. BTC_TRACE(trace_buf);
  2311. algorithm =
  2312. BT_8821C_2ANT_COEX_ALGO_PANHS;
  2313. } else {
  2314. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2315. "[BTCoex], PAN(EDR) only\n");
  2316. BTC_TRACE(trace_buf);
  2317. algorithm =
  2318. BT_8821C_2ANT_COEX_ALGO_PANEDR;
  2319. }
  2320. }
  2321. }
  2322. } else if (num_of_diff_profile == 2) {
  2323. if (bt_link_info->sco_exist) {
  2324. if (bt_link_info->hid_exist) {
  2325. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2326. "[BTCoex], SCO + HID\n");
  2327. BTC_TRACE(trace_buf);
  2328. algorithm = BT_8821C_2ANT_COEX_ALGO_SCO;
  2329. } else if (bt_link_info->a2dp_exist) {
  2330. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2331. "[BTCoex], SCO + A2DP ==> A2DP\n");
  2332. BTC_TRACE(trace_buf);
  2333. algorithm = BT_8821C_2ANT_COEX_ALGO_A2DP;
  2334. } else if (bt_link_info->pan_exist) {
  2335. if (bt_hs_on) {
  2336. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2337. "[BTCoex], SCO + PAN(HS)\n");
  2338. BTC_TRACE(trace_buf);
  2339. algorithm = BT_8821C_2ANT_COEX_ALGO_SCO;
  2340. } else {
  2341. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2342. "[BTCoex], SCO + PAN(EDR)\n");
  2343. BTC_TRACE(trace_buf);
  2344. algorithm =
  2345. BT_8821C_2ANT_COEX_ALGO_PANEDR;
  2346. }
  2347. }
  2348. } else {
  2349. if (bt_link_info->hid_exist &&
  2350. bt_link_info->a2dp_exist) {
  2351. {
  2352. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2353. "[BTCoex], HID + A2DP\n");
  2354. BTC_TRACE(trace_buf);
  2355. algorithm =
  2356. BT_8821C_2ANT_COEX_ALGO_HID_A2DP;
  2357. }
  2358. } else if (bt_link_info->hid_exist &&
  2359. bt_link_info->pan_exist) {
  2360. if (bt_hs_on) {
  2361. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2362. "[BTCoex], HID + PAN(HS)\n");
  2363. BTC_TRACE(trace_buf);
  2364. algorithm = BT_8821C_2ANT_COEX_ALGO_HID;
  2365. } else {
  2366. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2367. "[BTCoex], HID + PAN(EDR)\n");
  2368. BTC_TRACE(trace_buf);
  2369. algorithm =
  2370. BT_8821C_2ANT_COEX_ALGO_PANEDR_HID;
  2371. }
  2372. } else if (bt_link_info->pan_exist &&
  2373. bt_link_info->a2dp_exist) {
  2374. if (bt_hs_on) {
  2375. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2376. "[BTCoex], A2DP + PAN(HS)\n");
  2377. BTC_TRACE(trace_buf);
  2378. algorithm =
  2379. BT_8821C_2ANT_COEX_ALGO_A2DP_PANHS;
  2380. } else {
  2381. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2382. "[BTCoex], A2DP + PAN(EDR)\n");
  2383. BTC_TRACE(trace_buf);
  2384. algorithm =
  2385. BT_8821C_2ANT_COEX_ALGO_PANEDR_A2DP;
  2386. }
  2387. }
  2388. }
  2389. } else if (num_of_diff_profile == 3) {
  2390. if (bt_link_info->sco_exist) {
  2391. if (bt_link_info->hid_exist &&
  2392. bt_link_info->a2dp_exist) {
  2393. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2394. "[BTCoex], SCO + HID + A2DP ==> HID + A2DP\n");
  2395. BTC_TRACE(trace_buf);
  2396. algorithm = BT_8821C_2ANT_COEX_ALGO_HID_A2DP;
  2397. } else if (bt_link_info->hid_exist &&
  2398. bt_link_info->pan_exist) {
  2399. if (bt_hs_on) {
  2400. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2401. "[BTCoex], SCO + HID + PAN(HS)\n");
  2402. BTC_TRACE(trace_buf);
  2403. algorithm =
  2404. BT_8821C_2ANT_COEX_ALGO_PANEDR_HID;
  2405. } else {
  2406. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2407. "[BTCoex], SCO + HID + PAN(EDR)\n");
  2408. BTC_TRACE(trace_buf);
  2409. algorithm =
  2410. BT_8821C_2ANT_COEX_ALGO_PANEDR_HID;
  2411. }
  2412. } else if (bt_link_info->pan_exist &&
  2413. bt_link_info->a2dp_exist) {
  2414. if (bt_hs_on) {
  2415. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2416. "[BTCoex], SCO + A2DP + PAN(HS)\n");
  2417. BTC_TRACE(trace_buf);
  2418. algorithm =
  2419. BT_8821C_2ANT_COEX_ALGO_PANEDR_A2DP;
  2420. } else {
  2421. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2422. "[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n");
  2423. BTC_TRACE(trace_buf);
  2424. algorithm =
  2425. BT_8821C_2ANT_COEX_ALGO_PANEDR_A2DP;
  2426. }
  2427. }
  2428. } else {
  2429. if (bt_link_info->hid_exist &&
  2430. bt_link_info->pan_exist &&
  2431. bt_link_info->a2dp_exist) {
  2432. if (bt_hs_on) {
  2433. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2434. "[BTCoex], HID + A2DP + PAN(HS)\n");
  2435. BTC_TRACE(trace_buf);
  2436. algorithm =
  2437. BT_8821C_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
  2438. } else {
  2439. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2440. "[BTCoex], HID + A2DP + PAN(EDR)\n");
  2441. BTC_TRACE(trace_buf);
  2442. algorithm =
  2443. BT_8821C_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
  2444. }
  2445. }
  2446. }
  2447. } else if (num_of_diff_profile >= 3) {
  2448. if (bt_link_info->sco_exist) {
  2449. if (bt_link_info->hid_exist &&
  2450. bt_link_info->pan_exist &&
  2451. bt_link_info->a2dp_exist) {
  2452. if (bt_hs_on) {
  2453. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2454. "[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n");
  2455. BTC_TRACE(trace_buf);
  2456. algorithm =
  2457. BT_8821C_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
  2458. } else {
  2459. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2460. "[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n");
  2461. BTC_TRACE(trace_buf);
  2462. algorithm =
  2463. BT_8821C_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
  2464. }
  2465. }
  2466. }
  2467. }
  2468. return algorithm;
  2469. }
  2470. void halbtc8821c2ant_action_coex_all_off(IN struct btc_coexist *btcoexist)
  2471. {
  2472. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
  2473. /* fw all off */
  2474. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  2475. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  2476. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  2477. }
  2478. void halbtc8821c2ant_action_bt_whql_test(IN struct btc_coexist *btcoexist)
  2479. {
  2480. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  2481. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  2482. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
  2483. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  2484. }
  2485. void halbtc8821c2ant_action_bt_hs(IN struct btc_coexist *btcoexist)
  2486. {
  2487. static u8 prewifi_rssi_state = BTC_RSSI_STATE_LOW;
  2488. static u8 pre_bt_rssi_state = BTC_RSSI_STATE_LOW;
  2489. u8 wifi_rssi_state, bt_rssi_state;
  2490. static u8 prewifi_rssi_state2 = BTC_RSSI_STATE_LOW;
  2491. static u8 pre_bt_rssi_state2 = BTC_RSSI_STATE_LOW;
  2492. u8 wifi_rssi_state2, bt_rssi_state2;
  2493. boolean wifi_busy = FALSE, wifi_turbo = FALSE;
  2494. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
  2495. btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
  2496. &coex_sta->scan_ap_num);
  2497. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2498. "############# [BTCoex], scan_ap_num = %d, wl_noisy = %d\n",
  2499. coex_sta->scan_ap_num, coex_sta->wl_noisy_level);
  2500. BTC_TRACE(trace_buf);
  2501. #if 1
  2502. if ((wifi_busy) && (coex_sta->wl_noisy_level == 0))
  2503. wifi_turbo = TRUE;
  2504. #endif
  2505. wifi_rssi_state = halbtc8821c2ant_wifi_rssi_state(btcoexist,
  2506. &prewifi_rssi_state, 2,
  2507. coex_sta->wifi_coex_thres, 0);
  2508. wifi_rssi_state2 = halbtc8821c2ant_wifi_rssi_state(btcoexist,
  2509. &prewifi_rssi_state2, 2,
  2510. coex_sta->wifi_coex_thres2, 0);
  2511. bt_rssi_state = halbtc8821c2ant_bt_rssi_state(btcoexist,
  2512. &pre_bt_rssi_state, 2,
  2513. coex_sta->bt_coex_thres, 0);
  2514. bt_rssi_state2 = halbtc8821c2ant_bt_rssi_state(btcoexist,
  2515. &pre_bt_rssi_state2, 2,
  2516. coex_sta->bt_coex_thres2, 0);
  2517. if (BTC_RSSI_HIGH(wifi_rssi_state) &&
  2518. BTC_RSSI_HIGH(bt_rssi_state)) {
  2519. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  2520. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  2521. coex_dm->is_switch_to_1dot5_ant = FALSE;
  2522. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
  2523. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  2524. } else if (BTC_RSSI_HIGH(wifi_rssi_state2) &&
  2525. BTC_RSSI_HIGH(bt_rssi_state2)) {
  2526. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xc8);
  2527. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
  2528. coex_dm->is_switch_to_1dot5_ant = FALSE;
  2529. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
  2530. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  2531. } else {
  2532. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  2533. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  2534. coex_dm->is_switch_to_1dot5_ant = TRUE;
  2535. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
  2536. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  2537. }
  2538. }
  2539. void halbtc8821c2ant_action_bt_inquiry(IN struct btc_coexist *btcoexist)
  2540. {
  2541. boolean wifi_connected = FALSE;
  2542. boolean wifi_scan = FALSE, wifi_link = FALSE, wifi_roam = FALSE;
  2543. boolean wifi_busy = FALSE;
  2544. struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
  2545. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
  2546. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
  2547. &wifi_connected);
  2548. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &wifi_scan);
  2549. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &wifi_link);
  2550. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &wifi_roam);
  2551. if ((coex_sta->bt_create_connection) && ((wifi_link) || (wifi_roam)
  2552. || (wifi_scan) || (wifi_busy) || (coex_sta->wifi_is_high_pri_task))) {
  2553. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2554. "[BTCoex], Wifi link/roam/Scan/busy/hi-pri-task + BT Inq/Page!!\n");
  2555. BTC_TRACE(trace_buf);
  2556. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC,
  2557. 8);
  2558. if ((bt_link_info->a2dp_exist) && (!bt_link_info->pan_exist))
  2559. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  2560. 15);
  2561. else
  2562. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  2563. 11);
  2564. } else if ((!wifi_connected) && (!wifi_scan)) {
  2565. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2566. "[BTCoex], Wifi no-link + no-scan + BT Inq/Page!!\n");
  2567. BTC_TRACE(trace_buf);
  2568. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
  2569. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  2570. } else if (bt_link_info->pan_exist) {
  2571. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE, 22);
  2572. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8);
  2573. } else if (bt_link_info->a2dp_exist) {
  2574. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE, 16);
  2575. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8);
  2576. } else {
  2577. if ((wifi_link) || (wifi_roam) || (wifi_scan) || (wifi_busy)
  2578. || (coex_sta->wifi_is_high_pri_task))
  2579. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE, 21);
  2580. else
  2581. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE, 23);
  2582. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8);
  2583. }
  2584. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 0xd8);
  2585. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  2586. }
  2587. void halbtc8821c2ant_action_bt_relink(IN struct btc_coexist *btcoexist)
  2588. {
  2589. if (coex_sta->is_bt_multi_link == TRUE)
  2590. return;
  2591. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  2592. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
  2593. }
  2594. void halbtc8821c2ant_action_bt_idle(IN struct btc_coexist *btcoexist)
  2595. {
  2596. boolean wifi_busy = FALSE;
  2597. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
  2598. if (!wifi_busy) {
  2599. halbtc8821c2ant_coex_table_with_type(btcoexist,
  2600. NORMAL_EXEC, 8);
  2601. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE, 14);
  2602. } else { /* if wl busy */
  2603. if (BT_8821C_1ANT_BT_STATUS_NON_CONNECTED_IDLE ==
  2604. coex_dm->bt_status) {
  2605. halbtc8821c2ant_coex_table_with_type(btcoexist,
  2606. NORMAL_EXEC, 0);
  2607. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  2608. } else {
  2609. halbtc8821c2ant_coex_table_with_type(btcoexist,
  2610. NORMAL_EXEC,
  2611. 8);
  2612. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  2613. 12);
  2614. }
  2615. }
  2616. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 0xd8);
  2617. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  2618. }
  2619. /* SCO only or SCO+PAN(HS) */
  2620. void halbtc8821c2ant_action_sco(IN struct btc_coexist *btcoexist)
  2621. {
  2622. static u8 prewifi_rssi_state = BTC_RSSI_STATE_LOW;
  2623. static u8 pre_bt_rssi_state = BTC_RSSI_STATE_LOW;
  2624. u8 wifi_rssi_state, bt_rssi_state;
  2625. static u8 prewifi_rssi_state2 = BTC_RSSI_STATE_LOW;
  2626. static u8 pre_bt_rssi_state2 = BTC_RSSI_STATE_LOW;
  2627. u8 wifi_rssi_state2, bt_rssi_state2;
  2628. boolean wifi_busy = FALSE;
  2629. u32 wifi_bw = 1;
  2630. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW,
  2631. &wifi_bw);
  2632. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
  2633. wifi_rssi_state = halbtc8821c2ant_wifi_rssi_state(btcoexist,
  2634. &prewifi_rssi_state, 2,
  2635. coex_sta->wifi_coex_thres, 0);
  2636. wifi_rssi_state2 = halbtc8821c2ant_wifi_rssi_state(btcoexist,
  2637. &prewifi_rssi_state2, 2,
  2638. coex_sta->wifi_coex_thres2, 0);
  2639. bt_rssi_state = halbtc8821c2ant_bt_rssi_state(btcoexist,
  2640. &pre_bt_rssi_state, 2,
  2641. coex_sta->bt_coex_thres, 0);
  2642. bt_rssi_state2 = halbtc8821c2ant_bt_rssi_state(btcoexist,
  2643. &pre_bt_rssi_state2, 2,
  2644. coex_sta->bt_coex_thres2, 0);
  2645. if (BTC_RSSI_HIGH(wifi_rssi_state) &&
  2646. BTC_RSSI_HIGH(bt_rssi_state)) {
  2647. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  2648. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  2649. coex_dm->is_switch_to_1dot5_ant = FALSE;
  2650. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
  2651. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  2652. } else {
  2653. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  2654. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  2655. coex_dm->is_switch_to_1dot5_ant = FALSE;
  2656. if (coex_sta->is_eSCO_mode)
  2657. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 1);
  2658. else /* 2-Ant free run if SCO mode */
  2659. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
  2660. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE, 8);
  2661. }
  2662. }
  2663. void halbtc8821c2ant_action_hid(IN struct btc_coexist *btcoexist)
  2664. {
  2665. static u8 prewifi_rssi_state = BTC_RSSI_STATE_LOW;
  2666. static u8 pre_bt_rssi_state = BTC_RSSI_STATE_LOW;
  2667. u8 wifi_rssi_state, bt_rssi_state;
  2668. static u8 prewifi_rssi_state2 = BTC_RSSI_STATE_LOW;
  2669. static u8 pre_bt_rssi_state2 = BTC_RSSI_STATE_LOW;
  2670. u8 wifi_rssi_state2, bt_rssi_state2;
  2671. boolean wifi_busy = FALSE;
  2672. u32 wifi_bw = 1;
  2673. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
  2674. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
  2675. wifi_rssi_state = halbtc8821c2ant_wifi_rssi_state(btcoexist,
  2676. &prewifi_rssi_state, 2,
  2677. coex_sta->wifi_coex_thres, 0);
  2678. wifi_rssi_state2 = halbtc8821c2ant_wifi_rssi_state(btcoexist,
  2679. &prewifi_rssi_state2, 2,
  2680. coex_sta->wifi_coex_thres2, 0);
  2681. bt_rssi_state = halbtc8821c2ant_bt_rssi_state(btcoexist,
  2682. &pre_bt_rssi_state, 2,
  2683. coex_sta->bt_coex_thres, 0);
  2684. bt_rssi_state2 = halbtc8821c2ant_bt_rssi_state(btcoexist,
  2685. &pre_bt_rssi_state2, 2,
  2686. coex_sta->bt_coex_thres2, 0);
  2687. if (BTC_RSSI_HIGH(wifi_rssi_state) &&
  2688. BTC_RSSI_HIGH(bt_rssi_state)) {
  2689. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  2690. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  2691. coex_dm->is_switch_to_1dot5_ant = FALSE;
  2692. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
  2693. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  2694. } else {
  2695. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  2696. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  2697. coex_dm->is_switch_to_1dot5_ant = FALSE;
  2698. if (coex_sta->is_hid_low_pri_tx_overhead) {
  2699. halbtc8821c2ant_coex_table_with_type(btcoexist,
  2700. NORMAL_EXEC, 4);
  2701. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  2702. 108);
  2703. } else if (wifi_bw == 0) { /* if 11bg mode */
  2704. halbtc8821c2ant_coex_table_with_type(btcoexist,
  2705. NORMAL_EXEC, 8);
  2706. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  2707. 111);
  2708. } else {
  2709. halbtc8821c2ant_coex_table_with_type(btcoexist,
  2710. NORMAL_EXEC, 8);
  2711. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  2712. 111);
  2713. }
  2714. }
  2715. }
  2716. void halbtc8821c2ant_action_a2dpsink(IN struct btc_coexist *btcoexist)
  2717. {
  2718. static u8 prewifi_rssi_state = BTC_RSSI_STATE_LOW;
  2719. static u8 pre_bt_rssi_state = BTC_RSSI_STATE_LOW;
  2720. u8 wifi_rssi_state, bt_rssi_state;
  2721. static u8 prewifi_rssi_state2 = BTC_RSSI_STATE_LOW;
  2722. static u8 pre_bt_rssi_state2 = BTC_RSSI_STATE_LOW;
  2723. u8 wifi_rssi_state2, bt_rssi_state2;
  2724. boolean wifi_busy = FALSE, wifi_turbo = FALSE;
  2725. struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
  2726. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
  2727. btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
  2728. &coex_sta->scan_ap_num);
  2729. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2730. "############# [BTCoex], scan_ap_num = %d, wl_noisy = %d\n",
  2731. coex_sta->scan_ap_num, coex_sta->wl_noisy_level);
  2732. BTC_TRACE(trace_buf);
  2733. #if 1
  2734. if ((wifi_busy) && (coex_sta->wl_noisy_level == 0))
  2735. wifi_turbo = TRUE;
  2736. #endif
  2737. wifi_rssi_state = halbtc8821c2ant_wifi_rssi_state(btcoexist,
  2738. &prewifi_rssi_state, 2,
  2739. coex_sta->wifi_coex_thres, 0);
  2740. wifi_rssi_state2 = halbtc8821c2ant_wifi_rssi_state(btcoexist,
  2741. &prewifi_rssi_state2, 2,
  2742. coex_sta->wifi_coex_thres2, 0);
  2743. bt_rssi_state = halbtc8821c2ant_bt_rssi_state(btcoexist,
  2744. &pre_bt_rssi_state, 2,
  2745. coex_sta->bt_coex_thres, 0);
  2746. bt_rssi_state2 = halbtc8821c2ant_bt_rssi_state(btcoexist,
  2747. &pre_bt_rssi_state2, 2,
  2748. coex_sta->bt_coex_thres2, 0);
  2749. if (BTC_RSSI_HIGH(wifi_rssi_state) &&
  2750. BTC_RSSI_HIGH(bt_rssi_state)) {
  2751. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  2752. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  2753. coex_dm->is_switch_to_1dot5_ant = FALSE;
  2754. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
  2755. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  2756. } else if (BTC_RSSI_HIGH(wifi_rssi_state2) &&
  2757. BTC_RSSI_HIGH(bt_rssi_state2)) {
  2758. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xc8);
  2759. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
  2760. coex_dm->is_switch_to_1dot5_ant = FALSE;
  2761. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
  2762. if (wifi_busy)
  2763. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  2764. TRUE, 1);
  2765. else
  2766. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  2767. 16);
  2768. } else {
  2769. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  2770. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  2771. coex_dm->is_switch_to_1dot5_ant = TRUE;
  2772. if ((coex_sta->bt_relink_downcount != 0)
  2773. && (wifi_busy)) {
  2774. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2775. "############# [BTCoex], BT Re-Link + A2DP + WL busy\n");
  2776. BTC_TRACE(trace_buf);
  2777. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  2778. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
  2779. } else {
  2780. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8);
  2781. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  2782. TRUE, 105);
  2783. }
  2784. }
  2785. }
  2786. /* A2DP only / PAN(EDR) only/ A2DP+PAN(HS) */
  2787. void halbtc8821c2ant_action_a2dp(IN struct btc_coexist *btcoexist)
  2788. {
  2789. static u8 prewifi_rssi_state = BTC_RSSI_STATE_LOW;
  2790. static u8 pre_bt_rssi_state = BTC_RSSI_STATE_LOW;
  2791. u8 wifi_rssi_state, bt_rssi_state;
  2792. static u8 prewifi_rssi_state2 = BTC_RSSI_STATE_LOW;
  2793. static u8 pre_bt_rssi_state2 = BTC_RSSI_STATE_LOW;
  2794. u8 wifi_rssi_state2, bt_rssi_state2;
  2795. boolean wifi_busy = FALSE, wifi_turbo = FALSE;
  2796. struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
  2797. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
  2798. btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
  2799. &coex_sta->scan_ap_num);
  2800. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2801. "############# [BTCoex], scan_ap_num = %d, wl_noisy = %d\n",
  2802. coex_sta->scan_ap_num, coex_sta->wl_noisy_level);
  2803. BTC_TRACE(trace_buf);
  2804. if ((wifi_busy) && (coex_sta->wl_noisy_level == 0))
  2805. wifi_turbo = TRUE;
  2806. wifi_rssi_state = halbtc8821c2ant_wifi_rssi_state(btcoexist,
  2807. &prewifi_rssi_state, 2,
  2808. coex_sta->wifi_coex_thres, 0);
  2809. wifi_rssi_state2 = halbtc8821c2ant_wifi_rssi_state(btcoexist,
  2810. &prewifi_rssi_state2, 2,
  2811. coex_sta->wifi_coex_thres2, 0);
  2812. bt_rssi_state = halbtc8821c2ant_bt_rssi_state(btcoexist,
  2813. &pre_bt_rssi_state, 2,
  2814. coex_sta->bt_coex_thres, 0);
  2815. bt_rssi_state2 = halbtc8821c2ant_bt_rssi_state(btcoexist,
  2816. &pre_bt_rssi_state2, 2,
  2817. coex_sta->bt_coex_thres2, 0);
  2818. if (BTC_RSSI_HIGH(wifi_rssi_state) &&
  2819. BTC_RSSI_HIGH(bt_rssi_state)) {
  2820. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  2821. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  2822. coex_dm->is_switch_to_1dot5_ant = FALSE;
  2823. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
  2824. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  2825. } else if (BTC_RSSI_HIGH(wifi_rssi_state2) &&
  2826. BTC_RSSI_HIGH(bt_rssi_state2)) {
  2827. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xc8);
  2828. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
  2829. coex_dm->is_switch_to_1dot5_ant = FALSE;
  2830. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
  2831. if (wifi_busy)
  2832. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  2833. TRUE, 1);
  2834. else
  2835. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  2836. 16);
  2837. } else {
  2838. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  2839. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  2840. coex_dm->is_switch_to_1dot5_ant = TRUE;
  2841. if ((coex_sta->bt_relink_downcount != 0)
  2842. && (wifi_busy)) {
  2843. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2844. "############# [BTCoex], BT Re-Link + A2DP + WL busy\n");
  2845. BTC_TRACE(trace_buf);
  2846. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  2847. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
  2848. } else {
  2849. if (wifi_turbo)
  2850. halbtc8821c2ant_coex_table_with_type(btcoexist,
  2851. NORMAL_EXEC, 6);
  2852. else
  2853. halbtc8821c2ant_coex_table_with_type(btcoexist,
  2854. NORMAL_EXEC,
  2855. 7);
  2856. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  2857. TRUE, 101);
  2858. }
  2859. }
  2860. }
  2861. void halbtc8821c2ant_action_pan_edr(IN struct btc_coexist *btcoexist)
  2862. {
  2863. static u8 prewifi_rssi_state = BTC_RSSI_STATE_LOW;
  2864. static u8 pre_bt_rssi_state = BTC_RSSI_STATE_LOW;
  2865. u8 wifi_rssi_state, bt_rssi_state;
  2866. static u8 prewifi_rssi_state2 = BTC_RSSI_STATE_LOW;
  2867. static u8 pre_bt_rssi_state2 = BTC_RSSI_STATE_LOW;
  2868. u8 wifi_rssi_state2, bt_rssi_state2;
  2869. boolean wifi_busy = FALSE, wifi_turbo = FALSE;
  2870. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
  2871. btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
  2872. &coex_sta->scan_ap_num);
  2873. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2874. "############# [BTCoex], scan_ap_num = %d, wl_noisy = %d\n",
  2875. coex_sta->scan_ap_num, coex_sta->wl_noisy_level);
  2876. BTC_TRACE(trace_buf);
  2877. #if 1
  2878. if ((wifi_busy) && (coex_sta->wl_noisy_level == 0))
  2879. wifi_turbo = TRUE;
  2880. #endif
  2881. wifi_rssi_state = halbtc8821c2ant_wifi_rssi_state(btcoexist,
  2882. &prewifi_rssi_state, 2,
  2883. coex_sta->wifi_coex_thres, 0);
  2884. wifi_rssi_state2 = halbtc8821c2ant_wifi_rssi_state(btcoexist,
  2885. &prewifi_rssi_state2, 2,
  2886. coex_sta->wifi_coex_thres2, 0);
  2887. bt_rssi_state = halbtc8821c2ant_bt_rssi_state(btcoexist,
  2888. &pre_bt_rssi_state, 2,
  2889. coex_sta->bt_coex_thres, 0);
  2890. bt_rssi_state2 = halbtc8821c2ant_bt_rssi_state(btcoexist,
  2891. &pre_bt_rssi_state2, 2,
  2892. coex_sta->bt_coex_thres2, 0);
  2893. #if 0
  2894. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  2895. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  2896. coex_dm->is_switch_to_1dot5_ant = FALSE;
  2897. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
  2898. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  2899. #endif
  2900. #if 1
  2901. if (BTC_RSSI_HIGH(wifi_rssi_state) &&
  2902. BTC_RSSI_HIGH(bt_rssi_state)) {
  2903. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  2904. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  2905. coex_dm->is_switch_to_1dot5_ant = FALSE;
  2906. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
  2907. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  2908. } else if (BTC_RSSI_HIGH(wifi_rssi_state2) &&
  2909. BTC_RSSI_HIGH(bt_rssi_state2)) {
  2910. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xc8);
  2911. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
  2912. coex_dm->is_switch_to_1dot5_ant = FALSE;
  2913. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
  2914. if (wifi_busy)
  2915. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  2916. 3);
  2917. else
  2918. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  2919. 4);
  2920. } else {
  2921. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  2922. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  2923. coex_dm->is_switch_to_1dot5_ant = TRUE;
  2924. halbtc8821c2ant_coex_table_with_type(btcoexist,
  2925. NORMAL_EXEC, 8);
  2926. if (wifi_busy)
  2927. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  2928. 103);
  2929. else
  2930. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  2931. 104);
  2932. }
  2933. #endif
  2934. }
  2935. void halbtc8821c2ant_action_hid_a2dp(IN struct btc_coexist *btcoexist)
  2936. {
  2937. static u8 prewifi_rssi_state = BTC_RSSI_STATE_LOW;
  2938. static u8 pre_bt_rssi_state = BTC_RSSI_STATE_LOW;
  2939. u8 wifi_rssi_state, bt_rssi_state;
  2940. static u8 prewifi_rssi_state2 = BTC_RSSI_STATE_LOW;
  2941. static u8 pre_bt_rssi_state2 = BTC_RSSI_STATE_LOW;
  2942. u8 wifi_rssi_state2, bt_rssi_state2;
  2943. boolean wifi_busy = FALSE;
  2944. u32 wifi_bw = 1;
  2945. struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
  2946. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW,
  2947. &wifi_bw);
  2948. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
  2949. wifi_rssi_state = halbtc8821c2ant_wifi_rssi_state(btcoexist,
  2950. &prewifi_rssi_state, 2,
  2951. coex_sta->wifi_coex_thres, 0);
  2952. wifi_rssi_state2 = halbtc8821c2ant_wifi_rssi_state(btcoexist,
  2953. &prewifi_rssi_state2, 2,
  2954. coex_sta->wifi_coex_thres2, 0);
  2955. bt_rssi_state = halbtc8821c2ant_bt_rssi_state(btcoexist,
  2956. &pre_bt_rssi_state, 2,
  2957. coex_sta->bt_coex_thres, 0);
  2958. bt_rssi_state2 = halbtc8821c2ant_bt_rssi_state(btcoexist,
  2959. &pre_bt_rssi_state2, 2,
  2960. coex_sta->bt_coex_thres2, 0);
  2961. if (BTC_RSSI_HIGH(wifi_rssi_state) &&
  2962. BTC_RSSI_HIGH(bt_rssi_state)) {
  2963. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  2964. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  2965. coex_dm->is_switch_to_1dot5_ant = FALSE;
  2966. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
  2967. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  2968. } else if (BTC_RSSI_HIGH(wifi_rssi_state2) &&
  2969. BTC_RSSI_HIGH(bt_rssi_state2)) {
  2970. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xc8);
  2971. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
  2972. coex_dm->is_switch_to_1dot5_ant = FALSE;
  2973. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
  2974. if (wifi_busy)
  2975. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  2976. TRUE, 1);
  2977. else
  2978. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  2979. 16);
  2980. } else {
  2981. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  2982. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  2983. coex_dm->is_switch_to_1dot5_ant = TRUE;
  2984. if ((coex_sta->bt_relink_downcount != 0)
  2985. && (wifi_busy)) {
  2986. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  2987. "############# [BTCoex], BT Re-Link + A2DP + WL busy\n");
  2988. BTC_TRACE(trace_buf);
  2989. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  2990. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 5);
  2991. } else {
  2992. halbtc8821c2ant_coex_table_with_type(btcoexist,
  2993. NORMAL_EXEC, 8);
  2994. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  2995. TRUE, 109);
  2996. }
  2997. }
  2998. }
  2999. void halbtc8821c2ant_action_a2dp_pan_hs(IN struct btc_coexist *btcoexist)
  3000. {
  3001. static u8 prewifi_rssi_state = BTC_RSSI_STATE_LOW;
  3002. static u8 pre_bt_rssi_state = BTC_RSSI_STATE_LOW;
  3003. u8 wifi_rssi_state, bt_rssi_state;
  3004. static u8 prewifi_rssi_state2 = BTC_RSSI_STATE_LOW;
  3005. static u8 pre_bt_rssi_state2 = BTC_RSSI_STATE_LOW;
  3006. u8 wifi_rssi_state2, bt_rssi_state2;
  3007. boolean wifi_busy = FALSE, wifi_turbo = FALSE;
  3008. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
  3009. btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
  3010. &coex_sta->scan_ap_num);
  3011. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3012. "############# [BTCoex], scan_ap_num = %d, wl_noisy = %d\n",
  3013. coex_sta->scan_ap_num, coex_sta->wl_noisy_level);
  3014. BTC_TRACE(trace_buf);
  3015. #if 1
  3016. if ((wifi_busy) && (coex_sta->wl_noisy_level == 0))
  3017. wifi_turbo = TRUE;
  3018. #endif
  3019. wifi_rssi_state = halbtc8821c2ant_wifi_rssi_state(btcoexist,
  3020. &prewifi_rssi_state, 2,
  3021. coex_sta->wifi_coex_thres, 0);
  3022. wifi_rssi_state2 = halbtc8821c2ant_wifi_rssi_state(btcoexist,
  3023. &prewifi_rssi_state2, 2,
  3024. coex_sta->wifi_coex_thres2, 0);
  3025. bt_rssi_state = halbtc8821c2ant_bt_rssi_state(btcoexist,
  3026. &pre_bt_rssi_state, 2,
  3027. coex_sta->bt_coex_thres, 0);
  3028. bt_rssi_state2 = halbtc8821c2ant_bt_rssi_state(btcoexist,
  3029. &pre_bt_rssi_state2, 2,
  3030. coex_sta->bt_coex_thres2, 0);
  3031. if (BTC_RSSI_HIGH(wifi_rssi_state) &&
  3032. BTC_RSSI_HIGH(bt_rssi_state)) {
  3033. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  3034. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  3035. coex_dm->is_switch_to_1dot5_ant = FALSE;
  3036. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
  3037. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  3038. } else if (BTC_RSSI_HIGH(wifi_rssi_state2) &&
  3039. BTC_RSSI_HIGH(bt_rssi_state2)) {
  3040. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xc8);
  3041. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
  3042. coex_dm->is_switch_to_1dot5_ant = FALSE;
  3043. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
  3044. if (wifi_busy) {
  3045. if ((coex_sta->a2dp_bit_pool > 40) &&
  3046. (coex_sta->a2dp_bit_pool < 255))
  3047. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  3048. TRUE, 7);
  3049. else
  3050. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  3051. TRUE, 5);
  3052. } else
  3053. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  3054. 6);
  3055. } else {
  3056. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  3057. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  3058. coex_dm->is_switch_to_1dot5_ant = TRUE;
  3059. if (wifi_turbo)
  3060. halbtc8821c2ant_coex_table_with_type(btcoexist,
  3061. NORMAL_EXEC, 6);
  3062. else
  3063. halbtc8821c2ant_coex_table_with_type(btcoexist,
  3064. NORMAL_EXEC,
  3065. 7);
  3066. if (wifi_busy) {
  3067. if ((coex_sta->a2dp_bit_pool > 40) &&
  3068. (coex_sta->a2dp_bit_pool < 255))
  3069. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  3070. TRUE, 107);
  3071. else
  3072. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  3073. TRUE, 105);
  3074. } else
  3075. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  3076. 106);
  3077. }
  3078. }
  3079. /* PAN(EDR)+A2DP */
  3080. void halbtc8821c2ant_action_pan_edr_a2dp(IN struct btc_coexist *btcoexist)
  3081. {
  3082. static u8 prewifi_rssi_state = BTC_RSSI_STATE_LOW;
  3083. static u8 pre_bt_rssi_state = BTC_RSSI_STATE_LOW;
  3084. u8 wifi_rssi_state, bt_rssi_state;
  3085. static u8 prewifi_rssi_state2 = BTC_RSSI_STATE_LOW;
  3086. static u8 pre_bt_rssi_state2 = BTC_RSSI_STATE_LOW;
  3087. u8 wifi_rssi_state2, bt_rssi_state2;
  3088. boolean wifi_busy = FALSE, wifi_turbo = FALSE;
  3089. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
  3090. btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
  3091. &coex_sta->scan_ap_num);
  3092. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3093. "############# [BTCoex], scan_ap_num = %d, wl_noisy = %d\n",
  3094. coex_sta->scan_ap_num, coex_sta->wl_noisy_level);
  3095. BTC_TRACE(trace_buf);
  3096. if ((wifi_busy) && (coex_sta->wl_noisy_level == 0))
  3097. wifi_turbo = TRUE;
  3098. wifi_rssi_state = halbtc8821c2ant_wifi_rssi_state(btcoexist,
  3099. &prewifi_rssi_state, 2,
  3100. coex_sta->wifi_coex_thres, 0);
  3101. wifi_rssi_state2 = halbtc8821c2ant_wifi_rssi_state(btcoexist,
  3102. &prewifi_rssi_state2, 2,
  3103. coex_sta->wifi_coex_thres2, 0);
  3104. bt_rssi_state = halbtc8821c2ant_bt_rssi_state(btcoexist,
  3105. &pre_bt_rssi_state, 2,
  3106. coex_sta->bt_coex_thres, 0);
  3107. bt_rssi_state2 = halbtc8821c2ant_bt_rssi_state(btcoexist,
  3108. &pre_bt_rssi_state2, 2,
  3109. coex_sta->bt_coex_thres2, 0);
  3110. if (BTC_RSSI_HIGH(wifi_rssi_state) &&
  3111. BTC_RSSI_HIGH(bt_rssi_state)) {
  3112. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  3113. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  3114. coex_dm->is_switch_to_1dot5_ant = FALSE;
  3115. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
  3116. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  3117. } else if (BTC_RSSI_HIGH(wifi_rssi_state2) &&
  3118. BTC_RSSI_HIGH(bt_rssi_state2)) {
  3119. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xc8);
  3120. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
  3121. coex_dm->is_switch_to_1dot5_ant = FALSE;
  3122. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
  3123. if (wifi_busy) {
  3124. if (((coex_sta->a2dp_bit_pool > 40) &&
  3125. (coex_sta->a2dp_bit_pool < 255)) ||
  3126. (!coex_sta->is_A2DP_3M))
  3127. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  3128. TRUE, 7);
  3129. else
  3130. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  3131. TRUE, 5);
  3132. } else
  3133. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  3134. 6);
  3135. } else {
  3136. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  3137. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  3138. coex_dm->is_switch_to_1dot5_ant = TRUE;
  3139. halbtc8821c2ant_coex_table_with_type(btcoexist,
  3140. NORMAL_EXEC,
  3141. 8);
  3142. if (wifi_busy)
  3143. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  3144. 107);
  3145. else
  3146. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  3147. 106);
  3148. }
  3149. }
  3150. void halbtc8821c2ant_action_pan_edr_hid(IN struct btc_coexist *btcoexist)
  3151. {
  3152. static u8 prewifi_rssi_state = BTC_RSSI_STATE_LOW;
  3153. static u8 pre_bt_rssi_state = BTC_RSSI_STATE_LOW;
  3154. u8 wifi_rssi_state, bt_rssi_state;
  3155. static u8 prewifi_rssi_state2 = BTC_RSSI_STATE_LOW;
  3156. static u8 pre_bt_rssi_state2 = BTC_RSSI_STATE_LOW;
  3157. u8 wifi_rssi_state2, bt_rssi_state2;
  3158. boolean wifi_busy = FALSE;
  3159. u32 wifi_bw = 1;
  3160. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW,
  3161. &wifi_bw);
  3162. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
  3163. wifi_rssi_state = halbtc8821c2ant_wifi_rssi_state(btcoexist,
  3164. &prewifi_rssi_state, 2,
  3165. coex_sta->wifi_coex_thres, 0);
  3166. wifi_rssi_state2 = halbtc8821c2ant_wifi_rssi_state(btcoexist,
  3167. &prewifi_rssi_state2, 2,
  3168. coex_sta->wifi_coex_thres2, 0);
  3169. bt_rssi_state = halbtc8821c2ant_bt_rssi_state(btcoexist,
  3170. &pre_bt_rssi_state, 2,
  3171. coex_sta->bt_coex_thres, 0);
  3172. bt_rssi_state2 = halbtc8821c2ant_bt_rssi_state(btcoexist,
  3173. &pre_bt_rssi_state2, 2,
  3174. coex_sta->bt_coex_thres2, 0);
  3175. if (BTC_RSSI_HIGH(wifi_rssi_state) &&
  3176. BTC_RSSI_HIGH(bt_rssi_state)) {
  3177. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  3178. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  3179. coex_dm->is_switch_to_1dot5_ant = FALSE;
  3180. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
  3181. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  3182. } else if (BTC_RSSI_HIGH(wifi_rssi_state2) &&
  3183. BTC_RSSI_HIGH(bt_rssi_state2)) {
  3184. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xc8);
  3185. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
  3186. coex_dm->is_switch_to_1dot5_ant = FALSE;
  3187. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
  3188. if (wifi_busy)
  3189. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  3190. 3);
  3191. else
  3192. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  3193. 4);
  3194. } else {
  3195. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  3196. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  3197. coex_dm->is_switch_to_1dot5_ant = TRUE;
  3198. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8);
  3199. if (wifi_busy)
  3200. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  3201. 103);
  3202. else
  3203. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  3204. 104);
  3205. }
  3206. }
  3207. /* HID+A2DP+PAN(EDR) */
  3208. void halbtc8821c2ant_action_hid_a2dp_pan_edr(IN struct btc_coexist *btcoexist)
  3209. {
  3210. static u8 prewifi_rssi_state = BTC_RSSI_STATE_LOW;
  3211. static u8 pre_bt_rssi_state = BTC_RSSI_STATE_LOW;
  3212. u8 wifi_rssi_state, bt_rssi_state;
  3213. static u8 prewifi_rssi_state2 = BTC_RSSI_STATE_LOW;
  3214. static u8 pre_bt_rssi_state2 = BTC_RSSI_STATE_LOW;
  3215. u8 wifi_rssi_state2, bt_rssi_state2;
  3216. boolean wifi_busy = FALSE;
  3217. u32 wifi_bw = 1;
  3218. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW,
  3219. &wifi_bw);
  3220. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
  3221. wifi_rssi_state = halbtc8821c2ant_wifi_rssi_state(btcoexist,
  3222. &prewifi_rssi_state, 2,
  3223. coex_sta->wifi_coex_thres, 0);
  3224. wifi_rssi_state2 = halbtc8821c2ant_wifi_rssi_state(btcoexist,
  3225. &prewifi_rssi_state2, 2,
  3226. coex_sta->wifi_coex_thres2, 0);
  3227. bt_rssi_state = halbtc8821c2ant_bt_rssi_state(btcoexist,
  3228. &pre_bt_rssi_state, 2,
  3229. coex_sta->bt_coex_thres, 0);
  3230. bt_rssi_state2 = halbtc8821c2ant_bt_rssi_state(btcoexist,
  3231. &pre_bt_rssi_state2, 2,
  3232. coex_sta->bt_coex_thres2, 0);
  3233. if (BTC_RSSI_HIGH(wifi_rssi_state) &&
  3234. BTC_RSSI_HIGH(bt_rssi_state)) {
  3235. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  3236. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  3237. coex_dm->is_switch_to_1dot5_ant = FALSE;
  3238. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
  3239. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  3240. } else if (BTC_RSSI_HIGH(wifi_rssi_state2) &&
  3241. BTC_RSSI_HIGH(bt_rssi_state2)) {
  3242. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xc8);
  3243. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 2);
  3244. coex_dm->is_switch_to_1dot5_ant = FALSE;
  3245. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 4);
  3246. if (wifi_busy) {
  3247. if (((coex_sta->a2dp_bit_pool > 40) &&
  3248. (coex_sta->a2dp_bit_pool < 255)) ||
  3249. (!coex_sta->is_A2DP_3M))
  3250. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  3251. TRUE, 7);
  3252. else
  3253. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  3254. TRUE, 5);
  3255. } else
  3256. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  3257. 6);
  3258. } else {
  3259. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  3260. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  3261. coex_dm->is_switch_to_1dot5_ant = TRUE;
  3262. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8);
  3263. if (wifi_busy)
  3264. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  3265. 107);
  3266. else
  3267. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE,
  3268. 106);
  3269. }
  3270. }
  3271. void halbtc8821c2ant_action_wifi_under5g(IN struct btc_coexist *btcoexist)
  3272. {
  3273. /* fw all off */
  3274. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  3275. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
  3276. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  3277. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  3278. halbtc8821c2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, NORMAL_EXEC,
  3279. BT_8821C_2ANT_PHASE_5G_RUNTIME);
  3280. }
  3281. void halbtc8821c2ant_action_wifi_native_lps(IN struct btc_coexist *btcoexist)
  3282. {
  3283. halbtc8821c2ant_coex_table_with_type(btcoexist,
  3284. NORMAL_EXEC, 2);
  3285. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  3286. }
  3287. void halbtc8821c2ant_action_wifi_multi_port(IN struct btc_coexist *btcoexist)
  3288. {
  3289. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  3290. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  3291. /* hw all off */
  3292. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
  3293. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  3294. }
  3295. void halbtc8821c2ant_action_wifi_linkscan_process(IN struct btc_coexist
  3296. *btcoexist)
  3297. {
  3298. struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
  3299. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 0xd8);
  3300. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  3301. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8);
  3302. if (bt_link_info->pan_exist) {
  3303. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE, 22);
  3304. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8);
  3305. } else if (bt_link_info->a2dp_exist) {
  3306. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE, 16);
  3307. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8);
  3308. } else {
  3309. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, TRUE, 21);
  3310. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 8);
  3311. }
  3312. }
  3313. void halbtc8821c2ant_action_wifi_not_connected(IN struct btc_coexist *btcoexist)
  3314. {
  3315. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
  3316. /* fw all off */
  3317. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  3318. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  3319. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  3320. }
  3321. void halbtc8821c2ant_action_wifi_connected(IN struct btc_coexist *btcoexist)
  3322. {
  3323. switch (coex_dm->cur_algorithm) {
  3324. case BT_8821C_2ANT_COEX_ALGO_SCO:
  3325. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3326. "[BTCoex], Action 2-Ant, algorithm = SCO.\n");
  3327. BTC_TRACE(trace_buf);
  3328. halbtc8821c2ant_action_sco(btcoexist);
  3329. break;
  3330. case BT_8821C_2ANT_COEX_ALGO_HID:
  3331. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3332. "[BTCoex], Action 2-Ant, algorithm = HID.\n");
  3333. BTC_TRACE(trace_buf);
  3334. halbtc8821c2ant_action_hid(btcoexist);
  3335. break;
  3336. case BT_8821C_2ANT_COEX_ALGO_A2DP:
  3337. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3338. "[BTCoex], Action 2-Ant, algorithm = A2DP.\n");
  3339. BTC_TRACE(trace_buf);
  3340. halbtc8821c2ant_action_a2dp(btcoexist);
  3341. break;
  3342. case BT_8821C_2ANT_COEX_ALGO_A2DPSINK:
  3343. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3344. "[BTCoex], Action 2-Ant, algorithm = A2DP Sink.\n");
  3345. BTC_TRACE(trace_buf);
  3346. halbtc8821c2ant_action_a2dpsink(btcoexist);
  3347. break;
  3348. case BT_8821C_2ANT_COEX_ALGO_A2DP_PANHS:
  3349. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3350. "[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS).\n");
  3351. BTC_TRACE(trace_buf);
  3352. halbtc8821c2ant_action_a2dp_pan_hs(btcoexist);
  3353. break;
  3354. case BT_8821C_2ANT_COEX_ALGO_PANEDR:
  3355. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3356. "[BTCoex], Action 2-Ant, algorithm = PAN(EDR).\n");
  3357. BTC_TRACE(trace_buf);
  3358. halbtc8821c2ant_action_pan_edr(btcoexist);
  3359. break;
  3360. case BT_8821C_2ANT_COEX_ALGO_PANEDR_A2DP:
  3361. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3362. "[BTCoex], Action 2-Ant, algorithm = PAN+A2DP.\n");
  3363. BTC_TRACE(trace_buf);
  3364. halbtc8821c2ant_action_pan_edr_a2dp(btcoexist);
  3365. break;
  3366. case BT_8821C_2ANT_COEX_ALGO_PANEDR_HID:
  3367. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3368. "[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID.\n");
  3369. BTC_TRACE(trace_buf);
  3370. halbtc8821c2ant_action_pan_edr_hid(btcoexist);
  3371. break;
  3372. case BT_8821C_2ANT_COEX_ALGO_HID_A2DP_PANEDR:
  3373. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3374. "[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN.\n");
  3375. BTC_TRACE(trace_buf);
  3376. halbtc8821c2ant_action_hid_a2dp_pan_edr(
  3377. btcoexist);
  3378. break;
  3379. case BT_8821C_2ANT_COEX_ALGO_HID_A2DP:
  3380. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3381. "[BTCoex], Action 2-Ant, algorithm = HID+A2DP.\n");
  3382. BTC_TRACE(trace_buf);
  3383. halbtc8821c2ant_action_hid_a2dp(btcoexist);
  3384. break;
  3385. case BT_8821C_2ANT_COEX_ALGO_NOPROFILEBUSY:
  3386. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3387. "[BTCoex], Action 2-Ant, algorithm = No-Profile busy.\n");
  3388. BTC_TRACE(trace_buf);
  3389. halbtc8821c2ant_action_bt_idle(btcoexist);
  3390. break;
  3391. default:
  3392. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3393. "[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n");
  3394. BTC_TRACE(trace_buf);
  3395. halbtc8821c2ant_action_coex_all_off(btcoexist);
  3396. break;
  3397. }
  3398. coex_dm->pre_algorithm = coex_dm->cur_algorithm;
  3399. }
  3400. void halbtc8821c2ant_run_coexist_mechanism(IN struct btc_coexist *btcoexist)
  3401. {
  3402. u8 algorithm = 0;
  3403. u32 num_of_wifi_link = 0;
  3404. u32 wifi_link_status = 0;
  3405. struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
  3406. boolean miracast_plus_bt = FALSE;
  3407. boolean scan = FALSE, link = FALSE, roam = FALSE,
  3408. under_4way = FALSE,
  3409. wifi_connected = FALSE, wifi_under_5g =
  3410. FALSE,
  3411. bt_hs_on = FALSE;
  3412. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
  3413. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
  3414. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
  3415. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
  3416. &under_4way);
  3417. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3418. "[BTCoex], RunCoexistMechanism()===>\n");
  3419. BTC_TRACE(trace_buf);
  3420. if (btcoexist->manual_control) {
  3421. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3422. "[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n");
  3423. BTC_TRACE(trace_buf);
  3424. return;
  3425. }
  3426. if (btcoexist->stop_coex_dm) {
  3427. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3428. "[BTCoex], RunCoexistMechanism(), return for Stop Coex DM <===\n");
  3429. BTC_TRACE(trace_buf);
  3430. return;
  3431. }
  3432. if (coex_sta->under_ips) {
  3433. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3434. "[BTCoex], wifi is under IPS !!!\n");
  3435. BTC_TRACE(trace_buf);
  3436. return;
  3437. }
  3438. if ((coex_sta->under_lps) &&
  3439. (coex_dm->bt_status != BT_8821C_2ANT_BT_STATUS_ACL_BUSY)) {
  3440. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3441. "[BTCoex], RunCoexistMechanism(), wifi is under LPS !!!\n");
  3442. BTC_TRACE(trace_buf);
  3443. halbtc8821c2ant_action_wifi_native_lps(btcoexist);
  3444. return;
  3445. }
  3446. if (!coex_sta->run_time_state) {
  3447. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3448. "[BTCoex], return for run_time_state = FALSE !!!\n");
  3449. BTC_TRACE(trace_buf);
  3450. return;
  3451. }
  3452. if (coex_sta->freeze_coexrun_by_btinfo) {
  3453. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3454. "[BTCoex], BtInfoNotify(), return for freeze_coexrun_by_btinfo\n");
  3455. BTC_TRACE(trace_buf);
  3456. return;
  3457. }
  3458. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
  3459. if ((wifi_under_5g) &&
  3460. (coex_sta->switch_band_notify_to != BTC_SWITCH_TO_24G) &&
  3461. (coex_sta->switch_band_notify_to != BTC_SWITCH_TO_24G_NOFORSCAN)) {
  3462. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3463. "[BTCoex], WiFi is under 5G!!!\n");
  3464. BTC_TRACE(trace_buf);
  3465. halbtc8821c2ant_action_wifi_under5g(btcoexist);
  3466. return;
  3467. } else {
  3468. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3469. "[BTCoex], WiFi is under 2G!!!\n");
  3470. BTC_TRACE(trace_buf);
  3471. halbtc8821c2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
  3472. NORMAL_EXEC,
  3473. BT_8821C_2ANT_PHASE_2G_RUNTIME);
  3474. }
  3475. if (coex_sta->bt_whck_test) {
  3476. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3477. "[BTCoex], BT is under WHCK TEST!!!\n");
  3478. BTC_TRACE(trace_buf);
  3479. halbtc8821c2ant_action_bt_whql_test(btcoexist);
  3480. return;
  3481. }
  3482. if (coex_sta->bt_disabled) {
  3483. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3484. "[BTCoex], BT is disabled!!!\n");
  3485. BTC_TRACE(trace_buf);
  3486. halbtc8821c2ant_action_coex_all_off(btcoexist);
  3487. return;
  3488. }
  3489. if (coex_sta->c2h_bt_inquiry_page) {
  3490. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3491. "[BTCoex], BT is under inquiry/page scan !!\n");
  3492. BTC_TRACE(trace_buf);
  3493. halbtc8821c2ant_action_bt_inquiry(btcoexist);
  3494. return;
  3495. }
  3496. if (coex_sta->is_setupLink) {
  3497. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3498. "[BTCoex], BT is re-link !!!\n");
  3499. BTC_TRACE(trace_buf);
  3500. halbtc8821c2ant_action_bt_relink(btcoexist);
  3501. return;
  3502. }
  3503. /* for P2P */
  3504. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_LINK_STATUS,
  3505. &wifi_link_status);
  3506. num_of_wifi_link = wifi_link_status >> 16;
  3507. if ((num_of_wifi_link >= 2) ||
  3508. (wifi_link_status & WIFI_P2P_GO_CONNECTED)) {
  3509. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3510. "############# [BTCoex], Multi-Port num_of_wifi_link = %d, wifi_link_status = 0x%x\n",
  3511. num_of_wifi_link, wifi_link_status);
  3512. BTC_TRACE(trace_buf);
  3513. if (bt_link_info->bt_link_exist)
  3514. miracast_plus_bt = TRUE;
  3515. else
  3516. miracast_plus_bt = FALSE;
  3517. btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
  3518. &miracast_plus_bt);
  3519. if (scan || link || roam || under_4way) {
  3520. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3521. "[BTCoex], scan = %d, link = %d, roam = %d 4way = %d!!!\n",
  3522. scan, link, roam, under_4way);
  3523. BTC_TRACE(trace_buf);
  3524. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3525. "[BTCoex], wifi is under linkscan process + Multi-Port !!\n");
  3526. BTC_TRACE(trace_buf);
  3527. halbtc8821c2ant_action_wifi_linkscan_process(btcoexist);
  3528. } else
  3529. halbtc8821c2ant_action_wifi_multi_port(btcoexist);
  3530. return;
  3531. } else {
  3532. miracast_plus_bt = FALSE;
  3533. btcoexist->btc_set(btcoexist, BTC_SET_BL_MIRACAST_PLUS_BT,
  3534. &miracast_plus_bt);
  3535. }
  3536. btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
  3537. if (bt_hs_on) {
  3538. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3539. "############# [BTCoex], BT Is hs\n");
  3540. BTC_TRACE(trace_buf);
  3541. halbtc8821c2ant_action_bt_hs(btcoexist);
  3542. return;
  3543. }
  3544. if ((BT_8821C_2ANT_BT_STATUS_NON_CONNECTED_IDLE ==
  3545. coex_dm->bt_status) ||
  3546. (BT_8821C_2ANT_BT_STATUS_CONNECTED_IDLE ==
  3547. coex_dm->bt_status)) {
  3548. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3549. "[BTCoex], Action 2-Ant, bt idle!!.\n");
  3550. BTC_TRACE(trace_buf);
  3551. halbtc8821c2ant_action_bt_idle(btcoexist);
  3552. return;
  3553. }
  3554. algorithm = halbtc8821c2ant_action_algorithm(btcoexist);
  3555. coex_dm->cur_algorithm = algorithm;
  3556. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Algorithm = %d\n",
  3557. coex_dm->cur_algorithm);
  3558. BTC_TRACE(trace_buf);
  3559. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
  3560. &wifi_connected);
  3561. if (scan || link || roam || under_4way) {
  3562. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3563. "[BTCoex], WiFi is under Link Process !!\n");
  3564. BTC_TRACE(trace_buf);
  3565. halbtc8821c2ant_action_wifi_linkscan_process(btcoexist);
  3566. } else if (wifi_connected) {
  3567. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3568. "[BTCoex], Action 2-Ant, wifi connected!!.\n");
  3569. BTC_TRACE(trace_buf);
  3570. halbtc8821c2ant_action_wifi_connected(btcoexist);
  3571. } else {
  3572. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3573. "[BTCoex], Action 2-Ant, wifi not-connected!!.\n");
  3574. BTC_TRACE(trace_buf);
  3575. halbtc8821c2ant_action_wifi_not_connected(btcoexist);
  3576. }
  3577. }
  3578. void halbtc8821c2ant_init_coex_dm(IN struct btc_coexist *btcoexist)
  3579. {
  3580. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3581. "[BTCoex], Coex Mechanism Init!!\n");
  3582. BTC_TRACE(trace_buf);
  3583. halbtc8821c2ant_low_penalty_ra(btcoexist, NORMAL_EXEC, FALSE);
  3584. halbtc8821c2ant_coex_table_with_type(btcoexist, NORMAL_EXEC, 0);
  3585. /* fw all off */
  3586. halbtc8821c2ant_ps_tdma(btcoexist, NORMAL_EXEC, FALSE, 0);
  3587. halbtc8821c2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 0xd8);
  3588. halbtc8821c2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, 0);
  3589. coex_sta->pop_event_cnt = 0;
  3590. coex_sta->cnt_RemoteNameReq = 0;
  3591. coex_sta->cnt_ReInit = 0;
  3592. coex_sta->cnt_setupLink = 0;
  3593. coex_sta->cnt_IgnWlanAct = 0;
  3594. coex_sta->cnt_Page = 0;
  3595. coex_sta->cnt_RoleSwitch = 0;
  3596. coex_sta->switch_band_notify_to = BTC_NOT_SWITCH;
  3597. halbtc8821c2ant_query_bt_info(btcoexist);
  3598. }
  3599. void halbtc8821c2ant_init_hw_config(IN struct btc_coexist *btcoexist,
  3600. IN boolean wifi_only)
  3601. {
  3602. u8 u8tmp = 0;
  3603. u32 vendor;
  3604. u32 u32tmp0 = 0, u32tmp1 = 0, u32tmp2 = 0, u32tmp3 = 0;
  3605. u8 i;
  3606. u32tmp3 = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
  3607. u32tmp1 = halbtc8821c2ant_ltecoex_indirect_read_reg(btcoexist, 0x38);
  3608. u32tmp2 = halbtc8821c2ant_ltecoex_indirect_read_reg(btcoexist, 0x54);
  3609. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3610. "[BTCoex], (Before Init HW config) 0xcb4 = 0x%x, 0x38= 0x%x, 0x54= 0x%x\n",
  3611. u32tmp3, u32tmp1, u32tmp2);
  3612. BTC_TRACE(trace_buf);;
  3613. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3614. "[BTCoex], 2Ant Init HW Config!!\n");
  3615. BTC_TRACE(trace_buf);
  3616. coex_sta->bt_coex_supported_feature = 0;
  3617. coex_sta->bt_coex_supported_version = 0;
  3618. coex_sta->bt_ble_scan_type = 0;
  3619. coex_sta->bt_ble_scan_para[0] = 0;
  3620. coex_sta->bt_ble_scan_para[1] = 0;
  3621. coex_sta->bt_ble_scan_para[2] = 0;
  3622. coex_sta->bt_reg_vendor_ac = 0xffff;
  3623. coex_sta->bt_reg_vendor_ae = 0xffff;
  3624. coex_sta->isolation_btween_wb = BT_8821C_2ANT_DEFAULT_ISOLATION;
  3625. coex_sta->gnt_error_cnt = 0;
  3626. coex_sta->bt_relink_downcount = 0;
  3627. coex_sta->is_set_ps_state_fail = FALSE;
  3628. coex_sta->cnt_set_ps_state_fail = 0;
  3629. for (i = 0; i <= 9; i++)
  3630. coex_sta->bt_afh_map[i] = 0;
  3631. /* 0xf0[15:12] --> Chip Cut information */
  3632. coex_sta->cut_version = (btcoexist->btc_read_1byte(btcoexist,
  3633. 0xf1) & 0xf0) >> 4;
  3634. coex_sta->dis_ver_info_cnt = 0;
  3635. halbtc8821c2ant_coex_switch_threshold(btcoexist,
  3636. coex_sta->isolation_btween_wb);
  3637. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x550, 0x8,
  3638. 0x1); /* enable TBTT nterrupt */
  3639. /* BT report packet sample rate */
  3640. btcoexist->btc_write_1byte(btcoexist, 0x790, 0x5);
  3641. /* Init 0x778 = 0x1 for 2-Ant */
  3642. btcoexist->btc_write_1byte(btcoexist, 0x778, 0x1);
  3643. /* Enable PTA (3-wire function form BT side) */
  3644. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);
  3645. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x41, 0x02, 0x1);
  3646. /* Enable PTA (tx/rx signal form WiFi side) */
  3647. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x4c6, 0x10, 0x1);
  3648. /* set GNT_BT=1 for coex table select both */
  3649. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x763, 0x10, 0x1);
  3650. halbtc8821c2ant_enable_gnt_to_gpio(btcoexist, TRUE);
  3651. #if 0
  3652. /* check if WL firmware download ok */
  3653. /*if (btcoexist->btc_read_1byte(btcoexist, 0x80) == 0xc6)*/
  3654. halbtc8821c2ant_post_state_to_bt(btcoexist,
  3655. BT_8821C_2ANT_SCOREBOARD_ONOFF, TRUE);
  3656. #endif
  3657. /* Enable counter statistics */
  3658. btcoexist->btc_write_1byte(btcoexist, 0x76e,
  3659. 0x4); /* 0x76e[3] =1, WLAN_Act control by PTA */
  3660. /* WLAN_Tx by GNT_WL 0x950[29] = 0 */
  3661. /* btcoexist->btc_write_1byte_bitmask(btcoexist, 0x953, 0x20, 0x0); */
  3662. halbtc8821c2ant_coex_table_with_type(btcoexist, FORCE_EXEC, 0);
  3663. halbtc8821c2ant_ps_tdma(btcoexist, FORCE_EXEC, FALSE, 0);
  3664. psd_scan->ant_det_is_ant_det_available = TRUE;
  3665. if (coex_sta->is_rf_state_off) {
  3666. halbtc8821c2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
  3667. FORCE_EXEC,
  3668. BT_8821C_2ANT_PHASE_WLAN_OFF);
  3669. btcoexist->stop_coex_dm = TRUE;
  3670. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3671. "[BTCoex], ********** halbtc8821c2ant_init_hw_config (RF Off)**********\n");
  3672. BTC_TRACE(trace_buf);
  3673. } else if (wifi_only) {
  3674. coex_sta->concurrent_rx_mode_on = FALSE;
  3675. /* Path config */
  3676. /* Set Antenna Path */
  3677. halbtc8821c2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
  3678. FORCE_EXEC,
  3679. BT_8821C_2ANT_PHASE_WLANONLY_INIT);
  3680. btcoexist->stop_coex_dm = TRUE;
  3681. } else {
  3682. /*Set BT polluted packet on for Tx rate adaptive not including Tx retry break by PTA, 0x45c[19] =1 */
  3683. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x45e, 0x8, 0x1);
  3684. coex_sta->concurrent_rx_mode_on = TRUE;
  3685. /* btcoexist->btc_write_1byte_bitmask(btcoexist, 0x953, 0x2, 0x1); */
  3686. /* RF 0x1[1] = 0->Set GNT_WL_RF_Rx always = 1 for con-current Rx, mask Tx only */
  3687. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0x2, 0x0);
  3688. /* Set Antenna Path */
  3689. halbtc8821c2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
  3690. FORCE_EXEC,
  3691. BT_8821C_2ANT_PHASE_COEX_INIT);
  3692. btcoexist->stop_coex_dm = FALSE;
  3693. }
  3694. }
  3695. /* ************************************************************
  3696. * work around function start with wa_halbtc8821c2ant_
  3697. * ************************************************************
  3698. * ************************************************************
  3699. * extern function start with ex_halbtc8821c2ant_
  3700. * ************************************************************ */
  3701. void ex_halbtc8821c2ant_power_on_setting(IN struct btc_coexist *btcoexist)
  3702. {
  3703. struct btc_board_info *board_info = &btcoexist->board_info;
  3704. u8 u8tmp = 0x0;
  3705. u16 u16tmp = 0x0;
  3706. u32 value = 0;
  3707. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3708. "xxxxxxxxxxxxxxxx Execute 8821c 2-Ant PowerOn Setting xxxxxxxxxxxxxxxx!!\n");
  3709. BTC_TRACE(trace_buf);
  3710. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3711. "Ant Det Finish = %s, Ant Det Number = %d\n",
  3712. (board_info->btdm_ant_det_finish ? "Yes" : "No"),
  3713. board_info->btdm_ant_num_by_ant_det);
  3714. BTC_TRACE(trace_buf);
  3715. btcoexist->stop_coex_dm = TRUE;
  3716. coex_sta->is_rf_state_off = FALSE;
  3717. psd_scan->ant_det_is_ant_det_available = FALSE;
  3718. /* enable BB, REG_SYS_FUNC_EN such that we can write BB Register correctly. */
  3719. u16tmp = btcoexist->btc_read_2byte(btcoexist, 0x2);
  3720. btcoexist->btc_write_2byte(btcoexist, 0x2, u16tmp | BIT(0) | BIT(1));
  3721. /* Local setting bit define */
  3722. /* BIT0: "0" for no antenna inverse; "1" for antenna inverse */
  3723. /* BIT1: "0" for internal switch; "1" for external switch */
  3724. /* BIT2: "0" for one antenna; "1" for two antenna */
  3725. /* NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and BIT2=0 */
  3726. /* Check efuse 0xc3[6] for Single Antenna Path */
  3727. if (board_info->single_ant_path == 0) {
  3728. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3729. "[BTCoex], ********** Single Antenna, Antenna at Aux Port\n");
  3730. BTC_TRACE(trace_buf);
  3731. board_info->btdm_ant_pos = BTC_ANTENNA_AT_AUX_PORT;
  3732. u8tmp = 7;
  3733. } else if (board_info->single_ant_path == 1) {
  3734. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3735. "[BTCoex], ********** Single Antenna, Antenna at Main Port\n");
  3736. BTC_TRACE(trace_buf);
  3737. board_info->btdm_ant_pos = BTC_ANTENNA_AT_MAIN_PORT;
  3738. u8tmp = 6;
  3739. }
  3740. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3741. "[BTCoex], ********** (Power On) single_ant_path = %d, btdm_ant_pos = %d\n",
  3742. board_info->single_ant_path , board_info->btdm_ant_pos);
  3743. BTC_TRACE(trace_buf);
  3744. /* Setup RF front end type */
  3745. halbtc8821c2ant_set_rfe_type(btcoexist);
  3746. /* Set Antenna Path to BT side */
  3747. halbtc8821c2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, FORCE_EXEC,
  3748. BT_8821C_2ANT_PHASE_COEX_POWERON);
  3749. /* Save"single antenna position" info in Local register setting for FW reading, because FW may not ready at power on */
  3750. if (btcoexist->chip_interface == BTC_INTF_PCI)
  3751. btcoexist->btc_write_local_reg_1byte(btcoexist, 0x3e0, u8tmp);
  3752. else if (btcoexist->chip_interface == BTC_INTF_USB)
  3753. btcoexist->btc_write_local_reg_1byte(btcoexist, 0xfe08, u8tmp);
  3754. else if (btcoexist->chip_interface == BTC_INTF_SDIO)
  3755. btcoexist->btc_write_local_reg_1byte(btcoexist, 0x60, u8tmp);
  3756. /* enable GNT_WL/GNT_BT debug signal to GPIO14/15 */
  3757. halbtc8821c2ant_enable_gnt_to_gpio(btcoexist, TRUE);
  3758. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3759. "[BTCoex], ********** LTE coex Reg 0x38 (Power-On) = 0x%x**********\n",
  3760. halbtc8821c2ant_ltecoex_indirect_read_reg(btcoexist, 0x38));
  3761. BTC_TRACE(trace_buf);
  3762. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  3763. "[BTCoex], ********** MAC Reg 0x70/ BB Reg 0xcb4 (Power-On) = 0x%x / 0x%x\n",
  3764. btcoexist->btc_read_4byte(btcoexist, 0x70),
  3765. btcoexist->btc_read_4byte(btcoexist, 0xcb4));
  3766. BTC_TRACE(trace_buf);
  3767. }
  3768. void ex_halbtc8821c2ant_pre_load_firmware(IN struct btc_coexist *btcoexist)
  3769. {
  3770. struct btc_board_info *board_info = &btcoexist->board_info;
  3771. u8 u8tmp = 0x4; /* Set BIT2 by default since it's 2ant case */
  3772. /* */
  3773. /* S0 or S1 setting and Local register setting(By the setting fw can get ant number, S0/S1, ... info) */
  3774. /* Local setting bit define */
  3775. /* BIT0: "0" for no antenna inverse; "1" for antenna inverse */
  3776. /* BIT1: "0" for internal switch; "1" for external switch */
  3777. /* BIT2: "0" for one antenna; "1" for two antenna */
  3778. /* NOTE: here default all internal switch and 1-antenna ==> BIT1=0 and BIT2=0 */
  3779. if (btcoexist->chip_interface == BTC_INTF_USB) {
  3780. /* fixed at S0 for USB interface */
  3781. u8tmp |= 0x1; /* antenna inverse */
  3782. btcoexist->btc_write_local_reg_1byte(btcoexist, 0xfe08, u8tmp);
  3783. } else {
  3784. /* for PCIE and SDIO interface, we check efuse 0xc3[6] */
  3785. if (board_info->single_ant_path == 0) {
  3786. } else if (board_info->single_ant_path == 1) {
  3787. /* set to S0 */
  3788. u8tmp |= 0x1; /* antenna inverse */
  3789. }
  3790. if (btcoexist->chip_interface == BTC_INTF_PCI)
  3791. btcoexist->btc_write_local_reg_1byte(btcoexist, 0x3e0,
  3792. u8tmp);
  3793. else if (btcoexist->chip_interface == BTC_INTF_SDIO)
  3794. btcoexist->btc_write_local_reg_1byte(btcoexist, 0x60,
  3795. u8tmp);
  3796. }
  3797. }
  3798. void ex_halbtc8821c2ant_init_hw_config(IN struct btc_coexist *btcoexist,
  3799. IN boolean wifi_only)
  3800. {
  3801. halbtc8821c2ant_init_hw_config(btcoexist, wifi_only);
  3802. }
  3803. void ex_halbtc8821c2ant_init_coex_dm(IN struct btc_coexist *btcoexist)
  3804. {
  3805. halbtc8821c2ant_init_coex_dm(btcoexist);
  3806. }
  3807. void ex_halbtc8821c2ant_display_coex_info(IN struct btc_coexist *btcoexist)
  3808. {
  3809. struct btc_board_info *board_info = &btcoexist->board_info;
  3810. struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
  3811. u8 *cli_buf = btcoexist->cli_buf;
  3812. u8 u8tmp[4], i, ps_tdma_case = 0;
  3813. u32 u32tmp[4];
  3814. u16 u16tmp[4];
  3815. u32 fa_ofdm, fa_cck, cca_ofdm, cca_cck, ratio_ofdm;
  3816. u32 fw_ver = 0, bt_patch_ver = 0, bt_coex_ver = 0;
  3817. static u8 pop_report_in_10s = 0;
  3818. u32 phyver = 0;
  3819. boolean lte_coex_on = FALSE;
  3820. static u8 cnt = 0;
  3821. u32 ratio_crc, cnt_ok, cnt_err;
  3822. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  3823. "\r\n ============[BT Coexist info]============");
  3824. CL_PRINTF(cli_buf);
  3825. if (btcoexist->manual_control) {
  3826. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  3827. "\r\n ============[Under Manual Control]============");
  3828. CL_PRINTF(cli_buf);
  3829. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  3830. "\r\n ==========================================");
  3831. CL_PRINTF(cli_buf);
  3832. }
  3833. if (!coex_sta->bt_disabled) {
  3834. if (coex_sta->bt_coex_supported_feature == 0)
  3835. btcoexist->btc_get(btcoexist, BTC_GET_U4_SUPPORTED_FEATURE,
  3836. &coex_sta->bt_coex_supported_feature);
  3837. if ((coex_sta->bt_coex_supported_version == 0) ||
  3838. (coex_sta->bt_coex_supported_version == 0xffff))
  3839. btcoexist->btc_get(btcoexist, BTC_GET_U4_SUPPORTED_VERSION,
  3840. &coex_sta->bt_coex_supported_version);
  3841. if (coex_sta->bt_reg_vendor_ac == 0xffff)
  3842. coex_sta->bt_reg_vendor_ac = (u16)(
  3843. btcoexist->btc_get_bt_reg(btcoexist, 3,
  3844. 0xac) & 0xffff);
  3845. if (coex_sta->bt_reg_vendor_ae == 0xffff)
  3846. coex_sta->bt_reg_vendor_ae = (u16)(
  3847. btcoexist->btc_get_bt_reg(btcoexist, 3,
  3848. 0xae) & 0xffff);
  3849. btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER,
  3850. &bt_patch_ver);
  3851. btcoexist->bt_info.bt_get_fw_ver = bt_patch_ver;
  3852. if (coex_sta->num_of_profile > 0) {
  3853. cnt++;
  3854. if (cnt >= 3) {
  3855. btcoexist->btc_get_bt_afh_map_from_bt(btcoexist, 0,
  3856. &coex_sta->bt_afh_map[0]);
  3857. cnt = 0;
  3858. }
  3859. }
  3860. }
  3861. if (psd_scan->ant_det_try_count == 0) {
  3862. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  3863. "\r\n %-35s = %d/ %d/ %s / %d",
  3864. "Ant PG Num/ Mech/ Pos/ RFE",
  3865. board_info->pg_ant_num, board_info->btdm_ant_num,
  3866. (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT
  3867. ? "Main" : "Aux"),
  3868. rfe_type->rfe_module_type);
  3869. CL_PRINTF(cli_buf);
  3870. } else {
  3871. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  3872. "\r\n %-35s = %d/ %d/ %s/ %d (%d/%d/%d)",
  3873. "Ant PG Num/ Mech(Ant_Det)/ Pos/ RFE",
  3874. board_info->pg_ant_num,
  3875. board_info->btdm_ant_num_by_ant_det,
  3876. (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT
  3877. ? "Main" : "Aux"),
  3878. rfe_type->rfe_module_type,
  3879. psd_scan->ant_det_try_count,
  3880. psd_scan->ant_det_fail_count,
  3881. psd_scan->ant_det_result);
  3882. CL_PRINTF(cli_buf);
  3883. if (board_info->btdm_ant_det_finish) {
  3884. if (psd_scan->ant_det_result != 12)
  3885. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  3886. "\r\n %-35s = %s",
  3887. "Ant Det PSD Value",
  3888. psd_scan->ant_det_peak_val);
  3889. else
  3890. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  3891. "\r\n %-35s = %d",
  3892. "Ant Det PSD Value",
  3893. psd_scan->ant_det_psd_scan_peak_val
  3894. / 100);
  3895. CL_PRINTF(cli_buf);
  3896. }
  3897. }
  3898. bt_patch_ver = btcoexist->bt_info.bt_get_fw_ver;
  3899. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
  3900. phyver = btcoexist->btc_get_bt_phydm_version(btcoexist);
  3901. bt_coex_ver = (coex_sta->bt_coex_supported_version & 0xff);
  3902. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  3903. "\r\n %-35s = %d_%02x/ 0x%02x/ 0x%02x (%s)",
  3904. "CoexVer WL/ BT_Desired/ BT_Report",
  3905. glcoex_ver_date_8821c_2ant, glcoex_ver_8821c_2ant,
  3906. glcoex_ver_btdesired_8821c_2ant,
  3907. bt_coex_ver,
  3908. (bt_coex_ver == 0xff ? "Unknown" :
  3909. (coex_sta->bt_disabled ? "BT-disable" :
  3910. (bt_coex_ver >= glcoex_ver_btdesired_8821c_2ant ?
  3911. "Match" : "Mis-Match"))));
  3912. CL_PRINTF(cli_buf);
  3913. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  3914. "\r\n %-35s = 0x%x/ 0x%x/ v%d/ %c",
  3915. "W_FW/ B_FW/ Phy/ Kt",
  3916. fw_ver, bt_patch_ver, phyver,
  3917. coex_sta->cut_version + 65);
  3918. CL_PRINTF(cli_buf);
  3919. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %02x %02x %02x ",
  3920. "AFH Map to BT",
  3921. coex_dm->wifi_chnl_info[0], coex_dm->wifi_chnl_info[1],
  3922. coex_dm->wifi_chnl_info[2]);
  3923. CL_PRINTF(cli_buf);
  3924. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d / %d / %d ",
  3925. "Isolation/WL_Thres/BT_Thres",
  3926. coex_sta->isolation_btween_wb,
  3927. coex_sta->wifi_coex_thres,
  3928. coex_sta->bt_coex_thres);
  3929. CL_PRINTF(cli_buf);
  3930. /* wifi status */
  3931. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
  3932. "============[Wifi Status]============");
  3933. CL_PRINTF(cli_buf);
  3934. btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_WIFI_STATUS);
  3935. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
  3936. "============[BT Status]============");
  3937. CL_PRINTF(cli_buf);
  3938. pop_report_in_10s++;
  3939. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  3940. "\r\n %-35s = [%s/ %d dBm/ %d/ %d] ",
  3941. "BT [status/ rssi/ retryCnt/ popCnt]",
  3942. ((coex_sta->bt_disabled) ? ("disabled") : ((
  3943. coex_sta->c2h_bt_inquiry_page) ? ("inquiry/page")
  3944. : ((BT_8821C_2ANT_BT_STATUS_NON_CONNECTED_IDLE ==
  3945. coex_dm->bt_status) ? "non-connected idle" :
  3946. ((BT_8821C_2ANT_BT_STATUS_CONNECTED_IDLE == coex_dm->bt_status)
  3947. ? "connected-idle" : "busy")))),
  3948. coex_sta->bt_rssi - 100, coex_sta->bt_retry_cnt,
  3949. coex_sta->pop_event_cnt);
  3950. CL_PRINTF(cli_buf);
  3951. if (pop_report_in_10s >= 5) {
  3952. coex_sta->pop_event_cnt = 0;
  3953. pop_report_in_10s = 0;
  3954. }
  3955. if (coex_sta->num_of_profile != 0)
  3956. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  3957. "\r\n %-35s = %s%s%s%s%s",
  3958. "Profiles",
  3959. ((bt_link_info->a2dp_exist) ?
  3960. ((coex_sta->is_bt_a2dp_sink) ? "A2DP sink," :
  3961. "A2DP,") : ""),
  3962. ((bt_link_info->sco_exist) ? "HFP," : ""),
  3963. ((bt_link_info->hid_exist) ?
  3964. ((coex_sta->hid_busy_num >= 2) ? "HID(4/18)," :
  3965. "HID(2/18),") : ""),
  3966. ((bt_link_info->pan_exist) ? "PAN," : ""),
  3967. ((coex_sta->voice_over_HOGP) ? "Voice" : ""));
  3968. else
  3969. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  3970. "\r\n %-35s = None", "Profiles");
  3971. CL_PRINTF(cli_buf);
  3972. if (bt_link_info->a2dp_exist) {
  3973. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %d/ %s",
  3974. "A2DP Rate/Bitpool/Auto_Slot",
  3975. ((coex_sta->is_A2DP_3M) ? "3M" : "No_3M"),
  3976. coex_sta->a2dp_bit_pool,
  3977. ((coex_sta->is_autoslot) ? "On" : "Off")
  3978. );
  3979. CL_PRINTF(cli_buf);
  3980. }
  3981. if (bt_link_info->hid_exist) {
  3982. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
  3983. "HID PairNum/Forbid_Slot",
  3984. coex_sta->hid_pair_cnt,
  3985. coex_sta->forbidden_slot
  3986. );
  3987. CL_PRINTF(cli_buf);
  3988. }
  3989. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %d/ %s/ 0x%x",
  3990. "Role/RoleSwCnt/IgnWlact/Feature",
  3991. ((bt_link_info->slave_role) ? "Slave" : "Master"),
  3992. coex_sta->cnt_RoleSwitch,
  3993. ((coex_dm->cur_ignore_wlan_act) ? "Yes" : "No"),
  3994. coex_sta->bt_coex_supported_feature);
  3995. CL_PRINTF(cli_buf);
  3996. if ((coex_sta->bt_ble_scan_type & 0x7) != 0x0) {
  3997. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  3998. "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
  3999. "BLEScan Type/TV/Init/Ble",
  4000. coex_sta->bt_ble_scan_type,
  4001. (coex_sta->bt_ble_scan_type & 0x1 ?
  4002. coex_sta->bt_ble_scan_para[0] : 0x0),
  4003. (coex_sta->bt_ble_scan_type & 0x2 ?
  4004. coex_sta->bt_ble_scan_para[1] : 0x0),
  4005. (coex_sta->bt_ble_scan_type & 0x4 ?
  4006. coex_sta->bt_ble_scan_para[2] : 0x0));
  4007. CL_PRINTF(cli_buf);
  4008. }
  4009. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d/ %d",
  4010. "ReInit/ReLink/IgnWlact/Page/NameReq",
  4011. coex_sta->cnt_ReInit,
  4012. coex_sta->cnt_setupLink,
  4013. coex_sta->cnt_IgnWlanAct,
  4014. coex_sta->cnt_Page,
  4015. coex_sta->cnt_RemoteNameReq
  4016. );
  4017. CL_PRINTF(cli_buf);
  4018. halbtc8821c2ant_read_score_board(btcoexist, &u16tmp[0]);
  4019. if ((coex_sta->bt_reg_vendor_ae == 0xffff) ||
  4020. (coex_sta->bt_reg_vendor_ac == 0xffff))
  4021. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = x/ x/ %04x",
  4022. "0xae[4]/0xac[1:0]/Scoreboard", u16tmp[0]);
  4023. else
  4024. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  4025. "\r\n %-35s = 0x%x/ 0x%x/ %04x",
  4026. "0xae[4]/0xac[1:0]/Scoreboard",
  4027. ((coex_sta->bt_reg_vendor_ae & BIT(4)) >> 4),
  4028. coex_sta->bt_reg_vendor_ac & 0x3, u16tmp[0]);
  4029. CL_PRINTF(cli_buf);
  4030. if (coex_sta->num_of_profile > 0) {
  4031. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  4032. "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
  4033. "AFH MAP",
  4034. coex_sta->bt_afh_map[0],
  4035. coex_sta->bt_afh_map[1],
  4036. coex_sta->bt_afh_map[2],
  4037. coex_sta->bt_afh_map[3],
  4038. coex_sta->bt_afh_map[4],
  4039. coex_sta->bt_afh_map[5],
  4040. coex_sta->bt_afh_map[6],
  4041. coex_sta->bt_afh_map[7],
  4042. coex_sta->bt_afh_map[8],
  4043. coex_sta->bt_afh_map[9]
  4044. );
  4045. CL_PRINTF(cli_buf);
  4046. }
  4047. for (i = 0; i < BT_INFO_SRC_8821C_2ANT_MAX; i++) {
  4048. if (coex_sta->bt_info_c2h_cnt[i]) {
  4049. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  4050. "\r\n %-35s = %02x %02x %02x %02x %02x %02x %02x(%d)",
  4051. glbt_info_src_8821c_2ant[i],
  4052. coex_sta->bt_info_c2h[i][0],
  4053. coex_sta->bt_info_c2h[i][1],
  4054. coex_sta->bt_info_c2h[i][2],
  4055. coex_sta->bt_info_c2h[i][3],
  4056. coex_sta->bt_info_c2h[i][4],
  4057. coex_sta->bt_info_c2h[i][5],
  4058. coex_sta->bt_info_c2h[i][6],
  4059. coex_sta->bt_info_c2h_cnt[i]);
  4060. CL_PRINTF(cli_buf);
  4061. }
  4062. }
  4063. /* Sw mechanism */
  4064. if (btcoexist->manual_control)
  4065. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
  4066. "============[mechanism] (before Manual)============");
  4067. else
  4068. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
  4069. "============[Mechanism]============");
  4070. CL_PRINTF(cli_buf);
  4071. ps_tdma_case = coex_dm->cur_ps_tdma;
  4072. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  4073. "\r\n %-35s = %02x %02x %02x %02x %02x (case-%d, %s, %s)",
  4074. "TDMA",
  4075. coex_dm->ps_tdma_para[0], coex_dm->ps_tdma_para[1],
  4076. coex_dm->ps_tdma_para[2], coex_dm->ps_tdma_para[3],
  4077. coex_dm->ps_tdma_para[4], ps_tdma_case,
  4078. (coex_dm->cur_ps_tdma_on ? "TDMA On" : "TDMA Off"),
  4079. (coex_dm->is_switch_to_1dot5_ant ? "1.5Ant" : "2Ant"));
  4080. CL_PRINTF(cli_buf);
  4081. u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
  4082. u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
  4083. u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
  4084. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  4085. "\r\n %-35s = %d/ 0x%x/ 0x%x/ 0x%x",
  4086. "Table/0x6c0/0x6c4/0x6c8",
  4087. coex_sta->coex_table_type, u32tmp[0], u32tmp[1], u32tmp[2]);
  4088. CL_PRINTF(cli_buf);
  4089. u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
  4090. u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6cc);
  4091. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  4092. "\r\n %-35s = 0x%x/ 0x%x",
  4093. "0x778/0x6cc",
  4094. u8tmp[0], u32tmp[0]);
  4095. CL_PRINTF(cli_buf);
  4096. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s/ %s/ %d",
  4097. "AntDiv/BtCtrlLPS/LPRA/PsFail",
  4098. ((board_info->ant_div_cfg) ? "On" : "Off"),
  4099. ((coex_sta->force_lps_ctrl) ? "On" : "Off"),
  4100. ((coex_dm->cur_low_penalty_ra) ? "On" : "Off"),
  4101. coex_sta->cnt_set_ps_state_fail);
  4102. CL_PRINTF(cli_buf);
  4103. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x",
  4104. "WL_DACSwing/ BT_Dec_Pwr", coex_dm->cur_fw_dac_swing_lvl,
  4105. coex_dm->cur_bt_dec_pwr_lvl);
  4106. CL_PRINTF(cli_buf);
  4107. u32tmp[0] = halbtc8821c2ant_ltecoex_indirect_read_reg(btcoexist, 0x38);
  4108. lte_coex_on = ((u32tmp[0] & BIT(7)) >> 7) ? TRUE : FALSE;
  4109. if (lte_coex_on) {
  4110. u32tmp[0] = halbtc8821c2ant_ltecoex_indirect_read_reg(btcoexist,
  4111. 0xa0);
  4112. u32tmp[1] = halbtc8821c2ant_ltecoex_indirect_read_reg(btcoexist,
  4113. 0xa4);
  4114. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = 0x%x/ 0x%x",
  4115. "LTE Coex Table W_L/B_L",
  4116. u32tmp[0] & 0xffff, u32tmp[1] & 0xffff);
  4117. CL_PRINTF(cli_buf);
  4118. u32tmp[0] = halbtc8821c2ant_ltecoex_indirect_read_reg(btcoexist,
  4119. 0xa8);
  4120. u32tmp[1] = halbtc8821c2ant_ltecoex_indirect_read_reg(btcoexist,
  4121. 0xac);
  4122. u32tmp[2] = halbtc8821c2ant_ltecoex_indirect_read_reg(btcoexist,
  4123. 0xb0);
  4124. u32tmp[3] = halbtc8821c2ant_ltecoex_indirect_read_reg(btcoexist,
  4125. 0xb4);
  4126. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  4127. "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
  4128. "LTE Break Table W_L/B_L/L_W/L_B",
  4129. u32tmp[0] & 0xffff, u32tmp[1] & 0xffff,
  4130. u32tmp[2] & 0xffff, u32tmp[3] & 0xffff);
  4131. CL_PRINTF(cli_buf);
  4132. }
  4133. /* Hw setting */
  4134. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s",
  4135. "============[Hw setting]============");
  4136. CL_PRINTF(cli_buf);
  4137. u32tmp[0] = halbtc8821c2ant_ltecoex_indirect_read_reg(btcoexist, 0x38);
  4138. u32tmp[1] = halbtc8821c2ant_ltecoex_indirect_read_reg(btcoexist, 0x54);
  4139. u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x73);
  4140. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s",
  4141. "LTE Coex/Path Owner",
  4142. ((lte_coex_on) ? "On" : "Off") ,
  4143. ((u8tmp[0] & BIT(2)) ? "WL" : "BT"));
  4144. CL_PRINTF(cli_buf);
  4145. if (lte_coex_on) {
  4146. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  4147. "\r\n %-35s = %d/ %d/ %d/ %d",
  4148. "LTE 3Wire/OPMode/UART/UARTMode",
  4149. (int)((u32tmp[0] & BIT(6)) >> 6),
  4150. (int)((u32tmp[0] & (BIT(5) | BIT(4))) >> 4),
  4151. (int)((u32tmp[0] & BIT(3)) >> 3),
  4152. (int)(u32tmp[0] & (BIT(2) | BIT(1) | BIT(0))));
  4153. CL_PRINTF(cli_buf);
  4154. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
  4155. "LTE_Busy/UART_Busy",
  4156. (int)((u32tmp[1] & BIT(1)) >> 1),
  4157. (int)(u32tmp[1] & BIT(0)));
  4158. CL_PRINTF(cli_buf);
  4159. }
  4160. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  4161. "\r\n %-35s = %s (BB:%s)/ %s (BB:%s)/ %s %d",
  4162. "GNT_WL_Ctrl/GNT_BT_Ctrl/Dbg",
  4163. ((u32tmp[0] & BIT(12)) ? "SW" : "HW"),
  4164. ((u32tmp[0] & BIT(8)) ? "SW" : "HW"),
  4165. ((u32tmp[0] & BIT(14)) ? "SW" : "HW"),
  4166. ((u32tmp[0] & BIT(10)) ? "SW" : "HW"),
  4167. ((u8tmp[0] & BIT(3)) ? "On" : "Off"),
  4168. coex_sta->gnt_error_cnt);
  4169. CL_PRINTF(cli_buf);
  4170. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
  4171. "GNT_WL/GNT_BT",
  4172. (int)((u32tmp[1] & BIT(2)) >> 2),
  4173. (int)((u32tmp[1] & BIT(3)) >> 3));
  4174. CL_PRINTF(cli_buf);
  4175. u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xcb0);
  4176. u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xcb4);
  4177. u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xcba);
  4178. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  4179. "\r\n %-35s = 0x%04x/ 0x%04x/ 0x%02x %s",
  4180. "0xcb0/0xcb4/0xcb8[23:16]",
  4181. u32tmp[0], u32tmp[1], u8tmp[0],
  4182. ((u8tmp[0] & 0x1) == 0x1 ? "(BTG)" : "(WL_A+G)"));
  4183. CL_PRINTF(cli_buf);
  4184. u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);
  4185. u8tmp[2] = btcoexist->btc_read_1byte(btcoexist, 0x64);
  4186. u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x4c6);
  4187. u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x40);
  4188. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  4189. "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
  4190. "4c[24:23]/64[0]/4c6[4]/40[5]",
  4191. (u32tmp[0] & (BIT(24) | BIT(23))) >> 23 , u8tmp[2] & 0x1 ,
  4192. (int)((u8tmp[0] & BIT(4)) >> 4),
  4193. (int)((u8tmp[1] & BIT(5)) >> 5));
  4194. CL_PRINTF(cli_buf);
  4195. u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
  4196. u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
  4197. u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x953);
  4198. u8tmp[2] = btcoexist->btc_read_1byte(btcoexist, 0xc50);
  4199. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  4200. "\r\n %-35s = 0x%x/ 0x%x/ %s/ 0x%x",
  4201. "0x550/0x522/4-RxAGC/0xc50",
  4202. u32tmp[0], u8tmp[0], (u8tmp[1] & 0x2) ? "On" : "Off", u8tmp[2]);
  4203. CL_PRINTF(cli_buf);
  4204. fa_ofdm = btcoexist->btc_phydm_query_PHY_counter(btcoexist,
  4205. PHYDM_INFO_FA_OFDM);
  4206. fa_cck = btcoexist->btc_phydm_query_PHY_counter(btcoexist,
  4207. PHYDM_INFO_FA_CCK);
  4208. cca_ofdm = btcoexist->btc_phydm_query_PHY_counter(btcoexist,
  4209. PHYDM_INFO_CCA_OFDM);
  4210. cca_cck = btcoexist->btc_phydm_query_PHY_counter(btcoexist,
  4211. PHYDM_INFO_CCA_CCK);
  4212. ratio_ofdm = (fa_ofdm == 0) ? 1000 : (cca_ofdm/fa_ofdm);
  4213. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE,
  4214. "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x (%d)",
  4215. "CCK-CCA/CCK-FA/OFDM-CCA/OFDM-FA",
  4216. cca_cck, fa_cck, cca_ofdm, fa_ofdm,
  4217. ratio_ofdm);
  4218. CL_PRINTF(cli_buf);
  4219. #if 1
  4220. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d",
  4221. "CRC_OK CCK/11g/11n/11ac",
  4222. coex_sta->crc_ok_cck, coex_sta->crc_ok_11g,
  4223. coex_sta->crc_ok_11n, coex_sta->crc_ok_11n_vht);
  4224. CL_PRINTF(cli_buf);
  4225. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d/ %d/ %d (%d, %d)",
  4226. "CRC_Err CCK/11g/11n/11ac",
  4227. coex_sta->crc_err_cck, coex_sta->crc_err_11g,
  4228. coex_sta->crc_err_11n, coex_sta->crc_err_11n_vht,
  4229. coex_sta->now_crc_ratio, coex_sta->acc_crc_ratio);
  4230. CL_PRINTF(cli_buf);
  4231. #endif
  4232. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %s/ %s/ %s/ %d",
  4233. "WlHiPri/ Locking/ Locked/ Noisy",
  4234. (coex_sta->wifi_is_high_pri_task ? "Yes" : "No"),
  4235. (coex_sta->cck_lock ? "Yes" : "No"),
  4236. (coex_sta->cck_ever_lock ? "Yes" : "No"),
  4237. coex_sta->wl_noisy_level);
  4238. CL_PRINTF(cli_buf);
  4239. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d",
  4240. "0x770(Hi-pri rx/tx)",
  4241. coex_sta->high_priority_rx, coex_sta->high_priority_tx);
  4242. CL_PRINTF(cli_buf);
  4243. CL_SPRINTF(cli_buf, BT_TMP_BUF_SIZE, "\r\n %-35s = %d/ %d %s",
  4244. "0x774(Lo-pri rx/tx)",
  4245. coex_sta->low_priority_rx, coex_sta->low_priority_tx,
  4246. (bt_link_info->slave_role ? "(Slave!!)" : (
  4247. coex_sta->is_tdma_btautoslot_hang ? "(auto-slot hang!!)" : "")));
  4248. CL_PRINTF(cli_buf);
  4249. btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_COEX_STATISTICS);
  4250. }
  4251. void ex_halbtc8821c2ant_ips_notify(IN struct btc_coexist *btcoexist, IN u8 type)
  4252. {
  4253. if (btcoexist->manual_control || btcoexist->stop_coex_dm)
  4254. return;
  4255. if (BTC_IPS_ENTER == type) {
  4256. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4257. "[BTCoex], IPS ENTER notify\n");
  4258. BTC_TRACE(trace_buf);
  4259. coex_sta->under_ips = TRUE;
  4260. coex_sta->under_lps = FALSE;
  4261. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4262. BT_8821C_2ANT_SCOREBOARD_ACTIVE |
  4263. BT_8821C_2ANT_SCOREBOARD_ONOFF |
  4264. BT_8821C_2ANT_SCOREBOARD_SCAN |
  4265. BT_8821C_2ANT_SCOREBOARD_UNDERTEST,
  4266. FALSE);
  4267. halbtc8821c2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
  4268. FORCE_EXEC,
  4269. BT_8821C_2ANT_PHASE_WLAN_OFF);
  4270. halbtc8821c2ant_action_coex_all_off(btcoexist);
  4271. } else if (BTC_IPS_LEAVE == type) {
  4272. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4273. "[BTCoex], IPS LEAVE notify\n");
  4274. BTC_TRACE(trace_buf);
  4275. coex_sta->under_ips = FALSE;
  4276. #if 0
  4277. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4278. BT_8821C_2ANT_SCOREBOARD_ACTIVE, TRUE);
  4279. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4280. BT_8821C_2ANT_SCOREBOARD_ONOFF, TRUE);
  4281. #endif
  4282. halbtc8821c2ant_init_hw_config(btcoexist, FALSE);
  4283. halbtc8821c2ant_init_coex_dm(btcoexist);
  4284. halbtc8821c2ant_query_bt_info(btcoexist);
  4285. }
  4286. }
  4287. void ex_halbtc8821c2ant_lps_notify(IN struct btc_coexist *btcoexist, IN u8 type)
  4288. {
  4289. static boolean pre_force_lps_on = FALSE;
  4290. if (btcoexist->manual_control || btcoexist->stop_coex_dm)
  4291. return;
  4292. if (BTC_LPS_ENABLE == type) {
  4293. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4294. "[BTCoex], LPS ENABLE notify\n");
  4295. BTC_TRACE(trace_buf);
  4296. coex_sta->under_lps = TRUE;
  4297. coex_sta->under_ips = FALSE;
  4298. if (coex_sta->force_lps_ctrl == TRUE) { /* LPS No-32K */
  4299. /* Write WL "Active" in Score-board for PS-TDMA */
  4300. pre_force_lps_on = TRUE;
  4301. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4302. BT_8821C_2ANT_SCOREBOARD_ACTIVE, TRUE);
  4303. } else { /* LPS-32K, need check if this h2c 0x71 can work?? (2015/08/28) */
  4304. /* Write WL "Non-Active" in Score-board for Native-PS */
  4305. pre_force_lps_on = FALSE;
  4306. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4307. BT_8821C_2ANT_SCOREBOARD_ACTIVE, FALSE);
  4308. }
  4309. } else if (BTC_LPS_DISABLE == type) {
  4310. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4311. "[BTCoex], LPS DISABLE notify\n");
  4312. BTC_TRACE(trace_buf);
  4313. coex_sta->under_lps = FALSE;
  4314. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4315. BT_8821C_2ANT_SCOREBOARD_ACTIVE, TRUE);
  4316. if ((!pre_force_lps_on) && (!coex_sta->force_lps_ctrl))
  4317. halbtc8821c2ant_query_bt_info(btcoexist);
  4318. }
  4319. }
  4320. void ex_halbtc8821c2ant_scan_notify(IN struct btc_coexist *btcoexist,
  4321. IN u8 type)
  4322. {
  4323. boolean wifi_connected = FALSE;
  4324. boolean wifi_under_5g = FALSE;
  4325. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4326. "[BTCoex], SCAN notify()\n");
  4327. BTC_TRACE(trace_buf);
  4328. if (btcoexist->manual_control ||
  4329. btcoexist->stop_coex_dm)
  4330. return;
  4331. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
  4332. &wifi_connected);
  4333. /* this can't be removed for RF off_on event, or BT would dis-connect */
  4334. halbtc8821c2ant_query_bt_info(btcoexist);
  4335. if (BTC_SCAN_START == type) {
  4336. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G,
  4337. &wifi_under_5g);
  4338. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4339. BT_8821C_2ANT_SCOREBOARD_ACTIVE |
  4340. BT_8821C_2ANT_SCOREBOARD_SCAN |
  4341. BT_8821C_2ANT_SCOREBOARD_ONOFF,
  4342. TRUE);
  4343. if (wifi_under_5g) {
  4344. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4345. "[BTCoex], ********** SCAN START notify (5g)\n");
  4346. BTC_TRACE(trace_buf);
  4347. halbtc8821c2ant_action_wifi_under5g(btcoexist);
  4348. return;
  4349. }
  4350. coex_sta->wifi_is_high_pri_task = TRUE;
  4351. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4352. "[BTCoex], ********** SCAN START notify (2g)\n");
  4353. BTC_TRACE(trace_buf);
  4354. halbtc8821c2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
  4355. FORCE_EXEC,
  4356. BT_8821C_2ANT_PHASE_2G_RUNTIME);
  4357. halbtc8821c2ant_run_coexist_mechanism(
  4358. btcoexist);
  4359. return;
  4360. }
  4361. if (BTC_SCAN_START_2G == type) {
  4362. if (!wifi_connected)
  4363. coex_sta->wifi_is_high_pri_task = TRUE;
  4364. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4365. "[BTCoex], SCAN START notify (2G)\n");
  4366. BTC_TRACE(trace_buf);
  4367. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4368. BT_8821C_2ANT_SCOREBOARD_ACTIVE |
  4369. BT_8821C_2ANT_SCOREBOARD_SCAN |
  4370. BT_8821C_2ANT_SCOREBOARD_ONOFF,
  4371. TRUE);
  4372. halbtc8821c2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
  4373. FORCE_EXEC,
  4374. BT_8821C_2ANT_PHASE_2G_RUNTIME);
  4375. halbtc8821c2ant_run_coexist_mechanism(btcoexist);
  4376. } else if (BTC_SCAN_FINISH == type) {
  4377. coex_sta->wifi_is_high_pri_task = FALSE;
  4378. btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM,
  4379. &coex_sta->scan_ap_num);
  4380. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4381. "[BTCoex], SCAN FINISH notify (Scan-AP = %d)\n",
  4382. coex_sta->scan_ap_num);
  4383. BTC_TRACE(trace_buf);
  4384. halbtc8821c2ant_run_coexist_mechanism(btcoexist);
  4385. }
  4386. }
  4387. void ex_halbtc8821c2ant_switchband_notify(IN struct btc_coexist *btcoexist,
  4388. IN u8 type)
  4389. {
  4390. boolean wifi_connected = FALSE, bt_hs_on = FALSE;
  4391. u32 wifi_link_status = 0;
  4392. u32 num_of_wifi_link = 0;
  4393. boolean bt_ctrl_agg_buf_size = FALSE;
  4394. u8 agg_buf_size = 5;
  4395. if (btcoexist->manual_control ||
  4396. btcoexist->stop_coex_dm)
  4397. return;
  4398. coex_sta->switch_band_notify_to = type;
  4399. if (type == BTC_SWITCH_TO_5G) {
  4400. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4401. "[BTCoex], switchband_notify --- switch to 5G\n");
  4402. BTC_TRACE(trace_buf);
  4403. halbtc8821c2ant_action_wifi_under5g(btcoexist);
  4404. } else if (type == BTC_SWITCH_TO_24G_NOFORSCAN) {
  4405. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4406. "[BTCoex], ********** switchband_notify BTC_SWITCH_TO_2G (no for scan)\n");
  4407. BTC_TRACE(trace_buf);
  4408. halbtc8821c2ant_run_coexist_mechanism(btcoexist);
  4409. } else {
  4410. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4411. "[BTCoex], switchband_notify --- switch to 2G\n");
  4412. BTC_TRACE(trace_buf);
  4413. ex_halbtc8821c2ant_scan_notify(btcoexist,
  4414. BTC_SCAN_START_2G);
  4415. }
  4416. coex_sta->switch_band_notify_to = BTC_NOT_SWITCH;
  4417. }
  4418. void ex_halbtc8821c2ant_connect_notify(IN struct btc_coexist *btcoexist,
  4419. IN u8 type)
  4420. {
  4421. if (btcoexist->manual_control ||
  4422. btcoexist->stop_coex_dm)
  4423. return;
  4424. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4425. BT_8821C_2ANT_SCOREBOARD_ACTIVE |
  4426. BT_8821C_2ANT_SCOREBOARD_SCAN |
  4427. BT_8821C_2ANT_SCOREBOARD_ONOFF,
  4428. TRUE);
  4429. if ((BTC_ASSOCIATE_5G_START == type) ||
  4430. (BTC_ASSOCIATE_5G_FINISH == type)) {
  4431. if (BTC_ASSOCIATE_5G_START == type)
  4432. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4433. "[BTCoex], connect_notify --- 5G start\n");
  4434. else
  4435. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4436. "[BTCoex], connect_notify --- 5G finish\n");
  4437. BTC_TRACE(trace_buf);
  4438. halbtc8821c2ant_action_wifi_under5g(btcoexist);
  4439. return;
  4440. }
  4441. if (BTC_ASSOCIATE_START == type) {
  4442. coex_sta->wifi_is_high_pri_task = TRUE;
  4443. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4444. "[BTCoex], CONNECT START notify (2G)\n");
  4445. BTC_TRACE(trace_buf);
  4446. halbtc8821c2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
  4447. FORCE_EXEC,
  4448. BT_8821C_2ANT_PHASE_2G_RUNTIME);
  4449. halbtc8821c2ant_run_coexist_mechanism(btcoexist);
  4450. /* To keep TDMA case during connect process,
  4451. to avoid changed by Btinfo and runcoexmechanism */
  4452. coex_sta->freeze_coexrun_by_btinfo = TRUE;
  4453. coex_dm->arp_cnt = 0;
  4454. } else if (BTC_ASSOCIATE_FINISH == type) {
  4455. coex_sta->wifi_is_high_pri_task = FALSE;
  4456. coex_sta->freeze_coexrun_by_btinfo = FALSE;
  4457. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4458. "[BTCoex], CONNECT FINISH notify (2G)\n");
  4459. BTC_TRACE(trace_buf);
  4460. halbtc8821c2ant_run_coexist_mechanism(btcoexist);
  4461. }
  4462. }
  4463. void ex_halbtc8821c2ant_media_status_notify(IN struct btc_coexist *btcoexist,
  4464. IN u8 type)
  4465. {
  4466. u8 h2c_parameter[3] = {0};
  4467. u32 wifi_bw;
  4468. u8 wifi_central_chnl;
  4469. u8 ap_num = 0;
  4470. boolean wifi_under_b_mode = FALSE, wifi_under_5g = FALSE;
  4471. if (btcoexist->manual_control ||
  4472. btcoexist->stop_coex_dm)
  4473. return;
  4474. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
  4475. if (BTC_MEDIA_CONNECT == type) {
  4476. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4477. "[BTCoex], MEDIA connect notify\n");
  4478. BTC_TRACE(trace_buf);
  4479. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4480. BT_8821C_2ANT_SCOREBOARD_ACTIVE |
  4481. BT_8821C_2ANT_SCOREBOARD_ONOFF,
  4482. TRUE);
  4483. if (wifi_under_5g) {
  4484. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4485. "[BTCoex], WiFi is under 5G!!!\n");
  4486. BTC_TRACE(trace_buf);
  4487. halbtc8821c2ant_action_wifi_under5g(btcoexist);
  4488. return;
  4489. }
  4490. halbtc8821c2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
  4491. FORCE_EXEC,
  4492. BT_8821C_2ANT_PHASE_2G_RUNTIME);
  4493. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE,
  4494. &wifi_under_b_mode);
  4495. /* Set CCK Tx/Rx high Pri except 11b mode */
  4496. if (wifi_under_b_mode) {
  4497. btcoexist->btc_write_1byte(btcoexist, 0x6cd,
  4498. 0x00); /* CCK Tx */
  4499. btcoexist->btc_write_1byte(btcoexist, 0x6cf,
  4500. 0x00); /* CCK Rx */
  4501. } else {
  4502. btcoexist->btc_write_1byte(btcoexist, 0x6cd,
  4503. 0x00); /* CCK Tx */
  4504. btcoexist->btc_write_1byte(btcoexist, 0x6cf,
  4505. 0x10); /* CCK Rx */
  4506. }
  4507. } else {
  4508. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4509. "[BTCoex], MEDIA disconnect notify\n");
  4510. BTC_TRACE(trace_buf);
  4511. btcoexist->btc_write_1byte(btcoexist, 0x6cd, 0x0); /* CCK Tx */
  4512. btcoexist->btc_write_1byte(btcoexist, 0x6cf, 0x0); /* CCK Rx */
  4513. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4514. BT_8821C_2ANT_SCOREBOARD_ACTIVE, FALSE);
  4515. }
  4516. halbtc8821c2ant_update_wifi_channel_info(btcoexist, type);
  4517. }
  4518. void ex_halbtc8821c2ant_specific_packet_notify(IN struct btc_coexist *btcoexist,
  4519. IN u8 type)
  4520. {
  4521. boolean under_4way = FALSE, wifi_under_5g = FALSE;
  4522. if (btcoexist->manual_control ||
  4523. btcoexist->stop_coex_dm)
  4524. return;
  4525. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
  4526. if (wifi_under_5g) {
  4527. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4528. "[BTCoex], WiFi is under 5G!!!\n");
  4529. BTC_TRACE(trace_buf);
  4530. halbtc8821c2ant_action_wifi_under5g(btcoexist);
  4531. return;
  4532. }
  4533. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
  4534. &under_4way);
  4535. if (under_4way) {
  4536. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4537. "[BTCoex], specific Packet ---- under_4way!!\n");
  4538. BTC_TRACE(trace_buf);
  4539. coex_sta->wifi_is_high_pri_task = TRUE;
  4540. coex_sta->specific_pkt_period_cnt = 2;
  4541. } else if (BTC_PACKET_ARP == type) {
  4542. coex_dm->arp_cnt++;
  4543. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4544. "[BTCoex], specific Packet ARP notify -cnt = %d\n",
  4545. coex_dm->arp_cnt);
  4546. BTC_TRACE(trace_buf);
  4547. } else {
  4548. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4549. "[BTCoex], specific Packet DHCP or EAPOL notify [Type = %d]\n",
  4550. type);
  4551. BTC_TRACE(trace_buf);
  4552. coex_sta->wifi_is_high_pri_task = TRUE;
  4553. coex_sta->specific_pkt_period_cnt = 2;
  4554. }
  4555. if (coex_sta->wifi_is_high_pri_task) {
  4556. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4557. BT_8821C_2ANT_SCOREBOARD_SCAN, TRUE);
  4558. halbtc8821c2ant_run_coexist_mechanism(btcoexist);
  4559. }
  4560. }
  4561. void ex_halbtc8821c2ant_bt_info_notify(IN struct btc_coexist *btcoexist,
  4562. IN u8 *tmp_buf, IN u8 length)
  4563. {
  4564. u8 i, rsp_source = 0;
  4565. boolean wifi_connected = FALSE;
  4566. boolean wifi_scan = FALSE, wifi_link = FALSE, wifi_roam = FALSE,
  4567. wifi_busy = FALSE;
  4568. static boolean is_scoreboard_scan = FALSE;
  4569. rsp_source = tmp_buf[0] & 0xf;
  4570. if (rsp_source >= BT_INFO_SRC_8821C_2ANT_MAX)
  4571. rsp_source = BT_INFO_SRC_8821C_2ANT_WIFI_FW;
  4572. coex_sta->bt_info_c2h_cnt[rsp_source]++;
  4573. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4574. "[BTCoex], Bt_info[%d], len=%d, data=[", rsp_source,
  4575. length);
  4576. BTC_TRACE(trace_buf);
  4577. for (i = 0; i < length; i++) {
  4578. coex_sta->bt_info_c2h[rsp_source][i] = tmp_buf[i];
  4579. if (i == length - 1) {
  4580. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "0x%02x]\n",
  4581. tmp_buf[i]);
  4582. BTC_TRACE(trace_buf);
  4583. } else {
  4584. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "0x%02x, ",
  4585. tmp_buf[i]);
  4586. BTC_TRACE(trace_buf);
  4587. }
  4588. }
  4589. coex_sta->bt_info = coex_sta->bt_info_c2h[rsp_source][1];
  4590. coex_sta->bt_info_ext = coex_sta->bt_info_c2h[rsp_source][4];
  4591. coex_sta->bt_info_ext2 = coex_sta->bt_info_c2h[rsp_source][5];
  4592. if (BT_INFO_SRC_8821C_2ANT_WIFI_FW != rsp_source) {
  4593. /* if 0xff, it means BT is under WHCK test */
  4594. coex_sta->bt_whck_test = ((coex_sta->bt_info == 0xff) ? TRUE :
  4595. FALSE);
  4596. coex_sta->bt_create_connection = ((
  4597. coex_sta->bt_info_c2h[rsp_source][2] & 0x80) ? TRUE :
  4598. FALSE);
  4599. /* unit: %, value-100 to translate to unit: dBm */
  4600. coex_sta->bt_rssi = coex_sta->bt_info_c2h[rsp_source][3] * 2 +
  4601. 10;
  4602. coex_sta->c2h_bt_remote_name_req = ((
  4603. coex_sta->bt_info_c2h[rsp_source][2] & 0x20) ? TRUE :
  4604. FALSE);
  4605. coex_sta->is_A2DP_3M = ((coex_sta->bt_info_c2h[rsp_source][2] &
  4606. 0x10) ? TRUE : FALSE);
  4607. coex_sta->acl_busy = ((coex_sta->bt_info_c2h[rsp_source][1] &
  4608. 0x9) ? TRUE : FALSE);
  4609. coex_sta->voice_over_HOGP = ((coex_sta->bt_info_ext & 0x10) ?
  4610. TRUE : FALSE);
  4611. coex_sta->c2h_bt_inquiry_page = ((coex_sta->bt_info &
  4612. BT_INFO_8821C_2ANT_B_INQ_PAGE) ? TRUE : FALSE);
  4613. coex_sta->a2dp_bit_pool = (((
  4614. coex_sta->bt_info_c2h[rsp_source][1] & 0x49) == 0x49) ?
  4615. (coex_sta->bt_info_c2h[rsp_source][6] & 0x7f) : 0);
  4616. coex_sta->is_bt_a2dp_sink = (coex_sta->bt_info_c2h[rsp_source][6] & 0x80) ?
  4617. TRUE : FALSE;
  4618. coex_sta->bt_retry_cnt = coex_sta->bt_info_c2h[rsp_source][2] &
  4619. 0xf;
  4620. coex_sta->is_autoslot = coex_sta->bt_info_ext2 & 0x8;
  4621. coex_sta->forbidden_slot = coex_sta->bt_info_ext2 & 0x7;
  4622. coex_sta->hid_busy_num = (coex_sta->bt_info_ext2 & 0x30) >> 4;
  4623. coex_sta->hid_pair_cnt = (coex_sta->bt_info_ext2 & 0xc0) >> 6;
  4624. if (coex_sta->bt_retry_cnt >= 1)
  4625. coex_sta->pop_event_cnt++;
  4626. if (coex_sta->c2h_bt_remote_name_req)
  4627. coex_sta->cnt_RemoteNameReq++;
  4628. if (coex_sta->bt_info_ext & BIT(1))
  4629. coex_sta->cnt_ReInit++;
  4630. if (coex_sta->bt_info_ext & BIT(2)) {
  4631. coex_sta->cnt_setupLink++;
  4632. coex_sta->is_setupLink = TRUE;
  4633. coex_sta->bt_relink_downcount = 2;
  4634. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4635. "[BTCoex], Re-Link start in BT info!!\n");
  4636. BTC_TRACE(trace_buf);
  4637. } else {
  4638. coex_sta->is_setupLink = FALSE;
  4639. coex_sta->bt_relink_downcount = 0;
  4640. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4641. "[BTCoex], Re-Link stop in BT info!!\n");
  4642. BTC_TRACE(trace_buf);
  4643. }
  4644. if (coex_sta->bt_info_ext & BIT(3))
  4645. coex_sta->cnt_IgnWlanAct++;
  4646. if (coex_sta->bt_info_ext & BIT(6))
  4647. coex_sta->cnt_RoleSwitch++;
  4648. if (coex_sta->bt_info_ext & BIT(7))
  4649. coex_sta->is_bt_multi_link = TRUE;
  4650. else
  4651. coex_sta->is_bt_multi_link = FALSE;
  4652. if (coex_sta->bt_create_connection) {
  4653. coex_sta->cnt_Page++;
  4654. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY,
  4655. &wifi_busy);
  4656. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &wifi_scan);
  4657. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &wifi_link);
  4658. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &wifi_roam);
  4659. if ((wifi_link) || (wifi_roam) || (wifi_scan) ||
  4660. (coex_sta->wifi_is_high_pri_task) || (wifi_busy)) {
  4661. is_scoreboard_scan = TRUE;
  4662. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4663. BT_8821C_2ANT_SCOREBOARD_SCAN, TRUE);
  4664. } else
  4665. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4666. BT_8821C_2ANT_SCOREBOARD_SCAN, FALSE);
  4667. } else {
  4668. if (is_scoreboard_scan) {
  4669. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4670. BT_8821C_2ANT_SCOREBOARD_SCAN, FALSE);
  4671. is_scoreboard_scan = FALSE;
  4672. }
  4673. }
  4674. /* Here we need to resend some wifi info to BT */
  4675. /* because bt is reset and loss of the info. */
  4676. if ((!btcoexist->manual_control) &&
  4677. (!btcoexist->stop_coex_dm)) {
  4678. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
  4679. &wifi_connected);
  4680. /* Re-Init */
  4681. if ((coex_sta->bt_info_ext & BIT(1))) {
  4682. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4683. "[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n");
  4684. BTC_TRACE(trace_buf);
  4685. if (wifi_connected)
  4686. halbtc8821c2ant_update_wifi_channel_info(
  4687. btcoexist, BTC_MEDIA_CONNECT);
  4688. else
  4689. halbtc8821c2ant_update_wifi_channel_info(
  4690. btcoexist,
  4691. BTC_MEDIA_DISCONNECT);
  4692. }
  4693. /* If Ignore_WLanAct && not SetUp_Link */
  4694. if ((coex_sta->bt_info_ext & BIT(3)) &&
  4695. (!(coex_sta->bt_info_ext & BIT(2))) &&
  4696. (!(coex_sta->bt_info_ext & BIT(6)))) {
  4697. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4698. "[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n");
  4699. BTC_TRACE(trace_buf);
  4700. halbtc8821c2ant_ignore_wlan_act(btcoexist,
  4701. FORCE_EXEC, FALSE);
  4702. } else {
  4703. if (coex_sta->bt_info_ext & BIT(2)) {
  4704. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4705. "[BTCoex], BT ignore Wlan active because Re-link!!\n");
  4706. BTC_TRACE(trace_buf);
  4707. } else if (coex_sta->bt_info_ext & BIT(6)) {
  4708. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4709. "[BTCoex], BT ignore Wlan active because Role-Switch!!\n");
  4710. BTC_TRACE(trace_buf);
  4711. }
  4712. }
  4713. }
  4714. }
  4715. if ((coex_sta->bt_info_ext & BIT(5))) {
  4716. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4717. "[BTCoex], BT ext info bit4 check, query BLE Scan type!!\n");
  4718. BTC_TRACE(trace_buf);
  4719. coex_sta->bt_ble_scan_type = btcoexist->btc_get_ble_scan_type_from_bt(
  4720. btcoexist);
  4721. if ((coex_sta->bt_ble_scan_type & 0x1) == 0x1)
  4722. coex_sta->bt_ble_scan_para[0] =
  4723. btcoexist->btc_get_ble_scan_para_from_bt(btcoexist,
  4724. 0x1);
  4725. if ((coex_sta->bt_ble_scan_type & 0x2) == 0x2)
  4726. coex_sta->bt_ble_scan_para[1] =
  4727. btcoexist->btc_get_ble_scan_para_from_bt(btcoexist,
  4728. 0x2);
  4729. if ((coex_sta->bt_ble_scan_type & 0x4) == 0x4)
  4730. coex_sta->bt_ble_scan_para[2] =
  4731. btcoexist->btc_get_ble_scan_para_from_bt(btcoexist,
  4732. 0x4);
  4733. }
  4734. halbtc8821c2ant_update_bt_link_info(btcoexist);
  4735. halbtc8821c2ant_run_coexist_mechanism(btcoexist);
  4736. }
  4737. void ex_halbtc8821c2ant_rf_status_notify(IN struct btc_coexist *btcoexist,
  4738. IN u8 type)
  4739. {
  4740. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], RF Status notify\n");
  4741. BTC_TRACE(trace_buf);
  4742. if (BTC_RF_ON == type) {
  4743. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4744. "[BTCoex], RF is turned ON!!\n");
  4745. BTC_TRACE(trace_buf);
  4746. btcoexist->stop_coex_dm = FALSE;
  4747. coex_sta->is_rf_state_off = FALSE;
  4748. #if 0
  4749. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4750. BT_8821C_2ANT_SCOREBOARD_ACTIVE, TRUE);
  4751. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4752. BT_8821C_2ANT_SCOREBOARD_ONOFF, TRUE);
  4753. #endif
  4754. } else if (BTC_RF_OFF == type) {
  4755. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4756. "[BTCoex], RF is turned OFF!!\n");
  4757. BTC_TRACE(trace_buf);
  4758. halbtc8821c2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO,
  4759. FORCE_EXEC,
  4760. BT_8821C_2ANT_PHASE_WLAN_OFF);
  4761. halbtc8821c2ant_action_coex_all_off(btcoexist);
  4762. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4763. BT_8821C_2ANT_SCOREBOARD_ACTIVE |
  4764. BT_8821C_2ANT_SCOREBOARD_ONOFF |
  4765. BT_8821C_2ANT_SCOREBOARD_SCAN |
  4766. BT_8821C_2ANT_SCOREBOARD_UNDERTEST,
  4767. FALSE);
  4768. btcoexist->stop_coex_dm = TRUE;
  4769. coex_sta->is_rf_state_off = TRUE;
  4770. }
  4771. }
  4772. void ex_halbtc8821c2ant_halt_notify(IN struct btc_coexist *btcoexist)
  4773. {
  4774. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Halt notify\n");
  4775. BTC_TRACE(trace_buf);
  4776. halbtc8821c2ant_set_ant_path(btcoexist, BTC_ANT_PATH_AUTO, FORCE_EXEC,
  4777. BT_8821C_2ANT_PHASE_WLAN_OFF);
  4778. ex_halbtc8821c2ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
  4779. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4780. BT_8821C_2ANT_SCOREBOARD_ACTIVE |
  4781. BT_8821C_2ANT_SCOREBOARD_ONOFF |
  4782. BT_8821C_2ANT_SCOREBOARD_SCAN |
  4783. BT_8821C_2ANT_SCOREBOARD_UNDERTEST,
  4784. FALSE);
  4785. }
  4786. void ex_halbtc8821c2ant_pnp_notify(IN struct btc_coexist *btcoexist,
  4787. IN u8 pnp_state)
  4788. {
  4789. boolean wifi_under_5g = FALSE;
  4790. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE, "[BTCoex], Pnp notify\n");
  4791. BTC_TRACE(trace_buf);
  4792. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
  4793. if ((BTC_WIFI_PNP_SLEEP == pnp_state) ||
  4794. (BTC_WIFI_PNP_SLEEP_KEEP_ANT == pnp_state)) {
  4795. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4796. "[BTCoex], Pnp notify to SLEEP\n");
  4797. BTC_TRACE(trace_buf);
  4798. /* Sinda 20150819, workaround for driver skip leave IPS/LPS to speed up sleep time. */
  4799. /* Driver do not leave IPS/LPS when driver is going to sleep, so BTCoexistence think wifi is still under IPS/LPS */
  4800. /* BT should clear UnderIPS/UnderLPS state to avoid mismatch state after wakeup. */
  4801. coex_sta->under_ips = FALSE;
  4802. coex_sta->under_lps = FALSE;
  4803. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4804. BT_8821C_2ANT_SCOREBOARD_ACTIVE |
  4805. BT_8821C_2ANT_SCOREBOARD_ONOFF |
  4806. BT_8821C_2ANT_SCOREBOARD_SCAN |
  4807. BT_8821C_2ANT_SCOREBOARD_UNDERTEST,
  4808. FALSE);
  4809. if (BTC_WIFI_PNP_SLEEP_KEEP_ANT == pnp_state) {
  4810. if (wifi_under_5g)
  4811. halbtc8821c2ant_set_ant_path(btcoexist,
  4812. BTC_ANT_PATH_AUTO, FORCE_EXEC,
  4813. BT_8821C_2ANT_PHASE_5G_RUNTIME);
  4814. else
  4815. halbtc8821c2ant_set_ant_path(btcoexist,
  4816. BTC_ANT_PATH_AUTO, FORCE_EXEC,
  4817. BT_8821C_2ANT_PHASE_2G_RUNTIME);
  4818. } else {
  4819. halbtc8821c2ant_set_ant_path(btcoexist,
  4820. BTC_ANT_PATH_AUTO,
  4821. FORCE_EXEC,
  4822. BT_8821C_2ANT_PHASE_WLAN_OFF);
  4823. }
  4824. } else if (BTC_WIFI_PNP_WAKE_UP == pnp_state) {
  4825. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4826. "[BTCoex], Pnp notify to WAKE UP\n");
  4827. BTC_TRACE(trace_buf);
  4828. #if 0
  4829. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4830. BT_8821C_2ANT_SCOREBOARD_ACTIVE, TRUE);
  4831. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4832. BT_8821C_2ANT_SCOREBOARD_ONOFF, TRUE);
  4833. #endif
  4834. }
  4835. }
  4836. void ex_halbtc8821c2ant_periodical(IN struct btc_coexist *btcoexist)
  4837. {
  4838. struct btc_board_info *board_info = &btcoexist->board_info;
  4839. boolean wifi_busy = FALSE;
  4840. boolean bt_relink_finish = FALSE;
  4841. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4842. "[BTCoex], ************* Periodical *************\n");
  4843. BTC_TRACE(trace_buf);
  4844. #if (BT_AUTO_REPORT_ONLY_8821C_2ANT == 0)
  4845. halbtc8821c2ant_query_bt_info(btcoexist);
  4846. #endif
  4847. halbtc8821c2ant_monitor_bt_ctr(btcoexist);
  4848. halbtc8821c2ant_monitor_wifi_ctr(btcoexist);
  4849. halbtc8821c2ant_monitor_bt_enable_disable(btcoexist);
  4850. #if 0
  4851. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
  4852. /* halbtc8821c2ant_read_score_board(btcoexist, &bt_scoreboard_val); */
  4853. if (wifi_busy) {
  4854. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4855. BT_8821C_2ANT_SCOREBOARD_UNDERTEST, TRUE);
  4856. /*
  4857. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4858. BT_8821C_2ANT_SCOREBOARD_WLBUSY, TRUE);
  4859. if (bt_scoreboard_val & BIT(6))
  4860. halbtc8821c2ant_query_bt_info(btcoexist); */
  4861. } else {
  4862. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4863. BT_8821C_2ANT_SCOREBOARD_UNDERTEST, FALSE);
  4864. /*
  4865. halbtc8821c2ant_post_state_to_bt(btcoexist,
  4866. BT_8821C_2ANT_SCOREBOARD_WLBUSY,
  4867. FALSE); */
  4868. }
  4869. #endif
  4870. if (coex_sta->bt_relink_downcount != 0) {
  4871. coex_sta->bt_relink_downcount--;
  4872. if (coex_sta->bt_relink_downcount == 0) {
  4873. coex_sta->is_setupLink = FALSE;
  4874. bt_relink_finish = TRUE;
  4875. }
  4876. }
  4877. /* for 4-way, DHCP, EAPOL packet */
  4878. if (coex_sta->specific_pkt_period_cnt > 0) {
  4879. coex_sta->specific_pkt_period_cnt--;
  4880. if ((coex_sta->specific_pkt_period_cnt == 0) &&
  4881. (coex_sta->wifi_is_high_pri_task))
  4882. coex_sta->wifi_is_high_pri_task = FALSE;
  4883. BTC_SPRINTF(trace_buf, BT_TMP_BUF_SIZE,
  4884. "[BTCoex], ***************** Hi-Pri Task = %s\n",
  4885. (coex_sta->wifi_is_high_pri_task ? "Yes" :
  4886. "No"));
  4887. BTC_TRACE(trace_buf);
  4888. }
  4889. if (halbtc8821c2ant_is_wifibt_status_changed(btcoexist) || (bt_relink_finish)
  4890. || (coex_sta->is_set_ps_state_fail))
  4891. halbtc8821c2ant_run_coexist_mechanism(btcoexist);
  4892. }
  4893. /*#pragma optimize( "", off )*/
  4894. void ex_halbtc8821c2ant_antenna_detection(IN struct btc_coexist *btcoexist,
  4895. IN u32 cent_freq, IN u32 offset, IN u32 span, IN u32 seconds)
  4896. {
  4897. }
  4898. void ex_halbtc8821c2ant_display_ant_detection(IN struct btc_coexist *btcoexist)
  4899. {
  4900. }
  4901. #endif
  4902. #endif /* #if (RTL8821C_SUPPORT == 1) */