hal_com_phycfg.c 163 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  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. * You should have received a copy of the GNU General Public License along with
  15. * this program; if not, write to the Free Software Foundation, Inc.,
  16. * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  17. *
  18. *
  19. ******************************************************************************/
  20. #define _HAL_COM_PHYCFG_C_
  21. #include <drv_types.h>
  22. #include <hal_data.h>
  23. #define PG_TXPWR_MSB_DIFF_S4BIT(_pg_v) (((_pg_v) & 0xf0) >> 4)
  24. #define PG_TXPWR_LSB_DIFF_S4BIT(_pg_v) ((_pg_v) & 0x0f)
  25. #define PG_TXPWR_MSB_DIFF_TO_S8BIT(_pg_v) ((PG_TXPWR_MSB_DIFF_S4BIT(_pg_v) & BIT3) ? (PG_TXPWR_MSB_DIFF_S4BIT(_pg_v) | 0xF0) : PG_TXPWR_MSB_DIFF_S4BIT(_pg_v))
  26. #define PG_TXPWR_LSB_DIFF_TO_S8BIT(_pg_v) ((PG_TXPWR_LSB_DIFF_S4BIT(_pg_v) & BIT3) ? (PG_TXPWR_LSB_DIFF_S4BIT(_pg_v) | 0xF0) : PG_TXPWR_LSB_DIFF_S4BIT(_pg_v))
  27. #define IS_PG_TXPWR_BASE_INVALID(_base) ((_base) > 63)
  28. #define IS_PG_TXPWR_DIFF_INVALID(_diff) ((_diff) > 7 || (_diff) < -8)
  29. #define PG_TXPWR_INVALID_BASE 255
  30. #define PG_TXPWR_INVALID_DIFF 8
  31. #if !IS_PG_TXPWR_BASE_INVALID(PG_TXPWR_INVALID_BASE)
  32. #error "PG_TXPWR_BASE definition has problem"
  33. #endif
  34. #if !IS_PG_TXPWR_DIFF_INVALID(PG_TXPWR_INVALID_DIFF)
  35. #error "PG_TXPWR_DIFF definition has problem"
  36. #endif
  37. #define PG_TXPWR_SRC_PG_DATA 0
  38. #define PG_TXPWR_SRC_IC_DEF 1
  39. #define PG_TXPWR_SRC_DEF 2
  40. #define PG_TXPWR_SRC_NUM 3
  41. const char *const _pg_txpwr_src_str[] = {
  42. "PG_DATA",
  43. "IC_DEF",
  44. "DEF",
  45. "UNKNOWN"
  46. };
  47. #define pg_txpwr_src_str(src) (((src) >= PG_TXPWR_SRC_NUM) ? _pg_txpwr_src_str[PG_TXPWR_SRC_NUM] : _pg_txpwr_src_str[(src)])
  48. #ifndef DBG_PG_TXPWR_READ
  49. #define DBG_PG_TXPWR_READ 0
  50. #endif
  51. void dump_pg_txpwr_info_2g(void *sel, TxPowerInfo24G *txpwr_info, u8 rfpath_num, u8 max_tx_cnt)
  52. {
  53. int path, group, tx_idx;
  54. RTW_PRINT_SEL(sel, "2.4G\n");
  55. RTW_PRINT_SEL(sel, "CCK-1T base:\n");
  56. RTW_PRINT_SEL(sel, "%4s ", "");
  57. for (group = 0; group < MAX_CHNL_GROUP_24G; group++)
  58. _RTW_PRINT_SEL(sel, "G%02d ", group);
  59. _RTW_PRINT_SEL(sel, "\n");
  60. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  61. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  62. for (group = 0; group < MAX_CHNL_GROUP_24G; group++)
  63. _RTW_PRINT_SEL(sel, "%3u ", txpwr_info->IndexCCK_Base[path][group]);
  64. _RTW_PRINT_SEL(sel, "\n");
  65. }
  66. RTW_PRINT_SEL(sel, "\n");
  67. RTW_PRINT_SEL(sel, "CCK diff:\n");
  68. RTW_PRINT_SEL(sel, "%4s ", "");
  69. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++)
  70. _RTW_PRINT_SEL(sel, "%dT ", path + 1);
  71. _RTW_PRINT_SEL(sel, "\n");
  72. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  73. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  74. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  75. _RTW_PRINT_SEL(sel, "%2d ", txpwr_info->CCK_Diff[path][tx_idx]);
  76. _RTW_PRINT_SEL(sel, "\n");
  77. }
  78. RTW_PRINT_SEL(sel, "\n");
  79. RTW_PRINT_SEL(sel, "BW40-1S base:\n");
  80. RTW_PRINT_SEL(sel, "%4s ", "");
  81. for (group = 0; group < MAX_CHNL_GROUP_24G - 1; group++)
  82. _RTW_PRINT_SEL(sel, "G%02d ", group);
  83. _RTW_PRINT_SEL(sel, "\n");
  84. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  85. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  86. for (group = 0; group < MAX_CHNL_GROUP_24G - 1; group++)
  87. _RTW_PRINT_SEL(sel, "%3u ", txpwr_info->IndexBW40_Base[path][group]);
  88. _RTW_PRINT_SEL(sel, "\n");
  89. }
  90. RTW_PRINT_SEL(sel, "\n");
  91. RTW_PRINT_SEL(sel, "OFDM diff:\n");
  92. RTW_PRINT_SEL(sel, "%4s ", "");
  93. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++)
  94. _RTW_PRINT_SEL(sel, "%dT ", path + 1);
  95. _RTW_PRINT_SEL(sel, "\n");
  96. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  97. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  98. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  99. _RTW_PRINT_SEL(sel, "%2d ", txpwr_info->OFDM_Diff[path][tx_idx]);
  100. _RTW_PRINT_SEL(sel, "\n");
  101. }
  102. RTW_PRINT_SEL(sel, "\n");
  103. RTW_PRINT_SEL(sel, "BW20 diff:\n");
  104. RTW_PRINT_SEL(sel, "%4s ", "");
  105. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++)
  106. _RTW_PRINT_SEL(sel, "%dS ", path + 1);
  107. _RTW_PRINT_SEL(sel, "\n");
  108. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  109. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  110. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  111. _RTW_PRINT_SEL(sel, "%2d ", txpwr_info->BW20_Diff[path][tx_idx]);
  112. _RTW_PRINT_SEL(sel, "\n");
  113. }
  114. RTW_PRINT_SEL(sel, "\n");
  115. RTW_PRINT_SEL(sel, "BW40 diff:\n");
  116. RTW_PRINT_SEL(sel, "%4s ", "");
  117. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++)
  118. _RTW_PRINT_SEL(sel, "%dS ", path + 1);
  119. _RTW_PRINT_SEL(sel, "\n");
  120. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  121. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  122. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  123. _RTW_PRINT_SEL(sel, "%2d ", txpwr_info->BW40_Diff[path][tx_idx]);
  124. _RTW_PRINT_SEL(sel, "\n");
  125. }
  126. RTW_PRINT_SEL(sel, "\n");
  127. }
  128. void dump_pg_txpwr_info_5g(void *sel, TxPowerInfo5G *txpwr_info, u8 rfpath_num, u8 max_tx_cnt)
  129. {
  130. int path, group, tx_idx;
  131. RTW_PRINT_SEL(sel, "5G\n");
  132. RTW_PRINT_SEL(sel, "BW40-1S base:\n");
  133. RTW_PRINT_SEL(sel, "%4s ", "");
  134. for (group = 0; group < MAX_CHNL_GROUP_5G; group++)
  135. _RTW_PRINT_SEL(sel, "G%02d ", group);
  136. _RTW_PRINT_SEL(sel, "\n");
  137. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  138. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  139. for (group = 0; group < MAX_CHNL_GROUP_5G; group++)
  140. _RTW_PRINT_SEL(sel, "%3u ", txpwr_info->IndexBW40_Base[path][group]);
  141. _RTW_PRINT_SEL(sel, "\n");
  142. }
  143. RTW_PRINT_SEL(sel, "\n");
  144. RTW_PRINT_SEL(sel, "OFDM diff:\n");
  145. RTW_PRINT_SEL(sel, "%4s ", "");
  146. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++)
  147. _RTW_PRINT_SEL(sel, "%dT ", path + 1);
  148. _RTW_PRINT_SEL(sel, "\n");
  149. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  150. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  151. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  152. _RTW_PRINT_SEL(sel, "%2d ", txpwr_info->OFDM_Diff[path][tx_idx]);
  153. _RTW_PRINT_SEL(sel, "\n");
  154. }
  155. RTW_PRINT_SEL(sel, "\n");
  156. RTW_PRINT_SEL(sel, "BW20 diff:\n");
  157. RTW_PRINT_SEL(sel, "%4s ", "");
  158. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++)
  159. _RTW_PRINT_SEL(sel, "%dS ", path + 1);
  160. _RTW_PRINT_SEL(sel, "\n");
  161. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  162. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  163. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  164. _RTW_PRINT_SEL(sel, "%2d ", txpwr_info->BW20_Diff[path][tx_idx]);
  165. _RTW_PRINT_SEL(sel, "\n");
  166. }
  167. RTW_PRINT_SEL(sel, "\n");
  168. RTW_PRINT_SEL(sel, "BW40 diff:\n");
  169. RTW_PRINT_SEL(sel, "%4s ", "");
  170. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++)
  171. _RTW_PRINT_SEL(sel, "%dS ", path + 1);
  172. _RTW_PRINT_SEL(sel, "\n");
  173. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  174. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  175. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  176. _RTW_PRINT_SEL(sel, "%2d ", txpwr_info->BW40_Diff[path][tx_idx]);
  177. _RTW_PRINT_SEL(sel, "\n");
  178. }
  179. RTW_PRINT_SEL(sel, "\n");
  180. RTW_PRINT_SEL(sel, "BW80 diff:\n");
  181. RTW_PRINT_SEL(sel, "%4s ", "");
  182. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++)
  183. _RTW_PRINT_SEL(sel, "%dS ", path + 1);
  184. _RTW_PRINT_SEL(sel, "\n");
  185. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  186. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  187. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  188. _RTW_PRINT_SEL(sel, "%2d ", txpwr_info->BW80_Diff[path][tx_idx]);
  189. _RTW_PRINT_SEL(sel, "\n");
  190. }
  191. RTW_PRINT_SEL(sel, "\n");
  192. RTW_PRINT_SEL(sel, "BW160 diff:\n");
  193. RTW_PRINT_SEL(sel, "%4s ", "");
  194. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++)
  195. _RTW_PRINT_SEL(sel, "%dS ", path + 1);
  196. _RTW_PRINT_SEL(sel, "\n");
  197. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  198. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  199. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  200. _RTW_PRINT_SEL(sel, "%2d ", txpwr_info->BW160_Diff[path][tx_idx]);
  201. _RTW_PRINT_SEL(sel, "\n");
  202. }
  203. RTW_PRINT_SEL(sel, "\n");
  204. }
  205. const struct map_t pg_txpwr_def_info =
  206. MAP_ENT(0xB8, 1, 0xFF
  207. , MAPSEG_ARRAY_ENT(0x10, 168,
  208. 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x24, 0xEE, 0xEE, 0xEE, 0xEE,
  209. 0xEE, 0xEE, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A,
  210. 0x04, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
  211. 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x24, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x2A, 0x2A, 0x2A, 0x2A,
  212. 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x04, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
  213. 0xEE, 0xEE, 0xEE, 0xEE, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x24,
  214. 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A,
  215. 0x2A, 0x2A, 0x2A, 0x2A, 0x04, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x2D, 0x2D,
  216. 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x24, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
  217. 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x04, 0xEE,
  218. 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE)
  219. );
  220. #ifdef CONFIG_RTL8188E
  221. static const struct map_t rtl8188e_pg_txpwr_def_info =
  222. MAP_ENT(0xB8, 1, 0xFF
  223. , MAPSEG_ARRAY_ENT(0x10, 12,
  224. 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x24)
  225. );
  226. #endif
  227. #ifdef CONFIG_RTL8188F
  228. static const struct map_t rtl8188f_pg_txpwr_def_info =
  229. MAP_ENT(0xB8, 1, 0xFF
  230. , MAPSEG_ARRAY_ENT(0x10, 12,
  231. 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x27, 0x27, 0x27, 0x27, 0x27, 0x24)
  232. );
  233. #endif
  234. #ifdef CONFIG_RTL8723B
  235. static const struct map_t rtl8723b_pg_txpwr_def_info =
  236. MAP_ENT(0xB8, 2, 0xFF
  237. , MAPSEG_ARRAY_ENT(0x10, 12,
  238. 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0xE0)
  239. , MAPSEG_ARRAY_ENT(0x3A, 12,
  240. 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0xE0)
  241. );
  242. #endif
  243. #ifdef CONFIG_RTL8703B
  244. static const struct map_t rtl8703b_pg_txpwr_def_info =
  245. MAP_ENT(0xB8, 1, 0xFF
  246. , MAPSEG_ARRAY_ENT(0x10, 12,
  247. 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x02)
  248. );
  249. #endif
  250. #ifdef CONFIG_RTL8723D
  251. static const struct map_t rtl8723d_pg_txpwr_def_info =
  252. MAP_ENT(0xB8, 2, 0xFF
  253. , MAPSEG_ARRAY_ENT(0x10, 12,
  254. 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x02)
  255. , MAPSEG_ARRAY_ENT(0x3A, 12,
  256. 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x21, 0x21, 0x21, 0x21, 0x02)
  257. );
  258. #endif
  259. #ifdef CONFIG_RTL8192E
  260. static const struct map_t rtl8192e_pg_txpwr_def_info =
  261. MAP_ENT(0xB8, 2, 0xFF
  262. , MAPSEG_ARRAY_ENT(0x10, 14,
  263. 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x24, 0xEE, 0xEE)
  264. , MAPSEG_ARRAY_ENT(0x3A, 14,
  265. 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x24, 0xEE, 0xEE)
  266. );
  267. #endif
  268. #ifdef CONFIG_RTL8821A
  269. static const struct map_t rtl8821a_pg_txpwr_def_info =
  270. MAP_ENT(0xB8, 1, 0xFF
  271. , MAPSEG_ARRAY_ENT(0x10, 39,
  272. 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x24, 0xFF, 0xFF, 0xFF, 0xFF,
  273. 0xFF, 0xFF, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A,
  274. 0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00)
  275. );
  276. #endif
  277. #ifdef CONFIG_RTL8821C
  278. static const struct map_t rtl8821c_pg_txpwr_def_info =
  279. MAP_ENT(0xB8, 1, 0xFF
  280. , MAPSEG_ARRAY_ENT(0x10, 54,
  281. 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x02, 0xFF, 0xFF, 0xFF, 0xFF,
  282. 0xFF, 0xFF, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28,
  283. 0x02, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0xFF, 0xFF, 0xFF, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
  284. 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x02)
  285. );
  286. #endif
  287. #ifdef CONFIG_RTL8812A
  288. static const struct map_t rtl8812a_pg_txpwr_def_info =
  289. MAP_ENT(0xB8, 1, 0xFF
  290. , MAPSEG_ARRAY_ENT(0x10, 82,
  291. 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x02, 0xEE, 0xEE, 0xFF, 0xFF,
  292. 0xFF, 0xFF, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A,
  293. 0x02, 0xEE, 0xFF, 0xFF, 0xEE, 0xFF, 0x00, 0xEE, 0xFF, 0xFF, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
  294. 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x02, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0x2A, 0x2A, 0x2A, 0x2A,
  295. 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x02, 0xEE, 0xFF, 0xFF, 0xEE, 0xFF,
  296. 0x00, 0xEE)
  297. );
  298. #endif
  299. #ifdef CONFIG_RTL8822B
  300. static const struct map_t rtl8822b_pg_txpwr_def_info =
  301. MAP_ENT(0xB8, 1, 0xFF
  302. , MAPSEG_ARRAY_ENT(0x10, 82,
  303. 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x02, 0xEE, 0xEE, 0xFF, 0xFF,
  304. 0xFF, 0xFF, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A,
  305. 0x02, 0xEE, 0xFF, 0xFF, 0xEE, 0xFF, 0xEC, 0xEC, 0xFF, 0xFF, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
  306. 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x02, 0xEE, 0xEE, 0xFF, 0xFF, 0xFF, 0xFF, 0x2A, 0x2A, 0x2A, 0x2A,
  307. 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x02, 0xEE, 0xFF, 0xFF, 0xEE, 0xFF,
  308. 0xEC, 0xEC)
  309. );
  310. #endif
  311. #ifdef CONFIG_RTL8814A
  312. static const struct map_t rtl8814a_pg_txpwr_def_info =
  313. MAP_ENT(0xB8, 1, 0xFF
  314. , MAPSEG_ARRAY_ENT(0x10, 168,
  315. 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x02, 0xEE, 0xEE, 0xEE, 0xEE,
  316. 0xEE, 0xEE, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A,
  317. 0x02, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0xEE, 0xEE, 0xEE, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D,
  318. 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x02, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x2A, 0x2A, 0x2A, 0x2A,
  319. 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x02, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
  320. 0x00, 0xEE, 0xEE, 0xEE, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x02,
  321. 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A,
  322. 0x2A, 0x2A, 0x2A, 0x2A, 0x02, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0xEE, 0xEE, 0xEE, 0x2D, 0x2D,
  323. 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x02, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE, 0xEE,
  324. 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x02, 0xEE,
  325. 0xEE, 0xEE, 0xEE, 0xEE, 0x00, 0xEE, 0xEE, 0xEE)
  326. );
  327. #endif
  328. const struct map_t *hal_pg_txpwr_def_info(_adapter *adapter)
  329. {
  330. u8 interface_type = 0;
  331. const struct map_t *map = NULL;
  332. interface_type = rtw_get_intf_type(adapter);
  333. switch (rtw_get_chip_type(adapter)) {
  334. #ifdef CONFIG_RTL8723B
  335. case RTL8723B:
  336. map = &rtl8723b_pg_txpwr_def_info;
  337. break;
  338. #endif
  339. #ifdef CONFIG_RTL8703B
  340. case RTL8703B:
  341. map = &rtl8703b_pg_txpwr_def_info;
  342. break;
  343. #endif
  344. #ifdef CONFIG_RTL8723D
  345. case RTL8723D:
  346. map = &rtl8723d_pg_txpwr_def_info;
  347. break;
  348. #endif
  349. #ifdef CONFIG_RTL8188E
  350. case RTL8188E:
  351. map = &rtl8188e_pg_txpwr_def_info;
  352. break;
  353. #endif
  354. #ifdef CONFIG_RTL8188F
  355. case RTL8188F:
  356. map = &rtl8188f_pg_txpwr_def_info;
  357. break;
  358. #endif
  359. #ifdef CONFIG_RTL8812A
  360. case RTL8812:
  361. map = &rtl8812a_pg_txpwr_def_info;
  362. break;
  363. #endif
  364. #ifdef CONFIG_RTL8821A
  365. case RTL8821:
  366. map = &rtl8821a_pg_txpwr_def_info;
  367. break;
  368. #endif
  369. #ifdef CONFIG_RTL8192E
  370. case RTL8192E:
  371. map = &rtl8192e_pg_txpwr_def_info;
  372. break;
  373. #endif
  374. #ifdef CONFIG_RTL8814A
  375. case RTL8814A:
  376. map = &rtl8814a_pg_txpwr_def_info;
  377. break;
  378. #endif
  379. #ifdef CONFIG_RTL8822B
  380. case RTL8822B:
  381. map = &rtl8822b_pg_txpwr_def_info;
  382. break;
  383. #endif
  384. #ifdef CONFIG_RTL8821C
  385. case RTL8821C:
  386. map = &rtl8821c_pg_txpwr_def_info;
  387. break;
  388. #endif
  389. }
  390. if (map == NULL) {
  391. RTW_ERR("%s: unknown chip_type:%u\n"
  392. , __func__, rtw_get_chip_type(adapter));
  393. rtw_warn_on(1);
  394. }
  395. return map;
  396. }
  397. static u8 hal_chk_pg_txpwr_info_2g(_adapter *adapter, TxPowerInfo24G *pwr_info)
  398. {
  399. struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
  400. u8 path, group, tx_idx;
  401. if (pwr_info == NULL || !hal_chk_band_cap(adapter, BAND_CAP_2G))
  402. return _SUCCESS;
  403. for (path = 0; path < MAX_RF_PATH; path++) {
  404. if (!HAL_SPEC_CHK_RF_PATH_2G(hal_spec, path))
  405. continue;
  406. for (group = 0; group < MAX_CHNL_GROUP_24G; group++) {
  407. if (IS_PG_TXPWR_BASE_INVALID(pwr_info->IndexCCK_Base[path][group])
  408. || IS_PG_TXPWR_BASE_INVALID(pwr_info->IndexBW40_Base[path][group]))
  409. return _FAIL;
  410. }
  411. for (tx_idx = 0; tx_idx < MAX_TX_COUNT; tx_idx++) {
  412. if (!HAL_SPEC_CHK_TX_CNT(hal_spec, tx_idx))
  413. continue;
  414. if (IS_PG_TXPWR_DIFF_INVALID(pwr_info->CCK_Diff[path][tx_idx])
  415. || IS_PG_TXPWR_DIFF_INVALID(pwr_info->OFDM_Diff[path][tx_idx])
  416. || IS_PG_TXPWR_DIFF_INVALID(pwr_info->BW20_Diff[path][tx_idx])
  417. || IS_PG_TXPWR_DIFF_INVALID(pwr_info->BW40_Diff[path][tx_idx]))
  418. return _FAIL;
  419. }
  420. }
  421. return _SUCCESS;
  422. }
  423. static u8 hal_chk_pg_txpwr_info_5g(_adapter *adapter, TxPowerInfo5G *pwr_info)
  424. {
  425. #ifdef CONFIG_IEEE80211_BAND_5GHZ
  426. struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
  427. u8 path, group, tx_idx;
  428. if (pwr_info == NULL || !hal_chk_band_cap(adapter, BAND_CAP_5G))
  429. return _SUCCESS;
  430. for (path = 0; path < MAX_RF_PATH; path++) {
  431. if (!HAL_SPEC_CHK_RF_PATH_5G(hal_spec, path))
  432. continue;
  433. for (group = 0; group < MAX_CHNL_GROUP_5G; group++)
  434. if (IS_PG_TXPWR_BASE_INVALID(pwr_info->IndexBW40_Base[path][group]))
  435. return _FAIL;
  436. for (tx_idx = 0; tx_idx < MAX_TX_COUNT; tx_idx++) {
  437. if (!HAL_SPEC_CHK_TX_CNT(hal_spec, tx_idx))
  438. continue;
  439. if (IS_PG_TXPWR_DIFF_INVALID(pwr_info->OFDM_Diff[path][tx_idx])
  440. || IS_PG_TXPWR_DIFF_INVALID(pwr_info->BW20_Diff[path][tx_idx])
  441. || IS_PG_TXPWR_DIFF_INVALID(pwr_info->BW40_Diff[path][tx_idx])
  442. || IS_PG_TXPWR_DIFF_INVALID(pwr_info->BW80_Diff[path][tx_idx])
  443. || IS_PG_TXPWR_DIFF_INVALID(pwr_info->BW160_Diff[path][tx_idx]))
  444. return _FAIL;
  445. }
  446. }
  447. #endif /* CONFIG_IEEE80211_BAND_5GHZ */
  448. return _SUCCESS;
  449. }
  450. static inline void hal_init_pg_txpwr_info_2g(_adapter *adapter, TxPowerInfo24G *pwr_info)
  451. {
  452. struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
  453. u8 path, group, tx_idx;
  454. if (pwr_info == NULL)
  455. return;
  456. _rtw_memset(pwr_info, 0, sizeof(TxPowerInfo24G));
  457. /* init with invalid value */
  458. for (path = 0; path < MAX_RF_PATH; path++) {
  459. for (group = 0; group < MAX_CHNL_GROUP_24G; group++) {
  460. pwr_info->IndexCCK_Base[path][group] = PG_TXPWR_INVALID_BASE;
  461. pwr_info->IndexBW40_Base[path][group] = PG_TXPWR_INVALID_BASE;
  462. }
  463. for (tx_idx = 0; tx_idx < MAX_TX_COUNT; tx_idx++) {
  464. pwr_info->CCK_Diff[path][tx_idx] = PG_TXPWR_INVALID_DIFF;
  465. pwr_info->OFDM_Diff[path][tx_idx] = PG_TXPWR_INVALID_DIFF;
  466. pwr_info->BW20_Diff[path][tx_idx] = PG_TXPWR_INVALID_DIFF;
  467. pwr_info->BW40_Diff[path][tx_idx] = PG_TXPWR_INVALID_DIFF;
  468. }
  469. }
  470. /* init for dummy base and diff */
  471. for (path = 0; path < MAX_RF_PATH; path++) {
  472. if (!HAL_SPEC_CHK_RF_PATH_2G(hal_spec, path))
  473. break;
  474. /* 2.4G BW40 base has 1 less group than CCK base*/
  475. pwr_info->IndexBW40_Base[path][MAX_CHNL_GROUP_24G - 1] = 0;
  476. /* dummy diff */
  477. pwr_info->CCK_Diff[path][0] = 0; /* 2.4G CCK-1TX */
  478. pwr_info->BW40_Diff[path][0] = 0; /* 2.4G BW40-1S */
  479. }
  480. }
  481. static inline void hal_init_pg_txpwr_info_5g(_adapter *adapter, TxPowerInfo5G *pwr_info)
  482. {
  483. #ifdef CONFIG_IEEE80211_BAND_5GHZ
  484. struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
  485. u8 path, group, tx_idx;
  486. if (pwr_info == NULL)
  487. return;
  488. _rtw_memset(pwr_info, 0, sizeof(TxPowerInfo5G));
  489. /* init with invalid value */
  490. for (path = 0; path < MAX_RF_PATH; path++) {
  491. for (group = 0; group < MAX_CHNL_GROUP_5G; group++)
  492. pwr_info->IndexBW40_Base[path][group] = PG_TXPWR_INVALID_BASE;
  493. for (tx_idx = 0; tx_idx < MAX_TX_COUNT; tx_idx++) {
  494. pwr_info->OFDM_Diff[path][tx_idx] = PG_TXPWR_INVALID_DIFF;
  495. pwr_info->BW20_Diff[path][tx_idx] = PG_TXPWR_INVALID_DIFF;
  496. pwr_info->BW40_Diff[path][tx_idx] = PG_TXPWR_INVALID_DIFF;
  497. pwr_info->BW80_Diff[path][tx_idx] = PG_TXPWR_INVALID_DIFF;
  498. pwr_info->BW160_Diff[path][tx_idx] = PG_TXPWR_INVALID_DIFF;
  499. }
  500. }
  501. for (path = 0; path < MAX_RF_PATH; path++) {
  502. if (!HAL_SPEC_CHK_RF_PATH_5G(hal_spec, path))
  503. break;
  504. /* dummy diff */
  505. pwr_info->BW40_Diff[path][0] = 0; /* 5G BW40-1S */
  506. }
  507. #endif /* CONFIG_IEEE80211_BAND_5GHZ */
  508. }
  509. #if DBG_PG_TXPWR_READ
  510. #define LOAD_PG_TXPWR_WARN_COND(_txpwr_src) 1
  511. #else
  512. #define LOAD_PG_TXPWR_WARN_COND(_txpwr_src) (_txpwr_src > PG_TXPWR_SRC_PG_DATA)
  513. #endif
  514. u16 hal_load_pg_txpwr_info_path_2g(
  515. _adapter *adapter,
  516. TxPowerInfo24G *pwr_info,
  517. u32 path,
  518. u8 txpwr_src,
  519. const struct map_t *txpwr_map,
  520. u16 pg_offset)
  521. {
  522. #define PG_TXPWR_1PATH_BYTE_NUM_2G 18
  523. struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
  524. u16 offset = pg_offset;
  525. u8 group, tx_idx;
  526. u8 val;
  527. u8 tmp_base;
  528. s8 tmp_diff;
  529. if (pwr_info == NULL || !hal_chk_band_cap(adapter, BAND_CAP_2G)) {
  530. offset += PG_TXPWR_1PATH_BYTE_NUM_2G;
  531. goto exit;
  532. }
  533. if (DBG_PG_TXPWR_READ)
  534. RTW_INFO("%s [%c] offset:0x%03x\n", __func__, rf_path_char(path), offset);
  535. for (group = 0; group < MAX_CHNL_GROUP_24G; group++) {
  536. if (HAL_SPEC_CHK_RF_PATH_2G(hal_spec, path)) {
  537. tmp_base = map_read8(txpwr_map, offset);
  538. if (!IS_PG_TXPWR_BASE_INVALID(tmp_base)
  539. && IS_PG_TXPWR_BASE_INVALID(pwr_info->IndexCCK_Base[path][group])
  540. ) {
  541. pwr_info->IndexCCK_Base[path][group] = tmp_base;
  542. if (LOAD_PG_TXPWR_WARN_COND(txpwr_src))
  543. RTW_INFO("[%c] 2G G%02d CCK-1T base:%u from %s\n", rf_path_char(path), group, tmp_base, pg_txpwr_src_str(txpwr_src));
  544. }
  545. }
  546. offset++;
  547. }
  548. for (group = 0; group < MAX_CHNL_GROUP_24G - 1; group++) {
  549. if (HAL_SPEC_CHK_RF_PATH_2G(hal_spec, path)) {
  550. tmp_base = map_read8(txpwr_map, offset);
  551. if (!IS_PG_TXPWR_BASE_INVALID(tmp_base)
  552. && IS_PG_TXPWR_BASE_INVALID(pwr_info->IndexBW40_Base[path][group])
  553. ) {
  554. pwr_info->IndexBW40_Base[path][group] = tmp_base;
  555. if (LOAD_PG_TXPWR_WARN_COND(txpwr_src))
  556. RTW_INFO("[%c] 2G G%02d BW40-1S base:%u from %s\n", rf_path_char(path), group, tmp_base, pg_txpwr_src_str(txpwr_src));
  557. }
  558. }
  559. offset++;
  560. }
  561. for (tx_idx = 0; tx_idx < MAX_TX_COUNT; tx_idx++) {
  562. if (tx_idx == 0) {
  563. if (HAL_SPEC_CHK_RF_PATH_2G(hal_spec, path) && HAL_SPEC_CHK_TX_CNT(hal_spec, tx_idx)) {
  564. val = map_read8(txpwr_map, offset);
  565. tmp_diff = PG_TXPWR_MSB_DIFF_TO_S8BIT(val);
  566. if (!IS_PG_TXPWR_DIFF_INVALID(tmp_diff)
  567. && IS_PG_TXPWR_DIFF_INVALID(pwr_info->BW20_Diff[path][tx_idx])
  568. ) {
  569. pwr_info->BW20_Diff[path][tx_idx] = tmp_diff;
  570. if (LOAD_PG_TXPWR_WARN_COND(txpwr_src))
  571. RTW_INFO("[%c] 2G BW20-%dS diff:%d from %s\n", rf_path_char(path), tx_idx + 1, tmp_diff, pg_txpwr_src_str(txpwr_src));
  572. }
  573. tmp_diff = PG_TXPWR_LSB_DIFF_TO_S8BIT(val);
  574. if (!IS_PG_TXPWR_DIFF_INVALID(tmp_diff)
  575. && IS_PG_TXPWR_DIFF_INVALID(pwr_info->OFDM_Diff[path][tx_idx])
  576. ) {
  577. pwr_info->OFDM_Diff[path][tx_idx] = tmp_diff;
  578. if (LOAD_PG_TXPWR_WARN_COND(txpwr_src))
  579. RTW_INFO("[%c] 2G OFDM-%dT diff:%d from %s\n", rf_path_char(path), tx_idx + 1, tmp_diff, pg_txpwr_src_str(txpwr_src));
  580. }
  581. }
  582. offset++;
  583. } else {
  584. if (HAL_SPEC_CHK_RF_PATH_2G(hal_spec, path) && HAL_SPEC_CHK_TX_CNT(hal_spec, tx_idx)) {
  585. val = map_read8(txpwr_map, offset);
  586. tmp_diff = PG_TXPWR_MSB_DIFF_TO_S8BIT(val);
  587. if (!IS_PG_TXPWR_DIFF_INVALID(tmp_diff)
  588. && IS_PG_TXPWR_DIFF_INVALID(pwr_info->BW40_Diff[path][tx_idx])
  589. ) {
  590. pwr_info->BW40_Diff[path][tx_idx] = tmp_diff;
  591. if (LOAD_PG_TXPWR_WARN_COND(txpwr_src))
  592. RTW_INFO("[%c] 2G BW40-%dS diff:%d from %s\n", rf_path_char(path), tx_idx + 1, tmp_diff, pg_txpwr_src_str(txpwr_src));
  593. }
  594. tmp_diff = PG_TXPWR_LSB_DIFF_TO_S8BIT(val);
  595. if (!IS_PG_TXPWR_DIFF_INVALID(tmp_diff)
  596. && IS_PG_TXPWR_DIFF_INVALID(pwr_info->BW20_Diff[path][tx_idx])
  597. ) {
  598. pwr_info->BW20_Diff[path][tx_idx] = tmp_diff;
  599. if (LOAD_PG_TXPWR_WARN_COND(txpwr_src))
  600. RTW_INFO("[%c] 2G BW20-%dS diff:%d from %s\n", rf_path_char(path), tx_idx + 1, tmp_diff, pg_txpwr_src_str(txpwr_src));
  601. }
  602. }
  603. offset++;
  604. if (HAL_SPEC_CHK_RF_PATH_2G(hal_spec, path) && HAL_SPEC_CHK_TX_CNT(hal_spec, tx_idx)) {
  605. val = map_read8(txpwr_map, offset);
  606. tmp_diff = PG_TXPWR_MSB_DIFF_TO_S8BIT(val);
  607. if (!IS_PG_TXPWR_DIFF_INVALID(tmp_diff)
  608. && IS_PG_TXPWR_DIFF_INVALID(pwr_info->OFDM_Diff[path][tx_idx])
  609. ) {
  610. pwr_info->OFDM_Diff[path][tx_idx] = tmp_diff;
  611. if (LOAD_PG_TXPWR_WARN_COND(txpwr_src))
  612. RTW_INFO("[%c] 2G OFDM-%dT diff:%d from %s\n", rf_path_char(path), tx_idx + 1, tmp_diff, pg_txpwr_src_str(txpwr_src));
  613. }
  614. tmp_diff = PG_TXPWR_LSB_DIFF_TO_S8BIT(val);
  615. if (!IS_PG_TXPWR_DIFF_INVALID(tmp_diff)
  616. && IS_PG_TXPWR_DIFF_INVALID(pwr_info->CCK_Diff[path][tx_idx])
  617. ) {
  618. pwr_info->CCK_Diff[path][tx_idx] = tmp_diff;
  619. if (LOAD_PG_TXPWR_WARN_COND(txpwr_src))
  620. RTW_INFO("[%c] 2G CCK-%dT diff:%d from %s\n", rf_path_char(path), tx_idx + 1, tmp_diff, pg_txpwr_src_str(txpwr_src));
  621. }
  622. }
  623. offset++;
  624. }
  625. }
  626. if (offset != pg_offset + PG_TXPWR_1PATH_BYTE_NUM_2G) {
  627. RTW_ERR("%s parse %d bytes != %d\n", __func__, offset - pg_offset, PG_TXPWR_1PATH_BYTE_NUM_2G);
  628. rtw_warn_on(1);
  629. }
  630. exit:
  631. return offset;
  632. }
  633. u16 hal_load_pg_txpwr_info_path_5g(
  634. _adapter *adapter,
  635. TxPowerInfo5G *pwr_info,
  636. u32 path,
  637. u8 txpwr_src,
  638. const struct map_t *txpwr_map,
  639. u16 pg_offset)
  640. {
  641. #define PG_TXPWR_1PATH_BYTE_NUM_5G 24
  642. struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
  643. u16 offset = pg_offset;
  644. u8 group, tx_idx;
  645. u8 val;
  646. u8 tmp_base;
  647. s8 tmp_diff;
  648. #ifdef CONFIG_IEEE80211_BAND_5GHZ
  649. if (pwr_info == NULL || !hal_chk_band_cap(adapter, BAND_CAP_5G))
  650. #endif
  651. {
  652. offset += PG_TXPWR_1PATH_BYTE_NUM_5G;
  653. goto exit;
  654. }
  655. #ifdef CONFIG_IEEE80211_BAND_5GHZ
  656. if (DBG_PG_TXPWR_READ)
  657. RTW_INFO("%s[%c] eaddr:0x%03x\n", __func__, rf_path_char(path), offset);
  658. for (group = 0; group < MAX_CHNL_GROUP_5G; group++) {
  659. if (HAL_SPEC_CHK_RF_PATH_5G(hal_spec, path)) {
  660. tmp_base = map_read8(txpwr_map, offset);
  661. if (!IS_PG_TXPWR_BASE_INVALID(tmp_base)
  662. && IS_PG_TXPWR_BASE_INVALID(pwr_info->IndexBW40_Base[path][group])
  663. ) {
  664. pwr_info->IndexBW40_Base[path][group] = tmp_base;
  665. if (LOAD_PG_TXPWR_WARN_COND(txpwr_src))
  666. RTW_INFO("[%c] 5G G%02d BW40-1S base:%u from %s\n", rf_path_char(path), group, tmp_base, pg_txpwr_src_str(txpwr_src));
  667. }
  668. }
  669. offset++;
  670. }
  671. for (tx_idx = 0; tx_idx < MAX_TX_COUNT; tx_idx++) {
  672. if (tx_idx == 0) {
  673. if (HAL_SPEC_CHK_RF_PATH_5G(hal_spec, path) && HAL_SPEC_CHK_TX_CNT(hal_spec, tx_idx)) {
  674. val = map_read8(txpwr_map, offset);
  675. tmp_diff = PG_TXPWR_MSB_DIFF_TO_S8BIT(val);
  676. if (!IS_PG_TXPWR_DIFF_INVALID(tmp_diff)
  677. && IS_PG_TXPWR_DIFF_INVALID(pwr_info->BW20_Diff[path][tx_idx])
  678. ) {
  679. pwr_info->BW20_Diff[path][tx_idx] = tmp_diff;
  680. if (LOAD_PG_TXPWR_WARN_COND(txpwr_src))
  681. RTW_INFO("[%c] 5G BW20-%dS diff:%d from %s\n", rf_path_char(path), tx_idx + 1, tmp_diff, pg_txpwr_src_str(txpwr_src));
  682. }
  683. tmp_diff = PG_TXPWR_LSB_DIFF_TO_S8BIT(val);
  684. if (!IS_PG_TXPWR_DIFF_INVALID(tmp_diff)
  685. && IS_PG_TXPWR_DIFF_INVALID(pwr_info->OFDM_Diff[path][tx_idx])
  686. ) {
  687. pwr_info->OFDM_Diff[path][tx_idx] = tmp_diff;
  688. if (LOAD_PG_TXPWR_WARN_COND(txpwr_src))
  689. RTW_INFO("[%c] 5G OFDM-%dT diff:%d from %s\n", rf_path_char(path), tx_idx + 1, tmp_diff, pg_txpwr_src_str(txpwr_src));
  690. }
  691. }
  692. offset++;
  693. } else {
  694. if (HAL_SPEC_CHK_RF_PATH_5G(hal_spec, path) && HAL_SPEC_CHK_TX_CNT(hal_spec, tx_idx)) {
  695. val = map_read8(txpwr_map, offset);
  696. tmp_diff = PG_TXPWR_MSB_DIFF_TO_S8BIT(val);
  697. if (!IS_PG_TXPWR_DIFF_INVALID(tmp_diff)
  698. && IS_PG_TXPWR_DIFF_INVALID(pwr_info->BW40_Diff[path][tx_idx])
  699. ) {
  700. pwr_info->BW40_Diff[path][tx_idx] = tmp_diff;
  701. if (LOAD_PG_TXPWR_WARN_COND(txpwr_src))
  702. RTW_INFO("[%c] 5G BW40-%dS diff:%d from %s\n", rf_path_char(path), tx_idx + 1, tmp_diff, pg_txpwr_src_str(txpwr_src));
  703. }
  704. tmp_diff = PG_TXPWR_LSB_DIFF_TO_S8BIT(val);
  705. if (!IS_PG_TXPWR_DIFF_INVALID(tmp_diff)
  706. && IS_PG_TXPWR_DIFF_INVALID(pwr_info->BW20_Diff[path][tx_idx])
  707. ) {
  708. pwr_info->BW20_Diff[path][tx_idx] = tmp_diff;
  709. if (LOAD_PG_TXPWR_WARN_COND(txpwr_src))
  710. RTW_INFO("[%c] 5G BW20-%dS diff:%d from %s\n", rf_path_char(path), tx_idx + 1, tmp_diff, pg_txpwr_src_str(txpwr_src));
  711. }
  712. }
  713. offset++;
  714. }
  715. }
  716. /* OFDM diff 2T ~ 3T */
  717. if (HAL_SPEC_CHK_RF_PATH_5G(hal_spec, path) && HAL_SPEC_CHK_TX_CNT(hal_spec, 1)) {
  718. val = map_read8(txpwr_map, offset);
  719. tmp_diff = PG_TXPWR_MSB_DIFF_TO_S8BIT(val);
  720. if (!IS_PG_TXPWR_DIFF_INVALID(tmp_diff)
  721. && IS_PG_TXPWR_DIFF_INVALID(pwr_info->OFDM_Diff[path][1])
  722. ) {
  723. pwr_info->OFDM_Diff[path][1] = tmp_diff;
  724. if (LOAD_PG_TXPWR_WARN_COND(txpwr_src))
  725. RTW_INFO("[%c] 5G OFDM-%dT diff:%d from %s\n", rf_path_char(path), 2, tmp_diff, pg_txpwr_src_str(txpwr_src));
  726. }
  727. if (HAL_SPEC_CHK_TX_CNT(hal_spec, 2)) {
  728. tmp_diff = PG_TXPWR_LSB_DIFF_TO_S8BIT(val);
  729. if (!IS_PG_TXPWR_DIFF_INVALID(tmp_diff)
  730. && IS_PG_TXPWR_DIFF_INVALID(pwr_info->OFDM_Diff[path][2])
  731. ) {
  732. pwr_info->OFDM_Diff[path][2] = tmp_diff;
  733. if (LOAD_PG_TXPWR_WARN_COND(txpwr_src))
  734. RTW_INFO("[%c] 5G OFDM-%dT diff:%d from %s\n", rf_path_char(path), 3, tmp_diff, pg_txpwr_src_str(txpwr_src));
  735. }
  736. }
  737. }
  738. offset++;
  739. /* OFDM diff 4T */
  740. if (HAL_SPEC_CHK_RF_PATH_5G(hal_spec, path) && HAL_SPEC_CHK_TX_CNT(hal_spec, 3)) {
  741. val = map_read8(txpwr_map, offset);
  742. tmp_diff = PG_TXPWR_LSB_DIFF_TO_S8BIT(val);
  743. if (!IS_PG_TXPWR_DIFF_INVALID(tmp_diff)
  744. && IS_PG_TXPWR_DIFF_INVALID(pwr_info->OFDM_Diff[path][3])
  745. ) {
  746. pwr_info->OFDM_Diff[path][3] = tmp_diff;
  747. if (LOAD_PG_TXPWR_WARN_COND(txpwr_src))
  748. RTW_INFO("[%c] 5G OFDM-%dT diff:%d from %s\n", rf_path_char(path), 4, tmp_diff, pg_txpwr_src_str(txpwr_src));
  749. }
  750. }
  751. offset++;
  752. for (tx_idx = 0; tx_idx < MAX_TX_COUNT; tx_idx++) {
  753. if (HAL_SPEC_CHK_RF_PATH_5G(hal_spec, path) && HAL_SPEC_CHK_TX_CNT(hal_spec, tx_idx)) {
  754. val = map_read8(txpwr_map, offset);
  755. tmp_diff = PG_TXPWR_MSB_DIFF_TO_S8BIT(val);
  756. if (!IS_PG_TXPWR_DIFF_INVALID(tmp_diff)
  757. && IS_PG_TXPWR_DIFF_INVALID(pwr_info->BW80_Diff[path][tx_idx])
  758. ) {
  759. pwr_info->BW80_Diff[path][tx_idx] = tmp_diff;
  760. if (LOAD_PG_TXPWR_WARN_COND(txpwr_src))
  761. RTW_INFO("[%c] 5G BW80-%dS diff:%d from %s\n", rf_path_char(path), tx_idx + 1, tmp_diff, pg_txpwr_src_str(txpwr_src));
  762. }
  763. tmp_diff = PG_TXPWR_LSB_DIFF_TO_S8BIT(val);
  764. if (!IS_PG_TXPWR_DIFF_INVALID(tmp_diff)
  765. && IS_PG_TXPWR_DIFF_INVALID(pwr_info->BW160_Diff[path][tx_idx])
  766. ) {
  767. pwr_info->BW160_Diff[path][tx_idx] = tmp_diff;
  768. if (LOAD_PG_TXPWR_WARN_COND(txpwr_src))
  769. RTW_INFO("[%c] 5G BW160-%dS diff:%d from %s\n", rf_path_char(path), tx_idx + 1, tmp_diff, pg_txpwr_src_str(txpwr_src));
  770. }
  771. }
  772. offset++;
  773. }
  774. if (offset != pg_offset + PG_TXPWR_1PATH_BYTE_NUM_5G) {
  775. RTW_ERR("%s parse %d bytes != %d\n", __func__, offset - pg_offset, PG_TXPWR_1PATH_BYTE_NUM_5G);
  776. rtw_warn_on(1);
  777. }
  778. #endif /* #ifdef CONFIG_IEEE80211_BAND_5GHZ */
  779. exit:
  780. return offset;
  781. }
  782. void hal_load_pg_txpwr_info(
  783. _adapter *adapter,
  784. TxPowerInfo24G *pwr_info_2g,
  785. TxPowerInfo5G *pwr_info_5g,
  786. u8 *pg_data,
  787. BOOLEAN AutoLoadFail
  788. )
  789. {
  790. struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
  791. u8 path;
  792. u16 pg_offset;
  793. u8 txpwr_src = PG_TXPWR_SRC_PG_DATA;
  794. struct map_t pg_data_map = MAP_ENT(184, 1, 0xFF, MAPSEG_PTR_ENT(0x00, 184, pg_data));
  795. const struct map_t *txpwr_map = NULL;
  796. /* init with invalid value and some dummy base and diff */
  797. hal_init_pg_txpwr_info_2g(adapter, pwr_info_2g);
  798. hal_init_pg_txpwr_info_5g(adapter, pwr_info_5g);
  799. select_src:
  800. pg_offset = 0x10;
  801. switch (txpwr_src) {
  802. case PG_TXPWR_SRC_PG_DATA:
  803. txpwr_map = &pg_data_map;
  804. break;
  805. case PG_TXPWR_SRC_IC_DEF:
  806. txpwr_map = hal_pg_txpwr_def_info(adapter);
  807. break;
  808. case PG_TXPWR_SRC_DEF:
  809. default:
  810. txpwr_map = &pg_txpwr_def_info;
  811. break;
  812. };
  813. if (txpwr_map == NULL)
  814. goto end_parse;
  815. for (path = 0; path < MAX_RF_PATH ; path++) {
  816. if (!HAL_SPEC_CHK_RF_PATH_2G(hal_spec, path) && !HAL_SPEC_CHK_RF_PATH_5G(hal_spec, path))
  817. break;
  818. pg_offset = hal_load_pg_txpwr_info_path_2g(adapter, pwr_info_2g, path, txpwr_src, txpwr_map, pg_offset);
  819. pg_offset = hal_load_pg_txpwr_info_path_5g(adapter, pwr_info_5g, path, txpwr_src, txpwr_map, pg_offset);
  820. }
  821. if (hal_chk_pg_txpwr_info_2g(adapter, pwr_info_2g) == _SUCCESS
  822. && hal_chk_pg_txpwr_info_5g(adapter, pwr_info_5g) == _SUCCESS)
  823. goto exit;
  824. end_parse:
  825. txpwr_src++;
  826. if (txpwr_src < PG_TXPWR_SRC_NUM)
  827. goto select_src;
  828. if (hal_chk_pg_txpwr_info_2g(adapter, pwr_info_2g) != _SUCCESS
  829. || hal_chk_pg_txpwr_info_5g(adapter, pwr_info_5g) != _SUCCESS)
  830. rtw_warn_on(1);
  831. exit:
  832. if (DBG_PG_TXPWR_READ) {
  833. if (pwr_info_2g)
  834. dump_pg_txpwr_info_2g(RTW_DBGDUMP, pwr_info_2g, 4, 4);
  835. if (pwr_info_5g)
  836. dump_pg_txpwr_info_5g(RTW_DBGDUMP, pwr_info_5g, 4, 4);
  837. }
  838. return;
  839. }
  840. void hal_load_txpwr_info(
  841. _adapter *adapter,
  842. TxPowerInfo24G *pwr_info_2g,
  843. TxPowerInfo5G *pwr_info_5g,
  844. u8 *pg_data
  845. )
  846. {
  847. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  848. struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
  849. u8 max_tx_cnt = hal_spec->max_tx_cnt;
  850. u8 rfpath, ch_idx, group, tx_idx;
  851. /* load from pg data (or default value) */
  852. hal_load_pg_txpwr_info(adapter, pwr_info_2g, pwr_info_5g, pg_data, _FALSE);
  853. /* transform to hal_data */
  854. for (rfpath = 0; rfpath < MAX_RF_PATH; rfpath++) {
  855. if (!pwr_info_2g || !HAL_SPEC_CHK_RF_PATH_2G(hal_spec, rfpath))
  856. goto bypass_2g;
  857. /* 2.4G base */
  858. for (ch_idx = 0; ch_idx < CENTER_CH_2G_NUM; ch_idx++) {
  859. u8 cck_group;
  860. if (rtw_get_ch_group(ch_idx + 1, &group, &cck_group) != BAND_ON_2_4G)
  861. continue;
  862. hal_data->Index24G_CCK_Base[rfpath][ch_idx] = pwr_info_2g->IndexCCK_Base[rfpath][cck_group];
  863. hal_data->Index24G_BW40_Base[rfpath][ch_idx] = pwr_info_2g->IndexBW40_Base[rfpath][group];
  864. }
  865. /* 2.4G diff */
  866. for (tx_idx = 0; tx_idx < MAX_TX_COUNT; tx_idx++) {
  867. if (tx_idx >= max_tx_cnt)
  868. break;
  869. hal_data->CCK_24G_Diff[rfpath][tx_idx] = pwr_info_2g->CCK_Diff[rfpath][tx_idx];
  870. hal_data->OFDM_24G_Diff[rfpath][tx_idx] = pwr_info_2g->OFDM_Diff[rfpath][tx_idx];
  871. hal_data->BW20_24G_Diff[rfpath][tx_idx] = pwr_info_2g->BW20_Diff[rfpath][tx_idx];
  872. hal_data->BW40_24G_Diff[rfpath][tx_idx] = pwr_info_2g->BW40_Diff[rfpath][tx_idx];
  873. }
  874. bypass_2g:
  875. ;
  876. #ifdef CONFIG_IEEE80211_BAND_5GHZ
  877. if (!pwr_info_5g || !HAL_SPEC_CHK_RF_PATH_5G(hal_spec, rfpath))
  878. goto bypass_5g;
  879. /* 5G base */
  880. for (ch_idx = 0; ch_idx < CENTER_CH_5G_ALL_NUM; ch_idx++) {
  881. if (rtw_get_ch_group(center_ch_5g_all[ch_idx], &group, NULL) != BAND_ON_5G)
  882. continue;
  883. hal_data->Index5G_BW40_Base[rfpath][ch_idx] = pwr_info_5g->IndexBW40_Base[rfpath][group];
  884. }
  885. for (ch_idx = 0 ; ch_idx < CENTER_CH_5G_80M_NUM; ch_idx++) {
  886. u8 upper, lower;
  887. if (rtw_get_ch_group(center_ch_5g_80m[ch_idx], &group, NULL) != BAND_ON_5G)
  888. continue;
  889. upper = pwr_info_5g->IndexBW40_Base[rfpath][group];
  890. lower = pwr_info_5g->IndexBW40_Base[rfpath][group + 1];
  891. hal_data->Index5G_BW80_Base[rfpath][ch_idx] = (upper + lower) / 2;
  892. }
  893. /* 5G diff */
  894. for (tx_idx = 0; tx_idx < MAX_TX_COUNT; tx_idx++) {
  895. if (tx_idx >= max_tx_cnt)
  896. break;
  897. hal_data->OFDM_5G_Diff[rfpath][tx_idx] = pwr_info_5g->OFDM_Diff[rfpath][tx_idx];
  898. hal_data->BW20_5G_Diff[rfpath][tx_idx] = pwr_info_5g->BW20_Diff[rfpath][tx_idx];
  899. hal_data->BW40_5G_Diff[rfpath][tx_idx] = pwr_info_5g->BW40_Diff[rfpath][tx_idx];
  900. hal_data->BW80_5G_Diff[rfpath][tx_idx] = pwr_info_5g->BW80_Diff[rfpath][tx_idx];
  901. }
  902. bypass_5g:
  903. ;
  904. #endif /* CONFIG_IEEE80211_BAND_5GHZ */
  905. }
  906. }
  907. void dump_hal_txpwr_info_2g(void *sel, _adapter *adapter, u8 rfpath_num, u8 max_tx_cnt)
  908. {
  909. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  910. int path, ch_idx, tx_idx;
  911. RTW_PRINT_SEL(sel, "2.4G\n");
  912. RTW_PRINT_SEL(sel, "CCK-1T base:\n");
  913. RTW_PRINT_SEL(sel, "%4s ", "");
  914. for (ch_idx = 0; ch_idx < CENTER_CH_2G_NUM; ch_idx++)
  915. _RTW_PRINT_SEL(sel, "%2d ", center_ch_2g[ch_idx]);
  916. _RTW_PRINT_SEL(sel, "\n");
  917. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  918. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  919. for (ch_idx = 0; ch_idx < CENTER_CH_2G_NUM; ch_idx++)
  920. _RTW_PRINT_SEL(sel, "%2u ", hal_data->Index24G_CCK_Base[path][ch_idx]);
  921. _RTW_PRINT_SEL(sel, "\n");
  922. }
  923. RTW_PRINT_SEL(sel, "\n");
  924. RTW_PRINT_SEL(sel, "CCK diff:\n");
  925. RTW_PRINT_SEL(sel, "%4s ", "");
  926. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  927. _RTW_PRINT_SEL(sel, "%dT ", tx_idx + 1);
  928. _RTW_PRINT_SEL(sel, "\n");
  929. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  930. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  931. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  932. _RTW_PRINT_SEL(sel, "%2d ", hal_data->CCK_24G_Diff[path][tx_idx]);
  933. _RTW_PRINT_SEL(sel, "\n");
  934. }
  935. RTW_PRINT_SEL(sel, "\n");
  936. RTW_PRINT_SEL(sel, "BW40-1S base:\n");
  937. RTW_PRINT_SEL(sel, "%4s ", "");
  938. for (ch_idx = 0; ch_idx < CENTER_CH_2G_NUM; ch_idx++)
  939. _RTW_PRINT_SEL(sel, "%2d ", center_ch_2g[ch_idx]);
  940. _RTW_PRINT_SEL(sel, "\n");
  941. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  942. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  943. for (ch_idx = 0; ch_idx < CENTER_CH_2G_NUM; ch_idx++)
  944. _RTW_PRINT_SEL(sel, "%2u ", hal_data->Index24G_BW40_Base[path][ch_idx]);
  945. _RTW_PRINT_SEL(sel, "\n");
  946. }
  947. RTW_PRINT_SEL(sel, "\n");
  948. RTW_PRINT_SEL(sel, "OFDM diff:\n");
  949. RTW_PRINT_SEL(sel, "%4s ", "");
  950. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  951. _RTW_PRINT_SEL(sel, "%dT ", tx_idx + 1);
  952. _RTW_PRINT_SEL(sel, "\n");
  953. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  954. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  955. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  956. _RTW_PRINT_SEL(sel, "%2d ", hal_data->OFDM_24G_Diff[path][tx_idx]);
  957. _RTW_PRINT_SEL(sel, "\n");
  958. }
  959. RTW_PRINT_SEL(sel, "\n");
  960. RTW_PRINT_SEL(sel, "BW20 diff:\n");
  961. RTW_PRINT_SEL(sel, "%4s ", "");
  962. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  963. _RTW_PRINT_SEL(sel, "%dS ", tx_idx + 1);
  964. _RTW_PRINT_SEL(sel, "\n");
  965. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  966. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  967. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  968. _RTW_PRINT_SEL(sel, "%2d ", hal_data->BW20_24G_Diff[path][tx_idx]);
  969. _RTW_PRINT_SEL(sel, "\n");
  970. }
  971. RTW_PRINT_SEL(sel, "\n");
  972. RTW_PRINT_SEL(sel, "BW40 diff:\n");
  973. RTW_PRINT_SEL(sel, "%4s ", "");
  974. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  975. _RTW_PRINT_SEL(sel, "%dS ", tx_idx + 1);
  976. _RTW_PRINT_SEL(sel, "\n");
  977. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  978. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  979. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  980. _RTW_PRINT_SEL(sel, "%2d ", hal_data->BW40_24G_Diff[path][tx_idx]);
  981. _RTW_PRINT_SEL(sel, "\n");
  982. }
  983. RTW_PRINT_SEL(sel, "\n");
  984. }
  985. void dump_hal_txpwr_info_5g(void *sel, _adapter *adapter, u8 rfpath_num, u8 max_tx_cnt)
  986. {
  987. #ifdef CONFIG_IEEE80211_BAND_5GHZ
  988. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  989. int path, ch_idx, tx_idx;
  990. u8 dump_section = 0;
  991. u8 ch_idx_s = 0;
  992. RTW_PRINT_SEL(sel, "5G\n");
  993. RTW_PRINT_SEL(sel, "BW40-1S base:\n");
  994. do {
  995. #define DUMP_5G_BW40_BASE_SECTION_NUM 3
  996. u8 end[DUMP_5G_BW40_BASE_SECTION_NUM] = {64, 144, 177};
  997. RTW_PRINT_SEL(sel, "%4s ", "");
  998. for (ch_idx = ch_idx_s; ch_idx < CENTER_CH_5G_ALL_NUM; ch_idx++) {
  999. _RTW_PRINT_SEL(sel, "%3d ", center_ch_5g_all[ch_idx]);
  1000. if (end[dump_section] == center_ch_5g_all[ch_idx])
  1001. break;
  1002. }
  1003. _RTW_PRINT_SEL(sel, "\n");
  1004. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  1005. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  1006. for (ch_idx = ch_idx_s; ch_idx < CENTER_CH_5G_ALL_NUM; ch_idx++) {
  1007. _RTW_PRINT_SEL(sel, "%3u ", hal_data->Index5G_BW40_Base[path][ch_idx]);
  1008. if (end[dump_section] == center_ch_5g_all[ch_idx])
  1009. break;
  1010. }
  1011. _RTW_PRINT_SEL(sel, "\n");
  1012. }
  1013. RTW_PRINT_SEL(sel, "\n");
  1014. ch_idx_s = ch_idx + 1;
  1015. dump_section++;
  1016. if (dump_section >= DUMP_5G_BW40_BASE_SECTION_NUM)
  1017. break;
  1018. } while (1);
  1019. RTW_PRINT_SEL(sel, "BW80-1S base:\n");
  1020. RTW_PRINT_SEL(sel, "%4s ", "");
  1021. for (ch_idx = 0; ch_idx < CENTER_CH_5G_80M_NUM; ch_idx++)
  1022. _RTW_PRINT_SEL(sel, "%3d ", center_ch_5g_80m[ch_idx]);
  1023. _RTW_PRINT_SEL(sel, "\n");
  1024. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  1025. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  1026. for (ch_idx = 0; ch_idx < CENTER_CH_5G_80M_NUM; ch_idx++)
  1027. _RTW_PRINT_SEL(sel, "%3u ", hal_data->Index5G_BW80_Base[path][ch_idx]);
  1028. _RTW_PRINT_SEL(sel, "\n");
  1029. }
  1030. RTW_PRINT_SEL(sel, "\n");
  1031. RTW_PRINT_SEL(sel, "OFDM diff:\n");
  1032. RTW_PRINT_SEL(sel, "%4s ", "");
  1033. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  1034. _RTW_PRINT_SEL(sel, "%dT ", tx_idx + 1);
  1035. _RTW_PRINT_SEL(sel, "\n");
  1036. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  1037. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  1038. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  1039. _RTW_PRINT_SEL(sel, "%2d ", hal_data->OFDM_5G_Diff[path][tx_idx]);
  1040. _RTW_PRINT_SEL(sel, "\n");
  1041. }
  1042. RTW_PRINT_SEL(sel, "\n");
  1043. RTW_PRINT_SEL(sel, "BW20 diff:\n");
  1044. RTW_PRINT_SEL(sel, "%4s ", "");
  1045. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  1046. _RTW_PRINT_SEL(sel, "%dS ", tx_idx + 1);
  1047. _RTW_PRINT_SEL(sel, "\n");
  1048. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  1049. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  1050. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  1051. _RTW_PRINT_SEL(sel, "%2d ", hal_data->BW20_5G_Diff[path][tx_idx]);
  1052. _RTW_PRINT_SEL(sel, "\n");
  1053. }
  1054. RTW_PRINT_SEL(sel, "\n");
  1055. RTW_PRINT_SEL(sel, "BW40 diff:\n");
  1056. RTW_PRINT_SEL(sel, "%4s ", "");
  1057. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  1058. _RTW_PRINT_SEL(sel, "%dS ", tx_idx + 1);
  1059. _RTW_PRINT_SEL(sel, "\n");
  1060. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  1061. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  1062. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  1063. _RTW_PRINT_SEL(sel, "%2d ", hal_data->BW40_5G_Diff[path][tx_idx]);
  1064. _RTW_PRINT_SEL(sel, "\n");
  1065. }
  1066. RTW_PRINT_SEL(sel, "\n");
  1067. RTW_PRINT_SEL(sel, "BW80 diff:\n");
  1068. RTW_PRINT_SEL(sel, "%4s ", "");
  1069. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  1070. _RTW_PRINT_SEL(sel, "%dS ", tx_idx + 1);
  1071. _RTW_PRINT_SEL(sel, "\n");
  1072. for (path = 0; path < MAX_RF_PATH && path < rfpath_num; path++) {
  1073. RTW_PRINT_SEL(sel, "[%c]: ", rf_path_char(path));
  1074. for (tx_idx = RF_1TX; tx_idx < MAX_TX_COUNT && tx_idx < max_tx_cnt; tx_idx++)
  1075. _RTW_PRINT_SEL(sel, "%2d ", hal_data->BW80_5G_Diff[path][tx_idx]);
  1076. _RTW_PRINT_SEL(sel, "\n");
  1077. }
  1078. RTW_PRINT_SEL(sel, "\n");
  1079. #endif /* CONFIG_IEEE80211_BAND_5GHZ */
  1080. }
  1081. /*
  1082. * rtw_regsty_get_target_tx_power -
  1083. *
  1084. * Return dBm or -1 for undefined
  1085. */
  1086. s8 rtw_regsty_get_target_tx_power(
  1087. IN PADAPTER Adapter,
  1088. IN u8 Band,
  1089. IN u8 RfPath,
  1090. IN RATE_SECTION RateSection
  1091. )
  1092. {
  1093. struct registry_priv *regsty = adapter_to_regsty(Adapter);
  1094. s8 value = 0;
  1095. if (RfPath > RF_PATH_D) {
  1096. RTW_PRINT("%s invalid RfPath:%d\n", __func__, RfPath);
  1097. return -1;
  1098. }
  1099. if (Band != BAND_ON_2_4G
  1100. #ifdef CONFIG_IEEE80211_BAND_5GHZ
  1101. && Band != BAND_ON_5G
  1102. #endif
  1103. ) {
  1104. RTW_PRINT("%s invalid Band:%d\n", __func__, Band);
  1105. return -1;
  1106. }
  1107. if (RateSection >= RATE_SECTION_NUM
  1108. #ifdef CONFIG_IEEE80211_BAND_5GHZ
  1109. || (Band == BAND_ON_5G && RateSection == CCK)
  1110. #endif
  1111. ) {
  1112. RTW_PRINT("%s invalid RateSection:%d in Band:%d, RfPath:%d\n", __func__
  1113. , RateSection, Band, RfPath);
  1114. return -1;
  1115. }
  1116. if (Band == BAND_ON_2_4G)
  1117. value = regsty->target_tx_pwr_2g[RfPath][RateSection];
  1118. #ifdef CONFIG_IEEE80211_BAND_5GHZ
  1119. else /* BAND_ON_5G */
  1120. value = regsty->target_tx_pwr_5g[RfPath][RateSection - 1];
  1121. #endif
  1122. return value;
  1123. }
  1124. bool rtw_regsty_chk_target_tx_power_valid(_adapter *adapter)
  1125. {
  1126. struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
  1127. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  1128. int path, tx_num, band, rs;
  1129. s8 target;
  1130. for (band = BAND_ON_2_4G; band <= BAND_ON_5G; band++) {
  1131. if (!hal_is_band_support(adapter, band))
  1132. continue;
  1133. for (path = 0; path < RF_PATH_MAX; path++) {
  1134. if (!HAL_SPEC_CHK_RF_PATH(hal_spec, band, path))
  1135. break;
  1136. for (rs = 0; rs < RATE_SECTION_NUM; rs++) {
  1137. tx_num = rate_section_to_tx_num(rs);
  1138. if (tx_num >= hal_spec->tx_nss_num)
  1139. continue;
  1140. if (band == BAND_ON_5G && IS_CCK_RATE_SECTION(rs))
  1141. continue;
  1142. if (IS_VHT_RATE_SECTION(rs) && !IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter))
  1143. continue;
  1144. target = rtw_regsty_get_target_tx_power(adapter, band, path, rs);
  1145. if (target == -1) {
  1146. RTW_PRINT("%s return _FALSE for band:%d, path:%d, rs:%d, t:%d\n", __func__, band, path, rs, target);
  1147. return _FALSE;
  1148. }
  1149. }
  1150. }
  1151. }
  1152. return _TRUE;
  1153. }
  1154. /*
  1155. * PHY_GetTxPowerByRateBase -
  1156. *
  1157. * Return 2 times of dBm
  1158. */
  1159. u8
  1160. PHY_GetTxPowerByRateBase(
  1161. IN PADAPTER Adapter,
  1162. IN u8 Band,
  1163. IN u8 RfPath,
  1164. IN u8 TxNum,
  1165. IN RATE_SECTION RateSection
  1166. )
  1167. {
  1168. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  1169. u8 value = 0;
  1170. if (RfPath > RF_PATH_D) {
  1171. RTW_PRINT("%s invalid RfPath:%d\n", __func__, RfPath);
  1172. return 0;
  1173. }
  1174. if (Band != BAND_ON_2_4G && Band != BAND_ON_5G) {
  1175. RTW_PRINT("%s invalid Band:%d\n", __func__, Band);
  1176. return 0;
  1177. }
  1178. if (RateSection >= RATE_SECTION_NUM
  1179. || (Band == BAND_ON_5G && RateSection == CCK)
  1180. ) {
  1181. RTW_PRINT("%s invalid RateSection:%d in Band:%d, RfPath:%d, TxNum:%d\n", __func__
  1182. , RateSection, Band, RfPath, TxNum);
  1183. return 0;
  1184. }
  1185. if (Band == BAND_ON_2_4G)
  1186. value = pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][RateSection];
  1187. else /* BAND_ON_5G */
  1188. value = pHalData->TxPwrByRateBase5G[RfPath][TxNum][RateSection - 1];
  1189. return value;
  1190. }
  1191. VOID
  1192. phy_SetTxPowerByRateBase(
  1193. IN PADAPTER Adapter,
  1194. IN u8 Band,
  1195. IN u8 RfPath,
  1196. IN RATE_SECTION RateSection,
  1197. IN u8 TxNum,
  1198. IN u8 Value
  1199. )
  1200. {
  1201. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  1202. if (RfPath > RF_PATH_D) {
  1203. RTW_PRINT("%s invalid RfPath:%d\n", __func__, RfPath);
  1204. return;
  1205. }
  1206. if (Band != BAND_ON_2_4G && Band != BAND_ON_5G) {
  1207. RTW_PRINT("%s invalid Band:%d\n", __func__, Band);
  1208. return;
  1209. }
  1210. if (RateSection >= RATE_SECTION_NUM
  1211. || (Band == BAND_ON_5G && RateSection == CCK)
  1212. ) {
  1213. RTW_PRINT("%s invalid RateSection:%d in %sG, RfPath:%d, TxNum:%d\n", __func__
  1214. , RateSection, (Band == BAND_ON_2_4G) ? "2.4" : "5", RfPath, TxNum);
  1215. return;
  1216. }
  1217. if (Band == BAND_ON_2_4G)
  1218. pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][RateSection] = Value;
  1219. else /* BAND_ON_5G */
  1220. pHalData->TxPwrByRateBase5G[RfPath][TxNum][RateSection - 1] = Value;
  1221. }
  1222. static inline BOOLEAN phy_is_txpwr_by_rate_undefined_of_band_path(_adapter *adapter, u8 band, u8 path)
  1223. {
  1224. struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
  1225. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  1226. u8 tx_num = 0, rate_idx = 0;
  1227. for (tx_num = 0; tx_num < TX_PWR_BY_RATE_NUM_RF; tx_num++) {
  1228. if (tx_num >= hal_spec->max_tx_cnt || tx_num >= hal_spec->tx_nss_num)
  1229. goto exit;
  1230. for (rate_idx = 0; rate_idx < TX_PWR_BY_RATE_NUM_RATE; rate_idx++) {
  1231. if (hal_data->TxPwrByRateOffset[band][path][tx_num][rate_idx] != 0)
  1232. goto exit;
  1233. }
  1234. }
  1235. exit:
  1236. return (tx_num >= hal_spec->max_tx_cnt || tx_num >= hal_spec->tx_nss_num) ? _TRUE : _FALSE;
  1237. }
  1238. static inline void phy_txpwr_by_rate_duplicate_band_path(_adapter *adapter, u8 band, u8 s_path, u8 t_path)
  1239. {
  1240. struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
  1241. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  1242. u8 tx_num = 0, rate_idx = 0;
  1243. for (tx_num = 0; tx_num < TX_PWR_BY_RATE_NUM_RF; tx_num++)
  1244. for (rate_idx = 0; rate_idx < TX_PWR_BY_RATE_NUM_RATE; rate_idx++)
  1245. hal_data->TxPwrByRateOffset[band][t_path][tx_num][rate_idx] = hal_data->TxPwrByRateOffset[band][s_path][tx_num][rate_idx];
  1246. }
  1247. static void phy_txpwr_by_rate_chk_for_path_dup(_adapter *adapter)
  1248. {
  1249. struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
  1250. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  1251. u8 band, path;
  1252. s8 src_path;
  1253. for (band = BAND_ON_2_4G; band <= BAND_ON_5G; band++)
  1254. for (path = RF_PATH_A; path < RF_PATH_MAX; path++)
  1255. hal_data->txpwr_by_rate_undefined_band_path[band][path] = 0;
  1256. for (band = BAND_ON_2_4G; band <= BAND_ON_5G; band++) {
  1257. if (!hal_is_band_support(adapter, band))
  1258. continue;
  1259. for (path = RF_PATH_A; path < RF_PATH_MAX; path++) {
  1260. if (!HAL_SPEC_CHK_RF_PATH(hal_spec, band, path))
  1261. continue;
  1262. if (phy_is_txpwr_by_rate_undefined_of_band_path(adapter, band, path))
  1263. hal_data->txpwr_by_rate_undefined_band_path[band][path] = 1;
  1264. }
  1265. }
  1266. for (band = BAND_ON_2_4G; band <= BAND_ON_5G; band++) {
  1267. if (!hal_is_band_support(adapter, band))
  1268. continue;
  1269. src_path = -1;
  1270. for (path = RF_PATH_A; path < RF_PATH_MAX; path++) {
  1271. if (!HAL_SPEC_CHK_RF_PATH(hal_spec, band, path))
  1272. continue;
  1273. /* find src */
  1274. if (src_path == -1 && hal_data->txpwr_by_rate_undefined_band_path[band][path] == 0)
  1275. src_path = path;
  1276. }
  1277. if (src_path == -1) {
  1278. RTW_ERR("%s all power by rate undefined\n", __func__);
  1279. continue;
  1280. }
  1281. for (path = RF_PATH_A; path < RF_PATH_MAX; path++) {
  1282. if (!HAL_SPEC_CHK_RF_PATH(hal_spec, band, path))
  1283. continue;
  1284. /* duplicate src to undefined one */
  1285. if (hal_data->txpwr_by_rate_undefined_band_path[band][path] == 1) {
  1286. RTW_INFO("%s duplicate %s [%c] to [%c]\n", __func__
  1287. , band_str(band), rf_path_char(src_path), rf_path_char(path));
  1288. phy_txpwr_by_rate_duplicate_band_path(adapter, band, src_path, path);
  1289. }
  1290. }
  1291. }
  1292. }
  1293. VOID
  1294. phy_StoreTxPowerByRateBase(
  1295. IN PADAPTER pAdapter
  1296. )
  1297. {
  1298. struct hal_spec_t *hal_spec = GET_HAL_SPEC(pAdapter);
  1299. struct registry_priv *regsty = adapter_to_regsty(pAdapter);
  1300. u8 rate_sec_base[RATE_SECTION_NUM] = {
  1301. MGN_11M,
  1302. MGN_54M,
  1303. MGN_MCS7,
  1304. MGN_MCS15,
  1305. MGN_MCS23,
  1306. MGN_MCS31,
  1307. MGN_VHT1SS_MCS7,
  1308. MGN_VHT2SS_MCS7,
  1309. MGN_VHT3SS_MCS7,
  1310. MGN_VHT4SS_MCS7,
  1311. };
  1312. u8 band, path, rs, tx_num, base, index;
  1313. for (band = BAND_ON_2_4G; band <= BAND_ON_5G; band++) {
  1314. if (!hal_is_band_support(pAdapter, band))
  1315. continue;
  1316. for (path = RF_PATH_A; path < RF_PATH_MAX; path++) {
  1317. if (!HAL_SPEC_CHK_RF_PATH(hal_spec, band, path))
  1318. break;
  1319. for (rs = 0; rs < RATE_SECTION_NUM; rs++) {
  1320. tx_num = rate_section_to_tx_num(rs);
  1321. if (tx_num >= hal_spec->tx_nss_num)
  1322. continue;
  1323. if (band == BAND_ON_5G && IS_CCK_RATE_SECTION(rs))
  1324. continue;
  1325. if (IS_VHT_RATE_SECTION(rs) && !IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(pAdapter))
  1326. continue;
  1327. if (regsty->target_tx_pwr_valid == _TRUE)
  1328. base = 2 * rtw_regsty_get_target_tx_power(pAdapter, band, path, rs);
  1329. else
  1330. base = _PHY_GetTxPowerByRate(pAdapter, band, path, tx_num, rate_sec_base[rs]);
  1331. phy_SetTxPowerByRateBase(pAdapter, band, path, rs, tx_num, base);
  1332. }
  1333. }
  1334. }
  1335. }
  1336. VOID
  1337. PHY_GetRateValuesOfTxPowerByRate(
  1338. IN PADAPTER pAdapter,
  1339. IN u32 RegAddr,
  1340. IN u32 BitMask,
  1341. IN u32 Value,
  1342. OUT u8 *Rate,
  1343. OUT s8 *PwrByRateVal,
  1344. OUT u8 *RateNum
  1345. )
  1346. {
  1347. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  1348. struct PHY_DM_STRUCT *pDM_Odm = &pHalData->odmpriv;
  1349. u8 index = 0, i = 0;
  1350. switch (RegAddr) {
  1351. case rTxAGC_A_Rate18_06:
  1352. case rTxAGC_B_Rate18_06:
  1353. Rate[0] = MGN_6M;
  1354. Rate[1] = MGN_9M;
  1355. Rate[2] = MGN_12M;
  1356. Rate[3] = MGN_18M;
  1357. for (i = 0; i < 4; ++i) {
  1358. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1359. ((Value >> (i * 8)) & 0xF));
  1360. }
  1361. *RateNum = 4;
  1362. break;
  1363. case rTxAGC_A_Rate54_24:
  1364. case rTxAGC_B_Rate54_24:
  1365. Rate[0] = MGN_24M;
  1366. Rate[1] = MGN_36M;
  1367. Rate[2] = MGN_48M;
  1368. Rate[3] = MGN_54M;
  1369. for (i = 0; i < 4; ++i) {
  1370. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1371. ((Value >> (i * 8)) & 0xF));
  1372. }
  1373. *RateNum = 4;
  1374. break;
  1375. case rTxAGC_A_CCK1_Mcs32:
  1376. Rate[0] = MGN_1M;
  1377. PwrByRateVal[0] = (s8)((((Value >> (8 + 4)) & 0xF)) * 10 +
  1378. ((Value >> 8) & 0xF));
  1379. *RateNum = 1;
  1380. break;
  1381. case rTxAGC_B_CCK11_A_CCK2_11:
  1382. if (BitMask == 0xffffff00) {
  1383. Rate[0] = MGN_2M;
  1384. Rate[1] = MGN_5_5M;
  1385. Rate[2] = MGN_11M;
  1386. for (i = 1; i < 4; ++i) {
  1387. PwrByRateVal[i - 1] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1388. ((Value >> (i * 8)) & 0xF));
  1389. }
  1390. *RateNum = 3;
  1391. } else if (BitMask == 0x000000ff) {
  1392. Rate[0] = MGN_11M;
  1393. PwrByRateVal[0] = (s8)((((Value >> 4) & 0xF)) * 10 +
  1394. (Value & 0xF));
  1395. *RateNum = 1;
  1396. }
  1397. break;
  1398. case rTxAGC_A_Mcs03_Mcs00:
  1399. case rTxAGC_B_Mcs03_Mcs00:
  1400. Rate[0] = MGN_MCS0;
  1401. Rate[1] = MGN_MCS1;
  1402. Rate[2] = MGN_MCS2;
  1403. Rate[3] = MGN_MCS3;
  1404. for (i = 0; i < 4; ++i) {
  1405. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1406. ((Value >> (i * 8)) & 0xF));
  1407. }
  1408. *RateNum = 4;
  1409. break;
  1410. case rTxAGC_A_Mcs07_Mcs04:
  1411. case rTxAGC_B_Mcs07_Mcs04:
  1412. Rate[0] = MGN_MCS4;
  1413. Rate[1] = MGN_MCS5;
  1414. Rate[2] = MGN_MCS6;
  1415. Rate[3] = MGN_MCS7;
  1416. for (i = 0; i < 4; ++i) {
  1417. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1418. ((Value >> (i * 8)) & 0xF));
  1419. }
  1420. *RateNum = 4;
  1421. break;
  1422. case rTxAGC_A_Mcs11_Mcs08:
  1423. case rTxAGC_B_Mcs11_Mcs08:
  1424. Rate[0] = MGN_MCS8;
  1425. Rate[1] = MGN_MCS9;
  1426. Rate[2] = MGN_MCS10;
  1427. Rate[3] = MGN_MCS11;
  1428. for (i = 0; i < 4; ++i) {
  1429. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1430. ((Value >> (i * 8)) & 0xF));
  1431. }
  1432. *RateNum = 4;
  1433. break;
  1434. case rTxAGC_A_Mcs15_Mcs12:
  1435. case rTxAGC_B_Mcs15_Mcs12:
  1436. Rate[0] = MGN_MCS12;
  1437. Rate[1] = MGN_MCS13;
  1438. Rate[2] = MGN_MCS14;
  1439. Rate[3] = MGN_MCS15;
  1440. for (i = 0; i < 4; ++i) {
  1441. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1442. ((Value >> (i * 8)) & 0xF));
  1443. }
  1444. *RateNum = 4;
  1445. break;
  1446. case rTxAGC_B_CCK1_55_Mcs32:
  1447. Rate[0] = MGN_1M;
  1448. Rate[1] = MGN_2M;
  1449. Rate[2] = MGN_5_5M;
  1450. for (i = 1; i < 4; ++i) {
  1451. PwrByRateVal[i - 1] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1452. ((Value >> (i * 8)) & 0xF));
  1453. }
  1454. *RateNum = 3;
  1455. break;
  1456. case 0xC20:
  1457. case 0xE20:
  1458. case 0x1820:
  1459. case 0x1a20:
  1460. Rate[0] = MGN_1M;
  1461. Rate[1] = MGN_2M;
  1462. Rate[2] = MGN_5_5M;
  1463. Rate[3] = MGN_11M;
  1464. for (i = 0; i < 4; ++i) {
  1465. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1466. ((Value >> (i * 8)) & 0xF));
  1467. }
  1468. *RateNum = 4;
  1469. break;
  1470. case 0xC24:
  1471. case 0xE24:
  1472. case 0x1824:
  1473. case 0x1a24:
  1474. Rate[0] = MGN_6M;
  1475. Rate[1] = MGN_9M;
  1476. Rate[2] = MGN_12M;
  1477. Rate[3] = MGN_18M;
  1478. for (i = 0; i < 4; ++i) {
  1479. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1480. ((Value >> (i * 8)) & 0xF));
  1481. }
  1482. *RateNum = 4;
  1483. break;
  1484. case 0xC28:
  1485. case 0xE28:
  1486. case 0x1828:
  1487. case 0x1a28:
  1488. Rate[0] = MGN_24M;
  1489. Rate[1] = MGN_36M;
  1490. Rate[2] = MGN_48M;
  1491. Rate[3] = MGN_54M;
  1492. for (i = 0; i < 4; ++i) {
  1493. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1494. ((Value >> (i * 8)) & 0xF));
  1495. }
  1496. *RateNum = 4;
  1497. break;
  1498. case 0xC2C:
  1499. case 0xE2C:
  1500. case 0x182C:
  1501. case 0x1a2C:
  1502. Rate[0] = MGN_MCS0;
  1503. Rate[1] = MGN_MCS1;
  1504. Rate[2] = MGN_MCS2;
  1505. Rate[3] = MGN_MCS3;
  1506. for (i = 0; i < 4; ++i) {
  1507. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1508. ((Value >> (i * 8)) & 0xF));
  1509. }
  1510. *RateNum = 4;
  1511. break;
  1512. case 0xC30:
  1513. case 0xE30:
  1514. case 0x1830:
  1515. case 0x1a30:
  1516. Rate[0] = MGN_MCS4;
  1517. Rate[1] = MGN_MCS5;
  1518. Rate[2] = MGN_MCS6;
  1519. Rate[3] = MGN_MCS7;
  1520. for (i = 0; i < 4; ++i) {
  1521. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1522. ((Value >> (i * 8)) & 0xF));
  1523. }
  1524. *RateNum = 4;
  1525. break;
  1526. case 0xC34:
  1527. case 0xE34:
  1528. case 0x1834:
  1529. case 0x1a34:
  1530. Rate[0] = MGN_MCS8;
  1531. Rate[1] = MGN_MCS9;
  1532. Rate[2] = MGN_MCS10;
  1533. Rate[3] = MGN_MCS11;
  1534. for (i = 0; i < 4; ++i) {
  1535. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1536. ((Value >> (i * 8)) & 0xF));
  1537. }
  1538. *RateNum = 4;
  1539. break;
  1540. case 0xC38:
  1541. case 0xE38:
  1542. case 0x1838:
  1543. case 0x1a38:
  1544. Rate[0] = MGN_MCS12;
  1545. Rate[1] = MGN_MCS13;
  1546. Rate[2] = MGN_MCS14;
  1547. Rate[3] = MGN_MCS15;
  1548. for (i = 0; i < 4; ++i) {
  1549. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1550. ((Value >> (i * 8)) & 0xF));
  1551. }
  1552. *RateNum = 4;
  1553. break;
  1554. case 0xC3C:
  1555. case 0xE3C:
  1556. case 0x183C:
  1557. case 0x1a3C:
  1558. Rate[0] = MGN_VHT1SS_MCS0;
  1559. Rate[1] = MGN_VHT1SS_MCS1;
  1560. Rate[2] = MGN_VHT1SS_MCS2;
  1561. Rate[3] = MGN_VHT1SS_MCS3;
  1562. for (i = 0; i < 4; ++i) {
  1563. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1564. ((Value >> (i * 8)) & 0xF));
  1565. }
  1566. *RateNum = 4;
  1567. break;
  1568. case 0xC40:
  1569. case 0xE40:
  1570. case 0x1840:
  1571. case 0x1a40:
  1572. Rate[0] = MGN_VHT1SS_MCS4;
  1573. Rate[1] = MGN_VHT1SS_MCS5;
  1574. Rate[2] = MGN_VHT1SS_MCS6;
  1575. Rate[3] = MGN_VHT1SS_MCS7;
  1576. for (i = 0; i < 4; ++i) {
  1577. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1578. ((Value >> (i * 8)) & 0xF));
  1579. }
  1580. *RateNum = 4;
  1581. break;
  1582. case 0xC44:
  1583. case 0xE44:
  1584. case 0x1844:
  1585. case 0x1a44:
  1586. Rate[0] = MGN_VHT1SS_MCS8;
  1587. Rate[1] = MGN_VHT1SS_MCS9;
  1588. Rate[2] = MGN_VHT2SS_MCS0;
  1589. Rate[3] = MGN_VHT2SS_MCS1;
  1590. for (i = 0; i < 4; ++i) {
  1591. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1592. ((Value >> (i * 8)) & 0xF));
  1593. }
  1594. *RateNum = 4;
  1595. break;
  1596. case 0xC48:
  1597. case 0xE48:
  1598. case 0x1848:
  1599. case 0x1a48:
  1600. Rate[0] = MGN_VHT2SS_MCS2;
  1601. Rate[1] = MGN_VHT2SS_MCS3;
  1602. Rate[2] = MGN_VHT2SS_MCS4;
  1603. Rate[3] = MGN_VHT2SS_MCS5;
  1604. for (i = 0; i < 4; ++i) {
  1605. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1606. ((Value >> (i * 8)) & 0xF));
  1607. }
  1608. *RateNum = 4;
  1609. break;
  1610. case 0xC4C:
  1611. case 0xE4C:
  1612. case 0x184C:
  1613. case 0x1a4C:
  1614. Rate[0] = MGN_VHT2SS_MCS6;
  1615. Rate[1] = MGN_VHT2SS_MCS7;
  1616. Rate[2] = MGN_VHT2SS_MCS8;
  1617. Rate[3] = MGN_VHT2SS_MCS9;
  1618. for (i = 0; i < 4; ++i) {
  1619. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1620. ((Value >> (i * 8)) & 0xF));
  1621. }
  1622. *RateNum = 4;
  1623. break;
  1624. case 0xCD8:
  1625. case 0xED8:
  1626. case 0x18D8:
  1627. case 0x1aD8:
  1628. Rate[0] = MGN_MCS16;
  1629. Rate[1] = MGN_MCS17;
  1630. Rate[2] = MGN_MCS18;
  1631. Rate[3] = MGN_MCS19;
  1632. for (i = 0; i < 4; ++i) {
  1633. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1634. ((Value >> (i * 8)) & 0xF));
  1635. }
  1636. *RateNum = 4;
  1637. break;
  1638. case 0xCDC:
  1639. case 0xEDC:
  1640. case 0x18DC:
  1641. case 0x1aDC:
  1642. Rate[0] = MGN_MCS20;
  1643. Rate[1] = MGN_MCS21;
  1644. Rate[2] = MGN_MCS22;
  1645. Rate[3] = MGN_MCS23;
  1646. for (i = 0; i < 4; ++i) {
  1647. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1648. ((Value >> (i * 8)) & 0xF));
  1649. }
  1650. *RateNum = 4;
  1651. break;
  1652. case 0xCE0:
  1653. case 0xEE0:
  1654. case 0x18E0:
  1655. case 0x1aE0:
  1656. Rate[0] = MGN_VHT3SS_MCS0;
  1657. Rate[1] = MGN_VHT3SS_MCS1;
  1658. Rate[2] = MGN_VHT3SS_MCS2;
  1659. Rate[3] = MGN_VHT3SS_MCS3;
  1660. for (i = 0; i < 4; ++i) {
  1661. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1662. ((Value >> (i * 8)) & 0xF));
  1663. }
  1664. *RateNum = 4;
  1665. break;
  1666. case 0xCE4:
  1667. case 0xEE4:
  1668. case 0x18E4:
  1669. case 0x1aE4:
  1670. Rate[0] = MGN_VHT3SS_MCS4;
  1671. Rate[1] = MGN_VHT3SS_MCS5;
  1672. Rate[2] = MGN_VHT3SS_MCS6;
  1673. Rate[3] = MGN_VHT3SS_MCS7;
  1674. for (i = 0; i < 4; ++i) {
  1675. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1676. ((Value >> (i * 8)) & 0xF));
  1677. }
  1678. *RateNum = 4;
  1679. break;
  1680. case 0xCE8:
  1681. case 0xEE8:
  1682. case 0x18E8:
  1683. case 0x1aE8:
  1684. Rate[0] = MGN_VHT3SS_MCS8;
  1685. Rate[1] = MGN_VHT3SS_MCS9;
  1686. for (i = 0; i < 2; ++i) {
  1687. PwrByRateVal[i] = (s8)((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
  1688. ((Value >> (i * 8)) & 0xF));
  1689. }
  1690. *RateNum = 2;
  1691. break;
  1692. default:
  1693. RTW_PRINT("Invalid RegAddr 0x%x in %s()\n", RegAddr, __func__);
  1694. break;
  1695. };
  1696. }
  1697. void
  1698. PHY_StoreTxPowerByRateNew(
  1699. IN PADAPTER pAdapter,
  1700. IN u32 Band,
  1701. IN u32 RfPath,
  1702. IN u32 TxNum,
  1703. IN u32 RegAddr,
  1704. IN u32 BitMask,
  1705. IN u32 Data
  1706. )
  1707. {
  1708. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  1709. u8 i = 0, rates[4] = {0}, rateNum = 0;
  1710. s8 PwrByRateVal[4] = {0};
  1711. PHY_GetRateValuesOfTxPowerByRate(pAdapter, RegAddr, BitMask, Data, rates, PwrByRateVal, &rateNum);
  1712. if (Band != BAND_ON_2_4G && Band != BAND_ON_5G) {
  1713. RTW_PRINT("Invalid Band %d\n", Band);
  1714. return;
  1715. }
  1716. if (RfPath > ODM_RF_PATH_D) {
  1717. RTW_PRINT("Invalid RfPath %d\n", RfPath);
  1718. return;
  1719. }
  1720. if (TxNum > ODM_RF_PATH_D) {
  1721. RTW_PRINT("Invalid TxNum %d\n", TxNum);
  1722. return;
  1723. }
  1724. for (i = 0; i < rateNum; ++i) {
  1725. u8 rate_idx = PHY_GetRateIndexOfTxPowerByRate(rates[i]);
  1726. if (IS_1T_RATE(rates[i]))
  1727. pHalData->TxPwrByRateOffset[Band][RfPath][RF_1TX][rate_idx] = PwrByRateVal[i];
  1728. else if (IS_2T_RATE(rates[i]))
  1729. pHalData->TxPwrByRateOffset[Band][RfPath][RF_2TX][rate_idx] = PwrByRateVal[i];
  1730. else if (IS_3T_RATE(rates[i]))
  1731. pHalData->TxPwrByRateOffset[Band][RfPath][RF_3TX][rate_idx] = PwrByRateVal[i];
  1732. else if (IS_4T_RATE(rates[i]))
  1733. pHalData->TxPwrByRateOffset[Band][RfPath][RF_4TX][rate_idx] = PwrByRateVal[i];
  1734. else
  1735. rtw_warn_on(1);
  1736. }
  1737. }
  1738. VOID
  1739. PHY_InitTxPowerByRate(
  1740. IN PADAPTER pAdapter
  1741. )
  1742. {
  1743. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  1744. u8 band = 0, rfPath = 0, TxNum = 0, rate = 0, i = 0, j = 0;
  1745. for (band = BAND_ON_2_4G; band <= BAND_ON_5G; ++band)
  1746. for (rfPath = 0; rfPath < TX_PWR_BY_RATE_NUM_RF; ++rfPath)
  1747. for (TxNum = 0; TxNum < TX_PWR_BY_RATE_NUM_RF; ++TxNum)
  1748. for (rate = 0; rate < TX_PWR_BY_RATE_NUM_RATE; ++rate)
  1749. pHalData->TxPwrByRateOffset[band][rfPath][TxNum][rate] = 0;
  1750. }
  1751. VOID
  1752. phy_store_tx_power_by_rate(
  1753. IN PADAPTER pAdapter,
  1754. IN u32 Band,
  1755. IN u32 RfPath,
  1756. IN u32 TxNum,
  1757. IN u32 RegAddr,
  1758. IN u32 BitMask,
  1759. IN u32 Data
  1760. )
  1761. {
  1762. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  1763. struct PHY_DM_STRUCT *pDM_Odm = &pHalData->odmpriv;
  1764. if (pDM_Odm->phy_reg_pg_version > 0)
  1765. PHY_StoreTxPowerByRateNew(pAdapter, Band, RfPath, TxNum, RegAddr, BitMask, Data);
  1766. else
  1767. RTW_INFO("Invalid PHY_REG_PG.txt version %d\n", pDM_Odm->phy_reg_pg_version);
  1768. }
  1769. VOID
  1770. phy_ConvertTxPowerByRateInDbmToRelativeValues(
  1771. IN PADAPTER pAdapter
  1772. )
  1773. {
  1774. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  1775. u8 base = 0, i = 0, value = 0,
  1776. band = 0, path = 0, txNum = 0, index = 0,
  1777. startIndex = 0, endIndex = 0;
  1778. u8 cckRates[4] = {MGN_1M, MGN_2M, MGN_5_5M, MGN_11M},
  1779. ofdmRates[8] = {MGN_6M, MGN_9M, MGN_12M, MGN_18M, MGN_24M, MGN_36M, MGN_48M, MGN_54M},
  1780. mcs0_7Rates[8] = {MGN_MCS0, MGN_MCS1, MGN_MCS2, MGN_MCS3, MGN_MCS4, MGN_MCS5, MGN_MCS6, MGN_MCS7},
  1781. mcs8_15Rates[8] = {MGN_MCS8, MGN_MCS9, MGN_MCS10, MGN_MCS11, MGN_MCS12, MGN_MCS13, MGN_MCS14, MGN_MCS15},
  1782. mcs16_23Rates[8] = {MGN_MCS16, MGN_MCS17, MGN_MCS18, MGN_MCS19, MGN_MCS20, MGN_MCS21, MGN_MCS22, MGN_MCS23},
  1783. vht1ssRates[10] = {MGN_VHT1SS_MCS0, MGN_VHT1SS_MCS1, MGN_VHT1SS_MCS2, MGN_VHT1SS_MCS3, MGN_VHT1SS_MCS4,
  1784. MGN_VHT1SS_MCS5, MGN_VHT1SS_MCS6, MGN_VHT1SS_MCS7, MGN_VHT1SS_MCS8, MGN_VHT1SS_MCS9},
  1785. vht2ssRates[10] = {MGN_VHT2SS_MCS0, MGN_VHT2SS_MCS1, MGN_VHT2SS_MCS2, MGN_VHT2SS_MCS3, MGN_VHT2SS_MCS4,
  1786. MGN_VHT2SS_MCS5, MGN_VHT2SS_MCS6, MGN_VHT2SS_MCS7, MGN_VHT2SS_MCS8, MGN_VHT2SS_MCS9},
  1787. vht3ssRates[10] = {MGN_VHT3SS_MCS0, MGN_VHT3SS_MCS1, MGN_VHT3SS_MCS2, MGN_VHT3SS_MCS3, MGN_VHT3SS_MCS4,
  1788. MGN_VHT3SS_MCS5, MGN_VHT3SS_MCS6, MGN_VHT3SS_MCS7, MGN_VHT3SS_MCS8, MGN_VHT3SS_MCS9};
  1789. /* RTW_INFO("===>PHY_ConvertTxPowerByRateInDbmToRelativeValues()\n" ); */
  1790. for (band = BAND_ON_2_4G; band <= BAND_ON_5G; ++band) {
  1791. for (path = ODM_RF_PATH_A; path <= ODM_RF_PATH_D; ++path) {
  1792. for (txNum = RF_1TX; txNum < RF_MAX_TX_NUM; ++txNum) {
  1793. /* CCK */
  1794. if (band == BAND_ON_2_4G) {
  1795. base = PHY_GetTxPowerByRateBase(pAdapter, band, path, txNum, CCK);
  1796. for (i = 0; i < sizeof(cckRates); ++i) {
  1797. value = PHY_GetTxPowerByRate(pAdapter, band, path, txNum, cckRates[i]);
  1798. PHY_SetTxPowerByRate(pAdapter, band, path, txNum, cckRates[i], value - base);
  1799. }
  1800. }
  1801. /* OFDM */
  1802. base = PHY_GetTxPowerByRateBase(pAdapter, band, path, txNum, OFDM);
  1803. for (i = 0; i < sizeof(ofdmRates); ++i) {
  1804. value = PHY_GetTxPowerByRate(pAdapter, band, path, txNum, ofdmRates[i]);
  1805. PHY_SetTxPowerByRate(pAdapter, band, path, txNum, ofdmRates[i], value - base);
  1806. }
  1807. /* HT MCS0~7 */
  1808. base = PHY_GetTxPowerByRateBase(pAdapter, band, path, txNum, HT_1SS);
  1809. for (i = 0; i < sizeof(mcs0_7Rates); ++i) {
  1810. value = PHY_GetTxPowerByRate(pAdapter, band, path, txNum, mcs0_7Rates[i]);
  1811. PHY_SetTxPowerByRate(pAdapter, band, path, txNum, mcs0_7Rates[i], value - base);
  1812. }
  1813. /* HT MCS8~15 */
  1814. base = PHY_GetTxPowerByRateBase(pAdapter, band, path, txNum, HT_2SS);
  1815. for (i = 0; i < sizeof(mcs8_15Rates); ++i) {
  1816. value = PHY_GetTxPowerByRate(pAdapter, band, path, txNum, mcs8_15Rates[i]);
  1817. PHY_SetTxPowerByRate(pAdapter, band, path, txNum, mcs8_15Rates[i], value - base);
  1818. }
  1819. /* HT MCS16~23 */
  1820. base = PHY_GetTxPowerByRateBase(pAdapter, band, path, txNum, HT_3SS);
  1821. for (i = 0; i < sizeof(mcs16_23Rates); ++i) {
  1822. value = PHY_GetTxPowerByRate(pAdapter, band, path, txNum, mcs16_23Rates[i]);
  1823. PHY_SetTxPowerByRate(pAdapter, band, path, txNum, mcs16_23Rates[i], value - base);
  1824. }
  1825. /* VHT 1SS */
  1826. base = PHY_GetTxPowerByRateBase(pAdapter, band, path, txNum, VHT_1SS);
  1827. for (i = 0; i < sizeof(vht1ssRates); ++i) {
  1828. value = PHY_GetTxPowerByRate(pAdapter, band, path, txNum, vht1ssRates[i]);
  1829. PHY_SetTxPowerByRate(pAdapter, band, path, txNum, vht1ssRates[i], value - base);
  1830. }
  1831. /* VHT 2SS */
  1832. base = PHY_GetTxPowerByRateBase(pAdapter, band, path, txNum, VHT_2SS);
  1833. for (i = 0; i < sizeof(vht2ssRates); ++i) {
  1834. value = PHY_GetTxPowerByRate(pAdapter, band, path, txNum, vht2ssRates[i]);
  1835. PHY_SetTxPowerByRate(pAdapter, band, path, txNum, vht2ssRates[i], value - base);
  1836. }
  1837. /* VHT 3SS */
  1838. base = PHY_GetTxPowerByRateBase(pAdapter, band, path, txNum, VHT_3SS);
  1839. for (i = 0; i < sizeof(vht3ssRates); ++i) {
  1840. value = PHY_GetTxPowerByRate(pAdapter, band, path, txNum, vht3ssRates[i]);
  1841. PHY_SetTxPowerByRate(pAdapter, band, path, txNum, vht3ssRates[i], value - base);
  1842. }
  1843. }
  1844. }
  1845. }
  1846. /* RTW_INFO("<===PHY_ConvertTxPowerByRateInDbmToRelativeValues()\n" ); */
  1847. }
  1848. /*
  1849. * This function must be called if the value in the PHY_REG_PG.txt(or header)
  1850. * is exact dBm values
  1851. */
  1852. VOID
  1853. PHY_TxPowerByRateConfiguration(
  1854. IN PADAPTER pAdapter
  1855. )
  1856. {
  1857. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  1858. phy_txpwr_by_rate_chk_for_path_dup(pAdapter);
  1859. phy_StoreTxPowerByRateBase(pAdapter);
  1860. phy_ConvertTxPowerByRateInDbmToRelativeValues(pAdapter);
  1861. }
  1862. VOID
  1863. phy_set_tx_power_index_by_rate_section(
  1864. IN PADAPTER pAdapter,
  1865. IN u8 RFPath,
  1866. IN u8 Channel,
  1867. IN u8 RateSection
  1868. )
  1869. {
  1870. PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
  1871. if (RateSection >= RATE_SECTION_NUM) {
  1872. RTW_INFO("Invalid RateSection %d in %s", RateSection, __func__);
  1873. rtw_warn_on(1);
  1874. goto exit;
  1875. }
  1876. if (RateSection == CCK && pHalData->current_band_type != BAND_ON_2_4G)
  1877. goto exit;
  1878. PHY_SetTxPowerIndexByRateArray(pAdapter, RFPath, pHalData->current_channel_bw, Channel,
  1879. rates_by_sections[RateSection].rates, rates_by_sections[RateSection].rate_num);
  1880. exit:
  1881. return;
  1882. }
  1883. BOOLEAN
  1884. phy_GetChnlIndex(
  1885. IN u8 Channel,
  1886. OUT u8 *ChannelIdx
  1887. )
  1888. {
  1889. u8 i = 0;
  1890. BOOLEAN bIn24G = _TRUE;
  1891. if (Channel <= 14) {
  1892. bIn24G = _TRUE;
  1893. *ChannelIdx = Channel - 1;
  1894. } else {
  1895. bIn24G = _FALSE;
  1896. for (i = 0; i < CENTER_CH_5G_ALL_NUM; ++i) {
  1897. if (center_ch_5g_all[i] == Channel) {
  1898. *ChannelIdx = i;
  1899. return bIn24G;
  1900. }
  1901. }
  1902. }
  1903. return bIn24G;
  1904. }
  1905. u8
  1906. PHY_GetTxPowerIndexBase(
  1907. IN PADAPTER pAdapter,
  1908. IN u8 RFPath,
  1909. IN u8 Rate,
  1910. IN CHANNEL_WIDTH BandWidth,
  1911. IN u8 Channel,
  1912. OUT PBOOLEAN bIn24G
  1913. )
  1914. {
  1915. PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
  1916. struct PHY_DM_STRUCT *pDM_Odm = &pHalData->odmpriv;
  1917. u8 i = 0; /* default set to 1S */
  1918. u8 txPower = 0;
  1919. u8 chnlIdx = (Channel - 1);
  1920. if (HAL_IsLegalChannel(pAdapter, Channel) == _FALSE) {
  1921. chnlIdx = 0;
  1922. RTW_INFO("Illegal channel!!\n");
  1923. }
  1924. *bIn24G = phy_GetChnlIndex(Channel, &chnlIdx);
  1925. /* RTW_INFO("[%s] Channel Index: %d\n", (*bIn24G?"2.4G":"5G"), chnlIdx); */
  1926. if (*bIn24G) { /* 3 ============================== 2.4 G ============================== */
  1927. if (IS_CCK_RATE(Rate))
  1928. txPower = pHalData->Index24G_CCK_Base[RFPath][chnlIdx];
  1929. else if (MGN_6M <= Rate)
  1930. txPower = pHalData->Index24G_BW40_Base[RFPath][chnlIdx];
  1931. else
  1932. RTW_INFO("PHY_GetTxPowerIndexBase: INVALID Rate(0x%02x).\n", Rate);
  1933. /* RTW_INFO("Base Tx power(RF-%c, Rate #%d, Channel Index %d) = 0x%X\n", */
  1934. /* ((RFPath==0)?'A':'B'), Rate, chnlIdx, txPower); */
  1935. /* OFDM-1T */
  1936. if ((MGN_6M <= Rate && Rate <= MGN_54M) && !IS_CCK_RATE(Rate)) {
  1937. txPower += pHalData->OFDM_24G_Diff[RFPath][TX_1S];
  1938. /* RTW_INFO("+PowerDiff 2.4G (RF-%c): (OFDM-1T) = (%d)\n", ((RFPath==0)?'A':'B'), pHalData->OFDM_24G_Diff[RFPath][TX_1S]); */
  1939. }
  1940. /* BW20-1S, BW20-2S */
  1941. if (BandWidth == CHANNEL_WIDTH_20) {
  1942. if ((MGN_MCS0 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  1943. txPower += pHalData->BW20_24G_Diff[RFPath][TX_1S];
  1944. if ((MGN_MCS8 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  1945. txPower += pHalData->BW20_24G_Diff[RFPath][TX_2S];
  1946. if ((MGN_MCS16 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT3SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  1947. txPower += pHalData->BW20_24G_Diff[RFPath][TX_3S];
  1948. if ((MGN_MCS24 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT4SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  1949. txPower += pHalData->BW20_24G_Diff[RFPath][TX_4S];
  1950. /* RTW_INFO("+PowerDiff 2.4G (RF-%c): (BW20-1S, BW20-2S, BW20-3S, BW20-4S) = (%d, %d, %d, %d)\n", ((RFPath==0)?'A':(RFPath==1)?'B':(RFPath==2)?'C':'D'), */
  1951. /* pHalData->BW20_24G_Diff[RFPath][TX_1S], pHalData->BW20_24G_Diff[RFPath][TX_2S], */
  1952. /* pHalData->BW20_24G_Diff[RFPath][TX_3S], pHalData->BW20_24G_Diff[RFPath][TX_4S]); */
  1953. }
  1954. /* BW40-1S, BW40-2S */
  1955. else if (BandWidth == CHANNEL_WIDTH_40) {
  1956. if ((MGN_MCS0 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  1957. txPower += pHalData->BW40_24G_Diff[RFPath][TX_1S];
  1958. if ((MGN_MCS8 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  1959. txPower += pHalData->BW40_24G_Diff[RFPath][TX_2S];
  1960. if ((MGN_MCS16 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT3SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  1961. txPower += pHalData->BW40_24G_Diff[RFPath][TX_3S];
  1962. if ((MGN_MCS24 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT4SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  1963. txPower += pHalData->BW40_24G_Diff[RFPath][TX_4S];
  1964. /* RTW_INFO("+PowerDiff 2.4G (RF-%c): (BW40-1S, BW40-2S, BW40-3S, BW40-4S) = (%d, %d, %d, %d)\n", ((RFPath==0)?'A':(RFPath==1)?'B':(RFPath==2)?'C':'D'), */
  1965. /* pHalData->BW40_24G_Diff[RFPath][TX_1S], pHalData->BW40_24G_Diff[RFPath][TX_2S], */
  1966. /* pHalData->BW40_24G_Diff[RFPath][TX_3S], pHalData->BW40_24G_Diff[RFPath][TX_4S]); */
  1967. }
  1968. /* Willis suggest adopt BW 40M power index while in BW 80 mode */
  1969. else if (BandWidth == CHANNEL_WIDTH_80) {
  1970. if ((MGN_MCS0 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  1971. txPower += pHalData->BW40_24G_Diff[RFPath][TX_1S];
  1972. if ((MGN_MCS8 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  1973. txPower += pHalData->BW40_24G_Diff[RFPath][TX_2S];
  1974. if ((MGN_MCS16 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT3SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  1975. txPower += pHalData->BW40_24G_Diff[RFPath][TX_3S];
  1976. if ((MGN_MCS24 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT4SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  1977. txPower += pHalData->BW40_24G_Diff[RFPath][TX_4S];
  1978. /* RTW_INFO("+PowerDiff 2.4G (RF-%c): (BW40-1S, BW40-2S, BW40-3S, BW40-4T) = (%d, %d, %d, %d) P.S. Current is in BW 80MHz\n", ((RFPath==0)?'A':(RFPath==1)?'B':(RFPath==2)?'C':'D'), */
  1979. /* pHalData->BW40_24G_Diff[RFPath][TX_1S], pHalData->BW40_24G_Diff[RFPath][TX_2S], */
  1980. /* pHalData->BW40_24G_Diff[RFPath][TX_3S], pHalData->BW40_24G_Diff[RFPath][TX_4S]); */
  1981. }
  1982. }
  1983. #ifdef CONFIG_IEEE80211_BAND_5GHZ
  1984. else { /* 3 ============================== 5 G ============================== */
  1985. if (MGN_6M <= Rate)
  1986. txPower = pHalData->Index5G_BW40_Base[RFPath][chnlIdx];
  1987. else
  1988. RTW_INFO("===>PHY_GetTxPowerIndexBase: INVALID Rate(0x%02x).\n", Rate);
  1989. /* RTW_INFO("Base Tx power(RF-%c, Rate #%d, Channel Index %d) = 0x%X\n", */
  1990. /* ((RFPath==0)?'A':'B'), Rate, chnlIdx, txPower); */
  1991. /* OFDM-1T */
  1992. if ((MGN_6M <= Rate && Rate <= MGN_54M) && !IS_CCK_RATE(Rate)) {
  1993. txPower += pHalData->OFDM_5G_Diff[RFPath][TX_1S];
  1994. /* RTW_INFO("+PowerDiff 5G (RF-%c): (OFDM-1T) = (%d)\n", ((RFPath==0)?'A':'B'), pHalData->OFDM_5G_Diff[RFPath][TX_1S]); */
  1995. }
  1996. /* BW20-1S, BW20-2S */
  1997. if (BandWidth == CHANNEL_WIDTH_20) {
  1998. if ((MGN_MCS0 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  1999. txPower += pHalData->BW20_5G_Diff[RFPath][TX_1S];
  2000. if ((MGN_MCS8 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  2001. txPower += pHalData->BW20_5G_Diff[RFPath][TX_2S];
  2002. if ((MGN_MCS16 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT3SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  2003. txPower += pHalData->BW20_5G_Diff[RFPath][TX_3S];
  2004. if ((MGN_MCS24 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT4SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  2005. txPower += pHalData->BW20_5G_Diff[RFPath][TX_4S];
  2006. /* RTW_INFO("+PowerDiff 5G (RF-%c): (BW20-1S, BW20-2S, BW20-3S, BW20-4S) = (%d, %d, %d, %d)\n", ((RFPath==0)?'A':(RFPath==1)?'B':(RFPath==2)?'C':'D'), */
  2007. /* pHalData->BW20_5G_Diff[RFPath][TX_1S], pHalData->BW20_5G_Diff[RFPath][TX_2S], */
  2008. /* pHalData->BW20_5G_Diff[RFPath][TX_3S], pHalData->BW20_5G_Diff[RFPath][TX_4S]); */
  2009. }
  2010. /* BW40-1S, BW40-2S */
  2011. else if (BandWidth == CHANNEL_WIDTH_40) {
  2012. if ((MGN_MCS0 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  2013. txPower += pHalData->BW40_5G_Diff[RFPath][TX_1S];
  2014. if ((MGN_MCS8 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  2015. txPower += pHalData->BW40_5G_Diff[RFPath][TX_2S];
  2016. if ((MGN_MCS16 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT3SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  2017. txPower += pHalData->BW40_5G_Diff[RFPath][TX_3S];
  2018. if ((MGN_MCS24 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT4SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  2019. txPower += pHalData->BW40_5G_Diff[RFPath][TX_4S];
  2020. /* RTW_INFO("+PowerDiff 5G(RF-%c): (BW40-1S, BW40-2S) = (%d, %d, %d, %d)\n", ((RFPath==0)?'A':(RFPath==1)?'B':(RFPath==2)?'C':'D'), */
  2021. /* pHalData->BW40_5G_Diff[RFPath][TX_1S], pHalData->BW40_5G_Diff[RFPath][TX_2S], */
  2022. /* pHalData->BW40_5G_Diff[RFPath][TX_3S], pHalData->BW40_5G_Diff[RFPath][TX_4S]); */
  2023. }
  2024. /* BW80-1S, BW80-2S */
  2025. else if (BandWidth == CHANNEL_WIDTH_80) {
  2026. /* <20121220, Kordan> Get the index of array "Index5G_BW80_Base". */
  2027. for (i = 0; i < CENTER_CH_5G_80M_NUM; ++i)
  2028. if (center_ch_5g_80m[i] == Channel)
  2029. chnlIdx = i;
  2030. txPower = pHalData->Index5G_BW80_Base[RFPath][chnlIdx];
  2031. if ((MGN_MCS0 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  2032. txPower += + pHalData->BW80_5G_Diff[RFPath][TX_1S];
  2033. if ((MGN_MCS8 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  2034. txPower += pHalData->BW80_5G_Diff[RFPath][TX_2S];
  2035. if ((MGN_MCS16 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT3SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  2036. txPower += pHalData->BW80_5G_Diff[RFPath][TX_3S];
  2037. if ((MGN_MCS23 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT4SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
  2038. txPower += pHalData->BW80_5G_Diff[RFPath][TX_4S];
  2039. /* RTW_INFO("+PowerDiff 5G(RF-%c): (BW80-1S, BW80-2S, BW80-3S, BW80-4S) = (%d, %d, %d, %d)\n",((RFPath==0)?'A':(RFPath==1)?'B':(RFPath==2)?'C':'D'), */
  2040. /* pHalData->BW80_5G_Diff[RFPath][TX_1S], pHalData->BW80_5G_Diff[RFPath][TX_2S], */
  2041. /* pHalData->BW80_5G_Diff[RFPath][TX_3S], pHalData->BW80_5G_Diff[RFPath][TX_4S]); */
  2042. }
  2043. }
  2044. #endif /* CONFIG_IEEE80211_BAND_5GHZ */
  2045. return txPower;
  2046. }
  2047. s8
  2048. PHY_GetTxPowerTrackingOffset(
  2049. PADAPTER pAdapter,
  2050. u8 RFPath,
  2051. u8 Rate
  2052. )
  2053. {
  2054. PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
  2055. struct PHY_DM_STRUCT *pDM_Odm = &pHalData->odmpriv;
  2056. s8 offset = 0;
  2057. if (pDM_Odm->rf_calibrate_info.txpowertrack_control == _FALSE)
  2058. return offset;
  2059. if ((Rate == MGN_1M) || (Rate == MGN_2M) || (Rate == MGN_5_5M) || (Rate == MGN_11M)) {
  2060. offset = pDM_Odm->rf_calibrate_info.remnant_cck_swing_idx;
  2061. /*RTW_INFO("+Remnant_CCKSwingIdx = 0x%x\n", RFPath, Rate, pRFCalibrateInfo->Remnant_CCKSwingIdx);*/
  2062. } else {
  2063. offset = pDM_Odm->rf_calibrate_info.remnant_ofdm_swing_idx[RFPath];
  2064. /*RTW_INFO("+Remanant_OFDMSwingIdx[RFPath %u][Rate 0x%x] = 0x%x\n", RFPath, Rate, pRFCalibrateInfo->Remnant_OFDMSwingIdx[RFPath]); */
  2065. }
  2066. return offset;
  2067. }
  2068. /*The same as MRateToHwRate in hal_com.c*/
  2069. u8
  2070. PHY_GetRateIndexOfTxPowerByRate(
  2071. IN u8 Rate
  2072. )
  2073. {
  2074. u8 index = 0;
  2075. switch (Rate) {
  2076. case MGN_1M:
  2077. index = 0;
  2078. break;
  2079. case MGN_2M:
  2080. index = 1;
  2081. break;
  2082. case MGN_5_5M:
  2083. index = 2;
  2084. break;
  2085. case MGN_11M:
  2086. index = 3;
  2087. break;
  2088. case MGN_6M:
  2089. index = 4;
  2090. break;
  2091. case MGN_9M:
  2092. index = 5;
  2093. break;
  2094. case MGN_12M:
  2095. index = 6;
  2096. break;
  2097. case MGN_18M:
  2098. index = 7;
  2099. break;
  2100. case MGN_24M:
  2101. index = 8;
  2102. break;
  2103. case MGN_36M:
  2104. index = 9;
  2105. break;
  2106. case MGN_48M:
  2107. index = 10;
  2108. break;
  2109. case MGN_54M:
  2110. index = 11;
  2111. break;
  2112. case MGN_MCS0:
  2113. index = 12;
  2114. break;
  2115. case MGN_MCS1:
  2116. index = 13;
  2117. break;
  2118. case MGN_MCS2:
  2119. index = 14;
  2120. break;
  2121. case MGN_MCS3:
  2122. index = 15;
  2123. break;
  2124. case MGN_MCS4:
  2125. index = 16;
  2126. break;
  2127. case MGN_MCS5:
  2128. index = 17;
  2129. break;
  2130. case MGN_MCS6:
  2131. index = 18;
  2132. break;
  2133. case MGN_MCS7:
  2134. index = 19;
  2135. break;
  2136. case MGN_MCS8:
  2137. index = 20;
  2138. break;
  2139. case MGN_MCS9:
  2140. index = 21;
  2141. break;
  2142. case MGN_MCS10:
  2143. index = 22;
  2144. break;
  2145. case MGN_MCS11:
  2146. index = 23;
  2147. break;
  2148. case MGN_MCS12:
  2149. index = 24;
  2150. break;
  2151. case MGN_MCS13:
  2152. index = 25;
  2153. break;
  2154. case MGN_MCS14:
  2155. index = 26;
  2156. break;
  2157. case MGN_MCS15:
  2158. index = 27;
  2159. break;
  2160. case MGN_MCS16:
  2161. index = 28;
  2162. break;
  2163. case MGN_MCS17:
  2164. index = 29;
  2165. break;
  2166. case MGN_MCS18:
  2167. index = 30;
  2168. break;
  2169. case MGN_MCS19:
  2170. index = 31;
  2171. break;
  2172. case MGN_MCS20:
  2173. index = 32;
  2174. break;
  2175. case MGN_MCS21:
  2176. index = 33;
  2177. break;
  2178. case MGN_MCS22:
  2179. index = 34;
  2180. break;
  2181. case MGN_MCS23:
  2182. index = 35;
  2183. break;
  2184. case MGN_MCS24:
  2185. index = 36;
  2186. break;
  2187. case MGN_MCS25:
  2188. index = 37;
  2189. break;
  2190. case MGN_MCS26:
  2191. index = 38;
  2192. break;
  2193. case MGN_MCS27:
  2194. index = 39;
  2195. break;
  2196. case MGN_MCS28:
  2197. index = 40;
  2198. break;
  2199. case MGN_MCS29:
  2200. index = 41;
  2201. break;
  2202. case MGN_MCS30:
  2203. index = 42;
  2204. break;
  2205. case MGN_MCS31:
  2206. index = 43;
  2207. break;
  2208. case MGN_VHT1SS_MCS0:
  2209. index = 44;
  2210. break;
  2211. case MGN_VHT1SS_MCS1:
  2212. index = 45;
  2213. break;
  2214. case MGN_VHT1SS_MCS2:
  2215. index = 46;
  2216. break;
  2217. case MGN_VHT1SS_MCS3:
  2218. index = 47;
  2219. break;
  2220. case MGN_VHT1SS_MCS4:
  2221. index = 48;
  2222. break;
  2223. case MGN_VHT1SS_MCS5:
  2224. index = 49;
  2225. break;
  2226. case MGN_VHT1SS_MCS6:
  2227. index = 50;
  2228. break;
  2229. case MGN_VHT1SS_MCS7:
  2230. index = 51;
  2231. break;
  2232. case MGN_VHT1SS_MCS8:
  2233. index = 52;
  2234. break;
  2235. case MGN_VHT1SS_MCS9:
  2236. index = 53;
  2237. break;
  2238. case MGN_VHT2SS_MCS0:
  2239. index = 54;
  2240. break;
  2241. case MGN_VHT2SS_MCS1:
  2242. index = 55;
  2243. break;
  2244. case MGN_VHT2SS_MCS2:
  2245. index = 56;
  2246. break;
  2247. case MGN_VHT2SS_MCS3:
  2248. index = 57;
  2249. break;
  2250. case MGN_VHT2SS_MCS4:
  2251. index = 58;
  2252. break;
  2253. case MGN_VHT2SS_MCS5:
  2254. index = 59;
  2255. break;
  2256. case MGN_VHT2SS_MCS6:
  2257. index = 60;
  2258. break;
  2259. case MGN_VHT2SS_MCS7:
  2260. index = 61;
  2261. break;
  2262. case MGN_VHT2SS_MCS8:
  2263. index = 62;
  2264. break;
  2265. case MGN_VHT2SS_MCS9:
  2266. index = 63;
  2267. break;
  2268. case MGN_VHT3SS_MCS0:
  2269. index = 64;
  2270. break;
  2271. case MGN_VHT3SS_MCS1:
  2272. index = 65;
  2273. break;
  2274. case MGN_VHT3SS_MCS2:
  2275. index = 66;
  2276. break;
  2277. case MGN_VHT3SS_MCS3:
  2278. index = 67;
  2279. break;
  2280. case MGN_VHT3SS_MCS4:
  2281. index = 68;
  2282. break;
  2283. case MGN_VHT3SS_MCS5:
  2284. index = 69;
  2285. break;
  2286. case MGN_VHT3SS_MCS6:
  2287. index = 70;
  2288. break;
  2289. case MGN_VHT3SS_MCS7:
  2290. index = 71;
  2291. break;
  2292. case MGN_VHT3SS_MCS8:
  2293. index = 72;
  2294. break;
  2295. case MGN_VHT3SS_MCS9:
  2296. index = 73;
  2297. break;
  2298. case MGN_VHT4SS_MCS0:
  2299. index = 74;
  2300. break;
  2301. case MGN_VHT4SS_MCS1:
  2302. index = 75;
  2303. break;
  2304. case MGN_VHT4SS_MCS2:
  2305. index = 76;
  2306. break;
  2307. case MGN_VHT4SS_MCS3:
  2308. index = 77;
  2309. break;
  2310. case MGN_VHT4SS_MCS4:
  2311. index = 78;
  2312. break;
  2313. case MGN_VHT4SS_MCS5:
  2314. index = 79;
  2315. break;
  2316. case MGN_VHT4SS_MCS6:
  2317. index = 80;
  2318. break;
  2319. case MGN_VHT4SS_MCS7:
  2320. index = 81;
  2321. break;
  2322. case MGN_VHT4SS_MCS8:
  2323. index = 82;
  2324. break;
  2325. case MGN_VHT4SS_MCS9:
  2326. index = 83;
  2327. break;
  2328. default:
  2329. RTW_INFO("Invalid rate 0x%x in %s\n", Rate, __FUNCTION__);
  2330. break;
  2331. };
  2332. return index;
  2333. }
  2334. s8
  2335. _PHY_GetTxPowerByRate(
  2336. IN PADAPTER pAdapter,
  2337. IN u8 Band,
  2338. IN u8 RFPath,
  2339. IN u8 TxNum,
  2340. IN u8 Rate
  2341. )
  2342. {
  2343. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  2344. s8 value = 0;
  2345. u8 rateIndex = PHY_GetRateIndexOfTxPowerByRate(Rate);
  2346. if (Band != BAND_ON_2_4G && Band != BAND_ON_5G) {
  2347. RTW_INFO("Invalid band %d in %s\n", Band, __func__);
  2348. goto exit;
  2349. }
  2350. if (RFPath > ODM_RF_PATH_D) {
  2351. RTW_INFO("Invalid RfPath %d in %s\n", RFPath, __func__);
  2352. goto exit;
  2353. }
  2354. if (TxNum >= RF_MAX_TX_NUM) {
  2355. RTW_INFO("Invalid TxNum %d in %s\n", TxNum, __func__);
  2356. goto exit;
  2357. }
  2358. if (rateIndex >= TX_PWR_BY_RATE_NUM_RATE) {
  2359. RTW_INFO("Invalid RateIndex %d in %s\n", rateIndex, __func__);
  2360. goto exit;
  2361. }
  2362. value = pHalData->TxPwrByRateOffset[Band][RFPath][TxNum][rateIndex];
  2363. exit:
  2364. return value;
  2365. }
  2366. s8
  2367. PHY_GetTxPowerByRate(
  2368. IN PADAPTER pAdapter,
  2369. IN u8 Band,
  2370. IN u8 RFPath,
  2371. IN u8 TxNum,
  2372. IN u8 Rate
  2373. )
  2374. {
  2375. if (!phy_is_tx_power_by_rate_needed(pAdapter))
  2376. return 0;
  2377. return _PHY_GetTxPowerByRate(pAdapter, Band, RFPath, TxNum, Rate);
  2378. }
  2379. #ifdef CONFIG_PHYDM_POWERTRACK_BY_TSSI
  2380. s8
  2381. PHY_GetTxPowerByRateOriginal(
  2382. IN PADAPTER pAdapter,
  2383. IN u8 Band,
  2384. IN u8 RFPath,
  2385. IN u8 TxNum,
  2386. IN u8 Rate
  2387. )
  2388. {
  2389. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  2390. s8 value = 0, limit = 0;
  2391. u8 rateIndex = PHY_GetRateIndexOfTxPowerByRate(Rate);
  2392. if ((pAdapter->registrypriv.RegEnableTxPowerByRate == 2 && pHalData->EEPROMRegulatory == 2) ||
  2393. pAdapter->registrypriv.RegEnableTxPowerByRate == 0)
  2394. return 0;
  2395. if (Band != BAND_ON_2_4G && Band != BAND_ON_5G) {
  2396. DBG_871X("Invalid band %d in %s\n", Band, __func__);
  2397. return value;
  2398. }
  2399. if (RFPath > ODM_RF_PATH_D) {
  2400. DBG_871X("Invalid RfPath %d in %s\n", RFPath, __func__);
  2401. return value;
  2402. }
  2403. if (TxNum >= RF_MAX_TX_NUM) {
  2404. DBG_871X("Invalid TxNum %d in %s\n", TxNum, __func__);
  2405. return value;
  2406. }
  2407. if (rateIndex >= TX_PWR_BY_RATE_NUM_RATE) {
  2408. DBG_871X("Invalid RateIndex %d in %s\n", rateIndex, __func__);
  2409. return value;
  2410. }
  2411. value = pHalData->TxPwrByRate[Band][RFPath][TxNum][rateIndex];
  2412. return value;
  2413. }
  2414. #endif
  2415. VOID
  2416. PHY_SetTxPowerByRate(
  2417. IN PADAPTER pAdapter,
  2418. IN u8 Band,
  2419. IN u8 RFPath,
  2420. IN u8 TxNum,
  2421. IN u8 Rate,
  2422. IN s8 Value
  2423. )
  2424. {
  2425. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  2426. u8 rateIndex = PHY_GetRateIndexOfTxPowerByRate(Rate);
  2427. if (Band != BAND_ON_2_4G && Band != BAND_ON_5G) {
  2428. RTW_INFO("Invalid band %d in %s\n", Band, __FUNCTION__);
  2429. return;
  2430. }
  2431. if (RFPath > ODM_RF_PATH_D) {
  2432. RTW_INFO("Invalid RfPath %d in %s\n", RFPath, __FUNCTION__);
  2433. return;
  2434. }
  2435. if (TxNum >= RF_MAX_TX_NUM) {
  2436. RTW_INFO("Invalid TxNum %d in %s\n", TxNum, __FUNCTION__);
  2437. return;
  2438. }
  2439. if (rateIndex >= TX_PWR_BY_RATE_NUM_RATE) {
  2440. RTW_INFO("Invalid RateIndex %d in %s\n", rateIndex, __FUNCTION__);
  2441. return;
  2442. }
  2443. pHalData->TxPwrByRateOffset[Band][RFPath][TxNum][rateIndex] = Value;
  2444. }
  2445. VOID
  2446. phy_set_tx_power_level_by_path(
  2447. IN PADAPTER Adapter,
  2448. IN u8 channel,
  2449. IN u8 path
  2450. )
  2451. {
  2452. PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
  2453. BOOLEAN bIsIn24G = (pHalData->current_band_type == BAND_ON_2_4G);
  2454. /* if ( pMgntInfo->RegNByteAccess == 0 ) */
  2455. {
  2456. if (bIsIn24G)
  2457. phy_set_tx_power_index_by_rate_section(Adapter, path, channel, CCK);
  2458. phy_set_tx_power_index_by_rate_section(Adapter, path, channel, OFDM);
  2459. phy_set_tx_power_index_by_rate_section(Adapter, path, channel, HT_MCS0_MCS7);
  2460. if (IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8814A(Adapter))
  2461. phy_set_tx_power_index_by_rate_section(Adapter, path, channel, VHT_1SSMCS0_1SSMCS9);
  2462. if (pHalData->NumTotalRFPath >= 2) {
  2463. phy_set_tx_power_index_by_rate_section(Adapter, path, channel, HT_MCS8_MCS15);
  2464. if (IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_8814A(Adapter))
  2465. phy_set_tx_power_index_by_rate_section(Adapter, path, channel, VHT_2SSMCS0_2SSMCS9);
  2466. if (IS_HARDWARE_TYPE_8814A(Adapter)) {
  2467. phy_set_tx_power_index_by_rate_section(Adapter, path, channel, HT_MCS16_MCS23);
  2468. phy_set_tx_power_index_by_rate_section(Adapter, path, channel, VHT_3SSMCS0_3SSMCS9);
  2469. }
  2470. }
  2471. }
  2472. }
  2473. #ifndef DBG_TX_POWER_IDX
  2474. #define DBG_TX_POWER_IDX 0
  2475. #endif
  2476. VOID
  2477. PHY_SetTxPowerIndexByRateArray(
  2478. IN PADAPTER pAdapter,
  2479. IN u8 RFPath,
  2480. IN CHANNEL_WIDTH BandWidth,
  2481. IN u8 Channel,
  2482. IN u8 *Rates,
  2483. IN u8 RateArraySize
  2484. )
  2485. {
  2486. u32 powerIndex = 0;
  2487. int i = 0;
  2488. for (i = 0; i < RateArraySize; ++i) {
  2489. #if DBG_TX_POWER_IDX
  2490. struct txpwr_idx_comp tic;
  2491. powerIndex = rtw_hal_get_tx_power_index(pAdapter, RFPath, Rates[i], BandWidth, Channel, &tic);
  2492. RTW_INFO("TXPWR: [%c][%s]ch:%u, %s, pwr_idx:%u = %u + (%d=%d:%d) + (%d) + (%d)\n"
  2493. , rf_path_char(RFPath), ch_width_str(BandWidth), Channel, MGN_RATE_STR(Rates[i])
  2494. , powerIndex, tic.base, (tic.by_rate > tic.limit ? tic.limit : tic.by_rate), tic.by_rate, tic.limit, tic.tpt, tic.ebias);
  2495. #else
  2496. powerIndex = phy_get_tx_power_index(pAdapter, RFPath, Rates[i], BandWidth, Channel);
  2497. #endif
  2498. PHY_SetTxPowerIndex(pAdapter, powerIndex, RFPath, Rates[i]);
  2499. }
  2500. }
  2501. s8
  2502. phy_GetWorldWideLimit(
  2503. s8 *LimitTable
  2504. )
  2505. {
  2506. s8 min = LimitTable[0];
  2507. u8 i = 0;
  2508. for (i = 0; i < MAX_REGULATION_NUM; ++i) {
  2509. if (LimitTable[i] < min)
  2510. min = LimitTable[i];
  2511. }
  2512. return min;
  2513. }
  2514. s8
  2515. phy_GetChannelIndexOfTxPowerLimit(
  2516. IN u8 Band,
  2517. IN u8 Channel
  2518. )
  2519. {
  2520. s8 channelIndex = -1;
  2521. u8 i = 0;
  2522. if (Band == BAND_ON_2_4G)
  2523. channelIndex = Channel - 1;
  2524. else if (Band == BAND_ON_5G) {
  2525. for (i = 0; i < CENTER_CH_5G_ALL_NUM; ++i) {
  2526. if (center_ch_5g_all[i] == Channel)
  2527. channelIndex = i;
  2528. }
  2529. } else
  2530. RTW_PRINT("Invalid Band %d in %s\n", Band, __func__);
  2531. if (channelIndex == -1)
  2532. RTW_PRINT("Invalid Channel %d of Band %d in %s\n", Channel, Band, __func__);
  2533. return channelIndex;
  2534. }
  2535. static s8 _phy_get_txpwr_lmt(
  2536. IN PADAPTER Adapter,
  2537. IN u32 RegPwrTblSel,
  2538. IN BAND_TYPE Band,
  2539. IN CHANNEL_WIDTH Bandwidth,
  2540. IN u8 RfPath,
  2541. IN u8 DataRate,
  2542. IN u8 Channel,
  2543. BOOLEAN no_sc
  2544. )
  2545. {
  2546. struct dvobj_priv *dvobj = adapter_to_dvobj(Adapter);
  2547. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(Adapter);
  2548. s8 regulation = -1, bw = -1, rs = -1;
  2549. u8 cch = 0;
  2550. u8 bw_bmp = 0;
  2551. s8 min_lmt = MAX_POWER_INDEX;
  2552. s8 tmp_lmt;
  2553. u8 final_bw = Bandwidth, final_cch = Channel;
  2554. if ((Adapter->registrypriv.RegEnableTxPowerLimit == 2 && hal_data->EEPROMRegulatory != 1) ||
  2555. Adapter->registrypriv.RegEnableTxPowerLimit == 0)
  2556. goto exit;
  2557. switch (RegPwrTblSel) {
  2558. case 1:
  2559. regulation = TXPWR_LMT_ETSI;
  2560. break;
  2561. case 2:
  2562. regulation = TXPWR_LMT_MKK;
  2563. break;
  2564. case 3:
  2565. regulation = TXPWR_LMT_FCC;
  2566. break;
  2567. case 4:
  2568. regulation = TXPWR_LMT_WW;
  2569. break;
  2570. default:
  2571. regulation = (Band == BAND_ON_2_4G) ? hal_data->Regulation2_4G : hal_data->Regulation5G;
  2572. break;
  2573. }
  2574. if (Band != BAND_ON_2_4G && Band != BAND_ON_5G) {
  2575. RTW_ERR("%s invalid band:%u\n", __func__, Band);
  2576. rtw_warn_on(1);
  2577. goto exit;
  2578. }
  2579. if (IS_CCK_RATE(DataRate))
  2580. rs = CCK;
  2581. else if (IS_OFDM_RATE(DataRate))
  2582. rs = OFDM;
  2583. else if (IS_HT1SS_RATE(DataRate))
  2584. rs = HT_1SS;
  2585. else if (IS_HT2SS_RATE(DataRate))
  2586. rs = HT_2SS;
  2587. else if (IS_HT3SS_RATE(DataRate))
  2588. rs = HT_3SS;
  2589. else if (IS_HT4SS_RATE(DataRate))
  2590. rs = HT_4SS;
  2591. else if (IS_VHT1SS_RATE(DataRate))
  2592. rs = VHT_1SS;
  2593. else if (IS_VHT2SS_RATE(DataRate))
  2594. rs = VHT_2SS;
  2595. else if (IS_VHT3SS_RATE(DataRate))
  2596. rs = VHT_3SS;
  2597. else if (IS_VHT4SS_RATE(DataRate))
  2598. rs = VHT_4SS;
  2599. else {
  2600. RTW_ERR("%s invalid rate 0x%x\n", __func__, DataRate);
  2601. rtw_warn_on(1);
  2602. goto exit;
  2603. }
  2604. if (Band == BAND_ON_5G && rs == CCK) {
  2605. RTW_ERR("Wrong rate No CCK(0x%x) in 5G Band\n", DataRate);
  2606. goto exit;
  2607. }
  2608. if (no_sc == _TRUE) {
  2609. /* use the input center channel and bandwidth directly */
  2610. cch = Channel;
  2611. bw_bmp = ch_width_to_bw_cap(Bandwidth);
  2612. } else {
  2613. /*
  2614. * find the possible tx bandwidth bmp for this rate, and then will get center channel for each bandwidth
  2615. * if no possible tx bandwidth bmp, select valid bandwidth up to current RF bandwidth into bmp
  2616. */
  2617. if (rs == CCK || rs == OFDM)
  2618. bw_bmp = BW_CAP_20M; /* CCK, OFDM only BW 20M */
  2619. else if (IS_HT_RATE_SECTION(rs)) {
  2620. bw_bmp = rtw_get_tx_bw_bmp_of_ht_rate(dvobj, DataRate, Bandwidth);
  2621. if (bw_bmp == 0)
  2622. bw_bmp = ch_width_to_bw_cap(Bandwidth > CHANNEL_WIDTH_40 ? CHANNEL_WIDTH_40 : Bandwidth);
  2623. } else if (IS_VHT_RATE_SECTION(rs)) {
  2624. bw_bmp = rtw_get_tx_bw_bmp_of_vht_rate(dvobj, DataRate, Bandwidth);
  2625. if (bw_bmp == 0)
  2626. bw_bmp = ch_width_to_bw_cap(Bandwidth > CHANNEL_WIDTH_160 ? CHANNEL_WIDTH_160 : Bandwidth);
  2627. } else
  2628. rtw_warn_on(1);
  2629. }
  2630. if (bw_bmp == 0)
  2631. goto exit;
  2632. /* loop for each possible tx bandwidth to find minimum limit */
  2633. for (bw = CHANNEL_WIDTH_20; bw <= Bandwidth; bw++) {
  2634. s8 ch_idx;
  2635. if (!(ch_width_to_bw_cap(bw) & bw_bmp))
  2636. continue;
  2637. if (no_sc == _FALSE) {
  2638. if (bw == CHANNEL_WIDTH_20)
  2639. cch = hal_data->cch_20;
  2640. else if (bw == CHANNEL_WIDTH_40)
  2641. cch = hal_data->cch_40;
  2642. else if (bw == CHANNEL_WIDTH_80)
  2643. cch = hal_data->cch_80;
  2644. else {
  2645. cch = 0;
  2646. rtw_warn_on(1);
  2647. }
  2648. }
  2649. ch_idx = phy_GetChannelIndexOfTxPowerLimit(Band, cch);
  2650. if (ch_idx == -1)
  2651. continue;
  2652. if (Band == BAND_ON_2_4G) {
  2653. s8 limits[MAX_REGULATION_NUM] = {0};
  2654. u8 i = 0;
  2655. for (i = 0; i < MAX_REGULATION_NUM; ++i)
  2656. limits[i] = hal_data->TxPwrLimit_2_4G[i][bw][rs][ch_idx][RfPath];
  2657. tmp_lmt = (regulation == TXPWR_LMT_WW) ? phy_GetWorldWideLimit(limits) :
  2658. hal_data->TxPwrLimit_2_4G[regulation][bw][rs][ch_idx][RfPath];
  2659. } else if (Band == BAND_ON_5G) {
  2660. s8 limits[MAX_REGULATION_NUM] = {0};
  2661. u8 i = 0;
  2662. for (i = 0; i < MAX_REGULATION_NUM; ++i)
  2663. limits[i] = hal_data->TxPwrLimit_5G[i][bw][rs][ch_idx][RfPath];
  2664. tmp_lmt = (regulation == TXPWR_LMT_WW) ? phy_GetWorldWideLimit(limits) :
  2665. hal_data->TxPwrLimit_5G[regulation][bw][rs][ch_idx][RfPath];
  2666. } else
  2667. continue;
  2668. if (min_lmt >= tmp_lmt) {
  2669. min_lmt = tmp_lmt;
  2670. final_cch = cch;
  2671. final_bw = bw;
  2672. }
  2673. }
  2674. exit:
  2675. return min_lmt;
  2676. }
  2677. inline s8
  2678. PHY_GetTxPowerLimit(
  2679. IN PADAPTER Adapter,
  2680. IN u32 RegPwrTblSel,
  2681. IN BAND_TYPE Band,
  2682. IN CHANNEL_WIDTH Bandwidth,
  2683. IN u8 RfPath,
  2684. IN u8 DataRate,
  2685. IN u8 Channel
  2686. )
  2687. {
  2688. BOOLEAN no_sc = _FALSE;
  2689. /* MP mode channel don't use secondary channel */
  2690. if (rtw_mi_mp_mode_check(Adapter) == _TRUE)
  2691. no_sc = _TRUE;
  2692. return _phy_get_txpwr_lmt(Adapter, RegPwrTblSel, Band, Bandwidth, RfPath, DataRate, Channel, no_sc);
  2693. }
  2694. inline s8
  2695. PHY_GetTxPowerLimit_no_sc(
  2696. IN PADAPTER Adapter,
  2697. IN u32 RegPwrTblSel,
  2698. IN BAND_TYPE Band,
  2699. IN CHANNEL_WIDTH Bandwidth,
  2700. IN u8 RfPath,
  2701. IN u8 DataRate,
  2702. IN u8 Channel
  2703. )
  2704. {
  2705. return _phy_get_txpwr_lmt(Adapter, RegPwrTblSel, Band, Bandwidth, RfPath, DataRate, Channel, _TRUE);
  2706. }
  2707. #ifdef CONFIG_PHYDM_POWERTRACK_BY_TSSI
  2708. s8
  2709. PHY_GetTxPowerLimitOriginal(
  2710. IN PADAPTER Adapter,
  2711. IN u32 RegPwrTblSel,
  2712. IN BAND_TYPE Band,
  2713. IN CHANNEL_WIDTH Bandwidth,
  2714. IN u8 RfPath,
  2715. IN u8 DataRate,
  2716. IN u8 Channel
  2717. )
  2718. {
  2719. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  2720. s16 band = -1, regulation = -1, bandwidth = -1,
  2721. rateSection = -1, channel = -1;
  2722. s8 powerLimit = MAX_POWER_INDEX;
  2723. if ((Adapter->registrypriv.RegEnableTxPowerLimit == 2 && pHalData->EEPROMRegulatory != 1) ||
  2724. Adapter->registrypriv.RegEnableTxPowerLimit == 0)
  2725. return MAX_POWER_INDEX;
  2726. switch (Adapter->registrypriv.RegPwrTblSel) {
  2727. case 1:
  2728. regulation = TXPWR_LMT_ETSI;
  2729. break;
  2730. case 2:
  2731. regulation = TXPWR_LMT_MKK;
  2732. break;
  2733. case 3:
  2734. regulation = TXPWR_LMT_FCC;
  2735. break;
  2736. case 4:
  2737. regulation = TXPWR_LMT_WW;
  2738. break;
  2739. default:
  2740. regulation = (Band == BAND_ON_2_4G) ? pHalData->Regulation2_4G
  2741. : pHalData->Regulation5G;
  2742. break;
  2743. }
  2744. /*DBG_871X("pMgntInfo->RegPwrTblSel %d, final regulation %d\n", Adapter->registrypriv.RegPwrTblSel, regulation );*/
  2745. if (Band == BAND_ON_2_4G)
  2746. band = 0;
  2747. else if (Band == BAND_ON_5G)
  2748. band = 1;
  2749. if (Bandwidth == CHANNEL_WIDTH_20)
  2750. bandwidth = 0;
  2751. else if (Bandwidth == CHANNEL_WIDTH_40)
  2752. bandwidth = 1;
  2753. else if (Bandwidth == CHANNEL_WIDTH_80)
  2754. bandwidth = 2;
  2755. else if (Bandwidth == CHANNEL_WIDTH_160)
  2756. bandwidth = 3;
  2757. switch (DataRate) {
  2758. case MGN_1M:
  2759. case MGN_2M:
  2760. case MGN_5_5M:
  2761. case MGN_11M:
  2762. rateSection = 0;
  2763. break;
  2764. case MGN_6M:
  2765. case MGN_9M:
  2766. case MGN_12M:
  2767. case MGN_18M:
  2768. case MGN_24M:
  2769. case MGN_36M:
  2770. case MGN_48M:
  2771. case MGN_54M:
  2772. rateSection = 1;
  2773. break;
  2774. case MGN_MCS0:
  2775. case MGN_MCS1:
  2776. case MGN_MCS2:
  2777. case MGN_MCS3:
  2778. case MGN_MCS4:
  2779. case MGN_MCS5:
  2780. case MGN_MCS6:
  2781. case MGN_MCS7:
  2782. rateSection = 2;
  2783. break;
  2784. case MGN_MCS8:
  2785. case MGN_MCS9:
  2786. case MGN_MCS10:
  2787. case MGN_MCS11:
  2788. case MGN_MCS12:
  2789. case MGN_MCS13:
  2790. case MGN_MCS14:
  2791. case MGN_MCS15:
  2792. rateSection = 3;
  2793. break;
  2794. case MGN_MCS16:
  2795. case MGN_MCS17:
  2796. case MGN_MCS18:
  2797. case MGN_MCS19:
  2798. case MGN_MCS20:
  2799. case MGN_MCS21:
  2800. case MGN_MCS22:
  2801. case MGN_MCS23:
  2802. rateSection = 4;
  2803. break;
  2804. case MGN_MCS24:
  2805. case MGN_MCS25:
  2806. case MGN_MCS26:
  2807. case MGN_MCS27:
  2808. case MGN_MCS28:
  2809. case MGN_MCS29:
  2810. case MGN_MCS30:
  2811. case MGN_MCS31:
  2812. rateSection = 5;
  2813. break;
  2814. case MGN_VHT1SS_MCS0:
  2815. case MGN_VHT1SS_MCS1:
  2816. case MGN_VHT1SS_MCS2:
  2817. case MGN_VHT1SS_MCS3:
  2818. case MGN_VHT1SS_MCS4:
  2819. case MGN_VHT1SS_MCS5:
  2820. case MGN_VHT1SS_MCS6:
  2821. case MGN_VHT1SS_MCS7:
  2822. case MGN_VHT1SS_MCS8:
  2823. case MGN_VHT1SS_MCS9:
  2824. rateSection = 6;
  2825. break;
  2826. case MGN_VHT2SS_MCS0:
  2827. case MGN_VHT2SS_MCS1:
  2828. case MGN_VHT2SS_MCS2:
  2829. case MGN_VHT2SS_MCS3:
  2830. case MGN_VHT2SS_MCS4:
  2831. case MGN_VHT2SS_MCS5:
  2832. case MGN_VHT2SS_MCS6:
  2833. case MGN_VHT2SS_MCS7:
  2834. case MGN_VHT2SS_MCS8:
  2835. case MGN_VHT2SS_MCS9:
  2836. rateSection = 7;
  2837. break;
  2838. case MGN_VHT3SS_MCS0:
  2839. case MGN_VHT3SS_MCS1:
  2840. case MGN_VHT3SS_MCS2:
  2841. case MGN_VHT3SS_MCS3:
  2842. case MGN_VHT3SS_MCS4:
  2843. case MGN_VHT3SS_MCS5:
  2844. case MGN_VHT3SS_MCS6:
  2845. case MGN_VHT3SS_MCS7:
  2846. case MGN_VHT3SS_MCS8:
  2847. case MGN_VHT3SS_MCS9:
  2848. rateSection = 8;
  2849. break;
  2850. case MGN_VHT4SS_MCS0:
  2851. case MGN_VHT4SS_MCS1:
  2852. case MGN_VHT4SS_MCS2:
  2853. case MGN_VHT4SS_MCS3:
  2854. case MGN_VHT4SS_MCS4:
  2855. case MGN_VHT4SS_MCS5:
  2856. case MGN_VHT4SS_MCS6:
  2857. case MGN_VHT4SS_MCS7:
  2858. case MGN_VHT4SS_MCS8:
  2859. case MGN_VHT4SS_MCS9:
  2860. rateSection = 9;
  2861. break;
  2862. default:
  2863. DBG_871X("Wrong rate 0x%x\n", DataRate);
  2864. break;
  2865. }
  2866. if (Band == BAND_ON_5G && rateSection == 0)
  2867. DBG_871X("Wrong rate 0x%x: No CCK in 5G Band\n", DataRate);
  2868. /*workaround for wrong index combination to obtain tx power limit,*/
  2869. /*OFDM only exists in BW 20M*/
  2870. if (rateSection == 1)
  2871. bandwidth = 0;
  2872. /*workaround for wrong index combination to obtain tx power limit,*/
  2873. /*CCK table will only be given in BW 20M*/
  2874. if (rateSection == 0)
  2875. bandwidth = 0;
  2876. /*workaround for wrong indxe combination to obtain tx power limit,*/
  2877. /*HT on 80M will reference to HT on 40M*/
  2878. if ((rateSection == 2 || rateSection == 3) && Band == BAND_ON_5G && bandwidth == 2)
  2879. bandwidth = 1;
  2880. if (Band == BAND_ON_2_4G)
  2881. channel = phy_GetChannelIndexOfTxPowerLimit(BAND_ON_2_4G, Channel);
  2882. else if (Band == BAND_ON_5G)
  2883. channel = phy_GetChannelIndexOfTxPowerLimit(BAND_ON_5G, Channel);
  2884. else if (Band == BAND_ON_BOTH)
  2885. /*BAND_ON_BOTH don't care temporarily*/
  2886. if (band == -1 || regulation == -1 || bandwidth == -1 ||
  2887. rateSection == -1 || channel == -1) {
  2888. /*DBG_871X("Wrong index value to access power limit table [band %d][regulation %d][bandwidth %d][rf_path %d][rate_section %d][chnlGroup %d]\n",*/
  2889. /* band, regulation, bandwidth, RfPath, rateSection, channelGroup );*/
  2890. return MAX_POWER_INDEX;
  2891. }
  2892. if (Band == BAND_ON_2_4G) {
  2893. s8 limits[10] = {0};
  2894. u8 i = 0;
  2895. if (bandwidth >= MAX_2_4G_BANDWIDTH_NUM)
  2896. bandwidth = MAX_2_4G_BANDWIDTH_NUM - 1;
  2897. for (i = 0; i < MAX_REGULATION_NUM; ++i)
  2898. limits[i] = pHalData->TxPwrLimit_2_4G_Original[i][bandwidth][rateSection][channel][RfPath];
  2899. powerLimit = (regulation == TXPWR_LMT_WW) ? phy_GetWorldWideLimit(limits) :
  2900. pHalData->TxPwrLimit_2_4G_Original[regulation][bandwidth][rateSection][channel][RfPath];
  2901. } else if (Band == BAND_ON_5G) {
  2902. s8 limits[10] = {0};
  2903. u8 i = 0;
  2904. for (i = 0; i < MAX_REGULATION_NUM; ++i)
  2905. limits[i] = pHalData->TxPwrLimit_5G_Original[i][bandwidth][rateSection][channel][RfPath];
  2906. powerLimit = (regulation == TXPWR_LMT_WW) ? phy_GetWorldWideLimit(limits) :
  2907. pHalData->TxPwrLimit_5G_Original[regulation][bandwidth][rateSection][channel][RfPath];
  2908. } else
  2909. DBG_871X("No power limit table of the specified band\n");
  2910. /*combine 5G VHT & HT rate*/
  2911. /*5G 20M and 40M HT and VHT can cross reference*/
  2912. /*
  2913. if (Band == BAND_ON_5G && powerLimit == MAX_POWER_INDEX) {
  2914. if (bandwidth == 0 || bandwidth == 1) {
  2915. if (rateSection == 2)
  2916. powerLimit = pHalData->TxPwrLimit_5G_Original[regulation]
  2917. [bandwidth][4][channelGroup][RfPath];
  2918. else if (rateSection == 4)
  2919. powerLimit = pHalData->TxPwrLimit_5G_Original[regulation]
  2920. [bandwidth][2][channelGroup][RfPath];
  2921. else if (rateSection == 3)
  2922. powerLimit = pHalData->TxPwrLimit_5G_Original[regulation]
  2923. [bandwidth][5][channelGroup][RfPath];
  2924. else if (rateSection == 5)
  2925. powerLimit = pHalData->TxPwrLimit_5G_Original[regulation]
  2926. [bandwidth][3][channelGroup][RfPath];
  2927. }
  2928. }
  2929. */
  2930. /*DBG_871X("TxPwrLmt[Regulation %d][Band %d][BW %d][RFPath %d][Rate 0x%x][Chnl %d] = %d\n",*/
  2931. /* regulation, pHalData->current_band_type, Bandwidth, RfPath, DataRate, Channel, powerLimit);*/
  2932. return powerLimit;
  2933. }
  2934. #endif
  2935. VOID
  2936. phy_CrossReferenceHTAndVHTTxPowerLimit(
  2937. IN PADAPTER pAdapter
  2938. )
  2939. {
  2940. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
  2941. u8 regulation, bw, channel, rs, ref_rs;
  2942. int ht_ref_vht_5g_20_40 = 0;
  2943. int vht_ref_ht_5g_20_40 = 0;
  2944. int ht_has_ref_5g_20_40 = 0;
  2945. int vht_has_ref_5g_20_40 = 0;
  2946. pHalData->tx_pwr_lmt_5g_20_40_ref = 0;
  2947. for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
  2948. for (bw = 0; bw < MAX_5G_BANDWIDTH_NUM; ++bw) {
  2949. for (channel = 0; channel < CENTER_CH_5G_ALL_NUM; ++channel) {
  2950. for (rs = 0; rs < MAX_RATE_SECTION_NUM; ++rs) {
  2951. /* 5G 20M 40M VHT and HT can cross reference */
  2952. if (bw == CHANNEL_WIDTH_20 || bw == CHANNEL_WIDTH_40) {
  2953. if (rs == HT_1SS)
  2954. ref_rs = VHT_1SS;
  2955. else if (rs == HT_2SS)
  2956. ref_rs = VHT_2SS;
  2957. else if (rs == HT_3SS)
  2958. ref_rs = VHT_3SS;
  2959. else if (rs == HT_4SS)
  2960. ref_rs = VHT_4SS;
  2961. else if (rs == VHT_1SS)
  2962. ref_rs = HT_1SS;
  2963. else if (rs == VHT_2SS)
  2964. ref_rs = HT_2SS;
  2965. else if (rs == VHT_3SS)
  2966. ref_rs = HT_3SS;
  2967. else if (rs == VHT_4SS)
  2968. ref_rs = HT_4SS;
  2969. else
  2970. continue;
  2971. if (pHalData->TxPwrLimit_5G[regulation][bw][ref_rs][channel][RF_PATH_A] == MAX_POWER_INDEX)
  2972. continue;
  2973. if (IS_HT_RATE_SECTION(rs))
  2974. ht_has_ref_5g_20_40++;
  2975. else if (IS_VHT_RATE_SECTION(rs))
  2976. vht_has_ref_5g_20_40++;
  2977. else
  2978. continue;
  2979. if (pHalData->TxPwrLimit_5G[regulation][bw][rs][channel][RF_PATH_A] != MAX_POWER_INDEX)
  2980. continue;
  2981. if (IS_HT_RATE_SECTION(rs) && IS_VHT_RATE_SECTION(ref_rs))
  2982. ht_ref_vht_5g_20_40++;
  2983. else if (IS_VHT_RATE_SECTION(rs) && IS_HT_RATE_SECTION(ref_rs))
  2984. vht_ref_ht_5g_20_40++;
  2985. if (0)
  2986. RTW_INFO("reg:%u, bw:%u, ch:%u, %s ref %s\n"
  2987. , regulation, bw, channel
  2988. , rate_section_str(rs), rate_section_str(ref_rs));
  2989. pHalData->TxPwrLimit_5G[regulation][bw][rs][channel][RF_PATH_A] =
  2990. pHalData->TxPwrLimit_5G[regulation][bw][ref_rs][channel][RF_PATH_A];
  2991. }
  2992. }
  2993. }
  2994. }
  2995. }
  2996. if (0) {
  2997. RTW_INFO("ht_ref_vht_5g_20_40:%d, ht_has_ref_5g_20_40:%d\n", ht_ref_vht_5g_20_40, ht_has_ref_5g_20_40);
  2998. RTW_INFO("vht_ref_hht_5g_20_40:%d, vht_has_ref_5g_20_40:%d\n", vht_ref_ht_5g_20_40, vht_has_ref_5g_20_40);
  2999. }
  3000. /* 5G 20M&40M HT all come from VHT*/
  3001. if (ht_ref_vht_5g_20_40 && ht_has_ref_5g_20_40 == ht_ref_vht_5g_20_40)
  3002. pHalData->tx_pwr_lmt_5g_20_40_ref |= TX_PWR_LMT_REF_HT_FROM_VHT;
  3003. /* 5G 20M&40M VHT all come from HT*/
  3004. if (vht_ref_ht_5g_20_40 && vht_has_ref_5g_20_40 == vht_ref_ht_5g_20_40)
  3005. pHalData->tx_pwr_lmt_5g_20_40_ref |= TX_PWR_LMT_REF_VHT_FROM_HT;
  3006. }
  3007. VOID
  3008. PHY_ConvertTxPowerLimitToPowerIndex(
  3009. IN PADAPTER Adapter
  3010. )
  3011. {
  3012. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  3013. u8 base;
  3014. u8 regulation, bw, channel, rateSection;
  3015. s8 tempValue = 0, tempPwrLmt = 0;
  3016. u8 rfPath = 0;
  3017. if (pHalData->odmpriv.phy_reg_pg_value_type != PHY_REG_PG_EXACT_VALUE) {
  3018. rtw_warn_on(1);
  3019. return;
  3020. }
  3021. phy_CrossReferenceHTAndVHTTxPowerLimit(Adapter);
  3022. for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
  3023. for (bw = 0; bw < MAX_2_4G_BANDWIDTH_NUM; ++bw) {
  3024. for (channel = 0; channel < CENTER_CH_2G_NUM; ++channel) {
  3025. for (rateSection = CCK; rateSection <= HT_4SS; ++rateSection) {
  3026. tempPwrLmt = pHalData->TxPwrLimit_2_4G[regulation][bw][rateSection][channel][RF_PATH_A];
  3027. if (tempPwrLmt != MAX_POWER_INDEX) {
  3028. for (rfPath = RF_PATH_A; rfPath < MAX_RF_PATH; ++rfPath) {
  3029. base = PHY_GetTxPowerByRateBase(Adapter, BAND_ON_2_4G, rfPath, rate_section_to_tx_num(rateSection), rateSection);
  3030. tempValue = tempPwrLmt - base;
  3031. pHalData->TxPwrLimit_2_4G[regulation][bw][rateSection][channel][rfPath] = tempValue;
  3032. }
  3033. }
  3034. }
  3035. }
  3036. }
  3037. }
  3038. if (IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(Adapter)) {
  3039. for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
  3040. for (bw = 0; bw < MAX_5G_BANDWIDTH_NUM; ++bw) {
  3041. for (channel = 0; channel < CENTER_CH_5G_ALL_NUM; ++channel) {
  3042. for (rateSection = OFDM; rateSection <= VHT_4SS; ++rateSection) {
  3043. tempPwrLmt = pHalData->TxPwrLimit_5G[regulation][bw][rateSection][channel][RF_PATH_A];
  3044. if (tempPwrLmt != MAX_POWER_INDEX) {
  3045. for (rfPath = RF_PATH_A; rfPath < MAX_RF_PATH; ++rfPath) {
  3046. base = PHY_GetTxPowerByRateBase(Adapter, BAND_ON_5G, rfPath, rate_section_to_tx_num(rateSection), rateSection);
  3047. tempValue = tempPwrLmt - base;
  3048. pHalData->TxPwrLimit_5G[regulation][bw][rateSection][channel][rfPath] = tempValue;
  3049. }
  3050. }
  3051. }
  3052. }
  3053. }
  3054. }
  3055. }
  3056. }
  3057. /*
  3058. * PHY_InitTxPowerLimit - Set all hal_data.TxPwrLimit_2_4G, TxPwrLimit_5G array to MAX_POWER_INDEX
  3059. */
  3060. VOID
  3061. PHY_InitTxPowerLimit(
  3062. IN PADAPTER Adapter
  3063. )
  3064. {
  3065. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  3066. u8 i, j, k, l, m;
  3067. for (i = 0; i < MAX_REGULATION_NUM; ++i)
  3068. for (j = 0; j < MAX_2_4G_BANDWIDTH_NUM; ++j)
  3069. for (k = 0; k < MAX_RATE_SECTION_NUM; ++k)
  3070. for (m = 0; m < CENTER_CH_2G_NUM; ++m)
  3071. for (l = 0; l < MAX_RF_PATH; ++l)
  3072. pHalData->TxPwrLimit_2_4G[i][j][k][m][l] = MAX_POWER_INDEX;
  3073. for (i = 0; i < MAX_REGULATION_NUM; ++i)
  3074. for (j = 0; j < MAX_5G_BANDWIDTH_NUM; ++j)
  3075. for (k = 0; k < MAX_RATE_SECTION_NUM; ++k)
  3076. for (m = 0; m < CENTER_CH_5G_ALL_NUM; ++m)
  3077. for (l = 0; l < MAX_RF_PATH; ++l)
  3078. pHalData->TxPwrLimit_5G[i][j][k][m][l] = MAX_POWER_INDEX;
  3079. }
  3080. /*
  3081. * phy_set_tx_power_limit - Parsing TX power limit from phydm array, called by odm_ConfigBB_TXPWR_LMT_XXX in phydm
  3082. */
  3083. VOID
  3084. phy_set_tx_power_limit(
  3085. IN struct PHY_DM_STRUCT *pDM_Odm,
  3086. IN u8 *Regulation,
  3087. IN u8 *Band,
  3088. IN u8 *Bandwidth,
  3089. IN u8 *RateSection,
  3090. IN u8 *RfPath,
  3091. IN u8 *Channel,
  3092. IN u8 *PowerLimit
  3093. )
  3094. {
  3095. PADAPTER Adapter = pDM_Odm->adapter;
  3096. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  3097. u8 regulation = 0, bandwidth = 0, rateSection = 0, channel;
  3098. s8 powerLimit = 0, prevPowerLimit, channelIndex;
  3099. if (0)
  3100. RTW_INFO("Index of power limit table [band %s][regulation %s][bw %s][rate section %s][rf path %s][chnl %s][val %s]\n"
  3101. , Band, Regulation, Bandwidth, RateSection, RfPath, Channel, PowerLimit);
  3102. if (GetU1ByteIntegerFromStringInDecimal((s8 *)Channel, &channel) == _FALSE
  3103. || GetU1ByteIntegerFromStringInDecimal((s8 *)PowerLimit, &powerLimit) == _FALSE
  3104. ) {
  3105. RTW_PRINT("Illegal index of power limit table [ch %s][val %s]\n", Channel, PowerLimit);
  3106. return;
  3107. }
  3108. powerLimit = powerLimit > MAX_POWER_INDEX ? MAX_POWER_INDEX : powerLimit;
  3109. if (eqNByte(Regulation, (u8 *)("FCC"), 3))
  3110. regulation = TXPWR_LMT_FCC;
  3111. else if (eqNByte(Regulation, (u8 *)("MKK"), 3))
  3112. regulation = TXPWR_LMT_MKK;
  3113. else if (eqNByte(Regulation, (u8 *)("ETSI"), 4))
  3114. regulation = TXPWR_LMT_ETSI;
  3115. else if (eqNByte(Regulation, (u8 *)("WW13"), 4))
  3116. regulation = TXPWR_LMT_WW;
  3117. else {
  3118. RTW_PRINT("unknown regulation:%s", Regulation);
  3119. return;
  3120. }
  3121. if (eqNByte(RateSection, (u8 *)("CCK"), 3) && eqNByte(RfPath, (u8 *)("1T"), 2))
  3122. rateSection = CCK;
  3123. else if (eqNByte(RateSection, (u8 *)("OFDM"), 4) && eqNByte(RfPath, (u8 *)("1T"), 2))
  3124. rateSection = OFDM;
  3125. else if (eqNByte(RateSection, (u8 *)("HT"), 2) && eqNByte(RfPath, (u8 *)("1T"), 2))
  3126. rateSection = HT_1SS;
  3127. else if (eqNByte(RateSection, (u8 *)("HT"), 2) && eqNByte(RfPath, (u8 *)("2T"), 2))
  3128. rateSection = HT_2SS;
  3129. else if (eqNByte(RateSection, (u8 *)("HT"), 2) && eqNByte(RfPath, (u8 *)("3T"), 2))
  3130. rateSection = HT_3SS;
  3131. else if (eqNByte(RateSection, (u8 *)("HT"), 2) && eqNByte(RfPath, (u8 *)("4T"), 2))
  3132. rateSection = HT_4SS;
  3133. else if (eqNByte(RateSection, (u8 *)("VHT"), 3) && eqNByte(RfPath, (u8 *)("1T"), 2))
  3134. rateSection = VHT_1SS;
  3135. else if (eqNByte(RateSection, (u8 *)("VHT"), 3) && eqNByte(RfPath, (u8 *)("2T"), 2))
  3136. rateSection = VHT_2SS;
  3137. else if (eqNByte(RateSection, (u8 *)("VHT"), 3) && eqNByte(RfPath, (u8 *)("3T"), 2))
  3138. rateSection = VHT_3SS;
  3139. else if (eqNByte(RateSection, (u8 *)("VHT"), 3) && eqNByte(RfPath, (u8 *)("4T"), 2))
  3140. rateSection = VHT_4SS;
  3141. else {
  3142. RTW_PRINT("Wrong rate section: (%s,%s)\n", RateSection, RfPath);
  3143. return;
  3144. }
  3145. if (eqNByte(Bandwidth, (u8 *)("20M"), 3))
  3146. bandwidth = CHANNEL_WIDTH_20;
  3147. else if (eqNByte(Bandwidth, (u8 *)("40M"), 3))
  3148. bandwidth = CHANNEL_WIDTH_40;
  3149. else if (eqNByte(Bandwidth, (u8 *)("80M"), 3))
  3150. bandwidth = CHANNEL_WIDTH_80;
  3151. else {
  3152. RTW_PRINT("unknown bandwidth: %s\n", Bandwidth);
  3153. return;
  3154. }
  3155. if (eqNByte(Band, (u8 *)("2.4G"), 4)) {
  3156. channelIndex = phy_GetChannelIndexOfTxPowerLimit(BAND_ON_2_4G, channel);
  3157. if (channelIndex == -1) {
  3158. RTW_PRINT("unsupported channel: %d at 2.4G\n", channel);
  3159. return;
  3160. }
  3161. if (bandwidth >= MAX_2_4G_BANDWIDTH_NUM) {
  3162. RTW_PRINT("unsupported bandwidth: %s at 2.4G\n", Bandwidth);
  3163. return;
  3164. }
  3165. prevPowerLimit = pHalData->TxPwrLimit_2_4G[regulation][bandwidth][rateSection][channelIndex][RF_PATH_A];
  3166. if (prevPowerLimit != MAX_POWER_INDEX)
  3167. RTW_PRINT("duplicate tx power limit combination [band %s][regulation %s][bw %s][rate section %s][rf path %s][chnl %s]\n"
  3168. , Band, Regulation, Bandwidth, RateSection, RfPath, Channel);
  3169. if (powerLimit < prevPowerLimit)
  3170. pHalData->TxPwrLimit_2_4G[regulation][bandwidth][rateSection][channelIndex][RF_PATH_A] = powerLimit;
  3171. if (0)
  3172. RTW_INFO("2.4G Band value : [regulation %d][bw %d][rate_section %d][chnl %d][val %d]\n"
  3173. , regulation, bandwidth, rateSection, channelIndex, pHalData->TxPwrLimit_2_4G[regulation][bandwidth][rateSection][channelIndex][ODM_RF_PATH_A]);
  3174. } else if (eqNByte(Band, (u8 *)("5G"), 2)) {
  3175. channelIndex = phy_GetChannelIndexOfTxPowerLimit(BAND_ON_5G, channel);
  3176. if (channelIndex == -1) {
  3177. RTW_PRINT("unsupported channel: %d at 5G\n", channel);
  3178. return;
  3179. }
  3180. prevPowerLimit = pHalData->TxPwrLimit_5G[regulation][bandwidth][rateSection][channelIndex][RF_PATH_A];
  3181. if (prevPowerLimit != MAX_POWER_INDEX)
  3182. RTW_PRINT("duplicate tx power limit combination [band %s][regulation %s][bw %s][rate section %s][rf path %s][chnl %s]\n"
  3183. , Band, Regulation, Bandwidth, RateSection, RfPath, Channel);
  3184. if (powerLimit < prevPowerLimit)
  3185. pHalData->TxPwrLimit_5G[regulation][bandwidth][rateSection][channelIndex][RF_PATH_A] = powerLimit;
  3186. if (0)
  3187. RTW_INFO("5G Band value : [regulation %d][bw %d][rate_section %d][chnl %d][val %d]\n"
  3188. , regulation, bandwidth, rateSection, channel, pHalData->TxPwrLimit_5G[regulation][bandwidth][rateSection][channelIndex][RF_PATH_A]);
  3189. } else {
  3190. RTW_PRINT("Cannot recognize the band info in %s\n", Band);
  3191. return;
  3192. }
  3193. }
  3194. u8
  3195. phy_get_tx_power_index(
  3196. IN PADAPTER pAdapter,
  3197. IN u8 RFPath,
  3198. IN u8 Rate,
  3199. IN CHANNEL_WIDTH BandWidth,
  3200. IN u8 Channel
  3201. )
  3202. {
  3203. return rtw_hal_get_tx_power_index(pAdapter, RFPath, Rate, BandWidth, Channel, NULL);
  3204. }
  3205. VOID
  3206. PHY_SetTxPowerIndex(
  3207. IN PADAPTER pAdapter,
  3208. IN u32 PowerIndex,
  3209. IN u8 RFPath,
  3210. IN u8 Rate
  3211. )
  3212. {
  3213. if (IS_HARDWARE_TYPE_8814A(pAdapter)) {
  3214. #if (RTL8814A_SUPPORT == 1)
  3215. PHY_SetTxPowerIndex_8814A(pAdapter, PowerIndex, RFPath, Rate);
  3216. #endif
  3217. } else if (IS_HARDWARE_TYPE_JAGUAR(pAdapter)) {
  3218. #if ((RTL8812A_SUPPORT == 1) || (RTL8821A_SUPPORT == 1))
  3219. PHY_SetTxPowerIndex_8812A(pAdapter, PowerIndex, RFPath, Rate);
  3220. #endif
  3221. } else if (IS_HARDWARE_TYPE_8723B(pAdapter)) {
  3222. #if (RTL8723B_SUPPORT == 1)
  3223. PHY_SetTxPowerIndex_8723B(pAdapter, PowerIndex, RFPath, Rate);
  3224. #endif
  3225. } else if (IS_HARDWARE_TYPE_8703B(pAdapter)) {
  3226. #if (RTL8703B_SUPPORT == 1)
  3227. PHY_SetTxPowerIndex_8703B(pAdapter, PowerIndex, RFPath, Rate);
  3228. #endif
  3229. } else if (IS_HARDWARE_TYPE_8723D(pAdapter)) {
  3230. #if (RTL8723D_SUPPORT == 1)
  3231. PHY_SetTxPowerIndex_8723D(pAdapter, PowerIndex, RFPath, Rate);
  3232. #endif
  3233. } else if (IS_HARDWARE_TYPE_8192E(pAdapter)) {
  3234. #if (RTL8192E_SUPPORT == 1)
  3235. PHY_SetTxPowerIndex_8192E(pAdapter, PowerIndex, RFPath, Rate);
  3236. #endif
  3237. } else if (IS_HARDWARE_TYPE_8188E(pAdapter)) {
  3238. #if (RTL8188E_SUPPORT == 1)
  3239. PHY_SetTxPowerIndex_8188E(pAdapter, PowerIndex, RFPath, Rate);
  3240. #endif
  3241. } else if (IS_HARDWARE_TYPE_8188F(pAdapter)) {
  3242. #if (RTL8188F_SUPPORT == 1)
  3243. PHY_SetTxPowerIndex_8188F(pAdapter, PowerIndex, RFPath, Rate);
  3244. #endif
  3245. } else if (IS_HARDWARE_TYPE_8822B(pAdapter))
  3246. rtw_hal_set_tx_power_index(pAdapter, PowerIndex, RFPath, Rate);
  3247. else if (IS_HARDWARE_TYPE_8821C(pAdapter))
  3248. rtw_hal_set_tx_power_index(pAdapter, PowerIndex, RFPath, Rate);
  3249. }
  3250. void dump_tx_power_idx_title(void *sel, _adapter *adapter)
  3251. {
  3252. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  3253. u8 bw = hal_data->current_channel_bw;
  3254. RTW_PRINT_SEL(sel, "%s", ch_width_str(bw));
  3255. if (bw >= CHANNEL_WIDTH_80)
  3256. _RTW_PRINT_SEL(sel, ", cch80:%u", hal_data->cch_80);
  3257. if (bw >= CHANNEL_WIDTH_40)
  3258. _RTW_PRINT_SEL(sel, ", cch40:%u", hal_data->cch_40);
  3259. _RTW_PRINT_SEL(sel, ", cch20:%u\n", hal_data->cch_20);
  3260. RTW_PRINT_SEL(sel, "%-4s %-9s %-3s %-4s %-3s %-4s %-4s %-3s %-5s\n"
  3261. , "path", "rate", "pwr", "base", "", "(byr", "lmt)", "tpt", "ebias");
  3262. }
  3263. void dump_tx_power_idx_by_path_rs(void *sel, _adapter *adapter, u8 rfpath, u8 rs)
  3264. {
  3265. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  3266. struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
  3267. u8 power_idx;
  3268. struct txpwr_idx_comp tic;
  3269. u8 tx_num, i;
  3270. u8 band = hal_data->current_band_type;
  3271. u8 cch = hal_data->current_channel;
  3272. u8 bw = hal_data->current_channel_bw;
  3273. if (!HAL_SPEC_CHK_RF_PATH(hal_spec, band, rfpath))
  3274. return;
  3275. if (rs >= RATE_SECTION_NUM)
  3276. return;
  3277. tx_num = rate_section_to_tx_num(rs);
  3278. if (tx_num >= hal_spec->tx_nss_num || tx_num >= hal_spec->max_tx_cnt)
  3279. return;
  3280. if (band == BAND_ON_5G && IS_CCK_RATE_SECTION(rs))
  3281. return;
  3282. if (IS_VHT_RATE_SECTION(rs) && !IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter))
  3283. return;
  3284. for (i = 0; i < rates_by_sections[rs].rate_num; i++) {
  3285. power_idx = rtw_hal_get_tx_power_index(adapter, rfpath, rates_by_sections[rs].rates[i], bw, cch, &tic);
  3286. RTW_PRINT_SEL(sel, "%4c %9s %3u %4u %3d (%3d %3d) %3d %5d\n"
  3287. , rf_path_char(rfpath), MGN_RATE_STR(rates_by_sections[rs].rates[i])
  3288. , power_idx, tic.base, (tic.by_rate > tic.limit ? tic.limit : tic.by_rate), tic.by_rate, tic.limit, tic.tpt, tic.ebias);
  3289. }
  3290. }
  3291. void dump_tx_power_idx(void *sel, _adapter *adapter)
  3292. {
  3293. u8 rfpath, rs;
  3294. dump_tx_power_idx_title(sel, adapter);
  3295. for (rfpath = RF_PATH_A; rfpath < RF_PATH_MAX; rfpath++)
  3296. for (rs = CCK; rs < RATE_SECTION_NUM; rs++)
  3297. dump_tx_power_idx_by_path_rs(sel, adapter, rfpath, rs);
  3298. }
  3299. bool phy_is_tx_power_limit_needed(_adapter *adapter)
  3300. {
  3301. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  3302. struct registry_priv *regsty = dvobj_to_regsty(adapter_to_dvobj(adapter));
  3303. if (regsty->RegEnableTxPowerLimit == 1
  3304. || (regsty->RegEnableTxPowerLimit == 2 && hal_data->EEPROMRegulatory == 1))
  3305. return _TRUE;
  3306. return _FALSE;
  3307. }
  3308. bool phy_is_tx_power_by_rate_needed(_adapter *adapter)
  3309. {
  3310. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  3311. struct registry_priv *regsty = dvobj_to_regsty(adapter_to_dvobj(adapter));
  3312. if (regsty->RegEnableTxPowerByRate == 1
  3313. || (regsty->RegEnableTxPowerByRate == 2 && hal_data->EEPROMRegulatory != 2))
  3314. return _TRUE;
  3315. return _FALSE;
  3316. }
  3317. int phy_load_tx_power_by_rate(_adapter *adapter, u8 chk_file)
  3318. {
  3319. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  3320. struct registry_priv *regsty = dvobj_to_regsty(adapter_to_dvobj(adapter));
  3321. int ret = _FAIL;
  3322. hal_data->txpwr_by_rate_loaded = 0;
  3323. PHY_InitTxPowerByRate(adapter);
  3324. /* tx power limit is based on tx power by rate */
  3325. hal_data->txpwr_limit_loaded = 0;
  3326. #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
  3327. if (chk_file
  3328. && phy_ConfigBBWithPgParaFile(adapter, PHY_FILE_PHY_REG_PG) == _SUCCESS
  3329. ) {
  3330. hal_data->txpwr_by_rate_from_file = 1;
  3331. goto post_hdl;
  3332. }
  3333. #endif
  3334. #ifdef CONFIG_EMBEDDED_FWIMG
  3335. if (HAL_STATUS_SUCCESS == odm_config_bb_with_header_file(&hal_data->odmpriv, CONFIG_BB_PHY_REG_PG)) {
  3336. RTW_INFO("default power by rate loaded\n");
  3337. hal_data->txpwr_by_rate_from_file = 0;
  3338. goto post_hdl;
  3339. }
  3340. #endif
  3341. RTW_ERR("%s():Read Tx power by rate fail\n", __func__);
  3342. goto exit;
  3343. post_hdl:
  3344. if (hal_data->odmpriv.phy_reg_pg_value_type != PHY_REG_PG_EXACT_VALUE) {
  3345. rtw_warn_on(1);
  3346. goto exit;
  3347. }
  3348. PHY_TxPowerByRateConfiguration(adapter);
  3349. hal_data->txpwr_by_rate_loaded = 1;
  3350. ret = _SUCCESS;
  3351. exit:
  3352. return ret;
  3353. }
  3354. int phy_load_tx_power_limit(_adapter *adapter, u8 chk_file)
  3355. {
  3356. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  3357. struct registry_priv *regsty = dvobj_to_regsty(adapter_to_dvobj(adapter));
  3358. int ret = _FAIL;
  3359. hal_data->txpwr_limit_loaded = 0;
  3360. PHY_InitTxPowerLimit(adapter);
  3361. if (!hal_data->txpwr_by_rate_loaded && regsty->target_tx_pwr_valid != _TRUE) {
  3362. RTW_ERR("%s():Read Tx power limit before target tx power is specify\n", __func__);
  3363. goto exit;
  3364. }
  3365. #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
  3366. if (chk_file
  3367. && PHY_ConfigRFWithPowerLimitTableParaFile(adapter, PHY_FILE_TXPWR_LMT) == _SUCCESS
  3368. ) {
  3369. hal_data->txpwr_limit_from_file = 1;
  3370. goto post_hdl;
  3371. }
  3372. #endif
  3373. #ifdef CONFIG_EMBEDDED_FWIMG
  3374. if (HAL_STATUS_SUCCESS == odm_config_rf_with_header_file(&hal_data->odmpriv, CONFIG_RF_TXPWR_LMT, (enum odm_rf_radio_path_e)0)) {
  3375. RTW_INFO("default power limit loaded\n");
  3376. hal_data->txpwr_limit_from_file = 0;
  3377. goto post_hdl;
  3378. }
  3379. #endif
  3380. RTW_ERR("%s():Read Tx power limit fail\n", __func__);
  3381. goto exit;
  3382. post_hdl:
  3383. PHY_ConvertTxPowerLimitToPowerIndex(adapter);
  3384. hal_data->txpwr_limit_loaded = 1;
  3385. ret = _SUCCESS;
  3386. exit:
  3387. return ret;
  3388. }
  3389. void phy_load_tx_power_ext_info(_adapter *adapter, u8 chk_file)
  3390. {
  3391. struct registry_priv *regsty = adapter_to_regsty(adapter);
  3392. /* check registy target tx power */
  3393. regsty->target_tx_pwr_valid = rtw_regsty_chk_target_tx_power_valid(adapter);
  3394. /* power by rate and limit */
  3395. if (phy_is_tx_power_by_rate_needed(adapter)
  3396. || (phy_is_tx_power_limit_needed(adapter) && regsty->target_tx_pwr_valid != _TRUE)
  3397. )
  3398. phy_load_tx_power_by_rate(adapter, chk_file);
  3399. if (phy_is_tx_power_limit_needed(adapter))
  3400. phy_load_tx_power_limit(adapter, chk_file);
  3401. }
  3402. inline void phy_reload_tx_power_ext_info(_adapter *adapter)
  3403. {
  3404. phy_load_tx_power_ext_info(adapter, 1);
  3405. }
  3406. inline void phy_reload_default_tx_power_ext_info(_adapter *adapter)
  3407. {
  3408. phy_load_tx_power_ext_info(adapter, 0);
  3409. }
  3410. void dump_tx_power_ext_info(void *sel, _adapter *adapter)
  3411. {
  3412. struct registry_priv *regsty = adapter_to_regsty(adapter);
  3413. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  3414. if (regsty->target_tx_pwr_valid == _TRUE)
  3415. RTW_PRINT_SEL(sel, "target_tx_power: from registry\n");
  3416. else if (phy_is_tx_power_by_rate_needed(adapter))
  3417. RTW_PRINT_SEL(sel, "target_tx_power: from power by rate\n");
  3418. else
  3419. RTW_PRINT_SEL(sel, "target_tx_power: unavailable\n");
  3420. RTW_PRINT_SEL(sel, "tx_power_by_rate: %s, %s, %s\n"
  3421. , phy_is_tx_power_by_rate_needed(adapter) ? "enabled" : "disabled"
  3422. , hal_data->txpwr_by_rate_loaded ? "loaded" : "unloaded"
  3423. , hal_data->txpwr_by_rate_from_file ? "file" : "default"
  3424. );
  3425. RTW_PRINT_SEL(sel, "tx_power_limit: %s, %s, %s\n"
  3426. , phy_is_tx_power_limit_needed(adapter) ? "enabled" : "disabled"
  3427. , hal_data->txpwr_limit_loaded ? "loaded" : "unloaded"
  3428. , hal_data->txpwr_limit_from_file ? "file" : "default"
  3429. );
  3430. }
  3431. void dump_target_tx_power(void *sel, _adapter *adapter)
  3432. {
  3433. struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
  3434. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  3435. struct registry_priv *regsty = adapter_to_regsty(adapter);
  3436. int path, tx_num, band, rs;
  3437. u8 target;
  3438. for (band = BAND_ON_2_4G; band <= BAND_ON_5G; band++) {
  3439. if (!hal_is_band_support(adapter, band))
  3440. continue;
  3441. for (path = 0; path < RF_PATH_MAX; path++) {
  3442. if (!HAL_SPEC_CHK_RF_PATH(hal_spec, band, path))
  3443. break;
  3444. RTW_PRINT_SEL(sel, "[%s][%c]%s\n", band_str(band), rf_path_char(path)
  3445. , (regsty->target_tx_pwr_valid == _FALSE && hal_data->txpwr_by_rate_undefined_band_path[band][path]) ? "(dup)" : "");
  3446. for (rs = 0; rs < RATE_SECTION_NUM; rs++) {
  3447. tx_num = rate_section_to_tx_num(rs);
  3448. if (tx_num >= hal_spec->tx_nss_num)
  3449. continue;
  3450. if (band == BAND_ON_5G && IS_CCK_RATE_SECTION(rs))
  3451. continue;
  3452. if (IS_VHT_RATE_SECTION(rs) && !IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter))
  3453. continue;
  3454. target = PHY_GetTxPowerByRateBase(adapter, band, path, rate_section_to_tx_num(rs), rs);
  3455. if (target % 2)
  3456. _RTW_PRINT_SEL(sel, "%7s: %2d.5\n", rate_section_str(rs), target / 2);
  3457. else
  3458. _RTW_PRINT_SEL(sel, "%7s: %4d\n", rate_section_str(rs), target / 2);
  3459. }
  3460. }
  3461. }
  3462. exit:
  3463. return;
  3464. }
  3465. void dump_tx_power_by_rate(void *sel, _adapter *adapter)
  3466. {
  3467. struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
  3468. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  3469. int path, tx_num, band, n, rs;
  3470. u8 rate_num, max_rate_num, base;
  3471. s8 by_rate_offset;
  3472. for (band = BAND_ON_2_4G; band <= BAND_ON_5G; band++) {
  3473. if (!hal_is_band_support(adapter, band))
  3474. continue;
  3475. for (path = 0; path < RF_PATH_MAX; path++) {
  3476. if (!HAL_SPEC_CHK_RF_PATH(hal_spec, band, path))
  3477. break;
  3478. RTW_PRINT_SEL(sel, "[%s][%c]%s\n", band_str(band), rf_path_char(path)
  3479. , hal_data->txpwr_by_rate_undefined_band_path[band][path] ? "(dup)" : "");
  3480. for (rs = 0; rs < RATE_SECTION_NUM; rs++) {
  3481. tx_num = rate_section_to_tx_num(rs);
  3482. if (tx_num >= hal_spec->tx_nss_num)
  3483. continue;
  3484. if (band == BAND_ON_5G && IS_CCK_RATE_SECTION(rs))
  3485. continue;
  3486. if (IS_VHT_RATE_SECTION(rs) && !IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter))
  3487. continue;
  3488. if (IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter))
  3489. max_rate_num = 10;
  3490. else
  3491. max_rate_num = 8;
  3492. rate_num = rate_section_rate_num(rs);
  3493. base = PHY_GetTxPowerByRateBase(adapter, band, path, tx_num, rs);
  3494. RTW_PRINT_SEL(sel, "%7s: ", rate_section_str(rs));
  3495. /* dump power by rate in db */
  3496. for (n = rate_num - 1; n >= 0; n--) {
  3497. by_rate_offset = PHY_GetTxPowerByRate(adapter, band, path, tx_num, rates_by_sections[rs].rates[n]);
  3498. if ((base + by_rate_offset) % 2)
  3499. _RTW_PRINT_SEL(sel, "%2d.5 ", (base + by_rate_offset) / 2);
  3500. else
  3501. _RTW_PRINT_SEL(sel, "%4d ", (base + by_rate_offset) / 2);
  3502. }
  3503. for (n = 0; n < max_rate_num - rate_num; n++)
  3504. _RTW_PRINT_SEL(sel, "%4s ", "");
  3505. _RTW_PRINT_SEL(sel, "|");
  3506. /* dump power by rate in offset */
  3507. for (n = rate_num - 1; n >= 0; n--) {
  3508. by_rate_offset = PHY_GetTxPowerByRate(adapter, band, path, tx_num, rates_by_sections[rs].rates[n]);
  3509. _RTW_PRINT_SEL(sel, "%3d ", by_rate_offset);
  3510. }
  3511. RTW_PRINT_SEL(sel, "\n");
  3512. }
  3513. }
  3514. }
  3515. }
  3516. void dump_tx_power_limit(void *sel, _adapter *adapter)
  3517. {
  3518. struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
  3519. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  3520. struct registry_priv *regsty = dvobj_to_regsty(adapter_to_dvobj(adapter));
  3521. int bw, band, ch_num, rs, i, path;
  3522. u8 ch, n, rd, rfpath_num;
  3523. if (IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter))
  3524. RTW_PRINT_SEL(sel, "tx_pwr_lmt_5g_20_40_ref:0x%02x\n", hal_data->tx_pwr_lmt_5g_20_40_ref);
  3525. for (band = BAND_ON_2_4G; band <= BAND_ON_5G; band++) {
  3526. if (!hal_is_band_support(adapter, band))
  3527. continue;
  3528. rd = (band == BAND_ON_2_4G ? hal_data->Regulation2_4G : hal_data->Regulation5G);
  3529. rfpath_num = (band == BAND_ON_2_4G ? hal_spec->rfpath_num_2g : hal_spec->rfpath_num_5g);
  3530. for (bw = 0; bw < MAX_5G_BANDWIDTH_NUM; bw++) {
  3531. if (bw >= CHANNEL_WIDTH_160)
  3532. break;
  3533. if (band == BAND_ON_2_4G && bw >= CHANNEL_WIDTH_80)
  3534. break;
  3535. if (band == BAND_ON_2_4G)
  3536. ch_num = CENTER_CH_2G_NUM;
  3537. else
  3538. ch_num = center_chs_5g_num(bw);
  3539. if (ch_num == 0) {
  3540. rtw_warn_on(1);
  3541. break;
  3542. }
  3543. for (rs = 0; rs < RATE_SECTION_NUM; rs++) {
  3544. if (band == BAND_ON_2_4G && IS_VHT_RATE_SECTION(rs))
  3545. continue;
  3546. if (band == BAND_ON_5G && IS_CCK_RATE_SECTION(rs))
  3547. continue;
  3548. if (bw > CHANNEL_WIDTH_20 && (IS_CCK_RATE_SECTION(rs) || IS_OFDM_RATE_SECTION(rs)))
  3549. continue;
  3550. if (bw > CHANNEL_WIDTH_40 && IS_HT_RATE_SECTION(rs))
  3551. continue;
  3552. if (rate_section_to_tx_num(rs) >= hal_spec->tx_nss_num)
  3553. continue;
  3554. if (IS_VHT_RATE_SECTION(rs) && !IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(adapter))
  3555. continue;
  3556. /* by pass 5G 20M, 40M pure reference */
  3557. if (band == BAND_ON_5G && (bw == CHANNEL_WIDTH_20 || bw == CHANNEL_WIDTH_40)) {
  3558. if (hal_data->tx_pwr_lmt_5g_20_40_ref == TX_PWR_LMT_REF_HT_FROM_VHT) {
  3559. if (IS_HT_RATE_SECTION(rs))
  3560. continue;
  3561. } else if (hal_data->tx_pwr_lmt_5g_20_40_ref == TX_PWR_LMT_REF_VHT_FROM_HT) {
  3562. if (IS_VHT_RATE_SECTION(rs) && bw <= CHANNEL_WIDTH_40)
  3563. continue;
  3564. }
  3565. }
  3566. RTW_PRINT_SEL(sel, "[%s][%s][%s]\n"
  3567. , band_str(band)
  3568. , ch_width_str(bw)
  3569. , rate_section_str(rs)
  3570. );
  3571. /* header for limit in db */
  3572. RTW_PRINT_SEL(sel, "%3s %5s %5s %5s %5s "
  3573. , "ch"
  3574. , (rd == TXPWR_LMT_FCC ? "*FCC" : "FCC")
  3575. , (rd == TXPWR_LMT_ETSI ? "*ETSI" : "ETSI")
  3576. , (rd == TXPWR_LMT_MKK ? "*MKK" : "MKK")
  3577. , (rd == TXPWR_LMT_WW ? "*WW" : "WW")
  3578. );
  3579. /* header for limit offset */
  3580. for (path = 0; path < RF_PATH_MAX; path++) {
  3581. if (path >= rfpath_num)
  3582. break;
  3583. _RTW_PRINT_SEL(sel, "|%3c %3c %3c %3c "
  3584. , (rd == TXPWR_LMT_FCC ? rf_path_char(path) : ' ')
  3585. , (rd == TXPWR_LMT_ETSI ? rf_path_char(path) : ' ')
  3586. , (rd == TXPWR_LMT_MKK ? rf_path_char(path) : ' ')
  3587. , (rd == TXPWR_LMT_WW ? rf_path_char(path) : ' ')
  3588. );
  3589. }
  3590. _RTW_PRINT_SEL(sel, "\n");
  3591. for (n = 0; n < ch_num; n++) {
  3592. s8 limit_idx[RF_PATH_MAX][MAX_REGULATION_NUM];
  3593. s8 limit_offset[MAX_REGULATION_NUM];
  3594. u8 base;
  3595. if (band == BAND_ON_2_4G)
  3596. ch = n + 1;
  3597. else
  3598. ch = center_chs_5g(bw, n);
  3599. if (ch == 0) {
  3600. rtw_warn_on(1);
  3601. break;
  3602. }
  3603. /* dump limit in db (calculate from path A) */
  3604. limit_offset[0] = PHY_GetTxPowerLimit_no_sc(adapter, 3, band, bw, RF_PATH_A, rates_by_sections[rs].rates[0], ch); /* FCC */
  3605. limit_offset[1] = PHY_GetTxPowerLimit_no_sc(adapter, 1, band, bw, RF_PATH_A, rates_by_sections[rs].rates[0], ch); /* ETSI */
  3606. limit_offset[2] = PHY_GetTxPowerLimit_no_sc(adapter, 2, band, bw, RF_PATH_A, rates_by_sections[rs].rates[0], ch); /* MKK */
  3607. limit_offset[3] = PHY_GetTxPowerLimit_no_sc(adapter, 4, band, bw, RF_PATH_A, rates_by_sections[rs].rates[0], ch); /* WW */
  3608. base = PHY_GetTxPowerByRateBase(adapter, band, RF_PATH_A, rate_section_to_tx_num(rs), rs);
  3609. RTW_PRINT_SEL(sel, "%3u ", ch);
  3610. for (i = 0; i < MAX_REGULATION_NUM; i++) {
  3611. if (limit_offset[i] == MAX_POWER_INDEX) {
  3612. limit_idx[0][i] = MAX_POWER_INDEX;
  3613. _RTW_PRINT_SEL(sel, "%5s ", "NA");
  3614. } else {
  3615. limit_idx[0][i] = limit_offset[i] + base;
  3616. if ((limit_offset[i] + base) % 2)
  3617. _RTW_PRINT_SEL(sel, "%3d.5 ", (limit_offset[i] + base) / 2);
  3618. else
  3619. _RTW_PRINT_SEL(sel, "%5d ", (limit_offset[i] + base) / 2);
  3620. }
  3621. }
  3622. /* dump limit offset of each path */
  3623. for (path = 0; path < RF_PATH_MAX; path++) {
  3624. if (path >= rfpath_num)
  3625. break;
  3626. limit_offset[0] = PHY_GetTxPowerLimit_no_sc(adapter, 3, band, bw, path, rates_by_sections[rs].rates[0], ch); /* FCC */
  3627. limit_offset[1] = PHY_GetTxPowerLimit_no_sc(adapter, 1, band, bw, path, rates_by_sections[rs].rates[0], ch); /* ETSI */
  3628. limit_offset[2] = PHY_GetTxPowerLimit_no_sc(adapter, 2, band, bw, path, rates_by_sections[rs].rates[0], ch); /* MKK */
  3629. limit_offset[3] = PHY_GetTxPowerLimit_no_sc(adapter, 4, band, bw, path, rates_by_sections[rs].rates[0], ch); /* WW */
  3630. base = PHY_GetTxPowerByRateBase(adapter, band, path, rate_section_to_tx_num(rs), rs);
  3631. _RTW_PRINT_SEL(sel, "|");
  3632. for (i = 0; i < MAX_REGULATION_NUM; i++) {
  3633. if (limit_offset[i] == MAX_POWER_INDEX) {
  3634. limit_idx[path][i] = MAX_POWER_INDEX;
  3635. _RTW_PRINT_SEL(sel, "%3s ", "NA");
  3636. } else {
  3637. limit_idx[path][i] = limit_offset[i] + base;
  3638. _RTW_PRINT_SEL(sel, "%3d ", limit_offset[i]);
  3639. }
  3640. }
  3641. }
  3642. /* compare limit_idx of each path, print 'x' when mismatch */
  3643. if (rfpath_num > 1) {
  3644. for (i = 0; i < MAX_REGULATION_NUM; i++) {
  3645. for (path = 0; path < RF_PATH_MAX; path++) {
  3646. if (path >= rfpath_num)
  3647. break;
  3648. if (limit_idx[path][i] != limit_idx[(path + 1) % rfpath_num][i])
  3649. break;
  3650. }
  3651. if (path >= rfpath_num)
  3652. _RTW_PRINT_SEL(sel, " ");
  3653. else
  3654. _RTW_PRINT_SEL(sel, "x");
  3655. }
  3656. }
  3657. _RTW_PRINT_SEL(sel, "\n");
  3658. }
  3659. RTW_PRINT_SEL(sel, "\n");
  3660. } /* loop for rate sections */
  3661. } /* loop for bandwidths */
  3662. } /* loop for bands */
  3663. }
  3664. /*
  3665. * phy file path is stored in global char array rtw_phy_para_file_path
  3666. * need to care about racing
  3667. */
  3668. int rtw_get_phy_file_path(_adapter *adapter, const char *file_name)
  3669. {
  3670. #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
  3671. struct hal_spec_t *hal_spec = GET_HAL_SPEC(adapter);
  3672. int len = 0;
  3673. if (file_name) {
  3674. len += snprintf(rtw_phy_para_file_path, PATH_LENGTH_MAX, "%s", rtw_phy_file_path);
  3675. #if defined(CONFIG_MULTIDRV) || defined(REALTEK_CONFIG_PATH_WITH_IC_NAME_FOLDER)
  3676. len += snprintf(rtw_phy_para_file_path + len, PATH_LENGTH_MAX - len, "%s/", hal_spec->ic_name);
  3677. #endif
  3678. len += snprintf(rtw_phy_para_file_path + len, PATH_LENGTH_MAX - len, "%s", file_name);
  3679. return _TRUE;
  3680. }
  3681. #endif
  3682. return _FALSE;
  3683. }
  3684. #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
  3685. int
  3686. phy_ConfigMACWithParaFile(
  3687. IN PADAPTER Adapter,
  3688. IN char *pFileName
  3689. )
  3690. {
  3691. PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
  3692. int rlen = 0, rtStatus = _FAIL;
  3693. char *szLine, *ptmp;
  3694. u32 u4bRegOffset, u4bRegValue, u4bMove;
  3695. if (!(Adapter->registrypriv.load_phy_file & LOAD_MAC_PARA_FILE))
  3696. return rtStatus;
  3697. _rtw_memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);
  3698. if ((pHalData->mac_reg_len == 0) && (pHalData->mac_reg == NULL)) {
  3699. rtw_get_phy_file_path(Adapter, pFileName);
  3700. if (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE) {
  3701. rlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN);
  3702. if (rlen > 0) {
  3703. rtStatus = _SUCCESS;
  3704. pHalData->mac_reg = rtw_zvmalloc(rlen);
  3705. if (pHalData->mac_reg) {
  3706. _rtw_memcpy(pHalData->mac_reg, pHalData->para_file_buf, rlen);
  3707. pHalData->mac_reg_len = rlen;
  3708. } else
  3709. RTW_INFO("%s mac_reg alloc fail !\n", __FUNCTION__);
  3710. }
  3711. }
  3712. } else {
  3713. if ((pHalData->mac_reg_len != 0) && (pHalData->mac_reg != NULL)) {
  3714. _rtw_memcpy(pHalData->para_file_buf, pHalData->mac_reg, pHalData->mac_reg_len);
  3715. rtStatus = _SUCCESS;
  3716. } else
  3717. RTW_INFO("%s(): Critical Error !!!\n", __FUNCTION__);
  3718. }
  3719. if (rtStatus == _SUCCESS) {
  3720. ptmp = pHalData->para_file_buf;
  3721. for (szLine = GetLineFromBuffer(ptmp); szLine != NULL; szLine = GetLineFromBuffer(ptmp)) {
  3722. if (!IsCommentString(szLine)) {
  3723. /* Get 1st hex value as register offset */
  3724. if (GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove)) {
  3725. if (u4bRegOffset == 0xffff) {
  3726. /* Ending. */
  3727. break;
  3728. }
  3729. /* Get 2nd hex value as register value. */
  3730. szLine += u4bMove;
  3731. if (GetHexValueFromString(szLine, &u4bRegValue, &u4bMove))
  3732. rtw_write8(Adapter, u4bRegOffset, (u8)u4bRegValue);
  3733. }
  3734. }
  3735. }
  3736. } else
  3737. RTW_INFO("%s(): No File %s, Load from HWImg Array!\n", __FUNCTION__, pFileName);
  3738. return rtStatus;
  3739. }
  3740. int
  3741. phy_ConfigBBWithParaFile(
  3742. IN PADAPTER Adapter,
  3743. IN char *pFileName,
  3744. IN u32 ConfigType
  3745. )
  3746. {
  3747. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  3748. int rlen = 0, rtStatus = _FAIL;
  3749. char *szLine, *ptmp;
  3750. u32 u4bRegOffset, u4bRegValue, u4bMove;
  3751. char *pBuf = NULL;
  3752. u32 *pBufLen = NULL;
  3753. if (!(Adapter->registrypriv.load_phy_file & LOAD_BB_PARA_FILE))
  3754. return rtStatus;
  3755. switch (ConfigType) {
  3756. case CONFIG_BB_PHY_REG:
  3757. pBuf = pHalData->bb_phy_reg;
  3758. pBufLen = &pHalData->bb_phy_reg_len;
  3759. break;
  3760. case CONFIG_BB_AGC_TAB:
  3761. pBuf = pHalData->bb_agc_tab;
  3762. pBufLen = &pHalData->bb_agc_tab_len;
  3763. break;
  3764. default:
  3765. RTW_INFO("Unknown ConfigType!! %d\r\n", ConfigType);
  3766. break;
  3767. }
  3768. _rtw_memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);
  3769. if ((pBufLen != NULL) && (*pBufLen == 0) && (pBuf == NULL)) {
  3770. rtw_get_phy_file_path(Adapter, pFileName);
  3771. if (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE) {
  3772. rlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN);
  3773. if (rlen > 0) {
  3774. rtStatus = _SUCCESS;
  3775. pBuf = rtw_zvmalloc(rlen);
  3776. if (pBuf) {
  3777. _rtw_memcpy(pBuf, pHalData->para_file_buf, rlen);
  3778. *pBufLen = rlen;
  3779. switch (ConfigType) {
  3780. case CONFIG_BB_PHY_REG:
  3781. pHalData->bb_phy_reg = pBuf;
  3782. break;
  3783. case CONFIG_BB_AGC_TAB:
  3784. pHalData->bb_agc_tab = pBuf;
  3785. break;
  3786. }
  3787. } else
  3788. RTW_INFO("%s(): ConfigType %d alloc fail !\n", __FUNCTION__, ConfigType);
  3789. }
  3790. }
  3791. } else {
  3792. if ((pBufLen != NULL) && (*pBufLen != 0) && (pBuf != NULL)) {
  3793. _rtw_memcpy(pHalData->para_file_buf, pBuf, *pBufLen);
  3794. rtStatus = _SUCCESS;
  3795. } else
  3796. RTW_INFO("%s(): Critical Error !!!\n", __FUNCTION__);
  3797. }
  3798. if (rtStatus == _SUCCESS) {
  3799. ptmp = pHalData->para_file_buf;
  3800. for (szLine = GetLineFromBuffer(ptmp); szLine != NULL; szLine = GetLineFromBuffer(ptmp)) {
  3801. if (!IsCommentString(szLine)) {
  3802. /* Get 1st hex value as register offset. */
  3803. if (GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove)) {
  3804. if (u4bRegOffset == 0xffff) {
  3805. /* Ending. */
  3806. break;
  3807. } else if (u4bRegOffset == 0xfe || u4bRegOffset == 0xffe) {
  3808. #ifdef CONFIG_LONG_DELAY_ISSUE
  3809. rtw_msleep_os(50);
  3810. #else
  3811. rtw_mdelay_os(50);
  3812. #endif
  3813. } else if (u4bRegOffset == 0xfd)
  3814. rtw_mdelay_os(5);
  3815. else if (u4bRegOffset == 0xfc)
  3816. rtw_mdelay_os(1);
  3817. else if (u4bRegOffset == 0xfb)
  3818. rtw_udelay_os(50);
  3819. else if (u4bRegOffset == 0xfa)
  3820. rtw_udelay_os(5);
  3821. else if (u4bRegOffset == 0xf9)
  3822. rtw_udelay_os(1);
  3823. /* Get 2nd hex value as register value. */
  3824. szLine += u4bMove;
  3825. if (GetHexValueFromString(szLine, &u4bRegValue, &u4bMove)) {
  3826. /* RTW_INFO("[BB-ADDR]%03lX=%08lX\n", u4bRegOffset, u4bRegValue); */
  3827. phy_set_bb_reg(Adapter, u4bRegOffset, bMaskDWord, u4bRegValue);
  3828. if (u4bRegOffset == 0xa24)
  3829. pHalData->odmpriv.rf_calibrate_info.rega24 = u4bRegValue;
  3830. /* Add 1us delay between BB/RF register setting. */
  3831. rtw_udelay_os(1);
  3832. }
  3833. }
  3834. }
  3835. }
  3836. } else
  3837. RTW_INFO("%s(): No File %s, Load from HWImg Array!\n", __FUNCTION__, pFileName);
  3838. return rtStatus;
  3839. }
  3840. VOID
  3841. phy_DecryptBBPgParaFile(
  3842. PADAPTER Adapter,
  3843. char *buffer
  3844. )
  3845. {
  3846. u32 i = 0, j = 0;
  3847. u8 map[95] = {0};
  3848. u8 currentChar;
  3849. char *BufOfLines, *ptmp;
  3850. /* RTW_INFO("=====>phy_DecryptBBPgParaFile()\n"); */
  3851. /* 32 the ascii code of the first visable char, 126 the last one */
  3852. for (i = 0; i < 95; ++i)
  3853. map[i] = (u8)(94 - i);
  3854. ptmp = buffer;
  3855. i = 0;
  3856. for (BufOfLines = GetLineFromBuffer(ptmp); BufOfLines != NULL; BufOfLines = GetLineFromBuffer(ptmp)) {
  3857. /* RTW_INFO("Encrypted Line: %s\n", BufOfLines); */
  3858. for (j = 0; j < strlen(BufOfLines); ++j) {
  3859. currentChar = BufOfLines[j];
  3860. if (currentChar == '\0')
  3861. break;
  3862. currentChar -= (u8)((((i + j) * 3) % 128));
  3863. BufOfLines[j] = map[currentChar - 32] + 32;
  3864. }
  3865. /* RTW_INFO("Decrypted Line: %s\n", BufOfLines ); */
  3866. if (strlen(BufOfLines) != 0)
  3867. i++;
  3868. BufOfLines[strlen(BufOfLines)] = '\n';
  3869. }
  3870. }
  3871. int
  3872. phy_ParseBBPgParaFile(
  3873. PADAPTER Adapter,
  3874. char *buffer
  3875. )
  3876. {
  3877. int rtStatus = _SUCCESS;
  3878. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  3879. char *szLine, *ptmp;
  3880. u32 u4bRegOffset, u4bRegMask, u4bRegValue;
  3881. u32 u4bMove;
  3882. BOOLEAN firstLine = _TRUE;
  3883. u8 tx_num = 0;
  3884. u8 band = 0, rf_path = 0;
  3885. /* RTW_INFO("=====>phy_ParseBBPgParaFile()\n"); */
  3886. if (Adapter->registrypriv.RegDecryptCustomFile == 1)
  3887. phy_DecryptBBPgParaFile(Adapter, buffer);
  3888. ptmp = buffer;
  3889. for (szLine = GetLineFromBuffer(ptmp); szLine != NULL; szLine = GetLineFromBuffer(ptmp)) {
  3890. if (isAllSpaceOrTab(szLine, sizeof(*szLine)))
  3891. continue;
  3892. if (!IsCommentString(szLine)) {
  3893. /* Get header info (relative value or exact value) */
  3894. if (firstLine) {
  3895. if (eqNByte(szLine, (u8 *)("#[v1]"), 5)) {
  3896. pHalData->odmpriv.phy_reg_pg_version = szLine[3] - '0';
  3897. /* RTW_INFO("This is a new format PHY_REG_PG.txt\n"); */
  3898. } else if (eqNByte(szLine, (u8 *)("#[v0]"), 5)) {
  3899. pHalData->odmpriv.phy_reg_pg_version = szLine[3] - '0';
  3900. /* RTW_INFO("This is a old format PHY_REG_PG.txt ok\n"); */
  3901. } else {
  3902. RTW_INFO("The format in PHY_REG_PG are invalid %s\n", szLine);
  3903. return _FAIL;
  3904. }
  3905. if (eqNByte(szLine + 5, (u8 *)("[Exact]#"), 8)) {
  3906. pHalData->odmpriv.phy_reg_pg_value_type = PHY_REG_PG_EXACT_VALUE;
  3907. /* RTW_INFO("The values in PHY_REG_PG are exact values ok\n"); */
  3908. firstLine = _FALSE;
  3909. continue;
  3910. } else if (eqNByte(szLine + 5, (pu1Byte)("[Relative]#"), 11)) {
  3911. pHalData->odmpriv.phy_reg_pg_value_type = PHY_REG_PG_RELATIVE_VALUE;
  3912. /* RTW_INFO("The values in PHY_REG_PG are relative values ok\n"); */
  3913. firstLine = _FALSE;
  3914. continue;
  3915. } else {
  3916. RTW_INFO("The values in PHY_REG_PG are invalid %s\n", szLine);
  3917. return _FAIL;
  3918. }
  3919. }
  3920. if (pHalData->odmpriv.phy_reg_pg_version == 0) {
  3921. /* Get 1st hex value as register offset. */
  3922. if (GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove)) {
  3923. szLine += u4bMove;
  3924. if (u4bRegOffset == 0xffff) {
  3925. /* Ending. */
  3926. break;
  3927. }
  3928. /* Get 2nd hex value as register mask. */
  3929. if (GetHexValueFromString(szLine, &u4bRegMask, &u4bMove))
  3930. szLine += u4bMove;
  3931. else
  3932. return _FAIL;
  3933. if (pHalData->odmpriv.phy_reg_pg_value_type == PHY_REG_PG_RELATIVE_VALUE) {
  3934. /* Get 3rd hex value as register value. */
  3935. if (GetHexValueFromString(szLine, &u4bRegValue, &u4bMove)) {
  3936. phy_store_tx_power_by_rate(Adapter, 0, 0, 1, u4bRegOffset, u4bRegMask, u4bRegValue);
  3937. /* RTW_INFO("[ADDR] %03X=%08X Mask=%08x\n", u4bRegOffset, u4bRegValue, u4bRegMask); */
  3938. } else
  3939. return _FAIL;
  3940. } else if (pHalData->odmpriv.phy_reg_pg_value_type == PHY_REG_PG_EXACT_VALUE) {
  3941. u32 combineValue = 0;
  3942. u8 integer = 0, fraction = 0;
  3943. if (GetFractionValueFromString(szLine, &integer, &fraction, &u4bMove))
  3944. szLine += u4bMove;
  3945. else
  3946. return _FAIL;
  3947. integer *= 2;
  3948. if (fraction == 5)
  3949. integer += 1;
  3950. combineValue |= (((integer / 10) << 4) + (integer % 10));
  3951. /* RTW_INFO(" %d", integer ); */
  3952. if (GetFractionValueFromString(szLine, &integer, &fraction, &u4bMove))
  3953. szLine += u4bMove;
  3954. else
  3955. return _FAIL;
  3956. integer *= 2;
  3957. if (fraction == 5)
  3958. integer += 1;
  3959. combineValue <<= 8;
  3960. combineValue |= (((integer / 10) << 4) + (integer % 10));
  3961. /* RTW_INFO(" %d", integer ); */
  3962. if (GetFractionValueFromString(szLine, &integer, &fraction, &u4bMove))
  3963. szLine += u4bMove;
  3964. else
  3965. return _FAIL;
  3966. integer *= 2;
  3967. if (fraction == 5)
  3968. integer += 1;
  3969. combineValue <<= 8;
  3970. combineValue |= (((integer / 10) << 4) + (integer % 10));
  3971. /* RTW_INFO(" %d", integer ); */
  3972. if (GetFractionValueFromString(szLine, &integer, &fraction, &u4bMove))
  3973. szLine += u4bMove;
  3974. else
  3975. return _FAIL;
  3976. integer *= 2;
  3977. if (fraction == 5)
  3978. integer += 1;
  3979. combineValue <<= 8;
  3980. combineValue |= (((integer / 10) << 4) + (integer % 10));
  3981. /* RTW_INFO(" %d", integer ); */
  3982. phy_store_tx_power_by_rate(Adapter, 0, 0, 1, u4bRegOffset, u4bRegMask, combineValue);
  3983. /* RTW_INFO("[ADDR] 0x%3x = 0x%4x\n", u4bRegOffset, combineValue ); */
  3984. }
  3985. }
  3986. } else if (pHalData->odmpriv.phy_reg_pg_version > 0) {
  3987. u32 index = 0, cnt = 0;
  3988. if (eqNByte(szLine, "0xffff", 6))
  3989. break;
  3990. if (!eqNByte("#[END]#", szLine, 7)) {
  3991. /* load the table label info */
  3992. if (szLine[0] == '#') {
  3993. index = 0;
  3994. if (eqNByte(szLine, "#[2.4G]" , 7)) {
  3995. band = BAND_ON_2_4G;
  3996. index += 8;
  3997. } else if (eqNByte(szLine, "#[5G]", 5)) {
  3998. band = BAND_ON_5G;
  3999. index += 6;
  4000. } else {
  4001. RTW_INFO("Invalid band %s in PHY_REG_PG.txt\n", szLine);
  4002. return _FAIL;
  4003. }
  4004. rf_path = szLine[index] - 'A';
  4005. /* RTW_INFO(" Table label Band %d, RfPath %d\n", band, rf_path ); */
  4006. } else { /* load rows of tables */
  4007. if (szLine[1] == '1')
  4008. tx_num = RF_1TX;
  4009. else if (szLine[1] == '2')
  4010. tx_num = RF_2TX;
  4011. else if (szLine[1] == '3')
  4012. tx_num = RF_3TX;
  4013. else if (szLine[1] == '4')
  4014. tx_num = RF_4TX;
  4015. else {
  4016. RTW_INFO("Invalid row in PHY_REG_PG.txt '%c'(%d)\n", szLine[1], szLine[1]);
  4017. return _FAIL;
  4018. }
  4019. while (szLine[index] != ']')
  4020. ++index;
  4021. ++index;/* skip ] */
  4022. /* Get 2nd hex value as register offset. */
  4023. szLine += index;
  4024. if (GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove))
  4025. szLine += u4bMove;
  4026. else
  4027. return _FAIL;
  4028. /* Get 2nd hex value as register mask. */
  4029. if (GetHexValueFromString(szLine, &u4bRegMask, &u4bMove))
  4030. szLine += u4bMove;
  4031. else
  4032. return _FAIL;
  4033. if (pHalData->odmpriv.phy_reg_pg_value_type == PHY_REG_PG_RELATIVE_VALUE) {
  4034. /* Get 3rd hex value as register value. */
  4035. if (GetHexValueFromString(szLine, &u4bRegValue, &u4bMove)) {
  4036. phy_store_tx_power_by_rate(Adapter, band, rf_path, tx_num, u4bRegOffset, u4bRegMask, u4bRegValue);
  4037. /* RTW_INFO("[ADDR] %03X (tx_num %d) =%08X Mask=%08x\n", u4bRegOffset, tx_num, u4bRegValue, u4bRegMask); */
  4038. } else
  4039. return _FAIL;
  4040. } else if (pHalData->odmpriv.phy_reg_pg_value_type == PHY_REG_PG_EXACT_VALUE) {
  4041. u32 combineValue = 0;
  4042. u8 integer = 0, fraction = 0;
  4043. if (GetFractionValueFromString(szLine, &integer, &fraction, &u4bMove))
  4044. szLine += u4bMove;
  4045. else
  4046. return _FAIL;
  4047. integer *= 2;
  4048. if (fraction == 5)
  4049. integer += 1;
  4050. combineValue |= (((integer / 10) << 4) + (integer % 10));
  4051. /* RTW_INFO(" %d", integer ); */
  4052. if (GetFractionValueFromString(szLine, &integer, &fraction, &u4bMove))
  4053. szLine += u4bMove;
  4054. else
  4055. return _FAIL;
  4056. integer *= 2;
  4057. if (fraction == 5)
  4058. integer += 1;
  4059. combineValue <<= 8;
  4060. combineValue |= (((integer / 10) << 4) + (integer % 10));
  4061. /* RTW_INFO(" %d", integer ); */
  4062. if (GetFractionValueFromString(szLine, &integer, &fraction, &u4bMove))
  4063. szLine += u4bMove;
  4064. else
  4065. return _FAIL;
  4066. integer *= 2;
  4067. if (fraction == 5)
  4068. integer += 1;
  4069. combineValue <<= 8;
  4070. combineValue |= (((integer / 10) << 4) + (integer % 10));
  4071. /* RTW_INFO(" %d", integer ); */
  4072. if (GetFractionValueFromString(szLine, &integer, &fraction, &u4bMove))
  4073. szLine += u4bMove;
  4074. else
  4075. return _FAIL;
  4076. integer *= 2;
  4077. if (fraction == 5)
  4078. integer += 1;
  4079. combineValue <<= 8;
  4080. combineValue |= (((integer / 10) << 4) + (integer % 10));
  4081. /* RTW_INFO(" %d", integer ); */
  4082. phy_store_tx_power_by_rate(Adapter, band, rf_path, tx_num, u4bRegOffset, u4bRegMask, combineValue);
  4083. /* RTW_INFO("[ADDR] 0x%3x (tx_num %d) = 0x%4x\n", u4bRegOffset, tx_num, combineValue ); */
  4084. }
  4085. }
  4086. }
  4087. }
  4088. }
  4089. }
  4090. /* RTW_INFO("<=====phy_ParseBBPgParaFile()\n"); */
  4091. return rtStatus;
  4092. }
  4093. int
  4094. phy_ConfigBBWithPgParaFile(
  4095. IN PADAPTER Adapter,
  4096. IN const char *pFileName)
  4097. {
  4098. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  4099. int rlen = 0, rtStatus = _FAIL;
  4100. if (!(Adapter->registrypriv.load_phy_file & LOAD_BB_PG_PARA_FILE))
  4101. return rtStatus;
  4102. _rtw_memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);
  4103. if (pHalData->bb_phy_reg_pg == NULL) {
  4104. rtw_get_phy_file_path(Adapter, pFileName);
  4105. if (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE) {
  4106. rlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN);
  4107. if (rlen > 0) {
  4108. rtStatus = _SUCCESS;
  4109. pHalData->bb_phy_reg_pg = rtw_zvmalloc(rlen);
  4110. if (pHalData->bb_phy_reg_pg) {
  4111. _rtw_memcpy(pHalData->bb_phy_reg_pg, pHalData->para_file_buf, rlen);
  4112. pHalData->bb_phy_reg_pg_len = rlen;
  4113. } else
  4114. RTW_INFO("%s bb_phy_reg_pg alloc fail !\n", __FUNCTION__);
  4115. }
  4116. }
  4117. } else {
  4118. if ((pHalData->bb_phy_reg_pg_len != 0) && (pHalData->bb_phy_reg_pg != NULL)) {
  4119. _rtw_memcpy(pHalData->para_file_buf, pHalData->bb_phy_reg_pg, pHalData->bb_phy_reg_pg_len);
  4120. rtStatus = _SUCCESS;
  4121. } else
  4122. RTW_INFO("%s(): Critical Error !!!\n", __FUNCTION__);
  4123. }
  4124. if (rtStatus == _SUCCESS) {
  4125. /* RTW_INFO("phy_ConfigBBWithPgParaFile(): read %s ok\n", pFileName); */
  4126. phy_ParseBBPgParaFile(Adapter, pHalData->para_file_buf);
  4127. } else
  4128. RTW_INFO("%s(): No File %s, Load from HWImg Array!\n", __FUNCTION__, pFileName);
  4129. return rtStatus;
  4130. }
  4131. #if (MP_DRIVER == 1)
  4132. int
  4133. phy_ConfigBBWithMpParaFile(
  4134. IN PADAPTER Adapter,
  4135. IN char *pFileName
  4136. )
  4137. {
  4138. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  4139. int rlen = 0, rtStatus = _FAIL;
  4140. char *szLine, *ptmp;
  4141. u32 u4bRegOffset, u4bRegValue, u4bMove;
  4142. if (!(Adapter->registrypriv.load_phy_file & LOAD_BB_MP_PARA_FILE))
  4143. return rtStatus;
  4144. _rtw_memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);
  4145. if ((pHalData->bb_phy_reg_mp_len == 0) && (pHalData->bb_phy_reg_mp == NULL)) {
  4146. rtw_get_phy_file_path(Adapter, pFileName);
  4147. if (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE) {
  4148. rlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN);
  4149. if (rlen > 0) {
  4150. rtStatus = _SUCCESS;
  4151. pHalData->bb_phy_reg_mp = rtw_zvmalloc(rlen);
  4152. if (pHalData->bb_phy_reg_mp) {
  4153. _rtw_memcpy(pHalData->bb_phy_reg_mp, pHalData->para_file_buf, rlen);
  4154. pHalData->bb_phy_reg_mp_len = rlen;
  4155. } else
  4156. RTW_INFO("%s bb_phy_reg_mp alloc fail !\n", __FUNCTION__);
  4157. }
  4158. }
  4159. } else {
  4160. if ((pHalData->bb_phy_reg_mp_len != 0) && (pHalData->bb_phy_reg_mp != NULL)) {
  4161. _rtw_memcpy(pHalData->para_file_buf, pHalData->bb_phy_reg_mp, pHalData->bb_phy_reg_mp_len);
  4162. rtStatus = _SUCCESS;
  4163. } else
  4164. RTW_INFO("%s(): Critical Error !!!\n", __FUNCTION__);
  4165. }
  4166. if (rtStatus == _SUCCESS) {
  4167. /* RTW_INFO("phy_ConfigBBWithMpParaFile(): read %s ok\n", pFileName); */
  4168. ptmp = pHalData->para_file_buf;
  4169. for (szLine = GetLineFromBuffer(ptmp); szLine != NULL; szLine = GetLineFromBuffer(ptmp)) {
  4170. if (!IsCommentString(szLine)) {
  4171. /* Get 1st hex value as register offset. */
  4172. if (GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove)) {
  4173. if (u4bRegOffset == 0xffff) {
  4174. /* Ending. */
  4175. break;
  4176. } else if (u4bRegOffset == 0xfe || u4bRegOffset == 0xffe) {
  4177. #ifdef CONFIG_LONG_DELAY_ISSUE
  4178. rtw_msleep_os(50);
  4179. #else
  4180. rtw_mdelay_os(50);
  4181. #endif
  4182. } else if (u4bRegOffset == 0xfd)
  4183. rtw_mdelay_os(5);
  4184. else if (u4bRegOffset == 0xfc)
  4185. rtw_mdelay_os(1);
  4186. else if (u4bRegOffset == 0xfb)
  4187. rtw_udelay_os(50);
  4188. else if (u4bRegOffset == 0xfa)
  4189. rtw_udelay_os(5);
  4190. else if (u4bRegOffset == 0xf9)
  4191. rtw_udelay_os(1);
  4192. /* Get 2nd hex value as register value. */
  4193. szLine += u4bMove;
  4194. if (GetHexValueFromString(szLine, &u4bRegValue, &u4bMove)) {
  4195. /* RTW_INFO("[ADDR]%03lX=%08lX\n", u4bRegOffset, u4bRegValue); */
  4196. phy_set_bb_reg(Adapter, u4bRegOffset, bMaskDWord, u4bRegValue);
  4197. /* Add 1us delay between BB/RF register setting. */
  4198. rtw_udelay_os(1);
  4199. }
  4200. }
  4201. }
  4202. }
  4203. } else
  4204. RTW_INFO("%s(): No File %s, Load from HWImg Array!\n", __FUNCTION__, pFileName);
  4205. return rtStatus;
  4206. }
  4207. #endif
  4208. int
  4209. PHY_ConfigRFWithParaFile(
  4210. IN PADAPTER Adapter,
  4211. IN char *pFileName,
  4212. IN u8 eRFPath
  4213. )
  4214. {
  4215. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  4216. int rlen = 0, rtStatus = _FAIL;
  4217. char *szLine, *ptmp;
  4218. u32 u4bRegOffset, u4bRegValue, u4bMove;
  4219. u16 i;
  4220. char *pBuf = NULL;
  4221. u32 *pBufLen = NULL;
  4222. if (!(Adapter->registrypriv.load_phy_file & LOAD_RF_PARA_FILE))
  4223. return rtStatus;
  4224. switch (eRFPath) {
  4225. case ODM_RF_PATH_A:
  4226. pBuf = pHalData->rf_radio_a;
  4227. pBufLen = &pHalData->rf_radio_a_len;
  4228. break;
  4229. case ODM_RF_PATH_B:
  4230. pBuf = pHalData->rf_radio_b;
  4231. pBufLen = &pHalData->rf_radio_b_len;
  4232. break;
  4233. default:
  4234. RTW_INFO("Unknown RF path!! %d\r\n", eRFPath);
  4235. break;
  4236. }
  4237. _rtw_memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);
  4238. if ((pBufLen != NULL) && (*pBufLen == 0) && (pBuf == NULL)) {
  4239. rtw_get_phy_file_path(Adapter, pFileName);
  4240. if (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE) {
  4241. rlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN);
  4242. if (rlen > 0) {
  4243. rtStatus = _SUCCESS;
  4244. pBuf = rtw_zvmalloc(rlen);
  4245. if (pBuf) {
  4246. _rtw_memcpy(pBuf, pHalData->para_file_buf, rlen);
  4247. *pBufLen = rlen;
  4248. switch (eRFPath) {
  4249. case ODM_RF_PATH_A:
  4250. pHalData->rf_radio_a = pBuf;
  4251. break;
  4252. case ODM_RF_PATH_B:
  4253. pHalData->rf_radio_b = pBuf;
  4254. break;
  4255. }
  4256. } else
  4257. RTW_INFO("%s(): eRFPath=%d alloc fail !\n", __FUNCTION__, eRFPath);
  4258. }
  4259. }
  4260. } else {
  4261. if ((pBufLen != NULL) && (*pBufLen != 0) && (pBuf != NULL)) {
  4262. _rtw_memcpy(pHalData->para_file_buf, pBuf, *pBufLen);
  4263. rtStatus = _SUCCESS;
  4264. } else
  4265. RTW_INFO("%s(): Critical Error !!!\n", __FUNCTION__);
  4266. }
  4267. if (rtStatus == _SUCCESS) {
  4268. /* RTW_INFO("%s(): read %s successfully\n", __FUNCTION__, pFileName); */
  4269. ptmp = pHalData->para_file_buf;
  4270. for (szLine = GetLineFromBuffer(ptmp); szLine != NULL; szLine = GetLineFromBuffer(ptmp)) {
  4271. if (!IsCommentString(szLine)) {
  4272. /* Get 1st hex value as register offset. */
  4273. if (GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove)) {
  4274. if (u4bRegOffset == 0xfe || u4bRegOffset == 0xffe) {
  4275. /* Deay specific ms. Only RF configuration require delay. */
  4276. #ifdef CONFIG_LONG_DELAY_ISSUE
  4277. rtw_msleep_os(50);
  4278. #else
  4279. rtw_mdelay_os(50);
  4280. #endif
  4281. } else if (u4bRegOffset == 0xfd) {
  4282. /* delay_ms(5); */
  4283. for (i = 0; i < 100; i++)
  4284. rtw_udelay_os(MAX_STALL_TIME);
  4285. } else if (u4bRegOffset == 0xfc) {
  4286. /* delay_ms(1); */
  4287. for (i = 0; i < 20; i++)
  4288. rtw_udelay_os(MAX_STALL_TIME);
  4289. } else if (u4bRegOffset == 0xfb)
  4290. rtw_udelay_os(50);
  4291. else if (u4bRegOffset == 0xfa)
  4292. rtw_udelay_os(5);
  4293. else if (u4bRegOffset == 0xf9)
  4294. rtw_udelay_os(1);
  4295. else if (u4bRegOffset == 0xffff)
  4296. break;
  4297. /* Get 2nd hex value as register value. */
  4298. szLine += u4bMove;
  4299. if (GetHexValueFromString(szLine, &u4bRegValue, &u4bMove)) {
  4300. phy_set_rf_reg(Adapter, eRFPath, u4bRegOffset, bRFRegOffsetMask, u4bRegValue);
  4301. /* Temp add, for frequency lock, if no delay, that may cause */
  4302. /* frequency shift, ex: 2412MHz => 2417MHz */
  4303. /* If frequency shift, the following action may works. */
  4304. /* Fractional-N table in radio_a.txt */
  4305. /* 0x2a 0x00001 */ /* channel 1 */
  4306. /* 0x2b 0x00808 frequency divider. */
  4307. /* 0x2b 0x53333 */
  4308. /* 0x2c 0x0000c */
  4309. rtw_udelay_os(1);
  4310. }
  4311. }
  4312. }
  4313. }
  4314. } else
  4315. RTW_INFO("%s(): No File %s, Load from HWImg Array!\n", __FUNCTION__, pFileName);
  4316. return rtStatus;
  4317. }
  4318. VOID
  4319. initDeltaSwingIndexTables(
  4320. PADAPTER Adapter,
  4321. char *Band,
  4322. char *Path,
  4323. char *Sign,
  4324. char *Channel,
  4325. char *Rate,
  4326. char *Data
  4327. )
  4328. {
  4329. #define STR_EQUAL_5G(_band, _path, _sign, _rate, _chnl) \
  4330. ((strcmp(Band, _band) == 0) && (strcmp(Path, _path) == 0) && (strcmp(Sign, _sign) == 0) &&\
  4331. (strcmp(Rate, _rate) == 0) && (strcmp(Channel, _chnl) == 0)\
  4332. )
  4333. #define STR_EQUAL_2G(_band, _path, _sign, _rate) \
  4334. ((strcmp(Band, _band) == 0) && (strcmp(Path, _path) == 0) && (strcmp(Sign, _sign) == 0) &&\
  4335. (strcmp(Rate, _rate) == 0)\
  4336. )
  4337. #define STORE_SWING_TABLE(_array, _iteratedIdx) \
  4338. do { \
  4339. for (token = strsep(&Data, delim); token != NULL; token = strsep(&Data, delim)) {\
  4340. sscanf(token, "%d", &idx);\
  4341. _array[_iteratedIdx++] = (u8)idx;\
  4342. } } while (0)\
  4343. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  4344. struct PHY_DM_STRUCT *pDM_Odm = &pHalData->odmpriv;
  4345. struct odm_rf_calibration_structure *pRFCalibrateInfo = &(pDM_Odm->rf_calibrate_info);
  4346. u32 j = 0;
  4347. char *token;
  4348. char delim[] = ",";
  4349. u32 idx = 0;
  4350. /* RTW_INFO("===>initDeltaSwingIndexTables(): Band: %s;\nPath: %s;\nSign: %s;\nChannel: %s;\nRate: %s;\n, Data: %s;\n", */
  4351. /* Band, Path, Sign, Channel, Rate, Data); */
  4352. if (STR_EQUAL_2G("2G", "A", "+", "CCK"))
  4353. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_2g_cck_a_p, j);
  4354. else if (STR_EQUAL_2G("2G", "A", "-", "CCK"))
  4355. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_2g_cck_a_n, j);
  4356. else if (STR_EQUAL_2G("2G", "B", "+", "CCK"))
  4357. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_2g_cck_b_p, j);
  4358. else if (STR_EQUAL_2G("2G", "B", "-", "CCK"))
  4359. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_2g_cck_b_n, j);
  4360. else if (STR_EQUAL_2G("2G", "A", "+", "ALL"))
  4361. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_2ga_p, j);
  4362. else if (STR_EQUAL_2G("2G", "A", "-", "ALL"))
  4363. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_2ga_n, j);
  4364. else if (STR_EQUAL_2G("2G", "B", "+", "ALL"))
  4365. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_2gb_p, j);
  4366. else if (STR_EQUAL_2G("2G", "B", "-", "ALL"))
  4367. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_2gb_n, j);
  4368. else if (STR_EQUAL_5G("5G", "A", "+", "ALL", "0"))
  4369. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_5ga_p[0], j);
  4370. else if (STR_EQUAL_5G("5G", "A", "-", "ALL", "0"))
  4371. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_5ga_n[0], j);
  4372. else if (STR_EQUAL_5G("5G", "B", "+", "ALL", "0"))
  4373. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_5gb_p[0], j);
  4374. else if (STR_EQUAL_5G("5G", "B", "-", "ALL", "0"))
  4375. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_5gb_n[0], j);
  4376. else if (STR_EQUAL_5G("5G", "A", "+", "ALL", "1"))
  4377. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_5ga_p[1], j);
  4378. else if (STR_EQUAL_5G("5G", "A", "-", "ALL", "1"))
  4379. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_5ga_n[1], j);
  4380. else if (STR_EQUAL_5G("5G", "B", "+", "ALL", "1"))
  4381. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_5gb_p[1], j);
  4382. else if (STR_EQUAL_5G("5G", "B", "-", "ALL", "1"))
  4383. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_5gb_n[1], j);
  4384. else if (STR_EQUAL_5G("5G", "A", "+", "ALL", "2"))
  4385. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_5ga_p[2], j);
  4386. else if (STR_EQUAL_5G("5G", "A", "-", "ALL", "2"))
  4387. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_5ga_n[2], j);
  4388. else if (STR_EQUAL_5G("5G", "B", "+", "ALL", "2"))
  4389. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_5gb_p[2], j);
  4390. else if (STR_EQUAL_5G("5G", "B", "-", "ALL", "2"))
  4391. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_5gb_n[2], j);
  4392. else if (STR_EQUAL_5G("5G", "A", "+", "ALL", "3"))
  4393. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_5ga_p[3], j);
  4394. else if (STR_EQUAL_5G("5G", "A", "-", "ALL", "3"))
  4395. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_5ga_n[3], j);
  4396. else if (STR_EQUAL_5G("5G", "B", "+", "ALL", "3"))
  4397. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_5gb_p[3], j);
  4398. else if (STR_EQUAL_5G("5G", "B", "-", "ALL", "3"))
  4399. STORE_SWING_TABLE(pRFCalibrateInfo->delta_swing_table_idx_5gb_n[3], j);
  4400. else
  4401. RTW_INFO("===>initDeltaSwingIndexTables(): The input is invalid!!\n");
  4402. }
  4403. int
  4404. PHY_ConfigRFWithTxPwrTrackParaFile(
  4405. IN PADAPTER Adapter,
  4406. IN char *pFileName
  4407. )
  4408. {
  4409. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  4410. struct PHY_DM_STRUCT *pDM_Odm = &pHalData->odmpriv;
  4411. struct odm_rf_calibration_structure *pRFCalibrateInfo = &(pDM_Odm->rf_calibrate_info);
  4412. int rlen = 0, rtStatus = _FAIL;
  4413. char *szLine, *ptmp;
  4414. u32 i = 0, j = 0;
  4415. char c = 0;
  4416. if (!(Adapter->registrypriv.load_phy_file & LOAD_RF_TXPWR_TRACK_PARA_FILE))
  4417. return rtStatus;
  4418. _rtw_memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);
  4419. if ((pHalData->rf_tx_pwr_track_len == 0) && (pHalData->rf_tx_pwr_track == NULL)) {
  4420. rtw_get_phy_file_path(Adapter, pFileName);
  4421. if (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE) {
  4422. rlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN);
  4423. if (rlen > 0) {
  4424. rtStatus = _SUCCESS;
  4425. pHalData->rf_tx_pwr_track = rtw_zvmalloc(rlen);
  4426. if (pHalData->rf_tx_pwr_track) {
  4427. _rtw_memcpy(pHalData->rf_tx_pwr_track, pHalData->para_file_buf, rlen);
  4428. pHalData->rf_tx_pwr_track_len = rlen;
  4429. } else
  4430. RTW_INFO("%s rf_tx_pwr_track alloc fail !\n", __FUNCTION__);
  4431. }
  4432. }
  4433. } else {
  4434. if ((pHalData->rf_tx_pwr_track_len != 0) && (pHalData->rf_tx_pwr_track != NULL)) {
  4435. _rtw_memcpy(pHalData->para_file_buf, pHalData->rf_tx_pwr_track, pHalData->rf_tx_pwr_track_len);
  4436. rtStatus = _SUCCESS;
  4437. } else
  4438. RTW_INFO("%s(): Critical Error !!!\n", __FUNCTION__);
  4439. }
  4440. if (rtStatus == _SUCCESS) {
  4441. /* RTW_INFO("%s(): read %s successfully\n", __FUNCTION__, pFileName); */
  4442. ptmp = pHalData->para_file_buf;
  4443. for (szLine = GetLineFromBuffer(ptmp); szLine != NULL; szLine = GetLineFromBuffer(ptmp)) {
  4444. if (!IsCommentString(szLine)) {
  4445. char band[5] = "", path[5] = "", sign[5] = "";
  4446. char chnl[5] = "", rate[10] = "";
  4447. char data[300] = ""; /* 100 is too small */
  4448. if (strlen(szLine) < 10 || szLine[0] != '[')
  4449. continue;
  4450. strncpy(band, szLine + 1, 2);
  4451. strncpy(path, szLine + 5, 1);
  4452. strncpy(sign, szLine + 8, 1);
  4453. i = 10; /* szLine+10 */
  4454. if (!ParseQualifiedString(szLine, &i, rate, '[', ']')) {
  4455. /* RTW_INFO("Fail to parse rate!\n"); */
  4456. }
  4457. if (!ParseQualifiedString(szLine, &i, chnl, '[', ']')) {
  4458. /* RTW_INFO("Fail to parse channel group!\n"); */
  4459. }
  4460. while (szLine[i] != '{' && i < strlen(szLine))
  4461. i++;
  4462. if (!ParseQualifiedString(szLine, &i, data, '{', '}')) {
  4463. /* RTW_INFO("Fail to parse data!\n"); */
  4464. }
  4465. initDeltaSwingIndexTables(Adapter, band, path, sign, chnl, rate, data);
  4466. }
  4467. }
  4468. } else
  4469. RTW_INFO("%s(): No File %s, Load from HWImg Array!\n", __FUNCTION__, pFileName);
  4470. #if 0
  4471. for (i = 0; i < DELTA_SWINGIDX_SIZE; ++i) {
  4472. RTW_INFO("pRFCalibrateInfo->delta_swing_table_idx_2ga_p[%d] = %d\n", i, pRFCalibrateInfo->delta_swing_table_idx_2ga_p[i]);
  4473. RTW_INFO("pRFCalibrateInfo->delta_swing_table_idx_2ga_n[%d] = %d\n", i, pRFCalibrateInfo->delta_swing_table_idx_2ga_n[i]);
  4474. RTW_INFO("pRFCalibrateInfo->delta_swing_table_idx_2gb_p[%d] = %d\n", i, pRFCalibrateInfo->delta_swing_table_idx_2gb_p[i]);
  4475. RTW_INFO("pRFCalibrateInfo->delta_swing_table_idx_2gb_n[%d] = %d\n", i, pRFCalibrateInfo->delta_swing_table_idx_2gb_n[i]);
  4476. RTW_INFO("pRFCalibrateInfo->delta_swing_table_idx_2g_cck_a_p[%d] = %d\n", i, pRFCalibrateInfo->delta_swing_table_idx_2g_cck_a_p[i]);
  4477. RTW_INFO("pRFCalibrateInfo->delta_swing_table_idx_2g_cck_a_n[%d] = %d\n", i, pRFCalibrateInfo->delta_swing_table_idx_2g_cck_a_n[i]);
  4478. RTW_INFO("pRFCalibrateInfo->delta_swing_table_idx_2g_cck_b_p[%d] = %d\n", i, pRFCalibrateInfo->delta_swing_table_idx_2g_cck_b_p[i]);
  4479. RTW_INFO("pRFCalibrateInfo->delta_swing_table_idx_2g_cck_b_n[%d] = %d\n", i, pRFCalibrateInfo->delta_swing_table_idx_2g_cck_b_n[i]);
  4480. for (j = 0; j < 3; ++j) {
  4481. RTW_INFO("pRFCalibrateInfo->delta_swing_table_idx_5ga_p[%d][%d] = %d\n", j, i, pRFCalibrateInfo->delta_swing_table_idx_5ga_p[j][i]);
  4482. RTW_INFO("pRFCalibrateInfo->delta_swing_table_idx_5ga_n[%d][%d] = %d\n", j, i, pRFCalibrateInfo->delta_swing_table_idx_5ga_n[j][i]);
  4483. RTW_INFO("pRFCalibrateInfo->delta_swing_table_idx_5gb_p[%d][%d] = %d\n", j, i, pRFCalibrateInfo->delta_swing_table_idx_5gb_p[j][i]);
  4484. RTW_INFO("pRFCalibrateInfo->delta_swing_table_idx_5gb_n[%d][%d] = %d\n", j, i, pRFCalibrateInfo->delta_swing_table_idx_5gb_n[j][i]);
  4485. }
  4486. }
  4487. #endif
  4488. return rtStatus;
  4489. }
  4490. int
  4491. phy_ParsePowerLimitTableFile(
  4492. PADAPTER Adapter,
  4493. char *buffer
  4494. )
  4495. {
  4496. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  4497. struct PHY_DM_STRUCT *pDM_Odm = &(pHalData->odmpriv);
  4498. u32 i = 0, forCnt = 0;
  4499. u8 loadingStage = 0, limitValue = 0, fraction = 0;
  4500. char *szLine, *ptmp;
  4501. int rtStatus = _SUCCESS;
  4502. char band[10], bandwidth[10], rateSection[10],
  4503. regulation[TXPWR_LMT_MAX_REGULATION_NUM][10], rfPath[10], colNumBuf[10];
  4504. u8 colNum = 0;
  4505. RTW_INFO("===>phy_ParsePowerLimitTableFile()\n");
  4506. if (Adapter->registrypriv.RegDecryptCustomFile == 1)
  4507. phy_DecryptBBPgParaFile(Adapter, buffer);
  4508. ptmp = buffer;
  4509. for (szLine = GetLineFromBuffer(ptmp); szLine != NULL; szLine = GetLineFromBuffer(ptmp)) {
  4510. if (isAllSpaceOrTab(szLine, sizeof(*szLine)))
  4511. continue;
  4512. /* skip comment */
  4513. if (IsCommentString(szLine))
  4514. continue;
  4515. if (loadingStage == 0) {
  4516. for (forCnt = 0; forCnt < TXPWR_LMT_MAX_REGULATION_NUM; ++forCnt)
  4517. _rtw_memset((PVOID) regulation[forCnt], 0, 10);
  4518. _rtw_memset((PVOID) band, 0, 10);
  4519. _rtw_memset((PVOID) bandwidth, 0, 10);
  4520. _rtw_memset((PVOID) rateSection, 0, 10);
  4521. _rtw_memset((PVOID) rfPath, 0, 10);
  4522. _rtw_memset((PVOID) colNumBuf, 0, 10);
  4523. if (szLine[0] != '#' || szLine[1] != '#')
  4524. continue;
  4525. /* skip the space */
  4526. i = 2;
  4527. while (szLine[i] == ' ' || szLine[i] == '\t')
  4528. ++i;
  4529. szLine[--i] = ' '; /* return the space in front of the regulation info */
  4530. /* Parse the label of the table */
  4531. if (!ParseQualifiedString(szLine, &i, band, ' ', ',')) {
  4532. RTW_INFO("Fail to parse band!\n");
  4533. return _FAIL;
  4534. }
  4535. if (!ParseQualifiedString(szLine, &i, bandwidth, ' ', ',')) {
  4536. RTW_INFO("Fail to parse bandwidth!\n");
  4537. return _FAIL;
  4538. }
  4539. if (!ParseQualifiedString(szLine, &i, rfPath, ' ', ',')) {
  4540. RTW_INFO("Fail to parse rf path!\n");
  4541. return _FAIL;
  4542. }
  4543. if (!ParseQualifiedString(szLine, &i, rateSection, ' ', ',')) {
  4544. RTW_INFO("Fail to parse rate!\n");
  4545. return _FAIL;
  4546. }
  4547. loadingStage = 1;
  4548. } else if (loadingStage == 1) {
  4549. if (szLine[0] != '#' || szLine[1] != '#')
  4550. continue;
  4551. /* skip the space */
  4552. i = 2;
  4553. while (szLine[i] == ' ' || szLine[i] == '\t')
  4554. ++i;
  4555. if (!eqNByte((u8 *)(szLine + i), (u8 *)("START"), 5)) {
  4556. RTW_INFO("Lost \"## START\" label\n");
  4557. return _FAIL;
  4558. }
  4559. loadingStage = 2;
  4560. } else if (loadingStage == 2) {
  4561. if (szLine[0] != '#' || szLine[1] != '#')
  4562. continue;
  4563. /* skip the space */
  4564. i = 2;
  4565. while (szLine[i] == ' ' || szLine[i] == '\t')
  4566. ++i;
  4567. if (!ParseQualifiedString(szLine, &i, colNumBuf, '#', '#')) {
  4568. RTW_INFO("Fail to parse column number!\n");
  4569. return _FAIL;
  4570. }
  4571. if (!GetU1ByteIntegerFromStringInDecimal(colNumBuf, &colNum))
  4572. return _FAIL;
  4573. if (colNum > TXPWR_LMT_MAX_REGULATION_NUM) {
  4574. RTW_INFO("unvalid col number %d (greater than max %d)\n",
  4575. colNum, TXPWR_LMT_MAX_REGULATION_NUM);
  4576. return _FAIL;
  4577. }
  4578. for (forCnt = 0; forCnt < colNum; ++forCnt) {
  4579. u8 regulation_name_cnt = 0;
  4580. /* skip the space */
  4581. while (szLine[i] == ' ' || szLine[i] == '\t')
  4582. ++i;
  4583. while (szLine[i] != ' ' && szLine[i] != '\t' && szLine[i] != '\0')
  4584. regulation[forCnt][regulation_name_cnt++] = szLine[i++];
  4585. /* RTW_INFO("regulation %s!\n", regulation[forCnt]); */
  4586. if (regulation_name_cnt == 0) {
  4587. RTW_INFO("unvalid number of regulation!\n");
  4588. return _FAIL;
  4589. }
  4590. }
  4591. loadingStage = 3;
  4592. } else if (loadingStage == 3) {
  4593. char channel[10] = {0}, powerLimit[10] = {0};
  4594. u8 cnt = 0;
  4595. /* the table ends */
  4596. if (szLine[0] == '#' && szLine[1] == '#') {
  4597. i = 2;
  4598. while (szLine[i] == ' ' || szLine[i] == '\t')
  4599. ++i;
  4600. if (eqNByte((u8 *)(szLine + i), (u8 *)("END"), 3)) {
  4601. loadingStage = 0;
  4602. continue;
  4603. } else {
  4604. RTW_INFO("Wrong format\n");
  4605. RTW_INFO("<===== phy_ParsePowerLimitTableFile()\n");
  4606. return _FAIL;
  4607. }
  4608. }
  4609. if ((szLine[0] != 'c' && szLine[0] != 'C') ||
  4610. (szLine[1] != 'h' && szLine[1] != 'H')) {
  4611. RTW_INFO("Meet wrong channel => power limt pair '%c','%c'(%d,%d)\n", szLine[0], szLine[1], szLine[0], szLine[1]);
  4612. continue;
  4613. }
  4614. i = 2;/* move to the location behind 'h' */
  4615. /* load the channel number */
  4616. cnt = 0;
  4617. while (szLine[i] >= '0' && szLine[i] <= '9') {
  4618. channel[cnt] = szLine[i];
  4619. ++cnt;
  4620. ++i;
  4621. }
  4622. /* RTW_INFO("chnl %s!\n", channel); */
  4623. for (forCnt = 0; forCnt < colNum; ++forCnt) {
  4624. /* skip the space between channel number and the power limit value */
  4625. while (szLine[i] == ' ' || szLine[i] == '\t')
  4626. ++i;
  4627. /* load the power limit value */
  4628. cnt = 0;
  4629. fraction = 0;
  4630. _rtw_memset((PVOID) powerLimit, 0, 10);
  4631. while ((szLine[i] >= '0' && szLine[i] <= '9') || szLine[i] == '.') {
  4632. if (szLine[i] == '.') {
  4633. if ((szLine[i + 1] >= '0' && szLine[i + 1] <= '9')) {
  4634. fraction = szLine[i + 1];
  4635. i += 2;
  4636. } else {
  4637. RTW_INFO("Wrong fraction in TXPWR_LMT.txt\n");
  4638. return _FAIL;
  4639. }
  4640. break;
  4641. }
  4642. powerLimit[cnt] = szLine[i];
  4643. ++cnt;
  4644. ++i;
  4645. }
  4646. if (powerLimit[0] == '\0') {
  4647. powerLimit[0] = '6';
  4648. powerLimit[1] = '3';
  4649. i += 2;
  4650. } else {
  4651. if (!GetU1ByteIntegerFromStringInDecimal(powerLimit, &limitValue))
  4652. return _FAIL;
  4653. limitValue *= 2;
  4654. cnt = 0;
  4655. if (fraction == '5')
  4656. ++limitValue;
  4657. /* the value is greater or equal to 100 */
  4658. if (limitValue >= 100) {
  4659. powerLimit[cnt++] = limitValue / 100 + '0';
  4660. limitValue %= 100;
  4661. if (limitValue >= 10) {
  4662. powerLimit[cnt++] = limitValue / 10 + '0';
  4663. limitValue %= 10;
  4664. } else
  4665. powerLimit[cnt++] = '0';
  4666. powerLimit[cnt++] = limitValue + '0';
  4667. }
  4668. /* the value is greater or equal to 10 */
  4669. else if (limitValue >= 10) {
  4670. powerLimit[cnt++] = limitValue / 10 + '0';
  4671. limitValue %= 10;
  4672. powerLimit[cnt++] = limitValue + '0';
  4673. }
  4674. /* the value is less than 10 */
  4675. else
  4676. powerLimit[cnt++] = limitValue + '0';
  4677. powerLimit[cnt] = '\0';
  4678. }
  4679. /* RTW_INFO("ch%s => %s\n", channel, powerLimit); */
  4680. /* store the power limit value */
  4681. phy_set_tx_power_limit(pDM_Odm, (u8 *)regulation[forCnt], (u8 *)band,
  4682. (u8 *)bandwidth, (u8 *)rateSection, (u8 *)rfPath, (u8 *)channel, (u8 *)powerLimit);
  4683. }
  4684. } else {
  4685. RTW_INFO("Abnormal loading stage in phy_ParsePowerLimitTableFile()!\n");
  4686. rtStatus = _FAIL;
  4687. break;
  4688. }
  4689. }
  4690. RTW_INFO("<===phy_ParsePowerLimitTableFile()\n");
  4691. return rtStatus;
  4692. }
  4693. int
  4694. PHY_ConfigRFWithPowerLimitTableParaFile(
  4695. IN PADAPTER Adapter,
  4696. IN const char *pFileName
  4697. )
  4698. {
  4699. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
  4700. int rlen = 0, rtStatus = _FAIL;
  4701. if (!(Adapter->registrypriv.load_phy_file & LOAD_RF_TXPWR_LMT_PARA_FILE))
  4702. return rtStatus;
  4703. _rtw_memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);
  4704. if (pHalData->rf_tx_pwr_lmt == NULL) {
  4705. rtw_get_phy_file_path(Adapter, pFileName);
  4706. if (rtw_is_file_readable(rtw_phy_para_file_path) == _TRUE) {
  4707. rlen = rtw_retrieve_from_file(rtw_phy_para_file_path, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN);
  4708. if (rlen > 0) {
  4709. rtStatus = _SUCCESS;
  4710. pHalData->rf_tx_pwr_lmt = rtw_zvmalloc(rlen);
  4711. if (pHalData->rf_tx_pwr_lmt) {
  4712. _rtw_memcpy(pHalData->rf_tx_pwr_lmt, pHalData->para_file_buf, rlen);
  4713. pHalData->rf_tx_pwr_lmt_len = rlen;
  4714. } else
  4715. RTW_INFO("%s rf_tx_pwr_lmt alloc fail !\n", __FUNCTION__);
  4716. }
  4717. }
  4718. } else {
  4719. if ((pHalData->rf_tx_pwr_lmt_len != 0) && (pHalData->rf_tx_pwr_lmt != NULL)) {
  4720. _rtw_memcpy(pHalData->para_file_buf, pHalData->rf_tx_pwr_lmt, pHalData->rf_tx_pwr_lmt_len);
  4721. rtStatus = _SUCCESS;
  4722. } else
  4723. RTW_INFO("%s(): Critical Error !!!\n", __FUNCTION__);
  4724. }
  4725. if (rtStatus == _SUCCESS) {
  4726. /* RTW_INFO("%s(): read %s ok\n", __FUNCTION__, pFileName); */
  4727. rtStatus = phy_ParsePowerLimitTableFile(Adapter, pHalData->para_file_buf);
  4728. } else
  4729. RTW_INFO("%s(): No File %s, Load from HWImg Array!\n", __FUNCTION__, pFileName);
  4730. return rtStatus;
  4731. }
  4732. void phy_free_filebuf_mask(_adapter *padapter, u8 mask)
  4733. {
  4734. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  4735. if (pHalData->mac_reg && (mask & LOAD_MAC_PARA_FILE)) {
  4736. rtw_vmfree(pHalData->mac_reg, pHalData->mac_reg_len);
  4737. pHalData->mac_reg = NULL;
  4738. }
  4739. if (mask & LOAD_BB_PARA_FILE) {
  4740. if (pHalData->bb_phy_reg) {
  4741. rtw_vmfree(pHalData->bb_phy_reg, pHalData->bb_phy_reg_len);
  4742. pHalData->bb_phy_reg = NULL;
  4743. }
  4744. if (pHalData->bb_agc_tab) {
  4745. rtw_vmfree(pHalData->bb_agc_tab, pHalData->bb_agc_tab_len);
  4746. pHalData->bb_agc_tab = NULL;
  4747. }
  4748. }
  4749. if (pHalData->bb_phy_reg_pg && (mask & LOAD_BB_PG_PARA_FILE)) {
  4750. rtw_vmfree(pHalData->bb_phy_reg_pg, pHalData->bb_phy_reg_pg_len);
  4751. pHalData->bb_phy_reg_pg = NULL;
  4752. }
  4753. if (pHalData->bb_phy_reg_mp && (mask & LOAD_BB_MP_PARA_FILE)) {
  4754. rtw_vmfree(pHalData->bb_phy_reg_mp, pHalData->bb_phy_reg_mp_len);
  4755. pHalData->bb_phy_reg_mp = NULL;
  4756. }
  4757. if (mask & LOAD_RF_PARA_FILE) {
  4758. if (pHalData->rf_radio_a) {
  4759. rtw_vmfree(pHalData->rf_radio_a, pHalData->rf_radio_a_len);
  4760. pHalData->rf_radio_a = NULL;
  4761. }
  4762. if (pHalData->rf_radio_b) {
  4763. rtw_vmfree(pHalData->rf_radio_b, pHalData->rf_radio_b_len);
  4764. pHalData->rf_radio_b = NULL;
  4765. }
  4766. }
  4767. if (pHalData->rf_tx_pwr_track && (mask & LOAD_RF_TXPWR_TRACK_PARA_FILE)) {
  4768. rtw_vmfree(pHalData->rf_tx_pwr_track, pHalData->rf_tx_pwr_track_len);
  4769. pHalData->rf_tx_pwr_track = NULL;
  4770. }
  4771. if (pHalData->rf_tx_pwr_lmt && (mask & LOAD_RF_TXPWR_LMT_PARA_FILE)) {
  4772. rtw_vmfree(pHalData->rf_tx_pwr_lmt, pHalData->rf_tx_pwr_lmt_len);
  4773. pHalData->rf_tx_pwr_lmt = NULL;
  4774. }
  4775. }
  4776. inline void phy_free_filebuf(_adapter *padapter)
  4777. {
  4778. phy_free_filebuf_mask(padapter, 0xFF);
  4779. }
  4780. #endif