rtw_debug.c 158 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2007 - 2012 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 _RTW_DEBUG_C_
  21. #include <drv_types.h>
  22. #include <hal_data.h>
  23. #ifdef CONFIG_RTW_DEBUG
  24. const char *rtw_log_level_str[] = {
  25. "_DRV_NONE_ = 0",
  26. "_DRV_ALWAYS_ = 1",
  27. "_DRV_ERR_ = 2",
  28. "_DRV_WARNING_ = 3",
  29. "_DRV_INFO_ = 4",
  30. "_DRV_DEBUG_ = 5",
  31. "_DRV_MAX_ = 6",
  32. };
  33. #endif
  34. #ifdef CONFIG_DEBUG_RTL871X
  35. u64 GlobalDebugComponents = 0;
  36. #endif /* CONFIG_DEBUG_RTL871X */
  37. #include <rtw_version.h>
  38. #ifdef CONFIG_TDLS
  39. #define TDLS_DBG_INFO_SPACE_BTWN_ITEM_AND_VALUE 41
  40. #endif
  41. void dump_drv_version(void *sel)
  42. {
  43. RTW_PRINT_SEL(sel, "%s %s\n", DRV_NAME, DRIVERVERSION);
  44. RTW_PRINT_SEL(sel, "build time: %s %s\n", __DATE__, __TIME__);
  45. }
  46. void dump_drv_cfg(void *sel)
  47. {
  48. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24))
  49. char *kernel_version = utsname()->release;
  50. RTW_PRINT_SEL(sel, "\nKernel Version: %s\n", kernel_version);
  51. #endif
  52. RTW_PRINT_SEL(sel, "Driver Version: %s\n", DRIVERVERSION);
  53. RTW_PRINT_SEL(sel, "------------------------------------------------\n");
  54. #ifdef CONFIG_IOCTL_CFG80211
  55. RTW_PRINT_SEL(sel, "CFG80211\n");
  56. #ifdef RTW_USE_CFG80211_STA_EVENT
  57. RTW_PRINT_SEL(sel, "RTW_USE_CFG80211_STA_EVENT\n");
  58. #endif
  59. #else
  60. RTW_PRINT_SEL(sel, "WEXT\n");
  61. #endif
  62. RTW_PRINT_SEL(sel, "DBG:%d\n", DBG);
  63. #ifdef CONFIG_RTW_DEBUG
  64. RTW_PRINT_SEL(sel, "CONFIG_RTW_DEBUG\n");
  65. #endif
  66. #ifdef CONFIG_CONCURRENT_MODE
  67. RTW_PRINT_SEL(sel, "CONFIG_CONCURRENT_MODE\n");
  68. #endif
  69. #ifdef CONFIG_POWER_SAVING
  70. RTW_PRINT_SEL(sel, "CONFIG_POWER_SAVING\n");
  71. #endif
  72. #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
  73. RTW_PRINT_SEL(sel, "LOAD_PHY_PARA_FROM_FILE - REALTEK_CONFIG_PATH=%s\n", REALTEK_CONFIG_PATH);
  74. #if defined(CONFIG_MULTIDRV) || defined(REALTEK_CONFIG_PATH_WITH_IC_NAME_FOLDER)
  75. RTW_PRINT_SEL(sel, "LOAD_PHY_PARA_FROM_FILE - REALTEK_CONFIG_PATH_WITH_IC_NAME_FOLDER\n");
  76. #endif
  77. /* configurations about TX power */
  78. #ifdef CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY
  79. RTW_PRINT_SEL(sel, "CONFIG_CALIBRATE_TX_POWER_BY_REGULATORY\n");
  80. #endif
  81. #ifdef CONFIG_CALIBRATE_TX_POWER_TO_MAX
  82. RTW_PRINT_SEL(sel, "CONFIG_CALIBRATE_TX_POWER_TO_MAX\n");
  83. #endif
  84. #endif
  85. RTW_PRINT_SEL(sel, "RTW_DEF_MODULE_REGULATORY_CERT=0x%02x\n", RTW_DEF_MODULE_REGULATORY_CERT);
  86. RTW_PRINT_SEL(sel, "CONFIG_TXPWR_BY_RATE_EN=%d\n", CONFIG_TXPWR_BY_RATE_EN);
  87. RTW_PRINT_SEL(sel, "CONFIG_TXPWR_LIMIT_EN=%d\n", CONFIG_TXPWR_LIMIT_EN);
  88. #ifdef CONFIG_DISABLE_ODM
  89. RTW_PRINT_SEL(sel, "CONFIG_DISABLE_ODM\n");
  90. #endif
  91. #ifdef CONFIG_MINIMAL_MEMORY_USAGE
  92. RTW_PRINT_SEL(sel, "CONFIG_MINIMAL_MEMORY_USAGE\n");
  93. #endif
  94. RTW_PRINT_SEL(sel, "CONFIG_RTW_ADAPTIVITY_EN = %d\n", CONFIG_RTW_ADAPTIVITY_EN);
  95. #if (CONFIG_RTW_ADAPTIVITY_EN)
  96. RTW_PRINT_SEL(sel, "ADAPTIVITY_MODE = %s\n", (CONFIG_RTW_ADAPTIVITY_MODE) ? "carrier_sense" : "normal");
  97. #endif
  98. #ifdef CONFIG_WOWLAN
  99. RTW_PRINT_SEL(sel, "CONFIG_WOWLAN - ");
  100. #ifdef CONFIG_GPIO_WAKEUP
  101. RTW_PRINT_SEL(sel, "CONFIG_GPIO_WAKEUP - WAKEUP_GPIO_IDX:%d\n", WAKEUP_GPIO_IDX);
  102. #endif
  103. #endif
  104. #ifdef CONFIG_TDLS
  105. RTW_PRINT_SEL(sel, "CONFIG_TDLS\n");
  106. #endif
  107. #ifdef CONFIG_RTW_80211R
  108. RTW_PRINT_SEL(sel, "CONFIG_RTW_80211R\n");
  109. #endif
  110. #ifdef CONFIG_USB_HCI
  111. #ifdef CONFIG_SUPPORT_USB_INT
  112. RTW_PRINT_SEL(sel, "CONFIG_SUPPORT_USB_INT\n");
  113. #endif
  114. #ifdef CONFIG_USB_INTERRUPT_IN_PIPE
  115. RTW_PRINT_SEL(sel, "CONFIG_USB_INTERRUPT_IN_PIPE\n");
  116. #endif
  117. #ifdef CONFIG_USB_TX_AGGREGATION
  118. RTW_PRINT_SEL(sel, "CONFIG_USB_TX_AGGREGATION\n");
  119. #endif
  120. #ifdef CONFIG_USB_RX_AGGREGATION
  121. RTW_PRINT_SEL(sel, "CONFIG_USB_RX_AGGREGATION\n");
  122. #endif
  123. #ifdef CONFIG_USE_USB_BUFFER_ALLOC_TX
  124. RTW_PRINT_SEL(sel, "CONFIG_USE_USB_BUFFER_ALLOC_TX\n");
  125. #endif
  126. #ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
  127. RTW_PRINT_SEL(sel, "CONFIG_USE_USB_BUFFER_ALLOC_RX\n");
  128. #endif
  129. #ifdef CONFIG_PREALLOC_RECV_SKB
  130. RTW_PRINT_SEL(sel, "CONFIG_PREALLOC_RECV_SKB\n");
  131. #endif
  132. #ifdef CONFIG_FIX_NR_BULKIN_BUFFER
  133. RTW_PRINT_SEL(sel, "CONFIG_FIX_NR_BULKIN_BUFFER\n");
  134. #endif
  135. #endif /*CONFIG_USB_HCI*/
  136. #ifdef CONFIG_SDIO_HCI
  137. #ifdef CONFIG_TX_AGGREGATION
  138. RTW_PRINT_SEL(sel, "CONFIG_TX_AGGREGATION\n");
  139. #endif
  140. #ifdef CONFIG_RX_AGGREGATION
  141. RTW_PRINT_SEL(sel, "CONFIG_RX_AGGREGATION\n");
  142. #endif
  143. #endif /*CONFIG_SDIO_HCI*/
  144. #ifdef CONFIG_PCI_HCI
  145. #endif
  146. RTW_PRINT_SEL(sel, "\n=== XMIT-INFO ===\n");
  147. RTW_PRINT_SEL(sel, "NR_XMITFRAME = %d\n", NR_XMITFRAME);
  148. RTW_PRINT_SEL(sel, "NR_XMITBUFF = %d\n", NR_XMITBUFF);
  149. RTW_PRINT_SEL(sel, "MAX_XMITBUF_SZ = %d\n", MAX_XMITBUF_SZ);
  150. RTW_PRINT_SEL(sel, "NR_XMIT_EXTBUFF = %d\n", NR_XMIT_EXTBUFF);
  151. RTW_PRINT_SEL(sel, "MAX_XMIT_EXTBUF_SZ = %d\n", MAX_XMIT_EXTBUF_SZ);
  152. RTW_PRINT_SEL(sel, "MAX_CMDBUF_SZ = %d\n", MAX_CMDBUF_SZ);
  153. RTW_PRINT_SEL(sel, "\n=== RECV-INFO ===\n");
  154. RTW_PRINT_SEL(sel, "NR_RECVFRAME = %d\n", NR_RECVFRAME);
  155. RTW_PRINT_SEL(sel, "NR_RECVBUFF = %d\n", NR_RECVBUFF);
  156. RTW_PRINT_SEL(sel, "MAX_RECVBUF_SZ = %d\n", MAX_RECVBUF_SZ);
  157. }
  158. void dump_log_level(void *sel)
  159. {
  160. #ifdef CONFIG_RTW_DEBUG
  161. int i;
  162. RTW_PRINT_SEL(sel, "drv_log_level:%d\n", rtw_drv_log_level);
  163. for (i = 0; i <= _DRV_MAX_; i++) {
  164. if (rtw_log_level_str[i])
  165. RTW_PRINT_SEL(sel, "%c %s = %d\n",
  166. (rtw_drv_log_level == i) ? '+' : ' ', rtw_log_level_str[i], i);
  167. }
  168. #else
  169. RTW_PRINT_SEL(sel, "CONFIG_RTW_DEBUG is disabled\n");
  170. #endif
  171. }
  172. #ifdef CONFIG_SDIO_HCI
  173. void sd_f0_reg_dump(void *sel, _adapter *adapter)
  174. {
  175. int i;
  176. for (i = 0x0; i <= 0xff; i++) {
  177. if (i % 16 == 0)
  178. RTW_PRINT_SEL(sel, "0x%02x ", i);
  179. _RTW_PRINT_SEL(sel, "%02x ", rtw_sd_f0_read8(adapter, i));
  180. if (i % 16 == 15)
  181. _RTW_PRINT_SEL(sel, "\n");
  182. else if (i % 8 == 7)
  183. _RTW_PRINT_SEL(sel, "\t");
  184. }
  185. }
  186. void sdio_local_reg_dump(void *sel, _adapter *adapter)
  187. {
  188. int i, j = 1;
  189. for (i = 0x0; i < 0x100; i += 4) {
  190. if (j % 4 == 1)
  191. RTW_PRINT_SEL(sel, "0x%02x", i);
  192. _RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, (0x1025 << 16) | i));
  193. if ((j++) % 4 == 0)
  194. _RTW_PRINT_SEL(sel, "\n");
  195. }
  196. }
  197. #endif /* CONFIG_SDIO_HCI */
  198. void mac_reg_dump(void *sel, _adapter *adapter)
  199. {
  200. int i, j = 1;
  201. RTW_PRINT_SEL(sel, "======= MAC REG =======\n");
  202. for (i = 0x0; i < 0x800; i += 4) {
  203. if (j % 4 == 1)
  204. RTW_PRINT_SEL(sel, "0x%04x", i);
  205. _RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));
  206. if ((j++) % 4 == 0)
  207. _RTW_PRINT_SEL(sel, "\n");
  208. }
  209. #ifdef CONFIG_RTL8814A
  210. {
  211. for (i = 0x1000; i < 0x1650; i += 4) {
  212. if (j % 4 == 1)
  213. RTW_PRINT_SEL(sel, "0x%04x", i);
  214. _RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));
  215. if ((j++) % 4 == 0)
  216. _RTW_PRINT_SEL(sel, "\n");
  217. }
  218. }
  219. #endif /* CONFIG_RTL8814A */
  220. #if defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8821C)
  221. for (i = 0x1000; i < 0x1800; i += 4) {
  222. if (j % 4 == 1)
  223. RTW_PRINT_SEL(sel, "0x%04x", i);
  224. _RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));
  225. if ((j++) % 4 == 0)
  226. _RTW_PRINT_SEL(sel, "\n");
  227. }
  228. #endif /* CONFIG_RTL8822B */
  229. }
  230. void bb_reg_dump(void *sel, _adapter *adapter)
  231. {
  232. int i, j = 1;
  233. RTW_PRINT_SEL(sel, "======= BB REG =======\n");
  234. for (i = 0x800; i < 0x1000; i += 4) {
  235. if (j % 4 == 1)
  236. RTW_PRINT_SEL(sel, "0x%04x", i);
  237. _RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));
  238. if ((j++) % 4 == 0)
  239. _RTW_PRINT_SEL(sel, "\n");
  240. }
  241. #if defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8821C)
  242. for (i = 0x1800; i < 0x2000; i += 4) {
  243. if (j % 4 == 1)
  244. RTW_PRINT_SEL(sel, "0x%04x", i);
  245. _RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));
  246. if ((j++) % 4 == 0)
  247. _RTW_PRINT_SEL(sel, "\n");
  248. }
  249. #endif /* CONFIG_RTL8822B */
  250. }
  251. void bb_reg_dump_ex(void *sel, _adapter *adapter)
  252. {
  253. int i, j = 1;
  254. RTW_PRINT_SEL(sel, "======= BB REG =======\n");
  255. for (i = 0x800; i < 0x1000; i += 4) {
  256. RTW_PRINT_SEL(sel, "0x%04x", i);
  257. _RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));
  258. _RTW_PRINT_SEL(sel, "\n");
  259. }
  260. #if defined(CONFIG_RTL8822B) || defined(CONFIG_RTL8821C)
  261. for (i = 0x1800; i < 0x2000; i += 4) {
  262. RTW_PRINT_SEL(sel, "0x%04x", i);
  263. _RTW_PRINT_SEL(sel, " 0x%08x ", rtw_read32(adapter, i));
  264. _RTW_PRINT_SEL(sel, "\n");
  265. }
  266. #endif /* CONFIG_RTL8822B */
  267. }
  268. void rf_reg_dump(void *sel, _adapter *adapter)
  269. {
  270. int i, j = 1, path;
  271. u32 value;
  272. u8 rf_type = 0;
  273. u8 path_nums = 0;
  274. rtw_hal_get_hwreg(adapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
  275. if ((RF_1T2R == rf_type) || (RF_1T1R == rf_type))
  276. path_nums = 1;
  277. else
  278. path_nums = 2;
  279. RTW_PRINT_SEL(sel, "======= RF REG =======\n");
  280. for (path = 0; path < path_nums; path++) {
  281. RTW_PRINT_SEL(sel, "RF_Path(%x)\n", path);
  282. for (i = 0; i < 0x100; i++) {
  283. value = rtw_hal_read_rfreg(adapter, path, i, 0xffffffff);
  284. if (j % 4 == 1)
  285. RTW_PRINT_SEL(sel, "0x%02x ", i);
  286. _RTW_PRINT_SEL(sel, " 0x%08x ", value);
  287. if ((j++) % 4 == 0)
  288. _RTW_PRINT_SEL(sel, "\n");
  289. }
  290. }
  291. }
  292. void rtw_sink_rtp_seq_dbg(_adapter *adapter, _pkt *pkt)
  293. {
  294. struct recv_priv *precvpriv = &(adapter->recvpriv);
  295. if (precvpriv->sink_udpport > 0) {
  296. if (*((u16 *)((pkt->data) + 0x24)) == cpu_to_be16(precvpriv->sink_udpport)) {
  297. precvpriv->pre_rtp_rxseq = precvpriv->cur_rtp_rxseq;
  298. precvpriv->cur_rtp_rxseq = be16_to_cpu(*((u16 *)((pkt->data) + 0x2C)));
  299. if (precvpriv->pre_rtp_rxseq + 1 != precvpriv->cur_rtp_rxseq)
  300. RTW_INFO("%s : RTP Seq num from %d to %d\n", __FUNCTION__, precvpriv->pre_rtp_rxseq, precvpriv->cur_rtp_rxseq);
  301. }
  302. }
  303. }
  304. void sta_rx_reorder_ctl_dump(void *sel, struct sta_info *sta)
  305. {
  306. struct recv_reorder_ctrl *reorder_ctl;
  307. int i;
  308. for (i = 0; i < 16; i++) {
  309. reorder_ctl = &sta->recvreorder_ctrl[i];
  310. if (reorder_ctl->ampdu_size != RX_AMPDU_SIZE_INVALID || reorder_ctl->indicate_seq != 0xFFFF) {
  311. RTW_PRINT_SEL(sel, "tid=%d, enable=%d, ampdu_size=%u, indicate_seq=%u\n"
  312. , i, reorder_ctl->enable, reorder_ctl->ampdu_size, reorder_ctl->indicate_seq
  313. );
  314. }
  315. }
  316. }
  317. void dump_tx_rate_bmp(void *sel, struct dvobj_priv *dvobj)
  318. {
  319. _adapter *adapter = dvobj_get_primary_adapter(dvobj);
  320. struct rf_ctl_t *rfctl = dvobj_to_rfctl(dvobj);
  321. u8 bw;
  322. RTW_PRINT_SEL(sel, "%-6s", "bw");
  323. if (hal_chk_proto_cap(adapter, PROTO_CAP_11AC))
  324. _RTW_PRINT_SEL(sel, " %-11s", "vht");
  325. _RTW_PRINT_SEL(sel, " %-11s %-4s %-3s\n", "ht", "ofdm", "cck");
  326. for (bw = CHANNEL_WIDTH_20; bw <= CHANNEL_WIDTH_160; bw++) {
  327. if (!hal_is_bw_support(adapter, bw))
  328. continue;
  329. RTW_PRINT_SEL(sel, "%6s", ch_width_str(bw));
  330. if (hal_chk_proto_cap(adapter, PROTO_CAP_11AC)) {
  331. _RTW_PRINT_SEL(sel, " %03x %03x %03x"
  332. , RATE_BMP_GET_VHT_3SS(rfctl->rate_bmp_vht_by_bw[bw])
  333. , RATE_BMP_GET_VHT_2SS(rfctl->rate_bmp_vht_by_bw[bw])
  334. , RATE_BMP_GET_VHT_1SS(rfctl->rate_bmp_vht_by_bw[bw])
  335. );
  336. }
  337. _RTW_PRINT_SEL(sel, " %02x %02x %02x %02x"
  338. , bw <= CHANNEL_WIDTH_40 ? RATE_BMP_GET_HT_4SS(rfctl->rate_bmp_ht_by_bw[bw]) : 0
  339. , bw <= CHANNEL_WIDTH_40 ? RATE_BMP_GET_HT_3SS(rfctl->rate_bmp_ht_by_bw[bw]) : 0
  340. , bw <= CHANNEL_WIDTH_40 ? RATE_BMP_GET_HT_2SS(rfctl->rate_bmp_ht_by_bw[bw]) : 0
  341. , bw <= CHANNEL_WIDTH_40 ? RATE_BMP_GET_HT_1SS(rfctl->rate_bmp_ht_by_bw[bw]) : 0
  342. );
  343. _RTW_PRINT_SEL(sel, " %03x %01x\n"
  344. , bw <= CHANNEL_WIDTH_20 ? RATE_BMP_GET_OFDM(rfctl->rate_bmp_cck_ofdm) : 0
  345. , bw <= CHANNEL_WIDTH_20 ? RATE_BMP_GET_CCK(rfctl->rate_bmp_cck_ofdm) : 0
  346. );
  347. }
  348. }
  349. void dump_adapters_status(void *sel, struct dvobj_priv *dvobj)
  350. {
  351. struct rf_ctl_t *rfctl = dvobj_to_rfctl(dvobj);
  352. int i;
  353. _adapter *iface;
  354. u8 u_ch, u_bw, u_offset;
  355. dump_mi_status(sel, dvobj);
  356. #ifdef CONFIG_FW_MULTI_PORT_SUPPORT
  357. RTW_PRINT_SEL(sel, "default port id:%d\n\n", dvobj->default_port_id);
  358. #endif /* CONFIG_FW_MULTI_PORT_SUPPORT */
  359. RTW_PRINT_SEL(sel, "dev status:%s%s\n\n"
  360. , dev_is_surprise_removed(dvobj) ? " SR" : ""
  361. , dev_is_drv_stopped(dvobj) ? " DS" : ""
  362. );
  363. #ifdef CONFIG_P2P
  364. #define P2P_INFO_TITLE_FMT " %-3s %-4s"
  365. #define P2P_INFO_TITLE_ARG , "lch", "p2ps"
  366. #ifdef CONFIG_IOCTL_CFG80211
  367. #define P2P_INFO_VALUE_FMT " %3u %c%3u"
  368. #define P2P_INFO_VALUE_ARG , iface->wdinfo.listen_channel, iface->wdev_data.p2p_enabled ? 'e' : ' ', rtw_p2p_state(&iface->wdinfo)
  369. #else
  370. #define P2P_INFO_VALUE_FMT " %3u %4u"
  371. #define P2P_INFO_VALUE_ARG , iface->wdinfo.listen_channel, rtw_p2p_state(&iface->wdinfo)
  372. #endif
  373. #define P2P_INFO_DASH "---------"
  374. #else
  375. #define P2P_INFO_TITLE_FMT ""
  376. #define P2P_INFO_TITLE_ARG
  377. #define P2P_INFO_VALUE_FMT ""
  378. #define P2P_INFO_VALUE_ARG
  379. #define P2P_INFO_DASH
  380. #endif
  381. RTW_PRINT_SEL(sel, "%-2s %-15s %c %-3s %-3s %-3s %-17s %-4s %-7s"
  382. P2P_INFO_TITLE_FMT
  383. " %s\n"
  384. , "id", "ifname", ' ', "bup", "nup", "ncd", "macaddr", "port", "ch"
  385. P2P_INFO_TITLE_ARG
  386. , "status");
  387. RTW_PRINT_SEL(sel, "---------------------------------------------------------------"
  388. P2P_INFO_DASH
  389. "-------\n");
  390. for (i = 0; i < dvobj->iface_nums; i++) {
  391. iface = dvobj->padapters[i];
  392. if (iface) {
  393. RTW_PRINT_SEL(sel, "%2d %-15s %c %3u %3u %3u "MAC_FMT" %4hhu %3u,%u,%u"
  394. P2P_INFO_VALUE_FMT
  395. " "MLME_STATE_FMT"\n"
  396. , i, iface->registered ? ADPT_ARG(iface) : NULL
  397. , iface->registered ? 'R' : ' '
  398. , iface->bup
  399. , iface->netif_up
  400. , iface->net_closed
  401. , MAC_ARG(adapter_mac_addr(iface))
  402. , get_hw_port(iface)
  403. , iface->mlmeextpriv.cur_channel
  404. , iface->mlmeextpriv.cur_bwmode
  405. , iface->mlmeextpriv.cur_ch_offset
  406. P2P_INFO_VALUE_ARG
  407. , MLME_STATE_ARG(iface)
  408. );
  409. }
  410. }
  411. RTW_PRINT_SEL(sel, "---------------------------------------------------------------"
  412. P2P_INFO_DASH
  413. "-------\n");
  414. rtw_mi_get_ch_setting_union(dvobj_get_primary_adapter(dvobj), &u_ch, &u_bw, &u_offset);
  415. RTW_PRINT_SEL(sel, "%55s %3u,%u,%u\n"
  416. , "union:"
  417. , u_ch, u_bw, u_offset
  418. );
  419. RTW_PRINT_SEL(sel, "%55s %3u,%u,%u\n"
  420. , "oper:"
  421. , dvobj->oper_channel
  422. , dvobj->oper_bwmode
  423. , dvobj->oper_ch_offset
  424. );
  425. #ifdef CONFIG_DFS_MASTER
  426. if (rfctl->radar_detect_ch != 0) {
  427. RTW_PRINT_SEL(sel, "%55s %3u,%u,%u"
  428. , "radar_detect:"
  429. , rfctl->radar_detect_ch
  430. , rfctl->radar_detect_bw
  431. , rfctl->radar_detect_offset
  432. );
  433. if (rfctl->radar_detect_by_others)
  434. _RTW_PRINT_SEL(sel, ", by AP of STA link");
  435. else {
  436. u32 non_ocp_ms;
  437. u32 cac_ms;
  438. u8 dfs_domain = rtw_odm_get_dfs_domain(dvobj_get_primary_adapter(dvobj));
  439. _RTW_PRINT_SEL(sel, ", domain:%u", dfs_domain);
  440. for (i = 0; i < dvobj->iface_nums; i++) {
  441. if (!dvobj->padapters[i])
  442. continue;
  443. if (check_fwstate(&dvobj->padapters[i]->mlmepriv, WIFI_AP_STATE)
  444. && check_fwstate(&dvobj->padapters[i]->mlmepriv, WIFI_ASOC_STATE))
  445. break;
  446. }
  447. if (i >= dvobj->iface_nums) {
  448. RTW_PRINT_SEL(sel, "DFS master enable without AP mode???");
  449. goto end_dfs_master;
  450. }
  451. rtw_get_ch_waiting_ms(dvobj->padapters[i]
  452. , rfctl->radar_detect_ch
  453. , rfctl->radar_detect_bw
  454. , rfctl->radar_detect_offset
  455. , &non_ocp_ms
  456. , &cac_ms
  457. );
  458. if (non_ocp_ms)
  459. _RTW_PRINT_SEL(sel, ", non_ocp:%d", non_ocp_ms);
  460. if (cac_ms)
  461. _RTW_PRINT_SEL(sel, ", cac:%d", cac_ms);
  462. }
  463. end_dfs_master:
  464. _RTW_PRINT_SEL(sel, "\n");
  465. }
  466. #endif /* CONFIG_DFS_MASTER */
  467. }
  468. #define SEC_CAM_ENT_ID_TITLE_FMT "%-2s"
  469. #define SEC_CAM_ENT_ID_TITLE_ARG "id"
  470. #define SEC_CAM_ENT_ID_VALUE_FMT "%2u"
  471. #define SEC_CAM_ENT_ID_VALUE_ARG(id) (id)
  472. #define SEC_CAM_ENT_TITLE_FMT "%-6s %-17s %-32s %-3s %-7s %-2s %-2s %-5s"
  473. #define SEC_CAM_ENT_TITLE_ARG "ctrl", "addr", "key", "kid", "type", "MK", "GK", "valid"
  474. #define SEC_CAM_ENT_VALUE_FMT "0x%04x "MAC_FMT" "KEY_FMT" %3u %-7s %2u %2u %5u"
  475. #define SEC_CAM_ENT_VALUE_ARG(ent) \
  476. (ent)->ctrl \
  477. , MAC_ARG((ent)->mac) \
  478. , KEY_ARG((ent)->key) \
  479. , ((ent)->ctrl) & 0x03 \
  480. , security_type_str((((ent)->ctrl) >> 2) & 0x07) \
  481. , (((ent)->ctrl) >> 5) & 0x01 \
  482. , (((ent)->ctrl) >> 6) & 0x01 \
  483. , (((ent)->ctrl) >> 15) & 0x01
  484. void dump_sec_cam_ent(void *sel, struct sec_cam_ent *ent, int id)
  485. {
  486. if (id >= 0) {
  487. RTW_PRINT_SEL(sel, SEC_CAM_ENT_ID_VALUE_FMT " " SEC_CAM_ENT_VALUE_FMT"\n"
  488. , SEC_CAM_ENT_ID_VALUE_ARG(id), SEC_CAM_ENT_VALUE_ARG(ent));
  489. } else
  490. RTW_PRINT_SEL(sel, SEC_CAM_ENT_VALUE_FMT"\n", SEC_CAM_ENT_VALUE_ARG(ent));
  491. }
  492. void dump_sec_cam_ent_title(void *sel, u8 has_id)
  493. {
  494. if (has_id) {
  495. RTW_PRINT_SEL(sel, SEC_CAM_ENT_ID_TITLE_FMT " " SEC_CAM_ENT_TITLE_FMT"\n"
  496. , SEC_CAM_ENT_ID_TITLE_ARG, SEC_CAM_ENT_TITLE_ARG);
  497. } else
  498. RTW_PRINT_SEL(sel, SEC_CAM_ENT_TITLE_FMT"\n", SEC_CAM_ENT_TITLE_ARG);
  499. }
  500. void dump_sec_cam(void *sel, _adapter *adapter)
  501. {
  502. struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
  503. struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
  504. struct sec_cam_ent ent;
  505. int i;
  506. RTW_PRINT_SEL(sel, "HW sec cam:\n");
  507. dump_sec_cam_ent_title(sel, 1);
  508. for (i = 0; i < cam_ctl->num; i++) {
  509. rtw_sec_read_cam_ent(adapter, i, (u8 *)(&ent.ctrl), ent.mac, ent.key);
  510. dump_sec_cam_ent(sel , &ent, i);
  511. }
  512. }
  513. void dump_sec_cam_cache(void *sel, _adapter *adapter)
  514. {
  515. struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
  516. struct cam_ctl_t *cam_ctl = &dvobj->cam_ctl;
  517. int i;
  518. RTW_PRINT_SEL(sel, "SW sec cam cache:\n");
  519. dump_sec_cam_ent_title(sel, 1);
  520. for (i = 0; i < cam_ctl->num; i++) {
  521. if (dvobj->cam_cache[i].ctrl != 0)
  522. dump_sec_cam_ent(sel, &dvobj->cam_cache[i], i);
  523. }
  524. }
  525. #ifdef CONFIG_PROC_DEBUG
  526. ssize_t proc_set_write_reg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  527. {
  528. struct net_device *dev = data;
  529. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  530. char tmp[32];
  531. u32 addr, val, len;
  532. if (count < 3) {
  533. RTW_INFO("argument size is less than 3\n");
  534. return -EFAULT;
  535. }
  536. if (count > sizeof(tmp)) {
  537. rtw_warn_on(1);
  538. return -EFAULT;
  539. }
  540. if (buffer && !copy_from_user(tmp, buffer, count)) {
  541. int num = sscanf(tmp, "%x %x %x", &addr, &val, &len);
  542. if (num != 3) {
  543. RTW_INFO("invalid write_reg parameter!\n");
  544. return count;
  545. }
  546. switch (len) {
  547. case 1:
  548. rtw_write8(padapter, addr, (u8)val);
  549. break;
  550. case 2:
  551. rtw_write16(padapter, addr, (u16)val);
  552. break;
  553. case 4:
  554. rtw_write32(padapter, addr, val);
  555. break;
  556. default:
  557. RTW_INFO("error write length=%d", len);
  558. break;
  559. }
  560. }
  561. return count;
  562. }
  563. static u32 proc_get_read_addr = 0xeeeeeeee;
  564. static u32 proc_get_read_len = 0x4;
  565. int proc_get_read_reg(struct seq_file *m, void *v)
  566. {
  567. struct net_device *dev = m->private;
  568. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  569. if (proc_get_read_addr == 0xeeeeeeee) {
  570. RTW_PRINT_SEL(m, "address not initialized\n");
  571. return 0;
  572. }
  573. switch (proc_get_read_len) {
  574. case 1:
  575. RTW_PRINT_SEL(m, "rtw_read8(0x%x)=0x%x\n", proc_get_read_addr, rtw_read8(padapter, proc_get_read_addr));
  576. break;
  577. case 2:
  578. RTW_PRINT_SEL(m, "rtw_read16(0x%x)=0x%x\n", proc_get_read_addr, rtw_read16(padapter, proc_get_read_addr));
  579. break;
  580. case 4:
  581. RTW_PRINT_SEL(m, "rtw_read32(0x%x)=0x%x\n", proc_get_read_addr, rtw_read32(padapter, proc_get_read_addr));
  582. break;
  583. default:
  584. RTW_PRINT_SEL(m, "error read length=%d\n", proc_get_read_len);
  585. break;
  586. }
  587. return 0;
  588. }
  589. ssize_t proc_set_read_reg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  590. {
  591. struct net_device *dev = data;
  592. char tmp[16];
  593. u32 addr, len;
  594. if (count < 2) {
  595. RTW_INFO("argument size is less than 2\n");
  596. return -EFAULT;
  597. }
  598. if (count > sizeof(tmp)) {
  599. rtw_warn_on(1);
  600. return -EFAULT;
  601. }
  602. if (buffer && !copy_from_user(tmp, buffer, count)) {
  603. int num = sscanf(tmp, "%x %x", &addr, &len);
  604. if (num != 2) {
  605. RTW_INFO("invalid read_reg parameter!\n");
  606. return count;
  607. }
  608. proc_get_read_addr = addr;
  609. proc_get_read_len = len;
  610. }
  611. return count;
  612. }
  613. int proc_get_rx_stat(struct seq_file *m, void *v)
  614. {
  615. _irqL irqL;
  616. _list *plist, *phead;
  617. struct net_device *dev = m->private;
  618. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  619. struct sta_info *psta = NULL;
  620. struct stainfo_stats *pstats = NULL;
  621. struct sta_priv *pstapriv = &(adapter->stapriv);
  622. u32 i, j;
  623. u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  624. u8 null_addr[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  625. _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  626. for (i = 0; i < NUM_STA; i++) {
  627. phead = &(pstapriv->sta_hash[i]);
  628. plist = get_next(phead);
  629. while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {
  630. psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
  631. plist = get_next(plist);
  632. pstats = &psta->sta_stats;
  633. if (pstats == NULL)
  634. continue;
  635. if ((_rtw_memcmp(psta->hwaddr, bc_addr, 6) != _TRUE)
  636. && (_rtw_memcmp(psta->hwaddr, null_addr, 6) != _TRUE)
  637. && (_rtw_memcmp(psta->hwaddr, adapter_mac_addr(adapter), 6) != _TRUE)) {
  638. RTW_PRINT_SEL(m, "MAC :\t\t"MAC_FMT "\n", MAC_ARG(psta->hwaddr));
  639. RTW_PRINT_SEL(m, "data_rx_cnt :\t%llu\n", pstats->rx_data_pkts - pstats->rx_data_last_pkts);
  640. pstats->rx_data_last_pkts = pstats->rx_data_pkts;
  641. RTW_PRINT_SEL(m, "duplicate_cnt :\t%u\n", pstats->duplicate_cnt);
  642. pstats->duplicate_cnt = 0;
  643. RTW_PRINT_SEL(m, "rx_per_rate_cnt :\n");
  644. for (j = 0; j < 0x60; j++) {
  645. RTW_PRINT_SEL(m, "%08u ", pstats->rxratecnt[j]);
  646. pstats->rxratecnt[j] = 0;
  647. if ((j%8) == 7)
  648. RTW_PRINT_SEL(m, "\n");
  649. }
  650. RTW_PRINT_SEL(m, "\n");
  651. }
  652. }
  653. }
  654. _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  655. return 0;
  656. }
  657. int proc_get_tx_stat(struct seq_file *m, void *v)
  658. {
  659. _irqL irqL;
  660. _list *plist, *phead;
  661. struct net_device *dev = m->private;
  662. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  663. struct sta_info *psta = NULL, *sta_rec[NUM_STA];
  664. struct stainfo_stats *pstats = NULL;
  665. struct sta_priv *pstapriv = &(adapter->stapriv);
  666. u32 i, macid_rec_idx = 0;
  667. u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  668. u8 null_addr[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  669. struct submit_ctx gotc2h;
  670. _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  671. for (i = 0; i < NUM_STA; i++) {
  672. sta_rec[i] = NULL;
  673. phead = &(pstapriv->sta_hash[i]);
  674. plist = get_next(phead);
  675. while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {
  676. psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
  677. plist = get_next(plist);
  678. if ((_rtw_memcmp(psta->hwaddr, bc_addr, 6) != _TRUE)
  679. && (_rtw_memcmp(psta->hwaddr, null_addr, 6) != _TRUE)
  680. && (_rtw_memcmp(psta->hwaddr, adapter_mac_addr(adapter), 6) != _TRUE)) {
  681. sta_rec[macid_rec_idx++] = psta;
  682. }
  683. }
  684. }
  685. _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  686. for (i = 0; i < macid_rec_idx; i++) {
  687. pstats = &(sta_rec[i]->sta_stats);
  688. if (pstats == NULL)
  689. continue;
  690. pstapriv->c2h_sta = sta_rec[i];
  691. rtw_hal_reqtxrpt(adapter, sta_rec[i]->mac_id);
  692. rtw_sctx_init(&gotc2h, 60);
  693. pstapriv->gotc2h = &gotc2h;
  694. if (rtw_sctx_wait(&gotc2h, __func__)) {
  695. RTW_PRINT_SEL(m, "MAC :\t\t"MAC_FMT "\n", MAC_ARG(sta_rec[i]->hwaddr));
  696. RTW_PRINT_SEL(m, "data_sent_cnt :\t%u\n", pstats->tx_ok_cnt + pstats->tx_fail_cnt);
  697. RTW_PRINT_SEL(m, "success_cnt :\t%u\n", pstats->tx_ok_cnt);
  698. RTW_PRINT_SEL(m, "failure_cnt :\t%u\n", pstats->tx_fail_cnt);
  699. RTW_PRINT_SEL(m, "retry_cnt :\t%u\n\n", pstats->tx_retry_cnt);
  700. } else {
  701. RTW_PRINT_SEL(m, "Warming : Query timeout, operation abort!!\n");
  702. RTW_PRINT_SEL(m, "\n");
  703. break;
  704. }
  705. }
  706. return 0;
  707. }
  708. int proc_get_fwstate(struct seq_file *m, void *v)
  709. {
  710. struct net_device *dev = m->private;
  711. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  712. struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  713. RTW_PRINT_SEL(m, "fwstate=0x%x\n", get_fwstate(pmlmepriv));
  714. return 0;
  715. }
  716. int proc_get_sec_info(struct seq_file *m, void *v)
  717. {
  718. struct net_device *dev = m->private;
  719. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  720. struct security_priv *sec = &padapter->securitypriv;
  721. RTW_PRINT_SEL(m, "auth_alg=0x%x, enc_alg=0x%x, auth_type=0x%x, enc_type=0x%x\n",
  722. sec->dot11AuthAlgrthm, sec->dot11PrivacyAlgrthm,
  723. sec->ndisauthtype, sec->ndisencryptstatus);
  724. RTW_PRINT_SEL(m, "hw_decrypted=%d\n", sec->hw_decrypted);
  725. #ifdef DBG_SW_SEC_CNT
  726. RTW_PRINT_SEL(m, "wep_sw_enc_cnt=%llu, %llu, %llu\n"
  727. , sec->wep_sw_enc_cnt_bc , sec->wep_sw_enc_cnt_mc, sec->wep_sw_enc_cnt_uc);
  728. RTW_PRINT_SEL(m, "wep_sw_dec_cnt=%llu, %llu, %llu\n"
  729. , sec->wep_sw_dec_cnt_bc , sec->wep_sw_dec_cnt_mc, sec->wep_sw_dec_cnt_uc);
  730. RTW_PRINT_SEL(m, "tkip_sw_enc_cnt=%llu, %llu, %llu\n"
  731. , sec->tkip_sw_enc_cnt_bc , sec->tkip_sw_enc_cnt_mc, sec->tkip_sw_enc_cnt_uc);
  732. RTW_PRINT_SEL(m, "tkip_sw_dec_cnt=%llu, %llu, %llu\n"
  733. , sec->tkip_sw_dec_cnt_bc , sec->tkip_sw_dec_cnt_mc, sec->tkip_sw_dec_cnt_uc);
  734. RTW_PRINT_SEL(m, "aes_sw_enc_cnt=%llu, %llu, %llu\n"
  735. , sec->aes_sw_enc_cnt_bc , sec->aes_sw_enc_cnt_mc, sec->aes_sw_enc_cnt_uc);
  736. RTW_PRINT_SEL(m, "aes_sw_dec_cnt=%llu, %llu, %llu\n"
  737. , sec->aes_sw_dec_cnt_bc , sec->aes_sw_dec_cnt_mc, sec->aes_sw_dec_cnt_uc);
  738. #endif /* DBG_SW_SEC_CNT */
  739. return 0;
  740. }
  741. int proc_get_mlmext_state(struct seq_file *m, void *v)
  742. {
  743. struct net_device *dev = m->private;
  744. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  745. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  746. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  747. RTW_PRINT_SEL(m, "pmlmeinfo->state=0x%x\n", pmlmeinfo->state);
  748. return 0;
  749. }
  750. #ifdef CONFIG_LAYER2_ROAMING
  751. int proc_get_roam_flags(struct seq_file *m, void *v)
  752. {
  753. struct net_device *dev = m->private;
  754. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  755. RTW_PRINT_SEL(m, "0x%02x\n", rtw_roam_flags(adapter));
  756. return 0;
  757. }
  758. ssize_t proc_set_roam_flags(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  759. {
  760. struct net_device *dev = data;
  761. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  762. char tmp[32];
  763. u8 flags;
  764. if (count < 1)
  765. return -EFAULT;
  766. if (count > sizeof(tmp)) {
  767. rtw_warn_on(1);
  768. return -EFAULT;
  769. }
  770. if (buffer && !copy_from_user(tmp, buffer, count)) {
  771. int num = sscanf(tmp, "%hhx", &flags);
  772. if (num == 1)
  773. rtw_assign_roam_flags(adapter, flags);
  774. }
  775. return count;
  776. }
  777. int proc_get_roam_param(struct seq_file *m, void *v)
  778. {
  779. struct net_device *dev = m->private;
  780. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  781. struct mlme_priv *mlme = &adapter->mlmepriv;
  782. RTW_PRINT_SEL(m, "%12s %12s %11s %14s\n", "rssi_diff_th", "scanr_exp_ms", "scan_int_ms", "rssi_threshold");
  783. RTW_PRINT_SEL(m, "%-12u %-12u %-11u %-14u\n"
  784. , mlme->roam_rssi_diff_th
  785. , mlme->roam_scanr_exp_ms
  786. , mlme->roam_scan_int_ms
  787. , mlme->roam_rssi_threshold
  788. );
  789. return 0;
  790. }
  791. ssize_t proc_set_roam_param(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  792. {
  793. struct net_device *dev = data;
  794. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  795. struct mlme_priv *mlme = &adapter->mlmepriv;
  796. char tmp[32];
  797. u8 rssi_diff_th;
  798. u32 scanr_exp_ms;
  799. u32 scan_int_ms;
  800. u8 rssi_threshold;
  801. if (count < 1)
  802. return -EFAULT;
  803. if (count > sizeof(tmp)) {
  804. rtw_warn_on(1);
  805. return -EFAULT;
  806. }
  807. if (buffer && !copy_from_user(tmp, buffer, count)) {
  808. int num = sscanf(tmp, "%hhu %u %u %hhu", &rssi_diff_th, &scanr_exp_ms, &scan_int_ms, &rssi_threshold);
  809. if (num >= 1)
  810. mlme->roam_rssi_diff_th = rssi_diff_th;
  811. if (num >= 2)
  812. mlme->roam_scanr_exp_ms = scanr_exp_ms;
  813. if (num >= 3)
  814. mlme->roam_scan_int_ms = scan_int_ms;
  815. if (num >= 4)
  816. mlme->roam_rssi_threshold = rssi_threshold;
  817. }
  818. return count;
  819. }
  820. ssize_t proc_set_roam_tgt_addr(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  821. {
  822. struct net_device *dev = data;
  823. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  824. char tmp[32];
  825. u8 addr[ETH_ALEN];
  826. if (count < 1)
  827. return -EFAULT;
  828. if (count > sizeof(tmp)) {
  829. rtw_warn_on(1);
  830. return -EFAULT;
  831. }
  832. if (buffer && !copy_from_user(tmp, buffer, count)) {
  833. int num = sscanf(tmp, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", addr, addr + 1, addr + 2, addr + 3, addr + 4, addr + 5);
  834. if (num == 6)
  835. _rtw_memcpy(adapter->mlmepriv.roam_tgt_addr, addr, ETH_ALEN);
  836. RTW_INFO("set roam_tgt_addr to "MAC_FMT"\n", MAC_ARG(adapter->mlmepriv.roam_tgt_addr));
  837. }
  838. return count;
  839. }
  840. #endif /* CONFIG_LAYER2_ROAMING */
  841. #ifdef CONFIG_RTW_80211R
  842. ssize_t proc_set_ft_flags(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  843. {
  844. struct net_device *dev = data;
  845. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  846. char tmp[32];
  847. u8 flags;
  848. if (count < 1)
  849. return -EFAULT;
  850. if (count > sizeof(tmp)) {
  851. rtw_warn_on(1);
  852. return -EFAULT;
  853. }
  854. if (buffer && !copy_from_user(tmp, buffer, count)) {
  855. int num = sscanf(tmp, "%hhx", &flags);
  856. if (num == 1)
  857. adapter->mlmepriv.ftpriv.ft_flags = flags;
  858. }
  859. return count;
  860. }
  861. int proc_get_ft_flags(struct seq_file *m, void *v)
  862. {
  863. struct net_device *dev = m->private;
  864. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  865. RTW_PRINT_SEL(m, "0x%02x\n", adapter->mlmepriv.ftpriv.ft_flags);
  866. return 0;
  867. }
  868. #endif
  869. int proc_get_qos_option(struct seq_file *m, void *v)
  870. {
  871. struct net_device *dev = m->private;
  872. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  873. struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  874. RTW_PRINT_SEL(m, "qos_option=%d\n", pmlmepriv->qospriv.qos_option);
  875. return 0;
  876. }
  877. int proc_get_ht_option(struct seq_file *m, void *v)
  878. {
  879. struct net_device *dev = m->private;
  880. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  881. struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  882. #ifdef CONFIG_80211N_HT
  883. RTW_PRINT_SEL(m, "ht_option=%d\n", pmlmepriv->htpriv.ht_option);
  884. #endif /* CONFIG_80211N_HT */
  885. return 0;
  886. }
  887. int proc_get_rf_info(struct seq_file *m, void *v)
  888. {
  889. struct net_device *dev = m->private;
  890. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  891. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  892. RTW_PRINT_SEL(m, "cur_ch=%d, cur_bw=%d, cur_ch_offet=%d\n",
  893. pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset);
  894. RTW_PRINT_SEL(m, "oper_ch=%d, oper_bw=%d, oper_ch_offet=%d\n",
  895. rtw_get_oper_ch(padapter), rtw_get_oper_bw(padapter), rtw_get_oper_choffset(padapter));
  896. return 0;
  897. }
  898. int proc_get_scan_param(struct seq_file *m, void *v)
  899. {
  900. struct net_device *dev = m->private;
  901. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  902. struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;
  903. struct ss_res *ss = &mlmeext->sitesurvey_res;
  904. #define SCAN_PARAM_TITLE_FMT "%10s"
  905. #define SCAN_PARAM_VALUE_FMT "%-10u"
  906. #define SCAN_PARAM_TITLE_ARG , "scan_ch_ms"
  907. #define SCAN_PARAM_VALUE_ARG , ss->scan_ch_ms
  908. #ifdef CONFIG_80211N_HT
  909. #define SCAN_PARAM_TITLE_FMT_HT " %15s %13s"
  910. #define SCAN_PARAM_VALUE_FMT_HT " %-15u %-13u"
  911. #define SCAN_PARAM_TITLE_ARG_HT , "rx_ampdu_accept", "rx_ampdu_size"
  912. #define SCAN_PARAM_VALUE_ARG_HT , ss->rx_ampdu_accept, ss->rx_ampdu_size
  913. #else
  914. #define SCAN_PARAM_TITLE_FMT_HT ""
  915. #define SCAN_PARAM_VALUE_FMT_HT ""
  916. #define SCAN_PARAM_TITLE_ARG_HT
  917. #define SCAN_PARAM_VALUE_ARG_HT
  918. #endif
  919. #ifdef CONFIG_SCAN_BACKOP
  920. #define SCAN_PARAM_TITLE_FMT_BACKOP " %9s %12s"
  921. #define SCAN_PARAM_VALUE_FMT_BACKOP " %-9u %-12u"
  922. #define SCAN_PARAM_TITLE_ARG_BACKOP , "backop_ms", "scan_cnt_max"
  923. #define SCAN_PARAM_VALUE_ARG_BACKOP , ss->backop_ms, ss->scan_cnt_max
  924. #else
  925. #define SCAN_PARAM_TITLE_FMT_BACKOP ""
  926. #define SCAN_PARAM_VALUE_FMT_BACKOP ""
  927. #define SCAN_PARAM_TITLE_ARG_BACKOP
  928. #define SCAN_PARAM_VALUE_ARG_BACKOP
  929. #endif
  930. RTW_PRINT_SEL(m,
  931. SCAN_PARAM_TITLE_FMT
  932. SCAN_PARAM_TITLE_FMT_HT
  933. SCAN_PARAM_TITLE_FMT_BACKOP
  934. "\n"
  935. SCAN_PARAM_TITLE_ARG
  936. SCAN_PARAM_TITLE_ARG_HT
  937. SCAN_PARAM_TITLE_ARG_BACKOP
  938. );
  939. RTW_PRINT_SEL(m,
  940. SCAN_PARAM_VALUE_FMT
  941. SCAN_PARAM_VALUE_FMT_HT
  942. SCAN_PARAM_VALUE_FMT_BACKOP
  943. "\n"
  944. SCAN_PARAM_VALUE_ARG
  945. SCAN_PARAM_VALUE_ARG_HT
  946. SCAN_PARAM_VALUE_ARG_BACKOP
  947. );
  948. return 0;
  949. }
  950. ssize_t proc_set_scan_param(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  951. {
  952. struct net_device *dev = data;
  953. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  954. struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;
  955. struct ss_res *ss = &mlmeext->sitesurvey_res;
  956. char tmp[32] = {0};
  957. u16 scan_ch_ms;
  958. #define SCAN_PARAM_INPUT_FMT "%hu"
  959. #define SCAN_PARAM_INPUT_ARG , &scan_ch_ms
  960. #ifdef CONFIG_80211N_HT
  961. u8 rx_ampdu_accept;
  962. u8 rx_ampdu_size;
  963. #define SCAN_PARAM_INPUT_FMT_HT " %hhu %hhu"
  964. #define SCAN_PARAM_INPUT_ARG_HT , &rx_ampdu_accept, &rx_ampdu_size
  965. #else
  966. #define SCAN_PARAM_INPUT_FMT_HT ""
  967. #define SCAN_PARAM_INPUT_ARG_HT
  968. #endif
  969. #ifdef CONFIG_SCAN_BACKOP
  970. u16 backop_ms;
  971. u8 scan_cnt_max;
  972. #define SCAN_PARAM_INPUT_FMT_BACKOP " %hu %hhu"
  973. #define SCAN_PARAM_INPUT_ARG_BACKOP , &backop_ms, &scan_cnt_max
  974. #else
  975. #define SCAN_PARAM_INPUT_FMT_BACKOP ""
  976. #define SCAN_PARAM_INPUT_ARG_BACKOP
  977. #endif
  978. if (count < 1)
  979. return -EFAULT;
  980. if (count > sizeof(tmp)) {
  981. rtw_warn_on(1);
  982. return -EFAULT;
  983. }
  984. if (buffer && !copy_from_user(tmp, buffer, count)) {
  985. int num = sscanf(tmp,
  986. SCAN_PARAM_INPUT_FMT
  987. SCAN_PARAM_INPUT_FMT_HT
  988. SCAN_PARAM_INPUT_FMT_BACKOP
  989. SCAN_PARAM_INPUT_ARG
  990. SCAN_PARAM_INPUT_ARG_HT
  991. SCAN_PARAM_INPUT_ARG_BACKOP
  992. );
  993. if (num-- > 0)
  994. ss->scan_ch_ms = scan_ch_ms;
  995. #ifdef CONFIG_80211N_HT
  996. if (num-- > 0)
  997. ss->rx_ampdu_accept = rx_ampdu_accept;
  998. if (num-- > 0)
  999. ss->rx_ampdu_size = rx_ampdu_size;
  1000. #endif
  1001. #ifdef CONFIG_SCAN_BACKOP
  1002. if (num-- > 0)
  1003. ss->backop_ms = backop_ms;
  1004. if (num-- > 0)
  1005. ss->scan_cnt_max = scan_cnt_max;
  1006. #endif
  1007. }
  1008. return count;
  1009. }
  1010. int proc_get_scan_abort(struct seq_file *m, void *v)
  1011. {
  1012. struct net_device *dev = m->private;
  1013. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  1014. u32 pass_ms;
  1015. pass_ms = rtw_scan_abort_timeout(adapter, 10000);
  1016. RTW_PRINT_SEL(m, "%u\n", pass_ms);
  1017. return 0;
  1018. }
  1019. #ifdef CONFIG_SCAN_BACKOP
  1020. int proc_get_backop_flags_sta(struct seq_file *m, void *v)
  1021. {
  1022. struct net_device *dev = m->private;
  1023. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  1024. struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;
  1025. RTW_PRINT_SEL(m, "0x%02x\n", mlmeext_scan_backop_flags_sta(mlmeext));
  1026. return 0;
  1027. }
  1028. ssize_t proc_set_backop_flags_sta(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  1029. {
  1030. struct net_device *dev = data;
  1031. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  1032. struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;
  1033. char tmp[32];
  1034. u8 flags;
  1035. if (count < 1)
  1036. return -EFAULT;
  1037. if (count > sizeof(tmp)) {
  1038. rtw_warn_on(1);
  1039. return -EFAULT;
  1040. }
  1041. if (buffer && !copy_from_user(tmp, buffer, count)) {
  1042. int num = sscanf(tmp, "%hhx", &flags);
  1043. if (num == 1)
  1044. mlmeext_assign_scan_backop_flags_sta(mlmeext, flags);
  1045. }
  1046. return count;
  1047. }
  1048. int proc_get_backop_flags_ap(struct seq_file *m, void *v)
  1049. {
  1050. struct net_device *dev = m->private;
  1051. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  1052. struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;
  1053. RTW_PRINT_SEL(m, "0x%02x\n", mlmeext_scan_backop_flags_ap(mlmeext));
  1054. return 0;
  1055. }
  1056. ssize_t proc_set_backop_flags_ap(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  1057. {
  1058. struct net_device *dev = data;
  1059. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  1060. struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;
  1061. char tmp[32];
  1062. u8 flags;
  1063. if (count < 1)
  1064. return -EFAULT;
  1065. if (count > sizeof(tmp)) {
  1066. rtw_warn_on(1);
  1067. return -EFAULT;
  1068. }
  1069. if (buffer && !copy_from_user(tmp, buffer, count)) {
  1070. int num = sscanf(tmp, "%hhx", &flags);
  1071. if (num == 1)
  1072. mlmeext_assign_scan_backop_flags_ap(mlmeext, flags);
  1073. }
  1074. return count;
  1075. }
  1076. #endif /* CONFIG_SCAN_BACKOP */
  1077. int proc_get_survey_info(struct seq_file *m, void *v)
  1078. {
  1079. _irqL irqL;
  1080. struct net_device *dev = m->private;
  1081. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  1082. struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  1083. _queue *queue = &(pmlmepriv->scanned_queue);
  1084. struct wlan_network *pnetwork = NULL;
  1085. _list *plist, *phead;
  1086. s32 notify_signal;
  1087. s16 notify_noise = 0;
  1088. u16 index = 0, ie_cap = 0;
  1089. unsigned char *ie_wpa = NULL, *ie_wpa2 = NULL, *ie_wps = NULL;
  1090. unsigned char *ie_p2p = NULL, *ssid = NULL;
  1091. char flag_str[64];
  1092. int ielen = 0;
  1093. u32 wpsielen = 0;
  1094. _enter_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  1095. phead = get_list_head(queue);
  1096. if (!phead)
  1097. return 0;
  1098. plist = get_next(phead);
  1099. if (!plist)
  1100. return 0;
  1101. RTW_PRINT_SEL(m, "%5s %-17s %3s %-3s %-4s %-4s %5s %32s %32s\n", "index", "bssid", "ch", "RSSI", "SdBm", "Noise", "age", "flag", "ssid");
  1102. while (1) {
  1103. if (rtw_end_of_queue_search(phead, plist) == _TRUE)
  1104. break;
  1105. pnetwork = LIST_CONTAINOR(plist, struct wlan_network, list);
  1106. if (!pnetwork)
  1107. break;
  1108. if (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE &&
  1109. is_same_network(&pmlmepriv->cur_network.network, &pnetwork->network, 0)) {
  1110. notify_signal = translate_percentage_to_dbm(padapter->recvpriv.signal_strength);/* dbm */
  1111. } else {
  1112. notify_signal = translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength);/* dbm */
  1113. }
  1114. #if defined(CONFIG_SIGNAL_DISPLAY_DBM) && defined(CONFIG_BACKGROUND_NOISE_MONITOR)
  1115. rtw_hal_get_odm_var(padapter, HAL_ODM_NOISE_MONITOR, &(pnetwork->network.Configuration.DSConfig), &(notify_noise));
  1116. #endif
  1117. ie_wpa = rtw_get_wpa_ie(&pnetwork->network.IEs[12], &ielen, pnetwork->network.IELength - 12);
  1118. ie_wpa2 = rtw_get_wpa2_ie(&pnetwork->network.IEs[12], &ielen, pnetwork->network.IELength - 12);
  1119. ie_cap = rtw_get_capability(&pnetwork->network);
  1120. ie_wps = rtw_get_wps_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &wpsielen);
  1121. ie_p2p = rtw_get_p2p_ie(&pnetwork->network.IEs[12], pnetwork->network.IELength - 12, NULL, &ielen);
  1122. ssid = pnetwork->network.Ssid.Ssid;
  1123. sprintf(flag_str, "%s%s%s%s%s%s%s",
  1124. (ie_wpa) ? "[WPA]" : "",
  1125. (ie_wpa2) ? "[WPA2]" : "",
  1126. (!ie_wpa && !ie_wpa && ie_cap & BIT(4)) ? "[WEP]" : "",
  1127. (ie_wps) ? "[WPS]" : "",
  1128. (pnetwork->network.InfrastructureMode == Ndis802_11IBSS) ? "[IBSS]" : "",
  1129. (ie_cap & BIT(0)) ? "[ESS]" : "",
  1130. (ie_p2p) ? "[P2P]" : "");
  1131. RTW_PRINT_SEL(m, "%5d "MAC_FMT" %3d %3d %4d %4d %5d %32s %32s\n",
  1132. ++index,
  1133. MAC_ARG(pnetwork->network.MacAddress),
  1134. pnetwork->network.Configuration.DSConfig,
  1135. (int)pnetwork->network.Rssi,
  1136. notify_signal,
  1137. notify_noise,
  1138. rtw_get_passing_time_ms((u32)pnetwork->last_scanned),
  1139. flag_str,
  1140. pnetwork->network.Ssid.Ssid);
  1141. plist = get_next(plist);
  1142. }
  1143. _exit_critical_bh(&(pmlmepriv->scanned_queue.lock), &irqL);
  1144. return 0;
  1145. }
  1146. ssize_t proc_set_survey_info(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  1147. {
  1148. _irqL irqL;
  1149. struct net_device *dev = data;
  1150. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  1151. struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  1152. bool need_indicate_scan_done = _FALSE;
  1153. u8 _status = _FALSE;
  1154. NDIS_802_11_SSID ssid[RTW_SSID_SCAN_AMOUNT];
  1155. if (count < 1)
  1156. return -EFAULT;
  1157. #ifdef CONFIG_MP_INCLUDED
  1158. if (rtw_mi_mp_mode_check(padapter)) {
  1159. RTW_INFO("MP mode block Scan request\n");
  1160. goto exit;
  1161. }
  1162. #endif
  1163. if (rtw_is_scan_deny(padapter)) {
  1164. RTW_INFO(FUNC_ADPT_FMT ": scan deny\n", FUNC_ADPT_ARG(padapter));
  1165. goto exit;
  1166. }
  1167. rtw_ps_deny(padapter, PS_DENY_SCAN);
  1168. if (_FAIL == rtw_pwr_wakeup(padapter))
  1169. goto cancel_ps_deny;
  1170. if (!rtw_is_adapter_up(padapter)) {
  1171. RTW_INFO("scan abort!! adapter cannot use\n");
  1172. goto cancel_ps_deny;
  1173. }
  1174. if (rtw_mi_busy_traffic_check(padapter, _FALSE)) {
  1175. RTW_INFO("scan abort!! BusyTraffic == _TRUE\n");
  1176. goto cancel_ps_deny;
  1177. }
  1178. if (check_fwstate(pmlmepriv, WIFI_AP_STATE) && check_fwstate(pmlmepriv, WIFI_UNDER_WPS)) {
  1179. RTW_INFO("scan abort!! AP mode process WPS\n");
  1180. goto cancel_ps_deny;
  1181. }
  1182. if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING) == _TRUE) {
  1183. RTW_INFO("scan abort!! fwstate=0x%x\n", pmlmepriv->fw_state);
  1184. goto cancel_ps_deny;
  1185. }
  1186. #ifdef CONFIG_CONCURRENT_MODE
  1187. if (rtw_mi_buddy_check_fwstate(padapter,
  1188. _FW_UNDER_SURVEY | _FW_UNDER_LINKING | WIFI_UNDER_WPS)) {
  1189. RTW_INFO("scan abort!! buddy_fwstate check failed\n");
  1190. goto cancel_ps_deny;
  1191. }
  1192. #endif
  1193. _status = rtw_set_802_11_bssid_list_scan(padapter, NULL, 0, NULL, 0);
  1194. cancel_ps_deny:
  1195. rtw_ps_deny_cancel(padapter, PS_DENY_SCAN);
  1196. exit:
  1197. return count;
  1198. }
  1199. int proc_get_ap_info(struct seq_file *m, void *v)
  1200. {
  1201. struct net_device *dev = m->private;
  1202. struct sta_info *psta;
  1203. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  1204. struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  1205. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  1206. struct wlan_network *cur_network = &(pmlmepriv->cur_network);
  1207. struct sta_priv *pstapriv = &padapter->stapriv;
  1208. psta = rtw_get_stainfo(pstapriv, cur_network->network.MacAddress);
  1209. if (psta) {
  1210. int i;
  1211. struct recv_reorder_ctrl *preorder_ctrl;
  1212. RTW_PRINT_SEL(m, "SSID=%s\n", cur_network->network.Ssid.Ssid);
  1213. RTW_PRINT_SEL(m, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr));
  1214. RTW_PRINT_SEL(m, "cur_channel=%d, cur_bwmode=%d, cur_ch_offset=%d\n", pmlmeext->cur_channel, pmlmeext->cur_bwmode, pmlmeext->cur_ch_offset);
  1215. RTW_PRINT_SEL(m, "wireless_mode=0x%x, rtsen=%d, cts2slef=%d\n", psta->wireless_mode, psta->rtsen, psta->cts2self);
  1216. RTW_PRINT_SEL(m, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid);
  1217. #ifdef CONFIG_80211N_HT
  1218. RTW_PRINT_SEL(m, "qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate);
  1219. RTW_PRINT_SEL(m, "bwmode=%d, ch_offset=%d, sgi_20m=%d,sgi_40m=%d\n", psta->bw_mode, psta->htpriv.ch_offset, psta->htpriv.sgi_20m, psta->htpriv.sgi_40m);
  1220. RTW_PRINT_SEL(m, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable);
  1221. RTW_PRINT_SEL(m, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);
  1222. RTW_PRINT_SEL(m, "ldpc_cap=0x%x, stbc_cap=0x%x, beamform_cap=0x%x\n", psta->htpriv.ldpc_cap, psta->htpriv.stbc_cap, psta->htpriv.beamform_cap);
  1223. #endif /* CONFIG_80211N_HT */
  1224. #ifdef CONFIG_80211AC_VHT
  1225. RTW_PRINT_SEL(m, "vht_en=%d, vht_sgi_80m=%d\n", psta->vhtpriv.vht_option, psta->vhtpriv.sgi_80m);
  1226. RTW_PRINT_SEL(m, "vht_ldpc_cap=0x%x, vht_stbc_cap=0x%x, vht_beamform_cap=0x%x\n", psta->vhtpriv.ldpc_cap, psta->vhtpriv.stbc_cap, psta->vhtpriv.beamform_cap);
  1227. RTW_PRINT_SEL(m, "vht_mcs_map=0x%x, vht_highest_rate=0x%x, vht_ampdu_len=%d\n", *(u16 *)psta->vhtpriv.vht_mcs_map, psta->vhtpriv.vht_highest_rate, psta->vhtpriv.ampdu_len);
  1228. #endif
  1229. sta_rx_reorder_ctl_dump(m, psta);
  1230. } else
  1231. RTW_PRINT_SEL(m, "can't get sta's macaddr, cur_network's macaddr:" MAC_FMT "\n", MAC_ARG(cur_network->network.MacAddress));
  1232. return 0;
  1233. }
  1234. ssize_t proc_reset_trx_info(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  1235. {
  1236. struct net_device *dev = data;
  1237. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  1238. struct dvobj_priv *psdpriv = padapter->dvobj;
  1239. struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
  1240. char cmd[32] = {0};
  1241. u8 cnt = 0;
  1242. if (count > sizeof(cmd)) {
  1243. rtw_warn_on(1);
  1244. return -EFAULT;
  1245. }
  1246. if (buffer && !copy_from_user(cmd, buffer, count)) {
  1247. int num = sscanf(cmd, "%hhx", &cnt);
  1248. if (0 == cnt) {
  1249. pdbgpriv->dbg_rx_ampdu_drop_count = 0;
  1250. pdbgpriv->dbg_rx_ampdu_forced_indicate_count = 0;
  1251. pdbgpriv->dbg_rx_ampdu_loss_count = 0;
  1252. pdbgpriv->dbg_rx_dup_mgt_frame_drop_count = 0;
  1253. pdbgpriv->dbg_rx_ampdu_window_shift_cnt = 0;
  1254. pdbgpriv->dbg_rx_conflic_mac_addr_cnt = 0;
  1255. }
  1256. }
  1257. return count;
  1258. }
  1259. int proc_get_trx_info(struct seq_file *m, void *v)
  1260. {
  1261. struct net_device *dev = m->private;
  1262. int i;
  1263. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  1264. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  1265. struct recv_priv *precvpriv = &padapter->recvpriv;
  1266. struct dvobj_priv *psdpriv = padapter->dvobj;
  1267. struct debug_priv *pdbgpriv = &psdpriv->drv_dbg;
  1268. struct hw_xmit *phwxmit;
  1269. dump_os_queue(m, padapter);
  1270. RTW_PRINT_SEL(m, "free_xmitbuf_cnt=%d, free_xmitframe_cnt=%d\n"
  1271. , pxmitpriv->free_xmitbuf_cnt, pxmitpriv->free_xmitframe_cnt);
  1272. RTW_PRINT_SEL(m, "free_ext_xmitbuf_cnt=%d, free_xframe_ext_cnt=%d\n"
  1273. , pxmitpriv->free_xmit_extbuf_cnt, pxmitpriv->free_xframe_ext_cnt);
  1274. RTW_PRINT_SEL(m, "free_recvframe_cnt=%d\n"
  1275. , precvpriv->free_recvframe_cnt);
  1276. for (i = 0; i < 4; i++) {
  1277. phwxmit = pxmitpriv->hwxmits + i;
  1278. RTW_PRINT_SEL(m, "%d, hwq.accnt=%d\n", i, phwxmit->accnt);
  1279. }
  1280. #ifdef CONFIG_USB_HCI
  1281. RTW_PRINT_SEL(m, "rx_urb_pending_cn=%d\n", ATOMIC_READ(&(precvpriv->rx_pending_cnt)));
  1282. #endif
  1283. /* Folowing are RX info */
  1284. /* Counts of packets whose seq_num is less than preorder_ctrl->indicate_seq, Ex delay, retransmission, redundant packets and so on */
  1285. RTW_PRINT_SEL(m, "Rx: Counts of Packets Whose Seq_Num Less Than Reorder Control Seq_Num: %llu\n", (unsigned long long)pdbgpriv->dbg_rx_ampdu_drop_count);
  1286. /* How many times the Rx Reorder Timer is triggered. */
  1287. RTW_PRINT_SEL(m, "Rx: Reorder Time-out Trigger Counts: %llu\n", (unsigned long long)pdbgpriv->dbg_rx_ampdu_forced_indicate_count);
  1288. /* Total counts of packets loss */
  1289. RTW_PRINT_SEL(m, "Rx: Packet Loss Counts: %llu\n", (unsigned long long)pdbgpriv->dbg_rx_ampdu_loss_count);
  1290. RTW_PRINT_SEL(m, "Rx: Duplicate Management Frame Drop Count: %llu\n", (unsigned long long)pdbgpriv->dbg_rx_dup_mgt_frame_drop_count);
  1291. RTW_PRINT_SEL(m, "Rx: AMPDU BA window shift Count: %llu\n", (unsigned long long)pdbgpriv->dbg_rx_ampdu_window_shift_cnt);
  1292. /*The same mac addr counts*/
  1293. RTW_PRINT_SEL(m, "Rx: Conflict MAC Address Frames Count: %llu\n", (unsigned long long)pdbgpriv->dbg_rx_conflic_mac_addr_cnt);
  1294. return 0;
  1295. }
  1296. int proc_get_dis_pwt(struct seq_file *m, void *v)
  1297. {
  1298. struct net_device *dev = m->private;
  1299. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  1300. u8 dis_pwt = 0;
  1301. rtw_hal_get_def_var(padapter, HAL_DEF_DBG_DIS_PWT, &(dis_pwt));
  1302. RTW_PRINT_SEL(m, " Tx Power training mode:%s\n", (dis_pwt == _TRUE) ? "Disable" : "Enable");
  1303. return 0;
  1304. }
  1305. ssize_t proc_set_dis_pwt(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  1306. {
  1307. struct net_device *dev = data;
  1308. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  1309. char tmp[4] = {0};
  1310. u8 dis_pwt = 0;
  1311. if (count < 1)
  1312. return -EFAULT;
  1313. if (count > sizeof(tmp)) {
  1314. rtw_warn_on(1);
  1315. return -EFAULT;
  1316. }
  1317. if (buffer && !copy_from_user(tmp, buffer, count)) {
  1318. int num = sscanf(tmp, "%hhx", &dis_pwt);
  1319. RTW_INFO("Set Tx Power training mode:%s\n", (dis_pwt == _TRUE) ? "Disable" : "Enable");
  1320. if (num >= 1)
  1321. rtw_hal_set_def_var(padapter, HAL_DEF_DBG_DIS_PWT, &(dis_pwt));
  1322. }
  1323. return count;
  1324. }
  1325. int proc_get_rate_ctl(struct seq_file *m, void *v)
  1326. {
  1327. struct net_device *dev = m->private;
  1328. int i;
  1329. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  1330. u8 data_rate = 0, sgi = 0, data_fb = 0;
  1331. if (adapter->fix_rate != 0xff) {
  1332. data_rate = adapter->fix_rate & 0x7F;
  1333. sgi = adapter->fix_rate >> 7;
  1334. data_fb = adapter->data_fb ? 1 : 0;
  1335. RTW_PRINT_SEL(m, "FIXED %s%s%s\n"
  1336. , HDATA_RATE(data_rate)
  1337. , data_rate > DESC_RATE54M ? (sgi ? " SGI" : " LGI") : ""
  1338. , data_fb ? " FB" : ""
  1339. );
  1340. RTW_PRINT_SEL(m, "0x%02x %u\n", adapter->fix_rate, adapter->data_fb);
  1341. } else
  1342. RTW_PRINT_SEL(m, "RA\n");
  1343. return 0;
  1344. }
  1345. ssize_t proc_set_rate_ctl(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  1346. {
  1347. struct net_device *dev = data;
  1348. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  1349. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  1350. char tmp[32];
  1351. u8 fix_rate;
  1352. u8 data_fb;
  1353. if (count < 1)
  1354. return -EFAULT;
  1355. if (count > sizeof(tmp)) {
  1356. rtw_warn_on(1);
  1357. return -EFAULT;
  1358. }
  1359. if (buffer && !copy_from_user(tmp, buffer, count)) {
  1360. int num = sscanf(tmp, "%hhx %hhu", &fix_rate, &data_fb);
  1361. if (num >= 1) {
  1362. u8 fix_rate_ori = adapter->fix_rate;
  1363. adapter->fix_rate = fix_rate;
  1364. if (fix_rate == 0xFF)
  1365. hal_data->ForcedDataRate = 0;
  1366. else
  1367. hal_data->ForcedDataRate = hw_rate_to_m_rate(fix_rate & 0x7F);
  1368. if (adapter->fix_bw != 0xFF && fix_rate_ori != fix_rate)
  1369. rtw_update_tx_rate_bmp(adapter_to_dvobj(adapter));
  1370. }
  1371. if (num >= 2)
  1372. adapter->data_fb = data_fb ? 1 : 0;
  1373. }
  1374. return count;
  1375. }
  1376. int proc_get_tx_power_offset(struct seq_file *m, void *v)
  1377. {
  1378. struct net_device *dev = m->private;
  1379. int i;
  1380. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  1381. RTW_PRINT_SEL(m, "Tx power offset - %u\n", adapter->power_offset);
  1382. return 0;
  1383. }
  1384. ssize_t proc_set_tx_power_offset(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  1385. {
  1386. struct net_device *dev = data;
  1387. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  1388. char tmp[32];
  1389. u8 power_offset = 0;
  1390. if (count < 1)
  1391. return -EFAULT;
  1392. if (count > sizeof(tmp)) {
  1393. rtw_warn_on(1);
  1394. return -EFAULT;
  1395. }
  1396. if (buffer && !copy_from_user(tmp, buffer, count)) {
  1397. int num = sscanf(tmp, "%hhu", &power_offset);
  1398. if (num >= 1) {
  1399. if (power_offset > 5)
  1400. power_offset = 0;
  1401. adapter->power_offset = power_offset;
  1402. }
  1403. }
  1404. return count;
  1405. }
  1406. int proc_get_bw_ctl(struct seq_file *m, void *v)
  1407. {
  1408. struct net_device *dev = m->private;
  1409. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  1410. u8 data_bw = 0;
  1411. if (adapter->fix_bw != 0xff) {
  1412. data_bw = adapter->fix_bw;
  1413. RTW_PRINT_SEL(m, "FIXED %s\n", ch_width_str(data_bw));
  1414. } else
  1415. RTW_PRINT_SEL(m, "Auto\n");
  1416. return 0;
  1417. }
  1418. ssize_t proc_set_bw_ctl(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  1419. {
  1420. struct net_device *dev = data;
  1421. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  1422. char tmp[32];
  1423. u8 fix_bw;
  1424. if (count < 1)
  1425. return -EFAULT;
  1426. if (count > sizeof(tmp)) {
  1427. rtw_warn_on(1);
  1428. return -EFAULT;
  1429. }
  1430. if (buffer && !copy_from_user(tmp, buffer, count)) {
  1431. int num = sscanf(tmp, "%hhu", &fix_bw);
  1432. if (num >= 1) {
  1433. u8 fix_bw_ori = adapter->fix_bw;
  1434. adapter->fix_bw = fix_bw;
  1435. if (adapter->fix_rate != 0xFF && fix_bw_ori != fix_bw)
  1436. rtw_update_tx_rate_bmp(adapter_to_dvobj(adapter));
  1437. }
  1438. }
  1439. return count;
  1440. }
  1441. #ifdef DBG_RX_COUNTER_DUMP
  1442. int proc_get_rx_cnt_dump(struct seq_file *m, void *v)
  1443. {
  1444. struct net_device *dev = m->private;
  1445. int i;
  1446. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  1447. RTW_PRINT_SEL(m, "BIT0- Dump RX counters of DRV\n");
  1448. RTW_PRINT_SEL(m, "BIT1- Dump RX counters of MAC\n");
  1449. RTW_PRINT_SEL(m, "BIT2- Dump RX counters of PHY\n");
  1450. RTW_PRINT_SEL(m, "BIT3- Dump TRX data frame of DRV\n");
  1451. RTW_PRINT_SEL(m, "dump_rx_cnt_mode = 0x%02x\n", adapter->dump_rx_cnt_mode);
  1452. return 0;
  1453. }
  1454. ssize_t proc_set_rx_cnt_dump(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  1455. {
  1456. struct net_device *dev = data;
  1457. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  1458. char tmp[32];
  1459. u8 dump_rx_cnt_mode;
  1460. if (count < 1)
  1461. return -EFAULT;
  1462. if (count > sizeof(tmp)) {
  1463. rtw_warn_on(1);
  1464. return -EFAULT;
  1465. }
  1466. if (buffer && !copy_from_user(tmp, buffer, count)) {
  1467. int num = sscanf(tmp, "%hhx", &dump_rx_cnt_mode);
  1468. rtw_dump_phy_rxcnts_preprocess(adapter, dump_rx_cnt_mode);
  1469. adapter->dump_rx_cnt_mode = dump_rx_cnt_mode;
  1470. }
  1471. return count;
  1472. }
  1473. #endif
  1474. static u8 fwdl_test_chksum_fail = 0;
  1475. static u8 fwdl_test_wintint_rdy_fail = 0;
  1476. bool rtw_fwdl_test_trigger_chksum_fail(void)
  1477. {
  1478. if (fwdl_test_chksum_fail) {
  1479. RTW_PRINT("fwdl test case: trigger chksum_fail\n");
  1480. fwdl_test_chksum_fail--;
  1481. return _TRUE;
  1482. }
  1483. return _FALSE;
  1484. }
  1485. bool rtw_fwdl_test_trigger_wintint_rdy_fail(void)
  1486. {
  1487. if (fwdl_test_wintint_rdy_fail) {
  1488. RTW_PRINT("fwdl test case: trigger wintint_rdy_fail\n");
  1489. fwdl_test_wintint_rdy_fail--;
  1490. return _TRUE;
  1491. }
  1492. return _FALSE;
  1493. }
  1494. ssize_t proc_set_fwdl_test_case(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  1495. {
  1496. struct net_device *dev = data;
  1497. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  1498. char tmp[32];
  1499. int num;
  1500. if (count < 1)
  1501. return -EFAULT;
  1502. if (count > sizeof(tmp)) {
  1503. rtw_warn_on(1);
  1504. return -EFAULT;
  1505. }
  1506. if (buffer && !copy_from_user(tmp, buffer, count))
  1507. num = sscanf(tmp, "%hhu %hhu", &fwdl_test_chksum_fail, &fwdl_test_wintint_rdy_fail);
  1508. return count;
  1509. }
  1510. static u8 del_rx_ampdu_test_no_tx_fail = 0;
  1511. bool rtw_del_rx_ampdu_test_trigger_no_tx_fail(void)
  1512. {
  1513. if (del_rx_ampdu_test_no_tx_fail) {
  1514. RTW_PRINT("del_rx_ampdu test case: trigger no_tx_fail\n");
  1515. del_rx_ampdu_test_no_tx_fail--;
  1516. return _TRUE;
  1517. }
  1518. return _FALSE;
  1519. }
  1520. ssize_t proc_set_del_rx_ampdu_test_case(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  1521. {
  1522. struct net_device *dev = data;
  1523. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  1524. char tmp[32];
  1525. int num;
  1526. if (count < 1)
  1527. return -EFAULT;
  1528. if (count > sizeof(tmp)) {
  1529. rtw_warn_on(1);
  1530. return -EFAULT;
  1531. }
  1532. if (buffer && !copy_from_user(tmp, buffer, count))
  1533. num = sscanf(tmp, "%hhu", &del_rx_ampdu_test_no_tx_fail);
  1534. return count;
  1535. }
  1536. #ifdef CONFIG_DFS_MASTER
  1537. int proc_get_dfs_master_test_case(struct seq_file *m, void *v)
  1538. {
  1539. struct net_device *dev = m->private;
  1540. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  1541. struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
  1542. RTW_PRINT_SEL(m, "%-24s %-19s\n", "radar_detect_trigger_non", "choose_dfs_ch_first");
  1543. RTW_PRINT_SEL(m, "%24hhu %19hhu\n"
  1544. , rfctl->dbg_dfs_master_radar_detect_trigger_non
  1545. , rfctl->dbg_dfs_master_choose_dfs_ch_first
  1546. );
  1547. return 0;
  1548. }
  1549. ssize_t proc_set_dfs_master_test_case(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  1550. {
  1551. struct net_device *dev = data;
  1552. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  1553. struct rf_ctl_t *rfctl = adapter_to_rfctl(adapter);
  1554. char tmp[32];
  1555. u8 radar_detect_trigger_non;
  1556. u8 choose_dfs_ch_first;
  1557. if (count < 1)
  1558. return -EFAULT;
  1559. if (count > sizeof(tmp)) {
  1560. rtw_warn_on(1);
  1561. return -EFAULT;
  1562. }
  1563. if (buffer && !copy_from_user(tmp, buffer, count)) {
  1564. int num = sscanf(tmp, "%hhu %hhu", &radar_detect_trigger_non, &choose_dfs_ch_first);
  1565. if (num >= 1)
  1566. rfctl->dbg_dfs_master_radar_detect_trigger_non = radar_detect_trigger_non;
  1567. if (num >= 2)
  1568. rfctl->dbg_dfs_master_choose_dfs_ch_first = choose_dfs_ch_first;
  1569. }
  1570. return count;
  1571. }
  1572. #endif /* CONFIG_DFS_MASTER */
  1573. static u32 g_wait_hiq_empty_ms = 0;
  1574. u32 rtw_get_wait_hiq_empty_ms(void)
  1575. {
  1576. return g_wait_hiq_empty_ms;
  1577. }
  1578. ssize_t proc_set_wait_hiq_empty(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  1579. {
  1580. struct net_device *dev = data;
  1581. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  1582. char tmp[32];
  1583. int num;
  1584. if (count < 1)
  1585. return -EFAULT;
  1586. if (count > sizeof(tmp)) {
  1587. rtw_warn_on(1);
  1588. return -EFAULT;
  1589. }
  1590. if (buffer && !copy_from_user(tmp, buffer, count))
  1591. num = sscanf(tmp, "%u", &g_wait_hiq_empty_ms);
  1592. return count;
  1593. }
  1594. static u32 sta_linking_test_start_time = 0;
  1595. static u32 sta_linking_test_wait_ms = 0;
  1596. static u8 sta_linking_test_force_fail = 0;
  1597. void rtw_sta_linking_test_set_start(void)
  1598. {
  1599. sta_linking_test_start_time = rtw_get_current_time();
  1600. }
  1601. bool rtw_sta_linking_test_wait_done(void)
  1602. {
  1603. return rtw_get_passing_time_ms(sta_linking_test_start_time) >= sta_linking_test_wait_ms;
  1604. }
  1605. bool rtw_sta_linking_test_force_fail(void)
  1606. {
  1607. return sta_linking_test_force_fail;
  1608. }
  1609. ssize_t proc_set_sta_linking_test(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  1610. {
  1611. struct net_device *dev = data;
  1612. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  1613. char tmp[32];
  1614. if (count < 1)
  1615. return -EFAULT;
  1616. if (count > sizeof(tmp)) {
  1617. rtw_warn_on(1);
  1618. return -EFAULT;
  1619. }
  1620. if (buffer && !copy_from_user(tmp, buffer, count)) {
  1621. u32 wait_ms = 0;
  1622. u8 force_fail = 0;
  1623. int num = sscanf(tmp, "%u %hhu", &wait_ms, &force_fail);
  1624. if (num >= 1)
  1625. sta_linking_test_wait_ms = wait_ms;
  1626. if (num >= 2)
  1627. sta_linking_test_force_fail = force_fail;
  1628. }
  1629. return count;
  1630. }
  1631. int proc_get_ps_dbg_info(struct seq_file *m, void *v)
  1632. {
  1633. struct net_device *dev = m->private;
  1634. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  1635. struct dvobj_priv *dvobj = padapter->dvobj;
  1636. struct debug_priv *pdbgpriv = &dvobj->drv_dbg;
  1637. RTW_PRINT_SEL(m, "dbg_sdio_alloc_irq_cnt=%d\n", pdbgpriv->dbg_sdio_alloc_irq_cnt);
  1638. RTW_PRINT_SEL(m, "dbg_sdio_free_irq_cnt=%d\n", pdbgpriv->dbg_sdio_free_irq_cnt);
  1639. RTW_PRINT_SEL(m, "dbg_sdio_alloc_irq_error_cnt=%d\n", pdbgpriv->dbg_sdio_alloc_irq_error_cnt);
  1640. RTW_PRINT_SEL(m, "dbg_sdio_free_irq_error_cnt=%d\n", pdbgpriv->dbg_sdio_free_irq_error_cnt);
  1641. RTW_PRINT_SEL(m, "dbg_sdio_init_error_cnt=%d\n", pdbgpriv->dbg_sdio_init_error_cnt);
  1642. RTW_PRINT_SEL(m, "dbg_sdio_deinit_error_cnt=%d\n", pdbgpriv->dbg_sdio_deinit_error_cnt);
  1643. RTW_PRINT_SEL(m, "dbg_suspend_error_cnt=%d\n", pdbgpriv->dbg_suspend_error_cnt);
  1644. RTW_PRINT_SEL(m, "dbg_suspend_cnt=%d\n", pdbgpriv->dbg_suspend_cnt);
  1645. RTW_PRINT_SEL(m, "dbg_resume_cnt=%d\n", pdbgpriv->dbg_resume_cnt);
  1646. RTW_PRINT_SEL(m, "dbg_resume_error_cnt=%d\n", pdbgpriv->dbg_resume_error_cnt);
  1647. RTW_PRINT_SEL(m, "dbg_deinit_fail_cnt=%d\n", pdbgpriv->dbg_deinit_fail_cnt);
  1648. RTW_PRINT_SEL(m, "dbg_carddisable_cnt=%d\n", pdbgpriv->dbg_carddisable_cnt);
  1649. RTW_PRINT_SEL(m, "dbg_ps_insuspend_cnt=%d\n", pdbgpriv->dbg_ps_insuspend_cnt);
  1650. RTW_PRINT_SEL(m, "dbg_dev_unload_inIPS_cnt=%d\n", pdbgpriv->dbg_dev_unload_inIPS_cnt);
  1651. RTW_PRINT_SEL(m, "dbg_scan_pwr_state_cnt=%d\n", pdbgpriv->dbg_scan_pwr_state_cnt);
  1652. RTW_PRINT_SEL(m, "dbg_downloadfw_pwr_state_cnt=%d\n", pdbgpriv->dbg_downloadfw_pwr_state_cnt);
  1653. RTW_PRINT_SEL(m, "dbg_carddisable_error_cnt=%d\n", pdbgpriv->dbg_carddisable_error_cnt);
  1654. RTW_PRINT_SEL(m, "dbg_fw_read_ps_state_fail_cnt=%d\n", pdbgpriv->dbg_fw_read_ps_state_fail_cnt);
  1655. RTW_PRINT_SEL(m, "dbg_leave_ips_fail_cnt=%d\n", pdbgpriv->dbg_leave_ips_fail_cnt);
  1656. RTW_PRINT_SEL(m, "dbg_leave_lps_fail_cnt=%d\n", pdbgpriv->dbg_leave_lps_fail_cnt);
  1657. RTW_PRINT_SEL(m, "dbg_h2c_leave32k_fail_cnt=%d\n", pdbgpriv->dbg_h2c_leave32k_fail_cnt);
  1658. RTW_PRINT_SEL(m, "dbg_diswow_dload_fw_fail_cnt=%d\n", pdbgpriv->dbg_diswow_dload_fw_fail_cnt);
  1659. RTW_PRINT_SEL(m, "dbg_enwow_dload_fw_fail_cnt=%d\n", pdbgpriv->dbg_enwow_dload_fw_fail_cnt);
  1660. RTW_PRINT_SEL(m, "dbg_ips_drvopen_fail_cnt=%d\n", pdbgpriv->dbg_ips_drvopen_fail_cnt);
  1661. RTW_PRINT_SEL(m, "dbg_poll_fail_cnt=%d\n", pdbgpriv->dbg_poll_fail_cnt);
  1662. RTW_PRINT_SEL(m, "dbg_rpwm_toogle_cnt=%d\n", pdbgpriv->dbg_rpwm_toogle_cnt);
  1663. RTW_PRINT_SEL(m, "dbg_rpwm_timeout_fail_cnt=%d\n", pdbgpriv->dbg_rpwm_timeout_fail_cnt);
  1664. RTW_PRINT_SEL(m, "dbg_sreset_cnt=%d\n", pdbgpriv->dbg_sreset_cnt);
  1665. RTW_PRINT_SEL(m, "dbg_fw_mem_dl_error_cnt=%d\n", pdbgpriv->dbg_fw_mem_dl_error_cnt);
  1666. return 0;
  1667. }
  1668. ssize_t proc_set_ps_dbg_info(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  1669. {
  1670. struct net_device *dev = data;
  1671. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  1672. struct dvobj_priv *dvobj = adapter->dvobj;
  1673. struct debug_priv *pdbgpriv = &dvobj->drv_dbg;
  1674. char tmp[32];
  1675. u8 ps_dbg_cmd_id;
  1676. if (count < 1)
  1677. return -EFAULT;
  1678. if (count > sizeof(tmp)) {
  1679. rtw_warn_on(1);
  1680. return -EFAULT;
  1681. }
  1682. if (buffer && !copy_from_user(tmp, buffer, count)) {
  1683. int num = sscanf(tmp, "%hhx", &ps_dbg_cmd_id);
  1684. if (ps_dbg_cmd_id == 1) /*Clean all*/
  1685. _rtw_memset(pdbgpriv, 0, sizeof(struct debug_priv));
  1686. }
  1687. return count;
  1688. }
  1689. #ifdef CONFIG_DBG_COUNTER
  1690. int proc_get_rx_logs(struct seq_file *m, void *v)
  1691. {
  1692. struct net_device *dev = m->private;
  1693. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  1694. struct rx_logs *rx_logs = &padapter->rx_logs;
  1695. RTW_PRINT_SEL(m,
  1696. "intf_rx=%d\n"
  1697. "intf_rx_err_recvframe=%d\n"
  1698. "intf_rx_err_skb=%d\n"
  1699. "intf_rx_report=%d\n"
  1700. "core_rx=%d\n"
  1701. "core_rx_pre=%d\n"
  1702. "core_rx_pre_ver_err=%d\n"
  1703. "core_rx_pre_mgmt=%d\n"
  1704. "core_rx_pre_mgmt_err_80211w=%d\n"
  1705. "core_rx_pre_mgmt_err=%d\n"
  1706. "core_rx_pre_ctrl=%d\n"
  1707. "core_rx_pre_ctrl_err=%d\n"
  1708. "core_rx_pre_data=%d\n"
  1709. "core_rx_pre_data_wapi_seq_err=%d\n"
  1710. "core_rx_pre_data_wapi_key_err=%d\n"
  1711. "core_rx_pre_data_handled=%d\n"
  1712. "core_rx_pre_data_err=%d\n"
  1713. "core_rx_pre_data_unknown=%d\n"
  1714. "core_rx_pre_unknown=%d\n"
  1715. "core_rx_enqueue=%d\n"
  1716. "core_rx_dequeue=%d\n"
  1717. "core_rx_post=%d\n"
  1718. "core_rx_post_decrypt=%d\n"
  1719. "core_rx_post_decrypt_wep=%d\n"
  1720. "core_rx_post_decrypt_tkip=%d\n"
  1721. "core_rx_post_decrypt_aes=%d\n"
  1722. "core_rx_post_decrypt_wapi=%d\n"
  1723. "core_rx_post_decrypt_hw=%d\n"
  1724. "core_rx_post_decrypt_unknown=%d\n"
  1725. "core_rx_post_decrypt_err=%d\n"
  1726. "core_rx_post_defrag_err=%d\n"
  1727. "core_rx_post_portctrl_err=%d\n"
  1728. "core_rx_post_indicate=%d\n"
  1729. "core_rx_post_indicate_in_oder=%d\n"
  1730. "core_rx_post_indicate_reoder=%d\n"
  1731. "core_rx_post_indicate_err=%d\n"
  1732. "os_indicate=%d\n"
  1733. "os_indicate_ap_mcast=%d\n"
  1734. "os_indicate_ap_forward=%d\n"
  1735. "os_indicate_ap_self=%d\n"
  1736. "os_indicate_err=%d\n"
  1737. "os_netif_ok=%d\n"
  1738. "os_netif_err=%d\n",
  1739. rx_logs->intf_rx,
  1740. rx_logs->intf_rx_err_recvframe,
  1741. rx_logs->intf_rx_err_skb,
  1742. rx_logs->intf_rx_report,
  1743. rx_logs->core_rx,
  1744. rx_logs->core_rx_pre,
  1745. rx_logs->core_rx_pre_ver_err,
  1746. rx_logs->core_rx_pre_mgmt,
  1747. rx_logs->core_rx_pre_mgmt_err_80211w,
  1748. rx_logs->core_rx_pre_mgmt_err,
  1749. rx_logs->core_rx_pre_ctrl,
  1750. rx_logs->core_rx_pre_ctrl_err,
  1751. rx_logs->core_rx_pre_data,
  1752. rx_logs->core_rx_pre_data_wapi_seq_err,
  1753. rx_logs->core_rx_pre_data_wapi_key_err,
  1754. rx_logs->core_rx_pre_data_handled,
  1755. rx_logs->core_rx_pre_data_err,
  1756. rx_logs->core_rx_pre_data_unknown,
  1757. rx_logs->core_rx_pre_unknown,
  1758. rx_logs->core_rx_enqueue,
  1759. rx_logs->core_rx_dequeue,
  1760. rx_logs->core_rx_post,
  1761. rx_logs->core_rx_post_decrypt,
  1762. rx_logs->core_rx_post_decrypt_wep,
  1763. rx_logs->core_rx_post_decrypt_tkip,
  1764. rx_logs->core_rx_post_decrypt_aes,
  1765. rx_logs->core_rx_post_decrypt_wapi,
  1766. rx_logs->core_rx_post_decrypt_hw,
  1767. rx_logs->core_rx_post_decrypt_unknown,
  1768. rx_logs->core_rx_post_decrypt_err,
  1769. rx_logs->core_rx_post_defrag_err,
  1770. rx_logs->core_rx_post_portctrl_err,
  1771. rx_logs->core_rx_post_indicate,
  1772. rx_logs->core_rx_post_indicate_in_oder,
  1773. rx_logs->core_rx_post_indicate_reoder,
  1774. rx_logs->core_rx_post_indicate_err,
  1775. rx_logs->os_indicate,
  1776. rx_logs->os_indicate_ap_mcast,
  1777. rx_logs->os_indicate_ap_forward,
  1778. rx_logs->os_indicate_ap_self,
  1779. rx_logs->os_indicate_err,
  1780. rx_logs->os_netif_ok,
  1781. rx_logs->os_netif_err
  1782. );
  1783. return 0;
  1784. }
  1785. int proc_get_tx_logs(struct seq_file *m, void *v)
  1786. {
  1787. struct net_device *dev = m->private;
  1788. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  1789. struct tx_logs *tx_logs = &padapter->tx_logs;
  1790. RTW_PRINT_SEL(m,
  1791. "os_tx=%d\n"
  1792. "os_tx_err_up=%d\n"
  1793. "os_tx_err_xmit=%d\n"
  1794. "os_tx_m2u=%d\n"
  1795. "os_tx_m2u_ignore_fw_linked=%d\n"
  1796. "os_tx_m2u_ignore_self=%d\n"
  1797. "os_tx_m2u_entry=%d\n"
  1798. "os_tx_m2u_entry_err_xmit=%d\n"
  1799. "os_tx_m2u_entry_err_skb=%d\n"
  1800. "os_tx_m2u_stop=%d\n"
  1801. "core_tx=%d\n"
  1802. "core_tx_err_pxmitframe=%d\n"
  1803. "core_tx_err_brtx=%d\n"
  1804. "core_tx_upd_attrib=%d\n"
  1805. "core_tx_upd_attrib_adhoc=%d\n"
  1806. "core_tx_upd_attrib_sta=%d\n"
  1807. "core_tx_upd_attrib_ap=%d\n"
  1808. "core_tx_upd_attrib_unknown=%d\n"
  1809. "core_tx_upd_attrib_dhcp=%d\n"
  1810. "core_tx_upd_attrib_icmp=%d\n"
  1811. "core_tx_upd_attrib_active=%d\n"
  1812. "core_tx_upd_attrib_err_ucast_sta=%d\n"
  1813. "core_tx_upd_attrib_err_ucast_ap_link=%d\n"
  1814. "core_tx_upd_attrib_err_sta=%d\n"
  1815. "core_tx_upd_attrib_err_link=%d\n"
  1816. "core_tx_upd_attrib_err_sec=%d\n"
  1817. "core_tx_ap_enqueue_warn_fwstate=%d\n"
  1818. "core_tx_ap_enqueue_warn_sta=%d\n"
  1819. "core_tx_ap_enqueue_warn_nosta=%d\n"
  1820. "core_tx_ap_enqueue_warn_link=%d\n"
  1821. "core_tx_ap_enqueue_warn_trigger=%d\n"
  1822. "core_tx_ap_enqueue_mcast=%d\n"
  1823. "core_tx_ap_enqueue_ucast=%d\n"
  1824. "core_tx_ap_enqueue=%d\n"
  1825. "intf_tx=%d\n"
  1826. "intf_tx_pending_ac=%d\n"
  1827. "intf_tx_pending_fw_under_survey=%d\n"
  1828. "intf_tx_pending_fw_under_linking=%d\n"
  1829. "intf_tx_pending_xmitbuf=%d\n"
  1830. "intf_tx_enqueue=%d\n"
  1831. "core_tx_enqueue=%d\n"
  1832. "core_tx_enqueue_class=%d\n"
  1833. "core_tx_enqueue_class_err_sta=%d\n"
  1834. "core_tx_enqueue_class_err_nosta=%d\n"
  1835. "core_tx_enqueue_class_err_fwlink=%d\n"
  1836. "intf_tx_direct=%d\n"
  1837. "intf_tx_direct_err_coalesce=%d\n"
  1838. "intf_tx_dequeue=%d\n"
  1839. "intf_tx_dequeue_err_coalesce=%d\n"
  1840. "intf_tx_dump_xframe=%d\n"
  1841. "intf_tx_dump_xframe_err_txdesc=%d\n"
  1842. "intf_tx_dump_xframe_err_port=%d\n",
  1843. tx_logs->os_tx,
  1844. tx_logs->os_tx_err_up,
  1845. tx_logs->os_tx_err_xmit,
  1846. tx_logs->os_tx_m2u,
  1847. tx_logs->os_tx_m2u_ignore_fw_linked,
  1848. tx_logs->os_tx_m2u_ignore_self,
  1849. tx_logs->os_tx_m2u_entry,
  1850. tx_logs->os_tx_m2u_entry_err_xmit,
  1851. tx_logs->os_tx_m2u_entry_err_skb,
  1852. tx_logs->os_tx_m2u_stop,
  1853. tx_logs->core_tx,
  1854. tx_logs->core_tx_err_pxmitframe,
  1855. tx_logs->core_tx_err_brtx,
  1856. tx_logs->core_tx_upd_attrib,
  1857. tx_logs->core_tx_upd_attrib_adhoc,
  1858. tx_logs->core_tx_upd_attrib_sta,
  1859. tx_logs->core_tx_upd_attrib_ap,
  1860. tx_logs->core_tx_upd_attrib_unknown,
  1861. tx_logs->core_tx_upd_attrib_dhcp,
  1862. tx_logs->core_tx_upd_attrib_icmp,
  1863. tx_logs->core_tx_upd_attrib_active,
  1864. tx_logs->core_tx_upd_attrib_err_ucast_sta,
  1865. tx_logs->core_tx_upd_attrib_err_ucast_ap_link,
  1866. tx_logs->core_tx_upd_attrib_err_sta,
  1867. tx_logs->core_tx_upd_attrib_err_link,
  1868. tx_logs->core_tx_upd_attrib_err_sec,
  1869. tx_logs->core_tx_ap_enqueue_warn_fwstate,
  1870. tx_logs->core_tx_ap_enqueue_warn_sta,
  1871. tx_logs->core_tx_ap_enqueue_warn_nosta,
  1872. tx_logs->core_tx_ap_enqueue_warn_link,
  1873. tx_logs->core_tx_ap_enqueue_warn_trigger,
  1874. tx_logs->core_tx_ap_enqueue_mcast,
  1875. tx_logs->core_tx_ap_enqueue_ucast,
  1876. tx_logs->core_tx_ap_enqueue,
  1877. tx_logs->intf_tx,
  1878. tx_logs->intf_tx_pending_ac,
  1879. tx_logs->intf_tx_pending_fw_under_survey,
  1880. tx_logs->intf_tx_pending_fw_under_linking,
  1881. tx_logs->intf_tx_pending_xmitbuf,
  1882. tx_logs->intf_tx_enqueue,
  1883. tx_logs->core_tx_enqueue,
  1884. tx_logs->core_tx_enqueue_class,
  1885. tx_logs->core_tx_enqueue_class_err_sta,
  1886. tx_logs->core_tx_enqueue_class_err_nosta,
  1887. tx_logs->core_tx_enqueue_class_err_fwlink,
  1888. tx_logs->intf_tx_direct,
  1889. tx_logs->intf_tx_direct_err_coalesce,
  1890. tx_logs->intf_tx_dequeue,
  1891. tx_logs->intf_tx_dequeue_err_coalesce,
  1892. tx_logs->intf_tx_dump_xframe,
  1893. tx_logs->intf_tx_dump_xframe_err_txdesc,
  1894. tx_logs->intf_tx_dump_xframe_err_port
  1895. );
  1896. return 0;
  1897. }
  1898. int proc_get_int_logs(struct seq_file *m, void *v)
  1899. {
  1900. struct net_device *dev = m->private;
  1901. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  1902. RTW_PRINT_SEL(m,
  1903. "all=%d\n"
  1904. "err=%d\n"
  1905. "tbdok=%d\n"
  1906. "tbder=%d\n"
  1907. "bcnderr=%d\n"
  1908. "bcndma=%d\n"
  1909. "bcndma_e=%d\n"
  1910. "rx=%d\n"
  1911. "rx_rdu=%d\n"
  1912. "rx_fovw=%d\n"
  1913. "txfovw=%d\n"
  1914. "mgntok=%d\n"
  1915. "highdok=%d\n"
  1916. "bkdok=%d\n"
  1917. "bedok=%d\n"
  1918. "vidok=%d\n"
  1919. "vodok=%d\n",
  1920. padapter->int_logs.all,
  1921. padapter->int_logs.err,
  1922. padapter->int_logs.tbdok,
  1923. padapter->int_logs.tbder,
  1924. padapter->int_logs.bcnderr,
  1925. padapter->int_logs.bcndma,
  1926. padapter->int_logs.bcndma_e,
  1927. padapter->int_logs.rx,
  1928. padapter->int_logs.rx_rdu,
  1929. padapter->int_logs.rx_fovw,
  1930. padapter->int_logs.txfovw,
  1931. padapter->int_logs.mgntok,
  1932. padapter->int_logs.highdok,
  1933. padapter->int_logs.bkdok,
  1934. padapter->int_logs.bedok,
  1935. padapter->int_logs.vidok,
  1936. padapter->int_logs.vodok
  1937. );
  1938. return 0;
  1939. }
  1940. #endif /* CONFIG_DBG_COUNTER */
  1941. int proc_get_hw_status(struct seq_file *m, void *v)
  1942. {
  1943. struct net_device *dev = m->private;
  1944. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  1945. struct dvobj_priv *dvobj = padapter->dvobj;
  1946. struct debug_priv *pdbgpriv = &dvobj->drv_dbg;
  1947. struct registry_priv *regsty = dvobj_to_regsty(dvobj);
  1948. if (regsty->check_hw_status == 0)
  1949. RTW_PRINT_SEL(m, "RX FIFO full count: not check in watch dog\n");
  1950. else if (pdbgpriv->dbg_rx_fifo_last_overflow == 1
  1951. && pdbgpriv->dbg_rx_fifo_curr_overflow == 1
  1952. && pdbgpriv->dbg_rx_fifo_diff_overflow == 1
  1953. )
  1954. RTW_PRINT_SEL(m, "RX FIFO full count: no implementation\n");
  1955. else {
  1956. RTW_PRINT_SEL(m, "RX FIFO full count: last_time=%llu, current_time=%llu, differential=%llu\n"
  1957. , pdbgpriv->dbg_rx_fifo_last_overflow, pdbgpriv->dbg_rx_fifo_curr_overflow, pdbgpriv->dbg_rx_fifo_diff_overflow);
  1958. }
  1959. return 0;
  1960. }
  1961. ssize_t proc_set_hw_status(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  1962. {
  1963. struct net_device *dev = data;
  1964. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  1965. struct dvobj_priv *dvobj = padapter->dvobj;
  1966. struct registry_priv *regsty = dvobj_to_regsty(dvobj);
  1967. char tmp[32];
  1968. u32 enable;
  1969. if (count < 1)
  1970. return -EFAULT;
  1971. if (count > sizeof(tmp)) {
  1972. rtw_warn_on(1);
  1973. return -EFAULT;
  1974. }
  1975. if (buffer && !copy_from_user(tmp, buffer, count)) {
  1976. int num = sscanf(tmp, "%d ", &enable);
  1977. if (regsty && enable <= 1) {
  1978. regsty->check_hw_status = enable;
  1979. RTW_INFO("check_hw_status=%d\n", regsty->check_hw_status);
  1980. }
  1981. }
  1982. return count;
  1983. }
  1984. int proc_get_trx_info_debug(struct seq_file *m, void *v)
  1985. {
  1986. struct net_device *dev = m->private;
  1987. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  1988. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  1989. int i;
  1990. /*============ tx info ============ */
  1991. rtw_hal_get_def_var(padapter, HW_DEF_RA_INFO_DUMP, m);
  1992. /*============ rx info ============ */
  1993. rtw_hal_set_odm_var(padapter, HAL_ODM_RX_INFO_DUMP, m, _FALSE);
  1994. return 0;
  1995. }
  1996. int proc_get_rx_signal(struct seq_file *m, void *v)
  1997. {
  1998. struct net_device *dev = m->private;
  1999. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2000. struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  2001. RTW_PRINT_SEL(m, "rssi:%d\n", padapter->recvpriv.rssi);
  2002. /* RTW_PRINT_SEL(m, "rxpwdb:%d\n", padapter->recvpriv.rxpwdb); */
  2003. RTW_PRINT_SEL(m, "signal_strength:%u\n", padapter->recvpriv.signal_strength);
  2004. RTW_PRINT_SEL(m, "signal_qual:%u\n", padapter->recvpriv.signal_qual);
  2005. if (padapter->registrypriv.mp_mode == 1) {
  2006. if (padapter->mppriv.antenna_rx == ANTENNA_A)
  2007. RTW_PRINT_SEL(m, "Antenna: A\n");
  2008. else if (padapter->mppriv.antenna_rx == ANTENNA_B)
  2009. RTW_PRINT_SEL(m, "Antenna: B\n");
  2010. else if (padapter->mppriv.antenna_rx == ANTENNA_C)
  2011. RTW_PRINT_SEL(m, "Antenna: C\n");
  2012. else if (padapter->mppriv.antenna_rx == ANTENNA_D)
  2013. RTW_PRINT_SEL(m, "Antenna: D\n");
  2014. else if (padapter->mppriv.antenna_rx == ANTENNA_AB)
  2015. RTW_PRINT_SEL(m, "Antenna: AB\n");
  2016. else if (padapter->mppriv.antenna_rx == ANTENNA_BC)
  2017. RTW_PRINT_SEL(m, "Antenna: BC\n");
  2018. else if (padapter->mppriv.antenna_rx == ANTENNA_CD)
  2019. RTW_PRINT_SEL(m, "Antenna: CD\n");
  2020. else
  2021. RTW_PRINT_SEL(m, "Antenna: __\n");
  2022. return 0;
  2023. }
  2024. rtw_get_noise(padapter);
  2025. RTW_PRINT_SEL(m, "noise:%d\n", padapter->recvpriv.noise);
  2026. #ifdef DBG_RX_SIGNAL_DISPLAY_RAW_DATA
  2027. rtw_odm_get_perpkt_rssi(m, padapter);
  2028. rtw_get_raw_rssi_info(m, padapter);
  2029. #endif
  2030. return 0;
  2031. }
  2032. ssize_t proc_set_rx_signal(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  2033. {
  2034. struct net_device *dev = data;
  2035. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2036. char tmp[32];
  2037. u32 is_signal_dbg, signal_strength;
  2038. if (count < 1)
  2039. return -EFAULT;
  2040. if (count > sizeof(tmp)) {
  2041. rtw_warn_on(1);
  2042. return -EFAULT;
  2043. }
  2044. if (buffer && !copy_from_user(tmp, buffer, count)) {
  2045. int num = sscanf(tmp, "%u %u", &is_signal_dbg, &signal_strength);
  2046. is_signal_dbg = is_signal_dbg == 0 ? 0 : 1;
  2047. if (is_signal_dbg && num != 2)
  2048. return count;
  2049. signal_strength = signal_strength > 100 ? 100 : signal_strength;
  2050. padapter->recvpriv.is_signal_dbg = is_signal_dbg;
  2051. padapter->recvpriv.signal_strength_dbg = signal_strength;
  2052. if (is_signal_dbg)
  2053. RTW_INFO("set %s %u\n", "DBG_SIGNAL_STRENGTH", signal_strength);
  2054. else
  2055. RTW_INFO("set %s\n", "HW_SIGNAL_STRENGTH");
  2056. }
  2057. return count;
  2058. }
  2059. #ifdef CONFIG_80211N_HT
  2060. int proc_get_ht_enable(struct seq_file *m, void *v)
  2061. {
  2062. struct net_device *dev = m->private;
  2063. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2064. struct registry_priv *pregpriv = &padapter->registrypriv;
  2065. if (pregpriv)
  2066. RTW_PRINT_SEL(m, "%d\n", pregpriv->ht_enable);
  2067. return 0;
  2068. }
  2069. ssize_t proc_set_ht_enable(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  2070. {
  2071. struct net_device *dev = data;
  2072. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2073. struct registry_priv *pregpriv = &padapter->registrypriv;
  2074. char tmp[32];
  2075. u32 mode;
  2076. if (count < 1)
  2077. return -EFAULT;
  2078. if (count > sizeof(tmp)) {
  2079. rtw_warn_on(1);
  2080. return -EFAULT;
  2081. }
  2082. if (buffer && !copy_from_user(tmp, buffer, count)) {
  2083. int num = sscanf(tmp, "%d ", &mode);
  2084. if (pregpriv && mode < 2) {
  2085. pregpriv->ht_enable = mode;
  2086. RTW_INFO("ht_enable=%d\n", pregpriv->ht_enable);
  2087. }
  2088. }
  2089. return count;
  2090. }
  2091. int proc_get_bw_mode(struct seq_file *m, void *v)
  2092. {
  2093. struct net_device *dev = m->private;
  2094. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2095. struct registry_priv *pregpriv = &padapter->registrypriv;
  2096. if (pregpriv)
  2097. RTW_PRINT_SEL(m, "0x%02x\n", pregpriv->bw_mode);
  2098. return 0;
  2099. }
  2100. ssize_t proc_set_bw_mode(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  2101. {
  2102. struct net_device *dev = data;
  2103. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2104. struct registry_priv *pregpriv = &padapter->registrypriv;
  2105. char tmp[32];
  2106. u32 mode;
  2107. u8 bw_2g;
  2108. u8 bw_5g;
  2109. if (count < 1)
  2110. return -EFAULT;
  2111. if (count > sizeof(tmp)) {
  2112. rtw_warn_on(1);
  2113. return -EFAULT;
  2114. }
  2115. if (buffer && !copy_from_user(tmp, buffer, count)) {
  2116. int num = sscanf(tmp, "%x ", &mode);
  2117. bw_5g = mode >> 4;
  2118. bw_2g = mode & 0x0f;
  2119. if (pregpriv && bw_2g <= 4 && bw_5g <= 4) {
  2120. pregpriv->bw_mode = mode;
  2121. printk("bw_mode=0x%x\n", mode);
  2122. }
  2123. }
  2124. return count;
  2125. }
  2126. int proc_get_ampdu_enable(struct seq_file *m, void *v)
  2127. {
  2128. struct net_device *dev = m->private;
  2129. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2130. struct registry_priv *pregpriv = &padapter->registrypriv;
  2131. if (pregpriv)
  2132. RTW_PRINT_SEL(m, "%d\n", pregpriv->ampdu_enable);
  2133. return 0;
  2134. }
  2135. ssize_t proc_set_ampdu_enable(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  2136. {
  2137. struct net_device *dev = data;
  2138. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2139. struct registry_priv *pregpriv = &padapter->registrypriv;
  2140. char tmp[32];
  2141. u32 mode;
  2142. if (count < 1)
  2143. return -EFAULT;
  2144. if (count > sizeof(tmp)) {
  2145. rtw_warn_on(1);
  2146. return -EFAULT;
  2147. }
  2148. if (buffer && !copy_from_user(tmp, buffer, count)) {
  2149. int num = sscanf(tmp, "%d ", &mode);
  2150. if (pregpriv && mode < 2) {
  2151. pregpriv->ampdu_enable = mode;
  2152. printk("ampdu_enable=%d\n", mode);
  2153. }
  2154. }
  2155. return count;
  2156. }
  2157. int proc_get_mac_rptbuf(struct seq_file *m, void *v)
  2158. {
  2159. struct net_device *dev = m->private;
  2160. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2161. u16 i;
  2162. u16 mac_id;
  2163. u32 shcut_addr = 0;
  2164. u32 read_addr = 0;
  2165. #ifdef CONFIG_RTL8814A
  2166. RTW_PRINT_SEL(m, "TX ShortCut:\n");
  2167. for (mac_id = 0; mac_id < 64; mac_id++) {
  2168. rtw_write16(padapter, 0x140, 0x662 | ((mac_id & BIT5) >> 5));
  2169. shcut_addr = 0x8000;
  2170. shcut_addr = shcut_addr | ((mac_id & 0x1f) << 7);
  2171. RTW_PRINT_SEL(m, "mac_id=%d, 0x140=%x =>\n", mac_id, 0x662 | ((mac_id & BIT5) >> 5));
  2172. for (i = 0; i < 30; i++) {
  2173. read_addr = 0;
  2174. read_addr = shcut_addr | (i << 2);
  2175. RTW_PRINT_SEL(m, "i=%02d: MAC_%04x= %08x ", i, read_addr, rtw_read32(padapter, read_addr));
  2176. if (!((i + 1) % 4))
  2177. RTW_PRINT_SEL(m, "\n");
  2178. if (i == 29)
  2179. RTW_PRINT_SEL(m, "\n");
  2180. }
  2181. }
  2182. #endif /* CONFIG_RTL8814A */
  2183. return 0;
  2184. }
  2185. void dump_regsty_rx_ampdu_size_limit(void *sel, _adapter *adapter)
  2186. {
  2187. struct registry_priv *regsty = adapter_to_regsty(adapter);
  2188. int i;
  2189. RTW_PRINT_SEL(sel, "%-3s %-3s %-3s %-3s %-4s\n"
  2190. , "", "20M", "40M", "80M", "160M");
  2191. for (i = 0; i < 4; i++)
  2192. RTW_PRINT_SEL(sel, "%dSS %3u %3u %3u %4u\n", i + 1
  2193. , regsty->rx_ampdu_sz_limit_by_nss_bw[i][0]
  2194. , regsty->rx_ampdu_sz_limit_by_nss_bw[i][1]
  2195. , regsty->rx_ampdu_sz_limit_by_nss_bw[i][2]
  2196. , regsty->rx_ampdu_sz_limit_by_nss_bw[i][3]);
  2197. }
  2198. int proc_get_rx_ampdu(struct seq_file *m, void *v)
  2199. {
  2200. struct net_device *dev = m->private;
  2201. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2202. _RTW_PRINT_SEL(m, "accept: ");
  2203. if (padapter->fix_rx_ampdu_accept == RX_AMPDU_ACCEPT_INVALID)
  2204. RTW_PRINT_SEL(m, "%u%s\n", rtw_rx_ampdu_is_accept(padapter), "(auto)");
  2205. else
  2206. RTW_PRINT_SEL(m, "%u%s\n", padapter->fix_rx_ampdu_accept, "(fixed)");
  2207. _RTW_PRINT_SEL(m, "size: ");
  2208. if (padapter->fix_rx_ampdu_size == RX_AMPDU_SIZE_INVALID) {
  2209. RTW_PRINT_SEL(m, "%u%s\n", rtw_rx_ampdu_size(padapter), "(auto) with conditional limit:");
  2210. dump_regsty_rx_ampdu_size_limit(m, padapter);
  2211. } else
  2212. RTW_PRINT_SEL(m, "%u%s\n", padapter->fix_rx_ampdu_size, "(fixed)");
  2213. RTW_PRINT_SEL(m, "\n");
  2214. RTW_PRINT_SEL(m, "%19s %17s\n", "fix_rx_ampdu_accept", "fix_rx_ampdu_size");
  2215. _RTW_PRINT_SEL(m, "%-19d %-17u\n"
  2216. , padapter->fix_rx_ampdu_accept
  2217. , padapter->fix_rx_ampdu_size);
  2218. return 0;
  2219. }
  2220. ssize_t proc_set_rx_ampdu(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  2221. {
  2222. struct net_device *dev = data;
  2223. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2224. struct registry_priv *pregpriv = &padapter->registrypriv;
  2225. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  2226. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  2227. char tmp[32];
  2228. u8 accept;
  2229. u8 size;
  2230. if (count < 1)
  2231. return -EFAULT;
  2232. if (count > sizeof(tmp)) {
  2233. rtw_warn_on(1);
  2234. return -EFAULT;
  2235. }
  2236. if (buffer && !copy_from_user(tmp, buffer, count)) {
  2237. int num = sscanf(tmp, "%hhu %hhu", &accept, &size);
  2238. if (num >= 1)
  2239. rtw_rx_ampdu_set_accept(padapter, accept, RX_AMPDU_DRV_FIXED);
  2240. if (num >= 2)
  2241. rtw_rx_ampdu_set_size(padapter, size, RX_AMPDU_DRV_FIXED);
  2242. rtw_rx_ampdu_apply(padapter);
  2243. }
  2244. exit:
  2245. return count;
  2246. }
  2247. int proc_get_rx_ampdu_factor(struct seq_file *m, void *v)
  2248. {
  2249. struct net_device *dev = m->private;
  2250. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2251. if (padapter)
  2252. RTW_PRINT_SEL(m, "rx ampdu factor = %x\n", padapter->driver_rx_ampdu_factor);
  2253. return 0;
  2254. }
  2255. ssize_t proc_set_rx_ampdu_factor(struct file *file, const char __user *buffer
  2256. , size_t count, loff_t *pos, void *data)
  2257. {
  2258. struct net_device *dev = data;
  2259. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2260. char tmp[32];
  2261. u32 factor;
  2262. if (count < 1)
  2263. return -EFAULT;
  2264. if (count > sizeof(tmp)) {
  2265. rtw_warn_on(1);
  2266. return -EFAULT;
  2267. }
  2268. if (buffer && !copy_from_user(tmp, buffer, count)) {
  2269. int num = sscanf(tmp, "%d ", &factor);
  2270. if (padapter && (num == 1)) {
  2271. RTW_INFO("padapter->driver_rx_ampdu_factor = %x\n", factor);
  2272. if (factor > 0x03)
  2273. padapter->driver_rx_ampdu_factor = 0xFF;
  2274. else
  2275. padapter->driver_rx_ampdu_factor = factor;
  2276. }
  2277. }
  2278. return count;
  2279. }
  2280. int proc_get_tx_max_agg_num(struct seq_file *m, void *v)
  2281. {
  2282. struct net_device *dev = m->private;
  2283. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2284. if (padapter)
  2285. RTW_PRINT_SEL(m, "tx max AMPDU num = 0x%02x\n", padapter->driver_tx_max_agg_num);
  2286. return 0;
  2287. }
  2288. ssize_t proc_set_tx_max_agg_num(struct file *file, const char __user *buffer
  2289. , size_t count, loff_t *pos, void *data)
  2290. {
  2291. struct net_device *dev = data;
  2292. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2293. char tmp[32];
  2294. u8 agg_num;
  2295. if (count < 1)
  2296. return -EFAULT;
  2297. if (count > sizeof(tmp)) {
  2298. rtw_warn_on(1);
  2299. return -EFAULT;
  2300. }
  2301. if (buffer && !copy_from_user(tmp, buffer, count)) {
  2302. int num = sscanf(tmp, "%hhx ", &agg_num);
  2303. if (padapter && (num == 1)) {
  2304. RTW_INFO("padapter->driver_tx_max_agg_num = 0x%02x\n", agg_num);
  2305. padapter->driver_tx_max_agg_num = agg_num;
  2306. }
  2307. }
  2308. return count;
  2309. }
  2310. int proc_get_rx_ampdu_density(struct seq_file *m, void *v)
  2311. {
  2312. struct net_device *dev = m->private;
  2313. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2314. if (padapter)
  2315. RTW_PRINT_SEL(m, "rx ampdu densityg = %x\n", padapter->driver_rx_ampdu_spacing);
  2316. return 0;
  2317. }
  2318. ssize_t proc_set_rx_ampdu_density(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  2319. {
  2320. struct net_device *dev = data;
  2321. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2322. char tmp[32];
  2323. u32 density;
  2324. if (count < 1)
  2325. return -EFAULT;
  2326. if (count > sizeof(tmp)) {
  2327. rtw_warn_on(1);
  2328. return -EFAULT;
  2329. }
  2330. if (buffer && !copy_from_user(tmp, buffer, count)) {
  2331. int num = sscanf(tmp, "%d ", &density);
  2332. if (padapter && (num == 1)) {
  2333. RTW_INFO("padapter->driver_rx_ampdu_spacing = %x\n", density);
  2334. if (density > 0x07)
  2335. padapter->driver_rx_ampdu_spacing = 0xFF;
  2336. else
  2337. padapter->driver_rx_ampdu_spacing = density;
  2338. }
  2339. }
  2340. return count;
  2341. }
  2342. int proc_get_tx_ampdu_density(struct seq_file *m, void *v)
  2343. {
  2344. struct net_device *dev = m->private;
  2345. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2346. if (padapter)
  2347. RTW_PRINT_SEL(m, "tx ampdu density = %x\n", padapter->driver_ampdu_spacing);
  2348. return 0;
  2349. }
  2350. ssize_t proc_set_tx_ampdu_density(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  2351. {
  2352. struct net_device *dev = data;
  2353. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2354. char tmp[32];
  2355. u32 density;
  2356. if (count < 1)
  2357. return -EFAULT;
  2358. if (count > sizeof(tmp)) {
  2359. rtw_warn_on(1);
  2360. return -EFAULT;
  2361. }
  2362. if (buffer && !copy_from_user(tmp, buffer, count)) {
  2363. int num = sscanf(tmp, "%d ", &density);
  2364. if (padapter && (num == 1)) {
  2365. RTW_INFO("padapter->driver_ampdu_spacing = %x\n", density);
  2366. if (density > 0x07)
  2367. padapter->driver_ampdu_spacing = 0xFF;
  2368. else
  2369. padapter->driver_ampdu_spacing = density;
  2370. }
  2371. }
  2372. return count;
  2373. }
  2374. #ifdef CONFIG_TX_AMSDU
  2375. int proc_get_tx_amsdu(struct seq_file *m, void *v)
  2376. {
  2377. struct net_device *dev = m->private;
  2378. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2379. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  2380. if (padapter)
  2381. {
  2382. RTW_PRINT_SEL(m, "tx amsdu = %d\n", padapter->tx_amsdu);
  2383. RTW_PRINT_SEL(m, "amsdu set timer conut = %u\n", pxmitpriv->amsdu_debug_set_timer);
  2384. RTW_PRINT_SEL(m, "amsdu time out count = %u\n", pxmitpriv->amsdu_debug_timeout);
  2385. RTW_PRINT_SEL(m, "amsdu coalesce one count = %u\n", pxmitpriv->amsdu_debug_coalesce_one);
  2386. RTW_PRINT_SEL(m, "amsdu coalesce two count = %u\n", pxmitpriv->amsdu_debug_coalesce_two);
  2387. }
  2388. return 0;
  2389. }
  2390. ssize_t proc_set_tx_amsdu(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  2391. {
  2392. struct net_device *dev = data;
  2393. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2394. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  2395. char tmp[32];
  2396. u32 amsdu;
  2397. if (count < 1)
  2398. return -EFAULT;
  2399. if (count > sizeof(tmp)) {
  2400. rtw_warn_on(1);
  2401. return -EFAULT;
  2402. }
  2403. if (buffer && !copy_from_user(tmp, buffer, count)) {
  2404. int num = sscanf(tmp, "%d ", &amsdu);
  2405. if (padapter && (num == 1)) {
  2406. RTW_INFO("padapter->tx_amsdu = %x\n", amsdu);
  2407. if (amsdu > 3)
  2408. padapter->tx_amsdu = 0;
  2409. else if(amsdu == 3)
  2410. {
  2411. pxmitpriv->amsdu_debug_set_timer = 0;
  2412. pxmitpriv->amsdu_debug_timeout = 0;
  2413. pxmitpriv->amsdu_debug_coalesce_one = 0;
  2414. pxmitpriv->amsdu_debug_coalesce_two = 0;
  2415. }
  2416. else
  2417. padapter->tx_amsdu = amsdu;
  2418. }
  2419. }
  2420. return count;
  2421. }
  2422. int proc_get_tx_amsdu_rate(struct seq_file *m, void *v)
  2423. {
  2424. struct net_device *dev = m->private;
  2425. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2426. if (padapter)
  2427. RTW_PRINT_SEL(m, "tx amsdu rate = %d Mbps\n", padapter->tx_amsdu_rate);
  2428. return 0;
  2429. }
  2430. ssize_t proc_set_tx_amsdu_rate(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  2431. {
  2432. struct net_device *dev = data;
  2433. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2434. char tmp[32];
  2435. u32 amsdu_rate;
  2436. if (count < 1)
  2437. return -EFAULT;
  2438. if (count > sizeof(tmp)) {
  2439. rtw_warn_on(1);
  2440. return -EFAULT;
  2441. }
  2442. if (buffer && !copy_from_user(tmp, buffer, count)) {
  2443. int num = sscanf(tmp, "%d ", &amsdu_rate);
  2444. if (padapter && (num == 1)) {
  2445. RTW_INFO("padapter->tx_amsdu_rate = %x\n", amsdu_rate);
  2446. padapter->tx_amsdu_rate = amsdu_rate;
  2447. }
  2448. }
  2449. return count;
  2450. }
  2451. #endif /* CONFIG_TX_AMSDU */
  2452. #endif /* CONFIG_80211N_HT */
  2453. int proc_get_en_fwps(struct seq_file *m, void *v)
  2454. {
  2455. struct net_device *dev = m->private;
  2456. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2457. struct registry_priv *pregpriv = &padapter->registrypriv;
  2458. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  2459. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  2460. if (pregpriv)
  2461. RTW_PRINT_SEL(m, "check_fw_ps = %d , 1:enable get FW PS state , 0: disable get FW PS state\n"
  2462. , pregpriv->check_fw_ps);
  2463. return 0;
  2464. }
  2465. ssize_t proc_set_en_fwps(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  2466. {
  2467. struct net_device *dev = data;
  2468. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2469. struct registry_priv *pregpriv = &padapter->registrypriv;
  2470. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  2471. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  2472. char tmp[32];
  2473. u32 mode;
  2474. if (count < 1)
  2475. return -EFAULT;
  2476. if (count > sizeof(tmp)) {
  2477. rtw_warn_on(1);
  2478. return -EFAULT;
  2479. }
  2480. if (buffer && !copy_from_user(tmp, buffer, count)) {
  2481. int num = sscanf(tmp, "%d ", &mode);
  2482. if (pregpriv && mode < 2) {
  2483. pregpriv->check_fw_ps = mode;
  2484. RTW_INFO("pregpriv->check_fw_ps=%d\n", pregpriv->check_fw_ps);
  2485. }
  2486. }
  2487. return count;
  2488. }
  2489. /*
  2490. int proc_get_two_path_rssi(struct seq_file *m, void *v)
  2491. {
  2492. struct net_device *dev = m->private;
  2493. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2494. if(padapter)
  2495. RTW_PRINT_SEL(m, "%d %d\n",
  2496. padapter->recvpriv.RxRssi[0], padapter->recvpriv.RxRssi[1]);
  2497. return 0;
  2498. }
  2499. */
  2500. #ifdef CONFIG_80211N_HT
  2501. void rtw_dump_dft_phy_cap(void *sel, _adapter *adapter)
  2502. {
  2503. struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
  2504. struct ht_priv *phtpriv = &pmlmepriv->htpriv;
  2505. #ifdef CONFIG_80211AC_VHT
  2506. struct vht_priv *pvhtpriv = &pmlmepriv->vhtpriv;
  2507. #endif
  2508. #ifdef CONFIG_80211AC_VHT
  2509. RTW_PRINT_SEL(sel, "[DFT CAP] VHT STBC Tx : %s\n", (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_TX)) ? "V" : "X");
  2510. RTW_PRINT_SEL(sel, "[DFT CAP] VHT STBC Rx : %s\n", (TEST_FLAG(pvhtpriv->stbc_cap, STBC_VHT_ENABLE_RX)) ? "V" : "X");
  2511. #endif
  2512. RTW_PRINT_SEL(sel, "[DFT CAP] HT STBC Tx : %s\n", (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_TX)) ? "V" : "X");
  2513. RTW_PRINT_SEL(sel, "[DFT CAP] HT STBC Rx : %s\n\n", (TEST_FLAG(phtpriv->stbc_cap, STBC_HT_ENABLE_RX)) ? "V" : "X");
  2514. #ifdef CONFIG_80211AC_VHT
  2515. RTW_PRINT_SEL(sel, "[DFT CAP] VHT LDPC Tx : %s\n", (TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_TX)) ? "V" : "X");
  2516. RTW_PRINT_SEL(sel, "[DFT CAP] VHT LDPC Rx : %s\n", (TEST_FLAG(pvhtpriv->ldpc_cap, LDPC_VHT_ENABLE_RX)) ? "V" : "X");
  2517. #endif
  2518. RTW_PRINT_SEL(sel, "[DFT CAP] HT LDPC Tx : %s\n", (TEST_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_TX)) ? "V" : "X");
  2519. RTW_PRINT_SEL(sel, "[DFT CAP] HT LDPC Rx : %s\n\n", (TEST_FLAG(phtpriv->ldpc_cap, LDPC_HT_ENABLE_RX)) ? "V" : "X");
  2520. #ifdef CONFIG_BEAMFORMING
  2521. #ifdef CONFIG_80211AC_VHT
  2522. RTW_PRINT_SEL(sel, "[DFT CAP] VHT MU Bfer : %s\n", (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_AP_ENABLE)) ? "V" : "X");
  2523. RTW_PRINT_SEL(sel, "[DFT CAP] VHT MU Bfee : %s\n", (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_MU_MIMO_STA_ENABLE)) ? "V" : "X");
  2524. RTW_PRINT_SEL(sel, "[DFT CAP] VHT SU Bfer : %s\n", (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMER_ENABLE)) ? "V" : "X");
  2525. RTW_PRINT_SEL(sel, "[DFT CAP] VHT SU Bfee : %s\n", (TEST_FLAG(pvhtpriv->beamform_cap, BEAMFORMING_VHT_BEAMFORMEE_ENABLE)) ? "V" : "X");
  2526. #endif
  2527. RTW_PRINT_SEL(sel, "[DFT CAP] HT Bfer : %s\n", (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMER_ENABLE)) ? "V" : "X");
  2528. RTW_PRINT_SEL(sel, "[DFT CAP] HT Bfee : %s\n", (TEST_FLAG(phtpriv->beamform_cap, BEAMFORMING_HT_BEAMFORMEE_ENABLE)) ? "V" : "X");
  2529. #endif
  2530. }
  2531. void rtw_get_dft_phy_cap(void *sel, _adapter *adapter)
  2532. {
  2533. RTW_PRINT_SEL(sel, "\n ======== PHY CAP protocol ========\n");
  2534. rtw_ht_use_default_setting(adapter);
  2535. #ifdef CONFIG_80211AC_VHT
  2536. rtw_vht_use_default_setting(adapter);
  2537. #endif
  2538. rtw_dump_dft_phy_cap(sel, adapter);
  2539. }
  2540. void rtw_dump_drv_phy_cap(void *sel, _adapter *adapter)
  2541. {
  2542. struct registry_priv *pregistry_priv = &adapter->registrypriv;
  2543. RTW_PRINT_SEL(sel, "\n ======== DRV's configuration ========\n");
  2544. #if 0
  2545. RTW_PRINT_SEL(sel, "[DRV CAP] TRx Capability : 0x%08x\n", phy_spec->trx_cap);
  2546. RTW_PRINT_SEL(sel, "[DRV CAP] Tx Stream Num Index : %d\n", (phy_spec->trx_cap >> 24) & 0xFF); /*Tx Stream Num Index [31:24]*/
  2547. RTW_PRINT_SEL(sel, "[DRV CAP] Rx Stream Num Index : %d\n", (phy_spec->trx_cap >> 16) & 0xFF); /*Rx Stream Num Index [23:16]*/
  2548. RTW_PRINT_SEL(sel, "[DRV CAP] Tx Path Num Index : %d\n", (phy_spec->trx_cap >> 8) & 0xFF);/*Tx Path Num Index [15:8]*/
  2549. RTW_PRINT_SEL(sel, "[DRV CAP] Rx Path Num Index : %d\n", (phy_spec->trx_cap & 0xFF));/*Rx Path Num Index [7:0]*/
  2550. #endif
  2551. RTW_PRINT_SEL(sel, "[DRV CAP] STBC Capability : 0x%02x\n", pregistry_priv->stbc_cap);
  2552. RTW_PRINT_SEL(sel, "[DRV CAP] VHT STBC Tx : %s\n", (TEST_FLAG(pregistry_priv->stbc_cap, BIT1)) ? "V" : "X"); /*BIT1: Enable VHT STBC Tx*/
  2553. RTW_PRINT_SEL(sel, "[DRV CAP] VHT STBC Rx : %s\n", (TEST_FLAG(pregistry_priv->stbc_cap, BIT0)) ? "V" : "X"); /*BIT0: Enable VHT STBC Rx*/
  2554. RTW_PRINT_SEL(sel, "[DRV CAP] HT STBC Tx : %s\n", (TEST_FLAG(pregistry_priv->stbc_cap, BIT5)) ? "V" : "X"); /*BIT5: Enable HT STBC Tx*/
  2555. RTW_PRINT_SEL(sel, "[DRV CAP] HT STBC Rx : %s\n\n", (TEST_FLAG(pregistry_priv->stbc_cap, BIT4)) ? "V" : "X"); /*BIT4: Enable HT STBC Rx*/
  2556. RTW_PRINT_SEL(sel, "[DRV CAP] LDPC Capability : 0x%02x\n", pregistry_priv->ldpc_cap);
  2557. RTW_PRINT_SEL(sel, "[DRV CAP] VHT LDPC Tx : %s\n", (TEST_FLAG(pregistry_priv->ldpc_cap, BIT1)) ? "V" : "X"); /*BIT1: Enable VHT LDPC Tx*/
  2558. RTW_PRINT_SEL(sel, "[DRV CAP] VHT LDPC Rx : %s\n", (TEST_FLAG(pregistry_priv->ldpc_cap, BIT0)) ? "V" : "X"); /*BIT0: Enable VHT LDPC Rx*/
  2559. RTW_PRINT_SEL(sel, "[DRV CAP] HT LDPC Tx : %s\n", (TEST_FLAG(pregistry_priv->ldpc_cap, BIT5)) ? "V" : "X"); /*BIT5: Enable HT LDPC Tx*/
  2560. RTW_PRINT_SEL(sel, "[DRV CAP] HT LDPC Rx : %s\n\n", (TEST_FLAG(pregistry_priv->ldpc_cap, BIT4)) ? "V" : "X"); /*BIT4: Enable HT LDPC Rx*/
  2561. #ifdef CONFIG_BEAMFORMING
  2562. #if 0
  2563. RTW_PRINT_SEL(sel, "[DRV CAP] TxBF parameter : 0x%08x\n", phy_spec->txbf_param);
  2564. RTW_PRINT_SEL(sel, "[DRV CAP] VHT Sounding Dim : %d\n", (phy_spec->txbf_param >> 24) & 0xFF); /*VHT Sounding Dim [31:24]*/
  2565. RTW_PRINT_SEL(sel, "[DRV CAP] VHT Steering Ant : %d\n", (phy_spec->txbf_param >> 16) & 0xFF); /*VHT Steering Ant [23:16]*/
  2566. RTW_PRINT_SEL(sel, "[DRV CAP] HT Sounding Dim : %d\n", (phy_spec->txbf_param >> 8) & 0xFF); /*HT Sounding Dim [15:8]*/
  2567. RTW_PRINT_SEL(sel, "[DRV CAP] HT Steering Ant : %d\n", phy_spec->txbf_param & 0xFF); /*HT Steering Ant [7:0]*/
  2568. #endif
  2569. /*
  2570. * BIT0: Enable VHT SU Beamformer
  2571. * BIT1: Enable VHT SU Beamformee
  2572. * BIT2: Enable VHT MU Beamformer, depend on VHT SU Beamformer
  2573. * BIT3: Enable VHT MU Beamformee, depend on VHT SU Beamformee
  2574. * BIT4: Enable HT Beamformer
  2575. * BIT5: Enable HT Beamformee
  2576. */
  2577. RTW_PRINT_SEL(sel, "[DRV CAP] TxBF Capability : 0x%02x\n", pregistry_priv->beamform_cap);
  2578. RTW_PRINT_SEL(sel, "[DRV CAP] VHT MU Bfer : %s\n", (TEST_FLAG(pregistry_priv->beamform_cap, BIT2)) ? "V" : "X");
  2579. RTW_PRINT_SEL(sel, "[DRV CAP] VHT MU Bfee : %s\n", (TEST_FLAG(pregistry_priv->beamform_cap, BIT3)) ? "V" : "X");
  2580. RTW_PRINT_SEL(sel, "[DRV CAP] VHT SU Bfer : %s\n", (TEST_FLAG(pregistry_priv->beamform_cap, BIT0)) ? "V" : "X");
  2581. RTW_PRINT_SEL(sel, "[DRV CAP] VHT SU Bfee : %s\n", (TEST_FLAG(pregistry_priv->beamform_cap, BIT1)) ? "V" : "X");
  2582. RTW_PRINT_SEL(sel, "[DRV CAP] HT Bfer : %s\n", (TEST_FLAG(pregistry_priv->beamform_cap, BIT4)) ? "V" : "X");
  2583. RTW_PRINT_SEL(sel, "[DRV CAP] HT Bfee : %s\n", (TEST_FLAG(pregistry_priv->beamform_cap, BIT5)) ? "V" : "X");
  2584. RTW_PRINT_SEL(sel, "[DRV CAP] Tx Bfer rf_num : %d\n", pregistry_priv->beamformer_rf_num);
  2585. RTW_PRINT_SEL(sel, "[DRV CAP] Tx Bfee rf_num : %d\n", pregistry_priv->beamformee_rf_num);
  2586. #endif
  2587. }
  2588. int proc_get_stbc_cap(struct seq_file *m, void *v)
  2589. {
  2590. struct net_device *dev = m->private;
  2591. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2592. struct registry_priv *pregpriv = &padapter->registrypriv;
  2593. if (pregpriv)
  2594. RTW_PRINT_SEL(m, "0x%02x\n", pregpriv->stbc_cap);
  2595. return 0;
  2596. }
  2597. ssize_t proc_set_stbc_cap(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  2598. {
  2599. struct net_device *dev = data;
  2600. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2601. struct registry_priv *pregpriv = &padapter->registrypriv;
  2602. char tmp[32];
  2603. u32 mode;
  2604. if (count < 1)
  2605. return -EFAULT;
  2606. if (count > sizeof(tmp)) {
  2607. rtw_warn_on(1);
  2608. return -EFAULT;
  2609. }
  2610. if (buffer && !copy_from_user(tmp, buffer, count)) {
  2611. int num = sscanf(tmp, "%d ", &mode);
  2612. if (pregpriv) {
  2613. pregpriv->stbc_cap = mode;
  2614. RTW_INFO("stbc_cap = 0x%02x\n", mode);
  2615. }
  2616. }
  2617. return count;
  2618. }
  2619. int proc_get_rx_stbc(struct seq_file *m, void *v)
  2620. {
  2621. struct net_device *dev = m->private;
  2622. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2623. struct registry_priv *pregpriv = &padapter->registrypriv;
  2624. if (pregpriv)
  2625. RTW_PRINT_SEL(m, "%d\n", pregpriv->rx_stbc);
  2626. return 0;
  2627. }
  2628. ssize_t proc_set_rx_stbc(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  2629. {
  2630. struct net_device *dev = data;
  2631. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2632. struct registry_priv *pregpriv = &padapter->registrypriv;
  2633. char tmp[32];
  2634. u32 mode;
  2635. if (count < 1)
  2636. return -EFAULT;
  2637. if (count > sizeof(tmp)) {
  2638. rtw_warn_on(1);
  2639. return -EFAULT;
  2640. }
  2641. if (buffer && !copy_from_user(tmp, buffer, count)) {
  2642. int num = sscanf(tmp, "%d ", &mode);
  2643. if (pregpriv && (mode == 0 || mode == 1 || mode == 2 || mode == 3)) {
  2644. pregpriv->rx_stbc = mode;
  2645. printk("rx_stbc=%d\n", mode);
  2646. }
  2647. }
  2648. return count;
  2649. }
  2650. int proc_get_ldpc_cap(struct seq_file *m, void *v)
  2651. {
  2652. struct net_device *dev = m->private;
  2653. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2654. struct registry_priv *pregpriv = &padapter->registrypriv;
  2655. if (pregpriv)
  2656. RTW_PRINT_SEL(m, "0x%02x\n", pregpriv->ldpc_cap);
  2657. return 0;
  2658. }
  2659. ssize_t proc_set_ldpc_cap(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  2660. {
  2661. struct net_device *dev = data;
  2662. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2663. struct registry_priv *pregpriv = &padapter->registrypriv;
  2664. char tmp[32];
  2665. u32 mode;
  2666. if (count < 1)
  2667. return -EFAULT;
  2668. if (count > sizeof(tmp)) {
  2669. rtw_warn_on(1);
  2670. return -EFAULT;
  2671. }
  2672. if (buffer && !copy_from_user(tmp, buffer, count)) {
  2673. int num = sscanf(tmp, "%d ", &mode);
  2674. if (pregpriv) {
  2675. pregpriv->ldpc_cap = mode;
  2676. RTW_INFO("ldpc_cap = 0x%02x\n", mode);
  2677. }
  2678. }
  2679. return count;
  2680. }
  2681. #ifdef CONFIG_BEAMFORMING
  2682. int proc_get_txbf_cap(struct seq_file *m, void *v)
  2683. {
  2684. struct net_device *dev = m->private;
  2685. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2686. struct registry_priv *pregpriv = &padapter->registrypriv;
  2687. if (pregpriv)
  2688. RTW_PRINT_SEL(m, "0x%02x\n", pregpriv->beamform_cap);
  2689. return 0;
  2690. }
  2691. ssize_t proc_set_txbf_cap(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  2692. {
  2693. struct net_device *dev = data;
  2694. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2695. struct registry_priv *pregpriv = &padapter->registrypriv;
  2696. char tmp[32];
  2697. u32 mode;
  2698. if (count < 1)
  2699. return -EFAULT;
  2700. if (count > sizeof(tmp)) {
  2701. rtw_warn_on(1);
  2702. return -EFAULT;
  2703. }
  2704. if (buffer && !copy_from_user(tmp, buffer, count)) {
  2705. int num = sscanf(tmp, "%d ", &mode);
  2706. if (pregpriv) {
  2707. pregpriv->beamform_cap = mode;
  2708. RTW_INFO("beamform_cap = 0x%02x\n", mode);
  2709. }
  2710. }
  2711. return count;
  2712. }
  2713. #endif
  2714. #endif /* CONFIG_80211N_HT */
  2715. /*int proc_get_rssi_disp(struct seq_file *m, void *v)
  2716. {
  2717. struct net_device *dev = m->private;
  2718. return 0;
  2719. }
  2720. */
  2721. /*ssize_t proc_set_rssi_disp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  2722. {
  2723. struct net_device *dev = data;
  2724. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2725. char tmp[32];
  2726. u32 enable=0;
  2727. if (count < 1)
  2728. {
  2729. RTW_INFO("argument size is less than 1\n");
  2730. return -EFAULT;
  2731. }
  2732. if (count > sizeof(tmp)) {
  2733. rtw_warn_on(1);
  2734. return -EFAULT;
  2735. }
  2736. if (buffer && !copy_from_user(tmp, buffer, count)) {
  2737. int num = sscanf(tmp, "%x", &enable);
  2738. if (num != 1) {
  2739. RTW_INFO("invalid set_rssi_disp parameter!\n");
  2740. return count;
  2741. }
  2742. if(enable)
  2743. {
  2744. RTW_INFO("Linked info Function Enable\n");
  2745. padapter->bLinkInfoDump = enable ;
  2746. }
  2747. else
  2748. {
  2749. RTW_INFO("Linked info Function Disable\n");
  2750. padapter->bLinkInfoDump = 0 ;
  2751. }
  2752. }
  2753. return count;
  2754. }
  2755. */
  2756. #ifdef CONFIG_AP_MODE
  2757. int proc_get_all_sta_info(struct seq_file *m, void *v)
  2758. {
  2759. struct net_device *dev = m->private;
  2760. _irqL irqL;
  2761. struct sta_info *psta;
  2762. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2763. struct sta_priv *pstapriv = &padapter->stapriv;
  2764. int i;
  2765. _list *plist, *phead;
  2766. RTW_PRINT_SEL(m, "sta_dz_bitmap=0x%x, tim_bitmap=0x%x\n", pstapriv->sta_dz_bitmap, pstapriv->tim_bitmap);
  2767. _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  2768. for (i = 0; i < NUM_STA; i++) {
  2769. phead = &(pstapriv->sta_hash[i]);
  2770. plist = get_next(phead);
  2771. while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {
  2772. psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
  2773. plist = get_next(plist);
  2774. /* if(extra_arg == psta->aid) */
  2775. {
  2776. RTW_PRINT_SEL(m, "==============================\n");
  2777. RTW_PRINT_SEL(m, "sta's macaddr:" MAC_FMT "\n", MAC_ARG(psta->hwaddr));
  2778. RTW_PRINT_SEL(m, "rtsen=%d, cts2slef=%d\n", psta->rtsen, psta->cts2self);
  2779. RTW_PRINT_SEL(m, "state=0x%x, aid=%d, macid=%d, raid=%d\n", psta->state, psta->aid, psta->mac_id, psta->raid);
  2780. #ifdef CONFIG_80211N_HT
  2781. RTW_PRINT_SEL(m, "qos_en=%d, ht_en=%d, init_rate=%d\n", psta->qos_option, psta->htpriv.ht_option, psta->init_rate);
  2782. RTW_PRINT_SEL(m, "bwmode=%d, ch_offset=%d, sgi_20m=%d,sgi_40m=%d\n", psta->bw_mode, psta->htpriv.ch_offset, psta->htpriv.sgi_20m, psta->htpriv.sgi_40m);
  2783. RTW_PRINT_SEL(m, "ampdu_enable = %d\n", psta->htpriv.ampdu_enable);
  2784. RTW_PRINT_SEL(m, "tx_amsdu_enable = %d\n", psta->htpriv.tx_amsdu_enable);
  2785. RTW_PRINT_SEL(m, "agg_enable_bitmap=%x, candidate_tid_bitmap=%x\n", psta->htpriv.agg_enable_bitmap, psta->htpriv.candidate_tid_bitmap);
  2786. #endif /* CONFIG_80211N_HT */
  2787. RTW_PRINT_SEL(m, "sleepq_len=%d\n", psta->sleepq_len);
  2788. RTW_PRINT_SEL(m, "sta_xmitpriv.vo_q_qcnt=%d\n", psta->sta_xmitpriv.vo_q.qcnt);
  2789. RTW_PRINT_SEL(m, "sta_xmitpriv.vi_q_qcnt=%d\n", psta->sta_xmitpriv.vi_q.qcnt);
  2790. RTW_PRINT_SEL(m, "sta_xmitpriv.be_q_qcnt=%d\n", psta->sta_xmitpriv.be_q.qcnt);
  2791. RTW_PRINT_SEL(m, "sta_xmitpriv.bk_q_qcnt=%d\n", psta->sta_xmitpriv.bk_q.qcnt);
  2792. RTW_PRINT_SEL(m, "capability=0x%x\n", psta->capability);
  2793. RTW_PRINT_SEL(m, "flags=0x%x\n", psta->flags);
  2794. RTW_PRINT_SEL(m, "wpa_psk=0x%x\n", psta->wpa_psk);
  2795. RTW_PRINT_SEL(m, "wpa2_group_cipher=0x%x\n", psta->wpa2_group_cipher);
  2796. RTW_PRINT_SEL(m, "wpa2_pairwise_cipher=0x%x\n", psta->wpa2_pairwise_cipher);
  2797. RTW_PRINT_SEL(m, "qos_info=0x%x\n", psta->qos_info);
  2798. RTW_PRINT_SEL(m, "dot118021XPrivacy=0x%x\n", psta->dot118021XPrivacy);
  2799. sta_rx_reorder_ctl_dump(m, psta);
  2800. #ifdef CONFIG_TDLS
  2801. RTW_PRINT_SEL(m, "tdls_sta_state=0x%08x\n", psta->tdls_sta_state);
  2802. RTW_PRINT_SEL(m, "PeerKey_Lifetime=%d\n", psta->TDLS_PeerKey_Lifetime);
  2803. RTW_PRINT_SEL(m, "rx_data_pkts=%llu\n", psta->sta_stats.rx_data_pkts);
  2804. RTW_PRINT_SEL(m, "rx_bytes=%llu\n", psta->sta_stats.rx_bytes);
  2805. RTW_PRINT_SEL(m, "tx_data_pkts=%llu\n", psta->sta_stats.tx_pkts);
  2806. RTW_PRINT_SEL(m, "tx_bytes=%llu\n", psta->sta_stats.tx_bytes);
  2807. #endif /* CONFIG_TDLS */
  2808. dump_st_ctl(m, &psta->st_ctl);
  2809. if (STA_OP_WFD_MODE(psta))
  2810. RTW_PRINT_SEL(m, "op_wfd_mode:0x%02x\n", STA_OP_WFD_MODE(psta));
  2811. RTW_PRINT_SEL(m, "==============================\n");
  2812. }
  2813. }
  2814. }
  2815. _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  2816. return 0;
  2817. }
  2818. #endif
  2819. #ifdef CONFIG_PREALLOC_RX_SKB_BUFFER
  2820. int proc_get_rtkm_info(struct seq_file *m, void *v)
  2821. {
  2822. struct net_device *dev = m->private;
  2823. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2824. struct recv_priv *precvpriv = &padapter->recvpriv;
  2825. struct recv_buf *precvbuf;
  2826. precvbuf = (struct recv_buf *)precvpriv->precv_buf;
  2827. RTW_PRINT_SEL(m, "============[RTKM Info]============\n");
  2828. RTW_PRINT_SEL(m, "MAX_RTKM_NR_PREALLOC_RECV_SKB: %d\n", rtw_rtkm_get_nr_recv_skb());
  2829. RTW_PRINT_SEL(m, "MAX_RTKM_RECVBUF_SZ: %d\n", rtw_rtkm_get_buff_size());
  2830. RTW_PRINT_SEL(m, "============[Driver Info]============\n");
  2831. RTW_PRINT_SEL(m, "NR_PREALLOC_RECV_SKB: %d\n", NR_PREALLOC_RECV_SKB);
  2832. RTW_PRINT_SEL(m, "MAX_RECVBUF_SZ: %d\n", precvbuf->alloc_sz);
  2833. return 0;
  2834. }
  2835. #endif /* CONFIG_PREALLOC_RX_SKB_BUFFER */
  2836. #ifdef DBG_MEMORY_LEAK
  2837. #include <asm/atomic.h>
  2838. extern atomic_t _malloc_cnt;;
  2839. extern atomic_t _malloc_size;;
  2840. int proc_get_malloc_cnt(struct seq_file *m, void *v)
  2841. {
  2842. RTW_PRINT_SEL(m, "_malloc_cnt=%d\n", atomic_read(&_malloc_cnt));
  2843. RTW_PRINT_SEL(m, "_malloc_size=%d\n", atomic_read(&_malloc_size));
  2844. return 0;
  2845. }
  2846. #endif /* DBG_MEMORY_LEAK */
  2847. #ifdef CONFIG_FIND_BEST_CHANNEL
  2848. int proc_get_best_channel(struct seq_file *m, void *v)
  2849. {
  2850. struct net_device *dev = m->private;
  2851. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2852. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  2853. u32 i, best_channel_24G = 1, best_channel_5G = 36, index_24G = 0, index_5G = 0;
  2854. for (i = 0; i < pmlmeext->max_chan_nums && pmlmeext->channel_set[i].ChannelNum != 0; i++) {
  2855. if (pmlmeext->channel_set[i].ChannelNum == 1)
  2856. index_24G = i;
  2857. if (pmlmeext->channel_set[i].ChannelNum == 36)
  2858. index_5G = i;
  2859. }
  2860. for (i = 0; i < pmlmeext->max_chan_nums && pmlmeext->channel_set[i].ChannelNum != 0; i++) {
  2861. /* 2.4G */
  2862. if (pmlmeext->channel_set[i].ChannelNum == 6) {
  2863. if (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_24G].rx_count) {
  2864. index_24G = i;
  2865. best_channel_24G = pmlmeext->channel_set[i].ChannelNum;
  2866. }
  2867. }
  2868. /* 5G */
  2869. if (pmlmeext->channel_set[i].ChannelNum >= 36
  2870. && pmlmeext->channel_set[i].ChannelNum < 140) {
  2871. /* Find primary channel */
  2872. if (((pmlmeext->channel_set[i].ChannelNum - 36) % 8 == 0)
  2873. && (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count)) {
  2874. index_5G = i;
  2875. best_channel_5G = pmlmeext->channel_set[i].ChannelNum;
  2876. }
  2877. }
  2878. if (pmlmeext->channel_set[i].ChannelNum >= 149
  2879. && pmlmeext->channel_set[i].ChannelNum < 165) {
  2880. /* find primary channel */
  2881. if (((pmlmeext->channel_set[i].ChannelNum - 149) % 8 == 0)
  2882. && (pmlmeext->channel_set[i].rx_count < pmlmeext->channel_set[index_5G].rx_count)) {
  2883. index_5G = i;
  2884. best_channel_5G = pmlmeext->channel_set[i].ChannelNum;
  2885. }
  2886. }
  2887. #if 1 /* debug */
  2888. RTW_PRINT_SEL(m, "The rx cnt of channel %3d = %d\n",
  2889. pmlmeext->channel_set[i].ChannelNum, pmlmeext->channel_set[i].rx_count);
  2890. #endif
  2891. }
  2892. RTW_PRINT_SEL(m, "best_channel_5G = %d\n", best_channel_5G);
  2893. RTW_PRINT_SEL(m, "best_channel_24G = %d\n", best_channel_24G);
  2894. return 0;
  2895. }
  2896. ssize_t proc_set_best_channel(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  2897. {
  2898. struct net_device *dev = data;
  2899. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  2900. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  2901. char tmp[32];
  2902. if (count < 1)
  2903. return -EFAULT;
  2904. if (count > sizeof(tmp)) {
  2905. rtw_warn_on(1);
  2906. return -EFAULT;
  2907. }
  2908. if (buffer && !copy_from_user(tmp, buffer, count)) {
  2909. int i;
  2910. for (i = 0; i < pmlmeext->max_chan_nums && pmlmeext->channel_set[i].ChannelNum != 0; i++)
  2911. pmlmeext->channel_set[i].rx_count = 0;
  2912. RTW_INFO("set %s\n", "Clean Best Channel Count");
  2913. }
  2914. return count;
  2915. }
  2916. #endif /* CONFIG_FIND_BEST_CHANNEL */
  2917. #ifdef CONFIG_BT_COEXIST
  2918. int proc_get_btcoex_dbg(struct seq_file *m, void *v)
  2919. {
  2920. struct net_device *dev = m->private;
  2921. PADAPTER padapter;
  2922. char buf[512] = {0};
  2923. padapter = (PADAPTER)rtw_netdev_priv(dev);
  2924. rtw_btcoex_GetDBG(padapter, buf, 512);
  2925. _RTW_PRINT_SEL(m, "%s", buf);
  2926. return 0;
  2927. }
  2928. ssize_t proc_set_btcoex_dbg(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  2929. {
  2930. struct net_device *dev = data;
  2931. PADAPTER padapter;
  2932. u8 tmp[80] = {0};
  2933. u32 module[2] = {0};
  2934. u32 num;
  2935. padapter = (PADAPTER)rtw_netdev_priv(dev);
  2936. /* RTW_INFO("+" FUNC_ADPT_FMT "\n", FUNC_ADPT_ARG(padapter)); */
  2937. if (NULL == buffer) {
  2938. RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n",
  2939. FUNC_ADPT_ARG(padapter));
  2940. return -EFAULT;
  2941. }
  2942. if (count < 1) {
  2943. RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n",
  2944. FUNC_ADPT_ARG(padapter));
  2945. return -EFAULT;
  2946. }
  2947. num = count;
  2948. if (num > (sizeof(tmp) - 1))
  2949. num = (sizeof(tmp) - 1);
  2950. if (copy_from_user(tmp, buffer, num)) {
  2951. RTW_INFO(FUNC_ADPT_FMT ": copy buffer from user space FAIL!\n",
  2952. FUNC_ADPT_ARG(padapter));
  2953. return -EFAULT;
  2954. }
  2955. num = sscanf(tmp, "%x %x", module, module + 1);
  2956. if (1 == num) {
  2957. if (0 == module[0])
  2958. _rtw_memset(module, 0, sizeof(module));
  2959. else
  2960. _rtw_memset(module, 0xFF, sizeof(module));
  2961. } else if (2 != num) {
  2962. RTW_INFO(FUNC_ADPT_FMT ": input(\"%s\") format incorrect!\n",
  2963. FUNC_ADPT_ARG(padapter), tmp);
  2964. if (0 == num)
  2965. return -EFAULT;
  2966. }
  2967. RTW_INFO(FUNC_ADPT_FMT ": input 0x%08X 0x%08X\n",
  2968. FUNC_ADPT_ARG(padapter), module[0], module[1]);
  2969. rtw_btcoex_SetDBG(padapter, module);
  2970. return count;
  2971. }
  2972. int proc_get_btcoex_info(struct seq_file *m, void *v)
  2973. {
  2974. struct net_device *dev = m->private;
  2975. PADAPTER padapter;
  2976. const u32 bufsize = 30 * 100;
  2977. u8 *pbuf = NULL;
  2978. padapter = (PADAPTER)rtw_netdev_priv(dev);
  2979. pbuf = rtw_zmalloc(bufsize);
  2980. if (NULL == pbuf)
  2981. return -ENOMEM;
  2982. rtw_btcoex_DisplayBtCoexInfo(padapter, pbuf, bufsize);
  2983. _RTW_PRINT_SEL(m, "%s\n", pbuf);
  2984. rtw_mfree(pbuf, bufsize);
  2985. return 0;
  2986. }
  2987. #ifdef CONFIG_RF4CE_COEXIST
  2988. int proc_get_rf4ce_state(struct seq_file *m, void *v)
  2989. {
  2990. struct net_device *dev = m->private;
  2991. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  2992. u8 state = 0, voice = 0;
  2993. state = rtw_btcoex_GetRf4ceLinkState(adapter);
  2994. RTW_PRINT_SEL(m, "RF4CE %s\n", state?"Connected":"Disconnect");
  2995. return 0;
  2996. }
  2997. /* This interface is designed for user space application to inform RF4CE state
  2998. * Initial define for DHC 1295 E387 project
  2999. *
  3000. * echo state voice > rf4ce_state
  3001. * state
  3002. * 0: RF4CE disconnected
  3003. * 1: RF4CE connected
  3004. */
  3005. ssize_t proc_set_rf4ce_state(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  3006. {
  3007. struct net_device *dev = data;
  3008. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  3009. char tmp[32];
  3010. u8 state;
  3011. if (count < 1)
  3012. return -EFAULT;
  3013. if (count > sizeof(tmp)) {
  3014. rtw_warn_on(1);
  3015. return -EFAULT;
  3016. }
  3017. if (buffer && !copy_from_user(tmp, buffer, count)) {
  3018. int num = sscanf(tmp, "%hhx", &state);
  3019. if (num >= 1)
  3020. rtw_btcoex_SetRf4ceLinkState(adapter, state);
  3021. }
  3022. return count;
  3023. }
  3024. #endif /* CONFIG_RF4CE_COEXIST */
  3025. #endif /* CONFIG_BT_COEXIST */
  3026. #if defined(DBG_CONFIG_ERROR_DETECT)
  3027. int proc_get_sreset(struct seq_file *m, void *v)
  3028. {
  3029. struct net_device *dev = m->private;
  3030. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  3031. struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  3032. return 0;
  3033. }
  3034. ssize_t proc_set_sreset(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  3035. {
  3036. struct net_device *dev = data;
  3037. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  3038. char tmp[32];
  3039. s32 trigger_point;
  3040. if (count < 1)
  3041. return -EFAULT;
  3042. if (count > sizeof(tmp)) {
  3043. rtw_warn_on(1);
  3044. return -EFAULT;
  3045. }
  3046. if (buffer && !copy_from_user(tmp, buffer, count)) {
  3047. int num = sscanf(tmp, "%d", &trigger_point);
  3048. if (trigger_point == SRESET_TGP_NULL)
  3049. rtw_hal_sreset_reset(padapter);
  3050. else
  3051. sreset_set_trigger_point(padapter, trigger_point);
  3052. }
  3053. return count;
  3054. }
  3055. #endif /* DBG_CONFIG_ERROR_DETECT */
  3056. #ifdef CONFIG_PCI_HCI
  3057. int proc_get_pci_aspm(struct seq_file *m, void *v)
  3058. {
  3059. struct net_device *dev = m->private;
  3060. _adapter *padapter = (_adapter *) rtw_netdev_priv(dev);
  3061. struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
  3062. HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
  3063. struct pci_priv *pcipriv = &(pdvobjpriv->pcipriv);
  3064. u8 tmp8 = 0;
  3065. u16 tmp16 = 0;
  3066. u32 tmp32 = 0;
  3067. RTW_PRINT_SEL(m, "***** ASPM Capability *****\n");
  3068. pci_read_config_dword(pdvobjpriv->ppcidev, pcipriv->pciehdr_offset + PCI_EXP_LNKCAP, &tmp32);
  3069. RTW_PRINT_SEL(m, "CLK REQ: %s\n", (tmp32&PCI_EXP_LNKCAP_CLKPM) ? "Enable" : "Disable");
  3070. RTW_PRINT_SEL(m, "ASPM L0s: %s\n", (tmp32&BIT10) ? "Enable" : "Disable");
  3071. RTW_PRINT_SEL(m, "ASPM L1: %s\n", (tmp32&BIT11) ? "Enable" : "Disable");
  3072. tmp8 = rtw_hal_pci_l1off_capability(padapter);
  3073. RTW_PRINT_SEL(m, "ASPM L1OFF: %s\n", tmp8 ? "Enable" : "Disable");
  3074. RTW_PRINT_SEL(m, "***** ASPM CTRL Reg *****\n");
  3075. pci_read_config_word(pdvobjpriv->ppcidev, pcipriv->pciehdr_offset + PCI_EXP_LNKCTL, &tmp16);
  3076. RTW_PRINT_SEL(m, "CLK REQ: %s\n", (tmp16&PCI_EXP_LNKCTL_CLKREQ_EN) ? "Enable" : "Disable");
  3077. RTW_PRINT_SEL(m, "ASPM L0s: %s\n", (tmp16&BIT0) ? "Enable" : "Disable");
  3078. RTW_PRINT_SEL(m, "ASPM L1: %s\n", (tmp16&BIT1) ? "Enable" : "Disable");
  3079. tmp8 = rtw_hal_pci_l1off_nic_support(padapter);
  3080. RTW_PRINT_SEL(m, "ASPM L1OFF: %s\n", tmp8 ? "Enable" : "Disable");
  3081. RTW_PRINT_SEL(m, "***** ASPM Backdoor *****\n");
  3082. tmp8 = rtw_hal_pci_dbi_read(padapter, 0x719);
  3083. RTW_PRINT_SEL(m, "CLK REQ: %s\n", (tmp8 & BIT4) ? "Enable" : "Disable");
  3084. tmp8 = rtw_hal_pci_dbi_read(padapter, 0x70f);
  3085. RTW_PRINT_SEL(m, "ASPM L0s: %s\n", (tmp8&BIT7) ? "Enable" : "Disable");
  3086. tmp8 = rtw_hal_pci_dbi_read(padapter, 0x719);
  3087. RTW_PRINT_SEL(m, "ASPM L1: %s\n", (tmp8 & BIT3) ? "Enable" : "Disable");
  3088. tmp8 = rtw_hal_pci_dbi_read(padapter, 0x718);
  3089. RTW_PRINT_SEL(m, "ASPM L1OFF: %s\n", (tmp8 & BIT5) ? "Enable" : "Disable");
  3090. return 0;
  3091. }
  3092. int proc_get_rx_ring(struct seq_file *m, void *v)
  3093. {
  3094. _irqL irqL;
  3095. struct net_device *dev = m->private;
  3096. _adapter *padapter = (_adapter *) rtw_netdev_priv(dev);
  3097. struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
  3098. struct recv_priv *precvpriv = &padapter->recvpriv;
  3099. struct rtw_rx_ring *rx_ring = &precvpriv->rx_ring[RX_MPDU_QUEUE];
  3100. int i, j;
  3101. RTW_PRINT_SEL(m, "rx ring (%p)\n", rx_ring);
  3102. RTW_PRINT_SEL(m, " dma: 0x%08x\n", (int) rx_ring->dma);
  3103. RTW_PRINT_SEL(m, " idx: %d\n", rx_ring->idx);
  3104. _enter_critical(&pdvobjpriv->irq_th_lock, &irqL);
  3105. for (i = 0; i < precvpriv->rxringcount; i++) {
  3106. #ifdef CONFIG_TRX_BD_ARCH
  3107. struct rx_buf_desc *entry = &rx_ring->buf_desc[i];
  3108. #else
  3109. struct recv_stat *entry = &rx_ring->desc[i];
  3110. #endif
  3111. struct sk_buff *skb = rx_ring->rx_buf[i];
  3112. RTW_PRINT_SEL(m, " desc[%03d]: %p, rx_buf[%03d]: 0x%08x\n",
  3113. i, entry, i, cpu_to_le32(*((dma_addr_t *)skb->cb)));
  3114. for (j = 0; j < sizeof(*entry) / 4; j++) {
  3115. if ((j % 4) == 0)
  3116. RTW_PRINT_SEL(m, " 0x%03x", j);
  3117. RTW_PRINT_SEL(m, " 0x%08x ", ((int *) entry)[j]);
  3118. if ((j % 4) == 3)
  3119. RTW_PRINT_SEL(m, "\n");
  3120. }
  3121. }
  3122. _exit_critical(&pdvobjpriv->irq_th_lock, &irqL);
  3123. return 0;
  3124. }
  3125. int proc_get_tx_ring(struct seq_file *m, void *v)
  3126. {
  3127. _irqL irqL;
  3128. struct net_device *dev = m->private;
  3129. _adapter *padapter = (_adapter *) rtw_netdev_priv(dev);
  3130. struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
  3131. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  3132. int i, j, k;
  3133. _enter_critical(&pdvobjpriv->irq_th_lock, &irqL);
  3134. for (i = 0; i < PCI_MAX_TX_QUEUE_COUNT; i++) {
  3135. struct rtw_tx_ring *tx_ring = &pxmitpriv->tx_ring[i];
  3136. RTW_PRINT_SEL(m, "tx ring[%d] (%p)\n", i, tx_ring);
  3137. RTW_PRINT_SEL(m, " dma: 0x%08x\n", (int) tx_ring->dma);
  3138. RTW_PRINT_SEL(m, " idx: %d\n", tx_ring->idx);
  3139. RTW_PRINT_SEL(m, " entries: %d\n", tx_ring->entries);
  3140. /* RTW_PRINT_SEL(m, " queue: %d\n", tx_ring->queue); */
  3141. RTW_PRINT_SEL(m, " qlen: %d\n", tx_ring->qlen);
  3142. for (j = 0; j < pxmitpriv->txringcount[i]; j++) {
  3143. #ifdef CONFIG_TRX_BD_ARCH
  3144. struct tx_buf_desc *entry = &tx_ring->buf_desc[j];
  3145. #else
  3146. struct tx_desc *entry = &tx_ring->desc[j];
  3147. #endif
  3148. RTW_PRINT_SEL(m, " desc[%03d]: %p\n", j, entry);
  3149. for (k = 0; k < sizeof(*entry) / 4; k++) {
  3150. if ((k % 4) == 0)
  3151. RTW_PRINT_SEL(m, " 0x%03x", k);
  3152. RTW_PRINT_SEL(m, " 0x%08x ", ((int *) entry)[k]);
  3153. if ((k % 4) == 3)
  3154. RTW_PRINT_SEL(m, "\n");
  3155. }
  3156. }
  3157. }
  3158. _exit_critical(&pdvobjpriv->irq_th_lock, &irqL);
  3159. return 0;
  3160. }
  3161. #endif
  3162. #ifdef CONFIG_WOWLAN
  3163. int proc_get_pattern_info(struct seq_file *m, void *v)
  3164. {
  3165. struct net_device *dev = m->private;
  3166. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  3167. struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
  3168. struct registry_priv *pregistrypriv = &padapter->registrypriv;
  3169. u8 pattern_num = 0, val8;
  3170. char str_1[128];
  3171. char *p_str;
  3172. int i = 0 , j = 0, k = 0;
  3173. int len = 0, max_len = 0, total = 0;
  3174. p_str = str_1;
  3175. max_len = sizeof(str_1);
  3176. total = pwrpriv->wowlan_pattern_idx;
  3177. rtw_set_default_pattern(padapter);
  3178. /*show pattern*/
  3179. RTW_PRINT_SEL(m, "\n======[Pattern Info.]======\n");
  3180. RTW_PRINT_SEL(m, "pattern number: %d\n", total);
  3181. RTW_PRINT_SEL(m, "support default patterns: %c\n",
  3182. (pregistrypriv->default_patterns_en) ? 'Y' : 'N');
  3183. for (k = 0; k < total ; k++) {
  3184. RTW_PRINT_SEL(m, "\npattern idx: %d\n", k);
  3185. RTW_PRINT_SEL(m, "pattern content:\n");
  3186. p_str = str_1;
  3187. max_len = sizeof(str_1);
  3188. for (i = 0 ; i < MAX_WKFM_PATTERN_SIZE / 8 ; i++) {
  3189. _rtw_memset(p_str, 0, max_len);
  3190. len = 0;
  3191. for (j = 0 ; j < 8 ; j++) {
  3192. val8 = pwrpriv->patterns[k].content[i * 8 + j];
  3193. len += snprintf(p_str + len, max_len - len,
  3194. "%02x ", val8);
  3195. }
  3196. RTW_PRINT_SEL(m, "%s\n", p_str);
  3197. }
  3198. RTW_PRINT_SEL(m, "\npattern mask:\n");
  3199. for (i = 0 ; i < MAX_WKFM_SIZE / 8 ; i++) {
  3200. _rtw_memset(p_str, 0, max_len);
  3201. len = 0;
  3202. for (j = 0 ; j < 8 ; j++) {
  3203. val8 = pwrpriv->patterns[k].mask[i * 8 + j];
  3204. len += snprintf(p_str + len, max_len - len,
  3205. "%02x ", val8);
  3206. }
  3207. RTW_PRINT_SEL(m, "%s\n", p_str);
  3208. }
  3209. RTW_PRINT_SEL(m, "\npriv_pattern_len:\n");
  3210. RTW_PRINT_SEL(m, "pattern_len: %d\n", pwrpriv->patterns[k].len);
  3211. RTW_PRINT_SEL(m, "*****************\n");
  3212. }
  3213. return 0;
  3214. }
  3215. ssize_t proc_set_pattern_info(struct file *file, const char __user *buffer,
  3216. size_t count, loff_t *pos, void *data)
  3217. {
  3218. struct net_device *dev = data;
  3219. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  3220. struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
  3221. struct wowlan_ioctl_param poidparam;
  3222. u8 tmp[MAX_WKFM_PATTERN_SIZE] = {0};
  3223. int ret = 0, num = 0;
  3224. u8 index = 0;
  3225. poidparam.subcode = 0;
  3226. if (count < 1)
  3227. return -EFAULT;
  3228. if (count > sizeof(tmp)) {
  3229. rtw_warn_on(1);
  3230. return -EFAULT;
  3231. }
  3232. if (pwrpriv->wowlan_pattern_idx >= MAX_WKFM_CAM_NUM) {
  3233. RTW_INFO("WARNING: priv-pattern is full(idx: %d)\n",
  3234. pwrpriv->wowlan_pattern_idx);
  3235. RTW_INFO("WARNING: please clean priv-pattern first\n");
  3236. return -ENOMEM;
  3237. }
  3238. if (buffer && !copy_from_user(tmp, buffer, count)) {
  3239. if (strncmp(tmp, "clean", 5) == 0) {
  3240. poidparam.subcode = WOWLAN_PATTERN_CLEAN;
  3241. rtw_hal_set_hwreg(padapter,
  3242. HW_VAR_WOWLAN, (u8 *)&poidparam);
  3243. } else {
  3244. index = pwrpriv->wowlan_pattern_idx;
  3245. ret = rtw_wowlan_parser_pattern_cmd(tmp,
  3246. pwrpriv->patterns[index].content,
  3247. &pwrpriv->patterns[index].len,
  3248. pwrpriv->patterns[index].mask);
  3249. if (ret == _TRUE)
  3250. pwrpriv->wowlan_pattern_idx++;
  3251. }
  3252. }
  3253. return count;
  3254. }
  3255. int proc_get_wakeup_reason(struct seq_file *m, void *v)
  3256. {
  3257. struct net_device *dev = m->private;
  3258. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  3259. struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
  3260. u8 val = pwrpriv->wowlan_last_wake_reason;
  3261. RTW_PRINT_SEL(m, "last wake reason: %#02x\n", val);
  3262. return 0;
  3263. }
  3264. #endif /*CONFIG_WOWLAN*/
  3265. #ifdef CONFIG_GPIO_WAKEUP
  3266. int proc_get_wowlan_gpio_info(struct seq_file *m, void *v)
  3267. {
  3268. struct net_device *dev = m->private;
  3269. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  3270. struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
  3271. u8 val = pwrpriv->is_high_active;
  3272. RTW_PRINT_SEL(m, "wakeup_gpio_idx: %d\n", WAKEUP_GPIO_IDX);
  3273. RTW_PRINT_SEL(m, "high_active: %d\n", val);
  3274. return 0;
  3275. }
  3276. ssize_t proc_set_wowlan_gpio_info(struct file *file, const char __user *buffer,
  3277. size_t count, loff_t *pos, void *data)
  3278. {
  3279. struct net_device *dev = data;
  3280. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  3281. struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
  3282. char tmp[32] = {0};
  3283. int num = 0;
  3284. u32 is_high_active = 0;
  3285. u8 val8 = 0;
  3286. if (count < 1)
  3287. return -EFAULT;
  3288. if (count > sizeof(tmp)) {
  3289. rtw_warn_on(1);
  3290. return -EFAULT;
  3291. }
  3292. if (buffer && !copy_from_user(tmp, buffer, count)) {
  3293. num = sscanf(tmp, "%u", &is_high_active);
  3294. is_high_active = is_high_active == 0 ? 0 : 1;
  3295. pwrpriv->is_high_active = is_high_active;
  3296. rtw_ps_deny(padapter, PS_DENY_IOCTL);
  3297. LeaveAllPowerSaveModeDirect(padapter);
  3298. val8 = (pwrpriv->is_high_active == 0) ? 1 : 0;
  3299. rtw_hal_set_output_gpio(padapter, WAKEUP_GPIO_IDX, val8);
  3300. rtw_ps_deny_cancel(padapter, PS_DENY_IOCTL);
  3301. RTW_INFO("set %s %d\n", "gpio_high_active",
  3302. pwrpriv->is_high_active);
  3303. RTW_INFO("%s: set GPIO_%d %d as default.\n",
  3304. __func__, WAKEUP_GPIO_IDX, val8);
  3305. }
  3306. return count;
  3307. }
  3308. #endif /* CONFIG_GPIO_WAKEUP */
  3309. #ifdef CONFIG_P2P_WOWLAN
  3310. int proc_get_p2p_wowlan_info(struct seq_file *m, void *v)
  3311. {
  3312. struct net_device *dev = m->private;
  3313. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  3314. struct wifidirect_info *pwdinfo = &(padapter->wdinfo);
  3315. struct p2p_wowlan_info peerinfo = pwdinfo->p2p_wow_info;
  3316. if (_TRUE == peerinfo.is_trigger) {
  3317. RTW_PRINT_SEL(m, "is_trigger: TRUE\n");
  3318. switch (peerinfo.wowlan_recv_frame_type) {
  3319. case P2P_WOWLAN_RECV_NEGO_REQ:
  3320. RTW_PRINT_SEL(m, "Frame Type: Nego Request\n");
  3321. break;
  3322. case P2P_WOWLAN_RECV_INVITE_REQ:
  3323. RTW_PRINT_SEL(m, "Frame Type: Invitation Request\n");
  3324. break;
  3325. case P2P_WOWLAN_RECV_PROVISION_REQ:
  3326. RTW_PRINT_SEL(m, "Frame Type: Provision Request\n");
  3327. break;
  3328. default:
  3329. break;
  3330. }
  3331. RTW_PRINT_SEL(m, "Peer Addr: "MAC_FMT"\n", MAC_ARG(peerinfo.wowlan_peer_addr));
  3332. RTW_PRINT_SEL(m, "Peer WPS Config: %x\n", peerinfo.wowlan_peer_wpsconfig);
  3333. RTW_PRINT_SEL(m, "Persistent Group: %d\n", peerinfo.wowlan_peer_is_persistent);
  3334. RTW_PRINT_SEL(m, "Intivation Type: %d\n", peerinfo.wowlan_peer_invitation_type);
  3335. } else
  3336. RTW_PRINT_SEL(m, "is_trigger: False\n");
  3337. return 0;
  3338. }
  3339. #endif /* CONFIG_P2P_WOWLAN */
  3340. int proc_get_new_bcn_max(struct seq_file *m, void *v)
  3341. {
  3342. extern int new_bcn_max;
  3343. RTW_PRINT_SEL(m, "%d", new_bcn_max);
  3344. return 0;
  3345. }
  3346. ssize_t proc_set_new_bcn_max(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  3347. {
  3348. char tmp[32];
  3349. extern int new_bcn_max;
  3350. if (count < 1)
  3351. return -EFAULT;
  3352. if (count > sizeof(tmp)) {
  3353. rtw_warn_on(1);
  3354. return -EFAULT;
  3355. }
  3356. if (buffer && !copy_from_user(tmp, buffer, count))
  3357. sscanf(tmp, "%d ", &new_bcn_max);
  3358. return count;
  3359. }
  3360. #ifdef CONFIG_POWER_SAVING
  3361. int proc_get_ps_info(struct seq_file *m, void *v)
  3362. {
  3363. struct net_device *dev = m->private;
  3364. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  3365. struct pwrctrl_priv *pwrpriv = adapter_to_pwrctl(padapter);
  3366. u8 ips_mode = pwrpriv->ips_mode;
  3367. u8 lps_mode = pwrpriv->power_mgnt;
  3368. u8 lps_level = pwrpriv->lps_level;
  3369. char *str = "";
  3370. RTW_PRINT_SEL(m, "======Power Saving Info:======\n");
  3371. RTW_PRINT_SEL(m, "*IPS:\n");
  3372. if (ips_mode == IPS_NORMAL) {
  3373. #ifdef CONFIG_FWLPS_IN_IPS
  3374. str = "FW_LPS_IN_IPS";
  3375. #else
  3376. str = "Card Disable";
  3377. #endif
  3378. } else if (ips_mode == IPS_NONE)
  3379. str = "NO IPS";
  3380. else if (ips_mode == IPS_LEVEL_2)
  3381. str = "IPS_LEVEL_2";
  3382. else
  3383. str = "invalid ips_mode";
  3384. RTW_PRINT_SEL(m, " IPS mode: %s\n", str);
  3385. RTW_PRINT_SEL(m, " IPS enter count:%d, IPS leave count:%d\n",
  3386. pwrpriv->ips_enter_cnts, pwrpriv->ips_leave_cnts);
  3387. RTW_PRINT_SEL(m, "------------------------------\n");
  3388. RTW_PRINT_SEL(m, "*LPS:\n");
  3389. if (lps_mode == PS_MODE_ACTIVE)
  3390. str = "NO LPS";
  3391. else if (lps_mode == PS_MODE_MIN)
  3392. str = "MIN";
  3393. else if (lps_mode == PS_MODE_MAX)
  3394. str = "MAX";
  3395. else if (lps_mode == PS_MODE_DTIM)
  3396. str = "DTIM";
  3397. else
  3398. sprintf(str, "%d", lps_mode);
  3399. RTW_PRINT_SEL(m, " LPS mode: %s\n", str);
  3400. if (pwrpriv->dtim != 0)
  3401. RTW_PRINT_SEL(m, " DTIM: %d\n", pwrpriv->dtim);
  3402. RTW_PRINT_SEL(m, " LPS enter count:%d, LPS leave count:%d\n",
  3403. pwrpriv->lps_enter_cnts, pwrpriv->lps_leave_cnts);
  3404. if (lps_level == LPS_LCLK)
  3405. str = "LPS_LCLK";
  3406. else if (lps_level == LPS_PG)
  3407. str = "LPS_PG";
  3408. else
  3409. str = "LPS_NORMAL";
  3410. RTW_PRINT_SEL(m, " LPS level: %s\n", str);
  3411. RTW_PRINT_SEL(m, "=============================\n");
  3412. return 0;
  3413. }
  3414. #endif /* CONFIG_POWER_SAVING */
  3415. #ifdef CONFIG_TDLS
  3416. static int proc_tdls_display_tdls_function_info(struct seq_file *m)
  3417. {
  3418. struct net_device *dev = m->private;
  3419. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  3420. struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  3421. u8 SpaceBtwnItemAndValue = TDLS_DBG_INFO_SPACE_BTWN_ITEM_AND_VALUE;
  3422. u8 SpaceBtwnItemAndValueTmp = 0;
  3423. BOOLEAN FirstMatchFound = _FALSE;
  3424. int j = 0;
  3425. RTW_PRINT_SEL(m, "============[TDLS Function Info]============\n");
  3426. RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Prohibited", (ptdlsinfo->ap_prohibited == _TRUE) ? "_TRUE" : "_FALSE");
  3427. RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Channel Switch Prohibited", (ptdlsinfo->ch_switch_prohibited == _TRUE) ? "_TRUE" : "_FALSE");
  3428. RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Link Established", (ptdlsinfo->link_established == _TRUE) ? "_TRUE" : "_FALSE");
  3429. RTW_PRINT_SEL(m, "%-*s = %d/%d\n", SpaceBtwnItemAndValue, "TDLS STA Num (Linked/Allowed)", ptdlsinfo->sta_cnt, MAX_ALLOWED_TDLS_STA_NUM);
  3430. RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Allowed STA Num Reached", (ptdlsinfo->sta_maximum == _TRUE) ? "_TRUE" : "_FALSE");
  3431. #ifdef CONFIG_TDLS_CH_SW
  3432. RTW_PRINT_SEL(m, "%-*s =", SpaceBtwnItemAndValue, "TDLS CH SW State");
  3433. if (ptdlsinfo->chsw_info.ch_sw_state == TDLS_STATE_NONE)
  3434. RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_STATE_NONE");
  3435. else {
  3436. for (j = 0; j < 32; j++) {
  3437. if (ptdlsinfo->chsw_info.ch_sw_state & BIT(j)) {
  3438. if (FirstMatchFound == _FALSE) {
  3439. SpaceBtwnItemAndValueTmp = 1;
  3440. FirstMatchFound = _TRUE;
  3441. } else
  3442. SpaceBtwnItemAndValueTmp = SpaceBtwnItemAndValue + 3;
  3443. switch (BIT(j)) {
  3444. case TDLS_INITIATOR_STATE:
  3445. RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_INITIATOR_STATE");
  3446. break;
  3447. case TDLS_RESPONDER_STATE:
  3448. RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_RESPONDER_STATE");
  3449. break;
  3450. case TDLS_LINKED_STATE:
  3451. RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_LINKED_STATE");
  3452. break;
  3453. case TDLS_WAIT_PTR_STATE:
  3454. RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_WAIT_PTR_STATE");
  3455. break;
  3456. case TDLS_ALIVE_STATE:
  3457. RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_ALIVE_STATE");
  3458. break;
  3459. case TDLS_CH_SWITCH_ON_STATE:
  3460. RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_CH_SWITCH_ON_STATE");
  3461. break;
  3462. case TDLS_PEER_AT_OFF_STATE:
  3463. RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_PEER_AT_OFF_STATE");
  3464. break;
  3465. case TDLS_CH_SW_INITIATOR_STATE:
  3466. RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_CH_SW_INITIATOR_STATE");
  3467. break;
  3468. case TDLS_WAIT_CH_RSP_STATE:
  3469. RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValue, " ", "TDLS_WAIT_CH_RSP_STATE");
  3470. break;
  3471. default:
  3472. RTW_PRINT_SEL(m, "%-*sBIT(%d)\n", SpaceBtwnItemAndValueTmp, " ", j);
  3473. break;
  3474. }
  3475. }
  3476. }
  3477. }
  3478. RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS CH SW On", (ATOMIC_READ(&ptdlsinfo->chsw_info.chsw_on) == _TRUE) ? "_TRUE" : "_FALSE");
  3479. RTW_PRINT_SEL(m, "%-*s = %d\n", SpaceBtwnItemAndValue, "TDLS CH SW Off-Channel Num", ptdlsinfo->chsw_info.off_ch_num);
  3480. RTW_PRINT_SEL(m, "%-*s = %d\n", SpaceBtwnItemAndValue, "TDLS CH SW Channel Offset", ptdlsinfo->chsw_info.ch_offset);
  3481. RTW_PRINT_SEL(m, "%-*s = %d\n", SpaceBtwnItemAndValue, "TDLS CH SW Current Time", ptdlsinfo->chsw_info.cur_time);
  3482. RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS CH SW Delay Switch Back", (ptdlsinfo->chsw_info.delay_switch_back == _TRUE) ? "_TRUE" : "_FALSE");
  3483. RTW_PRINT_SEL(m, "%-*s = %d\n", SpaceBtwnItemAndValue, "TDLS CH SW Dump Back", ptdlsinfo->chsw_info.dump_stack);
  3484. #endif
  3485. RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Device Discovered", (ptdlsinfo->dev_discovered == _TRUE) ? "_TRUE" : "_FALSE");
  3486. RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Enable", (ptdlsinfo->tdls_enable == _TRUE) ? "_TRUE" : "_FALSE");
  3487. RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "TDLS Driver Setup", (ptdlsinfo->driver_setup == _TRUE) ? "_TRUE" : "_FALSE");
  3488. return 0;
  3489. }
  3490. static int proc_tdls_display_network_info(struct seq_file *m)
  3491. {
  3492. struct net_device *dev = m->private;
  3493. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  3494. struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  3495. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  3496. struct wlan_network *cur_network = &(pmlmepriv->cur_network);
  3497. int i = 0;
  3498. u8 SpaceBtwnItemAndValue = TDLS_DBG_INFO_SPACE_BTWN_ITEM_AND_VALUE;
  3499. /* Display the linked AP/GO info */
  3500. RTW_PRINT_SEL(m, "============[Associated AP/GO Info]============\n");
  3501. if ((pmlmepriv->fw_state & WIFI_STATION_STATE) && (pmlmepriv->fw_state & _FW_LINKED)) {
  3502. RTW_PRINT_SEL(m, "%-*s = %s\n", SpaceBtwnItemAndValue, "BSSID", cur_network->network.Ssid.Ssid);
  3503. RTW_PRINT_SEL(m, "%-*s = "MAC_FMT"\n", SpaceBtwnItemAndValue, "Mac Address", MAC_ARG(cur_network->network.MacAddress));
  3504. RTW_PRINT_SEL(m, "%-*s = ", SpaceBtwnItemAndValue, "Wireless Mode");
  3505. for (i = 0; i < 8; i++) {
  3506. if (pmlmeext->cur_wireless_mode & BIT(i)) {
  3507. switch (BIT(i)) {
  3508. case WIRELESS_11B:
  3509. RTW_PRINT_SEL(m, "%4s", "11B ");
  3510. break;
  3511. case WIRELESS_11G:
  3512. RTW_PRINT_SEL(m, "%4s", "11G ");
  3513. break;
  3514. case WIRELESS_11A:
  3515. RTW_PRINT_SEL(m, "%4s", "11A ");
  3516. break;
  3517. case WIRELESS_11_24N:
  3518. RTW_PRINT_SEL(m, "%7s", "11_24N ");
  3519. break;
  3520. case WIRELESS_11_5N:
  3521. RTW_PRINT_SEL(m, "%6s", "11_5N ");
  3522. break;
  3523. case WIRELESS_AUTO:
  3524. RTW_PRINT_SEL(m, "%5s", "AUTO ");
  3525. break;
  3526. case WIRELESS_11AC:
  3527. RTW_PRINT_SEL(m, "%5s", "11AC ");
  3528. break;
  3529. }
  3530. }
  3531. }
  3532. RTW_PRINT_SEL(m, "\n");
  3533. RTW_PRINT_SEL(m, "%-*s = ", SpaceBtwnItemAndValue, "Privacy");
  3534. switch (padapter->securitypriv.dot11PrivacyAlgrthm) {
  3535. case _NO_PRIVACY_:
  3536. RTW_PRINT_SEL(m, "%s\n", "NO PRIVACY");
  3537. break;
  3538. case _WEP40_:
  3539. RTW_PRINT_SEL(m, "%s\n", "WEP 40");
  3540. break;
  3541. case _TKIP_:
  3542. RTW_PRINT_SEL(m, "%s\n", "TKIP");
  3543. break;
  3544. case _TKIP_WTMIC_:
  3545. RTW_PRINT_SEL(m, "%s\n", "TKIP WTMIC");
  3546. break;
  3547. case _AES_:
  3548. RTW_PRINT_SEL(m, "%s\n", "AES");
  3549. break;
  3550. case _WEP104_:
  3551. RTW_PRINT_SEL(m, "%s\n", "WEP 104");
  3552. break;
  3553. case _WEP_WPA_MIXED_:
  3554. RTW_PRINT_SEL(m, "%s\n", "WEP/WPA Mixed");
  3555. break;
  3556. case _SMS4_:
  3557. RTW_PRINT_SEL(m, "%s\n", "SMS4");
  3558. break;
  3559. #ifdef CONFIG_IEEE80211W
  3560. case _BIP_:
  3561. RTW_PRINT_SEL(m, "%s\n", "BIP");
  3562. break;
  3563. #endif /* CONFIG_IEEE80211W */
  3564. }
  3565. RTW_PRINT_SEL(m, "%-*s = %d\n", SpaceBtwnItemAndValue, "Channel", pmlmeext->cur_channel);
  3566. RTW_PRINT_SEL(m, "%-*s = ", SpaceBtwnItemAndValue, "Channel Offset");
  3567. switch (pmlmeext->cur_ch_offset) {
  3568. case HAL_PRIME_CHNL_OFFSET_DONT_CARE:
  3569. RTW_PRINT_SEL(m, "%s\n", "N/A");
  3570. break;
  3571. case HAL_PRIME_CHNL_OFFSET_LOWER:
  3572. RTW_PRINT_SEL(m, "%s\n", "Lower");
  3573. break;
  3574. case HAL_PRIME_CHNL_OFFSET_UPPER:
  3575. RTW_PRINT_SEL(m, "%s\n", "Upper");
  3576. break;
  3577. }
  3578. RTW_PRINT_SEL(m, "%-*s = ", SpaceBtwnItemAndValue, "Bandwidth Mode");
  3579. switch (pmlmeext->cur_bwmode) {
  3580. case CHANNEL_WIDTH_20:
  3581. RTW_PRINT_SEL(m, "%s\n", "20MHz");
  3582. break;
  3583. case CHANNEL_WIDTH_40:
  3584. RTW_PRINT_SEL(m, "%s\n", "40MHz");
  3585. break;
  3586. case CHANNEL_WIDTH_80:
  3587. RTW_PRINT_SEL(m, "%s\n", "80MHz");
  3588. break;
  3589. case CHANNEL_WIDTH_160:
  3590. RTW_PRINT_SEL(m, "%s\n", "160MHz");
  3591. break;
  3592. case CHANNEL_WIDTH_80_80:
  3593. RTW_PRINT_SEL(m, "%s\n", "80MHz + 80MHz");
  3594. break;
  3595. }
  3596. } else
  3597. RTW_PRINT_SEL(m, "No association with AP/GO exists!\n");
  3598. return 0;
  3599. }
  3600. static int proc_tdls_display_tdls_sta_info(struct seq_file *m)
  3601. {
  3602. struct net_device *dev = m->private;
  3603. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  3604. struct sta_priv *pstapriv = &padapter->stapriv;
  3605. struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  3606. struct sta_info *psta;
  3607. int i = 0, j = 0;
  3608. _irqL irqL;
  3609. _list *plist, *phead;
  3610. u8 SpaceBtwnItemAndValue = TDLS_DBG_INFO_SPACE_BTWN_ITEM_AND_VALUE;
  3611. u8 SpaceBtwnItemAndValueTmp = 0;
  3612. u8 NumOfTdlsStaToShow = 0;
  3613. BOOLEAN FirstMatchFound = _FALSE;
  3614. /* Search for TDLS sta info to display */
  3615. _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  3616. for (i = 0; i < NUM_STA; i++) {
  3617. phead = &(pstapriv->sta_hash[i]);
  3618. plist = get_next(phead);
  3619. while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {
  3620. psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
  3621. plist = get_next(plist);
  3622. if (psta->tdls_sta_state != TDLS_STATE_NONE) {
  3623. /* We got one TDLS sta info to show */
  3624. RTW_PRINT_SEL(m, "============[TDLS Peer STA Info: STA %d]============\n", ++NumOfTdlsStaToShow);
  3625. RTW_PRINT_SEL(m, "%-*s = "MAC_FMT"\n", SpaceBtwnItemAndValue, "Mac Address", MAC_ARG(psta->hwaddr));
  3626. RTW_PRINT_SEL(m, "%-*s =", SpaceBtwnItemAndValue, "TDLS STA State");
  3627. SpaceBtwnItemAndValueTmp = 0;
  3628. FirstMatchFound = _FALSE;
  3629. for (j = 0; j < 32; j++) {
  3630. if (psta->tdls_sta_state & BIT(j)) {
  3631. if (FirstMatchFound == _FALSE) {
  3632. SpaceBtwnItemAndValueTmp = 1;
  3633. FirstMatchFound = _TRUE;
  3634. } else
  3635. SpaceBtwnItemAndValueTmp = SpaceBtwnItemAndValue + 3;
  3636. switch (BIT(j)) {
  3637. case TDLS_INITIATOR_STATE:
  3638. RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_INITIATOR_STATE");
  3639. break;
  3640. case TDLS_RESPONDER_STATE:
  3641. RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_RESPONDER_STATE");
  3642. break;
  3643. case TDLS_LINKED_STATE:
  3644. RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_LINKED_STATE");
  3645. break;
  3646. case TDLS_WAIT_PTR_STATE:
  3647. RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_WAIT_PTR_STATE");
  3648. break;
  3649. case TDLS_ALIVE_STATE:
  3650. RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_ALIVE_STATE");
  3651. break;
  3652. case TDLS_CH_SWITCH_ON_STATE:
  3653. RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_CH_SWITCH_ON_STATE");
  3654. break;
  3655. case TDLS_PEER_AT_OFF_STATE:
  3656. RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_PEER_AT_OFF_STATE");
  3657. break;
  3658. case TDLS_CH_SW_INITIATOR_STATE:
  3659. RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValueTmp, " ", "TDLS_CH_SW_INITIATOR_STATE");
  3660. break;
  3661. case TDLS_WAIT_CH_RSP_STATE:
  3662. RTW_PRINT_SEL(m, "%-*s%s\n", SpaceBtwnItemAndValue, " ", "TDLS_WAIT_CH_RSP_STATE");
  3663. break;
  3664. default:
  3665. RTW_PRINT_SEL(m, "%-*sBIT(%d)\n", SpaceBtwnItemAndValueTmp, " ", j);
  3666. break;
  3667. }
  3668. }
  3669. }
  3670. RTW_PRINT_SEL(m, "%-*s = ", SpaceBtwnItemAndValue, "Wireless Mode");
  3671. for (j = 0; j < 8; j++) {
  3672. if (psta->wireless_mode & BIT(j)) {
  3673. switch (BIT(j)) {
  3674. case WIRELESS_11B:
  3675. RTW_PRINT_SEL(m, "%4s", "11B ");
  3676. break;
  3677. case WIRELESS_11G:
  3678. RTW_PRINT_SEL(m, "%4s", "11G ");
  3679. break;
  3680. case WIRELESS_11A:
  3681. RTW_PRINT_SEL(m, "%4s", "11A ");
  3682. break;
  3683. case WIRELESS_11_24N:
  3684. RTW_PRINT_SEL(m, "%7s", "11_24N ");
  3685. break;
  3686. case WIRELESS_11_5N:
  3687. RTW_PRINT_SEL(m, "%6s", "11_5N ");
  3688. break;
  3689. case WIRELESS_AUTO:
  3690. RTW_PRINT_SEL(m, "%5s", "AUTO ");
  3691. break;
  3692. case WIRELESS_11AC:
  3693. RTW_PRINT_SEL(m, "%5s", "11AC ");
  3694. break;
  3695. }
  3696. }
  3697. }
  3698. RTW_PRINT_SEL(m, "\n");
  3699. RTW_PRINT_SEL(m, "%-*s = ", SpaceBtwnItemAndValue, "Bandwidth Mode");
  3700. switch (psta->bw_mode) {
  3701. case CHANNEL_WIDTH_20:
  3702. RTW_PRINT_SEL(m, "%s\n", "20MHz");
  3703. break;
  3704. case CHANNEL_WIDTH_40:
  3705. RTW_PRINT_SEL(m, "%s\n", "40MHz");
  3706. break;
  3707. case CHANNEL_WIDTH_80:
  3708. RTW_PRINT_SEL(m, "%s\n", "80MHz");
  3709. break;
  3710. case CHANNEL_WIDTH_160:
  3711. RTW_PRINT_SEL(m, "%s\n", "160MHz");
  3712. break;
  3713. case CHANNEL_WIDTH_80_80:
  3714. RTW_PRINT_SEL(m, "%s\n", "80MHz + 80MHz");
  3715. break;
  3716. }
  3717. RTW_PRINT_SEL(m, "%-*s = ", SpaceBtwnItemAndValue, "Privacy");
  3718. switch (psta->dot118021XPrivacy) {
  3719. case _NO_PRIVACY_:
  3720. RTW_PRINT_SEL(m, "%s\n", "NO PRIVACY");
  3721. break;
  3722. case _WEP40_:
  3723. RTW_PRINT_SEL(m, "%s\n", "WEP 40");
  3724. break;
  3725. case _TKIP_:
  3726. RTW_PRINT_SEL(m, "%s\n", "TKIP");
  3727. break;
  3728. case _TKIP_WTMIC_:
  3729. RTW_PRINT_SEL(m, "%s\n", "TKIP WTMIC");
  3730. break;
  3731. case _AES_:
  3732. RTW_PRINT_SEL(m, "%s\n", "AES");
  3733. break;
  3734. case _WEP104_:
  3735. RTW_PRINT_SEL(m, "%s\n", "WEP 104");
  3736. break;
  3737. case _WEP_WPA_MIXED_:
  3738. RTW_PRINT_SEL(m, "%s\n", "WEP/WPA Mixed");
  3739. break;
  3740. case _SMS4_:
  3741. RTW_PRINT_SEL(m, "%s\n", "SMS4");
  3742. break;
  3743. #ifdef CONFIG_IEEE80211W
  3744. case _BIP_:
  3745. RTW_PRINT_SEL(m, "%s\n", "BIP");
  3746. break;
  3747. #endif /* CONFIG_IEEE80211W */
  3748. }
  3749. RTW_PRINT_SEL(m, "%-*s = %d sec/%d sec\n", SpaceBtwnItemAndValue, "TPK Lifetime (Current/Expire)", psta->TPK_count, psta->TDLS_PeerKey_Lifetime);
  3750. RTW_PRINT_SEL(m, "%-*s = %llu\n", SpaceBtwnItemAndValue, "Tx Packets Over Direct Link", psta->sta_stats.tx_pkts);
  3751. RTW_PRINT_SEL(m, "%-*s = %llu\n", SpaceBtwnItemAndValue, "Rx Packets Over Direct Link", psta->sta_stats.rx_data_pkts);
  3752. }
  3753. }
  3754. }
  3755. _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  3756. if (NumOfTdlsStaToShow == 0) {
  3757. RTW_PRINT_SEL(m, "============[TDLS Peer STA Info]============\n");
  3758. RTW_PRINT_SEL(m, "No TDLS direct link exists!\n");
  3759. }
  3760. return 0;
  3761. }
  3762. int proc_get_tdls_info(struct seq_file *m, void *v)
  3763. {
  3764. struct net_device *dev = m->private;
  3765. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  3766. struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  3767. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  3768. struct wlan_network *cur_network = &(pmlmepriv->cur_network);
  3769. struct sta_priv *pstapriv = &padapter->stapriv;
  3770. struct tdls_info *ptdlsinfo = &padapter->tdlsinfo;
  3771. struct sta_info *psta;
  3772. int i = 0, j = 0;
  3773. _irqL irqL;
  3774. _list *plist, *phead;
  3775. u8 SpaceBtwnItemAndValue = 41;
  3776. u8 SpaceBtwnItemAndValueTmp = 0;
  3777. u8 NumOfTdlsStaToShow = 0;
  3778. BOOLEAN FirstMatchFound = _FALSE;
  3779. if (hal_chk_wl_func(padapter, WL_FUNC_TDLS) == _FALSE) {
  3780. RTW_PRINT_SEL(m, "No tdls info can be shown since hal doesn't support tdls\n");
  3781. return 0;
  3782. }
  3783. proc_tdls_display_tdls_function_info(m);
  3784. proc_tdls_display_network_info(m);
  3785. proc_tdls_display_tdls_sta_info(m);
  3786. return 0;
  3787. }
  3788. #endif
  3789. int proc_get_monitor(struct seq_file *m, void *v)
  3790. {
  3791. struct net_device *dev = m->private;
  3792. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  3793. struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  3794. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  3795. if (WIFI_MONITOR_STATE == get_fwstate(pmlmepriv)) {
  3796. RTW_PRINT_SEL(m, "Monitor mode : Enable\n");
  3797. RTW_PRINT_SEL(m, "ch=%d, ch_offset=%d, bw=%d\n",
  3798. rtw_get_oper_ch(padapter), rtw_get_oper_choffset(padapter), rtw_get_oper_bw(padapter));
  3799. } else
  3800. RTW_PRINT_SEL(m, "Monitor mode : Disable\n");
  3801. return 0;
  3802. }
  3803. ssize_t proc_set_monitor(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  3804. {
  3805. char tmp[32];
  3806. struct net_device *dev = data;
  3807. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  3808. u8 target_chan, target_offset, target_bw;
  3809. if (count < 3) {
  3810. RTW_INFO("argument size is less than 3\n");
  3811. return -EFAULT;
  3812. }
  3813. if (count > sizeof(tmp)) {
  3814. rtw_warn_on(1);
  3815. return -EFAULT;
  3816. }
  3817. if (buffer && !copy_from_user(tmp, buffer, count)) {
  3818. int num = sscanf(tmp, "%hhu %hhu %hhu", &target_chan, &target_offset, &target_bw);
  3819. if (num != 3) {
  3820. RTW_INFO("invalid write_reg parameter!\n");
  3821. return count;
  3822. }
  3823. padapter->mlmeextpriv.cur_channel = target_chan;
  3824. set_channel_bwmode(padapter, target_chan, target_offset, target_bw);
  3825. }
  3826. return count;
  3827. }
  3828. #ifdef DBG_XMIT_BLOCK
  3829. int proc_get_xmit_block(struct seq_file *m, void *v)
  3830. {
  3831. struct net_device *dev = m->private;
  3832. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  3833. dump_xmit_block(m, padapter);
  3834. return 0;
  3835. }
  3836. ssize_t proc_set_xmit_block(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  3837. {
  3838. struct net_device *dev = data;
  3839. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  3840. char tmp[32];
  3841. u8 xb_mode, xb_reason;
  3842. if (count < 1)
  3843. return -EFAULT;
  3844. if (count > sizeof(tmp)) {
  3845. rtw_warn_on(1);
  3846. return -EFAULT;
  3847. }
  3848. if (buffer && !copy_from_user(tmp, buffer, count)) {
  3849. int num = sscanf(tmp, "%hhx %hhx", &xb_mode, &xb_reason);
  3850. if (num != 2) {
  3851. RTW_INFO("invalid parameter!\n");
  3852. return count;
  3853. }
  3854. if (xb_mode == 0)/*set*/
  3855. rtw_set_xmit_block(padapter, xb_reason);
  3856. else if (xb_mode == 1)/*clear*/
  3857. rtw_clr_xmit_block(padapter, xb_reason);
  3858. else
  3859. RTW_INFO("invalid parameter!\n");
  3860. }
  3861. return count;
  3862. }
  3863. #endif
  3864. #include <hal_data.h>
  3865. int proc_get_efuse_map(struct seq_file *m, void *v)
  3866. {
  3867. struct net_device *dev = m->private;
  3868. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  3869. PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
  3870. struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
  3871. PEFUSE_HAL pEfuseHal = &pHalData->EfuseHal;
  3872. int i, j;
  3873. u8 ips_mode = IPS_NUM;
  3874. u16 mapLen;
  3875. EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN, (void *)&mapLen, _FALSE);
  3876. if (mapLen > EFUSE_MAX_MAP_LEN)
  3877. mapLen = EFUSE_MAX_MAP_LEN;
  3878. ips_mode = pwrctrlpriv->ips_mode;
  3879. rtw_pm_set_ips(padapter, IPS_NONE);
  3880. if (pHalData->efuse_file_status == EFUSE_FILE_LOADED) {
  3881. RTW_PRINT_SEL(m, "File eFuse Map loaded! file path:%s\nDriver eFuse Map From File\n", EFUSE_MAP_PATH);
  3882. if (pHalData->bautoload_fail_flag)
  3883. RTW_PRINT_SEL(m, "File Autoload fail!!!\n");
  3884. } else if (pHalData->efuse_file_status == EFUSE_FILE_FAILED) {
  3885. RTW_PRINT_SEL(m, "Open File eFuse Map Fail ! file path:%s\nDriver eFuse Map From Default\n", EFUSE_MAP_PATH);
  3886. if (pHalData->bautoload_fail_flag)
  3887. RTW_PRINT_SEL(m, "HW Autoload fail!!!\n");
  3888. } else {
  3889. RTW_PRINT_SEL(m, "Driver eFuse Map From HW\n");
  3890. if (pHalData->bautoload_fail_flag)
  3891. RTW_PRINT_SEL(m, "HW Autoload fail!!!\n");
  3892. }
  3893. for (i = 0; i < mapLen; i += 16) {
  3894. RTW_PRINT_SEL(m, "0x%02x\t", i);
  3895. for (j = 0; j < 8; j++)
  3896. RTW_PRINT_SEL(m, "%02X ", pHalData->efuse_eeprom_data[i + j]);
  3897. RTW_PRINT_SEL(m, "\t");
  3898. for (; j < 16; j++)
  3899. RTW_PRINT_SEL(m, "%02X ", pHalData->efuse_eeprom_data[i + j]);
  3900. RTW_PRINT_SEL(m, "\n");
  3901. }
  3902. if (rtw_efuse_map_read(padapter, 0, mapLen, pEfuseHal->fakeEfuseInitMap) == _FAIL) {
  3903. RTW_PRINT_SEL(m, "WARN - Read Realmap Failed\n");
  3904. return 0;
  3905. }
  3906. RTW_PRINT_SEL(m, "\n");
  3907. RTW_PRINT_SEL(m, "HW eFuse Map\n");
  3908. for (i = 0; i < mapLen; i += 16) {
  3909. RTW_PRINT_SEL(m, "0x%02x\t", i);
  3910. for (j = 0; j < 8; j++)
  3911. RTW_PRINT_SEL(m, "%02X ", pEfuseHal->fakeEfuseInitMap[i + j]);
  3912. RTW_PRINT_SEL(m, "\t");
  3913. for (; j < 16; j++)
  3914. RTW_PRINT_SEL(m, "%02X ", pEfuseHal->fakeEfuseInitMap[i + j]);
  3915. RTW_PRINT_SEL(m, "\n");
  3916. }
  3917. rtw_pm_set_ips(padapter, ips_mode);
  3918. return 0;
  3919. }
  3920. ssize_t proc_set_efuse_map(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  3921. {
  3922. #if 0
  3923. char tmp[256] = {0};
  3924. u32 addr, cnts;
  3925. u8 efuse_data;
  3926. int jj, kk;
  3927. struct net_device *dev = data;
  3928. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  3929. struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
  3930. u8 ips_mode = IPS_NUM;
  3931. if (count < 3) {
  3932. RTW_INFO("argument size is less than 3\n");
  3933. return -EFAULT;
  3934. }
  3935. if (count > sizeof(tmp)) {
  3936. rtw_warn_on(1);
  3937. return -EFAULT;
  3938. }
  3939. if (buffer && !copy_from_user(tmp, buffer, count)) {
  3940. int num = sscanf(tmp, "%x %d %x", &addr, &cnts, &efuse_data);
  3941. if (num != 3) {
  3942. RTW_INFO("invalid write_reg parameter!\n");
  3943. return count;
  3944. }
  3945. }
  3946. ips_mode = pwrctrlpriv->ips_mode;
  3947. rtw_pm_set_ips(padapter, IPS_NONE);
  3948. if (rtw_efuse_map_write(padapter, addr, cnts, &efuse_data) == _FAIL)
  3949. RTW_INFO("WARN - rtw_efuse_map_write error!!\n");
  3950. rtw_pm_set_ips(padapter, ips_mode);
  3951. #endif
  3952. return count;
  3953. }
  3954. #ifdef CONFIG_IEEE80211W
  3955. ssize_t proc_set_tx_sa_query(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  3956. {
  3957. struct net_device *dev = data;
  3958. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  3959. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  3960. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  3961. struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  3962. struct sta_priv *pstapriv = &padapter->stapriv;
  3963. struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
  3964. struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
  3965. struct sta_info *psta;
  3966. _list *plist, *phead;
  3967. _irqL irqL;
  3968. char tmp[16];
  3969. u8 mac_addr[NUM_STA][ETH_ALEN];
  3970. u32 key_type;
  3971. u8 index;
  3972. if (count > 2) {
  3973. RTW_INFO("argument size is more than 2\n");
  3974. return -EFAULT;
  3975. }
  3976. if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
  3977. int num = sscanf(tmp, "%x", &key_type);
  3978. if (num != 1) {
  3979. RTW_INFO("invalid read_reg parameter!\n");
  3980. return count;
  3981. }
  3982. RTW_INFO("0: set sa query request , key_type=%d\n", key_type);
  3983. }
  3984. if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
  3985. && (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) && padapter->securitypriv.binstallBIPkey == _TRUE) {
  3986. RTW_INFO("STA:"MAC_FMT"\n", MAC_ARG(get_my_bssid(&(pmlmeinfo->network))));
  3987. /* TX unicast sa_query to AP */
  3988. issue_action_SA_Query(padapter, get_my_bssid(&(pmlmeinfo->network)), 0, 0, (u8)key_type);
  3989. } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE && padapter->securitypriv.binstallBIPkey == _TRUE) {
  3990. /* TX unicast sa_query to every client STA */
  3991. _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  3992. for (index = 0; index < NUM_STA; index++) {
  3993. psta = NULL;
  3994. phead = &(pstapriv->sta_hash[index]);
  3995. plist = get_next(phead);
  3996. while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {
  3997. psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
  3998. plist = get_next(plist);
  3999. _rtw_memcpy(&mac_addr[psta->mac_id][0], psta->hwaddr, ETH_ALEN);
  4000. }
  4001. }
  4002. _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  4003. for (index = 0; index < macid_ctl->num && index < NUM_STA; index++) {
  4004. if (rtw_macid_is_used(macid_ctl, index) && !rtw_macid_is_bmc(macid_ctl, index)) {
  4005. if (!_rtw_memcmp(get_my_bssid(&(pmlmeinfo->network)), &mac_addr[index][0], ETH_ALEN)
  4006. && !IS_MCAST(&mac_addr[index][0])) {
  4007. issue_action_SA_Query(padapter, &mac_addr[index][0], 0, 0, (u8)key_type);
  4008. RTW_INFO("STA[%u]:"MAC_FMT"\n", index , MAC_ARG(&mac_addr[index][0]));
  4009. }
  4010. }
  4011. }
  4012. }
  4013. return count;
  4014. }
  4015. int proc_get_tx_sa_query(struct seq_file *m, void *v)
  4016. {
  4017. struct net_device *dev = m->private;
  4018. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  4019. RTW_PRINT_SEL(m, "%s\n", __func__);
  4020. return 0;
  4021. }
  4022. ssize_t proc_set_tx_deauth(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  4023. {
  4024. struct net_device *dev = data;
  4025. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  4026. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  4027. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  4028. struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  4029. struct sta_priv *pstapriv = &padapter->stapriv;
  4030. struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
  4031. struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
  4032. struct sta_info *psta;
  4033. _list *plist, *phead;
  4034. _irqL irqL;
  4035. char tmp[16];
  4036. u8 mac_addr[NUM_STA][ETH_ALEN];
  4037. u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  4038. u32 key_type;
  4039. u8 index;
  4040. if (count > 2) {
  4041. RTW_INFO("argument size is more than 2\n");
  4042. return -EFAULT;
  4043. }
  4044. if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
  4045. int num = sscanf(tmp, "%x", &key_type);
  4046. if (num != 1) {
  4047. RTW_INFO("invalid read_reg parameter!\n");
  4048. return count;
  4049. }
  4050. RTW_INFO("key_type=%d\n", key_type);
  4051. }
  4052. if (key_type < 0 || key_type > 4)
  4053. return count;
  4054. if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
  4055. && (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)) {
  4056. if (key_type == 3) /* key_type 3 only for AP mode */
  4057. return count;
  4058. /* TX unicast deauth to AP */
  4059. issue_deauth_11w(padapter, get_my_bssid(&(pmlmeinfo->network)), 0, (u8)key_type);
  4060. } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) {
  4061. if (key_type == 3)
  4062. issue_deauth_11w(padapter, bc_addr, 0, IEEE80211W_RIGHT_KEY);
  4063. /* TX unicast deauth to every client STA */
  4064. _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  4065. for (index = 0; index < NUM_STA; index++) {
  4066. psta = NULL;
  4067. phead = &(pstapriv->sta_hash[index]);
  4068. plist = get_next(phead);
  4069. while ((rtw_end_of_queue_search(phead, plist)) == _FALSE) {
  4070. psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);
  4071. plist = get_next(plist);
  4072. _rtw_memcpy(&mac_addr[psta->mac_id][0], psta->hwaddr, ETH_ALEN);
  4073. }
  4074. }
  4075. _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);
  4076. for (index = 0; index < macid_ctl->num && index < NUM_STA; index++) {
  4077. if (rtw_macid_is_used(macid_ctl, index) && !rtw_macid_is_bmc(macid_ctl, index)) {
  4078. if (!_rtw_memcmp(get_my_bssid(&(pmlmeinfo->network)), &mac_addr[index][0], ETH_ALEN)) {
  4079. if (key_type != 3)
  4080. issue_deauth_11w(padapter, &mac_addr[index][0], 0, (u8)key_type);
  4081. psta = rtw_get_stainfo(pstapriv, &mac_addr[index][0]);
  4082. if (psta && key_type != IEEE80211W_WRONG_KEY && key_type != IEEE80211W_NO_KEY) {
  4083. u8 updated = _FALSE;
  4084. _enter_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  4085. if (rtw_is_list_empty(&psta->asoc_list) == _FALSE) {
  4086. rtw_list_delete(&psta->asoc_list);
  4087. pstapriv->asoc_list_cnt--;
  4088. updated = ap_free_sta(padapter, psta, _FALSE, WLAN_REASON_PREV_AUTH_NOT_VALID, _TRUE);
  4089. }
  4090. _exit_critical_bh(&pstapriv->asoc_list_lock, &irqL);
  4091. associated_clients_update(padapter, updated, STA_INFO_UPDATE_ALL);
  4092. }
  4093. RTW_INFO("STA[%u]:"MAC_FMT"\n", index , MAC_ARG(&mac_addr[index][0]));
  4094. }
  4095. }
  4096. }
  4097. }
  4098. return count;
  4099. }
  4100. int proc_get_tx_deauth(struct seq_file *m, void *v)
  4101. {
  4102. struct net_device *dev = m->private;
  4103. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  4104. RTW_PRINT_SEL(m, "%s\n", __func__);
  4105. return 0;
  4106. }
  4107. ssize_t proc_set_tx_auth(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  4108. {
  4109. struct net_device *dev = data;
  4110. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  4111. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  4112. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  4113. struct mlme_priv *pmlmepriv = &(padapter->mlmepriv);
  4114. struct sta_priv *pstapriv = &padapter->stapriv;
  4115. struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
  4116. struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
  4117. struct sta_info *psta;
  4118. _list *plist, *phead;
  4119. _irqL irqL;
  4120. char tmp[16];
  4121. u8 mac_addr[NUM_STA][ETH_ALEN];
  4122. u8 bc_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
  4123. u32 tx_auth;
  4124. u8 index;
  4125. if (count > 2) {
  4126. RTW_INFO("argument size is more than 2\n");
  4127. return -EFAULT;
  4128. }
  4129. if (buffer && !copy_from_user(tmp, buffer, sizeof(tmp))) {
  4130. int num = sscanf(tmp, "%x", &tx_auth);
  4131. if (num != 1) {
  4132. RTW_INFO("invalid read_reg parameter!\n");
  4133. return count;
  4134. }
  4135. RTW_INFO("1: setnd auth, 2: send assoc request. tx_auth=%d\n", tx_auth);
  4136. }
  4137. if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)
  4138. && (check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)) {
  4139. if (tx_auth == 1) {
  4140. /* TX unicast auth to AP */
  4141. issue_auth(padapter, NULL, 0);
  4142. } else if (tx_auth == 2) {
  4143. /* TX unicast auth to AP */
  4144. issue_assocreq(padapter);
  4145. }
  4146. }
  4147. return count;
  4148. }
  4149. int proc_get_tx_auth(struct seq_file *m, void *v)
  4150. {
  4151. struct net_device *dev = m->private;
  4152. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  4153. RTW_PRINT_SEL(m, "%s\n", __func__);
  4154. return 0;
  4155. }
  4156. #endif /* CONFIG_IEEE80211W */
  4157. #ifdef CONFIG_MCC_MODE
  4158. int proc_get_mcc_info(struct seq_file *m, void *v)
  4159. {
  4160. struct net_device *dev = m->private;
  4161. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  4162. dump_adapters_status(m, adapter_to_dvobj(adapter));
  4163. rtw_hal_dump_mcc_info(m, adapter_to_dvobj(adapter));
  4164. return 0;
  4165. }
  4166. int proc_get_mcc_policy_table(struct seq_file *m, void *v)
  4167. {
  4168. struct net_device *dev = m->private;
  4169. _adapter *adapter = (_adapter *)rtw_netdev_priv(dev);
  4170. rtw_hal_dump_mcc_policy_table(m);
  4171. return 0;
  4172. }
  4173. ssize_t proc_set_mcc_policy_table(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  4174. {
  4175. struct net_device *dev = data;
  4176. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  4177. char tmp[255];
  4178. s32 mcc_policy_table_idx;
  4179. u32 mcc_duration;
  4180. u32 mcc_tsf_sync_offset;
  4181. u32 mcc_start_time_offset;
  4182. u32 mcc_interval;
  4183. s32 mcc_guard_offset0;
  4184. s32 mcc_guard_offset1;
  4185. if (NULL == buffer) {
  4186. RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter));
  4187. return -EFAULT;
  4188. }
  4189. if (count < 1) {
  4190. RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter));
  4191. return -EFAULT;
  4192. }
  4193. if (count > sizeof(tmp)) {
  4194. RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter));
  4195. rtw_warn_on(1);
  4196. return -EFAULT;
  4197. }
  4198. if (buffer && !copy_from_user(tmp, buffer, count)) {
  4199. #if 1
  4200. struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
  4201. _adapter *iface = NULL;
  4202. u8 i = 0;
  4203. int num = sscanf(tmp, "%d %u %u %u %u %d %d"
  4204. , &mcc_policy_table_idx, &mcc_duration, &mcc_tsf_sync_offset, &mcc_start_time_offset
  4205. , &mcc_interval, &mcc_guard_offset0, &mcc_guard_offset1);
  4206. if (num < 7) {
  4207. RTW_INFO(FUNC_ADPT_FMT ": input parameters < 7\n", FUNC_ADPT_ARG(padapter));
  4208. return -EINVAL;
  4209. }
  4210. #if 0
  4211. RTW_INFO("mcc_policy_table_idx:%d\n", mcc_policy_table_idx);
  4212. RTW_INFO("mcc_duration:%d\n", mcc_duration);
  4213. RTW_INFO("mcc_tsf_sync_offset:%d\n", mcc_tsf_sync_offset);
  4214. RTW_INFO("mcc_start_time_offset:%d\n", mcc_start_time_offset);
  4215. RTW_INFO("mcc_interval:%d\n", mcc_interval);
  4216. RTW_INFO("mcc_guard_offset0:%d\n", mcc_guard_offset0);
  4217. RTW_INFO("mcc_guard_offset1:%d\n", mcc_guard_offset1);
  4218. #endif
  4219. for (i = 0; i < dvobj->iface_nums; i++) {
  4220. iface = dvobj->padapters[i];
  4221. if (!iface)
  4222. continue;
  4223. iface->registrypriv.rtw_mcc_policy_table_idx = mcc_policy_table_idx;
  4224. iface->registrypriv.rtw_mcc_duration = mcc_duration;
  4225. iface->registrypriv.rtw_mcc_tsf_sync_offset = mcc_tsf_sync_offset;
  4226. iface->registrypriv.rtw_mcc_start_time_offset = mcc_start_time_offset;
  4227. iface->registrypriv.rtw_mcc_interval = mcc_interval;
  4228. iface->registrypriv.rtw_mcc_guard_offset0 = mcc_guard_offset0;
  4229. iface->registrypriv.rtw_mcc_guard_offset1 = mcc_guard_offset1;
  4230. }
  4231. rtw_hal_mcc_update_switch_channel_policy_table(padapter);
  4232. #endif
  4233. }
  4234. return count;
  4235. }
  4236. ssize_t proc_set_mcc_enable(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  4237. {
  4238. struct net_device *dev = data;
  4239. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  4240. char tmp[255];
  4241. u32 en_mcc = 0;
  4242. if (NULL == buffer) {
  4243. RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter));
  4244. return -EFAULT;
  4245. }
  4246. if (count < 1) {
  4247. RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter));
  4248. return -EFAULT;
  4249. }
  4250. if (count > sizeof(tmp)) {
  4251. RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter));
  4252. rtw_warn_on(1);
  4253. return -EFAULT;
  4254. }
  4255. if (buffer && !copy_from_user(tmp, buffer, count)) {
  4256. struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
  4257. _adapter *iface = NULL;
  4258. u8 i = 0;
  4259. int num = sscanf(tmp, "%u", &en_mcc);
  4260. if (num < 1) {
  4261. RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter));
  4262. return -EINVAL;
  4263. }
  4264. RTW_INFO("%s: en_mcc = %d\n", __func__, en_mcc);
  4265. for (i = 0; i < dvobj->iface_nums; i++) {
  4266. iface = dvobj->padapters[i];
  4267. if (!iface)
  4268. continue;
  4269. iface->registrypriv.en_mcc = en_mcc;
  4270. }
  4271. }
  4272. return count;
  4273. }
  4274. ssize_t proc_set_mcc_single_tx_criteria(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  4275. {
  4276. struct net_device *dev = data;
  4277. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  4278. char tmp[255];
  4279. u32 mcc_single_tx_criteria = 0;
  4280. if (NULL == buffer) {
  4281. RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter));
  4282. return -EFAULT;
  4283. }
  4284. if (count < 1) {
  4285. RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter));
  4286. return -EFAULT;
  4287. }
  4288. if (count > sizeof(tmp)) {
  4289. RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter));
  4290. rtw_warn_on(1);
  4291. return -EFAULT;
  4292. }
  4293. if (buffer && !copy_from_user(tmp, buffer, count)) {
  4294. struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
  4295. _adapter *iface = NULL;
  4296. u8 i = 0;
  4297. int num = sscanf(tmp, "%u", &mcc_single_tx_criteria);
  4298. if (num < 1) {
  4299. RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter));
  4300. return -EINVAL;
  4301. }
  4302. RTW_INFO("%s: mcc_single_tx_criteria = %d\n", __func__, mcc_single_tx_criteria);
  4303. for (i = 0; i < dvobj->iface_nums; i++) {
  4304. iface = dvobj->padapters[i];
  4305. if (!iface)
  4306. continue;
  4307. iface->registrypriv.rtw_mcc_single_tx_cri = mcc_single_tx_criteria;
  4308. }
  4309. }
  4310. return count;
  4311. }
  4312. ssize_t proc_set_mcc_ap_bw20_target_tp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  4313. {
  4314. struct net_device *dev = data;
  4315. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  4316. char tmp[255];
  4317. u32 mcc_ap_bw20_target_tp = 0;
  4318. if (NULL == buffer) {
  4319. RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter));
  4320. return -EFAULT;
  4321. }
  4322. if (count < 1) {
  4323. RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter));
  4324. return -EFAULT;
  4325. }
  4326. if (count > sizeof(tmp)) {
  4327. RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter));
  4328. rtw_warn_on(1);
  4329. return -EFAULT;
  4330. }
  4331. if (buffer && !copy_from_user(tmp, buffer, count)) {
  4332. int num = sscanf(tmp, "%u", &mcc_ap_bw20_target_tp);
  4333. if (num < 1) {
  4334. RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter));
  4335. return -EINVAL;
  4336. }
  4337. RTW_INFO("%s: mcc_ap_bw20_target_tp = %d\n", __func__, mcc_ap_bw20_target_tp);
  4338. padapter->registrypriv.rtw_mcc_ap_bw20_target_tx_tp = mcc_ap_bw20_target_tp;
  4339. }
  4340. return count;
  4341. }
  4342. ssize_t proc_set_mcc_ap_bw40_target_tp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  4343. {
  4344. struct net_device *dev = data;
  4345. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  4346. char tmp[255];
  4347. u32 mcc_ap_bw40_target_tp = 0;
  4348. if (NULL == buffer) {
  4349. RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter));
  4350. return -EFAULT;
  4351. }
  4352. if (count < 1) {
  4353. RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter));
  4354. return -EFAULT;
  4355. }
  4356. if (count > sizeof(tmp)) {
  4357. RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter));
  4358. rtw_warn_on(1);
  4359. return -EFAULT;
  4360. }
  4361. if (buffer && !copy_from_user(tmp, buffer, count)) {
  4362. int num = sscanf(tmp, "%u", &mcc_ap_bw40_target_tp);
  4363. if (num < 1) {
  4364. RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter));
  4365. return -EINVAL;
  4366. }
  4367. RTW_INFO("%s: mcc_ap_bw40_target_tp = %d\n", __func__, mcc_ap_bw40_target_tp);
  4368. padapter->registrypriv.rtw_mcc_ap_bw40_target_tx_tp = mcc_ap_bw40_target_tp;
  4369. }
  4370. return count;
  4371. }
  4372. ssize_t proc_set_mcc_ap_bw80_target_tp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  4373. {
  4374. struct net_device *dev = data;
  4375. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  4376. char tmp[255];
  4377. u32 mcc_ap_bw80_target_tp = 0;
  4378. if (NULL == buffer) {
  4379. RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter));
  4380. return -EFAULT;
  4381. }
  4382. if (count < 1) {
  4383. RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter));
  4384. return -EFAULT;
  4385. }
  4386. if (count > sizeof(tmp)) {
  4387. RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter));
  4388. rtw_warn_on(1);
  4389. return -EFAULT;
  4390. }
  4391. if (buffer && !copy_from_user(tmp, buffer, count)) {
  4392. int num = sscanf(tmp, "%u", &mcc_ap_bw80_target_tp);
  4393. if (num < 1) {
  4394. RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter));
  4395. return -EINVAL;
  4396. }
  4397. RTW_INFO("%s: mcc_ap_bw80_target_tp = %d\n", __func__, mcc_ap_bw80_target_tp);
  4398. padapter->registrypriv.rtw_mcc_ap_bw80_target_tx_tp = mcc_ap_bw80_target_tp;
  4399. }
  4400. return count;
  4401. }
  4402. ssize_t proc_set_mcc_sta_bw20_target_tp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  4403. {
  4404. struct net_device *dev = data;
  4405. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  4406. char tmp[255];
  4407. u32 mcc_sta_bw20_target_tp = 0;
  4408. if (NULL == buffer) {
  4409. RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter));
  4410. return -EFAULT;
  4411. }
  4412. if (count < 1) {
  4413. RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter));
  4414. return -EFAULT;
  4415. }
  4416. if (count > sizeof(tmp)) {
  4417. RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter));
  4418. rtw_warn_on(1);
  4419. return -EFAULT;
  4420. }
  4421. if (buffer && !copy_from_user(tmp, buffer, count)) {
  4422. int num = sscanf(tmp, "%u", &mcc_sta_bw20_target_tp);
  4423. if (num < 1) {
  4424. RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter));
  4425. return -EINVAL;
  4426. }
  4427. RTW_INFO("%s: mcc_sta_bw20_target_tp = %d\n", __func__, mcc_sta_bw20_target_tp);
  4428. padapter->registrypriv.rtw_mcc_sta_bw20_target_tx_tp = mcc_sta_bw20_target_tp;
  4429. }
  4430. return count;
  4431. }
  4432. ssize_t proc_set_mcc_sta_bw40_target_tp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  4433. {
  4434. struct net_device *dev = data;
  4435. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  4436. char tmp[255];
  4437. u32 mcc_sta_bw40_target_tp = 0;
  4438. if (NULL == buffer) {
  4439. RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter));
  4440. return -EFAULT;
  4441. }
  4442. if (count < 1) {
  4443. RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter));
  4444. return -EFAULT;
  4445. }
  4446. if (count > sizeof(tmp)) {
  4447. RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter));
  4448. rtw_warn_on(1);
  4449. return -EFAULT;
  4450. }
  4451. if (buffer && !copy_from_user(tmp, buffer, count)) {
  4452. int num = sscanf(tmp, "%u", &mcc_sta_bw40_target_tp);
  4453. if (num < 1) {
  4454. RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter));
  4455. return -EINVAL;
  4456. }
  4457. RTW_INFO("%s: mcc_sta_bw40_target_tp = %d\n", __func__, mcc_sta_bw40_target_tp);
  4458. padapter->registrypriv.rtw_mcc_sta_bw40_target_tx_tp = mcc_sta_bw40_target_tp;
  4459. }
  4460. return count;
  4461. }
  4462. ssize_t proc_set_mcc_sta_bw80_target_tp(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  4463. {
  4464. struct net_device *dev = data;
  4465. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  4466. char tmp[255];
  4467. u32 mcc_sta_bw80_target_tp = 0;
  4468. if (NULL == buffer) {
  4469. RTW_INFO(FUNC_ADPT_FMT ": input buffer is NULL!\n", FUNC_ADPT_ARG(padapter));
  4470. return -EFAULT;
  4471. }
  4472. if (count < 1) {
  4473. RTW_INFO(FUNC_ADPT_FMT ": input length is 0!\n", FUNC_ADPT_ARG(padapter));
  4474. return -EFAULT;
  4475. }
  4476. if (count > sizeof(tmp)) {
  4477. RTW_INFO(FUNC_ADPT_FMT ": input length is too large\n", FUNC_ADPT_ARG(padapter));
  4478. rtw_warn_on(1);
  4479. return -EFAULT;
  4480. }
  4481. if (buffer && !copy_from_user(tmp, buffer, count)) {
  4482. int num = sscanf(tmp, "%u", &mcc_sta_bw80_target_tp);
  4483. if (num < 1) {
  4484. RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter));
  4485. return -EINVAL;
  4486. }
  4487. RTW_INFO("%s: mcc_sta_bw80_target_tp = %d\n", __func__, mcc_sta_bw80_target_tp);
  4488. padapter->registrypriv.rtw_mcc_sta_bw80_target_tx_tp = mcc_sta_bw80_target_tp;
  4489. }
  4490. return count;
  4491. }
  4492. #endif /* CONFIG_MCC_MODE */
  4493. int proc_get_ack_timeout(struct seq_file *m, void *v)
  4494. {
  4495. struct net_device *dev = m->private;
  4496. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  4497. u8 ack_timeout_val, ack_timeout_val_cck;
  4498. ack_timeout_val = rtw_read8(padapter, REG_ACKTO);
  4499. #ifdef CONFIG_RTL8821C
  4500. ack_timeout_val_cck = rtw_read8(padapter, REG_ACKTO_CCK_8821C);
  4501. RTW_PRINT_SEL(m, "Current CCK packet ACK Timeout = %d us (0x%x).\n", ack_timeout_val_cck, ack_timeout_val_cck);
  4502. RTW_PRINT_SEL(m, "Current non-CCK packet ACK Timeout = %d us (0x%x).\n", ack_timeout_val, ack_timeout_val);
  4503. #else
  4504. RTW_PRINT_SEL(m, "Current ACK Timeout = %d us (0x%x).\n", ack_timeout_val, ack_timeout_val);
  4505. #endif
  4506. return 0;
  4507. }
  4508. ssize_t proc_set_ack_timeout(struct file *file, const char __user *buffer, size_t count, loff_t *pos, void *data)
  4509. {
  4510. struct net_device *dev = data;
  4511. _adapter *padapter = (_adapter *)rtw_netdev_priv(dev);
  4512. char tmp[32];
  4513. u32 ack_timeout_ms, ack_timeout_ms_cck;
  4514. if (count > sizeof(tmp)) {
  4515. rtw_warn_on(1);
  4516. return -EFAULT;
  4517. }
  4518. if (buffer && !copy_from_user(tmp, buffer, count)) {
  4519. int num = sscanf(tmp, "%u %u", &ack_timeout_ms, &ack_timeout_ms_cck);
  4520. #ifdef CONFIG_RTL8821C
  4521. if (num < 2) {
  4522. RTW_INFO(FUNC_ADPT_FMT ": input parameters < 2\n", FUNC_ADPT_ARG(padapter));
  4523. return -EINVAL;
  4524. }
  4525. #else
  4526. if (num < 1) {
  4527. RTW_INFO(FUNC_ADPT_FMT ": input parameters < 1\n", FUNC_ADPT_ARG(padapter));
  4528. return -EINVAL;
  4529. }
  4530. #endif
  4531. /* This register sets the Ack time out value after Tx unicast packet. It is in units of us. */
  4532. rtw_write8(padapter, REG_ACKTO, (u8)ack_timeout_ms);
  4533. #ifdef CONFIG_RTL8821C
  4534. /* This register sets the Ack time out value after Tx unicast CCK packet. It is in units of us. */
  4535. rtw_write8(padapter, REG_ACKTO_CCK_8821C, (u8)ack_timeout_ms_cck);
  4536. RTW_INFO("Set CCK packet ACK Timeout to %d us.\n", ack_timeout_ms_cck);
  4537. RTW_INFO("Set non-CCK packet ACK Timeout to %d us.\n", ack_timeout_ms);
  4538. #else
  4539. RTW_INFO("Set ACK Timeout to %d us.\n", ack_timeout_ms);
  4540. #endif
  4541. }
  4542. return count;
  4543. }
  4544. #endif /* CONFIG_PROC_DEBUG */