rtw_mp.c 102 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2007 - 2017 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. *****************************************************************************/
  15. #define _RTW_MP_C_
  16. #include <drv_types.h>
  17. #ifdef PLATFORM_FREEBSD
  18. #include <sys/unistd.h> /* for RFHIGHPID */
  19. #endif
  20. #include "../hal/phydm/phydm_precomp.h"
  21. #if defined(CONFIG_RTL8723B) || defined(CONFIG_RTL8821A)
  22. #include <rtw_bt_mp.h>
  23. #endif
  24. #ifdef CONFIG_MP_VHT_HW_TX_MODE
  25. #define CEILING_POS(X) ((X - (int)(X)) > 0 ? (int)(X + 1) : (int)(X))
  26. #define CEILING_NEG(X) ((X - (int)(X)) < 0 ? (int)(X - 1) : (int)(X))
  27. #define ceil(X) (((X) > 0) ? CEILING_POS(X) : CEILING_NEG(X))
  28. int rtfloor(float x)
  29. {
  30. int i = x - 2;
  31. while
  32. (++i <= x - 1)
  33. ;
  34. return i;
  35. }
  36. #endif
  37. #ifdef CONFIG_MP_INCLUDED
  38. u32 read_macreg(_adapter *padapter, u32 addr, u32 sz)
  39. {
  40. u32 val = 0;
  41. switch (sz) {
  42. case 1:
  43. val = rtw_read8(padapter, addr);
  44. break;
  45. case 2:
  46. val = rtw_read16(padapter, addr);
  47. break;
  48. case 4:
  49. val = rtw_read32(padapter, addr);
  50. break;
  51. default:
  52. val = 0xffffffff;
  53. break;
  54. }
  55. return val;
  56. }
  57. void write_macreg(_adapter *padapter, u32 addr, u32 val, u32 sz)
  58. {
  59. switch (sz) {
  60. case 1:
  61. rtw_write8(padapter, addr, (u8)val);
  62. break;
  63. case 2:
  64. rtw_write16(padapter, addr, (u16)val);
  65. break;
  66. case 4:
  67. rtw_write32(padapter, addr, val);
  68. break;
  69. default:
  70. break;
  71. }
  72. }
  73. u32 read_bbreg(_adapter *padapter, u32 addr, u32 bitmask)
  74. {
  75. return rtw_hal_read_bbreg(padapter, addr, bitmask);
  76. }
  77. void write_bbreg(_adapter *padapter, u32 addr, u32 bitmask, u32 val)
  78. {
  79. rtw_hal_write_bbreg(padapter, addr, bitmask, val);
  80. }
  81. u32 _read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask)
  82. {
  83. return rtw_hal_read_rfreg(padapter, rfpath, addr, bitmask);
  84. }
  85. void _write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 bitmask, u32 val)
  86. {
  87. rtw_hal_write_rfreg(padapter, rfpath, addr, bitmask, val);
  88. }
  89. u32 read_rfreg(PADAPTER padapter, u8 rfpath, u32 addr)
  90. {
  91. return _read_rfreg(padapter, rfpath, addr, bRFRegOffsetMask);
  92. }
  93. void write_rfreg(PADAPTER padapter, u8 rfpath, u32 addr, u32 val)
  94. {
  95. _write_rfreg(padapter, rfpath, addr, bRFRegOffsetMask, val);
  96. }
  97. static void _init_mp_priv_(struct mp_priv *pmp_priv)
  98. {
  99. WLAN_BSSID_EX *pnetwork;
  100. _rtw_memset(pmp_priv, 0, sizeof(struct mp_priv));
  101. pmp_priv->mode = MP_OFF;
  102. pmp_priv->channel = 1;
  103. pmp_priv->bandwidth = CHANNEL_WIDTH_20;
  104. pmp_priv->prime_channel_offset = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
  105. pmp_priv->rateidx = RATE_1M;
  106. pmp_priv->txpoweridx = 0x2A;
  107. pmp_priv->antenna_tx = ANTENNA_A;
  108. pmp_priv->antenna_rx = ANTENNA_AB;
  109. pmp_priv->check_mp_pkt = 0;
  110. pmp_priv->tx_pktcount = 0;
  111. pmp_priv->rx_bssidpktcount = 0;
  112. pmp_priv->rx_pktcount = 0;
  113. pmp_priv->rx_crcerrpktcount = 0;
  114. pmp_priv->network_macaddr[0] = 0x00;
  115. pmp_priv->network_macaddr[1] = 0xE0;
  116. pmp_priv->network_macaddr[2] = 0x4C;
  117. pmp_priv->network_macaddr[3] = 0x87;
  118. pmp_priv->network_macaddr[4] = 0x66;
  119. pmp_priv->network_macaddr[5] = 0x55;
  120. pmp_priv->bSetRxBssid = _FALSE;
  121. pmp_priv->bRTWSmbCfg = _FALSE;
  122. pmp_priv->bloopback = _FALSE;
  123. pmp_priv->bloadefusemap = _FALSE;
  124. pmp_priv->brx_filter_beacon = _FALSE;
  125. pnetwork = &pmp_priv->mp_network.network;
  126. _rtw_memcpy(pnetwork->MacAddress, pmp_priv->network_macaddr, ETH_ALEN);
  127. pnetwork->Ssid.SsidLength = 8;
  128. _rtw_memcpy(pnetwork->Ssid.Ssid, "mp_871x", pnetwork->Ssid.SsidLength);
  129. pmp_priv->tx.payload = 2;
  130. #ifdef CONFIG_80211N_HT
  131. pmp_priv->tx.attrib.ht_en = 1;
  132. #endif
  133. pmp_priv->mpt_ctx.mpt_rate_index = 1;
  134. }
  135. #ifdef PLATFORM_WINDOWS
  136. #if 0
  137. void mp_wi_callback(
  138. IN NDIS_WORK_ITEM *pwk_item,
  139. IN PVOID cntx
  140. )
  141. {
  142. _adapter *padapter = (_adapter *)cntx;
  143. struct mp_priv *pmppriv = &padapter->mppriv;
  144. struct mp_wi_cntx *pmp_wi_cntx = &pmppriv->wi_cntx;
  145. /* Execute specified action. */
  146. if (pmp_wi_cntx->curractfunc != NULL) {
  147. LARGE_INTEGER cur_time;
  148. ULONGLONG start_time, end_time;
  149. NdisGetCurrentSystemTime(&cur_time); /* driver version */
  150. start_time = cur_time.QuadPart / 10; /* The return value is in microsecond */
  151. pmp_wi_cntx->curractfunc(padapter);
  152. NdisGetCurrentSystemTime(&cur_time); /* driver version */
  153. end_time = cur_time.QuadPart / 10; /* The return value is in microsecond */
  154. }
  155. NdisAcquireSpinLock(&(pmp_wi_cntx->mp_wi_lock));
  156. pmp_wi_cntx->bmp_wi_progress = _FALSE;
  157. NdisReleaseSpinLock(&(pmp_wi_cntx->mp_wi_lock));
  158. if (pmp_wi_cntx->bmpdrv_unload)
  159. NdisSetEvent(&(pmp_wi_cntx->mp_wi_evt));
  160. }
  161. #endif
  162. static int init_mp_priv_by_os(struct mp_priv *pmp_priv)
  163. {
  164. struct mp_wi_cntx *pmp_wi_cntx;
  165. if (pmp_priv == NULL)
  166. return _FAIL;
  167. pmp_priv->rx_testcnt = 0;
  168. pmp_priv->rx_testcnt1 = 0;
  169. pmp_priv->rx_testcnt2 = 0;
  170. pmp_priv->tx_testcnt = 0;
  171. pmp_priv->tx_testcnt1 = 0;
  172. pmp_wi_cntx = &pmp_priv->wi_cntx
  173. pmp_wi_cntx->bmpdrv_unload = _FALSE;
  174. pmp_wi_cntx->bmp_wi_progress = _FALSE;
  175. pmp_wi_cntx->curractfunc = NULL;
  176. return _SUCCESS;
  177. }
  178. #endif
  179. #ifdef PLATFORM_LINUX
  180. #if 0
  181. static int init_mp_priv_by_os(struct mp_priv *pmp_priv)
  182. {
  183. int i, res;
  184. struct mp_xmit_frame *pmp_xmitframe;
  185. if (pmp_priv == NULL)
  186. return _FAIL;
  187. _rtw_init_queue(&pmp_priv->free_mp_xmitqueue);
  188. pmp_priv->pallocated_mp_xmitframe_buf = NULL;
  189. pmp_priv->pallocated_mp_xmitframe_buf = rtw_zmalloc(NR_MP_XMITFRAME * sizeof(struct mp_xmit_frame) + 4);
  190. if (pmp_priv->pallocated_mp_xmitframe_buf == NULL) {
  191. res = _FAIL;
  192. goto _exit_init_mp_priv;
  193. }
  194. pmp_priv->pmp_xmtframe_buf = pmp_priv->pallocated_mp_xmitframe_buf + 4 - ((SIZE_PTR)(pmp_priv->pallocated_mp_xmitframe_buf) & 3);
  195. pmp_xmitframe = (struct mp_xmit_frame *)pmp_priv->pmp_xmtframe_buf;
  196. for (i = 0; i < NR_MP_XMITFRAME; i++) {
  197. _rtw_init_listhead(&pmp_xmitframe->list);
  198. rtw_list_insert_tail(&pmp_xmitframe->list, &pmp_priv->free_mp_xmitqueue.queue);
  199. pmp_xmitframe->pkt = NULL;
  200. pmp_xmitframe->frame_tag = MP_FRAMETAG;
  201. pmp_xmitframe->padapter = pmp_priv->papdater;
  202. pmp_xmitframe++;
  203. }
  204. pmp_priv->free_mp_xmitframe_cnt = NR_MP_XMITFRAME;
  205. res = _SUCCESS;
  206. _exit_init_mp_priv:
  207. return res;
  208. }
  209. #endif
  210. #endif
  211. static void mp_init_xmit_attrib(struct mp_tx *pmptx, PADAPTER padapter)
  212. {
  213. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  214. struct pkt_attrib *pattrib;
  215. /* init xmitframe attribute */
  216. pattrib = &pmptx->attrib;
  217. _rtw_memset(pattrib, 0, sizeof(struct pkt_attrib));
  218. _rtw_memset(pmptx->desc, 0, TXDESC_SIZE);
  219. pattrib->ether_type = 0x8712;
  220. #if 0
  221. _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);
  222. _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  223. #endif
  224. _rtw_memset(pattrib->dst, 0xFF, ETH_ALEN);
  225. /* pattrib->dhcp_pkt = 0;
  226. * pattrib->pktlen = 0; */
  227. pattrib->ack_policy = 0;
  228. /* pattrib->pkt_hdrlen = ETH_HLEN; */
  229. pattrib->hdrlen = WLAN_HDR_A3_LEN;
  230. pattrib->subtype = WIFI_DATA;
  231. pattrib->priority = 0;
  232. pattrib->qsel = pattrib->priority;
  233. /* do_queue_select(padapter, pattrib); */
  234. pattrib->nr_frags = 1;
  235. pattrib->encrypt = 0;
  236. pattrib->bswenc = _FALSE;
  237. pattrib->qos_en = _FALSE;
  238. pattrib->pktlen = 1500;
  239. if (pHalData->rf_type == RF_2T2R)
  240. pattrib->raid = RATEID_IDX_BGN_40M_2SS;
  241. else
  242. pattrib->raid = RATEID_IDX_BGN_40M_1SS;
  243. #ifdef CONFIG_80211AC_VHT
  244. if (pHalData->rf_type == RF_1T1R)
  245. pattrib->raid = RATEID_IDX_VHT_1SS;
  246. else if (pHalData->rf_type == RF_2T2R || pHalData->rf_type == RF_2T4R)
  247. pattrib->raid = RATEID_IDX_VHT_2SS;
  248. else if (pHalData->rf_type == RF_3T3R)
  249. pattrib->raid = RATEID_IDX_VHT_3SS;
  250. else
  251. pattrib->raid = RATEID_IDX_BGN_40M_1SS;
  252. #endif
  253. }
  254. s32 init_mp_priv(PADAPTER padapter)
  255. {
  256. struct mp_priv *pmppriv = &padapter->mppriv;
  257. PHAL_DATA_TYPE pHalData;
  258. pHalData = GET_HAL_DATA(padapter);
  259. _init_mp_priv_(pmppriv);
  260. pmppriv->papdater = padapter;
  261. pmppriv->mp_dm = 0;
  262. pmppriv->tx.stop = 1;
  263. pmppriv->bSetTxPower = 0; /*for manually set tx power*/
  264. pmppriv->bTxBufCkFail = _FALSE;
  265. pmppriv->pktInterval = 0;
  266. pmppriv->pktLength = 1000;
  267. mp_init_xmit_attrib(&pmppriv->tx, padapter);
  268. switch (padapter->registrypriv.rf_config) {
  269. case RF_1T1R:
  270. pmppriv->antenna_tx = ANTENNA_A;
  271. pmppriv->antenna_rx = ANTENNA_A;
  272. break;
  273. case RF_1T2R:
  274. default:
  275. pmppriv->antenna_tx = ANTENNA_A;
  276. pmppriv->antenna_rx = ANTENNA_AB;
  277. break;
  278. case RF_2T2R:
  279. pmppriv->antenna_tx = ANTENNA_AB;
  280. pmppriv->antenna_rx = ANTENNA_AB;
  281. break;
  282. case RF_2T4R:
  283. pmppriv->antenna_tx = ANTENNA_BC;
  284. pmppriv->antenna_rx = ANTENNA_ABCD;
  285. break;
  286. }
  287. pHalData->AntennaRxPath = pmppriv->antenna_rx;
  288. pHalData->antenna_tx_path = pmppriv->antenna_tx;
  289. return _SUCCESS;
  290. }
  291. void free_mp_priv(struct mp_priv *pmp_priv)
  292. {
  293. if (pmp_priv->pallocated_mp_xmitframe_buf) {
  294. rtw_mfree(pmp_priv->pallocated_mp_xmitframe_buf, 0);
  295. pmp_priv->pallocated_mp_xmitframe_buf = NULL;
  296. }
  297. pmp_priv->pmp_xmtframe_buf = NULL;
  298. }
  299. #if 0
  300. static VOID PHY_IQCalibrate_default(
  301. IN PADAPTER pAdapter,
  302. IN BOOLEAN bReCovery
  303. )
  304. {
  305. RTW_INFO("%s\n", __func__);
  306. }
  307. static VOID PHY_LCCalibrate_default(
  308. IN PADAPTER pAdapter
  309. )
  310. {
  311. RTW_INFO("%s\n", __func__);
  312. }
  313. static VOID PHY_SetRFPathSwitch_default(
  314. IN PADAPTER pAdapter,
  315. IN BOOLEAN bMain
  316. )
  317. {
  318. RTW_INFO("%s\n", __func__);
  319. }
  320. #endif
  321. void mpt_InitHWConfig(PADAPTER Adapter)
  322. {
  323. PHAL_DATA_TYPE hal;
  324. hal = GET_HAL_DATA(Adapter);
  325. if (IS_HARDWARE_TYPE_8723B(Adapter)) {
  326. /* TODO: <20130114, Kordan> The following setting is only for DPDT and Fixed board type. */
  327. /* TODO: A better solution is configure it according EFUSE during the run-time. */
  328. phy_set_mac_reg(Adapter, 0x64, BIT20, 0x0); /* 0x66[4]=0 */
  329. phy_set_mac_reg(Adapter, 0x64, BIT24, 0x0); /* 0x66[8]=0 */
  330. phy_set_mac_reg(Adapter, 0x40, BIT4, 0x0); /* 0x40[4]=0 */
  331. phy_set_mac_reg(Adapter, 0x40, BIT3, 0x1); /* 0x40[3]=1 */
  332. phy_set_mac_reg(Adapter, 0x4C, BIT24, 0x1); /* 0x4C[24:23]=10 */
  333. phy_set_mac_reg(Adapter, 0x4C, BIT23, 0x0); /* 0x4C[24:23]=10 */
  334. phy_set_bb_reg(Adapter, 0x944, BIT1 | BIT0, 0x3); /* 0x944[1:0]=11 */
  335. phy_set_bb_reg(Adapter, 0x930, bMaskByte0, 0x77);/* 0x930[7:0]=77 */
  336. phy_set_mac_reg(Adapter, 0x38, BIT11, 0x1);/* 0x38[11]=1 */
  337. /* TODO: <20130206, Kordan> The default setting is wrong, hard-coded here. */
  338. phy_set_mac_reg(Adapter, 0x778, 0x3, 0x3); /* Turn off hardware PTA control (Asked by Scott) */
  339. phy_set_mac_reg(Adapter, 0x64, bMaskDWord, 0x36000000);/* Fix BT S0/S1 */
  340. phy_set_mac_reg(Adapter, 0x948, bMaskDWord, 0x0); /* Fix BT can't Tx */
  341. /* <20130522, Kordan> Turn off equalizer to improve Rx sensitivity. (Asked by EEChou) */
  342. phy_set_bb_reg(Adapter, 0xA00, BIT8, 0x0); /*0xA01[0] = 0*/
  343. } else if (IS_HARDWARE_TYPE_8821(Adapter)) {
  344. /* <20131121, VincentL> Add for 8821AU DPDT setting and fix switching antenna issue (Asked by Rock)
  345. <20131122, VincentL> Enable for all 8821A/8811AU (Asked by Alex)*/
  346. phy_set_mac_reg(Adapter, 0x4C, BIT23, 0x0); /*0x4C[23:22]=01*/
  347. phy_set_mac_reg(Adapter, 0x4C, BIT22, 0x1); /*0x4C[23:22]=01*/
  348. } else if (IS_HARDWARE_TYPE_8188ES(Adapter))
  349. phy_set_mac_reg(Adapter, 0x4C , BIT23, 0); /*select DPDT_P and DPDT_N as output pin*/
  350. #ifdef CONFIG_RTL8814A
  351. else if (IS_HARDWARE_TYPE_8814A(Adapter))
  352. PlatformEFIOWrite2Byte(Adapter, REG_RXFLTMAP1_8814A, 0x2000);
  353. #endif
  354. #ifdef CONFIG_RTL8812A
  355. else if (IS_HARDWARE_TYPE_8812(Adapter)) {
  356. rtw_write32(Adapter, 0x520, rtw_read32(Adapter, 0x520) | 0x8000);
  357. rtw_write32(Adapter, 0x524, rtw_read32(Adapter, 0x524) & (~0x800));
  358. }
  359. #endif
  360. #ifdef CONFIG_RTL8822B
  361. else if (IS_HARDWARE_TYPE_8822B(Adapter)) {
  362. u32 tmp_reg = 0;
  363. PlatformEFIOWrite2Byte(Adapter, REG_RXFLTMAP1_8822B, 0x2000);
  364. /* fixed wifi can't 2.4g tx suggest by Szuyitasi 20160504 */
  365. phy_set_bb_reg(Adapter, 0x70, bMaskByte3, 0x0e);
  366. RTW_INFO(" 0x73 = 0x%x\n", phy_query_bb_reg(Adapter, 0x70, bMaskByte3));
  367. phy_set_bb_reg(Adapter, 0x1704, bMaskDWord, 0x0000ff00);
  368. RTW_INFO(" 0x1704 = 0x%x\n", phy_query_bb_reg(Adapter, 0x1704, bMaskDWord));
  369. phy_set_bb_reg(Adapter, 0x1700, bMaskDWord, 0xc00f0038);
  370. RTW_INFO(" 0x1700 = 0x%x\n", phy_query_bb_reg(Adapter, 0x1700, bMaskDWord));
  371. }
  372. #endif /* CONFIG_RTL8822B */
  373. #ifdef CONFIG_RTL8821C
  374. else if (IS_HARDWARE_TYPE_8821C(Adapter))
  375. PlatformEFIOWrite2Byte(Adapter, REG_RXFLTMAP1_8821C, 0x2000);
  376. #endif /* CONFIG_RTL8821C */
  377. #if defined(CONFIG_RTL8188F) || defined(CONFIG_RTL8188GTV)
  378. else if (IS_HARDWARE_TYPE_8188F(Adapter) || IS_HARDWARE_TYPE_8188GTV(Adapter)) {
  379. if (IS_A_CUT(hal->version_id) || IS_B_CUT(hal->version_id)) {
  380. RTW_INFO("%s() Active large power detection\n", __func__);
  381. phy_active_large_power_detection_8188f(&(GET_HAL_DATA(Adapter)->odmpriv));
  382. }
  383. }
  384. #endif
  385. }
  386. static void PHY_IQCalibrate(PADAPTER padapter, u8 bReCovery)
  387. {
  388. halrf_iqk_trigger(&(GET_HAL_DATA(padapter)->odmpriv), bReCovery);
  389. }
  390. static void PHY_LCCalibrate(PADAPTER padapter)
  391. {
  392. halrf_lck_trigger(&(GET_HAL_DATA(padapter)->odmpriv));
  393. }
  394. static u8 PHY_QueryRFPathSwitch(PADAPTER padapter)
  395. {
  396. u8 bmain = 0;
  397. /*
  398. if (IS_HARDWARE_TYPE_8723B(padapter)) {
  399. #ifdef CONFIG_RTL8723B
  400. bmain = PHY_QueryRFPathSwitch_8723B(padapter);
  401. #endif
  402. } else if (IS_HARDWARE_TYPE_8188E(padapter)) {
  403. #ifdef CONFIG_RTL8188E
  404. bmain = PHY_QueryRFPathSwitch_8188E(padapter);
  405. #endif
  406. } else if (IS_HARDWARE_TYPE_8814A(padapter)) {
  407. #ifdef CONFIG_RTL8814A
  408. bmain = PHY_QueryRFPathSwitch_8814A(padapter);
  409. #endif
  410. } else if (IS_HARDWARE_TYPE_8812(padapter) || IS_HARDWARE_TYPE_8821(padapter)) {
  411. #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)
  412. bmain = PHY_QueryRFPathSwitch_8812A(padapter);
  413. #endif
  414. } else if (IS_HARDWARE_TYPE_8192E(padapter)) {
  415. #ifdef CONFIG_RTL8192E
  416. bmain = PHY_QueryRFPathSwitch_8192E(padapter);
  417. #endif
  418. } else if (IS_HARDWARE_TYPE_8703B(padapter)) {
  419. #ifdef CONFIG_RTL8703B
  420. bmain = PHY_QueryRFPathSwitch_8703B(padapter);
  421. #endif
  422. } else if (IS_HARDWARE_TYPE_8188F(padapter)) {
  423. #ifdef CONFIG_RTL8188F
  424. bmain = PHY_QueryRFPathSwitch_8188F(padapter);
  425. #endif
  426. } else if (IS_HARDWARE_TYPE_8188GTV(padapter)) {
  427. #ifdef CONFIG_RTL8188GTV
  428. bmain = PHY_QueryRFPathSwitch_8188GTV(padapter);
  429. #endif
  430. } else if (IS_HARDWARE_TYPE_8822B(padapter)) {
  431. #ifdef CONFIG_RTL8822B
  432. bmain = PHY_QueryRFPathSwitch_8822B(padapter);
  433. #endif
  434. } else if (IS_HARDWARE_TYPE_8723D(padapter)) {
  435. #ifdef CONFIG_RTL8723D
  436. bmain = PHY_QueryRFPathSwitch_8723D(padapter);
  437. #endif
  438. } else
  439. */
  440. if (IS_HARDWARE_TYPE_8821C(padapter)) {
  441. #ifdef CONFIG_RTL8821C
  442. bmain = phy_query_rf_path_switch_8821c(padapter);
  443. #endif
  444. }
  445. return bmain;
  446. }
  447. static void PHY_SetRFPathSwitch(PADAPTER padapter , BOOLEAN bMain) {
  448. PHAL_DATA_TYPE hal = GET_HAL_DATA(padapter);
  449. struct dm_struct *phydm = &hal->odmpriv;
  450. if (IS_HARDWARE_TYPE_8723B(padapter)) {
  451. #ifdef CONFIG_RTL8723B
  452. phy_set_rf_path_switch_8723b(phydm, bMain);
  453. #endif
  454. } else if (IS_HARDWARE_TYPE_8188E(padapter)) {
  455. #ifdef CONFIG_RTL8188E
  456. phy_set_rf_path_switch_8188e(phydm, bMain);
  457. #endif
  458. } else if (IS_HARDWARE_TYPE_8814A(padapter)) {
  459. #ifdef CONFIG_RTL8814A
  460. phy_set_rf_path_switch_8814a(phydm, bMain);
  461. #endif
  462. } else if (IS_HARDWARE_TYPE_8812(padapter) || IS_HARDWARE_TYPE_8821(padapter)) {
  463. #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)
  464. phy_set_rf_path_switch_8812a(phydm, bMain);
  465. #endif
  466. } else if (IS_HARDWARE_TYPE_8192E(padapter)) {
  467. #ifdef CONFIG_RTL8192E
  468. phy_set_rf_path_switch_8192e(phydm, bMain);
  469. #endif
  470. } else if (IS_HARDWARE_TYPE_8703B(padapter)) {
  471. #ifdef CONFIG_RTL8703B
  472. phy_set_rf_path_switch_8703b(phydm, bMain);
  473. #endif
  474. } else if (IS_HARDWARE_TYPE_8188F(padapter) || IS_HARDWARE_TYPE_8188GTV(padapter)) {
  475. #if defined(CONFIG_RTL8188F) || defined(CONFIG_RTL8188GTV)
  476. phy_set_rf_path_switch_8188f(phydm, bMain);
  477. #endif
  478. } else if (IS_HARDWARE_TYPE_8192F(padapter)) {
  479. #ifdef CONFIG_RTL8192F
  480. phy_set_rf_path_switch_8192f(padapter, bMain);
  481. #endif
  482. } else if (IS_HARDWARE_TYPE_8822B(padapter)) {
  483. #ifdef CONFIG_RTL8822B
  484. phy_set_rf_path_switch_8822b(phydm, bMain);
  485. #endif
  486. } else if (IS_HARDWARE_TYPE_8723D(padapter)) {
  487. #ifdef CONFIG_RTL8723D
  488. phy_set_rf_path_switch_8723d(phydm, bMain);
  489. #endif
  490. } else if (IS_HARDWARE_TYPE_8821C(padapter)) {
  491. #ifdef CONFIG_RTL8821C
  492. phy_set_rf_path_switch_8821c(phydm, bMain);
  493. #endif
  494. }
  495. }
  496. static void phy_switch_rf_path_set(PADAPTER padapter , u8 *prf_set_State) {
  497. #ifdef CONFIG_RTL8821C
  498. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  499. struct dm_struct *p_dm = &pHalData->odmpriv;
  500. if (IS_HARDWARE_TYPE_8821C(padapter)) {
  501. config_phydm_set_ant_path(p_dm, *prf_set_State, p_dm->current_ant_num_8821c);
  502. /* Do IQK when switching to BTG/WLG, requested by RF Binson */
  503. if (*prf_set_State == SWITCH_TO_BTG || *prf_set_State == SWITCH_TO_WLG)
  504. PHY_IQCalibrate(padapter, FALSE);
  505. }
  506. #endif
  507. }
  508. #ifdef CONFIG_ANTENNA_DIVERSITY
  509. u8 rtw_mp_set_antdiv(PADAPTER padapter, BOOLEAN bMain)
  510. {
  511. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  512. u8 cur_ant, change_ant;
  513. if (!pHalData->AntDivCfg)
  514. return _FALSE;
  515. /*rtw_hal_get_odm_var(padapter, HAL_ODM_ANTDIV_SELECT, &cur_ant, NULL);*/
  516. change_ant = (bMain == MAIN_ANT) ? MAIN_ANT : AUX_ANT;
  517. RTW_INFO("%s: config %s\n", __func__, (bMain == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT");
  518. rtw_antenna_select_cmd(padapter, change_ant, _FALSE);
  519. return _TRUE;
  520. }
  521. #endif
  522. s32
  523. MPT_InitializeAdapter(
  524. IN PADAPTER pAdapter,
  525. IN u8 Channel
  526. )
  527. {
  528. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  529. s32 rtStatus = _SUCCESS;
  530. PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.mpt_ctx;
  531. u32 ledsetting;
  532. pMptCtx->bMptDrvUnload = _FALSE;
  533. pMptCtx->bMassProdTest = _FALSE;
  534. pMptCtx->bMptIndexEven = _TRUE; /* default gain index is -6.0db */
  535. pMptCtx->h2cReqNum = 0x0;
  536. /* init for BT MP */
  537. #if defined(CONFIG_RTL8723B)
  538. pMptCtx->bMPh2c_timeout = _FALSE;
  539. pMptCtx->MptH2cRspEvent = _FALSE;
  540. pMptCtx->MptBtC2hEvent = _FALSE;
  541. _rtw_init_sema(&pMptCtx->MPh2c_Sema, 0);
  542. rtw_init_timer(&pMptCtx->MPh2c_timeout_timer, pAdapter, MPh2c_timeout_handle, pAdapter);
  543. #endif
  544. mpt_InitHWConfig(pAdapter);
  545. #ifdef CONFIG_RTL8723B
  546. rtl8723b_InitAntenna_Selection(pAdapter);
  547. if (IS_HARDWARE_TYPE_8723B(pAdapter)) {
  548. /* <20130522, Kordan> Turn off equalizer to improve Rx sensitivity. (Asked by EEChou)*/
  549. phy_set_bb_reg(pAdapter, 0xA00, BIT8, 0x0);
  550. PHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); /*default use Main*/
  551. if (pHalData->PackageType == PACKAGE_DEFAULT)
  552. phy_set_rf_reg(pAdapter, RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6B04E);
  553. else
  554. phy_set_rf_reg(pAdapter, RF_PATH_A, 0x51, bRFRegOffsetMask, 0x6F10E);
  555. }
  556. /*set ant to wifi side in mp mode*/
  557. rtw_write16(pAdapter, 0x870, 0x300);
  558. rtw_write16(pAdapter, 0x860, 0x110);
  559. #endif
  560. pMptCtx->bMptWorkItemInProgress = _FALSE;
  561. pMptCtx->CurrMptAct = NULL;
  562. pMptCtx->mpt_rf_path = RF_PATH_A;
  563. /* ------------------------------------------------------------------------- */
  564. /* Don't accept any packets */
  565. rtw_write32(pAdapter, REG_RCR, 0);
  566. /* ledsetting = rtw_read32(pAdapter, REG_LEDCFG0); */
  567. /* rtw_write32(pAdapter, REG_LEDCFG0, ledsetting & ~LED0DIS); */
  568. /* rtw_write32(pAdapter, REG_LEDCFG0, 0x08080); */
  569. ledsetting = rtw_read32(pAdapter, REG_LEDCFG0);
  570. PHY_LCCalibrate(pAdapter);
  571. PHY_IQCalibrate(pAdapter, _FALSE);
  572. /* dm_check_txpowertracking(&pHalData->odmpriv); */ /* trigger thermal meter */
  573. PHY_SetRFPathSwitch(pAdapter, 1/*pHalData->bDefaultAntenna*/); /* default use Main */
  574. pMptCtx->backup0xc50 = (u1Byte)phy_query_bb_reg(pAdapter, rOFDM0_XAAGCCore1, bMaskByte0);
  575. pMptCtx->backup0xc58 = (u1Byte)phy_query_bb_reg(pAdapter, rOFDM0_XBAGCCore1, bMaskByte0);
  576. pMptCtx->backup0xc30 = (u1Byte)phy_query_bb_reg(pAdapter, rOFDM0_RxDetector1, bMaskByte0);
  577. pMptCtx->backup0x52_RF_A = (u1Byte)phy_query_rf_reg(pAdapter, RF_PATH_A, RF_0x52, 0x000F0);
  578. pMptCtx->backup0x52_RF_B = (u1Byte)phy_query_rf_reg(pAdapter, RF_PATH_B, RF_0x52, 0x000F0);
  579. #ifdef CONFIG_RTL8188E
  580. rtw_write32(pAdapter, REG_MACID_NO_LINK_0, 0x0);
  581. rtw_write32(pAdapter, REG_MACID_NO_LINK_1, 0x0);
  582. #endif
  583. #ifdef CONFIG_RTL8814A
  584. if (IS_HARDWARE_TYPE_8814A(pAdapter)) {
  585. pHalData->BackUp_IG_REG_4_Chnl_Section[0] = (u1Byte)phy_query_bb_reg(pAdapter, rA_IGI_Jaguar, bMaskByte0);
  586. pHalData->BackUp_IG_REG_4_Chnl_Section[1] = (u1Byte)phy_query_bb_reg(pAdapter, rB_IGI_Jaguar, bMaskByte0);
  587. pHalData->BackUp_IG_REG_4_Chnl_Section[2] = (u1Byte)phy_query_bb_reg(pAdapter, rC_IGI_Jaguar2, bMaskByte0);
  588. pHalData->BackUp_IG_REG_4_Chnl_Section[3] = (u1Byte)phy_query_bb_reg(pAdapter, rD_IGI_Jaguar2, bMaskByte0);
  589. }
  590. #endif
  591. return rtStatus;
  592. }
  593. /*-----------------------------------------------------------------------------
  594. * Function: MPT_DeInitAdapter()
  595. *
  596. * Overview: Extra DeInitialization for Mass Production Test.
  597. *
  598. * Input: PADAPTER pAdapter
  599. *
  600. * Output: NONE
  601. *
  602. * Return: NONE
  603. *
  604. * Revised History:
  605. * When Who Remark
  606. * 05/08/2007 MHC Create Version 0.
  607. * 05/18/2007 MHC Add normal driver MPHalt code.
  608. *
  609. *---------------------------------------------------------------------------*/
  610. VOID
  611. MPT_DeInitAdapter(
  612. IN PADAPTER pAdapter
  613. )
  614. {
  615. PMPT_CONTEXT pMptCtx = &pAdapter->mppriv.mpt_ctx;
  616. pMptCtx->bMptDrvUnload = _TRUE;
  617. #if defined(CONFIG_RTL8723B)
  618. _rtw_free_sema(&(pMptCtx->MPh2c_Sema));
  619. _cancel_timer_ex(&pMptCtx->MPh2c_timeout_timer);
  620. #endif
  621. #if defined(CONFIG_RTL8723B)
  622. phy_set_bb_reg(pAdapter, 0xA01, BIT0, 1); /* /suggestion by jerry for MP Rx. */
  623. #endif
  624. #if 0 /* for Windows */
  625. PlatformFreeWorkItem(&(pMptCtx->MptWorkItem));
  626. while (pMptCtx->bMptWorkItemInProgress) {
  627. if (NdisWaitEvent(&(pMptCtx->MptWorkItemEvent), 50))
  628. break;
  629. }
  630. NdisFreeSpinLock(&(pMptCtx->MptWorkItemSpinLock));
  631. #endif
  632. }
  633. static u8 mpt_ProStartTest(PADAPTER padapter)
  634. {
  635. PMPT_CONTEXT pMptCtx = &padapter->mppriv.mpt_ctx;
  636. pMptCtx->bMassProdTest = _TRUE;
  637. pMptCtx->is_start_cont_tx = _FALSE;
  638. pMptCtx->bCckContTx = _FALSE;
  639. pMptCtx->bOfdmContTx = _FALSE;
  640. pMptCtx->bSingleCarrier = _FALSE;
  641. pMptCtx->is_carrier_suppression = _FALSE;
  642. pMptCtx->is_single_tone = _FALSE;
  643. pMptCtx->HWTxmode = PACKETS_TX;
  644. return _SUCCESS;
  645. }
  646. /*
  647. * General use
  648. */
  649. s32 SetPowerTracking(PADAPTER padapter, u8 enable)
  650. {
  651. hal_mpt_SetPowerTracking(padapter, enable);
  652. return 0;
  653. }
  654. void GetPowerTracking(PADAPTER padapter, u8 *enable)
  655. {
  656. hal_mpt_GetPowerTracking(padapter, enable);
  657. }
  658. void rtw_mp_trigger_iqk(PADAPTER padapter)
  659. {
  660. PHY_IQCalibrate(padapter, _FALSE);
  661. }
  662. void rtw_mp_trigger_lck(PADAPTER padapter)
  663. {
  664. PHY_LCCalibrate(padapter);
  665. }
  666. static void init_mp_data(PADAPTER padapter)
  667. {
  668. u8 v8;
  669. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  670. struct dm_struct *pDM_Odm = &pHalData->odmpriv;
  671. /*disable BCN*/
  672. v8 = rtw_read8(padapter, REG_BCN_CTRL);
  673. v8 &= ~EN_BCN_FUNCTION;
  674. rtw_write8(padapter, REG_BCN_CTRL, v8);
  675. pDM_Odm->rf_calibrate_info.txpowertrack_control = _FALSE;
  676. }
  677. void MPT_PwrCtlDM(PADAPTER padapter, u32 bstart)
  678. {
  679. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  680. struct dm_struct *pDM_Odm = &pHalData->odmpriv;
  681. u32 rf_ability;
  682. if (bstart == 1) {
  683. RTW_INFO("in MPT_PwrCtlDM start\n");
  684. rf_ability = ((u32)halrf_cmn_info_get(pDM_Odm, HALRF_CMNINFO_ABILITY)) | HAL_RF_TX_PWR_TRACK;
  685. halrf_cmn_info_set(pDM_Odm, HALRF_CMNINFO_ABILITY, rf_ability);
  686. pDM_Odm->rf_calibrate_info.txpowertrack_control = _TRUE;
  687. padapter->mppriv.mp_dm = 1;
  688. } else {
  689. RTW_INFO("in MPT_PwrCtlDM stop\n");
  690. rf_ability = ((u32)halrf_cmn_info_get(pDM_Odm, HALRF_CMNINFO_ABILITY)) & ~HAL_RF_TX_PWR_TRACK;
  691. halrf_cmn_info_set(pDM_Odm, HALRF_CMNINFO_ABILITY, rf_ability);
  692. pDM_Odm->rf_calibrate_info.txpowertrack_control = _FALSE;
  693. padapter->mppriv.mp_dm = 0;
  694. {
  695. struct txpwrtrack_cfg c;
  696. u1Byte chnl = 0 ;
  697. _rtw_memset(&c, 0, sizeof(struct txpwrtrack_cfg));
  698. configure_txpower_track(pDM_Odm, &c);
  699. odm_clear_txpowertracking_state(pDM_Odm);
  700. if (*c.odm_tx_pwr_track_set_pwr) {
  701. if (pDM_Odm->support_ic_type == ODM_RTL8188F)
  702. (*c.odm_tx_pwr_track_set_pwr)(pDM_Odm, MIX_MODE, RF_PATH_A, chnl);
  703. else if (pDM_Odm->support_ic_type == ODM_RTL8723D) {
  704. (*c.odm_tx_pwr_track_set_pwr)(pDM_Odm, BBSWING, RF_PATH_A, chnl);
  705. SetTxPower(padapter);
  706. } else if (pDM_Odm->support_ic_type == ODM_RTL8192F) {
  707. (*c.odm_tx_pwr_track_set_pwr)(pDM_Odm, MIX_MODE, RF_PATH_A, chnl);
  708. (*c.odm_tx_pwr_track_set_pwr)(pDM_Odm, MIX_MODE, RF_PATH_B, chnl);
  709. } else {
  710. (*c.odm_tx_pwr_track_set_pwr)(pDM_Odm, BBSWING, RF_PATH_A, chnl);
  711. (*c.odm_tx_pwr_track_set_pwr)(pDM_Odm, BBSWING, RF_PATH_B, chnl);
  712. }
  713. }
  714. }
  715. }
  716. }
  717. u32 mp_join(PADAPTER padapter, u8 mode)
  718. {
  719. WLAN_BSSID_EX bssid;
  720. struct sta_info *psta;
  721. u32 length;
  722. _irqL irqL;
  723. s32 res = _SUCCESS;
  724. struct mp_priv *pmppriv = &padapter->mppriv;
  725. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  726. struct wlan_network *tgt_network = &pmlmepriv->cur_network;
  727. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  728. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  729. WLAN_BSSID_EX *pnetwork = (WLAN_BSSID_EX *)(&(pmlmeinfo->network));
  730. /* 1. initialize a new WLAN_BSSID_EX */
  731. _rtw_memset(&bssid, 0, sizeof(WLAN_BSSID_EX));
  732. RTW_INFO("%s ,pmppriv->network_macaddr=%x %x %x %x %x %x\n", __func__,
  733. pmppriv->network_macaddr[0], pmppriv->network_macaddr[1], pmppriv->network_macaddr[2], pmppriv->network_macaddr[3], pmppriv->network_macaddr[4],
  734. pmppriv->network_macaddr[5]);
  735. _rtw_memcpy(bssid.MacAddress, pmppriv->network_macaddr, ETH_ALEN);
  736. if (mode == WIFI_FW_ADHOC_STATE) {
  737. bssid.Ssid.SsidLength = strlen("mp_pseudo_adhoc");
  738. _rtw_memcpy(bssid.Ssid.Ssid, (u8 *)"mp_pseudo_adhoc", bssid.Ssid.SsidLength);
  739. bssid.InfrastructureMode = Ndis802_11IBSS;
  740. bssid.NetworkTypeInUse = Ndis802_11DS;
  741. bssid.IELength = 0;
  742. bssid.Configuration.DSConfig = pmppriv->channel;
  743. } else if (mode == WIFI_FW_STATION_STATE) {
  744. bssid.Ssid.SsidLength = strlen("mp_pseudo_STATION");
  745. _rtw_memcpy(bssid.Ssid.Ssid, (u8 *)"mp_pseudo_STATION", bssid.Ssid.SsidLength);
  746. bssid.InfrastructureMode = Ndis802_11Infrastructure;
  747. bssid.NetworkTypeInUse = Ndis802_11DS;
  748. bssid.IELength = 0;
  749. }
  750. length = get_WLAN_BSSID_EX_sz(&bssid);
  751. if (length % 4)
  752. bssid.Length = ((length >> 2) + 1) << 2; /* round up to multiple of 4 bytes. */
  753. else
  754. bssid.Length = length;
  755. _enter_critical_bh(&pmlmepriv->lock, &irqL);
  756. if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _TRUE)
  757. goto end_of_mp_start_test;
  758. /* init mp_start_test status */
  759. if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) {
  760. rtw_disassoc_cmd(padapter, 500, 0);
  761. rtw_indicate_disconnect(padapter, 0, _FALSE);
  762. rtw_free_assoc_resources_cmd(padapter, _TRUE, 0);
  763. }
  764. pmppriv->prev_fw_state = get_fwstate(pmlmepriv);
  765. /*pmlmepriv->fw_state = WIFI_MP_STATE;*/
  766. init_fwstate(pmlmepriv, WIFI_MP_STATE);
  767. set_fwstate(pmlmepriv, _FW_UNDER_LINKING);
  768. /* 3 2. create a new psta for mp driver */
  769. /* clear psta in the cur_network, if any */
  770. psta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress);
  771. if (psta)
  772. rtw_free_stainfo(padapter, psta);
  773. psta = rtw_alloc_stainfo(&padapter->stapriv, bssid.MacAddress);
  774. if (psta == NULL) {
  775. /*pmlmepriv->fw_state = pmppriv->prev_fw_state;*/
  776. init_fwstate(pmlmepriv, pmppriv->prev_fw_state);
  777. res = _FAIL;
  778. goto end_of_mp_start_test;
  779. }
  780. if (mode == WIFI_FW_ADHOC_STATE)
  781. set_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE);
  782. else
  783. set_fwstate(pmlmepriv, WIFI_STATION_STATE);
  784. /* 3 3. join psudo AdHoc */
  785. tgt_network->join_res = 1;
  786. tgt_network->aid = psta->cmn.aid = 1;
  787. _rtw_memcpy(&padapter->registrypriv.dev_network, &bssid, length);
  788. rtw_update_registrypriv_dev_network(padapter);
  789. _rtw_memcpy(&tgt_network->network, &padapter->registrypriv.dev_network, padapter->registrypriv.dev_network.Length);
  790. _rtw_memcpy(pnetwork, &padapter->registrypriv.dev_network, padapter->registrypriv.dev_network.Length);
  791. rtw_indicate_connect(padapter);
  792. _clr_fwstate_(pmlmepriv, _FW_UNDER_LINKING);
  793. set_fwstate(pmlmepriv, _FW_LINKED);
  794. end_of_mp_start_test:
  795. _exit_critical_bh(&pmlmepriv->lock, &irqL);
  796. if (1) { /* (res == _SUCCESS) */
  797. /* set MSR to WIFI_FW_ADHOC_STATE */
  798. if (mode == WIFI_FW_ADHOC_STATE) {
  799. /* set msr to WIFI_FW_ADHOC_STATE */
  800. pmlmeinfo->state = WIFI_FW_ADHOC_STATE;
  801. Set_MSR(padapter, (pmlmeinfo->state & 0x3));
  802. rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, padapter->registrypriv.dev_network.MacAddress);
  803. rtw_hal_rcr_set_chk_bssid(padapter, MLME_ADHOC_STARTED);
  804. pmlmeinfo->state |= WIFI_FW_ASSOC_SUCCESS;
  805. } else {
  806. Set_MSR(padapter, WIFI_FW_STATION_STATE);
  807. RTW_INFO("%s , pmppriv->network_macaddr =%x %x %x %x %x %x\n", __func__,
  808. pmppriv->network_macaddr[0], pmppriv->network_macaddr[1], pmppriv->network_macaddr[2], pmppriv->network_macaddr[3], pmppriv->network_macaddr[4],
  809. pmppriv->network_macaddr[5]);
  810. rtw_hal_set_hwreg(padapter, HW_VAR_BSSID, pmppriv->network_macaddr);
  811. }
  812. }
  813. return res;
  814. }
  815. /* This function initializes the DUT to the MP test mode */
  816. s32 mp_start_test(PADAPTER padapter)
  817. {
  818. struct mp_priv *pmppriv = &padapter->mppriv;
  819. s32 res = _SUCCESS;
  820. padapter->registrypriv.mp_mode = 1;
  821. init_mp_data(padapter);
  822. #ifdef CONFIG_RTL8814A
  823. rtl8814_InitHalDm(padapter);
  824. #endif /* CONFIG_RTL8814A */
  825. #ifdef CONFIG_RTL8812A
  826. rtl8812_InitHalDm(padapter);
  827. #endif /* CONFIG_RTL8812A */
  828. #ifdef CONFIG_RTL8723B
  829. rtl8723b_InitHalDm(padapter);
  830. #endif /* CONFIG_RTL8723B */
  831. #ifdef CONFIG_RTL8703B
  832. rtl8703b_InitHalDm(padapter);
  833. #endif /* CONFIG_RTL8703B */
  834. #ifdef CONFIG_RTL8192E
  835. rtl8192e_InitHalDm(padapter);
  836. #endif
  837. #ifdef CONFIG_RTL8188F
  838. rtl8188f_InitHalDm(padapter);
  839. #endif
  840. #ifdef CONFIG_RTL8188GTV
  841. rtl8188gtv_InitHalDm(padapter);
  842. #endif
  843. #ifdef CONFIG_RTL8188E
  844. rtl8188e_InitHalDm(padapter);
  845. #endif
  846. #ifdef CONFIG_RTL8723D
  847. rtl8723d_InitHalDm(padapter);
  848. #endif /* CONFIG_RTL8723D */
  849. /* 3 0. update mp_priv */
  850. if (!RF_TYPE_VALID(padapter->registrypriv.rf_config)) {
  851. /* switch (phal->rf_type) { */
  852. switch (GET_RF_TYPE(padapter)) {
  853. case RF_1T1R:
  854. pmppriv->antenna_tx = ANTENNA_A;
  855. pmppriv->antenna_rx = ANTENNA_A;
  856. break;
  857. case RF_1T2R:
  858. default:
  859. pmppriv->antenna_tx = ANTENNA_A;
  860. pmppriv->antenna_rx = ANTENNA_AB;
  861. break;
  862. case RF_2T2R:
  863. pmppriv->antenna_tx = ANTENNA_AB;
  864. pmppriv->antenna_rx = ANTENNA_AB;
  865. break;
  866. case RF_2T4R:
  867. pmppriv->antenna_tx = ANTENNA_AB;
  868. pmppriv->antenna_rx = ANTENNA_ABCD;
  869. break;
  870. }
  871. }
  872. mpt_ProStartTest(padapter);
  873. mp_join(padapter, WIFI_FW_ADHOC_STATE);
  874. return res;
  875. }
  876. /* ------------------------------------------------------------------------------
  877. * This function change the DUT from the MP test mode into normal mode */
  878. void mp_stop_test(PADAPTER padapter)
  879. {
  880. struct mp_priv *pmppriv = &padapter->mppriv;
  881. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  882. struct wlan_network *tgt_network = &pmlmepriv->cur_network;
  883. struct sta_info *psta;
  884. _irqL irqL;
  885. if (pmppriv->mode == MP_ON) {
  886. pmppriv->bSetTxPower = 0;
  887. _enter_critical_bh(&pmlmepriv->lock, &irqL);
  888. if (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _FALSE)
  889. goto end_of_mp_stop_test;
  890. /* 3 1. disconnect psudo AdHoc */
  891. rtw_indicate_disconnect(padapter, 0, _FALSE);
  892. /* 3 2. clear psta used in mp test mode.
  893. * rtw_free_assoc_resources(padapter, _TRUE); */
  894. psta = rtw_get_stainfo(&padapter->stapriv, tgt_network->network.MacAddress);
  895. if (psta)
  896. rtw_free_stainfo(padapter, psta);
  897. /* 3 3. return to normal state (default:station mode) */
  898. /*pmlmepriv->fw_state = pmppriv->prev_fw_state; */ /* WIFI_STATION_STATE;*/
  899. init_fwstate(pmlmepriv, pmppriv->prev_fw_state);
  900. /* flush the cur_network */
  901. _rtw_memset(tgt_network, 0, sizeof(struct wlan_network));
  902. _clr_fwstate_(pmlmepriv, WIFI_MP_STATE);
  903. end_of_mp_stop_test:
  904. _exit_critical_bh(&pmlmepriv->lock, &irqL);
  905. #ifdef CONFIG_RTL8812A
  906. rtl8812_InitHalDm(padapter);
  907. #endif
  908. #ifdef CONFIG_RTL8723B
  909. rtl8723b_InitHalDm(padapter);
  910. #endif
  911. #ifdef CONFIG_RTL8703B
  912. rtl8703b_InitHalDm(padapter);
  913. #endif
  914. #ifdef CONFIG_RTL8192E
  915. rtl8192e_InitHalDm(padapter);
  916. #endif
  917. #ifdef CONFIG_RTL8188F
  918. rtl8188f_InitHalDm(padapter);
  919. #endif
  920. #ifdef CONFIG_RTL8188GTV
  921. rtl8188gtv_InitHalDm(padapter);
  922. #endif
  923. #ifdef CONFIG_RTL8723D
  924. rtl8723d_InitHalDm(padapter);
  925. #endif
  926. }
  927. }
  928. /*---------------------------hal\rtl8192c\MPT_Phy.c---------------------------*/
  929. #if 0
  930. /* #ifdef CONFIG_USB_HCI */
  931. static VOID mpt_AdjustRFRegByRateByChan92CU(PADAPTER pAdapter, u8 RateIdx, u8 Channel, u8 BandWidthID)
  932. {
  933. u8 eRFPath;
  934. u32 rfReg0x26;
  935. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  936. if (RateIdx < MPT_RATE_6M) /* CCK rate,for 88cu */
  937. rfReg0x26 = 0xf400;
  938. else if ((RateIdx >= MPT_RATE_6M) && (RateIdx <= MPT_RATE_54M)) {/* OFDM rate,for 88cu */
  939. if ((4 == Channel) || (8 == Channel) || (12 == Channel))
  940. rfReg0x26 = 0xf000;
  941. else if ((5 == Channel) || (7 == Channel) || (13 == Channel) || (14 == Channel))
  942. rfReg0x26 = 0xf400;
  943. else
  944. rfReg0x26 = 0x4f200;
  945. } else if ((RateIdx >= MPT_RATE_MCS0) && (RateIdx <= MPT_RATE_MCS15)) {
  946. /* MCS 20M ,for 88cu */ /* MCS40M rate,for 88cu */
  947. if (CHANNEL_WIDTH_20 == BandWidthID) {
  948. if ((4 == Channel) || (8 == Channel))
  949. rfReg0x26 = 0xf000;
  950. else if ((5 == Channel) || (7 == Channel) || (13 == Channel) || (14 == Channel))
  951. rfReg0x26 = 0xf400;
  952. else
  953. rfReg0x26 = 0x4f200;
  954. } else {
  955. if ((4 == Channel) || (8 == Channel))
  956. rfReg0x26 = 0xf000;
  957. else if ((5 == Channel) || (7 == Channel))
  958. rfReg0x26 = 0xf400;
  959. else
  960. rfReg0x26 = 0x4f200;
  961. }
  962. }
  963. for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++)
  964. write_rfreg(pAdapter, eRFPath, RF_SYN_G2, rfReg0x26);
  965. }
  966. #endif
  967. /*-----------------------------------------------------------------------------
  968. * Function: mpt_SwitchRfSetting
  969. *
  970. * Overview: Change RF Setting when we siwthc channel/rate/BW for MP.
  971. *
  972. * Input: IN PADAPTER pAdapter
  973. *
  974. * Output: NONE
  975. *
  976. * Return: NONE
  977. *
  978. * Revised History:
  979. * When Who Remark
  980. * 01/08/2009 MHC Suggestion from SD3 Willis for 92S series.
  981. * 01/09/2009 MHC Add CCK modification for 40MHZ. Suggestion from SD3.
  982. *
  983. *---------------------------------------------------------------------------*/
  984. #if 0
  985. static void mpt_SwitchRfSetting(PADAPTER pAdapter)
  986. {
  987. hal_mpt_SwitchRfSetting(pAdapter);
  988. }
  989. /*---------------------------hal\rtl8192c\MPT_Phy.c---------------------------*/
  990. /*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/
  991. static void MPT_CCKTxPowerAdjust(PADAPTER Adapter, BOOLEAN bInCH14)
  992. {
  993. hal_mpt_CCKTxPowerAdjust(Adapter, bInCH14);
  994. }
  995. #endif
  996. /*---------------------------hal\rtl8192c\MPT_HelperFunc.c---------------------------*/
  997. /*
  998. * SetChannel
  999. * Description
  1000. * Use H2C command to change channel,
  1001. * not only modify rf register, but also other setting need to be done.
  1002. */
  1003. void SetChannel(PADAPTER pAdapter)
  1004. {
  1005. hal_mpt_SetChannel(pAdapter);
  1006. }
  1007. /*
  1008. * Notice
  1009. * Switch bandwitdth may change center frequency(channel)
  1010. */
  1011. void SetBandwidth(PADAPTER pAdapter)
  1012. {
  1013. hal_mpt_SetBandwidth(pAdapter);
  1014. }
  1015. void SetAntenna(PADAPTER pAdapter)
  1016. {
  1017. hal_mpt_SetAntenna(pAdapter);
  1018. }
  1019. int SetTxPower(PADAPTER pAdapter)
  1020. {
  1021. hal_mpt_SetTxPower(pAdapter);
  1022. return _TRUE;
  1023. }
  1024. void SetTxAGCOffset(PADAPTER pAdapter, u32 ulTxAGCOffset)
  1025. {
  1026. u32 TxAGCOffset_B, TxAGCOffset_C, TxAGCOffset_D, tmpAGC;
  1027. TxAGCOffset_B = (ulTxAGCOffset & 0x000000ff);
  1028. TxAGCOffset_C = ((ulTxAGCOffset & 0x0000ff00) >> 8);
  1029. TxAGCOffset_D = ((ulTxAGCOffset & 0x00ff0000) >> 16);
  1030. tmpAGC = (TxAGCOffset_D << 8 | TxAGCOffset_C << 4 | TxAGCOffset_B);
  1031. write_bbreg(pAdapter, rFPGA0_TxGainStage,
  1032. (bXBTxAGC | bXCTxAGC | bXDTxAGC), tmpAGC);
  1033. }
  1034. void SetDataRate(PADAPTER pAdapter)
  1035. {
  1036. hal_mpt_SetDataRate(pAdapter);
  1037. }
  1038. void MP_PHY_SetRFPathSwitch(PADAPTER pAdapter , BOOLEAN bMain)
  1039. {
  1040. PHY_SetRFPathSwitch(pAdapter, bMain);
  1041. }
  1042. void mp_phy_switch_rf_path_set(PADAPTER pAdapter , u8 *pstate)
  1043. {
  1044. phy_switch_rf_path_set(pAdapter, pstate);
  1045. }
  1046. u8 MP_PHY_QueryRFPathSwitch(PADAPTER pAdapter)
  1047. {
  1048. return PHY_QueryRFPathSwitch(pAdapter);
  1049. }
  1050. s32 SetThermalMeter(PADAPTER pAdapter, u8 target_ther)
  1051. {
  1052. return hal_mpt_SetThermalMeter(pAdapter, target_ther);
  1053. }
  1054. #if 0
  1055. static void TriggerRFThermalMeter(PADAPTER pAdapter)
  1056. {
  1057. hal_mpt_TriggerRFThermalMeter(pAdapter);
  1058. }
  1059. static u8 ReadRFThermalMeter(PADAPTER pAdapter)
  1060. {
  1061. return hal_mpt_ReadRFThermalMeter(pAdapter);
  1062. }
  1063. #endif
  1064. void GetThermalMeter(PADAPTER pAdapter, u8 *value)
  1065. {
  1066. hal_mpt_GetThermalMeter(pAdapter, value);
  1067. }
  1068. void SetSingleCarrierTx(PADAPTER pAdapter, u8 bStart)
  1069. {
  1070. PhySetTxPowerLevel(pAdapter);
  1071. hal_mpt_SetSingleCarrierTx(pAdapter, bStart);
  1072. }
  1073. void SetSingleToneTx(PADAPTER pAdapter, u8 bStart)
  1074. {
  1075. PhySetTxPowerLevel(pAdapter);
  1076. hal_mpt_SetSingleToneTx(pAdapter, bStart);
  1077. }
  1078. void SetCarrierSuppressionTx(PADAPTER pAdapter, u8 bStart)
  1079. {
  1080. PhySetTxPowerLevel(pAdapter);
  1081. hal_mpt_SetCarrierSuppressionTx(pAdapter, bStart);
  1082. }
  1083. void SetContinuousTx(PADAPTER pAdapter, u8 bStart)
  1084. {
  1085. PhySetTxPowerLevel(pAdapter);
  1086. hal_mpt_SetContinuousTx(pAdapter, bStart);
  1087. }
  1088. void PhySetTxPowerLevel(PADAPTER pAdapter)
  1089. {
  1090. struct mp_priv *pmp_priv = &pAdapter->mppriv;
  1091. if (pmp_priv->bSetTxPower == 0) /* for NO manually set power index */
  1092. rtw_hal_set_tx_power_level(pAdapter, pmp_priv->channel);
  1093. }
  1094. /* ------------------------------------------------------------------------------ */
  1095. static void dump_mpframe(PADAPTER padapter, struct xmit_frame *pmpframe)
  1096. {
  1097. rtw_hal_mgnt_xmit(padapter, pmpframe);
  1098. }
  1099. static struct xmit_frame *alloc_mp_xmitframe(struct xmit_priv *pxmitpriv)
  1100. {
  1101. struct xmit_frame *pmpframe;
  1102. struct xmit_buf *pxmitbuf;
  1103. pmpframe = rtw_alloc_xmitframe(pxmitpriv);
  1104. if (pmpframe == NULL)
  1105. return NULL;
  1106. pxmitbuf = rtw_alloc_xmitbuf(pxmitpriv);
  1107. if (pxmitbuf == NULL) {
  1108. rtw_free_xmitframe(pxmitpriv, pmpframe);
  1109. return NULL;
  1110. }
  1111. pmpframe->frame_tag = MP_FRAMETAG;
  1112. pmpframe->pxmitbuf = pxmitbuf;
  1113. pmpframe->buf_addr = pxmitbuf->pbuf;
  1114. pxmitbuf->priv_data = pmpframe;
  1115. return pmpframe;
  1116. }
  1117. #ifdef CONFIG_PCI_HCI
  1118. static u8 check_nic_enough_desc(_adapter *padapter, struct pkt_attrib *pattrib)
  1119. {
  1120. u32 prio;
  1121. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  1122. struct rtw_tx_ring *ring;
  1123. switch (pattrib->qsel) {
  1124. case 0:
  1125. case 3:
  1126. prio = BE_QUEUE_INX;
  1127. break;
  1128. case 1:
  1129. case 2:
  1130. prio = BK_QUEUE_INX;
  1131. break;
  1132. case 4:
  1133. case 5:
  1134. prio = VI_QUEUE_INX;
  1135. break;
  1136. case 6:
  1137. case 7:
  1138. prio = VO_QUEUE_INX;
  1139. break;
  1140. default:
  1141. prio = BE_QUEUE_INX;
  1142. break;
  1143. }
  1144. ring = &pxmitpriv->tx_ring[prio];
  1145. /*
  1146. * for now we reserve two free descriptor as a safety boundary
  1147. * between the tail and the head
  1148. */
  1149. if ((ring->entries - ring->qlen) >= 2)
  1150. return _TRUE;
  1151. else
  1152. return _FALSE;
  1153. }
  1154. #endif
  1155. static thread_return mp_xmit_packet_thread(thread_context context)
  1156. {
  1157. struct xmit_frame *pxmitframe;
  1158. struct mp_tx *pmptx;
  1159. struct mp_priv *pmp_priv;
  1160. struct xmit_priv *pxmitpriv;
  1161. PADAPTER padapter;
  1162. pmp_priv = (struct mp_priv *)context;
  1163. pmptx = &pmp_priv->tx;
  1164. padapter = pmp_priv->papdater;
  1165. pxmitpriv = &(padapter->xmitpriv);
  1166. thread_enter("RTW_MP_THREAD");
  1167. RTW_INFO("%s:pkTx Start\n", __func__);
  1168. while (1) {
  1169. pxmitframe = alloc_mp_xmitframe(pxmitpriv);
  1170. #ifdef CONFIG_PCI_HCI
  1171. if(check_nic_enough_desc(padapter, &pmptx->attrib) == _FALSE) {
  1172. rtw_usleep_os(1000);
  1173. continue;
  1174. }
  1175. #endif
  1176. if (pxmitframe == NULL) {
  1177. if (pmptx->stop ||
  1178. RTW_CANNOT_RUN(padapter))
  1179. goto exit;
  1180. else {
  1181. rtw_usleep_os(10);
  1182. continue;
  1183. }
  1184. }
  1185. _rtw_memcpy((u8 *)(pxmitframe->buf_addr + TXDESC_OFFSET), pmptx->buf, pmptx->write_size);
  1186. _rtw_memcpy(&(pxmitframe->attrib), &(pmptx->attrib), sizeof(struct pkt_attrib));
  1187. rtw_usleep_os(padapter->mppriv.pktInterval);
  1188. dump_mpframe(padapter, pxmitframe);
  1189. pmptx->sended++;
  1190. pmp_priv->tx_pktcount++;
  1191. if (pmptx->stop ||
  1192. RTW_CANNOT_RUN(padapter))
  1193. goto exit;
  1194. if ((pmptx->count != 0) &&
  1195. (pmptx->count == pmptx->sended))
  1196. goto exit;
  1197. flush_signals_thread();
  1198. }
  1199. exit:
  1200. /* RTW_INFO("%s:pkTx Exit\n", __func__); */
  1201. rtw_mfree(pmptx->pallocated_buf, pmptx->buf_size);
  1202. pmptx->pallocated_buf = NULL;
  1203. pmptx->stop = 1;
  1204. thread_exit(NULL);
  1205. return 0;
  1206. }
  1207. void fill_txdesc_for_mp(PADAPTER padapter, u8 *ptxdesc)
  1208. {
  1209. struct mp_priv *pmp_priv = &padapter->mppriv;
  1210. _rtw_memcpy(ptxdesc, pmp_priv->tx.desc, TXDESC_SIZE);
  1211. }
  1212. #if defined(CONFIG_RTL8188E)
  1213. void fill_tx_desc_8188e(PADAPTER padapter)
  1214. {
  1215. struct mp_priv *pmp_priv = &padapter->mppriv;
  1216. struct tx_desc *desc = (struct tx_desc *)&(pmp_priv->tx.desc);
  1217. struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
  1218. u32 pkt_size = pattrib->last_txcmdsz;
  1219. s32 bmcast = IS_MCAST(pattrib->ra);
  1220. /* offset 0 */
  1221. #if !defined(CONFIG_RTL8188E_SDIO) && !defined(CONFIG_PCI_HCI)
  1222. desc->txdw0 |= cpu_to_le32(OWN | FSG | LSG);
  1223. desc->txdw0 |= cpu_to_le32(pkt_size & 0x0000FFFF); /* packet size */
  1224. desc->txdw0 |= cpu_to_le32(((TXDESC_SIZE + OFFSET_SZ) << OFFSET_SHT) & 0x00FF0000); /* 32 bytes for TX Desc */
  1225. if (bmcast)
  1226. desc->txdw0 |= cpu_to_le32(BMC); /* broadcast packet */
  1227. desc->txdw1 |= cpu_to_le32((0x01 << 26) & 0xff000000);
  1228. #endif
  1229. desc->txdw1 |= cpu_to_le32((pattrib->mac_id) & 0x3F); /* CAM_ID(MAC_ID) */
  1230. desc->txdw1 |= cpu_to_le32((pattrib->qsel << QSEL_SHT) & 0x00001F00); /* Queue Select, TID */
  1231. desc->txdw1 |= cpu_to_le32((pattrib->raid << RATE_ID_SHT) & 0x000F0000); /* Rate Adaptive ID */
  1232. /* offset 8 */
  1233. /* desc->txdw2 |= cpu_to_le32(AGG_BK); */ /* AGG BK */
  1234. desc->txdw3 |= cpu_to_le32((pattrib->seqnum << 16) & 0x0fff0000);
  1235. desc->txdw4 |= cpu_to_le32(HW_SSN);
  1236. desc->txdw4 |= cpu_to_le32(USERATE);
  1237. desc->txdw4 |= cpu_to_le32(DISDATAFB);
  1238. if (pmp_priv->preamble) {
  1239. if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)
  1240. desc->txdw4 |= cpu_to_le32(DATA_SHORT); /* CCK Short Preamble */
  1241. }
  1242. if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)
  1243. desc->txdw4 |= cpu_to_le32(DATA_BW);
  1244. /* offset 20 */
  1245. desc->txdw5 |= cpu_to_le32(pmp_priv->rateidx & 0x0000001F);
  1246. if (pmp_priv->preamble) {
  1247. if (HwRateToMPTRate(pmp_priv->rateidx) > MPT_RATE_54M)
  1248. desc->txdw5 |= cpu_to_le32(SGI); /* MCS Short Guard Interval */
  1249. }
  1250. desc->txdw5 |= cpu_to_le32(RTY_LMT_EN); /* retry limit enable */
  1251. desc->txdw5 |= cpu_to_le32(0x00180000); /* DATA/RTS Rate Fallback Limit */
  1252. }
  1253. #endif
  1254. #if defined(CONFIG_RTL8814A)
  1255. void fill_tx_desc_8814a(PADAPTER padapter)
  1256. {
  1257. struct mp_priv *pmp_priv = &padapter->mppriv;
  1258. u8 *pDesc = (u8 *)&(pmp_priv->tx.desc);
  1259. struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
  1260. u32 pkt_size = pattrib->last_txcmdsz;
  1261. s32 bmcast = IS_MCAST(pattrib->ra);
  1262. u8 offset;
  1263. /* SET_TX_DESC_FIRST_SEG_8814A(pDesc, 1); */
  1264. SET_TX_DESC_LAST_SEG_8814A(pDesc, 1);
  1265. /* SET_TX_DESC_OWN_(pDesc, 1); */
  1266. SET_TX_DESC_PKT_SIZE_8814A(pDesc, pkt_size);
  1267. offset = TXDESC_SIZE + OFFSET_SZ;
  1268. SET_TX_DESC_OFFSET_8814A(pDesc, offset);
  1269. #if defined(CONFIG_PCI_HCI)
  1270. SET_TX_DESC_PKT_OFFSET_8814A(pDesc, 0); /* 8814AE pkt_offset is 0 */
  1271. #else
  1272. SET_TX_DESC_PKT_OFFSET_8814A(pDesc, 1);
  1273. #endif
  1274. if (bmcast)
  1275. SET_TX_DESC_BMC_8814A(pDesc, 1);
  1276. SET_TX_DESC_MACID_8814A(pDesc, pattrib->mac_id);
  1277. SET_TX_DESC_RATE_ID_8814A(pDesc, pattrib->raid);
  1278. /* SET_TX_DESC_RATE_ID_8812(pDesc, RATEID_IDX_G); */
  1279. SET_TX_DESC_QUEUE_SEL_8814A(pDesc, pattrib->qsel);
  1280. /* SET_TX_DESC_QUEUE_SEL_8812(pDesc, QSLT_MGNT); */
  1281. if (pmp_priv->preamble)
  1282. SET_TX_DESC_DATA_SHORT_8814A(pDesc, 1);
  1283. if (!pattrib->qos_en) {
  1284. SET_TX_DESC_HWSEQ_EN_8814A(pDesc, 1); /* Hw set sequence number */
  1285. } else
  1286. SET_TX_DESC_SEQ_8814A(pDesc, pattrib->seqnum);
  1287. if (pmp_priv->bandwidth <= CHANNEL_WIDTH_160)
  1288. SET_TX_DESC_DATA_BW_8814A(pDesc, pmp_priv->bandwidth);
  1289. else {
  1290. RTW_INFO("%s:Err: unknown bandwidth %d, use 20M\n", __func__, pmp_priv->bandwidth);
  1291. SET_TX_DESC_DATA_BW_8814A(pDesc, CHANNEL_WIDTH_20);
  1292. }
  1293. SET_TX_DESC_DISABLE_FB_8814A(pDesc, 1);
  1294. SET_TX_DESC_USE_RATE_8814A(pDesc, 1);
  1295. SET_TX_DESC_TX_RATE_8814A(pDesc, pmp_priv->rateidx);
  1296. }
  1297. #endif
  1298. #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)
  1299. void fill_tx_desc_8812a(PADAPTER padapter)
  1300. {
  1301. struct mp_priv *pmp_priv = &padapter->mppriv;
  1302. u8 *pDesc = (u8 *)&(pmp_priv->tx.desc);
  1303. struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
  1304. u32 pkt_size = pattrib->last_txcmdsz;
  1305. s32 bmcast = IS_MCAST(pattrib->ra);
  1306. u8 data_rate, pwr_status, offset;
  1307. SET_TX_DESC_FIRST_SEG_8812(pDesc, 1);
  1308. SET_TX_DESC_LAST_SEG_8812(pDesc, 1);
  1309. SET_TX_DESC_OWN_8812(pDesc, 1);
  1310. SET_TX_DESC_PKT_SIZE_8812(pDesc, pkt_size);
  1311. offset = TXDESC_SIZE + OFFSET_SZ;
  1312. SET_TX_DESC_OFFSET_8812(pDesc, offset);
  1313. #if defined(CONFIG_PCI_HCI)
  1314. SET_TX_DESC_PKT_OFFSET_8812(pDesc, 0);
  1315. #else
  1316. SET_TX_DESC_PKT_OFFSET_8812(pDesc, 1);
  1317. #endif
  1318. if (bmcast)
  1319. SET_TX_DESC_BMC_8812(pDesc, 1);
  1320. SET_TX_DESC_MACID_8812(pDesc, pattrib->mac_id);
  1321. SET_TX_DESC_RATE_ID_8812(pDesc, pattrib->raid);
  1322. /* SET_TX_DESC_RATE_ID_8812(pDesc, RATEID_IDX_G); */
  1323. SET_TX_DESC_QUEUE_SEL_8812(pDesc, pattrib->qsel);
  1324. /* SET_TX_DESC_QUEUE_SEL_8812(pDesc, QSLT_MGNT); */
  1325. if (!pattrib->qos_en) {
  1326. SET_TX_DESC_HWSEQ_EN_8812(pDesc, 1); /* Hw set sequence number */
  1327. } else
  1328. SET_TX_DESC_SEQ_8812(pDesc, pattrib->seqnum);
  1329. if (pmp_priv->bandwidth <= CHANNEL_WIDTH_160)
  1330. SET_TX_DESC_DATA_BW_8812(pDesc, pmp_priv->bandwidth);
  1331. else {
  1332. RTW_INFO("%s:Err: unknown bandwidth %d, use 20M\n", __func__, pmp_priv->bandwidth);
  1333. SET_TX_DESC_DATA_BW_8812(pDesc, CHANNEL_WIDTH_20);
  1334. }
  1335. SET_TX_DESC_DISABLE_FB_8812(pDesc, 1);
  1336. SET_TX_DESC_USE_RATE_8812(pDesc, 1);
  1337. SET_TX_DESC_TX_RATE_8812(pDesc, pmp_priv->rateidx);
  1338. }
  1339. #endif
  1340. #if defined(CONFIG_RTL8192E)
  1341. void fill_tx_desc_8192e(PADAPTER padapter)
  1342. {
  1343. struct mp_priv *pmp_priv = &padapter->mppriv;
  1344. u8 *pDesc = (u8 *)&(pmp_priv->tx.desc);
  1345. struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
  1346. u32 pkt_size = pattrib->last_txcmdsz;
  1347. s32 bmcast = IS_MCAST(pattrib->ra);
  1348. u8 data_rate, pwr_status, offset;
  1349. SET_TX_DESC_PKT_SIZE_92E(pDesc, pkt_size);
  1350. offset = TXDESC_SIZE + OFFSET_SZ;
  1351. SET_TX_DESC_OFFSET_92E(pDesc, offset);
  1352. #if defined(CONFIG_PCI_HCI) /* 8192EE */
  1353. SET_TX_DESC_PKT_OFFSET_92E(pDesc, 0); /* 8192EE pkt_offset is 0 */
  1354. #else /* 8192EU 8192ES */
  1355. SET_TX_DESC_PKT_OFFSET_92E(pDesc, 1);
  1356. #endif
  1357. if (bmcast)
  1358. SET_TX_DESC_BMC_92E(pDesc, 1);
  1359. SET_TX_DESC_MACID_92E(pDesc, pattrib->mac_id);
  1360. SET_TX_DESC_RATE_ID_92E(pDesc, pattrib->raid);
  1361. SET_TX_DESC_QUEUE_SEL_92E(pDesc, pattrib->qsel);
  1362. /* SET_TX_DESC_QUEUE_SEL_8812(pDesc, QSLT_MGNT); */
  1363. if (!pattrib->qos_en) {
  1364. SET_TX_DESC_EN_HWSEQ_92E(pDesc, 1);/* Hw set sequence number */
  1365. SET_TX_DESC_HWSEQ_SEL_92E(pDesc, pattrib->hw_ssn_sel);
  1366. } else
  1367. SET_TX_DESC_SEQ_92E(pDesc, pattrib->seqnum);
  1368. if ((pmp_priv->bandwidth == CHANNEL_WIDTH_20) || (pmp_priv->bandwidth == CHANNEL_WIDTH_40))
  1369. SET_TX_DESC_DATA_BW_92E(pDesc, pmp_priv->bandwidth);
  1370. else {
  1371. RTW_INFO("%s:Err: unknown bandwidth %d, use 20M\n", __func__, pmp_priv->bandwidth);
  1372. SET_TX_DESC_DATA_BW_92E(pDesc, CHANNEL_WIDTH_20);
  1373. }
  1374. /* SET_TX_DESC_DATA_SC_92E(pDesc, SCMapping_92E(padapter,pattrib)); */
  1375. SET_TX_DESC_DISABLE_FB_92E(pDesc, 1);
  1376. SET_TX_DESC_USE_RATE_92E(pDesc, 1);
  1377. SET_TX_DESC_TX_RATE_92E(pDesc, pmp_priv->rateidx);
  1378. }
  1379. #endif
  1380. #if defined(CONFIG_RTL8723B)
  1381. void fill_tx_desc_8723b(PADAPTER padapter)
  1382. {
  1383. struct mp_priv *pmp_priv = &padapter->mppriv;
  1384. struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
  1385. u8 *ptxdesc = pmp_priv->tx.desc;
  1386. SET_TX_DESC_AGG_BREAK_8723B(ptxdesc, 1);
  1387. SET_TX_DESC_MACID_8723B(ptxdesc, pattrib->mac_id);
  1388. SET_TX_DESC_QUEUE_SEL_8723B(ptxdesc, pattrib->qsel);
  1389. SET_TX_DESC_RATE_ID_8723B(ptxdesc, pattrib->raid);
  1390. SET_TX_DESC_SEQ_8723B(ptxdesc, pattrib->seqnum);
  1391. SET_TX_DESC_HWSEQ_EN_8723B(ptxdesc, 1);
  1392. SET_TX_DESC_USE_RATE_8723B(ptxdesc, 1);
  1393. SET_TX_DESC_DISABLE_FB_8723B(ptxdesc, 1);
  1394. if (pmp_priv->preamble) {
  1395. if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)
  1396. SET_TX_DESC_DATA_SHORT_8723B(ptxdesc, 1);
  1397. }
  1398. if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)
  1399. SET_TX_DESC_DATA_BW_8723B(ptxdesc, 1);
  1400. SET_TX_DESC_TX_RATE_8723B(ptxdesc, pmp_priv->rateidx);
  1401. SET_TX_DESC_DATA_RATE_FB_LIMIT_8723B(ptxdesc, 0x1F);
  1402. SET_TX_DESC_RTS_RATE_FB_LIMIT_8723B(ptxdesc, 0xF);
  1403. }
  1404. #endif
  1405. #if defined(CONFIG_RTL8703B)
  1406. void fill_tx_desc_8703b(PADAPTER padapter)
  1407. {
  1408. struct mp_priv *pmp_priv = &padapter->mppriv;
  1409. struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
  1410. u8 *ptxdesc = pmp_priv->tx.desc;
  1411. SET_TX_DESC_AGG_BREAK_8703B(ptxdesc, 1);
  1412. SET_TX_DESC_MACID_8703B(ptxdesc, pattrib->mac_id);
  1413. SET_TX_DESC_QUEUE_SEL_8703B(ptxdesc, pattrib->qsel);
  1414. SET_TX_DESC_RATE_ID_8703B(ptxdesc, pattrib->raid);
  1415. SET_TX_DESC_SEQ_8703B(ptxdesc, pattrib->seqnum);
  1416. SET_TX_DESC_HWSEQ_EN_8703B(ptxdesc, 1);
  1417. SET_TX_DESC_USE_RATE_8703B(ptxdesc, 1);
  1418. SET_TX_DESC_DISABLE_FB_8703B(ptxdesc, 1);
  1419. if (pmp_priv->preamble) {
  1420. if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)
  1421. SET_TX_DESC_DATA_SHORT_8703B(ptxdesc, 1);
  1422. }
  1423. if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)
  1424. SET_TX_DESC_DATA_BW_8703B(ptxdesc, 1);
  1425. SET_TX_DESC_TX_RATE_8703B(ptxdesc, pmp_priv->rateidx);
  1426. SET_TX_DESC_DATA_RATE_FB_LIMIT_8703B(ptxdesc, 0x1F);
  1427. SET_TX_DESC_RTS_RATE_FB_LIMIT_8703B(ptxdesc, 0xF);
  1428. }
  1429. #endif
  1430. #if defined(CONFIG_RTL8188F)
  1431. void fill_tx_desc_8188f(PADAPTER padapter)
  1432. {
  1433. struct mp_priv *pmp_priv = &padapter->mppriv;
  1434. struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
  1435. u8 *ptxdesc = pmp_priv->tx.desc;
  1436. SET_TX_DESC_AGG_BREAK_8188F(ptxdesc, 1);
  1437. SET_TX_DESC_MACID_8188F(ptxdesc, pattrib->mac_id);
  1438. SET_TX_DESC_QUEUE_SEL_8188F(ptxdesc, pattrib->qsel);
  1439. SET_TX_DESC_RATE_ID_8188F(ptxdesc, pattrib->raid);
  1440. SET_TX_DESC_SEQ_8188F(ptxdesc, pattrib->seqnum);
  1441. SET_TX_DESC_HWSEQ_EN_8188F(ptxdesc, 1);
  1442. SET_TX_DESC_USE_RATE_8188F(ptxdesc, 1);
  1443. SET_TX_DESC_DISABLE_FB_8188F(ptxdesc, 1);
  1444. if (pmp_priv->preamble)
  1445. if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)
  1446. SET_TX_DESC_DATA_SHORT_8188F(ptxdesc, 1);
  1447. if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)
  1448. SET_TX_DESC_DATA_BW_8188F(ptxdesc, 1);
  1449. SET_TX_DESC_TX_RATE_8188F(ptxdesc, pmp_priv->rateidx);
  1450. SET_TX_DESC_DATA_RATE_FB_LIMIT_8188F(ptxdesc, 0x1F);
  1451. SET_TX_DESC_RTS_RATE_FB_LIMIT_8188F(ptxdesc, 0xF);
  1452. }
  1453. #endif
  1454. #if defined(CONFIG_RTL8188GTV)
  1455. void fill_tx_desc_8188gtv(PADAPTER padapter)
  1456. {
  1457. struct mp_priv *pmp_priv = &padapter->mppriv;
  1458. struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
  1459. u8 *ptxdesc = pmp_priv->tx.desc;
  1460. SET_TX_DESC_AGG_BREAK_8188GTV(ptxdesc, 1);
  1461. SET_TX_DESC_MACID_8188GTV(ptxdesc, pattrib->mac_id);
  1462. SET_TX_DESC_QUEUE_SEL_8188GTV(ptxdesc, pattrib->qsel);
  1463. SET_TX_DESC_RATE_ID_8188GTV(ptxdesc, pattrib->raid);
  1464. SET_TX_DESC_SEQ_8188GTV(ptxdesc, pattrib->seqnum);
  1465. SET_TX_DESC_HWSEQ_EN_8188GTV(ptxdesc, 1);
  1466. SET_TX_DESC_USE_RATE_8188GTV(ptxdesc, 1);
  1467. SET_TX_DESC_DISABLE_FB_8188GTV(ptxdesc, 1);
  1468. if (pmp_priv->preamble)
  1469. if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)
  1470. SET_TX_DESC_DATA_SHORT_8188GTV(ptxdesc, 1);
  1471. if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)
  1472. SET_TX_DESC_DATA_BW_8188GTV(ptxdesc, 1);
  1473. SET_TX_DESC_TX_RATE_8188GTV(ptxdesc, pmp_priv->rateidx);
  1474. SET_TX_DESC_DATA_RATE_FB_LIMIT_8188GTV(ptxdesc, 0x1F);
  1475. SET_TX_DESC_RTS_RATE_FB_LIMIT_8188GTV(ptxdesc, 0xF);
  1476. }
  1477. #endif
  1478. #if defined(CONFIG_RTL8723D)
  1479. void fill_tx_desc_8723d(PADAPTER padapter)
  1480. {
  1481. struct mp_priv *pmp_priv = &padapter->mppriv;
  1482. struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
  1483. u8 *ptxdesc = pmp_priv->tx.desc;
  1484. SET_TX_DESC_BK_8723D(ptxdesc, 1);
  1485. SET_TX_DESC_MACID_8723D(ptxdesc, pattrib->mac_id);
  1486. SET_TX_DESC_QUEUE_SEL_8723D(ptxdesc, pattrib->qsel);
  1487. SET_TX_DESC_RATE_ID_8723D(ptxdesc, pattrib->raid);
  1488. SET_TX_DESC_SEQ_8723D(ptxdesc, pattrib->seqnum);
  1489. SET_TX_DESC_HWSEQ_EN_8723D(ptxdesc, 1);
  1490. SET_TX_DESC_USE_RATE_8723D(ptxdesc, 1);
  1491. SET_TX_DESC_DISABLE_FB_8723D(ptxdesc, 1);
  1492. if (pmp_priv->preamble) {
  1493. if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)
  1494. SET_TX_DESC_DATA_SHORT_8723D(ptxdesc, 1);
  1495. }
  1496. if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)
  1497. SET_TX_DESC_DATA_BW_8723D(ptxdesc, 1);
  1498. SET_TX_DESC_TX_RATE_8723D(ptxdesc, pmp_priv->rateidx);
  1499. SET_TX_DESC_DATA_RATE_FB_LIMIT_8723D(ptxdesc, 0x1F);
  1500. SET_TX_DESC_RTS_RATE_FB_LIMIT_8723D(ptxdesc, 0xF);
  1501. }
  1502. #endif
  1503. #if defined(CONFIG_RTL8710B)
  1504. void fill_tx_desc_8710b(PADAPTER padapter)
  1505. {
  1506. struct mp_priv *pmp_priv = &padapter->mppriv;
  1507. struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
  1508. u8 *ptxdesc = pmp_priv->tx.desc;
  1509. SET_TX_DESC_BK_8710B(ptxdesc, 1);
  1510. SET_TX_DESC_MACID_8710B(ptxdesc, pattrib->mac_id);
  1511. SET_TX_DESC_QUEUE_SEL_8710B(ptxdesc, pattrib->qsel);
  1512. SET_TX_DESC_RATE_ID_8710B(ptxdesc, pattrib->raid);
  1513. SET_TX_DESC_SEQ_8710B(ptxdesc, pattrib->seqnum);
  1514. SET_TX_DESC_HWSEQ_EN_8710B(ptxdesc, 1);
  1515. SET_TX_DESC_USE_RATE_8710B(ptxdesc, 1);
  1516. SET_TX_DESC_DISABLE_FB_8710B(ptxdesc, 1);
  1517. if (pmp_priv->preamble) {
  1518. if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)
  1519. SET_TX_DESC_DATA_SHORT_8710B(ptxdesc, 1);
  1520. }
  1521. if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)
  1522. SET_TX_DESC_DATA_BW_8710B(ptxdesc, 1);
  1523. SET_TX_DESC_TX_RATE_8710B(ptxdesc, pmp_priv->rateidx);
  1524. SET_TX_DESC_DATA_RATE_FB_LIMIT_8710B(ptxdesc, 0x1F);
  1525. SET_TX_DESC_RTS_RATE_FB_LIMIT_8710B(ptxdesc, 0xF);
  1526. }
  1527. #endif
  1528. #if defined(CONFIG_RTL8192F)
  1529. void fill_tx_desc_8192f(PADAPTER padapter)
  1530. {
  1531. struct mp_priv *pmp_priv = &padapter->mppriv;
  1532. struct pkt_attrib *pattrib = &(pmp_priv->tx.attrib);
  1533. u8 *ptxdesc = pmp_priv->tx.desc;
  1534. SET_TX_DESC_BK_8192F(ptxdesc, 1);
  1535. SET_TX_DESC_MACID_8192F(ptxdesc, pattrib->mac_id);
  1536. SET_TX_DESC_QUEUE_SEL_8192F(ptxdesc, pattrib->qsel);
  1537. SET_TX_DESC_RATE_ID_8192F(ptxdesc, pattrib->raid);
  1538. SET_TX_DESC_SEQ_8192F(ptxdesc, pattrib->seqnum);
  1539. SET_TX_DESC_HWSEQ_EN_8192F(ptxdesc, 1);
  1540. SET_TX_DESC_USE_RATE_8192F(ptxdesc, 1);
  1541. SET_TX_DESC_DISABLE_FB_8192F(ptxdesc, 1);
  1542. if (pmp_priv->preamble) {
  1543. if (HwRateToMPTRate(pmp_priv->rateidx) <= MPT_RATE_54M)
  1544. SET_TX_DESC_DATA_SHORT_8192F(ptxdesc, 1);
  1545. }
  1546. if (pmp_priv->bandwidth == CHANNEL_WIDTH_40)
  1547. SET_TX_DESC_DATA_BW_8192F(ptxdesc, 1);
  1548. SET_TX_DESC_TX_RATE_8192F(ptxdesc, pmp_priv->rateidx);
  1549. SET_TX_DESC_DATA_RATE_FB_LIMIT_8192F(ptxdesc, 0x1F);
  1550. SET_TX_DESC_RTS_RATE_FB_LIMIT_8192F(ptxdesc, 0xF);
  1551. }
  1552. #endif
  1553. static void Rtw_MPSetMacTxEDCA(PADAPTER padapter)
  1554. {
  1555. rtw_write32(padapter, 0x508 , 0x00a422); /* Disable EDCA BE Txop for MP pkt tx adjust Packet interval */
  1556. /* RTW_INFO("%s:write 0x508~~~~~~ 0x%x\n", __func__,rtw_read32(padapter, 0x508)); */
  1557. phy_set_mac_reg(padapter, 0x458 , bMaskDWord , 0x0);
  1558. /*RTW_INFO("%s()!!!!! 0x460 = 0x%x\n" ,__func__, phy_query_bb_reg(padapter, 0x460, bMaskDWord));*/
  1559. phy_set_mac_reg(padapter, 0x460 , bMaskLWord , 0x0); /* fast EDCA queue packet interval & time out value*/
  1560. /*phy_set_mac_reg(padapter, ODM_EDCA_VO_PARAM ,bMaskLWord , 0x431C);*/
  1561. /*phy_set_mac_reg(padapter, ODM_EDCA_BE_PARAM ,bMaskLWord , 0x431C);*/
  1562. /*phy_set_mac_reg(padapter, ODM_EDCA_BK_PARAM ,bMaskLWord , 0x431C);*/
  1563. RTW_INFO("%s()!!!!! 0x460 = 0x%x\n" , __func__, phy_query_bb_reg(padapter, 0x460, bMaskDWord));
  1564. }
  1565. void SetPacketTx(PADAPTER padapter)
  1566. {
  1567. u8 *ptr, *pkt_start, *pkt_end;
  1568. u32 pkt_size, i;
  1569. struct rtw_ieee80211_hdr *hdr;
  1570. u8 payload;
  1571. s32 bmcast;
  1572. struct pkt_attrib *pattrib;
  1573. struct mp_priv *pmp_priv;
  1574. pmp_priv = &padapter->mppriv;
  1575. if (pmp_priv->tx.stop)
  1576. return;
  1577. pmp_priv->tx.sended = 0;
  1578. pmp_priv->tx.stop = 0;
  1579. pmp_priv->tx_pktcount = 0;
  1580. /* 3 1. update_attrib() */
  1581. pattrib = &pmp_priv->tx.attrib;
  1582. _rtw_memcpy(pattrib->src, adapter_mac_addr(padapter), ETH_ALEN);
  1583. _rtw_memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
  1584. _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
  1585. bmcast = IS_MCAST(pattrib->ra);
  1586. if (bmcast)
  1587. pattrib->psta = rtw_get_bcmc_stainfo(padapter);
  1588. else
  1589. pattrib->psta = rtw_get_stainfo(&padapter->stapriv, get_bssid(&padapter->mlmepriv));
  1590. pattrib->mac_id = pattrib->psta->cmn.mac_id;
  1591. pattrib->mbssid = 0;
  1592. pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->pktlen;
  1593. /* 3 2. allocate xmit buffer */
  1594. pkt_size = pattrib->last_txcmdsz;
  1595. if (pmp_priv->tx.pallocated_buf)
  1596. rtw_mfree(pmp_priv->tx.pallocated_buf, pmp_priv->tx.buf_size);
  1597. pmp_priv->tx.write_size = pkt_size;
  1598. pmp_priv->tx.buf_size = pkt_size + XMITBUF_ALIGN_SZ;
  1599. pmp_priv->tx.pallocated_buf = rtw_zmalloc(pmp_priv->tx.buf_size);
  1600. if (pmp_priv->tx.pallocated_buf == NULL) {
  1601. RTW_INFO("%s: malloc(%d) fail!!\n", __func__, pmp_priv->tx.buf_size);
  1602. return;
  1603. }
  1604. pmp_priv->tx.buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pmp_priv->tx.pallocated_buf), XMITBUF_ALIGN_SZ);
  1605. ptr = pmp_priv->tx.buf;
  1606. _rtw_memset(pmp_priv->tx.desc, 0, TXDESC_SIZE);
  1607. pkt_start = ptr;
  1608. pkt_end = pkt_start + pkt_size;
  1609. /* 3 3. init TX descriptor */
  1610. #if defined(CONFIG_RTL8188E)
  1611. if (IS_HARDWARE_TYPE_8188E(padapter))
  1612. fill_tx_desc_8188e(padapter);
  1613. #endif
  1614. #if defined(CONFIG_RTL8814A)
  1615. if (IS_HARDWARE_TYPE_8814A(padapter))
  1616. fill_tx_desc_8814a(padapter);
  1617. #endif /* defined(CONFIG_RTL8814A) */
  1618. #if defined(CONFIG_RTL8822B)
  1619. if (IS_HARDWARE_TYPE_8822B(padapter))
  1620. rtl8822b_prepare_mp_txdesc(padapter, pmp_priv);
  1621. #endif /* CONFIG_RTL8822B */
  1622. #if defined(CONFIG_RTL8821C)
  1623. if (IS_HARDWARE_TYPE_8821C(padapter))
  1624. rtl8821c_prepare_mp_txdesc(padapter, pmp_priv);
  1625. #endif /* CONFIG_RTL8821C */
  1626. #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A)
  1627. if (IS_HARDWARE_TYPE_8812(padapter) || IS_HARDWARE_TYPE_8821(padapter))
  1628. fill_tx_desc_8812a(padapter);
  1629. #endif
  1630. #if defined(CONFIG_RTL8192E)
  1631. if (IS_HARDWARE_TYPE_8192E(padapter))
  1632. fill_tx_desc_8192e(padapter);
  1633. #endif
  1634. #if defined(CONFIG_RTL8723B)
  1635. if (IS_HARDWARE_TYPE_8723B(padapter))
  1636. fill_tx_desc_8723b(padapter);
  1637. #endif
  1638. #if defined(CONFIG_RTL8703B)
  1639. if (IS_HARDWARE_TYPE_8703B(padapter))
  1640. fill_tx_desc_8703b(padapter);
  1641. #endif
  1642. #if defined(CONFIG_RTL8188F)
  1643. if (IS_HARDWARE_TYPE_8188F(padapter))
  1644. fill_tx_desc_8188f(padapter);
  1645. #endif
  1646. #if defined(CONFIG_RTL8188GTV)
  1647. if (IS_HARDWARE_TYPE_8188GTV(padapter))
  1648. fill_tx_desc_8188gtv(padapter);
  1649. #endif
  1650. #if defined(CONFIG_RTL8723D)
  1651. if (IS_HARDWARE_TYPE_8723D(padapter))
  1652. fill_tx_desc_8723d(padapter);
  1653. #endif
  1654. #if defined(CONFIG_RTL8192F)
  1655. if (IS_HARDWARE_TYPE_8192F(padapter))
  1656. fill_tx_desc_8192f(padapter);
  1657. #endif
  1658. #if defined(CONFIG_RTL8710B)
  1659. if (IS_HARDWARE_TYPE_8710B(padapter))
  1660. fill_tx_desc_8710b(padapter);
  1661. #endif
  1662. /* 3 4. make wlan header, make_wlanhdr() */
  1663. hdr = (struct rtw_ieee80211_hdr *)pkt_start;
  1664. set_frame_sub_type(&hdr->frame_ctl, pattrib->subtype);
  1665. _rtw_memcpy(hdr->addr1, pattrib->dst, ETH_ALEN); /* DA */
  1666. _rtw_memcpy(hdr->addr2, pattrib->src, ETH_ALEN); /* SA */
  1667. _rtw_memcpy(hdr->addr3, get_bssid(&padapter->mlmepriv), ETH_ALEN); /* RA, BSSID */
  1668. /* 3 5. make payload */
  1669. ptr = pkt_start + pattrib->hdrlen;
  1670. switch (pmp_priv->tx.payload) {
  1671. case 0:
  1672. payload = 0x00;
  1673. break;
  1674. case 1:
  1675. payload = 0x5a;
  1676. break;
  1677. case 2:
  1678. payload = 0xa5;
  1679. break;
  1680. case 3:
  1681. payload = 0xff;
  1682. break;
  1683. default:
  1684. payload = 0x00;
  1685. break;
  1686. }
  1687. pmp_priv->TXradomBuffer = rtw_zmalloc(4096);
  1688. if (pmp_priv->TXradomBuffer == NULL) {
  1689. RTW_INFO("mp create random buffer fail!\n");
  1690. goto exit;
  1691. }
  1692. for (i = 0; i < 4096; i++)
  1693. pmp_priv->TXradomBuffer[i] = rtw_random32() % 0xFF;
  1694. /* startPlace = (u32)(rtw_random32() % 3450); */
  1695. _rtw_memcpy(ptr, pmp_priv->TXradomBuffer, pkt_end - ptr);
  1696. /* _rtw_memset(ptr, payload, pkt_end - ptr); */
  1697. rtw_mfree(pmp_priv->TXradomBuffer, 4096);
  1698. /* 3 6. start thread */
  1699. #ifdef PLATFORM_LINUX
  1700. pmp_priv->tx.PktTxThread = kthread_run(mp_xmit_packet_thread, pmp_priv, "RTW_MP_THREAD");
  1701. if (IS_ERR(pmp_priv->tx.PktTxThread)) {
  1702. RTW_ERR("Create PktTx Thread Fail !!!!!\n");
  1703. pmp_priv->tx.PktTxThread = NULL;
  1704. }
  1705. #endif
  1706. #ifdef PLATFORM_FREEBSD
  1707. {
  1708. struct proc *p;
  1709. struct thread *td;
  1710. pmp_priv->tx.PktTxThread = kproc_kthread_add(mp_xmit_packet_thread, pmp_priv,
  1711. &p, &td, RFHIGHPID, 0, "MPXmitThread", "MPXmitThread");
  1712. if (pmp_priv->tx.PktTxThread < 0)
  1713. RTW_INFO("Create PktTx Thread Fail !!!!!\n");
  1714. }
  1715. #endif
  1716. Rtw_MPSetMacTxEDCA(padapter);
  1717. exit:
  1718. return;
  1719. }
  1720. void SetPacketRx(PADAPTER pAdapter, u8 bStartRx, u8 bAB)
  1721. {
  1722. PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
  1723. struct mp_priv *pmppriv = &pAdapter->mppriv;
  1724. if (bStartRx) {
  1725. #ifdef CONFIG_RTL8723B
  1726. phy_set_mac_reg(pAdapter, 0xe70, BIT23 | BIT22, 0x3); /* Power on adc (in RX_WAIT_CCA state) */
  1727. write_bbreg(pAdapter, 0xa01, BIT0, bDisable);/* improve Rx performance by jerry */
  1728. #endif
  1729. pHalData->ReceiveConfig = RCR_AAP | RCR_APM | RCR_AM | RCR_AMF | RCR_HTC_LOC_CTRL;
  1730. pHalData->ReceiveConfig |= RCR_ACRC32;
  1731. pHalData->ReceiveConfig |= RCR_APP_PHYST_RXFF | RCR_APP_ICV | RCR_APP_MIC;
  1732. if (pmppriv->bSetRxBssid == _TRUE) {
  1733. RTW_INFO("%s: pmppriv->network_macaddr=" MAC_FMT "\n", __func__,
  1734. MAC_ARG(pmppriv->network_macaddr));
  1735. pHalData->ReceiveConfig = 0;
  1736. pHalData->ReceiveConfig |= RCR_CBSSID_DATA | RCR_CBSSID_BCN |RCR_APM | RCR_AM | RCR_AB |RCR_AMF;
  1737. pHalData->ReceiveConfig |= RCR_APP_PHYST_RXFF;
  1738. #if defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8821C)
  1739. write_bbreg(pAdapter, 0x550, BIT3, bEnable);
  1740. #endif
  1741. rtw_write16(pAdapter, REG_RXFLTMAP0, 0xFFEF); /* REG_RXFLTMAP0 (RX Filter Map Group 0) */
  1742. pmppriv->brx_filter_beacon = _TRUE;
  1743. } else {
  1744. pHalData->ReceiveConfig |= RCR_ADF;
  1745. /* Accept all data frames */
  1746. rtw_write16(pAdapter, REG_RXFLTMAP2, 0xFFFF);
  1747. }
  1748. if (bAB)
  1749. pHalData->ReceiveConfig |= RCR_AB;
  1750. } else {
  1751. #ifdef CONFIG_RTL8723B
  1752. phy_set_mac_reg(pAdapter, 0xe70, BIT23 | BIT22, 0x00); /* Power off adc (in RX_WAIT_CCA state)*/
  1753. write_bbreg(pAdapter, 0xa01, BIT0, bEnable);/* improve Rx performance by jerry */
  1754. #endif
  1755. pHalData->ReceiveConfig = 0;
  1756. rtw_write16(pAdapter, REG_RXFLTMAP0, 0xFFFF); /* REG_RXFLTMAP0 (RX Filter Map Group 0) */
  1757. }
  1758. rtw_write32(pAdapter, REG_RCR, pHalData->ReceiveConfig);
  1759. }
  1760. void ResetPhyRxPktCount(PADAPTER pAdapter)
  1761. {
  1762. u32 i, phyrx_set = 0;
  1763. for (i = 0; i <= 0xF; i++) {
  1764. phyrx_set = 0;
  1765. phyrx_set |= _RXERR_RPT_SEL(i); /* select */
  1766. phyrx_set |= RXERR_RPT_RST; /* set counter to zero */
  1767. rtw_write32(pAdapter, REG_RXERR_RPT, phyrx_set);
  1768. }
  1769. }
  1770. static u32 GetPhyRxPktCounts(PADAPTER pAdapter, u32 selbit)
  1771. {
  1772. /* selection */
  1773. u32 phyrx_set = 0, count = 0;
  1774. phyrx_set = _RXERR_RPT_SEL(selbit & 0xF);
  1775. rtw_write32(pAdapter, REG_RXERR_RPT, phyrx_set);
  1776. /* Read packet count */
  1777. count = rtw_read32(pAdapter, REG_RXERR_RPT) & RXERR_COUNTER_MASK;
  1778. return count;
  1779. }
  1780. u32 GetPhyRxPktReceived(PADAPTER pAdapter)
  1781. {
  1782. u32 OFDM_cnt = 0, CCK_cnt = 0, HT_cnt = 0;
  1783. OFDM_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_OFDM_MPDU_OK);
  1784. CCK_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_CCK_MPDU_OK);
  1785. HT_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_HT_MPDU_OK);
  1786. return OFDM_cnt + CCK_cnt + HT_cnt;
  1787. }
  1788. u32 GetPhyRxPktCRC32Error(PADAPTER pAdapter)
  1789. {
  1790. u32 OFDM_cnt = 0, CCK_cnt = 0, HT_cnt = 0;
  1791. OFDM_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_OFDM_MPDU_FAIL);
  1792. CCK_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_CCK_MPDU_FAIL);
  1793. HT_cnt = GetPhyRxPktCounts(pAdapter, RXERR_TYPE_HT_MPDU_FAIL);
  1794. return OFDM_cnt + CCK_cnt + HT_cnt;
  1795. }
  1796. struct psd_init_regs {
  1797. /* 3 wire */
  1798. int reg_88c;
  1799. int reg_c00;
  1800. int reg_e00;
  1801. int reg_1800;
  1802. int reg_1a00;
  1803. /* cck */
  1804. int reg_800;
  1805. int reg_808;
  1806. };
  1807. static int rtw_mp_psd_init(PADAPTER padapter, struct psd_init_regs *regs)
  1808. {
  1809. HAL_DATA_TYPE *phal_data = GET_HAL_DATA(padapter);
  1810. switch (phal_data->rf_type) {
  1811. /* 1R */
  1812. case RF_1T1R:
  1813. if (hal_chk_proto_cap(padapter, PROTO_CAP_11AC)) {
  1814. /* 11AC 1R PSD Setting 3wire & cck off */
  1815. regs->reg_c00 = rtw_read32(padapter, 0xC00);
  1816. phy_set_bb_reg(padapter, 0xC00, 0x3, 0x00);
  1817. regs->reg_808 = rtw_read32(padapter, 0x808);
  1818. phy_set_bb_reg(padapter, 0x808, 0x10000000, 0x0);
  1819. } else {
  1820. /* 11N 3-wire off 1 */
  1821. regs->reg_88c = rtw_read32(padapter, 0x88C);
  1822. phy_set_bb_reg(padapter, 0x88C, 0x300000, 0x3);
  1823. /* 11N CCK off */
  1824. regs->reg_800 = rtw_read32(padapter, 0x800);
  1825. phy_set_bb_reg(padapter, 0x800, 0x1000000, 0x0);
  1826. }
  1827. break;
  1828. /* 2R */
  1829. case RF_1T2R:
  1830. case RF_2T2R:
  1831. if (hal_chk_proto_cap(padapter, PROTO_CAP_11AC)) {
  1832. /* 11AC 2R PSD Setting 3wire & cck off */
  1833. regs->reg_c00 = rtw_read32(padapter, 0xC00);
  1834. regs->reg_e00 = rtw_read32(padapter, 0xE00);
  1835. phy_set_bb_reg(padapter, 0xC00, 0x3, 0x00);
  1836. phy_set_bb_reg(padapter, 0xE00, 0x3, 0x00);
  1837. regs->reg_808 = rtw_read32(padapter, 0x808);
  1838. phy_set_bb_reg(padapter, 0x808, 0x10000000, 0x0);
  1839. } else {
  1840. /* 11N 3-wire off 2 */
  1841. regs->reg_88c = rtw_read32(padapter, 0x88C);
  1842. phy_set_bb_reg(padapter, 0x88C, 0xF00000, 0xF);
  1843. /* 11N CCK off */
  1844. regs->reg_800 = rtw_read32(padapter, 0x800);
  1845. phy_set_bb_reg(padapter, 0x800, 0x1000000, 0x0);
  1846. }
  1847. break;
  1848. /* 3R */
  1849. case RF_2T3R:
  1850. case RF_3T3R:
  1851. if (hal_chk_proto_cap(padapter, PROTO_CAP_11AC)) {
  1852. /* 11AC 3R PSD Setting 3wire & cck off */
  1853. regs->reg_c00 = rtw_read32(padapter, 0xC00);
  1854. regs->reg_e00 = rtw_read32(padapter, 0xE00);
  1855. regs->reg_1800 = rtw_read32(padapter, 0x1800);
  1856. phy_set_bb_reg(padapter, 0xC00, 0x3, 0x00);
  1857. phy_set_bb_reg(padapter, 0xE00, 0x3, 0x00);
  1858. phy_set_bb_reg(padapter, 0x1800, 0x3, 0x00);
  1859. regs->reg_808 = rtw_read32(padapter, 0x808);
  1860. phy_set_bb_reg(padapter, 0x808, 0x10000000, 0x0);
  1861. } else {
  1862. RTW_ERR("%s: 11n don't support 3R\n", __func__);
  1863. return -1;
  1864. }
  1865. break;
  1866. /* 4R */
  1867. case RF_2T4R:
  1868. case RF_3T4R:
  1869. case RF_4T4R:
  1870. if (hal_chk_proto_cap(padapter, PROTO_CAP_11AC)) {
  1871. /* 11AC 4R PSD Setting 3wire & cck off */
  1872. regs->reg_c00 = rtw_read32(padapter, 0xC00);
  1873. regs->reg_e00 = rtw_read32(padapter, 0xE00);
  1874. regs->reg_1800 = rtw_read32(padapter, 0x1800);
  1875. regs->reg_1a00 = rtw_read32(padapter, 0x1A00);
  1876. phy_set_bb_reg(padapter, 0xC00, 0x3, 0x00);
  1877. phy_set_bb_reg(padapter, 0xE00, 0x3, 0x00);
  1878. phy_set_bb_reg(padapter, 0x1800, 0x3, 0x00);
  1879. phy_set_bb_reg(padapter, 0x1A00, 0x3, 0x00);
  1880. regs->reg_808 = rtw_read32(padapter, 0x808);
  1881. phy_set_bb_reg(padapter, 0x808, 0x10000000, 0x0);
  1882. } else {
  1883. RTW_ERR("%s: 11n don't support 4R\n", __func__);
  1884. return -1;
  1885. }
  1886. break;
  1887. default:
  1888. RTW_ERR("%s: unknown %d rf type\n", __func__, phal_data->rf_type);
  1889. return -1;
  1890. }
  1891. /* Set PSD points, 0=128, 1=256, 2=512, 3=1024 */
  1892. if (hal_chk_proto_cap(padapter, PROTO_CAP_11AC))
  1893. phy_set_bb_reg(padapter, 0x910, 0xC000, 3);
  1894. else
  1895. phy_set_bb_reg(padapter, 0x808, 0xC000, 3);
  1896. RTW_INFO("%s: set %d rf type done\n", __func__, phal_data->rf_type);
  1897. return 0;
  1898. }
  1899. static int rtw_mp_psd_close(PADAPTER padapter, struct psd_init_regs *regs)
  1900. {
  1901. HAL_DATA_TYPE *phal_data = GET_HAL_DATA(padapter);
  1902. if (!hal_chk_proto_cap(padapter, PROTO_CAP_11AC)) {
  1903. /* 11n 3wire restore */
  1904. rtw_write32(padapter, 0x88C, regs->reg_88c);
  1905. /* 11n cck restore */
  1906. rtw_write32(padapter, 0x800, regs->reg_800);
  1907. RTW_INFO("%s: restore %d rf type\n", __func__, phal_data->rf_type);
  1908. return 0;
  1909. }
  1910. /* 11ac 3wire restore */
  1911. switch (phal_data->rf_type) {
  1912. case RF_1T1R:
  1913. rtw_write32(padapter, 0xC00, regs->reg_c00);
  1914. break;
  1915. case RF_1T2R:
  1916. case RF_2T2R:
  1917. rtw_write32(padapter, 0xC00, regs->reg_c00);
  1918. rtw_write32(padapter, 0xE00, regs->reg_e00);
  1919. break;
  1920. case RF_2T3R:
  1921. case RF_3T3R:
  1922. rtw_write32(padapter, 0xC00, regs->reg_c00);
  1923. rtw_write32(padapter, 0xE00, regs->reg_e00);
  1924. rtw_write32(padapter, 0x1800, regs->reg_1800);
  1925. break;
  1926. case RF_2T4R:
  1927. case RF_3T4R:
  1928. case RF_4T4R:
  1929. rtw_write32(padapter, 0xC00, regs->reg_c00);
  1930. rtw_write32(padapter, 0xE00, regs->reg_e00);
  1931. rtw_write32(padapter, 0x1800, regs->reg_1800);
  1932. rtw_write32(padapter, 0x1A00, regs->reg_1a00);
  1933. break;
  1934. default:
  1935. RTW_WARN("%s: unknown %d rf type\n", __func__, phal_data->rf_type);
  1936. break;
  1937. }
  1938. /* 11ac cck restore */
  1939. rtw_write32(padapter, 0x808, regs->reg_808);
  1940. RTW_INFO("%s: restore %d rf type done\n", __func__, phal_data->rf_type);
  1941. return 0;
  1942. }
  1943. /* reg 0x808[9:0]: FFT data x
  1944. * reg 0x808[22]: 0 --> 1 to get 1 FFT data y
  1945. * reg 0x8B4[15:0]: FFT data y report */
  1946. static u32 rtw_GetPSDData(PADAPTER pAdapter, u32 point)
  1947. {
  1948. u32 psd_val = 0;
  1949. #if defined(CONFIG_RTL8812A) || defined(CONFIG_RTL8821A) || defined(CONFIG_RTL8814A) || defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8821C)
  1950. u16 psd_reg = 0x910;
  1951. u16 psd_regL = 0xF44;
  1952. #else
  1953. u16 psd_reg = 0x808;
  1954. u16 psd_regL = 0x8B4;
  1955. #endif
  1956. psd_val = rtw_read32(pAdapter, psd_reg);
  1957. psd_val &= 0xFFBFFC00;
  1958. psd_val |= point;
  1959. rtw_write32(pAdapter, psd_reg, psd_val);
  1960. rtw_mdelay_os(1);
  1961. psd_val |= 0x00400000;
  1962. rtw_write32(pAdapter, psd_reg, psd_val);
  1963. rtw_mdelay_os(1);
  1964. psd_val = rtw_read32(pAdapter, psd_regL);
  1965. #if defined(CONFIG_RTL8821C)
  1966. psd_val = (psd_val & 0x00FFFFFF) / 32;
  1967. #else
  1968. psd_val &= 0x0000FFFF;
  1969. #endif
  1970. return psd_val;
  1971. }
  1972. /*
  1973. * pts start_point_min stop_point_max
  1974. * 128 64 64 + 128 = 192
  1975. * 256 128 128 + 256 = 384
  1976. * 512 256 256 + 512 = 768
  1977. * 1024 512 512 + 1024 = 1536
  1978. *
  1979. */
  1980. u32 mp_query_psd(PADAPTER pAdapter, u8 *data)
  1981. {
  1982. u32 i, psd_pts = 0, psd_start = 0, psd_stop = 0;
  1983. u32 psd_data = 0;
  1984. struct psd_init_regs regs = {};
  1985. int psd_analysis = 0;
  1986. #ifdef PLATFORM_LINUX
  1987. if (!netif_running(pAdapter->pnetdev)) {
  1988. return 0;
  1989. }
  1990. #endif
  1991. if (check_fwstate(&pAdapter->mlmepriv, WIFI_MP_STATE) == _FALSE) {
  1992. return 0;
  1993. }
  1994. if (strlen(data) == 0) { /* default value */
  1995. psd_pts = 128;
  1996. psd_start = 64;
  1997. psd_stop = 128;
  1998. } else if (strncmp(data, "analysis,", 9) == 0) {
  1999. if (rtw_mp_psd_init(pAdapter, &regs) != 0)
  2000. return 0;
  2001. psd_analysis = 1;
  2002. sscanf(data + 9, "pts=%d,start=%d,stop=%d", &psd_pts, &psd_start, &psd_stop);
  2003. } else
  2004. sscanf(data, "pts=%d,start=%d,stop=%d", &psd_pts, &psd_start, &psd_stop);
  2005. data[0] = '\0';
  2006. i = psd_start;
  2007. while (i < psd_stop) {
  2008. if (i >= psd_pts)
  2009. psd_data = rtw_GetPSDData(pAdapter, i - psd_pts);
  2010. else
  2011. psd_data = rtw_GetPSDData(pAdapter, i);
  2012. sprintf(data, "%s%x ", data, psd_data);
  2013. i++;
  2014. }
  2015. #ifdef CONFIG_LONG_DELAY_ISSUE
  2016. rtw_msleep_os(100);
  2017. #else
  2018. rtw_mdelay_os(100);
  2019. #endif
  2020. if (psd_analysis)
  2021. rtw_mp_psd_close(pAdapter, &regs);
  2022. return strlen(data) + 1;
  2023. }
  2024. #if 0
  2025. void _rtw_mp_xmit_priv(struct xmit_priv *pxmitpriv)
  2026. {
  2027. int i, res;
  2028. _adapter *padapter = pxmitpriv->adapter;
  2029. struct xmit_frame *pxmitframe = (struct xmit_frame *) pxmitpriv->pxmit_frame_buf;
  2030. struct xmit_buf *pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf;
  2031. u32 max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ;
  2032. u32 num_xmit_extbuf = NR_XMIT_EXTBUFF;
  2033. if (padapter->registrypriv.mp_mode == 0) {
  2034. max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ;
  2035. num_xmit_extbuf = NR_XMIT_EXTBUFF;
  2036. } else {
  2037. max_xmit_extbuf_size = 6000;
  2038. num_xmit_extbuf = 8;
  2039. }
  2040. pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf;
  2041. for (i = 0; i < num_xmit_extbuf; i++) {
  2042. rtw_os_xmit_resource_free(padapter, pxmitbuf, (max_xmit_extbuf_size + XMITBUF_ALIGN_SZ), _FALSE);
  2043. pxmitbuf++;
  2044. }
  2045. if (pxmitpriv->pallocated_xmit_extbuf)
  2046. rtw_vmfree(pxmitpriv->pallocated_xmit_extbuf, num_xmit_extbuf * sizeof(struct xmit_buf) + 4);
  2047. if (padapter->registrypriv.mp_mode == 0) {
  2048. max_xmit_extbuf_size = 6000;
  2049. num_xmit_extbuf = 8;
  2050. } else {
  2051. max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ;
  2052. num_xmit_extbuf = NR_XMIT_EXTBUFF;
  2053. }
  2054. /* Init xmit extension buff */
  2055. _rtw_init_queue(&pxmitpriv->free_xmit_extbuf_queue);
  2056. pxmitpriv->pallocated_xmit_extbuf = rtw_zvmalloc(num_xmit_extbuf * sizeof(struct xmit_buf) + 4);
  2057. if (pxmitpriv->pallocated_xmit_extbuf == NULL) {
  2058. res = _FAIL;
  2059. goto exit;
  2060. }
  2061. pxmitpriv->pxmit_extbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_xmit_extbuf), 4);
  2062. pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf;
  2063. for (i = 0; i < num_xmit_extbuf; i++) {
  2064. _rtw_init_listhead(&pxmitbuf->list);
  2065. pxmitbuf->priv_data = NULL;
  2066. pxmitbuf->padapter = padapter;
  2067. pxmitbuf->buf_tag = XMITBUF_MGNT;
  2068. res = rtw_os_xmit_resource_alloc(padapter, pxmitbuf, max_xmit_extbuf_size + XMITBUF_ALIGN_SZ, _TRUE);
  2069. if (res == _FAIL) {
  2070. res = _FAIL;
  2071. goto exit;
  2072. }
  2073. #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
  2074. pxmitbuf->phead = pxmitbuf->pbuf;
  2075. pxmitbuf->pend = pxmitbuf->pbuf + max_xmit_extbuf_size;
  2076. pxmitbuf->len = 0;
  2077. pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
  2078. #endif
  2079. rtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmit_extbuf_queue.queue));
  2080. #ifdef DBG_XMIT_BUF_EXT
  2081. pxmitbuf->no = i;
  2082. #endif
  2083. pxmitbuf++;
  2084. }
  2085. pxmitpriv->free_xmit_extbuf_cnt = num_xmit_extbuf;
  2086. exit:
  2087. ;
  2088. }
  2089. #endif
  2090. u8
  2091. mpt_to_mgnt_rate(
  2092. IN ULONG MptRateIdx
  2093. )
  2094. {
  2095. /* Mapped to MGN_XXX defined in MgntGen.h */
  2096. switch (MptRateIdx) {
  2097. /* CCK rate. */
  2098. case MPT_RATE_1M:
  2099. return MGN_1M;
  2100. case MPT_RATE_2M:
  2101. return MGN_2M;
  2102. case MPT_RATE_55M:
  2103. return MGN_5_5M;
  2104. case MPT_RATE_11M:
  2105. return MGN_11M;
  2106. /* OFDM rate. */
  2107. case MPT_RATE_6M:
  2108. return MGN_6M;
  2109. case MPT_RATE_9M:
  2110. return MGN_9M;
  2111. case MPT_RATE_12M:
  2112. return MGN_12M;
  2113. case MPT_RATE_18M:
  2114. return MGN_18M;
  2115. case MPT_RATE_24M:
  2116. return MGN_24M;
  2117. case MPT_RATE_36M:
  2118. return MGN_36M;
  2119. case MPT_RATE_48M:
  2120. return MGN_48M;
  2121. case MPT_RATE_54M:
  2122. return MGN_54M;
  2123. /* HT rate. */
  2124. case MPT_RATE_MCS0:
  2125. return MGN_MCS0;
  2126. case MPT_RATE_MCS1:
  2127. return MGN_MCS1;
  2128. case MPT_RATE_MCS2:
  2129. return MGN_MCS2;
  2130. case MPT_RATE_MCS3:
  2131. return MGN_MCS3;
  2132. case MPT_RATE_MCS4:
  2133. return MGN_MCS4;
  2134. case MPT_RATE_MCS5:
  2135. return MGN_MCS5;
  2136. case MPT_RATE_MCS6:
  2137. return MGN_MCS6;
  2138. case MPT_RATE_MCS7:
  2139. return MGN_MCS7;
  2140. case MPT_RATE_MCS8:
  2141. return MGN_MCS8;
  2142. case MPT_RATE_MCS9:
  2143. return MGN_MCS9;
  2144. case MPT_RATE_MCS10:
  2145. return MGN_MCS10;
  2146. case MPT_RATE_MCS11:
  2147. return MGN_MCS11;
  2148. case MPT_RATE_MCS12:
  2149. return MGN_MCS12;
  2150. case MPT_RATE_MCS13:
  2151. return MGN_MCS13;
  2152. case MPT_RATE_MCS14:
  2153. return MGN_MCS14;
  2154. case MPT_RATE_MCS15:
  2155. return MGN_MCS15;
  2156. case MPT_RATE_MCS16:
  2157. return MGN_MCS16;
  2158. case MPT_RATE_MCS17:
  2159. return MGN_MCS17;
  2160. case MPT_RATE_MCS18:
  2161. return MGN_MCS18;
  2162. case MPT_RATE_MCS19:
  2163. return MGN_MCS19;
  2164. case MPT_RATE_MCS20:
  2165. return MGN_MCS20;
  2166. case MPT_RATE_MCS21:
  2167. return MGN_MCS21;
  2168. case MPT_RATE_MCS22:
  2169. return MGN_MCS22;
  2170. case MPT_RATE_MCS23:
  2171. return MGN_MCS23;
  2172. case MPT_RATE_MCS24:
  2173. return MGN_MCS24;
  2174. case MPT_RATE_MCS25:
  2175. return MGN_MCS25;
  2176. case MPT_RATE_MCS26:
  2177. return MGN_MCS26;
  2178. case MPT_RATE_MCS27:
  2179. return MGN_MCS27;
  2180. case MPT_RATE_MCS28:
  2181. return MGN_MCS28;
  2182. case MPT_RATE_MCS29:
  2183. return MGN_MCS29;
  2184. case MPT_RATE_MCS30:
  2185. return MGN_MCS30;
  2186. case MPT_RATE_MCS31:
  2187. return MGN_MCS31;
  2188. /* VHT rate. */
  2189. case MPT_RATE_VHT1SS_MCS0:
  2190. return MGN_VHT1SS_MCS0;
  2191. case MPT_RATE_VHT1SS_MCS1:
  2192. return MGN_VHT1SS_MCS1;
  2193. case MPT_RATE_VHT1SS_MCS2:
  2194. return MGN_VHT1SS_MCS2;
  2195. case MPT_RATE_VHT1SS_MCS3:
  2196. return MGN_VHT1SS_MCS3;
  2197. case MPT_RATE_VHT1SS_MCS4:
  2198. return MGN_VHT1SS_MCS4;
  2199. case MPT_RATE_VHT1SS_MCS5:
  2200. return MGN_VHT1SS_MCS5;
  2201. case MPT_RATE_VHT1SS_MCS6:
  2202. return MGN_VHT1SS_MCS6;
  2203. case MPT_RATE_VHT1SS_MCS7:
  2204. return MGN_VHT1SS_MCS7;
  2205. case MPT_RATE_VHT1SS_MCS8:
  2206. return MGN_VHT1SS_MCS8;
  2207. case MPT_RATE_VHT1SS_MCS9:
  2208. return MGN_VHT1SS_MCS9;
  2209. case MPT_RATE_VHT2SS_MCS0:
  2210. return MGN_VHT2SS_MCS0;
  2211. case MPT_RATE_VHT2SS_MCS1:
  2212. return MGN_VHT2SS_MCS1;
  2213. case MPT_RATE_VHT2SS_MCS2:
  2214. return MGN_VHT2SS_MCS2;
  2215. case MPT_RATE_VHT2SS_MCS3:
  2216. return MGN_VHT2SS_MCS3;
  2217. case MPT_RATE_VHT2SS_MCS4:
  2218. return MGN_VHT2SS_MCS4;
  2219. case MPT_RATE_VHT2SS_MCS5:
  2220. return MGN_VHT2SS_MCS5;
  2221. case MPT_RATE_VHT2SS_MCS6:
  2222. return MGN_VHT2SS_MCS6;
  2223. case MPT_RATE_VHT2SS_MCS7:
  2224. return MGN_VHT2SS_MCS7;
  2225. case MPT_RATE_VHT2SS_MCS8:
  2226. return MGN_VHT2SS_MCS8;
  2227. case MPT_RATE_VHT2SS_MCS9:
  2228. return MGN_VHT2SS_MCS9;
  2229. case MPT_RATE_VHT3SS_MCS0:
  2230. return MGN_VHT3SS_MCS0;
  2231. case MPT_RATE_VHT3SS_MCS1:
  2232. return MGN_VHT3SS_MCS1;
  2233. case MPT_RATE_VHT3SS_MCS2:
  2234. return MGN_VHT3SS_MCS2;
  2235. case MPT_RATE_VHT3SS_MCS3:
  2236. return MGN_VHT3SS_MCS3;
  2237. case MPT_RATE_VHT3SS_MCS4:
  2238. return MGN_VHT3SS_MCS4;
  2239. case MPT_RATE_VHT3SS_MCS5:
  2240. return MGN_VHT3SS_MCS5;
  2241. case MPT_RATE_VHT3SS_MCS6:
  2242. return MGN_VHT3SS_MCS6;
  2243. case MPT_RATE_VHT3SS_MCS7:
  2244. return MGN_VHT3SS_MCS7;
  2245. case MPT_RATE_VHT3SS_MCS8:
  2246. return MGN_VHT3SS_MCS8;
  2247. case MPT_RATE_VHT3SS_MCS9:
  2248. return MGN_VHT3SS_MCS9;
  2249. case MPT_RATE_VHT4SS_MCS0:
  2250. return MGN_VHT4SS_MCS0;
  2251. case MPT_RATE_VHT4SS_MCS1:
  2252. return MGN_VHT4SS_MCS1;
  2253. case MPT_RATE_VHT4SS_MCS2:
  2254. return MGN_VHT4SS_MCS2;
  2255. case MPT_RATE_VHT4SS_MCS3:
  2256. return MGN_VHT4SS_MCS3;
  2257. case MPT_RATE_VHT4SS_MCS4:
  2258. return MGN_VHT4SS_MCS4;
  2259. case MPT_RATE_VHT4SS_MCS5:
  2260. return MGN_VHT4SS_MCS5;
  2261. case MPT_RATE_VHT4SS_MCS6:
  2262. return MGN_VHT4SS_MCS6;
  2263. case MPT_RATE_VHT4SS_MCS7:
  2264. return MGN_VHT4SS_MCS7;
  2265. case MPT_RATE_VHT4SS_MCS8:
  2266. return MGN_VHT4SS_MCS8;
  2267. case MPT_RATE_VHT4SS_MCS9:
  2268. return MGN_VHT4SS_MCS9;
  2269. case MPT_RATE_LAST: /* fully automatiMGN_VHT2SS_MCS1; */
  2270. default:
  2271. RTW_INFO("<===mpt_to_mgnt_rate(), Invalid Rate: %d!!\n", MptRateIdx);
  2272. return 0x0;
  2273. }
  2274. }
  2275. u8 HwRateToMPTRate(u8 rate)
  2276. {
  2277. u8 ret_rate = MGN_1M;
  2278. switch (rate) {
  2279. case DESC_RATE1M:
  2280. ret_rate = MPT_RATE_1M;
  2281. break;
  2282. case DESC_RATE2M:
  2283. ret_rate = MPT_RATE_2M;
  2284. break;
  2285. case DESC_RATE5_5M:
  2286. ret_rate = MPT_RATE_55M;
  2287. break;
  2288. case DESC_RATE11M:
  2289. ret_rate = MPT_RATE_11M;
  2290. break;
  2291. case DESC_RATE6M:
  2292. ret_rate = MPT_RATE_6M;
  2293. break;
  2294. case DESC_RATE9M:
  2295. ret_rate = MPT_RATE_9M;
  2296. break;
  2297. case DESC_RATE12M:
  2298. ret_rate = MPT_RATE_12M;
  2299. break;
  2300. case DESC_RATE18M:
  2301. ret_rate = MPT_RATE_18M;
  2302. break;
  2303. case DESC_RATE24M:
  2304. ret_rate = MPT_RATE_24M;
  2305. break;
  2306. case DESC_RATE36M:
  2307. ret_rate = MPT_RATE_36M;
  2308. break;
  2309. case DESC_RATE48M:
  2310. ret_rate = MPT_RATE_48M;
  2311. break;
  2312. case DESC_RATE54M:
  2313. ret_rate = MPT_RATE_54M;
  2314. break;
  2315. case DESC_RATEMCS0:
  2316. ret_rate = MPT_RATE_MCS0;
  2317. break;
  2318. case DESC_RATEMCS1:
  2319. ret_rate = MPT_RATE_MCS1;
  2320. break;
  2321. case DESC_RATEMCS2:
  2322. ret_rate = MPT_RATE_MCS2;
  2323. break;
  2324. case DESC_RATEMCS3:
  2325. ret_rate = MPT_RATE_MCS3;
  2326. break;
  2327. case DESC_RATEMCS4:
  2328. ret_rate = MPT_RATE_MCS4;
  2329. break;
  2330. case DESC_RATEMCS5:
  2331. ret_rate = MPT_RATE_MCS5;
  2332. break;
  2333. case DESC_RATEMCS6:
  2334. ret_rate = MPT_RATE_MCS6;
  2335. break;
  2336. case DESC_RATEMCS7:
  2337. ret_rate = MPT_RATE_MCS7;
  2338. break;
  2339. case DESC_RATEMCS8:
  2340. ret_rate = MPT_RATE_MCS8;
  2341. break;
  2342. case DESC_RATEMCS9:
  2343. ret_rate = MPT_RATE_MCS9;
  2344. break;
  2345. case DESC_RATEMCS10:
  2346. ret_rate = MPT_RATE_MCS10;
  2347. break;
  2348. case DESC_RATEMCS11:
  2349. ret_rate = MPT_RATE_MCS11;
  2350. break;
  2351. case DESC_RATEMCS12:
  2352. ret_rate = MPT_RATE_MCS12;
  2353. break;
  2354. case DESC_RATEMCS13:
  2355. ret_rate = MPT_RATE_MCS13;
  2356. break;
  2357. case DESC_RATEMCS14:
  2358. ret_rate = MPT_RATE_MCS14;
  2359. break;
  2360. case DESC_RATEMCS15:
  2361. ret_rate = MPT_RATE_MCS15;
  2362. break;
  2363. case DESC_RATEMCS16:
  2364. ret_rate = MPT_RATE_MCS16;
  2365. break;
  2366. case DESC_RATEMCS17:
  2367. ret_rate = MPT_RATE_MCS17;
  2368. break;
  2369. case DESC_RATEMCS18:
  2370. ret_rate = MPT_RATE_MCS18;
  2371. break;
  2372. case DESC_RATEMCS19:
  2373. ret_rate = MPT_RATE_MCS19;
  2374. break;
  2375. case DESC_RATEMCS20:
  2376. ret_rate = MPT_RATE_MCS20;
  2377. break;
  2378. case DESC_RATEMCS21:
  2379. ret_rate = MPT_RATE_MCS21;
  2380. break;
  2381. case DESC_RATEMCS22:
  2382. ret_rate = MPT_RATE_MCS22;
  2383. break;
  2384. case DESC_RATEMCS23:
  2385. ret_rate = MPT_RATE_MCS23;
  2386. break;
  2387. case DESC_RATEMCS24:
  2388. ret_rate = MPT_RATE_MCS24;
  2389. break;
  2390. case DESC_RATEMCS25:
  2391. ret_rate = MPT_RATE_MCS25;
  2392. break;
  2393. case DESC_RATEMCS26:
  2394. ret_rate = MPT_RATE_MCS26;
  2395. break;
  2396. case DESC_RATEMCS27:
  2397. ret_rate = MPT_RATE_MCS27;
  2398. break;
  2399. case DESC_RATEMCS28:
  2400. ret_rate = MPT_RATE_MCS28;
  2401. break;
  2402. case DESC_RATEMCS29:
  2403. ret_rate = MPT_RATE_MCS29;
  2404. break;
  2405. case DESC_RATEMCS30:
  2406. ret_rate = MPT_RATE_MCS30;
  2407. break;
  2408. case DESC_RATEMCS31:
  2409. ret_rate = MPT_RATE_MCS31;
  2410. break;
  2411. case DESC_RATEVHTSS1MCS0:
  2412. ret_rate = MPT_RATE_VHT1SS_MCS0;
  2413. break;
  2414. case DESC_RATEVHTSS1MCS1:
  2415. ret_rate = MPT_RATE_VHT1SS_MCS1;
  2416. break;
  2417. case DESC_RATEVHTSS1MCS2:
  2418. ret_rate = MPT_RATE_VHT1SS_MCS2;
  2419. break;
  2420. case DESC_RATEVHTSS1MCS3:
  2421. ret_rate = MPT_RATE_VHT1SS_MCS3;
  2422. break;
  2423. case DESC_RATEVHTSS1MCS4:
  2424. ret_rate = MPT_RATE_VHT1SS_MCS4;
  2425. break;
  2426. case DESC_RATEVHTSS1MCS5:
  2427. ret_rate = MPT_RATE_VHT1SS_MCS5;
  2428. break;
  2429. case DESC_RATEVHTSS1MCS6:
  2430. ret_rate = MPT_RATE_VHT1SS_MCS6;
  2431. break;
  2432. case DESC_RATEVHTSS1MCS7:
  2433. ret_rate = MPT_RATE_VHT1SS_MCS7;
  2434. break;
  2435. case DESC_RATEVHTSS1MCS8:
  2436. ret_rate = MPT_RATE_VHT1SS_MCS8;
  2437. break;
  2438. case DESC_RATEVHTSS1MCS9:
  2439. ret_rate = MPT_RATE_VHT1SS_MCS9;
  2440. break;
  2441. case DESC_RATEVHTSS2MCS0:
  2442. ret_rate = MPT_RATE_VHT2SS_MCS0;
  2443. break;
  2444. case DESC_RATEVHTSS2MCS1:
  2445. ret_rate = MPT_RATE_VHT2SS_MCS1;
  2446. break;
  2447. case DESC_RATEVHTSS2MCS2:
  2448. ret_rate = MPT_RATE_VHT2SS_MCS2;
  2449. break;
  2450. case DESC_RATEVHTSS2MCS3:
  2451. ret_rate = MPT_RATE_VHT2SS_MCS3;
  2452. break;
  2453. case DESC_RATEVHTSS2MCS4:
  2454. ret_rate = MPT_RATE_VHT2SS_MCS4;
  2455. break;
  2456. case DESC_RATEVHTSS2MCS5:
  2457. ret_rate = MPT_RATE_VHT2SS_MCS5;
  2458. break;
  2459. case DESC_RATEVHTSS2MCS6:
  2460. ret_rate = MPT_RATE_VHT2SS_MCS6;
  2461. break;
  2462. case DESC_RATEVHTSS2MCS7:
  2463. ret_rate = MPT_RATE_VHT2SS_MCS7;
  2464. break;
  2465. case DESC_RATEVHTSS2MCS8:
  2466. ret_rate = MPT_RATE_VHT2SS_MCS8;
  2467. break;
  2468. case DESC_RATEVHTSS2MCS9:
  2469. ret_rate = MPT_RATE_VHT2SS_MCS9;
  2470. break;
  2471. case DESC_RATEVHTSS3MCS0:
  2472. ret_rate = MPT_RATE_VHT3SS_MCS0;
  2473. break;
  2474. case DESC_RATEVHTSS3MCS1:
  2475. ret_rate = MPT_RATE_VHT3SS_MCS1;
  2476. break;
  2477. case DESC_RATEVHTSS3MCS2:
  2478. ret_rate = MPT_RATE_VHT3SS_MCS2;
  2479. break;
  2480. case DESC_RATEVHTSS3MCS3:
  2481. ret_rate = MPT_RATE_VHT3SS_MCS3;
  2482. break;
  2483. case DESC_RATEVHTSS3MCS4:
  2484. ret_rate = MPT_RATE_VHT3SS_MCS4;
  2485. break;
  2486. case DESC_RATEVHTSS3MCS5:
  2487. ret_rate = MPT_RATE_VHT3SS_MCS5;
  2488. break;
  2489. case DESC_RATEVHTSS3MCS6:
  2490. ret_rate = MPT_RATE_VHT3SS_MCS6;
  2491. break;
  2492. case DESC_RATEVHTSS3MCS7:
  2493. ret_rate = MPT_RATE_VHT3SS_MCS7;
  2494. break;
  2495. case DESC_RATEVHTSS3MCS8:
  2496. ret_rate = MPT_RATE_VHT3SS_MCS8;
  2497. break;
  2498. case DESC_RATEVHTSS3MCS9:
  2499. ret_rate = MPT_RATE_VHT3SS_MCS9;
  2500. break;
  2501. case DESC_RATEVHTSS4MCS0:
  2502. ret_rate = MPT_RATE_VHT4SS_MCS0;
  2503. break;
  2504. case DESC_RATEVHTSS4MCS1:
  2505. ret_rate = MPT_RATE_VHT4SS_MCS1;
  2506. break;
  2507. case DESC_RATEVHTSS4MCS2:
  2508. ret_rate = MPT_RATE_VHT4SS_MCS2;
  2509. break;
  2510. case DESC_RATEVHTSS4MCS3:
  2511. ret_rate = MPT_RATE_VHT4SS_MCS3;
  2512. break;
  2513. case DESC_RATEVHTSS4MCS4:
  2514. ret_rate = MPT_RATE_VHT4SS_MCS4;
  2515. break;
  2516. case DESC_RATEVHTSS4MCS5:
  2517. ret_rate = MPT_RATE_VHT4SS_MCS5;
  2518. break;
  2519. case DESC_RATEVHTSS4MCS6:
  2520. ret_rate = MPT_RATE_VHT4SS_MCS6;
  2521. break;
  2522. case DESC_RATEVHTSS4MCS7:
  2523. ret_rate = MPT_RATE_VHT4SS_MCS7;
  2524. break;
  2525. case DESC_RATEVHTSS4MCS8:
  2526. ret_rate = MPT_RATE_VHT4SS_MCS8;
  2527. break;
  2528. case DESC_RATEVHTSS4MCS9:
  2529. ret_rate = MPT_RATE_VHT4SS_MCS9;
  2530. break;
  2531. default:
  2532. RTW_INFO("hw_rate_to_m_rate(): Non supported Rate [%x]!!!\n", rate);
  2533. break;
  2534. }
  2535. return ret_rate;
  2536. }
  2537. u8 rtw_mpRateParseFunc(PADAPTER pAdapter, u8 *targetStr)
  2538. {
  2539. u16 i = 0;
  2540. u8 *rateindex_Array[] = { "1M", "2M", "5.5M", "11M", "6M", "9M", "12M", "18M", "24M", "36M", "48M", "54M",
  2541. "HTMCS0", "HTMCS1", "HTMCS2", "HTMCS3", "HTMCS4", "HTMCS5", "HTMCS6", "HTMCS7",
  2542. "HTMCS8", "HTMCS9", "HTMCS10", "HTMCS11", "HTMCS12", "HTMCS13", "HTMCS14", "HTMCS15",
  2543. "HTMCS16", "HTMCS17", "HTMCS18", "HTMCS19", "HTMCS20", "HTMCS21", "HTMCS22", "HTMCS23",
  2544. "HTMCS24", "HTMCS25", "HTMCS26", "HTMCS27", "HTMCS28", "HTMCS29", "HTMCS30", "HTMCS31",
  2545. "VHT1MCS0", "VHT1MCS1", "VHT1MCS2", "VHT1MCS3", "VHT1MCS4", "VHT1MCS5", "VHT1MCS6", "VHT1MCS7", "VHT1MCS8", "VHT1MCS9",
  2546. "VHT2MCS0", "VHT2MCS1", "VHT2MCS2", "VHT2MCS3", "VHT2MCS4", "VHT2MCS5", "VHT2MCS6", "VHT2MCS7", "VHT2MCS8", "VHT2MCS9",
  2547. "VHT3MCS0", "VHT3MCS1", "VHT3MCS2", "VHT3MCS3", "VHT3MCS4", "VHT3MCS5", "VHT3MCS6", "VHT3MCS7", "VHT3MCS8", "VHT3MCS9",
  2548. "VHT4MCS0", "VHT4MCS1", "VHT4MCS2", "VHT4MCS3", "VHT4MCS4", "VHT4MCS5", "VHT4MCS6", "VHT4MCS7", "VHT4MCS8", "VHT4MCS9"
  2549. };
  2550. for (i = 0; i <= 83; i++) {
  2551. if (strcmp(targetStr, rateindex_Array[i]) == 0) {
  2552. RTW_INFO("%s , index = %d\n", __func__ , i);
  2553. return i;
  2554. }
  2555. }
  2556. printk("%s ,please input a Data RATE String as:", __func__);
  2557. for (i = 0; i <= 83; i++) {
  2558. printk("%s ", rateindex_Array[i]);
  2559. if (i % 10 == 0)
  2560. printk("\n");
  2561. }
  2562. return _FAIL;
  2563. }
  2564. u8 rtw_mp_mode_check(PADAPTER pAdapter)
  2565. {
  2566. PADAPTER primary_adapter = GET_PRIMARY_ADAPTER(pAdapter);
  2567. if (primary_adapter->registrypriv.mp_mode == 1)
  2568. return _TRUE;
  2569. else
  2570. return _FALSE;
  2571. }
  2572. ULONG mpt_ProQueryCalTxPower(
  2573. PADAPTER pAdapter,
  2574. u8 RfPath
  2575. )
  2576. {
  2577. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  2578. PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.mpt_ctx);
  2579. ULONG TxPower = 1;
  2580. struct txpwr_idx_comp tic;
  2581. u8 mgn_rate = mpt_to_mgnt_rate(pMptCtx->mpt_rate_index);
  2582. TxPower = rtw_hal_get_tx_power_index(pAdapter, RfPath, mgn_rate, pHalData->current_channel_bw, pHalData->current_channel, &tic);
  2583. RTW_INFO("bw=%d, ch=%d, rate=%d, txPower:%u = %u + (%d=%d:%d) + (%d) + (%d)\n",
  2584. pHalData->current_channel_bw, pHalData->current_channel, mgn_rate
  2585. , TxPower, tic.base, (tic.by_rate > tic.limit ? tic.limit : tic.by_rate), tic.by_rate, tic.limit, tic.tpt, tic.ebias);
  2586. pAdapter->mppriv.txpoweridx = (u8)TxPower;
  2587. if (RfPath == RF_PATH_A)
  2588. pMptCtx->TxPwrLevel[RF_PATH_A] = (u8)TxPower;
  2589. else if (RfPath == RF_PATH_B)
  2590. pMptCtx->TxPwrLevel[RF_PATH_B] = (u8)TxPower;
  2591. else if (RfPath == RF_PATH_C)
  2592. pMptCtx->TxPwrLevel[RF_PATH_C] = (u8)TxPower;
  2593. else if (RfPath == RF_PATH_D)
  2594. pMptCtx->TxPwrLevel[RF_PATH_D] = (u8)TxPower;
  2595. hal_mpt_SetTxPower(pAdapter);
  2596. return TxPower;
  2597. }
  2598. #ifdef CONFIG_MP_VHT_HW_TX_MODE
  2599. static inline void dump_buf(u8 *buf, u32 len)
  2600. {
  2601. u32 i;
  2602. RTW_INFO("-----------------Len %d----------------\n", len);
  2603. for (i = 0; i < len; i++)
  2604. RTW_INFO("%2.2x-", *(buf + i));
  2605. RTW_INFO("\n");
  2606. }
  2607. void ByteToBit(
  2608. UCHAR *out,
  2609. bool *in,
  2610. UCHAR in_size)
  2611. {
  2612. UCHAR i = 0, j = 0;
  2613. for (i = 0; i < in_size; i++) {
  2614. for (j = 0; j < 8; j++) {
  2615. if (in[8 * i + j])
  2616. out[i] |= (1 << j);
  2617. }
  2618. }
  2619. }
  2620. void CRC16_generator(
  2621. bool *out,
  2622. bool *in,
  2623. UCHAR in_size
  2624. )
  2625. {
  2626. UCHAR i = 0;
  2627. bool temp = 0, reg[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  2628. for (i = 0; i < in_size; i++) {/* take one's complement and bit reverse*/
  2629. temp = in[i] ^ reg[15];
  2630. reg[15] = reg[14];
  2631. reg[14] = reg[13];
  2632. reg[13] = reg[12];
  2633. reg[12] = reg[11];
  2634. reg[11] = reg[10];
  2635. reg[10] = reg[9];
  2636. reg[9] = reg[8];
  2637. reg[8] = reg[7];
  2638. reg[7] = reg[6];
  2639. reg[6] = reg[5];
  2640. reg[5] = reg[4];
  2641. reg[4] = reg[3];
  2642. reg[3] = reg[2];
  2643. reg[2] = reg[1];
  2644. reg[1] = reg[0];
  2645. reg[12] = reg[12] ^ temp;
  2646. reg[5] = reg[5] ^ temp;
  2647. reg[0] = temp;
  2648. }
  2649. for (i = 0; i < 16; i++) /* take one's complement and bit reverse*/
  2650. out[i] = 1 - reg[15 - i];
  2651. }
  2652. /*========================================
  2653. SFD SIGNAL SERVICE LENGTH CRC
  2654. 16 bit 8 bit 8 bit 16 bit 16 bit
  2655. ========================================*/
  2656. void CCK_generator(
  2657. PRT_PMAC_TX_INFO pPMacTxInfo,
  2658. PRT_PMAC_PKT_INFO pPMacPktInfo
  2659. )
  2660. {
  2661. double ratio = 0;
  2662. bool crc16_in[32] = {0}, crc16_out[16] = {0};
  2663. bool LengthExtBit;
  2664. double LengthExact;
  2665. double LengthPSDU;
  2666. UCHAR i;
  2667. UINT PacketLength = pPMacTxInfo->PacketLength;
  2668. if (pPMacTxInfo->bSPreamble)
  2669. pPMacTxInfo->SFD = 0x05CF;
  2670. else
  2671. pPMacTxInfo->SFD = 0xF3A0;
  2672. switch (pPMacPktInfo->MCS) {
  2673. case 0:
  2674. pPMacTxInfo->SignalField = 0xA;
  2675. ratio = 8;
  2676. /*CRC16_in(1,0:7)=[0 1 0 1 0 0 0 0]*/
  2677. crc16_in[1] = crc16_in[3] = 1;
  2678. break;
  2679. case 1:
  2680. pPMacTxInfo->SignalField = 0x14;
  2681. ratio = 4;
  2682. /*CRC16_in(1,0:7)=[0 0 1 0 1 0 0 0];*/
  2683. crc16_in[2] = crc16_in[4] = 1;
  2684. break;
  2685. case 2:
  2686. pPMacTxInfo->SignalField = 0x37;
  2687. ratio = 8.0 / 5.5;
  2688. /*CRC16_in(1,0:7)=[1 1 1 0 1 1 0 0];*/
  2689. crc16_in[0] = crc16_in[1] = crc16_in[2] = crc16_in[4] = crc16_in[5] = 1;
  2690. break;
  2691. case 3:
  2692. pPMacTxInfo->SignalField = 0x6E;
  2693. ratio = 8.0 / 11.0;
  2694. /*CRC16_in(1,0:7)=[0 1 1 1 0 1 1 0];*/
  2695. crc16_in[1] = crc16_in[2] = crc16_in[3] = crc16_in[5] = crc16_in[6] = 1;
  2696. break;
  2697. }
  2698. LengthExact = PacketLength * ratio;
  2699. LengthPSDU = ceil(LengthExact);
  2700. if ((pPMacPktInfo->MCS == 3) &&
  2701. ((LengthPSDU - LengthExact) >= 0.727 || (LengthPSDU - LengthExact) <= -0.727))
  2702. LengthExtBit = 1;
  2703. else
  2704. LengthExtBit = 0;
  2705. pPMacTxInfo->LENGTH = (UINT)LengthPSDU;
  2706. /* CRC16_in(1,16:31) = LengthPSDU[0:15]*/
  2707. for (i = 0; i < 16; i++)
  2708. crc16_in[i + 16] = (pPMacTxInfo->LENGTH >> i) & 0x1;
  2709. if (LengthExtBit == 0) {
  2710. pPMacTxInfo->ServiceField = 0x0;
  2711. /* CRC16_in(1,8:15) = [0 0 0 0 0 0 0 0];*/
  2712. } else {
  2713. pPMacTxInfo->ServiceField = 0x80;
  2714. /*CRC16_in(1,8:15)=[0 0 0 0 0 0 0 1];*/
  2715. crc16_in[15] = 1;
  2716. }
  2717. CRC16_generator(crc16_out, crc16_in, 32);
  2718. _rtw_memset(pPMacTxInfo->CRC16, 0, 2);
  2719. ByteToBit(pPMacTxInfo->CRC16, crc16_out, 2);
  2720. }
  2721. void PMAC_Get_Pkt_Param(
  2722. PRT_PMAC_TX_INFO pPMacTxInfo,
  2723. PRT_PMAC_PKT_INFO pPMacPktInfo)
  2724. {
  2725. UCHAR TX_RATE_HEX = 0, MCS = 0;
  2726. UCHAR TX_RATE = pPMacTxInfo->TX_RATE;
  2727. /* TX_RATE & Nss */
  2728. if (MPT_IS_2SS_RATE(TX_RATE))
  2729. pPMacPktInfo->Nss = 2;
  2730. else if (MPT_IS_3SS_RATE(TX_RATE))
  2731. pPMacPktInfo->Nss = 3;
  2732. else if (MPT_IS_4SS_RATE(TX_RATE))
  2733. pPMacPktInfo->Nss = 4;
  2734. else
  2735. pPMacPktInfo->Nss = 1;
  2736. RTW_INFO("PMacTxInfo.Nss =%d\n", pPMacPktInfo->Nss);
  2737. /* MCS & TX_RATE_HEX*/
  2738. if (MPT_IS_CCK_RATE(TX_RATE)) {
  2739. switch (TX_RATE) {
  2740. case MPT_RATE_1M:
  2741. TX_RATE_HEX = MCS = 0;
  2742. break;
  2743. case MPT_RATE_2M:
  2744. TX_RATE_HEX = MCS = 1;
  2745. break;
  2746. case MPT_RATE_55M:
  2747. TX_RATE_HEX = MCS = 2;
  2748. break;
  2749. case MPT_RATE_11M:
  2750. TX_RATE_HEX = MCS = 3;
  2751. break;
  2752. }
  2753. } else if (MPT_IS_OFDM_RATE(TX_RATE)) {
  2754. MCS = TX_RATE - MPT_RATE_6M;
  2755. TX_RATE_HEX = MCS + 4;
  2756. } else if (MPT_IS_HT_RATE(TX_RATE)) {
  2757. MCS = TX_RATE - MPT_RATE_MCS0;
  2758. TX_RATE_HEX = MCS + 12;
  2759. } else if (MPT_IS_VHT_RATE(TX_RATE)) {
  2760. TX_RATE_HEX = TX_RATE - MPT_RATE_VHT1SS_MCS0 + 44;
  2761. if (MPT_IS_VHT_2S_RATE(TX_RATE))
  2762. MCS = TX_RATE - MPT_RATE_VHT2SS_MCS0;
  2763. else if (MPT_IS_VHT_3S_RATE(TX_RATE))
  2764. MCS = TX_RATE - MPT_RATE_VHT3SS_MCS0;
  2765. else if (MPT_IS_VHT_4S_RATE(TX_RATE))
  2766. MCS = TX_RATE - MPT_RATE_VHT4SS_MCS0;
  2767. else
  2768. MCS = TX_RATE - MPT_RATE_VHT1SS_MCS0;
  2769. }
  2770. pPMacPktInfo->MCS = MCS;
  2771. pPMacTxInfo->TX_RATE_HEX = TX_RATE_HEX;
  2772. RTW_INFO(" MCS=%d, TX_RATE_HEX =0x%x\n", MCS, pPMacTxInfo->TX_RATE_HEX);
  2773. /* mSTBC & Nsts*/
  2774. pPMacPktInfo->Nsts = pPMacPktInfo->Nss;
  2775. if (pPMacTxInfo->bSTBC) {
  2776. if (pPMacPktInfo->Nss == 1) {
  2777. pPMacTxInfo->m_STBC = 2;
  2778. pPMacPktInfo->Nsts = pPMacPktInfo->Nss * 2;
  2779. } else
  2780. pPMacTxInfo->m_STBC = 1;
  2781. } else
  2782. pPMacTxInfo->m_STBC = 1;
  2783. }
  2784. UINT LDPC_parameter_generator(
  2785. UINT N_pld_int,
  2786. UINT N_CBPSS,
  2787. UINT N_SS,
  2788. UINT R,
  2789. UINT m_STBC,
  2790. UINT N_TCB_int
  2791. )
  2792. {
  2793. double CR = 0.;
  2794. double N_pld = (double)N_pld_int;
  2795. double N_TCB = (double)N_TCB_int;
  2796. double N_CW = 0., N_shrt = 0., N_spcw = 0., N_fshrt = 0.;
  2797. double L_LDPC = 0., K_LDPC = 0., L_LDPC_info = 0.;
  2798. double N_punc = 0., N_ppcw = 0., N_fpunc = 0., N_rep = 0., N_rpcw = 0., N_frep = 0.;
  2799. double R_eff = 0.;
  2800. UINT VHTSIGA2B3 = 0;/* extra symbol from VHT-SIG-A2 Bit 3*/
  2801. if (R == 0)
  2802. CR = 0.5;
  2803. else if (R == 1)
  2804. CR = 2. / 3.;
  2805. else if (R == 2)
  2806. CR = 3. / 4.;
  2807. else if (R == 3)
  2808. CR = 5. / 6.;
  2809. if (N_TCB <= 648.) {
  2810. N_CW = 1.;
  2811. if (N_TCB >= N_pld + 912.*(1. - CR))
  2812. L_LDPC = 1296.;
  2813. else
  2814. L_LDPC = 648.;
  2815. } else if (N_TCB <= 1296.) {
  2816. N_CW = 1.;
  2817. if (N_TCB >= (double)N_pld + 1464.*(1. - CR))
  2818. L_LDPC = 1944.;
  2819. else
  2820. L_LDPC = 1296.;
  2821. } else if (N_TCB <= 1944.) {
  2822. N_CW = 1.;
  2823. L_LDPC = 1944.;
  2824. } else if (N_TCB <= 2592.) {
  2825. N_CW = 2.;
  2826. if (N_TCB >= N_pld + 2916.*(1. - CR))
  2827. L_LDPC = 1944.;
  2828. else
  2829. L_LDPC = 1296.;
  2830. } else {
  2831. N_CW = ceil(N_pld / 1944. / CR);
  2832. L_LDPC = 1944.;
  2833. }
  2834. /* Number of information bits per CW*/
  2835. K_LDPC = L_LDPC * CR;
  2836. /* Number of shortening bits max(0, (N_CW * L_LDPC * R) - N_pld)*/
  2837. N_shrt = (N_CW * K_LDPC - N_pld) > 0. ? (N_CW * K_LDPC - N_pld) : 0.;
  2838. /* Number of shortening bits per CW N_spcw = rtfloor(N_shrt/N_CW)*/
  2839. N_spcw = rtfloor(N_shrt / N_CW);
  2840. /* The first N_fshrt CWs shorten 1 bit more*/
  2841. N_fshrt = (double)((int)N_shrt % (int)N_CW);
  2842. /* Number of data bits for the last N_CW-N_fshrt CWs*/
  2843. L_LDPC_info = K_LDPC - N_spcw;
  2844. /* Number of puncturing bits*/
  2845. N_punc = (N_CW * L_LDPC - N_TCB - N_shrt) > 0. ? (N_CW * L_LDPC - N_TCB - N_shrt) : 0.;
  2846. if (((N_punc > .1 * N_CW * L_LDPC * (1. - CR)) && (N_shrt < 1.2 * N_punc * CR / (1. - CR))) ||
  2847. (N_punc > 0.3 * N_CW * L_LDPC * (1. - CR))) {
  2848. /*cout << "*** N_TCB and N_punc are Recomputed ***" << endl;*/
  2849. VHTSIGA2B3 = 1;
  2850. N_TCB += (double)N_CBPSS * N_SS * m_STBC;
  2851. N_punc = (N_CW * L_LDPC - N_TCB - N_shrt) > 0. ? (N_CW * L_LDPC - N_TCB - N_shrt) : 0.;
  2852. } else
  2853. VHTSIGA2B3 = 0;
  2854. return VHTSIGA2B3;
  2855. } /* function end of LDPC_parameter_generator */
  2856. /*========================================
  2857. Data field of PPDU
  2858. Get N_sym and SIGA2BB3
  2859. ========================================*/
  2860. void PMAC_Nsym_generator(
  2861. PRT_PMAC_TX_INFO pPMacTxInfo,
  2862. PRT_PMAC_PKT_INFO pPMacPktInfo)
  2863. {
  2864. UINT SIGA2B3 = 0;
  2865. UCHAR TX_RATE = pPMacTxInfo->TX_RATE;
  2866. UINT R, R_list[10] = {0, 0, 2, 0, 2, 1, 2, 3, 2, 3};
  2867. double CR = 0;
  2868. UINT N_SD, N_BPSC_list[10] = {1, 2, 2, 4, 4, 6, 6, 6, 8, 8};
  2869. UINT N_BPSC = 0, N_CBPS = 0, N_DBPS = 0, N_ES = 0, N_SYM = 0, N_pld = 0, N_TCB = 0;
  2870. int D_R = 0;
  2871. RTW_INFO("TX_RATE = %d\n", TX_RATE);
  2872. /* N_SD*/
  2873. if (pPMacTxInfo->BandWidth == 0)
  2874. N_SD = 52;
  2875. else if (pPMacTxInfo->BandWidth == 1)
  2876. N_SD = 108;
  2877. else
  2878. N_SD = 234;
  2879. if (MPT_IS_HT_RATE(TX_RATE)) {
  2880. UCHAR MCS_temp;
  2881. if (pPMacPktInfo->MCS > 23)
  2882. MCS_temp = pPMacPktInfo->MCS - 24;
  2883. else if (pPMacPktInfo->MCS > 15)
  2884. MCS_temp = pPMacPktInfo->MCS - 16;
  2885. else if (pPMacPktInfo->MCS > 7)
  2886. MCS_temp = pPMacPktInfo->MCS - 8;
  2887. else
  2888. MCS_temp = pPMacPktInfo->MCS;
  2889. R = R_list[MCS_temp];
  2890. switch (R) {
  2891. case 0:
  2892. CR = .5;
  2893. break;
  2894. case 1:
  2895. CR = 2. / 3.;
  2896. break;
  2897. case 2:
  2898. CR = 3. / 4.;
  2899. break;
  2900. case 3:
  2901. CR = 5. / 6.;
  2902. break;
  2903. }
  2904. N_BPSC = N_BPSC_list[MCS_temp];
  2905. N_CBPS = N_BPSC * N_SD * pPMacPktInfo->Nss;
  2906. N_DBPS = (UINT)((double)N_CBPS * CR);
  2907. if (pPMacTxInfo->bLDPC == FALSE) {
  2908. N_ES = (UINT)ceil((double)(N_DBPS * pPMacPktInfo->Nss) / 4. / 300.);
  2909. RTW_INFO("N_ES = %d\n", N_ES);
  2910. /* N_SYM = m_STBC* (8*length+16+6*N_ES) / (m_STBC*N_DBPS)*/
  2911. N_SYM = pPMacTxInfo->m_STBC * (UINT)ceil((double)(pPMacTxInfo->PacketLength * 8 + 16 + N_ES * 6) /
  2912. (double)(N_DBPS * pPMacTxInfo->m_STBC));
  2913. } else {
  2914. N_ES = 1;
  2915. /* N_pld = length * 8 + 16*/
  2916. N_pld = pPMacTxInfo->PacketLength * 8 + 16;
  2917. RTW_INFO("N_pld = %d\n", N_pld);
  2918. N_SYM = pPMacTxInfo->m_STBC * (UINT)ceil((double)(N_pld) /
  2919. (double)(N_DBPS * pPMacTxInfo->m_STBC));
  2920. RTW_INFO("N_SYM = %d\n", N_SYM);
  2921. /* N_avbits = N_CBPS *m_STBC *(N_pld/N_CBPS*R*m_STBC)*/
  2922. N_TCB = N_CBPS * N_SYM;
  2923. RTW_INFO("N_TCB = %d\n", N_TCB);
  2924. SIGA2B3 = LDPC_parameter_generator(N_pld, N_CBPS, pPMacPktInfo->Nss, R, pPMacTxInfo->m_STBC, N_TCB);
  2925. RTW_INFO("SIGA2B3 = %d\n", SIGA2B3);
  2926. N_SYM = N_SYM + SIGA2B3 * pPMacTxInfo->m_STBC;
  2927. RTW_INFO("N_SYM = %d\n", N_SYM);
  2928. }
  2929. } else if (MPT_IS_VHT_RATE(TX_RATE)) {
  2930. R = R_list[pPMacPktInfo->MCS];
  2931. switch (R) {
  2932. case 0:
  2933. CR = .5;
  2934. break;
  2935. case 1:
  2936. CR = 2. / 3.;
  2937. break;
  2938. case 2:
  2939. CR = 3. / 4.;
  2940. break;
  2941. case 3:
  2942. CR = 5. / 6.;
  2943. break;
  2944. }
  2945. N_BPSC = N_BPSC_list[pPMacPktInfo->MCS];
  2946. N_CBPS = N_BPSC * N_SD * pPMacPktInfo->Nss;
  2947. N_DBPS = (UINT)((double)N_CBPS * CR);
  2948. if (pPMacTxInfo->bLDPC == FALSE) {
  2949. if (pPMacTxInfo->bSGI)
  2950. N_ES = (UINT)ceil((double)(N_DBPS) / 3.6 / 600.);
  2951. else
  2952. N_ES = (UINT)ceil((double)(N_DBPS) / 4. / 600.);
  2953. /* N_SYM = m_STBC* (8*length+16+6*N_ES) / (m_STBC*N_DBPS)*/
  2954. N_SYM = pPMacTxInfo->m_STBC * (UINT)ceil((double)(pPMacTxInfo->PacketLength * 8 + 16 + N_ES * 6) / (double)(N_DBPS * pPMacTxInfo->m_STBC));
  2955. SIGA2B3 = 0;
  2956. } else {
  2957. N_ES = 1;
  2958. /* N_SYM = m_STBC* (8*length+N_service) / (m_STBC*N_DBPS)*/
  2959. N_SYM = pPMacTxInfo->m_STBC * (UINT)ceil((double)(pPMacTxInfo->PacketLength * 8 + 16) / (double)(N_DBPS * pPMacTxInfo->m_STBC));
  2960. /* N_avbits = N_sys_init * N_CBPS*/
  2961. N_TCB = N_CBPS * N_SYM;
  2962. /* N_pld = N_sys_init * N_DBPS*/
  2963. N_pld = N_SYM * N_DBPS;
  2964. SIGA2B3 = LDPC_parameter_generator(N_pld, N_CBPS, pPMacPktInfo->Nss, R, pPMacTxInfo->m_STBC, N_TCB);
  2965. N_SYM = N_SYM + SIGA2B3 * pPMacTxInfo->m_STBC;
  2966. }
  2967. switch (R) {
  2968. case 0:
  2969. D_R = 2;
  2970. break;
  2971. case 1:
  2972. D_R = 3;
  2973. break;
  2974. case 2:
  2975. D_R = 4;
  2976. break;
  2977. case 3:
  2978. D_R = 6;
  2979. break;
  2980. }
  2981. if (((N_CBPS / N_ES) % D_R) != 0) {
  2982. RTW_INFO("MCS= %d is not supported when Nss=%d and BW= %d !!\n", pPMacPktInfo->MCS, pPMacPktInfo->Nss, pPMacTxInfo->BandWidth);
  2983. return;
  2984. }
  2985. RTW_INFO("MCS= %d Nss=%d and BW= %d !!\n", pPMacPktInfo->MCS, pPMacPktInfo->Nss, pPMacTxInfo->BandWidth);
  2986. }
  2987. pPMacPktInfo->N_sym = N_SYM;
  2988. pPMacPktInfo->SIGA2B3 = SIGA2B3;
  2989. }
  2990. /*========================================
  2991. L-SIG Rate R Length P Tail
  2992. 4b 1b 12b 1b 6b
  2993. ========================================*/
  2994. void L_SIG_generator(
  2995. UINT N_SYM, /* Max: 750*/
  2996. PRT_PMAC_TX_INFO pPMacTxInfo,
  2997. PRT_PMAC_PKT_INFO pPMacPktInfo)
  2998. {
  2999. u8 sig_bi[24] = {0}; /* 24 BIT*/
  3000. UINT mode, LENGTH;
  3001. int i;
  3002. if (MPT_IS_OFDM_RATE(pPMacTxInfo->TX_RATE)) {
  3003. mode = pPMacPktInfo->MCS;
  3004. LENGTH = pPMacTxInfo->PacketLength;
  3005. } else {
  3006. UCHAR N_LTF;
  3007. double T_data;
  3008. UINT OFDM_symbol;
  3009. mode = 0;
  3010. /* Table 20-13 Num of HT-DLTFs request*/
  3011. if (pPMacPktInfo->Nsts <= 2)
  3012. N_LTF = pPMacPktInfo->Nsts;
  3013. else
  3014. N_LTF = 4;
  3015. if (pPMacTxInfo->bSGI)
  3016. T_data = 3.6;
  3017. else
  3018. T_data = 4.0;
  3019. /*(L-SIG, HT-SIG, HT-STF, HT-LTF....HT-LTF, Data)*/
  3020. if (MPT_IS_VHT_RATE(pPMacTxInfo->TX_RATE))
  3021. OFDM_symbol = (UINT)ceil((double)(8 + 4 + N_LTF * 4 + N_SYM * T_data + 4) / 4.);
  3022. else
  3023. OFDM_symbol = (UINT)ceil((double)(8 + 4 + N_LTF * 4 + N_SYM * T_data) / 4.);
  3024. RTW_INFO("%s , OFDM_symbol =%d\n", __func__, OFDM_symbol);
  3025. LENGTH = OFDM_symbol * 3 - 3;
  3026. RTW_INFO("%s , LENGTH =%d\n", __func__, LENGTH);
  3027. }
  3028. /* Rate Field*/
  3029. switch (mode) {
  3030. case 0:
  3031. sig_bi[0] = 1;
  3032. sig_bi[1] = 1;
  3033. sig_bi[2] = 0;
  3034. sig_bi[3] = 1;
  3035. break;
  3036. case 1:
  3037. sig_bi[0] = 1;
  3038. sig_bi[1] = 1;
  3039. sig_bi[2] = 1;
  3040. sig_bi[3] = 1;
  3041. break;
  3042. case 2:
  3043. sig_bi[0] = 0;
  3044. sig_bi[1] = 1;
  3045. sig_bi[2] = 0;
  3046. sig_bi[3] = 1;
  3047. break;
  3048. case 3:
  3049. sig_bi[0] = 0;
  3050. sig_bi[1] = 1;
  3051. sig_bi[2] = 1;
  3052. sig_bi[3] = 1;
  3053. break;
  3054. case 4:
  3055. sig_bi[0] = 1;
  3056. sig_bi[1] = 0;
  3057. sig_bi[2] = 0;
  3058. sig_bi[3] = 1;
  3059. break;
  3060. case 5:
  3061. sig_bi[0] = 1;
  3062. sig_bi[1] = 0;
  3063. sig_bi[2] = 1;
  3064. sig_bi[3] = 1;
  3065. break;
  3066. case 6:
  3067. sig_bi[0] = 0;
  3068. sig_bi[1] = 0;
  3069. sig_bi[2] = 0;
  3070. sig_bi[3] = 1;
  3071. break;
  3072. case 7:
  3073. sig_bi[0] = 0;
  3074. sig_bi[1] = 0;
  3075. sig_bi[2] = 1;
  3076. sig_bi[3] = 1;
  3077. break;
  3078. }
  3079. /*Reserved bit*/
  3080. sig_bi[4] = 0;
  3081. /* Length Field*/
  3082. for (i = 0; i < 12; i++)
  3083. sig_bi[i + 5] = (LENGTH >> i) & 1;
  3084. /* Parity Bit*/
  3085. sig_bi[17] = 0;
  3086. for (i = 0; i < 17; i++)
  3087. sig_bi[17] = sig_bi[17] + sig_bi[i];
  3088. sig_bi[17] %= 2;
  3089. /* Tail Field*/
  3090. for (i = 18; i < 24; i++)
  3091. sig_bi[i] = 0;
  3092. /* dump_buf(sig_bi,24);*/
  3093. _rtw_memset(pPMacTxInfo->LSIG, 0, 3);
  3094. ByteToBit(pPMacTxInfo->LSIG, (bool *)sig_bi, 3);
  3095. }
  3096. void CRC8_generator(
  3097. bool *out,
  3098. bool *in,
  3099. UCHAR in_size
  3100. )
  3101. {
  3102. UCHAR i = 0;
  3103. bool temp = 0, reg[] = {1, 1, 1, 1, 1, 1, 1, 1};
  3104. for (i = 0; i < in_size; i++) { /* take one's complement and bit reverse*/
  3105. temp = in[i] ^ reg[7];
  3106. reg[7] = reg[6];
  3107. reg[6] = reg[5];
  3108. reg[5] = reg[4];
  3109. reg[4] = reg[3];
  3110. reg[3] = reg[2];
  3111. reg[2] = reg[1] ^ temp;
  3112. reg[1] = reg[0] ^ temp;
  3113. reg[0] = temp;
  3114. }
  3115. for (i = 0; i < 8; i++)/* take one's complement and bit reverse*/
  3116. out[i] = reg[7 - i] ^ 1;
  3117. }
  3118. /*/================================================================================
  3119. HT-SIG1 MCS CW Length 24BIT + 24BIT
  3120. 7b 1b 16b
  3121. HT-SIG2 Smoothing Not sounding Rsvd AGG STBC FEC SGI N_ELTF CRC Tail
  3122. 1b 1b 1b 1b 2b 1b 1b 2b 8b 6b
  3123. ================================================================================*/
  3124. void HT_SIG_generator(
  3125. PRT_PMAC_TX_INFO pPMacTxInfo,
  3126. PRT_PMAC_PKT_INFO pPMacPktInfo
  3127. )
  3128. {
  3129. UINT i;
  3130. bool sig_bi[48] = {0}, crc8[8] = {0};
  3131. /* MCS Field*/
  3132. for (i = 0; i < 7; i++)
  3133. sig_bi[i] = (pPMacPktInfo->MCS >> i) & 0x1;
  3134. /* Packet BW Setting*/
  3135. sig_bi[7] = pPMacTxInfo->BandWidth;
  3136. /* HT-Length Field*/
  3137. for (i = 0; i < 16; i++)
  3138. sig_bi[i + 8] = (pPMacTxInfo->PacketLength >> i) & 0x1;
  3139. /* Smoothing; 1->allow smoothing*/
  3140. sig_bi[24] = 1;
  3141. /*Not Sounding*/
  3142. sig_bi[25] = 1 - pPMacTxInfo->NDP_sound;
  3143. /*Reserved bit*/
  3144. sig_bi[26] = 1;
  3145. /*/Aggregate*/
  3146. sig_bi[27] = 0;
  3147. /*STBC Field*/
  3148. if (pPMacTxInfo->bSTBC) {
  3149. sig_bi[28] = 1;
  3150. sig_bi[29] = 0;
  3151. } else {
  3152. sig_bi[28] = 0;
  3153. sig_bi[29] = 0;
  3154. }
  3155. /*Advance Coding, 0: BCC, 1: LDPC*/
  3156. sig_bi[30] = pPMacTxInfo->bLDPC;
  3157. /* Short GI*/
  3158. sig_bi[31] = pPMacTxInfo->bSGI;
  3159. /* N_ELTFs*/
  3160. if (pPMacTxInfo->NDP_sound == FALSE) {
  3161. sig_bi[32] = 0;
  3162. sig_bi[33] = 0;
  3163. } else {
  3164. int N_ELTF = pPMacTxInfo->Ntx - pPMacPktInfo->Nss;
  3165. for (i = 0; i < 2; i++)
  3166. sig_bi[32 + i] = (N_ELTF >> i) % 2;
  3167. }
  3168. /* CRC-8*/
  3169. CRC8_generator(crc8, sig_bi, 34);
  3170. for (i = 0; i < 8; i++)
  3171. sig_bi[34 + i] = crc8[i];
  3172. /*Tail*/
  3173. for (i = 42; i < 48; i++)
  3174. sig_bi[i] = 0;
  3175. _rtw_memset(pPMacTxInfo->HT_SIG, 0, 6);
  3176. ByteToBit(pPMacTxInfo->HT_SIG, sig_bi, 6);
  3177. }
  3178. /*======================================================================================
  3179. VHT-SIG-A1
  3180. BW Reserved STBC G_ID SU_Nsts P_AID TXOP_PS_NOT_ALLOW Reserved
  3181. 2b 1b 1b 6b 3b 9b 1b 2b 1b
  3182. VHT-SIG-A2
  3183. SGI SGI_Nsym SU/MU coding LDPC_Extra SU_NCS Beamformed Reserved CRC Tail
  3184. 1b 1b 1b 1b 4b 1b 1b 8b 6b
  3185. ======================================================================================*/
  3186. void VHT_SIG_A_generator(
  3187. PRT_PMAC_TX_INFO pPMacTxInfo,
  3188. PRT_PMAC_PKT_INFO pPMacPktInfo)
  3189. {
  3190. UINT i;
  3191. bool sig_bi[48], crc8[8];
  3192. _rtw_memset(sig_bi, 0, 48);
  3193. _rtw_memset(crc8, 0, 8);
  3194. /* BW Setting*/
  3195. for (i = 0; i < 2; i++)
  3196. sig_bi[i] = (pPMacTxInfo->BandWidth >> i) & 0x1;
  3197. /* Reserved Bit*/
  3198. sig_bi[2] = 1;
  3199. /*STBC Field*/
  3200. sig_bi[3] = pPMacTxInfo->bSTBC;
  3201. /*Group ID: Single User->A value of 0 or 63 indicates an SU PPDU. */
  3202. for (i = 0; i < 6; i++)
  3203. sig_bi[4 + i] = 0;
  3204. /* N_STS/Partial AID*/
  3205. for (i = 0; i < 12; i++) {
  3206. if (i < 3)
  3207. sig_bi[10 + i] = ((pPMacPktInfo->Nsts - 1) >> i) & 0x1;
  3208. else
  3209. sig_bi[10 + i] = 0;
  3210. }
  3211. /*TXOP_PS_NOT_ALLPWED*/
  3212. sig_bi[22] = 0;
  3213. /*Reserved Bits*/
  3214. sig_bi[23] = 1;
  3215. /*Short GI*/
  3216. sig_bi[24] = pPMacTxInfo->bSGI;
  3217. if (pPMacTxInfo->bSGI > 0 && (pPMacPktInfo->N_sym % 10) == 9)
  3218. sig_bi[25] = 1;
  3219. else
  3220. sig_bi[25] = 0;
  3221. /* SU/MU[0] Coding*/
  3222. sig_bi[26] = pPMacTxInfo->bLDPC; /* 0:BCC, 1:LDPC */
  3223. sig_bi[27] = pPMacPktInfo->SIGA2B3; /*/ Record Extra OFDM Symols is added or not when LDPC is used*/
  3224. /*SU MCS/MU[1-3] Coding*/
  3225. for (i = 0; i < 4; i++)
  3226. sig_bi[28 + i] = (pPMacPktInfo->MCS >> i) & 0x1;
  3227. /*SU Beamform */
  3228. sig_bi[32] = 0; /*packet.TXBF_en;*/
  3229. /*Reserved Bit*/
  3230. sig_bi[33] = 1;
  3231. /*CRC-8*/
  3232. CRC8_generator(crc8, sig_bi, 34);
  3233. for (i = 0; i < 8; i++)
  3234. sig_bi[34 + i] = crc8[i];
  3235. /*Tail*/
  3236. for (i = 42; i < 48; i++)
  3237. sig_bi[i] = 0;
  3238. _rtw_memset(pPMacTxInfo->VHT_SIG_A, 0, 6);
  3239. ByteToBit(pPMacTxInfo->VHT_SIG_A, sig_bi, 6);
  3240. }
  3241. /*======================================================================================
  3242. VHT-SIG-B
  3243. Length Resesrved Trail
  3244. 17/19/21 BIT 3/2/2 BIT 6b
  3245. ======================================================================================*/
  3246. void VHT_SIG_B_generator(
  3247. PRT_PMAC_TX_INFO pPMacTxInfo)
  3248. {
  3249. bool sig_bi[32], crc8_bi[8];
  3250. UINT i, len, res, tail = 6, total_len, crc8_in_len;
  3251. UINT sigb_len;
  3252. _rtw_memset(sig_bi, 0, 32);
  3253. _rtw_memset(crc8_bi, 0, 8);
  3254. /*Sounding Packet*/
  3255. if (pPMacTxInfo->NDP_sound == 1) {
  3256. if (pPMacTxInfo->BandWidth == 0) {
  3257. bool sigb_temp[26] = {0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0};
  3258. _rtw_memcpy(sig_bi, sigb_temp, 26);
  3259. } else if (pPMacTxInfo->BandWidth == 1) {
  3260. bool sigb_temp[27] = {1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0};
  3261. _rtw_memcpy(sig_bi, sigb_temp, 27);
  3262. } else if (pPMacTxInfo->BandWidth == 2) {
  3263. bool sigb_temp[29] = {0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0};
  3264. _rtw_memcpy(sig_bi, sigb_temp, 29);
  3265. }
  3266. } else { /* Not NDP Sounding*/
  3267. bool *sigb_temp[29] = {0};
  3268. if (pPMacTxInfo->BandWidth == 0) {
  3269. len = 17;
  3270. res = 3;
  3271. } else if (pPMacTxInfo->BandWidth == 1) {
  3272. len = 19;
  3273. res = 2;
  3274. } else if (pPMacTxInfo->BandWidth == 2) {
  3275. len = 21;
  3276. res = 2;
  3277. } else {
  3278. len = 21;
  3279. res = 2;
  3280. }
  3281. total_len = len + res + tail;
  3282. crc8_in_len = len + res;
  3283. /*Length Field*/
  3284. sigb_len = (pPMacTxInfo->PacketLength + 3) >> 2;
  3285. for (i = 0; i < len; i++)
  3286. sig_bi[i] = (sigb_len >> i) & 0x1;
  3287. /*Reserved Field*/
  3288. for (i = 0; i < res; i++)
  3289. sig_bi[len + i] = 1;
  3290. /* CRC-8*/
  3291. CRC8_generator(crc8_bi, sig_bi, crc8_in_len);
  3292. /* Tail */
  3293. for (i = 0; i < tail; i++)
  3294. sig_bi[len + res + i] = 0;
  3295. }
  3296. _rtw_memset(pPMacTxInfo->VHT_SIG_B, 0, 4);
  3297. ByteToBit(pPMacTxInfo->VHT_SIG_B, sig_bi, 4);
  3298. pPMacTxInfo->VHT_SIG_B_CRC = 0;
  3299. ByteToBit(&(pPMacTxInfo->VHT_SIG_B_CRC), crc8_bi, 1);
  3300. }
  3301. /*=======================
  3302. VHT Delimiter
  3303. =======================*/
  3304. void VHT_Delimiter_generator(
  3305. PRT_PMAC_TX_INFO pPMacTxInfo
  3306. )
  3307. {
  3308. bool sig_bi[32] = {0}, crc8[8] = {0};
  3309. UINT crc8_in_len = 16;
  3310. UINT PacketLength = pPMacTxInfo->PacketLength;
  3311. int j;
  3312. /* Delimiter[0]: EOF*/
  3313. sig_bi[0] = 1;
  3314. /* Delimiter[1]: Reserved*/
  3315. sig_bi[1] = 0;
  3316. /* Delimiter[3:2]: MPDU Length High*/
  3317. sig_bi[2] = ((PacketLength - 4) >> 12) % 2;
  3318. sig_bi[3] = ((PacketLength - 4) >> 13) % 2;
  3319. /* Delimiter[15:4]: MPDU Length Low*/
  3320. for (j = 4; j < 16; j++)
  3321. sig_bi[j] = ((PacketLength - 4) >> (j - 4)) % 2;
  3322. CRC8_generator(crc8, sig_bi, crc8_in_len);
  3323. for (j = 16; j < 24; j++) /* Delimiter[23:16]: CRC 8*/
  3324. sig_bi[j] = crc8[j - 16];
  3325. for (j = 24; j < 32; j++) /* Delimiter[31:24]: Signature ('4E' in Hex, 78 in Dec)*/
  3326. sig_bi[j] = (78 >> (j - 24)) % 2;
  3327. _rtw_memset(pPMacTxInfo->VHT_Delimiter, 0, 4);
  3328. ByteToBit(pPMacTxInfo->VHT_Delimiter, sig_bi, 4);
  3329. }
  3330. #endif
  3331. #endif