rtw_xmit.c 142 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625
  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_XMIT_C_
  21. #include <drv_types.h>
  22. #include <hal_data.h>
  23. #if defined(PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)
  24. #error "Shall be Linux or Windows, but not both!\n"
  25. #endif
  26. static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 };
  27. static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 };
  28. static void _init_txservq(struct tx_servq *ptxservq)
  29. {
  30. _rtw_init_listhead(&ptxservq->tx_pending);
  31. _rtw_init_queue(&ptxservq->sta_pending);
  32. ptxservq->qcnt = 0;
  33. }
  34. void _rtw_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv)
  35. {
  36. _rtw_memset((unsigned char *)psta_xmitpriv, 0, sizeof(struct sta_xmit_priv));
  37. _rtw_spinlock_init(&psta_xmitpriv->lock);
  38. /* for(i = 0 ; i < MAX_NUMBLKS; i++) */
  39. /* _init_txservq(&(psta_xmitpriv->blk_q[i])); */
  40. _init_txservq(&psta_xmitpriv->be_q);
  41. _init_txservq(&psta_xmitpriv->bk_q);
  42. _init_txservq(&psta_xmitpriv->vi_q);
  43. _init_txservq(&psta_xmitpriv->vo_q);
  44. _rtw_init_listhead(&psta_xmitpriv->legacy_dz);
  45. _rtw_init_listhead(&psta_xmitpriv->apsd);
  46. }
  47. void rtw_init_xmit_block(_adapter *padapter)
  48. {
  49. struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
  50. _rtw_spinlock_init(&dvobj->xmit_block_lock);
  51. dvobj->xmit_block = XMIT_BLOCK_NONE;
  52. }
  53. void rtw_free_xmit_block(_adapter *padapter)
  54. {
  55. struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
  56. _rtw_spinlock_free(&dvobj->xmit_block_lock);
  57. }
  58. s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, _adapter *padapter)
  59. {
  60. int i;
  61. struct xmit_buf *pxmitbuf;
  62. struct xmit_frame *pxframe;
  63. sint res = _SUCCESS;
  64. /* We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc(). */
  65. /* _rtw_memset((unsigned char *)pxmitpriv, 0, sizeof(struct xmit_priv)); */
  66. _rtw_spinlock_init(&pxmitpriv->lock);
  67. _rtw_spinlock_init(&pxmitpriv->lock_sctx);
  68. _rtw_init_sema(&pxmitpriv->xmit_sema, 0);
  69. /*_rtw_init_sema(&pxmitpriv->terminate_xmitthread_sema, 0);*/
  70. _rtw_init_completion(&pxmitpriv->xmitthread_comp);
  71. /*
  72. Please insert all the queue initializaiton using _rtw_init_queue below
  73. */
  74. pxmitpriv->adapter = padapter;
  75. /* for(i = 0 ; i < MAX_NUMBLKS; i++) */
  76. /* _rtw_init_queue(&pxmitpriv->blk_strms[i]); */
  77. _rtw_init_queue(&pxmitpriv->be_pending);
  78. _rtw_init_queue(&pxmitpriv->bk_pending);
  79. _rtw_init_queue(&pxmitpriv->vi_pending);
  80. _rtw_init_queue(&pxmitpriv->vo_pending);
  81. _rtw_init_queue(&pxmitpriv->bm_pending);
  82. /* _rtw_init_queue(&pxmitpriv->legacy_dz_queue); */
  83. /* _rtw_init_queue(&pxmitpriv->apsd_queue); */
  84. _rtw_init_queue(&pxmitpriv->free_xmit_queue);
  85. /*
  86. Please allocate memory with the sz = (struct xmit_frame) * NR_XMITFRAME,
  87. and initialize free_xmit_frame below.
  88. Please also apply free_txobj to link_up all the xmit_frames...
  89. */
  90. pxmitpriv->pallocated_frame_buf = rtw_zvmalloc(NR_XMITFRAME * sizeof(struct xmit_frame) + 4);
  91. if (pxmitpriv->pallocated_frame_buf == NULL) {
  92. pxmitpriv->pxmit_frame_buf = NULL;
  93. res = _FAIL;
  94. goto exit;
  95. }
  96. pxmitpriv->pxmit_frame_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_frame_buf), 4);
  97. /* pxmitpriv->pxmit_frame_buf = pxmitpriv->pallocated_frame_buf + 4 - */
  98. /* ((SIZE_PTR) (pxmitpriv->pallocated_frame_buf) &3); */
  99. pxframe = (struct xmit_frame *) pxmitpriv->pxmit_frame_buf;
  100. for (i = 0; i < NR_XMITFRAME; i++) {
  101. _rtw_init_listhead(&(pxframe->list));
  102. pxframe->padapter = padapter;
  103. pxframe->frame_tag = NULL_FRAMETAG;
  104. pxframe->pkt = NULL;
  105. pxframe->buf_addr = NULL;
  106. pxframe->pxmitbuf = NULL;
  107. rtw_list_insert_tail(&(pxframe->list), &(pxmitpriv->free_xmit_queue.queue));
  108. pxframe++;
  109. }
  110. pxmitpriv->free_xmitframe_cnt = NR_XMITFRAME;
  111. pxmitpriv->frag_len = MAX_FRAG_THRESHOLD;
  112. /* init xmit_buf */
  113. _rtw_init_queue(&pxmitpriv->free_xmitbuf_queue);
  114. _rtw_init_queue(&pxmitpriv->pending_xmitbuf_queue);
  115. pxmitpriv->pallocated_xmitbuf = rtw_zvmalloc(NR_XMITBUFF * sizeof(struct xmit_buf) + 4);
  116. if (pxmitpriv->pallocated_xmitbuf == NULL) {
  117. res = _FAIL;
  118. goto exit;
  119. }
  120. pxmitpriv->pxmitbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_xmitbuf), 4);
  121. /* pxmitpriv->pxmitbuf = pxmitpriv->pallocated_xmitbuf + 4 - */
  122. /* ((SIZE_PTR) (pxmitpriv->pallocated_xmitbuf) &3); */
  123. pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf;
  124. for (i = 0; i < NR_XMITBUFF; i++) {
  125. _rtw_init_listhead(&pxmitbuf->list);
  126. pxmitbuf->priv_data = NULL;
  127. pxmitbuf->padapter = padapter;
  128. pxmitbuf->buf_tag = XMITBUF_DATA;
  129. /* Tx buf allocation may fail sometimes, so sleep and retry. */
  130. res = rtw_os_xmit_resource_alloc(padapter, pxmitbuf, (MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE);
  131. if (res == _FAIL) {
  132. rtw_msleep_os(10);
  133. res = rtw_os_xmit_resource_alloc(padapter, pxmitbuf, (MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE);
  134. if (res == _FAIL)
  135. goto exit;
  136. }
  137. #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
  138. pxmitbuf->phead = pxmitbuf->pbuf;
  139. pxmitbuf->pend = pxmitbuf->pbuf + MAX_XMITBUF_SZ;
  140. pxmitbuf->len = 0;
  141. pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
  142. #endif
  143. pxmitbuf->flags = XMIT_VO_QUEUE;
  144. rtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmitbuf_queue.queue));
  145. #ifdef DBG_XMIT_BUF
  146. pxmitbuf->no = i;
  147. #endif
  148. pxmitbuf++;
  149. }
  150. pxmitpriv->free_xmitbuf_cnt = NR_XMITBUFF;
  151. /* init xframe_ext queue, the same count as extbuf */
  152. _rtw_init_queue(&pxmitpriv->free_xframe_ext_queue);
  153. pxmitpriv->xframe_ext_alloc_addr = rtw_zvmalloc(NR_XMIT_EXTBUFF * sizeof(struct xmit_frame) + 4);
  154. if (pxmitpriv->xframe_ext_alloc_addr == NULL) {
  155. pxmitpriv->xframe_ext = NULL;
  156. res = _FAIL;
  157. goto exit;
  158. }
  159. pxmitpriv->xframe_ext = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->xframe_ext_alloc_addr), 4);
  160. pxframe = (struct xmit_frame *)pxmitpriv->xframe_ext;
  161. for (i = 0; i < NR_XMIT_EXTBUFF; i++) {
  162. _rtw_init_listhead(&(pxframe->list));
  163. pxframe->padapter = padapter;
  164. pxframe->frame_tag = NULL_FRAMETAG;
  165. pxframe->pkt = NULL;
  166. pxframe->buf_addr = NULL;
  167. pxframe->pxmitbuf = NULL;
  168. pxframe->ext_tag = 1;
  169. rtw_list_insert_tail(&(pxframe->list), &(pxmitpriv->free_xframe_ext_queue.queue));
  170. pxframe++;
  171. }
  172. pxmitpriv->free_xframe_ext_cnt = NR_XMIT_EXTBUFF;
  173. /* Init xmit extension buff */
  174. _rtw_init_queue(&pxmitpriv->free_xmit_extbuf_queue);
  175. pxmitpriv->pallocated_xmit_extbuf = rtw_zvmalloc(NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4);
  176. if (pxmitpriv->pallocated_xmit_extbuf == NULL) {
  177. res = _FAIL;
  178. goto exit;
  179. }
  180. pxmitpriv->pxmit_extbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_xmit_extbuf), 4);
  181. pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf;
  182. for (i = 0; i < NR_XMIT_EXTBUFF; i++) {
  183. _rtw_init_listhead(&pxmitbuf->list);
  184. pxmitbuf->priv_data = NULL;
  185. pxmitbuf->padapter = padapter;
  186. pxmitbuf->buf_tag = XMITBUF_MGNT;
  187. res = rtw_os_xmit_resource_alloc(padapter, pxmitbuf, MAX_XMIT_EXTBUF_SZ + XMITBUF_ALIGN_SZ, _TRUE);
  188. if (res == _FAIL) {
  189. res = _FAIL;
  190. goto exit;
  191. }
  192. #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
  193. pxmitbuf->phead = pxmitbuf->pbuf;
  194. pxmitbuf->pend = pxmitbuf->pbuf + MAX_XMIT_EXTBUF_SZ;
  195. pxmitbuf->len = 0;
  196. pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
  197. #endif
  198. rtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmit_extbuf_queue.queue));
  199. #ifdef DBG_XMIT_BUF_EXT
  200. pxmitbuf->no = i;
  201. #endif
  202. pxmitbuf++;
  203. }
  204. pxmitpriv->free_xmit_extbuf_cnt = NR_XMIT_EXTBUFF;
  205. for (i = 0; i < CMDBUF_MAX; i++) {
  206. pxmitbuf = &pxmitpriv->pcmd_xmitbuf[i];
  207. if (pxmitbuf) {
  208. _rtw_init_listhead(&pxmitbuf->list);
  209. pxmitbuf->priv_data = NULL;
  210. pxmitbuf->padapter = padapter;
  211. pxmitbuf->buf_tag = XMITBUF_CMD;
  212. res = rtw_os_xmit_resource_alloc(padapter, pxmitbuf, MAX_CMDBUF_SZ + XMITBUF_ALIGN_SZ, _TRUE);
  213. if (res == _FAIL) {
  214. res = _FAIL;
  215. goto exit;
  216. }
  217. #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
  218. pxmitbuf->phead = pxmitbuf->pbuf;
  219. pxmitbuf->pend = pxmitbuf->pbuf + MAX_CMDBUF_SZ;
  220. pxmitbuf->len = 0;
  221. pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
  222. #endif
  223. pxmitbuf->alloc_sz = MAX_CMDBUF_SZ + XMITBUF_ALIGN_SZ;
  224. }
  225. }
  226. rtw_alloc_hwxmits(padapter);
  227. rtw_init_hwxmits(pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry);
  228. for (i = 0; i < 4; i++)
  229. pxmitpriv->wmm_para_seq[i] = i;
  230. #ifdef CONFIG_USB_HCI
  231. pxmitpriv->txirp_cnt = 1;
  232. _rtw_init_sema(&(pxmitpriv->tx_retevt), 0);
  233. /* per AC pending irp */
  234. pxmitpriv->beq_cnt = 0;
  235. pxmitpriv->bkq_cnt = 0;
  236. pxmitpriv->viq_cnt = 0;
  237. pxmitpriv->voq_cnt = 0;
  238. #endif
  239. #ifdef CONFIG_XMIT_ACK
  240. pxmitpriv->ack_tx = _FALSE;
  241. _rtw_mutex_init(&pxmitpriv->ack_tx_mutex);
  242. rtw_sctx_init(&pxmitpriv->ack_tx_ops, 0);
  243. #endif
  244. #ifdef CONFIG_TX_AMSDU
  245. rtw_init_timer(&(pxmitpriv->amsdu_vo_timer), padapter,
  246. rtw_amsdu_vo_timeout_handler, padapter);
  247. pxmitpriv->amsdu_vo_timeout = RTW_AMSDU_TIMER_UNSET;
  248. rtw_init_timer(&(pxmitpriv->amsdu_vi_timer), padapter,
  249. rtw_amsdu_vi_timeout_handler, padapter);
  250. pxmitpriv->amsdu_vi_timeout = RTW_AMSDU_TIMER_UNSET;
  251. rtw_init_timer(&(pxmitpriv->amsdu_be_timer), padapter,
  252. rtw_amsdu_be_timeout_handler, padapter);
  253. pxmitpriv->amsdu_be_timeout = RTW_AMSDU_TIMER_UNSET;
  254. rtw_init_timer(&(pxmitpriv->amsdu_bk_timer), padapter,
  255. rtw_amsdu_bk_timeout_handler, padapter);
  256. pxmitpriv->amsdu_bk_timeout = RTW_AMSDU_TIMER_UNSET;
  257. pxmitpriv->amsdu_debug_set_timer = 0;
  258. pxmitpriv->amsdu_debug_timeout = 0;
  259. pxmitpriv->amsdu_debug_coalesce_one = 0;
  260. pxmitpriv->amsdu_debug_coalesce_two = 0;
  261. #endif
  262. rtw_init_xmit_block(padapter);
  263. rtw_hal_init_xmit_priv(padapter);
  264. exit:
  265. return res;
  266. }
  267. void rtw_mfree_xmit_priv_lock(struct xmit_priv *pxmitpriv);
  268. void rtw_mfree_xmit_priv_lock(struct xmit_priv *pxmitpriv)
  269. {
  270. _rtw_spinlock_free(&pxmitpriv->lock);
  271. _rtw_free_sema(&pxmitpriv->xmit_sema);
  272. /*_rtw_free_sema(&pxmitpriv->terminate_xmitthread_sema);*/
  273. _rtw_spinlock_free(&pxmitpriv->be_pending.lock);
  274. _rtw_spinlock_free(&pxmitpriv->bk_pending.lock);
  275. _rtw_spinlock_free(&pxmitpriv->vi_pending.lock);
  276. _rtw_spinlock_free(&pxmitpriv->vo_pending.lock);
  277. _rtw_spinlock_free(&pxmitpriv->bm_pending.lock);
  278. /* _rtw_spinlock_free(&pxmitpriv->legacy_dz_queue.lock); */
  279. /* _rtw_spinlock_free(&pxmitpriv->apsd_queue.lock); */
  280. _rtw_spinlock_free(&pxmitpriv->free_xmit_queue.lock);
  281. _rtw_spinlock_free(&pxmitpriv->free_xmitbuf_queue.lock);
  282. _rtw_spinlock_free(&pxmitpriv->pending_xmitbuf_queue.lock);
  283. }
  284. void _rtw_free_xmit_priv(struct xmit_priv *pxmitpriv)
  285. {
  286. int i;
  287. _adapter *padapter = pxmitpriv->adapter;
  288. struct xmit_frame *pxmitframe = (struct xmit_frame *) pxmitpriv->pxmit_frame_buf;
  289. struct xmit_buf *pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf;
  290. rtw_hal_free_xmit_priv(padapter);
  291. rtw_mfree_xmit_priv_lock(pxmitpriv);
  292. if (pxmitpriv->pxmit_frame_buf == NULL)
  293. goto out;
  294. for (i = 0; i < NR_XMITFRAME; i++) {
  295. rtw_os_xmit_complete(padapter, pxmitframe);
  296. pxmitframe++;
  297. }
  298. for (i = 0; i < NR_XMITBUFF; i++) {
  299. rtw_os_xmit_resource_free(padapter, pxmitbuf, (MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE);
  300. pxmitbuf++;
  301. }
  302. if (pxmitpriv->pallocated_frame_buf)
  303. rtw_vmfree(pxmitpriv->pallocated_frame_buf, NR_XMITFRAME * sizeof(struct xmit_frame) + 4);
  304. if (pxmitpriv->pallocated_xmitbuf)
  305. rtw_vmfree(pxmitpriv->pallocated_xmitbuf, NR_XMITBUFF * sizeof(struct xmit_buf) + 4);
  306. /* free xframe_ext queue, the same count as extbuf */
  307. if ((pxmitframe = (struct xmit_frame *)pxmitpriv->xframe_ext)) {
  308. for (i = 0; i < NR_XMIT_EXTBUFF; i++) {
  309. rtw_os_xmit_complete(padapter, pxmitframe);
  310. pxmitframe++;
  311. }
  312. }
  313. if (pxmitpriv->xframe_ext_alloc_addr)
  314. rtw_vmfree(pxmitpriv->xframe_ext_alloc_addr, NR_XMIT_EXTBUFF * sizeof(struct xmit_frame) + 4);
  315. _rtw_spinlock_free(&pxmitpriv->free_xframe_ext_queue.lock);
  316. /* free xmit extension buff */
  317. _rtw_spinlock_free(&pxmitpriv->free_xmit_extbuf_queue.lock);
  318. pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf;
  319. for (i = 0; i < NR_XMIT_EXTBUFF; i++) {
  320. rtw_os_xmit_resource_free(padapter, pxmitbuf, (MAX_XMIT_EXTBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE);
  321. pxmitbuf++;
  322. }
  323. if (pxmitpriv->pallocated_xmit_extbuf)
  324. rtw_vmfree(pxmitpriv->pallocated_xmit_extbuf, NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4);
  325. for (i = 0; i < CMDBUF_MAX; i++) {
  326. pxmitbuf = &pxmitpriv->pcmd_xmitbuf[i];
  327. if (pxmitbuf != NULL)
  328. rtw_os_xmit_resource_free(padapter, pxmitbuf, MAX_CMDBUF_SZ + XMITBUF_ALIGN_SZ , _TRUE);
  329. }
  330. rtw_free_hwxmits(padapter);
  331. #ifdef CONFIG_XMIT_ACK
  332. _rtw_mutex_free(&pxmitpriv->ack_tx_mutex);
  333. #endif
  334. rtw_free_xmit_block(padapter);
  335. out:
  336. return;
  337. }
  338. u8 rtw_get_tx_bw_mode(_adapter *adapter, struct sta_info *sta)
  339. {
  340. u8 bw;
  341. bw = sta->bw_mode;
  342. if (MLME_STATE(adapter) & WIFI_ASOC_STATE) {
  343. if (adapter->mlmeextpriv.cur_channel <= 14)
  344. bw = rtw_min(bw, ADAPTER_TX_BW_2G(adapter));
  345. else
  346. bw = rtw_min(bw, ADAPTER_TX_BW_5G(adapter));
  347. }
  348. return bw;
  349. }
  350. void rtw_get_adapter_tx_rate_bmp_by_bw(_adapter *adapter, u8 bw, u16 *r_bmp_cck_ofdm, u32 *r_bmp_ht, u32 *r_bmp_vht)
  351. {
  352. struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
  353. struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
  354. struct mlme_ext_priv *mlmeext = &adapter->mlmeextpriv;
  355. u8 fix_bw = 0xFF;
  356. u16 bmp_cck_ofdm = 0;
  357. u32 bmp_ht = 0;
  358. u32 bmp_vht = 0;
  359. int i;
  360. if (adapter->fix_rate != 0xFF && adapter->fix_bw != 0xFF)
  361. fix_bw = adapter->fix_bw;
  362. /* TODO: adapter->fix_rate */
  363. for (i = 0; i < macid_ctl->num; i++) {
  364. if (!rtw_macid_is_used(macid_ctl, i))
  365. continue;
  366. if (rtw_macid_get_if_g(macid_ctl, i) != adapter->iface_id)
  367. continue;
  368. if (bw == CHANNEL_WIDTH_20) /* CCK, OFDM always 20MHz */
  369. bmp_cck_ofdm |= macid_ctl->rate_bmp0[i] & 0x00000FFF;
  370. /* bypass mismatch bandwidth for HT, VHT */
  371. if ((fix_bw != 0xFF && fix_bw != bw) || (fix_bw == 0xFF && macid_ctl->bw[i] != bw))
  372. continue;
  373. if (macid_ctl->vht_en[i])
  374. bmp_vht |= (macid_ctl->rate_bmp0[i] >> 12) | (macid_ctl->rate_bmp1[i] << 20);
  375. else
  376. bmp_ht |= (macid_ctl->rate_bmp0[i] >> 12) | (macid_ctl->rate_bmp1[i] << 20);
  377. }
  378. /* TODO: mlmeext->tx_rate*/
  379. exit:
  380. if (r_bmp_cck_ofdm)
  381. *r_bmp_cck_ofdm = bmp_cck_ofdm;
  382. if (r_bmp_ht)
  383. *r_bmp_ht = bmp_ht;
  384. if (r_bmp_vht)
  385. *r_bmp_vht = bmp_vht;
  386. }
  387. void rtw_get_shared_macid_tx_rate_bmp_by_bw(struct dvobj_priv *dvobj, u8 bw, u16 *r_bmp_cck_ofdm, u32 *r_bmp_ht, u32 *r_bmp_vht)
  388. {
  389. struct macid_ctl_t *macid_ctl = dvobj_to_macidctl(dvobj);
  390. u16 bmp_cck_ofdm = 0;
  391. u32 bmp_ht = 0;
  392. u32 bmp_vht = 0;
  393. int i;
  394. for (i = 0; i < macid_ctl->num; i++) {
  395. if (!rtw_macid_is_used(macid_ctl, i))
  396. continue;
  397. if (rtw_macid_get_if_g(macid_ctl, i) != -1)
  398. continue;
  399. if (bw == CHANNEL_WIDTH_20) /* CCK, OFDM always 20MHz */
  400. bmp_cck_ofdm |= macid_ctl->rate_bmp0[i] & 0x00000FFF;
  401. /* bypass mismatch bandwidth for HT, VHT */
  402. if (macid_ctl->bw[i] != bw)
  403. continue;
  404. if (macid_ctl->vht_en[i])
  405. bmp_vht |= (macid_ctl->rate_bmp0[i] >> 12) | (macid_ctl->rate_bmp1[i] << 20);
  406. else
  407. bmp_ht |= (macid_ctl->rate_bmp0[i] >> 12) | (macid_ctl->rate_bmp1[i] << 20);
  408. }
  409. if (r_bmp_cck_ofdm)
  410. *r_bmp_cck_ofdm = bmp_cck_ofdm;
  411. if (r_bmp_ht)
  412. *r_bmp_ht = bmp_ht;
  413. if (r_bmp_vht)
  414. *r_bmp_vht = bmp_vht;
  415. }
  416. void rtw_update_tx_rate_bmp(struct dvobj_priv *dvobj)
  417. {
  418. struct rf_ctl_t *rf_ctl = dvobj_to_rfctl(dvobj);
  419. _adapter *adapter = dvobj_get_primary_adapter(dvobj);
  420. HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter);
  421. u8 bw;
  422. u16 bmp_cck_ofdm, tmp_cck_ofdm;
  423. u32 bmp_ht, tmp_ht, ori_bmp_ht[2];
  424. u8 ori_highest_ht_rate_bw_bmp;
  425. u32 bmp_vht, tmp_vht, ori_bmp_vht[4];
  426. u8 ori_highest_vht_rate_bw_bmp;
  427. int i;
  428. /* backup the original ht & vht highest bw bmp */
  429. ori_highest_ht_rate_bw_bmp = rf_ctl->highest_ht_rate_bw_bmp;
  430. ori_highest_vht_rate_bw_bmp = rf_ctl->highest_vht_rate_bw_bmp;
  431. for (bw = CHANNEL_WIDTH_20; bw <= CHANNEL_WIDTH_160; bw++) {
  432. /* backup the original ht & vht bmp */
  433. if (bw <= CHANNEL_WIDTH_40)
  434. ori_bmp_ht[bw] = rf_ctl->rate_bmp_ht_by_bw[bw];
  435. if (bw <= CHANNEL_WIDTH_160)
  436. ori_bmp_vht[bw] = rf_ctl->rate_bmp_vht_by_bw[bw];
  437. bmp_cck_ofdm = bmp_ht = bmp_vht = 0;
  438. if (hal_is_bw_support(dvobj_get_primary_adapter(dvobj), bw)) {
  439. for (i = 0; i < dvobj->iface_nums; i++) {
  440. if (!dvobj->padapters[i])
  441. continue;
  442. rtw_get_adapter_tx_rate_bmp_by_bw(dvobj->padapters[i], bw, &tmp_cck_ofdm, &tmp_ht, &tmp_vht);
  443. bmp_cck_ofdm |= tmp_cck_ofdm;
  444. bmp_ht |= tmp_ht;
  445. bmp_vht |= tmp_vht;
  446. }
  447. rtw_get_shared_macid_tx_rate_bmp_by_bw(dvobj, bw, &tmp_cck_ofdm, &tmp_ht, &tmp_vht);
  448. bmp_cck_ofdm |= tmp_cck_ofdm;
  449. bmp_ht |= tmp_ht;
  450. bmp_vht |= tmp_vht;
  451. }
  452. if (bw == CHANNEL_WIDTH_20)
  453. rf_ctl->rate_bmp_cck_ofdm = bmp_cck_ofdm;
  454. if (bw <= CHANNEL_WIDTH_40)
  455. rf_ctl->rate_bmp_ht_by_bw[bw] = bmp_ht;
  456. if (bw <= CHANNEL_WIDTH_160)
  457. rf_ctl->rate_bmp_vht_by_bw[bw] = bmp_vht;
  458. }
  459. #ifndef DBG_HIGHEST_RATE_BMP_BW_CHANGE
  460. #define DBG_HIGHEST_RATE_BMP_BW_CHANGE 0
  461. #endif
  462. {
  463. u8 highest_rate_bw;
  464. u8 highest_rate_bw_bmp;
  465. u8 update_ht_rs = _FALSE;
  466. u8 update_vht_rs = _FALSE;
  467. highest_rate_bw_bmp = BW_CAP_20M;
  468. highest_rate_bw = CHANNEL_WIDTH_20;
  469. for (bw = CHANNEL_WIDTH_20; bw <= CHANNEL_WIDTH_40; bw++) {
  470. if (rf_ctl->rate_bmp_ht_by_bw[highest_rate_bw] < rf_ctl->rate_bmp_ht_by_bw[bw]) {
  471. highest_rate_bw_bmp = ch_width_to_bw_cap(bw);
  472. highest_rate_bw = bw;
  473. } else if (rf_ctl->rate_bmp_ht_by_bw[highest_rate_bw] == rf_ctl->rate_bmp_ht_by_bw[bw])
  474. highest_rate_bw_bmp |= ch_width_to_bw_cap(bw);
  475. }
  476. rf_ctl->highest_ht_rate_bw_bmp = highest_rate_bw_bmp;
  477. if (ori_highest_ht_rate_bw_bmp != rf_ctl->highest_ht_rate_bw_bmp
  478. || largest_bit(ori_bmp_ht[highest_rate_bw]) != largest_bit(rf_ctl->rate_bmp_ht_by_bw[highest_rate_bw])
  479. ) {
  480. if (DBG_HIGHEST_RATE_BMP_BW_CHANGE) {
  481. RTW_INFO("highest_ht_rate_bw_bmp:0x%02x=>0x%02x\n", ori_highest_ht_rate_bw_bmp, rf_ctl->highest_ht_rate_bw_bmp);
  482. RTW_INFO("rate_bmp_ht_by_bw[%u]:0x%08x=>0x%08x\n", highest_rate_bw, ori_bmp_ht[highest_rate_bw], rf_ctl->rate_bmp_ht_by_bw[highest_rate_bw]);
  483. }
  484. update_ht_rs = _TRUE;
  485. }
  486. highest_rate_bw_bmp = BW_CAP_20M;
  487. highest_rate_bw = CHANNEL_WIDTH_20;
  488. for (bw = CHANNEL_WIDTH_20; bw <= CHANNEL_WIDTH_160; bw++) {
  489. if (rf_ctl->rate_bmp_vht_by_bw[highest_rate_bw] < rf_ctl->rate_bmp_vht_by_bw[bw]) {
  490. highest_rate_bw_bmp = ch_width_to_bw_cap(bw);
  491. highest_rate_bw = bw;
  492. } else if (rf_ctl->rate_bmp_vht_by_bw[highest_rate_bw] == rf_ctl->rate_bmp_vht_by_bw[bw])
  493. highest_rate_bw_bmp |= ch_width_to_bw_cap(bw);
  494. }
  495. rf_ctl->highest_vht_rate_bw_bmp = highest_rate_bw_bmp;
  496. if (ori_highest_vht_rate_bw_bmp != rf_ctl->highest_vht_rate_bw_bmp
  497. || largest_bit(ori_bmp_vht[highest_rate_bw]) != largest_bit(rf_ctl->rate_bmp_vht_by_bw[highest_rate_bw])
  498. ) {
  499. if (DBG_HIGHEST_RATE_BMP_BW_CHANGE) {
  500. RTW_INFO("highest_vht_rate_bw_bmp:0x%02x=>0x%02x\n", ori_highest_vht_rate_bw_bmp, rf_ctl->highest_vht_rate_bw_bmp);
  501. RTW_INFO("rate_bmp_vht_by_bw[%u]:0x%08x=>0x%08x\n", highest_rate_bw, ori_bmp_vht[highest_rate_bw], rf_ctl->rate_bmp_vht_by_bw[highest_rate_bw]);
  502. }
  503. update_vht_rs = _TRUE;
  504. }
  505. /* TODO: per rfpath and rate section handling? */
  506. if (update_ht_rs == _TRUE || update_vht_rs == _TRUE)
  507. rtw_hal_set_tx_power_level(dvobj_get_primary_adapter(dvobj), hal_data->current_channel);
  508. }
  509. }
  510. inline u16 rtw_get_tx_rate_bmp_cck_ofdm(struct dvobj_priv *dvobj)
  511. {
  512. struct rf_ctl_t *rf_ctl = dvobj_to_rfctl(dvobj);
  513. return rf_ctl->rate_bmp_cck_ofdm;
  514. }
  515. inline u32 rtw_get_tx_rate_bmp_ht_by_bw(struct dvobj_priv *dvobj, u8 bw)
  516. {
  517. struct rf_ctl_t *rf_ctl = dvobj_to_rfctl(dvobj);
  518. return rf_ctl->rate_bmp_ht_by_bw[bw];
  519. }
  520. inline u32 rtw_get_tx_rate_bmp_vht_by_bw(struct dvobj_priv *dvobj, u8 bw)
  521. {
  522. struct rf_ctl_t *rf_ctl = dvobj_to_rfctl(dvobj);
  523. return rf_ctl->rate_bmp_vht_by_bw[bw];
  524. }
  525. u8 rtw_get_tx_bw_bmp_of_ht_rate(struct dvobj_priv *dvobj, u8 rate, u8 max_bw)
  526. {
  527. struct rf_ctl_t *rf_ctl = dvobj_to_rfctl(dvobj);
  528. u8 bw;
  529. u8 bw_bmp = 0;
  530. u32 rate_bmp;
  531. if (!IS_HT_RATE(rate)) {
  532. rtw_warn_on(1);
  533. goto exit;
  534. }
  535. rate_bmp = 1 << (rate - MGN_MCS0);
  536. if (max_bw > CHANNEL_WIDTH_40)
  537. max_bw = CHANNEL_WIDTH_40;
  538. for (bw = CHANNEL_WIDTH_20; bw <= max_bw; bw++) {
  539. /* RA may use lower rate for retry */
  540. if (rf_ctl->rate_bmp_ht_by_bw[bw] >= rate_bmp)
  541. bw_bmp |= ch_width_to_bw_cap(bw);
  542. }
  543. exit:
  544. return bw_bmp;
  545. }
  546. u8 rtw_get_tx_bw_bmp_of_vht_rate(struct dvobj_priv *dvobj, u8 rate, u8 max_bw)
  547. {
  548. struct rf_ctl_t *rf_ctl = dvobj_to_rfctl(dvobj);
  549. u8 bw;
  550. u8 bw_bmp = 0;
  551. u32 rate_bmp;
  552. if (!IS_VHT_RATE(rate)) {
  553. rtw_warn_on(1);
  554. goto exit;
  555. }
  556. rate_bmp = 1 << (rate - MGN_VHT1SS_MCS0);
  557. if (max_bw > CHANNEL_WIDTH_160)
  558. max_bw = CHANNEL_WIDTH_160;
  559. for (bw = CHANNEL_WIDTH_20; bw <= max_bw; bw++) {
  560. /* RA may use lower rate for retry */
  561. if (rf_ctl->rate_bmp_vht_by_bw[bw] >= rate_bmp)
  562. bw_bmp |= ch_width_to_bw_cap(bw);
  563. }
  564. exit:
  565. return bw_bmp;
  566. }
  567. u8 query_ra_short_GI(struct sta_info *psta, u8 bw)
  568. {
  569. u8 sgi = _FALSE, sgi_20m = _FALSE, sgi_40m = _FALSE, sgi_80m = _FALSE;
  570. #ifdef CONFIG_80211N_HT
  571. #ifdef CONFIG_80211AC_VHT
  572. if (psta->vhtpriv.vht_option)
  573. sgi_80m = psta->vhtpriv.sgi_80m;
  574. #endif
  575. sgi_20m = psta->htpriv.sgi_20m;
  576. sgi_40m = psta->htpriv.sgi_40m;
  577. #endif
  578. switch (bw) {
  579. case CHANNEL_WIDTH_80:
  580. sgi = sgi_80m;
  581. break;
  582. case CHANNEL_WIDTH_40:
  583. sgi = sgi_40m;
  584. break;
  585. case CHANNEL_WIDTH_20:
  586. default:
  587. sgi = sgi_20m;
  588. break;
  589. }
  590. return sgi;
  591. }
  592. static void update_attrib_vcs_info(_adapter *padapter, struct xmit_frame *pxmitframe)
  593. {
  594. u32 sz;
  595. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  596. /* struct sta_info *psta = pattrib->psta; */
  597. struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  598. struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
  599. /*
  600. if(pattrib->psta)
  601. {
  602. psta = pattrib->psta;
  603. }
  604. else
  605. {
  606. RTW_INFO("%s, call rtw_get_stainfo()\n", __func__);
  607. psta=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] );
  608. }
  609. if(psta==NULL)
  610. {
  611. RTW_INFO("%s, psta==NUL\n", __func__);
  612. return;
  613. }
  614. if(!(psta->state &_FW_LINKED))
  615. {
  616. RTW_INFO("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
  617. return;
  618. }
  619. */
  620. if (pattrib->nr_frags != 1)
  621. sz = padapter->xmitpriv.frag_len;
  622. else /* no frag */
  623. sz = pattrib->last_txcmdsz;
  624. /* (1) RTS_Threshold is compared to the MPDU, not MSDU. */
  625. /* (2) If there are more than one frag in this MSDU, only the first frag uses protection frame. */
  626. /* Other fragments are protected by previous fragment. */
  627. /* So we only need to check the length of first fragment. */
  628. if (pmlmeext->cur_wireless_mode < WIRELESS_11_24N || padapter->registrypriv.wifi_spec) {
  629. if (sz > padapter->registrypriv.rts_thresh)
  630. pattrib->vcs_mode = RTS_CTS;
  631. else {
  632. if (pattrib->rtsen)
  633. pattrib->vcs_mode = RTS_CTS;
  634. else if (pattrib->cts2self)
  635. pattrib->vcs_mode = CTS_TO_SELF;
  636. else
  637. pattrib->vcs_mode = NONE_VCS;
  638. }
  639. } else {
  640. while (_TRUE) {
  641. #if 0 /* Todo */
  642. /* check IOT action */
  643. if (pHTInfo->IOTAction & HT_IOT_ACT_FORCED_CTS2SELF) {
  644. pattrib->vcs_mode = CTS_TO_SELF;
  645. pattrib->rts_rate = MGN_24M;
  646. break;
  647. } else if (pHTInfo->IOTAction & (HT_IOT_ACT_FORCED_RTS | HT_IOT_ACT_PURE_N_MODE)) {
  648. pattrib->vcs_mode = RTS_CTS;
  649. pattrib->rts_rate = MGN_24M;
  650. break;
  651. }
  652. #endif
  653. /* IOT action */
  654. if ((pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_ATHEROS) && (pattrib->ampdu_en == _TRUE) &&
  655. (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) {
  656. pattrib->vcs_mode = CTS_TO_SELF;
  657. break;
  658. }
  659. /* check ERP protection */
  660. if (pattrib->rtsen || pattrib->cts2self) {
  661. if (pattrib->rtsen)
  662. pattrib->vcs_mode = RTS_CTS;
  663. else if (pattrib->cts2self)
  664. pattrib->vcs_mode = CTS_TO_SELF;
  665. break;
  666. }
  667. /* check HT op mode */
  668. if (pattrib->ht_en) {
  669. u8 HTOpMode = pmlmeinfo->HT_protection;
  670. if ((pmlmeext->cur_bwmode && (HTOpMode == 2 || HTOpMode == 3)) ||
  671. (!pmlmeext->cur_bwmode && HTOpMode == 3)) {
  672. pattrib->vcs_mode = RTS_CTS;
  673. break;
  674. }
  675. }
  676. /* check rts */
  677. if (sz > padapter->registrypriv.rts_thresh) {
  678. pattrib->vcs_mode = RTS_CTS;
  679. break;
  680. }
  681. /* to do list: check MIMO power save condition. */
  682. /* check AMPDU aggregation for TXOP */
  683. if ((pattrib->ampdu_en == _TRUE) && (!IS_HARDWARE_TYPE_8812(padapter))) {
  684. pattrib->vcs_mode = RTS_CTS;
  685. break;
  686. }
  687. pattrib->vcs_mode = NONE_VCS;
  688. break;
  689. }
  690. }
  691. /* for debug : force driver control vrtl_carrier_sense. */
  692. if (padapter->driver_vcs_en == 1) {
  693. /* u8 driver_vcs_en; */ /* Enable=1, Disable=0 driver control vrtl_carrier_sense. */
  694. /* u8 driver_vcs_type; */ /* force 0:disable VCS, 1:RTS-CTS, 2:CTS-to-self when vcs_en=1. */
  695. pattrib->vcs_mode = padapter->driver_vcs_type;
  696. }
  697. }
  698. static void update_attrib_phy_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta)
  699. {
  700. struct mlme_ext_priv *mlmeext = &padapter->mlmeextpriv;
  701. u8 bw;
  702. pattrib->rtsen = psta->rtsen;
  703. pattrib->cts2self = psta->cts2self;
  704. pattrib->mdata = 0;
  705. pattrib->eosp = 0;
  706. pattrib->triggered = 0;
  707. pattrib->ampdu_spacing = 0;
  708. /* qos_en, ht_en, init rate, ,bw, ch_offset, sgi */
  709. pattrib->qos_en = psta->qos_option;
  710. pattrib->raid = psta->raid;
  711. bw = rtw_get_tx_bw_mode(padapter, psta);
  712. pattrib->bwmode = rtw_min(bw, mlmeext->cur_bwmode);
  713. pattrib->sgi = query_ra_short_GI(psta, pattrib->bwmode);
  714. pattrib->ldpc = psta->ldpc;
  715. pattrib->stbc = psta->stbc;
  716. #ifdef CONFIG_80211N_HT
  717. pattrib->ht_en = psta->htpriv.ht_option;
  718. pattrib->ch_offset = psta->htpriv.ch_offset;
  719. pattrib->ampdu_en = _FALSE;
  720. if (padapter->driver_ampdu_spacing != 0xFF) /* driver control AMPDU Density for peer sta's rx */
  721. pattrib->ampdu_spacing = padapter->driver_ampdu_spacing;
  722. else
  723. pattrib->ampdu_spacing = psta->htpriv.rx_ampdu_min_spacing;
  724. /* check if enable ampdu */
  725. if (pattrib->ht_en && psta->htpriv.ampdu_enable) {
  726. if (psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority)) {
  727. pattrib->ampdu_en = _TRUE;
  728. if (psta->htpriv.tx_amsdu_enable == _TRUE)
  729. pattrib->amsdu_ampdu_en = _TRUE;
  730. else
  731. pattrib->amsdu_ampdu_en = _FALSE;
  732. }
  733. }
  734. #endif /* CONFIG_80211N_HT */
  735. /* if(pattrib->ht_en && psta->htpriv.ampdu_enable) */
  736. /* { */
  737. /* if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority)) */
  738. /* pattrib->ampdu_en = _TRUE; */
  739. /* } */
  740. #ifdef CONFIG_TDLS
  741. if (pattrib->direct_link == _TRUE) {
  742. psta = pattrib->ptdls_sta;
  743. pattrib->raid = psta->raid;
  744. #ifdef CONFIG_80211N_HT
  745. pattrib->bwmode = rtw_get_tx_bw_mode(padapter, psta);
  746. pattrib->ht_en = psta->htpriv.ht_option;
  747. pattrib->ch_offset = psta->htpriv.ch_offset;
  748. pattrib->sgi = query_ra_short_GI(psta, pattrib->bwmode);
  749. #endif /* CONFIG_80211N_HT */
  750. }
  751. #endif /* CONFIG_TDLS */
  752. pattrib->retry_ctrl = _FALSE;
  753. #ifdef CONFIG_AUTO_AP_MODE
  754. if (psta->isrc && psta->pid > 0)
  755. pattrib->pctrl = _TRUE;
  756. #endif
  757. }
  758. static s32 update_attrib_sec_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta)
  759. {
  760. sint res = _SUCCESS;
  761. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  762. struct security_priv *psecuritypriv = &padapter->securitypriv;
  763. sint bmcast = IS_MCAST(pattrib->ra);
  764. _rtw_memset(pattrib->dot118021x_UncstKey.skey, 0, 16);
  765. _rtw_memset(pattrib->dot11tkiptxmickey.skey, 0, 16);
  766. pattrib->mac_id = psta->mac_id;
  767. if (psta->ieee8021x_blocked == _TRUE) {
  768. pattrib->encrypt = 0;
  769. if ((pattrib->ether_type != 0x888e) && (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _FALSE)) {
  770. #ifdef DBG_TX_DROP_FRAME
  771. RTW_INFO("DBG_TX_DROP_FRAME %s psta->ieee8021x_blocked == _TRUE, pattrib->ether_type(%04x) != 0x888e\n", __FUNCTION__, pattrib->ether_type);
  772. #endif
  773. res = _FAIL;
  774. goto exit;
  775. }
  776. } else {
  777. GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast);
  778. #ifdef CONFIG_WAPI_SUPPORT
  779. if (pattrib->ether_type == 0x88B4)
  780. pattrib->encrypt = _NO_PRIVACY_;
  781. #endif
  782. switch (psecuritypriv->dot11AuthAlgrthm) {
  783. case dot11AuthAlgrthm_Open:
  784. case dot11AuthAlgrthm_Shared:
  785. case dot11AuthAlgrthm_Auto:
  786. pattrib->key_idx = (u8)psecuritypriv->dot11PrivacyKeyIndex;
  787. break;
  788. case dot11AuthAlgrthm_8021X:
  789. if (bmcast)
  790. pattrib->key_idx = (u8)psecuritypriv->dot118021XGrpKeyid;
  791. else
  792. pattrib->key_idx = 0;
  793. break;
  794. default:
  795. pattrib->key_idx = 0;
  796. break;
  797. }
  798. /* For WPS 1.0 WEP, driver should not encrypt EAPOL Packet for WPS handshake. */
  799. if (((pattrib->encrypt == _WEP40_) || (pattrib->encrypt == _WEP104_)) && (pattrib->ether_type == 0x888e))
  800. pattrib->encrypt = _NO_PRIVACY_;
  801. }
  802. #ifdef CONFIG_TDLS
  803. if (pattrib->direct_link == _TRUE) {
  804. if (pattrib->encrypt > 0)
  805. pattrib->encrypt = _AES_;
  806. }
  807. #endif
  808. switch (pattrib->encrypt) {
  809. case _WEP40_:
  810. case _WEP104_:
  811. pattrib->iv_len = 4;
  812. pattrib->icv_len = 4;
  813. WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
  814. break;
  815. case _TKIP_:
  816. pattrib->iv_len = 8;
  817. pattrib->icv_len = 4;
  818. if (psecuritypriv->busetkipkey == _FAIL) {
  819. #ifdef DBG_TX_DROP_FRAME
  820. RTW_INFO("DBG_TX_DROP_FRAME %s psecuritypriv->busetkipkey(%d)==_FAIL drop packet\n", __FUNCTION__, psecuritypriv->busetkipkey);
  821. #endif
  822. res = _FAIL;
  823. goto exit;
  824. }
  825. if (bmcast)
  826. TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
  827. else
  828. TKIP_IV(pattrib->iv, psta->dot11txpn, 0);
  829. _rtw_memcpy(pattrib->dot11tkiptxmickey.skey, psta->dot11tkiptxmickey.skey, 16);
  830. break;
  831. case _AES_:
  832. pattrib->iv_len = 8;
  833. pattrib->icv_len = 8;
  834. if (bmcast)
  835. AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
  836. else
  837. AES_IV(pattrib->iv, psta->dot11txpn, 0);
  838. break;
  839. #ifdef CONFIG_WAPI_SUPPORT
  840. case _SMS4_:
  841. pattrib->iv_len = 18;
  842. pattrib->icv_len = 16;
  843. rtw_wapi_get_iv(padapter, pattrib->ra, pattrib->iv);
  844. break;
  845. #endif
  846. default:
  847. pattrib->iv_len = 0;
  848. pattrib->icv_len = 0;
  849. break;
  850. }
  851. if (pattrib->encrypt > 0)
  852. _rtw_memcpy(pattrib->dot118021x_UncstKey.skey, psta->dot118021x_UncstKey.skey, 16);
  853. if (pattrib->encrypt &&
  854. ((padapter->securitypriv.sw_encrypt == _TRUE) || (psecuritypriv->hw_decrypted == _FALSE))) {
  855. pattrib->bswenc = _TRUE;
  856. } else {
  857. pattrib->bswenc = _FALSE;
  858. }
  859. #if defined(CONFIG_CONCURRENT_MODE)
  860. pattrib->bmc_camid = padapter->securitypriv.dot118021x_bmc_cam_id;
  861. #endif
  862. if (pattrib->encrypt && bmcast && _rtw_camctl_chk_flags(padapter, SEC_STATUS_STA_PK_GK_CONFLICT_DIS_BMC_SEARCH))
  863. pattrib->bswenc = _TRUE;
  864. #ifdef CONFIG_WAPI_SUPPORT
  865. if (pattrib->encrypt == _SMS4_)
  866. pattrib->bswenc = _FALSE;
  867. #endif
  868. exit:
  869. return res;
  870. }
  871. u8 qos_acm(u8 acm_mask, u8 priority)
  872. {
  873. u8 change_priority = priority;
  874. switch (priority) {
  875. case 0:
  876. case 3:
  877. if (acm_mask & BIT(1))
  878. change_priority = 1;
  879. break;
  880. case 1:
  881. case 2:
  882. break;
  883. case 4:
  884. case 5:
  885. if (acm_mask & BIT(2))
  886. change_priority = 0;
  887. break;
  888. case 6:
  889. case 7:
  890. if (acm_mask & BIT(3))
  891. change_priority = 5;
  892. break;
  893. default:
  894. RTW_INFO("qos_acm(): invalid pattrib->priority: %d!!!\n", priority);
  895. break;
  896. }
  897. return change_priority;
  898. }
  899. static void set_qos(struct pkt_file *ppktfile, struct pkt_attrib *pattrib)
  900. {
  901. struct ethhdr etherhdr;
  902. struct iphdr ip_hdr;
  903. s32 UserPriority = 0;
  904. _rtw_open_pktfile(ppktfile->pkt, ppktfile);
  905. _rtw_pktfile_read(ppktfile, (unsigned char *)&etherhdr, ETH_HLEN);
  906. /* get UserPriority from IP hdr */
  907. if (pattrib->ether_type == 0x0800) {
  908. _rtw_pktfile_read(ppktfile, (u8 *)&ip_hdr, sizeof(ip_hdr));
  909. /* UserPriority = (ntohs(ip_hdr.tos) >> 5) & 0x3; */
  910. UserPriority = ip_hdr.tos >> 5;
  911. }
  912. /*
  913. else if (pattrib->ether_type == 0x888e) {
  914. UserPriority = 7;
  915. }
  916. */
  917. pattrib->priority = UserPriority;
  918. pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN;
  919. pattrib->subtype = WIFI_QOS_DATA_TYPE;
  920. }
  921. #ifdef CONFIG_TDLS
  922. u8 rtw_check_tdls_established(_adapter *padapter, struct pkt_attrib *pattrib)
  923. {
  924. pattrib->ptdls_sta = NULL;
  925. pattrib->direct_link = _FALSE;
  926. if (padapter->tdlsinfo.link_established == _TRUE) {
  927. pattrib->ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->dst);
  928. #if 1
  929. if ((pattrib->ptdls_sta != NULL) &&
  930. (pattrib->ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) &&
  931. (pattrib->ether_type != 0x0806)) {
  932. pattrib->direct_link = _TRUE;
  933. /* RTW_INFO("send ptk to "MAC_FMT" using direct link\n", MAC_ARG(pattrib->dst)); */
  934. }
  935. #else
  936. if (pattrib->ptdls_sta != NULL &&
  937. pattrib->ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) {
  938. pattrib->direct_link = _TRUE;
  939. #if 0
  940. RTW_INFO("send ptk to "MAC_FMT" using direct link\n", MAC_ARG(pattrib->dst));
  941. #endif
  942. }
  943. /* ARP frame may be helped by AP*/
  944. if (pattrib->ether_type != 0x0806)
  945. pattrib->direct_link = _FALSE;
  946. #endif
  947. }
  948. return pattrib->direct_link;
  949. }
  950. s32 update_tdls_attrib(_adapter *padapter, struct pkt_attrib *pattrib)
  951. {
  952. struct sta_info *psta = NULL;
  953. struct sta_priv *pstapriv = &padapter->stapriv;
  954. struct security_priv *psecuritypriv = &padapter->securitypriv;
  955. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  956. struct qos_priv *pqospriv = &pmlmepriv->qospriv;
  957. s32 res = _SUCCESS;
  958. psta = rtw_get_stainfo(pstapriv, pattrib->ra);
  959. if (psta == NULL) {
  960. res = _FAIL;
  961. goto exit;
  962. }
  963. pattrib->mac_id = psta->mac_id;
  964. pattrib->psta = psta;
  965. pattrib->ack_policy = 0;
  966. /* get ether_hdr_len */
  967. pattrib->pkt_hdrlen = ETH_HLEN;
  968. /* [TDLS] TODO: setup req/rsp should be AC_BK */
  969. if (pqospriv->qos_option && psta->qos_option) {
  970. pattrib->priority = 4; /* tdls management frame should be AC_VI */
  971. pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN;
  972. pattrib->subtype = WIFI_QOS_DATA_TYPE;
  973. } else {
  974. pattrib->priority = 0;
  975. pattrib->hdrlen = WLAN_HDR_A3_LEN;
  976. pattrib->subtype = WIFI_DATA_TYPE;
  977. }
  978. /* TODO:_lock */
  979. if (update_attrib_sec_info(padapter, pattrib, psta) == _FAIL) {
  980. res = _FAIL;
  981. goto exit;
  982. }
  983. update_attrib_phy_info(padapter, pattrib, psta);
  984. exit:
  985. return res;
  986. }
  987. #endif /* CONFIG_TDLS */
  988. /*get non-qos hw_ssn control register,mapping to REG_HW_SEQ0,1,2,3*/
  989. inline u8 rtw_get_hwseq_no(_adapter *padapter)
  990. {
  991. u8 hwseq_num = 0;
  992. #ifdef CONFIG_CONCURRENT_MODE
  993. if (padapter->adapter_type != PRIMARY_ADAPTER)
  994. hwseq_num = 1;
  995. /* else */
  996. /* hwseq_num = 2; */
  997. #endif /* CONFIG_CONCURRENT_MODE */
  998. return hwseq_num;
  999. }
  1000. static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattrib)
  1001. {
  1002. uint i;
  1003. struct pkt_file pktfile;
  1004. struct sta_info *psta = NULL;
  1005. struct ethhdr etherhdr;
  1006. sint bmcast;
  1007. struct sta_priv *pstapriv = &padapter->stapriv;
  1008. struct security_priv *psecuritypriv = &padapter->securitypriv;
  1009. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  1010. struct qos_priv *pqospriv = &pmlmepriv->qospriv;
  1011. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  1012. sint res = _SUCCESS;
  1013. DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib);
  1014. _rtw_open_pktfile(pkt, &pktfile);
  1015. i = _rtw_pktfile_read(&pktfile, (u8 *)&etherhdr, ETH_HLEN);
  1016. pattrib->ether_type = ntohs(etherhdr.h_proto);
  1017. _rtw_memcpy(pattrib->dst, &etherhdr.h_dest, ETH_ALEN);
  1018. _rtw_memcpy(pattrib->src, &etherhdr.h_source, ETH_ALEN);
  1019. if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ||
  1020. (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) {
  1021. _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
  1022. _rtw_memcpy(pattrib->ta, adapter_mac_addr(padapter), ETH_ALEN);
  1023. DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_adhoc);
  1024. } else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
  1025. #ifdef CONFIG_TDLS
  1026. if (rtw_check_tdls_established(padapter, pattrib) == _TRUE)
  1027. _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); /* For TDLS direct link Tx, set ra to be same to dst */
  1028. else
  1029. #endif
  1030. _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
  1031. _rtw_memcpy(pattrib->ta, adapter_mac_addr(padapter), ETH_ALEN);
  1032. DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_sta);
  1033. } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
  1034. _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
  1035. _rtw_memcpy(pattrib->ta, get_bssid(pmlmepriv), ETH_ALEN);
  1036. DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_ap);
  1037. } else
  1038. DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_unknown);
  1039. bmcast = IS_MCAST(pattrib->ra);
  1040. if (bmcast) {
  1041. psta = rtw_get_bcmc_stainfo(padapter);
  1042. if (psta == NULL) { /* if we cannot get psta => drop the pkt */
  1043. DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_sta);
  1044. #ifdef DBG_TX_DROP_FRAME
  1045. RTW_INFO("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __func__, MAC_ARG(pattrib->ra));
  1046. #endif
  1047. res = _FAIL;
  1048. goto exit;
  1049. }
  1050. } else {
  1051. psta = rtw_get_stainfo(pstapriv, pattrib->ra);
  1052. if (psta == NULL) { /* if we cannot get psta => drop the pkt */
  1053. DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_ucast_sta);
  1054. #ifdef DBG_TX_DROP_FRAME
  1055. RTW_INFO("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __func__, MAC_ARG(pattrib->ra));
  1056. #endif
  1057. res = _FAIL;
  1058. goto exit;
  1059. } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE && !(psta->state & _FW_LINKED)) {
  1060. DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_ucast_ap_link);
  1061. res = _FAIL;
  1062. goto exit;
  1063. }
  1064. }
  1065. if (!(psta->state & _FW_LINKED)) {
  1066. DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_link);
  1067. RTW_INFO("%s-"ADPT_FMT" psta("MAC_FMT")->state(0x%x) != _FW_LINKED\n", __func__, ADPT_ARG(padapter), MAC_ARG(psta->hwaddr), psta->state);
  1068. res = _FAIL;
  1069. goto exit;
  1070. }
  1071. pattrib->pktlen = pktfile.pkt_len;
  1072. /* TODO: 802.1Q VLAN header */
  1073. /* TODO: IPV6 */
  1074. if (ETH_P_IP == pattrib->ether_type) {
  1075. u8 ip[20];
  1076. _rtw_pktfile_read(&pktfile, ip, 20);
  1077. if (GET_IPV4_IHL(ip) * 4 > 20)
  1078. _rtw_pktfile_read(&pktfile, NULL, GET_IPV4_IHL(ip) - 20);
  1079. pattrib->icmp_pkt = 0;
  1080. pattrib->dhcp_pkt = 0;
  1081. if (GET_IPV4_PROTOCOL(ip) == 0x01) { /* ICMP */
  1082. pattrib->icmp_pkt = 1;
  1083. DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_icmp);
  1084. } else if (GET_IPV4_PROTOCOL(ip) == 0x11) { /* UDP */
  1085. u8 udp[8];
  1086. _rtw_pktfile_read(&pktfile, udp, 8);
  1087. if ((GET_UDP_SRC(udp) == 68 && GET_UDP_DST(udp) == 67)
  1088. || (GET_UDP_SRC(udp) == 67 && GET_UDP_DST(udp) == 68)
  1089. ) {
  1090. /* 67 : UDP BOOTP server, 68 : UDP BOOTP client */
  1091. if (pattrib->pktlen > 282) { /* MINIMUM_DHCP_PACKET_SIZE */
  1092. pattrib->dhcp_pkt = 1;
  1093. DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_dhcp);
  1094. if (0)
  1095. RTW_INFO("send DHCP packet\n");
  1096. }
  1097. }
  1098. } else if (GET_IPV4_PROTOCOL(ip) == 0x06 /* TCP */
  1099. && rtw_st_ctl_chk_reg_s_proto(&psta->st_ctl, 0x06) == _TRUE
  1100. ) {
  1101. u8 tcp[20];
  1102. _rtw_pktfile_read(&pktfile, tcp, 20);
  1103. if (rtw_st_ctl_chk_reg_rule(&psta->st_ctl, padapter, IPV4_SRC(ip), TCP_SRC(tcp), IPV4_DST(ip), TCP_DST(tcp)) == _TRUE) {
  1104. if (GET_TCP_SYN(tcp) && GET_TCP_ACK(tcp)) {
  1105. session_tracker_add_cmd(padapter, psta
  1106. , IPV4_SRC(ip), TCP_SRC(tcp)
  1107. , IPV4_SRC(ip), TCP_DST(tcp));
  1108. if (DBG_SESSION_TRACKER)
  1109. RTW_INFO(FUNC_ADPT_FMT" local:"IP_FMT":"PORT_FMT", remote:"IP_FMT":"PORT_FMT" SYN-ACK\n"
  1110. , FUNC_ADPT_ARG(padapter)
  1111. , IP_ARG(IPV4_SRC(ip)), PORT_ARG(TCP_SRC(tcp))
  1112. , IP_ARG(IPV4_DST(ip)), PORT_ARG(TCP_DST(tcp)));
  1113. }
  1114. if (GET_TCP_FIN(tcp)) {
  1115. session_tracker_del_cmd(padapter, psta
  1116. , IPV4_SRC(ip), TCP_SRC(tcp)
  1117. , IPV4_SRC(ip), TCP_DST(tcp));
  1118. if (DBG_SESSION_TRACKER)
  1119. RTW_INFO(FUNC_ADPT_FMT" local:"IP_FMT":"PORT_FMT", remote:"IP_FMT":"PORT_FMT" FIN\n"
  1120. , FUNC_ADPT_ARG(padapter)
  1121. , IP_ARG(IPV4_SRC(ip)), PORT_ARG(TCP_SRC(tcp))
  1122. , IP_ARG(IPV4_DST(ip)), PORT_ARG(TCP_DST(tcp)));
  1123. }
  1124. }
  1125. }
  1126. } else if (0x888e == pattrib->ether_type)
  1127. RTW_PRINT("send eapol packet\n");
  1128. if ((pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1))
  1129. rtw_mi_set_scan_deny(padapter, 3000);
  1130. #ifdef CONFIG_LPS
  1131. /* If EAPOL , ARP , OR DHCP packet, driver must be in active mode. */
  1132. #ifdef CONFIG_WAPI_SUPPORT
  1133. if ((pattrib->ether_type == 0x88B4) || (pattrib->ether_type == 0x0806) || (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1))
  1134. #else /* !CONFIG_WAPI_SUPPORT */
  1135. #if 0
  1136. if ((pattrib->ether_type == 0x0806) || (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1))
  1137. #else /* only ICMP/DHCP packets is as SPECIAL_PACKET, and leave LPS when tx IMCP/DHCP packets. */
  1138. /* if ((pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) ) */
  1139. if (pattrib->icmp_pkt == 1)
  1140. rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_LEAVE, 1);
  1141. else if (pattrib->dhcp_pkt == 1)
  1142. #endif
  1143. #endif
  1144. {
  1145. DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_active);
  1146. rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SPECIAL_PACKET, 1);
  1147. }
  1148. #endif /* CONFIG_LPS */
  1149. #ifdef CONFIG_BEAMFORMING
  1150. update_attrib_txbf_info(padapter, pattrib, psta);
  1151. #endif
  1152. /* TODO:_lock */
  1153. if (update_attrib_sec_info(padapter, pattrib, psta) == _FAIL) {
  1154. DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_sec);
  1155. res = _FAIL;
  1156. goto exit;
  1157. }
  1158. update_attrib_phy_info(padapter, pattrib, psta);
  1159. /* RTW_INFO("%s ==> mac_id(%d)\n",__FUNCTION__,pattrib->mac_id ); */
  1160. pattrib->psta = psta;
  1161. /* TODO:_unlock */
  1162. pattrib->pctrl = 0;
  1163. pattrib->ack_policy = 0;
  1164. /* get ether_hdr_len */
  1165. pattrib->pkt_hdrlen = ETH_HLEN;/* (pattrib->ether_type == 0x8100) ? (14 + 4 ): 14; */ /* vlan tag */
  1166. pattrib->hdrlen = WLAN_HDR_A3_LEN;
  1167. pattrib->subtype = WIFI_DATA_TYPE;
  1168. pattrib->priority = 0;
  1169. if (check_fwstate(pmlmepriv, WIFI_AP_STATE | WIFI_ADHOC_STATE | WIFI_ADHOC_MASTER_STATE)) {
  1170. if (pattrib->qos_en)
  1171. set_qos(&pktfile, pattrib);
  1172. } else {
  1173. #ifdef CONFIG_TDLS
  1174. if (pattrib->direct_link == _TRUE) {
  1175. if (pattrib->qos_en)
  1176. set_qos(&pktfile, pattrib);
  1177. } else
  1178. #endif
  1179. {
  1180. if (pqospriv->qos_option) {
  1181. set_qos(&pktfile, pattrib);
  1182. if (pmlmepriv->acm_mask != 0)
  1183. pattrib->priority = qos_acm(pmlmepriv->acm_mask, pattrib->priority);
  1184. }
  1185. }
  1186. }
  1187. /* pattrib->priority = 5; */ /* force to used VI queue, for testing */
  1188. pattrib->hw_ssn_sel = pxmitpriv->hw_ssn_seq_no;
  1189. rtw_set_tx_chksum_offload(pkt, pattrib);
  1190. exit:
  1191. return res;
  1192. }
  1193. static s32 xmitframe_addmic(_adapter *padapter, struct xmit_frame *pxmitframe)
  1194. {
  1195. sint curfragnum, length;
  1196. u8 *pframe, *payload, mic[8];
  1197. struct mic_data micdata;
  1198. /* struct sta_info *stainfo; */
  1199. struct qos_priv *pqospriv = &(padapter->mlmepriv.qospriv);
  1200. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  1201. struct security_priv *psecuritypriv = &padapter->securitypriv;
  1202. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  1203. u8 priority[4] = {0x0, 0x0, 0x0, 0x0};
  1204. u8 hw_hdr_offset = 0;
  1205. sint bmcst = IS_MCAST(pattrib->ra);
  1206. /*
  1207. if(pattrib->psta)
  1208. {
  1209. stainfo = pattrib->psta;
  1210. }
  1211. else
  1212. {
  1213. RTW_INFO("%s, call rtw_get_stainfo()\n", __func__);
  1214. stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0]);
  1215. }
  1216. if(stainfo==NULL)
  1217. {
  1218. RTW_INFO("%s, psta==NUL\n", __func__);
  1219. return _FAIL;
  1220. }
  1221. if(!(stainfo->state &_FW_LINKED))
  1222. {
  1223. RTW_INFO("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, stainfo->state);
  1224. return _FAIL;
  1225. }
  1226. */
  1227. #ifdef CONFIG_USB_TX_AGGREGATION
  1228. hw_hdr_offset = TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ);;
  1229. #else
  1230. #ifdef CONFIG_TX_EARLY_MODE
  1231. hw_hdr_offset = TXDESC_OFFSET + EARLY_MODE_INFO_SIZE;
  1232. #else
  1233. hw_hdr_offset = TXDESC_OFFSET;
  1234. #endif
  1235. #endif
  1236. if (pattrib->encrypt == _TKIP_) { /* if(psecuritypriv->dot11PrivacyAlgrthm==_TKIP_PRIVACY_) */
  1237. /* encode mic code */
  1238. /* if(stainfo!= NULL) */
  1239. {
  1240. u8 null_key[16] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
  1241. pframe = pxmitframe->buf_addr + hw_hdr_offset;
  1242. if (bmcst) {
  1243. if (_rtw_memcmp(psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey, null_key, 16) == _TRUE) {
  1244. /* DbgPrint("\nxmitframe_addmic:stainfo->dot11tkiptxmickey==0\n"); */
  1245. /* rtw_msleep_os(10); */
  1246. return _FAIL;
  1247. }
  1248. /* start to calculate the mic code */
  1249. rtw_secmicsetkey(&micdata, psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey);
  1250. } else {
  1251. if (_rtw_memcmp(&pattrib->dot11tkiptxmickey.skey[0], null_key, 16) == _TRUE) {
  1252. /* DbgPrint("\nxmitframe_addmic:stainfo->dot11tkiptxmickey==0\n"); */
  1253. /* rtw_msleep_os(10); */
  1254. return _FAIL;
  1255. }
  1256. /* start to calculate the mic code */
  1257. rtw_secmicsetkey(&micdata, &pattrib->dot11tkiptxmickey.skey[0]);
  1258. }
  1259. if (pframe[1] & 1) { /* ToDS==1 */
  1260. rtw_secmicappend(&micdata, &pframe[16], 6); /* DA */
  1261. if (pframe[1] & 2) /* From Ds==1 */
  1262. rtw_secmicappend(&micdata, &pframe[24], 6);
  1263. else
  1264. rtw_secmicappend(&micdata, &pframe[10], 6);
  1265. } else { /* ToDS==0 */
  1266. rtw_secmicappend(&micdata, &pframe[4], 6); /* DA */
  1267. if (pframe[1] & 2) /* From Ds==1 */
  1268. rtw_secmicappend(&micdata, &pframe[16], 6);
  1269. else
  1270. rtw_secmicappend(&micdata, &pframe[10], 6);
  1271. }
  1272. /* if(pqospriv->qos_option==1) */
  1273. if (pattrib->qos_en)
  1274. priority[0] = (u8)pxmitframe->attrib.priority;
  1275. rtw_secmicappend(&micdata, &priority[0], 4);
  1276. payload = pframe;
  1277. for (curfragnum = 0; curfragnum < pattrib->nr_frags; curfragnum++) {
  1278. payload = (u8 *)RND4((SIZE_PTR)(payload));
  1279. payload = payload + pattrib->hdrlen + pattrib->iv_len;
  1280. if ((curfragnum + 1) == pattrib->nr_frags) {
  1281. length = pattrib->last_txcmdsz - pattrib->hdrlen - pattrib->iv_len - ((pattrib->bswenc) ? pattrib->icv_len : 0);
  1282. rtw_secmicappend(&micdata, payload, length);
  1283. payload = payload + length;
  1284. } else {
  1285. length = pxmitpriv->frag_len - pattrib->hdrlen - pattrib->iv_len - ((pattrib->bswenc) ? pattrib->icv_len : 0);
  1286. rtw_secmicappend(&micdata, payload, length);
  1287. payload = payload + length + pattrib->icv_len;
  1288. }
  1289. }
  1290. rtw_secgetmic(&micdata, &(mic[0]));
  1291. /* add mic code and add the mic code length in last_txcmdsz */
  1292. _rtw_memcpy(payload, &(mic[0]), 8);
  1293. pattrib->last_txcmdsz += 8;
  1294. payload = payload - pattrib->last_txcmdsz + 8;
  1295. }
  1296. }
  1297. return _SUCCESS;
  1298. }
  1299. /*#define DBG_TX_SW_ENCRYPTOR*/
  1300. static s32 xmitframe_swencrypt(_adapter *padapter, struct xmit_frame *pxmitframe)
  1301. {
  1302. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  1303. /* struct security_priv *psecuritypriv=&padapter->securitypriv; */
  1304. /* if((psecuritypriv->sw_encrypt)||(pattrib->bswenc)) */
  1305. if (pattrib->bswenc) {
  1306. #ifdef DBG_TX_SW_ENCRYPTOR
  1307. RTW_INFO(ADPT_FMT" - sec_type:%s DO SW encryption\n",
  1308. ADPT_ARG(padapter), security_type_str(pattrib->encrypt));
  1309. #endif
  1310. switch (pattrib->encrypt) {
  1311. case _WEP40_:
  1312. case _WEP104_:
  1313. rtw_wep_encrypt(padapter, (u8 *)pxmitframe);
  1314. break;
  1315. case _TKIP_:
  1316. rtw_tkip_encrypt(padapter, (u8 *)pxmitframe);
  1317. break;
  1318. case _AES_:
  1319. rtw_aes_encrypt(padapter, (u8 *)pxmitframe);
  1320. break;
  1321. #ifdef CONFIG_WAPI_SUPPORT
  1322. case _SMS4_:
  1323. rtw_sms4_encrypt(padapter, (u8 *)pxmitframe);
  1324. #endif
  1325. default:
  1326. break;
  1327. }
  1328. }
  1329. return _SUCCESS;
  1330. }
  1331. s32 rtw_make_wlanhdr(_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib)
  1332. {
  1333. u16 *qc;
  1334. struct rtw_ieee80211_hdr *pwlanhdr = (struct rtw_ieee80211_hdr *)hdr;
  1335. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  1336. struct qos_priv *pqospriv = &pmlmepriv->qospriv;
  1337. u8 qos_option = _FALSE;
  1338. sint res = _SUCCESS;
  1339. u16 *fctrl = &pwlanhdr->frame_ctl;
  1340. /* struct sta_info *psta; */
  1341. /* sint bmcst = IS_MCAST(pattrib->ra); */
  1342. /*
  1343. psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
  1344. if(pattrib->psta != psta)
  1345. {
  1346. RTW_INFO("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
  1347. return;
  1348. }
  1349. if(psta==NULL)
  1350. {
  1351. RTW_INFO("%s, psta==NUL\n", __func__);
  1352. return _FAIL;
  1353. }
  1354. if(!(psta->state &_FW_LINKED))
  1355. {
  1356. RTW_INFO("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
  1357. return _FAIL;
  1358. }
  1359. */
  1360. _rtw_memset(hdr, 0, WLANHDR_OFFSET);
  1361. set_frame_sub_type(fctrl, pattrib->subtype);
  1362. if (pattrib->subtype & WIFI_DATA_TYPE) {
  1363. if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)) {
  1364. #ifdef CONFIG_TDLS
  1365. if (pattrib->direct_link == _TRUE) {
  1366. /* TDLS data transfer, ToDS=0, FrDs=0 */
  1367. _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
  1368. _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
  1369. _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
  1370. if (pattrib->qos_en)
  1371. qos_option = _TRUE;
  1372. } else
  1373. #endif /* CONFIG_TDLS */
  1374. {
  1375. /* to_ds = 1, fr_ds = 0; */
  1376. /* 1.Data transfer to AP */
  1377. /* 2.Arp pkt will relayed by AP */
  1378. SetToDs(fctrl);
  1379. _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
  1380. _rtw_memcpy(pwlanhdr->addr2, pattrib->ta, ETH_ALEN);
  1381. _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
  1382. if (pqospriv->qos_option)
  1383. qos_option = _TRUE;
  1384. }
  1385. } else if ((check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)) {
  1386. /* to_ds = 0, fr_ds = 1; */
  1387. SetFrDs(fctrl);
  1388. _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
  1389. _rtw_memcpy(pwlanhdr->addr2, get_bssid(pmlmepriv), ETH_ALEN);
  1390. _rtw_memcpy(pwlanhdr->addr3, pattrib->src, ETH_ALEN);
  1391. if (pattrib->qos_en)
  1392. qos_option = _TRUE;
  1393. } else if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ||
  1394. (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) {
  1395. _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
  1396. _rtw_memcpy(pwlanhdr->addr2, pattrib->ta, ETH_ALEN);
  1397. _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
  1398. if (pattrib->qos_en)
  1399. qos_option = _TRUE;
  1400. } else {
  1401. res = _FAIL;
  1402. goto exit;
  1403. }
  1404. if (pattrib->mdata)
  1405. SetMData(fctrl);
  1406. if (pattrib->encrypt)
  1407. SetPrivacy(fctrl);
  1408. if (qos_option) {
  1409. qc = (unsigned short *)(hdr + pattrib->hdrlen - 2);
  1410. if (pattrib->priority)
  1411. SetPriority(qc, pattrib->priority);
  1412. SetEOSP(qc, pattrib->eosp);
  1413. SetAckpolicy(qc, pattrib->ack_policy);
  1414. if(pattrib->amsdu)
  1415. SetAMsdu(qc, pattrib->amsdu);
  1416. }
  1417. /* TODO: fill HT Control Field */
  1418. /* Update Seq Num will be handled by f/w */
  1419. {
  1420. struct sta_info *psta;
  1421. psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
  1422. if (pattrib->psta != psta) {
  1423. RTW_INFO("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
  1424. return _FAIL;
  1425. }
  1426. if (psta == NULL) {
  1427. RTW_INFO("%s, psta==NUL\n", __func__);
  1428. return _FAIL;
  1429. }
  1430. if (!(psta->state & _FW_LINKED)) {
  1431. RTW_INFO("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
  1432. return _FAIL;
  1433. }
  1434. if (psta) {
  1435. psta->sta_xmitpriv.txseq_tid[pattrib->priority]++;
  1436. psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;
  1437. pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority];
  1438. SetSeqNum(hdr, pattrib->seqnum);
  1439. #ifdef CONFIG_80211N_HT
  1440. #if 0 /* move into update_attrib_phy_info(). */
  1441. /* check if enable ampdu */
  1442. if (pattrib->ht_en && psta->htpriv.ampdu_enable) {
  1443. if (psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority))
  1444. pattrib->ampdu_en = _TRUE;
  1445. }
  1446. #endif
  1447. /* re-check if enable ampdu by BA_starting_seqctrl */
  1448. if (pattrib->ampdu_en == _TRUE) {
  1449. u16 tx_seq;
  1450. tx_seq = psta->BA_starting_seqctrl[pattrib->priority & 0x0f];
  1451. /* check BA_starting_seqctrl */
  1452. if (SN_LESS(pattrib->seqnum, tx_seq)) {
  1453. /* RTW_INFO("tx ampdu seqnum(%d) < tx_seq(%d)\n", pattrib->seqnum, tx_seq); */
  1454. pattrib->ampdu_en = _FALSE;/* AGG BK */
  1455. } else if (SN_EQUAL(pattrib->seqnum, tx_seq)) {
  1456. psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq + 1) & 0xfff;
  1457. pattrib->ampdu_en = _TRUE;/* AGG EN */
  1458. } else {
  1459. /* RTW_INFO("tx ampdu over run\n"); */
  1460. psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (pattrib->seqnum + 1) & 0xfff;
  1461. pattrib->ampdu_en = _TRUE;/* AGG EN */
  1462. }
  1463. }
  1464. #endif /* CONFIG_80211N_HT */
  1465. }
  1466. }
  1467. } else {
  1468. }
  1469. exit:
  1470. return res;
  1471. }
  1472. s32 rtw_txframes_pending(_adapter *padapter)
  1473. {
  1474. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  1475. return ((_rtw_queue_empty(&pxmitpriv->be_pending) == _FALSE) ||
  1476. (_rtw_queue_empty(&pxmitpriv->bk_pending) == _FALSE) ||
  1477. (_rtw_queue_empty(&pxmitpriv->vi_pending) == _FALSE) ||
  1478. (_rtw_queue_empty(&pxmitpriv->vo_pending) == _FALSE));
  1479. }
  1480. s32 rtw_txframes_sta_ac_pending(_adapter *padapter, struct pkt_attrib *pattrib)
  1481. {
  1482. struct sta_info *psta;
  1483. struct tx_servq *ptxservq;
  1484. int priority = pattrib->priority;
  1485. /*
  1486. if(pattrib->psta)
  1487. {
  1488. psta = pattrib->psta;
  1489. }
  1490. else
  1491. {
  1492. RTW_INFO("%s, call rtw_get_stainfo()\n", __func__);
  1493. psta=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0]);
  1494. }
  1495. */
  1496. psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
  1497. if (pattrib->psta != psta) {
  1498. RTW_INFO("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
  1499. return 0;
  1500. }
  1501. if (psta == NULL) {
  1502. RTW_INFO("%s, psta==NUL\n", __func__);
  1503. return 0;
  1504. }
  1505. if (!(psta->state & _FW_LINKED)) {
  1506. RTW_INFO("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
  1507. return 0;
  1508. }
  1509. switch (priority) {
  1510. case 1:
  1511. case 2:
  1512. ptxservq = &(psta->sta_xmitpriv.bk_q);
  1513. break;
  1514. case 4:
  1515. case 5:
  1516. ptxservq = &(psta->sta_xmitpriv.vi_q);
  1517. break;
  1518. case 6:
  1519. case 7:
  1520. ptxservq = &(psta->sta_xmitpriv.vo_q);
  1521. break;
  1522. case 0:
  1523. case 3:
  1524. default:
  1525. ptxservq = &(psta->sta_xmitpriv.be_q);
  1526. break;
  1527. }
  1528. return ptxservq->qcnt;
  1529. }
  1530. #ifdef CONFIG_TDLS
  1531. int rtw_build_tdls_ies(_adapter *padapter, struct xmit_frame *pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt)
  1532. {
  1533. int res = _SUCCESS;
  1534. switch (ptxmgmt->action_code) {
  1535. case TDLS_SETUP_REQUEST:
  1536. rtw_build_tdls_setup_req_ies(padapter, pxmitframe, pframe, ptxmgmt);
  1537. break;
  1538. case TDLS_SETUP_RESPONSE:
  1539. rtw_build_tdls_setup_rsp_ies(padapter, pxmitframe, pframe, ptxmgmt);
  1540. break;
  1541. case TDLS_SETUP_CONFIRM:
  1542. rtw_build_tdls_setup_cfm_ies(padapter, pxmitframe, pframe, ptxmgmt);
  1543. break;
  1544. case TDLS_TEARDOWN:
  1545. rtw_build_tdls_teardown_ies(padapter, pxmitframe, pframe, ptxmgmt);
  1546. break;
  1547. case TDLS_DISCOVERY_REQUEST:
  1548. rtw_build_tdls_dis_req_ies(padapter, pxmitframe, pframe, ptxmgmt);
  1549. break;
  1550. case TDLS_PEER_TRAFFIC_INDICATION:
  1551. rtw_build_tdls_peer_traffic_indication_ies(padapter, pxmitframe, pframe, ptxmgmt);
  1552. break;
  1553. #ifdef CONFIG_TDLS_CH_SW
  1554. case TDLS_CHANNEL_SWITCH_REQUEST:
  1555. rtw_build_tdls_ch_switch_req_ies(padapter, pxmitframe, pframe, ptxmgmt);
  1556. break;
  1557. case TDLS_CHANNEL_SWITCH_RESPONSE:
  1558. rtw_build_tdls_ch_switch_rsp_ies(padapter, pxmitframe, pframe, ptxmgmt);
  1559. break;
  1560. #endif
  1561. case TDLS_PEER_TRAFFIC_RESPONSE:
  1562. rtw_build_tdls_peer_traffic_rsp_ies(padapter, pxmitframe, pframe, ptxmgmt);
  1563. break;
  1564. #ifdef CONFIG_WFD
  1565. case TUNNELED_PROBE_REQ:
  1566. rtw_build_tunneled_probe_req_ies(padapter, pxmitframe, pframe);
  1567. break;
  1568. case TUNNELED_PROBE_RSP:
  1569. rtw_build_tunneled_probe_rsp_ies(padapter, pxmitframe, pframe);
  1570. break;
  1571. #endif /* CONFIG_WFD */
  1572. default:
  1573. res = _FAIL;
  1574. break;
  1575. }
  1576. return res;
  1577. }
  1578. s32 rtw_make_tdls_wlanhdr(_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib, struct tdls_txmgmt *ptxmgmt)
  1579. {
  1580. u16 *qc;
  1581. struct rtw_ieee80211_hdr *pwlanhdr = (struct rtw_ieee80211_hdr *)hdr;
  1582. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  1583. struct qos_priv *pqospriv = &pmlmepriv->qospriv;
  1584. struct sta_priv *pstapriv = &padapter->stapriv;
  1585. struct sta_info *psta = NULL, *ptdls_sta = NULL;
  1586. u8 tdls_seq = 0, baddr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
  1587. sint res = _SUCCESS;
  1588. u16 *fctrl = &pwlanhdr->frame_ctl;
  1589. _rtw_memset(hdr, 0, WLANHDR_OFFSET);
  1590. set_frame_sub_type(fctrl, pattrib->subtype);
  1591. switch (ptxmgmt->action_code) {
  1592. case TDLS_SETUP_REQUEST:
  1593. case TDLS_SETUP_RESPONSE:
  1594. case TDLS_SETUP_CONFIRM:
  1595. case TDLS_PEER_TRAFFIC_INDICATION:
  1596. case TDLS_PEER_PSM_REQUEST:
  1597. case TUNNELED_PROBE_REQ:
  1598. case TUNNELED_PROBE_RSP:
  1599. case TDLS_DISCOVERY_REQUEST:
  1600. SetToDs(fctrl);
  1601. _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
  1602. _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
  1603. _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
  1604. break;
  1605. case TDLS_CHANNEL_SWITCH_REQUEST:
  1606. case TDLS_CHANNEL_SWITCH_RESPONSE:
  1607. case TDLS_PEER_PSM_RESPONSE:
  1608. case TDLS_PEER_TRAFFIC_RESPONSE:
  1609. _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
  1610. _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
  1611. _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
  1612. tdls_seq = 1;
  1613. break;
  1614. case TDLS_TEARDOWN:
  1615. if (ptxmgmt->status_code == _RSON_TDLS_TEAR_UN_RSN_) {
  1616. _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
  1617. _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
  1618. _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
  1619. tdls_seq = 1;
  1620. } else {
  1621. SetToDs(fctrl);
  1622. _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
  1623. _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
  1624. _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
  1625. }
  1626. break;
  1627. }
  1628. if (pattrib->encrypt)
  1629. SetPrivacy(fctrl);
  1630. if (ptxmgmt->action_code == TDLS_PEER_TRAFFIC_RESPONSE)
  1631. SetPwrMgt(fctrl);
  1632. if (pqospriv->qos_option) {
  1633. qc = (unsigned short *)(hdr + pattrib->hdrlen - 2);
  1634. if (pattrib->priority)
  1635. SetPriority(qc, pattrib->priority);
  1636. SetAckpolicy(qc, pattrib->ack_policy);
  1637. }
  1638. psta = pattrib->psta;
  1639. /* 1. update seq_num per link by sta_info */
  1640. /* 2. rewrite encrypt to _AES_, also rewrite iv_len, icv_len */
  1641. if (tdls_seq == 1) {
  1642. ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst);
  1643. if (ptdls_sta) {
  1644. ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]++;
  1645. ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;
  1646. pattrib->seqnum = ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority];
  1647. SetSeqNum(hdr, pattrib->seqnum);
  1648. if (pattrib->encrypt) {
  1649. pattrib->encrypt = _AES_;
  1650. pattrib->iv_len = 8;
  1651. pattrib->icv_len = 8;
  1652. pattrib->bswenc = _FALSE;
  1653. }
  1654. pattrib->mac_id = ptdls_sta->mac_id;
  1655. } else {
  1656. res = _FAIL;
  1657. goto exit;
  1658. }
  1659. } else if (psta) {
  1660. psta->sta_xmitpriv.txseq_tid[pattrib->priority]++;
  1661. psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;
  1662. pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority];
  1663. SetSeqNum(hdr, pattrib->seqnum);
  1664. }
  1665. exit:
  1666. return res;
  1667. }
  1668. s32 rtw_xmit_tdls_coalesce(_adapter *padapter, struct xmit_frame *pxmitframe, struct tdls_txmgmt *ptxmgmt)
  1669. {
  1670. s32 llc_sz;
  1671. u8 *pframe, *mem_start;
  1672. struct sta_info *psta;
  1673. struct sta_priv *pstapriv = &padapter->stapriv;
  1674. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  1675. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  1676. u8 *pbuf_start;
  1677. s32 bmcst = IS_MCAST(pattrib->ra);
  1678. s32 res = _SUCCESS;
  1679. if (pattrib->psta)
  1680. psta = pattrib->psta;
  1681. else {
  1682. if (bmcst)
  1683. psta = rtw_get_bcmc_stainfo(padapter);
  1684. else
  1685. psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
  1686. }
  1687. if (psta == NULL) {
  1688. res = _FAIL;
  1689. goto exit;
  1690. }
  1691. if (pxmitframe->buf_addr == NULL) {
  1692. res = _FAIL;
  1693. goto exit;
  1694. }
  1695. pbuf_start = pxmitframe->buf_addr;
  1696. mem_start = pbuf_start + TXDESC_OFFSET;
  1697. if (rtw_make_tdls_wlanhdr(padapter, mem_start, pattrib, ptxmgmt) == _FAIL) {
  1698. res = _FAIL;
  1699. goto exit;
  1700. }
  1701. pframe = mem_start;
  1702. pframe += pattrib->hdrlen;
  1703. /* adding icv, if necessary... */
  1704. if (pattrib->iv_len) {
  1705. if (psta != NULL) {
  1706. switch (pattrib->encrypt) {
  1707. case _WEP40_:
  1708. case _WEP104_:
  1709. WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
  1710. break;
  1711. case _TKIP_:
  1712. if (bmcst)
  1713. TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
  1714. else
  1715. TKIP_IV(pattrib->iv, psta->dot11txpn, 0);
  1716. break;
  1717. case _AES_:
  1718. if (bmcst)
  1719. AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
  1720. else
  1721. AES_IV(pattrib->iv, psta->dot11txpn, 0);
  1722. break;
  1723. }
  1724. }
  1725. _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len);
  1726. pframe += pattrib->iv_len;
  1727. }
  1728. llc_sz = rtw_put_snap(pframe, pattrib->ether_type);
  1729. pframe += llc_sz;
  1730. /* pattrib->pktlen will be counted in rtw_build_tdls_ies */
  1731. pattrib->pktlen = 0;
  1732. rtw_build_tdls_ies(padapter, pxmitframe, pframe, ptxmgmt);
  1733. if ((pattrib->icv_len > 0) && (pattrib->bswenc)) {
  1734. pframe += pattrib->pktlen;
  1735. _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len);
  1736. pframe += pattrib->icv_len;
  1737. }
  1738. pattrib->nr_frags = 1;
  1739. pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + llc_sz +
  1740. ((pattrib->bswenc) ? pattrib->icv_len : 0) + pattrib->pktlen;
  1741. if (xmitframe_addmic(padapter, pxmitframe) == _FAIL) {
  1742. res = _FAIL;
  1743. goto exit;
  1744. }
  1745. xmitframe_swencrypt(padapter, pxmitframe);
  1746. update_attrib_vcs_info(padapter, pxmitframe);
  1747. exit:
  1748. return res;
  1749. }
  1750. #endif /* CONFIG_TDLS */
  1751. /*
  1752. * Calculate wlan 802.11 packet MAX size from pkt_attrib
  1753. * This function doesn't consider fragment case
  1754. */
  1755. u32 rtw_calculate_wlan_pkt_size_by_attribue(struct pkt_attrib *pattrib)
  1756. {
  1757. u32 len = 0;
  1758. len = pattrib->hdrlen + pattrib->iv_len; /* WLAN Header and IV */
  1759. len += SNAP_SIZE + sizeof(u16); /* LLC */
  1760. len += pattrib->pktlen;
  1761. if (pattrib->encrypt == _TKIP_)
  1762. len += 8; /* MIC */
  1763. len += ((pattrib->bswenc) ? pattrib->icv_len : 0); /* ICV */
  1764. return len;
  1765. }
  1766. #ifdef CONFIG_TX_AMSDU
  1767. s32 check_amsdu(struct xmit_frame *pxmitframe)
  1768. {
  1769. struct pkt_attrib *pattrib;
  1770. s32 ret = _TRUE;
  1771. if (!pxmitframe)
  1772. ret = _FALSE;
  1773. pattrib = &pxmitframe->attrib;
  1774. if (IS_MCAST(pattrib->ra))
  1775. ret = _FALSE;
  1776. if ((pattrib->ether_type == 0x888e) ||
  1777. (pattrib->ether_type == 0x0806) ||
  1778. (pattrib->ether_type == 0x88b4) ||
  1779. (pattrib->dhcp_pkt == 1))
  1780. ret = _FALSE;
  1781. if ((pattrib->encrypt == _WEP40_) ||
  1782. (pattrib->encrypt == _WEP104_) ||
  1783. (pattrib->encrypt == _TKIP_))
  1784. ret = _FALSE;
  1785. if (!pattrib->qos_en)
  1786. ret = _FALSE;
  1787. return ret;
  1788. }
  1789. s32 check_amsdu_tx_support(_adapter *padapter)
  1790. {
  1791. struct dvobj_priv *pdvobjpriv;
  1792. int tx_amsdu;
  1793. int tx_amsdu_rate;
  1794. int current_tx_rate;
  1795. s32 ret = _FALSE;
  1796. pdvobjpriv = adapter_to_dvobj(padapter);
  1797. tx_amsdu = padapter->tx_amsdu;
  1798. tx_amsdu_rate = padapter->tx_amsdu_rate;
  1799. current_tx_rate = pdvobjpriv->traffic_stat.cur_tx_tp;
  1800. if (tx_amsdu == 1)
  1801. ret = _TRUE;
  1802. else if (tx_amsdu == 2 && (tx_amsdu_rate == 0 || current_tx_rate > tx_amsdu_rate))
  1803. ret = _TRUE;
  1804. else
  1805. ret = _FALSE;
  1806. return ret;
  1807. }
  1808. s32 rtw_xmitframe_coalesce_amsdu(_adapter *padapter, struct xmit_frame *pxmitframe, struct xmit_frame *pxmitframe_queue)
  1809. {
  1810. struct pkt_file pktfile;
  1811. struct pkt_attrib *pattrib;
  1812. _pkt *pkt;
  1813. struct pkt_file pktfile_queue;
  1814. struct pkt_attrib *pattrib_queue;
  1815. _pkt *pkt_queue;
  1816. s32 llc_sz, mem_sz;
  1817. s32 padding = 0;
  1818. u8 *pframe, *mem_start;
  1819. u8 hw_hdr_offset;
  1820. u16* len;
  1821. u8 *pbuf_start;
  1822. s32 res = _SUCCESS;
  1823. if (pxmitframe->buf_addr == NULL) {
  1824. RTW_INFO("==> %s buf_addr==NULL\n", __FUNCTION__);
  1825. return _FAIL;
  1826. }
  1827. pbuf_start = pxmitframe->buf_addr;
  1828. #ifdef CONFIG_USB_TX_AGGREGATION
  1829. hw_hdr_offset = TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ);
  1830. #else
  1831. #ifdef CONFIG_TX_EARLY_MODE /* for SDIO && Tx Agg */
  1832. hw_hdr_offset = TXDESC_OFFSET + EARLY_MODE_INFO_SIZE;
  1833. #else
  1834. hw_hdr_offset = TXDESC_OFFSET;
  1835. #endif
  1836. #endif
  1837. mem_start = pbuf_start + hw_hdr_offset; //for DMA
  1838. pattrib = &pxmitframe->attrib;
  1839. pattrib->amsdu = 1;
  1840. if (rtw_make_wlanhdr(padapter, mem_start, pattrib) == _FAIL) {
  1841. RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("rtw_xmitframe_coalesce: rtw_make_wlanhdr fail; drop pkt\n"));
  1842. RTW_INFO("rtw_xmitframe_coalesce: rtw_make_wlanhdr fail; drop pkt\n");
  1843. res = _FAIL;
  1844. goto exit;
  1845. }
  1846. llc_sz = 0;
  1847. pframe = mem_start;
  1848. //SetMFrag(mem_start);
  1849. ClearMFrag(mem_start);
  1850. pframe += pattrib->hdrlen;
  1851. /* adding icv, if necessary... */
  1852. if (pattrib->iv_len) {
  1853. _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len); // queue or new?
  1854. RT_TRACE(_module_rtl871x_xmit_c_, _drv_notice_,
  1855. ("rtw_xmitframe_coalesce: keyid=%d pattrib->iv[3]=%.2x pframe=%.2x %.2x %.2x %.2x\n",
  1856. padapter->securitypriv.dot11PrivacyKeyIndex, pattrib->iv[3], *pframe, *(pframe + 1), *(pframe + 2), *(pframe + 3)));
  1857. pframe += pattrib->iv_len;
  1858. }
  1859. pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len;
  1860. if(pxmitframe_queue)
  1861. {
  1862. pattrib_queue = &pxmitframe_queue->attrib;
  1863. pkt_queue = pxmitframe_queue->pkt;
  1864. _rtw_open_pktfile(pkt_queue, &pktfile_queue);
  1865. _rtw_pktfile_read(&pktfile_queue, NULL, pattrib_queue->pkt_hdrlen);
  1866. /* 802.3 MAC Header DA(6) SA(6) Len(2)*/
  1867. _rtw_memcpy(pframe, pattrib_queue->dst, ETH_ALEN);
  1868. pframe += ETH_ALEN;
  1869. _rtw_memcpy(pframe, pattrib_queue->src, ETH_ALEN);
  1870. pframe += ETH_ALEN;
  1871. len = (u16*) pframe;
  1872. pframe += 2;
  1873. llc_sz = rtw_put_snap(pframe, pattrib_queue->ether_type);
  1874. pframe += llc_sz;
  1875. mem_sz = _rtw_pktfile_read(&pktfile_queue, pframe, pattrib_queue->pktlen);
  1876. pframe += mem_sz;
  1877. *len = htons(llc_sz + mem_sz);
  1878. //calc padding
  1879. padding = 4 - ((ETH_HLEN + llc_sz + mem_sz) & (4-1));
  1880. if(padding == 4)
  1881. padding = 0;
  1882. //_rtw_memset(pframe,0xaa, padding);
  1883. pframe += padding;
  1884. pattrib->last_txcmdsz += ETH_HLEN + llc_sz + mem_sz + padding ;
  1885. }
  1886. //2nd mpdu
  1887. pkt = pxmitframe->pkt;
  1888. _rtw_open_pktfile(pkt, &pktfile);
  1889. _rtw_pktfile_read(&pktfile, NULL, pattrib->pkt_hdrlen);
  1890. /* 802.3 MAC Header DA(6) SA(6) Len(2) */
  1891. _rtw_memcpy(pframe, pattrib->dst, ETH_ALEN);
  1892. pframe += ETH_ALEN;
  1893. _rtw_memcpy(pframe, pattrib->src, ETH_ALEN);
  1894. pframe += ETH_ALEN;
  1895. len = (u16*) pframe;
  1896. pframe += 2;
  1897. llc_sz = rtw_put_snap(pframe, pattrib->ether_type);
  1898. pframe += llc_sz;
  1899. mem_sz = _rtw_pktfile_read(&pktfile, pframe, pattrib->pktlen);
  1900. pframe += mem_sz;
  1901. *len = htons(llc_sz + mem_sz);
  1902. //the last ampdu has no padding
  1903. padding = 0;
  1904. pattrib->nr_frags = 1;
  1905. pattrib->last_txcmdsz += ETH_HLEN + llc_sz + mem_sz + padding +
  1906. ((pattrib->bswenc) ? pattrib->icv_len : 0) ;
  1907. if ((pattrib->icv_len > 0) && (pattrib->bswenc)) {
  1908. _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len);
  1909. pframe += pattrib->icv_len;
  1910. }
  1911. if (xmitframe_addmic(padapter, pxmitframe) == _FAIL) {
  1912. RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("xmitframe_addmic(padapter, pxmitframe)==_FAIL\n"));
  1913. RTW_INFO("xmitframe_addmic(padapter, pxmitframe)==_FAIL\n");
  1914. res = _FAIL;
  1915. goto exit;
  1916. }
  1917. xmitframe_swencrypt(padapter, pxmitframe);
  1918. pattrib->vcs_mode = NONE_VCS;
  1919. exit:
  1920. return res;
  1921. }
  1922. #endif /* CONFIG_TX_AMSDU */
  1923. /*
  1924. This sub-routine will perform all the following:
  1925. 1. remove 802.3 header.
  1926. 2. create wlan_header, based on the info in pxmitframe
  1927. 3. append sta's iv/ext-iv
  1928. 4. append LLC
  1929. 5. move frag chunk from pframe to pxmitframe->mem
  1930. 6. apply sw-encrypt, if necessary.
  1931. */
  1932. s32 rtw_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe)
  1933. {
  1934. struct pkt_file pktfile;
  1935. s32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz;
  1936. SIZE_PTR addr;
  1937. u8 *pframe, *mem_start;
  1938. u8 hw_hdr_offset;
  1939. /* struct sta_info *psta; */
  1940. /* struct sta_priv *pstapriv = &padapter->stapriv; */
  1941. /* struct mlme_priv *pmlmepriv = &padapter->mlmepriv; */
  1942. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  1943. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  1944. u8 *pbuf_start;
  1945. s32 bmcst = IS_MCAST(pattrib->ra);
  1946. s32 res = _SUCCESS;
  1947. /*
  1948. if (pattrib->psta)
  1949. {
  1950. psta = pattrib->psta;
  1951. } else
  1952. {
  1953. RTW_INFO("%s, call rtw_get_stainfo()\n", __func__);
  1954. psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
  1955. }
  1956. if(psta==NULL)
  1957. {
  1958. RTW_INFO("%s, psta==NUL\n", __func__);
  1959. return _FAIL;
  1960. }
  1961. if(!(psta->state &_FW_LINKED))
  1962. {
  1963. RTW_INFO("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
  1964. return _FAIL;
  1965. }
  1966. */
  1967. if (pxmitframe->buf_addr == NULL) {
  1968. RTW_INFO("==> %s buf_addr==NULL\n", __FUNCTION__);
  1969. return _FAIL;
  1970. }
  1971. pbuf_start = pxmitframe->buf_addr;
  1972. #ifdef CONFIG_USB_TX_AGGREGATION
  1973. hw_hdr_offset = TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ);
  1974. #else
  1975. #ifdef CONFIG_TX_EARLY_MODE /* for SDIO && Tx Agg */
  1976. hw_hdr_offset = TXDESC_OFFSET + EARLY_MODE_INFO_SIZE;
  1977. #else
  1978. hw_hdr_offset = TXDESC_OFFSET;
  1979. #endif
  1980. #endif
  1981. mem_start = pbuf_start + hw_hdr_offset;
  1982. if (rtw_make_wlanhdr(padapter, mem_start, pattrib) == _FAIL) {
  1983. RTW_INFO("rtw_xmitframe_coalesce: rtw_make_wlanhdr fail; drop pkt\n");
  1984. res = _FAIL;
  1985. goto exit;
  1986. }
  1987. _rtw_open_pktfile(pkt, &pktfile);
  1988. _rtw_pktfile_read(&pktfile, NULL, pattrib->pkt_hdrlen);
  1989. frg_inx = 0;
  1990. frg_len = pxmitpriv->frag_len - 4;/* 2346-4 = 2342 */
  1991. while (1) {
  1992. llc_sz = 0;
  1993. mpdu_len = frg_len;
  1994. pframe = mem_start;
  1995. SetMFrag(mem_start);
  1996. pframe += pattrib->hdrlen;
  1997. mpdu_len -= pattrib->hdrlen;
  1998. /* adding icv, if necessary... */
  1999. if (pattrib->iv_len) {
  2000. #if 0
  2001. /* if (check_fwstate(pmlmepriv, WIFI_MP_STATE)) */
  2002. /* psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv)); */
  2003. /* else */
  2004. /* psta = rtw_get_stainfo(pstapriv, pattrib->ra); */
  2005. if (psta != NULL) {
  2006. switch (pattrib->encrypt) {
  2007. case _WEP40_:
  2008. case _WEP104_:
  2009. WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
  2010. break;
  2011. case _TKIP_:
  2012. if (bmcst)
  2013. TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
  2014. else
  2015. TKIP_IV(pattrib->iv, psta->dot11txpn, 0);
  2016. break;
  2017. case _AES_:
  2018. if (bmcst)
  2019. AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
  2020. else
  2021. AES_IV(pattrib->iv, psta->dot11txpn, 0);
  2022. break;
  2023. #ifdef CONFIG_WAPI_SUPPORT
  2024. case _SMS4_:
  2025. rtw_wapi_get_iv(padapter, pattrib->ra, pattrib->iv);
  2026. break;
  2027. #endif
  2028. }
  2029. }
  2030. #endif
  2031. _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len);
  2032. pframe += pattrib->iv_len;
  2033. mpdu_len -= pattrib->iv_len;
  2034. }
  2035. if (frg_inx == 0) {
  2036. llc_sz = rtw_put_snap(pframe, pattrib->ether_type);
  2037. pframe += llc_sz;
  2038. mpdu_len -= llc_sz;
  2039. }
  2040. if ((pattrib->icv_len > 0) && (pattrib->bswenc))
  2041. mpdu_len -= pattrib->icv_len;
  2042. if (bmcst) {
  2043. /* don't do fragment to broadcat/multicast packets */
  2044. mem_sz = _rtw_pktfile_read(&pktfile, pframe, pattrib->pktlen);
  2045. } else
  2046. mem_sz = _rtw_pktfile_read(&pktfile, pframe, mpdu_len);
  2047. pframe += mem_sz;
  2048. if ((pattrib->icv_len > 0) && (pattrib->bswenc)) {
  2049. _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len);
  2050. pframe += pattrib->icv_len;
  2051. }
  2052. frg_inx++;
  2053. if (bmcst || (rtw_endofpktfile(&pktfile) == _TRUE)) {
  2054. pattrib->nr_frags = frg_inx;
  2055. pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + ((pattrib->nr_frags == 1) ? llc_sz : 0) +
  2056. ((pattrib->bswenc) ? pattrib->icv_len : 0) + mem_sz;
  2057. ClearMFrag(mem_start);
  2058. break;
  2059. }
  2060. addr = (SIZE_PTR)(pframe);
  2061. mem_start = (unsigned char *)RND4(addr) + hw_hdr_offset;
  2062. _rtw_memcpy(mem_start, pbuf_start + hw_hdr_offset, pattrib->hdrlen);
  2063. }
  2064. if (xmitframe_addmic(padapter, pxmitframe) == _FAIL) {
  2065. RTW_INFO("xmitframe_addmic(padapter, pxmitframe)==_FAIL\n");
  2066. res = _FAIL;
  2067. goto exit;
  2068. }
  2069. xmitframe_swencrypt(padapter, pxmitframe);
  2070. if (bmcst == _FALSE)
  2071. update_attrib_vcs_info(padapter, pxmitframe);
  2072. else
  2073. pattrib->vcs_mode = NONE_VCS;
  2074. exit:
  2075. return res;
  2076. }
  2077. #ifdef CONFIG_IEEE80211W
  2078. /* broadcast or multicast management pkt use BIP, unicast management pkt use CCMP encryption */
  2079. s32 rtw_mgmt_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe)
  2080. {
  2081. struct pkt_file pktfile;
  2082. s32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz;
  2083. SIZE_PTR addr;
  2084. u8 *pframe, *mem_start = NULL, *tmp_buf = NULL;
  2085. u8 hw_hdr_offset, subtype ;
  2086. struct sta_info *psta = NULL;
  2087. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  2088. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  2089. u8 *pbuf_start;
  2090. s32 bmcst = IS_MCAST(pattrib->ra);
  2091. s32 res = _FAIL;
  2092. u8 *BIP_AAD = NULL;
  2093. u8 *MGMT_body = NULL;
  2094. struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
  2095. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  2096. struct rtw_ieee80211_hdr *pwlanhdr;
  2097. u8 MME[_MME_IE_LENGTH_];
  2098. _irqL irqL;
  2099. u32 ori_len;
  2100. mem_start = pframe = (u8 *)(pxmitframe->buf_addr) + TXDESC_OFFSET;
  2101. pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  2102. ori_len = BIP_AAD_SIZE + pattrib->pktlen;
  2103. tmp_buf = BIP_AAD = rtw_zmalloc(ori_len);
  2104. subtype = get_frame_sub_type(pframe); /* bit(7)~bit(2) */
  2105. if (BIP_AAD == NULL)
  2106. return _FAIL;
  2107. _enter_critical_bh(&padapter->security_key_mutex, &irqL);
  2108. /* IGTK key is not install, it may not support 802.11w */
  2109. if (padapter->securitypriv.binstallBIPkey != _TRUE) {
  2110. RTW_INFO("no instll BIP key\n");
  2111. goto xmitframe_coalesce_success;
  2112. }
  2113. /* station mode doesn't need TX BIP, just ready the code */
  2114. if (bmcst) {
  2115. int frame_body_len;
  2116. u8 mic[16];
  2117. _rtw_memset(MME, 0, _MME_IE_LENGTH_);
  2118. /* other types doesn't need the BIP */
  2119. if (get_frame_sub_type(pframe) != WIFI_DEAUTH && get_frame_sub_type(pframe) != WIFI_DISASSOC)
  2120. goto xmitframe_coalesce_fail;
  2121. MGMT_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);
  2122. pframe += pattrib->pktlen;
  2123. /* octent 0 and 1 is key index ,BIP keyid is 4 or 5, LSB only need octent 0 */
  2124. MME[0] = padapter->securitypriv.dot11wBIPKeyid;
  2125. /* copy packet number */
  2126. _rtw_memcpy(&MME[2], &pmlmeext->mgnt_80211w_IPN, 6);
  2127. /* increase the packet number */
  2128. pmlmeext->mgnt_80211w_IPN++;
  2129. /* add MME IE with MIC all zero, MME string doesn't include element id and length */
  2130. pframe = rtw_set_ie(pframe, _MME_IE_ , 16 , MME, &(pattrib->pktlen));
  2131. pattrib->last_txcmdsz = pattrib->pktlen;
  2132. /* total frame length - header length */
  2133. frame_body_len = pattrib->pktlen - sizeof(struct rtw_ieee80211_hdr_3addr);
  2134. /* conscruct AAD, copy frame control field */
  2135. _rtw_memcpy(BIP_AAD, &pwlanhdr->frame_ctl, 2);
  2136. ClearRetry(BIP_AAD);
  2137. ClearPwrMgt(BIP_AAD);
  2138. ClearMData(BIP_AAD);
  2139. /* conscruct AAD, copy address 1 to address 3 */
  2140. _rtw_memcpy(BIP_AAD + 2, pwlanhdr->addr1, 18);
  2141. /* copy management fram body */
  2142. _rtw_memcpy(BIP_AAD + BIP_AAD_SIZE, MGMT_body, frame_body_len);
  2143. #if 0
  2144. /* dump total packet include MME with zero MIC */
  2145. {
  2146. int i;
  2147. printk("Total packet: ");
  2148. for (i = 0; i < BIP_AAD_SIZE + frame_body_len; i++)
  2149. printk(" %02x ", BIP_AAD[i]);
  2150. printk("\n");
  2151. }
  2152. #endif
  2153. /* calculate mic */
  2154. if (omac1_aes_128(padapter->securitypriv.dot11wBIPKey[padapter->securitypriv.dot11wBIPKeyid].skey
  2155. , BIP_AAD, BIP_AAD_SIZE + frame_body_len, mic))
  2156. goto xmitframe_coalesce_fail;
  2157. #if 0
  2158. /* dump calculated mic result */
  2159. {
  2160. int i;
  2161. printk("Calculated mic result: ");
  2162. for (i = 0; i < 16; i++)
  2163. printk(" %02x ", mic[i]);
  2164. printk("\n");
  2165. }
  2166. #endif
  2167. /* copy right BIP mic value, total is 128bits, we use the 0~63 bits */
  2168. _rtw_memcpy(pframe - 8, mic, 8);
  2169. /*/dump all packet after mic ok
  2170. {
  2171. int pp;
  2172. printk("pattrib->pktlen = %d\n", pattrib->pktlen);
  2173. for(pp=0;pp< pattrib->pktlen; pp++)
  2174. printk(" %02x ", mem_start[pp]);
  2175. printk("\n");
  2176. }*/
  2177. } else { /* unicast mgmt frame TX */
  2178. /* start to encrypt mgmt frame */
  2179. if (subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC ||
  2180. subtype == WIFI_REASSOCREQ || subtype == WIFI_ACTION) {
  2181. if (pattrib->psta)
  2182. psta = pattrib->psta;
  2183. else
  2184. psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
  2185. if (psta == NULL) {
  2186. RTW_INFO("%s, psta==NUL\n", __func__);
  2187. goto xmitframe_coalesce_fail;
  2188. }
  2189. if (pxmitframe->buf_addr == NULL) {
  2190. RTW_INFO("%s, pxmitframe->buf_addr\n", __func__);
  2191. goto xmitframe_coalesce_fail;
  2192. }
  2193. /* RTW_INFO("%s, action frame category=%d\n", __func__, pframe[WLAN_HDR_A3_LEN]); */
  2194. /* according 802.11-2012 standard, these five types are not robust types */
  2195. if (subtype == WIFI_ACTION &&
  2196. (pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_PUBLIC ||
  2197. pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_HT ||
  2198. pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_UNPROTECTED_WNM ||
  2199. pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_SELF_PROTECTED ||
  2200. pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_P2P))
  2201. goto xmitframe_coalesce_fail;
  2202. /* before encrypt dump the management packet content */
  2203. /*{
  2204. int i;
  2205. printk("Management pkt: ");
  2206. for(i=0; i<pattrib->pktlen; i++)
  2207. printk(" %02x ", pframe[i]);
  2208. printk("=======\n");
  2209. }*/
  2210. if (pattrib->encrypt > 0)
  2211. _rtw_memcpy(pattrib->dot118021x_UncstKey.skey, psta->dot118021x_UncstKey.skey, 16);
  2212. /* To use wrong key */
  2213. if (pattrib->key_type == IEEE80211W_WRONG_KEY) {
  2214. RTW_INFO("use wrong key\n");
  2215. pattrib->dot118021x_UncstKey.skey[0] = 0xff;
  2216. }
  2217. /* bakeup original management packet */
  2218. _rtw_memcpy(tmp_buf, pframe, pattrib->pktlen);
  2219. /* move to data portion */
  2220. pframe += pattrib->hdrlen;
  2221. /* 802.11w unicast management packet must be _AES_ */
  2222. pattrib->iv_len = 8;
  2223. /* it's MIC of AES */
  2224. pattrib->icv_len = 8;
  2225. switch (pattrib->encrypt) {
  2226. case _AES_:
  2227. /* set AES IV header */
  2228. AES_IV(pattrib->iv, psta->dot11wtxpn, 0);
  2229. break;
  2230. default:
  2231. goto xmitframe_coalesce_fail;
  2232. }
  2233. /* insert iv header into management frame */
  2234. _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len);
  2235. pframe += pattrib->iv_len;
  2236. /* copy mgmt data portion after CCMP header */
  2237. _rtw_memcpy(pframe, tmp_buf + pattrib->hdrlen, pattrib->pktlen - pattrib->hdrlen);
  2238. /* move pframe to end of mgmt pkt */
  2239. pframe += pattrib->pktlen - pattrib->hdrlen;
  2240. /* add 8 bytes CCMP IV header to length */
  2241. pattrib->pktlen += pattrib->iv_len;
  2242. #if 0
  2243. /* dump management packet include AES IV header */
  2244. {
  2245. int i;
  2246. printk("Management pkt + IV: ");
  2247. /* for(i=0; i<pattrib->pktlen; i++) */
  2248. printk("@@@@@@@@@@@@@\n");
  2249. }
  2250. #endif
  2251. if ((pattrib->icv_len > 0) && (pattrib->bswenc)) {
  2252. _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len);
  2253. pframe += pattrib->icv_len;
  2254. }
  2255. /* add 8 bytes MIC */
  2256. pattrib->pktlen += pattrib->icv_len;
  2257. /* set final tx command size */
  2258. pattrib->last_txcmdsz = pattrib->pktlen;
  2259. /* set protected bit must be beofre SW encrypt */
  2260. SetPrivacy(mem_start);
  2261. #if 0
  2262. /* dump management packet include AES header */
  2263. {
  2264. int i;
  2265. printk("prepare to enc Management pkt + IV: ");
  2266. for (i = 0; i < pattrib->pktlen; i++)
  2267. printk(" %02x ", mem_start[i]);
  2268. printk("@@@@@@@@@@@@@\n");
  2269. }
  2270. #endif
  2271. /* software encrypt */
  2272. xmitframe_swencrypt(padapter, pxmitframe);
  2273. }
  2274. }
  2275. xmitframe_coalesce_success:
  2276. _exit_critical_bh(&padapter->security_key_mutex, &irqL);
  2277. rtw_mfree(BIP_AAD, ori_len);
  2278. return _SUCCESS;
  2279. xmitframe_coalesce_fail:
  2280. _exit_critical_bh(&padapter->security_key_mutex, &irqL);
  2281. rtw_mfree(BIP_AAD, ori_len);
  2282. return _FAIL;
  2283. }
  2284. #endif /* CONFIG_IEEE80211W */
  2285. /* Logical Link Control(LLC) SubNetwork Attachment Point(SNAP) header
  2286. * IEEE LLC/SNAP header contains 8 octets
  2287. * First 3 octets comprise the LLC portion
  2288. * SNAP portion, 5 octets, is divided into two fields:
  2289. * Organizationally Unique Identifier(OUI), 3 octets,
  2290. * type, defined by that organization, 2 octets.
  2291. */
  2292. s32 rtw_put_snap(u8 *data, u16 h_proto)
  2293. {
  2294. struct ieee80211_snap_hdr *snap;
  2295. u8 *oui;
  2296. snap = (struct ieee80211_snap_hdr *)data;
  2297. snap->dsap = 0xaa;
  2298. snap->ssap = 0xaa;
  2299. snap->ctrl = 0x03;
  2300. if (h_proto == 0x8137 || h_proto == 0x80f3)
  2301. oui = P802_1H_OUI;
  2302. else
  2303. oui = RFC1042_OUI;
  2304. snap->oui[0] = oui[0];
  2305. snap->oui[1] = oui[1];
  2306. snap->oui[2] = oui[2];
  2307. *(u16 *)(data + SNAP_SIZE) = htons(h_proto);
  2308. return SNAP_SIZE + sizeof(u16);
  2309. }
  2310. void rtw_update_protection(_adapter *padapter, u8 *ie, uint ie_len)
  2311. {
  2312. uint protection;
  2313. u8 *perp;
  2314. sint erp_len;
  2315. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  2316. struct registry_priv *pregistrypriv = &padapter->registrypriv;
  2317. switch (pxmitpriv->vcs_setting) {
  2318. case DISABLE_VCS:
  2319. pxmitpriv->vcs = NONE_VCS;
  2320. break;
  2321. case ENABLE_VCS:
  2322. break;
  2323. case AUTO_VCS:
  2324. default:
  2325. perp = rtw_get_ie(ie, _ERPINFO_IE_, &erp_len, ie_len);
  2326. if (perp == NULL)
  2327. pxmitpriv->vcs = NONE_VCS;
  2328. else {
  2329. protection = (*(perp + 2)) & BIT(1);
  2330. if (protection) {
  2331. if (pregistrypriv->vcs_type == RTS_CTS)
  2332. pxmitpriv->vcs = RTS_CTS;
  2333. else
  2334. pxmitpriv->vcs = CTS_TO_SELF;
  2335. } else
  2336. pxmitpriv->vcs = NONE_VCS;
  2337. }
  2338. break;
  2339. }
  2340. }
  2341. void rtw_count_tx_stats(PADAPTER padapter, struct xmit_frame *pxmitframe, int sz)
  2342. {
  2343. struct sta_info *psta = NULL;
  2344. struct stainfo_stats *pstats = NULL;
  2345. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  2346. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  2347. u8 pkt_num = 1;
  2348. if ((pxmitframe->frame_tag & 0x0f) == DATA_FRAMETAG) {
  2349. #if defined(CONFIG_USB_TX_AGGREGATION) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
  2350. pkt_num = pxmitframe->agg_num;
  2351. #endif
  2352. pmlmepriv->LinkDetectInfo.NumTxOkInPeriod += pkt_num;
  2353. pxmitpriv->tx_pkts += pkt_num;
  2354. pxmitpriv->tx_bytes += sz;
  2355. psta = pxmitframe->attrib.psta;
  2356. if (psta) {
  2357. pstats = &psta->sta_stats;
  2358. pstats->tx_pkts += pkt_num;
  2359. pstats->tx_bytes += sz;
  2360. #ifdef CONFIG_TDLS
  2361. if (pxmitframe->attrib.ptdls_sta != NULL) {
  2362. pstats = &(pxmitframe->attrib.ptdls_sta->sta_stats);
  2363. pstats->tx_pkts += pkt_num;
  2364. pstats->tx_bytes += sz;
  2365. }
  2366. #endif /* CONFIG_TDLS */
  2367. }
  2368. #ifdef CONFIG_CHECK_LEAVE_LPS
  2369. /* traffic_check_for_leave_lps(padapter, _TRUE); */
  2370. #endif /* CONFIG_LPS */
  2371. }
  2372. }
  2373. static struct xmit_buf *__rtw_alloc_cmd_xmitbuf(struct xmit_priv *pxmitpriv,
  2374. enum cmdbuf_type buf_type)
  2375. {
  2376. struct xmit_buf *pxmitbuf = NULL;
  2377. pxmitbuf = &pxmitpriv->pcmd_xmitbuf[buf_type];
  2378. if (pxmitbuf != NULL) {
  2379. pxmitbuf->priv_data = NULL;
  2380. #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
  2381. pxmitbuf->len = 0;
  2382. pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
  2383. pxmitbuf->agg_num = 0;
  2384. pxmitbuf->pg_num = 0;
  2385. #endif
  2386. #ifdef CONFIG_PCI_HCI
  2387. pxmitbuf->len = 0;
  2388. #ifdef CONFIG_TRX_BD_ARCH
  2389. /*pxmitbuf->buf_desc = NULL;*/
  2390. #else
  2391. pxmitbuf->desc = NULL;
  2392. #endif
  2393. #endif
  2394. if (pxmitbuf->sctx) {
  2395. RTW_INFO("%s pxmitbuf->sctx is not NULL\n", __func__);
  2396. rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC);
  2397. }
  2398. } else
  2399. RTW_INFO("%s fail, no xmitbuf available !!!\n", __func__);
  2400. exit:
  2401. return pxmitbuf;
  2402. }
  2403. struct xmit_frame *__rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv,
  2404. enum cmdbuf_type buf_type)
  2405. {
  2406. struct xmit_frame *pcmdframe;
  2407. struct xmit_buf *pxmitbuf;
  2408. pcmdframe = rtw_alloc_xmitframe(pxmitpriv);
  2409. if (pcmdframe == NULL) {
  2410. RTW_INFO("%s, alloc xmitframe fail\n", __FUNCTION__);
  2411. return NULL;
  2412. }
  2413. pxmitbuf = __rtw_alloc_cmd_xmitbuf(pxmitpriv, buf_type);
  2414. if (pxmitbuf == NULL) {
  2415. RTW_INFO("%s, alloc xmitbuf fail\n", __FUNCTION__);
  2416. rtw_free_xmitframe(pxmitpriv, pcmdframe);
  2417. return NULL;
  2418. }
  2419. pcmdframe->frame_tag = MGNT_FRAMETAG;
  2420. pcmdframe->pxmitbuf = pxmitbuf;
  2421. pcmdframe->buf_addr = pxmitbuf->pbuf;
  2422. /* initial memory to zero */
  2423. _rtw_memset(pcmdframe->buf_addr, 0, pxmitbuf->alloc_sz);
  2424. pxmitbuf->priv_data = pcmdframe;
  2425. return pcmdframe;
  2426. }
  2427. struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv)
  2428. {
  2429. _irqL irqL;
  2430. struct xmit_buf *pxmitbuf = NULL;
  2431. _list *plist, *phead;
  2432. _queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue;
  2433. _enter_critical(&pfree_queue->lock, &irqL);
  2434. if (_rtw_queue_empty(pfree_queue) == _TRUE)
  2435. pxmitbuf = NULL;
  2436. else {
  2437. phead = get_list_head(pfree_queue);
  2438. plist = get_next(phead);
  2439. pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);
  2440. rtw_list_delete(&(pxmitbuf->list));
  2441. }
  2442. if (pxmitbuf != NULL) {
  2443. pxmitpriv->free_xmit_extbuf_cnt--;
  2444. #ifdef DBG_XMIT_BUF_EXT
  2445. RTW_INFO("DBG_XMIT_BUF_EXT ALLOC no=%d, free_xmit_extbuf_cnt=%d\n", pxmitbuf->no, pxmitpriv->free_xmit_extbuf_cnt);
  2446. #endif
  2447. pxmitbuf->priv_data = NULL;
  2448. #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
  2449. pxmitbuf->len = 0;
  2450. pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
  2451. pxmitbuf->agg_num = 1;
  2452. #endif
  2453. #ifdef CONFIG_PCI_HCI
  2454. pxmitbuf->len = 0;
  2455. #ifdef CONFIG_TRX_BD_ARCH
  2456. /*pxmitbuf->buf_desc = NULL;*/
  2457. #else
  2458. pxmitbuf->desc = NULL;
  2459. #endif
  2460. #endif
  2461. if (pxmitbuf->sctx) {
  2462. RTW_INFO("%s pxmitbuf->sctx is not NULL\n", __func__);
  2463. rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC);
  2464. }
  2465. }
  2466. _exit_critical(&pfree_queue->lock, &irqL);
  2467. return pxmitbuf;
  2468. }
  2469. s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)
  2470. {
  2471. _irqL irqL;
  2472. _queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue;
  2473. if (pxmitbuf == NULL)
  2474. return _FAIL;
  2475. _enter_critical(&pfree_queue->lock, &irqL);
  2476. rtw_list_delete(&pxmitbuf->list);
  2477. rtw_list_insert_tail(&(pxmitbuf->list), get_list_head(pfree_queue));
  2478. pxmitpriv->free_xmit_extbuf_cnt++;
  2479. #ifdef DBG_XMIT_BUF_EXT
  2480. RTW_INFO("DBG_XMIT_BUF_EXT FREE no=%d, free_xmit_extbuf_cnt=%d\n", pxmitbuf->no , pxmitpriv->free_xmit_extbuf_cnt);
  2481. #endif
  2482. _exit_critical(&pfree_queue->lock, &irqL);
  2483. return _SUCCESS;
  2484. }
  2485. struct xmit_buf *rtw_alloc_xmitbuf(struct xmit_priv *pxmitpriv)
  2486. {
  2487. _irqL irqL;
  2488. struct xmit_buf *pxmitbuf = NULL;
  2489. _list *plist, *phead;
  2490. _queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue;
  2491. /* RTW_INFO("+rtw_alloc_xmitbuf\n"); */
  2492. _enter_critical(&pfree_xmitbuf_queue->lock, &irqL);
  2493. if (_rtw_queue_empty(pfree_xmitbuf_queue) == _TRUE)
  2494. pxmitbuf = NULL;
  2495. else {
  2496. phead = get_list_head(pfree_xmitbuf_queue);
  2497. plist = get_next(phead);
  2498. pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);
  2499. rtw_list_delete(&(pxmitbuf->list));
  2500. }
  2501. if (pxmitbuf != NULL) {
  2502. pxmitpriv->free_xmitbuf_cnt--;
  2503. #ifdef DBG_XMIT_BUF
  2504. RTW_INFO("DBG_XMIT_BUF ALLOC no=%d, free_xmitbuf_cnt=%d\n", pxmitbuf->no, pxmitpriv->free_xmitbuf_cnt);
  2505. #endif
  2506. /* RTW_INFO("alloc, free_xmitbuf_cnt=%d\n", pxmitpriv->free_xmitbuf_cnt); */
  2507. pxmitbuf->priv_data = NULL;
  2508. #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
  2509. pxmitbuf->len = 0;
  2510. pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
  2511. pxmitbuf->agg_num = 0;
  2512. pxmitbuf->pg_num = 0;
  2513. #endif
  2514. #ifdef CONFIG_PCI_HCI
  2515. pxmitbuf->len = 0;
  2516. #ifdef CONFIG_TRX_BD_ARCH
  2517. /*pxmitbuf->buf_desc = NULL;*/
  2518. #else
  2519. pxmitbuf->desc = NULL;
  2520. #endif
  2521. #endif
  2522. if (pxmitbuf->sctx) {
  2523. RTW_INFO("%s pxmitbuf->sctx is not NULL\n", __func__);
  2524. rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC);
  2525. }
  2526. }
  2527. #ifdef DBG_XMIT_BUF
  2528. else
  2529. RTW_INFO("DBG_XMIT_BUF rtw_alloc_xmitbuf return NULL\n");
  2530. #endif
  2531. _exit_critical(&pfree_xmitbuf_queue->lock, &irqL);
  2532. return pxmitbuf;
  2533. }
  2534. s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)
  2535. {
  2536. _irqL irqL;
  2537. _queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue;
  2538. /* RTW_INFO("+rtw_free_xmitbuf\n"); */
  2539. if (pxmitbuf == NULL)
  2540. return _FAIL;
  2541. if (pxmitbuf->sctx) {
  2542. RTW_INFO("%s pxmitbuf->sctx is not NULL\n", __func__);
  2543. rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_FREE);
  2544. }
  2545. if (pxmitbuf->buf_tag == XMITBUF_CMD) {
  2546. } else if (pxmitbuf->buf_tag == XMITBUF_MGNT)
  2547. rtw_free_xmitbuf_ext(pxmitpriv, pxmitbuf);
  2548. else {
  2549. _enter_critical(&pfree_xmitbuf_queue->lock, &irqL);
  2550. rtw_list_delete(&pxmitbuf->list);
  2551. rtw_list_insert_tail(&(pxmitbuf->list), get_list_head(pfree_xmitbuf_queue));
  2552. pxmitpriv->free_xmitbuf_cnt++;
  2553. /* RTW_INFO("FREE, free_xmitbuf_cnt=%d\n", pxmitpriv->free_xmitbuf_cnt); */
  2554. #ifdef DBG_XMIT_BUF
  2555. RTW_INFO("DBG_XMIT_BUF FREE no=%d, free_xmitbuf_cnt=%d\n", pxmitbuf->no , pxmitpriv->free_xmitbuf_cnt);
  2556. #endif
  2557. _exit_critical(&pfree_xmitbuf_queue->lock, &irqL);
  2558. }
  2559. return _SUCCESS;
  2560. }
  2561. void rtw_init_xmitframe(struct xmit_frame *pxframe)
  2562. {
  2563. if (pxframe != NULL) { /* default value setting */
  2564. pxframe->buf_addr = NULL;
  2565. pxframe->pxmitbuf = NULL;
  2566. _rtw_memset(&pxframe->attrib, 0, sizeof(struct pkt_attrib));
  2567. /* pxframe->attrib.psta = NULL; */
  2568. pxframe->frame_tag = DATA_FRAMETAG;
  2569. #ifdef CONFIG_USB_HCI
  2570. pxframe->pkt = NULL;
  2571. #ifdef USB_PACKET_OFFSET_SZ
  2572. pxframe->pkt_offset = (PACKET_OFFSET_SZ / 8);
  2573. #else
  2574. pxframe->pkt_offset = 1;/* default use pkt_offset to fill tx desc */
  2575. #endif
  2576. #ifdef CONFIG_USB_TX_AGGREGATION
  2577. pxframe->agg_num = 1;
  2578. #endif
  2579. #endif /* #ifdef CONFIG_USB_HCI */
  2580. #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
  2581. pxframe->pg_num = 1;
  2582. pxframe->agg_num = 1;
  2583. #endif
  2584. #ifdef CONFIG_XMIT_ACK
  2585. pxframe->ack_report = 0;
  2586. #endif
  2587. }
  2588. }
  2589. /*
  2590. Calling context:
  2591. 1. OS_TXENTRY
  2592. 2. RXENTRY (rx_thread or RX_ISR/RX_CallBack)
  2593. If we turn on USE_RXTHREAD, then, no need for critical section.
  2594. Otherwise, we must use _enter/_exit critical to protect free_xmit_queue...
  2595. Must be very very cautious...
  2596. */
  2597. struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv)/* (_queue *pfree_xmit_queue) */
  2598. {
  2599. /*
  2600. Please remember to use all the osdep_service api,
  2601. and lock/unlock or _enter/_exit critical to protect
  2602. pfree_xmit_queue
  2603. */
  2604. _irqL irqL;
  2605. struct xmit_frame *pxframe = NULL;
  2606. _list *plist, *phead;
  2607. _queue *pfree_xmit_queue = &pxmitpriv->free_xmit_queue;
  2608. _enter_critical_bh(&pfree_xmit_queue->lock, &irqL);
  2609. if (_rtw_queue_empty(pfree_xmit_queue) == _TRUE) {
  2610. pxframe = NULL;
  2611. } else {
  2612. phead = get_list_head(pfree_xmit_queue);
  2613. plist = get_next(phead);
  2614. pxframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
  2615. rtw_list_delete(&(pxframe->list));
  2616. pxmitpriv->free_xmitframe_cnt--;
  2617. }
  2618. _exit_critical_bh(&pfree_xmit_queue->lock, &irqL);
  2619. rtw_init_xmitframe(pxframe);
  2620. return pxframe;
  2621. }
  2622. struct xmit_frame *rtw_alloc_xmitframe_ext(struct xmit_priv *pxmitpriv)
  2623. {
  2624. _irqL irqL;
  2625. struct xmit_frame *pxframe = NULL;
  2626. _list *plist, *phead;
  2627. _queue *queue = &pxmitpriv->free_xframe_ext_queue;
  2628. _enter_critical_bh(&queue->lock, &irqL);
  2629. if (_rtw_queue_empty(queue) == _TRUE) {
  2630. pxframe = NULL;
  2631. } else {
  2632. phead = get_list_head(queue);
  2633. plist = get_next(phead);
  2634. pxframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
  2635. rtw_list_delete(&(pxframe->list));
  2636. pxmitpriv->free_xframe_ext_cnt--;
  2637. }
  2638. _exit_critical_bh(&queue->lock, &irqL);
  2639. rtw_init_xmitframe(pxframe);
  2640. return pxframe;
  2641. }
  2642. struct xmit_frame *rtw_alloc_xmitframe_once(struct xmit_priv *pxmitpriv)
  2643. {
  2644. struct xmit_frame *pxframe = NULL;
  2645. u8 *alloc_addr;
  2646. alloc_addr = rtw_zmalloc(sizeof(struct xmit_frame) + 4);
  2647. if (alloc_addr == NULL)
  2648. goto exit;
  2649. pxframe = (struct xmit_frame *)N_BYTE_ALIGMENT((SIZE_PTR)(alloc_addr), 4);
  2650. pxframe->alloc_addr = alloc_addr;
  2651. pxframe->padapter = pxmitpriv->adapter;
  2652. pxframe->frame_tag = NULL_FRAMETAG;
  2653. pxframe->pkt = NULL;
  2654. pxframe->buf_addr = NULL;
  2655. pxframe->pxmitbuf = NULL;
  2656. rtw_init_xmitframe(pxframe);
  2657. RTW_INFO("################## %s ##################\n", __func__);
  2658. exit:
  2659. return pxframe;
  2660. }
  2661. s32 rtw_free_xmitframe(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe)
  2662. {
  2663. _irqL irqL;
  2664. _queue *queue = NULL;
  2665. _adapter *padapter = pxmitpriv->adapter;
  2666. _pkt *pndis_pkt = NULL;
  2667. if (pxmitframe == NULL) {
  2668. goto exit;
  2669. }
  2670. if (pxmitframe->pkt) {
  2671. pndis_pkt = pxmitframe->pkt;
  2672. pxmitframe->pkt = NULL;
  2673. }
  2674. if (pxmitframe->alloc_addr) {
  2675. RTW_INFO("################## %s with alloc_addr ##################\n", __func__);
  2676. rtw_mfree(pxmitframe->alloc_addr, sizeof(struct xmit_frame) + 4);
  2677. goto check_pkt_complete;
  2678. }
  2679. if (pxmitframe->ext_tag == 0)
  2680. queue = &pxmitpriv->free_xmit_queue;
  2681. else if (pxmitframe->ext_tag == 1)
  2682. queue = &pxmitpriv->free_xframe_ext_queue;
  2683. else
  2684. rtw_warn_on(1);
  2685. _enter_critical_bh(&queue->lock, &irqL);
  2686. rtw_list_delete(&pxmitframe->list);
  2687. rtw_list_insert_tail(&pxmitframe->list, get_list_head(queue));
  2688. if (pxmitframe->ext_tag == 0) {
  2689. pxmitpriv->free_xmitframe_cnt++;
  2690. } else if (pxmitframe->ext_tag == 1) {
  2691. pxmitpriv->free_xframe_ext_cnt++;
  2692. } else {
  2693. }
  2694. _exit_critical_bh(&queue->lock, &irqL);
  2695. check_pkt_complete:
  2696. if (pndis_pkt)
  2697. rtw_os_pkt_complete(padapter, pndis_pkt);
  2698. exit:
  2699. return _SUCCESS;
  2700. }
  2701. void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, _queue *pframequeue)
  2702. {
  2703. _irqL irqL;
  2704. _list *plist, *phead;
  2705. struct xmit_frame *pxmitframe;
  2706. _enter_critical_bh(&(pframequeue->lock), &irqL);
  2707. phead = get_list_head(pframequeue);
  2708. plist = get_next(phead);
  2709. while (rtw_end_of_queue_search(phead, plist) == _FALSE) {
  2710. pxmitframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
  2711. plist = get_next(plist);
  2712. rtw_free_xmitframe(pxmitpriv, pxmitframe);
  2713. }
  2714. _exit_critical_bh(&(pframequeue->lock), &irqL);
  2715. }
  2716. s32 rtw_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe)
  2717. {
  2718. DBG_COUNTER(padapter->tx_logs.core_tx_enqueue);
  2719. if (rtw_xmit_classifier(padapter, pxmitframe) == _FAIL) {
  2720. /* pxmitframe->pkt = NULL; */
  2721. return _FAIL;
  2722. }
  2723. return _SUCCESS;
  2724. }
  2725. static struct xmit_frame *dequeue_one_xmitframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit, struct tx_servq *ptxservq, _queue *pframe_queue)
  2726. {
  2727. _list *xmitframe_plist, *xmitframe_phead;
  2728. struct xmit_frame *pxmitframe = NULL;
  2729. xmitframe_phead = get_list_head(pframe_queue);
  2730. xmitframe_plist = get_next(xmitframe_phead);
  2731. while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) {
  2732. pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
  2733. /* xmitframe_plist = get_next(xmitframe_plist); */
  2734. /*#ifdef RTK_DMP_PLATFORM
  2735. #ifdef CONFIG_USB_TX_AGGREGATION
  2736. if((ptxservq->qcnt>0) && (ptxservq->qcnt<=2))
  2737. {
  2738. pxmitframe = NULL;
  2739. tasklet_schedule(&pxmitpriv->xmit_tasklet);
  2740. break;
  2741. }
  2742. #endif
  2743. #endif*/
  2744. rtw_list_delete(&pxmitframe->list);
  2745. ptxservq->qcnt--;
  2746. /* rtw_list_insert_tail(&pxmitframe->list, &phwxmit->pending); */
  2747. /* ptxservq->qcnt--; */
  2748. break;
  2749. /* pxmitframe = NULL; */
  2750. }
  2751. return pxmitframe;
  2752. }
  2753. static struct xmit_frame *get_one_xmitframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit, struct tx_servq *ptxservq, _queue *pframe_queue)
  2754. {
  2755. _list *xmitframe_plist, *xmitframe_phead;
  2756. struct xmit_frame *pxmitframe = NULL;
  2757. xmitframe_phead = get_list_head(pframe_queue);
  2758. xmitframe_plist = get_next(xmitframe_phead);
  2759. while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) {
  2760. pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
  2761. break;
  2762. }
  2763. return pxmitframe;
  2764. }
  2765. struct xmit_frame *rtw_get_xframe(struct xmit_priv *pxmitpriv, int *num_frame)
  2766. {
  2767. _irqL irqL0;
  2768. _list *sta_plist, *sta_phead;
  2769. struct hw_xmit *phwxmit_i = pxmitpriv->hwxmits;
  2770. sint entry = pxmitpriv->hwxmit_entry;
  2771. struct hw_xmit *phwxmit;
  2772. struct tx_servq *ptxservq = NULL;
  2773. _queue *pframe_queue = NULL;
  2774. struct xmit_frame *pxmitframe = NULL;
  2775. _adapter *padapter = pxmitpriv->adapter;
  2776. struct registry_priv *pregpriv = &padapter->registrypriv;
  2777. int i, inx[4];
  2778. #ifdef CONFIG_USB_HCI
  2779. /* int j, tmp, acirp_cnt[4]; */
  2780. #endif
  2781. inx[0] = 0;
  2782. inx[1] = 1;
  2783. inx[2] = 2;
  2784. inx[3] = 3;
  2785. *num_frame = 0;
  2786. /*No amsdu when wifi_spec on*/
  2787. if (pregpriv->wifi_spec == 1) {
  2788. return NULL;
  2789. }
  2790. _enter_critical_bh(&pxmitpriv->lock, &irqL0);
  2791. for (i = 0; i < entry; i++) {
  2792. phwxmit = phwxmit_i + inx[i];
  2793. sta_phead = get_list_head(phwxmit->sta_queue);
  2794. sta_plist = get_next(sta_phead);
  2795. while ((rtw_end_of_queue_search(sta_phead, sta_plist)) == _FALSE) {
  2796. ptxservq = LIST_CONTAINOR(sta_plist, struct tx_servq, tx_pending);
  2797. pframe_queue = &ptxservq->sta_pending;
  2798. if(ptxservq->qcnt)
  2799. {
  2800. *num_frame = ptxservq->qcnt;
  2801. pxmitframe = get_one_xmitframe(pxmitpriv, phwxmit, ptxservq, pframe_queue);
  2802. goto exit;
  2803. }
  2804. sta_plist = get_next(sta_plist);
  2805. }
  2806. }
  2807. exit:
  2808. _exit_critical_bh(&pxmitpriv->lock, &irqL0);
  2809. return pxmitframe;
  2810. }
  2811. struct xmit_frame *rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit_i, sint entry)
  2812. {
  2813. _irqL irqL0;
  2814. _list *sta_plist, *sta_phead;
  2815. struct hw_xmit *phwxmit;
  2816. struct tx_servq *ptxservq = NULL;
  2817. _queue *pframe_queue = NULL;
  2818. struct xmit_frame *pxmitframe = NULL;
  2819. _adapter *padapter = pxmitpriv->adapter;
  2820. struct registry_priv *pregpriv = &padapter->registrypriv;
  2821. int i, inx[4];
  2822. #ifdef CONFIG_USB_HCI
  2823. /* int j, tmp, acirp_cnt[4]; */
  2824. #endif
  2825. inx[0] = 0;
  2826. inx[1] = 1;
  2827. inx[2] = 2;
  2828. inx[3] = 3;
  2829. if (pregpriv->wifi_spec == 1) {
  2830. int j, tmp, acirp_cnt[4];
  2831. #if 0
  2832. if (flags < XMIT_QUEUE_ENTRY) {
  2833. /* priority exchange according to the completed xmitbuf flags. */
  2834. inx[flags] = 0;
  2835. inx[0] = flags;
  2836. }
  2837. #endif
  2838. #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_PCI_HCI)
  2839. for (j = 0; j < 4; j++)
  2840. inx[j] = pxmitpriv->wmm_para_seq[j];
  2841. #endif
  2842. }
  2843. _enter_critical_bh(&pxmitpriv->lock, &irqL0);
  2844. for (i = 0; i < entry; i++) {
  2845. phwxmit = phwxmit_i + inx[i];
  2846. /* _enter_critical_ex(&phwxmit->sta_queue->lock, &irqL0); */
  2847. sta_phead = get_list_head(phwxmit->sta_queue);
  2848. sta_plist = get_next(sta_phead);
  2849. while ((rtw_end_of_queue_search(sta_phead, sta_plist)) == _FALSE) {
  2850. ptxservq = LIST_CONTAINOR(sta_plist, struct tx_servq, tx_pending);
  2851. pframe_queue = &ptxservq->sta_pending;
  2852. pxmitframe = dequeue_one_xmitframe(pxmitpriv, phwxmit, ptxservq, pframe_queue);
  2853. if (pxmitframe) {
  2854. phwxmit->accnt--;
  2855. /* Remove sta node when there is no pending packets. */
  2856. if (_rtw_queue_empty(pframe_queue)) /* must be done after get_next and before break */
  2857. rtw_list_delete(&ptxservq->tx_pending);
  2858. /* _exit_critical_ex(&phwxmit->sta_queue->lock, &irqL0); */
  2859. goto exit;
  2860. }
  2861. sta_plist = get_next(sta_plist);
  2862. }
  2863. /* _exit_critical_ex(&phwxmit->sta_queue->lock, &irqL0); */
  2864. }
  2865. exit:
  2866. _exit_critical_bh(&pxmitpriv->lock, &irqL0);
  2867. return pxmitframe;
  2868. }
  2869. #if 1
  2870. struct tx_servq *rtw_get_sta_pending(_adapter *padapter, struct sta_info *psta, sint up, u8 *ac)
  2871. {
  2872. struct tx_servq *ptxservq = NULL;
  2873. switch (up) {
  2874. case 1:
  2875. case 2:
  2876. ptxservq = &(psta->sta_xmitpriv.bk_q);
  2877. *(ac) = 3;
  2878. break;
  2879. case 4:
  2880. case 5:
  2881. ptxservq = &(psta->sta_xmitpriv.vi_q);
  2882. *(ac) = 1;
  2883. break;
  2884. case 6:
  2885. case 7:
  2886. ptxservq = &(psta->sta_xmitpriv.vo_q);
  2887. *(ac) = 0;
  2888. break;
  2889. case 0:
  2890. case 3:
  2891. default:
  2892. ptxservq = &(psta->sta_xmitpriv.be_q);
  2893. *(ac) = 2;
  2894. break;
  2895. }
  2896. return ptxservq;
  2897. }
  2898. #else
  2899. __inline static struct tx_servq *rtw_get_sta_pending
  2900. (_adapter *padapter, _queue **ppstapending, struct sta_info *psta, sint up)
  2901. {
  2902. struct tx_servq *ptxservq;
  2903. struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits;
  2904. #ifdef CONFIG_RTL8711
  2905. if (IS_MCAST(psta->hwaddr)) {
  2906. ptxservq = &(psta->sta_xmitpriv.be_q); /* we will use be_q to queue bc/mc frames in BCMC_stainfo */
  2907. *ppstapending = &padapter->xmitpriv.bm_pending;
  2908. } else
  2909. #endif
  2910. {
  2911. switch (up) {
  2912. case 1:
  2913. case 2:
  2914. ptxservq = &(psta->sta_xmitpriv.bk_q);
  2915. *ppstapending = &padapter->xmitpriv.bk_pending;
  2916. (phwxmits + 3)->accnt++;
  2917. break;
  2918. case 4:
  2919. case 5:
  2920. ptxservq = &(psta->sta_xmitpriv.vi_q);
  2921. *ppstapending = &padapter->xmitpriv.vi_pending;
  2922. (phwxmits + 1)->accnt++;
  2923. break;
  2924. case 6:
  2925. case 7:
  2926. ptxservq = &(psta->sta_xmitpriv.vo_q);
  2927. *ppstapending = &padapter->xmitpriv.vo_pending;
  2928. (phwxmits + 0)->accnt++;
  2929. break;
  2930. case 0:
  2931. case 3:
  2932. default:
  2933. ptxservq = &(psta->sta_xmitpriv.be_q);
  2934. *ppstapending = &padapter->xmitpriv.be_pending;
  2935. (phwxmits + 2)->accnt++;
  2936. break;
  2937. }
  2938. }
  2939. return ptxservq;
  2940. }
  2941. #endif
  2942. /*
  2943. * Will enqueue pxmitframe to the proper queue,
  2944. * and indicate it to xx_pending list.....
  2945. */
  2946. s32 rtw_xmit_classifier(_adapter *padapter, struct xmit_frame *pxmitframe)
  2947. {
  2948. /* _irqL irqL0; */
  2949. u8 ac_index;
  2950. struct sta_info *psta;
  2951. struct tx_servq *ptxservq;
  2952. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  2953. struct sta_priv *pstapriv = &padapter->stapriv;
  2954. struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits;
  2955. sint res = _SUCCESS;
  2956. DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class);
  2957. /*
  2958. if (pattrib->psta) {
  2959. psta = pattrib->psta;
  2960. } else {
  2961. RTW_INFO("%s, call rtw_get_stainfo()\n", __func__);
  2962. psta = rtw_get_stainfo(pstapriv, pattrib->ra);
  2963. }
  2964. */
  2965. psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
  2966. if (pattrib->psta != psta) {
  2967. DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_sta);
  2968. RTW_INFO("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
  2969. return _FAIL;
  2970. }
  2971. if (psta == NULL) {
  2972. DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_nosta);
  2973. res = _FAIL;
  2974. RTW_INFO("rtw_xmit_classifier: psta == NULL\n");
  2975. goto exit;
  2976. }
  2977. if (!(psta->state & _FW_LINKED)) {
  2978. DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_fwlink);
  2979. RTW_INFO("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
  2980. return _FAIL;
  2981. }
  2982. ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index));
  2983. /* _enter_critical(&pstapending->lock, &irqL0); */
  2984. if (rtw_is_list_empty(&ptxservq->tx_pending))
  2985. rtw_list_insert_tail(&ptxservq->tx_pending, get_list_head(phwxmits[ac_index].sta_queue));
  2986. /* _enter_critical(&ptxservq->sta_pending.lock, &irqL1); */
  2987. rtw_list_insert_tail(&pxmitframe->list, get_list_head(&ptxservq->sta_pending));
  2988. ptxservq->qcnt++;
  2989. phwxmits[ac_index].accnt++;
  2990. /* _exit_critical(&ptxservq->sta_pending.lock, &irqL1); */
  2991. /* _exit_critical(&pstapending->lock, &irqL0); */
  2992. exit:
  2993. return res;
  2994. }
  2995. void rtw_alloc_hwxmits(_adapter *padapter)
  2996. {
  2997. struct hw_xmit *hwxmits;
  2998. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  2999. pxmitpriv->hwxmit_entry = HWXMIT_ENTRY;
  3000. pxmitpriv->hwxmits = NULL;
  3001. pxmitpriv->hwxmits = (struct hw_xmit *)rtw_zmalloc(sizeof(struct hw_xmit) * pxmitpriv->hwxmit_entry);
  3002. if (pxmitpriv->hwxmits == NULL) {
  3003. RTW_INFO("alloc hwxmits fail!...\n");
  3004. return;
  3005. }
  3006. hwxmits = pxmitpriv->hwxmits;
  3007. if (pxmitpriv->hwxmit_entry == 5) {
  3008. /* pxmitpriv->bmc_txqueue.head = 0; */
  3009. /* hwxmits[0] .phwtxqueue = &pxmitpriv->bmc_txqueue; */
  3010. hwxmits[0] .sta_queue = &pxmitpriv->bm_pending;
  3011. /* pxmitpriv->vo_txqueue.head = 0; */
  3012. /* hwxmits[1] .phwtxqueue = &pxmitpriv->vo_txqueue; */
  3013. hwxmits[1] .sta_queue = &pxmitpriv->vo_pending;
  3014. /* pxmitpriv->vi_txqueue.head = 0; */
  3015. /* hwxmits[2] .phwtxqueue = &pxmitpriv->vi_txqueue; */
  3016. hwxmits[2] .sta_queue = &pxmitpriv->vi_pending;
  3017. /* pxmitpriv->bk_txqueue.head = 0; */
  3018. /* hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue; */
  3019. hwxmits[3] .sta_queue = &pxmitpriv->bk_pending;
  3020. /* pxmitpriv->be_txqueue.head = 0; */
  3021. /* hwxmits[4] .phwtxqueue = &pxmitpriv->be_txqueue; */
  3022. hwxmits[4] .sta_queue = &pxmitpriv->be_pending;
  3023. } else if (pxmitpriv->hwxmit_entry == 4) {
  3024. /* pxmitpriv->vo_txqueue.head = 0; */
  3025. /* hwxmits[0] .phwtxqueue = &pxmitpriv->vo_txqueue; */
  3026. hwxmits[0] .sta_queue = &pxmitpriv->vo_pending;
  3027. /* pxmitpriv->vi_txqueue.head = 0; */
  3028. /* hwxmits[1] .phwtxqueue = &pxmitpriv->vi_txqueue; */
  3029. hwxmits[1] .sta_queue = &pxmitpriv->vi_pending;
  3030. /* pxmitpriv->be_txqueue.head = 0; */
  3031. /* hwxmits[2] .phwtxqueue = &pxmitpriv->be_txqueue; */
  3032. hwxmits[2] .sta_queue = &pxmitpriv->be_pending;
  3033. /* pxmitpriv->bk_txqueue.head = 0; */
  3034. /* hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue; */
  3035. hwxmits[3] .sta_queue = &pxmitpriv->bk_pending;
  3036. } else {
  3037. }
  3038. }
  3039. void rtw_free_hwxmits(_adapter *padapter)
  3040. {
  3041. struct hw_xmit *hwxmits;
  3042. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  3043. hwxmits = pxmitpriv->hwxmits;
  3044. if (hwxmits)
  3045. rtw_mfree((u8 *)hwxmits, (sizeof(struct hw_xmit) * pxmitpriv->hwxmit_entry));
  3046. }
  3047. void rtw_init_hwxmits(struct hw_xmit *phwxmit, sint entry)
  3048. {
  3049. sint i;
  3050. for (i = 0; i < entry; i++, phwxmit++) {
  3051. /* _rtw_spinlock_init(&phwxmit->xmit_lock); */
  3052. /* _rtw_init_listhead(&phwxmit->pending); */
  3053. /* phwxmit->txcmdcnt = 0; */
  3054. phwxmit->accnt = 0;
  3055. }
  3056. }
  3057. #ifdef CONFIG_BR_EXT
  3058. int rtw_br_client_tx(_adapter *padapter, struct sk_buff **pskb)
  3059. {
  3060. struct sk_buff *skb = *pskb;
  3061. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  3062. _irqL irqL;
  3063. /* if(check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE) */
  3064. {
  3065. void dhcp_flag_bcast(_adapter *priv, struct sk_buff *skb);
  3066. int res, is_vlan_tag = 0, i, do_nat25 = 1;
  3067. unsigned short vlan_hdr = 0;
  3068. void *br_port = NULL;
  3069. /* mac_clone_handle_frame(priv, skb); */
  3070. #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
  3071. br_port = padapter->pnetdev->br_port;
  3072. #else /* (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) */
  3073. rcu_read_lock();
  3074. br_port = rcu_dereference(padapter->pnetdev->rx_handler_data);
  3075. rcu_read_unlock();
  3076. #endif /* (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) */
  3077. _enter_critical_bh(&padapter->br_ext_lock, &irqL);
  3078. if (!(skb->data[0] & 1) &&
  3079. br_port &&
  3080. memcmp(skb->data + MACADDRLEN, padapter->br_mac, MACADDRLEN) &&
  3081. *((unsigned short *)(skb->data + MACADDRLEN * 2)) != __constant_htons(ETH_P_8021Q) &&
  3082. *((unsigned short *)(skb->data + MACADDRLEN * 2)) == __constant_htons(ETH_P_IP) &&
  3083. !memcmp(padapter->scdb_mac, skb->data + MACADDRLEN, MACADDRLEN) && padapter->scdb_entry) {
  3084. memcpy(skb->data + MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);
  3085. padapter->scdb_entry->ageing_timer = jiffies;
  3086. _exit_critical_bh(&padapter->br_ext_lock, &irqL);
  3087. } else
  3088. /* if (!priv->pmib->ethBrExtInfo.nat25_disable) */
  3089. {
  3090. /* if (priv->dev->br_port &&
  3091. * !memcmp(skb->data+MACADDRLEN, priv->br_mac, MACADDRLEN)) { */
  3092. #if 1
  3093. if (*((unsigned short *)(skb->data + MACADDRLEN * 2)) == __constant_htons(ETH_P_8021Q)) {
  3094. is_vlan_tag = 1;
  3095. vlan_hdr = *((unsigned short *)(skb->data + MACADDRLEN * 2 + 2));
  3096. for (i = 0; i < 6; i++)
  3097. *((unsigned short *)(skb->data + MACADDRLEN * 2 + 2 - i * 2)) = *((unsigned short *)(skb->data + MACADDRLEN * 2 - 2 - i * 2));
  3098. skb_pull(skb, 4);
  3099. }
  3100. /* if SA == br_mac && skb== IP => copy SIP to br_ip ?? why */
  3101. if (!memcmp(skb->data + MACADDRLEN, padapter->br_mac, MACADDRLEN) &&
  3102. (*((unsigned short *)(skb->data + MACADDRLEN * 2)) == __constant_htons(ETH_P_IP)))
  3103. memcpy(padapter->br_ip, skb->data + WLAN_ETHHDR_LEN + 12, 4);
  3104. if (*((unsigned short *)(skb->data + MACADDRLEN * 2)) == __constant_htons(ETH_P_IP)) {
  3105. if (memcmp(padapter->scdb_mac, skb->data + MACADDRLEN, MACADDRLEN)) {
  3106. void *scdb_findEntry(_adapter *priv, unsigned char *macAddr, unsigned char *ipAddr);
  3107. padapter->scdb_entry = (struct nat25_network_db_entry *)scdb_findEntry(padapter,
  3108. skb->data + MACADDRLEN, skb->data + WLAN_ETHHDR_LEN + 12);
  3109. if (padapter->scdb_entry != NULL) {
  3110. memcpy(padapter->scdb_mac, skb->data + MACADDRLEN, MACADDRLEN);
  3111. memcpy(padapter->scdb_ip, skb->data + WLAN_ETHHDR_LEN + 12, 4);
  3112. padapter->scdb_entry->ageing_timer = jiffies;
  3113. do_nat25 = 0;
  3114. }
  3115. } else {
  3116. if (padapter->scdb_entry) {
  3117. padapter->scdb_entry->ageing_timer = jiffies;
  3118. do_nat25 = 0;
  3119. } else {
  3120. memset(padapter->scdb_mac, 0, MACADDRLEN);
  3121. memset(padapter->scdb_ip, 0, 4);
  3122. }
  3123. }
  3124. }
  3125. _exit_critical_bh(&padapter->br_ext_lock, &irqL);
  3126. #endif /* 1 */
  3127. if (do_nat25) {
  3128. int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method);
  3129. if (nat25_db_handle(padapter, skb, NAT25_CHECK) == 0) {
  3130. struct sk_buff *newskb;
  3131. if (is_vlan_tag) {
  3132. skb_push(skb, 4);
  3133. for (i = 0; i < 6; i++)
  3134. *((unsigned short *)(skb->data + i * 2)) = *((unsigned short *)(skb->data + 4 + i * 2));
  3135. *((unsigned short *)(skb->data + MACADDRLEN * 2)) = __constant_htons(ETH_P_8021Q);
  3136. *((unsigned short *)(skb->data + MACADDRLEN * 2 + 2)) = vlan_hdr;
  3137. }
  3138. newskb = rtw_skb_copy(skb);
  3139. if (newskb == NULL) {
  3140. /* priv->ext_stats.tx_drops++; */
  3141. DEBUG_ERR("TX DROP: rtw_skb_copy fail!\n");
  3142. /* goto stop_proc; */
  3143. return -1;
  3144. }
  3145. rtw_skb_free(skb);
  3146. *pskb = skb = newskb;
  3147. if (is_vlan_tag) {
  3148. vlan_hdr = *((unsigned short *)(skb->data + MACADDRLEN * 2 + 2));
  3149. for (i = 0; i < 6; i++)
  3150. *((unsigned short *)(skb->data + MACADDRLEN * 2 + 2 - i * 2)) = *((unsigned short *)(skb->data + MACADDRLEN * 2 - 2 - i * 2));
  3151. skb_pull(skb, 4);
  3152. }
  3153. }
  3154. if (skb_is_nonlinear(skb))
  3155. DEBUG_ERR("%s(): skb_is_nonlinear!!\n", __FUNCTION__);
  3156. #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18))
  3157. res = skb_linearize(skb, GFP_ATOMIC);
  3158. #else /* (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)) */
  3159. res = skb_linearize(skb);
  3160. #endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18)) */
  3161. if (res < 0) {
  3162. DEBUG_ERR("TX DROP: skb_linearize fail!\n");
  3163. /* goto free_and_stop; */
  3164. return -1;
  3165. }
  3166. res = nat25_db_handle(padapter, skb, NAT25_INSERT);
  3167. if (res < 0) {
  3168. if (res == -2) {
  3169. /* priv->ext_stats.tx_drops++; */
  3170. DEBUG_ERR("TX DROP: nat25_db_handle fail!\n");
  3171. /* goto free_and_stop; */
  3172. return -1;
  3173. }
  3174. /* we just print warning message and let it go */
  3175. /* DEBUG_WARN("%s()-%d: nat25_db_handle INSERT Warning!\n", __FUNCTION__, __LINE__); */
  3176. /* return -1; */ /* return -1 will cause system crash on 2011/08/30! */
  3177. return 0;
  3178. }
  3179. }
  3180. memcpy(skb->data + MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);
  3181. dhcp_flag_bcast(padapter, skb);
  3182. if (is_vlan_tag) {
  3183. skb_push(skb, 4);
  3184. for (i = 0; i < 6; i++)
  3185. *((unsigned short *)(skb->data + i * 2)) = *((unsigned short *)(skb->data + 4 + i * 2));
  3186. *((unsigned short *)(skb->data + MACADDRLEN * 2)) = __constant_htons(ETH_P_8021Q);
  3187. *((unsigned short *)(skb->data + MACADDRLEN * 2 + 2)) = vlan_hdr;
  3188. }
  3189. }
  3190. #if 0
  3191. else {
  3192. if (*((unsigned short *)(skb->data + MACADDRLEN * 2)) == __constant_htons(ETH_P_8021Q))
  3193. is_vlan_tag = 1;
  3194. if (is_vlan_tag) {
  3195. if (ICMPV6_MCAST_MAC(skb->data) && ICMPV6_PROTO1A_VALN(skb->data))
  3196. memcpy(skb->data + MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);
  3197. } else {
  3198. if (ICMPV6_MCAST_MAC(skb->data) && ICMPV6_PROTO1A(skb->data))
  3199. memcpy(skb->data + MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);
  3200. }
  3201. }
  3202. #endif /* 0 */
  3203. /* check if SA is equal to our MAC */
  3204. if (memcmp(skb->data + MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN)) {
  3205. /* priv->ext_stats.tx_drops++; */
  3206. DEBUG_ERR("TX DROP: untransformed frame SA:%02X%02X%02X%02X%02X%02X!\n",
  3207. skb->data[6], skb->data[7], skb->data[8], skb->data[9], skb->data[10], skb->data[11]);
  3208. /* goto free_and_stop; */
  3209. return -1;
  3210. }
  3211. }
  3212. return 0;
  3213. }
  3214. #endif /* CONFIG_BR_EXT */
  3215. u32 rtw_get_ff_hwaddr(struct xmit_frame *pxmitframe)
  3216. {
  3217. u32 addr;
  3218. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  3219. switch (pattrib->qsel) {
  3220. case 0:
  3221. case 3:
  3222. addr = BE_QUEUE_INX;
  3223. break;
  3224. case 1:
  3225. case 2:
  3226. addr = BK_QUEUE_INX;
  3227. break;
  3228. case 4:
  3229. case 5:
  3230. addr = VI_QUEUE_INX;
  3231. break;
  3232. case 6:
  3233. case 7:
  3234. addr = VO_QUEUE_INX;
  3235. break;
  3236. case 0x10:
  3237. addr = BCN_QUEUE_INX;
  3238. break;
  3239. case 0x11: /* BC/MC in PS (HIQ) */
  3240. addr = HIGH_QUEUE_INX;
  3241. break;
  3242. case 0x13:
  3243. addr = TXCMD_QUEUE_INX;
  3244. break;
  3245. case 0x12:
  3246. default:
  3247. addr = MGT_QUEUE_INX;
  3248. break;
  3249. }
  3250. return addr;
  3251. }
  3252. static void do_queue_select(_adapter *padapter, struct pkt_attrib *pattrib)
  3253. {
  3254. u8 qsel;
  3255. qsel = pattrib->priority;
  3256. #ifdef CONFIG_CONCURRENT_MODE
  3257. /* if (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE)
  3258. * qsel = 7; */
  3259. #endif
  3260. #ifdef CONFIG_MCC_MODE
  3261. if (MCC_EN(padapter)) {
  3262. /* Under MCC */
  3263. if (rtw_hal_check_mcc_status(padapter, MCC_STATUS_NEED_MCC)) {
  3264. if (padapter->mcc_adapterpriv.role == MCC_ROLE_GO
  3265. || padapter->mcc_adapterpriv.role == MCC_ROLE_AP) {
  3266. pattrib->qsel = QSLT_VO; /* AP interface VO queue */
  3267. } else {
  3268. pattrib->qsel = QSLT_BE; /* STA interface BE queue */
  3269. }
  3270. } else
  3271. /* Not Under MCC */
  3272. pattrib->qsel = qsel;
  3273. } else
  3274. /* Not enable MCC */
  3275. pattrib->qsel = qsel;
  3276. #else /* !CONFIG_MCC_MODE */
  3277. pattrib->qsel = qsel;
  3278. #endif /* CONFIG_MCC_MODE */
  3279. }
  3280. /*
  3281. * The main transmit(tx) entry
  3282. *
  3283. * Return
  3284. * 1 enqueue
  3285. * 0 success, hardware will handle this xmit frame(packet)
  3286. * <0 fail
  3287. */
  3288. #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24))
  3289. s32 rtw_monitor_xmit_entry(struct sk_buff *skb, struct net_device *ndev)
  3290. {
  3291. int ret = 0;
  3292. int rtap_len;
  3293. int qos_len = 0;
  3294. int dot11_hdr_len = 24;
  3295. int snap_len = 6;
  3296. unsigned char *pdata;
  3297. u16 frame_ctl;
  3298. unsigned char src_mac_addr[6];
  3299. unsigned char dst_mac_addr[6];
  3300. struct rtw_ieee80211_hdr *dot11_hdr;
  3301. struct ieee80211_radiotap_header *rtap_hdr;
  3302. _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);
  3303. if (skb)
  3304. rtw_mstat_update(MSTAT_TYPE_SKB, MSTAT_ALLOC_SUCCESS, skb->truesize);
  3305. if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header)))
  3306. goto fail;
  3307. rtap_hdr = (struct ieee80211_radiotap_header *)skb->data;
  3308. if (unlikely(rtap_hdr->it_version))
  3309. goto fail;
  3310. rtap_len = ieee80211_get_radiotap_len(skb->data);
  3311. if (unlikely(skb->len < rtap_len))
  3312. goto fail;
  3313. if (rtap_len != 12) {
  3314. RTW_INFO("radiotap len (should be 14): %d\n", rtap_len);
  3315. goto fail;
  3316. }
  3317. /* Skip the ratio tap header */
  3318. skb_pull(skb, rtap_len);
  3319. dot11_hdr = (struct rtw_ieee80211_hdr *)skb->data;
  3320. frame_ctl = le16_to_cpu(dot11_hdr->frame_ctl);
  3321. /* Check if the QoS bit is set */
  3322. if ((frame_ctl & RTW_IEEE80211_FCTL_FTYPE) == RTW_IEEE80211_FTYPE_DATA) {
  3323. struct xmit_frame *pmgntframe;
  3324. struct pkt_attrib *pattrib;
  3325. unsigned char *pframe;
  3326. struct rtw_ieee80211_hdr *pwlanhdr;
  3327. struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  3328. struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  3329. u8 *buf = skb->data;
  3330. u32 len = skb->len;
  3331. u8 category, action;
  3332. int type = -1;
  3333. pmgntframe = alloc_mgtxmitframe(pxmitpriv);
  3334. if (pmgntframe == NULL) {
  3335. rtw_udelay_os(500);
  3336. goto fail;
  3337. }
  3338. pattrib = &pmgntframe->attrib;
  3339. update_monitor_frame_attrib(padapter, pattrib);
  3340. pattrib->retry_ctrl = _FALSE;
  3341. _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  3342. pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  3343. _rtw_memcpy(pframe, (void *)buf, len);
  3344. pattrib->pktlen = len;
  3345. pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  3346. if (is_broadcast_mac_addr(pwlanhdr->addr3) || is_broadcast_mac_addr(pwlanhdr->addr1))
  3347. pattrib->rate = MGN_24M;
  3348. pmlmeext->mgnt_seq = GetSequence(pwlanhdr);
  3349. pattrib->seqnum = pmlmeext->mgnt_seq;
  3350. pmlmeext->mgnt_seq++;
  3351. pattrib->last_txcmdsz = pattrib->pktlen;
  3352. dump_mgntframe(padapter, pmgntframe);
  3353. } else {
  3354. struct xmit_frame *pmgntframe;
  3355. struct pkt_attrib *pattrib;
  3356. unsigned char *pframe;
  3357. struct rtw_ieee80211_hdr *pwlanhdr;
  3358. struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
  3359. struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  3360. u8 *buf = skb->data;
  3361. u32 len = skb->len;
  3362. u8 category, action;
  3363. int type = -1;
  3364. pmgntframe = alloc_mgtxmitframe(pxmitpriv);
  3365. if (pmgntframe == NULL)
  3366. goto fail;
  3367. pattrib = &pmgntframe->attrib;
  3368. update_mgntframe_attrib(padapter, pattrib);
  3369. pattrib->retry_ctrl = _FALSE;
  3370. _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
  3371. pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
  3372. _rtw_memcpy(pframe, (void *)buf, len);
  3373. pattrib->pktlen = len;
  3374. pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
  3375. pmlmeext->mgnt_seq = GetSequence(pwlanhdr);
  3376. pattrib->seqnum = pmlmeext->mgnt_seq;
  3377. pmlmeext->mgnt_seq++;
  3378. pattrib->last_txcmdsz = pattrib->pktlen;
  3379. dump_mgntframe(padapter, pmgntframe);
  3380. }
  3381. fail:
  3382. rtw_skb_free(skb);
  3383. return 0;
  3384. }
  3385. #endif
  3386. /*
  3387. * The main transmit(tx) entry
  3388. *
  3389. * Return
  3390. * 1 enqueue
  3391. * 0 success, hardware will handle this xmit frame(packet)
  3392. * <0 fail
  3393. */
  3394. s32 rtw_xmit(_adapter *padapter, _pkt **ppkt)
  3395. {
  3396. static u32 start = 0;
  3397. static u32 drop_cnt = 0;
  3398. #ifdef CONFIG_AP_MODE
  3399. _irqL irqL0;
  3400. #endif
  3401. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  3402. struct xmit_frame *pxmitframe = NULL;
  3403. #ifdef CONFIG_BR_EXT
  3404. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  3405. void *br_port = NULL;
  3406. #endif /* CONFIG_BR_EXT */
  3407. s32 res;
  3408. DBG_COUNTER(padapter->tx_logs.core_tx);
  3409. if (start == 0)
  3410. start = rtw_get_current_time();
  3411. pxmitframe = rtw_alloc_xmitframe(pxmitpriv);
  3412. if (rtw_get_passing_time_ms(start) > 2000) {
  3413. if (drop_cnt)
  3414. RTW_INFO("DBG_TX_DROP_FRAME %s no more pxmitframe, drop_cnt:%u\n", __FUNCTION__, drop_cnt);
  3415. start = rtw_get_current_time();
  3416. drop_cnt = 0;
  3417. }
  3418. if (pxmitframe == NULL) {
  3419. drop_cnt++;
  3420. /*RTW_INFO("%s-"ADPT_FMT" no more xmitframe\n", __func__, ADPT_ARG(padapter));*/
  3421. DBG_COUNTER(padapter->tx_logs.core_tx_err_pxmitframe);
  3422. return -1;
  3423. }
  3424. #ifdef CONFIG_BR_EXT
  3425. #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
  3426. br_port = padapter->pnetdev->br_port;
  3427. #else /* (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) */
  3428. rcu_read_lock();
  3429. br_port = rcu_dereference(padapter->pnetdev->rx_handler_data);
  3430. rcu_read_unlock();
  3431. #endif /* (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35)) */
  3432. if (br_port && check_fwstate(pmlmepriv, WIFI_STATION_STATE | WIFI_ADHOC_STATE) == _TRUE) {
  3433. res = rtw_br_client_tx(padapter, ppkt);
  3434. if (res == -1) {
  3435. rtw_free_xmitframe(pxmitpriv, pxmitframe);
  3436. DBG_COUNTER(padapter->tx_logs.core_tx_err_brtx);
  3437. return -1;
  3438. }
  3439. }
  3440. #endif /* CONFIG_BR_EXT */
  3441. res = update_attrib(padapter, *ppkt, &pxmitframe->attrib);
  3442. #ifdef CONFIG_MCC_MODE
  3443. /* record data kernel TX to driver to check MCC concurrent TX */
  3444. rtw_hal_mcc_calc_tx_bytes_from_kernel(padapter, pxmitframe->attrib.pktlen);
  3445. #endif /* CONFIG_MCC_MODE */
  3446. #ifdef CONFIG_WAPI_SUPPORT
  3447. if (pxmitframe->attrib.ether_type != 0x88B4) {
  3448. if (rtw_wapi_drop_for_key_absent(padapter, pxmitframe->attrib.ra)) {
  3449. WAPI_TRACE(WAPI_RX, "drop for key absend when tx\n");
  3450. res = _FAIL;
  3451. }
  3452. }
  3453. #endif
  3454. if (res == _FAIL) {
  3455. /*RTW_INFO("%s-"ADPT_FMT" update attrib fail\n", __func__, ADPT_ARG(padapter));*/
  3456. #ifdef DBG_TX_DROP_FRAME
  3457. RTW_INFO("DBG_TX_DROP_FRAME %s update attrib fail\n", __FUNCTION__);
  3458. #endif
  3459. rtw_free_xmitframe(pxmitpriv, pxmitframe);
  3460. return -1;
  3461. }
  3462. pxmitframe->pkt = *ppkt;
  3463. rtw_led_control(padapter, LED_CTL_TX);
  3464. do_queue_select(padapter, &pxmitframe->attrib);
  3465. #ifdef CONFIG_AP_MODE
  3466. _enter_critical_bh(&pxmitpriv->lock, &irqL0);
  3467. if (xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe) == _TRUE) {
  3468. _exit_critical_bh(&pxmitpriv->lock, &irqL0);
  3469. DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue);
  3470. return 1;
  3471. }
  3472. _exit_critical_bh(&pxmitpriv->lock, &irqL0);
  3473. #endif
  3474. /* pre_xmitframe */
  3475. if (rtw_hal_xmit(padapter, pxmitframe) == _FALSE)
  3476. return 1;
  3477. return 0;
  3478. }
  3479. #ifdef CONFIG_TDLS
  3480. sint xmitframe_enqueue_for_tdls_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe)
  3481. {
  3482. sint ret = _FALSE;
  3483. _irqL irqL;
  3484. struct sta_info *ptdls_sta = NULL;
  3485. struct sta_priv *pstapriv = &padapter->stapriv;
  3486. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  3487. struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
  3488. int i;
  3489. ptdls_sta = rtw_get_stainfo(pstapriv, pattrib->dst);
  3490. if (ptdls_sta == NULL)
  3491. return ret;
  3492. else if (ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) {
  3493. if (pattrib->triggered == 1) {
  3494. ret = _TRUE;
  3495. return ret;
  3496. }
  3497. _enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL);
  3498. if (ptdls_sta->state & WIFI_SLEEP_STATE) {
  3499. rtw_list_delete(&pxmitframe->list);
  3500. /* _enter_critical_bh(&psta->sleep_q.lock, &irqL); */
  3501. rtw_list_insert_tail(&pxmitframe->list, get_list_head(&ptdls_sta->sleep_q));
  3502. ptdls_sta->sleepq_len++;
  3503. ptdls_sta->sleepq_ac_len++;
  3504. /* indicate 4-AC queue bit in TDLS peer traffic indication */
  3505. switch (pattrib->priority) {
  3506. case 1:
  3507. case 2:
  3508. ptdls_sta->uapsd_bk |= BIT(1);
  3509. break;
  3510. case 4:
  3511. case 5:
  3512. ptdls_sta->uapsd_vi |= BIT(1);
  3513. break;
  3514. case 6:
  3515. case 7:
  3516. ptdls_sta->uapsd_vo |= BIT(1);
  3517. break;
  3518. case 0:
  3519. case 3:
  3520. default:
  3521. ptdls_sta->uapsd_be |= BIT(1);
  3522. break;
  3523. }
  3524. /* Transmit TDLS PTI via AP */
  3525. if (ptdls_sta->sleepq_len == 1)
  3526. rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_ISSUE_PTI);
  3527. ret = _TRUE;
  3528. }
  3529. _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL);
  3530. }
  3531. return ret;
  3532. }
  3533. #endif /* CONFIG_TDLS */
  3534. #define RTW_HIQ_FILTER_ALLOW_ALL 0
  3535. #define RTW_HIQ_FILTER_ALLOW_SPECIAL 1
  3536. #define RTW_HIQ_FILTER_DENY_ALL 2
  3537. inline bool xmitframe_hiq_filter(struct xmit_frame *xmitframe)
  3538. {
  3539. bool allow = _FALSE;
  3540. _adapter *adapter = xmitframe->padapter;
  3541. struct registry_priv *registry = &adapter->registrypriv;
  3542. if (rtw_get_intf_type(adapter) != RTW_PCIE) {
  3543. if (adapter->registrypriv.wifi_spec == 1)
  3544. allow = _TRUE;
  3545. else if (registry->hiq_filter == RTW_HIQ_FILTER_ALLOW_SPECIAL) {
  3546. struct pkt_attrib *attrib = &xmitframe->attrib;
  3547. if (attrib->ether_type == 0x0806
  3548. || attrib->ether_type == 0x888e
  3549. #ifdef CONFIG_WAPI_SUPPORT
  3550. || attrib->ether_type == 0x88B4
  3551. #endif
  3552. || attrib->dhcp_pkt
  3553. ) {
  3554. if (0)
  3555. RTW_INFO(FUNC_ADPT_FMT" ether_type:0x%04x%s\n", FUNC_ADPT_ARG(xmitframe->padapter)
  3556. , attrib->ether_type, attrib->dhcp_pkt ? " DHCP" : "");
  3557. allow = _TRUE;
  3558. }
  3559. } else if (registry->hiq_filter == RTW_HIQ_FILTER_ALLOW_ALL)
  3560. allow = _TRUE;
  3561. else if (registry->hiq_filter == RTW_HIQ_FILTER_DENY_ALL) {
  3562. } else
  3563. rtw_warn_on(1);
  3564. }
  3565. return allow;
  3566. }
  3567. #if defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS)
  3568. sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe)
  3569. {
  3570. _irqL irqL;
  3571. sint ret = _FALSE;
  3572. struct sta_info *psta = NULL;
  3573. struct sta_priv *pstapriv = &padapter->stapriv;
  3574. struct pkt_attrib *pattrib = &pxmitframe->attrib;
  3575. struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
  3576. sint bmcst = IS_MCAST(pattrib->ra);
  3577. bool update_tim = _FALSE;
  3578. #ifdef CONFIG_TDLS
  3579. if (padapter->tdlsinfo.link_established == _TRUE)
  3580. ret = xmitframe_enqueue_for_tdls_sleeping_sta(padapter, pxmitframe);
  3581. #endif /* CONFIG_TDLS */
  3582. if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _FALSE) {
  3583. DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_fwstate);
  3584. return ret;
  3585. }
  3586. /*
  3587. if(pattrib->psta)
  3588. {
  3589. psta = pattrib->psta;
  3590. }
  3591. else
  3592. {
  3593. RTW_INFO("%s, call rtw_get_stainfo()\n", __func__);
  3594. psta=rtw_get_stainfo(pstapriv, pattrib->ra);
  3595. }
  3596. */
  3597. psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
  3598. if (pattrib->psta != psta) {
  3599. DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_sta);
  3600. RTW_INFO("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
  3601. return _FALSE;
  3602. }
  3603. if (psta == NULL) {
  3604. DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_nosta);
  3605. RTW_INFO("%s, psta==NUL\n", __func__);
  3606. return _FALSE;
  3607. }
  3608. if (!(psta->state & _FW_LINKED)) {
  3609. DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_link);
  3610. RTW_INFO("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
  3611. return _FALSE;
  3612. }
  3613. if (pattrib->triggered == 1) {
  3614. DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_trigger);
  3615. /* RTW_INFO("directly xmit pspoll_triggered packet\n"); */
  3616. /* pattrib->triggered=0; */
  3617. if (bmcst && xmitframe_hiq_filter(pxmitframe) == _TRUE)
  3618. pattrib->qsel = QSLT_HIGH;/* HIQ */
  3619. return ret;
  3620. }
  3621. if (bmcst) {
  3622. _enter_critical_bh(&psta->sleep_q.lock, &irqL);
  3623. if (pstapriv->sta_dz_bitmap) { /* if anyone sta is in ps mode */
  3624. /* pattrib->qsel = QSLT_HIGH; */ /* HIQ */
  3625. rtw_list_delete(&pxmitframe->list);
  3626. /*_enter_critical_bh(&psta->sleep_q.lock, &irqL);*/
  3627. rtw_list_insert_tail(&pxmitframe->list, get_list_head(&psta->sleep_q));
  3628. psta->sleepq_len++;
  3629. if (!(pstapriv->tim_bitmap & BIT(0)))
  3630. update_tim = _TRUE;
  3631. pstapriv->tim_bitmap |= BIT(0);
  3632. pstapriv->sta_dz_bitmap |= BIT(0);
  3633. /* RTW_INFO("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap); */
  3634. if (update_tim == _TRUE) {
  3635. if (is_broadcast_mac_addr(pattrib->ra))
  3636. _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer BC");
  3637. else
  3638. _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer MC");
  3639. } else
  3640. chk_bmc_sleepq_cmd(padapter);
  3641. /*_exit_critical_bh(&psta->sleep_q.lock, &irqL);*/
  3642. ret = _TRUE;
  3643. DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_mcast);
  3644. }
  3645. _exit_critical_bh(&psta->sleep_q.lock, &irqL);
  3646. return ret;
  3647. }
  3648. _enter_critical_bh(&psta->sleep_q.lock, &irqL);
  3649. if (psta->state & WIFI_SLEEP_STATE) {
  3650. u8 wmmps_ac = 0;
  3651. if (pstapriv->sta_dz_bitmap & BIT(psta->aid)) {
  3652. rtw_list_delete(&pxmitframe->list);
  3653. /* _enter_critical_bh(&psta->sleep_q.lock, &irqL); */
  3654. rtw_list_insert_tail(&pxmitframe->list, get_list_head(&psta->sleep_q));
  3655. psta->sleepq_len++;
  3656. switch (pattrib->priority) {
  3657. case 1:
  3658. case 2:
  3659. wmmps_ac = psta->uapsd_bk & BIT(0);
  3660. break;
  3661. case 4:
  3662. case 5:
  3663. wmmps_ac = psta->uapsd_vi & BIT(0);
  3664. break;
  3665. case 6:
  3666. case 7:
  3667. wmmps_ac = psta->uapsd_vo & BIT(0);
  3668. break;
  3669. case 0:
  3670. case 3:
  3671. default:
  3672. wmmps_ac = psta->uapsd_be & BIT(0);
  3673. break;
  3674. }
  3675. if (wmmps_ac)
  3676. psta->sleepq_ac_len++;
  3677. if (((psta->has_legacy_ac) && (!wmmps_ac)) || ((!psta->has_legacy_ac) && (wmmps_ac))) {
  3678. if (!(pstapriv->tim_bitmap & BIT(psta->aid)))
  3679. update_tim = _TRUE;
  3680. pstapriv->tim_bitmap |= BIT(psta->aid);
  3681. /* RTW_INFO("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap); */
  3682. if (update_tim == _TRUE) {
  3683. /* RTW_INFO("sleepq_len==1, update BCNTIM\n"); */
  3684. /* upate BCN for TIM IE */
  3685. _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer UC");
  3686. }
  3687. }
  3688. /* _exit_critical_bh(&psta->sleep_q.lock, &irqL); */
  3689. /* if(psta->sleepq_len > (NR_XMITFRAME>>3)) */
  3690. /* { */
  3691. /* wakeup_sta_to_xmit(padapter, psta); */
  3692. /* } */
  3693. ret = _TRUE;
  3694. DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_ucast);
  3695. }
  3696. }
  3697. _exit_critical_bh(&psta->sleep_q.lock, &irqL);
  3698. return ret;
  3699. }
  3700. static void dequeue_xmitframes_to_sleeping_queue(_adapter *padapter, struct sta_info *psta, _queue *pframequeue)
  3701. {
  3702. sint ret;
  3703. _list *plist, *phead;
  3704. u8 ac_index;
  3705. struct tx_servq *ptxservq;
  3706. struct pkt_attrib *pattrib;
  3707. struct xmit_frame *pxmitframe;
  3708. struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits;
  3709. phead = get_list_head(pframequeue);
  3710. plist = get_next(phead);
  3711. while (rtw_end_of_queue_search(phead, plist) == _FALSE) {
  3712. pxmitframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
  3713. plist = get_next(plist);
  3714. pattrib = &pxmitframe->attrib;
  3715. pattrib->triggered = 0;
  3716. ret = xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe);
  3717. if (_TRUE == ret) {
  3718. ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index));
  3719. ptxservq->qcnt--;
  3720. phwxmits[ac_index].accnt--;
  3721. } else {
  3722. /* RTW_INFO("xmitframe_enqueue_for_sleeping_sta return _FALSE\n"); */
  3723. }
  3724. }
  3725. }
  3726. void stop_sta_xmit(_adapter *padapter, struct sta_info *psta)
  3727. {
  3728. _irqL irqL0;
  3729. struct sta_info *psta_bmc;
  3730. struct sta_xmit_priv *pstaxmitpriv;
  3731. struct sta_priv *pstapriv = &padapter->stapriv;
  3732. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  3733. pstaxmitpriv = &psta->sta_xmitpriv;
  3734. /* for BC/MC Frames */
  3735. psta_bmc = rtw_get_bcmc_stainfo(padapter);
  3736. _enter_critical_bh(&pxmitpriv->lock, &irqL0);
  3737. psta->state |= WIFI_SLEEP_STATE;
  3738. #ifdef CONFIG_TDLS
  3739. if (!(psta->tdls_sta_state & TDLS_LINKED_STATE))
  3740. #endif /* CONFIG_TDLS */
  3741. pstapriv->sta_dz_bitmap |= BIT(psta->aid);
  3742. dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->vo_q.sta_pending);
  3743. rtw_list_delete(&(pstaxmitpriv->vo_q.tx_pending));
  3744. dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->vi_q.sta_pending);
  3745. rtw_list_delete(&(pstaxmitpriv->vi_q.tx_pending));
  3746. dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->be_q.sta_pending);
  3747. rtw_list_delete(&(pstaxmitpriv->be_q.tx_pending));
  3748. dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->bk_q.sta_pending);
  3749. rtw_list_delete(&(pstaxmitpriv->bk_q.tx_pending));
  3750. #ifdef CONFIG_TDLS
  3751. if (!(psta->tdls_sta_state & TDLS_LINKED_STATE) && (psta_bmc != NULL)) {
  3752. #endif /* CONFIG_TDLS */
  3753. /* for BC/MC Frames */
  3754. pstaxmitpriv = &psta_bmc->sta_xmitpriv;
  3755. dequeue_xmitframes_to_sleeping_queue(padapter, psta_bmc, &pstaxmitpriv->be_q.sta_pending);
  3756. rtw_list_delete(&(pstaxmitpriv->be_q.tx_pending));
  3757. #ifdef CONFIG_TDLS
  3758. }
  3759. #endif /* CONFIG_TDLS */
  3760. _exit_critical_bh(&pxmitpriv->lock, &irqL0);
  3761. }
  3762. void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta)
  3763. {
  3764. _irqL irqL;
  3765. u8 update_mask = 0, wmmps_ac = 0;
  3766. struct sta_info *psta_bmc;
  3767. _list *xmitframe_plist, *xmitframe_phead;
  3768. struct xmit_frame *pxmitframe = NULL;
  3769. struct sta_priv *pstapriv = &padapter->stapriv;
  3770. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  3771. psta_bmc = rtw_get_bcmc_stainfo(padapter);
  3772. /* _enter_critical_bh(&psta->sleep_q.lock, &irqL); */
  3773. _enter_critical_bh(&pxmitpriv->lock, &irqL);
  3774. xmitframe_phead = get_list_head(&psta->sleep_q);
  3775. xmitframe_plist = get_next(xmitframe_phead);
  3776. while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) {
  3777. pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
  3778. xmitframe_plist = get_next(xmitframe_plist);
  3779. rtw_list_delete(&pxmitframe->list);
  3780. switch (pxmitframe->attrib.priority) {
  3781. case 1:
  3782. case 2:
  3783. wmmps_ac = psta->uapsd_bk & BIT(1);
  3784. break;
  3785. case 4:
  3786. case 5:
  3787. wmmps_ac = psta->uapsd_vi & BIT(1);
  3788. break;
  3789. case 6:
  3790. case 7:
  3791. wmmps_ac = psta->uapsd_vo & BIT(1);
  3792. break;
  3793. case 0:
  3794. case 3:
  3795. default:
  3796. wmmps_ac = psta->uapsd_be & BIT(1);
  3797. break;
  3798. }
  3799. psta->sleepq_len--;
  3800. if (psta->sleepq_len > 0)
  3801. pxmitframe->attrib.mdata = 1;
  3802. else
  3803. pxmitframe->attrib.mdata = 0;
  3804. if (wmmps_ac) {
  3805. psta->sleepq_ac_len--;
  3806. if (psta->sleepq_ac_len > 0) {
  3807. pxmitframe->attrib.mdata = 1;
  3808. pxmitframe->attrib.eosp = 0;
  3809. } else {
  3810. pxmitframe->attrib.mdata = 0;
  3811. pxmitframe->attrib.eosp = 1;
  3812. }
  3813. }
  3814. pxmitframe->attrib.triggered = 1;
  3815. /*
  3816. _exit_critical_bh(&psta->sleep_q.lock, &irqL);
  3817. if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)
  3818. {
  3819. rtw_os_xmit_complete(padapter, pxmitframe);
  3820. }
  3821. _enter_critical_bh(&psta->sleep_q.lock, &irqL);
  3822. */
  3823. rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
  3824. }
  3825. if (psta->sleepq_len == 0) {
  3826. #ifdef CONFIG_TDLS
  3827. if (psta->tdls_sta_state & TDLS_LINKED_STATE) {
  3828. if (psta->state & WIFI_SLEEP_STATE)
  3829. psta->state ^= WIFI_SLEEP_STATE;
  3830. _exit_critical_bh(&pxmitpriv->lock, &irqL);
  3831. return;
  3832. }
  3833. #endif /* CONFIG_TDLS */
  3834. if (pstapriv->tim_bitmap & BIT(psta->aid)) {
  3835. /* RTW_INFO("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap); */
  3836. /* upate BCN for TIM IE */
  3837. /* update_BCNTIM(padapter); */
  3838. update_mask = BIT(0);
  3839. }
  3840. pstapriv->tim_bitmap &= ~BIT(psta->aid);
  3841. if (psta->state & WIFI_SLEEP_STATE)
  3842. psta->state ^= WIFI_SLEEP_STATE;
  3843. if (psta->state & WIFI_STA_ALIVE_CHK_STATE) {
  3844. RTW_INFO("%s alive check\n", __func__);
  3845. psta->expire_to = pstapriv->expire_to;
  3846. psta->state ^= WIFI_STA_ALIVE_CHK_STATE;
  3847. }
  3848. pstapriv->sta_dz_bitmap &= ~BIT(psta->aid);
  3849. }
  3850. /* for BC/MC Frames */
  3851. if (!psta_bmc)
  3852. goto _exit;
  3853. if ((pstapriv->sta_dz_bitmap & 0xfffe) == 0x0) { /* no any sta in ps mode */
  3854. xmitframe_phead = get_list_head(&psta_bmc->sleep_q);
  3855. xmitframe_plist = get_next(xmitframe_phead);
  3856. while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) {
  3857. pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
  3858. xmitframe_plist = get_next(xmitframe_plist);
  3859. rtw_list_delete(&pxmitframe->list);
  3860. psta_bmc->sleepq_len--;
  3861. if (psta_bmc->sleepq_len > 0)
  3862. pxmitframe->attrib.mdata = 1;
  3863. else
  3864. pxmitframe->attrib.mdata = 0;
  3865. pxmitframe->attrib.triggered = 1;
  3866. /*
  3867. _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
  3868. if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)
  3869. {
  3870. rtw_os_xmit_complete(padapter, pxmitframe);
  3871. }
  3872. _enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
  3873. */
  3874. rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
  3875. }
  3876. if (psta_bmc->sleepq_len == 0) {
  3877. if (pstapriv->tim_bitmap & BIT(0)) {
  3878. /* RTW_INFO("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap); */
  3879. /* upate BCN for TIM IE */
  3880. /* update_BCNTIM(padapter); */
  3881. update_mask |= BIT(1);
  3882. }
  3883. pstapriv->tim_bitmap &= ~BIT(0);
  3884. pstapriv->sta_dz_bitmap &= ~BIT(0);
  3885. }
  3886. }
  3887. _exit:
  3888. /* _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL); */
  3889. _exit_critical_bh(&pxmitpriv->lock, &irqL);
  3890. if (update_mask) {
  3891. /* update_BCNTIM(padapter); */
  3892. if ((update_mask & (BIT(0) | BIT(1))) == (BIT(0) | BIT(1)))
  3893. _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "clear UC&BMC");
  3894. else if ((update_mask & BIT(1)) == BIT(1))
  3895. _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "clear BMC");
  3896. else
  3897. _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "clear UC");
  3898. }
  3899. }
  3900. void xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta)
  3901. {
  3902. _irqL irqL;
  3903. u8 wmmps_ac = 0;
  3904. _list *xmitframe_plist, *xmitframe_phead;
  3905. struct xmit_frame *pxmitframe = NULL;
  3906. struct sta_priv *pstapriv = &padapter->stapriv;
  3907. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  3908. /* _enter_critical_bh(&psta->sleep_q.lock, &irqL); */
  3909. _enter_critical_bh(&pxmitpriv->lock, &irqL);
  3910. xmitframe_phead = get_list_head(&psta->sleep_q);
  3911. xmitframe_plist = get_next(xmitframe_phead);
  3912. while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE) {
  3913. pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
  3914. xmitframe_plist = get_next(xmitframe_plist);
  3915. switch (pxmitframe->attrib.priority) {
  3916. case 1:
  3917. case 2:
  3918. wmmps_ac = psta->uapsd_bk & BIT(1);
  3919. break;
  3920. case 4:
  3921. case 5:
  3922. wmmps_ac = psta->uapsd_vi & BIT(1);
  3923. break;
  3924. case 6:
  3925. case 7:
  3926. wmmps_ac = psta->uapsd_vo & BIT(1);
  3927. break;
  3928. case 0:
  3929. case 3:
  3930. default:
  3931. wmmps_ac = psta->uapsd_be & BIT(1);
  3932. break;
  3933. }
  3934. if (!wmmps_ac)
  3935. continue;
  3936. rtw_list_delete(&pxmitframe->list);
  3937. psta->sleepq_len--;
  3938. psta->sleepq_ac_len--;
  3939. if (psta->sleepq_ac_len > 0) {
  3940. pxmitframe->attrib.mdata = 1;
  3941. pxmitframe->attrib.eosp = 0;
  3942. } else {
  3943. pxmitframe->attrib.mdata = 0;
  3944. pxmitframe->attrib.eosp = 1;
  3945. }
  3946. pxmitframe->attrib.triggered = 1;
  3947. rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
  3948. if ((psta->sleepq_ac_len == 0) && (!psta->has_legacy_ac) && (wmmps_ac)) {
  3949. #ifdef CONFIG_TDLS
  3950. if (psta->tdls_sta_state & TDLS_LINKED_STATE) {
  3951. /* _exit_critical_bh(&psta->sleep_q.lock, &irqL); */
  3952. goto exit;
  3953. }
  3954. #endif /* CONFIG_TDLS */
  3955. pstapriv->tim_bitmap &= ~BIT(psta->aid);
  3956. /* RTW_INFO("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap); */
  3957. /* upate BCN for TIM IE */
  3958. /* update_BCNTIM(padapter); */
  3959. update_beacon(padapter, _TIM_IE_, NULL, _TRUE);
  3960. /* update_mask = BIT(0); */
  3961. }
  3962. }
  3963. exit:
  3964. /* _exit_critical_bh(&psta->sleep_q.lock, &irqL); */
  3965. _exit_critical_bh(&pxmitpriv->lock, &irqL);
  3966. return;
  3967. }
  3968. #endif /* defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS) */
  3969. #ifdef CONFIG_XMIT_THREAD_MODE
  3970. void enqueue_pending_xmitbuf(
  3971. struct xmit_priv *pxmitpriv,
  3972. struct xmit_buf *pxmitbuf)
  3973. {
  3974. _irqL irql;
  3975. _queue *pqueue;
  3976. _adapter *pri_adapter = pxmitpriv->adapter;
  3977. pqueue = &pxmitpriv->pending_xmitbuf_queue;
  3978. _enter_critical_bh(&pqueue->lock, &irql);
  3979. rtw_list_delete(&pxmitbuf->list);
  3980. rtw_list_insert_tail(&pxmitbuf->list, get_list_head(pqueue));
  3981. _exit_critical_bh(&pqueue->lock, &irql);
  3982. #if defined(CONFIG_SDIO_HCI) && defined(CONFIG_CONCURRENT_MODE)
  3983. pri_adapter = GET_PRIMARY_ADAPTER(pri_adapter);
  3984. #endif /*SDIO_HCI + CONCURRENT*/
  3985. _rtw_up_sema(&(pri_adapter->xmitpriv.xmit_sema));
  3986. }
  3987. void enqueue_pending_xmitbuf_to_head(
  3988. struct xmit_priv *pxmitpriv,
  3989. struct xmit_buf *pxmitbuf)
  3990. {
  3991. _irqL irql;
  3992. _queue *pqueue = &pxmitpriv->pending_xmitbuf_queue;
  3993. _enter_critical_bh(&pqueue->lock, &irql);
  3994. rtw_list_delete(&pxmitbuf->list);
  3995. rtw_list_insert_head(&pxmitbuf->list, get_list_head(pqueue));
  3996. _exit_critical_bh(&pqueue->lock, &irql);
  3997. }
  3998. struct xmit_buf *dequeue_pending_xmitbuf(
  3999. struct xmit_priv *pxmitpriv)
  4000. {
  4001. _irqL irql;
  4002. struct xmit_buf *pxmitbuf;
  4003. _queue *pqueue;
  4004. pxmitbuf = NULL;
  4005. pqueue = &pxmitpriv->pending_xmitbuf_queue;
  4006. _enter_critical_bh(&pqueue->lock, &irql);
  4007. if (_rtw_queue_empty(pqueue) == _FALSE) {
  4008. _list *plist, *phead;
  4009. phead = get_list_head(pqueue);
  4010. plist = get_next(phead);
  4011. pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);
  4012. rtw_list_delete(&pxmitbuf->list);
  4013. }
  4014. _exit_critical_bh(&pqueue->lock, &irql);
  4015. return pxmitbuf;
  4016. }
  4017. static struct xmit_buf *dequeue_pending_xmitbuf_under_survey(
  4018. struct xmit_priv *pxmitpriv)
  4019. {
  4020. _irqL irql;
  4021. struct xmit_buf *pxmitbuf;
  4022. #ifdef CONFIG_USB_HCI
  4023. struct xmit_frame *pxmitframe;
  4024. #endif
  4025. _queue *pqueue;
  4026. pxmitbuf = NULL;
  4027. pqueue = &pxmitpriv->pending_xmitbuf_queue;
  4028. _enter_critical_bh(&pqueue->lock, &irql);
  4029. if (_rtw_queue_empty(pqueue) == _FALSE) {
  4030. _list *plist, *phead;
  4031. u8 type = 0;
  4032. phead = get_list_head(pqueue);
  4033. plist = phead;
  4034. do {
  4035. plist = get_next(plist);
  4036. if (plist == phead)
  4037. break;
  4038. pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);
  4039. #ifdef CONFIG_USB_HCI
  4040. pxmitframe = (struct xmit_frame *)pxmitbuf->priv_data;
  4041. if (pxmitframe)
  4042. type = get_frame_sub_type(pxmitbuf->pbuf + TXDESC_SIZE + pxmitframe->pkt_offset * PACKET_OFFSET_SZ);
  4043. else
  4044. RTW_INFO("%s, !!!ERROR!!! For USB, TODO ITEM\n", __FUNCTION__);
  4045. #else
  4046. type = get_frame_sub_type(pxmitbuf->pbuf + TXDESC_OFFSET);
  4047. #endif
  4048. if ((type == WIFI_PROBEREQ) ||
  4049. (type == WIFI_DATA_NULL) ||
  4050. (type == WIFI_QOS_DATA_NULL)) {
  4051. rtw_list_delete(&pxmitbuf->list);
  4052. break;
  4053. }
  4054. pxmitbuf = NULL;
  4055. } while (1);
  4056. }
  4057. _exit_critical_bh(&pqueue->lock, &irql);
  4058. return pxmitbuf;
  4059. }
  4060. static struct xmit_buf *dequeue_pending_xmitbuf_ext(
  4061. struct xmit_priv *pxmitpriv)
  4062. {
  4063. _irqL irql;
  4064. struct xmit_buf *pxmitbuf;
  4065. _queue *pqueue;
  4066. pxmitbuf = NULL;
  4067. pqueue = &pxmitpriv->pending_xmitbuf_queue;
  4068. _enter_critical_bh(&pqueue->lock, &irql);
  4069. if (_rtw_queue_empty(pqueue) == _FALSE) {
  4070. _list *plist, *phead;
  4071. u8 type = 0;
  4072. phead = get_list_head(pqueue);
  4073. plist = phead;
  4074. do {
  4075. plist = get_next(plist);
  4076. if (plist == phead)
  4077. break;
  4078. pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);
  4079. if (pxmitbuf->buf_tag == XMITBUF_MGNT) {
  4080. rtw_list_delete(&pxmitbuf->list);
  4081. break;
  4082. }
  4083. pxmitbuf = NULL;
  4084. } while (1);
  4085. }
  4086. _exit_critical_bh(&pqueue->lock, &irql);
  4087. return pxmitbuf;
  4088. }
  4089. struct xmit_buf *select_and_dequeue_pending_xmitbuf(_adapter *padapter)
  4090. {
  4091. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  4092. struct xmit_buf *pxmitbuf = NULL;
  4093. if (_TRUE == rtw_is_xmit_blocked(padapter))
  4094. return pxmitbuf;
  4095. if (rtw_xmit_ac_blocked(padapter) == _TRUE)
  4096. pxmitbuf = dequeue_pending_xmitbuf_under_survey(pxmitpriv);
  4097. else {
  4098. pxmitbuf = dequeue_pending_xmitbuf_ext(pxmitpriv);
  4099. if (pxmitbuf == NULL)
  4100. pxmitbuf = dequeue_pending_xmitbuf(pxmitpriv);
  4101. }
  4102. return pxmitbuf;
  4103. }
  4104. sint check_pending_xmitbuf(
  4105. struct xmit_priv *pxmitpriv)
  4106. {
  4107. _irqL irql;
  4108. _queue *pqueue;
  4109. sint ret = _FALSE;
  4110. pqueue = &pxmitpriv->pending_xmitbuf_queue;
  4111. _enter_critical_bh(&pqueue->lock, &irql);
  4112. if (_rtw_queue_empty(pqueue) == _FALSE)
  4113. ret = _TRUE;
  4114. _exit_critical_bh(&pqueue->lock, &irql);
  4115. return ret;
  4116. }
  4117. thread_return rtw_xmit_thread(thread_context context)
  4118. {
  4119. s32 err;
  4120. PADAPTER padapter;
  4121. err = _SUCCESS;
  4122. padapter = (PADAPTER)context;
  4123. thread_enter("RTW_XMIT_THREAD");
  4124. padapter->xmitpriv.stop_req = 0;
  4125. do {
  4126. err = rtw_hal_xmit_thread_handler(padapter);
  4127. flush_signals_thread();
  4128. } while (_SUCCESS == err);
  4129. /*_rtw_up_sema(&padapter->xmitpriv.terminate_xmitthread_sema);*/
  4130. thread_exit(&padapter->xmitpriv.xmitthread_comp);
  4131. return 0;
  4132. }
  4133. #endif
  4134. #ifdef DBG_XMIT_BLOCK
  4135. void dump_xmit_block(void *sel, _adapter *padapter)
  4136. {
  4137. struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
  4138. RTW_PRINT_SEL(sel, "[XMIT-BLOCK] xmit_block :0x%02x\n", dvobj->xmit_block);
  4139. if (dvobj->xmit_block & XMIT_BLOCK_REDLMEM)
  4140. RTW_PRINT_SEL(sel, "Reason:%s\n", "XMIT_BLOCK_REDLMEM");
  4141. if (dvobj->xmit_block & XMIT_BLOCK_SUSPEND)
  4142. RTW_PRINT_SEL(sel, "Reason:%s\n", "XMIT_BLOCK_SUSPEND");
  4143. if (dvobj->xmit_block == XMIT_BLOCK_NONE)
  4144. RTW_PRINT_SEL(sel, "Reason:%s\n", "XMIT_BLOCK_NONE");
  4145. }
  4146. void dump_xmit_block_info(void *sel, const char *fun_name, _adapter *padapter)
  4147. {
  4148. struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
  4149. RTW_INFO("\n"ADPT_FMT" call %s\n", ADPT_ARG(padapter), fun_name);
  4150. dump_xmit_block(sel, padapter);
  4151. }
  4152. #define DBG_XMIT_BLOCK_DUMP(adapter) dump_xmit_block_info(RTW_DBGDUMP, __func__, adapter)
  4153. #endif
  4154. void rtw_set_xmit_block(_adapter *padapter, enum XMIT_BLOCK_REASON reason)
  4155. {
  4156. _irqL irqL;
  4157. struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
  4158. _enter_critical_bh(&dvobj->xmit_block_lock, &irqL);
  4159. dvobj->xmit_block |= reason;
  4160. _exit_critical_bh(&dvobj->xmit_block_lock, &irqL);
  4161. #ifdef DBG_XMIT_BLOCK
  4162. DBG_XMIT_BLOCK_DUMP(padapter);
  4163. #endif
  4164. }
  4165. void rtw_clr_xmit_block(_adapter *padapter, enum XMIT_BLOCK_REASON reason)
  4166. {
  4167. _irqL irqL;
  4168. struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
  4169. _enter_critical_bh(&dvobj->xmit_block_lock, &irqL);
  4170. dvobj->xmit_block &= ~reason;
  4171. _exit_critical_bh(&dvobj->xmit_block_lock, &irqL);
  4172. #ifdef DBG_XMIT_BLOCK
  4173. DBG_XMIT_BLOCK_DUMP(padapter);
  4174. #endif
  4175. }
  4176. bool rtw_is_xmit_blocked(_adapter *padapter)
  4177. {
  4178. struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
  4179. #ifdef DBG_XMIT_BLOCK
  4180. DBG_XMIT_BLOCK_DUMP(padapter);
  4181. #endif
  4182. return ((dvobj->xmit_block) ? _TRUE : _FALSE);
  4183. }
  4184. bool rtw_xmit_ac_blocked(_adapter *adapter)
  4185. {
  4186. struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
  4187. _adapter *iface;
  4188. struct mlme_ext_priv *mlmeext;
  4189. struct mlme_ext_info *mlmeextinfo;
  4190. bool blocked = _FALSE;
  4191. int i;
  4192. for (i = 0; i < dvobj->iface_nums; i++) {
  4193. iface = dvobj->padapters[i];
  4194. mlmeext = &iface->mlmeextpriv;
  4195. /* check scan state */
  4196. if (mlmeext_scan_state(mlmeext) != SCAN_DISABLE
  4197. && mlmeext_scan_state(mlmeext) != SCAN_BACK_OP
  4198. ) {
  4199. blocked = _TRUE;
  4200. goto exit;
  4201. }
  4202. if (mlmeext_scan_state(mlmeext) == SCAN_BACK_OP
  4203. && !mlmeext_chk_scan_backop_flags(mlmeext, SS_BACKOP_TX_RESUME)
  4204. ) {
  4205. blocked = _TRUE;
  4206. goto exit;
  4207. }
  4208. }
  4209. #ifdef CONFIG_MCC_MODE
  4210. if (MCC_EN(adapter)) {
  4211. if (rtw_hal_check_mcc_status(adapter, MCC_STATUS_DOING_MCC)) {
  4212. if (MCC_STOP(adapter)) {
  4213. blocked = _TRUE;
  4214. goto exit;
  4215. }
  4216. }
  4217. }
  4218. #endif /* CONFIG_MCC_MODE */
  4219. exit:
  4220. return blocked;
  4221. }
  4222. #ifdef CONFIG_TX_AMSDU
  4223. void rtw_amsdu_vo_timeout_handler(void *FunctionContext)
  4224. {
  4225. _adapter *adapter = (_adapter *)FunctionContext;
  4226. adapter->xmitpriv.amsdu_vo_timeout = RTW_AMSDU_TIMER_TIMEOUT;
  4227. tasklet_hi_schedule(&adapter->xmitpriv.xmit_tasklet);
  4228. }
  4229. void rtw_amsdu_vi_timeout_handler(void *FunctionContext)
  4230. {
  4231. _adapter *adapter = (_adapter *)FunctionContext;
  4232. adapter->xmitpriv.amsdu_vi_timeout = RTW_AMSDU_TIMER_TIMEOUT;
  4233. tasklet_hi_schedule(&adapter->xmitpriv.xmit_tasklet);
  4234. }
  4235. void rtw_amsdu_be_timeout_handler(void *FunctionContext)
  4236. {
  4237. _adapter *adapter = (_adapter *)FunctionContext;
  4238. adapter->xmitpriv.amsdu_be_timeout = RTW_AMSDU_TIMER_TIMEOUT;
  4239. if (printk_ratelimit())
  4240. RTW_INFO("%s Timeout!\n",__FUNCTION__);
  4241. tasklet_hi_schedule(&adapter->xmitpriv.xmit_tasklet);
  4242. }
  4243. void rtw_amsdu_bk_timeout_handler(void *FunctionContext)
  4244. {
  4245. _adapter *adapter = (_adapter *)FunctionContext;
  4246. adapter->xmitpriv.amsdu_bk_timeout = RTW_AMSDU_TIMER_TIMEOUT;
  4247. tasklet_hi_schedule(&adapter->xmitpriv.xmit_tasklet);
  4248. }
  4249. u8 rtw_amsdu_get_timer_status(_adapter *padapter, u8 priority)
  4250. {
  4251. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  4252. u8 status = RTW_AMSDU_TIMER_UNSET;
  4253. switch(priority)
  4254. {
  4255. case 1:
  4256. case 2:
  4257. status = pxmitpriv->amsdu_bk_timeout;
  4258. break;
  4259. case 4:
  4260. case 5:
  4261. status = pxmitpriv->amsdu_vi_timeout;
  4262. break;
  4263. case 6:
  4264. case 7:
  4265. status = pxmitpriv->amsdu_vo_timeout;
  4266. break;
  4267. case 0:
  4268. case 3:
  4269. default:
  4270. status = pxmitpriv->amsdu_be_timeout;
  4271. break;
  4272. }
  4273. return status;
  4274. }
  4275. void rtw_amsdu_set_timer_status(_adapter *padapter, u8 priority, u8 status)
  4276. {
  4277. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  4278. switch(priority)
  4279. {
  4280. case 1:
  4281. case 2:
  4282. pxmitpriv->amsdu_bk_timeout = status;
  4283. break;
  4284. case 4:
  4285. case 5:
  4286. pxmitpriv->amsdu_vi_timeout = status;
  4287. break;
  4288. case 6:
  4289. case 7:
  4290. pxmitpriv->amsdu_vo_timeout = status;
  4291. break;
  4292. case 0:
  4293. case 3:
  4294. default:
  4295. pxmitpriv->amsdu_be_timeout = status;
  4296. break;
  4297. }
  4298. }
  4299. void rtw_amsdu_set_timer(_adapter *padapter, u8 priority)
  4300. {
  4301. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  4302. _timer* amsdu_timer = NULL;
  4303. switch(priority)
  4304. {
  4305. case 1:
  4306. case 2:
  4307. amsdu_timer = &pxmitpriv->amsdu_bk_timer;
  4308. break;
  4309. case 4:
  4310. case 5:
  4311. amsdu_timer = &pxmitpriv->amsdu_vi_timer;
  4312. break;
  4313. case 6:
  4314. case 7:
  4315. amsdu_timer = &pxmitpriv->amsdu_vo_timer;
  4316. break;
  4317. case 0:
  4318. case 3:
  4319. default:
  4320. amsdu_timer = &pxmitpriv->amsdu_be_timer;
  4321. break;
  4322. }
  4323. _set_timer(amsdu_timer, 1);
  4324. }
  4325. void rtw_amsdu_cancel_timer(_adapter *padapter, u8 priority)
  4326. {
  4327. struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
  4328. _timer* amsdu_timer = NULL;
  4329. switch(priority)
  4330. {
  4331. case 1:
  4332. case 2:
  4333. amsdu_timer = &pxmitpriv->amsdu_bk_timer;
  4334. break;
  4335. case 4:
  4336. case 5:
  4337. amsdu_timer = &pxmitpriv->amsdu_vi_timer;
  4338. break;
  4339. case 6:
  4340. case 7:
  4341. amsdu_timer = &pxmitpriv->amsdu_vo_timer;
  4342. break;
  4343. case 0:
  4344. case 3:
  4345. default:
  4346. amsdu_timer = &pxmitpriv->amsdu_be_timer;
  4347. break;
  4348. }
  4349. _cancel_timer_ex(amsdu_timer);
  4350. }
  4351. #endif /* CONFIG_TX_AMSDU */
  4352. void rtw_sctx_init(struct submit_ctx *sctx, int timeout_ms)
  4353. {
  4354. sctx->timeout_ms = timeout_ms;
  4355. sctx->submit_time = rtw_get_current_time();
  4356. #ifdef PLATFORM_LINUX /* TODO: add condition wating interface for other os */
  4357. init_completion(&sctx->done);
  4358. #endif
  4359. sctx->status = RTW_SCTX_SUBMITTED;
  4360. }
  4361. int rtw_sctx_wait(struct submit_ctx *sctx, const char *msg)
  4362. {
  4363. int ret = _FAIL;
  4364. unsigned long expire;
  4365. int status = 0;
  4366. #ifdef PLATFORM_LINUX
  4367. expire = sctx->timeout_ms ? msecs_to_jiffies(sctx->timeout_ms) : MAX_SCHEDULE_TIMEOUT;
  4368. if (!wait_for_completion_timeout(&sctx->done, expire)) {
  4369. /* timeout, do something?? */
  4370. status = RTW_SCTX_DONE_TIMEOUT;
  4371. RTW_INFO("%s timeout: %s\n", __func__, msg);
  4372. } else
  4373. status = sctx->status;
  4374. #endif
  4375. if (status == RTW_SCTX_DONE_SUCCESS)
  4376. ret = _SUCCESS;
  4377. return ret;
  4378. }
  4379. bool rtw_sctx_chk_waring_status(int status)
  4380. {
  4381. switch (status) {
  4382. case RTW_SCTX_DONE_UNKNOWN:
  4383. case RTW_SCTX_DONE_BUF_ALLOC:
  4384. case RTW_SCTX_DONE_BUF_FREE:
  4385. case RTW_SCTX_DONE_DRV_STOP:
  4386. case RTW_SCTX_DONE_DEV_REMOVE:
  4387. return _TRUE;
  4388. default:
  4389. return _FALSE;
  4390. }
  4391. }
  4392. void rtw_sctx_done_err(struct submit_ctx **sctx, int status)
  4393. {
  4394. if (*sctx) {
  4395. if (rtw_sctx_chk_waring_status(status))
  4396. RTW_INFO("%s status:%d\n", __func__, status);
  4397. (*sctx)->status = status;
  4398. #ifdef PLATFORM_LINUX
  4399. complete(&((*sctx)->done));
  4400. #endif
  4401. *sctx = NULL;
  4402. }
  4403. }
  4404. void rtw_sctx_done(struct submit_ctx **sctx)
  4405. {
  4406. rtw_sctx_done_err(sctx, RTW_SCTX_DONE_SUCCESS);
  4407. }
  4408. #ifdef CONFIG_XMIT_ACK
  4409. int rtw_ack_tx_wait(struct xmit_priv *pxmitpriv, u32 timeout_ms)
  4410. {
  4411. struct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops;
  4412. pack_tx_ops->submit_time = rtw_get_current_time();
  4413. pack_tx_ops->timeout_ms = timeout_ms;
  4414. pack_tx_ops->status = RTW_SCTX_SUBMITTED;
  4415. return rtw_sctx_wait(pack_tx_ops, __func__);
  4416. }
  4417. void rtw_ack_tx_done(struct xmit_priv *pxmitpriv, int status)
  4418. {
  4419. struct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops;
  4420. if (pxmitpriv->ack_tx)
  4421. rtw_sctx_done_err(&pack_tx_ops, status);
  4422. else
  4423. RTW_INFO("%s ack_tx not set\n", __func__);
  4424. }
  4425. #endif /* CONFIG_XMIT_ACK */