halbtc8723b2ant.c 114 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2012 Realtek Corporation.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of version 2 of the GNU General Public License as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. * The full GNU General Public License is included in this distribution in the
  15. * file called LICENSE.
  16. *
  17. * Contact Information:
  18. * wlanfae <wlanfae@realtek.com>
  19. * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
  20. * Hsinchu 300, Taiwan.
  21. *
  22. * Larry Finger <Larry.Finger@lwfinger.net>
  23. *
  24. *****************************************************************************/
  25. /***************************************************************
  26. * Description:
  27. *
  28. * This file is for RTL8723B Co-exist mechanism
  29. *
  30. * History
  31. * 2012/11/15 Cosa first check in.
  32. *
  33. **************************************************************/
  34. /**************************************************************
  35. * include files
  36. **************************************************************/
  37. #include "halbt_precomp.h"
  38. /**************************************************************
  39. * Global variables, these are static variables
  40. **************************************************************/
  41. static struct coex_dm_8723b_2ant glcoex_dm_8723b_2ant;
  42. static struct coex_dm_8723b_2ant *coex_dm = &glcoex_dm_8723b_2ant;
  43. static struct coex_sta_8723b_2ant glcoex_sta_8723b_2ant;
  44. static struct coex_sta_8723b_2ant *coex_sta = &glcoex_sta_8723b_2ant;
  45. static const char *const glbt_info_src_8723b_2ant[] = {
  46. "BT Info[wifi fw]",
  47. "BT Info[bt rsp]",
  48. "BT Info[bt auto report]",
  49. };
  50. static u32 glcoex_ver_date_8723b_2ant = 20131113;
  51. static u32 glcoex_ver_8723b_2ant = 0x3f;
  52. /**************************************************************
  53. * local function proto type if needed
  54. **************************************************************/
  55. /**************************************************************
  56. * local function start with btc8723b2ant_
  57. **************************************************************/
  58. static u8 btc8723b2ant_bt_rssi_state(u8 level_num, u8 rssi_thresh,
  59. u8 rssi_thresh1)
  60. {
  61. s32 bt_rssi = 0;
  62. u8 bt_rssi_state = coex_sta->pre_bt_rssi_state;
  63. bt_rssi = coex_sta->bt_rssi;
  64. if (level_num == 2) {
  65. if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
  66. (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
  67. if (bt_rssi >= rssi_thresh +
  68. BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
  69. bt_rssi_state = BTC_RSSI_STATE_HIGH;
  70. btc_alg_dbg(ALGO_BT_RSSI_STATE,
  71. "[BTCoex], BT Rssi state switch to High\n");
  72. } else {
  73. bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
  74. btc_alg_dbg(ALGO_BT_RSSI_STATE,
  75. "[BTCoex], BT Rssi state stay at Low\n");
  76. }
  77. } else {
  78. if (bt_rssi < rssi_thresh) {
  79. bt_rssi_state = BTC_RSSI_STATE_LOW;
  80. btc_alg_dbg(ALGO_BT_RSSI_STATE,
  81. "[BTCoex], BT Rssi state switch to Low\n");
  82. } else {
  83. bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
  84. btc_alg_dbg(ALGO_BT_RSSI_STATE,
  85. "[BTCoex], BT Rssi state stay at High\n");
  86. }
  87. }
  88. } else if (level_num == 3) {
  89. if (rssi_thresh > rssi_thresh1) {
  90. btc_alg_dbg(ALGO_BT_RSSI_STATE,
  91. "[BTCoex], BT Rssi thresh error!!\n");
  92. return coex_sta->pre_bt_rssi_state;
  93. }
  94. if ((coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_LOW) ||
  95. (coex_sta->pre_bt_rssi_state == BTC_RSSI_STATE_STAY_LOW)) {
  96. if (bt_rssi >= rssi_thresh +
  97. BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
  98. bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
  99. btc_alg_dbg(ALGO_BT_RSSI_STATE,
  100. "[BTCoex], BT Rssi state switch to Medium\n");
  101. } else {
  102. bt_rssi_state = BTC_RSSI_STATE_STAY_LOW;
  103. btc_alg_dbg(ALGO_BT_RSSI_STATE,
  104. "[BTCoex], BT Rssi state stay at Low\n");
  105. }
  106. } else if ((coex_sta->pre_bt_rssi_state ==
  107. BTC_RSSI_STATE_MEDIUM) ||
  108. (coex_sta->pre_bt_rssi_state ==
  109. BTC_RSSI_STATE_STAY_MEDIUM)) {
  110. if (bt_rssi >= rssi_thresh1 +
  111. BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
  112. bt_rssi_state = BTC_RSSI_STATE_HIGH;
  113. btc_alg_dbg(ALGO_BT_RSSI_STATE,
  114. "[BTCoex], BT Rssi state switch to High\n");
  115. } else if (bt_rssi < rssi_thresh) {
  116. bt_rssi_state = BTC_RSSI_STATE_LOW;
  117. btc_alg_dbg(ALGO_BT_RSSI_STATE,
  118. "[BTCoex], BT Rssi state switch to Low\n");
  119. } else {
  120. bt_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
  121. btc_alg_dbg(ALGO_BT_RSSI_STATE,
  122. "[BTCoex], BT Rssi state stay at Medium\n");
  123. }
  124. } else {
  125. if (bt_rssi < rssi_thresh1) {
  126. bt_rssi_state = BTC_RSSI_STATE_MEDIUM;
  127. btc_alg_dbg(ALGO_BT_RSSI_STATE,
  128. "[BTCoex], BT Rssi state switch to Medium\n");
  129. } else {
  130. bt_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
  131. btc_alg_dbg(ALGO_BT_RSSI_STATE,
  132. "[BTCoex], BT Rssi state stay at High\n");
  133. }
  134. }
  135. }
  136. coex_sta->pre_bt_rssi_state = bt_rssi_state;
  137. return bt_rssi_state;
  138. }
  139. static u8 btc8723b2ant_wifi_rssi_state(struct btc_coexist *btcoexist,
  140. u8 index, u8 level_num,
  141. u8 rssi_thresh, u8 rssi_thresh1)
  142. {
  143. s32 wifi_rssi = 0;
  144. u8 wifi_rssi_state = coex_sta->pre_wifi_rssi_state[index];
  145. btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
  146. if (level_num == 2) {
  147. if ((coex_sta->pre_wifi_rssi_state[index] ==
  148. BTC_RSSI_STATE_LOW) ||
  149. (coex_sta->pre_wifi_rssi_state[index] ==
  150. BTC_RSSI_STATE_STAY_LOW)) {
  151. if (wifi_rssi >= rssi_thresh +
  152. BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
  153. wifi_rssi_state = BTC_RSSI_STATE_HIGH;
  154. btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
  155. "[BTCoex], wifi RSSI state switch to High\n");
  156. } else {
  157. wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
  158. btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
  159. "[BTCoex], wifi RSSI state stay at Low\n");
  160. }
  161. } else {
  162. if (wifi_rssi < rssi_thresh) {
  163. wifi_rssi_state = BTC_RSSI_STATE_LOW;
  164. btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
  165. "[BTCoex], wifi RSSI state switch to Low\n");
  166. } else {
  167. wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
  168. btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
  169. "[BTCoex], wifi RSSI state stay at High\n");
  170. }
  171. }
  172. } else if (level_num == 3) {
  173. if (rssi_thresh > rssi_thresh1) {
  174. btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
  175. "[BTCoex], wifi RSSI thresh error!!\n");
  176. return coex_sta->pre_wifi_rssi_state[index];
  177. }
  178. if ((coex_sta->pre_wifi_rssi_state[index] ==
  179. BTC_RSSI_STATE_LOW) ||
  180. (coex_sta->pre_wifi_rssi_state[index] ==
  181. BTC_RSSI_STATE_STAY_LOW)) {
  182. if (wifi_rssi >= rssi_thresh +
  183. BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
  184. wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
  185. btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
  186. "[BTCoex], wifi RSSI state switch to Medium\n");
  187. } else {
  188. wifi_rssi_state = BTC_RSSI_STATE_STAY_LOW;
  189. btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
  190. "[BTCoex], wifi RSSI state stay at Low\n");
  191. }
  192. } else if ((coex_sta->pre_wifi_rssi_state[index] ==
  193. BTC_RSSI_STATE_MEDIUM) ||
  194. (coex_sta->pre_wifi_rssi_state[index] ==
  195. BTC_RSSI_STATE_STAY_MEDIUM)) {
  196. if (wifi_rssi >= rssi_thresh1 +
  197. BTC_RSSI_COEX_THRESH_TOL_8723B_2ANT) {
  198. wifi_rssi_state = BTC_RSSI_STATE_HIGH;
  199. btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
  200. "[BTCoex], wifi RSSI state switch to High\n");
  201. } else if (wifi_rssi < rssi_thresh) {
  202. wifi_rssi_state = BTC_RSSI_STATE_LOW;
  203. btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
  204. "[BTCoex], wifi RSSI state switch to Low\n");
  205. } else {
  206. wifi_rssi_state = BTC_RSSI_STATE_STAY_MEDIUM;
  207. btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
  208. "[BTCoex], wifi RSSI state stay at Medium\n");
  209. }
  210. } else {
  211. if (wifi_rssi < rssi_thresh1) {
  212. wifi_rssi_state = BTC_RSSI_STATE_MEDIUM;
  213. btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
  214. "[BTCoex], wifi RSSI state switch to Medium\n");
  215. } else {
  216. wifi_rssi_state = BTC_RSSI_STATE_STAY_HIGH;
  217. btc_alg_dbg(ALGO_WIFI_RSSI_STATE,
  218. "[BTCoex], wifi RSSI state stay at High\n");
  219. }
  220. }
  221. }
  222. coex_sta->pre_wifi_rssi_state[index] = wifi_rssi_state;
  223. return wifi_rssi_state;
  224. }
  225. static void btc8723b2ant_monitor_bt_ctr(struct btc_coexist *btcoexist)
  226. {
  227. u32 reg_hp_txrx, reg_lp_txrx, u32tmp;
  228. u32 reg_hp_tx = 0, reg_hp_rx = 0;
  229. u32 reg_lp_tx = 0, reg_lp_rx = 0;
  230. reg_hp_txrx = 0x770;
  231. reg_lp_txrx = 0x774;
  232. u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_hp_txrx);
  233. reg_hp_tx = u32tmp & MASKLWORD;
  234. reg_hp_rx = (u32tmp & MASKHWORD) >> 16;
  235. u32tmp = btcoexist->btc_read_4byte(btcoexist, reg_lp_txrx);
  236. reg_lp_tx = u32tmp & MASKLWORD;
  237. reg_lp_rx = (u32tmp & MASKHWORD) >> 16;
  238. coex_sta->high_priority_tx = reg_hp_tx;
  239. coex_sta->high_priority_rx = reg_hp_rx;
  240. coex_sta->low_priority_tx = reg_lp_tx;
  241. coex_sta->low_priority_rx = reg_lp_rx;
  242. btc_alg_dbg(ALGO_BT_MONITOR,
  243. "[BTCoex], High Priority Tx/Rx(reg 0x%x)=0x%x(%d)/0x%x(%d)\n",
  244. reg_hp_txrx, reg_hp_tx, reg_hp_tx, reg_hp_rx, reg_hp_rx);
  245. btc_alg_dbg(ALGO_BT_MONITOR,
  246. "[BTCoex], Low Priority Tx/Rx(reg 0x%x)=0x%x(%d)/0x%x(%d)\n",
  247. reg_lp_txrx, reg_lp_tx, reg_lp_tx, reg_lp_rx, reg_lp_rx);
  248. /* reset counter */
  249. btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
  250. }
  251. static void btc8723b2ant_query_bt_info(struct btc_coexist *btcoexist)
  252. {
  253. u8 h2c_parameter[1] = {0};
  254. coex_sta->c2h_bt_info_req_sent = true;
  255. h2c_parameter[0] |= BIT0; /* trigger */
  256. btc_alg_dbg(ALGO_TRACE_FW_EXEC,
  257. "[BTCoex], Query Bt Info, FW write 0x61 = 0x%x\n",
  258. h2c_parameter[0]);
  259. btcoexist->btc_fill_h2c(btcoexist, 0x61, 1, h2c_parameter);
  260. }
  261. static bool btc8723b2ant_is_wifi_status_changed(struct btc_coexist *btcoexist)
  262. {
  263. static bool pre_wifi_busy;
  264. static bool pre_under_4way;
  265. static bool pre_bt_hs_on;
  266. bool wifi_busy = false, under_4way = false, bt_hs_on = false;
  267. bool wifi_connected = false;
  268. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
  269. &wifi_connected);
  270. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
  271. btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
  272. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_4_WAY_PROGRESS,
  273. &under_4way);
  274. if (wifi_connected) {
  275. if (wifi_busy != pre_wifi_busy) {
  276. pre_wifi_busy = wifi_busy;
  277. return true;
  278. }
  279. if (under_4way != pre_under_4way) {
  280. pre_under_4way = under_4way;
  281. return true;
  282. }
  283. if (bt_hs_on != pre_bt_hs_on) {
  284. pre_bt_hs_on = bt_hs_on;
  285. return true;
  286. }
  287. }
  288. return false;
  289. }
  290. static void btc8723b2ant_update_bt_link_info(struct btc_coexist *btcoexist)
  291. {
  292. /*struct btc_stack_info *stack_info = &btcoexist->stack_info;*/
  293. struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
  294. bool bt_hs_on = false;
  295. #if (BT_AUTO_REPORT_ONLY_8723B_2ANT == 1) /* profile from bt patch */
  296. btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
  297. bt_link_info->bt_link_exist = coex_sta->bt_link_exist;
  298. bt_link_info->sco_exist = coex_sta->sco_exist;
  299. bt_link_info->a2dp_exist = coex_sta->a2dp_exist;
  300. bt_link_info->pan_exist = coex_sta->pan_exist;
  301. bt_link_info->hid_exist = coex_sta->hid_exist;
  302. /* work around for HS mode. */
  303. if (bt_hs_on) {
  304. bt_link_info->pan_exist = true;
  305. bt_link_info->bt_link_exist = true;
  306. }
  307. #else /* profile from bt stack */
  308. bt_link_info->bt_link_exist = stack_info->bt_link_exist;
  309. bt_link_info->sco_exist = stack_info->sco_exist;
  310. bt_link_info->a2dp_exist = stack_info->a2dp_exist;
  311. bt_link_info->pan_exist = stack_info->pan_exist;
  312. bt_link_info->hid_exist = stack_info->hid_exist;
  313. /*for win-8 stack HID report error*/
  314. if (!stack_info->hid_exist)
  315. stack_info->hid_exist = coex_sta->hid_exist;
  316. /*sync BTInfo with BT firmware and stack*/
  317. /* when stack HID report error, here we use the info from bt fw.*/
  318. if (!stack_info->bt_link_exist)
  319. stack_info->bt_link_exist = coex_sta->bt_link_exist;
  320. #endif
  321. /* check if Sco only */
  322. if (bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
  323. !bt_link_info->pan_exist && !bt_link_info->hid_exist)
  324. bt_link_info->sco_only = true;
  325. else
  326. bt_link_info->sco_only = false;
  327. /* check if A2dp only */
  328. if (!bt_link_info->sco_exist && bt_link_info->a2dp_exist &&
  329. !bt_link_info->pan_exist && !bt_link_info->hid_exist)
  330. bt_link_info->a2dp_only = true;
  331. else
  332. bt_link_info->a2dp_only = false;
  333. /* check if Pan only */
  334. if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
  335. bt_link_info->pan_exist && !bt_link_info->hid_exist)
  336. bt_link_info->pan_only = true;
  337. else
  338. bt_link_info->pan_only = false;
  339. /* check if Hid only */
  340. if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist &&
  341. !bt_link_info->pan_exist && bt_link_info->hid_exist)
  342. bt_link_info->hid_only = true;
  343. else
  344. bt_link_info->hid_only = false;
  345. }
  346. static u8 btc8723b2ant_action_algorithm(struct btc_coexist *btcoexist)
  347. {
  348. struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
  349. bool bt_hs_on = false;
  350. u8 algorithm = BT_8723B_2ANT_COEX_ALGO_UNDEFINED;
  351. u8 num_of_diff_profile = 0;
  352. btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
  353. if (!bt_link_info->bt_link_exist) {
  354. btc_alg_dbg(ALGO_TRACE,
  355. "[BTCoex], No BT link exists!!!\n");
  356. return algorithm;
  357. }
  358. if (bt_link_info->sco_exist)
  359. num_of_diff_profile++;
  360. if (bt_link_info->hid_exist)
  361. num_of_diff_profile++;
  362. if (bt_link_info->pan_exist)
  363. num_of_diff_profile++;
  364. if (bt_link_info->a2dp_exist)
  365. num_of_diff_profile++;
  366. if (num_of_diff_profile == 1) {
  367. if (bt_link_info->sco_exist) {
  368. btc_alg_dbg(ALGO_TRACE,
  369. "[BTCoex], SCO only\n");
  370. algorithm = BT_8723B_2ANT_COEX_ALGO_SCO;
  371. } else {
  372. if (bt_link_info->hid_exist) {
  373. btc_alg_dbg(ALGO_TRACE,
  374. "[BTCoex], HID only\n");
  375. algorithm = BT_8723B_2ANT_COEX_ALGO_HID;
  376. } else if (bt_link_info->a2dp_exist) {
  377. btc_alg_dbg(ALGO_TRACE,
  378. "[BTCoex], A2DP only\n");
  379. algorithm = BT_8723B_2ANT_COEX_ALGO_A2DP;
  380. } else if (bt_link_info->pan_exist) {
  381. if (bt_hs_on) {
  382. btc_alg_dbg(ALGO_TRACE,
  383. "[BTCoex], PAN(HS) only\n");
  384. algorithm =
  385. BT_8723B_2ANT_COEX_ALGO_PANHS;
  386. } else {
  387. btc_alg_dbg(ALGO_TRACE,
  388. "[BTCoex], PAN(EDR) only\n");
  389. algorithm =
  390. BT_8723B_2ANT_COEX_ALGO_PANEDR;
  391. }
  392. }
  393. }
  394. } else if (num_of_diff_profile == 2) {
  395. if (bt_link_info->sco_exist) {
  396. if (bt_link_info->hid_exist) {
  397. btc_alg_dbg(ALGO_TRACE,
  398. "[BTCoex], SCO + HID\n");
  399. algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
  400. } else if (bt_link_info->a2dp_exist) {
  401. btc_alg_dbg(ALGO_TRACE,
  402. "[BTCoex], SCO + A2DP ==> SCO\n");
  403. algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
  404. } else if (bt_link_info->pan_exist) {
  405. if (bt_hs_on) {
  406. btc_alg_dbg(ALGO_TRACE,
  407. "[BTCoex], SCO + PAN(HS)\n");
  408. algorithm = BT_8723B_2ANT_COEX_ALGO_SCO;
  409. } else {
  410. btc_alg_dbg(ALGO_TRACE,
  411. "[BTCoex], SCO + PAN(EDR)\n");
  412. algorithm =
  413. BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
  414. }
  415. }
  416. } else {
  417. if (bt_link_info->hid_exist &&
  418. bt_link_info->a2dp_exist) {
  419. btc_alg_dbg(ALGO_TRACE,
  420. "[BTCoex], HID + A2DP\n");
  421. algorithm = BT_8723B_2ANT_COEX_ALGO_HID_A2DP;
  422. } else if (bt_link_info->hid_exist &&
  423. bt_link_info->pan_exist) {
  424. if (bt_hs_on) {
  425. btc_alg_dbg(ALGO_TRACE,
  426. "[BTCoex], HID + PAN(HS)\n");
  427. algorithm = BT_8723B_2ANT_COEX_ALGO_HID;
  428. } else {
  429. btc_alg_dbg(ALGO_TRACE,
  430. "[BTCoex], HID + PAN(EDR)\n");
  431. algorithm =
  432. BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
  433. }
  434. } else if (bt_link_info->pan_exist &&
  435. bt_link_info->a2dp_exist) {
  436. if (bt_hs_on) {
  437. btc_alg_dbg(ALGO_TRACE,
  438. "[BTCoex], A2DP + PAN(HS)\n");
  439. algorithm =
  440. BT_8723B_2ANT_COEX_ALGO_A2DP_PANHS;
  441. } else {
  442. btc_alg_dbg(ALGO_TRACE,
  443. "[BTCoex],A2DP + PAN(EDR)\n");
  444. algorithm =
  445. BT_8723B_2ANT_COEX_ALGO_PANEDR_A2DP;
  446. }
  447. }
  448. }
  449. } else if (num_of_diff_profile == 3) {
  450. if (bt_link_info->sco_exist) {
  451. if (bt_link_info->hid_exist &&
  452. bt_link_info->a2dp_exist) {
  453. btc_alg_dbg(ALGO_TRACE,
  454. "[BTCoex], SCO + HID + A2DP ==> HID\n");
  455. algorithm = BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
  456. } else if (bt_link_info->hid_exist &&
  457. bt_link_info->pan_exist) {
  458. if (bt_hs_on) {
  459. btc_alg_dbg(ALGO_TRACE,
  460. "[BTCoex], SCO + HID + PAN(HS)\n");
  461. algorithm =
  462. BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
  463. } else {
  464. btc_alg_dbg(ALGO_TRACE,
  465. "[BTCoex], SCO + HID + PAN(EDR)\n");
  466. algorithm =
  467. BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
  468. }
  469. } else if (bt_link_info->pan_exist &&
  470. bt_link_info->a2dp_exist) {
  471. if (bt_hs_on) {
  472. btc_alg_dbg(ALGO_TRACE,
  473. "[BTCoex], SCO + A2DP + PAN(HS)\n");
  474. algorithm =
  475. BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
  476. } else {
  477. btc_alg_dbg(ALGO_TRACE,
  478. "[BTCoex], SCO + A2DP + PAN(EDR) ==> HID\n");
  479. algorithm =
  480. BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
  481. }
  482. }
  483. } else {
  484. if (bt_link_info->hid_exist &&
  485. bt_link_info->pan_exist &&
  486. bt_link_info->a2dp_exist) {
  487. if (bt_hs_on) {
  488. btc_alg_dbg(ALGO_TRACE,
  489. "[BTCoex], HID + A2DP + PAN(HS)\n");
  490. algorithm =
  491. BT_8723B_2ANT_COEX_ALGO_HID_A2DP;
  492. } else {
  493. btc_alg_dbg(ALGO_TRACE,
  494. "[BTCoex], HID + A2DP + PAN(EDR)\n");
  495. algorithm =
  496. BT_8723B_2ANT_COEX_ALGO_HID_A2DP_PANEDR;
  497. }
  498. }
  499. }
  500. } else if (num_of_diff_profile >= 3) {
  501. if (bt_link_info->sco_exist) {
  502. if (bt_link_info->hid_exist &&
  503. bt_link_info->pan_exist &&
  504. bt_link_info->a2dp_exist) {
  505. if (bt_hs_on) {
  506. btc_alg_dbg(ALGO_TRACE,
  507. "[BTCoex], Error!!! SCO + HID + A2DP + PAN(HS)\n");
  508. } else {
  509. btc_alg_dbg(ALGO_TRACE,
  510. "[BTCoex], SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n");
  511. algorithm =
  512. BT_8723B_2ANT_COEX_ALGO_PANEDR_HID;
  513. }
  514. }
  515. }
  516. }
  517. return algorithm;
  518. }
  519. static bool btc8723b_need_dec_pwr(struct btc_coexist *btcoexist)
  520. {
  521. bool ret = false;
  522. bool bt_hs_on = false, wifi_connected = false;
  523. s32 bt_hs_rssi = 0;
  524. u8 bt_rssi_state;
  525. if (!btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on))
  526. return false;
  527. if (!btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
  528. &wifi_connected))
  529. return false;
  530. if (!btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi))
  531. return false;
  532. bt_rssi_state = btc8723b2ant_bt_rssi_state(2, 29, 0);
  533. if (wifi_connected) {
  534. if (bt_hs_on) {
  535. if (bt_hs_rssi > 37) {
  536. btc_alg_dbg(ALGO_TRACE_FW,
  537. "[BTCoex], Need to decrease bt power for HS mode!!\n");
  538. ret = true;
  539. }
  540. } else {
  541. if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
  542. (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  543. btc_alg_dbg(ALGO_TRACE_FW,
  544. "[BTCoex], Need to decrease bt power for Wifi is connected!!\n");
  545. ret = true;
  546. }
  547. }
  548. }
  549. return ret;
  550. }
  551. static void btc8723b2ant_set_fw_dac_swing_level(struct btc_coexist *btcoexist,
  552. u8 dac_swing_lvl)
  553. {
  554. u8 h2c_parameter[1] = {0};
  555. /* There are several type of dacswing
  556. * 0x18/ 0x10/ 0xc/ 0x8/ 0x4/ 0x6
  557. */
  558. h2c_parameter[0] = dac_swing_lvl;
  559. btc_alg_dbg(ALGO_TRACE_FW_EXEC,
  560. "[BTCoex], Set Dac Swing Level=0x%x\n", dac_swing_lvl);
  561. btc_alg_dbg(ALGO_TRACE_FW_EXEC,
  562. "[BTCoex], FW write 0x64=0x%x\n", h2c_parameter[0]);
  563. btcoexist->btc_fill_h2c(btcoexist, 0x64, 1, h2c_parameter);
  564. }
  565. static void btc8723b2ant_set_fw_dec_bt_pwr(struct btc_coexist *btcoexist,
  566. bool dec_bt_pwr)
  567. {
  568. u8 h2c_parameter[1] = {0};
  569. h2c_parameter[0] = 0;
  570. if (dec_bt_pwr)
  571. h2c_parameter[0] |= BIT1;
  572. btc_alg_dbg(ALGO_TRACE_FW_EXEC,
  573. "[BTCoex], decrease Bt Power : %s, FW write 0x62=0x%x\n",
  574. (dec_bt_pwr ? "Yes!!" : "No!!"), h2c_parameter[0]);
  575. btcoexist->btc_fill_h2c(btcoexist, 0x62, 1, h2c_parameter);
  576. }
  577. static void btc8723b2ant_dec_bt_pwr(struct btc_coexist *btcoexist,
  578. bool force_exec, bool dec_bt_pwr)
  579. {
  580. btc_alg_dbg(ALGO_TRACE_FW,
  581. "[BTCoex], %s Dec BT power = %s\n",
  582. force_exec ? "force to" : "", dec_bt_pwr ? "ON" : "OFF");
  583. coex_dm->cur_dec_bt_pwr = dec_bt_pwr;
  584. if (!force_exec) {
  585. btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
  586. "[BTCoex], bPreDecBtPwr=%d, bCurDecBtPwr=%d\n",
  587. coex_dm->pre_dec_bt_pwr, coex_dm->cur_dec_bt_pwr);
  588. if (coex_dm->pre_dec_bt_pwr == coex_dm->cur_dec_bt_pwr)
  589. return;
  590. }
  591. btc8723b2ant_set_fw_dec_bt_pwr(btcoexist, coex_dm->cur_dec_bt_pwr);
  592. coex_dm->pre_dec_bt_pwr = coex_dm->cur_dec_bt_pwr;
  593. }
  594. static void btc8723b2ant_fw_dac_swing_lvl(struct btc_coexist *btcoexist,
  595. bool force_exec, u8 fw_dac_swing_lvl)
  596. {
  597. btc_alg_dbg(ALGO_TRACE_FW,
  598. "[BTCoex], %s set FW Dac Swing level = %d\n",
  599. (force_exec ? "force to" : ""), fw_dac_swing_lvl);
  600. coex_dm->cur_fw_dac_swing_lvl = fw_dac_swing_lvl;
  601. if (!force_exec) {
  602. btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
  603. "[BTCoex], preFwDacSwingLvl=%d, curFwDacSwingLvl=%d\n",
  604. coex_dm->pre_fw_dac_swing_lvl,
  605. coex_dm->cur_fw_dac_swing_lvl);
  606. if (coex_dm->pre_fw_dac_swing_lvl ==
  607. coex_dm->cur_fw_dac_swing_lvl)
  608. return;
  609. }
  610. btc8723b2ant_set_fw_dac_swing_level(btcoexist,
  611. coex_dm->cur_fw_dac_swing_lvl);
  612. coex_dm->pre_fw_dac_swing_lvl = coex_dm->cur_fw_dac_swing_lvl;
  613. }
  614. static void btc8723b2ant_set_sw_rf_rx_lpf_corner(struct btc_coexist *btcoexist,
  615. bool rx_rf_shrink_on)
  616. {
  617. if (rx_rf_shrink_on) {
  618. /* Shrink RF Rx LPF corner */
  619. btc_alg_dbg(ALGO_TRACE_SW_EXEC,
  620. "[BTCoex], Shrink RF Rx LPF corner!!\n");
  621. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e,
  622. 0xfffff, 0xffffc);
  623. } else {
  624. /* Resume RF Rx LPF corner */
  625. /* After initialized, we can use coex_dm->btRf0x1eBackup */
  626. if (btcoexist->initilized) {
  627. btc_alg_dbg(ALGO_TRACE_SW_EXEC,
  628. "[BTCoex], Resume RF Rx LPF corner!!\n");
  629. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1e,
  630. 0xfffff,
  631. coex_dm->bt_rf0x1e_backup);
  632. }
  633. }
  634. }
  635. static void btc8723b2ant_rf_shrink(struct btc_coexist *btcoexist,
  636. bool force_exec, bool rx_rf_shrink_on)
  637. {
  638. btc_alg_dbg(ALGO_TRACE_SW,
  639. "[BTCoex], %s turn Rx RF Shrink = %s\n",
  640. (force_exec ? "force to" : ""), (rx_rf_shrink_on ?
  641. "ON" : "OFF"));
  642. coex_dm->cur_rf_rx_lpf_shrink = rx_rf_shrink_on;
  643. if (!force_exec) {
  644. btc_alg_dbg(ALGO_TRACE_SW_DETAIL,
  645. "[BTCoex], bPreRfRxLpfShrink=%d, bCurRfRxLpfShrink=%d\n",
  646. coex_dm->pre_rf_rx_lpf_shrink,
  647. coex_dm->cur_rf_rx_lpf_shrink);
  648. if (coex_dm->pre_rf_rx_lpf_shrink ==
  649. coex_dm->cur_rf_rx_lpf_shrink)
  650. return;
  651. }
  652. btc8723b2ant_set_sw_rf_rx_lpf_corner(btcoexist,
  653. coex_dm->cur_rf_rx_lpf_shrink);
  654. coex_dm->pre_rf_rx_lpf_shrink = coex_dm->cur_rf_rx_lpf_shrink;
  655. }
  656. static void btc8723b_set_penalty_txrate(struct btc_coexist *btcoexist,
  657. bool low_penalty_ra)
  658. {
  659. u8 h2c_parameter[6] = {0};
  660. h2c_parameter[0] = 0x6; /* opCode, 0x6= Retry_Penalty*/
  661. if (low_penalty_ra) {
  662. h2c_parameter[1] |= BIT0;
  663. /*normal rate except MCS7/6/5, OFDM54/48/36*/
  664. h2c_parameter[2] = 0x00;
  665. h2c_parameter[3] = 0xf7; /*MCS7 or OFDM54*/
  666. h2c_parameter[4] = 0xf8; /*MCS6 or OFDM48*/
  667. h2c_parameter[5] = 0xf9; /*MCS5 or OFDM36*/
  668. }
  669. btc_alg_dbg(ALGO_TRACE_FW_EXEC,
  670. "[BTCoex], set WiFi Low-Penalty Retry: %s",
  671. (low_penalty_ra ? "ON!!" : "OFF!!"));
  672. btcoexist->btc_fill_h2c(btcoexist, 0x69, 6, h2c_parameter);
  673. }
  674. static void btc8723b2ant_low_penalty_ra(struct btc_coexist *btcoexist,
  675. bool force_exec, bool low_penalty_ra)
  676. {
  677. /*return; */
  678. btc_alg_dbg(ALGO_TRACE_SW,
  679. "[BTCoex], %s turn LowPenaltyRA = %s\n",
  680. (force_exec ? "force to" : ""), (low_penalty_ra ?
  681. "ON" : "OFF"));
  682. coex_dm->cur_low_penalty_ra = low_penalty_ra;
  683. if (!force_exec) {
  684. btc_alg_dbg(ALGO_TRACE_SW_DETAIL,
  685. "[BTCoex], bPreLowPenaltyRa=%d, bCurLowPenaltyRa=%d\n",
  686. coex_dm->pre_low_penalty_ra,
  687. coex_dm->cur_low_penalty_ra);
  688. if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra)
  689. return;
  690. }
  691. btc8723b_set_penalty_txrate(btcoexist, coex_dm->cur_low_penalty_ra);
  692. coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra;
  693. }
  694. static void btc8723b2ant_set_dac_swing_reg(struct btc_coexist *btcoexist,
  695. u32 level)
  696. {
  697. u8 val = (u8) level;
  698. btc_alg_dbg(ALGO_TRACE_SW_EXEC,
  699. "[BTCoex], Write SwDacSwing = 0x%x\n", level);
  700. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x883, 0x3e, val);
  701. }
  702. static void btc8723b2ant_set_sw_fulltime_dac_swing(struct btc_coexist *btcoex,
  703. bool sw_dac_swing_on,
  704. u32 sw_dac_swing_lvl)
  705. {
  706. if (sw_dac_swing_on)
  707. btc8723b2ant_set_dac_swing_reg(btcoex, sw_dac_swing_lvl);
  708. else
  709. btc8723b2ant_set_dac_swing_reg(btcoex, 0x18);
  710. }
  711. static void btc8723b2ant_dac_swing(struct btc_coexist *btcoexist,
  712. bool force_exec, bool dac_swing_on,
  713. u32 dac_swing_lvl)
  714. {
  715. btc_alg_dbg(ALGO_TRACE_SW,
  716. "[BTCoex], %s turn DacSwing=%s, dac_swing_lvl=0x%x\n",
  717. (force_exec ? "force to" : ""),
  718. (dac_swing_on ? "ON" : "OFF"), dac_swing_lvl);
  719. coex_dm->cur_dac_swing_on = dac_swing_on;
  720. coex_dm->cur_dac_swing_lvl = dac_swing_lvl;
  721. if (!force_exec) {
  722. btc_alg_dbg(ALGO_TRACE_SW_DETAIL,
  723. "[BTCoex], bPreDacSwingOn=%d, preDacSwingLvl=0x%x, bCurDacSwingOn=%d, curDacSwingLvl=0x%x\n",
  724. coex_dm->pre_dac_swing_on,
  725. coex_dm->pre_dac_swing_lvl,
  726. coex_dm->cur_dac_swing_on,
  727. coex_dm->cur_dac_swing_lvl);
  728. if ((coex_dm->pre_dac_swing_on == coex_dm->cur_dac_swing_on) &&
  729. (coex_dm->pre_dac_swing_lvl == coex_dm->cur_dac_swing_lvl))
  730. return;
  731. }
  732. mdelay(30);
  733. btc8723b2ant_set_sw_fulltime_dac_swing(btcoexist, dac_swing_on,
  734. dac_swing_lvl);
  735. coex_dm->pre_dac_swing_on = coex_dm->cur_dac_swing_on;
  736. coex_dm->pre_dac_swing_lvl = coex_dm->cur_dac_swing_lvl;
  737. }
  738. static void btc8723b2ant_set_agc_table(struct btc_coexist *btcoexist,
  739. bool agc_table_en)
  740. {
  741. u8 rssi_adjust_val = 0;
  742. /* BB AGC Gain Table */
  743. if (agc_table_en) {
  744. btc_alg_dbg(ALGO_TRACE_SW_EXEC,
  745. "[BTCoex], BB Agc Table On!\n");
  746. btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x6e1A0001);
  747. btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x6d1B0001);
  748. btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x6c1C0001);
  749. btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x6b1D0001);
  750. btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x6a1E0001);
  751. btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x691F0001);
  752. btcoexist->btc_write_4byte(btcoexist, 0xc78, 0x68200001);
  753. } else {
  754. btc_alg_dbg(ALGO_TRACE_SW_EXEC,
  755. "[BTCoex], BB Agc Table Off!\n");
  756. btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xaa1A0001);
  757. btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa91B0001);
  758. btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa81C0001);
  759. btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa71D0001);
  760. btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa61E0001);
  761. btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa51F0001);
  762. btcoexist->btc_write_4byte(btcoexist, 0xc78, 0xa4200001);
  763. }
  764. /* RF Gain */
  765. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xef, 0xfffff, 0x02000);
  766. if (agc_table_en) {
  767. btc_alg_dbg(ALGO_TRACE_SW_EXEC,
  768. "[BTCoex], Agc Table On!\n");
  769. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b,
  770. 0xfffff, 0x38fff);
  771. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b,
  772. 0xfffff, 0x38ffe);
  773. } else {
  774. btc_alg_dbg(ALGO_TRACE_SW_EXEC,
  775. "[BTCoex], Agc Table Off!\n");
  776. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b,
  777. 0xfffff, 0x380c3);
  778. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x3b,
  779. 0xfffff, 0x28ce6);
  780. }
  781. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xef, 0xfffff, 0x0);
  782. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xed, 0xfffff, 0x1);
  783. if (agc_table_en) {
  784. btc_alg_dbg(ALGO_TRACE_SW_EXEC,
  785. "[BTCoex], Agc Table On!\n");
  786. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x40,
  787. 0xfffff, 0x38fff);
  788. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x40,
  789. 0xfffff, 0x38ffe);
  790. } else {
  791. btc_alg_dbg(ALGO_TRACE_SW_EXEC,
  792. "[BTCoex], Agc Table Off!\n");
  793. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x40,
  794. 0xfffff, 0x380c3);
  795. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x40,
  796. 0xfffff, 0x28ce6);
  797. }
  798. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0xed, 0xfffff, 0x0);
  799. /* set rssiAdjustVal for wifi module. */
  800. if (agc_table_en)
  801. rssi_adjust_val = 8;
  802. btcoexist->btc_set(btcoexist, BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON,
  803. &rssi_adjust_val);
  804. }
  805. static void btc8723b2ant_agc_table(struct btc_coexist *btcoexist,
  806. bool force_exec, bool agc_table_en)
  807. {
  808. btc_alg_dbg(ALGO_TRACE_SW,
  809. "[BTCoex], %s %s Agc Table\n",
  810. (force_exec ? "force to" : ""),
  811. (agc_table_en ? "Enable" : "Disable"));
  812. coex_dm->cur_agc_table_en = agc_table_en;
  813. if (!force_exec) {
  814. btc_alg_dbg(ALGO_TRACE_SW_DETAIL,
  815. "[BTCoex], bPreAgcTableEn=%d, bCurAgcTableEn=%d\n",
  816. coex_dm->pre_agc_table_en,
  817. coex_dm->cur_agc_table_en);
  818. if (coex_dm->pre_agc_table_en == coex_dm->cur_agc_table_en)
  819. return;
  820. }
  821. btc8723b2ant_set_agc_table(btcoexist, agc_table_en);
  822. coex_dm->pre_agc_table_en = coex_dm->cur_agc_table_en;
  823. }
  824. static void btc8723b2ant_set_coex_table(struct btc_coexist *btcoexist,
  825. u32 val0x6c0, u32 val0x6c4,
  826. u32 val0x6c8, u8 val0x6cc)
  827. {
  828. btc_alg_dbg(ALGO_TRACE_SW_EXEC,
  829. "[BTCoex], set coex table, set 0x6c0=0x%x\n", val0x6c0);
  830. btcoexist->btc_write_4byte(btcoexist, 0x6c0, val0x6c0);
  831. btc_alg_dbg(ALGO_TRACE_SW_EXEC,
  832. "[BTCoex], set coex table, set 0x6c4=0x%x\n", val0x6c4);
  833. btcoexist->btc_write_4byte(btcoexist, 0x6c4, val0x6c4);
  834. btc_alg_dbg(ALGO_TRACE_SW_EXEC,
  835. "[BTCoex], set coex table, set 0x6c8=0x%x\n", val0x6c8);
  836. btcoexist->btc_write_4byte(btcoexist, 0x6c8, val0x6c8);
  837. btc_alg_dbg(ALGO_TRACE_SW_EXEC,
  838. "[BTCoex], set coex table, set 0x6cc=0x%x\n", val0x6cc);
  839. btcoexist->btc_write_1byte(btcoexist, 0x6cc, val0x6cc);
  840. }
  841. static void btc8723b2ant_coex_table(struct btc_coexist *btcoexist,
  842. bool force_exec, u32 val0x6c0,
  843. u32 val0x6c4, u32 val0x6c8,
  844. u8 val0x6cc)
  845. {
  846. btc_alg_dbg(ALGO_TRACE_SW,
  847. "[BTCoex], %s write Coex Table 0x6c0=0x%x, 0x6c4=0x%x, 0x6c8=0x%x, 0x6cc=0x%x\n",
  848. force_exec ? "force to" : "",
  849. val0x6c0, val0x6c4, val0x6c8, val0x6cc);
  850. coex_dm->cur_val0x6c0 = val0x6c0;
  851. coex_dm->cur_val0x6c4 = val0x6c4;
  852. coex_dm->cur_val0x6c8 = val0x6c8;
  853. coex_dm->cur_val0x6cc = val0x6cc;
  854. if (!force_exec) {
  855. btc_alg_dbg(ALGO_TRACE_SW_DETAIL,
  856. "[BTCoex], preVal0x6c0=0x%x, preVal0x6c4=0x%x, preVal0x6c8=0x%x, preVal0x6cc=0x%x !!\n",
  857. coex_dm->pre_val0x6c0, coex_dm->pre_val0x6c4,
  858. coex_dm->pre_val0x6c8, coex_dm->pre_val0x6cc);
  859. btc_alg_dbg(ALGO_TRACE_SW_DETAIL,
  860. "[BTCoex], curVal0x6c0=0x%x, curVal0x6c4=0x%x, curVal0x6c8=0x%x, curVal0x6cc=0x%x !!\n",
  861. coex_dm->cur_val0x6c0, coex_dm->cur_val0x6c4,
  862. coex_dm->cur_val0x6c8, coex_dm->cur_val0x6cc);
  863. if ((coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0) &&
  864. (coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4) &&
  865. (coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8) &&
  866. (coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc))
  867. return;
  868. }
  869. btc8723b2ant_set_coex_table(btcoexist, val0x6c0, val0x6c4,
  870. val0x6c8, val0x6cc);
  871. coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0;
  872. coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4;
  873. coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8;
  874. coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc;
  875. }
  876. static void btc8723b_coex_tbl_type(struct btc_coexist *btcoexist,
  877. bool force_exec, u8 type)
  878. {
  879. switch (type) {
  880. case 0:
  881. btc8723b2ant_coex_table(btcoexist, force_exec, 0x55555555,
  882. 0x55555555, 0xffff, 0x3);
  883. break;
  884. case 1:
  885. btc8723b2ant_coex_table(btcoexist, force_exec, 0x55555555,
  886. 0x5afa5afa, 0xffff, 0x3);
  887. break;
  888. case 2:
  889. btc8723b2ant_coex_table(btcoexist, force_exec, 0x5a5a5a5a,
  890. 0x5a5a5a5a, 0xffff, 0x3);
  891. break;
  892. case 3:
  893. btc8723b2ant_coex_table(btcoexist, force_exec, 0xaaaaaaaa,
  894. 0xaaaaaaaa, 0xffff, 0x3);
  895. break;
  896. case 4:
  897. btc8723b2ant_coex_table(btcoexist, force_exec, 0xffffffff,
  898. 0xffffffff, 0xffff, 0x3);
  899. break;
  900. case 5:
  901. btc8723b2ant_coex_table(btcoexist, force_exec, 0x5fff5fff,
  902. 0x5fff5fff, 0xffff, 0x3);
  903. break;
  904. case 6:
  905. btc8723b2ant_coex_table(btcoexist, force_exec, 0x55ff55ff,
  906. 0x5a5a5a5a, 0xffff, 0x3);
  907. break;
  908. case 7:
  909. btc8723b2ant_coex_table(btcoexist, force_exec, 0x55ff55ff,
  910. 0x5afa5afa, 0xffff, 0x3);
  911. break;
  912. case 8:
  913. btc8723b2ant_coex_table(btcoexist, force_exec, 0x5aea5aea,
  914. 0x5aea5aea, 0xffff, 0x3);
  915. break;
  916. case 9:
  917. btc8723b2ant_coex_table(btcoexist, force_exec, 0x55ff55ff,
  918. 0x5aea5aea, 0xffff, 0x3);
  919. break;
  920. case 10:
  921. btc8723b2ant_coex_table(btcoexist, force_exec, 0x55ff55ff,
  922. 0x5aff5aff, 0xffff, 0x3);
  923. break;
  924. case 11:
  925. btc8723b2ant_coex_table(btcoexist, force_exec, 0x55ff55ff,
  926. 0x5a5f5a5f, 0xffff, 0x3);
  927. break;
  928. case 12:
  929. btc8723b2ant_coex_table(btcoexist, force_exec, 0x55ff55ff,
  930. 0x5f5f5f5f, 0xffff, 0x3);
  931. break;
  932. default:
  933. break;
  934. }
  935. }
  936. static void btc8723b2ant_set_fw_ignore_wlan_act(struct btc_coexist *btcoexist,
  937. bool enable)
  938. {
  939. u8 h2c_parameter[1] = {0};
  940. if (enable)
  941. h2c_parameter[0] |= BIT0;/* function enable*/
  942. btc_alg_dbg(ALGO_TRACE_FW_EXEC,
  943. "[BTCoex], set FW for BT Ignore Wlan_Act, FW write 0x63=0x%x\n",
  944. h2c_parameter[0]);
  945. btcoexist->btc_fill_h2c(btcoexist, 0x63, 1, h2c_parameter);
  946. }
  947. static void btc8723b2ant_ignore_wlan_act(struct btc_coexist *btcoexist,
  948. bool force_exec, bool enable)
  949. {
  950. btc_alg_dbg(ALGO_TRACE_FW,
  951. "[BTCoex], %s turn Ignore WlanAct %s\n",
  952. (force_exec ? "force to" : ""), (enable ? "ON" : "OFF"));
  953. coex_dm->cur_ignore_wlan_act = enable;
  954. if (!force_exec) {
  955. btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
  956. "[BTCoex], bPreIgnoreWlanAct = %d, bCurIgnoreWlanAct = %d!!\n",
  957. coex_dm->pre_ignore_wlan_act,
  958. coex_dm->cur_ignore_wlan_act);
  959. if (coex_dm->pre_ignore_wlan_act ==
  960. coex_dm->cur_ignore_wlan_act)
  961. return;
  962. }
  963. btc8723b2ant_set_fw_ignore_wlan_act(btcoexist, enable);
  964. coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act;
  965. }
  966. static void btc8723b2ant_set_fw_ps_tdma(struct btc_coexist *btcoexist, u8 byte1,
  967. u8 byte2, u8 byte3, u8 byte4, u8 byte5)
  968. {
  969. u8 h2c_parameter[5];
  970. h2c_parameter[0] = byte1;
  971. h2c_parameter[1] = byte2;
  972. h2c_parameter[2] = byte3;
  973. h2c_parameter[3] = byte4;
  974. h2c_parameter[4] = byte5;
  975. coex_dm->ps_tdma_para[0] = byte1;
  976. coex_dm->ps_tdma_para[1] = byte2;
  977. coex_dm->ps_tdma_para[2] = byte3;
  978. coex_dm->ps_tdma_para[3] = byte4;
  979. coex_dm->ps_tdma_para[4] = byte5;
  980. btc_alg_dbg(ALGO_TRACE_FW_EXEC,
  981. "[BTCoex], FW write 0x60(5bytes)=0x%x%08x\n",
  982. h2c_parameter[0],
  983. h2c_parameter[1] << 24 | h2c_parameter[2] << 16 |
  984. h2c_parameter[3] << 8 | h2c_parameter[4]);
  985. btcoexist->btc_fill_h2c(btcoexist, 0x60, 5, h2c_parameter);
  986. }
  987. static void btc8723b2ant_sw_mechanism1(struct btc_coexist *btcoexist,
  988. bool shrink_rx_lpf, bool low_penalty_ra,
  989. bool limited_dig, bool bt_lna_constrain)
  990. {
  991. btc8723b2ant_rf_shrink(btcoexist, NORMAL_EXEC, shrink_rx_lpf);
  992. btc8723b2ant_low_penalty_ra(btcoexist, NORMAL_EXEC, low_penalty_ra);
  993. }
  994. static void btc8723b2ant_sw_mechanism2(struct btc_coexist *btcoexist,
  995. bool agc_table_shift, bool adc_backoff,
  996. bool sw_dac_swing, u32 dac_swing_lvl)
  997. {
  998. btc8723b2ant_agc_table(btcoexist, NORMAL_EXEC, agc_table_shift);
  999. btc8723b2ant_dac_swing(btcoexist, NORMAL_EXEC, sw_dac_swing,
  1000. dac_swing_lvl);
  1001. }
  1002. static void btc8723b2ant_set_ant_path(struct btc_coexist *btcoexist,
  1003. u8 antpos_type, bool init_hwcfg,
  1004. bool wifi_off)
  1005. {
  1006. struct btc_board_info *board_info = &btcoexist->board_info;
  1007. u32 fw_ver = 0, u32tmp = 0;
  1008. bool pg_ext_switch = false;
  1009. bool use_ext_switch = false;
  1010. u8 h2c_parameter[2] = {0};
  1011. btcoexist->btc_get(btcoexist, BTC_GET_BL_EXT_SWITCH, &pg_ext_switch);
  1012. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
  1013. if ((fw_ver < 0xc0000) || pg_ext_switch)
  1014. use_ext_switch = true;
  1015. if (init_hwcfg) {
  1016. /* 0x4c[23] = 0, 0x4c[24] = 1 Antenna control by WL/BT */
  1017. u32tmp = btcoexist->btc_read_4byte(btcoexist, 0x4c);
  1018. u32tmp &= ~BIT23;
  1019. u32tmp |= BIT24;
  1020. btcoexist->btc_write_4byte(btcoexist, 0x4c, u32tmp);
  1021. btcoexist->btc_write_1byte(btcoexist, 0x974, 0xff);
  1022. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x944, 0x3, 0x3);
  1023. btcoexist->btc_write_1byte(btcoexist, 0x930, 0x77);
  1024. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20, 0x1);
  1025. /* Force GNT_BT to low */
  1026. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x765, 0x18, 0x0);
  1027. if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT) {
  1028. /* tell firmware "no antenna inverse" */
  1029. h2c_parameter[0] = 0;
  1030. h2c_parameter[1] = 1; /* ext switch type */
  1031. btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
  1032. h2c_parameter);
  1033. btcoexist->btc_write_2byte(btcoexist, 0x948, 0x0);
  1034. } else {
  1035. /* tell firmware "antenna inverse" */
  1036. h2c_parameter[0] = 1;
  1037. h2c_parameter[1] = 1; /* ext switch type */
  1038. btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
  1039. h2c_parameter);
  1040. btcoexist->btc_write_2byte(btcoexist, 0x948, 0x280);
  1041. }
  1042. }
  1043. /* ext switch setting */
  1044. if (use_ext_switch) {
  1045. /* fixed internal switch S1->WiFi, S0->BT */
  1046. if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)
  1047. btcoexist->btc_write_2byte(btcoexist, 0x948, 0x0);
  1048. else
  1049. btcoexist->btc_write_2byte(btcoexist, 0x948, 0x280);
  1050. switch (antpos_type) {
  1051. case BTC_ANT_WIFI_AT_MAIN:
  1052. /* ext switch main at wifi */
  1053. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x92c,
  1054. 0x3, 0x1);
  1055. break;
  1056. case BTC_ANT_WIFI_AT_AUX:
  1057. /* ext switch aux at wifi */
  1058. btcoexist->btc_write_1byte_bitmask(btcoexist,
  1059. 0x92c, 0x3, 0x2);
  1060. break;
  1061. }
  1062. } else { /* internal switch */
  1063. /* fixed ext switch */
  1064. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x92c, 0x3, 0x1);
  1065. switch (antpos_type) {
  1066. case BTC_ANT_WIFI_AT_MAIN:
  1067. /* fixed internal switch S1->WiFi, S0->BT */
  1068. btcoexist->btc_write_2byte(btcoexist, 0x948, 0x0);
  1069. break;
  1070. case BTC_ANT_WIFI_AT_AUX:
  1071. /* fixed internal switch S0->WiFi, S1->BT */
  1072. btcoexist->btc_write_2byte(btcoexist, 0x948, 0x280);
  1073. break;
  1074. }
  1075. }
  1076. }
  1077. static void btc8723b2ant_ps_tdma(struct btc_coexist *btcoexist, bool force_exec,
  1078. bool turn_on, u8 type)
  1079. {
  1080. btc_alg_dbg(ALGO_TRACE_FW,
  1081. "[BTCoex], %s turn %s PS TDMA, type=%d\n",
  1082. (force_exec ? "force to" : ""),
  1083. (turn_on ? "ON" : "OFF"), type);
  1084. coex_dm->cur_ps_tdma_on = turn_on;
  1085. coex_dm->cur_ps_tdma = type;
  1086. if (!force_exec) {
  1087. btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
  1088. "[BTCoex], bPrePsTdmaOn = %d, bCurPsTdmaOn = %d!!\n",
  1089. coex_dm->pre_ps_tdma_on, coex_dm->cur_ps_tdma_on);
  1090. btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
  1091. "[BTCoex], prePsTdma = %d, curPsTdma = %d!!\n",
  1092. coex_dm->pre_ps_tdma, coex_dm->cur_ps_tdma);
  1093. if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
  1094. (coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
  1095. return;
  1096. }
  1097. if (turn_on) {
  1098. switch (type) {
  1099. case 1:
  1100. default:
  1101. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a,
  1102. 0x1a, 0xe1, 0x90);
  1103. break;
  1104. case 2:
  1105. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x12,
  1106. 0x12, 0xe1, 0x90);
  1107. break;
  1108. case 3:
  1109. /* This call breaks BT when wireless is active -
  1110. * comment it out for now until a better fix is found:
  1111. * btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
  1112. * 0x3, 0xf1, 0x90);
  1113. */
  1114. break;
  1115. case 4:
  1116. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10,
  1117. 0x03, 0xf1, 0x90);
  1118. break;
  1119. case 5:
  1120. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a,
  1121. 0x1a, 0x60, 0x90);
  1122. break;
  1123. case 6:
  1124. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x12,
  1125. 0x12, 0x60, 0x90);
  1126. break;
  1127. case 7:
  1128. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
  1129. 0x3, 0x70, 0x90);
  1130. break;
  1131. case 8:
  1132. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x10,
  1133. 0x3, 0x70, 0x90);
  1134. break;
  1135. case 9:
  1136. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a,
  1137. 0x1a, 0xe1, 0x90);
  1138. break;
  1139. case 10:
  1140. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x12,
  1141. 0x12, 0xe1, 0x90);
  1142. break;
  1143. case 11:
  1144. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
  1145. 0xa, 0xe1, 0x90);
  1146. break;
  1147. case 12:
  1148. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x5,
  1149. 0x5, 0xe1, 0x90);
  1150. break;
  1151. case 13:
  1152. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a,
  1153. 0x1a, 0x60, 0x90);
  1154. break;
  1155. case 14:
  1156. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x12,
  1157. 0x12, 0x60, 0x90);
  1158. break;
  1159. case 15:
  1160. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
  1161. 0xa, 0x60, 0x90);
  1162. break;
  1163. case 16:
  1164. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x5,
  1165. 0x5, 0x60, 0x90);
  1166. break;
  1167. case 17:
  1168. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x2f,
  1169. 0x2f, 0x60, 0x90);
  1170. break;
  1171. case 18:
  1172. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x5,
  1173. 0x5, 0xe1, 0x90);
  1174. break;
  1175. case 19:
  1176. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
  1177. 0x25, 0xe1, 0x90);
  1178. break;
  1179. case 20:
  1180. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
  1181. 0x25, 0x60, 0x90);
  1182. break;
  1183. case 21:
  1184. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,
  1185. 0x03, 0x70, 0x90);
  1186. break;
  1187. case 71:
  1188. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a,
  1189. 0x1a, 0xe1, 0x90);
  1190. break;
  1191. }
  1192. } else {
  1193. /* disable PS tdma */
  1194. switch (type) {
  1195. case 0:
  1196. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
  1197. 0x40, 0x0);
  1198. break;
  1199. case 1:
  1200. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
  1201. 0x48, 0x0);
  1202. break;
  1203. default:
  1204. btc8723b2ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
  1205. 0x40, 0x0);
  1206. break;
  1207. }
  1208. }
  1209. /* update pre state */
  1210. coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on;
  1211. coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma;
  1212. }
  1213. static void btc8723b2ant_coex_alloff(struct btc_coexist *btcoexist)
  1214. {
  1215. /* fw all off */
  1216. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
  1217. btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
  1218. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
  1219. /* sw all off */
  1220. btc8723b2ant_sw_mechanism1(btcoexist, false, false, false, false);
  1221. btc8723b2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
  1222. /* hw all off */
  1223. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
  1224. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC, 0);
  1225. }
  1226. static void btc8723b2ant_init_coex_dm(struct btc_coexist *btcoexist)
  1227. {
  1228. /* force to reset coex mechanism*/
  1229. btc8723b2ant_ps_tdma(btcoexist, FORCE_EXEC, false, 1);
  1230. btc8723b2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 6);
  1231. btc8723b2ant_dec_bt_pwr(btcoexist, FORCE_EXEC, false);
  1232. btc8723b2ant_sw_mechanism1(btcoexist, false, false, false, false);
  1233. btc8723b2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
  1234. }
  1235. static void btc8723b2ant_action_bt_inquiry(struct btc_coexist *btcoexist)
  1236. {
  1237. bool wifi_connected = false;
  1238. bool low_pwr_disable = true;
  1239. btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
  1240. &low_pwr_disable);
  1241. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
  1242. &wifi_connected);
  1243. if (wifi_connected) {
  1244. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC, 7);
  1245. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);
  1246. } else {
  1247. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC, 0);
  1248. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
  1249. }
  1250. btc8723b2ant_fw_dac_swing_lvl(btcoexist, FORCE_EXEC, 6);
  1251. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
  1252. btc8723b2ant_sw_mechanism1(btcoexist, false, false, false, false);
  1253. btc8723b2ant_sw_mechanism2(btcoexist, false, false, false, 0x18);
  1254. coex_dm->need_recover_0x948 = true;
  1255. coex_dm->backup_0x948 = btcoexist->btc_read_2byte(btcoexist, 0x948);
  1256. btc8723b2ant_set_ant_path(btcoexist, BTC_ANT_WIFI_AT_AUX,
  1257. false, false);
  1258. }
  1259. static bool btc8723b2ant_is_common_action(struct btc_coexist *btcoexist)
  1260. {
  1261. bool common = false, wifi_connected = false;
  1262. bool wifi_busy = false;
  1263. bool bt_hs_on = false, low_pwr_disable = false;
  1264. btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
  1265. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
  1266. &wifi_connected);
  1267. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
  1268. if (!wifi_connected) {
  1269. low_pwr_disable = false;
  1270. btcoexist->btc_set(btcoexist, BTC_SET_ACT_DISABLE_LOW_POWER,
  1271. &low_pwr_disable);
  1272. btc_alg_dbg(ALGO_TRACE,
  1273. "[BTCoex], Wifi non-connected idle!!\n");
  1274. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
  1275. 0x0);
  1276. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC, 0);
  1277. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
  1278. btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
  1279. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
  1280. btc8723b2ant_sw_mechanism1(btcoexist, false, false, false,
  1281. false);
  1282. btc8723b2ant_sw_mechanism2(btcoexist, false, false, false,
  1283. 0x18);
  1284. common = true;
  1285. } else {
  1286. if (BT_8723B_2ANT_BT_STATUS_NON_CONNECTED_IDLE ==
  1287. coex_dm->bt_status) {
  1288. low_pwr_disable = false;
  1289. btcoexist->btc_set(btcoexist,
  1290. BTC_SET_ACT_DISABLE_LOW_POWER,
  1291. &low_pwr_disable);
  1292. btc_alg_dbg(ALGO_TRACE,
  1293. "[BTCoex], Wifi connected + BT non connected-idle!!\n");
  1294. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
  1295. 0xfffff, 0x0);
  1296. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC, 0);
  1297. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
  1298. btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
  1299. 0xb);
  1300. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC,
  1301. false);
  1302. btc8723b2ant_sw_mechanism1(btcoexist, false, false,
  1303. false, false);
  1304. btc8723b2ant_sw_mechanism2(btcoexist, false, false,
  1305. false, 0x18);
  1306. common = true;
  1307. } else if (BT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE ==
  1308. coex_dm->bt_status) {
  1309. low_pwr_disable = true;
  1310. btcoexist->btc_set(btcoexist,
  1311. BTC_SET_ACT_DISABLE_LOW_POWER,
  1312. &low_pwr_disable);
  1313. if (bt_hs_on)
  1314. return false;
  1315. btc_alg_dbg(ALGO_TRACE,
  1316. "[BTCoex], Wifi connected + BT connected-idle!!\n");
  1317. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
  1318. 0xfffff, 0x0);
  1319. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC, 0);
  1320. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
  1321. btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
  1322. 0xb);
  1323. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC,
  1324. false);
  1325. btc8723b2ant_sw_mechanism1(btcoexist, true, false,
  1326. false, false);
  1327. btc8723b2ant_sw_mechanism2(btcoexist, false, false,
  1328. false, 0x18);
  1329. common = true;
  1330. } else {
  1331. low_pwr_disable = true;
  1332. btcoexist->btc_set(btcoexist,
  1333. BTC_SET_ACT_DISABLE_LOW_POWER,
  1334. &low_pwr_disable);
  1335. if (wifi_busy) {
  1336. btc_alg_dbg(ALGO_TRACE,
  1337. "[BTCoex], Wifi Connected-Busy + BT Busy!!\n");
  1338. common = false;
  1339. } else {
  1340. if (bt_hs_on)
  1341. return false;
  1342. btc_alg_dbg(ALGO_TRACE,
  1343. "[BTCoex], Wifi Connected-Idle + BT Busy!!\n");
  1344. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A,
  1345. 0x1, 0xfffff, 0x0);
  1346. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC,
  1347. 7);
  1348. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1349. true, 21);
  1350. btc8723b2ant_fw_dac_swing_lvl(btcoexist,
  1351. NORMAL_EXEC,
  1352. 0xb);
  1353. if (btc8723b_need_dec_pwr(btcoexist))
  1354. btc8723b2ant_dec_bt_pwr(btcoexist,
  1355. NORMAL_EXEC,
  1356. true);
  1357. else
  1358. btc8723b2ant_dec_bt_pwr(btcoexist,
  1359. NORMAL_EXEC,
  1360. false);
  1361. btc8723b2ant_sw_mechanism1(btcoexist, false,
  1362. false, false,
  1363. false);
  1364. btc8723b2ant_sw_mechanism2(btcoexist, false,
  1365. false, false,
  1366. 0x18);
  1367. common = true;
  1368. }
  1369. }
  1370. }
  1371. return common;
  1372. }
  1373. static void set_tdma_int1(struct btc_coexist *btcoexist, bool tx_pause,
  1374. s32 result)
  1375. {
  1376. /* Set PS TDMA for max interval == 1 */
  1377. if (tx_pause) {
  1378. btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
  1379. "[BTCoex], TxPause = 1\n");
  1380. if (coex_dm->cur_ps_tdma == 71) {
  1381. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1382. true, 5);
  1383. coex_dm->tdma_adj_type = 5;
  1384. } else if (coex_dm->cur_ps_tdma == 1) {
  1385. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1386. true, 5);
  1387. coex_dm->tdma_adj_type = 5;
  1388. } else if (coex_dm->cur_ps_tdma == 2) {
  1389. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1390. true, 6);
  1391. coex_dm->tdma_adj_type = 6;
  1392. } else if (coex_dm->cur_ps_tdma == 3) {
  1393. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1394. true, 7);
  1395. coex_dm->tdma_adj_type = 7;
  1396. } else if (coex_dm->cur_ps_tdma == 4) {
  1397. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1398. true, 8);
  1399. coex_dm->tdma_adj_type = 8;
  1400. }
  1401. if (coex_dm->cur_ps_tdma == 9) {
  1402. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1403. true, 13);
  1404. coex_dm->tdma_adj_type = 13;
  1405. } else if (coex_dm->cur_ps_tdma == 10) {
  1406. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1407. true, 14);
  1408. coex_dm->tdma_adj_type = 14;
  1409. } else if (coex_dm->cur_ps_tdma == 11) {
  1410. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1411. true, 15);
  1412. coex_dm->tdma_adj_type = 15;
  1413. } else if (coex_dm->cur_ps_tdma == 12) {
  1414. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1415. true, 16);
  1416. coex_dm->tdma_adj_type = 16;
  1417. }
  1418. if (result == -1) {
  1419. if (coex_dm->cur_ps_tdma == 5) {
  1420. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1421. true, 6);
  1422. coex_dm->tdma_adj_type = 6;
  1423. } else if (coex_dm->cur_ps_tdma == 6) {
  1424. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1425. true, 7);
  1426. coex_dm->tdma_adj_type = 7;
  1427. } else if (coex_dm->cur_ps_tdma == 7) {
  1428. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1429. true, 8);
  1430. coex_dm->tdma_adj_type = 8;
  1431. } else if (coex_dm->cur_ps_tdma == 13) {
  1432. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1433. true, 14);
  1434. coex_dm->tdma_adj_type = 14;
  1435. } else if (coex_dm->cur_ps_tdma == 14) {
  1436. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1437. true, 15);
  1438. coex_dm->tdma_adj_type = 15;
  1439. } else if (coex_dm->cur_ps_tdma == 15) {
  1440. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1441. true, 16);
  1442. coex_dm->tdma_adj_type = 16;
  1443. }
  1444. } else if (result == 1) {
  1445. if (coex_dm->cur_ps_tdma == 8) {
  1446. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1447. true, 7);
  1448. coex_dm->tdma_adj_type = 7;
  1449. } else if (coex_dm->cur_ps_tdma == 7) {
  1450. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1451. true, 6);
  1452. coex_dm->tdma_adj_type = 6;
  1453. } else if (coex_dm->cur_ps_tdma == 6) {
  1454. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1455. true, 5);
  1456. coex_dm->tdma_adj_type = 5;
  1457. } else if (coex_dm->cur_ps_tdma == 16) {
  1458. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1459. true, 15);
  1460. coex_dm->tdma_adj_type = 15;
  1461. } else if (coex_dm->cur_ps_tdma == 15) {
  1462. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1463. true, 14);
  1464. coex_dm->tdma_adj_type = 14;
  1465. } else if (coex_dm->cur_ps_tdma == 14) {
  1466. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1467. true, 13);
  1468. coex_dm->tdma_adj_type = 13;
  1469. }
  1470. }
  1471. } else {
  1472. btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
  1473. "[BTCoex], TxPause = 0\n");
  1474. if (coex_dm->cur_ps_tdma == 5) {
  1475. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 71);
  1476. coex_dm->tdma_adj_type = 71;
  1477. } else if (coex_dm->cur_ps_tdma == 6) {
  1478. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 2);
  1479. coex_dm->tdma_adj_type = 2;
  1480. } else if (coex_dm->cur_ps_tdma == 7) {
  1481. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);
  1482. coex_dm->tdma_adj_type = 3;
  1483. } else if (coex_dm->cur_ps_tdma == 8) {
  1484. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 4);
  1485. coex_dm->tdma_adj_type = 4;
  1486. }
  1487. if (coex_dm->cur_ps_tdma == 13) {
  1488. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
  1489. coex_dm->tdma_adj_type = 9;
  1490. } else if (coex_dm->cur_ps_tdma == 14) {
  1491. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 10);
  1492. coex_dm->tdma_adj_type = 10;
  1493. } else if (coex_dm->cur_ps_tdma == 15) {
  1494. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 11);
  1495. coex_dm->tdma_adj_type = 11;
  1496. } else if (coex_dm->cur_ps_tdma == 16) {
  1497. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 12);
  1498. coex_dm->tdma_adj_type = 12;
  1499. }
  1500. if (result == -1) {
  1501. if (coex_dm->cur_ps_tdma == 71) {
  1502. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1503. true, 1);
  1504. coex_dm->tdma_adj_type = 1;
  1505. } else if (coex_dm->cur_ps_tdma == 1) {
  1506. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1507. true, 2);
  1508. coex_dm->tdma_adj_type = 2;
  1509. } else if (coex_dm->cur_ps_tdma == 2) {
  1510. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1511. true, 3);
  1512. coex_dm->tdma_adj_type = 3;
  1513. } else if (coex_dm->cur_ps_tdma == 3) {
  1514. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1515. true, 4);
  1516. coex_dm->tdma_adj_type = 4;
  1517. } else if (coex_dm->cur_ps_tdma == 9) {
  1518. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1519. true, 10);
  1520. coex_dm->tdma_adj_type = 10;
  1521. } else if (coex_dm->cur_ps_tdma == 10) {
  1522. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1523. true, 11);
  1524. coex_dm->tdma_adj_type = 11;
  1525. } else if (coex_dm->cur_ps_tdma == 11) {
  1526. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1527. true, 12);
  1528. coex_dm->tdma_adj_type = 12;
  1529. }
  1530. } else if (result == 1) {
  1531. if (coex_dm->cur_ps_tdma == 4) {
  1532. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1533. true, 3);
  1534. coex_dm->tdma_adj_type = 3;
  1535. } else if (coex_dm->cur_ps_tdma == 3) {
  1536. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1537. true, 2);
  1538. coex_dm->tdma_adj_type = 2;
  1539. } else if (coex_dm->cur_ps_tdma == 2) {
  1540. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1541. true, 1);
  1542. coex_dm->tdma_adj_type = 1;
  1543. } else if (coex_dm->cur_ps_tdma == 1) {
  1544. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1545. true, 71);
  1546. coex_dm->tdma_adj_type = 71;
  1547. } else if (coex_dm->cur_ps_tdma == 12) {
  1548. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1549. true, 11);
  1550. coex_dm->tdma_adj_type = 11;
  1551. } else if (coex_dm->cur_ps_tdma == 11) {
  1552. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1553. true, 10);
  1554. coex_dm->tdma_adj_type = 10;
  1555. } else if (coex_dm->cur_ps_tdma == 10) {
  1556. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1557. true, 9);
  1558. coex_dm->tdma_adj_type = 9;
  1559. }
  1560. }
  1561. }
  1562. }
  1563. static void set_tdma_int2(struct btc_coexist *btcoexist, bool tx_pause,
  1564. s32 result)
  1565. {
  1566. /* Set PS TDMA for max interval == 2 */
  1567. if (tx_pause) {
  1568. btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
  1569. "[BTCoex], TxPause = 1\n");
  1570. if (coex_dm->cur_ps_tdma == 1) {
  1571. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 6);
  1572. coex_dm->tdma_adj_type = 6;
  1573. } else if (coex_dm->cur_ps_tdma == 2) {
  1574. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 6);
  1575. coex_dm->tdma_adj_type = 6;
  1576. } else if (coex_dm->cur_ps_tdma == 3) {
  1577. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 7);
  1578. coex_dm->tdma_adj_type = 7;
  1579. } else if (coex_dm->cur_ps_tdma == 4) {
  1580. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 8);
  1581. coex_dm->tdma_adj_type = 8;
  1582. }
  1583. if (coex_dm->cur_ps_tdma == 9) {
  1584. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
  1585. coex_dm->tdma_adj_type = 14;
  1586. } else if (coex_dm->cur_ps_tdma == 10) {
  1587. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 14);
  1588. coex_dm->tdma_adj_type = 14;
  1589. } else if (coex_dm->cur_ps_tdma == 11) {
  1590. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 15);
  1591. coex_dm->tdma_adj_type = 15;
  1592. } else if (coex_dm->cur_ps_tdma == 12) {
  1593. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 16);
  1594. coex_dm->tdma_adj_type = 16;
  1595. }
  1596. if (result == -1) {
  1597. if (coex_dm->cur_ps_tdma == 5) {
  1598. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1599. true, 6);
  1600. coex_dm->tdma_adj_type = 6;
  1601. } else if (coex_dm->cur_ps_tdma == 6) {
  1602. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1603. true, 7);
  1604. coex_dm->tdma_adj_type = 7;
  1605. } else if (coex_dm->cur_ps_tdma == 7) {
  1606. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1607. true, 8);
  1608. coex_dm->tdma_adj_type = 8;
  1609. } else if (coex_dm->cur_ps_tdma == 13) {
  1610. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1611. true, 14);
  1612. coex_dm->tdma_adj_type = 14;
  1613. } else if (coex_dm->cur_ps_tdma == 14) {
  1614. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1615. true, 15);
  1616. coex_dm->tdma_adj_type = 15;
  1617. } else if (coex_dm->cur_ps_tdma == 15) {
  1618. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1619. true, 16);
  1620. coex_dm->tdma_adj_type = 16;
  1621. }
  1622. } else if (result == 1) {
  1623. if (coex_dm->cur_ps_tdma == 8) {
  1624. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1625. true, 7);
  1626. coex_dm->tdma_adj_type = 7;
  1627. } else if (coex_dm->cur_ps_tdma == 7) {
  1628. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1629. true, 6);
  1630. coex_dm->tdma_adj_type = 6;
  1631. } else if (coex_dm->cur_ps_tdma == 6) {
  1632. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1633. true, 6);
  1634. coex_dm->tdma_adj_type = 6;
  1635. } else if (coex_dm->cur_ps_tdma == 16) {
  1636. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1637. true, 15);
  1638. coex_dm->tdma_adj_type = 15;
  1639. } else if (coex_dm->cur_ps_tdma == 15) {
  1640. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1641. true, 14);
  1642. coex_dm->tdma_adj_type = 14;
  1643. } else if (coex_dm->cur_ps_tdma == 14) {
  1644. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1645. true, 14);
  1646. coex_dm->tdma_adj_type = 14;
  1647. }
  1648. }
  1649. } else {
  1650. btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
  1651. "[BTCoex], TxPause = 0\n");
  1652. if (coex_dm->cur_ps_tdma == 5) {
  1653. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 2);
  1654. coex_dm->tdma_adj_type = 2;
  1655. } else if (coex_dm->cur_ps_tdma == 6) {
  1656. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 2);
  1657. coex_dm->tdma_adj_type = 2;
  1658. } else if (coex_dm->cur_ps_tdma == 7) {
  1659. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);
  1660. coex_dm->tdma_adj_type = 3;
  1661. } else if (coex_dm->cur_ps_tdma == 8) {
  1662. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 4);
  1663. coex_dm->tdma_adj_type = 4;
  1664. }
  1665. if (coex_dm->cur_ps_tdma == 13) {
  1666. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 10);
  1667. coex_dm->tdma_adj_type = 10;
  1668. } else if (coex_dm->cur_ps_tdma == 14) {
  1669. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 10);
  1670. coex_dm->tdma_adj_type = 10;
  1671. } else if (coex_dm->cur_ps_tdma == 15) {
  1672. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 11);
  1673. coex_dm->tdma_adj_type = 11;
  1674. } else if (coex_dm->cur_ps_tdma == 16) {
  1675. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 12);
  1676. coex_dm->tdma_adj_type = 12;
  1677. }
  1678. if (result == -1) {
  1679. if (coex_dm->cur_ps_tdma == 1) {
  1680. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1681. true, 2);
  1682. coex_dm->tdma_adj_type = 2;
  1683. } else if (coex_dm->cur_ps_tdma == 2) {
  1684. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1685. true, 3);
  1686. coex_dm->tdma_adj_type = 3;
  1687. } else if (coex_dm->cur_ps_tdma == 3) {
  1688. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1689. true, 4);
  1690. coex_dm->tdma_adj_type = 4;
  1691. } else if (coex_dm->cur_ps_tdma == 9) {
  1692. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1693. true, 10);
  1694. coex_dm->tdma_adj_type = 10;
  1695. } else if (coex_dm->cur_ps_tdma == 10) {
  1696. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1697. true, 11);
  1698. coex_dm->tdma_adj_type = 11;
  1699. } else if (coex_dm->cur_ps_tdma == 11) {
  1700. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1701. true, 12);
  1702. coex_dm->tdma_adj_type = 12;
  1703. }
  1704. } else if (result == 1) {
  1705. if (coex_dm->cur_ps_tdma == 4) {
  1706. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1707. true, 3);
  1708. coex_dm->tdma_adj_type = 3;
  1709. } else if (coex_dm->cur_ps_tdma == 3) {
  1710. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1711. true, 2);
  1712. coex_dm->tdma_adj_type = 2;
  1713. } else if (coex_dm->cur_ps_tdma == 2) {
  1714. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1715. true, 2);
  1716. coex_dm->tdma_adj_type = 2;
  1717. } else if (coex_dm->cur_ps_tdma == 12) {
  1718. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1719. true, 11);
  1720. coex_dm->tdma_adj_type = 11;
  1721. } else if (coex_dm->cur_ps_tdma == 11) {
  1722. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1723. true, 10);
  1724. coex_dm->tdma_adj_type = 10;
  1725. } else if (coex_dm->cur_ps_tdma == 10) {
  1726. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1727. true, 10);
  1728. coex_dm->tdma_adj_type = 10;
  1729. }
  1730. }
  1731. }
  1732. }
  1733. static void set_tdma_int3(struct btc_coexist *btcoexist, bool tx_pause,
  1734. s32 result)
  1735. {
  1736. /* Set PS TDMA for max interval == 3 */
  1737. if (tx_pause) {
  1738. btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
  1739. "[BTCoex], TxPause = 1\n");
  1740. if (coex_dm->cur_ps_tdma == 1) {
  1741. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 7);
  1742. coex_dm->tdma_adj_type = 7;
  1743. } else if (coex_dm->cur_ps_tdma == 2) {
  1744. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 7);
  1745. coex_dm->tdma_adj_type = 7;
  1746. } else if (coex_dm->cur_ps_tdma == 3) {
  1747. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 7);
  1748. coex_dm->tdma_adj_type = 7;
  1749. } else if (coex_dm->cur_ps_tdma == 4) {
  1750. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 8);
  1751. coex_dm->tdma_adj_type = 8;
  1752. }
  1753. if (coex_dm->cur_ps_tdma == 9) {
  1754. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 15);
  1755. coex_dm->tdma_adj_type = 15;
  1756. } else if (coex_dm->cur_ps_tdma == 10) {
  1757. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 15);
  1758. coex_dm->tdma_adj_type = 15;
  1759. } else if (coex_dm->cur_ps_tdma == 11) {
  1760. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 15);
  1761. coex_dm->tdma_adj_type = 15;
  1762. } else if (coex_dm->cur_ps_tdma == 12) {
  1763. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 16);
  1764. coex_dm->tdma_adj_type = 16;
  1765. }
  1766. if (result == -1) {
  1767. if (coex_dm->cur_ps_tdma == 5) {
  1768. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1769. true, 7);
  1770. coex_dm->tdma_adj_type = 7;
  1771. } else if (coex_dm->cur_ps_tdma == 6) {
  1772. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1773. true, 7);
  1774. coex_dm->tdma_adj_type = 7;
  1775. } else if (coex_dm->cur_ps_tdma == 7) {
  1776. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1777. true, 8);
  1778. coex_dm->tdma_adj_type = 8;
  1779. } else if (coex_dm->cur_ps_tdma == 13) {
  1780. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1781. true, 15);
  1782. coex_dm->tdma_adj_type = 15;
  1783. } else if (coex_dm->cur_ps_tdma == 14) {
  1784. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1785. true, 15);
  1786. coex_dm->tdma_adj_type = 15;
  1787. } else if (coex_dm->cur_ps_tdma == 15) {
  1788. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1789. true, 16);
  1790. coex_dm->tdma_adj_type = 16;
  1791. }
  1792. } else if (result == 1) {
  1793. if (coex_dm->cur_ps_tdma == 8) {
  1794. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1795. true, 7);
  1796. coex_dm->tdma_adj_type = 7;
  1797. } else if (coex_dm->cur_ps_tdma == 7) {
  1798. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1799. true, 7);
  1800. coex_dm->tdma_adj_type = 7;
  1801. } else if (coex_dm->cur_ps_tdma == 6) {
  1802. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1803. true, 7);
  1804. coex_dm->tdma_adj_type = 7;
  1805. } else if (coex_dm->cur_ps_tdma == 16) {
  1806. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1807. true, 15);
  1808. coex_dm->tdma_adj_type = 15;
  1809. } else if (coex_dm->cur_ps_tdma == 15) {
  1810. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1811. true, 15);
  1812. coex_dm->tdma_adj_type = 15;
  1813. } else if (coex_dm->cur_ps_tdma == 14) {
  1814. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1815. true, 15);
  1816. coex_dm->tdma_adj_type = 15;
  1817. }
  1818. }
  1819. } else {
  1820. btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
  1821. "[BTCoex], TxPause = 0\n");
  1822. if (coex_dm->cur_ps_tdma == 5) {
  1823. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);
  1824. coex_dm->tdma_adj_type = 3;
  1825. } else if (coex_dm->cur_ps_tdma == 6) {
  1826. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);
  1827. coex_dm->tdma_adj_type = 3;
  1828. } else if (coex_dm->cur_ps_tdma == 7) {
  1829. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 3);
  1830. coex_dm->tdma_adj_type = 3;
  1831. } else if (coex_dm->cur_ps_tdma == 8) {
  1832. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 4);
  1833. coex_dm->tdma_adj_type = 4;
  1834. }
  1835. if (coex_dm->cur_ps_tdma == 13) {
  1836. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 11);
  1837. coex_dm->tdma_adj_type = 11;
  1838. } else if (coex_dm->cur_ps_tdma == 14) {
  1839. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 11);
  1840. coex_dm->tdma_adj_type = 11;
  1841. } else if (coex_dm->cur_ps_tdma == 15) {
  1842. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 11);
  1843. coex_dm->tdma_adj_type = 11;
  1844. } else if (coex_dm->cur_ps_tdma == 16) {
  1845. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 12);
  1846. coex_dm->tdma_adj_type = 12;
  1847. }
  1848. if (result == -1) {
  1849. if (coex_dm->cur_ps_tdma == 1) {
  1850. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1851. true, 3);
  1852. coex_dm->tdma_adj_type = 3;
  1853. } else if (coex_dm->cur_ps_tdma == 2) {
  1854. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1855. true, 3);
  1856. coex_dm->tdma_adj_type = 3;
  1857. } else if (coex_dm->cur_ps_tdma == 3) {
  1858. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1859. true, 4);
  1860. coex_dm->tdma_adj_type = 4;
  1861. } else if (coex_dm->cur_ps_tdma == 9) {
  1862. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1863. true, 11);
  1864. coex_dm->tdma_adj_type = 11;
  1865. } else if (coex_dm->cur_ps_tdma == 10) {
  1866. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1867. true, 11);
  1868. coex_dm->tdma_adj_type = 11;
  1869. } else if (coex_dm->cur_ps_tdma == 11) {
  1870. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1871. true, 12);
  1872. coex_dm->tdma_adj_type = 12;
  1873. }
  1874. } else if (result == 1) {
  1875. if (coex_dm->cur_ps_tdma == 4) {
  1876. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1877. true, 3);
  1878. coex_dm->tdma_adj_type = 3;
  1879. } else if (coex_dm->cur_ps_tdma == 3) {
  1880. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1881. true, 3);
  1882. coex_dm->tdma_adj_type = 3;
  1883. } else if (coex_dm->cur_ps_tdma == 2) {
  1884. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1885. true, 3);
  1886. coex_dm->tdma_adj_type = 3;
  1887. } else if (coex_dm->cur_ps_tdma == 12) {
  1888. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1889. true, 11);
  1890. coex_dm->tdma_adj_type = 11;
  1891. } else if (coex_dm->cur_ps_tdma == 11) {
  1892. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1893. true, 11);
  1894. coex_dm->tdma_adj_type = 11;
  1895. } else if (coex_dm->cur_ps_tdma == 10) {
  1896. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC,
  1897. true, 11);
  1898. coex_dm->tdma_adj_type = 11;
  1899. }
  1900. }
  1901. }
  1902. }
  1903. static void btc8723b2ant_tdma_duration_adjust(struct btc_coexist *btcoexist,
  1904. bool sco_hid, bool tx_pause,
  1905. u8 max_interval)
  1906. {
  1907. static s32 up, dn, m, n, wait_count;
  1908. /*0: no change, +1: increase WiFi duration, -1: decrease WiFi duration*/
  1909. s32 result;
  1910. u8 retry_count = 0;
  1911. btc_alg_dbg(ALGO_TRACE_FW,
  1912. "[BTCoex], TdmaDurationAdjust()\n");
  1913. if (!coex_dm->auto_tdma_adjust) {
  1914. coex_dm->auto_tdma_adjust = true;
  1915. btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
  1916. "[BTCoex], first run TdmaDurationAdjust()!!\n");
  1917. if (sco_hid) {
  1918. if (tx_pause) {
  1919. if (max_interval == 1) {
  1920. btc8723b2ant_ps_tdma(btcoexist,
  1921. NORMAL_EXEC,
  1922. true, 13);
  1923. coex_dm->tdma_adj_type = 13;
  1924. } else if (max_interval == 2) {
  1925. btc8723b2ant_ps_tdma(btcoexist,
  1926. NORMAL_EXEC,
  1927. true, 14);
  1928. coex_dm->tdma_adj_type = 14;
  1929. } else if (max_interval == 3) {
  1930. btc8723b2ant_ps_tdma(btcoexist,
  1931. NORMAL_EXEC,
  1932. true, 15);
  1933. coex_dm->tdma_adj_type = 15;
  1934. } else {
  1935. btc8723b2ant_ps_tdma(btcoexist,
  1936. NORMAL_EXEC,
  1937. true, 15);
  1938. coex_dm->tdma_adj_type = 15;
  1939. }
  1940. } else {
  1941. if (max_interval == 1) {
  1942. btc8723b2ant_ps_tdma(btcoexist,
  1943. NORMAL_EXEC,
  1944. true, 9);
  1945. coex_dm->tdma_adj_type = 9;
  1946. } else if (max_interval == 2) {
  1947. btc8723b2ant_ps_tdma(btcoexist,
  1948. NORMAL_EXEC,
  1949. true, 10);
  1950. coex_dm->tdma_adj_type = 10;
  1951. } else if (max_interval == 3) {
  1952. btc8723b2ant_ps_tdma(btcoexist,
  1953. NORMAL_EXEC,
  1954. true, 11);
  1955. coex_dm->tdma_adj_type = 11;
  1956. } else {
  1957. btc8723b2ant_ps_tdma(btcoexist,
  1958. NORMAL_EXEC,
  1959. true, 11);
  1960. coex_dm->tdma_adj_type = 11;
  1961. }
  1962. }
  1963. } else {
  1964. if (tx_pause) {
  1965. if (max_interval == 1) {
  1966. btc8723b2ant_ps_tdma(btcoexist,
  1967. NORMAL_EXEC,
  1968. true, 5);
  1969. coex_dm->tdma_adj_type = 5;
  1970. } else if (max_interval == 2) {
  1971. btc8723b2ant_ps_tdma(btcoexist,
  1972. NORMAL_EXEC,
  1973. true, 6);
  1974. coex_dm->tdma_adj_type = 6;
  1975. } else if (max_interval == 3) {
  1976. btc8723b2ant_ps_tdma(btcoexist,
  1977. NORMAL_EXEC,
  1978. true, 7);
  1979. coex_dm->tdma_adj_type = 7;
  1980. } else {
  1981. btc8723b2ant_ps_tdma(btcoexist,
  1982. NORMAL_EXEC,
  1983. true, 7);
  1984. coex_dm->tdma_adj_type = 7;
  1985. }
  1986. } else {
  1987. if (max_interval == 1) {
  1988. btc8723b2ant_ps_tdma(btcoexist,
  1989. NORMAL_EXEC,
  1990. true, 1);
  1991. coex_dm->tdma_adj_type = 1;
  1992. } else if (max_interval == 2) {
  1993. btc8723b2ant_ps_tdma(btcoexist,
  1994. NORMAL_EXEC,
  1995. true, 2);
  1996. coex_dm->tdma_adj_type = 2;
  1997. } else if (max_interval == 3) {
  1998. btc8723b2ant_ps_tdma(btcoexist,
  1999. NORMAL_EXEC,
  2000. true, 3);
  2001. coex_dm->tdma_adj_type = 3;
  2002. } else {
  2003. btc8723b2ant_ps_tdma(btcoexist,
  2004. NORMAL_EXEC,
  2005. true, 3);
  2006. coex_dm->tdma_adj_type = 3;
  2007. }
  2008. }
  2009. }
  2010. up = 0;
  2011. dn = 0;
  2012. m = 1;
  2013. n = 3;
  2014. result = 0;
  2015. wait_count = 0;
  2016. } else {
  2017. /*accquire the BT TRx retry count from BT_Info byte2*/
  2018. retry_count = coex_sta->bt_retry_cnt;
  2019. btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
  2020. "[BTCoex], retry_count = %d\n", retry_count);
  2021. btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
  2022. "[BTCoex], up=%d, dn=%d, m=%d, n=%d, wait_count=%d\n",
  2023. up, dn, m, n, wait_count);
  2024. result = 0;
  2025. wait_count++;
  2026. /* no retry in the last 2-second duration*/
  2027. if (retry_count == 0) {
  2028. up++;
  2029. dn--;
  2030. if (dn <= 0)
  2031. dn = 0;
  2032. if (up >= n) {
  2033. wait_count = 0;
  2034. n = 3;
  2035. up = 0;
  2036. dn = 0;
  2037. result = 1;
  2038. btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
  2039. "[BTCoex], Increase wifi duration!!\n");
  2040. } /* <=3 retry in the last 2-second duration*/
  2041. } else if (retry_count <= 3) {
  2042. up--;
  2043. dn++;
  2044. if (up <= 0)
  2045. up = 0;
  2046. if (dn == 2) {
  2047. if (wait_count <= 2)
  2048. m++;
  2049. else
  2050. m = 1;
  2051. if (m >= 20)
  2052. m = 20;
  2053. n = 3 * m;
  2054. up = 0;
  2055. dn = 0;
  2056. wait_count = 0;
  2057. result = -1;
  2058. btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
  2059. "[BTCoex], Decrease wifi duration for retry_counter<3!!\n");
  2060. }
  2061. } else {
  2062. if (wait_count == 1)
  2063. m++;
  2064. else
  2065. m = 1;
  2066. if (m >= 20)
  2067. m = 20;
  2068. n = 3 * m;
  2069. up = 0;
  2070. dn = 0;
  2071. wait_count = 0;
  2072. result = -1;
  2073. btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
  2074. "[BTCoex], Decrease wifi duration for retry_counter>3!!\n");
  2075. }
  2076. btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
  2077. "[BTCoex], max Interval = %d\n", max_interval);
  2078. if (max_interval == 1)
  2079. set_tdma_int1(btcoexist, tx_pause, result);
  2080. else if (max_interval == 2)
  2081. set_tdma_int2(btcoexist, tx_pause, result);
  2082. else if (max_interval == 3)
  2083. set_tdma_int3(btcoexist, tx_pause, result);
  2084. }
  2085. /*if current PsTdma not match with the recorded one (when scan, dhcp..),
  2086. *then we have to adjust it back to the previous recorded one.
  2087. */
  2088. if (coex_dm->cur_ps_tdma != coex_dm->tdma_adj_type) {
  2089. bool scan = false, link = false, roam = false;
  2090. btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
  2091. "[BTCoex], PsTdma type dismatch!!!, curPsTdma=%d, recordPsTdma=%d\n",
  2092. coex_dm->cur_ps_tdma, coex_dm->tdma_adj_type);
  2093. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
  2094. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
  2095. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
  2096. if (!scan && !link && !roam)
  2097. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true,
  2098. coex_dm->tdma_adj_type);
  2099. else
  2100. btc_alg_dbg(ALGO_TRACE_FW_DETAIL,
  2101. "[BTCoex], roaming/link/scan is under progress, will adjust next time!!!\n");
  2102. }
  2103. }
  2104. /* SCO only or SCO+PAN(HS) */
  2105. static void btc8723b2ant_action_sco(struct btc_coexist *btcoexist)
  2106. {
  2107. u8 wifi_rssi_state;
  2108. u32 wifi_bw;
  2109. wifi_rssi_state = btc8723b2ant_wifi_rssi_state(btcoexist,
  2110. 0, 2, 15, 0);
  2111. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
  2112. btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 4);
  2113. if (btc8723b_need_dec_pwr(btcoexist))
  2114. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
  2115. else
  2116. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
  2117. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
  2118. /*for SCO quality at 11b/g mode*/
  2119. if (BTC_WIFI_BW_LEGACY == wifi_bw)
  2120. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC, 2);
  2121. else /*for SCO quality & wifi performance balance at 11n mode*/
  2122. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC, 8);
  2123. /*for voice quality */
  2124. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 0);
  2125. /* sw mechanism */
  2126. if (BTC_WIFI_BW_HT40 == wifi_bw) {
  2127. if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2128. (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2129. btc8723b2ant_sw_mechanism1(btcoexist, true, true,
  2130. false, false);
  2131. btc8723b2ant_sw_mechanism2(btcoexist, true, false,
  2132. true, 0x4);
  2133. } else {
  2134. btc8723b2ant_sw_mechanism1(btcoexist, true, true,
  2135. false, false);
  2136. btc8723b2ant_sw_mechanism2(btcoexist, false, false,
  2137. true, 0x4);
  2138. }
  2139. } else {
  2140. if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2141. (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2142. btc8723b2ant_sw_mechanism1(btcoexist, false, true,
  2143. false, false);
  2144. btc8723b2ant_sw_mechanism2(btcoexist, true, false,
  2145. true, 0x4);
  2146. } else {
  2147. btc8723b2ant_sw_mechanism1(btcoexist, false, true,
  2148. false, false);
  2149. btc8723b2ant_sw_mechanism2(btcoexist, false, false,
  2150. true, 0x4);
  2151. }
  2152. }
  2153. }
  2154. static void btc8723b2ant_action_hid(struct btc_coexist *btcoexist)
  2155. {
  2156. u8 wifi_rssi_state, bt_rssi_state;
  2157. u32 wifi_bw;
  2158. wifi_rssi_state = btc8723b2ant_wifi_rssi_state(btcoexist,
  2159. 0, 2, 15, 0);
  2160. bt_rssi_state = btc8723b2ant_bt_rssi_state(2, 29, 0);
  2161. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
  2162. btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
  2163. if (btc8723b_need_dec_pwr(btcoexist))
  2164. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
  2165. else
  2166. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
  2167. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
  2168. if (BTC_WIFI_BW_LEGACY == wifi_bw) /*/for HID at 11b/g mode*/
  2169. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC, 7);
  2170. else /*for HID quality & wifi performance balance at 11n mode*/
  2171. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC, 9);
  2172. if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2173. (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
  2174. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 9);
  2175. else
  2176. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 13);
  2177. /* sw mechanism */
  2178. if (BTC_WIFI_BW_HT40 == wifi_bw) {
  2179. if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2180. (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2181. btc8723b2ant_sw_mechanism1(btcoexist, true, true,
  2182. false, false);
  2183. btc8723b2ant_sw_mechanism2(btcoexist, true, false,
  2184. false, 0x18);
  2185. } else {
  2186. btc8723b2ant_sw_mechanism1(btcoexist, true, true,
  2187. false, false);
  2188. btc8723b2ant_sw_mechanism2(btcoexist, false, false,
  2189. false, 0x18);
  2190. }
  2191. } else {
  2192. if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2193. (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2194. btc8723b2ant_sw_mechanism1(btcoexist, false, true,
  2195. false, false);
  2196. btc8723b2ant_sw_mechanism2(btcoexist, true, false,
  2197. false, 0x18);
  2198. } else {
  2199. btc8723b2ant_sw_mechanism1(btcoexist, false, true,
  2200. false, false);
  2201. btc8723b2ant_sw_mechanism2(btcoexist, false, false,
  2202. false, 0x18);
  2203. }
  2204. }
  2205. }
  2206. /*A2DP only / PAN(EDR) only/ A2DP+PAN(HS)*/
  2207. static void btc8723b2ant_action_a2dp(struct btc_coexist *btcoexist)
  2208. {
  2209. u8 wifi_rssi_state, wifi_rssi_state1, bt_rssi_state;
  2210. u32 wifi_bw;
  2211. u8 ap_num = 0;
  2212. wifi_rssi_state = btc8723b2ant_wifi_rssi_state(btcoexist,
  2213. 0, 2, 15, 0);
  2214. wifi_rssi_state1 = btc8723b2ant_wifi_rssi_state(btcoexist,
  2215. 1, 2, 40, 0);
  2216. bt_rssi_state = btc8723b2ant_bt_rssi_state(2, 29, 0);
  2217. btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM, &ap_num);
  2218. /* define the office environment */
  2219. /* driver don't know AP num in Linux, so we will never enter this if */
  2220. if (ap_num >= 10 && BTC_RSSI_HIGH(wifi_rssi_state1)) {
  2221. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
  2222. 0x0);
  2223. btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
  2224. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
  2225. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC, 0);
  2226. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
  2227. /* sw mechanism */
  2228. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
  2229. if (BTC_WIFI_BW_HT40 == wifi_bw) {
  2230. btc8723b2ant_sw_mechanism1(btcoexist, true, false,
  2231. false, false);
  2232. btc8723b2ant_sw_mechanism2(btcoexist, true, false,
  2233. true, 0x18);
  2234. } else {
  2235. btc8723b2ant_sw_mechanism1(btcoexist, false, false,
  2236. false, false);
  2237. btc8723b2ant_sw_mechanism2(btcoexist, true, false,
  2238. true, 0x18);
  2239. }
  2240. return;
  2241. }
  2242. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
  2243. btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
  2244. if (btc8723b_need_dec_pwr(btcoexist))
  2245. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
  2246. else
  2247. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
  2248. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC, 7);
  2249. if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2250. (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
  2251. btc8723b2ant_tdma_duration_adjust(btcoexist, false,
  2252. false, 1);
  2253. else
  2254. btc8723b2ant_tdma_duration_adjust(btcoexist, false, true, 1);
  2255. /* sw mechanism */
  2256. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
  2257. if (BTC_WIFI_BW_HT40 == wifi_bw) {
  2258. if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2259. (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2260. btc8723b2ant_sw_mechanism1(btcoexist, true, false,
  2261. false, false);
  2262. btc8723b2ant_sw_mechanism2(btcoexist, true, false,
  2263. false, 0x18);
  2264. } else {
  2265. btc8723b2ant_sw_mechanism1(btcoexist, true, false,
  2266. false, false);
  2267. btc8723b2ant_sw_mechanism2(btcoexist, false, false,
  2268. false, 0x18);
  2269. }
  2270. } else {
  2271. if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2272. (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2273. btc8723b2ant_sw_mechanism1(btcoexist, false, false,
  2274. false, false);
  2275. btc8723b2ant_sw_mechanism2(btcoexist, true, false,
  2276. false, 0x18);
  2277. } else {
  2278. btc8723b2ant_sw_mechanism1(btcoexist, false, false,
  2279. false, false);
  2280. btc8723b2ant_sw_mechanism2(btcoexist, false, false,
  2281. false, 0x18);
  2282. }
  2283. }
  2284. }
  2285. static void btc8723b2ant_action_a2dp_pan_hs(struct btc_coexist *btcoexist)
  2286. {
  2287. u8 wifi_rssi_state;
  2288. u32 wifi_bw;
  2289. wifi_rssi_state = btc8723b2ant_wifi_rssi_state(btcoexist,
  2290. 0, 2, 15, 0);
  2291. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
  2292. btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
  2293. if (btc8723b_need_dec_pwr(btcoexist))
  2294. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
  2295. else
  2296. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
  2297. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC, 7);
  2298. btc8723b2ant_tdma_duration_adjust(btcoexist, false, true, 2);
  2299. /* sw mechanism */
  2300. btcoexist->btc_get(btcoexist,
  2301. BTC_GET_U4_WIFI_BW, &wifi_bw);
  2302. if (BTC_WIFI_BW_HT40 == wifi_bw) {
  2303. if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2304. (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2305. btc8723b2ant_sw_mechanism1(btcoexist, true, false,
  2306. false, false);
  2307. btc8723b2ant_sw_mechanism2(btcoexist, true, false,
  2308. false, 0x18);
  2309. } else {
  2310. btc8723b2ant_sw_mechanism1(btcoexist, true, false,
  2311. false, false);
  2312. btc8723b2ant_sw_mechanism2(btcoexist, false, false,
  2313. false, 0x18);
  2314. }
  2315. } else {
  2316. if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2317. (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2318. btc8723b2ant_sw_mechanism1(btcoexist, false, false,
  2319. false, false);
  2320. btc8723b2ant_sw_mechanism2(btcoexist, true, false,
  2321. false, 0x18);
  2322. } else {
  2323. btc8723b2ant_sw_mechanism1(btcoexist, false, false,
  2324. false, false);
  2325. btc8723b2ant_sw_mechanism2(btcoexist, false, false,
  2326. false, 0x18);
  2327. }
  2328. }
  2329. }
  2330. static void btc8723b2ant_action_pan_edr(struct btc_coexist *btcoexist)
  2331. {
  2332. u8 wifi_rssi_state, bt_rssi_state;
  2333. u32 wifi_bw;
  2334. wifi_rssi_state = btc8723b2ant_wifi_rssi_state(btcoexist,
  2335. 0, 2, 15, 0);
  2336. bt_rssi_state = btc8723b2ant_bt_rssi_state(2, 29, 0);
  2337. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
  2338. btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
  2339. if (btc8723b_need_dec_pwr(btcoexist))
  2340. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
  2341. else
  2342. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
  2343. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC, 10);
  2344. if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2345. (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
  2346. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 1);
  2347. else
  2348. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, true, 5);
  2349. /* sw mechanism */
  2350. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
  2351. if (BTC_WIFI_BW_HT40 == wifi_bw) {
  2352. if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2353. (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2354. btc8723b2ant_sw_mechanism1(btcoexist, true, false,
  2355. false, false);
  2356. btc8723b2ant_sw_mechanism2(btcoexist, true, false,
  2357. false, 0x18);
  2358. } else {
  2359. btc8723b2ant_sw_mechanism1(btcoexist, true, false,
  2360. false, false);
  2361. btc8723b2ant_sw_mechanism2(btcoexist, false, false,
  2362. false, 0x18);
  2363. }
  2364. } else {
  2365. if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2366. (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2367. btc8723b2ant_sw_mechanism1(btcoexist, false, false,
  2368. false, false);
  2369. btc8723b2ant_sw_mechanism2(btcoexist, true, false,
  2370. false, 0x18);
  2371. } else {
  2372. btc8723b2ant_sw_mechanism1(btcoexist, false, false,
  2373. false, false);
  2374. btc8723b2ant_sw_mechanism2(btcoexist, false, false,
  2375. false, 0x18);
  2376. }
  2377. }
  2378. }
  2379. /*PAN(HS) only*/
  2380. static void btc8723b2ant_action_pan_hs(struct btc_coexist *btcoexist)
  2381. {
  2382. u8 wifi_rssi_state;
  2383. u32 wifi_bw;
  2384. wifi_rssi_state = btc8723b2ant_wifi_rssi_state(btcoexist,
  2385. 0, 2, 15, 0);
  2386. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
  2387. btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
  2388. if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2389. (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
  2390. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
  2391. else
  2392. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
  2393. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC, 7);
  2394. btc8723b2ant_ps_tdma(btcoexist, NORMAL_EXEC, false, 1);
  2395. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
  2396. if (BTC_WIFI_BW_HT40 == wifi_bw) {
  2397. if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2398. (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2399. btc8723b2ant_sw_mechanism1(btcoexist, true, false,
  2400. false, false);
  2401. btc8723b2ant_sw_mechanism2(btcoexist, true, false,
  2402. false, 0x18);
  2403. } else {
  2404. btc8723b2ant_sw_mechanism1(btcoexist, true, false,
  2405. false, false);
  2406. btc8723b2ant_sw_mechanism2(btcoexist, false, false,
  2407. false, 0x18);
  2408. }
  2409. } else {
  2410. if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2411. (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2412. btc8723b2ant_sw_mechanism1(btcoexist, false, false,
  2413. false, false);
  2414. btc8723b2ant_sw_mechanism2(btcoexist, true, false,
  2415. false, 0x18);
  2416. } else {
  2417. btc8723b2ant_sw_mechanism1(btcoexist, false, false,
  2418. false, false);
  2419. btc8723b2ant_sw_mechanism2(btcoexist, false, false,
  2420. false, 0x18);
  2421. }
  2422. }
  2423. }
  2424. /*PAN(EDR)+A2DP*/
  2425. static void btc8723b2ant_action_pan_edr_a2dp(struct btc_coexist *btcoexist)
  2426. {
  2427. u8 wifi_rssi_state, bt_rssi_state;
  2428. u32 wifi_bw;
  2429. wifi_rssi_state = btc8723b2ant_wifi_rssi_state(btcoexist,
  2430. 0, 2, 15, 0);
  2431. bt_rssi_state = btc8723b2ant_bt_rssi_state(2, 29, 0);
  2432. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
  2433. btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
  2434. if (btc8723b_need_dec_pwr(btcoexist))
  2435. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
  2436. else
  2437. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
  2438. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
  2439. if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2440. (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2441. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC, 12);
  2442. if (BTC_WIFI_BW_HT40 == wifi_bw)
  2443. btc8723b2ant_tdma_duration_adjust(btcoexist, false,
  2444. true, 3);
  2445. else
  2446. btc8723b2ant_tdma_duration_adjust(btcoexist, false,
  2447. false, 3);
  2448. } else {
  2449. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC, 7);
  2450. btc8723b2ant_tdma_duration_adjust(btcoexist, false, true, 3);
  2451. }
  2452. /* sw mechanism */
  2453. if (BTC_WIFI_BW_HT40 == wifi_bw) {
  2454. if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2455. (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2456. btc8723b2ant_sw_mechanism1(btcoexist, true, false,
  2457. false, false);
  2458. btc8723b2ant_sw_mechanism2(btcoexist, true, false,
  2459. false, 0x18);
  2460. } else {
  2461. btc8723b2ant_sw_mechanism1(btcoexist, true, false,
  2462. false, false);
  2463. btc8723b2ant_sw_mechanism2(btcoexist, false, false,
  2464. false, 0x18);
  2465. }
  2466. } else {
  2467. if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2468. (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2469. btc8723b2ant_sw_mechanism1(btcoexist, false, false,
  2470. false, false);
  2471. btc8723b2ant_sw_mechanism2(btcoexist, true, false,
  2472. false, 0x18);
  2473. } else {
  2474. btc8723b2ant_sw_mechanism1(btcoexist, false, false,
  2475. false, false);
  2476. btc8723b2ant_sw_mechanism2(btcoexist, false, false,
  2477. false, 0x18);
  2478. }
  2479. }
  2480. }
  2481. static void btc8723b2ant_action_pan_edr_hid(struct btc_coexist *btcoexist)
  2482. {
  2483. u8 wifi_rssi_state, bt_rssi_state;
  2484. u32 wifi_bw;
  2485. wifi_rssi_state = btc8723b2ant_wifi_rssi_state(btcoexist,
  2486. 0, 2, 15, 0);
  2487. bt_rssi_state = btc8723b2ant_bt_rssi_state(2, 29, 0);
  2488. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
  2489. if (btc8723b_need_dec_pwr(btcoexist))
  2490. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
  2491. else
  2492. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
  2493. if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2494. (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2495. if (BTC_WIFI_BW_HT40 == wifi_bw) {
  2496. btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
  2497. 3);
  2498. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC, 11);
  2499. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
  2500. 0xfffff, 0x780);
  2501. } else {
  2502. btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC,
  2503. 6);
  2504. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC, 7);
  2505. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1,
  2506. 0xfffff, 0x0);
  2507. }
  2508. btc8723b2ant_tdma_duration_adjust(btcoexist, true, false, 2);
  2509. } else {
  2510. btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
  2511. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC, 11);
  2512. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff,
  2513. 0x0);
  2514. btc8723b2ant_tdma_duration_adjust(btcoexist, true, true, 2);
  2515. }
  2516. /* sw mechanism */
  2517. if (BTC_WIFI_BW_HT40 == wifi_bw) {
  2518. if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2519. (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2520. btc8723b2ant_sw_mechanism1(btcoexist, true, true,
  2521. false, false);
  2522. btc8723b2ant_sw_mechanism2(btcoexist, true, false,
  2523. false, 0x18);
  2524. } else {
  2525. btc8723b2ant_sw_mechanism1(btcoexist, true, true,
  2526. false, false);
  2527. btc8723b2ant_sw_mechanism2(btcoexist, false, false,
  2528. false, 0x18);
  2529. }
  2530. } else {
  2531. if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2532. (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2533. btc8723b2ant_sw_mechanism1(btcoexist, false, true,
  2534. false, false);
  2535. btc8723b2ant_sw_mechanism2(btcoexist, true, false,
  2536. false, 0x18);
  2537. } else {
  2538. btc8723b2ant_sw_mechanism1(btcoexist, false, true,
  2539. false, false);
  2540. btc8723b2ant_sw_mechanism2(btcoexist, false, false,
  2541. false, 0x18);
  2542. }
  2543. }
  2544. }
  2545. /* HID+A2DP+PAN(EDR) */
  2546. static void btc8723b2ant_action_hid_a2dp_pan_edr(struct btc_coexist *btcoexist)
  2547. {
  2548. u8 wifi_rssi_state, bt_rssi_state;
  2549. u32 wifi_bw;
  2550. wifi_rssi_state = btc8723b2ant_wifi_rssi_state(btcoexist,
  2551. 0, 2, 15, 0);
  2552. bt_rssi_state = btc8723b2ant_bt_rssi_state(2, 29, 0);
  2553. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
  2554. btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
  2555. if (btc8723b_need_dec_pwr(btcoexist))
  2556. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
  2557. else
  2558. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
  2559. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
  2560. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC, 7);
  2561. if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2562. (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2563. if (BTC_WIFI_BW_HT40 == wifi_bw)
  2564. btc8723b2ant_tdma_duration_adjust(btcoexist, true,
  2565. true, 2);
  2566. else
  2567. btc8723b2ant_tdma_duration_adjust(btcoexist, true,
  2568. false, 3);
  2569. } else {
  2570. btc8723b2ant_tdma_duration_adjust(btcoexist, true, true, 3);
  2571. }
  2572. /* sw mechanism */
  2573. if (BTC_WIFI_BW_HT40 == wifi_bw) {
  2574. if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2575. (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2576. btc8723b2ant_sw_mechanism1(btcoexist, true, true,
  2577. false, false);
  2578. btc8723b2ant_sw_mechanism2(btcoexist, true, false,
  2579. false, 0x18);
  2580. } else {
  2581. btc8723b2ant_sw_mechanism1(btcoexist, true, true,
  2582. false, false);
  2583. btc8723b2ant_sw_mechanism2(btcoexist, false, false,
  2584. false, 0x18);
  2585. }
  2586. } else {
  2587. if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2588. (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2589. btc8723b2ant_sw_mechanism1(btcoexist, false, true,
  2590. false, false);
  2591. btc8723b2ant_sw_mechanism2(btcoexist, true, false,
  2592. false, 0x18);
  2593. } else {
  2594. btc8723b2ant_sw_mechanism1(btcoexist, false, true,
  2595. false, false);
  2596. btc8723b2ant_sw_mechanism2(btcoexist, false, false,
  2597. false, 0x18);
  2598. }
  2599. }
  2600. }
  2601. static void btc8723b2ant_action_hid_a2dp(struct btc_coexist *btcoexist)
  2602. {
  2603. u8 wifi_rssi_state, bt_rssi_state;
  2604. u32 wifi_bw;
  2605. wifi_rssi_state = btc8723b2ant_wifi_rssi_state(btcoexist,
  2606. 0, 2, 15, 0);
  2607. bt_rssi_state = btc8723b2ant_bt_rssi_state(2, 29, 0);
  2608. btcoexist->btc_set_rf_reg(btcoexist, BTC_RF_A, 0x1, 0xfffff, 0x0);
  2609. btc8723b2ant_fw_dac_swing_lvl(btcoexist, NORMAL_EXEC, 6);
  2610. if (btc8723b_need_dec_pwr(btcoexist))
  2611. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, true);
  2612. else
  2613. btc8723b2ant_dec_bt_pwr(btcoexist, NORMAL_EXEC, false);
  2614. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
  2615. btc8723b_coex_tbl_type(btcoexist, NORMAL_EXEC, 7);
  2616. if ((bt_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2617. (bt_rssi_state == BTC_RSSI_STATE_STAY_HIGH))
  2618. btc8723b2ant_tdma_duration_adjust(btcoexist, true, false, 2);
  2619. else
  2620. btc8723b2ant_tdma_duration_adjust(btcoexist, true, true, 2);
  2621. /* sw mechanism */
  2622. if (BTC_WIFI_BW_HT40 == wifi_bw) {
  2623. if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2624. (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2625. btc8723b2ant_sw_mechanism1(btcoexist, true, true,
  2626. false, false);
  2627. btc8723b2ant_sw_mechanism2(btcoexist, true, false,
  2628. false, 0x18);
  2629. } else {
  2630. btc8723b2ant_sw_mechanism1(btcoexist, true, true,
  2631. false, false);
  2632. btc8723b2ant_sw_mechanism2(btcoexist, false, false,
  2633. false, 0x18);
  2634. }
  2635. } else {
  2636. if ((wifi_rssi_state == BTC_RSSI_STATE_HIGH) ||
  2637. (wifi_rssi_state == BTC_RSSI_STATE_STAY_HIGH)) {
  2638. btc8723b2ant_sw_mechanism1(btcoexist, false, true,
  2639. false, false);
  2640. btc8723b2ant_sw_mechanism2(btcoexist, true, false,
  2641. false, 0x18);
  2642. } else {
  2643. btc8723b2ant_sw_mechanism1(btcoexist, false, true,
  2644. false, false);
  2645. btc8723b2ant_sw_mechanism2(btcoexist, false, false,
  2646. false, 0x18);
  2647. }
  2648. }
  2649. }
  2650. static void btc8723b2ant_run_coexist_mechanism(struct btc_coexist *btcoexist)
  2651. {
  2652. u8 algorithm = 0;
  2653. btc_alg_dbg(ALGO_TRACE,
  2654. "[BTCoex], RunCoexistMechanism()===>\n");
  2655. if (btcoexist->manual_control) {
  2656. btc_alg_dbg(ALGO_TRACE,
  2657. "[BTCoex], RunCoexistMechanism(), return for Manual CTRL <===\n");
  2658. return;
  2659. }
  2660. if (coex_sta->under_ips) {
  2661. btc_alg_dbg(ALGO_TRACE,
  2662. "[BTCoex], wifi is under IPS !!!\n");
  2663. return;
  2664. }
  2665. algorithm = btc8723b2ant_action_algorithm(btcoexist);
  2666. if (coex_sta->c2h_bt_inquiry_page &&
  2667. (BT_8723B_2ANT_COEX_ALGO_PANHS != algorithm)) {
  2668. btc_alg_dbg(ALGO_TRACE,
  2669. "[BTCoex], BT is under inquiry/page scan !!\n");
  2670. btc8723b2ant_action_bt_inquiry(btcoexist);
  2671. return;
  2672. } else {
  2673. if (coex_dm->need_recover_0x948) {
  2674. coex_dm->need_recover_0x948 = false;
  2675. btcoexist->btc_write_2byte(btcoexist, 0x948,
  2676. coex_dm->backup_0x948);
  2677. }
  2678. }
  2679. coex_dm->cur_algorithm = algorithm;
  2680. btc_alg_dbg(ALGO_TRACE, "[BTCoex], Algorithm = %d\n",
  2681. coex_dm->cur_algorithm);
  2682. if (btc8723b2ant_is_common_action(btcoexist)) {
  2683. btc_alg_dbg(ALGO_TRACE,
  2684. "[BTCoex], Action 2-Ant common\n");
  2685. coex_dm->auto_tdma_adjust = false;
  2686. } else {
  2687. if (coex_dm->cur_algorithm != coex_dm->pre_algorithm) {
  2688. btc_alg_dbg(ALGO_TRACE,
  2689. "[BTCoex], preAlgorithm=%d, curAlgorithm=%d\n",
  2690. coex_dm->pre_algorithm,
  2691. coex_dm->cur_algorithm);
  2692. coex_dm->auto_tdma_adjust = false;
  2693. }
  2694. switch (coex_dm->cur_algorithm) {
  2695. case BT_8723B_2ANT_COEX_ALGO_SCO:
  2696. btc_alg_dbg(ALGO_TRACE,
  2697. "[BTCoex], Action 2-Ant, algorithm = SCO\n");
  2698. btc8723b2ant_action_sco(btcoexist);
  2699. break;
  2700. case BT_8723B_2ANT_COEX_ALGO_HID:
  2701. btc_alg_dbg(ALGO_TRACE,
  2702. "[BTCoex], Action 2-Ant, algorithm = HID\n");
  2703. btc8723b2ant_action_hid(btcoexist);
  2704. break;
  2705. case BT_8723B_2ANT_COEX_ALGO_A2DP:
  2706. btc_alg_dbg(ALGO_TRACE,
  2707. "[BTCoex], Action 2-Ant, algorithm = A2DP\n");
  2708. btc8723b2ant_action_a2dp(btcoexist);
  2709. break;
  2710. case BT_8723B_2ANT_COEX_ALGO_A2DP_PANHS:
  2711. btc_alg_dbg(ALGO_TRACE,
  2712. "[BTCoex], Action 2-Ant, algorithm = A2DP+PAN(HS)\n");
  2713. btc8723b2ant_action_a2dp_pan_hs(btcoexist);
  2714. break;
  2715. case BT_8723B_2ANT_COEX_ALGO_PANEDR:
  2716. btc_alg_dbg(ALGO_TRACE,
  2717. "[BTCoex], Action 2-Ant, algorithm = PAN(EDR)\n");
  2718. btc8723b2ant_action_pan_edr(btcoexist);
  2719. break;
  2720. case BT_8723B_2ANT_COEX_ALGO_PANHS:
  2721. btc_alg_dbg(ALGO_TRACE,
  2722. "[BTCoex], Action 2-Ant, algorithm = HS mode\n");
  2723. btc8723b2ant_action_pan_hs(btcoexist);
  2724. break;
  2725. case BT_8723B_2ANT_COEX_ALGO_PANEDR_A2DP:
  2726. btc_alg_dbg(ALGO_TRACE,
  2727. "[BTCoex], Action 2-Ant, algorithm = PAN+A2DP\n");
  2728. btc8723b2ant_action_pan_edr_a2dp(btcoexist);
  2729. break;
  2730. case BT_8723B_2ANT_COEX_ALGO_PANEDR_HID:
  2731. btc_alg_dbg(ALGO_TRACE,
  2732. "[BTCoex], Action 2-Ant, algorithm = PAN(EDR)+HID\n");
  2733. btc8723b2ant_action_pan_edr_hid(btcoexist);
  2734. break;
  2735. case BT_8723B_2ANT_COEX_ALGO_HID_A2DP_PANEDR:
  2736. btc_alg_dbg(ALGO_TRACE,
  2737. "[BTCoex], Action 2-Ant, algorithm = HID+A2DP+PAN\n");
  2738. btc8723b2ant_action_hid_a2dp_pan_edr(btcoexist);
  2739. break;
  2740. case BT_8723B_2ANT_COEX_ALGO_HID_A2DP:
  2741. btc_alg_dbg(ALGO_TRACE,
  2742. "[BTCoex], Action 2-Ant, algorithm = HID+A2DP\n");
  2743. btc8723b2ant_action_hid_a2dp(btcoexist);
  2744. break;
  2745. default:
  2746. btc_alg_dbg(ALGO_TRACE,
  2747. "[BTCoex], Action 2-Ant, algorithm = coexist All Off!!\n");
  2748. btc8723b2ant_coex_alloff(btcoexist);
  2749. break;
  2750. }
  2751. coex_dm->pre_algorithm = coex_dm->cur_algorithm;
  2752. }
  2753. }
  2754. static void btc8723b2ant_wifioff_hwcfg(struct btc_coexist *btcoexist)
  2755. {
  2756. /* set wlan_act to low */
  2757. btcoexist->btc_write_1byte(btcoexist, 0x76e, 0x4);
  2758. /* Force GNT_BT to High */
  2759. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x765, 0x18, 0x3);
  2760. /* BT select s0/s1 is controlled by BT */
  2761. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x67, 0x20, 0x0);
  2762. }
  2763. /*********************************************************************
  2764. * work around function start with wa_btc8723b2ant_
  2765. *********************************************************************/
  2766. /*********************************************************************
  2767. * extern function start with EXbtc8723b2ant_
  2768. *********************************************************************/
  2769. void ex_btc8723b2ant_init_hwconfig(struct btc_coexist *btcoexist)
  2770. {
  2771. u8 u8tmp = 0;
  2772. btc_iface_dbg(INTF_INIT,
  2773. "[BTCoex], 2Ant Init HW Config!!\n");
  2774. coex_dm->bt_rf0x1e_backup =
  2775. btcoexist->btc_get_rf_reg(btcoexist, BTC_RF_A, 0x1e, 0xfffff);
  2776. /* 0x790[5:0] = 0x5 */
  2777. u8tmp = btcoexist->btc_read_1byte(btcoexist, 0x790);
  2778. u8tmp &= 0xc0;
  2779. u8tmp |= 0x5;
  2780. btcoexist->btc_write_1byte(btcoexist, 0x790, u8tmp);
  2781. /*Antenna config */
  2782. btc8723b2ant_set_ant_path(btcoexist, BTC_ANT_WIFI_AT_MAIN,
  2783. true, false);
  2784. /* PTA parameter */
  2785. btc8723b_coex_tbl_type(btcoexist, FORCE_EXEC, 0);
  2786. /* Enable counter statistics */
  2787. /*0x76e[3] =1, WLAN_Act control by PTA*/
  2788. btcoexist->btc_write_1byte(btcoexist, 0x76e, 0xc);
  2789. btcoexist->btc_write_1byte(btcoexist, 0x778, 0x3);
  2790. btcoexist->btc_write_1byte_bitmask(btcoexist, 0x40, 0x20, 0x1);
  2791. }
  2792. void ex_btc8723b2ant_init_coex_dm(struct btc_coexist *btcoexist)
  2793. {
  2794. btc_iface_dbg(INTF_INIT,
  2795. "[BTCoex], Coex Mechanism Init!!\n");
  2796. btc8723b2ant_init_coex_dm(btcoexist);
  2797. }
  2798. void ex_btc8723b2ant_display_coex_info(struct btc_coexist *btcoexist)
  2799. {
  2800. struct btc_board_info *board_info = &btcoexist->board_info;
  2801. struct btc_stack_info *stack_info = &btcoexist->stack_info;
  2802. struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
  2803. struct rtl_priv *rtlpriv = btcoexist->adapter;
  2804. u8 u8tmp[4], i, bt_info_ext, ps_tdma_case = 0;
  2805. u32 u32tmp[4];
  2806. bool roam = false, scan = false;
  2807. bool link = false, wifi_under_5g = false;
  2808. bool bt_hs_on = false, wifi_busy = false;
  2809. s32 wifi_rssi = 0, bt_hs_rssi = 0;
  2810. u32 wifi_bw, wifi_traffic_dir, fa_ofdm, fa_cck;
  2811. u8 wifi_dot11_chnl, wifi_hs_chnl;
  2812. u32 fw_ver = 0, bt_patch_ver = 0;
  2813. u8 ap_num = 0;
  2814. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
  2815. "\r\n ============[BT Coexist info]============");
  2816. if (btcoexist->manual_control) {
  2817. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
  2818. "\r\n ==========[Under Manual Control]============");
  2819. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
  2820. "\r\n ==========================================");
  2821. }
  2822. if (!board_info->bt_exist) {
  2823. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n BT not exists !!!");
  2824. return;
  2825. }
  2826. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %d/ %d ",
  2827. "Ant PG number/ Ant mechanism:",
  2828. board_info->pg_ant_num, board_info->btdm_ant_num);
  2829. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %s / %d",
  2830. "BT stack/ hci ext ver",
  2831. ((stack_info->profile_notified) ? "Yes" : "No"),
  2832. stack_info->hci_version);
  2833. btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER, &bt_patch_ver);
  2834. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
  2835. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
  2836. "\r\n %-35s = %d_%x/ 0x%x/ 0x%x(%d)",
  2837. "CoexVer/ FwVer/ PatchVer",
  2838. glcoex_ver_date_8723b_2ant, glcoex_ver_8723b_2ant,
  2839. fw_ver, bt_patch_ver, bt_patch_ver);
  2840. btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on);
  2841. btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_DOT11_CHNL,
  2842. &wifi_dot11_chnl);
  2843. btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifi_hs_chnl);
  2844. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %d / %d(%d)",
  2845. "Dot11 channel / HsChnl(HsMode)",
  2846. wifi_dot11_chnl, wifi_hs_chnl, bt_hs_on);
  2847. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %3ph ",
  2848. "H2C Wifi inform bt chnl Info", coex_dm->wifi_chnl_info);
  2849. btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi);
  2850. btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi);
  2851. btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM, &ap_num);
  2852. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %d/ %d/ %d",
  2853. "Wifi rssi/ HS rssi/ AP#", wifi_rssi, bt_hs_rssi, ap_num);
  2854. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan);
  2855. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link);
  2856. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam);
  2857. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %d/ %d/ %d ",
  2858. "Wifi link/ roam/ scan", link, roam, scan);
  2859. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g);
  2860. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw);
  2861. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
  2862. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION,
  2863. &wifi_traffic_dir);
  2864. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %s / %s/ %s ",
  2865. "Wifi status", (wifi_under_5g ? "5G" : "2.4G"),
  2866. ((BTC_WIFI_BW_LEGACY == wifi_bw) ? "Legacy" :
  2867. (((BTC_WIFI_BW_HT40 == wifi_bw) ? "HT40" : "HT20"))),
  2868. ((!wifi_busy) ? "idle" :
  2869. ((BTC_WIFI_TRAFFIC_TX == wifi_traffic_dir) ?
  2870. "uplink" : "downlink")));
  2871. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %d / %d / %d / %d",
  2872. "SCO/HID/PAN/A2DP",
  2873. bt_link_info->sco_exist, bt_link_info->hid_exist,
  2874. bt_link_info->pan_exist, bt_link_info->a2dp_exist);
  2875. btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_BT_LINK_INFO);
  2876. bt_info_ext = coex_sta->bt_info_ext;
  2877. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %s",
  2878. "BT Info A2DP rate",
  2879. (bt_info_ext&BIT0) ? "Basic rate" : "EDR rate");
  2880. for (i = 0; i < BT_INFO_SRC_8723B_2ANT_MAX; i++) {
  2881. if (coex_sta->bt_info_c2h_cnt[i]) {
  2882. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
  2883. "\r\n %-35s = %7ph(%d)",
  2884. glbt_info_src_8723b_2ant[i],
  2885. coex_sta->bt_info_c2h[i],
  2886. coex_sta->bt_info_c2h_cnt[i]);
  2887. }
  2888. }
  2889. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %s/%s",
  2890. "PS state, IPS/LPS",
  2891. ((coex_sta->under_ips ? "IPS ON" : "IPS OFF")),
  2892. ((coex_sta->under_lps ? "LPS ON" : "LPS OFF")));
  2893. btcoexist->btc_disp_dbg_msg(btcoexist, BTC_DBG_DISP_FW_PWR_MODE_CMD);
  2894. /* Sw mechanism */
  2895. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
  2896. "\r\n %-35s", "============[Sw mechanism]============");
  2897. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %d/ %d/ %d ",
  2898. "SM1[ShRf/ LpRA/ LimDig]", coex_dm->cur_rf_rx_lpf_shrink,
  2899. coex_dm->cur_low_penalty_ra, coex_dm->limited_dig);
  2900. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %d/ %d/ %d(0x%x) ",
  2901. "SM2[AgcT/ AdcB/ SwDacSwing(lvl)]",
  2902. coex_dm->cur_agc_table_en, coex_dm->cur_adc_back_off,
  2903. coex_dm->cur_dac_swing_on, coex_dm->cur_dac_swing_lvl);
  2904. /* Fw mechanism */
  2905. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s",
  2906. "============[Fw mechanism]============");
  2907. ps_tdma_case = coex_dm->cur_ps_tdma;
  2908. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
  2909. "\r\n %-35s = %5ph case-%d (auto:%d)",
  2910. "PS TDMA", coex_dm->ps_tdma_para,
  2911. ps_tdma_case, coex_dm->auto_tdma_adjust);
  2912. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %d/ %d ",
  2913. "DecBtPwr/ IgnWlanAct", coex_dm->cur_dec_bt_pwr,
  2914. coex_dm->cur_ignore_wlan_act);
  2915. /* Hw setting */
  2916. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s",
  2917. "============[Hw setting]============");
  2918. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = 0x%x",
  2919. "RF-A, 0x1e initVal", coex_dm->bt_rf0x1e_backup);
  2920. u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x778);
  2921. u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x880);
  2922. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = 0x%x/ 0x%x",
  2923. "0x778/0x880[29:25]", u8tmp[0],
  2924. (u32tmp[0]&0x3e000000) >> 25);
  2925. u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x948);
  2926. u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x67);
  2927. u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x765);
  2928. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
  2929. "0x948/ 0x67[5] / 0x765",
  2930. u32tmp[0], ((u8tmp[0]&0x20) >> 5), u8tmp[1]);
  2931. u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x92c);
  2932. u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x930);
  2933. u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x944);
  2934. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
  2935. "0x92c[1:0]/ 0x930[7:0]/0x944[1:0]",
  2936. u32tmp[0]&0x3, u32tmp[1]&0xff, u32tmp[2]&0x3);
  2937. u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x39);
  2938. u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0x40);
  2939. u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x4c);
  2940. u8tmp[2] = btcoexist->btc_read_1byte(btcoexist, 0x64);
  2941. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
  2942. "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
  2943. "0x38[11]/0x40/0x4c[24:23]/0x64[0]",
  2944. ((u8tmp[0] & 0x8)>>3), u8tmp[1],
  2945. ((u32tmp[0]&0x01800000)>>23), u8tmp[2]&0x1);
  2946. u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x550);
  2947. u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x522);
  2948. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = 0x%x/ 0x%x",
  2949. "0x550(bcn ctrl)/0x522", u32tmp[0], u8tmp[0]);
  2950. u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xc50);
  2951. u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x49c);
  2952. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = 0x%x/ 0x%x",
  2953. "0xc50(dig)/0x49c(null-drop)", u32tmp[0]&0xff, u8tmp[0]);
  2954. u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0xda0);
  2955. u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0xda4);
  2956. u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0xda8);
  2957. u32tmp[3] = btcoexist->btc_read_4byte(btcoexist, 0xcf0);
  2958. u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0xa5b);
  2959. u8tmp[1] = btcoexist->btc_read_1byte(btcoexist, 0xa5c);
  2960. fa_ofdm = ((u32tmp[0]&0xffff0000) >> 16) +
  2961. ((u32tmp[1]&0xffff0000) >> 16) +
  2962. (u32tmp[1] & 0xffff) +
  2963. (u32tmp[2] & 0xffff) +
  2964. ((u32tmp[3]&0xffff0000) >> 16) +
  2965. (u32tmp[3] & 0xffff);
  2966. fa_cck = (u8tmp[0] << 8) + u8tmp[1];
  2967. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = 0x%x/ 0x%x/ 0x%x",
  2968. "OFDM-CCA/OFDM-FA/CCK-FA",
  2969. u32tmp[0]&0xffff, fa_ofdm, fa_cck);
  2970. u32tmp[0] = btcoexist->btc_read_4byte(btcoexist, 0x6c0);
  2971. u32tmp[1] = btcoexist->btc_read_4byte(btcoexist, 0x6c4);
  2972. u32tmp[2] = btcoexist->btc_read_4byte(btcoexist, 0x6c8);
  2973. u8tmp[0] = btcoexist->btc_read_1byte(btcoexist, 0x6cc);
  2974. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
  2975. "\r\n %-35s = 0x%x/ 0x%x/ 0x%x/ 0x%x",
  2976. "0x6c0/0x6c4/0x6c8/0x6cc(coexTable)",
  2977. u32tmp[0], u32tmp[1], u32tmp[2], u8tmp[0]);
  2978. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %d/ %d",
  2979. "0x770(high-pri rx/tx)",
  2980. coex_sta->high_priority_rx, coex_sta->high_priority_tx);
  2981. RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "\r\n %-35s = %d/ %d",
  2982. "0x774(low-pri rx/tx)", coex_sta->low_priority_rx,
  2983. coex_sta->low_priority_tx);
  2984. #if (BT_AUTO_REPORT_ONLY_8723B_2ANT == 1)
  2985. btc8723b2ant_monitor_bt_ctr(btcoexist);
  2986. #endif
  2987. btcoexist->btc_disp_dbg_msg(btcoexist,
  2988. BTC_DBG_DISP_COEX_STATISTICS);
  2989. }
  2990. void ex_btc8723b2ant_ips_notify(struct btc_coexist *btcoexist, u8 type)
  2991. {
  2992. if (BTC_IPS_ENTER == type) {
  2993. btc_iface_dbg(INTF_NOTIFY,
  2994. "[BTCoex], IPS ENTER notify\n");
  2995. coex_sta->under_ips = true;
  2996. btc8723b2ant_wifioff_hwcfg(btcoexist);
  2997. btc8723b2ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
  2998. btc8723b2ant_coex_alloff(btcoexist);
  2999. } else if (BTC_IPS_LEAVE == type) {
  3000. btc_iface_dbg(INTF_NOTIFY,
  3001. "[BTCoex], IPS LEAVE notify\n");
  3002. coex_sta->under_ips = false;
  3003. ex_btc8723b2ant_init_hwconfig(btcoexist);
  3004. btc8723b2ant_init_coex_dm(btcoexist);
  3005. btc8723b2ant_query_bt_info(btcoexist);
  3006. }
  3007. }
  3008. void ex_btc8723b2ant_lps_notify(struct btc_coexist *btcoexist, u8 type)
  3009. {
  3010. if (BTC_LPS_ENABLE == type) {
  3011. btc_iface_dbg(INTF_NOTIFY,
  3012. "[BTCoex], LPS ENABLE notify\n");
  3013. coex_sta->under_lps = true;
  3014. } else if (BTC_LPS_DISABLE == type) {
  3015. btc_iface_dbg(INTF_NOTIFY,
  3016. "[BTCoex], LPS DISABLE notify\n");
  3017. coex_sta->under_lps = false;
  3018. }
  3019. }
  3020. void ex_btc8723b2ant_scan_notify(struct btc_coexist *btcoexist, u8 type)
  3021. {
  3022. if (BTC_SCAN_START == type)
  3023. btc_iface_dbg(INTF_NOTIFY,
  3024. "[BTCoex], SCAN START notify\n");
  3025. else if (BTC_SCAN_FINISH == type)
  3026. btc_iface_dbg(INTF_NOTIFY,
  3027. "[BTCoex], SCAN FINISH notify\n");
  3028. }
  3029. void ex_btc8723b2ant_connect_notify(struct btc_coexist *btcoexist, u8 type)
  3030. {
  3031. if (BTC_ASSOCIATE_START == type)
  3032. btc_iface_dbg(INTF_NOTIFY,
  3033. "[BTCoex], CONNECT START notify\n");
  3034. else if (BTC_ASSOCIATE_FINISH == type)
  3035. btc_iface_dbg(INTF_NOTIFY,
  3036. "[BTCoex], CONNECT FINISH notify\n");
  3037. }
  3038. void ex_btc8723b2ant_media_status_notify(struct btc_coexist *btcoexist,
  3039. u8 type)
  3040. {
  3041. u8 h2c_parameter[3] = {0};
  3042. u32 wifi_bw;
  3043. u8 wifi_central_chnl;
  3044. if (BTC_MEDIA_CONNECT == type)
  3045. btc_iface_dbg(INTF_NOTIFY,
  3046. "[BTCoex], MEDIA connect notify\n");
  3047. else
  3048. btc_iface_dbg(INTF_NOTIFY,
  3049. "[BTCoex], MEDIA disconnect notify\n");
  3050. /* only 2.4G we need to inform bt the chnl mask */
  3051. btcoexist->btc_get(btcoexist,
  3052. BTC_GET_U1_WIFI_CENTRAL_CHNL, &wifi_central_chnl);
  3053. if ((BTC_MEDIA_CONNECT == type) &&
  3054. (wifi_central_chnl <= 14)) {
  3055. h2c_parameter[0] = 0x1;
  3056. h2c_parameter[1] = wifi_central_chnl;
  3057. btcoexist->btc_get(btcoexist,
  3058. BTC_GET_U4_WIFI_BW, &wifi_bw);
  3059. if (BTC_WIFI_BW_HT40 == wifi_bw)
  3060. h2c_parameter[2] = 0x30;
  3061. else
  3062. h2c_parameter[2] = 0x20;
  3063. }
  3064. coex_dm->wifi_chnl_info[0] = h2c_parameter[0];
  3065. coex_dm->wifi_chnl_info[1] = h2c_parameter[1];
  3066. coex_dm->wifi_chnl_info[2] = h2c_parameter[2];
  3067. btc_alg_dbg(ALGO_TRACE_FW_EXEC,
  3068. "[BTCoex], FW write 0x66=0x%x\n",
  3069. h2c_parameter[0] << 16 | h2c_parameter[1] << 8 |
  3070. h2c_parameter[2]);
  3071. btcoexist->btc_fill_h2c(btcoexist, 0x66, 3, h2c_parameter);
  3072. }
  3073. void ex_btc8723b2ant_special_packet_notify(struct btc_coexist *btcoexist,
  3074. u8 type)
  3075. {
  3076. if (type == BTC_PACKET_DHCP)
  3077. btc_iface_dbg(INTF_NOTIFY,
  3078. "[BTCoex], DHCP Packet notify\n");
  3079. }
  3080. void ex_btc8723b2ant_bt_info_notify(struct btc_coexist *btcoexist,
  3081. u8 *tmpbuf, u8 length)
  3082. {
  3083. u8 bt_info = 0;
  3084. u8 i, rsp_source = 0;
  3085. bool bt_busy = false, limited_dig = false;
  3086. bool wifi_connected = false;
  3087. coex_sta->c2h_bt_info_req_sent = false;
  3088. rsp_source = tmpbuf[0]&0xf;
  3089. if (rsp_source >= BT_INFO_SRC_8723B_2ANT_MAX)
  3090. rsp_source = BT_INFO_SRC_8723B_2ANT_WIFI_FW;
  3091. coex_sta->bt_info_c2h_cnt[rsp_source]++;
  3092. btc_iface_dbg(INTF_NOTIFY,
  3093. "[BTCoex], Bt info[%d], length=%d, hex data=[",
  3094. rsp_source, length);
  3095. for (i = 0; i < length; i++) {
  3096. coex_sta->bt_info_c2h[rsp_source][i] = tmpbuf[i];
  3097. if (i == 1)
  3098. bt_info = tmpbuf[i];
  3099. if (i == length-1)
  3100. btc_iface_dbg(INTF_NOTIFY,
  3101. "0x%02x]\n", tmpbuf[i]);
  3102. else
  3103. btc_iface_dbg(INTF_NOTIFY,
  3104. "0x%02x, ", tmpbuf[i]);
  3105. }
  3106. if (btcoexist->manual_control) {
  3107. btc_alg_dbg(ALGO_TRACE,
  3108. "[BTCoex], BtInfoNotify(), return for Manual CTRL<===\n");
  3109. return;
  3110. }
  3111. if (BT_INFO_SRC_8723B_2ANT_WIFI_FW != rsp_source) {
  3112. coex_sta->bt_retry_cnt = /* [3:0]*/
  3113. coex_sta->bt_info_c2h[rsp_source][2] & 0xf;
  3114. coex_sta->bt_rssi =
  3115. coex_sta->bt_info_c2h[rsp_source][3] * 2 + 10;
  3116. coex_sta->bt_info_ext =
  3117. coex_sta->bt_info_c2h[rsp_source][4];
  3118. /* Here we need to resend some wifi info to BT
  3119. because bt is reset and loss of the info.
  3120. */
  3121. if ((coex_sta->bt_info_ext & BIT1)) {
  3122. btc_alg_dbg(ALGO_TRACE,
  3123. "[BTCoex], BT ext info bit1 check, send wifi BW&Chnl to BT!!\n");
  3124. btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_CONNECTED,
  3125. &wifi_connected);
  3126. if (wifi_connected)
  3127. ex_btc8723b2ant_media_status_notify(
  3128. btcoexist,
  3129. BTC_MEDIA_CONNECT);
  3130. else
  3131. ex_btc8723b2ant_media_status_notify(
  3132. btcoexist,
  3133. BTC_MEDIA_DISCONNECT);
  3134. }
  3135. if ((coex_sta->bt_info_ext & BIT3)) {
  3136. btc_alg_dbg(ALGO_TRACE,
  3137. "[BTCoex], BT ext info bit3 check, set BT NOT to ignore Wlan active!!\n");
  3138. btc8723b2ant_ignore_wlan_act(btcoexist, FORCE_EXEC,
  3139. false);
  3140. } else {
  3141. /* BT already NOT ignore Wlan active, do nothing here.*/
  3142. }
  3143. #if (BT_AUTO_REPORT_ONLY_8723B_2ANT == 0)
  3144. if ((coex_sta->bt_info_ext & BIT4)) {
  3145. /* BT auto report already enabled, do nothing*/
  3146. } else {
  3147. btc8723b2ant_bt_auto_report(btcoexist, FORCE_EXEC,
  3148. true);
  3149. }
  3150. #endif
  3151. }
  3152. /* check BIT2 first ==> check if bt is under inquiry or page scan*/
  3153. if (bt_info & BT_INFO_8723B_2ANT_B_INQ_PAGE)
  3154. coex_sta->c2h_bt_inquiry_page = true;
  3155. else
  3156. coex_sta->c2h_bt_inquiry_page = false;
  3157. /* set link exist status*/
  3158. if (!(bt_info & BT_INFO_8723B_2ANT_B_CONNECTION)) {
  3159. coex_sta->bt_link_exist = false;
  3160. coex_sta->pan_exist = false;
  3161. coex_sta->a2dp_exist = false;
  3162. coex_sta->hid_exist = false;
  3163. coex_sta->sco_exist = false;
  3164. } else { /* connection exists */
  3165. coex_sta->bt_link_exist = true;
  3166. if (bt_info & BT_INFO_8723B_2ANT_B_FTP)
  3167. coex_sta->pan_exist = true;
  3168. else
  3169. coex_sta->pan_exist = false;
  3170. if (bt_info & BT_INFO_8723B_2ANT_B_A2DP)
  3171. coex_sta->a2dp_exist = true;
  3172. else
  3173. coex_sta->a2dp_exist = false;
  3174. if (bt_info & BT_INFO_8723B_2ANT_B_HID)
  3175. coex_sta->hid_exist = true;
  3176. else
  3177. coex_sta->hid_exist = false;
  3178. if (bt_info & BT_INFO_8723B_2ANT_B_SCO_ESCO)
  3179. coex_sta->sco_exist = true;
  3180. else
  3181. coex_sta->sco_exist = false;
  3182. }
  3183. btc8723b2ant_update_bt_link_info(btcoexist);
  3184. if (!(bt_info & BT_INFO_8723B_2ANT_B_CONNECTION)) {
  3185. coex_dm->bt_status = BT_8723B_2ANT_BT_STATUS_NON_CONNECTED_IDLE;
  3186. btc_alg_dbg(ALGO_TRACE,
  3187. "[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n");
  3188. /* connection exists but no busy */
  3189. } else if (bt_info == BT_INFO_8723B_2ANT_B_CONNECTION) {
  3190. coex_dm->bt_status = BT_8723B_2ANT_BT_STATUS_CONNECTED_IDLE;
  3191. btc_alg_dbg(ALGO_TRACE,
  3192. "[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n");
  3193. } else if ((bt_info & BT_INFO_8723B_2ANT_B_SCO_ESCO) ||
  3194. (bt_info & BT_INFO_8723B_2ANT_B_SCO_BUSY)) {
  3195. coex_dm->bt_status = BT_8723B_2ANT_BT_STATUS_SCO_BUSY;
  3196. btc_alg_dbg(ALGO_TRACE,
  3197. "[BTCoex], BtInfoNotify(), BT SCO busy!!!\n");
  3198. } else if (bt_info&BT_INFO_8723B_2ANT_B_ACL_BUSY) {
  3199. coex_dm->bt_status = BT_8723B_2ANT_BT_STATUS_ACL_BUSY;
  3200. btc_alg_dbg(ALGO_TRACE,
  3201. "[BTCoex], BtInfoNotify(), BT ACL busy!!!\n");
  3202. } else {
  3203. coex_dm->bt_status = BT_8723B_2ANT_BT_STATUS_MAX;
  3204. btc_alg_dbg(ALGO_TRACE,
  3205. "[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n");
  3206. }
  3207. if ((BT_8723B_2ANT_BT_STATUS_ACL_BUSY == coex_dm->bt_status) ||
  3208. (BT_8723B_2ANT_BT_STATUS_SCO_BUSY == coex_dm->bt_status) ||
  3209. (BT_8723B_2ANT_BT_STATUS_ACL_SCO_BUSY == coex_dm->bt_status)) {
  3210. bt_busy = true;
  3211. limited_dig = true;
  3212. } else {
  3213. bt_busy = false;
  3214. limited_dig = false;
  3215. }
  3216. btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_TRAFFIC_BUSY, &bt_busy);
  3217. coex_dm->limited_dig = limited_dig;
  3218. btcoexist->btc_set(btcoexist, BTC_SET_BL_BT_LIMITED_DIG, &limited_dig);
  3219. btc8723b2ant_run_coexist_mechanism(btcoexist);
  3220. }
  3221. void ex_btc8723b2ant_halt_notify(struct btc_coexist *btcoexist)
  3222. {
  3223. btc_iface_dbg(INTF_NOTIFY, "[BTCoex], Halt notify\n");
  3224. btc8723b2ant_wifioff_hwcfg(btcoexist);
  3225. btc8723b2ant_ignore_wlan_act(btcoexist, FORCE_EXEC, true);
  3226. ex_btc8723b2ant_media_status_notify(btcoexist, BTC_MEDIA_DISCONNECT);
  3227. }
  3228. void ex_btc8723b2ant_periodical(struct btc_coexist *btcoexist)
  3229. {
  3230. struct btc_board_info *board_info = &btcoexist->board_info;
  3231. struct btc_stack_info *stack_info = &btcoexist->stack_info;
  3232. static u8 dis_ver_info_cnt;
  3233. u32 fw_ver = 0, bt_patch_ver = 0;
  3234. btc_alg_dbg(ALGO_TRACE,
  3235. "[BTCoex], ==========================Periodical===========================\n");
  3236. if (dis_ver_info_cnt <= 5) {
  3237. dis_ver_info_cnt += 1;
  3238. btc_iface_dbg(INTF_INIT,
  3239. "[BTCoex], ****************************************************************\n");
  3240. btc_iface_dbg(INTF_INIT,
  3241. "[BTCoex], Ant PG Num/ Ant Mech/ Ant Pos = %d/ %d/ %d\n",
  3242. board_info->pg_ant_num,
  3243. board_info->btdm_ant_num,
  3244. board_info->btdm_ant_pos);
  3245. btc_iface_dbg(INTF_INIT,
  3246. "[BTCoex], BT stack/ hci ext ver = %s / %d\n",
  3247. stack_info->profile_notified ? "Yes" : "No",
  3248. stack_info->hci_version);
  3249. btcoexist->btc_get(btcoexist, BTC_GET_U4_BT_PATCH_VER,
  3250. &bt_patch_ver);
  3251. btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_FW_VER, &fw_ver);
  3252. btc_iface_dbg(INTF_INIT,
  3253. "[BTCoex], CoexVer/ fw_ver/ PatchVer = %d_%x/ 0x%x/ 0x%x(%d)\n",
  3254. glcoex_ver_date_8723b_2ant, glcoex_ver_8723b_2ant,
  3255. fw_ver, bt_patch_ver, bt_patch_ver);
  3256. btc_iface_dbg(INTF_INIT,
  3257. "[BTCoex], ****************************************************************\n");
  3258. }
  3259. #if (BT_AUTO_REPORT_ONLY_8723B_2ANT == 0)
  3260. btc8723b2ant_query_bt_info(btcoexist);
  3261. btc8723b2ant_monitor_bt_ctr(btcoexist);
  3262. btc8723b2ant_monitor_bt_enable_disable(btcoexist);
  3263. #else
  3264. if (btc8723b2ant_is_wifi_status_changed(btcoexist) ||
  3265. coex_dm->auto_tdma_adjust)
  3266. btc8723b2ant_run_coexist_mechanism(btcoexist);
  3267. #endif
  3268. }