0018-Backport-mac80211-from-Barrier-Breaker-r41029.patch 508 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540954195429543954495459546954795489549955095519552955395549555955695579558955995609561956295639564956595669567956895699570957195729573957495759576957795789579958095819582958395849585958695879588958995909591959295939594959595969597959895999600960196029603960496059606960796089609961096119612961396149615961696179618961996209621962296239624962596269627962896299630963196329633963496359636963796389639964096419642964396449645964696479648964996509651965296539654965596569657965896599660966196629663966496659666966796689669967096719672967396749675967696779678967996809681968296839684968596869687968896899690969196929693969496959696969796989699970097019702970397049705970697079708970997109711971297139714971597169717971897199720972197229723972497259726972797289729973097319732973397349735973697379738973997409741974297439744974597469747974897499750975197529753975497559756975797589759976097619762976397649765976697679768976997709771977297739774977597769777977897799780978197829783978497859786978797889789979097919792979397949795979697979798979998009801980298039804980598069807980898099810981198129813981498159816981798189819982098219822982398249825982698279828982998309831983298339834983598369837983898399840984198429843984498459846984798489849985098519852985398549855985698579858985998609861986298639864986598669867986898699870987198729873987498759876987798789879988098819882988398849885988698879888988998909891989298939894989598969897989898999900990199029903990499059906990799089909991099119912991399149915991699179918991999209921992299239924992599269927992899299930993199329933993499359936993799389939994099419942994399449945994699479948994999509951995299539954995599569957995899599960996199629963996499659966996799689969997099719972997399749975997699779978997999809981998299839984998599869987998899899990999199929993999499959996999799989999100001000110002100031000410005100061000710008100091001010011100121001310014100151001610017100181001910020100211002210023100241002510026100271002810029100301003110032100331003410035100361003710038100391004010041100421004310044100451004610047100481004910050100511005210053100541005510056100571005810059100601006110062100631006410065100661006710068100691007010071100721007310074100751007610077100781007910080100811008210083100841008510086100871008810089100901009110092100931009410095100961009710098100991010010101101021010310104101051010610107101081010910110101111011210113101141011510116101171011810119101201012110122101231012410125101261012710128101291013010131101321013310134101351013610137101381013910140101411014210143101441014510146101471014810149101501015110152101531015410155101561015710158101591016010161101621016310164101651016610167101681016910170101711017210173101741017510176101771017810179101801018110182101831018410185101861018710188101891019010191101921019310194101951019610197101981019910200102011020210203102041020510206102071020810209102101021110212102131021410215102161021710218102191022010221102221022310224102251022610227102281022910230102311023210233102341023510236102371023810239102401024110242102431024410245102461024710248102491025010251102521025310254102551025610257102581025910260102611026210263102641026510266102671026810269102701027110272102731027410275102761027710278102791028010281102821028310284102851028610287102881028910290102911029210293102941029510296102971029810299103001030110302103031030410305103061030710308103091031010311103121031310314103151031610317103181031910320103211032210323103241032510326103271032810329103301033110332103331033410335103361033710338103391034010341103421034310344103451034610347103481034910350103511035210353103541035510356103571035810359103601036110362103631036410365103661036710368103691037010371103721037310374103751037610377103781037910380103811038210383103841038510386103871038810389103901039110392103931039410395103961039710398103991040010401104021040310404104051040610407104081040910410104111041210413104141041510416104171041810419104201042110422104231042410425104261042710428104291043010431104321043310434104351043610437104381043910440104411044210443104441044510446104471044810449104501045110452104531045410455104561045710458104591046010461104621046310464104651046610467104681046910470104711047210473104741047510476104771047810479104801048110482104831048410485104861048710488104891049010491104921049310494104951049610497104981049910500105011050210503105041050510506105071050810509105101051110512105131051410515105161051710518105191052010521105221052310524105251052610527105281052910530105311053210533105341053510536105371053810539105401054110542105431054410545105461054710548105491055010551105521055310554105551055610557105581055910560105611056210563105641056510566105671056810569105701057110572105731057410575105761057710578105791058010581105821058310584105851058610587105881058910590105911059210593105941059510596105971059810599106001060110602106031060410605106061060710608106091061010611106121061310614106151061610617106181061910620106211062210623106241062510626106271062810629106301063110632106331063410635106361063710638106391064010641106421064310644106451064610647106481064910650106511065210653106541065510656106571065810659106601066110662106631066410665106661066710668106691067010671106721067310674106751067610677106781067910680106811068210683106841068510686106871068810689106901069110692106931069410695106961069710698106991070010701107021070310704107051070610707107081070910710107111071210713107141071510716107171071810719107201072110722107231072410725107261072710728107291073010731107321073310734107351073610737107381073910740107411074210743107441074510746107471074810749107501075110752107531075410755107561075710758107591076010761107621076310764107651076610767107681076910770107711077210773107741077510776107771077810779107801078110782107831078410785107861078710788107891079010791107921079310794107951079610797107981079910800108011080210803108041080510806108071080810809108101081110812108131081410815108161081710818108191082010821108221082310824108251082610827108281082910830108311083210833108341083510836108371083810839108401084110842108431084410845108461084710848108491085010851108521085310854108551085610857108581085910860108611086210863108641086510866108671086810869108701087110872108731087410875108761087710878108791088010881108821088310884108851088610887108881088910890108911089210893108941089510896108971089810899109001090110902109031090410905109061090710908109091091010911109121091310914109151091610917109181091910920109211092210923109241092510926109271092810929109301093110932109331093410935109361093710938109391094010941109421094310944109451094610947109481094910950109511095210953109541095510956109571095810959109601096110962109631096410965109661096710968109691097010971109721097310974109751097610977109781097910980109811098210983109841098510986109871098810989109901099110992109931099410995109961099710998109991100011001110021100311004110051100611007110081100911010110111101211013110141101511016110171101811019110201102111022110231102411025110261102711028110291103011031110321103311034110351103611037110381103911040110411104211043110441104511046110471104811049110501105111052110531105411055110561105711058110591106011061110621106311064110651106611067110681106911070110711107211073110741107511076110771107811079110801108111082110831108411085110861108711088110891109011091110921109311094110951109611097110981109911100111011110211103111041110511106111071110811109111101111111112111131111411115111161111711118111191112011121111221112311124111251112611127111281112911130111311113211133111341113511136111371113811139111401114111142111431114411145111461114711148111491115011151111521115311154111551115611157111581115911160111611116211163111641116511166111671116811169111701117111172111731117411175111761117711178111791118011181111821118311184111851118611187111881118911190111911119211193111941119511196111971119811199112001120111202112031120411205112061120711208112091121011211112121121311214112151121611217112181121911220112211122211223112241122511226112271122811229112301123111232112331123411235112361123711238112391124011241112421124311244112451124611247112481124911250112511125211253112541125511256112571125811259112601126111262112631126411265112661126711268112691127011271112721127311274112751127611277112781127911280112811128211283112841128511286112871128811289112901129111292112931129411295112961129711298112991130011301113021130311304113051130611307113081130911310113111131211313113141131511316113171131811319113201132111322113231132411325113261132711328113291133011331113321133311334113351133611337113381133911340113411134211343113441134511346113471134811349113501135111352113531135411355113561135711358113591136011361113621136311364113651136611367113681136911370113711137211373113741137511376113771137811379113801138111382113831138411385113861138711388113891139011391113921139311394113951139611397113981139911400114011140211403114041140511406114071140811409114101141111412114131141411415114161141711418114191142011421114221142311424114251142611427114281142911430114311143211433114341143511436114371143811439114401144111442114431144411445114461144711448114491145011451114521145311454114551145611457114581145911460114611146211463114641146511466114671146811469114701147111472114731147411475114761147711478114791148011481114821148311484114851148611487114881148911490114911149211493114941149511496114971149811499115001150111502115031150411505115061150711508115091151011511115121151311514115151151611517115181151911520115211152211523115241152511526115271152811529115301153111532115331153411535115361153711538115391154011541115421154311544115451154611547115481154911550115511155211553115541155511556115571155811559115601156111562115631156411565115661156711568115691157011571115721157311574115751157611577115781157911580115811158211583115841158511586115871158811589115901159111592115931159411595115961159711598115991160011601116021160311604116051160611607116081160911610116111161211613116141161511616116171161811619116201162111622116231162411625116261162711628116291163011631116321163311634116351163611637116381163911640116411164211643116441164511646116471164811649116501165111652116531165411655116561165711658116591166011661116621166311664116651166611667116681166911670116711167211673116741167511676116771167811679116801168111682116831168411685116861168711688116891169011691116921169311694116951169611697116981169911700117011170211703117041170511706117071170811709117101171111712117131171411715117161171711718117191172011721117221172311724117251172611727117281172911730117311173211733117341173511736117371173811739117401174111742117431174411745117461174711748117491175011751117521175311754117551175611757117581175911760117611176211763117641176511766117671176811769117701177111772117731177411775117761177711778117791178011781117821178311784117851178611787117881178911790117911179211793117941179511796117971179811799118001180111802118031180411805118061180711808118091181011811118121181311814118151181611817118181181911820118211182211823118241182511826118271182811829118301183111832118331183411835118361183711838118391184011841118421184311844118451184611847118481184911850118511185211853118541185511856118571185811859118601186111862118631186411865118661186711868118691187011871118721187311874118751187611877118781187911880118811188211883118841188511886118871188811889118901189111892118931189411895118961189711898118991190011901119021190311904119051190611907119081190911910119111191211913119141191511916119171191811919119201192111922119231192411925119261192711928119291193011931119321193311934119351193611937119381193911940119411194211943119441194511946119471194811949119501195111952119531195411955119561195711958119591196011961119621196311964119651196611967119681196911970119711197211973119741197511976119771197811979119801198111982119831198411985119861198711988119891199011991119921199311994119951199611997119981199912000120011200212003120041200512006120071200812009120101201112012120131201412015120161201712018120191202012021120221202312024120251202612027120281202912030120311203212033120341203512036120371203812039120401204112042120431204412045120461204712048120491205012051120521205312054120551205612057120581205912060120611206212063120641206512066120671206812069120701207112072120731207412075120761207712078120791208012081120821208312084120851208612087120881208912090120911209212093120941209512096120971209812099121001210112102121031210412105121061210712108121091211012111121121211312114121151211612117121181211912120121211212212123121241212512126121271212812129121301213112132121331213412135121361213712138121391214012141121421214312144121451214612147121481214912150121511215212153121541215512156121571215812159121601216112162121631216412165121661216712168121691217012171121721217312174121751217612177121781217912180121811218212183121841218512186121871218812189121901219112192121931219412195121961219712198121991220012201122021220312204122051220612207122081220912210122111221212213122141221512216122171221812219122201222112222122231222412225122261222712228122291223012231122321223312234122351223612237122381223912240122411224212243122441224512246122471224812249122501225112252122531225412255122561225712258122591226012261122621226312264122651226612267122681226912270122711227212273122741227512276122771227812279122801228112282122831228412285122861228712288122891229012291122921229312294122951229612297122981229912300123011230212303123041230512306123071230812309123101231112312123131231412315123161231712318123191232012321123221232312324123251232612327123281232912330123311233212333123341233512336123371233812339123401234112342123431234412345123461234712348123491235012351123521235312354123551235612357123581235912360123611236212363123641236512366123671236812369123701237112372123731237412375123761237712378123791238012381123821238312384123851238612387123881238912390123911239212393123941239512396123971239812399124001240112402124031240412405124061240712408124091241012411124121241312414124151241612417124181241912420124211242212423124241242512426124271242812429124301243112432124331243412435124361243712438124391244012441124421244312444124451244612447124481244912450124511245212453124541245512456124571245812459124601246112462124631246412465124661246712468124691247012471124721247312474124751247612477124781247912480124811248212483124841248512486124871248812489124901249112492124931249412495124961249712498124991250012501125021250312504125051250612507125081250912510125111251212513125141251512516125171251812519125201252112522125231252412525125261252712528125291253012531125321253312534125351253612537125381253912540125411254212543125441254512546125471254812549125501255112552125531255412555125561255712558125591256012561125621256312564125651256612567125681256912570125711257212573125741257512576125771257812579125801258112582125831258412585125861258712588125891259012591125921259312594125951259612597125981259912600126011260212603126041260512606126071260812609126101261112612126131261412615126161261712618126191262012621126221262312624126251262612627126281262912630126311263212633126341263512636126371263812639126401264112642126431264412645126461264712648126491265012651126521265312654126551265612657126581265912660126611266212663126641266512666126671266812669126701267112672126731267412675126761267712678126791268012681126821268312684126851268612687126881268912690126911269212693126941269512696126971269812699127001270112702127031270412705127061270712708127091271012711127121271312714127151271612717127181271912720127211272212723127241272512726127271272812729127301273112732127331273412735127361273712738127391274012741127421274312744127451274612747127481274912750127511275212753127541275512756127571275812759127601276112762127631276412765127661276712768127691277012771127721277312774127751277612777127781277912780127811278212783127841278512786127871278812789127901279112792127931279412795127961279712798127991280012801128021280312804128051280612807128081280912810128111281212813128141281512816128171281812819128201282112822128231282412825128261282712828128291283012831128321283312834128351283612837128381283912840128411284212843128441284512846128471284812849128501285112852128531285412855128561285712858128591286012861128621286312864128651286612867128681286912870128711287212873128741287512876128771287812879128801288112882128831288412885128861288712888128891289012891128921289312894128951289612897128981289912900129011290212903129041290512906129071290812909129101291112912129131291412915129161291712918129191292012921129221292312924129251292612927129281292912930129311293212933129341293512936129371293812939129401294112942129431294412945129461294712948129491295012951129521295312954129551295612957129581295912960129611296212963129641296512966129671296812969129701297112972129731297412975129761297712978129791298012981129821298312984129851298612987129881298912990129911299212993129941299512996129971299812999130001300113002130031300413005130061300713008130091301013011130121301313014130151301613017130181301913020130211302213023130241302513026130271302813029130301303113032130331303413035130361303713038130391304013041130421304313044130451304613047130481304913050130511305213053130541305513056130571305813059130601306113062130631306413065130661306713068130691307013071130721307313074130751307613077130781307913080130811308213083130841308513086130871308813089130901309113092130931309413095130961309713098130991310013101131021310313104131051310613107131081310913110131111311213113131141311513116131171311813119131201312113122131231312413125131261312713128131291313013131131321313313134131351313613137131381313913140131411314213143131441314513146131471314813149131501315113152131531315413155131561315713158131591316013161131621316313164131651316613167131681316913170131711317213173131741317513176131771317813179131801318113182131831318413185131861318713188131891319013191131921319313194131951319613197131981319913200132011320213203132041320513206132071320813209132101321113212132131321413215132161321713218132191322013221132221322313224132251322613227132281322913230132311323213233132341323513236132371323813239132401324113242132431324413245132461324713248132491325013251132521325313254132551325613257132581325913260132611326213263132641326513266132671326813269132701327113272132731327413275132761327713278132791328013281132821328313284132851328613287132881328913290132911329213293132941329513296132971329813299133001330113302133031330413305133061330713308133091331013311133121331313314133151331613317133181331913320133211332213323133241332513326133271332813329133301333113332133331333413335133361333713338133391334013341133421334313344133451334613347133481334913350133511335213353133541335513356133571335813359133601336113362133631336413365133661336713368133691337013371133721337313374133751337613377133781337913380133811338213383133841338513386133871338813389133901339113392133931339413395133961339713398133991340013401134021340313404134051340613407134081340913410134111341213413134141341513416134171341813419134201342113422134231342413425134261342713428134291343013431134321343313434134351343613437134381343913440134411344213443134441344513446134471344813449134501345113452134531345413455134561345713458134591346013461134621346313464134651346613467134681346913470134711347213473134741347513476134771347813479134801348113482134831348413485134861348713488134891349013491134921349313494134951349613497134981349913500135011350213503135041350513506135071350813509135101351113512135131351413515135161351713518135191352013521135221352313524135251352613527135281352913530135311353213533135341353513536135371353813539135401354113542135431354413545135461354713548135491355013551135521355313554135551355613557135581355913560135611356213563135641356513566135671356813569135701357113572135731357413575135761357713578135791358013581135821358313584135851358613587135881358913590135911359213593135941359513596135971359813599136001360113602136031360413605136061360713608136091361013611136121361313614136151361613617136181361913620136211362213623136241362513626136271362813629136301363113632136331363413635136361363713638136391364013641136421364313644136451364613647136481364913650136511365213653136541365513656136571365813659136601366113662136631366413665136661366713668136691367013671136721367313674136751367613677136781367913680136811368213683136841368513686136871368813689136901369113692136931369413695136961369713698136991370013701137021370313704137051370613707137081370913710137111371213713137141371513716137171371813719137201372113722137231372413725137261372713728137291373013731137321373313734137351373613737137381373913740137411374213743137441374513746137471374813749137501375113752137531375413755137561375713758137591376013761137621376313764137651376613767137681376913770137711377213773137741377513776137771377813779137801378113782137831378413785137861378713788137891379013791137921379313794137951379613797137981379913800138011380213803138041380513806138071380813809138101381113812138131381413815138161381713818138191382013821138221382313824138251382613827138281382913830138311383213833138341383513836138371383813839138401384113842138431384413845138461384713848138491385013851138521385313854138551385613857138581385913860138611386213863138641386513866138671386813869138701387113872138731387413875138761387713878138791388013881138821388313884138851388613887138881388913890138911389213893138941389513896138971389813899139001390113902139031390413905139061390713908139091391013911139121391313914139151391613917139181391913920139211392213923139241392513926139271392813929139301393113932139331393413935139361393713938139391394013941139421394313944139451394613947139481394913950139511395213953139541395513956139571395813959139601396113962139631396413965139661396713968139691397013971139721397313974139751397613977139781397913980139811398213983139841398513986139871398813989139901399113992139931399413995139961399713998139991400014001140021400314004140051400614007140081400914010140111401214013140141401514016140171401814019140201402114022140231402414025140261402714028140291403014031140321403314034140351403614037140381403914040140411404214043140441404514046140471404814049140501405114052140531405414055140561405714058140591406014061140621406314064140651406614067140681406914070140711407214073140741407514076140771407814079140801408114082140831408414085140861408714088140891409014091140921409314094140951409614097140981409914100141011410214103141041410514106141071410814109141101411114112141131411414115141161411714118141191412014121141221412314124141251412614127141281412914130141311413214133141341413514136141371413814139141401414114142141431414414145141461414714148141491415014151141521415314154141551415614157141581415914160141611416214163141641416514166141671416814169141701417114172141731417414175141761417714178141791418014181141821418314184141851418614187141881418914190141911419214193141941419514196141971419814199142001420114202142031420414205142061420714208142091421014211142121421314214142151421614217142181421914220142211422214223142241422514226142271422814229142301423114232142331423414235142361423714238142391424014241142421424314244142451424614247142481424914250142511425214253142541425514256142571425814259142601426114262142631426414265142661426714268142691427014271142721427314274142751427614277142781427914280142811428214283142841428514286142871428814289142901429114292142931429414295142961429714298142991430014301143021430314304143051430614307143081430914310143111431214313143141431514316143171431814319143201432114322143231432414325143261432714328143291433014331143321433314334143351433614337143381433914340143411434214343143441434514346143471434814349143501435114352143531435414355143561435714358143591436014361143621436314364143651436614367143681436914370143711437214373143741437514376143771437814379143801438114382143831438414385143861438714388143891439014391143921439314394143951439614397143981439914400144011440214403144041440514406144071440814409144101441114412144131441414415144161441714418144191442014421144221442314424144251442614427144281442914430144311443214433144341443514436144371443814439144401444114442144431444414445144461444714448144491445014451144521445314454144551445614457144581445914460144611446214463144641446514466144671446814469144701447114472144731447414475144761447714478144791448014481144821448314484144851448614487144881448914490144911449214493144941449514496144971449814499145001450114502145031450414505145061450714508145091451014511145121451314514145151451614517145181451914520145211452214523145241452514526145271452814529145301453114532145331453414535145361453714538145391454014541145421454314544145451454614547145481454914550145511455214553145541455514556145571455814559145601456114562145631456414565145661456714568145691457014571145721457314574145751457614577145781457914580145811458214583145841458514586145871458814589145901459114592145931459414595145961459714598145991460014601146021460314604146051460614607146081460914610146111461214613146141461514616146171461814619146201462114622146231462414625146261462714628146291463014631146321463314634146351463614637146381463914640146411464214643146441464514646146471464814649146501465114652146531465414655146561465714658146591466014661146621466314664146651466614667146681466914670146711467214673146741467514676146771467814679146801468114682146831468414685146861468714688146891469014691146921469314694146951469614697146981469914700147011470214703147041470514706147071470814709147101471114712147131471414715147161471714718147191472014721147221472314724147251472614727147281472914730147311473214733147341473514736147371473814739147401474114742147431474414745147461474714748147491475014751147521475314754147551475614757147581475914760147611476214763147641476514766147671476814769147701477114772147731477414775147761477714778147791478014781147821478314784147851478614787147881478914790147911479214793147941479514796147971479814799148001480114802148031480414805148061480714808148091481014811148121481314814148151481614817148181481914820148211482214823
  1. From: Matthias Schiffer <mschiffer@universe-factory.net>
  2. Date: Mon, 19 May 2014 15:59:37 +0200
  3. Subject: Backport mac80211 from Barrier Breaker (r41029)
  4. diff --git a/package/mac80211/Makefile b/package/mac80211/Makefile
  5. index 9a7093c..c286b0f 100644
  6. --- a/package/mac80211/Makefile
  7. +++ b/package/mac80211/Makefile
  8. @@ -1,5 +1,5 @@
  9. #
  10. -# Copyright (C) 2007-2013 OpenWrt.org
  11. +# Copyright (C) 2007-2014 OpenWrt.org
  12. #
  13. # This is free software, licensed under the GNU General Public License v2.
  14. # See /LICENSE for more information.
  15. @@ -10,11 +10,11 @@ include $(INCLUDE_DIR)/kernel.mk
  16. PKG_NAME:=mac80211
  17. -PKG_VERSION:=2014-01-23.1
  18. +PKG_VERSION:=2014-05-22
  19. PKG_RELEASE:=1
  20. PKG_SOURCE_URL:=http://mirror2.openwrt.org/sources
  21. PKG_BACKPORT_VERSION:=
  22. -PKG_MD5SUM:=8db16edbdaf4abc2e9c2f3b6c86736a6
  23. +PKG_MD5SUM:=367937d4f8c05cb36ca989ee26abc3df
  24. PKG_SOURCE:=compat-wireless-$(PKG_VERSION)$(PKG_BACKPORT_VERSION).tar.bz2
  25. PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/compat-wireless-$(PKG_VERSION)
  26. @@ -105,12 +105,12 @@ Generic IEEE 802.11 Networking Stack (mac80211)
  27. endef
  28. PKG_LINUX_FIRMWARE_NAME:=linux-firmware
  29. -PKG_LINUX_FIRMWARE_VERSION:=7d0c7a8cfd78388d90cc784a185b19dcbdbce824
  30. +PKG_LINUX_FIRMWARE_VERSION:=f8c22c692bdee57a20b092e647464ff6176df3ed
  31. PKG_LINUX_FIRMWARE_SOURCE:=$(PKG_LINUX_FIRMWARE_NAME)-$(PKG_LINUX_FIRMWARE_VERSION).tar.bz2
  32. PKG_LINUX_FIRMWARE_PROTO:=git
  33. PKG_LINUX_FIRMWARE_SOURCE_URL:=git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git
  34. PKG_LINUX_FIRMWARE_SUBDIR:=$(PKG_LINUX_FIRMWARE_NAME)-$(PKG_LINUX_FIRMWARE_VERSION)
  35. -PKG_LINUX_FIRMWARE_MIRROR_MD5SUM:=837a1a9456c1ec8b428cc0b2b08a331b
  36. +PKG_LINUX_FIRMWARE_MIRROR_MD5SUM:=e219333f01835c6e556875a9e0deb3f9
  37. define Download/linux-firmware
  38. FILE:=$(PKG_LINUX_FIRMWARE_SOURCE)
  39. @@ -124,7 +124,7 @@ endef
  40. $(eval $(call Download,linux-firmware))
  41. PKG_ATH10K_LINUX_FIRMWARE_NAME:=ath10k-firmware
  42. -PKG_ATH10K_LINUX_FIRMWARE_VERSION:=d86e78e5c6be34329936c8bd73a212700437be2e
  43. +PKG_ATH10K_LINUX_FIRMWARE_VERSION:=38eeda3ae6f90fde5546bdd48ee4ff3090f238c0
  44. PKG_ATH10K_LINUX_FIRMWARE_SOURCE:=$(PKG_ATH10K_LINUX_FIRMWARE_NAME)-$(PKG_ATH10K_LINUX_FIRMWARE_VERSION).tar.bz2
  45. PKG_ATH10K_LINUX_FIRMWARE_PROTO:=git
  46. PKG_ATH10K_LINUX_FIRMWARE_SOURCE_URL:=https://github.com/kvalo/ath10k-firmware.git
  47. @@ -363,8 +363,8 @@ define KernelPackage/rtl8180
  48. $(call KernelPackage/rtl818x/Default)
  49. DEPENDS+= @PCI_SUPPORT
  50. TITLE+= (RTL8180 PCI)
  51. - FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rtl818x/rtl8180/rtl8180.ko
  52. - AUTOLOAD:=$(call AutoLoad,27,rtl8180)
  53. + FILES:=$(PKG_BUILD_DIR)/drivers/net/wireless/rtl818x/rtl8180/rtl818x_pci.ko
  54. + AUTOLOAD:=$(call AutoLoad,27,rtl818x_pci)
  55. endef
  56. define KernelPackage/rtl8187
  57. @@ -606,6 +606,19 @@ Atheros IEEE 802.11ac family of chipsets. For now only
  58. PCI is supported.
  59. endef
  60. +define KernelPackage/ath10k/config
  61. + if PACKAGE_kmod-ath10k
  62. +
  63. + config ATH10K_STA_FW
  64. + bool "Firmware optimized for STA operation"
  65. + default n
  66. + help
  67. + Use the ath10k firmware optimized for wireless client instead
  68. + of access point operation.
  69. +
  70. + endif
  71. +endef
  72. +
  73. define KernelPackage/carl9170
  74. $(call KernelPackage/mac80211/Default)
  75. TITLE:=Driver for Atheros AR9170 USB sticks
  76. @@ -844,6 +857,13 @@ define KernelPackage/iwlagn/config
  77. Download and install firmware for:
  78. Intel Centrino Advanced-N 6230, Wireless-N 1030, Wireless-N 130 and Advanced-N 6235
  79. + config IWL7260_FW
  80. + bool "Intel 7260 Firmware"
  81. + default y
  82. + help
  83. + Download and install firmware for:
  84. + Intel Dual Band Wireless-N 7260 and Intel Dual Band Wireless-AC 7260
  85. +
  86. config IWL100_FW
  87. bool "Intel 100 Firmware"
  88. default y
  89. @@ -1639,8 +1659,7 @@ define KernelPackage/wl18xx/install
  90. $(INSTALL_DIR) $(1)/lib/firmware/ti-connectivity
  91. $(INSTALL_DATA) \
  92. $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl18xx-conf.bin \
  93. - $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl18xx-fw.bin \
  94. - $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl18xx-fw-2.bin \
  95. + $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/ti-connectivity/wl18xx-fw-3.bin \
  96. $(1)/lib/firmware/ti-connectivity
  97. endef
  98. @@ -1664,10 +1683,19 @@ endef
  99. define KernelPackage/ath10k/install
  100. $(INSTALL_DIR) $(1)/lib/firmware/ath10k/QCA988X/hw2.0
  101. +ifeq ($(CONFIG_ATH10K_STA_FW),y)
  102. + $(INSTALL_DATA) \
  103. + $(PKG_BUILD_DIR)/$(PKG_ATH10K_LINUX_FIRMWARE_SUBDIR)/ath10k/QCA988X/hw2.0/board.bin \
  104. + $(1)/lib/firmware/ath10k/QCA988X/hw2.0/
  105. + $(INSTALL_DATA) \
  106. + $(PKG_BUILD_DIR)/$(PKG_ATH10K_LINUX_FIRMWARE_SUBDIR)/main/firmware-2.bin_999.999.0.636 \
  107. + $(1)/lib/firmware/ath10k/QCA988X/hw2.0/firmware-2.bin
  108. +else
  109. $(INSTALL_DATA) \
  110. $(PKG_BUILD_DIR)/$(PKG_ATH10K_LINUX_FIRMWARE_SUBDIR)/ath10k/QCA988X/hw2.0/board.bin \
  111. $(PKG_BUILD_DIR)/$(PKG_ATH10K_LINUX_FIRMWARE_SUBDIR)/ath10k/QCA988X/hw2.0/firmware-2.bin \
  112. $(1)/lib/firmware/ath10k/QCA988X/hw2.0/
  113. +endif
  114. endef
  115. define KernelPackage/mwl8k/install
  116. @@ -1714,6 +1742,9 @@ endif
  117. ifneq ($(CONFIG_IWL6030_FW),)
  118. $(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-6000g2b-6.ucode $(1)/lib/firmware
  119. endif
  120. +ifneq ($(CONFIG_IWL7260_FW),)
  121. + $(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-7260-7.ucode $(1)/lib/firmware
  122. +endif
  123. ifneq ($(CONFIG_IWL100_FW),)
  124. $(INSTALL_DATA) $(PKG_BUILD_DIR)/$(PKG_LINUX_FIRMWARE_SUBDIR)/iwlwifi-100-5.ucode $(1)/lib/firmware
  125. endif
  126. diff --git a/package/mac80211/files/regdb.txt b/package/mac80211/files/regdb.txt
  127. index 2badb21..fcab208 100644
  128. --- a/package/mac80211/files/regdb.txt
  129. +++ b/package/mac80211/files/regdb.txt
  130. @@ -1,211 +1,216 @@
  131. # This is the world regulatory domain
  132. country 00:
  133. - (2402 - 2472 @ 40), (3, 20)
  134. + (2402 - 2472 @ 40), (20)
  135. # Channel 12 - 13.
  136. - (2457 - 2482 @ 40), (3, 20), PASSIVE-SCAN, NO-IBSS
  137. + (2457 - 2482 @ 40), (20), NO-IR
  138. # Channel 14. Only JP enables this and for 802.11b only
  139. - (2474 - 2494 @ 20), (3, 20), PASSIVE-SCAN, NO-IBSS, NO-OFDM
  140. + (2474 - 2494 @ 20), (20), NO-IR
  141. # Channel 36 - 48
  142. - (5170 - 5250 @ 80), (3, 20)
  143. + (5170 - 5250 @ 80), (20), NO-IR
  144. # NB: 5260 MHz - 5700 MHz requies DFS
  145. # Channel 149 - 165
  146. - (5735 - 5835 @ 80), (3, 20), PASSIVE-SCAN, NO-IBSS
  147. + (5735 - 5835 @ 80), (20), NO-IR
  148. # IEEE 802.11ad (60GHz), channels 1..3
  149. - (57240 - 63720 @ 2160), (N/A, 0)
  150. + (57240 - 63720 @ 2160), (0)
  151. country AD:
  152. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  153. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  154. -
  155. -country AE:
  156. - (2402 - 2482 @ 40), (N/A, 20)
  157. - (5170 - 5250 @ 80), (3, 17)
  158. - (5250 - 5330 @ 80), (3, 24), DFS
  159. - (5490 - 5710 @ 80), (3, 24), DFS
  160. - (5735 - 5835 @ 80), (3, 30)
  161. -
  162. -country AL:
  163. - (2402 - 2482 @ 20), (N/A, 20)
  164. -
  165. -country AM:
  166. - (2402 - 2482 @ 40), (N/A, 20)
  167. - (5170 - 5250 @ 20), (N/A, 18)
  168. - (5250 - 5330 @ 20), (N/A, 18), DFS
  169. -
  170. -country AN:
  171. - (2402 - 2482 @ 40), (N/A, 20)
  172. - (5170 - 5250 @ 40), (N/A, 20)
  173. - (5250 - 5330 @ 40), (N/A, 20), DFS
  174. - (5490 - 5710 @ 40), (N/A, 27), DFS
  175. -
  176. -country AR:
  177. - (2402 - 2482 @ 40), (N/A, 20)
  178. - (5170 - 5250 @ 80), (3, 17)
  179. - (5250 - 5330 @ 80), (3, 24), DFS
  180. - (5490 - 5710 @ 80), (3, 24), DFS
  181. - (5735 - 5835 @ 80), (3, 30)
  182. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  183. +
  184. +country AE: DFS-FCC
  185. + (2402 - 2482 @ 40), (20)
  186. + (5170 - 5250 @ 80), (17)
  187. + (5250 - 5330 @ 80), (24), DFS
  188. + (5490 - 5730 @ 80), (24), DFS
  189. + (5735 - 5835 @ 80), (30)
  190. +
  191. +country AL: DFS-ETSI
  192. + (2402 - 2482 @ 40), (20)
  193. + (5170 - 5250 @ 80), (20.00)
  194. + (5250 - 5330 @ 80), (20.00), DFS
  195. + (5490 - 5710 @ 80), (27.00), DFS
  196. +
  197. +country AM: DFS-ETSI
  198. + (2402 - 2482 @ 40), (20)
  199. + (5170 - 5250 @ 80), (18)
  200. + (5250 - 5330 @ 80), (18), DFS
  201. +
  202. +country AN: DFS-ETSI
  203. + (2402 - 2482 @ 40), (20)
  204. + (5170 - 5250 @ 80), (20)
  205. + (5250 - 5330 @ 80), (20), DFS
  206. + (5490 - 5710 @ 80), (27), DFS
  207. +
  208. +country AR: DFS-FCC
  209. + (2402 - 2482 @ 40), (20)
  210. + (5170 - 5250 @ 80), (17)
  211. + (5250 - 5330 @ 80), (24), DFS
  212. + (5490 - 5730 @ 80), (24), DFS
  213. + (5735 - 5835 @ 80), (30)
  214. country AT: DFS-ETSI
  215. - (2402 - 2482 @ 40), (N/A, 20)
  216. - (5170 - 5250 @ 80), (N/A, 20)
  217. - (5250 - 5330 @ 80), (N/A, 20), DFS
  218. - (5490 - 5710 @ 80), (N/A, 27), DFS
  219. + (2402 - 2482 @ 40), (20)
  220. + (5170 - 5250 @ 80), (20)
  221. + (5250 - 5330 @ 80), (20), DFS
  222. + (5490 - 5710 @ 80), (27), DFS
  223. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  224. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  225. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  226. country AU:
  227. - (2402 - 2482 @ 40), (N/A, 20)
  228. - (5170 - 5250 @ 80), (3, 17)
  229. - (5250 - 5330 @ 80), (3, 24), DFS
  230. - (5490 - 5710 @ 80), (3, 24), DFS
  231. - (5735 - 5835 @ 80), (3, 30)
  232. -
  233. -country AW:
  234. - (2402 - 2482 @ 40), (N/A, 20)
  235. - (5170 - 5250 @ 40), (N/A, 20)
  236. - (5250 - 5330 @ 40), (N/A, 20), DFS
  237. - (5490 - 5710 @ 40), (N/A, 27), DFS
  238. -
  239. -country AZ:
  240. - (2402 - 2482 @ 40), (N/A, 20)
  241. - (5170 - 5250 @ 40), (N/A, 18)
  242. - (5250 - 5330 @ 40), (N/A, 18), DFS
  243. + (2402 - 2482 @ 40), (20)
  244. + (5170 - 5250 @ 80), (17)
  245. + (5250 - 5330 @ 80), (24), DFS
  246. + (5490 - 5710 @ 80), (24), DFS
  247. + (5735 - 5835 @ 80), (30)
  248. +
  249. +country AW: DFS-ETSI
  250. + (2402 - 2482 @ 40), (20)
  251. + (5170 - 5250 @ 80), (20)
  252. + (5250 - 5330 @ 80), (20), DFS
  253. + (5490 - 5710 @ 80), (27), DFS
  254. +
  255. +country AZ: DFS-ETSI
  256. + (2402 - 2482 @ 40), (20)
  257. + (5170 - 5250 @ 80), (18)
  258. + (5250 - 5330 @ 80), (18), DFS
  259. country BA: DFS-ETSI
  260. - (2402 - 2482 @ 40), (N/A, 20)
  261. - (5170 - 5250 @ 40), (N/A, 20)
  262. - (5250 - 5330 @ 40), (N/A, 20), DFS
  263. - (5490 - 5710 @ 40), (N/A, 27), DFS
  264. + (2402 - 2482 @ 40), (20)
  265. + (5170 - 5250 @ 80), (20)
  266. + (5250 - 5330 @ 80), (20), DFS
  267. + (5490 - 5710 @ 80), (27), DFS
  268. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  269. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  270. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  271. -country BB:
  272. - (2402 - 2482 @ 40), (N/A, 20)
  273. - (5170 - 5250 @ 40), (3, 23)
  274. - (5250 - 5330 @ 40), (3, 23), DFS
  275. - (5735 - 5835 @ 40), (3, 30)
  276. +country BB: DFS-FCC
  277. + (2402 - 2482 @ 40), (20)
  278. + (5170 - 5250 @ 80), (23)
  279. + (5250 - 5330 @ 80), (23), DFS
  280. + (5735 - 5835 @ 80), (30)
  281. -country BD:
  282. - (2402 - 2482 @ 40), (N/A, 20)
  283. +country BD: DFS-JP
  284. + (2402 - 2482 @ 40), (20)
  285. + (5735 - 5835 @ 80), (30)
  286. country BE: DFS-ETSI
  287. - (2402 - 2482 @ 40), (N/A, 20)
  288. - (5170 - 5250 @ 80), (N/A, 20)
  289. - (5250 - 5330 @ 80), (N/A, 20), DFS
  290. - (5490 - 5710 @ 80), (N/A, 27), DFS
  291. + (2402 - 2482 @ 40), (20)
  292. + (5170 - 5250 @ 80), (20)
  293. + (5250 - 5330 @ 80), (20), DFS
  294. + (5490 - 5710 @ 80), (27), DFS
  295. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  296. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  297. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  298. country BG: DFS-ETSI
  299. - (2402 - 2482 @ 40), (N/A, 20)
  300. - (5170 - 5250 @ 40), (N/A, 23)
  301. - (5250 - 5290 @ 40), (N/A, 23), DFS
  302. - (5490 - 5710 @ 40), (N/A, 30), DFS
  303. + (2402 - 2482 @ 40), (20)
  304. + (5170 - 5250 @ 80), (20)
  305. + (5250 - 5330 @ 80), (20), DFS
  306. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  307. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  308. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  309. -country BH:
  310. - (2402 - 2482 @ 40), (N/A, 20)
  311. - (5170 - 5250 @ 20), (N/A, 20)
  312. - (5250 - 5330 @ 20), (N/A, 20), DFS
  313. - (5735 - 5835 @ 20), (N/A, 20)
  314. +country BH: DFS-JP
  315. + (2402 - 2482 @ 40), (20)
  316. + (5170 - 5250 @ 80), (20)
  317. + (5250 - 5330 @ 80), (20), DFS
  318. + (5735 - 5835 @ 80), (20)
  319. country BL:
  320. - (2402 - 2482 @ 40), (N/A, 20)
  321. - (5170 - 5250 @ 40), (N/A, 18)
  322. - (5250 - 5330 @ 40), (N/A, 18), DFS
  323. -
  324. -country BN:
  325. - (2402 - 2482 @ 40), (N/A, 20)
  326. - (5170 - 5250 @ 40), (N/A, 20)
  327. - (5250 - 5330 @ 40), (N/A, 20), DFS
  328. - (5735 - 5835 @ 40), (N/A, 30)
  329. -
  330. -country BO:
  331. - (2402 - 2482 @ 40), (N/A, 30)
  332. - (5735 - 5835 @ 40), (N/A, 30)
  333. -
  334. -country BR:
  335. - (2402 - 2482 @ 40), (N/A, 20)
  336. - (5170 - 5250 @ 80), (3, 17)
  337. - (5250 - 5330 @ 80), (3, 24), DFS
  338. - (5490 - 5710 @ 80), (3, 24), DFS
  339. - (5735 - 5835 @ 80), (3, 30)
  340. -
  341. -country BY:
  342. - (2402 - 2482 @ 40), (N/A, 20)
  343. - (5170 - 5250 @ 40), (N/A, 20)
  344. - (5250 - 5330 @ 40), (N/A, 20), DFS
  345. - (5490 - 5710 @ 40), (N/A, 27), DFS
  346. -
  347. -country BZ:
  348. - (2402 - 2482 @ 40), (N/A, 30)
  349. - (5735 - 5835 @ 40), (N/A, 30)
  350. -
  351. -country CA:
  352. - (2402 - 2472 @ 40), (3, 27)
  353. - (5170 - 5250 @ 80), (3, 17)
  354. - (5250 - 5330 @ 80), (3, 24), DFS
  355. - (5490 - 5710 @ 80), (3, 24), DFS
  356. - (5735 - 5835 @ 80), (3, 30)
  357. + (2402 - 2482 @ 40), (20)
  358. + (5170 - 5250 @ 40), (18)
  359. + (5250 - 5330 @ 40), (18), DFS
  360. +
  361. +country BN: DFS-JP
  362. + (2402 - 2482 @ 40), (20)
  363. + (5170 - 5250 @ 80), (20)
  364. + (5250 - 5330 @ 80), (20), DFS
  365. + (5735 - 5835 @ 80), (20)
  366. +
  367. +country BO: DFS-JP
  368. + (2402 - 2482 @ 40), (30)
  369. + (5735 - 5835 @ 80), (30)
  370. +
  371. +country BR: DFS-FCC
  372. + (2402 - 2482 @ 40), (20)
  373. + (5170 - 5250 @ 80), (17)
  374. + (5250 - 5330 @ 80), (24), DFS
  375. + (5490 - 5730 @ 80), (24), DFS
  376. + (5735 - 5835 @ 80), (30)
  377. +
  378. +country BY: DFS-ETSI
  379. + (2402 - 2482 @ 40), (20)
  380. + (5170 - 5250 @ 80), (20)
  381. + (5250 - 5330 @ 80), (20), DFS
  382. + (5490 - 5710 @ 80), (27), DFS
  383. +
  384. +country BZ: DFS-JP
  385. + (2402 - 2482 @ 40), (30)
  386. + (5735 - 5835 @ 80), (30)
  387. +
  388. +country CA: DFS-FCC
  389. + (2402 - 2472 @ 40), (30)
  390. + (5170 - 5250 @ 80), (17)
  391. + (5250 - 5330 @ 80), (24), DFS
  392. + (5490 - 5730 @ 80), (24), DFS
  393. + (5735 - 5835 @ 80), (30)
  394. country CH: DFS-ETSI
  395. - (2402 - 2482 @ 40), (N/A, 20)
  396. - (5170 - 5250 @ 80), (N/A, 20)
  397. - (5250 - 5330 @ 80), (N/A, 20), DFS
  398. - (5490 - 5710 @ 80), (N/A, 27), DFS
  399. - # 60 gHz band channels 1-4, ref: Etsi En 302 567
  400. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  401. -
  402. -country CL:
  403. - (2402 - 2482 @ 40), (N/A, 20)
  404. - (5170 - 5250 @ 40), (N/A, 20)
  405. - (5250 - 5330 @ 40), (N/A, 20), DFS
  406. - (5735 - 5835 @ 40), (N/A, 20)
  407. -
  408. -country CN:
  409. - (2402 - 2482 @ 40), (N/A, 20)
  410. - (5735 - 5835 @ 80), (N/A, 30)
  411. + (2402 - 2482 @ 40), (20)
  412. + (5170 - 5250 @ 80), (20)
  413. + (5250 - 5330 @ 80), (20), DFS
  414. + (5490 - 5710 @ 80), (27), DFS
  415. + # 60 gHz band channels 1-4, ref: Etsi En 302 567
  416. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  417. +
  418. +country CL: DFS-JP
  419. + (2402 - 2482 @ 40), (20)
  420. + (5170 - 5250 @ 80), (20)
  421. + (5250 - 5330 @ 80), (20), DFS
  422. + (5735 - 5835 @ 80), (20)
  423. +
  424. +country CN: DFS-FCC
  425. + (2402 - 2482 @ 40), (20)
  426. + (5170 - 5250 @ 80), (23)
  427. + (5250 - 5330 @ 80), (23), DFS
  428. + (5735 - 5835 @ 80), (30)
  429. # 60 gHz band channels 1,4: 28dBm, channels 2,3: 44dBm
  430. # ref: http://www.miit.gov.cn/n11293472/n11505629/n11506593/n11960250/n11960606/n11960700/n12330791.files/n12330790.pdf
  431. - (57240 - 59400 @ 2160), (N/A, 28)
  432. - (59400 - 63720 @ 2160), (N/A, 44)
  433. - (63720 - 65880 @ 2160), (N/A, 28)
  434. -
  435. -country CO:
  436. - (2402 - 2472 @ 40), (3, 27)
  437. - (5170 - 5250 @ 80), (3, 17)
  438. - (5250 - 5330 @ 80), (3, 24), DFS
  439. - (5490 - 5710 @ 80), (3, 24), DFS
  440. - (5735 - 5835 @ 80), (3, 30)
  441. -
  442. -country CR:
  443. - (2402 - 2482 @ 40), (N/A, 20)
  444. - (5170 - 5250 @ 80), (3, 17)
  445. - (5250 - 5330 @ 80), (3, 24), DFS
  446. - (5490 - 5710 @ 80), (3, 24), DFS
  447. - (5735 - 5835 @ 80), (3, 30)
  448. + (57240 - 59400 @ 2160), (28)
  449. + (59400 - 63720 @ 2160), (44)
  450. + (63720 - 65880 @ 2160), (28)
  451. +
  452. +country CO: DFS-FCC
  453. + (2402 - 2482 @ 40), (20)
  454. + (5170 - 5250 @ 80), (17)
  455. + (5250 - 5330 @ 80), (24), DFS
  456. + (5490 - 5730 @ 80), (24), DFS
  457. + (5735 - 5835 @ 80), (30)
  458. +
  459. +country CR: DFS-FCC
  460. + (2402 - 2482 @ 40), (20)
  461. + (5170 - 5250 @ 80), (17)
  462. + (5250 - 5330 @ 80), (24), DFS
  463. + (5490 - 5730 @ 80), (24), DFS
  464. + (5735 - 5835 @ 80), (30)
  465. country CY: DFS-ETSI
  466. - (2402 - 2482 @ 40), (N/A, 20)
  467. - (5170 - 5250 @ 40), (N/A, 20)
  468. - (5250 - 5330 @ 40), (N/A, 20), DFS
  469. - (5490 - 5710 @ 40), (N/A, 27), DFS
  470. + (2402 - 2482 @ 40), (20)
  471. + (5170 - 5250 @ 80), (20)
  472. + (5250 - 5330 @ 80), (20), DFS
  473. + (5490 - 5710 @ 80), (27), DFS
  474. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  475. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  476. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  477. # Data from http://www.ctu.eu/164/download/VOR/VOR-12-08-2005-34.pdf
  478. # and http://www.ctu.eu/164/download/VOR/VOR-12-05-2007-6-AN.pdf
  479. # Power at 5250 - 5350 MHz and 5470 - 5725 MHz can be doubled if TPC is
  480. # implemented.
  481. country CZ: DFS-ETSI
  482. - (2400 - 2483.5 @ 40), (N/A, 100 mW)
  483. - (5150 - 5250 @ 80), (N/A, 200 mW), NO-OUTDOOR
  484. - (5250 - 5350 @ 80), (N/A, 100 mW), NO-OUTDOOR, DFS
  485. - (5470 - 5725 @ 80), (N/A, 500 mW), DFS
  486. + (2400 - 2483.5 @ 40), (100 mW)
  487. + (5150 - 5250 @ 80), (200 mW), NO-OUTDOOR
  488. + (5250 - 5350 @ 80), (100 mW), NO-OUTDOOR
  489. + (5470 - 5725 @ 80), (500 mW), DFS
  490. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  491. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  492. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  493. # Data from "Frequenznutzungsplan" (as published in April 2008), downloaded from
  494. # http://www.bundesnetzagentur.de/cae/servlet/contentblob/38448/publicationFile/2659/Frequenznutzungsplan2008_Id17448pdf.pdf
  495. @@ -221,542 +226,555 @@ country CZ: DFS-ETSI
  496. country DE: DFS-ETSI
  497. # entries 279004 and 280006
  498. - (2400 - 2483.5 @ 40), (N/A, 100 mW)
  499. - # entry 303005
  500. - (5150 - 5250 @ 80), (N/A, 100 mW), NO-OUTDOOR
  501. - # entries 304002 and 305002
  502. - (5250 - 5350 @ 80), (N/A, 100 mW), NO-OUTDOOR, DFS
  503. + (2400 - 2483.5 @ 40), (100 mW)
  504. + # entry 303005, 304002 and 305002
  505. + (5150 - 5350 @ 80), (100 mW), NO-OUTDOOR
  506. # entries 308002, 309001 and 310003
  507. - (5470 - 5725 @ 80), (N/A, 500 mW), DFS
  508. + (5470 - 5725 @ 80), (500 mW), DFS
  509. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  510. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  511. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  512. country DK: DFS-ETSI
  513. - (2402 - 2482 @ 40), (N/A, 20)
  514. - (5170 - 5250 @ 80), (N/A, 20)
  515. - (5250 - 5330 @ 80), (N/A, 20), DFS
  516. - (5490 - 5710 @ 80), (N/A, 27), DFS
  517. - # 60 gHz band channels 1-4, ref: Etsi En 302 567
  518. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  519. -
  520. -country DO:
  521. - (2402 - 2472 @ 40), (3, 27)
  522. - (5170 - 5250 @ 40), (3, 17)
  523. - (5250 - 5330 @ 40), (3, 23), DFS
  524. - (5735 - 5835 @ 40), (3, 30)
  525. -
  526. -country DZ:
  527. - (2402 - 2482 @ 40), (N/A, 20)
  528. -
  529. -country EC:
  530. - (2402 - 2482 @ 40), (N/A, 20)
  531. - (5170 - 5250 @ 80), (3, 17)
  532. - (5250 - 5330 @ 80), (3, 24), DFS
  533. - (5490 - 5710 @ 80), (3, 24), DFS
  534. - (5735 - 5835 @ 80), (3, 30)
  535. + (2402 - 2482 @ 40), (20)
  536. + (5170 - 5250 @ 80), (20)
  537. + (5250 - 5330 @ 80), (20), DFS
  538. + (5490 - 5710 @ 80), (27), DFS
  539. + # 60 gHz band channels 1-4, ref: Etsi En 302 567
  540. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  541. +
  542. +country DO: DFS-FCC
  543. + (2402 - 2472 @ 40), (30)
  544. + (5170 - 5250 @ 80), (17)
  545. + (5250 - 5330 @ 80), (23), DFS
  546. + (5735 - 5835 @ 80), (30)
  547. +
  548. +country DZ: DFS-JP
  549. + (2402 - 2482 @ 40), (20)
  550. + (5170.000 - 5250.000 @ 80.000), (23.00)
  551. + (5250.000 - 5330.000 @ 80.000), (23.00), DFS
  552. + (5490.000 - 5670.000 @ 80.000), (23.00), DFS
  553. +
  554. +country EC: DFS-FCC
  555. + (2402 - 2482 @ 40), (20)
  556. + (5170 - 5250 @ 80), (17)
  557. + (5250 - 5330 @ 80), (24), DFS
  558. + (5490 - 5730 @ 80), (24), DFS
  559. + (5735 - 5835 @ 80), (30)
  560. country EE: DFS-ETSI
  561. - (2402 - 2482 @ 40), (N/A, 20)
  562. - (5170 - 5250 @ 40), (N/A, 20)
  563. - (5250 - 5330 @ 40), (N/A, 20), DFS
  564. - (5490 - 5710 @ 40), (N/A, 27), DFS
  565. + (2402 - 2482 @ 40), (20)
  566. + (5170 - 5250 @ 80), (20)
  567. + (5250 - 5330 @ 80), (20), DFS
  568. + (5490 - 5710 @ 80), (27), DFS
  569. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  570. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  571. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  572. -country EG:
  573. - (2402 - 2482 @ 40), (N/A, 20)
  574. - (5170 - 5250 @ 20), (N/A, 20)
  575. - (5250 - 5330 @ 20), (N/A, 20), DFS
  576. +country EG: DFS-ETSI
  577. + (2402 - 2482 @ 40), (20)
  578. + (5170 - 5250 @ 80), (20)
  579. + (5250 - 5330 @ 80), (20), DFS
  580. country ES: DFS-ETSI
  581. - (2400 - 2483.5 @ 40), (N/A, 100 mW)
  582. - (5150 - 5250 @ 80), (N/A, 100 mW), NO-OUTDOOR
  583. - (5250 - 5350 @ 80), (N/A, 100 mW), NO-OUTDOOR, DFS
  584. - (5470 - 5725 @ 80), (N/A, 500 mW), DFS
  585. + (2400 - 2483.5 @ 40), (100 mW)
  586. + (5150 - 5250 @ 80), (100 mW), NO-OUTDOOR
  587. + (5250 - 5350 @ 80), (100 mW), NO-OUTDOOR
  588. + (5470 - 5725 @ 80), (500 mW), DFS
  589. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  590. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  591. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  592. country FI: DFS-ETSI
  593. - (2402 - 2482 @ 40), (N/A, 20)
  594. - (5170 - 5250 @ 80), (N/A, 20)
  595. - (5250 - 5330 @ 80), (N/A, 20), DFS
  596. - (5490 - 5710 @ 80), (N/A, 27), DFS
  597. + (2402 - 2482 @ 40), (20)
  598. + (5170 - 5250 @ 80), (20)
  599. + (5250 - 5330 @ 80), (20), DFS
  600. + (5490 - 5710 @ 80), (27), DFS
  601. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  602. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  603. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  604. country FR: DFS-ETSI
  605. - (2402 - 2482 @ 40), (N/A, 20)
  606. - (5170 - 5250 @ 80), (N/A, 20)
  607. - (5250 - 5330 @ 80), (N/A, 20), DFS
  608. - (5490 - 5710 @ 80), (N/A, 27), DFS
  609. + (2402 - 2482 @ 40), (20)
  610. + (5170 - 5250 @ 80), (20)
  611. + (5250 - 5330 @ 80), (20), DFS
  612. + (5490 - 5710 @ 80), (27), DFS
  613. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  614. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  615. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  616. -country GE:
  617. - (2402 - 2482 @ 40), (N/A, 20)
  618. - (5170 - 5250 @ 40), (N/A, 18)
  619. - (5250 - 5330 @ 40), (N/A, 18), DFS
  620. +country GE: DFS-ETSI
  621. + (2402 - 2482 @ 40), (20)
  622. + (5170 - 5250 @ 80), (18)
  623. + (5250 - 5330 @ 80), (18), DFS
  624. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  625. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  626. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  627. country GB: DFS-ETSI
  628. - (2402 - 2482 @ 40), (N/A, 20)
  629. - (5170 - 5250 @ 80), (N/A, 20)
  630. - (5250 - 5330 @ 80), (N/A, 20), DFS
  631. - (5490 - 5710 @ 80), (N/A, 27), DFS
  632. + (2402 - 2482 @ 40), (20)
  633. + (5170 - 5250 @ 80), (20)
  634. + (5250 - 5330 @ 80), (20), DFS
  635. + (5490 - 5710 @ 80), (27), DFS
  636. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  637. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  638. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  639. -country GD:
  640. - (2402 - 2472 @ 40), (3, 27)
  641. - (5170 - 5250 @ 40), (3, 17)
  642. - (5250 - 5330 @ 40), (3, 20), DFS
  643. - (5490 - 5710 @ 40), (3, 20), DFS
  644. - (5735 - 5835 @ 40), (3, 30)
  645. +country GD: DFS-FCC
  646. + (2402 - 2472 @ 40), (30)
  647. + (5170 - 5250 @ 80), (17)
  648. + (5250 - 5330 @ 80), (24), DFS
  649. + (5490 - 5730 @ 80), (24), DFS
  650. + (5735 - 5835 @ 80), (30)
  651. country GR: DFS-ETSI
  652. - (2402 - 2482 @ 40), (N/A, 20)
  653. - (5170 - 5250 @ 80), (N/A, 20)
  654. - (5250 - 5330 @ 80), (N/A, 20), DFS
  655. - (5490 - 5710 @ 80), (N/A, 27), DFS
  656. + (2402 - 2482 @ 40), (20)
  657. + (5170 - 5250 @ 80), (20)
  658. + (5250 - 5330 @ 80), (20), DFS
  659. + (5490 - 5710 @ 80), (27), DFS
  660. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  661. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  662. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  663. country GL: DFS-ETSI
  664. - (2402 - 2482 @ 40), (N/A, 20)
  665. - (5170 - 5250 @ 20), (N/A, 20)
  666. - (5250 - 5330 @ 20), (N/A, 20), DFS
  667. - (5490 - 5710 @ 20), (N/A, 27), DFS
  668. -
  669. -country GT:
  670. - (2402 - 2472 @ 40), (3, 27)
  671. - (5170 - 5250 @ 40), (3, 17)
  672. - (5250 - 5330 @ 40), (3, 23), DFS
  673. - (5735 - 5835 @ 40), (3, 30)
  674. -
  675. -country GU:
  676. - (2402 - 2472 @ 40), (3, 27)
  677. - (5170 - 5250 @ 80), (3, 17)
  678. - (5250 - 5330 @ 80), (3, 24), DFS
  679. - (5490 - 5710 @ 80), (3, 24), DFS
  680. - (5735 - 5835 @ 80), (3, 30)
  681. -
  682. -country HN:
  683. - (2402 - 2482 @ 40), (N/A, 20)
  684. - (5170 - 5250 @ 40), (3, 17)
  685. - (5250 - 5330 @ 40), (3, 20), DFS
  686. - (5490 - 5710 @ 40), (3, 20), DFS
  687. - (5735 - 5835 @ 40), (3, 30)
  688. + (2402 - 2482 @ 40), (20)
  689. + (5170 - 5250 @ 80), (20)
  690. + (5250 - 5330 @ 80), (20), DFS
  691. + (5490 - 5710 @ 80), (27), DFS
  692. +
  693. +country GT: DFS-FCC
  694. + (2402 - 2472 @ 40), (30)
  695. + (5170 - 5250 @ 80), (17)
  696. + (5250 - 5330 @ 80), (23), DFS
  697. + (5735 - 5835 @ 80), (30)
  698. +
  699. +country GU: DFS-FCC
  700. + (2402 - 2472 @ 40), (30)
  701. + (5170 - 5250 @ 80), (17)
  702. + (5250 - 5330 @ 80), (24), DFS
  703. + (5490 - 5730 @ 80), (24), DFS
  704. + (5735 - 5835 @ 80), (30)
  705. +
  706. +country HN: DFS-FCC
  707. + (2402 - 2482 @ 40), (20)
  708. + (5170 - 5250 @ 80), (17)
  709. + (5250 - 5330 @ 80), (24), DFS
  710. + (5490 - 5730 @ 80), (24), DFS
  711. + (5735 - 5835 @ 80), (30)
  712. country HK:
  713. - (2402 - 2482 @ 40), (N/A, 20)
  714. - (5170 - 5250 @ 80), (3, 17)
  715. - (5250 - 5330 @ 80), (3, 24), DFS
  716. - (5490 - 5710 @ 80), (3, 24), DFS
  717. - (5735 - 5835 @ 80), (3, 30)
  718. + (2402 - 2482 @ 40), (20)
  719. + (5170 - 5250 @ 80), (17)
  720. + (5250 - 5330 @ 80), (24), DFS
  721. + (5490 - 5710 @ 80), (24), DFS
  722. + (5735 - 5835 @ 80), (30)
  723. country HR: DFS-ETSI
  724. - (2402 - 2482 @ 40), (N/A, 20)
  725. - (5170 - 5250 @ 40), (N/A, 20)
  726. - (5250 - 5330 @ 40), (N/A, 20), DFS
  727. - (5490 - 5710 @ 40), (N/A, 27), DFS
  728. + (2402 - 2482 @ 40), (20)
  729. + (5170 - 5250 @ 80), (20)
  730. + (5250 - 5330 @ 80), (20), DFS
  731. + (5490 - 5710 @ 80), (27), DFS
  732. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  733. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  734. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  735. -country HT:
  736. - (2402 - 2482 @ 40), (N/A, 20)
  737. - (5170 - 5250 @ 40), (N/A, 20)
  738. - (5250 - 5330 @ 40), (N/A, 20), DFS
  739. - (5490 - 5710 @ 40), (N/A, 27), DFS
  740. +country HT: DFS-ETSI
  741. + (2402 - 2482 @ 40), (20)
  742. + (5170 - 5250 @ 80), (20)
  743. + (5250 - 5330 @ 80), (20), DFS
  744. + (5490 - 5710 @ 80), (27), DFS
  745. country HU: DFS-ETSI
  746. - (2402 - 2482 @ 40), (N/A, 20)
  747. - (5170 - 5250 @ 40), (N/A, 20)
  748. - (5250 - 5330 @ 40), (N/A, 20), DFS
  749. - (5490 - 5710 @ 40), (N/A, 27), DFS
  750. + (2402 - 2482 @ 40), (20)
  751. + (5170 - 5250 @ 80), (20)
  752. + (5250 - 5330 @ 80), (20), DFS
  753. + (5490 - 5710 @ 80), (27), DFS
  754. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  755. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  756. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  757. -country ID:
  758. +country ID: DFS-JP
  759. # ref: http://www.postel.go.id/content/ID/regulasi/standardisasi/kepdir/bwa%205,8%20ghz.pdf
  760. - (2402 - 2482 @ 40), (N/A, 20)
  761. - (5735 - 5815 @ 80), (N/A, 20)
  762. + (2402 - 2482 @ 40), (20)
  763. + (5735 - 5815 @ 80), (23)
  764. country IE: DFS-ETSI
  765. - (2402 - 2482 @ 40), (N/A, 20)
  766. - (5170 - 5250 @ 80), (N/A, 20)
  767. - (5250 - 5330 @ 80), (N/A, 20), DFS
  768. - (5490 - 5710 @ 80), (N/A, 27), DFS
  769. + (2402 - 2482 @ 40), (20)
  770. + (5170 - 5250 @ 80), (20)
  771. + (5250 - 5330 @ 80), (20), DFS
  772. + (5490 - 5710 @ 80), (27), DFS
  773. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  774. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  775. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  776. -country IL:
  777. - (2402 - 2482 @ 40), (N/A, 20)
  778. - (5150 - 5250 @ 80), (N/A, 200 mW), NO-OUTDOOR
  779. - (5250 - 5350 @ 80), (N/A, 200 mW), NO-OUTDOOR, DFS
  780. +country IL: DFS-ETSI
  781. + (2402 - 2482 @ 40), (20)
  782. + (5150 - 5350 @ 80), (200 mW), NO-OUTDOOR
  783. -country IN:
  784. - (2402 - 2482 @ 40), (N/A, 20)
  785. - (5170 - 5250 @ 40), (N/A, 20)
  786. - (5250 - 5330 @ 40), (N/A, 20), DFS
  787. - (5735 - 5835 @ 40), (N/A, 20)
  788. +country IN: DFS-JP
  789. + (2402 - 2482 @ 40), (20)
  790. + (5170 - 5250 @ 80), (20)
  791. + (5250 - 5330 @ 80), (20), DFS
  792. + (5735 - 5835 @ 80), (20)
  793. country IS: DFS-ETSI
  794. - (2402 - 2482 @ 40), (N/A, 20)
  795. - (5170 - 5250 @ 40), (N/A, 20)
  796. - (5250 - 5330 @ 40), (N/A, 20), DFS
  797. - (5490 - 5710 @ 40), (N/A, 27), DFS
  798. + (2402 - 2482 @ 40), (20)
  799. + (5170 - 5250 @ 80), (20)
  800. + (5250 - 5330 @ 80), (20), DFS
  801. + (5490 - 5710 @ 80), (27), DFS
  802. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  803. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  804. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  805. -country IR:
  806. - (2402 - 2482 @ 40), (N/A, 20)
  807. - (5735 - 5835 @ 40), (N/A, 30)
  808. +country IR: DFS-JP
  809. + (2402 - 2482 @ 40), (20)
  810. + (5735 - 5835 @ 80), (30)
  811. country IT: DFS-ETSI
  812. - (2402 - 2482 @ 40), (N/A, 20)
  813. - (5170 - 5250 @ 80), (N/A, 20)
  814. - (5250 - 5330 @ 80), (N/A, 20), DFS
  815. - (5490 - 5710 @ 80), (N/A, 27), DFS
  816. - # 60 gHz band channels 1-4, ref: Etsi En 302 567
  817. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  818. -
  819. -country JM:
  820. - (2402 - 2482 @ 40), (N/A, 20)
  821. - (5170 - 5250 @ 40), (3, 17)
  822. - (5250 - 5330 @ 40), (3, 20), DFS
  823. - (5490 - 5710 @ 40), (3, 20), DFS
  824. - (5735 - 5835 @ 40), (3, 30)
  825. -
  826. -country JP:
  827. - (2402 - 2482 @ 40), (N/A, 20)
  828. - (2474 - 2494 @ 20), (N/A, 20), NO-OFDM
  829. - (4910 - 4990 @ 40), (N/A, 23)
  830. - (5030 - 5090 @ 40), (N/A, 23)
  831. - (5170 - 5250 @ 80), (N/A, 20)
  832. - (5250 - 5330 @ 80), (N/A, 20), DFS
  833. - (5490 - 5710 @ 160), (N/A, 23), DFS
  834. -
  835. -country JO:
  836. - (2402 - 2482 @ 40), (N/A, 20)
  837. - (5170 - 5250 @ 40), (N/A, 18)
  838. -
  839. -country KE:
  840. - (2402 - 2482 @ 40), (N/A, 20)
  841. - (5735 - 5835 @ 40), (N/A, 30)
  842. -
  843. -country KH:
  844. - (2402 - 2482 @ 40), (N/A, 20)
  845. - (5170 - 5250 @ 40), (N/A, 20)
  846. - (5250 - 5330 @ 40), (N/A, 20), DFS
  847. - (5490 - 5710 @ 40), (N/A, 27), DFS
  848. -
  849. -country KP:
  850. - (2402 - 2482 @ 40), (N/A, 20)
  851. - (5170 - 5330 @ 40), (3, 20)
  852. - (5160 - 5250 @ 40), (3, 20), DFS
  853. - (5490 - 5630 @ 40), (3, 30), DFS
  854. - (5735 - 5815 @ 40), (3, 30)
  855. -
  856. -country KR:
  857. - (2402 - 2482 @ 20), (N/A, 20)
  858. - (5170 - 5250 @ 80), (3, 20)
  859. - (5250 - 5330 @ 80), (3, 20), DFS
  860. - (5490 - 5630 @ 80), (3, 30), DFS
  861. - (5735 - 5815 @ 80), (3, 30)
  862. -
  863. -country KW:
  864. - (2402 - 2482 @ 40), (N/A, 20)
  865. - (5170 - 5250 @ 80), (N/A, 20)
  866. - (5250 - 5330 @ 80), (N/A, 20), DFS
  867. + (2402 - 2482 @ 40), (20)
  868. + (5170 - 5250 @ 80), (20)
  869. + (5250 - 5330 @ 80), (20), DFS
  870. + (5490 - 5710 @ 80), (27), DFS
  871. + # 60 gHz band channels 1-4, ref: Etsi En 302 567
  872. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  873. +
  874. +country JM: DFS-FCC
  875. + (2402 - 2482 @ 40), (20)
  876. + (5170 - 5250 @ 80), (17)
  877. + (5250 - 5330 @ 80), (24), DFS
  878. + (5490 - 5730 @ 80), (24), DFS
  879. + (5735 - 5835 @ 80), (30)
  880. +
  881. +country JP: DFS-JP
  882. + (2402 - 2482 @ 40), (20)
  883. + (2474 - 2494 @ 20), (20), NO-OFDM
  884. + (4910 - 4990 @ 40), (23)
  885. + (5030 - 5090 @ 40), (23)
  886. + (5170 - 5250 @ 80), (20)
  887. + (5250 - 5330 @ 80), (20), DFS
  888. + (5490 - 5710 @ 160), (23), DFS
  889. +
  890. +country JO: DFS-JP
  891. + (2402 - 2482 @ 40), (20)
  892. + (5170 - 5250 @ 80), (23)
  893. + (5735 - 5835 @ 80), (23)
  894. +
  895. +country KE: DFS-JP
  896. + (2402 - 2482 @ 40), (20)
  897. + (5170 - 5250 @ 80), (23)
  898. + (5490 - 5570 @ 80), (30), DFS
  899. + (5735 - 5775 @ 40), (23)
  900. +
  901. +country KH: DFS-ETSI
  902. + (2402 - 2482 @ 40), (20)
  903. + (5170 - 5250 @ 80), (20)
  904. + (5250 - 5330 @ 80), (20), DFS
  905. + (5490 - 5710 @ 80), (27), DFS
  906. +
  907. +country KP: DFS-JP
  908. + (2402 - 2482 @ 40), (20)
  909. + (5170 - 5250 @ 80), (20)
  910. + (5250 - 5330 @ 80), (20), DFS
  911. + (5490 - 5630 @ 80), (30), DFS
  912. + (5735 - 5815 @ 80), (30)
  913. +
  914. +country KR: DFS-JP
  915. + (2402 - 2482 @ 20), (20)
  916. + (2402 - 2482 @ 40), (20)
  917. + (5170 - 5250 @ 80), (20)
  918. + (5250 - 5330 @ 80), (20), DFS
  919. + (5490 - 5710 @ 80), (30), DFS
  920. + (5735 - 5815 @ 80), (30)
  921. +
  922. +country KW: DFS-ETSI
  923. + (2402 - 2482 @ 40), (20)
  924. + (5170 - 5250 @ 80), (20)
  925. + (5250 - 5330 @ 80), (20), DFS
  926. country KZ:
  927. - (2402 - 2482 @ 40), (N/A, 20)
  928. + (2402 - 2482 @ 40), (20)
  929. -country LB:
  930. - (2402 - 2482 @ 40), (N/A, 20)
  931. - (5735 - 5835 @ 40), (N/A, 30)
  932. +country LB: DFS-FCC
  933. + (2402 - 2482 @ 40), (20)
  934. + (5170 - 5250 @ 80), (17)
  935. + (5250 - 5330 @ 80), (24), DFS
  936. + (5490 - 5730 @ 80), (24), DFS
  937. + (5735 - 5835 @ 80), (30)
  938. country LI: DFS-ETSI
  939. - (2402 - 2482 @ 40), (N/A, 20)
  940. - (5170 - 5250 @ 40), (N/A, 20)
  941. - (5250 - 5330 @ 40), (N/A, 20), DFS
  942. - (5490 - 5710 @ 40), (N/A, 27), DFS
  943. -
  944. -country LK:
  945. - (2402 - 2482 @ 40), (N/A, 20)
  946. - (5170 - 5250 @ 20), (3, 17)
  947. - (5250 - 5330 @ 20), (3, 20), DFS
  948. - (5490 - 5710 @ 20), (3, 20), DFS
  949. - (5735 - 5835 @ 20), (3, 30)
  950. + (2402 - 2482 @ 40), (20)
  951. + (5170 - 5250 @ 80), (20)
  952. + (5250 - 5330 @ 80), (20), DFS
  953. + (5490 - 5710 @ 80), (27), DFS
  954. +
  955. +country LK: DFS-FCC
  956. + (2402 - 2482 @ 40), (20)
  957. + (5170 - 5250 @ 80), (17)
  958. + (5250 - 5330 @ 80), (24), DFS
  959. + (5490 - 5730 @ 80), (24), DFS
  960. + (5735 - 5835 @ 80), (30)
  961. country LT: DFS-ETSI
  962. - (2402 - 2482 @ 40), (N/A, 20)
  963. - (5170 - 5250 @ 40), (N/A, 20)
  964. - (5250 - 5330 @ 40), (N/A, 20), DFS
  965. - (5490 - 5710 @ 40), (N/A, 27), DFS
  966. + (2402 - 2482 @ 40), (20)
  967. + (5170 - 5250 @ 80), (20)
  968. + (5250 - 5330 @ 80), (20), DFS
  969. + (5490 - 5710 @ 80), (27), DFS
  970. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  971. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  972. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  973. country LU: DFS-ETSI
  974. - (2402 - 2482 @ 40), (N/A, 20)
  975. - (5170 - 5250 @ 80), (N/A, 20)
  976. - (5250 - 5330 @ 80), (N/A, 20), DFS
  977. - (5490 - 5710 @ 80), (N/A, 27), DFS
  978. + (2402 - 2482 @ 40), (20)
  979. + (5170 - 5250 @ 80), (20)
  980. + (5250 - 5330 @ 80), (20), DFS
  981. + (5490 - 5710 @ 80), (27), DFS
  982. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  983. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  984. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  985. country LV: DFS-ETSI
  986. - (2402 - 2482 @ 40), (N/A, 20)
  987. - (5170 - 5250 @ 40), (N/A, 20)
  988. - (5250 - 5330 @ 40), (N/A, 20), DFS
  989. - (5490 - 5710 @ 40), (N/A, 27), DFS
  990. + (2402 - 2482 @ 40), (20)
  991. + (5170 - 5250 @ 80), (20)
  992. + (5250 - 5330 @ 80), (20), DFS
  993. + (5490 - 5710 @ 80), (27), DFS
  994. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  995. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  996. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  997. country MC: DFS-ETSI
  998. - (2402 - 2482 @ 40), (N/A, 20)
  999. - (5170 - 5250 @ 40), (N/A, 18)
  1000. - (5250 - 5330 @ 40), (N/A, 18), DFS
  1001. + (2402 - 2482 @ 40), (20)
  1002. + (5170 - 5250 @ 80), (20)
  1003. + (5250 - 5330 @ 80), (20), DFS
  1004. + (5490 - 5710 @ 80), (27), DFS
  1005. -country MA:
  1006. - (2402 - 2482 @ 40), (N/A, 20)
  1007. - (5170 - 5250 @ 80), (N/A, 23)
  1008. - (5735 - 5835 @ 80), (N/A, 23)
  1009. +country MA: DFS-ETSI
  1010. + (2402 - 2482 @ 40), (20)
  1011. + (5170 - 5250 @ 80), (20)
  1012. + (5250 - 5330 @ 80), (20), DFS
  1013. country MO:
  1014. - (2402 - 2482 @ 40), (N/A, 20)
  1015. - (5170 - 5250 @ 40), (3, 23)
  1016. - (5250 - 5330 @ 40), (3, 23), DFS
  1017. - (5735 - 5835 @ 40), (3, 30)
  1018. + (2402 - 2482 @ 40), (20)
  1019. + (5170 - 5250 @ 40), (23)
  1020. + (5250 - 5330 @ 40), (23), DFS
  1021. + (5735 - 5835 @ 40), (30)
  1022. country MK: DFS-ETSI
  1023. - (2402 - 2482 @ 40), (N/A, 20)
  1024. - (5170 - 5250 @ 40), (N/A, 20)
  1025. - (5250 - 5330 @ 40), (N/A, 20), DFS
  1026. - (5490 - 5710 @ 40), (N/A, 27), DFS
  1027. + (2402 - 2482 @ 40), (20)
  1028. + (5170 - 5250 @ 80), (20)
  1029. + (5250 - 5330 @ 80), (20), DFS
  1030. + (5490 - 5710 @ 80), (27), DFS
  1031. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  1032. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  1033. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  1034. country MT: DFS-ETSI
  1035. - (2402 - 2482 @ 40), (N/A, 20)
  1036. - (5170 - 5250 @ 40), (N/A, 20)
  1037. - (5250 - 5330 @ 40), (N/A, 20), DFS
  1038. - (5490 - 5710 @ 40), (N/A, 27), DFS
  1039. - # 60 gHz band channels 1-4, ref: Etsi En 302 567
  1040. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  1041. -
  1042. -country MY:
  1043. - (2402 - 2482 @ 40), (N/A, 20)
  1044. - (5170 - 5250 @ 80), (N/A, 17)
  1045. - (5250 - 5330 @ 80), (N/A, 23), DFS
  1046. - (5735 - 5835 @ 80), (N/A, 30)
  1047. -
  1048. -country MX:
  1049. - (2402 - 2472 @ 40), (3, 27)
  1050. - (5170 - 5250 @ 80), (3, 17)
  1051. - (5250 - 5330 @ 80), (3, 24), DFS
  1052. - (5490 - 5710 @ 80), (3, 24), DFS
  1053. - (5735 - 5835 @ 80), (3, 30)
  1054. + (2402 - 2482 @ 40), (20)
  1055. + (5170 - 5250 @ 80), (20)
  1056. + (5250 - 5330 @ 80), (20), DFS
  1057. + (5490 - 5710 @ 80), (27), DFS
  1058. + # 60 gHz band channels 1-4, ref: Etsi En 302 567
  1059. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  1060. +
  1061. +country MY: DFS-FCC
  1062. + (2402 - 2482 @ 40), (20)
  1063. + (5170 - 5250 @ 80), (17)
  1064. + (5250 - 5330 @ 80), (23), DFS
  1065. + (5735 - 5835 @ 80), (30)
  1066. +
  1067. +country MX: DFS-FCC
  1068. + (2402 - 2482 @ 40), (20)
  1069. + (5170 - 5250 @ 80), (17)
  1070. + (5250 - 5330 @ 80), (24), DFS
  1071. + (5490 - 5730 @ 80), (24), DFS
  1072. + (5735 - 5835 @ 80), (30)
  1073. country NL: DFS-ETSI
  1074. - (2402 - 2482 @ 40), (N/A, 20)
  1075. - (5170 - 5250 @ 80), (N/A, 20), NO-OUTDOOR
  1076. - (5250 - 5330 @ 80), (N/A, 20), NO-OUTDOOR, DFS
  1077. - (5490 - 5710 @ 80), (N/A, 27), DFS
  1078. + (2402 - 2482 @ 40), (20)
  1079. + (5170 - 5330 @ 80), (20), NO-OUTDOOR
  1080. + (5490 - 5710 @ 80), (27), DFS
  1081. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  1082. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  1083. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  1084. country NO: DFS-ETSI
  1085. - (2402 - 2482 @ 40), (N/A, 20)
  1086. - (5170 - 5250 @ 40), (N/A, 20)
  1087. - (5250 - 5330 @ 40), (N/A, 20), DFS
  1088. - (5490 - 5710 @ 40), (N/A, 27), DFS
  1089. - # 60 gHz band channels 1-4, ref: Etsi En 302 567
  1090. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  1091. -
  1092. -country NP:
  1093. - (2402 - 2482 @ 40), (N/A, 20)
  1094. - (5735 - 5835 @ 40), (N/A, 30)
  1095. -
  1096. -country NZ:
  1097. - (2402 - 2482 @ 40), (N/A, 30)
  1098. - (5170 - 5250 @ 80), (3, 17)
  1099. - (5250 - 5330 @ 80), (3, 24), DFS
  1100. - (5490 - 5710 @ 80), (3, 24), DFS
  1101. - (5735 - 5835 @ 80), (3, 30)
  1102. -
  1103. -country OM:
  1104. - (2402 - 2482 @ 40), (N/A, 20)
  1105. - (5170 - 5250 @ 40), (3, 17)
  1106. - (5250 - 5330 @ 40), (3, 20), DFS
  1107. - (5490 - 5710 @ 40), (3, 20), DFS
  1108. - (5735 - 5835 @ 40), (3, 30)
  1109. -
  1110. -country PA:
  1111. - (2402 - 2472 @ 40), (3, 27)
  1112. - (5170 - 5250 @ 40), (3, 17)
  1113. - (5250 - 5330 @ 40), (3, 23), DFS
  1114. - (5735 - 5835 @ 40), (3, 30)
  1115. -
  1116. -country PE:
  1117. - (2402 - 2482 @ 40), (N/A, 20)
  1118. - (5170 - 5250 @ 80), (3, 17)
  1119. - (5250 - 5330 @ 80), (3, 24), DFS
  1120. - (5490 - 5710 @ 80), (3, 24), DFS
  1121. - (5735 - 5835 @ 80), (3, 30)
  1122. -
  1123. -country PG:
  1124. - (2402 - 2482 @ 40), (N/A, 20)
  1125. - (5170 - 5250 @ 40), (3, 17)
  1126. - (5250 - 5330 @ 40), (3, 23), DFS
  1127. - (5735 - 5835 @ 40), (3, 30)
  1128. -
  1129. -country PH:
  1130. - (2402 - 2482 @ 40), (N/A, 20)
  1131. - (5170 - 5250 @ 80), (3, 17)
  1132. - (5250 - 5330 @ 80), (3, 24), DFS
  1133. - (5490 - 5710 @ 80), (3, 24), DFS
  1134. - (5735 - 5835 @ 80), (3, 30)
  1135. -
  1136. -country PK:
  1137. - (2402 - 2482 @ 40), (N/A, 20)
  1138. - (5735 - 5835 @ 40), (N/A, 30)
  1139. + (2402 - 2482 @ 40), (20)
  1140. + (5170 - 5250 @ 80), (20)
  1141. + (5250 - 5330 @ 80), (20), DFS
  1142. + (5490 - 5710 @ 80), (27), DFS
  1143. + # 60 gHz band channels 1-4, ref: Etsi En 302 567
  1144. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  1145. +
  1146. +country NP: DFS-JP
  1147. + (2402 - 2482 @ 40), (20)
  1148. + (5170 - 5250 @ 80), (20)
  1149. + (5250 - 5330 @ 80), (20), DFS
  1150. + (5735 - 5835 @ 80), (20)
  1151. +
  1152. +country NZ: DFS-FCC
  1153. + (2402 - 2482 @ 40), (30)
  1154. + (5170 - 5250 @ 80), (17)
  1155. + (5250 - 5330 @ 80), (24), DFS
  1156. + (5490 - 5730 @ 80), (24), DFS
  1157. + (5735 - 5835 @ 80), (30)
  1158. +
  1159. +country OM: DFS-ETSI
  1160. + (2402 - 2482 @ 40), (20)
  1161. + (5170 - 5250 @ 80), (20)
  1162. + (5250 - 5330 @ 80), (20), DFS
  1163. + (5490 - 5710 @ 80), (27), DFS
  1164. +
  1165. +country PA: DFS-FCC
  1166. + (2402 - 2472 @ 40), (30)
  1167. + (5170 - 5250 @ 80), (17)
  1168. + (5250 - 5330 @ 80), (23), DFS
  1169. + (5735 - 5835 @ 80), (30)
  1170. +
  1171. +country PE: DFS-FCC
  1172. + (2402 - 2482 @ 40), (20)
  1173. + (5170 - 5250 @ 80), (17)
  1174. + (5250 - 5330 @ 80), (24), DFS
  1175. + (5490 - 5730 @ 80), (24), DFS
  1176. + (5735 - 5835 @ 80), (30)
  1177. +
  1178. +country PG: DFS-FCC
  1179. + (2402 - 2482 @ 40), (20)
  1180. + (5170 - 5250 @ 80), (17)
  1181. + (5250 - 5330 @ 80), (24), DFS
  1182. + (5490 - 5730 @ 80), (24), DFS
  1183. + (5735 - 5835 @ 80), (30)
  1184. +
  1185. +country PH: DFS-FCC
  1186. + (2402 - 2482 @ 40), (20)
  1187. + (5170 - 5250 @ 80), (17)
  1188. + (5250 - 5330 @ 80), (24), DFS
  1189. + (5490 - 5730 @ 80), (24), DFS
  1190. + (5735 - 5835 @ 80), (30)
  1191. +
  1192. +country PK: DFS-JP
  1193. + (2402 - 2482 @ 40), (20)
  1194. + (5735 - 5835 @ 80), (30)
  1195. country PL: DFS-ETSI
  1196. - (2402 - 2482 @ 40), (N/A, 20)
  1197. - (5170 - 5250 @ 80), (N/A, 20)
  1198. - (5250 - 5330 @ 80), (N/A, 20), DFS
  1199. - (5490 - 5710 @ 80), (N/A, 27), DFS
  1200. + (2402 - 2482 @ 40), (20)
  1201. + (5170 - 5250 @ 80), (20)
  1202. + (5250 - 5330 @ 80), (20), DFS
  1203. + (5490 - 5710 @ 80), (27), DFS
  1204. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  1205. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  1206. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  1207. country PT: DFS-ETSI
  1208. - (2402 - 2482 @ 40), (N/A, 20)
  1209. - (5170 - 5250 @ 80), (N/A, 20)
  1210. - (5250 - 5330 @ 80), (N/A, 20), DFS
  1211. - (5490 - 5710 @ 80), (N/A, 27), DFS
  1212. + (2402 - 2482 @ 40), (20)
  1213. + (5170 - 5250 @ 80), (20)
  1214. + (5250 - 5330 @ 80), (20), DFS
  1215. + (5490 - 5710 @ 80), (27), DFS
  1216. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  1217. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  1218. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  1219. -country PR:
  1220. - (2402 - 2472 @ 40), (3, 27)
  1221. - (5170 - 5250 @ 80), (3, 17)
  1222. - (5250 - 5330 @ 80), (3, 24), DFS
  1223. - (5490 - 5710 @ 80), (3, 24), DFS
  1224. - (5735 - 5835 @ 80), (3, 30)
  1225. +country PR: DFS-FCC
  1226. + (2402 - 2472 @ 40), (30)
  1227. + (5170 - 5250 @ 80), (17)
  1228. + (5250 - 5330 @ 80), (24), DFS
  1229. + (5490 - 5730 @ 80), (24), DFS
  1230. + (5735 - 5835 @ 80), (30)
  1231. -country QA:
  1232. - (2402 - 2482 @ 40), (N/A, 20)
  1233. - (5735 - 5835 @ 40), (N/A, 30)
  1234. +country QA: DFS-JP
  1235. + (2402 - 2482 @ 40), (20)
  1236. + (5735 - 5835 @ 80), (30)
  1237. country RO: DFS-ETSI
  1238. - (2402 - 2482 @ 40), (N/A, 20)
  1239. - (5170 - 5250 @ 40), (N/A, 20)
  1240. - (5250 - 5330 @ 40), (N/A, 20), DFS
  1241. - (5490 - 5710 @ 40), (N/A, 27), DFS
  1242. + (2402 - 2482 @ 40), (20)
  1243. + (5170 - 5250 @ 80), (20)
  1244. + (5250 - 5330 @ 80), (20), DFS
  1245. + (5490 - 5710 @ 80), (27), DFS
  1246. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  1247. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  1248. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  1249. # Source:
  1250. # http://www.ratel.rs/upload/documents/Plan_namene/Plan_namene-sl_glasnik.pdf
  1251. -country RS:
  1252. - (2400 - 2483.5 @ 40), (N/A, 100 mW)
  1253. - (5150 - 5350 @ 40), (N/A, 200 mW), NO-OUTDOOR
  1254. - (5470 - 5725 @ 20), (3, 1000 mW), DFS
  1255. - # 60 gHz band channels 1-4, ref: Etsi En 302 567
  1256. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  1257. -
  1258. -country RU:
  1259. - (2402 - 2482 @ 40), (N/A, 20)
  1260. - (5170 - 5330 @ 40), (N/A, 20)
  1261. - (5650 - 5710 @ 40), (N/A, 30)
  1262. - (5735 - 5835 @ 40), (N/A, 30)
  1263. -
  1264. -country RW:
  1265. - (2402 - 2482 @ 40), (N/A, 20)
  1266. - (5735 - 5835 @ 40), (N/A, 30)
  1267. -
  1268. -country SA:
  1269. - (2402 - 2482 @ 40), (N/A, 20)
  1270. - (5170 - 5250 @ 80), (3, 17)
  1271. - (5250 - 5330 @ 80), (3, 24), DFS
  1272. - (5490 - 5710 @ 80), (3, 24), DFS
  1273. - (5735 - 5835 @ 80), (3, 30)
  1274. +country RS: DFS-ETSI
  1275. + (2400 - 2483.5 @ 40), (100 mW)
  1276. + (5150 - 5350 @ 40), (200 mW), NO-OUTDOOR
  1277. + (5470 - 5725 @ 20), (1000 mW), DFS
  1278. + # 60 gHz band channels 1-4, ref: Etsi En 302 567
  1279. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  1280. +
  1281. +country RU: DFS-ETSI
  1282. + (2402 - 2482 @ 40), (20)
  1283. + (5170 - 5250 @ 80), (20)
  1284. + (5250 - 5330 @ 80), (20), DFS
  1285. + (5650 - 5730 @ 80), (30), DFS
  1286. + (5735 - 5835 @ 80), (30)
  1287. +
  1288. +country RW: DFS-FCC
  1289. + (2402 - 2482 @ 40), (20)
  1290. + (5170 - 5250 @ 80), (17)
  1291. + (5250 - 5330 @ 80), (24), DFS
  1292. + (5490 - 5730 @ 80), (24), DFS
  1293. + (5735 - 5835 @ 80), (30)
  1294. +
  1295. +country SA: DFS-ETSI
  1296. + (2402 - 2482 @ 40), (20)
  1297. + (5170 - 5250 @ 80), (20)
  1298. + (5250 - 5330 @ 80), (20), DFS
  1299. + (5490 - 5710 @ 80), (27), DFS
  1300. country SE: DFS-ETSI
  1301. - (2402 - 2482 @ 40), (N/A, 20)
  1302. - (5170 - 5250 @ 80), (N/A, 20)
  1303. - (5250 - 5330 @ 80), (N/A, 20), DFS
  1304. - (5490 - 5710 @ 80), (N/A, 27), DFS
  1305. + (2402 - 2482 @ 40), (20)
  1306. + (5170 - 5250 @ 80), (20)
  1307. + (5250 - 5330 @ 80), (20), DFS
  1308. + (5490 - 5710 @ 80), (27), DFS
  1309. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  1310. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  1311. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  1312. -country SG:
  1313. - (2402 - 2482 @ 40), (N/A, 20)
  1314. - (5170 - 5250 @ 80), (3, 17)
  1315. - (5250 - 5330 @ 80), (3, 24), DFS
  1316. - (5490 - 5710 @ 80), (3, 24), DFS
  1317. - (5735 - 5835 @ 80), (3, 30)
  1318. +country SG: DFS-FCC
  1319. + (2402 - 2482 @ 40), (20)
  1320. + (5170 - 5250 @ 80), (17)
  1321. + (5250 - 5330 @ 80), (24), DFS
  1322. + (5490 - 5730 @ 80), (24), DFS
  1323. + (5735 - 5835 @ 80), (30)
  1324. country SI: DFS-ETSI
  1325. - (2402 - 2482 @ 40), (N/A, 20)
  1326. - (5170 - 5250 @ 40), (N/A, 20)
  1327. - (5250 - 5330 @ 40), (N/A, 20), DFS
  1328. - (5490 - 5710 @ 40), (N/A, 27), DFS
  1329. + (2402 - 2482 @ 40), (20)
  1330. + (5170 - 5250 @ 80), (20)
  1331. + (5250 - 5330 @ 80), (20), DFS
  1332. + (5490 - 5710 @ 80), (27), DFS
  1333. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  1334. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  1335. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  1336. country SK: DFS-ETSI
  1337. - (2402 - 2482 @ 40), (N/A, 20)
  1338. - (5170 - 5250 @ 80), (N/A, 20)
  1339. - (5250 - 5330 @ 80), (N/A, 20), DFS
  1340. - (5490 - 5710 @ 80), (N/A, 27), DFS
  1341. + (2402 - 2482 @ 40), (20)
  1342. + (5170 - 5250 @ 80), (20)
  1343. + (5250 - 5330 @ 80), (20), DFS
  1344. + (5490 - 5710 @ 80), (27), DFS
  1345. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  1346. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  1347. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  1348. -country SV:
  1349. - (2402 - 2482 @ 40), (N/A, 20)
  1350. - (5170 - 5250 @ 20), (3, 17)
  1351. - (5250 - 5330 @ 20), (3, 23), DFS
  1352. - (5735 - 5835 @ 20), (3, 30)
  1353. +country SV: DFS-FCC
  1354. + (2402 - 2482 @ 40), (20)
  1355. + (5170 - 5250 @ 80), (17)
  1356. + (5250 - 5330 @ 80), (23), DFS
  1357. + (5735 - 5835 @ 80), (30)
  1358. country SY:
  1359. - (2402 - 2482 @ 40), (N/A, 20)
  1360. -
  1361. -country TW:
  1362. - (2402 - 2472 @ 40), (3, 27)
  1363. - (5270 - 5330 @ 40), (3, 17), DFS
  1364. - (5490 - 5710 @ 80), (3, 30), DFS
  1365. - (5735 - 5815 @ 80), (3, 30)
  1366. -
  1367. -country TH:
  1368. - (2402 - 2482 @ 40), (N/A, 20)
  1369. - (5170 - 5250 @ 80), (3, 17)
  1370. - (5250 - 5330 @ 80), (3, 24), DFS
  1371. - (5490 - 5710 @ 80), (3, 24), DFS
  1372. - (5735 - 5835 @ 80), (3, 30)
  1373. -
  1374. -country TT:
  1375. - (2402 - 2482 @ 40), (N/A, 20)
  1376. - (5170 - 5250 @ 40), (3, 17)
  1377. - (5250 - 5330 @ 40), (3, 20), DFS
  1378. - (5490 - 5710 @ 40), (3, 20), DFS
  1379. - (5735 - 5835 @ 40), (3, 30)
  1380. -
  1381. -country TN:
  1382. - (2402 - 2482 @ 40), (N/A, 20)
  1383. - (5170 - 5250 @ 20), (N/A, 20)
  1384. - (5250 - 5330 @ 20), (N/A, 20), DFS
  1385. + (2402 - 2482 @ 40), (20)
  1386. +
  1387. +country TW: DFS-JP
  1388. + (2402 - 2472 @ 40), (30)
  1389. + (5270 - 5330 @ 40), (17), DFS
  1390. + (5490 - 5590 @ 80), (30), DFS
  1391. + (5650 - 5710 @ 40), (30), DFS
  1392. + (5735 - 5835 @ 80), (30)
  1393. +
  1394. +country TH: DFS-FCC
  1395. + (2402 - 2482 @ 40), (20)
  1396. + (5170 - 5250 @ 80), (17)
  1397. + (5250 - 5330 @ 80), (24), DFS
  1398. + (5490 - 5730 @ 80), (24), DFS
  1399. + (5735 - 5835 @ 80), (30)
  1400. +
  1401. +country TT: DFS-FCC
  1402. + (2402 - 2482 @ 40), (20)
  1403. + (5170 - 5250 @ 80), (17)
  1404. + (5250 - 5330 @ 80), (24), DFS
  1405. + (5490 - 5730 @ 80), (24), DFS
  1406. + (5735 - 5835 @ 80), (30)
  1407. +
  1408. +country TN: DFS-ETSI
  1409. + (2402 - 2482 @ 40), (20)
  1410. + (5170 - 5250 @ 80), (20)
  1411. + (5250 - 5330 @ 80), (20), DFS
  1412. country TR: DFS-ETSI
  1413. - (2402 - 2482 @ 40), (N/A, 20)
  1414. - (5170 - 5250 @ 80), (N/A, 20)
  1415. - (5250 - 5330 @ 80), (N/A, 20), DFS
  1416. - (5490 - 5710 @ 80), (N/A, 27), DFS
  1417. + (2402 - 2482 @ 40), (20)
  1418. + (5170 - 5250 @ 80), (20)
  1419. + (5250 - 5330 @ 80), (20), DFS
  1420. + (5490 - 5710 @ 80), (27), DFS
  1421. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  1422. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  1423. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  1424. # Source:
  1425. # #914 / 06 Sep 2007: http://www.ucrf.gov.ua/uk/doc/nkrz/1196068874
  1426. @@ -765,59 +783,63 @@ country TR: DFS-ETSI
  1427. # Listed 5GHz range is a lowest common denominator for all related
  1428. # rules in the referenced laws. Such a range is used because of
  1429. # disputable definitions there.
  1430. -country UA:
  1431. - (2400 - 2483.5 @ 40), (N/A, 20), NO-OUTDOOR
  1432. - (5150 - 5350 @ 40), (N/A, 20), NO-OUTDOOR
  1433. +country UA: DFS-ETSI
  1434. + (2400 - 2483.5 @ 40), (20), NO-OUTDOOR
  1435. + (5150 - 5350 @ 40), (20), NO-OUTDOOR
  1436. + (5490 - 5670 @ 80), (20), DFS
  1437. + (5735 - 5835 @ 80), (20)
  1438. # 60 gHz band channels 1-4, ref: Etsi En 302 567
  1439. - (57240 - 65880 @ 2160), (N/A, 40), NO-OUTDOOR
  1440. + (57240 - 65880 @ 2160), (40), NO-OUTDOOR
  1441. country US: DFS-FCC
  1442. - (2402 - 2472 @ 40), (3, 27)
  1443. - (5170 - 5250 @ 80), (3, 17)
  1444. - (5250 - 5330 @ 80), (3, 24), DFS
  1445. - (5490 - 5600 @ 80), (3, 24), DFS
  1446. - (5650 - 5710 @ 40), (3, 24), DFS
  1447. - (5735 - 5835 @ 80), (3, 30)
  1448. + (2402 - 2472 @ 40), (30)
  1449. + (5170 - 5250 @ 80), (17)
  1450. + (5250 - 5330 @ 80), (23), DFS
  1451. + (5735 - 5835 @ 80), (30)
  1452. # 60g band
  1453. # reference: http://cfr.regstoday.com/47cfr15.aspx#47_CFR_15p255
  1454. # channels 1,2,3, EIRP=40dBm(43dBm peak)
  1455. - (57240 - 63720 @ 2160), (N/A, 40)
  1456. -
  1457. -country UY:
  1458. - (2402 - 2482 @ 40), (N/A, 20)
  1459. - (5170 - 5250 @ 40), (3, 17)
  1460. - (5250 - 5330 @ 40), (3, 20), DFS
  1461. - (5490 - 5710 @ 40), (3, 20), DFS
  1462. - (5735 - 5835 @ 40), (3, 30)
  1463. -
  1464. -country UZ:
  1465. - (2402 - 2472 @ 40), (3, 27)
  1466. - (5170 - 5250 @ 40), (3, 17)
  1467. - (5250 - 5330 @ 40), (3, 20), DFS
  1468. - (5490 - 5710 @ 40), (3, 20), DFS
  1469. - (5735 - 5835 @ 40), (3, 30)
  1470. -
  1471. -country VE:
  1472. - (2402 - 2482 @ 40), (N/A, 20)
  1473. - (5735 - 5815 @ 40), (N/A, 23)
  1474. -
  1475. -country VN:
  1476. - (2402 - 2482 @ 40), (N/A, 20)
  1477. - (5170 - 5250 @ 80), (3, 17)
  1478. - (5250 - 5330 @ 80), (3, 24), DFS
  1479. - (5490 - 5710 @ 80), (3, 24), DFS
  1480. - (5735 - 5835 @ 80), (3, 30)
  1481. + (57240 - 63720 @ 2160), (40)
  1482. +
  1483. +country UY: DFS-FCC
  1484. + (2402 - 2482 @ 40), (20)
  1485. + (5170 - 5250 @ 80), (17)
  1486. + (5250 - 5330 @ 80), (24), DFS
  1487. + (5490 - 5730 @ 80), (24), DFS
  1488. + (5735 - 5835 @ 80), (30)
  1489. +
  1490. +country UZ: DFS-FCC
  1491. + (2402 - 2472 @ 40), (30)
  1492. + (5170 - 5250 @ 80), (17)
  1493. + (5250 - 5330 @ 80), (24), DFS
  1494. + (5490 - 5730 @ 80), (24), DFS
  1495. + (5735 - 5835 @ 80), (30)
  1496. +
  1497. +country VE: DFS-FCC
  1498. + (2402 - 2482 @ 40), (20)
  1499. + (5170 - 5250 @ 80), (17)
  1500. + (5250 - 5330 @ 80), (23), DFS
  1501. + (5735 - 5835 @ 80), (30)
  1502. +
  1503. +country VN: DFS-FCC
  1504. + (2402 - 2482 @ 40), (20)
  1505. + (5170 - 5250 @ 80), (17)
  1506. + (5250 - 5330 @ 80), (24), DFS
  1507. + (5490 - 5730 @ 80), (24), DFS
  1508. + (5735 - 5835 @ 80), (30)
  1509. country YE:
  1510. - (2402 - 2482 @ 40), (N/A, 20)
  1511. -
  1512. -country ZA:
  1513. - (2402 - 2482 @ 40), (N/A, 20)
  1514. - (5170 - 5250 @ 80), (3, 17)
  1515. - (5250 - 5330 @ 80), (3, 24), DFS
  1516. - (5490 - 5710 @ 80), (3, 24), DFS
  1517. - (5735 - 5835 @ 80), (3, 30)
  1518. -
  1519. -country ZW:
  1520. - (2402 - 2482 @ 40), (N/A, 20)
  1521. + (2402 - 2482 @ 40), (20)
  1522. +
  1523. +country ZA: DFS-ETSI
  1524. + (2402 - 2482 @ 40), (20)
  1525. + (5170 - 5250 @ 80), (20)
  1526. + (5250 - 5330 @ 80), (20), DFS
  1527. + (5490 - 5710 @ 80), (27), DFS
  1528. +
  1529. +country ZW: DFS-ETSI
  1530. + (2402 - 2482 @ 40), (20)
  1531. + (5170 - 5250 @ 80), (20)
  1532. + (5250 - 5330 @ 80), (20), DFS
  1533. + (5490 - 5710 @ 80), (27), DFS
  1534. diff --git a/package/mac80211/patches/001-fix_build.patch b/package/mac80211/patches/001-fix_build.patch
  1535. index 26b327a..99ef50e 100644
  1536. --- a/package/mac80211/patches/001-fix_build.patch
  1537. +++ b/package/mac80211/patches/001-fix_build.patch
  1538. @@ -131,7 +131,7 @@
  1539. .PHONY: defconfig-help
  1540. --- a/Makefile.real
  1541. +++ b/Makefile.real
  1542. -@@ -54,7 +54,7 @@ defconfig-%::
  1543. +@@ -59,7 +59,7 @@ defconfig-%::
  1544. backport-include/backport/autoconf.h: .config Kconfig.versions Kconfig.kernel
  1545. @$(MAKE) oldconfig
  1546. @@ -140,7 +140,7 @@
  1547. @grep -f .local-symbols .config | ( \
  1548. echo "#ifndef COMPAT_AUTOCONF_INCLUDED" ;\
  1549. echo "#define COMPAT_AUTOCONF_INCLUDED" ;\
  1550. -@@ -75,7 +75,12 @@ backport-include/backport/autoconf.h: .c
  1551. +@@ -80,7 +80,12 @@ backport-include/backport/autoconf.h: .c
  1552. esac ;\
  1553. done ;\
  1554. echo "#endif /* COMPAT_AUTOCONF_INCLUDED */" ;\
  1555. diff --git a/package/mac80211/patches/003-remove_bogus_modparams.patch b/package/mac80211/patches/003-remove_bogus_modparams.patch
  1556. index c969b19..ffb730b 100644
  1557. --- a/package/mac80211/patches/003-remove_bogus_modparams.patch
  1558. +++ b/package/mac80211/patches/003-remove_bogus_modparams.patch
  1559. @@ -1,6 +1,6 @@
  1560. --- a/compat/main.c
  1561. +++ b/compat/main.c
  1562. -@@ -21,31 +21,6 @@ MODULE_LICENSE("GPL");
  1563. +@@ -20,31 +20,6 @@ MODULE_LICENSE("GPL");
  1564. #error "You need a BACKPORTS_VERSION"
  1565. #endif
  1566. diff --git a/package/mac80211/patches/004-backports-add-led_trigger_blink-_oneshot.patch b/package/mac80211/patches/004-backports-add-led_trigger_blink-_oneshot.patch
  1567. index 584fb05..8d97224 100644
  1568. --- a/package/mac80211/patches/004-backports-add-led_trigger_blink-_oneshot.patch
  1569. +++ b/package/mac80211/patches/004-backports-add-led_trigger_blink-_oneshot.patch
  1570. @@ -18,8 +18,8 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
  1571. --- a/backport-include/backport/leds-disabled.h
  1572. +++ b/backport-include/backport/leds-disabled.h
  1573. -@@ -163,6 +163,19 @@ static inline void led_trigger_event(str
  1574. - enum led_brightness event)
  1575. +@@ -176,6 +176,19 @@ static inline void led_trigger_blink_one
  1576. + int invert)
  1577. {
  1578. }
  1579. +
  1580. diff --git a/package/mac80211/patches/005-make-genregdb.awk-skip-antenna-gain.patch b/package/mac80211/patches/005-make-genregdb.awk-skip-antenna-gain.patch
  1581. new file mode 100644
  1582. index 0000000..55bffbc
  1583. --- /dev/null
  1584. +++ b/package/mac80211/patches/005-make-genregdb.awk-skip-antenna-gain.patch
  1585. @@ -0,0 +1,44 @@
  1586. +From: Luis R. Rodriguez <mcgrof@do-not-panic.com>
  1587. +Date: Wed, 23 Oct 2013 14:55:36 -0400
  1588. +Subject: [RFC] cfg80211: make genregdb.awk skip antenna gain
  1589. +
  1590. +Now that wireless-regdb doesn't include
  1591. +antenna gain lets skip parsing it completely
  1592. +for when CONFIG_CFG80211_INTERNAL_REGDB is
  1593. +enabled.
  1594. +
  1595. +Signed-off-by: Luis R. Rodriguez <mcgrof@do-not-panic.com>
  1596. +---
  1597. + net/wireless/genregdb.awk | 11 ++++-------
  1598. + 1 file changed, 4 insertions(+), 7 deletions(-)
  1599. + mode change 100644 => 100755 net/wireless/genregdb.awk
  1600. +
  1601. +--- a/net/wireless/genregdb.awk
  1602. ++++ b/net/wireless/genregdb.awk
  1603. +@@ -56,14 +56,11 @@ function parse_reg_rule()
  1604. + end = $3
  1605. + bw = $5
  1606. + sub(/\),/, "", bw)
  1607. +- gain = $6
  1608. +- sub(/\(/, "", gain)
  1609. +- sub(/,/, "", gain)
  1610. +- power = $7
  1611. +- sub(/\)/, "", power)
  1612. ++ power = $6
  1613. ++ sub(/\(/, "", power)
  1614. + sub(/,/, "", power)
  1615. + # power might be in mW...
  1616. +- units = $8
  1617. ++ units = $7
  1618. + sub(/\)/, "", units)
  1619. + sub(/,/, "", units)
  1620. + dfs_cac = $9
  1621. +@@ -86,7 +83,7 @@ function parse_reg_rule()
  1622. + sub(/\(/, "", dfs_cac)
  1623. + sub(/\)/, "", dfs_cac)
  1624. + flagstr = ""
  1625. +- for (i=8; i<=NF; i++)
  1626. ++ for (i=7; i<=NF; i++)
  1627. + flagstr = flagstr $i
  1628. + split(flagstr, flagarray, ",")
  1629. + flags = ""
  1630. diff --git a/package/mac80211/patches/007-select_queue.patch b/package/mac80211/patches/007-select_queue.patch
  1631. new file mode 100644
  1632. index 0000000..0a1d292
  1633. --- /dev/null
  1634. +++ b/package/mac80211/patches/007-select_queue.patch
  1635. @@ -0,0 +1,11 @@
  1636. +--- a/drivers/net/wireless/mwifiex/main.c
  1637. ++++ b/drivers/net/wireless/mwifiex/main.c
  1638. +@@ -745,7 +745,7 @@ static struct net_device_stats *mwifiex_
  1639. + return &priv->stats;
  1640. + }
  1641. +
  1642. +-#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,15,0)
  1643. ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)
  1644. + static u16
  1645. + mwifiex_netdev_select_wmm_queue(struct net_device *dev, struct sk_buff *skb,
  1646. + void *accel_priv, select_queue_fallback_t fallback)
  1647. diff --git a/package/mac80211/patches/020-disable_tty_set_termios.patch b/package/mac80211/patches/020-disable_tty_set_termios.patch
  1648. deleted file mode 100644
  1649. index e6d4ff6..0000000
  1650. --- a/package/mac80211/patches/020-disable_tty_set_termios.patch
  1651. +++ /dev/null
  1652. @@ -1,16 +0,0 @@
  1653. ---- a/compat/compat-2.6.39.c
  1654. -+++ b/compat/compat-2.6.39.c
  1655. -@@ -13,6 +13,7 @@
  1656. - #include <linux/sched.h>
  1657. - #include <linux/module.h>
  1658. -
  1659. -+#ifdef CONFIG_COMPAT_BLUETOOTH
  1660. - #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
  1661. - #ifdef CONFIG_TTY
  1662. - /*
  1663. -@@ -114,4 +115,4 @@ int tty_set_termios(struct tty_struct *t
  1664. - EXPORT_SYMBOL_GPL(tty_set_termios);
  1665. - #endif /* CONFIG_TTY */
  1666. - #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)) */
  1667. --
  1668. -+#endif
  1669. diff --git a/package/mac80211/patches/050-lib80211_option.patch b/package/mac80211/patches/050-lib80211_option.patch
  1670. index 5372114..168871a 100644
  1671. --- a/package/mac80211/patches/050-lib80211_option.patch
  1672. +++ b/package/mac80211/patches/050-lib80211_option.patch
  1673. @@ -1,6 +1,6 @@
  1674. --- a/net/wireless/Kconfig
  1675. +++ b/net/wireless/Kconfig
  1676. -@@ -123,7 +123,7 @@ config CFG80211_WEXT
  1677. +@@ -160,7 +160,7 @@ config CFG80211_WEXT
  1678. extensions with cfg80211-based drivers.
  1679. config LIB80211
  1680. @@ -9,7 +9,7 @@
  1681. depends on m
  1682. default n
  1683. help
  1684. -@@ -133,15 +133,15 @@ config LIB80211
  1685. +@@ -170,15 +170,15 @@ config LIB80211
  1686. Drivers should select this themselves if needed.
  1687. config LIB80211_CRYPT_WEP
  1688. diff --git a/package/mac80211/patches/060-no_local_ssb_bcma.patch b/package/mac80211/patches/060-no_local_ssb_bcma.patch
  1689. index f4b9470..93197ae 100644
  1690. --- a/package/mac80211/patches/060-no_local_ssb_bcma.patch
  1691. +++ b/package/mac80211/patches/060-no_local_ssb_bcma.patch
  1692. @@ -1,6 +1,6 @@
  1693. --- a/.local-symbols
  1694. +++ b/.local-symbols
  1695. -@@ -379,42 +379,6 @@ USB_CDC_PHONET=
  1696. +@@ -403,42 +403,6 @@ USB_CDC_PHONET=
  1697. USB_IPHETH=
  1698. USB_SIERRA_NET=
  1699. USB_VL600=
  1700. @@ -68,7 +68,7 @@
  1701. obj-$(CPTCFG_NFC) += net/nfc/
  1702. --- a/drivers/net/wireless/b43/main.c
  1703. +++ b/drivers/net/wireless/b43/main.c
  1704. -@@ -2734,7 +2734,7 @@ static struct ssb_device *b43_ssb_gpio_d
  1705. +@@ -2733,7 +2733,7 @@ static struct ssb_device *b43_ssb_gpio_d
  1706. {
  1707. struct ssb_bus *bus = dev->dev->sdev->bus;
  1708. @@ -77,12 +77,12 @@
  1709. return (bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev);
  1710. #else
  1711. return bus->chipco.dev;
  1712. -@@ -4751,7 +4751,7 @@ static int b43_wireless_core_init(struct
  1713. +@@ -4698,7 +4698,7 @@ static int b43_wireless_core_init(struct
  1714. }
  1715. if (sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW)
  1716. hf |= B43_HF_DSCRQ; /* Disable slowclock requests from ucode. */
  1717. --#ifdef CPTCFG_SSB_DRIVER_PCICORE
  1718. -+#ifdef CONFIG_SSB_DRIVER_PCICORE
  1719. +-#if defined(CPTCFG_B43_SSB) && defined(CPTCFG_SSB_DRIVER_PCICORE)
  1720. ++#if defined(CPTCFG_B43_SSB) && defined(CONFIG_SSB_DRIVER_PCICORE)
  1721. if (dev->dev->bus_type == B43_BUS_SSB &&
  1722. dev->dev->sdev->bus->bustype == SSB_BUSTYPE_PCI &&
  1723. dev->dev->sdev->bus->pcicore.dev->id.revision <= 10)
  1724. diff --git a/package/mac80211/patches/070-add-missing-header.patch b/package/mac80211/patches/070-add-missing-header.patch
  1725. new file mode 100644
  1726. index 0000000..e3ec780
  1727. --- /dev/null
  1728. +++ b/package/mac80211/patches/070-add-missing-header.patch
  1729. @@ -0,0 +1,10 @@
  1730. +--- a/compat/backport-3.15.c
  1731. ++++ b/compat/backport-3.15.c
  1732. +@@ -12,6 +12,7 @@
  1733. + #include <linux/kernel.h>
  1734. + #include <linux/device.h>
  1735. + #include <linux/of.h>
  1736. ++#include <linux/string.h>
  1737. + #include <net/net_namespace.h>
  1738. +
  1739. + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,5,0))
  1740. diff --git a/package/mac80211/patches/100-revert_aes_ccm_port.patch b/package/mac80211/patches/100-revert_aes_ccm_port.patch
  1741. index 4654bc8..640d34e 100644
  1742. --- a/package/mac80211/patches/100-revert_aes_ccm_port.patch
  1743. +++ b/package/mac80211/patches/100-revert_aes_ccm_port.patch
  1744. @@ -4,7 +4,7 @@
  1745. depends on CRYPTO
  1746. depends on CRYPTO_ARC4
  1747. depends on CRYPTO_AES
  1748. -- depends on CRYPTO_CCM
  1749. +- select BACKPORT_CRYPTO_CCM
  1750. depends on CRC32
  1751. select BACKPORT_AVERAGE
  1752. ---help---
  1753. @@ -19,35 +19,17 @@
  1754. * This program is free software; you can redistribute it and/or modify
  1755. * it under the terms of the GNU General Public License version 2 as
  1756. * published by the Free Software Foundation.
  1757. -@@ -19,75 +17,134 @@
  1758. +@@ -19,76 +17,134 @@
  1759. #include "key.h"
  1760. #include "aes_ccm.h"
  1761. -void ieee80211_aes_ccm_encrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
  1762. - u8 *data, size_t data_len, u8 *mic)
  1763. +static void aes_ccm_prepare(struct crypto_cipher *tfm, u8 *scratch, u8 *a)
  1764. - {
  1765. -- struct scatterlist assoc, pt, ct[2];
  1766. -- struct {
  1767. -- struct aead_request req;
  1768. -- u8 priv[crypto_aead_reqsize(tfm)];
  1769. -- } aead_req;
  1770. --
  1771. -- memset(&aead_req, 0, sizeof(aead_req));
  1772. --
  1773. -- sg_init_one(&pt, data, data_len);
  1774. -- sg_init_one(&assoc, &aad[2], be16_to_cpup((__be16 *)aad));
  1775. -- sg_init_table(ct, 2);
  1776. -- sg_set_buf(&ct[0], data, data_len);
  1777. -- sg_set_buf(&ct[1], mic, IEEE80211_CCMP_MIC_LEN);
  1778. --
  1779. -- aead_request_set_tfm(&aead_req.req, tfm);
  1780. -- aead_request_set_assoc(&aead_req.req, &assoc, assoc.length);
  1781. -- aead_request_set_crypt(&aead_req.req, &pt, ct, data_len, b_0);
  1782. ++{
  1783. + int i;
  1784. + u8 *b_0, *aad, *b, *s_0;
  1785. -
  1786. -- crypto_aead_encrypt(&aead_req.req);
  1787. ++
  1788. + b_0 = scratch + 3 * AES_BLOCK_SIZE;
  1789. + aad = scratch + 4 * AES_BLOCK_SIZE;
  1790. + b = scratch;
  1791. @@ -73,22 +55,23 @@
  1792. + b_0[14] = 0;
  1793. + b_0[15] = 0;
  1794. + crypto_cipher_encrypt_one(tfm, s_0, b_0);
  1795. - }
  1796. -
  1797. --int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
  1798. -- u8 *data, size_t data_len, u8 *mic)
  1799. ++}
  1800. ++
  1801. +
  1802. +void ieee80211_aes_ccm_encrypt(struct crypto_cipher *tfm, u8 *scratch,
  1803. + u8 *data, size_t data_len,
  1804. + u8 *cdata, u8 *mic)
  1805. {
  1806. - struct scatterlist assoc, pt, ct[2];
  1807. -- struct {
  1808. -- struct aead_request req;
  1809. -- u8 priv[crypto_aead_reqsize(tfm)];
  1810. -- } aead_req;
  1811. ++ int i, j, last_len, num_blocks;
  1812. ++ u8 *pos, *cpos, *b, *s_0, *e, *b_0;
  1813. +
  1814. +- char aead_req_data[sizeof(struct aead_request) +
  1815. +- crypto_aead_reqsize(tfm)]
  1816. +- __aligned(__alignof__(struct aead_request));
  1817. +- struct aead_request *aead_req = (void *) aead_req_data;
  1818. -
  1819. -- memset(&aead_req, 0, sizeof(aead_req));
  1820. +- memset(aead_req, 0, sizeof(aead_req_data));
  1821. -
  1822. - sg_init_one(&pt, data, data_len);
  1823. - sg_init_one(&assoc, &aad[2], be16_to_cpup((__be16 *)aad));
  1824. @@ -96,13 +79,9 @@
  1825. - sg_set_buf(&ct[0], data, data_len);
  1826. - sg_set_buf(&ct[1], mic, IEEE80211_CCMP_MIC_LEN);
  1827. -
  1828. -- aead_request_set_tfm(&aead_req.req, tfm);
  1829. -- aead_request_set_assoc(&aead_req.req, &assoc, assoc.length);
  1830. -- aead_request_set_crypt(&aead_req.req, ct, &pt,
  1831. -- data_len + IEEE80211_CCMP_MIC_LEN, b_0);
  1832. -+ int i, j, last_len, num_blocks;
  1833. -+ u8 *pos, *cpos, *b, *s_0, *e, *b_0;
  1834. -+
  1835. +- aead_request_set_tfm(aead_req, tfm);
  1836. +- aead_request_set_assoc(aead_req, &assoc, assoc.length);
  1837. +- aead_request_set_crypt(aead_req, &pt, ct, data_len, b_0);
  1838. + b = scratch;
  1839. + s_0 = scratch + AES_BLOCK_SIZE;
  1840. + e = scratch + 2 * AES_BLOCK_SIZE;
  1841. @@ -131,30 +110,38 @@
  1842. + *cpos++ = *pos++ ^ e[i];
  1843. + }
  1844. -- return crypto_aead_decrypt(&aead_req.req);
  1845. +- crypto_aead_encrypt(aead_req);
  1846. + for (i = 0; i < IEEE80211_CCMP_MIC_LEN; i++)
  1847. + mic[i] = b[i] ^ s_0[i];
  1848. }
  1849. --struct crypto_aead *ieee80211_aes_key_setup_encrypt(const u8 key[])
  1850. +-int ieee80211_aes_ccm_decrypt(struct crypto_aead *tfm, u8 *b_0, u8 *aad,
  1851. +- u8 *data, size_t data_len, u8 *mic)
  1852. +
  1853. +int ieee80211_aes_ccm_decrypt(struct crypto_cipher *tfm, u8 *scratch,
  1854. + u8 *cdata, size_t data_len, u8 *mic, u8 *data)
  1855. {
  1856. -- struct crypto_aead *tfm;
  1857. -- int err;
  1858. +- struct scatterlist assoc, pt, ct[2];
  1859. +- char aead_req_data[sizeof(struct aead_request) +
  1860. +- crypto_aead_reqsize(tfm)]
  1861. +- __aligned(__alignof__(struct aead_request));
  1862. +- struct aead_request *aead_req = (void *) aead_req_data;
  1863. +-
  1864. +- memset(aead_req, 0, sizeof(aead_req_data));
  1865. +-
  1866. +- sg_init_one(&pt, data, data_len);
  1867. +- sg_init_one(&assoc, &aad[2], be16_to_cpup((__be16 *)aad));
  1868. +- sg_init_table(ct, 2);
  1869. +- sg_set_buf(&ct[0], data, data_len);
  1870. +- sg_set_buf(&ct[1], mic, IEEE80211_CCMP_MIC_LEN);
  1871. +-
  1872. +- aead_request_set_tfm(aead_req, tfm);
  1873. +- aead_request_set_assoc(aead_req, &assoc, assoc.length);
  1874. +- aead_request_set_crypt(aead_req, ct, &pt,
  1875. +- data_len + IEEE80211_CCMP_MIC_LEN, b_0);
  1876. + int i, j, last_len, num_blocks;
  1877. + u8 *pos, *cpos, *b, *s_0, *a, *b_0;
  1878. -
  1879. -- tfm = crypto_alloc_aead("ccm(aes)", 0, CRYPTO_ALG_ASYNC);
  1880. -- if (IS_ERR(tfm))
  1881. -- return tfm;
  1882. --
  1883. -- err = crypto_aead_setkey(tfm, key, WLAN_KEY_LEN_CCMP);
  1884. -- if (!err)
  1885. -- err = crypto_aead_setauthsize(tfm, IEEE80211_CCMP_MIC_LEN);
  1886. -- if (!err)
  1887. -- return tfm;
  1888. ++
  1889. + b = scratch;
  1890. + s_0 = scratch + AES_BLOCK_SIZE;
  1891. + a = scratch + 2 * AES_BLOCK_SIZE;
  1892. @@ -187,24 +174,37 @@
  1893. + return -1;
  1894. + }
  1895. -- crypto_free_aead(tfm);
  1896. -- return ERR_PTR(err);
  1897. +- return crypto_aead_decrypt(aead_req);
  1898. + return 0;
  1899. }
  1900. --void ieee80211_aes_key_free(struct crypto_aead *tfm)
  1901. +-struct crypto_aead *ieee80211_aes_key_setup_encrypt(const u8 key[])
  1902. +
  1903. +struct crypto_cipher *ieee80211_aes_key_setup_encrypt(const u8 key[])
  1904. -+{
  1905. + {
  1906. +- struct crypto_aead *tfm;
  1907. +- int err;
  1908. + struct crypto_cipher *tfm;
  1909. -+
  1910. +
  1911. +- tfm = crypto_alloc_aead("ccm(aes)", 0, CRYPTO_ALG_ASYNC);
  1912. +- if (IS_ERR(tfm))
  1913. +- return tfm;
  1914. +-
  1915. +- err = crypto_aead_setkey(tfm, key, WLAN_KEY_LEN_CCMP);
  1916. +- if (!err)
  1917. +- err = crypto_aead_setauthsize(tfm, IEEE80211_CCMP_MIC_LEN);
  1918. +- if (!err)
  1919. +- return tfm;
  1920. + tfm = crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
  1921. + if (!IS_ERR(tfm))
  1922. + crypto_cipher_setkey(tfm, key, WLAN_KEY_LEN_CCMP);
  1923. -+
  1924. +
  1925. +- crypto_free_aead(tfm);
  1926. +- return ERR_PTR(err);
  1927. + return tfm;
  1928. -+}
  1929. -+
  1930. + }
  1931. +
  1932. +-void ieee80211_aes_key_free(struct crypto_aead *tfm)
  1933. +
  1934. +void ieee80211_aes_key_free(struct crypto_cipher *tfm)
  1935. {
  1936. @@ -246,13 +246,13 @@
  1937. struct {
  1938. --- a/net/mac80211/wpa.c
  1939. +++ b/net/mac80211/wpa.c
  1940. -@@ -301,16 +301,22 @@ ieee80211_crypto_tkip_decrypt(struct iee
  1941. +@@ -301,15 +301,22 @@ ieee80211_crypto_tkip_decrypt(struct iee
  1942. }
  1943. --static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *b_0, u8 *aad,
  1944. +-static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *b_0, u8 *aad)
  1945. +static void ccmp_special_blocks(struct sk_buff *skb, u8 *pn, u8 *scratch,
  1946. - int encrypted)
  1947. ++ int encrypted)
  1948. {
  1949. __le16 mask_fc;
  1950. int a4_included, mgmt;
  1951. @@ -271,7 +271,7 @@
  1952. /*
  1953. * Mask FC: zero subtype b4 b5 b6 (if not mgmt)
  1954. * Retry, PwrMgt, MoreData; set Protected
  1955. -@@ -332,21 +338,20 @@ static void ccmp_special_blocks(struct s
  1956. +@@ -331,21 +338,20 @@ static void ccmp_special_blocks(struct s
  1957. else
  1958. qos_tid = 0;
  1959. @@ -300,7 +300,7 @@
  1960. /* AAD (extra authenticate-only data) / masked 802.11 header
  1961. * FC | A1 | A2 | A3 | SC | [A4] | [QC] */
  1962. -@@ -402,8 +407,7 @@ static int ccmp_encrypt_skb(struct ieee8
  1963. +@@ -401,8 +407,7 @@ static int ccmp_encrypt_skb(struct ieee8
  1964. u8 *pos;
  1965. u8 pn[6];
  1966. u64 pn64;
  1967. @@ -310,11 +310,11 @@
  1968. if (info->control.hw_key &&
  1969. !(info->control.hw_key->flags & IEEE80211_KEY_FLAG_GENERATE_IV) &&
  1970. -@@ -456,9 +460,9 @@ static int ccmp_encrypt_skb(struct ieee8
  1971. +@@ -458,9 +463,9 @@ static int ccmp_encrypt_skb(struct ieee8
  1972. return 0;
  1973. pos += IEEE80211_CCMP_HDR_LEN;
  1974. -- ccmp_special_blocks(skb, pn, b_0, aad, 0);
  1975. +- ccmp_special_blocks(skb, pn, b_0, aad);
  1976. - ieee80211_aes_ccm_encrypt(key->u.ccmp.tfm, b_0, aad, pos, len,
  1977. - skb_put(skb, IEEE80211_CCMP_MIC_LEN));
  1978. + ccmp_special_blocks(skb, pn, scratch, 0);
  1979. @@ -323,7 +323,7 @@
  1980. return 0;
  1981. }
  1982. -@@ -521,16 +525,16 @@ ieee80211_crypto_ccmp_decrypt(struct iee
  1983. +@@ -523,16 +528,16 @@ ieee80211_crypto_ccmp_decrypt(struct iee
  1984. }
  1985. if (!(status->flag & RX_FLAG_DECRYPTED)) {
  1986. @@ -331,7 +331,7 @@
  1987. - u8 b_0[AES_BLOCK_SIZE];
  1988. + u8 scratch[6 * AES_BLOCK_SIZE];
  1989. /* hardware didn't decrypt/verify MIC */
  1990. -- ccmp_special_blocks(skb, pn, b_0, aad, 1);
  1991. +- ccmp_special_blocks(skb, pn, b_0, aad);
  1992. + ccmp_special_blocks(skb, pn, scratch, 1);
  1993. if (ieee80211_aes_ccm_decrypt(
  1994. diff --git a/package/mac80211/patches/150-disable_addr_notifier.patch b/package/mac80211/patches/150-disable_addr_notifier.patch
  1995. index 7b50154..6a7f5c1 100644
  1996. --- a/package/mac80211/patches/150-disable_addr_notifier.patch
  1997. +++ b/package/mac80211/patches/150-disable_addr_notifier.patch
  1998. @@ -1,6 +1,6 @@
  1999. --- a/net/mac80211/main.c
  2000. +++ b/net/mac80211/main.c
  2001. -@@ -287,7 +287,7 @@ void ieee80211_restart_hw(struct ieee802
  2002. +@@ -285,7 +285,7 @@ void ieee80211_restart_hw(struct ieee802
  2003. }
  2004. EXPORT_SYMBOL(ieee80211_restart_hw);
  2005. @@ -9,7 +9,7 @@
  2006. static int ieee80211_ifa_changed(struct notifier_block *nb,
  2007. unsigned long data, void *arg)
  2008. {
  2009. -@@ -346,7 +346,7 @@ static int ieee80211_ifa_changed(struct
  2010. +@@ -344,7 +344,7 @@ static int ieee80211_ifa_changed(struct
  2011. }
  2012. #endif
  2013. @@ -18,7 +18,7 @@
  2014. static int ieee80211_ifa6_changed(struct notifier_block *nb,
  2015. unsigned long data, void *arg)
  2016. {
  2017. -@@ -1031,14 +1031,14 @@ int ieee80211_register_hw(struct ieee802
  2018. +@@ -1036,14 +1036,14 @@ int ieee80211_register_hw(struct ieee802
  2019. goto fail_pm_qos;
  2020. }
  2021. @@ -35,7 +35,7 @@
  2022. local->ifa6_notifier.notifier_call = ieee80211_ifa6_changed;
  2023. result = register_inet6addr_notifier(&local->ifa6_notifier);
  2024. if (result)
  2025. -@@ -1047,13 +1047,13 @@ int ieee80211_register_hw(struct ieee802
  2026. +@@ -1052,13 +1052,13 @@ int ieee80211_register_hw(struct ieee802
  2027. return 0;
  2028. @@ -52,7 +52,7 @@
  2029. fail_ifa:
  2030. pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY,
  2031. &local->network_latency_notifier);
  2032. -@@ -1086,10 +1086,10 @@ void ieee80211_unregister_hw(struct ieee
  2033. +@@ -1103,10 +1103,10 @@ void ieee80211_unregister_hw(struct ieee
  2034. pm_qos_remove_notifier(PM_QOS_NETWORK_LATENCY,
  2035. &local->network_latency_notifier);
  2036. diff --git a/package/mac80211/patches/300-pending_work.patch b/package/mac80211/patches/300-pending_work.patch
  2037. index a1af6c2..3305388 100644
  2038. --- a/package/mac80211/patches/300-pending_work.patch
  2039. +++ b/package/mac80211/patches/300-pending_work.patch
  2040. @@ -1,4153 +1,2752 @@
  2041. -commit 93f310a38a1d81a4bc8fcd9bf29628bd721cf2ef
  2042. -Author: Felix Fietkau <nbd@openwrt.org>
  2043. -Date: Sun Apr 6 23:35:28 2014 +0200
  2044. -
  2045. - ath9k_hw: reduce ANI firstep range for older chips
  2046. -
  2047. - Use 0-8 instead of 0-16, which is closer to the old implementation.
  2048. - Also drop the overwrite of the firstep_low parameter to improve
  2049. - stability.
  2050. -
  2051. - Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  2052. -
  2053. -commit 584d297fd29fb39c76af25ae74ff9d5fe74c8a14
  2054. -Author: Helmut Schaa <helmut.schaa@googlemail.com>
  2055. -Date: Wed Mar 12 10:37:55 2014 +0100
  2056. -
  2057. - ath9k: Fix sequence number assignment for non-data frames
  2058. -
  2059. - Since commit 558ff225de80ac95b132d3a115ddadcd64498b4f (ath9k: fix
  2060. - ps-poll responses under a-mpdu sessions) non-data frames would have
  2061. - gotten a sequence number from a TIDs sequence counter instead of
  2062. - using the global sequence counter.
  2063. -
  2064. - This can lead to instable connections.
  2065. -
  2066. - To fix this only select the correct TID if we are processing a
  2067. - data frame. Furthermore, prevent non-data frames to get a sequence
  2068. - number from a TID sequence counter by adding a check to
  2069. - ath_tx_setup_buffer.
  2070. -
  2071. - Cc: Felix Fietkau <nbd@openwrt.org>
  2072. - Signed-off-by: Helmut Schaa <helmut.schaa@googlemail.com>
  2073. -
  2074. -commit 3a0f984b1cdcd6a9f8c441635ef3b05d58547f4e
  2075. -Author: Felix Fietkau <nbd@openwrt.org>
  2076. -Date: Tue Mar 11 14:03:32 2014 +0100
  2077. -
  2078. - ath9k_hw: set ANI firstep as absolute values instead of relative
  2079. -
  2080. - On older chips, the INI value differ in similar ways as cycpwr_thr1, so
  2081. - convert it to absolute values as well.
  2082. -
  2083. - Since the ANI algorithm is different here compared to the old
  2084. - implementation (fewer steps, controlled at a different point in time),
  2085. - it makes sense to use values similar to what would be applied for newer
  2086. - chips, just without relying on INI defaults.
  2087. -
  2088. - Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  2089. -
  2090. -commit 91d70d40400c569b49605b78fd7c43e9405694f4
  2091. -Author: Felix Fietkau <nbd@openwrt.org>
  2092. -Date: Tue Mar 11 14:00:37 2014 +0100
  2093. +commit d3a58df87a2e4c2301ac843604202d290a48440b
  2094. +Author: Avraham Stern <avraham.stern@intel.com>
  2095. +Date: Thu May 22 12:17:47 2014 +0300
  2096. - ath9k_hw: set ANI cycpwr_thr1 as absolute values instead of relative
  2097. -
  2098. - The table was copied from the ANI implementation of AR9300. It assumes
  2099. - that the INI values contain a baseline value that is usable as reference
  2100. - from which to increase/decrease based on the noise immunity value.
  2101. + mac80211: set new interfaces as idle upon init
  2102. - On older chips, the differences are bigger and especially AR5008/AR9001
  2103. - are configured to much more sensitive values than what is useful.
  2104. + Mark new interfaces as idle to allow operations that require that
  2105. + interfaces are idle to take place. Interface types that are always
  2106. + not idle (like AP interfaces) will be set as not idle when they are
  2107. + assigned a channel context.
  2108. - Improve ANI behavior by reverting to the absolute values used in the
  2109. - previous implementation (expressed as a simple formula instead of the
  2110. - old table).
  2111. -
  2112. - Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  2113. + Signed-off-by: Avraham Stern <avraham.stern@intel.com>
  2114. + Signed-off-by: Emmanuel Grumbach<emmanuel.grumbach@intel.com>
  2115. + Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  2116. -commit c977493766310a825f406836636ffd66e1447783
  2117. -Author: Felix Fietkau <nbd@openwrt.org>
  2118. -Date: Mon Mar 10 19:52:56 2014 +0100
  2119. +commit 923eaf367206e01f22c97aee22300e332d071916
  2120. +Author: Arik Nemtsov <arik@wizery.com>
  2121. +Date: Mon May 26 14:40:51 2014 +0300
  2122. - ath9k_hw: remove ANI function restrictions for AP mode
  2123. + mac80211: don't check netdev state for debugfs read/write
  2124. - The primary purpose of this piece of code was to selectively disable
  2125. - OFDM weak signal detection. The checks for this are elsewhere, and an
  2126. - earlier commit relaxed the restrictions for older chips, which are more
  2127. - sensitive to interference.
  2128. + Doing so will lead to an oops for a p2p-dev interface, since it has
  2129. + no netdev.
  2130. - Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  2131. -
  2132. -commit 8d804f1af11e4e058b1e8453327777d73a585cb8
  2133. -Author: Felix Fietkau <nbd@openwrt.org>
  2134. -Date: Sun Mar 9 11:25:43 2014 +0100
  2135. + Cc: stable@vger.kernel.org
  2136. + Signed-off-by: Arik Nemtsov <arikx.nemtsov@intel.com>
  2137. + Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
  2138. + Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  2139. - ath9k: clean up and enhance ANI debugfs file
  2140. -
  2141. - Unify scnprintf calls and include the current OFDM/CCK immunity level.
  2142. -
  2143. - Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  2144. +commit a9fb54169b197f31aff24c8d6270dd1e56cde395
  2145. +Author: chaitanya.mgit@gmail.com <chaitanya.mgit@gmail.com>
  2146. +Date: Mon May 26 18:01:44 2014 +0530
  2147. +
  2148. + regdb: Generalize the mW to dBm power conversion
  2149. +
  2150. + Generalize the power conversion from mW to dBm
  2151. + using log. This should fix the below compilation
  2152. + error for country NO which adds a new power value
  2153. + 2000mW which is not handled earlier.
  2154. +
  2155. + CC [M] net/wireless/wext-sme.o
  2156. + CC [M] net/wireless/regdb.o
  2157. + net/wireless/regdb.c:1130:1: error: Unknown undeclared here (not in
  2158. + a function)
  2159. + net/wireless/regdb.c:1130:9: error: expected } before power
  2160. + make[2]: *** [net/wireless/regdb.o] Error 1
  2161. + make[1]: *** [net/wireless] Error 2
  2162. + make: *** [net] Error 2
  2163. +
  2164. + Reported-By: John Walker <john@x109.net>
  2165. + Signed-off-by: Chaitanya T K <chaitanya.mgit@gmail.com>
  2166. + Acked-by: John W. Linville <linville@tuxdriver.com>
  2167. + [remove unneeded parentheses, fix rounding by using %.0f]
  2168. + Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  2169. -commit 22e298b5a3a8a49e33805d4e351965123dede35b
  2170. -Author: Felix Fietkau <nbd@openwrt.org>
  2171. -Date: Sun Mar 9 10:58:47 2014 +0100
  2172. +commit c7d37a66e345df2fdf1aa7b2c9a6d3d53846ca5b
  2173. +Author: Krzysztof Hałasa <khalasa@piap.pl>
  2174. +Date: Mon May 26 14:14:46 2014 +0200
  2175. - ath9k: fix ready time of the multicast buffer queue
  2176. -
  2177. - qi->tqi_readyTime is written directly to registers that expect
  2178. - microseconds as unit instead of TU.
  2179. - When setting the CABQ ready time, cur_conf->beacon_interval is in TU, so
  2180. - convert it to microseconds before passing it to ath9k_hw.
  2181. + mac80211: fix IBSS join by initializing last_scan_completed
  2182. - This should hopefully fix some Tx DMA issues with buffered multicast
  2183. - frames in AP mode.
  2184. + Without this fix, freshly rebooted Linux creates a new IBSS
  2185. + instead of joining an existing one. Only when jiffies counter
  2186. + overflows after 5 minutes the IBSS can be successfully joined.
  2187. + Signed-off-by: Krzysztof Hałasa <khalasa@piap.pl>
  2188. + [edit commit message slightly]
  2189. Cc: stable@vger.kernel.org
  2190. - Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  2191. -
  2192. -commit fcb064fdd5a27bec8d24099bc0172468f34c97cb
  2193. -Author: Felix Fietkau <nbd@openwrt.org>
  2194. -Date: Sun Mar 9 09:43:09 2014 +0100
  2195. + Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  2196. - ath9k_hw: fix unreachable code in baseband hang detection code
  2197. -
  2198. - The commit "ath9k: reduce baseband hang detection false positive rate"
  2199. - added a delay in the loop checking the baseband state, however it was
  2200. - unreachable due to previous 'continue' statements.
  2201. -
  2202. - Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
  2203. - Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  2204. +commit 34171dc0d623be2c1032416bf7d3819f388ed70d
  2205. +Author: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
  2206. +Date: Sun May 25 15:35:41 2014 +0300
  2207. +
  2208. + mac80211: fix virtual monitor interface addition
  2209. +
  2210. + Since the commit below, cfg80211_chandef_dfs_required()
  2211. + will warn if it gets a an NL80211_IFTYPE_UNSPECIFIED iftype
  2212. + as explicitely written in the commit log.
  2213. + When an virtual monitor interface is added, its type is set
  2214. + in ieee80211_sub_if_data.vif.type, but not in
  2215. + ieee80211_sub_if_data.wdev.iftype which is passed to
  2216. + cfg80211_chandef_dfs_required() hence resulting in the
  2217. + following warning:
  2218. +
  2219. + WARNING: CPU: 1 PID: 21265 at net/wireless/chan.c:376 cfg80211_chandef_dfs_required+0xbc/0x130 [cfg80211]()
  2220. + Modules linked in: [...]
  2221. + CPU: 1 PID: 21265 Comm: ifconfig Tainted: G W O 3.13.11+ #12
  2222. + Hardware name: Dell Inc. Latitude E6410/0667CC, BIOS A01 03/05/2010
  2223. + 0000000000000009 ffff88008f5fdb08 ffffffff817d4219 ffff88008f5fdb50
  2224. + ffff88008f5fdb40 ffffffff8106f57d 0000000000000000 0000000000000000
  2225. + ffff880081062fb8 ffff8800810604e0 0000000000000001 ffff88008f5fdba0
  2226. + Call Trace:
  2227. + [<ffffffff817d4219>] dump_stack+0x4d/0x66
  2228. + [<ffffffff8106f57d>] warn_slowpath_common+0x7d/0xa0
  2229. + [<ffffffff8106f5ec>] warn_slowpath_fmt+0x4c/0x50
  2230. + [<ffffffffa04ea4ec>] cfg80211_chandef_dfs_required+0xbc/0x130 [cfg80211]
  2231. + [<ffffffffa06b1024>] ieee80211_vif_use_channel+0x94/0x500 [mac80211]
  2232. + [<ffffffffa0684e6b>] ieee80211_add_virtual_monitor+0x1ab/0x5c0 [mac80211]
  2233. + [<ffffffffa0686ae5>] ieee80211_do_open+0xe75/0x1580 [mac80211]
  2234. + [<ffffffffa0687259>] ieee80211_open+0x69/0x70 [mac80211]
  2235. + [snip]
  2236. +
  2237. + Fixes: 00ec75fc5a64 ("cfg80211: pass the actual iftype when calling cfg80211_chandef_dfs_required()")
  2238. + Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
  2239. + Acked-by: Luciano Coelho <luciano.coelho@intel.com>
  2240. + Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  2241. -commit 31959d8df39319e32c6d5ba9c135727be90cfad7
  2242. +commit d93cc72b37b4e2c314e1c499e80e8801907c2fea
  2243. Author: Michal Kazior <michal.kazior@tieto.com>
  2244. -Date: Fri Mar 7 08:09:38 2014 +0100
  2245. +Date: Thu Jun 5 14:21:37 2014 +0200
  2246. - mac80211: fix possible NULL dereference
  2247. -
  2248. - If chanctx is missing on a given vif then the band
  2249. - is assumed to be 2GHz. However if hw doesn't
  2250. - support 2GHz band then mac80211 ended up with a
  2251. - NULL dereference.
  2252. -
  2253. - This fixes a splat:
  2254. + mac80211: use csa counter offsets instead of csa_active
  2255. - [ 4605.207223] BUG: unable to handle kernel NULL pointer dereference at 0000000000000018
  2256. - [ 4605.210789] IP: [<ffffffffa07b5635>] ieee80211_parse_bitrates+0x65/0x110 [mac80211]
  2257. + vif->csa_active is protected by mutexes only. This
  2258. + means it is unreliable to depend on it on codeflow
  2259. + in non-sleepable beacon and CSA code. There was no
  2260. + guarantee to have vif->csa_active update be
  2261. + visible before beacons are updated on SMP systems.
  2262. - The splat was preceeded by WARN_ON(!chanctx_conf)
  2263. - in ieee80211_get_sdata_band().
  2264. + Using csa counter offsets which are embedded in
  2265. + beacon struct (and thus are protected with single
  2266. + RCU assignment) is much safer.
  2267. Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
  2268. -
  2269. -commit 6c5a3ffa0a2d22c091a2717f427259bacf77ac5e
  2270. -Author: Michael Braun <michael-dev@fami-braun.de>
  2271. -Date: Thu Mar 6 15:08:43 2014 +0100
  2272. -
  2273. - mac80211: fix WPA with VLAN on AP side with ps-sta again
  2274. -
  2275. - commit de74a1d9032f4d37ea453ad2a647e1aff4cd2591
  2276. - "mac80211: fix WPA with VLAN on AP side with ps-sta"
  2277. - fixed an issue where queued multicast packets would
  2278. - be sent out encrypted with the key of an other bss.
  2279. -
  2280. - commit "7cbf9d017dbb5e3276de7d527925d42d4c11e732"
  2281. - "mac80211: fix oops on mesh PS broadcast forwarding"
  2282. - essentially reverted it, because vif.type cannot be AP_VLAN
  2283. - due to the check to vif.type in ieee80211_get_buffered_bc before.
  2284. -
  2285. - As the later commit intended to fix the MESH case, fix it
  2286. - by checking for IFTYPE_AP instead of IFTYPE_AP_VLAN.
  2287. -
  2288. - Fixes: 7cbf9d017dbb
  2289. - Cc: <stable@vger.kernel.org> # 3.10.x
  2290. - Cc: <stable@vger.kernel.org> # 3.11.x
  2291. - Cc: <stable@vger.kernel.org> # 3.12.x
  2292. - Cc: <stable@vger.kernel.org> # 3.13.x
  2293. - Cc: <linux-wireless@vger.kernel.org>
  2294. - Cc: <projekt-wlan@fem.tu-ilmenau.de>
  2295. - Signed-off-by: Michael Braun <michael-dev@fami-braun.de>
  2296. -
  2297. -commit 9d6ab9bdb9b368a6cf9519f0f92509b5b2c297ec
  2298. -Author: Johannes Berg <johannes.berg@intel.com>
  2299. -Date: Mon Mar 3 14:19:08 2014 +0100
  2300. -
  2301. - cfg80211: remove racy beacon_interval assignment
  2302. -
  2303. - In case of AP mode, the beacon interval is already reset to
  2304. - zero inside cfg80211_stop_ap(), and in the other modes it
  2305. - isn't relevant. Remove the assignment to remove a potential
  2306. - race since the assignment isn't properly locked.
  2307. -
  2308. - Reported-by: Michal Kazior <michal.kazior@tieto.com>
  2309. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  2310. -commit 1abdeca3c6fb9cf1f84f85e78ed8d1c33bd69db0
  2311. -Author: Felix Fietkau <nbd@openwrt.org>
  2312. -Date: Fri Feb 28 18:52:56 2014 +0100
  2313. -
  2314. - ath9k_hw: tweak noise immunity thresholds for older chipsets
  2315. -
  2316. - Older chipsets are more sensitive to high PHY error counts, and the
  2317. - current noise immunity thresholds were based on tests run at QCA with
  2318. - newer chipsets.
  2319. -
  2320. - This patch brings back the values from the old ANI implementation for
  2321. - old chipsets, and it also disables weak signal detection on an earlier
  2322. - noise immunity level, to improve overall radio stability on affected
  2323. - devices.
  2324. -
  2325. - Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  2326. -
  2327. -commit 431e506da5953adc3b65af25f4b90873d528c115
  2328. -Author: Felix Fietkau <nbd@openwrt.org>
  2329. -Date: Fri Feb 28 18:44:13 2014 +0100
  2330. -
  2331. - ath9k_hw: toggle weak signal detection in AP mode on older chipsets
  2332. -
  2333. - The commit 80b4205b "ath9k: Fix OFDM weak signal detection for AP mode"
  2334. - prevented weak signal detection changes from taking effect in AP mode on
  2335. - all chipsets, claiming it is "not allowed".
  2336. -
  2337. - The main reason for not disabling weak signal detection in AP mode is
  2338. - that typically beacon RSSI is used to track whether it is needed to
  2339. - boost range, and this is unavailable in AP mode for obvious reasons.
  2340. -
  2341. - The problem with not disabling weak signal detection is that older
  2342. - chipsets are very sensitive to high PHY error counts. When faced with
  2343. - heavy noise, this can lead to an excessive amount of "Failed to stop
  2344. - TX DMA" errors in the field.
  2345. -
  2346. - Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  2347. -
  2348. -commit 98d1a6c5b14688ed030e81b889f607be308e0df9
  2349. -Author: Felix Fietkau <nbd@openwrt.org>
  2350. -Date: Mon Feb 24 22:20:32 2014 +0100
  2351. -
  2352. - ath9k: fix invalid descriptor discarding
  2353. -
  2354. - Only set sc->rx.discard_next to rx_stats->rs_more when actually
  2355. - discarding the current descriptor.
  2356. -
  2357. - Also, fix a detection of broken descriptors:
  2358. - First the code checks if the current descriptor is not done.
  2359. - Then it checks if the next descriptor is done.
  2360. - Add a check that afterwards checks the first descriptor again, because
  2361. - it might have been completed in the mean time.
  2362. -
  2363. - This fixes a regression introduced in
  2364. - commit 723e711356b5a8a95728a890e254e8b0d47b55cf
  2365. - "ath9k: fix handling of broken descriptors"
  2366. -
  2367. - Cc: stable@vger.kernel.org
  2368. - Reported-by: Marco André Dinis <marcoandredinis@gmail.com>
  2369. - Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  2370. -
  2371. -commit 52a46300e782fe6994466523eb2b0b59091ea59f
  2372. -Author: Felix Fietkau <nbd@openwrt.org>
  2373. -Date: Mon Feb 24 11:43:50 2014 +0100
  2374. -
  2375. - ath9k: reduce baseband hang detection false positive rate
  2376. -
  2377. - Check if the baseband state remains stable, and add a small delay
  2378. - between register reads.
  2379. -
  2380. - Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  2381. -
  2382. -commit 118945bb12082e9d4edddc868d88143164e0f440
  2383. -Author: Felix Fietkau <nbd@openwrt.org>
  2384. -Date: Sat Feb 22 14:55:23 2014 +0100
  2385. -
  2386. - ath5k: set SURVEY_INFO_IN_USE on get_survey
  2387. -
  2388. - Only one channel is returned - the one currently being used.
  2389. -
  2390. - Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  2391. -
  2392. -commit ee41f72476e1ea44283dfe1cbf75b9543a1e15c8
  2393. -Author: Felix Fietkau <nbd@openwrt.org>
  2394. -Date: Sat Feb 22 14:44:52 2014 +0100
  2395. -
  2396. - ath9k: make some hardware reset log messages debug-only
  2397. -
  2398. - On some chips, baseband watchdog hangs are more common than others, and
  2399. - the driver has support for handling them.
  2400. - Interrupts even after a watchdog hang are also quite common, so there's
  2401. - not much point in spamming the user's logfiles.
  2402. -
  2403. - Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  2404. -
  2405. -commit b14fbb554fc65a2e0b5c41a319269b0350f187e7
  2406. -Author: Felix Fietkau <nbd@openwrt.org>
  2407. -Date: Sat Feb 22 14:35:25 2014 +0100
  2408. -
  2409. - ath9k: do not set half/quarter channel flags in AR_PHY_MODE
  2410. -
  2411. - 5/10 MHz channel bandwidth is configured via the PLL clock, instead of
  2412. - the AR_PHY_MODE register. Using that register is AR93xx specific, and
  2413. - makes the mode incompatible with earlier chipsets.
  2414. -
  2415. - In some early versions, these flags were apparently applied at the wrong
  2416. - point in time and thus did not cause connectivity issues, however now
  2417. - they are causing problems, as pointed out in this OpenWrt ticket:
  2418. -
  2419. - https://dev.openwrt.org/ticket/14916
  2420. -
  2421. - Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  2422. -
  2423. -commit 0f1cb7be2551b30b02cd54c897e0e29e483cfda5
  2424. -Author: Felix Fietkau <nbd@openwrt.org>
  2425. -Date: Sat Feb 22 13:43:29 2014 +0100
  2426. +commit d2746694fcdef24e0a7a1947d8c70082cde81a26
  2427. +Author: Michal Kazior <michal.kazior@tieto.com>
  2428. +Date: Thu Jun 5 14:21:36 2014 +0200
  2429. - ath9k: fix ps-poll responses under a-mpdu sessions
  2430. -
  2431. - When passing tx frames to the U-APSD queue for powersave poll responses,
  2432. - the ath_atx_tid pointer needs to be passed to ath_tx_setup_buffer for
  2433. - proper sequence number accounting.
  2434. + mac80211: move csa counters from sdata to beacon/presp
  2435. - This fixes high latency and connection stability issues with ath9k
  2436. - running as AP and a few kinds of mobile phones as client, when PS-Poll
  2437. - is heavily used
  2438. -
  2439. - Cc: stable@vger.kernel.org
  2440. - Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  2441. -
  2442. -commit d5d87a37bbd6066b2c3c5d0bd0fe2a6e2ea45cc5
  2443. -Author: Felix Fietkau <nbd@openwrt.org>
  2444. -Date: Fri Feb 21 11:39:59 2014 +0100
  2445. -
  2446. - ath9k: list more reset causes in debugfs
  2447. + Having csa counters part of beacon and probe_resp
  2448. + structures makes it easier to get rid of possible
  2449. + races between setting a beacon and updating
  2450. + counters on SMP systems by guaranteeing counters
  2451. + are always consistent against given beacon struct.
  2452. - Number of MAC hangs and stuck beacons were missing
  2453. + While at it relax WARN_ON into WARN_ON_ONCE to
  2454. + prevent spamming logs and racing.
  2455. - Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  2456. + Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
  2457. + Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  2458. -commit d84856012e0f10fe598a5ad3b7b869397a089e07
  2459. -Author: Johannes Berg <johannes.berg@intel.com>
  2460. -Date: Thu Feb 20 11:19:58 2014 +0100
  2461. +commit 5dcb54f3a1a8cd7e0331e773487574f9743615db
  2462. +Author: Janusz Dziedzic <janusz.dziedzic@tieto.com>
  2463. +Date: Thu Jun 5 08:12:57 2014 +0200
  2464. - mac80211: fix station wakeup powersave race
  2465. -
  2466. - Consider the following (relatively unlikely) scenario:
  2467. - 1) station goes to sleep while frames are buffered in driver
  2468. - 2) driver blocks wakeup (until no more frames are buffered)
  2469. - 3) station wakes up again
  2470. - 4) driver unblocks wakeup
  2471. + mac80211: allow tx via monitor iface when DFS
  2472. - In this case, the current mac80211 code will do the following:
  2473. - 1) WLAN_STA_PS_STA set
  2474. - 2) WLAN_STA_PS_DRIVER set
  2475. - 3) - nothing -
  2476. - 4) WLAN_STA_PS_DRIVER cleared
  2477. + Allow send frames using monitor interface
  2478. + when DFS chandef and we pass CAC (beaconing
  2479. + allowed).
  2480. - As a result, no frames will be delivered to the client, even
  2481. - though it is awake, until it sends another frame to us that
  2482. - triggers ieee80211_sta_ps_deliver_wakeup() in sta_ps_end().
  2483. -
  2484. - Since we now take the PS spinlock, we can fix this while at
  2485. - the same time removing the complexity with the pending skb
  2486. - queue function. This was broken since my commit 50a9432daeec
  2487. - ("mac80211: fix powersaving clients races") due to removing
  2488. - the clearing of WLAN_STA_PS_STA in the RX path.
  2489. -
  2490. - While at it, fix a cleanup path issue when a station is
  2491. - removed while the driver is still blocking its wakeup.
  2492. + This fix problem when old kernel and new backports used,
  2493. + in such case hostapd create/use also monitor interface.
  2494. + Before this patch all frames hostapd send using monitor
  2495. + iface were dropped when AP was configured on DFS channel.
  2496. + Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
  2497. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  2498. -commit 798f2786602cbe93e6b928299614aa36ebf50692
  2499. +commit 6f09a1beb0d2007572248c986780562219bd206f
  2500. Author: Johannes Berg <johannes.berg@intel.com>
  2501. -Date: Mon Feb 17 20:49:03 2014 +0100
  2502. +Date: Wed Jun 4 17:31:56 2014 +0200
  2503. - mac80211: insert stations before adding to driver
  2504. -
  2505. - There's a race condition in mac80211 because we add stations
  2506. - to the internal lists after adding them to the driver, which
  2507. - means that (for example) the following can happen:
  2508. - 1. a station connects and is added
  2509. - 2. first, it is added to the driver
  2510. - 3. then, it is added to the mac80211 lists
  2511. + cfg80211: make ethtool the driver's responsibility
  2512. - If the station goes to sleep between steps 2 and 3, and the
  2513. - firmware/hardware records it as being asleep, mac80211 will
  2514. - never instruct the driver to wake it up again as it never
  2515. - realized it went to sleep since the RX path discarded the
  2516. - frame as a "spurious class 3 frame", no station entry was
  2517. - present yet.
  2518. + Currently, cfg80211 tries to implement ethtool, but that doesn't
  2519. + really scale well, with all the different operations. Make the
  2520. + lower-level driver responsible for it, which currently only has
  2521. + an effect on mac80211. It will similarly not scale well at that
  2522. + level though, since mac80211 also has many drivers.
  2523. - Fix this by adding the station in software first, and only
  2524. - then adding it to the driver. That way, any state that the
  2525. - driver changes will be reflected properly in mac80211's
  2526. - station state. The problematic part is the roll-back if the
  2527. - driver fails to add the station, in that case a bit more is
  2528. - needed. To not make that overly complex prevent starting BA
  2529. - sessions in the meantime.
  2530. + To cleanly implement this in mac80211, introduce a new file and
  2531. + move some code to appropriate places.
  2532. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  2533. -commit b9ba6a520cb07ab3aa7aaaf9ce4a0bc7a6bc06fe
  2534. -Author: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
  2535. -Date: Thu Feb 20 09:22:11 2014 +0200
  2536. +commit 6b0c6f133de8f90caeb1c4a902e6140567c5bf96
  2537. +Author: Johannes Berg <johannes.berg@intel.com>
  2538. +Date: Wed Jun 4 17:06:23 2014 +0200
  2539. - mac80211: fix AP powersave TX vs. wakeup race
  2540. -
  2541. - There is a race between the TX path and the STA wakeup: while
  2542. - a station is sleeping, mac80211 buffers frames until it wakes
  2543. - up, then the frames are transmitted. However, the RX and TX
  2544. - path are concurrent, so the packet indicating wakeup can be
  2545. - processed while a packet is being transmitted.
  2546. -
  2547. - This can lead to a situation where the buffered frames list
  2548. - is emptied on the one side, while a frame is being added on
  2549. - the other side, as the station is still seen as sleeping in
  2550. - the TX path.
  2551. + mac80211: remove weak WEP IV accounting
  2552. - As a result, the newly added frame will not be send anytime
  2553. - soon. It might be sent much later (and out of order) when the
  2554. - station goes to sleep and wakes up the next time.
  2555. + Since WEP is practically dead, there seems very little
  2556. + point in keeping WEP weak IV accounting.
  2557. - Additionally, it can lead to the crash below.
  2558. -
  2559. - Fix all this by synchronising both paths with a new lock.
  2560. - Both path are not fastpath since they handle PS situations.
  2561. -
  2562. - In a later patch we'll remove the extra skb queue locks to
  2563. - reduce locking overhead.
  2564. -
  2565. - BUG: unable to handle kernel
  2566. - NULL pointer dereference at 000000b0
  2567. - IP: [<ff6f1791>] ieee80211_report_used_skb+0x11/0x3e0 [mac80211]
  2568. - *pde = 00000000
  2569. - Oops: 0000 [#1] SMP DEBUG_PAGEALLOC
  2570. - EIP: 0060:[<ff6f1791>] EFLAGS: 00210282 CPU: 1
  2571. - EIP is at ieee80211_report_used_skb+0x11/0x3e0 [mac80211]
  2572. - EAX: e5900da0 EBX: 00000000 ECX: 00000001 EDX: 00000000
  2573. - ESI: e41d00c0 EDI: e5900da0 EBP: ebe458e4 ESP: ebe458b0
  2574. - DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
  2575. - CR0: 8005003b CR2: 000000b0 CR3: 25a78000 CR4: 000407d0
  2576. - DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
  2577. - DR6: ffff0ff0 DR7: 00000400
  2578. - Process iperf (pid: 3934, ti=ebe44000 task=e757c0b0 task.ti=ebe44000)
  2579. - iwlwifi 0000:02:00.0: I iwl_pcie_enqueue_hcmd Sending command LQ_CMD (#4e), seq: 0x0903, 92 bytes at 3[3]:9
  2580. - Stack:
  2581. - e403b32c ebe458c4 00200002 00200286 e403b338 ebe458cc c10960bb e5900da0
  2582. - ff76a6ec ebe458d8 00000000 e41d00c0 e5900da0 ebe458f0 ff6f1b75 e403b210
  2583. - ebe4598c ff723dc1 00000000 ff76a6ec e597c978 e403b758 00000002 00000002
  2584. - Call Trace:
  2585. - [<ff6f1b75>] ieee80211_free_txskb+0x15/0x20 [mac80211]
  2586. - [<ff723dc1>] invoke_tx_handlers+0x1661/0x1780 [mac80211]
  2587. - [<ff7248a5>] ieee80211_tx+0x75/0x100 [mac80211]
  2588. - [<ff7249bf>] ieee80211_xmit+0x8f/0xc0 [mac80211]
  2589. - [<ff72550e>] ieee80211_subif_start_xmit+0x4fe/0xe20 [mac80211]
  2590. - [<c149ef70>] dev_hard_start_xmit+0x450/0x950
  2591. - [<c14b9aa9>] sch_direct_xmit+0xa9/0x250
  2592. - [<c14b9c9b>] __qdisc_run+0x4b/0x150
  2593. - [<c149f732>] dev_queue_xmit+0x2c2/0xca0
  2594. -
  2595. - Cc: stable@vger.kernel.org
  2596. - Reported-by: Yaara Rozenblum <yaara.rozenblum@intel.com>
  2597. - Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
  2598. - Reviewed-by: Stanislaw Gruszka <sgruszka@redhat.com>
  2599. - [reword commit log, use a separate lock]
  2600. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  2601. -commit 80e419de0dff38436b30d363311c625766193f86
  2602. -Author: Inbal Hacohen <Inbal.Hacohen@intel.com>
  2603. -Date: Wed Feb 12 09:32:27 2014 +0200
  2604. +commit aecdc89fb4664c76baa4bbd46008f220532309ff
  2605. +Author: Luciano Coelho <luciano.coelho@intel.com>
  2606. +Date: Fri May 23 11:04:50 2014 +0300
  2607. - cfg80211: bugfix in regulatory user hint process
  2608. + ath9k/ath10k: remove unnecessary channel_switch_beacon callbacks
  2609. - After processing hint_user, we would want to schedule the
  2610. - timeout work only if we are actually waiting to CRDA. This happens
  2611. - when the status is not "IGNORE" nor "ALREADY_SET".
  2612. + The channel_switch_beacon callback is optional, so it doesn't have to
  2613. + be defined if it's not going to do anything useful with it. Both
  2614. + ath9k and ath10k define the callback and just returns. This commit
  2615. + removes them.
  2616. - Signed-off-by: Inbal Hacohen <Inbal.Hacohen@intel.com>
  2617. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  2618. + Cc: Michal Kazior <michal.kazior@tieto.com>
  2619. + Signed-off-by: Luciano Coelho <luciano.coelho@intel.com>
  2620. + Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
  2621. -commit 6514c93afede55284e2cb63359aadedb85884c80
  2622. -Author: Jouni Malinen <jouni@qca.qualcomm.com>
  2623. -Date: Tue Feb 18 20:41:08 2014 +0200
  2624. +commit 60ccc107c9b9fb732fdee1f76bb2dad44f0e1798
  2625. +Author: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
  2626. +Date: Tue May 27 16:58:02 2014 +0530
  2627. - ath9k: Enable U-APSD AP mode support
  2628. + ath9k: Fix deadlock while updating p2p beacon timer
  2629. - mac80211 handles the actual operations, so ath9k can just indicate
  2630. - support for this. Based on initial tests, this combination seems to
  2631. - work fine.
  2632. + pm_lock is taken twice while syncing HW TSF of p2p vif.
  2633. + Fix this by taking the lock at caller side.
  2634. - Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
  2635. + Cc: Felix Fietkau <nbd@openwrt.org>
  2636. + Signed-off-by: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
  2637. + Signed-off-by: John W. Linville <linville@tuxdriver.com>
  2638. -commit a63caf0a357ad5c1f08d6b7827dc76c451445017
  2639. +commit f3831a4e3903dbc1a57d5df56deb6a143fd001bc
  2640. Author: Stanislaw Gruszka <sgruszka@redhat.com>
  2641. -Date: Wed Feb 19 13:15:17 2014 +0100
  2642. +Date: Thu Jun 5 13:52:27 2014 +0200
  2643. - ath9k: protect tid->sched check
  2644. -
  2645. - We check tid->sched without a lock taken on ath_tx_aggr_sleep(). That
  2646. - is race condition which can result of doing list_del(&tid->list) twice
  2647. - (second time with poisoned list node) and cause crash like shown below:
  2648. + rt2x00: do not initialize BCN_OFFSET registers
  2649. - [424271.637220] BUG: unable to handle kernel paging request at 00100104
  2650. - [424271.637328] IP: [<f90fc072>] ath_tx_aggr_sleep+0x62/0xe0 [ath9k]
  2651. - ...
  2652. - [424271.639953] Call Trace:
  2653. - [424271.639998] [<f90f6900>] ? ath9k_get_survey+0x110/0x110 [ath9k]
  2654. - [424271.640083] [<f90f6942>] ath9k_sta_notify+0x42/0x50 [ath9k]
  2655. - [424271.640177] [<f809cfef>] sta_ps_start+0x8f/0x1c0 [mac80211]
  2656. - [424271.640258] [<c10f730e>] ? free_compound_page+0x2e/0x40
  2657. - [424271.640346] [<f809e915>] ieee80211_rx_handlers+0x9d5/0x2340 [mac80211]
  2658. - [424271.640437] [<c112f048>] ? kmem_cache_free+0x1d8/0x1f0
  2659. - [424271.640510] [<c1345a84>] ? kfree_skbmem+0x34/0x90
  2660. - [424271.640578] [<c10fc23c>] ? put_page+0x2c/0x40
  2661. - [424271.640640] [<c1345a84>] ? kfree_skbmem+0x34/0x90
  2662. - [424271.640706] [<c1345a84>] ? kfree_skbmem+0x34/0x90
  2663. - [424271.640787] [<f809dde3>] ? ieee80211_rx_handlers_result+0x73/0x1d0 [mac80211]
  2664. - [424271.640897] [<f80a07a0>] ieee80211_prepare_and_rx_handle+0x520/0xad0 [mac80211]
  2665. - [424271.641009] [<f809e22d>] ? ieee80211_rx_handlers+0x2ed/0x2340 [mac80211]
  2666. - [424271.641104] [<c13846ce>] ? ip_output+0x7e/0xd0
  2667. - [424271.641182] [<f80a1057>] ieee80211_rx+0x307/0x7c0 [mac80211]
  2668. - [424271.641266] [<f90fa6ee>] ath_rx_tasklet+0x88e/0xf70 [ath9k]
  2669. - [424271.641358] [<f80a0f2c>] ? ieee80211_rx+0x1dc/0x7c0 [mac80211]
  2670. - [424271.641445] [<f90f82db>] ath9k_tasklet+0xcb/0x130 [ath9k]
  2671. + We setup BCN_OFFSET{0,1} registers dynamically, don't have to
  2672. + initialize them.
  2673. - Bug report:
  2674. - https://bugzilla.kernel.org/show_bug.cgi?id=70551
  2675. -
  2676. - Reported-and-tested-by: Max Sydorenko <maxim.stargazer@gmail.com>
  2677. - Cc: stable@vger.kernel.org
  2678. Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
  2679. -commit 82ed9e3ccc02797df2ffe4b78127c4cd5f799a41
  2680. -Author: Felix Fietkau <nbd@openwrt.org>
  2681. -Date: Tue Feb 11 15:54:13 2014 +0100
  2682. -
  2683. - mac80211: send control port protocol frames to the VO queue
  2684. -
  2685. - Improves reliability of wifi connections with WPA, since authentication
  2686. - frames are prioritized over normal traffic and also typically exempt
  2687. - from aggregation.
  2688. -
  2689. - Cc: stable@vger.kernel.org
  2690. - Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  2691. -
  2692. -commit d4426800f71e972feaa33e04c5801fc730627bdd
  2693. -Author: Stanislaw Gruszka <stf_xl@wp.pl>
  2694. -Date: Mon Feb 10 22:38:28 2014 +0100
  2695. -
  2696. - rtl8187: fix regression on MIPS without coherent DMA
  2697. -
  2698. - This patch fixes regression caused by commit a16dad77634 "MIPS: Fix
  2699. - potencial corruption". That commit fixes one corruption scenario in
  2700. - cost of adding another one, which actually start to cause crashes
  2701. - on Yeeloong laptop when rtl8187 driver is used.
  2702. -
  2703. - For correct DMA read operation on machines without DMA coherence, kernel
  2704. - have to invalidate cache, such it will refill later with new data that
  2705. - device wrote to memory, when that data is needed to process. We can only
  2706. - invalidate full cache line. Hence when cache line includes both dma
  2707. - buffer and some other data (written in cache, but not yet in main
  2708. - memory), the other data can not hit memory due to invalidation. That
  2709. - happen on rtl8187 where struct rtl8187_priv fields are located just
  2710. - before and after small buffers that are passed to USB layer and DMA
  2711. - is performed on them.
  2712. -
  2713. - To fix the problem we align buffers and reserve space after them to make
  2714. - them match cache line.
  2715. -
  2716. - This patch does not resolve all possible MIPS problems entirely, for
  2717. - that we have to assure that we always map cache aligned buffers for DMA,
  2718. - what can be complex or even not possible. But patch fixes visible and
  2719. - reproducible regression and seems other possible corruptions do not
  2720. - happen in practice, since Yeeloong laptop works stable without rtl8187
  2721. - driver.
  2722. -
  2723. - Bug report:
  2724. - https://bugzilla.kernel.org/show_bug.cgi?id=54391
  2725. -
  2726. - Reported-by: Petr Pisar <petr.pisar@atlas.cz>
  2727. - Bisected-by: Tom Li <biergaizi2009@gmail.com>
  2728. - Reported-and-tested-by: Tom Li <biergaizi2009@gmail.com>
  2729. - Cc: stable@vger.kernel.org
  2730. - Signed-off-by: Stanislaw Gruszka <stf_xl@wp.pl>
  2731. -
  2732. -commit e2f141d67ad1e7fe10aaab61811e8a409dfb2442
  2733. -Author: Sujith Manoharan <c_manoha@qca.qualcomm.com>
  2734. -Date: Fri Feb 7 10:29:55 2014 +0530
  2735. -
  2736. - ath9k: Calculate IQ-CAL median
  2737. -
  2738. - This patch adds a routine to calculate the median IQ correction
  2739. - values for AR955x, which is used for outlier detection.
  2740. - The normal method which is used for all other chips is
  2741. - bypassed for AR955x.
  2742. -
  2743. - Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
  2744. -
  2745. -commit c52a6fce0820c8d0687443ab86058ae03b478c8f
  2746. -Author: Sujith Manoharan <c_manoha@qca.qualcomm.com>
  2747. -Date: Fri Feb 7 10:29:54 2014 +0530
  2748. -
  2749. - ath9k: Expand the IQ coefficient array
  2750. -
  2751. - This will be used for storing data for mutiple
  2752. - IQ calibration runs, for AR955x.
  2753. -
  2754. - Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
  2755. -
  2756. -commit 034969ff5c2b6431d10e07c1938f0b916da85cc3
  2757. -Author: Sujith Manoharan <c_manoha@qca.qualcomm.com>
  2758. -Date: Fri Feb 7 10:29:53 2014 +0530
  2759. -
  2760. - ath9k: Modify IQ calibration for AR955x
  2761. -
  2762. - IQ calibration post-processing for AR955x is different
  2763. - from other chips - instead of just doing it as part
  2764. - of AGC calibration once, it is triggered 3 times and
  2765. - a median is determined. This patch adds initial support
  2766. - for changing the calibration behavior for AR955x.
  2767. -
  2768. - Also, to simplify things, a helper routine to issue/poll
  2769. - AGC calibration is used.
  2770. -
  2771. - For non-AR955x chips, the iqcal_idx (which will be used
  2772. - in subsequent patches) is set to zero.
  2773. -
  2774. - Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
  2775. -
  2776. -commit 9b1ed6454e6f3511f24266be99b4e403f243f6a8
  2777. -Author: Sujith Manoharan <c_manoha@qca.qualcomm.com>
  2778. -Date: Fri Feb 7 10:29:52 2014 +0530
  2779. -
  2780. - ath9k: Fix magnitude/phase calculation
  2781. -
  2782. - Incorrect values are programmed in the registers
  2783. - containing the IQ correction coefficients by the IQ-CAL
  2784. - post-processing code. Fix this.
  2785. -
  2786. - Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
  2787. -
  2788. -commit 36f93484f96f79171dcecb67c5ef0c3de22531a6
  2789. -Author: Sujith Manoharan <c_manoha@qca.qualcomm.com>
  2790. -Date: Fri Feb 7 10:29:51 2014 +0530
  2791. -
  2792. - ath9k: Rename ar9003_hw_tx_iqcal_load_avg_2_passes
  2793. -
  2794. - Use ar9003_hw_tx_iq_cal_outlier_detection instead.
  2795. -
  2796. - Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
  2797. -
  2798. -commit 3af09a7f5d21dd5fd15b973ce6a91a575da30417
  2799. -Author: Sujith Manoharan <c_manoha@qca.qualcomm.com>
  2800. -Date: Fri Feb 7 10:29:50 2014 +0530
  2801. -
  2802. - ath9k: Check explicitly for IQ calibration
  2803. -
  2804. - In chips like AR955x, the initvals contain the information
  2805. - whether IQ calibration is to be done in the HW when an
  2806. - AGC calibration is triggered. Check if IQ-CAL is enabled
  2807. - in the initvals before flagging 'txiqcal_done' as true.
  2808. -
  2809. - Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
  2810. -
  2811. -commit cb4969634b93c4643a32cc3fbd27d2b288b25771
  2812. -Author: Sujith Manoharan <c_manoha@qca.qualcomm.com>
  2813. -Date: Fri Feb 7 10:29:49 2014 +0530
  2814. +commit e5c58ca7a48d4c82f282749a978052c47fd95998
  2815. +Author: Stanislaw Gruszka <sgruszka@redhat.com>
  2816. +Date: Thu Jun 5 13:52:26 2014 +0200
  2817. - ath9k: Fix IQ cal post processing for SoC
  2818. + rt2x00: change order when stop beaconing
  2819. - Calibration data is not reused for SoC chips, so
  2820. - call ar9003_hw_tx_iq_cal_post_proc() with the correct
  2821. - argument. The 'is_reusable' flag is currently used
  2822. - only for PC-OEM chips, but it makes things clearer to
  2823. - specify it explicity.
  2824. + When no beaconing is needed, first stop beacon queue (disable beaconing
  2825. + globally) to avoid possible sending of not prepared beacon on short
  2826. + period after clearing beacon and before stop of BCN queue.
  2827. - Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
  2828. + Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
  2829. -commit e138e0ef9560c46ce93dbb22a728a57888e94d1c
  2830. -Author: Sujith Manoharan <c_manoha@qca.qualcomm.com>
  2831. -Date: Mon Feb 3 13:31:37 2014 +0530
  2832. +commit 382c1b9e03f52d0cd741ef1d942cad0f649f0744
  2833. +Author: Stanislaw Gruszka <sgruszka@redhat.com>
  2834. +Date: Thu Jun 5 13:52:25 2014 +0200
  2835. - ath9k: Fix TX power calculation
  2836. + rt2x00: change default MAC_BSSID_DW1_BSS_BCN_NUM
  2837. - The commit, "ath9k_hw: Fix incorrect Tx control power in AR9003 template"
  2838. - fixed the incorrect values in the eeprom templates, but if
  2839. - boards have already been calibrated with incorrect values,
  2840. - they would still be using the wrong TX power. Fix this by assigning
  2841. - a default value in such cases.
  2842. + We setup MAC_BSSID_DW1_BSS_BCN_NUM dynamically when numbers of active
  2843. + beacons increase. Change default to 0 to tell hardware that we want to
  2844. + send only one beacon as default.
  2845. - Cc: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
  2846. - Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
  2847. + Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
  2848. -commit b9f268b5b01331c3c82179abca551429450e9417
  2849. -Author: Michal Kazior <michal.kazior@tieto.com>
  2850. -Date: Wed Jan 29 14:22:27 2014 +0100
  2851. +commit 3b400571dd033e46fa7e76c5bb92a3ce8198afa9
  2852. +Author: Stanislaw Gruszka <sgruszka@redhat.com>
  2853. +Date: Thu Jun 5 13:52:24 2014 +0200
  2854. - cfg80211: consider existing DFS interfaces
  2855. -
  2856. - It was possible to break interface combinations in
  2857. - the following way:
  2858. -
  2859. - combo 1: iftype = AP, num_ifaces = 2, num_chans = 2,
  2860. - combo 2: iftype = AP, num_ifaces = 1, num_chans = 1, radar = HT20
  2861. + rt2x00: change beaconing setup on RT2800
  2862. - With the above interface combinations it was
  2863. - possible to:
  2864. + As reported by Matthias, on 5572 chip, even if we clear up TXWI
  2865. + of corresponding beacon, hardware still try to send it or do other
  2866. + action that increase power consumption peak up to 1A.
  2867. - step 1. start AP on DFS channel by matching combo 2
  2868. - step 2. start AP on non-DFS channel by matching combo 1
  2869. + To avoid the issue, setup beaconing dynamically by configuring offsets
  2870. + of currently active beacons and MAC_BSSID_DW1_BSS_BCN_NUM variable,
  2871. + which limit number of beacons that hardware will try to send.
  2872. - This was possible beacuse (step 2) did not consider
  2873. - if other interfaces require radar detection.
  2874. -
  2875. - The patch changes how cfg80211 tracks channels -
  2876. - instead of channel itself now a complete chandef
  2877. - is stored.
  2878. -
  2879. - Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
  2880. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  2881. + Reported-by: Matthias Fend <Matthias.Fend@wolfvision.net>
  2882. + Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
  2883. -commit bc9c62f5f511cc395c62dbf4cdd437f23db53b28
  2884. -Author: Antonio Quartulli <antonio@open-mesh.com>
  2885. -Date: Wed Jan 29 17:53:43 2014 +0100
  2886. +commit 916e591b2cc41f7e572992175ca56d866d7bc958
  2887. +Author: Stanislaw Gruszka <sgruszka@redhat.com>
  2888. +Date: Thu Jun 5 13:52:23 2014 +0200
  2889. - cfg80211: fix channel configuration in IBSS join
  2890. -
  2891. - When receiving an IBSS_JOINED event select the BSS object
  2892. - based on the {bssid, channel} couple rather than the bssid
  2893. - only.
  2894. - With the current approach if another cell having the same
  2895. - BSSID (but using a different channel) exists then cfg80211
  2896. - picks up the wrong BSS object.
  2897. - The result is a mismatching channel configuration between
  2898. - cfg80211 and the driver, that can lead to any sort of
  2899. - problem.
  2900. -
  2901. - The issue can be triggered by having an IBSS sitting on
  2902. - given channel and then asking the driver to create a new
  2903. - cell using the same BSSID but with a different frequency.
  2904. - By passing the channel to cfg80211_get_bss() we can solve
  2905. - this ambiguity and retrieve/create the correct BSS object.
  2906. - All the users of cfg80211_ibss_joined() have been changed
  2907. - accordingly.
  2908. + rt2x00: change beaconing locking
  2909. - Moreover WARN when cfg80211_ibss_joined() gets a NULL
  2910. - channel as argument and remove a bogus call of the same
  2911. - function in ath6kl (it does not make sense to call
  2912. - cfg80211_ibss_joined() with a zero BSSID on ibss-leave).
  2913. + This patch is needed for further changes to keep global variables
  2914. + consistent when changing beaconing on diffrent vif's.
  2915. - Cc: Kalle Valo <kvalo@qca.qualcomm.com>
  2916. - Cc: Arend van Spriel <arend@broadcom.com>
  2917. - Cc: Bing Zhao <bzhao@marvell.com>
  2918. - Cc: Jussi Kivilinna <jussi.kivilinna@iki.fi>
  2919. - Cc: libertas-dev@lists.infradead.org
  2920. - Acked-by: Kalle Valo <kvalo@qca.qualcomm.com>
  2921. - Signed-off-by: Antonio Quartulli <antonio@open-mesh.com>
  2922. - [minor code cleanup in ath6kl]
  2923. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  2924. + Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
  2925. -commit 7e0c41cb41f215aba2c39b1c237bb4d42ec49a85
  2926. +commit 930b0dffd1731f3f418f9132faea720a23b7af61
  2927. Author: Johannes Berg <johannes.berg@intel.com>
  2928. -Date: Fri Jan 24 14:41:44 2014 +0100
  2929. -
  2930. - mac80211: fix bufferable MMPDU RX handling
  2931. -
  2932. - Action, disassoc and deauth frames are bufferable, and as such don't
  2933. - have the PM bit in the frame control field reserved which means we
  2934. - need to react to the bit when receiving in such a frame.
  2935. -
  2936. - Fix this by introducing a new helper ieee80211_is_bufferable_mmpdu()
  2937. - and using it for the RX path that currently ignores the PM bit in
  2938. - any non-data frames for doze->wake transitions, but listens to it in
  2939. - all frames for wake->doze transitions, both of which are wrong.
  2940. -
  2941. - Also use the new helper in the TX path to clean up the code.
  2942. -
  2943. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  2944. -
  2945. -commit fc0df6d2343636e3f48a069330d5b972e3d8659d
  2946. -Author: Janusz Dziedzic <janusz.dziedzic@tieto.com>
  2947. -Date: Fri Jan 24 14:29:21 2014 +0100
  2948. -
  2949. - cfg80211: set preset_chandef after channel switch
  2950. -
  2951. - Set preset_chandef in channel switch notification.
  2952. - In other case we will have old preset_chandef.
  2953. -
  2954. - Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
  2955. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  2956. -
  2957. -commit cdec895e2344987ff171cece96e25d7407a3ebf6
  2958. -Author: Simon Wunderlich <simon@open-mesh.com>
  2959. -Date: Fri Jan 24 23:48:29 2014 +0100
  2960. -
  2961. - mac80211: send ibss probe responses with noack flag
  2962. -
  2963. - Responding to probe requests for scanning clients will often create
  2964. - excessive retries, as it happens quite often that the scanning client
  2965. - already left the channel. Therefore do it like hostapd and send probe
  2966. - responses for wildcard SSID only once by using the noack flag.
  2967. +Date: Tue Jun 3 11:18:47 2014 +0200
  2968. +
  2969. + mac80211: fix station/driver powersave race
  2970. +
  2971. + It is currently possible to have a race due to the station PS
  2972. + unblock work like this:
  2973. + * station goes to sleep with frames buffered in the driver
  2974. + * driver blocks wakeup
  2975. + * station wakes up again
  2976. + * driver flushes/returns frames, and unblocks, which schedules
  2977. + the unblock work
  2978. + * unblock work starts to run, and checks that the station is
  2979. + awake (i.e. that the WLAN_STA_PS_STA flag isn't set)
  2980. + * we process a received frame with PM=1, setting the flag again
  2981. + * ieee80211_sta_ps_deliver_wakeup() runs, delivering all frames
  2982. + to the driver, and then clearing the WLAN_STA_PS_DRIVER and
  2983. + WLAN_STA_PS_STA flags
  2984. +
  2985. + In this scenario, mac80211 will think that the station is awake,
  2986. + while it really is asleep, and any TX'ed frames should be filtered
  2987. + by the device (it will know that the station is sleeping) but then
  2988. + passed to mac80211 again, which will not buffer it either as it
  2989. + thinks the station is awake, and eventually the packets will be
  2990. + dropped.
  2991. +
  2992. + Fix this by moving the clearing of the flags to exactly where we
  2993. + learn about the situation. This creates a problem of reordering,
  2994. + so introduce another flag indicating that delivery is being done,
  2995. + this new flag also queues frames and is cleared only while the
  2996. + spinlock is held (which the queuing code also holds) so that any
  2997. + concurrent delivery/TX is handled correctly.
  2998. - Signed-off-by: Simon Wunderlich <simon@open-mesh.com>
  2999. - [fix typo & 'wildcard SSID' in commit log]
  3000. + Reported-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
  3001. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  3002. -commit 0b865d1e6b9c05052adae9315df7cb195dc60c3b
  3003. -Author: Luciano Coelho <luciano.coelho@intel.com>
  3004. -Date: Tue Jan 28 17:09:08 2014 +0200
  3005. +commit 6df35206bc6c1c6aad1d8077df5786b4a7f77873
  3006. +Author: Felix Fietkau <nbd@openwrt.org>
  3007. +Date: Fri May 23 19:58:14 2014 +0200
  3008. - mac80211: ibss: remove unnecessary call to release channel
  3009. -
  3010. - The ieee80211_vif_use_channel() function calls
  3011. - ieee80211_vif_release_channel(), so there's no need to call it
  3012. - explicitly in __ieee80211_sta_join_ibss().
  3013. + mac80211: reduce packet loss notifications under load
  3014. - Signed-off-by: Luciano Coelho <luciano.coelho@intel.com>
  3015. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  3016. -
  3017. -commit e1b6c17e971f0a51ff86c2dac2584c63cd999cd7
  3018. -Author: Michal Kazior <michal.kazior@tieto.com>
  3019. -Date: Wed Jan 29 07:56:21 2014 +0100
  3020. -
  3021. - mac80211: add missing CSA locking
  3022. + During strong signal fluctuations under high throughput, few consecutive
  3023. + failed A-MPDU transmissions can easily trigger packet loss notification,
  3024. + and thus (in AP mode) client disconnection.
  3025. - The patch adds a missing sdata lock and adds a few
  3026. - lockdeps for easier maintenance.
  3027. + Reduce the number of false positives by checking the A-MPDU status flag
  3028. + and treating a failed A-MPDU as a single packet.
  3029. - Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
  3030. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  3031. + Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  3032. -commit ad17ba7d14d225b109b73c177cd446afb8050598
  3033. -Author: Michal Kazior <michal.kazior@tieto.com>
  3034. -Date: Wed Jan 29 07:56:20 2014 +0100
  3035. +commit 7b7843a36fbcc568834404c7430ff895d8502131
  3036. +Author: Felix Fietkau <nbd@openwrt.org>
  3037. +Date: Fri May 23 19:26:32 2014 +0200
  3038. - mac80211: fix sdata->radar_required locking
  3039. + mac80211: fix a memory leak on sta rate selection table
  3040. - radar_required setting wasn't protected by
  3041. - local->mtx in some places. This should prevent
  3042. - from scanning/radar detection/roc colliding.
  3043. -
  3044. - Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
  3045. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  3046. + Cc: stable@vger.kernel.org
  3047. + Reported-by: Christophe Prévotaux <cprevotaux@nltinc.com>
  3048. + Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  3049. -commit 5fcd5f1808813a3d9e502fd756e01bee8a79c85d
  3050. -Author: Michal Kazior <michal.kazior@tieto.com>
  3051. -Date: Wed Jan 29 07:56:19 2014 +0100
  3052. +commit 96892d6aa0a153423070addf3070bc79578b3897
  3053. +Author: Felix Fietkau <nbd@openwrt.org>
  3054. +Date: Mon May 19 21:20:49 2014 +0200
  3055. - mac80211: move csa_active setting in STA CSA
  3056. + ath9k: avoid passing buffers to the hardware during flush
  3057. - The sdata->vif.csa_active could be left set after,
  3058. - e.g. channel context constraints check fail in STA
  3059. - mode leaving the interface in a strange state for
  3060. - a brief period of time until it is disconnected.
  3061. - This was harmless but ugly.
  3062. + The commit "ath9k: fix possible hang on flush" changed the receive code
  3063. + to always link rx descriptors of processed frames, even when flushing.
  3064. + In some cases, this leads to flushed rx buffers being passed to the
  3065. + hardware while rx is already stopped.
  3066. - Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
  3067. - Reviewed-by: Luciano Coelho <luciano.coelho@intel.com>
  3068. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  3069. -
  3070. -commit e486da4b7eed71821c6b4c1bb9ac62ffd3ab13e9
  3071. -Author: Michal Kazior <michal.kazior@tieto.com>
  3072. -Date: Wed Jan 29 07:56:18 2014 +0100
  3073. + Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  3074. - mac80211: fix possible memory leak on AP CSA failure
  3075. -
  3076. - If CSA for AP interface failed and the interface
  3077. - was not stopped afterwards another CSA request
  3078. - would leak sdata->u.ap.next_beacon.
  3079. -
  3080. - Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
  3081. - Reviewed-by: Luciano Coelho <luciano.coelho@intel.com>
  3082. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  3083. -
  3084. -commit 3a77ba08940682bf3d52cf14f980337324af9d4a
  3085. -Author: Johannes Berg <johannes.berg@intel.com>
  3086. -Date: Sat Feb 1 00:33:29 2014 +0100
  3087. -
  3088. - mac80211: fix fragmentation code, particularly for encryption
  3089. -
  3090. - The "new" fragmentation code (since my rewrite almost 5 years ago)
  3091. - erroneously sets skb->len rather than using skb_trim() to adjust
  3092. - the length of the first fragment after copying out all the others.
  3093. - This leaves the skb tail pointer pointing to after where the data
  3094. - originally ended, and thus causes the encryption MIC to be written
  3095. - at that point, rather than where it belongs: immediately after the
  3096. - data.
  3097. -
  3098. - The impact of this is that if software encryption is done, then
  3099. - a) encryption doesn't work for the first fragment, the connection
  3100. - becomes unusable as the first fragment will never be properly
  3101. - verified at the receiver, the MIC is practically guaranteed to
  3102. - be wrong
  3103. - b) we leak up to 8 bytes of plaintext (!) of the packet out into
  3104. - the air
  3105. -
  3106. - This is only mitigated by the fact that many devices are capable
  3107. - of doing encryption in hardware, in which case this can't happen
  3108. - as the tail pointer is irrelevant in that case. Additionally,
  3109. - fragmentation is not used very frequently and would normally have
  3110. - to be configured manually.
  3111. -
  3112. - Fix this by using skb_trim() properly.
  3113. -
  3114. - Cc: stable@vger.kernel.org
  3115. - Fixes: 2de8e0d999b8 ("mac80211: rewrite fragmentation")
  3116. - Reported-by: Jouni Malinen <j@w1.fi>
  3117. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  3118. -
  3119. -commit de5f242e0c10e841017e37eb8c38974a642dbca8
  3120. -Author: Sujith Manoharan <c_manoha@qca.qualcomm.com>
  3121. -Date: Tue Jan 28 06:21:59 2014 +0530
  3122. -
  3123. - ath9k: Fix build error on ARM
  3124. -
  3125. - Use mdelay instead of udelay to fix this error:
  3126. -
  3127. - ERROR: "__bad_udelay" [drivers/net/wireless/ath/ath9k/ath9k_hw.ko] undefined!
  3128. - make[1]: *** [__modpost] Error 1
  3129. - make: *** [modules] Error 2
  3130. -
  3131. - Reported-by: Josh Boyer <jwboyer@fedoraproject.org>
  3132. - Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
  3133. -
  3134. -commit 8e3ea7a51dfc61810fcefd947f6edcf61125252a
  3135. -Author: Geert Uytterhoeven <geert@linux-m68k.org>
  3136. -Date: Sun Jan 26 11:53:21 2014 +0100
  3137. -
  3138. - ath9k: Fix uninitialized variable in ath9k_has_tx_pending()
  3139. -
  3140. - drivers/net/wireless/ath/ath9k/main.c: In function ‘ath9k_has_tx_pending’:
  3141. - drivers/net/wireless/ath/ath9k/main.c:1869: warning: ‘npend’ may be used uninitialized in this function
  3142. -
  3143. - Introduced by commit 10e2318103f5941aa70c318afe34bc41f1b98529 ("ath9k:
  3144. - optimize ath9k_flush").
  3145. -
  3146. - Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
  3147. -
  3148. -commit a4a634a6937ebdd827fa58e8fcdb8ca49a3769f6
  3149. -Author: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
  3150. -Date: Mon Jan 27 11:07:42 2014 +0200
  3151. -
  3152. - mac80211: release the channel in error path in start_ap
  3153. -
  3154. - When the driver cannot start the AP or when the assignement
  3155. - of the beacon goes wrong, we need to unassign the vif.
  3156. -
  3157. - Cc: stable@vger.kernel.org
  3158. - Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
  3159. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  3160. -
  3161. -commit dfb6889a75c601aedb7450b7e606668e77da6679
  3162. -Author: Johannes Berg <johannes.berg@intel.com>
  3163. -Date: Wed Jan 22 11:14:19 2014 +0200
  3164. -
  3165. - cfg80211: send scan results from work queue
  3166. -
  3167. - Due to the previous commit, when a scan finishes, it is in theory
  3168. - possible to hit the following sequence:
  3169. - 1. interface starts being removed
  3170. - 2. scan is cancelled by driver and cfg80211 is notified
  3171. - 3. scan done work is scheduled
  3172. - 4. interface is removed completely, rdev->scan_req is freed,
  3173. - event sent to userspace but scan done work remains pending
  3174. - 5. new scan is requested on another virtual interface
  3175. - 6. scan done work runs, freeing the still-running scan
  3176. -
  3177. - To fix this situation, hang on to the scan done message and block
  3178. - new scans while that is the case, and only send the message from
  3179. - the work function, regardless of whether the scan_req is already
  3180. - freed from interface removal. This makes step 5 above impossible
  3181. - and changes step 6 to be
  3182. - 5. scan done work runs, sending the scan done message
  3183. -
  3184. - As this can't work for wext, so we send the message immediately,
  3185. - but this shouldn't be an issue since we still return -EBUSY.
  3186. -
  3187. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  3188. -
  3189. -commit 45b7ab41fc08627d9a8428cb413d5d84662a9707
  3190. -Author: Johannes Berg <johannes.berg@intel.com>
  3191. -Date: Wed Jan 22 11:14:18 2014 +0200
  3192. -
  3193. - cfg80211: fix scan done race
  3194. -
  3195. - When an interface/wdev is removed, any ongoing scan should be
  3196. - cancelled by the driver. This will make it call cfg80211, which
  3197. - only queues a work struct. If interface/wdev removal is quick
  3198. - enough, this can leave the scan request pending and processed
  3199. - only after the interface is gone, causing a use-after-free.
  3200. -
  3201. - Fix this by making sure the scan request is not pending after
  3202. - the interface is destroyed. We can't flush or cancel the work
  3203. - item due to locking concerns, but when it'll run it shouldn't
  3204. - find anything to do. This leaves a potential issue, if a new
  3205. - scan gets requested before the work runs, it prematurely stops
  3206. - the running scan, potentially causing another crash. I'll fix
  3207. - that in the next patch.
  3208. -
  3209. - This was particularly observed with P2P_DEVICE wdevs, likely
  3210. - because freeing them is quicker than freeing netdevs.
  3211. -
  3212. - Reported-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
  3213. - Fixes: 4a58e7c38443 ("cfg80211: don't "leak" uncompleted scans")
  3214. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  3215. -
  3216. -commit ae04fa489ab31b5a10d3cc8399f52761175d4321
  3217. -Author: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
  3218. -Date: Thu Jan 23 14:28:16 2014 +0200
  3219. -
  3220. - mac80211: avoid deadlock revealed by lockdep
  3221. -
  3222. - sdata->u.ap.request_smps_work can’t be flushed synchronously
  3223. - under wdev_lock(wdev) since ieee80211_request_smps_ap_work
  3224. - itself locks the same lock.
  3225. - While at it, reset the driver_smps_mode when the ap is
  3226. - stopped to its default: OFF.
  3227. -
  3228. - This solves:
  3229. -
  3230. - ======================================================
  3231. - [ INFO: possible circular locking dependency detected ]
  3232. - 3.12.0-ipeer+ #2 Tainted: G O
  3233. - -------------------------------------------------------
  3234. - rmmod/2867 is trying to acquire lock:
  3235. - ((&sdata->u.ap.request_smps_work)){+.+...}, at: [<c105b8d0>] flush_work+0x0/0x90
  3236. -
  3237. - but task is already holding lock:
  3238. - (&wdev->mtx){+.+.+.}, at: [<f9b32626>] cfg80211_stop_ap+0x26/0x230 [cfg80211]
  3239. -
  3240. - which lock already depends on the new lock.
  3241. -
  3242. - the existing dependency chain (in reverse order) is:
  3243. -
  3244. - -> #1 (&wdev->mtx){+.+.+.}:
  3245. - [<c10aefa9>] lock_acquire+0x79/0xe0
  3246. - [<c1607a1a>] mutex_lock_nested+0x4a/0x360
  3247. - [<fb06288b>] ieee80211_request_smps_ap_work+0x2b/0x50 [mac80211]
  3248. - [<c105cdd8>] process_one_work+0x198/0x450
  3249. - [<c105d469>] worker_thread+0xf9/0x320
  3250. - [<c10669ff>] kthread+0x9f/0xb0
  3251. - [<c1613397>] ret_from_kernel_thread+0x1b/0x28
  3252. -
  3253. - -> #0 ((&sdata->u.ap.request_smps_work)){+.+...}:
  3254. - [<c10ae9df>] __lock_acquire+0x183f/0x1910
  3255. - [<c10aefa9>] lock_acquire+0x79/0xe0
  3256. - [<c105b917>] flush_work+0x47/0x90
  3257. - [<c105d867>] __cancel_work_timer+0x67/0xe0
  3258. - [<c105d90f>] cancel_work_sync+0xf/0x20
  3259. - [<fb0765cc>] ieee80211_stop_ap+0x8c/0x340 [mac80211]
  3260. - [<f9b3268c>] cfg80211_stop_ap+0x8c/0x230 [cfg80211]
  3261. - [<f9b0d8f9>] cfg80211_leave+0x79/0x100 [cfg80211]
  3262. - [<f9b0da72>] cfg80211_netdev_notifier_call+0xf2/0x4f0 [cfg80211]
  3263. - [<c160f2c9>] notifier_call_chain+0x59/0x130
  3264. - [<c106c6de>] __raw_notifier_call_chain+0x1e/0x30
  3265. - [<c106c70f>] raw_notifier_call_chain+0x1f/0x30
  3266. - [<c14f8213>] call_netdevice_notifiers_info+0x33/0x70
  3267. - [<c14f8263>] call_netdevice_notifiers+0x13/0x20
  3268. - [<c14f82a4>] __dev_close_many+0x34/0xb0
  3269. - [<c14f83fe>] dev_close_many+0x6e/0xc0
  3270. - [<c14f9c77>] rollback_registered_many+0xa7/0x1f0
  3271. - [<c14f9dd4>] unregister_netdevice_many+0x14/0x60
  3272. - [<fb06f4d9>] ieee80211_remove_interfaces+0xe9/0x170 [mac80211]
  3273. - [<fb055116>] ieee80211_unregister_hw+0x56/0x110 [mac80211]
  3274. - [<fa3e9396>] iwl_op_mode_mvm_stop+0x26/0xe0 [iwlmvm]
  3275. - [<f9b9d8ca>] _iwl_op_mode_stop+0x3a/0x70 [iwlwifi]
  3276. - [<f9b9d96f>] iwl_opmode_deregister+0x6f/0x90 [iwlwifi]
  3277. - [<fa405179>] __exit_compat+0xd/0x19 [iwlmvm]
  3278. - [<c10b8bf9>] SyS_delete_module+0x179/0x2b0
  3279. - [<c1613421>] sysenter_do_call+0x12/0x32
  3280. -
  3281. - Fixes: 687da132234f ("mac80211: implement SMPS for AP")
  3282. - Cc: <stable@vger.kernel.org> [3.13]
  3283. - Reported-by: Ilan Peer <ilan.peer@intel.com>
  3284. - Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
  3285. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  3286. -
  3287. -commit 178b205e96217164fd7c30113464250d0b6f5eca
  3288. -Author: Johannes Berg <johannes.berg@intel.com>
  3289. -Date: Thu Jan 23 16:32:29 2014 +0100
  3290. -
  3291. - cfg80211: re-enable 5/10 MHz support
  3292. -
  3293. - Unfortunately I forgot this during the merge window, but the
  3294. - patch seems small enough to go in as a fix. The userspace API
  3295. - bug that was the reason for disabling it has long been fixed.
  3296. -
  3297. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  3298. -
  3299. -commit 110a1c79acda14edc83b7c8dc5af9c7ddd23eb61
  3300. -Author: Pontus Fuchs <pontus.fuchs@gmail.com>
  3301. -Date: Thu Jan 16 15:00:40 2014 +0100
  3302. -
  3303. - nl80211: Reset split_start when netlink skb is exhausted
  3304. -
  3305. - When the netlink skb is exhausted split_start is left set. In the
  3306. - subsequent retry, with a larger buffer, the dump is continued from the
  3307. - failing point instead of from the beginning.
  3308. -
  3309. - This was causing my rt28xx based USB dongle to now show up when
  3310. - running "iw list" with an old iw version without split dump support.
  3311. -
  3312. - Cc: stable@vger.kernel.org
  3313. - Fixes: 3713b4e364ef ("nl80211: allow splitting wiphy information in dumps")
  3314. - Signed-off-by: Pontus Fuchs <pontus.fuchs@gmail.com>
  3315. - [avoid the entire workaround when state->split is set]
  3316. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  3317. -
  3318. -commit b4c31b45ffc7ef110fa9ecc34d7878fe7c5b9da4
  3319. -Author: Eliad Peller <eliad@wizery.com>
  3320. -Date: Sun Jan 12 11:06:37 2014 +0200
  3321. -
  3322. - mac80211: move roc cookie assignment earlier
  3323. -
  3324. - ieee80211_start_roc_work() might add a new roc
  3325. - to existing roc, and tell cfg80211 it has already
  3326. - started.
  3327. -
  3328. - However, this might happen before the roc cookie
  3329. - was set, resulting in REMAIN_ON_CHANNEL (started)
  3330. - event with null cookie. Consequently, it can make
  3331. - wpa_supplicant go out of sync.
  3332. -
  3333. - Fix it by setting the roc cookie earlier.
  3334. -
  3335. - Cc: stable@vger.kernel.org
  3336. - Signed-off-by: Eliad Peller <eliad@wizery.com>
  3337. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  3338. -
  3339. -commit cfdc9157bfd7bcf88ab4dae08873a9907eba984c
  3340. -Author: Johannes Berg <johannes.berg@intel.com>
  3341. -Date: Fri Jan 24 14:06:29 2014 +0100
  3342. -
  3343. - nl80211: send event when AP operation is stopped
  3344. -
  3345. - There are a few cases, e.g. suspend, where an AP interface is
  3346. - stopped by the kernel rather than by userspace request, most
  3347. - commonly when suspending. To let userspace know about this,
  3348. - send the NL80211_CMD_STOP_AP command as an event every time
  3349. - an AP interface is stopped. This also happens when userspace
  3350. - did in fact request the AP stop, but that's not a problem.
  3351. -
  3352. - For full-MAC drivers this may need to be extended to also
  3353. - cover cases where the device stopped the AP operation for
  3354. - some reason, this a bit more complicated because then all
  3355. - cfg80211 state also needs to be reset; such API is not part
  3356. - of this patch.
  3357. -
  3358. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  3359. -
  3360. -commit d5d567eda7704f190379ca852a8f9a4112e3eee3
  3361. -Author: Johannes Berg <johannes.berg@intel.com>
  3362. -Date: Thu Jan 23 16:20:29 2014 +0100
  3363. -
  3364. - mac80211: add length check in ieee80211_is_robust_mgmt_frame()
  3365. -
  3366. - A few places weren't checking that the frame passed to the
  3367. - function actually has enough data even though the function
  3368. - clearly documents it must have a payload byte. Make this
  3369. - safer by changing the function to take an skb and checking
  3370. - the length inside. The old version is preserved for now as
  3371. - the rtl* drivers use it and don't have a correct skb.
  3372. -
  3373. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  3374. -
  3375. -commit f8f6d212a047fc65c7d3442dfc038f65517236fc
  3376. -Author: Johannes Berg <johannes.berg@intel.com>
  3377. -Date: Fri Jan 24 10:53:53 2014 +0100
  3378. -
  3379. - nl80211: fix scheduled scan RSSI matchset attribute confusion
  3380. -
  3381. - The scheduled scan matchsets were intended to be a list of filters,
  3382. - with the found BSS having to pass at least one of them to be passed
  3383. - to the host. When the RSSI attribute was added, however, this was
  3384. - broken and currently wpa_supplicant adds that attribute in its own
  3385. - matchset; however, it doesn't intend that to mean that anything
  3386. - that passes the RSSI filter should be passed to the host, instead
  3387. - it wants it to mean that everything needs to also have higher RSSI.
  3388. -
  3389. - This is semantically problematic because we have a list of filters
  3390. - like [ SSID1, SSID2, SSID3, RSSI ] with no real indication which
  3391. - one should be OR'ed and which one AND'ed.
  3392. -
  3393. - To fix this, move the RSSI filter attribute into each matchset. As
  3394. - we need to stay backward compatible, treat a matchset with only the
  3395. - RSSI attribute as a "default RSSI filter" for all other matchsets,
  3396. - but only if there are other matchsets (an RSSI-only matchset by
  3397. - itself is still desirable.)
  3398. -
  3399. - To make driver implementation easier, keep a global min_rssi_thold
  3400. - for the entire request as well. The only affected driver is ath6kl.
  3401. -
  3402. - I found this when I looked into the code after Raja Mani submitted
  3403. - a patch fixing the n_match_sets calculation to disregard the RSSI,
  3404. - but that patch didn't address the semantic issue.
  3405. -
  3406. - Reported-by: Raja Mani <rmani@qti.qualcomm.com>
  3407. - Acked-by: Luciano Coelho <luciano.coelho@intel.com>
  3408. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  3409. -
  3410. -commit de553e8545e65a6dc4e45f43df7e1443d4291922
  3411. -Author: Johannes Berg <johannes.berg@intel.com>
  3412. -Date: Fri Jan 24 10:17:47 2014 +0100
  3413. -
  3414. - nl80211: check nla_parse() return values
  3415. -
  3416. - If there's a policy, then nla_parse() return values must be
  3417. - checked, otherwise the policy is useless and there's nothing
  3418. - that ensures the attributes are actually what we expect them
  3419. - to be.
  3420. -
  3421. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  3422. -
  3423. -commit 652204a0733e9e1c54661d6f9d36e2e1e3b22bb1
  3424. -Author: Karl Beldan <karl.beldan@rivierawaves.com>
  3425. -Date: Thu Jan 23 20:06:34 2014 +0100
  3426. -
  3427. - mac80211: send {ADD,DEL}BA on AC_VO like other mgmt frames, as per spec
  3428. -
  3429. - ATM, {ADD,DEL}BA and BAR frames are sent on the AC matching the TID of
  3430. - the BA parameters. In the discussion [1] about this patch, Johannes
  3431. - recalled that it fixed some races with the DELBA and indeed this
  3432. - behavior was introduced in [2].
  3433. - While [2] is right for the BARs, the part queueing the {ADD,DEL}BAs on
  3434. - their BA params TID AC violates the spec and is more a workaround for
  3435. - some drivers. Helmut expressed some concerns wrt such drivers, in
  3436. - particular DELBAs in rt2x00.
  3437. -
  3438. - ATM, DELBAs are sent after a driver has called (hence "purposely")
  3439. - ieee80211_start_tx_ba_cb_irqsafe and Johannes and Emmanuel gave some
  3440. - details wrt intentions behind the split of the IEEE80211_AMPDU_TX_STOP_*
  3441. - given to the driver ampdu_action supposed to call this function, which
  3442. - could prove handy to people trying to do the right thing in faulty
  3443. - drivers (if their fw/hw don't get in their way).
  3444. -
  3445. - [1] http://mid.gmane.org/1390391564-18481-1-git-send-email-karl.beldan@gmail.com
  3446. - [2] Commit: cf6bb79ad828 ("mac80211: Use appropriate TID for sending BAR, ADDBA and DELBA frames")
  3447. -
  3448. - Signed-off-by: Karl Beldan <karl.beldan@rivierawaves.com>
  3449. - Cc: Helmut Schaa <helmut.schaa@googlemail.com>
  3450. - Cc: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
  3451. - Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  3452. ---- a/drivers/net/wireless/ath/ath6kl/cfg80211.c
  3453. -+++ b/drivers/net/wireless/ath/ath6kl/cfg80211.c
  3454. -@@ -790,7 +790,7 @@ void ath6kl_cfg80211_connect_event(struc
  3455. - if (nw_type & ADHOC_NETWORK) {
  3456. - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "ad-hoc %s selected\n",
  3457. - nw_type & ADHOC_CREATOR ? "creator" : "joiner");
  3458. -- cfg80211_ibss_joined(vif->ndev, bssid, GFP_KERNEL);
  3459. -+ cfg80211_ibss_joined(vif->ndev, bssid, chan, GFP_KERNEL);
  3460. - cfg80211_put_bss(ar->wiphy, bss);
  3461. - return;
  3462. - }
  3463. -@@ -861,13 +861,9 @@ void ath6kl_cfg80211_disconnect_event(st
  3464. - }
  3465. -
  3466. - if (vif->nw_type & ADHOC_NETWORK) {
  3467. -- if (vif->wdev.iftype != NL80211_IFTYPE_ADHOC) {
  3468. -+ if (vif->wdev.iftype != NL80211_IFTYPE_ADHOC)
  3469. - ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
  3470. - "%s: ath6k not in ibss mode\n", __func__);
  3471. -- return;
  3472. -- }
  3473. -- memset(bssid, 0, ETH_ALEN);
  3474. -- cfg80211_ibss_joined(vif->ndev, bssid, GFP_KERNEL);
  3475. - return;
  3476. - }
  3477. -
  3478. -@@ -3256,6 +3252,15 @@ static int ath6kl_cfg80211_sscan_start(s
  3479. - struct ath6kl_vif *vif = netdev_priv(dev);
  3480. - u16 interval;
  3481. - int ret, rssi_thold;
  3482. -+ int n_match_sets = request->n_match_sets;
  3483. -+
  3484. -+ /*
  3485. -+ * If there's a matchset w/o an SSID, then assume it's just for
  3486. -+ * the RSSI (nothing else is currently supported) and ignore it.
  3487. -+ * The device only supports a global RSSI filter that we set below.
  3488. -+ */
  3489. -+ if (n_match_sets == 1 && !request->match_sets[0].ssid.ssid_len)
  3490. -+ n_match_sets = 0;
  3491. -
  3492. - if (ar->state != ATH6KL_STATE_ON)
  3493. - return -EIO;
  3494. -@@ -3268,11 +3273,11 @@ static int ath6kl_cfg80211_sscan_start(s
  3495. - ret = ath6kl_set_probed_ssids(ar, vif, request->ssids,
  3496. - request->n_ssids,
  3497. - request->match_sets,
  3498. -- request->n_match_sets);
  3499. -+ n_match_sets);
  3500. - if (ret < 0)
  3501. - return ret;
  3502. -
  3503. -- if (!request->n_match_sets) {
  3504. -+ if (!n_match_sets) {
  3505. - ret = ath6kl_wmi_bssfilter_cmd(ar->wmi, vif->fw_vif_idx,
  3506. - ALL_BSS_FILTER, 0);
  3507. - if (ret < 0)
  3508. -@@ -3286,12 +3291,12 @@ static int ath6kl_cfg80211_sscan_start(s
  3509. -
  3510. - if (test_bit(ATH6KL_FW_CAPABILITY_RSSI_SCAN_THOLD,
  3511. - ar->fw_capabilities)) {
  3512. -- if (request->rssi_thold <= NL80211_SCAN_RSSI_THOLD_OFF)
  3513. -+ if (request->min_rssi_thold <= NL80211_SCAN_RSSI_THOLD_OFF)
  3514. - rssi_thold = 0;
  3515. -- else if (request->rssi_thold < -127)
  3516. -+ else if (request->min_rssi_thold < -127)
  3517. - rssi_thold = -127;
  3518. - else
  3519. -- rssi_thold = request->rssi_thold;
  3520. -+ rssi_thold = request->min_rssi_thold;
  3521. -
  3522. - ret = ath6kl_wmi_set_rssi_filter_cmd(ar->wmi, vif->fw_vif_idx,
  3523. - rssi_thold);
  3524. ---- a/drivers/net/wireless/ath/ath9k/hw.c
  3525. -+++ b/drivers/net/wireless/ath/ath9k/hw.c
  3526. -@@ -1316,7 +1316,7 @@ static bool ath9k_hw_set_reset(struct at
  3527. - if (AR_SREV_9300_20_OR_LATER(ah))
  3528. - udelay(50);
  3529. - else if (AR_SREV_9100(ah))
  3530. -- udelay(10000);
  3531. -+ mdelay(10);
  3532. - else
  3533. - udelay(100);
  3534. +--- a/drivers/net/wireless/ath/ath9k/recv.c
  3535. ++++ b/drivers/net/wireless/ath/ath9k/recv.c
  3536. +@@ -34,7 +34,8 @@ static inline bool ath9k_check_auto_slee
  3537. + * buffer (or rx fifo). This can incorrectly acknowledge packets
  3538. + * to a sender if last desc is self-linked.
  3539. + */
  3540. +-static void ath_rx_buf_link(struct ath_softc *sc, struct ath_rxbuf *bf)
  3541. ++static void ath_rx_buf_link(struct ath_softc *sc, struct ath_rxbuf *bf,
  3542. ++ bool flush)
  3543. + {
  3544. + struct ath_hw *ah = sc->sc_ah;
  3545. + struct ath_common *common = ath9k_hw_common(ah);
  3546. +@@ -59,18 +60,19 @@ static void ath_rx_buf_link(struct ath_s
  3547. + common->rx_bufsize,
  3548. + 0);
  3549. +
  3550. +- if (sc->rx.rxlink == NULL)
  3551. +- ath9k_hw_putrxbuf(ah, bf->bf_daddr);
  3552. +- else
  3553. ++ if (sc->rx.rxlink)
  3554. + *sc->rx.rxlink = bf->bf_daddr;
  3555. ++ else if (!flush)
  3556. ++ ath9k_hw_putrxbuf(ah, bf->bf_daddr);
  3557. +
  3558. + sc->rx.rxlink = &ds->ds_link;
  3559. + }
  3560. -@@ -1534,7 +1534,7 @@ EXPORT_SYMBOL(ath9k_hw_check_nav);
  3561. - bool ath9k_hw_check_alive(struct ath_hw *ah)
  3562. +-static void ath_rx_buf_relink(struct ath_softc *sc, struct ath_rxbuf *bf)
  3563. ++static void ath_rx_buf_relink(struct ath_softc *sc, struct ath_rxbuf *bf,
  3564. ++ bool flush)
  3565. {
  3566. - int count = 50;
  3567. -- u32 reg;
  3568. -+ u32 reg, last_val;
  3569. -
  3570. - if (AR_SREV_9300(ah))
  3571. - return !ath9k_hw_detect_mac_hang(ah);
  3572. -@@ -1542,9 +1542,14 @@ bool ath9k_hw_check_alive(struct ath_hw
  3573. - if (AR_SREV_9285_12_OR_LATER(ah))
  3574. - return true;
  3575. -
  3576. -+ last_val = REG_READ(ah, AR_OBS_BUS_1);
  3577. - do {
  3578. - reg = REG_READ(ah, AR_OBS_BUS_1);
  3579. -+ if (reg != last_val)
  3580. -+ return true;
  3581. -
  3582. -+ udelay(1);
  3583. -+ last_val = reg;
  3584. - if ((reg & 0x7E7FFFEF) == 0x00702400)
  3585. - continue;
  3586. -
  3587. -@@ -2051,9 +2056,8 @@ static bool ath9k_hw_set_power_awake(str
  3588. -
  3589. - REG_SET_BIT(ah, AR_RTC_FORCE_WAKE,
  3590. - AR_RTC_FORCE_WAKE_EN);
  3591. --
  3592. - if (AR_SREV_9100(ah))
  3593. -- udelay(10000);
  3594. -+ mdelay(10);
  3595. - else
  3596. - udelay(50);
  3597. + if (sc->rx.buf_hold)
  3598. +- ath_rx_buf_link(sc, sc->rx.buf_hold);
  3599. ++ ath_rx_buf_link(sc, sc->rx.buf_hold, flush);
  3600. ---- a/drivers/net/wireless/ath/ath9k/main.c
  3601. -+++ b/drivers/net/wireless/ath/ath9k/main.c
  3602. -@@ -451,7 +451,7 @@ void ath9k_tasklet(unsigned long data)
  3603. - * interrupts are enabled in the reset routine.
  3604. - */
  3605. - atomic_inc(&ah->intr_ref_cnt);
  3606. -- ath_dbg(common, ANY, "FATAL: Skipping interrupts\n");
  3607. -+ ath_dbg(common, RESET, "FATAL: Skipping interrupts\n");
  3608. - goto out;
  3609. + sc->rx.buf_hold = bf;
  3610. + }
  3611. +@@ -442,7 +444,7 @@ int ath_startrecv(struct ath_softc *sc)
  3612. + sc->rx.buf_hold = NULL;
  3613. + sc->rx.rxlink = NULL;
  3614. + list_for_each_entry_safe(bf, tbf, &sc->rx.rxbuf, list) {
  3615. +- ath_rx_buf_link(sc, bf);
  3616. ++ ath_rx_buf_link(sc, bf, false);
  3617. }
  3618. -@@ -471,7 +471,7 @@ void ath9k_tasklet(unsigned long data)
  3619. - * interrupts are enabled in the reset routine.
  3620. - */
  3621. - atomic_inc(&ah->intr_ref_cnt);
  3622. -- ath_dbg(common, ANY,
  3623. -+ ath_dbg(common, RESET,
  3624. - "BB_WATCHDOG: Skipping interrupts\n");
  3625. - goto out;
  3626. - }
  3627. -@@ -484,7 +484,7 @@ void ath9k_tasklet(unsigned long data)
  3628. - type = RESET_TYPE_TX_GTT;
  3629. - ath9k_queue_reset(sc, type);
  3630. - atomic_inc(&ah->intr_ref_cnt);
  3631. -- ath_dbg(common, ANY,
  3632. -+ ath_dbg(common, RESET,
  3633. - "GTT: Skipping interrupts\n");
  3634. - goto out;
  3635. + /* We could have deleted elements so the list may be empty now */
  3636. +@@ -1118,12 +1120,12 @@ requeue_drop_frag:
  3637. + requeue:
  3638. + list_add_tail(&bf->list, &sc->rx.rxbuf);
  3639. +
  3640. +- if (edma) {
  3641. +- ath_rx_edma_buf_link(sc, qtype);
  3642. +- } else {
  3643. +- ath_rx_buf_relink(sc, bf);
  3644. ++ if (!edma) {
  3645. ++ ath_rx_buf_relink(sc, bf, flush);
  3646. + if (!flush)
  3647. + ath9k_hw_rxena(ah);
  3648. ++ } else if (!flush) {
  3649. ++ ath_rx_edma_buf_link(sc, qtype);
  3650. }
  3651. -@@ -1866,7 +1866,7 @@ static void ath9k_set_coverage_class(str
  3652. - static bool ath9k_has_tx_pending(struct ath_softc *sc)
  3653. - {
  3654. -- int i, npend;
  3655. -+ int i, npend = 0;
  3656. -
  3657. - for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
  3658. - if (!ATH_TXQ_SETUP(sc, i))
  3659. ---- a/drivers/net/wireless/iwlwifi/mvm/scan.c
  3660. -+++ b/drivers/net/wireless/iwlwifi/mvm/scan.c
  3661. -@@ -595,6 +595,9 @@ static void iwl_scan_offload_build_ssid(
  3662. - * config match list.
  3663. - */
  3664. - for (i = 0; i < req->n_match_sets && i < PROBE_OPTION_MAX; i++) {
  3665. -+ /* skip empty SSID matchsets */
  3666. -+ if (!req->match_sets[i].ssid.ssid_len)
  3667. -+ continue;
  3668. - scan->direct_scan[i].id = WLAN_EID_SSID;
  3669. - scan->direct_scan[i].len = req->match_sets[i].ssid.ssid_len;
  3670. - memcpy(scan->direct_scan[i].ssid, req->match_sets[i].ssid.ssid,
  3671. ---- a/drivers/net/wireless/rtlwifi/rtl8188ee/trx.c
  3672. -+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/trx.c
  3673. -@@ -452,7 +452,7 @@ bool rtl88ee_rx_query_desc(struct ieee80
  3674. - /* During testing, hdr was NULL */
  3675. - return false;
  3676. - }
  3677. -- if ((ieee80211_is_robust_mgmt_frame(hdr)) &&
  3678. -+ if ((_ieee80211_is_robust_mgmt_frame(hdr)) &&
  3679. - (ieee80211_has_protected(hdr->frame_control)))
  3680. - rx_status->flag &= ~RX_FLAG_DECRYPTED;
  3681. - else
  3682. ---- a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
  3683. -+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
  3684. -@@ -393,7 +393,7 @@ bool rtl92ce_rx_query_desc(struct ieee80
  3685. - /* In testing, hdr was NULL here */
  3686. - return false;
  3687. - }
  3688. -- if ((ieee80211_is_robust_mgmt_frame(hdr)) &&
  3689. -+ if ((_ieee80211_is_robust_mgmt_frame(hdr)) &&
  3690. - (ieee80211_has_protected(hdr->frame_control)))
  3691. - rx_status->flag &= ~RX_FLAG_DECRYPTED;
  3692. - else
  3693. ---- a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
  3694. -+++ b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
  3695. -@@ -310,7 +310,7 @@ bool rtl92se_rx_query_desc(struct ieee80
  3696. - /* during testing, hdr was NULL here */
  3697. - return false;
  3698. - }
  3699. -- if ((ieee80211_is_robust_mgmt_frame(hdr)) &&
  3700. -+ if ((_ieee80211_is_robust_mgmt_frame(hdr)) &&
  3701. - (ieee80211_has_protected(hdr->frame_control)))
  3702. - rx_status->flag &= ~RX_FLAG_DECRYPTED;
  3703. - else
  3704. ---- a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
  3705. -+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
  3706. -@@ -334,7 +334,7 @@ bool rtl8723ae_rx_query_desc(struct ieee
  3707. - /* during testing, hdr could be NULL here */
  3708. - return false;
  3709. - }
  3710. -- if ((ieee80211_is_robust_mgmt_frame(hdr)) &&
  3711. -+ if ((_ieee80211_is_robust_mgmt_frame(hdr)) &&
  3712. - (ieee80211_has_protected(hdr->frame_control)))
  3713. - rx_status->flag &= ~RX_FLAG_DECRYPTED;
  3714. - else
  3715. ---- a/include/linux/ieee80211.h
  3716. -+++ b/include/linux/ieee80211.h
  3717. -@@ -597,6 +597,20 @@ static inline int ieee80211_is_qos_nullf
  3718. - }
  3719. + if (!budget--)
  3720. +--- a/net/mac80211/sta_info.c
  3721. ++++ b/net/mac80211/sta_info.c
  3722. +@@ -100,7 +100,8 @@ static void __cleanup_single_sta(struct
  3723. + struct ps_data *ps;
  3724. - /**
  3725. -+ * ieee80211_is_bufferable_mmpdu - check if frame is bufferable MMPDU
  3726. -+ * @fc: frame control field in little-endian byteorder
  3727. -+ */
  3728. -+static inline bool ieee80211_is_bufferable_mmpdu(__le16 fc)
  3729. -+{
  3730. -+ /* IEEE 802.11-2012, definition of "bufferable management frame";
  3731. -+ * note that this ignores the IBSS special case. */
  3732. -+ return ieee80211_is_mgmt(fc) &&
  3733. -+ (ieee80211_is_action(fc) ||
  3734. -+ ieee80211_is_disassoc(fc) ||
  3735. -+ ieee80211_is_deauth(fc));
  3736. -+}
  3737. -+
  3738. -+/**
  3739. - * ieee80211_is_first_frag - check if IEEE80211_SCTL_FRAG is not set
  3740. - * @seq_ctrl: frame sequence control bytes in little-endian byteorder
  3741. - */
  3742. -@@ -2192,10 +2206,10 @@ static inline u8 *ieee80211_get_DA(struc
  3743. - }
  3744. + if (test_sta_flag(sta, WLAN_STA_PS_STA) ||
  3745. +- test_sta_flag(sta, WLAN_STA_PS_DRIVER)) {
  3746. ++ test_sta_flag(sta, WLAN_STA_PS_DRIVER) ||
  3747. ++ test_sta_flag(sta, WLAN_STA_PS_DELIVER)) {
  3748. + if (sta->sdata->vif.type == NL80211_IFTYPE_AP ||
  3749. + sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
  3750. + ps = &sdata->bss->ps;
  3751. +@@ -111,6 +112,7 @@ static void __cleanup_single_sta(struct
  3752. - /**
  3753. -- * ieee80211_is_robust_mgmt_frame - check if frame is a robust management frame
  3754. -+ * _ieee80211_is_robust_mgmt_frame - check if frame is a robust management frame
  3755. - * @hdr: the frame (buffer must include at least the first octet of payload)
  3756. - */
  3757. --static inline bool ieee80211_is_robust_mgmt_frame(struct ieee80211_hdr *hdr)
  3758. -+static inline bool _ieee80211_is_robust_mgmt_frame(struct ieee80211_hdr *hdr)
  3759. - {
  3760. - if (ieee80211_is_disassoc(hdr->frame_control) ||
  3761. - ieee80211_is_deauth(hdr->frame_control))
  3762. -@@ -2224,6 +2238,17 @@ static inline bool ieee80211_is_robust_m
  3763. - }
  3764. + clear_sta_flag(sta, WLAN_STA_PS_STA);
  3765. + clear_sta_flag(sta, WLAN_STA_PS_DRIVER);
  3766. ++ clear_sta_flag(sta, WLAN_STA_PS_DELIVER);
  3767. - /**
  3768. -+ * ieee80211_is_robust_mgmt_frame - check if skb contains a robust mgmt frame
  3769. -+ * @skb: the skb containing the frame, length will be checked
  3770. -+ */
  3771. -+static inline bool ieee80211_is_robust_mgmt_frame(struct sk_buff *skb)
  3772. -+{
  3773. -+ if (skb->len < 25)
  3774. -+ return false;
  3775. -+ return _ieee80211_is_robust_mgmt_frame((void *)skb->data);
  3776. -+}
  3777. -+
  3778. -+/**
  3779. - * ieee80211_is_public_action - check if frame is a public action frame
  3780. - * @hdr: the frame
  3781. - * @len: length of the frame
  3782. ---- a/include/net/cfg80211.h
  3783. -+++ b/include/net/cfg80211.h
  3784. -@@ -1395,9 +1395,11 @@ struct cfg80211_scan_request {
  3785. - * struct cfg80211_match_set - sets of attributes to match
  3786. - *
  3787. - * @ssid: SSID to be matched
  3788. -+ * @rssi_thold: don't report scan results below this threshold (in s32 dBm)
  3789. - */
  3790. - struct cfg80211_match_set {
  3791. - struct cfg80211_ssid ssid;
  3792. -+ s32 rssi_thold;
  3793. - };
  3794. + atomic_dec(&ps->num_sta_ps);
  3795. + sta_info_recalc_tim(sta);
  3796. +@@ -125,7 +127,7 @@ static void __cleanup_single_sta(struct
  3797. + if (ieee80211_vif_is_mesh(&sdata->vif))
  3798. + mesh_sta_cleanup(sta);
  3799. - /**
  3800. -@@ -1420,7 +1422,8 @@ struct cfg80211_match_set {
  3801. - * @dev: the interface
  3802. - * @scan_start: start time of the scheduled scan
  3803. - * @channels: channels to scan
  3804. -- * @rssi_thold: don't report scan results below this threshold (in s32 dBm)
  3805. -+ * @min_rssi_thold: for drivers only supporting a single threshold, this
  3806. -+ * contains the minimum over all matchsets
  3807. - */
  3808. - struct cfg80211_sched_scan_request {
  3809. - struct cfg80211_ssid *ssids;
  3810. -@@ -1433,7 +1436,7 @@ struct cfg80211_sched_scan_request {
  3811. - u32 flags;
  3812. - struct cfg80211_match_set *match_sets;
  3813. - int n_match_sets;
  3814. -- s32 rssi_thold;
  3815. -+ s32 min_rssi_thold;
  3816. -
  3817. - /* internal */
  3818. - struct wiphy *wiphy;
  3819. -@@ -3130,8 +3133,8 @@ struct cfg80211_cached_keys;
  3820. - * @identifier: (private) Identifier used in nl80211 to identify this
  3821. - * wireless device if it has no netdev
  3822. - * @current_bss: (private) Used by the internal configuration code
  3823. -- * @channel: (private) Used by the internal configuration code to track
  3824. -- * the user-set AP, monitor and WDS channel
  3825. -+ * @chandef: (private) Used by the internal configuration code to track
  3826. -+ * the user-set channel definition.
  3827. - * @preset_chandef: (private) Used by the internal configuration code to
  3828. - * track the channel to be used for AP later
  3829. - * @bssid: (private) Used by the internal configuration code
  3830. -@@ -3195,9 +3198,7 @@ struct wireless_dev {
  3831. -
  3832. - struct cfg80211_internal_bss *current_bss; /* associated / joined */
  3833. - struct cfg80211_chan_def preset_chandef;
  3834. --
  3835. -- /* for AP and mesh channel tracking */
  3836. -- struct ieee80211_channel *channel;
  3837. -+ struct cfg80211_chan_def chandef;
  3838. +- cancel_work_sync(&sta->drv_unblock_wk);
  3839. ++ cancel_work_sync(&sta->drv_deliver_wk);
  3840. - bool ibss_fixed;
  3841. - bool ibss_dfs_possible;
  3842. -@@ -3879,6 +3880,7 @@ void cfg80211_michael_mic_failure(struct
  3843. - *
  3844. - * @dev: network device
  3845. - * @bssid: the BSSID of the IBSS joined
  3846. -+ * @channel: the channel of the IBSS joined
  3847. - * @gfp: allocation flags
  3848. - *
  3849. - * This function notifies cfg80211 that the device joined an IBSS or
  3850. -@@ -3888,7 +3890,8 @@ void cfg80211_michael_mic_failure(struct
  3851. - * with the locally generated beacon -- this guarantees that there is
  3852. - * always a scan result for this IBSS. cfg80211 will handle the rest.
  3853. + /*
  3854. + * Destroy aggregation state here. It would be nice to wait for the
  3855. +@@ -227,6 +229,7 @@ struct sta_info *sta_info_get_by_idx(str
  3856. */
  3857. --void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, gfp_t gfp);
  3858. -+void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid,
  3859. -+ struct ieee80211_channel *channel, gfp_t gfp);
  3860. -
  3861. - /**
  3862. - * cfg80211_notify_new_candidate - notify cfg80211 of a new mesh peer candidate
  3863. ---- a/include/uapi/linux/nl80211.h
  3864. -+++ b/include/uapi/linux/nl80211.h
  3865. -@@ -2442,9 +2442,15 @@ enum nl80211_reg_rule_attr {
  3866. - * enum nl80211_sched_scan_match_attr - scheduled scan match attributes
  3867. - * @__NL80211_SCHED_SCAN_MATCH_ATTR_INVALID: attribute number 0 is reserved
  3868. - * @NL80211_SCHED_SCAN_MATCH_ATTR_SSID: SSID to be used for matching,
  3869. -- * only report BSS with matching SSID.
  3870. -+ * only report BSS with matching SSID.
  3871. - * @NL80211_SCHED_SCAN_MATCH_ATTR_RSSI: RSSI threshold (in dBm) for reporting a
  3872. -- * BSS in scan results. Filtering is turned off if not specified.
  3873. -+ * BSS in scan results. Filtering is turned off if not specified. Note that
  3874. -+ * if this attribute is in a match set of its own, then it is treated as
  3875. -+ * the default value for all matchsets with an SSID, rather than being a
  3876. -+ * matchset of its own without an RSSI filter. This is due to problems with
  3877. -+ * how this API was implemented in the past. Also, due to the same problem,
  3878. -+ * the only way to create a matchset with only an RSSI filter (with this
  3879. -+ * attribute) is if there's only a single matchset with the RSSI attribute.
  3880. - * @NL80211_SCHED_SCAN_MATCH_ATTR_MAX: highest scheduled scan filter
  3881. - * attribute number currently defined
  3882. - * @__NL80211_SCHED_SCAN_MATCH_ATTR_AFTER_LAST: internal use
  3883. ---- a/net/mac80211/agg-tx.c
  3884. -+++ b/net/mac80211/agg-tx.c
  3885. -@@ -107,7 +107,7 @@ static void ieee80211_send_addba_request
  3886. - mgmt->u.action.u.addba_req.start_seq_num =
  3887. - cpu_to_le16(start_seq_num << 4);
  3888. -
  3889. -- ieee80211_tx_skb_tid(sdata, skb, tid);
  3890. -+ ieee80211_tx_skb(sdata, skb);
  3891. - }
  3892. -
  3893. - void ieee80211_send_bar(struct ieee80211_vif *vif, u8 *ra, u16 tid, u16 ssn)
  3894. ---- a/net/mac80211/cfg.c
  3895. -+++ b/net/mac80211/cfg.c
  3896. -@@ -970,9 +970,9 @@ static int ieee80211_start_ap(struct wip
  3897. - /* TODO: make hostapd tell us what it wants */
  3898. - sdata->smps_mode = IEEE80211_SMPS_OFF;
  3899. - sdata->needed_rx_chains = sdata->local->rx_chains;
  3900. -- sdata->radar_required = params->radar_required;
  3901. -
  3902. - mutex_lock(&local->mtx);
  3903. -+ sdata->radar_required = params->radar_required;
  3904. - err = ieee80211_vif_use_channel(sdata, &params->chandef,
  3905. - IEEE80211_CHANCTX_SHARED);
  3906. - mutex_unlock(&local->mtx);
  3907. -@@ -1021,8 +1021,10 @@ static int ieee80211_start_ap(struct wip
  3908. - IEEE80211_P2P_OPPPS_ENABLE_BIT;
  3909. + void sta_info_free(struct ieee80211_local *local, struct sta_info *sta)
  3910. + {
  3911. ++ struct ieee80211_sta_rates *rates;
  3912. + int i;
  3913. - err = ieee80211_assign_beacon(sdata, &params->beacon);
  3914. -- if (err < 0)
  3915. -+ if (err < 0) {
  3916. -+ ieee80211_vif_release_channel(sdata);
  3917. - return err;
  3918. -+ }
  3919. - changed |= err;
  3920. -
  3921. - err = drv_start_ap(sdata->local, sdata);
  3922. -@@ -1032,6 +1034,7 @@ static int ieee80211_start_ap(struct wip
  3923. - if (old)
  3924. - kfree_rcu(old, rcu_head);
  3925. - RCU_INIT_POINTER(sdata->u.ap.beacon, NULL);
  3926. -+ ieee80211_vif_release_channel(sdata);
  3927. - return err;
  3928. + if (sta->rate_ctrl)
  3929. +@@ -238,6 +241,10 @@ void sta_info_free(struct ieee80211_loca
  3930. + kfree(sta->tx_lat);
  3931. }
  3932. -@@ -1053,6 +1056,7 @@ static int ieee80211_change_beacon(struc
  3933. - int err;
  3934. -
  3935. - sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  3936. -+ sdata_assert_lock(sdata);
  3937. -
  3938. - /* don't allow changing the beacon while CSA is in place - offset
  3939. - * of channel switch counter may change
  3940. -@@ -1080,6 +1084,8 @@ static int ieee80211_stop_ap(struct wiph
  3941. - struct probe_resp *old_probe_resp;
  3942. - struct cfg80211_chan_def chandef;
  3943. -
  3944. -+ sdata_assert_lock(sdata);
  3945. ++ rates = rcu_dereference_protected(sta->sta.rates, true);
  3946. ++ if (rates)
  3947. ++ kfree(rates);
  3948. +
  3949. - old_beacon = sdata_dereference(sdata->u.ap.beacon, sdata);
  3950. - if (!old_beacon)
  3951. - return -ENOENT;
  3952. -@@ -1090,8 +1096,6 @@ static int ieee80211_stop_ap(struct wiph
  3953. - kfree(sdata->u.ap.next_beacon);
  3954. - sdata->u.ap.next_beacon = NULL;
  3955. + sta_dbg(sta->sdata, "Destroyed STA %pM\n", sta->sta.addr);
  3956. -- cancel_work_sync(&sdata->u.ap.request_smps_work);
  3957. --
  3958. - /* turn off carrier for this interface and dependent VLANs */
  3959. - list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
  3960. - netif_carrier_off(vlan->dev);
  3961. -@@ -1103,6 +1107,7 @@ static int ieee80211_stop_ap(struct wiph
  3962. - kfree_rcu(old_beacon, rcu_head);
  3963. - if (old_probe_resp)
  3964. - kfree_rcu(old_probe_resp, rcu_head);
  3965. -+ sdata->u.ap.driver_smps_mode = IEEE80211_SMPS_OFF;
  3966. -
  3967. - __sta_info_flush(sdata, true);
  3968. - ieee80211_free_keys(sdata, true);
  3969. -@@ -1988,6 +1993,9 @@ static int ieee80211_change_bss(struct w
  3970. -
  3971. - band = ieee80211_get_sdata_band(sdata);
  3972. -
  3973. -+ if (WARN_ON(!wiphy->bands[band]))
  3974. -+ return -EINVAL;
  3975. -+
  3976. - if (params->use_cts_prot >= 0) {
  3977. - sdata->vif.bss_conf.use_cts_prot = params->use_cts_prot;
  3978. - changed |= BSS_CHANGED_ERP_CTS_PROT;
  3979. -@@ -2638,6 +2646,24 @@ static int ieee80211_start_roc_work(stru
  3980. - INIT_DELAYED_WORK(&roc->work, ieee80211_sw_roc_work);
  3981. - INIT_LIST_HEAD(&roc->dependents);
  3982. -
  3983. -+ /*
  3984. -+ * cookie is either the roc cookie (for normal roc)
  3985. -+ * or the SKB (for mgmt TX)
  3986. -+ */
  3987. -+ if (!txskb) {
  3988. -+ /* local->mtx protects this */
  3989. -+ local->roc_cookie_counter++;
  3990. -+ roc->cookie = local->roc_cookie_counter;
  3991. -+ /* wow, you wrapped 64 bits ... more likely a bug */
  3992. -+ if (WARN_ON(roc->cookie == 0)) {
  3993. -+ roc->cookie = 1;
  3994. -+ local->roc_cookie_counter++;
  3995. -+ }
  3996. -+ *cookie = roc->cookie;
  3997. -+ } else {
  3998. -+ *cookie = (unsigned long)txskb;
  3999. -+ }
  4000. -+
  4001. - /* if there's one pending or we're scanning, queue this one */
  4002. - if (!list_empty(&local->roc_list) ||
  4003. - local->scanning || local->radar_detect_enabled)
  4004. -@@ -2772,24 +2798,6 @@ static int ieee80211_start_roc_work(stru
  4005. - if (!queued)
  4006. - list_add_tail(&roc->list, &local->roc_list);
  4007. -
  4008. -- /*
  4009. -- * cookie is either the roc cookie (for normal roc)
  4010. -- * or the SKB (for mgmt TX)
  4011. -- */
  4012. -- if (!txskb) {
  4013. -- /* local->mtx protects this */
  4014. -- local->roc_cookie_counter++;
  4015. -- roc->cookie = local->roc_cookie_counter;
  4016. -- /* wow, you wrapped 64 bits ... more likely a bug */
  4017. -- if (WARN_ON(roc->cookie == 0)) {
  4018. -- roc->cookie = 1;
  4019. -- local->roc_cookie_counter++;
  4020. -- }
  4021. -- *cookie = roc->cookie;
  4022. -- } else {
  4023. -- *cookie = (unsigned long)txskb;
  4024. -- }
  4025. --
  4026. - return 0;
  4027. + kfree(sta);
  4028. +@@ -252,33 +259,23 @@ static void sta_info_hash_add(struct iee
  4029. + rcu_assign_pointer(local->sta_hash[STA_HASH(sta->sta.addr)], sta);
  4030. }
  4031. -@@ -3004,8 +3012,10 @@ void ieee80211_csa_finalize_work(struct
  4032. - if (!ieee80211_sdata_running(sdata))
  4033. - goto unlock;
  4034. -
  4035. -- sdata->radar_required = sdata->csa_radar_required;
  4036. -+ sdata_assert_lock(sdata);
  4037. -+
  4038. - mutex_lock(&local->mtx);
  4039. -+ sdata->radar_required = sdata->csa_radar_required;
  4040. - err = ieee80211_vif_change_channel(sdata, &changed);
  4041. - mutex_unlock(&local->mtx);
  4042. - if (WARN_ON(err < 0))
  4043. -@@ -3022,13 +3032,13 @@ void ieee80211_csa_finalize_work(struct
  4044. - switch (sdata->vif.type) {
  4045. - case NL80211_IFTYPE_AP:
  4046. - err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon);
  4047. -+ kfree(sdata->u.ap.next_beacon);
  4048. -+ sdata->u.ap.next_beacon = NULL;
  4049. -+
  4050. - if (err < 0)
  4051. - goto unlock;
  4052. -
  4053. - changed |= err;
  4054. -- kfree(sdata->u.ap.next_beacon);
  4055. -- sdata->u.ap.next_beacon = NULL;
  4056. --
  4057. - ieee80211_bss_info_change_notify(sdata, err);
  4058. - break;
  4059. - case NL80211_IFTYPE_ADHOC:
  4060. -@@ -3066,7 +3076,7 @@ int ieee80211_channel_switch(struct wiph
  4061. - struct ieee80211_if_mesh __maybe_unused *ifmsh;
  4062. - int err, num_chanctx;
  4063. -
  4064. -- lockdep_assert_held(&sdata->wdev.mtx);
  4065. -+ sdata_assert_lock(sdata);
  4066. -
  4067. - if (!list_empty(&local->roc_list) || local->scanning)
  4068. - return -EBUSY;
  4069. ---- a/net/mac80211/ht.c
  4070. -+++ b/net/mac80211/ht.c
  4071. -@@ -375,7 +375,7 @@ void ieee80211_send_delba(struct ieee802
  4072. - mgmt->u.action.u.delba.params = cpu_to_le16(params);
  4073. - mgmt->u.action.u.delba.reason_code = cpu_to_le16(reason_code);
  4074. -
  4075. -- ieee80211_tx_skb_tid(sdata, skb, tid);
  4076. -+ ieee80211_tx_skb(sdata, skb);
  4077. - }
  4078. -
  4079. - void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata,
  4080. -@@ -466,7 +466,9 @@ void ieee80211_request_smps_ap_work(stru
  4081. - u.ap.request_smps_work);
  4082. -
  4083. - sdata_lock(sdata);
  4084. -- __ieee80211_request_smps_ap(sdata, sdata->u.ap.driver_smps_mode);
  4085. -+ if (sdata_dereference(sdata->u.ap.beacon, sdata))
  4086. -+ __ieee80211_request_smps_ap(sdata,
  4087. -+ sdata->u.ap.driver_smps_mode);
  4088. - sdata_unlock(sdata);
  4089. - }
  4090. +-static void sta_unblock(struct work_struct *wk)
  4091. ++static void sta_deliver_ps_frames(struct work_struct *wk)
  4092. + {
  4093. + struct sta_info *sta;
  4094. ---- a/net/mac80211/iface.c
  4095. -+++ b/net/mac80211/iface.c
  4096. -@@ -770,12 +770,19 @@ static void ieee80211_do_stop(struct iee
  4097. +- sta = container_of(wk, struct sta_info, drv_unblock_wk);
  4098. ++ sta = container_of(wk, struct sta_info, drv_deliver_wk);
  4099. - ieee80211_roc_purge(local, sdata);
  4100. + if (sta->dead)
  4101. + return;
  4102. -- if (sdata->vif.type == NL80211_IFTYPE_STATION)
  4103. -+ switch (sdata->vif.type) {
  4104. -+ case NL80211_IFTYPE_STATION:
  4105. - ieee80211_mgd_stop(sdata);
  4106. +- if (!test_sta_flag(sta, WLAN_STA_PS_STA)) {
  4107. +- local_bh_disable();
  4108. ++ local_bh_disable();
  4109. ++ if (!test_sta_flag(sta, WLAN_STA_PS_STA))
  4110. + ieee80211_sta_ps_deliver_wakeup(sta);
  4111. +- local_bh_enable();
  4112. +- } else if (test_and_clear_sta_flag(sta, WLAN_STA_PSPOLL)) {
  4113. +- clear_sta_flag(sta, WLAN_STA_PS_DRIVER);
  4114. -
  4115. -- if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
  4116. -+ break;
  4117. -+ case NL80211_IFTYPE_ADHOC:
  4118. - ieee80211_ibss_stop(sdata);
  4119. +- local_bh_disable();
  4120. ++ else if (test_and_clear_sta_flag(sta, WLAN_STA_PSPOLL))
  4121. + ieee80211_sta_ps_deliver_poll_response(sta);
  4122. +- local_bh_enable();
  4123. +- } else if (test_and_clear_sta_flag(sta, WLAN_STA_UAPSD)) {
  4124. +- clear_sta_flag(sta, WLAN_STA_PS_DRIVER);
  4125. -
  4126. -+ break;
  4127. -+ case NL80211_IFTYPE_AP:
  4128. -+ cancel_work_sync(&sdata->u.ap.request_smps_work);
  4129. -+ break;
  4130. -+ default:
  4131. -+ break;
  4132. -+ }
  4133. -
  4134. - /*
  4135. - * Remove all stations associated with this interface.
  4136. -@@ -827,7 +834,9 @@ static void ieee80211_do_stop(struct iee
  4137. - cancel_work_sync(&local->dynamic_ps_enable_work);
  4138. -
  4139. - cancel_work_sync(&sdata->recalc_smps);
  4140. -+ sdata_lock(sdata);
  4141. - sdata->vif.csa_active = false;
  4142. -+ sdata_unlock(sdata);
  4143. - cancel_work_sync(&sdata->csa_finalize_work);
  4144. -
  4145. - cancel_delayed_work_sync(&sdata->dfs_cac_timer_work);
  4146. ---- a/net/mac80211/rx.c
  4147. -+++ b/net/mac80211/rx.c
  4148. -@@ -599,10 +599,10 @@ static int ieee80211_is_unicast_robust_m
  4149. - {
  4150. - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
  4151. -
  4152. -- if (skb->len < 24 || is_multicast_ether_addr(hdr->addr1))
  4153. -+ if (is_multicast_ether_addr(hdr->addr1))
  4154. - return 0;
  4155. -
  4156. -- return ieee80211_is_robust_mgmt_frame(hdr);
  4157. -+ return ieee80211_is_robust_mgmt_frame(skb);
  4158. +- local_bh_disable();
  4159. ++ else if (test_and_clear_sta_flag(sta, WLAN_STA_UAPSD))
  4160. + ieee80211_sta_ps_deliver_uapsd(sta);
  4161. +- local_bh_enable();
  4162. +- } else
  4163. +- clear_sta_flag(sta, WLAN_STA_PS_DRIVER);
  4164. ++ local_bh_enable();
  4165. }
  4166. + static int sta_prepare_rate_control(struct ieee80211_local *local,
  4167. +@@ -340,7 +337,7 @@ struct sta_info *sta_info_alloc(struct i
  4168. -@@ -610,10 +610,10 @@ static int ieee80211_is_multicast_robust
  4169. - {
  4170. - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
  4171. -
  4172. -- if (skb->len < 24 || !is_multicast_ether_addr(hdr->addr1))
  4173. -+ if (!is_multicast_ether_addr(hdr->addr1))
  4174. - return 0;
  4175. -
  4176. -- return ieee80211_is_robust_mgmt_frame(hdr);
  4177. -+ return ieee80211_is_robust_mgmt_frame(skb);
  4178. - }
  4179. -
  4180. -
  4181. -@@ -626,7 +626,7 @@ static int ieee80211_get_mmie_keyidx(str
  4182. - if (skb->len < 24 + sizeof(*mmie) || !is_multicast_ether_addr(hdr->da))
  4183. - return -1;
  4184. -
  4185. -- if (!ieee80211_is_robust_mgmt_frame((struct ieee80211_hdr *) hdr))
  4186. -+ if (!ieee80211_is_robust_mgmt_frame(skb))
  4187. - return -1; /* not a robust management frame */
  4188. -
  4189. - mmie = (struct ieee80211_mmie *)
  4190. -@@ -1128,6 +1128,13 @@ static void sta_ps_end(struct sta_info *
  4191. - sta->sta.addr, sta->sta.aid);
  4192. -
  4193. - if (test_sta_flag(sta, WLAN_STA_PS_DRIVER)) {
  4194. -+ /*
  4195. -+ * Clear the flag only if the other one is still set
  4196. -+ * so that the TX path won't start TX'ing new frames
  4197. -+ * directly ... In the case that the driver flag isn't
  4198. -+ * set ieee80211_sta_ps_deliver_wakeup() will clear it.
  4199. -+ */
  4200. -+ clear_sta_flag(sta, WLAN_STA_PS_STA);
  4201. - ps_dbg(sta->sdata, "STA %pM aid %d driver-ps-blocked\n",
  4202. - sta->sta.addr, sta->sta.aid);
  4203. - return;
  4204. -@@ -1311,18 +1318,15 @@ ieee80211_rx_h_sta_process(struct ieee80
  4205. - !ieee80211_has_morefrags(hdr->frame_control) &&
  4206. - !(status->rx_flags & IEEE80211_RX_DEFERRED_RELEASE) &&
  4207. - (rx->sdata->vif.type == NL80211_IFTYPE_AP ||
  4208. -- rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN)) {
  4209. -+ rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) &&
  4210. -+ /* PM bit is only checked in frames where it isn't reserved,
  4211. -+ * in AP mode it's reserved in non-bufferable management frames
  4212. -+ * (cf. IEEE 802.11-2012 8.2.4.1.7 Power Management field)
  4213. -+ */
  4214. -+ (!ieee80211_is_mgmt(hdr->frame_control) ||
  4215. -+ ieee80211_is_bufferable_mmpdu(hdr->frame_control))) {
  4216. - if (test_sta_flag(sta, WLAN_STA_PS_STA)) {
  4217. -- /*
  4218. -- * Ignore doze->wake transitions that are
  4219. -- * indicated by non-data frames, the standard
  4220. -- * is unclear here, but for example going to
  4221. -- * PS mode and then scanning would cause a
  4222. -- * doze->wake transition for the probe request,
  4223. -- * and that is clearly undesirable.
  4224. -- */
  4225. -- if (ieee80211_is_data(hdr->frame_control) &&
  4226. -- !ieee80211_has_pm(hdr->frame_control))
  4227. -+ if (!ieee80211_has_pm(hdr->frame_control))
  4228. - sta_ps_end(sta);
  4229. - } else {
  4230. - if (ieee80211_has_pm(hdr->frame_control))
  4231. -@@ -1845,8 +1849,7 @@ static int ieee80211_drop_unencrypted_mg
  4232. - * having configured keys.
  4233. - */
  4234. - if (unlikely(ieee80211_is_action(fc) && !rx->key &&
  4235. -- ieee80211_is_robust_mgmt_frame(
  4236. -- (struct ieee80211_hdr *) rx->skb->data)))
  4237. -+ ieee80211_is_robust_mgmt_frame(rx->skb)))
  4238. - return -EACCES;
  4239. + spin_lock_init(&sta->lock);
  4240. + spin_lock_init(&sta->ps_lock);
  4241. +- INIT_WORK(&sta->drv_unblock_wk, sta_unblock);
  4242. ++ INIT_WORK(&sta->drv_deliver_wk, sta_deliver_ps_frames);
  4243. + INIT_WORK(&sta->ampdu_mlme.work, ieee80211_ba_session_work);
  4244. + mutex_init(&sta->ampdu_mlme.mtx);
  4245. + #ifdef CPTCFG_MAC80211_MESH
  4246. +@@ -1140,8 +1137,15 @@ void ieee80211_sta_ps_deliver_wakeup(str
  4247. }
  4248. ---- a/net/mac80211/tx.c
  4249. -+++ b/net/mac80211/tx.c
  4250. -@@ -452,8 +452,7 @@ static int ieee80211_use_mfp(__le16 fc,
  4251. - if (sta == NULL || !test_sta_flag(sta, WLAN_STA_MFP))
  4252. - return 0;
  4253. -
  4254. -- if (!ieee80211_is_robust_mgmt_frame((struct ieee80211_hdr *)
  4255. -- skb->data))
  4256. -+ if (!ieee80211_is_robust_mgmt_frame(skb))
  4257. - return 0;
  4258. -
  4259. - return 1;
  4260. -@@ -478,6 +477,20 @@ ieee80211_tx_h_unicast_ps_buf(struct iee
  4261. - sta->sta.addr, sta->sta.aid, ac);
  4262. - if (tx->local->total_ps_buffered >= TOTAL_MAX_TX_BUFFER)
  4263. - purge_old_ps_buffers(tx->local);
  4264. + ieee80211_add_pending_skbs(local, &pending);
  4265. +- clear_sta_flag(sta, WLAN_STA_PS_DRIVER);
  4266. +- clear_sta_flag(sta, WLAN_STA_PS_STA);
  4267. +
  4268. -+ /* sync with ieee80211_sta_ps_deliver_wakeup */
  4269. -+ spin_lock(&sta->ps_lock);
  4270. -+ /*
  4271. -+ * STA woke up the meantime and all the frames on ps_tx_buf have
  4272. -+ * been queued to pending queue. No reordering can happen, go
  4273. -+ * ahead and Tx the packet.
  4274. -+ */
  4275. -+ if (!test_sta_flag(sta, WLAN_STA_PS_STA) &&
  4276. -+ !test_sta_flag(sta, WLAN_STA_PS_DRIVER)) {
  4277. -+ spin_unlock(&sta->ps_lock);
  4278. -+ return TX_CONTINUE;
  4279. -+ }
  4280. ++ /* now we're no longer in the deliver code */
  4281. ++ clear_sta_flag(sta, WLAN_STA_PS_DELIVER);
  4282. +
  4283. - if (skb_queue_len(&sta->ps_tx_buf[ac]) >= STA_MAX_TX_BUFFER) {
  4284. - struct sk_buff *old = skb_dequeue(&sta->ps_tx_buf[ac]);
  4285. - ps_dbg(tx->sdata,
  4286. -@@ -492,6 +505,7 @@ ieee80211_tx_h_unicast_ps_buf(struct iee
  4287. - info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
  4288. - info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS;
  4289. - skb_queue_tail(&sta->ps_tx_buf[ac], tx->skb);
  4290. -+ spin_unlock(&sta->ps_lock);
  4291. -
  4292. - if (!timer_pending(&local->sta_cleanup))
  4293. - mod_timer(&local->sta_cleanup,
  4294. -@@ -525,9 +539,7 @@ ieee80211_tx_h_ps_buf(struct ieee80211_t
  4295. -
  4296. - /* only deauth, disassoc and action are bufferable MMPDUs */
  4297. - if (ieee80211_is_mgmt(hdr->frame_control) &&
  4298. -- !ieee80211_is_deauth(hdr->frame_control) &&
  4299. -- !ieee80211_is_disassoc(hdr->frame_control) &&
  4300. -- !ieee80211_is_action(hdr->frame_control)) {
  4301. -+ !ieee80211_is_bufferable_mmpdu(hdr->frame_control)) {
  4302. - if (tx->flags & IEEE80211_TX_UNICAST)
  4303. - info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER;
  4304. - return TX_CONTINUE;
  4305. -@@ -567,7 +579,7 @@ ieee80211_tx_h_select_key(struct ieee802
  4306. - tx->key = key;
  4307. - else if (ieee80211_is_mgmt(hdr->frame_control) &&
  4308. - is_multicast_ether_addr(hdr->addr1) &&
  4309. -- ieee80211_is_robust_mgmt_frame(hdr) &&
  4310. -+ ieee80211_is_robust_mgmt_frame(tx->skb) &&
  4311. - (key = rcu_dereference(tx->sdata->default_mgmt_key)))
  4312. - tx->key = key;
  4313. - else if (is_multicast_ether_addr(hdr->addr1) &&
  4314. -@@ -582,12 +594,12 @@ ieee80211_tx_h_select_key(struct ieee802
  4315. - tx->key = NULL;
  4316. - else if (tx->skb->protocol == tx->sdata->control_port_protocol)
  4317. - tx->key = NULL;
  4318. -- else if (ieee80211_is_robust_mgmt_frame(hdr) &&
  4319. -+ else if (ieee80211_is_robust_mgmt_frame(tx->skb) &&
  4320. - !(ieee80211_is_action(hdr->frame_control) &&
  4321. - tx->sta && test_sta_flag(tx->sta, WLAN_STA_MFP)))
  4322. - tx->key = NULL;
  4323. - else if (ieee80211_is_mgmt(hdr->frame_control) &&
  4324. -- !ieee80211_is_robust_mgmt_frame(hdr))
  4325. -+ !ieee80211_is_robust_mgmt_frame(tx->skb))
  4326. - tx->key = NULL;
  4327. - else {
  4328. - I802_DEBUG_INC(tx->local->tx_handlers_drop_unencrypted);
  4329. -@@ -878,7 +890,7 @@ static int ieee80211_fragment(struct iee
  4330. - }
  4331. -
  4332. - /* adjust first fragment's length */
  4333. -- skb->len = hdrlen + per_fragm;
  4334. -+ skb_trim(skb, hdrlen + per_fragm);
  4335. - return 0;
  4336. - }
  4337. -
  4338. -@@ -2900,7 +2912,7 @@ ieee80211_get_buffered_bc(struct ieee802
  4339. - cpu_to_le16(IEEE80211_FCTL_MOREDATA);
  4340. - }
  4341. -
  4342. -- if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
  4343. -+ if (sdata->vif.type == NL80211_IFTYPE_AP)
  4344. - sdata = IEEE80211_DEV_TO_SUB_IF(skb->dev);
  4345. - if (!ieee80211_tx_prepare(sdata, &tx, skb))
  4346. - break;
  4347. ---- a/net/mac80211/wpa.c
  4348. -+++ b/net/mac80211/wpa.c
  4349. -@@ -499,7 +499,7 @@ ieee80211_crypto_ccmp_decrypt(struct iee
  4350. - hdrlen = ieee80211_hdrlen(hdr->frame_control);
  4351. -
  4352. - if (!ieee80211_is_data(hdr->frame_control) &&
  4353. -- !ieee80211_is_robust_mgmt_frame(hdr))
  4354. -+ !ieee80211_is_robust_mgmt_frame(skb))
  4355. - return RX_CONTINUE;
  4356. -
  4357. - data_len = skb->len - hdrlen - IEEE80211_CCMP_HDR_LEN -
  4358. ---- a/net/wireless/ap.c
  4359. -+++ b/net/wireless/ap.c
  4360. -@@ -27,9 +27,10 @@ static int __cfg80211_stop_ap(struct cfg
  4361. - err = rdev_stop_ap(rdev, dev);
  4362. - if (!err) {
  4363. - wdev->beacon_interval = 0;
  4364. -- wdev->channel = NULL;
  4365. -+ memset(&wdev->chandef, 0, sizeof(wdev->chandef));
  4366. - wdev->ssid_len = 0;
  4367. - rdev_set_qos_map(rdev, dev, NULL);
  4368. -+ nl80211_send_ap_stopped(wdev);
  4369. - }
  4370. ++ /* The station might have polled and then woken up before we responded,
  4371. ++ * so clear these flags now to avoid them sticking around.
  4372. ++ */
  4373. ++ clear_sta_flag(sta, WLAN_STA_PSPOLL);
  4374. ++ clear_sta_flag(sta, WLAN_STA_UAPSD);
  4375. + spin_unlock(&sta->ps_lock);
  4376. - return err;
  4377. ---- a/net/wireless/core.c
  4378. -+++ b/net/wireless/core.c
  4379. -@@ -203,8 +203,11 @@ void cfg80211_stop_p2p_device(struct cfg
  4380. + atomic_dec(&ps->num_sta_ps);
  4381. +@@ -1542,10 +1546,26 @@ void ieee80211_sta_block_awake(struct ie
  4382. - rdev->opencount--;
  4383. + trace_api_sta_block_awake(sta->local, pubsta, block);
  4384. -- WARN_ON(rdev->scan_req && rdev->scan_req->wdev == wdev &&
  4385. -- !rdev->scan_req->notified);
  4386. -+ if (rdev->scan_req && rdev->scan_req->wdev == wdev) {
  4387. -+ if (WARN_ON(!rdev->scan_req->notified))
  4388. -+ rdev->scan_req->aborted = true;
  4389. -+ ___cfg80211_scan_done(rdev, false);
  4390. +- if (block)
  4391. ++ if (block) {
  4392. + set_sta_flag(sta, WLAN_STA_PS_DRIVER);
  4393. +- else if (test_sta_flag(sta, WLAN_STA_PS_DRIVER))
  4394. +- ieee80211_queue_work(hw, &sta->drv_unblock_wk);
  4395. ++ return;
  4396. ++ }
  4397. ++
  4398. ++ if (!test_sta_flag(sta, WLAN_STA_PS_DRIVER))
  4399. ++ return;
  4400. ++
  4401. ++ if (!test_sta_flag(sta, WLAN_STA_PS_STA)) {
  4402. ++ set_sta_flag(sta, WLAN_STA_PS_DELIVER);
  4403. ++ clear_sta_flag(sta, WLAN_STA_PS_DRIVER);
  4404. ++ ieee80211_queue_work(hw, &sta->drv_deliver_wk);
  4405. ++ } else if (test_sta_flag(sta, WLAN_STA_PSPOLL) ||
  4406. ++ test_sta_flag(sta, WLAN_STA_UAPSD)) {
  4407. ++ /* must be asleep in this case */
  4408. ++ clear_sta_flag(sta, WLAN_STA_PS_DRIVER);
  4409. ++ ieee80211_queue_work(hw, &sta->drv_deliver_wk);
  4410. ++ } else {
  4411. ++ clear_sta_flag(sta, WLAN_STA_PS_DRIVER);
  4412. + }
  4413. }
  4414. + EXPORT_SYMBOL(ieee80211_sta_block_awake);
  4415. - static int cfg80211_rfkill_set_block(void *data, bool blocked)
  4416. -@@ -447,9 +450,6 @@ int wiphy_register(struct wiphy *wiphy)
  4417. - int i;
  4418. - u16 ifmodes = wiphy->interface_modes;
  4419. -
  4420. -- /* support for 5/10 MHz is broken due to nl80211 API mess - disable */
  4421. -- wiphy->flags &= ~WIPHY_FLAG_SUPPORTS_5_10_MHZ;
  4422. --
  4423. - /*
  4424. - * There are major locking problems in nl80211/mac80211 for CSA,
  4425. - * disable for all drivers until this has been reworked.
  4426. -@@ -795,8 +795,6 @@ void cfg80211_leave(struct cfg80211_regi
  4427. - default:
  4428. - break;
  4429. - }
  4430. --
  4431. -- wdev->beacon_interval = 0;
  4432. +@@ -1703,3 +1723,137 @@ u8 sta_info_tx_streams(struct sta_info *
  4433. + return ((ht_cap->mcs.tx_params & IEEE80211_HT_MCS_TX_MAX_STREAMS_MASK)
  4434. + >> IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT) + 1;
  4435. }
  4436. -
  4437. - static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
  4438. -@@ -875,8 +873,11 @@ static int cfg80211_netdev_notifier_call
  4439. - break;
  4440. - case NETDEV_DOWN:
  4441. - cfg80211_update_iface_num(rdev, wdev->iftype, -1);
  4442. -- WARN_ON(rdev->scan_req && rdev->scan_req->wdev == wdev &&
  4443. -- !rdev->scan_req->notified);
  4444. -+ if (rdev->scan_req && rdev->scan_req->wdev == wdev) {
  4445. -+ if (WARN_ON(!rdev->scan_req->notified))
  4446. -+ rdev->scan_req->aborted = true;
  4447. -+ ___cfg80211_scan_done(rdev, false);
  4448. -+ }
  4449. -
  4450. - if (WARN_ON(rdev->sched_scan_req &&
  4451. - rdev->sched_scan_req->dev == wdev->netdev)) {
  4452. ---- a/net/wireless/core.h
  4453. -+++ b/net/wireless/core.h
  4454. -@@ -62,6 +62,7 @@ struct cfg80211_registered_device {
  4455. - struct rb_root bss_tree;
  4456. - u32 bss_generation;
  4457. - struct cfg80211_scan_request *scan_req; /* protected by RTNL */
  4458. -+ struct sk_buff *scan_msg;
  4459. - struct cfg80211_sched_scan_request *sched_scan_req;
  4460. - unsigned long suspend_at;
  4461. - struct work_struct scan_done_wk;
  4462. -@@ -210,6 +211,7 @@ struct cfg80211_event {
  4463. - } dc;
  4464. - struct {
  4465. - u8 bssid[ETH_ALEN];
  4466. -+ struct ieee80211_channel *channel;
  4467. - } ij;
  4468. - };
  4469. - };
  4470. -@@ -257,7 +259,8 @@ int __cfg80211_leave_ibss(struct cfg8021
  4471. - struct net_device *dev, bool nowext);
  4472. - int cfg80211_leave_ibss(struct cfg80211_registered_device *rdev,
  4473. - struct net_device *dev, bool nowext);
  4474. --void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid);
  4475. -+void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid,
  4476. -+ struct ieee80211_channel *channel);
  4477. - int cfg80211_ibss_wext_join(struct cfg80211_registered_device *rdev,
  4478. - struct wireless_dev *wdev);
  4479. -
  4480. -@@ -361,7 +364,8 @@ int cfg80211_validate_key_settings(struc
  4481. - struct key_params *params, int key_idx,
  4482. - bool pairwise, const u8 *mac_addr);
  4483. - void __cfg80211_scan_done(struct work_struct *wk);
  4484. --void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev);
  4485. -+void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev,
  4486. -+ bool send_message);
  4487. - void __cfg80211_sched_scan_results(struct work_struct *wk);
  4488. - int __cfg80211_stop_sched_scan(struct cfg80211_registered_device *rdev,
  4489. - bool driver_initiated);
  4490. -@@ -441,7 +445,8 @@ static inline unsigned int elapsed_jiffi
  4491. - void
  4492. - cfg80211_get_chan_state(struct wireless_dev *wdev,
  4493. - struct ieee80211_channel **chan,
  4494. -- enum cfg80211_chan_mode *chanmode);
  4495. -+ enum cfg80211_chan_mode *chanmode,
  4496. -+ u8 *radar_detect);
  4497. -
  4498. - int cfg80211_set_monitor_channel(struct cfg80211_registered_device *rdev,
  4499. - struct cfg80211_chan_def *chandef);
  4500. ---- a/net/wireless/nl80211.c
  4501. -+++ b/net/wireless/nl80211.c
  4502. -@@ -1723,9 +1723,10 @@ static int nl80211_dump_wiphy(struct sk_
  4503. - * We can then retry with the larger buffer.
  4504. - */
  4505. - if ((ret == -ENOBUFS || ret == -EMSGSIZE) &&
  4506. -- !skb->len &&
  4507. -+ !skb->len && !state->split &&
  4508. - cb->min_dump_alloc < 4096) {
  4509. - cb->min_dump_alloc = 4096;
  4510. -+ state->split_start = 0;
  4511. - rtnl_unlock();
  4512. - return 1;
  4513. - }
  4514. -@@ -2047,10 +2048,12 @@ static int nl80211_set_wiphy(struct sk_b
  4515. - nla_for_each_nested(nl_txq_params,
  4516. - info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS],
  4517. - rem_txq_params) {
  4518. -- nla_parse(tb, NL80211_TXQ_ATTR_MAX,
  4519. -- nla_data(nl_txq_params),
  4520. -- nla_len(nl_txq_params),
  4521. -- txq_params_policy);
  4522. -+ result = nla_parse(tb, NL80211_TXQ_ATTR_MAX,
  4523. -+ nla_data(nl_txq_params),
  4524. -+ nla_len(nl_txq_params),
  4525. -+ txq_params_policy);
  4526. -+ if (result)
  4527. -+ goto bad_res;
  4528. - result = parse_txq_params(tb, &txq_params);
  4529. - if (result)
  4530. - goto bad_res;
  4531. -@@ -3289,7 +3292,7 @@ static int nl80211_start_ap(struct sk_bu
  4532. - if (!err) {
  4533. - wdev->preset_chandef = params.chandef;
  4534. - wdev->beacon_interval = params.beacon_interval;
  4535. -- wdev->channel = params.chandef.chan;
  4536. -+ wdev->chandef = params.chandef;
  4537. - wdev->ssid_len = params.ssid_len;
  4538. - memcpy(wdev->ssid, params.ssid, wdev->ssid_len);
  4539. - }
  4540. -@@ -5210,9 +5213,11 @@ static int nl80211_set_reg(struct sk_buf
  4541. -
  4542. - nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
  4543. - rem_reg_rules) {
  4544. -- nla_parse(tb, NL80211_REG_RULE_ATTR_MAX,
  4545. -- nla_data(nl_reg_rule), nla_len(nl_reg_rule),
  4546. -- reg_rule_policy);
  4547. -+ r = nla_parse(tb, NL80211_REG_RULE_ATTR_MAX,
  4548. -+ nla_data(nl_reg_rule), nla_len(nl_reg_rule),
  4549. -+ reg_rule_policy);
  4550. -+ if (r)
  4551. -+ goto bad_reg;
  4552. - r = parse_reg_rule(tb, &rd->reg_rules[rule_idx]);
  4553. - if (r)
  4554. - goto bad_reg;
  4555. -@@ -5277,7 +5282,7 @@ static int nl80211_trigger_scan(struct s
  4556. - if (!rdev->ops->scan)
  4557. - return -EOPNOTSUPP;
  4558. -
  4559. -- if (rdev->scan_req) {
  4560. -+ if (rdev->scan_req || rdev->scan_msg) {
  4561. - err = -EBUSY;
  4562. - goto unlock;
  4563. - }
  4564. -@@ -5475,6 +5480,7 @@ static int nl80211_start_sched_scan(stru
  4565. - enum ieee80211_band band;
  4566. - size_t ie_len;
  4567. - struct nlattr *tb[NL80211_SCHED_SCAN_MATCH_ATTR_MAX + 1];
  4568. -+ s32 default_match_rssi = NL80211_SCAN_RSSI_THOLD_OFF;
  4569. -
  4570. - if (!(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_SCHED_SCAN) ||
  4571. - !rdev->ops->sched_scan_start)
  4572. -@@ -5509,11 +5515,40 @@ static int nl80211_start_sched_scan(stru
  4573. - if (n_ssids > wiphy->max_sched_scan_ssids)
  4574. - return -EINVAL;
  4575. -
  4576. -- if (info->attrs[NL80211_ATTR_SCHED_SCAN_MATCH])
  4577. -+ /*
  4578. -+ * First, count the number of 'real' matchsets. Due to an issue with
  4579. -+ * the old implementation, matchsets containing only the RSSI attribute
  4580. -+ * (NL80211_SCHED_SCAN_MATCH_ATTR_RSSI) are considered as the 'default'
  4581. -+ * RSSI for all matchsets, rather than their own matchset for reporting
  4582. -+ * all APs with a strong RSSI. This is needed to be compatible with
  4583. -+ * older userspace that treated a matchset with only the RSSI as the
  4584. -+ * global RSSI for all other matchsets - if there are other matchsets.
  4585. -+ */
  4586. -+ if (info->attrs[NL80211_ATTR_SCHED_SCAN_MATCH]) {
  4587. - nla_for_each_nested(attr,
  4588. - info->attrs[NL80211_ATTR_SCHED_SCAN_MATCH],
  4589. -- tmp)
  4590. -- n_match_sets++;
  4591. -+ tmp) {
  4592. -+ struct nlattr *rssi;
  4593. +
  4594. -+ err = nla_parse(tb, NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
  4595. -+ nla_data(attr), nla_len(attr),
  4596. -+ nl80211_match_policy);
  4597. -+ if (err)
  4598. -+ return err;
  4599. -+ /* add other standalone attributes here */
  4600. -+ if (tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID]) {
  4601. -+ n_match_sets++;
  4602. -+ continue;
  4603. -+ }
  4604. -+ rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
  4605. -+ if (rssi)
  4606. -+ default_match_rssi = nla_get_s32(rssi);
  4607. ++void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
  4608. ++{
  4609. ++ struct ieee80211_sub_if_data *sdata = sta->sdata;
  4610. ++ struct ieee80211_local *local = sdata->local;
  4611. ++ struct rate_control_ref *ref = local->rate_ctrl;
  4612. ++ struct timespec uptime;
  4613. ++ u64 packets = 0;
  4614. ++ u32 thr = 0;
  4615. ++ int i, ac;
  4616. ++
  4617. ++ sinfo->generation = sdata->local->sta_generation;
  4618. ++
  4619. ++ sinfo->filled = STATION_INFO_INACTIVE_TIME |
  4620. ++ STATION_INFO_RX_BYTES64 |
  4621. ++ STATION_INFO_TX_BYTES64 |
  4622. ++ STATION_INFO_RX_PACKETS |
  4623. ++ STATION_INFO_TX_PACKETS |
  4624. ++ STATION_INFO_TX_RETRIES |
  4625. ++ STATION_INFO_TX_FAILED |
  4626. ++ STATION_INFO_TX_BITRATE |
  4627. ++ STATION_INFO_RX_BITRATE |
  4628. ++ STATION_INFO_RX_DROP_MISC |
  4629. ++ STATION_INFO_BSS_PARAM |
  4630. ++ STATION_INFO_CONNECTED_TIME |
  4631. ++ STATION_INFO_STA_FLAGS |
  4632. ++ STATION_INFO_BEACON_LOSS_COUNT;
  4633. ++
  4634. ++ do_posix_clock_monotonic_gettime(&uptime);
  4635. ++ sinfo->connected_time = uptime.tv_sec - sta->last_connected;
  4636. ++
  4637. ++ sinfo->inactive_time = jiffies_to_msecs(jiffies - sta->last_rx);
  4638. ++ sinfo->tx_bytes = 0;
  4639. ++ for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
  4640. ++ sinfo->tx_bytes += sta->tx_bytes[ac];
  4641. ++ packets += sta->tx_packets[ac];
  4642. ++ }
  4643. ++ sinfo->tx_packets = packets;
  4644. ++ sinfo->rx_bytes = sta->rx_bytes;
  4645. ++ sinfo->rx_packets = sta->rx_packets;
  4646. ++ sinfo->tx_retries = sta->tx_retry_count;
  4647. ++ sinfo->tx_failed = sta->tx_retry_failed;
  4648. ++ sinfo->rx_dropped_misc = sta->rx_dropped;
  4649. ++ sinfo->beacon_loss_count = sta->beacon_loss_count;
  4650. ++
  4651. ++ if ((sta->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) ||
  4652. ++ (sta->local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)) {
  4653. ++ sinfo->filled |= STATION_INFO_SIGNAL | STATION_INFO_SIGNAL_AVG;
  4654. ++ if (!local->ops->get_rssi ||
  4655. ++ drv_get_rssi(local, sdata, &sta->sta, &sinfo->signal))
  4656. ++ sinfo->signal = (s8)sta->last_signal;
  4657. ++ sinfo->signal_avg = (s8) -ewma_read(&sta->avg_signal);
  4658. ++ }
  4659. ++ if (sta->chains) {
  4660. ++ sinfo->filled |= STATION_INFO_CHAIN_SIGNAL |
  4661. ++ STATION_INFO_CHAIN_SIGNAL_AVG;
  4662. ++
  4663. ++ sinfo->chains = sta->chains;
  4664. ++ for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) {
  4665. ++ sinfo->chain_signal[i] = sta->chain_signal_last[i];
  4666. ++ sinfo->chain_signal_avg[i] =
  4667. ++ (s8) -ewma_read(&sta->chain_signal_avg[i]);
  4668. + }
  4669. + }
  4670. +
  4671. -+ /* However, if there's no other matchset, add the RSSI one */
  4672. -+ if (!n_match_sets && default_match_rssi != NL80211_SCAN_RSSI_THOLD_OFF)
  4673. -+ n_match_sets = 1;
  4674. -
  4675. - if (n_match_sets > wiphy->max_match_sets)
  4676. - return -EINVAL;
  4677. -@@ -5634,11 +5669,22 @@ static int nl80211_start_sched_scan(stru
  4678. - tmp) {
  4679. - struct nlattr *ssid, *rssi;
  4680. -
  4681. -- nla_parse(tb, NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
  4682. -- nla_data(attr), nla_len(attr),
  4683. -- nl80211_match_policy);
  4684. -+ err = nla_parse(tb, NL80211_SCHED_SCAN_MATCH_ATTR_MAX,
  4685. -+ nla_data(attr), nla_len(attr),
  4686. -+ nl80211_match_policy);
  4687. -+ if (err)
  4688. -+ goto out_free;
  4689. - ssid = tb[NL80211_SCHED_SCAN_MATCH_ATTR_SSID];
  4690. - if (ssid) {
  4691. -+ if (WARN_ON(i >= n_match_sets)) {
  4692. -+ /* this indicates a programming error,
  4693. -+ * the loop above should have verified
  4694. -+ * things properly
  4695. -+ */
  4696. -+ err = -EINVAL;
  4697. -+ goto out_free;
  4698. -+ }
  4699. -+
  4700. - if (nla_len(ssid) > IEEE80211_MAX_SSID_LEN) {
  4701. - err = -EINVAL;
  4702. - goto out_free;
  4703. -@@ -5647,15 +5693,28 @@ static int nl80211_start_sched_scan(stru
  4704. - nla_data(ssid), nla_len(ssid));
  4705. - request->match_sets[i].ssid.ssid_len =
  4706. - nla_len(ssid);
  4707. -+ /* special attribute - old implemenation w/a */
  4708. -+ request->match_sets[i].rssi_thold =
  4709. -+ default_match_rssi;
  4710. -+ rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
  4711. -+ if (rssi)
  4712. -+ request->match_sets[i].rssi_thold =
  4713. -+ nla_get_s32(rssi);
  4714. - }
  4715. -- rssi = tb[NL80211_SCHED_SCAN_MATCH_ATTR_RSSI];
  4716. -- if (rssi)
  4717. -- request->rssi_thold = nla_get_u32(rssi);
  4718. -- else
  4719. -- request->rssi_thold =
  4720. -- NL80211_SCAN_RSSI_THOLD_OFF;
  4721. - i++;
  4722. - }
  4723. -+
  4724. -+ /* there was no other matchset, so the RSSI one is alone */
  4725. -+ if (i == 0)
  4726. -+ request->match_sets[0].rssi_thold = default_match_rssi;
  4727. ++ sta_set_rate_info_tx(sta, &sta->last_tx_rate, &sinfo->txrate);
  4728. ++ sta_set_rate_info_rx(sta, &sinfo->rxrate);
  4729. ++
  4730. ++ if (ieee80211_vif_is_mesh(&sdata->vif)) {
  4731. ++#ifdef CPTCFG_MAC80211_MESH
  4732. ++ sinfo->filled |= STATION_INFO_LLID |
  4733. ++ STATION_INFO_PLID |
  4734. ++ STATION_INFO_PLINK_STATE |
  4735. ++ STATION_INFO_LOCAL_PM |
  4736. ++ STATION_INFO_PEER_PM |
  4737. ++ STATION_INFO_NONPEER_PM;
  4738. ++
  4739. ++ sinfo->llid = sta->llid;
  4740. ++ sinfo->plid = sta->plid;
  4741. ++ sinfo->plink_state = sta->plink_state;
  4742. ++ if (test_sta_flag(sta, WLAN_STA_TOFFSET_KNOWN)) {
  4743. ++ sinfo->filled |= STATION_INFO_T_OFFSET;
  4744. ++ sinfo->t_offset = sta->t_offset;
  4745. ++ }
  4746. ++ sinfo->local_pm = sta->local_pm;
  4747. ++ sinfo->peer_pm = sta->peer_pm;
  4748. ++ sinfo->nonpeer_pm = sta->nonpeer_pm;
  4749. ++#endif
  4750. ++ }
  4751. +
  4752. -+ request->min_rssi_thold = INT_MAX;
  4753. -+ for (i = 0; i < n_match_sets; i++)
  4754. -+ request->min_rssi_thold =
  4755. -+ min(request->match_sets[i].rssi_thold,
  4756. -+ request->min_rssi_thold);
  4757. -+ } else {
  4758. -+ request->min_rssi_thold = NL80211_SCAN_RSSI_THOLD_OFF;
  4759. - }
  4760. -
  4761. - if (info->attrs[NL80211_ATTR_IE]) {
  4762. -@@ -5751,7 +5810,7 @@ static int nl80211_start_radar_detection
  4763. -
  4764. - err = rdev->ops->start_radar_detection(&rdev->wiphy, dev, &chandef);
  4765. - if (!err) {
  4766. -- wdev->channel = chandef.chan;
  4767. -+ wdev->chandef = chandef;
  4768. - wdev->cac_started = true;
  4769. - wdev->cac_start_time = jiffies;
  4770. - }
  4771. -@@ -7502,16 +7561,19 @@ static int nl80211_set_tx_bitrate_mask(s
  4772. - * directly to the enum ieee80211_band values used in cfg80211.
  4773. - */
  4774. - BUILD_BUG_ON(NL80211_MAX_SUPP_HT_RATES > IEEE80211_HT_MCS_MASK_LEN * 8);
  4775. -- nla_for_each_nested(tx_rates, info->attrs[NL80211_ATTR_TX_RATES], rem)
  4776. -- {
  4777. -+ nla_for_each_nested(tx_rates, info->attrs[NL80211_ATTR_TX_RATES], rem) {
  4778. - enum ieee80211_band band = nla_type(tx_rates);
  4779. -+ int err;
  4780. ++ sinfo->bss_param.flags = 0;
  4781. ++ if (sdata->vif.bss_conf.use_cts_prot)
  4782. ++ sinfo->bss_param.flags |= BSS_PARAM_FLAGS_CTS_PROT;
  4783. ++ if (sdata->vif.bss_conf.use_short_preamble)
  4784. ++ sinfo->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_PREAMBLE;
  4785. ++ if (sdata->vif.bss_conf.use_short_slot)
  4786. ++ sinfo->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_SLOT_TIME;
  4787. ++ sinfo->bss_param.dtim_period = sdata->local->hw.conf.ps_dtim_period;
  4788. ++ sinfo->bss_param.beacon_interval = sdata->vif.bss_conf.beacon_int;
  4789. ++
  4790. ++ sinfo->sta_flags.set = 0;
  4791. ++ sinfo->sta_flags.mask = BIT(NL80211_STA_FLAG_AUTHORIZED) |
  4792. ++ BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) |
  4793. ++ BIT(NL80211_STA_FLAG_WME) |
  4794. ++ BIT(NL80211_STA_FLAG_MFP) |
  4795. ++ BIT(NL80211_STA_FLAG_AUTHENTICATED) |
  4796. ++ BIT(NL80211_STA_FLAG_ASSOCIATED) |
  4797. ++ BIT(NL80211_STA_FLAG_TDLS_PEER);
  4798. ++ if (test_sta_flag(sta, WLAN_STA_AUTHORIZED))
  4799. ++ sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_AUTHORIZED);
  4800. ++ if (test_sta_flag(sta, WLAN_STA_SHORT_PREAMBLE))
  4801. ++ sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_SHORT_PREAMBLE);
  4802. ++ if (test_sta_flag(sta, WLAN_STA_WME))
  4803. ++ sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_WME);
  4804. ++ if (test_sta_flag(sta, WLAN_STA_MFP))
  4805. ++ sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_MFP);
  4806. ++ if (test_sta_flag(sta, WLAN_STA_AUTH))
  4807. ++ sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_AUTHENTICATED);
  4808. ++ if (test_sta_flag(sta, WLAN_STA_ASSOC))
  4809. ++ sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_ASSOCIATED);
  4810. ++ if (test_sta_flag(sta, WLAN_STA_TDLS_PEER))
  4811. ++ sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_TDLS_PEER);
  4812. ++
  4813. ++ /* check if the driver has a SW RC implementation */
  4814. ++ if (ref && ref->ops->get_expected_throughput)
  4815. ++ thr = ref->ops->get_expected_throughput(sta->rate_ctrl_priv);
  4816. ++ else
  4817. ++ thr = drv_get_expected_throughput(local, &sta->sta);
  4818. +
  4819. - if (band < 0 || band >= IEEE80211_NUM_BANDS)
  4820. - return -EINVAL;
  4821. - sband = rdev->wiphy.bands[band];
  4822. - if (sband == NULL)
  4823. - return -EINVAL;
  4824. -- nla_parse(tb, NL80211_TXRATE_MAX, nla_data(tx_rates),
  4825. -- nla_len(tx_rates), nl80211_txattr_policy);
  4826. -+ err = nla_parse(tb, NL80211_TXRATE_MAX, nla_data(tx_rates),
  4827. -+ nla_len(tx_rates), nl80211_txattr_policy);
  4828. -+ if (err)
  4829. -+ return err;
  4830. - if (tb[NL80211_TXRATE_LEGACY]) {
  4831. - mask.control[band].legacy = rateset_to_mask(
  4832. - sband,
  4833. -@@ -10054,40 +10116,31 @@ void nl80211_send_scan_start(struct cfg8
  4834. - NL80211_MCGRP_SCAN, GFP_KERNEL);
  4835. - }
  4836. -
  4837. --void nl80211_send_scan_done(struct cfg80211_registered_device *rdev,
  4838. -- struct wireless_dev *wdev)
  4839. -+struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev,
  4840. -+ struct wireless_dev *wdev, bool aborted)
  4841. - {
  4842. - struct sk_buff *msg;
  4843. -
  4844. - msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  4845. - if (!msg)
  4846. -- return;
  4847. -+ return NULL;
  4848. -
  4849. - if (nl80211_send_scan_msg(msg, rdev, wdev, 0, 0, 0,
  4850. -- NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
  4851. -+ aborted ? NL80211_CMD_SCAN_ABORTED :
  4852. -+ NL80211_CMD_NEW_SCAN_RESULTS) < 0) {
  4853. - nlmsg_free(msg);
  4854. -- return;
  4855. -+ return NULL;
  4856. - }
  4857. -
  4858. -- genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  4859. -- NL80211_MCGRP_SCAN, GFP_KERNEL);
  4860. -+ return msg;
  4861. - }
  4862. -
  4863. --void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev,
  4864. -- struct wireless_dev *wdev)
  4865. -+void nl80211_send_scan_result(struct cfg80211_registered_device *rdev,
  4866. -+ struct sk_buff *msg)
  4867. - {
  4868. -- struct sk_buff *msg;
  4869. --
  4870. -- msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  4871. - if (!msg)
  4872. - return;
  4873. -
  4874. -- if (nl80211_send_scan_msg(msg, rdev, wdev, 0, 0, 0,
  4875. -- NL80211_CMD_SCAN_ABORTED) < 0) {
  4876. -- nlmsg_free(msg);
  4877. -- return;
  4878. -- }
  4879. --
  4880. - genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0,
  4881. - NL80211_MCGRP_SCAN, GFP_KERNEL);
  4882. - }
  4883. -@@ -11158,7 +11211,8 @@ void cfg80211_ch_switch_notify(struct ne
  4884. - wdev->iftype != NL80211_IFTYPE_MESH_POINT))
  4885. - return;
  4886. -
  4887. -- wdev->channel = chandef->chan;
  4888. -+ wdev->chandef = *chandef;
  4889. -+ wdev->preset_chandef = *chandef;
  4890. - nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL);
  4891. - }
  4892. - EXPORT_SYMBOL(cfg80211_ch_switch_notify);
  4893. -@@ -11673,6 +11727,35 @@ void cfg80211_crit_proto_stopped(struct
  4894. - }
  4895. - EXPORT_SYMBOL(cfg80211_crit_proto_stopped);
  4896. ++ if (thr != 0) {
  4897. ++ sinfo->filled |= STATION_INFO_EXPECTED_THROUGHPUT;
  4898. ++ sinfo->expected_throughput = thr;
  4899. ++ }
  4900. ++}
  4901. +--- a/net/mac80211/status.c
  4902. ++++ b/net/mac80211/status.c
  4903. +@@ -541,6 +541,23 @@ static void ieee80211_tx_latency_end_msr
  4904. + */
  4905. + #define STA_LOST_PKT_THRESHOLD 50
  4906. -+void nl80211_send_ap_stopped(struct wireless_dev *wdev)
  4907. ++static void ieee80211_lost_packet(struct sta_info *sta, struct sk_buff *skb)
  4908. +{
  4909. -+ struct wiphy *wiphy = wdev->wiphy;
  4910. -+ struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
  4911. -+ struct sk_buff *msg;
  4912. -+ void *hdr;
  4913. ++ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
  4914. +
  4915. -+ msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
  4916. -+ if (!msg)
  4917. ++ /* This packet was aggregated but doesn't carry status info */
  4918. ++ if ((info->flags & IEEE80211_TX_CTL_AMPDU) &&
  4919. ++ !(info->flags & IEEE80211_TX_STAT_AMPDU))
  4920. + return;
  4921. +
  4922. -+ hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_STOP_AP);
  4923. -+ if (!hdr)
  4924. -+ goto out;
  4925. -+
  4926. -+ if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) ||
  4927. -+ nla_put_u32(msg, NL80211_ATTR_IFINDEX, wdev->netdev->ifindex) ||
  4928. -+ nla_put_u64(msg, NL80211_ATTR_WDEV, wdev_id(wdev)))
  4929. -+ goto out;
  4930. -+
  4931. -+ genlmsg_end(msg, hdr);
  4932. ++ if (++sta->lost_packets < STA_LOST_PKT_THRESHOLD)
  4933. ++ return;
  4934. +
  4935. -+ genlmsg_multicast_netns(&nl80211_fam, wiphy_net(wiphy), msg, 0,
  4936. -+ NL80211_MCGRP_MLME, GFP_KERNEL);
  4937. -+ return;
  4938. -+ out:
  4939. -+ nlmsg_free(msg);
  4940. ++ cfg80211_cqm_pktloss_notify(sta->sdata->dev, sta->sta.addr,
  4941. ++ sta->lost_packets, GFP_ATOMIC);
  4942. ++ sta->lost_packets = 0;
  4943. +}
  4944. +
  4945. - /* initialisation/exit functions */
  4946. -
  4947. - int nl80211_init(void)
  4948. ---- a/net/wireless/nl80211.h
  4949. -+++ b/net/wireless/nl80211.h
  4950. -@@ -8,10 +8,10 @@ void nl80211_exit(void);
  4951. - void nl80211_notify_dev_rename(struct cfg80211_registered_device *rdev);
  4952. - void nl80211_send_scan_start(struct cfg80211_registered_device *rdev,
  4953. - struct wireless_dev *wdev);
  4954. --void nl80211_send_scan_done(struct cfg80211_registered_device *rdev,
  4955. -- struct wireless_dev *wdev);
  4956. --void nl80211_send_scan_aborted(struct cfg80211_registered_device *rdev,
  4957. -- struct wireless_dev *wdev);
  4958. -+struct sk_buff *nl80211_build_scan_msg(struct cfg80211_registered_device *rdev,
  4959. -+ struct wireless_dev *wdev, bool aborted);
  4960. -+void nl80211_send_scan_result(struct cfg80211_registered_device *rdev,
  4961. -+ struct sk_buff *msg);
  4962. - void nl80211_send_sched_scan(struct cfg80211_registered_device *rdev,
  4963. - struct net_device *netdev, u32 cmd);
  4964. - void nl80211_send_sched_scan_results(struct cfg80211_registered_device *rdev,
  4965. -@@ -74,6 +74,8 @@ nl80211_radar_notify(struct cfg80211_reg
  4966. - enum nl80211_radar_event event,
  4967. - struct net_device *netdev, gfp_t gfp);
  4968. -
  4969. -+void nl80211_send_ap_stopped(struct wireless_dev *wdev);
  4970. -+
  4971. - void cfg80211_rdev_free_coalesce(struct cfg80211_registered_device *rdev);
  4972. -
  4973. - #endif /* __NET_WIRELESS_NL80211_H */
  4974. ---- a/net/wireless/scan.c
  4975. -+++ b/net/wireless/scan.c
  4976. -@@ -161,18 +161,25 @@ static void __cfg80211_bss_expire(struct
  4977. - dev->bss_generation++;
  4978. - }
  4979. -
  4980. --void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev)
  4981. -+void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev,
  4982. -+ bool send_message)
  4983. + void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
  4984. {
  4985. - struct cfg80211_scan_request *request;
  4986. - struct wireless_dev *wdev;
  4987. -+ struct sk_buff *msg;
  4988. - #ifdef CPTCFG_CFG80211_WEXT
  4989. - union iwreq_data wrqu;
  4990. - #endif
  4991. -
  4992. - ASSERT_RTNL();
  4993. -
  4994. -- request = rdev->scan_req;
  4995. -+ if (rdev->scan_msg) {
  4996. -+ nl80211_send_scan_result(rdev, rdev->scan_msg);
  4997. -+ rdev->scan_msg = NULL;
  4998. -+ return;
  4999. -+ }
  5000. + struct sk_buff *skb2;
  5001. +@@ -680,12 +697,8 @@ void ieee80211_tx_status(struct ieee8021
  5002. + if (info->flags & IEEE80211_TX_STAT_ACK) {
  5003. + if (sta->lost_packets)
  5004. + sta->lost_packets = 0;
  5005. +- } else if (++sta->lost_packets >= STA_LOST_PKT_THRESHOLD) {
  5006. +- cfg80211_cqm_pktloss_notify(sta->sdata->dev,
  5007. +- sta->sta.addr,
  5008. +- sta->lost_packets,
  5009. +- GFP_ATOMIC);
  5010. +- sta->lost_packets = 0;
  5011. ++ } else {
  5012. ++ ieee80211_lost_packet(sta, skb);
  5013. + }
  5014. + }
  5015. -+ request = rdev->scan_req;
  5016. - if (!request)
  5017. +--- a/net/mac80211/rx.c
  5018. ++++ b/net/mac80211/rx.c
  5019. +@@ -1107,6 +1107,8 @@ static void sta_ps_end(struct sta_info *
  5020. return;
  5021. -
  5022. -@@ -186,18 +193,16 @@ void ___cfg80211_scan_done(struct cfg802
  5023. - if (wdev->netdev)
  5024. - cfg80211_sme_scan_done(wdev->netdev);
  5025. -
  5026. -- if (request->aborted) {
  5027. -- nl80211_send_scan_aborted(rdev, wdev);
  5028. -- } else {
  5029. -- if (request->flags & NL80211_SCAN_FLAG_FLUSH) {
  5030. -- /* flush entries from previous scans */
  5031. -- spin_lock_bh(&rdev->bss_lock);
  5032. -- __cfg80211_bss_expire(rdev, request->scan_start);
  5033. -- spin_unlock_bh(&rdev->bss_lock);
  5034. -- }
  5035. -- nl80211_send_scan_done(rdev, wdev);
  5036. -+ if (!request->aborted &&
  5037. -+ request->flags & NL80211_SCAN_FLAG_FLUSH) {
  5038. -+ /* flush entries from previous scans */
  5039. -+ spin_lock_bh(&rdev->bss_lock);
  5040. -+ __cfg80211_bss_expire(rdev, request->scan_start);
  5041. -+ spin_unlock_bh(&rdev->bss_lock);
  5042. }
  5043. -+ msg = nl80211_build_scan_msg(rdev, wdev, request->aborted);
  5044. -+
  5045. - #ifdef CPTCFG_CFG80211_WEXT
  5046. - if (wdev->netdev && !request->aborted) {
  5047. - memset(&wrqu, 0, sizeof(wrqu));
  5048. -@@ -211,6 +216,11 @@ void ___cfg80211_scan_done(struct cfg802
  5049. -
  5050. - rdev->scan_req = NULL;
  5051. - kfree(request);
  5052. -+
  5053. -+ if (!send_message)
  5054. -+ rdev->scan_msg = msg;
  5055. -+ else
  5056. -+ nl80211_send_scan_result(rdev, msg);
  5057. ++ set_sta_flag(sta, WLAN_STA_PS_DELIVER);
  5058. ++ clear_sta_flag(sta, WLAN_STA_PS_STA);
  5059. + ieee80211_sta_ps_deliver_wakeup(sta);
  5060. }
  5061. - void __cfg80211_scan_done(struct work_struct *wk)
  5062. -@@ -221,7 +231,7 @@ void __cfg80211_scan_done(struct work_st
  5063. - scan_done_wk);
  5064. +--- a/net/mac80211/sta_info.h
  5065. ++++ b/net/mac80211/sta_info.h
  5066. +@@ -82,6 +82,7 @@ enum ieee80211_sta_info_flags {
  5067. + WLAN_STA_TOFFSET_KNOWN,
  5068. + WLAN_STA_MPSP_OWNER,
  5069. + WLAN_STA_MPSP_RECIPIENT,
  5070. ++ WLAN_STA_PS_DELIVER,
  5071. + };
  5072. - rtnl_lock();
  5073. -- ___cfg80211_scan_done(rdev);
  5074. -+ ___cfg80211_scan_done(rdev, true);
  5075. - rtnl_unlock();
  5076. - }
  5077. + #define ADDBA_RESP_INTERVAL HZ
  5078. +@@ -265,7 +266,7 @@ struct ieee80211_tx_latency_stat {
  5079. + * @last_rx_rate_vht_nss: rx status nss of last data packet
  5080. + * @lock: used for locking all fields that require locking, see comments
  5081. + * in the header file.
  5082. +- * @drv_unblock_wk: used for driver PS unblocking
  5083. ++ * @drv_deliver_wk: used for delivering frames after driver PS unblocking
  5084. + * @listen_interval: listen interval of this station, when we're acting as AP
  5085. + * @_flags: STA flags, see &enum ieee80211_sta_info_flags, do not use directly
  5086. + * @ps_lock: used for powersave (when mac80211 is the AP) related locking
  5087. +@@ -278,7 +279,6 @@ struct ieee80211_tx_latency_stat {
  5088. + * @driver_buffered_tids: bitmap of TIDs the driver has data buffered on
  5089. + * @rx_packets: Number of MSDUs received from this STA
  5090. + * @rx_bytes: Number of bytes received from this STA
  5091. +- * @wep_weak_iv_count: number of weak WEP IVs received from this station
  5092. + * @last_rx: time (in jiffies) when last frame was received from this STA
  5093. + * @last_connected: time (in seconds) when a station got connected
  5094. + * @num_duplicates: number of duplicate frames received from this STA
  5095. +@@ -345,7 +345,7 @@ struct sta_info {
  5096. + void *rate_ctrl_priv;
  5097. + spinlock_t lock;
  5098. +
  5099. +- struct work_struct drv_unblock_wk;
  5100. ++ struct work_struct drv_deliver_wk;
  5101. +
  5102. + u16 listen_interval;
  5103. +
  5104. +@@ -367,7 +367,6 @@ struct sta_info {
  5105. + /* Updated from RX path only, no locking requirements */
  5106. + unsigned long rx_packets;
  5107. + u64 rx_bytes;
  5108. +- unsigned long wep_weak_iv_count;
  5109. + unsigned long last_rx;
  5110. + long last_connected;
  5111. + unsigned long num_duplicates;
  5112. +@@ -628,6 +627,8 @@ void sta_set_rate_info_tx(struct sta_inf
  5113. + struct rate_info *rinfo);
  5114. + void sta_set_rate_info_rx(struct sta_info *sta,
  5115. + struct rate_info *rinfo);
  5116. ++void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo);
  5117. ++
  5118. + void ieee80211_sta_expire(struct ieee80211_sub_if_data *sdata,
  5119. + unsigned long exp_time);
  5120. + u8 sta_info_tx_streams(struct sta_info *sta);
  5121. +--- a/net/mac80211/tx.c
  5122. ++++ b/net/mac80211/tx.c
  5123. +@@ -469,7 +469,8 @@ ieee80211_tx_h_unicast_ps_buf(struct iee
  5124. + return TX_CONTINUE;
  5125. -@@ -1079,7 +1089,7 @@ int cfg80211_wext_siwscan(struct net_dev
  5126. - if (IS_ERR(rdev))
  5127. - return PTR_ERR(rdev);
  5128. + if (unlikely((test_sta_flag(sta, WLAN_STA_PS_STA) ||
  5129. +- test_sta_flag(sta, WLAN_STA_PS_DRIVER)) &&
  5130. ++ test_sta_flag(sta, WLAN_STA_PS_DRIVER) ||
  5131. ++ test_sta_flag(sta, WLAN_STA_PS_DELIVER)) &&
  5132. + !(info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER))) {
  5133. + int ac = skb_get_queue_mapping(tx->skb);
  5134. -- if (rdev->scan_req) {
  5135. -+ if (rdev->scan_req || rdev->scan_msg) {
  5136. - err = -EBUSY;
  5137. - goto out;
  5138. - }
  5139. -@@ -1481,7 +1491,7 @@ int cfg80211_wext_giwscan(struct net_dev
  5140. - if (IS_ERR(rdev))
  5141. - return PTR_ERR(rdev);
  5142. -
  5143. -- if (rdev->scan_req)
  5144. -+ if (rdev->scan_req || rdev->scan_msg)
  5145. - return -EAGAIN;
  5146. -
  5147. - res = ieee80211_scan_results(rdev, info, extra, data->length);
  5148. ---- a/net/wireless/sme.c
  5149. -+++ b/net/wireless/sme.c
  5150. -@@ -67,7 +67,7 @@ static int cfg80211_conn_scan(struct wir
  5151. - ASSERT_RDEV_LOCK(rdev);
  5152. - ASSERT_WDEV_LOCK(wdev);
  5153. -
  5154. -- if (rdev->scan_req)
  5155. -+ if (rdev->scan_req || rdev->scan_msg)
  5156. - return -EBUSY;
  5157. -
  5158. - if (wdev->conn->params.channel)
  5159. ---- a/net/mac80211/mlme.c
  5160. -+++ b/net/mac80211/mlme.c
  5161. -@@ -1001,7 +1001,6 @@ ieee80211_sta_process_chanswitch(struct
  5162. - }
  5163. +@@ -486,7 +487,8 @@ ieee80211_tx_h_unicast_ps_buf(struct iee
  5164. + * ahead and Tx the packet.
  5165. + */
  5166. + if (!test_sta_flag(sta, WLAN_STA_PS_STA) &&
  5167. +- !test_sta_flag(sta, WLAN_STA_PS_DRIVER)) {
  5168. ++ !test_sta_flag(sta, WLAN_STA_PS_DRIVER) &&
  5169. ++ !test_sta_flag(sta, WLAN_STA_PS_DELIVER)) {
  5170. + spin_unlock(&sta->ps_lock);
  5171. + return TX_CONTINUE;
  5172. + }
  5173. +@@ -1618,12 +1620,12 @@ netdev_tx_t ieee80211_monitor_start_xmit
  5174. + {
  5175. + struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
  5176. + struct ieee80211_chanctx_conf *chanctx_conf;
  5177. +- struct ieee80211_channel *chan;
  5178. + struct ieee80211_radiotap_header *prthdr =
  5179. + (struct ieee80211_radiotap_header *)skb->data;
  5180. + struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
  5181. + struct ieee80211_hdr *hdr;
  5182. + struct ieee80211_sub_if_data *tmp_sdata, *sdata;
  5183. ++ struct cfg80211_chan_def *chandef;
  5184. + u16 len_rthdr;
  5185. + int hdrlen;
  5186. - ifmgd->flags |= IEEE80211_STA_CSA_RECEIVED;
  5187. -- sdata->vif.csa_active = true;
  5188. +@@ -1721,9 +1723,9 @@ netdev_tx_t ieee80211_monitor_start_xmit
  5189. + }
  5190. - mutex_lock(&local->chanctx_mtx);
  5191. - if (local->use_chanctx) {
  5192. -@@ -1039,6 +1038,7 @@ ieee80211_sta_process_chanswitch(struct
  5193. - mutex_unlock(&local->chanctx_mtx);
  5194. + if (chanctx_conf)
  5195. +- chan = chanctx_conf->def.chan;
  5196. ++ chandef = &chanctx_conf->def;
  5197. + else if (!local->use_chanctx)
  5198. +- chan = local->_oper_chandef.chan;
  5199. ++ chandef = &local->_oper_chandef;
  5200. + else
  5201. + goto fail_rcu;
  5202. - sdata->csa_chandef = csa_ie.chandef;
  5203. -+ sdata->vif.csa_active = true;
  5204. +@@ -1743,10 +1745,11 @@ netdev_tx_t ieee80211_monitor_start_xmit
  5205. + * radar detection by itself. We can do that later by adding a
  5206. + * monitor flag interfaces used for AP support.
  5207. + */
  5208. +- if ((chan->flags & (IEEE80211_CHAN_NO_IR | IEEE80211_CHAN_RADAR)))
  5209. ++ if (!cfg80211_reg_can_beacon(local->hw.wiphy, chandef,
  5210. ++ sdata->vif.type))
  5211. + goto fail_rcu;
  5212. - if (csa_ie.mode)
  5213. - ieee80211_stop_queues_by_reason(&local->hw,
  5214. ---- a/net/mac80211/chan.c
  5215. -+++ b/net/mac80211/chan.c
  5216. -@@ -196,6 +196,8 @@ static bool ieee80211_is_radar_required(
  5217. - {
  5218. - struct ieee80211_sub_if_data *sdata;
  5219. +- ieee80211_xmit(sdata, skb, chan->band);
  5220. ++ ieee80211_xmit(sdata, skb, chandef->chan->band);
  5221. + rcu_read_unlock();
  5222. -+ lockdep_assert_held(&local->mtx);
  5223. -+
  5224. - rcu_read_lock();
  5225. - list_for_each_entry_rcu(sdata, &local->interfaces, list) {
  5226. - if (sdata->radar_required) {
  5227. ---- a/net/mac80211/ibss.c
  5228. -+++ b/net/mac80211/ibss.c
  5229. -@@ -294,7 +294,6 @@ static void __ieee80211_sta_join_ibss(st
  5230. - }
  5231. + return NETDEV_TX_OK;
  5232. +@@ -2425,7 +2428,7 @@ static void ieee80211_set_csa(struct iee
  5233. + u8 *beacon_data;
  5234. + size_t beacon_data_len;
  5235. + int i;
  5236. +- u8 count = sdata->csa_current_counter;
  5237. ++ u8 count = beacon->csa_current_counter;
  5238. - mutex_lock(&local->mtx);
  5239. -- ieee80211_vif_release_channel(sdata);
  5240. - if (ieee80211_vif_use_channel(sdata, &chandef,
  5241. - ifibss->fixed_channel ?
  5242. - IEEE80211_CHANCTX_SHARED :
  5243. -@@ -303,6 +302,7 @@ static void __ieee80211_sta_join_ibss(st
  5244. - mutex_unlock(&local->mtx);
  5245. + switch (sdata->vif.type) {
  5246. + case NL80211_IFTYPE_AP:
  5247. +@@ -2444,46 +2447,54 @@ static void ieee80211_set_csa(struct iee
  5248. return;
  5249. }
  5250. -+ sdata->radar_required = radar_required;
  5251. - mutex_unlock(&local->mtx);
  5252. -
  5253. - memcpy(ifibss->bssid, bssid, ETH_ALEN);
  5254. -@@ -318,7 +318,6 @@ static void __ieee80211_sta_join_ibss(st
  5255. - rcu_assign_pointer(ifibss->presp, presp);
  5256. - mgmt = (void *)presp->head;
  5257. -
  5258. -- sdata->radar_required = radar_required;
  5259. - sdata->vif.bss_conf.enable_beacon = true;
  5260. - sdata->vif.bss_conf.beacon_int = beacon_int;
  5261. - sdata->vif.bss_conf.basic_rates = basic_rates;
  5262. -@@ -386,7 +385,7 @@ static void __ieee80211_sta_join_ibss(st
  5263. - presp->head_len, 0, GFP_KERNEL);
  5264. - cfg80211_put_bss(local->hw.wiphy, bss);
  5265. - netif_carrier_on(sdata->dev);
  5266. -- cfg80211_ibss_joined(sdata->dev, ifibss->bssid, GFP_KERNEL);
  5267. -+ cfg80211_ibss_joined(sdata->dev, ifibss->bssid, chan, GFP_KERNEL);
  5268. - }
  5269. -
  5270. - static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
  5271. -@@ -802,6 +801,8 @@ ieee80211_ibss_process_chanswitch(struct
  5272. - int err;
  5273. - u32 sta_flags;
  5274. -+ sdata_assert_lock(sdata);
  5275. -+
  5276. - sta_flags = IEEE80211_STA_DISABLE_VHT;
  5277. - switch (ifibss->chandef.width) {
  5278. - case NL80211_CHAN_WIDTH_5:
  5279. -@@ -1471,6 +1472,11 @@ static void ieee80211_rx_mgmt_probe_req(
  5280. - memcpy(((struct ieee80211_mgmt *) skb->data)->da, mgmt->sa, ETH_ALEN);
  5281. - ibss_dbg(sdata, "Sending ProbeResp to %pM\n", mgmt->sa);
  5282. - IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
  5283. ++ rcu_read_lock();
  5284. + for (i = 0; i < IEEE80211_MAX_CSA_COUNTERS_NUM; ++i) {
  5285. +- u16 counter_offset_beacon =
  5286. +- sdata->csa_counter_offset_beacon[i];
  5287. +- u16 counter_offset_presp = sdata->csa_counter_offset_presp[i];
  5288. +-
  5289. +- if (counter_offset_beacon) {
  5290. +- if (WARN_ON(counter_offset_beacon >= beacon_data_len))
  5291. +- return;
  5292. +-
  5293. +- beacon_data[counter_offset_beacon] = count;
  5294. +- }
  5295. +-
  5296. +- if (sdata->vif.type == NL80211_IFTYPE_AP &&
  5297. +- counter_offset_presp) {
  5298. +- rcu_read_lock();
  5299. +- resp = rcu_dereference(sdata->u.ap.probe_resp);
  5300. ++ resp = rcu_dereference(sdata->u.ap.probe_resp);
  5301. +
  5302. +- /* If nl80211 accepted the offset, this should
  5303. +- * not happen.
  5304. +- */
  5305. +- if (WARN_ON(!resp)) {
  5306. ++ if (beacon->csa_counter_offsets[i]) {
  5307. ++ if (WARN_ON_ONCE(beacon->csa_counter_offsets[i] >=
  5308. ++ beacon_data_len)) {
  5309. + rcu_read_unlock();
  5310. + return;
  5311. + }
  5312. +- resp->data[counter_offset_presp] = count;
  5313. +- rcu_read_unlock();
  5314. +
  5315. -+ /* avoid excessive retries for probe request to wildcard SSIDs */
  5316. -+ if (pos[1] == 0)
  5317. -+ IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_NO_ACK;
  5318. ++ beacon_data[beacon->csa_counter_offsets[i]] = count;
  5319. + }
  5320. +
  5321. - ieee80211_tx_skb(sdata, skb);
  5322. ++ if (sdata->vif.type == NL80211_IFTYPE_AP && resp &&
  5323. ++ resp->csa_counter_offsets)
  5324. ++ resp->data[resp->csa_counter_offsets[i]] = count;
  5325. + }
  5326. ++ rcu_read_unlock();
  5327. }
  5328. ---- a/net/mac80211/mesh.c
  5329. -+++ b/net/mac80211/mesh.c
  5330. -@@ -872,6 +872,8 @@ ieee80211_mesh_process_chnswitch(struct
  5331. - if (!ifmsh->mesh_id)
  5332. - return false;
  5333. + u8 ieee80211_csa_update_counter(struct ieee80211_vif *vif)
  5334. + {
  5335. + struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
  5336. ++ struct beacon_data *beacon = NULL;
  5337. ++ u8 count = 0;
  5338. ++
  5339. ++ rcu_read_lock();
  5340. ++
  5341. ++ if (sdata->vif.type == NL80211_IFTYPE_AP)
  5342. ++ beacon = rcu_dereference(sdata->u.ap.beacon);
  5343. ++ else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
  5344. ++ beacon = rcu_dereference(sdata->u.ibss.presp);
  5345. ++ else if (ieee80211_vif_is_mesh(&sdata->vif))
  5346. ++ beacon = rcu_dereference(sdata->u.mesh.beacon);
  5347. ++
  5348. ++ if (!beacon)
  5349. ++ goto unlock;
  5350. +
  5351. +- sdata->csa_current_counter--;
  5352. ++ beacon->csa_current_counter--;
  5353. +
  5354. + /* the counter should never reach 0 */
  5355. +- WARN_ON(!sdata->csa_current_counter);
  5356. ++ WARN_ON_ONCE(!beacon->csa_current_counter);
  5357. ++ count = beacon->csa_current_counter;
  5358. +
  5359. +- return sdata->csa_current_counter;
  5360. ++unlock:
  5361. ++ rcu_read_unlock();
  5362. ++ return count;
  5363. + }
  5364. + EXPORT_SYMBOL(ieee80211_csa_update_counter);
  5365. -+ sdata_assert_lock(sdata);
  5366. -+
  5367. - sta_flags = IEEE80211_STA_DISABLE_VHT;
  5368. - switch (sdata->vif.bss_conf.chandef.width) {
  5369. - case NL80211_CHAN_WIDTH_20_NOHT:
  5370. ---- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
  5371. -+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
  5372. -@@ -4658,6 +4658,7 @@ brcmf_notify_connect_status(struct brcmf
  5373. - struct brcmf_cfg80211_info *cfg = ifp->drvr->config;
  5374. - struct net_device *ndev = ifp->ndev;
  5375. - struct brcmf_cfg80211_profile *profile = &ifp->vif->profile;
  5376. -+ struct ieee80211_channel *chan;
  5377. - s32 err = 0;
  5378. -
  5379. - if (ifp->vif->mode == WL_MODE_AP) {
  5380. -@@ -4665,9 +4666,10 @@ brcmf_notify_connect_status(struct brcmf
  5381. - } else if (brcmf_is_linkup(e)) {
  5382. - brcmf_dbg(CONN, "Linkup\n");
  5383. - if (brcmf_is_ibssmode(ifp->vif)) {
  5384. -+ chan = ieee80211_get_channel(cfg->wiphy, cfg->channel);
  5385. - memcpy(profile->bssid, e->addr, ETH_ALEN);
  5386. - wl_inform_ibss(cfg, ndev, e->addr);
  5387. -- cfg80211_ibss_joined(ndev, e->addr, GFP_KERNEL);
  5388. -+ cfg80211_ibss_joined(ndev, e->addr, chan, GFP_KERNEL);
  5389. - clear_bit(BRCMF_VIF_STATUS_CONNECTING,
  5390. - &ifp->vif->sme_state);
  5391. - set_bit(BRCMF_VIF_STATUS_CONNECTED,
  5392. ---- a/drivers/net/wireless/libertas/cfg.c
  5393. -+++ b/drivers/net/wireless/libertas/cfg.c
  5394. -@@ -1766,7 +1766,8 @@ static void lbs_join_post(struct lbs_pri
  5395. - memcpy(priv->wdev->ssid, params->ssid, params->ssid_len);
  5396. - priv->wdev->ssid_len = params->ssid_len;
  5397. -
  5398. -- cfg80211_ibss_joined(priv->dev, bssid, GFP_KERNEL);
  5399. -+ cfg80211_ibss_joined(priv->dev, bssid, params->chandef.chan,
  5400. -+ GFP_KERNEL);
  5401. -
  5402. - /* TODO: consider doing this at MACREG_INT_CODE_LINK_SENSED time */
  5403. - priv->connect_status = LBS_CONNECTED;
  5404. ---- a/drivers/net/wireless/mwifiex/cfg80211.c
  5405. -+++ b/drivers/net/wireless/mwifiex/cfg80211.c
  5406. -@@ -1881,7 +1881,8 @@ mwifiex_cfg80211_join_ibss(struct wiphy
  5407. - params->privacy);
  5408. - done:
  5409. - if (!ret) {
  5410. -- cfg80211_ibss_joined(priv->netdev, priv->cfg_bssid, GFP_KERNEL);
  5411. -+ cfg80211_ibss_joined(priv->netdev, priv->cfg_bssid,
  5412. -+ params->chandef.chan, GFP_KERNEL);
  5413. - dev_dbg(priv->adapter->dev,
  5414. - "info: joined/created adhoc network with bssid"
  5415. - " %pM successfully\n", priv->cfg_bssid);
  5416. ---- a/drivers/net/wireless/rndis_wlan.c
  5417. -+++ b/drivers/net/wireless/rndis_wlan.c
  5418. -@@ -2835,7 +2835,9 @@ static void rndis_wlan_do_link_up_work(s
  5419. - bssid, req_ie, req_ie_len,
  5420. - resp_ie, resp_ie_len, GFP_KERNEL);
  5421. - } else if (priv->infra_mode == NDIS_80211_INFRA_ADHOC)
  5422. -- cfg80211_ibss_joined(usbdev->net, bssid, GFP_KERNEL);
  5423. -+ cfg80211_ibss_joined(usbdev->net, bssid,
  5424. -+ get_current_channel(usbdev, NULL),
  5425. -+ GFP_KERNEL);
  5426. -
  5427. - kfree(info);
  5428. -
  5429. ---- a/net/wireless/ibss.c
  5430. -+++ b/net/wireless/ibss.c
  5431. -@@ -14,7 +14,8 @@
  5432. - #include "rdev-ops.h"
  5433. +@@ -2493,7 +2504,6 @@ bool ieee80211_csa_is_complete(struct ie
  5434. + struct beacon_data *beacon = NULL;
  5435. + u8 *beacon_data;
  5436. + size_t beacon_data_len;
  5437. +- int counter_beacon = sdata->csa_counter_offset_beacon[0];
  5438. + int ret = false;
  5439. + if (!ieee80211_sdata_running(sdata))
  5440. +@@ -2531,10 +2541,13 @@ bool ieee80211_csa_is_complete(struct ie
  5441. + goto out;
  5442. + }
  5443. --void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid)
  5444. -+void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid,
  5445. -+ struct ieee80211_channel *channel)
  5446. - {
  5447. - struct wireless_dev *wdev = dev->ieee80211_ptr;
  5448. - struct cfg80211_bss *bss;
  5449. -@@ -28,8 +29,7 @@ void __cfg80211_ibss_joined(struct net_d
  5450. - if (!wdev->ssid_len)
  5451. - return;
  5452. +- if (WARN_ON(counter_beacon > beacon_data_len))
  5453. ++ if (!beacon->csa_counter_offsets[0])
  5454. ++ goto out;
  5455. ++
  5456. ++ if (WARN_ON_ONCE(beacon->csa_counter_offsets[0] > beacon_data_len))
  5457. + goto out;
  5458. -- bss = cfg80211_get_bss(wdev->wiphy, NULL, bssid,
  5459. -- wdev->ssid, wdev->ssid_len,
  5460. -+ bss = cfg80211_get_bss(wdev->wiphy, channel, bssid, NULL, 0,
  5461. - WLAN_CAPABILITY_IBSS, WLAN_CAPABILITY_IBSS);
  5462. +- if (beacon_data[counter_beacon] == 1)
  5463. ++ if (beacon_data[beacon->csa_counter_offsets[0]] == 1)
  5464. + ret = true;
  5465. + out:
  5466. + rcu_read_unlock();
  5467. +@@ -2550,6 +2563,7 @@ __ieee80211_beacon_get(struct ieee80211_
  5468. + bool is_template)
  5469. + {
  5470. + struct ieee80211_local *local = hw_to_local(hw);
  5471. ++ struct beacon_data *beacon = NULL;
  5472. + struct sk_buff *skb = NULL;
  5473. + struct ieee80211_tx_info *info;
  5474. + struct ieee80211_sub_if_data *sdata = NULL;
  5475. +@@ -2571,10 +2585,10 @@ __ieee80211_beacon_get(struct ieee80211_
  5476. +
  5477. + if (sdata->vif.type == NL80211_IFTYPE_AP) {
  5478. + struct ieee80211_if_ap *ap = &sdata->u.ap;
  5479. +- struct beacon_data *beacon = rcu_dereference(ap->beacon);
  5480. +
  5481. ++ beacon = rcu_dereference(ap->beacon);
  5482. + if (beacon) {
  5483. +- if (sdata->vif.csa_active) {
  5484. ++ if (beacon->csa_counter_offsets[0]) {
  5485. + if (!is_template)
  5486. + ieee80211_csa_update_counter(vif);
  5487. +
  5488. +@@ -2615,37 +2629,37 @@ __ieee80211_beacon_get(struct ieee80211_
  5489. + } else if (sdata->vif.type == NL80211_IFTYPE_ADHOC) {
  5490. + struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
  5491. + struct ieee80211_hdr *hdr;
  5492. +- struct beacon_data *presp = rcu_dereference(ifibss->presp);
  5493. +
  5494. +- if (!presp)
  5495. ++ beacon = rcu_dereference(ifibss->presp);
  5496. ++ if (!beacon)
  5497. + goto out;
  5498. - if (WARN_ON(!bss))
  5499. -@@ -54,21 +54,26 @@ void __cfg80211_ibss_joined(struct net_d
  5500. - #endif
  5501. - }
  5502. +- if (sdata->vif.csa_active) {
  5503. ++ if (beacon->csa_counter_offsets[0]) {
  5504. + if (!is_template)
  5505. + ieee80211_csa_update_counter(vif);
  5506. --void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, gfp_t gfp)
  5507. -+void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid,
  5508. -+ struct ieee80211_channel *channel, gfp_t gfp)
  5509. - {
  5510. - struct wireless_dev *wdev = dev->ieee80211_ptr;
  5511. - struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy);
  5512. - struct cfg80211_event *ev;
  5513. - unsigned long flags;
  5514. +- ieee80211_set_csa(sdata, presp);
  5515. ++ ieee80211_set_csa(sdata, beacon);
  5516. + }
  5517. -- trace_cfg80211_ibss_joined(dev, bssid);
  5518. -+ trace_cfg80211_ibss_joined(dev, bssid, channel);
  5519. -+
  5520. -+ if (WARN_ON(!channel))
  5521. -+ return;
  5522. +- skb = dev_alloc_skb(local->tx_headroom + presp->head_len +
  5523. ++ skb = dev_alloc_skb(local->tx_headroom + beacon->head_len +
  5524. + local->hw.extra_beacon_tailroom);
  5525. + if (!skb)
  5526. + goto out;
  5527. + skb_reserve(skb, local->tx_headroom);
  5528. +- memcpy(skb_put(skb, presp->head_len), presp->head,
  5529. +- presp->head_len);
  5530. ++ memcpy(skb_put(skb, beacon->head_len), beacon->head,
  5531. ++ beacon->head_len);
  5532. +
  5533. + hdr = (struct ieee80211_hdr *) skb->data;
  5534. + hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
  5535. + IEEE80211_STYPE_BEACON);
  5536. + } else if (ieee80211_vif_is_mesh(&sdata->vif)) {
  5537. + struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
  5538. +- struct beacon_data *bcn = rcu_dereference(ifmsh->beacon);
  5539. +
  5540. +- if (!bcn)
  5541. ++ beacon = rcu_dereference(ifmsh->beacon);
  5542. ++ if (!beacon)
  5543. + goto out;
  5544. - ev = kzalloc(sizeof(*ev), gfp);
  5545. - if (!ev)
  5546. - return;
  5547. +- if (sdata->vif.csa_active) {
  5548. ++ if (beacon->csa_counter_offsets[0]) {
  5549. + if (!is_template)
  5550. + /* TODO: For mesh csa_counter is in TU, so
  5551. + * decrementing it by one isn't correct, but
  5552. +@@ -2654,40 +2668,42 @@ __ieee80211_beacon_get(struct ieee80211_
  5553. + */
  5554. + ieee80211_csa_update_counter(vif);
  5555. - ev->type = EVENT_IBSS_JOINED;
  5556. -- memcpy(ev->cr.bssid, bssid, ETH_ALEN);
  5557. -+ memcpy(ev->ij.bssid, bssid, ETH_ALEN);
  5558. -+ ev->ij.channel = channel;
  5559. +- ieee80211_set_csa(sdata, bcn);
  5560. ++ ieee80211_set_csa(sdata, beacon);
  5561. + }
  5562. - spin_lock_irqsave(&wdev->event_lock, flags);
  5563. - list_add_tail(&ev->list, &wdev->event_list);
  5564. -@@ -117,6 +122,7 @@ int __cfg80211_join_ibss(struct cfg80211
  5565. + if (ifmsh->sync_ops)
  5566. +- ifmsh->sync_ops->adjust_tbtt(sdata, bcn);
  5567. ++ ifmsh->sync_ops->adjust_tbtt(sdata, beacon);
  5568. +
  5569. + skb = dev_alloc_skb(local->tx_headroom +
  5570. +- bcn->head_len +
  5571. ++ beacon->head_len +
  5572. + 256 + /* TIM IE */
  5573. +- bcn->tail_len +
  5574. ++ beacon->tail_len +
  5575. + local->hw.extra_beacon_tailroom);
  5576. + if (!skb)
  5577. + goto out;
  5578. + skb_reserve(skb, local->tx_headroom);
  5579. +- memcpy(skb_put(skb, bcn->head_len), bcn->head, bcn->head_len);
  5580. ++ memcpy(skb_put(skb, beacon->head_len), beacon->head,
  5581. ++ beacon->head_len);
  5582. + ieee80211_beacon_add_tim(sdata, &ifmsh->ps, skb, is_template);
  5583. +
  5584. + if (offs) {
  5585. +- offs->tim_offset = bcn->head_len;
  5586. +- offs->tim_length = skb->len - bcn->head_len;
  5587. ++ offs->tim_offset = beacon->head_len;
  5588. ++ offs->tim_length = skb->len - beacon->head_len;
  5589. + }
  5590. - wdev->ibss_fixed = params->channel_fixed;
  5591. - wdev->ibss_dfs_possible = params->userspace_handles_dfs;
  5592. -+ wdev->chandef = params->chandef;
  5593. - #ifdef CPTCFG_CFG80211_WEXT
  5594. - wdev->wext.ibss.chandef = params->chandef;
  5595. - #endif
  5596. -@@ -200,6 +206,7 @@ static void __cfg80211_clear_ibss(struct
  5597. -
  5598. - wdev->current_bss = NULL;
  5599. - wdev->ssid_len = 0;
  5600. -+ memset(&wdev->chandef, 0, sizeof(wdev->chandef));
  5601. - #ifdef CPTCFG_CFG80211_WEXT
  5602. - if (!nowext)
  5603. - wdev->wext.ibss.ssid_len = 0;
  5604. ---- a/net/wireless/trace.h
  5605. -+++ b/net/wireless/trace.h
  5606. -@@ -2278,11 +2278,6 @@ DECLARE_EVENT_CLASS(cfg80211_rx_evt,
  5607. - TP_printk(NETDEV_PR_FMT ", " MAC_PR_FMT, NETDEV_PR_ARG, MAC_PR_ARG(addr))
  5608. - );
  5609. +- memcpy(skb_put(skb, bcn->tail_len), bcn->tail, bcn->tail_len);
  5610. ++ memcpy(skb_put(skb, beacon->tail_len), beacon->tail,
  5611. ++ beacon->tail_len);
  5612. + } else {
  5613. + WARN_ON(1);
  5614. + goto out;
  5615. + }
  5616. --DEFINE_EVENT(cfg80211_rx_evt, cfg80211_ibss_joined,
  5617. -- TP_PROTO(struct net_device *netdev, const u8 *addr),
  5618. -- TP_ARGS(netdev, addr)
  5619. --);
  5620. --
  5621. - DEFINE_EVENT(cfg80211_rx_evt, cfg80211_rx_spurious_frame,
  5622. - TP_PROTO(struct net_device *netdev, const u8 *addr),
  5623. - TP_ARGS(netdev, addr)
  5624. -@@ -2293,6 +2288,24 @@ DEFINE_EVENT(cfg80211_rx_evt, cfg80211_r
  5625. - TP_ARGS(netdev, addr)
  5626. - );
  5627. + /* CSA offsets */
  5628. +- if (offs) {
  5629. ++ if (offs && beacon) {
  5630. + int i;
  5631. +
  5632. + for (i = 0; i < IEEE80211_MAX_CSA_COUNTERS_NUM; i++) {
  5633. +- u16 csa_off = sdata->csa_counter_offset_beacon[i];
  5634. ++ u16 csa_off = beacon->csa_counter_offsets[i];
  5635. +
  5636. + if (!csa_off)
  5637. + continue;
  5638. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  5639. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  5640. +@@ -947,6 +947,40 @@ static inline u8 rt2800_get_beacon_offse
  5641. + return BEACON_BASE_TO_OFFSET(rt2800_hw_beacon_base(rt2x00dev, index));
  5642. + }
  5643. -+TRACE_EVENT(cfg80211_ibss_joined,
  5644. -+ TP_PROTO(struct net_device *netdev, const u8 *bssid,
  5645. -+ struct ieee80211_channel *channel),
  5646. -+ TP_ARGS(netdev, bssid, channel),
  5647. -+ TP_STRUCT__entry(
  5648. -+ NETDEV_ENTRY
  5649. -+ MAC_ENTRY(bssid)
  5650. -+ CHAN_ENTRY
  5651. -+ ),
  5652. -+ TP_fast_assign(
  5653. -+ NETDEV_ASSIGN;
  5654. -+ MAC_ASSIGN(bssid, bssid);
  5655. -+ CHAN_ASSIGN(channel);
  5656. -+ ),
  5657. -+ TP_printk(NETDEV_PR_FMT ", bssid: " MAC_PR_FMT ", " CHAN_PR_FMT,
  5658. -+ NETDEV_PR_ARG, MAC_PR_ARG(bssid), CHAN_PR_ARG)
  5659. -+);
  5660. ++static void rt2800_update_beacons_setup(struct rt2x00_dev *rt2x00dev)
  5661. ++{
  5662. ++ struct data_queue *queue = rt2x00dev->bcn;
  5663. ++ struct queue_entry *entry;
  5664. ++ int i, bcn_num = 0;
  5665. ++ u64 off, reg = 0;
  5666. ++ u32 bssid_dw1;
  5667. +
  5668. - TRACE_EVENT(cfg80211_probe_status,
  5669. - TP_PROTO(struct net_device *netdev, const u8 *addr, u64 cookie,
  5670. - bool acked),
  5671. ---- a/net/wireless/util.c
  5672. -+++ b/net/wireless/util.c
  5673. -@@ -820,7 +820,8 @@ void cfg80211_process_wdev_events(struct
  5674. - ev->dc.reason, true);
  5675. - break;
  5676. - case EVENT_IBSS_JOINED:
  5677. -- __cfg80211_ibss_joined(wdev->netdev, ev->ij.bssid);
  5678. -+ __cfg80211_ibss_joined(wdev->netdev, ev->ij.bssid,
  5679. -+ ev->ij.channel);
  5680. - break;
  5681. - }
  5682. - wdev_unlock(wdev);
  5683. -@@ -1356,7 +1357,7 @@ int cfg80211_can_use_iftype_chan(struct
  5684. - */
  5685. - mutex_lock_nested(&wdev_iter->mtx, 1);
  5686. - __acquire(wdev_iter->mtx);
  5687. -- cfg80211_get_chan_state(wdev_iter, &ch, &chmode);
  5688. -+ cfg80211_get_chan_state(wdev_iter, &ch, &chmode, &radar_detect);
  5689. - wdev_unlock(wdev_iter);
  5690. -
  5691. - switch (chmode) {
  5692. ---- a/net/wireless/chan.c
  5693. -+++ b/net/wireless/chan.c
  5694. -@@ -642,7 +642,8 @@ int cfg80211_set_monitor_channel(struct
  5695. - void
  5696. - cfg80211_get_chan_state(struct wireless_dev *wdev,
  5697. - struct ieee80211_channel **chan,
  5698. -- enum cfg80211_chan_mode *chanmode)
  5699. -+ enum cfg80211_chan_mode *chanmode,
  5700. -+ u8 *radar_detect)
  5701. - {
  5702. - *chan = NULL;
  5703. - *chanmode = CHAN_MODE_UNDEFINED;
  5704. -@@ -660,6 +661,11 @@ cfg80211_get_chan_state(struct wireless_
  5705. - !wdev->ibss_dfs_possible)
  5706. - ? CHAN_MODE_SHARED
  5707. - : CHAN_MODE_EXCLUSIVE;
  5708. ++ /*
  5709. ++ * Setup offsets of all active beacons in BCN_OFFSET{0,1} registers.
  5710. ++ */
  5711. ++ for (i = 0; i < queue->limit; i++) {
  5712. ++ entry = &queue->entries[i];
  5713. ++ if (!test_bit(ENTRY_BCN_ENABLED, &entry->flags))
  5714. ++ continue;
  5715. ++ off = rt2800_get_beacon_offset(rt2x00dev, entry->entry_idx);
  5716. ++ reg |= off << (8 * bcn_num);
  5717. ++ bcn_num++;
  5718. ++ }
  5719. +
  5720. -+ /* consider worst-case - IBSS can try to return to the
  5721. -+ * original user-specified channel as creator */
  5722. -+ if (wdev->ibss_dfs_possible)
  5723. -+ *radar_detect |= BIT(wdev->chandef.width);
  5724. - return;
  5725. - }
  5726. - break;
  5727. -@@ -674,17 +680,26 @@ cfg80211_get_chan_state(struct wireless_
  5728. - case NL80211_IFTYPE_AP:
  5729. - case NL80211_IFTYPE_P2P_GO:
  5730. - if (wdev->cac_started) {
  5731. -- *chan = wdev->channel;
  5732. -+ *chan = wdev->chandef.chan;
  5733. - *chanmode = CHAN_MODE_SHARED;
  5734. -+ *radar_detect |= BIT(wdev->chandef.width);
  5735. - } else if (wdev->beacon_interval) {
  5736. -- *chan = wdev->channel;
  5737. -+ *chan = wdev->chandef.chan;
  5738. - *chanmode = CHAN_MODE_SHARED;
  5739. ++ WARN_ON_ONCE(bcn_num != rt2x00dev->intf_beaconing);
  5740. +
  5741. -+ if (cfg80211_chandef_dfs_required(wdev->wiphy,
  5742. -+ &wdev->chandef))
  5743. -+ *radar_detect |= BIT(wdev->chandef.width);
  5744. - }
  5745. - return;
  5746. - case NL80211_IFTYPE_MESH_POINT:
  5747. - if (wdev->mesh_id_len) {
  5748. -- *chan = wdev->channel;
  5749. -+ *chan = wdev->chandef.chan;
  5750. - *chanmode = CHAN_MODE_SHARED;
  5751. ++ rt2800_register_write(rt2x00dev, BCN_OFFSET0, (u32) reg);
  5752. ++ rt2800_register_write(rt2x00dev, BCN_OFFSET1, (u32) (reg >> 32));
  5753. ++
  5754. ++ /*
  5755. ++ * H/W sends up to MAC_BSSID_DW1_BSS_BCN_NUM + 1 consecutive beacons.
  5756. ++ */
  5757. ++ rt2800_register_read(rt2x00dev, MAC_BSSID_DW1, &bssid_dw1);
  5758. ++ rt2x00_set_field32(&bssid_dw1, MAC_BSSID_DW1_BSS_BCN_NUM,
  5759. ++ bcn_num > 0 ? bcn_num - 1 : 0);
  5760. ++ rt2800_register_write(rt2x00dev, MAC_BSSID_DW1, bssid_dw1);
  5761. ++}
  5762. ++
  5763. + void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc)
  5764. + {
  5765. + struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
  5766. +@@ -1003,6 +1037,12 @@ void rt2800_write_beacon(struct queue_en
  5767. +
  5768. + rt2800_register_multiwrite(rt2x00dev, beacon_base, entry->skb->data,
  5769. + entry->skb->len + padding_len);
  5770. ++ __set_bit(ENTRY_BCN_ENABLED, &entry->flags);
  5771. +
  5772. -+ if (cfg80211_chandef_dfs_required(wdev->wiphy,
  5773. -+ &wdev->chandef))
  5774. -+ *radar_detect |= BIT(wdev->chandef.width);
  5775. - }
  5776. - return;
  5777. - case NL80211_IFTYPE_MONITOR:
  5778. ---- a/net/wireless/mesh.c
  5779. -+++ b/net/wireless/mesh.c
  5780. -@@ -195,7 +195,7 @@ int __cfg80211_join_mesh(struct cfg80211
  5781. - if (!err) {
  5782. - memcpy(wdev->ssid, setup->mesh_id, setup->mesh_id_len);
  5783. - wdev->mesh_id_len = setup->mesh_id_len;
  5784. -- wdev->channel = setup->chandef.chan;
  5785. -+ wdev->chandef = setup->chandef;
  5786. - }
  5787. ++ /*
  5788. ++ * Change global beacons settings.
  5789. ++ */
  5790. ++ rt2800_update_beacons_setup(rt2x00dev);
  5791. - return err;
  5792. -@@ -244,7 +244,7 @@ int cfg80211_set_mesh_channel(struct cfg
  5793. - err = rdev_libertas_set_mesh_channel(rdev, wdev->netdev,
  5794. - chandef->chan);
  5795. - if (!err)
  5796. -- wdev->channel = chandef->chan;
  5797. -+ wdev->chandef = *chandef;
  5798. + /*
  5799. + * Restore beaconing state.
  5800. +@@ -1053,8 +1093,13 @@ void rt2800_clear_beacon(struct queue_en
  5801. + * Clear beacon.
  5802. + */
  5803. + rt2800_clear_beacon_register(rt2x00dev, entry->entry_idx);
  5804. ++ __clear_bit(ENTRY_BCN_ENABLED, &entry->flags);
  5805. - return err;
  5806. - }
  5807. -@@ -276,7 +276,7 @@ static int __cfg80211_leave_mesh(struct
  5808. - err = rdev_leave_mesh(rdev, dev);
  5809. - if (!err) {
  5810. - wdev->mesh_id_len = 0;
  5811. -- wdev->channel = NULL;
  5812. -+ memset(&wdev->chandef, 0, sizeof(wdev->chandef));
  5813. - rdev_set_qos_map(rdev, dev, NULL);
  5814. - }
  5815. + /*
  5816. ++ * Change global beacons settings.
  5817. ++ */
  5818. ++ rt2800_update_beacons_setup(rt2x00dev);
  5819. ++ /*
  5820. + * Restore beaconing state.
  5821. + */
  5822. + rt2800_register_write(rt2x00dev, BCN_TIME_CFG, orig_reg);
  5823. +@@ -1556,7 +1601,7 @@ void rt2800_config_intf(struct rt2x00_de
  5824. + if (!is_zero_ether_addr((const u8 *)conf->bssid)) {
  5825. + reg = le32_to_cpu(conf->bssid[1]);
  5826. + rt2x00_set_field32(&reg, MAC_BSSID_DW1_BSS_ID_MASK, 3);
  5827. +- rt2x00_set_field32(&reg, MAC_BSSID_DW1_BSS_BCN_NUM, 7);
  5828. ++ rt2x00_set_field32(&reg, MAC_BSSID_DW1_BSS_BCN_NUM, 0);
  5829. + conf->bssid[1] = cpu_to_le32(reg);
  5830. + }
  5831. ---- a/net/wireless/mlme.c
  5832. -+++ b/net/wireless/mlme.c
  5833. -@@ -772,7 +772,7 @@ void cfg80211_cac_event(struct net_devic
  5834. - if (WARN_ON(!wdev->cac_started))
  5835. - return;
  5836. +@@ -4517,28 +4562,6 @@ static int rt2800_init_registers(struct
  5837. + if (ret)
  5838. + return ret;
  5839. +
  5840. +- rt2800_register_read(rt2x00dev, BCN_OFFSET0, &reg);
  5841. +- rt2x00_set_field32(&reg, BCN_OFFSET0_BCN0,
  5842. +- rt2800_get_beacon_offset(rt2x00dev, 0));
  5843. +- rt2x00_set_field32(&reg, BCN_OFFSET0_BCN1,
  5844. +- rt2800_get_beacon_offset(rt2x00dev, 1));
  5845. +- rt2x00_set_field32(&reg, BCN_OFFSET0_BCN2,
  5846. +- rt2800_get_beacon_offset(rt2x00dev, 2));
  5847. +- rt2x00_set_field32(&reg, BCN_OFFSET0_BCN3,
  5848. +- rt2800_get_beacon_offset(rt2x00dev, 3));
  5849. +- rt2800_register_write(rt2x00dev, BCN_OFFSET0, reg);
  5850. +-
  5851. +- rt2800_register_read(rt2x00dev, BCN_OFFSET1, &reg);
  5852. +- rt2x00_set_field32(&reg, BCN_OFFSET1_BCN4,
  5853. +- rt2800_get_beacon_offset(rt2x00dev, 4));
  5854. +- rt2x00_set_field32(&reg, BCN_OFFSET1_BCN5,
  5855. +- rt2800_get_beacon_offset(rt2x00dev, 5));
  5856. +- rt2x00_set_field32(&reg, BCN_OFFSET1_BCN6,
  5857. +- rt2800_get_beacon_offset(rt2x00dev, 6));
  5858. +- rt2x00_set_field32(&reg, BCN_OFFSET1_BCN7,
  5859. +- rt2800_get_beacon_offset(rt2x00dev, 7));
  5860. +- rt2800_register_write(rt2x00dev, BCN_OFFSET1, reg);
  5861. +-
  5862. + rt2800_register_write(rt2x00dev, LEGACY_BASIC_RATE, 0x0000013f);
  5863. + rt2800_register_write(rt2x00dev, HT_BASIC_RATE, 0x00008003);
  5864. -- if (WARN_ON(!wdev->channel))
  5865. -+ if (WARN_ON(!wdev->chandef.chan))
  5866. +--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
  5867. ++++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
  5868. +@@ -141,8 +141,11 @@ static void rt2x00lib_intf_scheduled_ite
  5869. + if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
  5870. return;
  5871. - switch (event) {
  5872. ---- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
  5873. -+++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
  5874. -@@ -5065,6 +5065,10 @@ static u16 ar9003_hw_get_max_edge_power(
  5875. - break;
  5876. - }
  5877. - }
  5878. -+
  5879. -+ if (is2GHz && !twiceMaxEdgePower)
  5880. -+ twiceMaxEdgePower = 60;
  5881. -+
  5882. - return twiceMaxEdgePower;
  5883. +- if (test_and_clear_bit(DELAYED_UPDATE_BEACON, &intf->delayed_flags))
  5884. ++ if (test_and_clear_bit(DELAYED_UPDATE_BEACON, &intf->delayed_flags)) {
  5885. ++ mutex_lock(&intf->beacon_skb_mutex);
  5886. + rt2x00queue_update_beacon(rt2x00dev, vif);
  5887. ++ mutex_unlock(&intf->beacon_skb_mutex);
  5888. ++ }
  5889. }
  5890. ---- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c
  5891. -+++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
  5892. -@@ -23,10 +23,11 @@
  5893. - #define MAX_MEASUREMENT MAX_IQCAL_MEASUREMENT
  5894. - #define MAX_MAG_DELTA 11
  5895. - #define MAX_PHS_DELTA 10
  5896. -+#define MAXIQCAL 3
  5897. -
  5898. - struct coeff {
  5899. -- int mag_coeff[AR9300_MAX_CHAINS][MAX_MEASUREMENT];
  5900. -- int phs_coeff[AR9300_MAX_CHAINS][MAX_MEASUREMENT];
  5901. -+ int mag_coeff[AR9300_MAX_CHAINS][MAX_MEASUREMENT][MAXIQCAL];
  5902. -+ int phs_coeff[AR9300_MAX_CHAINS][MAX_MEASUREMENT][MAXIQCAL];
  5903. - int iqc_coeff[2];
  5904. - };
  5905. + static void rt2x00lib_intf_scheduled(struct work_struct *work)
  5906. +@@ -216,7 +219,7 @@ static void rt2x00lib_beaconupdate_iter(
  5907. + * never be called for USB devices.
  5908. + */
  5909. + WARN_ON(rt2x00_is_usb(rt2x00dev));
  5910. +- rt2x00queue_update_beacon_locked(rt2x00dev, vif);
  5911. ++ rt2x00queue_update_beacon(rt2x00dev, vif);
  5912. + }
  5913. -@@ -800,7 +801,7 @@ static bool ar9003_hw_calc_iq_corr(struc
  5914. - if (q_q_coff > 63)
  5915. - q_q_coff = 63;
  5916. + void rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev)
  5917. +--- a/drivers/net/wireless/rt2x00/rt2x00mac.c
  5918. ++++ b/drivers/net/wireless/rt2x00/rt2x00mac.c
  5919. +@@ -624,25 +624,24 @@ void rt2x00mac_bss_info_changed(struct i
  5920. + * Start/stop beaconing.
  5921. + */
  5922. + if (changes & BSS_CHANGED_BEACON_ENABLED) {
  5923. ++ mutex_lock(&intf->beacon_skb_mutex);
  5924. + if (!bss_conf->enable_beacon && intf->enable_beacon) {
  5925. + rt2x00dev->intf_beaconing--;
  5926. + intf->enable_beacon = false;
  5927. +- /*
  5928. +- * Clear beacon in the H/W for this vif. This is needed
  5929. +- * to disable beaconing on this particular interface
  5930. +- * and keep it running on other interfaces.
  5931. +- */
  5932. +- rt2x00queue_clear_beacon(rt2x00dev, vif);
  5933. -- iqc_coeff[0] = (q_q_coff * 128) + q_i_coff;
  5934. -+ iqc_coeff[0] = (q_q_coff * 128) + (0x7f & q_i_coff);
  5935. + if (rt2x00dev->intf_beaconing == 0) {
  5936. + /*
  5937. + * Last beaconing interface disabled
  5938. + * -> stop beacon queue.
  5939. + */
  5940. +- mutex_lock(&intf->beacon_skb_mutex);
  5941. + rt2x00queue_stop_queue(rt2x00dev->bcn);
  5942. +- mutex_unlock(&intf->beacon_skb_mutex);
  5943. + }
  5944. ++ /*
  5945. ++ * Clear beacon in the H/W for this vif. This is needed
  5946. ++ * to disable beaconing on this particular interface
  5947. ++ * and keep it running on other interfaces.
  5948. ++ */
  5949. ++ rt2x00queue_clear_beacon(rt2x00dev, vif);
  5950. + } else if (bss_conf->enable_beacon && !intf->enable_beacon) {
  5951. + rt2x00dev->intf_beaconing++;
  5952. + intf->enable_beacon = true;
  5953. +@@ -658,11 +657,10 @@ void rt2x00mac_bss_info_changed(struct i
  5954. + * First beaconing interface enabled
  5955. + * -> start beacon queue.
  5956. + */
  5957. +- mutex_lock(&intf->beacon_skb_mutex);
  5958. + rt2x00queue_start_queue(rt2x00dev->bcn);
  5959. +- mutex_unlock(&intf->beacon_skb_mutex);
  5960. + }
  5961. + }
  5962. ++ mutex_unlock(&intf->beacon_skb_mutex);
  5963. + }
  5964. - ath_dbg(common, CALIBRATE, "tx chain %d: iq corr coeff=%x\n",
  5965. - chain_idx, iqc_coeff[0]);
  5966. -@@ -831,7 +832,7 @@ static bool ar9003_hw_calc_iq_corr(struc
  5967. - if (q_q_coff > 63)
  5968. - q_q_coff = 63;
  5969. + /*
  5970. +--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
  5971. ++++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
  5972. +@@ -754,8 +754,6 @@ int rt2x00queue_clear_beacon(struct rt2x
  5973. + if (unlikely(!intf->beacon))
  5974. + return -ENOBUFS;
  5975. -- iqc_coeff[1] = (q_q_coff * 128) + q_i_coff;
  5976. -+ iqc_coeff[1] = (q_q_coff * 128) + (0x7f & q_i_coff);
  5977. +- mutex_lock(&intf->beacon_skb_mutex);
  5978. +-
  5979. + /*
  5980. + * Clean up the beacon skb.
  5981. + */
  5982. +@@ -768,13 +766,11 @@ int rt2x00queue_clear_beacon(struct rt2x
  5983. + if (rt2x00dev->ops->lib->clear_beacon)
  5984. + rt2x00dev->ops->lib->clear_beacon(intf->beacon);
  5985. - ath_dbg(common, CALIBRATE, "rx chain %d: iq corr coeff=%x\n",
  5986. - chain_idx, iqc_coeff[1]);
  5987. -@@ -839,7 +840,8 @@ static bool ar9003_hw_calc_iq_corr(struc
  5988. - return true;
  5989. +- mutex_unlock(&intf->beacon_skb_mutex);
  5990. +-
  5991. + return 0;
  5992. }
  5993. --static void ar9003_hw_detect_outlier(int *mp_coeff, int nmeasurement,
  5994. -+static void ar9003_hw_detect_outlier(int mp_coeff[][MAXIQCAL],
  5995. -+ int nmeasurement,
  5996. - int max_delta)
  5997. +-int rt2x00queue_update_beacon_locked(struct rt2x00_dev *rt2x00dev,
  5998. +- struct ieee80211_vif *vif)
  5999. ++int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev,
  6000. ++ struct ieee80211_vif *vif)
  6001. {
  6002. - int mp_max = -64, max_idx = 0;
  6003. -@@ -848,20 +850,20 @@ static void ar9003_hw_detect_outlier(int
  6004. -
  6005. - /* find min/max mismatch across all calibrated gains */
  6006. - for (i = 0; i < nmeasurement; i++) {
  6007. -- if (mp_coeff[i] > mp_max) {
  6008. -- mp_max = mp_coeff[i];
  6009. -+ if (mp_coeff[i][0] > mp_max) {
  6010. -+ mp_max = mp_coeff[i][0];
  6011. - max_idx = i;
  6012. -- } else if (mp_coeff[i] < mp_min) {
  6013. -- mp_min = mp_coeff[i];
  6014. -+ } else if (mp_coeff[i][0] < mp_min) {
  6015. -+ mp_min = mp_coeff[i][0];
  6016. - min_idx = i;
  6017. - }
  6018. - }
  6019. + struct rt2x00_intf *intf = vif_to_intf(vif);
  6020. + struct skb_frame_desc *skbdesc;
  6021. +@@ -815,19 +811,6 @@ int rt2x00queue_update_beacon_locked(str
  6022. - /* find average (exclude max abs value) */
  6023. - for (i = 0; i < nmeasurement; i++) {
  6024. -- if ((abs(mp_coeff[i]) < abs(mp_max)) ||
  6025. -- (abs(mp_coeff[i]) < abs(mp_min))) {
  6026. -- mp_avg += mp_coeff[i];
  6027. -+ if ((abs(mp_coeff[i][0]) < abs(mp_max)) ||
  6028. -+ (abs(mp_coeff[i][0]) < abs(mp_min))) {
  6029. -+ mp_avg += mp_coeff[i][0];
  6030. - mp_count++;
  6031. - }
  6032. - }
  6033. -@@ -873,7 +875,7 @@ static void ar9003_hw_detect_outlier(int
  6034. - if (mp_count)
  6035. - mp_avg /= mp_count;
  6036. - else
  6037. -- mp_avg = mp_coeff[nmeasurement - 1];
  6038. -+ mp_avg = mp_coeff[nmeasurement - 1][0];
  6039. -
  6040. - /* detect outlier */
  6041. - if (abs(mp_max - mp_min) > max_delta) {
  6042. -@@ -882,15 +884,16 @@ static void ar9003_hw_detect_outlier(int
  6043. - else
  6044. - outlier_idx = min_idx;
  6045. -
  6046. -- mp_coeff[outlier_idx] = mp_avg;
  6047. -+ mp_coeff[outlier_idx][0] = mp_avg;
  6048. - }
  6049. }
  6050. --static void ar9003_hw_tx_iqcal_load_avg_2_passes(struct ath_hw *ah,
  6051. -- struct coeff *coeff,
  6052. -- bool is_reusable)
  6053. -+static void ar9003_hw_tx_iq_cal_outlier_detection(struct ath_hw *ah,
  6054. -+ struct coeff *coeff,
  6055. -+ bool is_reusable)
  6056. - {
  6057. - int i, im, nmeasurement;
  6058. -+ int magnitude, phase;
  6059. - u32 tx_corr_coeff[MAX_MEASUREMENT][AR9300_MAX_CHAINS];
  6060. - struct ath9k_hw_cal_data *caldata = ah->caldata;
  6061. -
  6062. -@@ -920,21 +923,30 @@ static void ar9003_hw_tx_iqcal_load_avg_
  6063. - if (nmeasurement > MAX_MEASUREMENT)
  6064. - nmeasurement = MAX_MEASUREMENT;
  6065. -
  6066. -- /* detect outlier only if nmeasurement > 1 */
  6067. -- if (nmeasurement > 1) {
  6068. -- /* Detect magnitude outlier */
  6069. -- ar9003_hw_detect_outlier(coeff->mag_coeff[i],
  6070. -- nmeasurement, MAX_MAG_DELTA);
  6071. +-int rt2x00queue_update_beacon(struct rt2x00_dev *rt2x00dev,
  6072. +- struct ieee80211_vif *vif)
  6073. +-{
  6074. +- struct rt2x00_intf *intf = vif_to_intf(vif);
  6075. +- int ret;
  6076. -
  6077. -- /* Detect phase outlier */
  6078. -- ar9003_hw_detect_outlier(coeff->phs_coeff[i],
  6079. -- nmeasurement, MAX_PHS_DELTA);
  6080. -+ /*
  6081. -+ * Skip normal outlier detection for AR9550.
  6082. -+ */
  6083. -+ if (!AR_SREV_9550(ah)) {
  6084. -+ /* detect outlier only if nmeasurement > 1 */
  6085. -+ if (nmeasurement > 1) {
  6086. -+ /* Detect magnitude outlier */
  6087. -+ ar9003_hw_detect_outlier(coeff->mag_coeff[i],
  6088. -+ nmeasurement,
  6089. -+ MAX_MAG_DELTA);
  6090. -+
  6091. -+ /* Detect phase outlier */
  6092. -+ ar9003_hw_detect_outlier(coeff->phs_coeff[i],
  6093. -+ nmeasurement,
  6094. -+ MAX_PHS_DELTA);
  6095. -+ }
  6096. - }
  6097. -
  6098. - for (im = 0; im < nmeasurement; im++) {
  6099. -+ magnitude = coeff->mag_coeff[i][im][0];
  6100. -+ phase = coeff->phs_coeff[i][im][0];
  6101. +- mutex_lock(&intf->beacon_skb_mutex);
  6102. +- ret = rt2x00queue_update_beacon_locked(rt2x00dev, vif);
  6103. +- mutex_unlock(&intf->beacon_skb_mutex);
  6104. +-
  6105. +- return ret;
  6106. +-}
  6107. +-
  6108. + bool rt2x00queue_for_each_entry(struct data_queue *queue,
  6109. + enum queue_index start,
  6110. + enum queue_index end,
  6111. +--- a/drivers/net/wireless/rt2x00/rt2x00queue.h
  6112. ++++ b/drivers/net/wireless/rt2x00/rt2x00queue.h
  6113. +@@ -353,6 +353,7 @@ struct txentry_desc {
  6114. + */
  6115. + enum queue_entry_flags {
  6116. + ENTRY_BCN_ASSIGNED,
  6117. ++ ENTRY_BCN_ENABLED,
  6118. + ENTRY_OWNER_DEVICE_DATA,
  6119. + ENTRY_DATA_PENDING,
  6120. + ENTRY_DATA_IO_FAILED,
  6121. +--- a/drivers/net/wireless/ath/ath9k/main.c
  6122. ++++ b/drivers/net/wireless/ath/ath9k/main.c
  6123. +@@ -1757,7 +1757,6 @@ out:
  6124. + void ath9k_update_p2p_ps(struct ath_softc *sc, struct ieee80211_vif *vif)
  6125. + {
  6126. + struct ath_vif *avp = (void *)vif->drv_priv;
  6127. +- unsigned long flags;
  6128. + u32 tsf;
  6129. -- coeff->iqc_coeff[0] = (coeff->mag_coeff[i][im] & 0x7f) |
  6130. -- ((coeff->phs_coeff[i][im] & 0x7f) << 7);
  6131. -+ coeff->iqc_coeff[0] =
  6132. -+ (phase & 0x7f) | ((magnitude & 0x7f) << 7);
  6133. + if (!sc->p2p_ps_timer)
  6134. +@@ -1767,14 +1766,9 @@ void ath9k_update_p2p_ps(struct ath_soft
  6135. + return;
  6136. - if ((im % 2) == 0)
  6137. - REG_RMW_FIELD(ah, tx_corr_coeff[im][i],
  6138. -@@ -991,7 +1003,63 @@ static bool ar9003_hw_tx_iq_cal_run(stru
  6139. - return true;
  6140. + sc->p2p_ps_vif = avp;
  6141. +-
  6142. +- spin_lock_irqsave(&sc->sc_pm_lock, flags);
  6143. +- if (!(sc->ps_flags & PS_BEACON_SYNC)) {
  6144. +- tsf = ath9k_hw_gettsf32(sc->sc_ah);
  6145. +- ieee80211_parse_p2p_noa(&vif->bss_conf.p2p_noa_attr, &avp->noa, tsf);
  6146. +- ath9k_update_p2p_ps_timer(sc, avp);
  6147. +- }
  6148. +- spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
  6149. ++ tsf = ath9k_hw_gettsf32(sc->sc_ah);
  6150. ++ ieee80211_parse_p2p_noa(&vif->bss_conf.p2p_noa_attr, &avp->noa, tsf);
  6151. ++ ath9k_update_p2p_ps_timer(sc, avp);
  6152. }
  6153. --static void ar9003_hw_tx_iq_cal_post_proc(struct ath_hw *ah, bool is_reusable)
  6154. -+static void __ar955x_tx_iq_cal_sort(struct ath_hw *ah,
  6155. -+ struct coeff *coeff,
  6156. -+ int i, int nmeasurement)
  6157. -+{
  6158. -+ struct ath_common *common = ath9k_hw_common(ah);
  6159. -+ int im, ix, iy, temp;
  6160. -+
  6161. -+ for (im = 0; im < nmeasurement; im++) {
  6162. -+ for (ix = 0; ix < MAXIQCAL - 1; ix++) {
  6163. -+ for (iy = ix + 1; iy <= MAXIQCAL - 1; iy++) {
  6164. -+ if (coeff->mag_coeff[i][im][iy] <
  6165. -+ coeff->mag_coeff[i][im][ix]) {
  6166. -+ temp = coeff->mag_coeff[i][im][ix];
  6167. -+ coeff->mag_coeff[i][im][ix] =
  6168. -+ coeff->mag_coeff[i][im][iy];
  6169. -+ coeff->mag_coeff[i][im][iy] = temp;
  6170. -+ }
  6171. -+ if (coeff->phs_coeff[i][im][iy] <
  6172. -+ coeff->phs_coeff[i][im][ix]) {
  6173. -+ temp = coeff->phs_coeff[i][im][ix];
  6174. -+ coeff->phs_coeff[i][im][ix] =
  6175. -+ coeff->phs_coeff[i][im][iy];
  6176. -+ coeff->phs_coeff[i][im][iy] = temp;
  6177. -+ }
  6178. -+ }
  6179. -+ }
  6180. -+ coeff->mag_coeff[i][im][0] = coeff->mag_coeff[i][im][MAXIQCAL / 2];
  6181. -+ coeff->phs_coeff[i][im][0] = coeff->phs_coeff[i][im][MAXIQCAL / 2];
  6182. -+
  6183. -+ ath_dbg(common, CALIBRATE,
  6184. -+ "IQCAL: Median [ch%d][gain%d]: mag = %d phase = %d\n",
  6185. -+ i, im,
  6186. -+ coeff->mag_coeff[i][im][0],
  6187. -+ coeff->phs_coeff[i][im][0]);
  6188. -+ }
  6189. -+}
  6190. -+
  6191. -+static bool ar955x_tx_iq_cal_median(struct ath_hw *ah,
  6192. -+ struct coeff *coeff,
  6193. -+ int iqcal_idx,
  6194. -+ int nmeasurement)
  6195. -+{
  6196. -+ int i;
  6197. -+
  6198. -+ if ((iqcal_idx + 1) != MAXIQCAL)
  6199. -+ return false;
  6200. -+
  6201. -+ for (i = 0; i < AR9300_MAX_CHAINS; i++) {
  6202. -+ __ar955x_tx_iq_cal_sort(ah, coeff, i, nmeasurement);
  6203. -+ }
  6204. -+
  6205. -+ return true;
  6206. -+}
  6207. -+
  6208. -+static void ar9003_hw_tx_iq_cal_post_proc(struct ath_hw *ah,
  6209. -+ int iqcal_idx,
  6210. -+ bool is_reusable)
  6211. - {
  6212. + static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
  6213. +@@ -1791,6 +1785,7 @@ static void ath9k_bss_info_changed(struc
  6214. + struct ath_hw *ah = sc->sc_ah;
  6215. struct ath_common *common = ath9k_hw_common(ah);
  6216. - const u32 txiqcal_status[AR9300_MAX_CHAINS] = {
  6217. -@@ -1004,10 +1072,11 @@ static void ar9003_hw_tx_iq_cal_post_pro
  6218. - AR_PHY_CHAN_INFO_TAB_1,
  6219. - AR_PHY_CHAN_INFO_TAB_2,
  6220. - };
  6221. -- struct coeff coeff;
  6222. -+ static struct coeff coeff;
  6223. - s32 iq_res[6];
  6224. - int i, im, j;
  6225. -- int nmeasurement;
  6226. -+ int nmeasurement = 0;
  6227. -+ bool outlier_detect = true;
  6228. -
  6229. - for (i = 0; i < AR9300_MAX_CHAINS; i++) {
  6230. - if (!(ah->txchainmask & (1 << i)))
  6231. -@@ -1065,17 +1134,23 @@ static void ar9003_hw_tx_iq_cal_post_pro
  6232. - goto tx_iqcal_fail;
  6233. - }
  6234. -
  6235. -- coeff.mag_coeff[i][im] = coeff.iqc_coeff[0] & 0x7f;
  6236. -- coeff.phs_coeff[i][im] =
  6237. -+ coeff.phs_coeff[i][im][iqcal_idx] =
  6238. -+ coeff.iqc_coeff[0] & 0x7f;
  6239. -+ coeff.mag_coeff[i][im][iqcal_idx] =
  6240. - (coeff.iqc_coeff[0] >> 7) & 0x7f;
  6241. -
  6242. -- if (coeff.mag_coeff[i][im] > 63)
  6243. -- coeff.mag_coeff[i][im] -= 128;
  6244. -- if (coeff.phs_coeff[i][im] > 63)
  6245. -- coeff.phs_coeff[i][im] -= 128;
  6246. -+ if (coeff.mag_coeff[i][im][iqcal_idx] > 63)
  6247. -+ coeff.mag_coeff[i][im][iqcal_idx] -= 128;
  6248. -+ if (coeff.phs_coeff[i][im][iqcal_idx] > 63)
  6249. -+ coeff.phs_coeff[i][im][iqcal_idx] -= 128;
  6250. - }
  6251. + struct ath_vif *avp = (void *)vif->drv_priv;
  6252. ++ unsigned long flags;
  6253. + int slottime;
  6254. +
  6255. + ath9k_ps_wakeup(sc);
  6256. +@@ -1853,7 +1848,10 @@ static void ath9k_bss_info_changed(struc
  6257. +
  6258. + if (changed & BSS_CHANGED_P2P_PS) {
  6259. + spin_lock_bh(&sc->sc_pcu_lock);
  6260. +- ath9k_update_p2p_ps(sc, vif);
  6261. ++ spin_lock_irqsave(&sc->sc_pm_lock, flags);
  6262. ++ if (!(sc->ps_flags & PS_BEACON_SYNC))
  6263. ++ ath9k_update_p2p_ps(sc, vif);
  6264. ++ spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
  6265. + spin_unlock_bh(&sc->sc_pcu_lock);
  6266. }
  6267. -- ar9003_hw_tx_iqcal_load_avg_2_passes(ah, &coeff, is_reusable);
  6268. -+
  6269. -+ if (AR_SREV_9550(ah))
  6270. -+ outlier_detect = ar955x_tx_iq_cal_median(ah, &coeff,
  6271. -+ iqcal_idx, nmeasurement);
  6272. -+ if (outlier_detect)
  6273. -+ ar9003_hw_tx_iq_cal_outlier_detection(ah, &coeff, is_reusable);
  6274. -
  6275. - return;
  6276. -@@ -1409,7 +1484,7 @@ skip_tx_iqcal:
  6277. - }
  6278. +@@ -2232,14 +2230,6 @@ static void ath9k_sw_scan_complete(struc
  6279. + clear_bit(ATH_OP_SCANNING, &common->op_flags);
  6280. + }
  6281. - if (txiqcal_done)
  6282. -- ar9003_hw_tx_iq_cal_post_proc(ah, is_reusable);
  6283. -+ ar9003_hw_tx_iq_cal_post_proc(ah, 0, is_reusable);
  6284. - else if (caldata && test_bit(TXIQCAL_DONE, &caldata->cal_flags))
  6285. - ar9003_hw_tx_iq_cal_reload(ah);
  6286. +-static void ath9k_channel_switch_beacon(struct ieee80211_hw *hw,
  6287. +- struct ieee80211_vif *vif,
  6288. +- struct cfg80211_chan_def *chandef)
  6289. +-{
  6290. +- /* depend on vif->csa_active only */
  6291. +- return;
  6292. +-}
  6293. +-
  6294. + struct ieee80211_ops ath9k_ops = {
  6295. + .tx = ath9k_tx,
  6296. + .start = ath9k_start,
  6297. +@@ -2287,5 +2277,4 @@ struct ieee80211_ops ath9k_ops = {
  6298. + #endif
  6299. + .sw_scan_start = ath9k_sw_scan_start,
  6300. + .sw_scan_complete = ath9k_sw_scan_complete,
  6301. +- .channel_switch_beacon = ath9k_channel_switch_beacon,
  6302. + };
  6303. +--- a/drivers/net/wireless/ath/ath10k/mac.c
  6304. ++++ b/drivers/net/wireless/ath/ath10k/mac.c
  6305. +@@ -4142,14 +4142,6 @@ static int ath10k_set_bitrate_mask(struc
  6306. + fixed_nss, force_sgi);
  6307. + }
  6308. -@@ -1455,14 +1530,38 @@ skip_tx_iqcal:
  6309. - return true;
  6310. +-static void ath10k_channel_switch_beacon(struct ieee80211_hw *hw,
  6311. +- struct ieee80211_vif *vif,
  6312. +- struct cfg80211_chan_def *chandef)
  6313. +-{
  6314. +- /* there's no need to do anything here. vif->csa_active is enough */
  6315. +- return;
  6316. +-}
  6317. +-
  6318. + static void ath10k_sta_rc_update(struct ieee80211_hw *hw,
  6319. + struct ieee80211_vif *vif,
  6320. + struct ieee80211_sta *sta,
  6321. +@@ -4256,7 +4248,6 @@ static const struct ieee80211_ops ath10k
  6322. + .restart_complete = ath10k_restart_complete,
  6323. + .get_survey = ath10k_get_survey,
  6324. + .set_bitrate_mask = ath10k_set_bitrate_mask,
  6325. +- .channel_switch_beacon = ath10k_channel_switch_beacon,
  6326. + .sta_rc_update = ath10k_sta_rc_update,
  6327. + .get_tsf = ath10k_get_tsf,
  6328. + #ifdef CONFIG_PM
  6329. +--- a/net/mac80211/cfg.c
  6330. ++++ b/net/mac80211/cfg.c
  6331. +@@ -468,327 +468,6 @@ void sta_set_rate_info_rx(struct sta_inf
  6332. + rinfo->flags |= RATE_INFO_FLAGS_160_MHZ_WIDTH;
  6333. }
  6334. -+static bool do_ar9003_agc_cal(struct ath_hw *ah)
  6335. -+{
  6336. -+ struct ath_common *common = ath9k_hw_common(ah);
  6337. -+ bool status;
  6338. -+
  6339. -+ REG_WRITE(ah, AR_PHY_AGC_CONTROL,
  6340. -+ REG_READ(ah, AR_PHY_AGC_CONTROL) |
  6341. -+ AR_PHY_AGC_CONTROL_CAL);
  6342. -+
  6343. -+ status = ath9k_hw_wait(ah, AR_PHY_AGC_CONTROL,
  6344. -+ AR_PHY_AGC_CONTROL_CAL,
  6345. -+ 0, AH_WAIT_TIMEOUT);
  6346. -+ if (!status) {
  6347. -+ ath_dbg(common, CALIBRATE,
  6348. -+ "offset calibration failed to complete in %d ms,"
  6349. -+ "noisy environment?\n",
  6350. -+ AH_WAIT_TIMEOUT / 1000);
  6351. -+ return false;
  6352. -+ }
  6353. -+
  6354. -+ return true;
  6355. -+}
  6356. -+
  6357. - static bool ar9003_hw_init_cal_soc(struct ath_hw *ah,
  6358. - struct ath9k_channel *chan)
  6359. - {
  6360. - struct ath_common *common = ath9k_hw_common(ah);
  6361. - struct ath9k_hw_cal_data *caldata = ah->caldata;
  6362. - bool txiqcal_done = false;
  6363. -- bool is_reusable = true, status = true;
  6364. -+ bool status = true;
  6365. - bool run_agc_cal = false, sep_iq_cal = false;
  6366. -+ int i = 0;
  6367. -
  6368. - /* Use chip chainmask only for calibration */
  6369. - ar9003_hw_set_chain_masks(ah, ah->caps.rx_chainmask, ah->caps.tx_chainmask);
  6370. -@@ -1485,7 +1584,12 @@ static bool ar9003_hw_init_cal_soc(struc
  6371. - * AGC calibration. Specifically, AR9550 in SoC chips.
  6372. - */
  6373. - if (ah->enabled_cals & TX_IQ_ON_AGC_CAL) {
  6374. -- txiqcal_done = true;
  6375. -+ if (REG_READ_FIELD(ah, AR_PHY_TX_IQCAL_CONTROL_0,
  6376. -+ AR_PHY_TX_IQCAL_CONTROL_0_ENABLE_TXIQ_CAL)) {
  6377. -+ txiqcal_done = true;
  6378. -+ } else {
  6379. -+ txiqcal_done = false;
  6380. -+ }
  6381. - run_agc_cal = true;
  6382. - } else {
  6383. - sep_iq_cal = true;
  6384. -@@ -1512,27 +1616,37 @@ skip_tx_iqcal:
  6385. - if (AR_SREV_9330_11(ah))
  6386. - ar9003_hw_manual_peak_cal(ah, 0, IS_CHAN_2GHZ(chan));
  6387. -
  6388. -- /* Calibrate the AGC */
  6389. -- REG_WRITE(ah, AR_PHY_AGC_CONTROL,
  6390. -- REG_READ(ah, AR_PHY_AGC_CONTROL) |
  6391. -- AR_PHY_AGC_CONTROL_CAL);
  6392. +-static void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo)
  6393. +-{
  6394. +- struct ieee80211_sub_if_data *sdata = sta->sdata;
  6395. +- struct ieee80211_local *local = sdata->local;
  6396. +- struct rate_control_ref *ref = local->rate_ctrl;
  6397. +- struct timespec uptime;
  6398. +- u64 packets = 0;
  6399. +- u32 thr = 0;
  6400. +- int i, ac;
  6401. +-
  6402. +- sinfo->generation = sdata->local->sta_generation;
  6403. +-
  6404. +- sinfo->filled = STATION_INFO_INACTIVE_TIME |
  6405. +- STATION_INFO_RX_BYTES64 |
  6406. +- STATION_INFO_TX_BYTES64 |
  6407. +- STATION_INFO_RX_PACKETS |
  6408. +- STATION_INFO_TX_PACKETS |
  6409. +- STATION_INFO_TX_RETRIES |
  6410. +- STATION_INFO_TX_FAILED |
  6411. +- STATION_INFO_TX_BITRATE |
  6412. +- STATION_INFO_RX_BITRATE |
  6413. +- STATION_INFO_RX_DROP_MISC |
  6414. +- STATION_INFO_BSS_PARAM |
  6415. +- STATION_INFO_CONNECTED_TIME |
  6416. +- STATION_INFO_STA_FLAGS |
  6417. +- STATION_INFO_BEACON_LOSS_COUNT;
  6418. -
  6419. -- /* Poll for offset calibration complete */
  6420. -- status = ath9k_hw_wait(ah, AR_PHY_AGC_CONTROL,
  6421. -- AR_PHY_AGC_CONTROL_CAL,
  6422. -- 0, AH_WAIT_TIMEOUT);
  6423. +- do_posix_clock_monotonic_gettime(&uptime);
  6424. +- sinfo->connected_time = uptime.tv_sec - sta->last_connected;
  6425. +-
  6426. +- sinfo->inactive_time = jiffies_to_msecs(jiffies - sta->last_rx);
  6427. +- sinfo->tx_bytes = 0;
  6428. +- for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
  6429. +- sinfo->tx_bytes += sta->tx_bytes[ac];
  6430. +- packets += sta->tx_packets[ac];
  6431. - }
  6432. -+ /*
  6433. -+ * For non-AR9550 chips, we just trigger AGC calibration
  6434. -+ * in the HW, poll for completion and then process
  6435. -+ * the results.
  6436. -+ *
  6437. -+ * For AR955x, we run it multiple times and use
  6438. -+ * median IQ correction.
  6439. -+ */
  6440. -+ if (!AR_SREV_9550(ah)) {
  6441. -+ status = do_ar9003_agc_cal(ah);
  6442. -+ if (!status)
  6443. -+ return false;
  6444. -
  6445. -- if (!status) {
  6446. -- ath_dbg(common, CALIBRATE,
  6447. -- "offset calibration failed to complete in %d ms; noisy environment?\n",
  6448. -- AH_WAIT_TIMEOUT / 1000);
  6449. -- return false;
  6450. -+ if (txiqcal_done)
  6451. -+ ar9003_hw_tx_iq_cal_post_proc(ah, 0, false);
  6452. -+ } else {
  6453. -+ if (!txiqcal_done) {
  6454. -+ status = do_ar9003_agc_cal(ah);
  6455. -+ if (!status)
  6456. -+ return false;
  6457. -+ } else {
  6458. -+ for (i = 0; i < MAXIQCAL; i++) {
  6459. -+ status = do_ar9003_agc_cal(ah);
  6460. -+ if (!status)
  6461. -+ return false;
  6462. -+ ar9003_hw_tx_iq_cal_post_proc(ah, i, false);
  6463. -+ }
  6464. -+ }
  6465. -+ }
  6466. - }
  6467. -
  6468. -- if (txiqcal_done)
  6469. -- ar9003_hw_tx_iq_cal_post_proc(ah, is_reusable);
  6470. +- sinfo->tx_packets = packets;
  6471. +- sinfo->rx_bytes = sta->rx_bytes;
  6472. +- sinfo->rx_packets = sta->rx_packets;
  6473. +- sinfo->tx_retries = sta->tx_retry_count;
  6474. +- sinfo->tx_failed = sta->tx_retry_failed;
  6475. +- sinfo->rx_dropped_misc = sta->rx_dropped;
  6476. +- sinfo->beacon_loss_count = sta->beacon_loss_count;
  6477. +-
  6478. +- if ((sta->local->hw.flags & IEEE80211_HW_SIGNAL_DBM) ||
  6479. +- (sta->local->hw.flags & IEEE80211_HW_SIGNAL_UNSPEC)) {
  6480. +- sinfo->filled |= STATION_INFO_SIGNAL | STATION_INFO_SIGNAL_AVG;
  6481. +- if (!local->ops->get_rssi ||
  6482. +- drv_get_rssi(local, sdata, &sta->sta, &sinfo->signal))
  6483. +- sinfo->signal = (s8)sta->last_signal;
  6484. +- sinfo->signal_avg = (s8) -ewma_read(&sta->avg_signal);
  6485. +- }
  6486. +- if (sta->chains) {
  6487. +- sinfo->filled |= STATION_INFO_CHAIN_SIGNAL |
  6488. +- STATION_INFO_CHAIN_SIGNAL_AVG;
  6489. +-
  6490. +- sinfo->chains = sta->chains;
  6491. +- for (i = 0; i < ARRAY_SIZE(sinfo->chain_signal); i++) {
  6492. +- sinfo->chain_signal[i] = sta->chain_signal_last[i];
  6493. +- sinfo->chain_signal_avg[i] =
  6494. +- (s8) -ewma_read(&sta->chain_signal_avg[i]);
  6495. +- }
  6496. +- }
  6497. +-
  6498. +- sta_set_rate_info_tx(sta, &sta->last_tx_rate, &sinfo->txrate);
  6499. +- sta_set_rate_info_rx(sta, &sinfo->rxrate);
  6500. +-
  6501. +- if (ieee80211_vif_is_mesh(&sdata->vif)) {
  6502. +-#ifdef CPTCFG_MAC80211_MESH
  6503. +- sinfo->filled |= STATION_INFO_LLID |
  6504. +- STATION_INFO_PLID |
  6505. +- STATION_INFO_PLINK_STATE |
  6506. +- STATION_INFO_LOCAL_PM |
  6507. +- STATION_INFO_PEER_PM |
  6508. +- STATION_INFO_NONPEER_PM;
  6509. +-
  6510. +- sinfo->llid = sta->llid;
  6511. +- sinfo->plid = sta->plid;
  6512. +- sinfo->plink_state = sta->plink_state;
  6513. +- if (test_sta_flag(sta, WLAN_STA_TOFFSET_KNOWN)) {
  6514. +- sinfo->filled |= STATION_INFO_T_OFFSET;
  6515. +- sinfo->t_offset = sta->t_offset;
  6516. +- }
  6517. +- sinfo->local_pm = sta->local_pm;
  6518. +- sinfo->peer_pm = sta->peer_pm;
  6519. +- sinfo->nonpeer_pm = sta->nonpeer_pm;
  6520. +-#endif
  6521. +- }
  6522. +-
  6523. +- sinfo->bss_param.flags = 0;
  6524. +- if (sdata->vif.bss_conf.use_cts_prot)
  6525. +- sinfo->bss_param.flags |= BSS_PARAM_FLAGS_CTS_PROT;
  6526. +- if (sdata->vif.bss_conf.use_short_preamble)
  6527. +- sinfo->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_PREAMBLE;
  6528. +- if (sdata->vif.bss_conf.use_short_slot)
  6529. +- sinfo->bss_param.flags |= BSS_PARAM_FLAGS_SHORT_SLOT_TIME;
  6530. +- sinfo->bss_param.dtim_period = sdata->local->hw.conf.ps_dtim_period;
  6531. +- sinfo->bss_param.beacon_interval = sdata->vif.bss_conf.beacon_int;
  6532. +-
  6533. +- sinfo->sta_flags.set = 0;
  6534. +- sinfo->sta_flags.mask = BIT(NL80211_STA_FLAG_AUTHORIZED) |
  6535. +- BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) |
  6536. +- BIT(NL80211_STA_FLAG_WME) |
  6537. +- BIT(NL80211_STA_FLAG_MFP) |
  6538. +- BIT(NL80211_STA_FLAG_AUTHENTICATED) |
  6539. +- BIT(NL80211_STA_FLAG_ASSOCIATED) |
  6540. +- BIT(NL80211_STA_FLAG_TDLS_PEER);
  6541. +- if (test_sta_flag(sta, WLAN_STA_AUTHORIZED))
  6542. +- sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_AUTHORIZED);
  6543. +- if (test_sta_flag(sta, WLAN_STA_SHORT_PREAMBLE))
  6544. +- sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_SHORT_PREAMBLE);
  6545. +- if (test_sta_flag(sta, WLAN_STA_WME))
  6546. +- sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_WME);
  6547. +- if (test_sta_flag(sta, WLAN_STA_MFP))
  6548. +- sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_MFP);
  6549. +- if (test_sta_flag(sta, WLAN_STA_AUTH))
  6550. +- sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_AUTHENTICATED);
  6551. +- if (test_sta_flag(sta, WLAN_STA_ASSOC))
  6552. +- sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_ASSOCIATED);
  6553. +- if (test_sta_flag(sta, WLAN_STA_TDLS_PEER))
  6554. +- sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_TDLS_PEER);
  6555. +-
  6556. +- /* check if the driver has a SW RC implementation */
  6557. +- if (ref && ref->ops->get_expected_throughput)
  6558. +- thr = ref->ops->get_expected_throughput(sta->rate_ctrl_priv);
  6559. +- else
  6560. +- thr = drv_get_expected_throughput(local, &sta->sta);
  6561. +-
  6562. +- if (thr != 0) {
  6563. +- sinfo->filled |= STATION_INFO_EXPECTED_THROUGHPUT;
  6564. +- sinfo->expected_throughput = thr;
  6565. +- }
  6566. +-}
  6567. +-
  6568. +-static const char ieee80211_gstrings_sta_stats[][ETH_GSTRING_LEN] = {
  6569. +- "rx_packets", "rx_bytes", "wep_weak_iv_count",
  6570. +- "rx_duplicates", "rx_fragments", "rx_dropped",
  6571. +- "tx_packets", "tx_bytes", "tx_fragments",
  6572. +- "tx_filtered", "tx_retry_failed", "tx_retries",
  6573. +- "beacon_loss", "sta_state", "txrate", "rxrate", "signal",
  6574. +- "channel", "noise", "ch_time", "ch_time_busy",
  6575. +- "ch_time_ext_busy", "ch_time_rx", "ch_time_tx"
  6576. +-};
  6577. +-#define STA_STATS_LEN ARRAY_SIZE(ieee80211_gstrings_sta_stats)
  6578. +-
  6579. +-static int ieee80211_get_et_sset_count(struct wiphy *wiphy,
  6580. +- struct net_device *dev,
  6581. +- int sset)
  6582. +-{
  6583. +- struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  6584. +- int rv = 0;
  6585. +-
  6586. +- if (sset == ETH_SS_STATS)
  6587. +- rv += STA_STATS_LEN;
  6588. +-
  6589. +- rv += drv_get_et_sset_count(sdata, sset);
  6590. +-
  6591. +- if (rv == 0)
  6592. +- return -EOPNOTSUPP;
  6593. +- return rv;
  6594. +-}
  6595. +-
  6596. +-static void ieee80211_get_et_stats(struct wiphy *wiphy,
  6597. +- struct net_device *dev,
  6598. +- struct ethtool_stats *stats,
  6599. +- u64 *data)
  6600. +-{
  6601. +- struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  6602. +- struct ieee80211_chanctx_conf *chanctx_conf;
  6603. +- struct ieee80211_channel *channel;
  6604. +- struct sta_info *sta;
  6605. +- struct ieee80211_local *local = sdata->local;
  6606. +- struct station_info sinfo;
  6607. +- struct survey_info survey;
  6608. +- int i, q;
  6609. +-#define STA_STATS_SURVEY_LEN 7
  6610. +-
  6611. +- memset(data, 0, sizeof(u64) * STA_STATS_LEN);
  6612. +-
  6613. +-#define ADD_STA_STATS(sta) \
  6614. +- do { \
  6615. +- data[i++] += sta->rx_packets; \
  6616. +- data[i++] += sta->rx_bytes; \
  6617. +- data[i++] += sta->wep_weak_iv_count; \
  6618. +- data[i++] += sta->num_duplicates; \
  6619. +- data[i++] += sta->rx_fragments; \
  6620. +- data[i++] += sta->rx_dropped; \
  6621. +- \
  6622. +- data[i++] += sinfo.tx_packets; \
  6623. +- data[i++] += sinfo.tx_bytes; \
  6624. +- data[i++] += sta->tx_fragments; \
  6625. +- data[i++] += sta->tx_filtered_count; \
  6626. +- data[i++] += sta->tx_retry_failed; \
  6627. +- data[i++] += sta->tx_retry_count; \
  6628. +- data[i++] += sta->beacon_loss_count; \
  6629. +- } while (0)
  6630. +-
  6631. +- /* For Managed stations, find the single station based on BSSID
  6632. +- * and use that. For interface types, iterate through all available
  6633. +- * stations and add stats for any station that is assigned to this
  6634. +- * network device.
  6635. +- */
  6636. +-
  6637. +- mutex_lock(&local->sta_mtx);
  6638. +-
  6639. +- if (sdata->vif.type == NL80211_IFTYPE_STATION) {
  6640. +- sta = sta_info_get_bss(sdata, sdata->u.mgd.bssid);
  6641. +-
  6642. +- if (!(sta && !WARN_ON(sta->sdata->dev != dev)))
  6643. +- goto do_survey;
  6644. +-
  6645. +- sinfo.filled = 0;
  6646. +- sta_set_sinfo(sta, &sinfo);
  6647. +-
  6648. +- i = 0;
  6649. +- ADD_STA_STATS(sta);
  6650. +-
  6651. +- data[i++] = sta->sta_state;
  6652. +-
  6653. +-
  6654. +- if (sinfo.filled & STATION_INFO_TX_BITRATE)
  6655. +- data[i] = 100000 *
  6656. +- cfg80211_calculate_bitrate(&sinfo.txrate);
  6657. +- i++;
  6658. +- if (sinfo.filled & STATION_INFO_RX_BITRATE)
  6659. +- data[i] = 100000 *
  6660. +- cfg80211_calculate_bitrate(&sinfo.rxrate);
  6661. +- i++;
  6662. +-
  6663. +- if (sinfo.filled & STATION_INFO_SIGNAL_AVG)
  6664. +- data[i] = (u8)sinfo.signal_avg;
  6665. +- i++;
  6666. +- } else {
  6667. +- list_for_each_entry(sta, &local->sta_list, list) {
  6668. +- /* Make sure this station belongs to the proper dev */
  6669. +- if (sta->sdata->dev != dev)
  6670. +- continue;
  6671. +-
  6672. +- sinfo.filled = 0;
  6673. +- sta_set_sinfo(sta, &sinfo);
  6674. +- i = 0;
  6675. +- ADD_STA_STATS(sta);
  6676. +- }
  6677. +- }
  6678. +-
  6679. +-do_survey:
  6680. +- i = STA_STATS_LEN - STA_STATS_SURVEY_LEN;
  6681. +- /* Get survey stats for current channel */
  6682. +- survey.filled = 0;
  6683. +-
  6684. +- rcu_read_lock();
  6685. +- chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
  6686. +- if (chanctx_conf)
  6687. +- channel = chanctx_conf->def.chan;
  6688. +- else
  6689. +- channel = NULL;
  6690. +- rcu_read_unlock();
  6691. -
  6692. - /* Revert chainmask to runtime parameters */
  6693. - ar9003_hw_set_chain_masks(ah, ah->rxchainmask, ah->txchainmask);
  6694. +- if (channel) {
  6695. +- q = 0;
  6696. +- do {
  6697. +- survey.filled = 0;
  6698. +- if (drv_get_survey(local, q, &survey) != 0) {
  6699. +- survey.filled = 0;
  6700. +- break;
  6701. +- }
  6702. +- q++;
  6703. +- } while (channel != survey.channel);
  6704. +- }
  6705. +-
  6706. +- if (survey.filled)
  6707. +- data[i++] = survey.channel->center_freq;
  6708. +- else
  6709. +- data[i++] = 0;
  6710. +- if (survey.filled & SURVEY_INFO_NOISE_DBM)
  6711. +- data[i++] = (u8)survey.noise;
  6712. +- else
  6713. +- data[i++] = -1LL;
  6714. +- if (survey.filled & SURVEY_INFO_CHANNEL_TIME)
  6715. +- data[i++] = survey.channel_time;
  6716. +- else
  6717. +- data[i++] = -1LL;
  6718. +- if (survey.filled & SURVEY_INFO_CHANNEL_TIME_BUSY)
  6719. +- data[i++] = survey.channel_time_busy;
  6720. +- else
  6721. +- data[i++] = -1LL;
  6722. +- if (survey.filled & SURVEY_INFO_CHANNEL_TIME_EXT_BUSY)
  6723. +- data[i++] = survey.channel_time_ext_busy;
  6724. +- else
  6725. +- data[i++] = -1LL;
  6726. +- if (survey.filled & SURVEY_INFO_CHANNEL_TIME_RX)
  6727. +- data[i++] = survey.channel_time_rx;
  6728. +- else
  6729. +- data[i++] = -1LL;
  6730. +- if (survey.filled & SURVEY_INFO_CHANNEL_TIME_TX)
  6731. +- data[i++] = survey.channel_time_tx;
  6732. +- else
  6733. +- data[i++] = -1LL;
  6734. +-
  6735. +- mutex_unlock(&local->sta_mtx);
  6736. +-
  6737. +- if (WARN_ON(i != STA_STATS_LEN))
  6738. +- return;
  6739. +-
  6740. +- drv_get_et_stats(sdata, stats, &(data[STA_STATS_LEN]));
  6741. +-}
  6742. +-
  6743. +-static void ieee80211_get_et_strings(struct wiphy *wiphy,
  6744. +- struct net_device *dev,
  6745. +- u32 sset, u8 *data)
  6746. +-{
  6747. +- struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  6748. +- int sz_sta_stats = 0;
  6749. +-
  6750. +- if (sset == ETH_SS_STATS) {
  6751. +- sz_sta_stats = sizeof(ieee80211_gstrings_sta_stats);
  6752. +- memcpy(data, ieee80211_gstrings_sta_stats, sz_sta_stats);
  6753. +- }
  6754. +- drv_get_et_strings(sdata, sset, &(data[sz_sta_stats]));
  6755. +-}
  6756. +-
  6757. + static int ieee80211_dump_station(struct wiphy *wiphy, struct net_device *dev,
  6758. + int idx, u8 *mac, struct station_info *sinfo)
  6759. + {
  6760. +@@ -875,7 +554,8 @@ static int ieee80211_set_monitor_channel
  6761. + }
  6762. +
  6763. + static int ieee80211_set_probe_resp(struct ieee80211_sub_if_data *sdata,
  6764. +- const u8 *resp, size_t resp_len)
  6765. ++ const u8 *resp, size_t resp_len,
  6766. ++ const struct ieee80211_csa_settings *csa)
  6767. + {
  6768. + struct probe_resp *new, *old;
  6769. ---- a/drivers/net/wireless/rtl818x/rtl8187/rtl8187.h
  6770. -+++ b/drivers/net/wireless/rtl818x/rtl8187/rtl8187.h
  6771. -@@ -15,6 +15,8 @@
  6772. - #ifndef RTL8187_H
  6773. - #define RTL8187_H
  6774. +@@ -891,6 +571,11 @@ static int ieee80211_set_probe_resp(stru
  6775. + new->len = resp_len;
  6776. + memcpy(new->data, resp, resp_len);
  6777. -+#include <linux/cache.h>
  6778. ++ if (csa)
  6779. ++ memcpy(new->csa_counter_offsets, csa->counter_offsets_presp,
  6780. ++ csa->n_counter_offsets_presp *
  6781. ++ sizeof(new->csa_counter_offsets[0]));
  6782. +
  6783. - #include "rtl818x.h"
  6784. - #include "leds.h"
  6785. -
  6786. -@@ -139,7 +141,10 @@ struct rtl8187_priv {
  6787. - u8 aifsn[4];
  6788. - u8 rfkill_mask;
  6789. - struct {
  6790. -- __le64 buf;
  6791. -+ union {
  6792. -+ __le64 buf;
  6793. -+ u8 dummy1[L1_CACHE_BYTES];
  6794. -+ } ____cacheline_aligned;
  6795. - struct sk_buff_head queue;
  6796. - } b_tx_status; /* This queue is used by both -b and non-b devices */
  6797. - struct mutex io_mutex;
  6798. -@@ -147,7 +152,8 @@ struct rtl8187_priv {
  6799. - u8 bits8;
  6800. - __le16 bits16;
  6801. - __le32 bits32;
  6802. -- } *io_dmabuf;
  6803. -+ u8 dummy2[L1_CACHE_BYTES];
  6804. -+ } *io_dmabuf ____cacheline_aligned;
  6805. - bool rfkill_off;
  6806. - u16 seqno;
  6807. - };
  6808. ---- a/net/mac80211/wme.c
  6809. -+++ b/net/mac80211/wme.c
  6810. -@@ -154,6 +154,11 @@ u16 ieee80211_select_queue(struct ieee80
  6811. - return IEEE80211_AC_BE;
  6812. - }
  6813. + rcu_assign_pointer(sdata->u.ap.probe_resp, new);
  6814. + if (old)
  6815. + kfree_rcu(old, rcu_head);
  6816. +@@ -899,7 +584,8 @@ static int ieee80211_set_probe_resp(stru
  6817. + }
  6818. -+ if (skb->protocol == sdata->control_port_protocol) {
  6819. -+ skb->priority = 7;
  6820. -+ return ieee80211_downgrade_queue(sdata, skb);
  6821. + static int ieee80211_assign_beacon(struct ieee80211_sub_if_data *sdata,
  6822. +- struct cfg80211_beacon_data *params)
  6823. ++ struct cfg80211_beacon_data *params,
  6824. ++ const struct ieee80211_csa_settings *csa)
  6825. + {
  6826. + struct beacon_data *new, *old;
  6827. + int new_head_len, new_tail_len;
  6828. +@@ -943,6 +629,13 @@ static int ieee80211_assign_beacon(struc
  6829. + new->head_len = new_head_len;
  6830. + new->tail_len = new_tail_len;
  6831. +
  6832. ++ if (csa) {
  6833. ++ new->csa_current_counter = csa->count;
  6834. ++ memcpy(new->csa_counter_offsets, csa->counter_offsets_beacon,
  6835. ++ csa->n_counter_offsets_beacon *
  6836. ++ sizeof(new->csa_counter_offsets[0]));
  6837. + }
  6838. +
  6839. - /* use the data classifier to determine what 802.1d tag the
  6840. - * data frame has */
  6841. - rcu_read_lock();
  6842. ---- a/drivers/net/wireless/ath/ath9k/xmit.c
  6843. -+++ b/drivers/net/wireless/ath/ath9k/xmit.c
  6844. -@@ -1444,14 +1444,16 @@ void ath_tx_aggr_sleep(struct ieee80211_
  6845. - for (tidno = 0, tid = &an->tid[tidno];
  6846. - tidno < IEEE80211_NUM_TIDS; tidno++, tid++) {
  6847. -
  6848. -- if (!tid->sched)
  6849. -- continue;
  6850. --
  6851. - ac = tid->ac;
  6852. - txq = ac->txq;
  6853. + /* copy in head */
  6854. + if (params->head)
  6855. + memcpy(new->head, params->head, new_head_len);
  6856. +@@ -957,7 +650,7 @@ static int ieee80211_assign_beacon(struc
  6857. + memcpy(new->tail, old->tail, new_tail_len);
  6858. - ath_txq_lock(sc, txq);
  6859. + err = ieee80211_set_probe_resp(sdata, params->probe_resp,
  6860. +- params->probe_resp_len);
  6861. ++ params->probe_resp_len, csa);
  6862. + if (err < 0)
  6863. + return err;
  6864. + if (err == 0)
  6865. +@@ -1042,7 +735,7 @@ static int ieee80211_start_ap(struct wip
  6866. + sdata->vif.bss_conf.p2p_noa_attr.oppps_ctwindow |=
  6867. + IEEE80211_P2P_OPPPS_ENABLE_BIT;
  6868. -+ if (!tid->sched) {
  6869. -+ ath_txq_unlock(sc, txq);
  6870. -+ continue;
  6871. -+ }
  6872. -+
  6873. - buffered = ath_tid_has_buffered(tid);
  6874. +- err = ieee80211_assign_beacon(sdata, &params->beacon);
  6875. ++ err = ieee80211_assign_beacon(sdata, &params->beacon, NULL);
  6876. + if (err < 0) {
  6877. + ieee80211_vif_release_channel(sdata);
  6878. + return err;
  6879. +@@ -1090,7 +783,7 @@ static int ieee80211_change_beacon(struc
  6880. + if (!old)
  6881. + return -ENOENT;
  6882. - tid->sched = false;
  6883. -@@ -1696,7 +1698,7 @@ int ath_cabq_update(struct ath_softc *sc
  6884. +- err = ieee80211_assign_beacon(sdata, params);
  6885. ++ err = ieee80211_assign_beacon(sdata, params, NULL);
  6886. + if (err < 0)
  6887. + return err;
  6888. + ieee80211_bss_info_change_notify(sdata, err);
  6889. +@@ -3073,7 +2766,8 @@ static int ieee80211_set_after_csa_beaco
  6890. - ath9k_hw_get_txq_props(sc->sc_ah, qnum, &qi);
  6891. + switch (sdata->vif.type) {
  6892. + case NL80211_IFTYPE_AP:
  6893. +- err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon);
  6894. ++ err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon,
  6895. ++ NULL);
  6896. + kfree(sdata->u.ap.next_beacon);
  6897. + sdata->u.ap.next_beacon = NULL;
  6898. +
  6899. +@@ -3176,6 +2870,7 @@ static int ieee80211_set_csa_beacon(stru
  6900. + struct cfg80211_csa_settings *params,
  6901. + u32 *changed)
  6902. + {
  6903. ++ struct ieee80211_csa_settings csa = {};
  6904. + int err;
  6905. -- qi.tqi_readyTime = (cur_conf->beacon_interval *
  6906. -+ qi.tqi_readyTime = (TU_TO_USEC(cur_conf->beacon_interval) *
  6907. - ATH_CABQ_READY_TIME) / 100;
  6908. - ath_txq_update(sc, qnum, &qi);
  6909. + switch (sdata->vif.type) {
  6910. +@@ -3210,20 +2905,13 @@ static int ieee80211_set_csa_beacon(stru
  6911. + IEEE80211_MAX_CSA_COUNTERS_NUM))
  6912. + return -EINVAL;
  6913. -@@ -2061,7 +2063,7 @@ static struct ath_buf *ath_tx_setup_buff
  6914. +- /* make sure we don't have garbage in other counters */
  6915. +- memset(sdata->csa_counter_offset_beacon, 0,
  6916. +- sizeof(sdata->csa_counter_offset_beacon));
  6917. +- memset(sdata->csa_counter_offset_presp, 0,
  6918. +- sizeof(sdata->csa_counter_offset_presp));
  6919. +-
  6920. +- memcpy(sdata->csa_counter_offset_beacon,
  6921. +- params->counter_offsets_beacon,
  6922. +- params->n_counter_offsets_beacon * sizeof(u16));
  6923. +- memcpy(sdata->csa_counter_offset_presp,
  6924. +- params->counter_offsets_presp,
  6925. +- params->n_counter_offsets_presp * sizeof(u16));
  6926. ++ csa.counter_offsets_beacon = params->counter_offsets_beacon;
  6927. ++ csa.counter_offsets_presp = params->counter_offsets_presp;
  6928. ++ csa.n_counter_offsets_beacon = params->n_counter_offsets_beacon;
  6929. ++ csa.n_counter_offsets_presp = params->n_counter_offsets_presp;
  6930. ++ csa.count = params->count;
  6931. +
  6932. +- err = ieee80211_assign_beacon(sdata, &params->beacon_csa);
  6933. ++ err = ieee80211_assign_beacon(sdata, &params->beacon_csa, &csa);
  6934. + if (err < 0) {
  6935. + kfree(sdata->u.ap.next_beacon);
  6936. + return err;
  6937. +@@ -3367,7 +3055,6 @@ __ieee80211_channel_switch(struct wiphy
  6938. + sdata->csa_radar_required = params->radar_required;
  6939. + sdata->csa_chandef = params->chandef;
  6940. + sdata->csa_block_tx = params->block_tx;
  6941. +- sdata->csa_current_counter = params->count;
  6942. + sdata->vif.csa_active = true;
  6943. +
  6944. + if (sdata->csa_block_tx)
  6945. +@@ -3515,10 +3202,23 @@ static int ieee80211_mgmt_tx(struct wiph
  6946. + sdata->vif.type == NL80211_IFTYPE_ADHOC) &&
  6947. + params->n_csa_offsets) {
  6948. + int i;
  6949. +- u8 c = sdata->csa_current_counter;
  6950. ++ struct beacon_data *beacon = NULL;
  6951. ++
  6952. ++ rcu_read_lock();
  6953. +
  6954. +- for (i = 0; i < params->n_csa_offsets; i++)
  6955. +- data[params->csa_offsets[i]] = c;
  6956. ++ if (sdata->vif.type == NL80211_IFTYPE_AP)
  6957. ++ beacon = rcu_dereference(sdata->u.ap.beacon);
  6958. ++ else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
  6959. ++ beacon = rcu_dereference(sdata->u.ibss.presp);
  6960. ++ else if (ieee80211_vif_is_mesh(&sdata->vif))
  6961. ++ beacon = rcu_dereference(sdata->u.mesh.beacon);
  6962. ++
  6963. ++ if (beacon)
  6964. ++ for (i = 0; i < params->n_csa_offsets; i++)
  6965. ++ data[params->csa_offsets[i]] =
  6966. ++ beacon->csa_current_counter;
  6967. ++
  6968. ++ rcu_read_unlock();
  6969. + }
  6970. - ATH_TXBUF_RESET(bf);
  6971. + IEEE80211_SKB_CB(skb)->flags = flags;
  6972. +@@ -3598,21 +3298,6 @@ static int ieee80211_get_antenna(struct
  6973. + return drv_get_antenna(local, tx_ant, rx_ant);
  6974. + }
  6975. -- if (tid) {
  6976. -+ if (tid && ieee80211_is_data_present(hdr->frame_control)) {
  6977. - fragno = le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_FRAG;
  6978. - seqno = tid->seq_next;
  6979. - hdr->seq_ctrl = cpu_to_le16(tid->seq_next << IEEE80211_SEQ_SEQ_SHIFT);
  6980. -@@ -2184,14 +2186,15 @@ int ath_tx_start(struct ieee80211_hw *hw
  6981. - txq->stopped = true;
  6982. - }
  6983. +-static int ieee80211_set_ringparam(struct wiphy *wiphy, u32 tx, u32 rx)
  6984. +-{
  6985. +- struct ieee80211_local *local = wiphy_priv(wiphy);
  6986. +-
  6987. +- return drv_set_ringparam(local, tx, rx);
  6988. +-}
  6989. +-
  6990. +-static void ieee80211_get_ringparam(struct wiphy *wiphy,
  6991. +- u32 *tx, u32 *tx_max, u32 *rx, u32 *rx_max)
  6992. +-{
  6993. +- struct ieee80211_local *local = wiphy_priv(wiphy);
  6994. +-
  6995. +- drv_get_ringparam(local, tx, tx_max, rx, rx_max);
  6996. +-}
  6997. +-
  6998. + static int ieee80211_set_rekey_data(struct wiphy *wiphy,
  6999. + struct net_device *dev,
  7000. + struct cfg80211_gtk_rekey_data *data)
  7001. +@@ -3844,8 +3529,6 @@ const struct cfg80211_ops mac80211_confi
  7002. + .mgmt_frame_register = ieee80211_mgmt_frame_register,
  7003. + .set_antenna = ieee80211_set_antenna,
  7004. + .get_antenna = ieee80211_get_antenna,
  7005. +- .set_ringparam = ieee80211_set_ringparam,
  7006. +- .get_ringparam = ieee80211_get_ringparam,
  7007. + .set_rekey_data = ieee80211_set_rekey_data,
  7008. + .tdls_oper = ieee80211_tdls_oper,
  7009. + .tdls_mgmt = ieee80211_tdls_mgmt,
  7010. +@@ -3854,9 +3537,6 @@ const struct cfg80211_ops mac80211_confi
  7011. + #ifdef CONFIG_PM
  7012. + .set_wakeup = ieee80211_set_wakeup,
  7013. + #endif
  7014. +- .get_et_sset_count = ieee80211_get_et_sset_count,
  7015. +- .get_et_stats = ieee80211_get_et_stats,
  7016. +- .get_et_strings = ieee80211_get_et_strings,
  7017. + .get_channel = ieee80211_cfg_get_channel,
  7018. + .start_radar_detection = ieee80211_start_radar_detection,
  7019. + .channel_switch = ieee80211_channel_switch,
  7020. +--- a/net/mac80211/debugfs_sta.c
  7021. ++++ b/net/mac80211/debugfs_sta.c
  7022. +@@ -587,7 +587,6 @@ void ieee80211_sta_debugfs_add(struct st
  7023. + DEBUGFS_ADD_COUNTER(tx_filtered, tx_filtered_count);
  7024. + DEBUGFS_ADD_COUNTER(tx_retry_failed, tx_retry_failed);
  7025. + DEBUGFS_ADD_COUNTER(tx_retry_count, tx_retry_count);
  7026. +- DEBUGFS_ADD_COUNTER(wep_weak_iv_count, wep_weak_iv_count);
  7027. +
  7028. + if (sizeof(sta->driver_buffered_tids) == sizeof(u32))
  7029. + debugfs_create_x32("driver_buffered_tids", 0400,
  7030. +--- a/net/mac80211/wep.c
  7031. ++++ b/net/mac80211/wep.c
  7032. +@@ -271,22 +271,6 @@ static int ieee80211_wep_decrypt(struct
  7033. + return ret;
  7034. + }
  7035. -+ if (txctl->an && ieee80211_is_data_present(hdr->frame_control))
  7036. -+ tid = ath_get_skb_tid(sc, txctl->an, skb);
  7037. -+
  7038. - if (info->flags & IEEE80211_TX_CTL_PS_RESPONSE) {
  7039. - ath_txq_unlock(sc, txq);
  7040. - txq = sc->tx.uapsdq;
  7041. - ath_txq_lock(sc, txq);
  7042. - } else if (txctl->an &&
  7043. - ieee80211_is_data_present(hdr->frame_control)) {
  7044. -- tid = ath_get_skb_tid(sc, txctl->an, skb);
  7045. -
  7046. - WARN_ON(tid->ac->txq != txctl->txq);
  7047. -
  7048. - if (info->flags & IEEE80211_TX_CTL_CLEAR_PS_FILT)
  7049. ---- a/drivers/net/wireless/ath/ath9k/init.c
  7050. -+++ b/drivers/net/wireless/ath/ath9k/init.c
  7051. -@@ -943,6 +943,7 @@ static void ath9k_set_hw_capab(struct at
  7052. - hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
  7053. - hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_5_10_MHZ;
  7054. - hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
  7055. -+ hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
  7056. -
  7057. - hw->queues = 4;
  7058. - hw->max_rates = 4;
  7059. ---- a/net/mac80211/ieee80211_i.h
  7060. -+++ b/net/mac80211/ieee80211_i.h
  7061. -@@ -1700,14 +1700,8 @@ void ieee80211_stop_queue_by_reason(stru
  7062. - void ieee80211_propagate_queue_wake(struct ieee80211_local *local, int queue);
  7063. - void ieee80211_add_pending_skb(struct ieee80211_local *local,
  7064. - struct sk_buff *skb);
  7065. --void ieee80211_add_pending_skbs_fn(struct ieee80211_local *local,
  7066. -- struct sk_buff_head *skbs,
  7067. -- void (*fn)(void *data), void *data);
  7068. --static inline void ieee80211_add_pending_skbs(struct ieee80211_local *local,
  7069. -- struct sk_buff_head *skbs)
  7070. +-static bool ieee80211_wep_is_weak_iv(struct sk_buff *skb,
  7071. +- struct ieee80211_key *key)
  7072. -{
  7073. -- ieee80211_add_pending_skbs_fn(local, skbs, NULL, NULL);
  7074. +- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
  7075. +- unsigned int hdrlen;
  7076. +- u8 *ivpos;
  7077. +- u32 iv;
  7078. +-
  7079. +- hdrlen = ieee80211_hdrlen(hdr->frame_control);
  7080. +- ivpos = skb->data + hdrlen;
  7081. +- iv = (ivpos[0] << 16) | (ivpos[1] << 8) | ivpos[2];
  7082. +-
  7083. +- return ieee80211_wep_weak_iv(iv, key->conf.keylen);
  7084. -}
  7085. -+void ieee80211_add_pending_skbs(struct ieee80211_local *local,
  7086. -+ struct sk_buff_head *skbs);
  7087. - void ieee80211_flush_queues(struct ieee80211_local *local,
  7088. - struct ieee80211_sub_if_data *sdata);
  7089. +-
  7090. + ieee80211_rx_result
  7091. + ieee80211_crypto_wep_decrypt(struct ieee80211_rx_data *rx)
  7092. + {
  7093. +@@ -301,16 +285,12 @@ ieee80211_crypto_wep_decrypt(struct ieee
  7094. + if (!(status->flag & RX_FLAG_DECRYPTED)) {
  7095. + if (skb_linearize(rx->skb))
  7096. + return RX_DROP_UNUSABLE;
  7097. +- if (rx->sta && ieee80211_wep_is_weak_iv(rx->skb, rx->key))
  7098. +- rx->sta->wep_weak_iv_count++;
  7099. + if (ieee80211_wep_decrypt(rx->local, rx->skb, rx->key))
  7100. + return RX_DROP_UNUSABLE;
  7101. + } else if (!(status->flag & RX_FLAG_IV_STRIPPED)) {
  7102. + if (!pskb_may_pull(rx->skb, ieee80211_hdrlen(fc) +
  7103. + IEEE80211_WEP_IV_LEN))
  7104. + return RX_DROP_UNUSABLE;
  7105. +- if (rx->sta && ieee80211_wep_is_weak_iv(rx->skb, rx->key))
  7106. +- rx->sta->wep_weak_iv_count++;
  7107. + ieee80211_wep_remove_iv(rx->local, rx->skb, rx->key);
  7108. + /* remove ICV */
  7109. + if (pskb_trim(rx->skb, rx->skb->len - IEEE80211_WEP_ICV_LEN))
  7110. +--- a/include/net/cfg80211.h
  7111. ++++ b/include/net/cfg80211.h
  7112. +@@ -2278,16 +2278,6 @@ struct cfg80211_qos_map {
  7113. + *
  7114. + * @set_noack_map: Set the NoAck Map for the TIDs.
  7115. + *
  7116. +- * @get_et_sset_count: Ethtool API to get string-set count.
  7117. +- * See @ethtool_ops.get_sset_count
  7118. +- *
  7119. +- * @get_et_stats: Ethtool API to get a set of u64 stats.
  7120. +- * See @ethtool_ops.get_ethtool_stats
  7121. +- *
  7122. +- * @get_et_strings: Ethtool API to get a set of strings to describe stats
  7123. +- * and perhaps other supported types of ethtool data-sets.
  7124. +- * See @ethtool_ops.get_strings
  7125. +- *
  7126. + * @get_channel: Get the current operating channel for the virtual interface.
  7127. + * For monitor interfaces, it should return %NULL unless there's a single
  7128. + * current monitoring channel.
  7129. +@@ -2529,13 +2519,6 @@ struct cfg80211_ops {
  7130. + struct net_device *dev,
  7131. + u16 noack_map);
  7132. +
  7133. +- int (*get_et_sset_count)(struct wiphy *wiphy,
  7134. +- struct net_device *dev, int sset);
  7135. +- void (*get_et_stats)(struct wiphy *wiphy, struct net_device *dev,
  7136. +- struct ethtool_stats *stats, u64 *data);
  7137. +- void (*get_et_strings)(struct wiphy *wiphy, struct net_device *dev,
  7138. +- u32 sset, u8 *data);
  7139. +-
  7140. + int (*get_channel)(struct wiphy *wiphy,
  7141. + struct wireless_dev *wdev,
  7142. + struct cfg80211_chan_def *chandef);
  7143. +@@ -4846,6 +4829,10 @@ void cfg80211_stop_iface(struct wiphy *w
  7144. + */
  7145. + void cfg80211_shutdown_all_interfaces(struct wiphy *wiphy);
  7146. ---- a/net/mac80211/sta_info.c
  7147. -+++ b/net/mac80211/sta_info.c
  7148. -@@ -91,7 +91,7 @@ static int sta_info_hash_del(struct ieee
  7149. - return -ENOENT;
  7150. - }
  7151. ++
  7152. ++/* ethtool helper */
  7153. ++void cfg80211_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info);
  7154. ++
  7155. + /* Logging, debugging and troubleshooting/diagnostic helpers. */
  7156. +
  7157. + /* wiphy_printk helpers, similar to dev_printk */
  7158. +--- a/net/mac80211/Makefile
  7159. ++++ b/net/mac80211/Makefile
  7160. +@@ -17,6 +17,7 @@ mac80211-y := \
  7161. + aes_ccm.o \
  7162. + aes_cmac.o \
  7163. + cfg.o \
  7164. ++ ethtool.o \
  7165. + rx.o \
  7166. + spectmgmt.o \
  7167. + tx.o \
  7168. +--- a/net/mac80211/ieee80211_i.h
  7169. ++++ b/net/mac80211/ieee80211_i.h
  7170. +@@ -229,16 +229,29 @@ struct ieee80211_rx_data {
  7171. + u16 tkip_iv16;
  7172. + };
  7173. +
  7174. ++struct ieee80211_csa_settings {
  7175. ++ const u16 *counter_offsets_beacon;
  7176. ++ const u16 *counter_offsets_presp;
  7177. ++
  7178. ++ int n_counter_offsets_beacon;
  7179. ++ int n_counter_offsets_presp;
  7180. ++
  7181. ++ u8 count;
  7182. ++};
  7183. ++
  7184. + struct beacon_data {
  7185. + u8 *head, *tail;
  7186. + int head_len, tail_len;
  7187. + struct ieee80211_meshconf_ie *meshconf;
  7188. ++ u16 csa_counter_offsets[IEEE80211_MAX_CSA_COUNTERS_NUM];
  7189. ++ u8 csa_current_counter;
  7190. + struct rcu_head rcu_head;
  7191. + };
  7192. +
  7193. + struct probe_resp {
  7194. + struct rcu_head rcu_head;
  7195. + int len;
  7196. ++ u16 csa_counter_offsets[IEEE80211_MAX_CSA_COUNTERS_NUM];
  7197. + u8 data[0];
  7198. + };
  7199. --static void cleanup_single_sta(struct sta_info *sta)
  7200. -+static void __cleanup_single_sta(struct sta_info *sta)
  7201. - {
  7202. - int ac, i;
  7203. - struct tid_ampdu_tx *tid_tx;
  7204. -@@ -99,7 +99,8 @@ static void cleanup_single_sta(struct st
  7205. - struct ieee80211_local *local = sdata->local;
  7206. - struct ps_data *ps;
  7207. +@@ -754,8 +767,6 @@ struct ieee80211_sub_if_data {
  7208. + struct mac80211_qos_map __rcu *qos_map;
  7209. -- if (test_sta_flag(sta, WLAN_STA_PS_STA)) {
  7210. -+ if (test_sta_flag(sta, WLAN_STA_PS_STA) ||
  7211. -+ test_sta_flag(sta, WLAN_STA_PS_DRIVER)) {
  7212. - if (sta->sdata->vif.type == NL80211_IFTYPE_AP ||
  7213. - sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
  7214. - ps = &sdata->bss->ps;
  7215. -@@ -109,6 +110,7 @@ static void cleanup_single_sta(struct st
  7216. - return;
  7217. + struct work_struct csa_finalize_work;
  7218. +- u16 csa_counter_offset_beacon[IEEE80211_MAX_CSA_COUNTERS_NUM];
  7219. +- u16 csa_counter_offset_presp[IEEE80211_MAX_CSA_COUNTERS_NUM];
  7220. + bool csa_radar_required;
  7221. + bool csa_block_tx; /* write-protected by sdata_lock and local->mtx */
  7222. + struct cfg80211_chan_def csa_chandef;
  7223. +@@ -767,7 +778,6 @@ struct ieee80211_sub_if_data {
  7224. + struct ieee80211_chanctx *reserved_chanctx;
  7225. + struct cfg80211_chan_def reserved_chandef;
  7226. + bool reserved_radar_required;
  7227. +- u8 csa_current_counter;
  7228. - clear_sta_flag(sta, WLAN_STA_PS_STA);
  7229. -+ clear_sta_flag(sta, WLAN_STA_PS_DRIVER);
  7230. + /* used to reconfigure hardware SM PS */
  7231. + struct work_struct recalc_smps;
  7232. +@@ -1850,6 +1860,8 @@ int ieee80211_tdls_oper(struct wiphy *wi
  7233. + const u8 *peer, enum nl80211_tdls_operation oper);
  7234. - atomic_dec(&ps->num_sta_ps);
  7235. - sta_info_recalc_tim(sta);
  7236. -@@ -139,7 +141,14 @@ static void cleanup_single_sta(struct st
  7237. - ieee80211_purge_tx_queue(&local->hw, &tid_tx->pending);
  7238. - kfree(tid_tx);
  7239. - }
  7240. -+}
  7241. -+static void cleanup_single_sta(struct sta_info *sta)
  7242. -+{
  7243. -+ struct ieee80211_sub_if_data *sdata = sta->sdata;
  7244. -+ struct ieee80211_local *local = sdata->local;
  7245. ++extern const struct ethtool_ops ieee80211_ethtool_ops;
  7246. +
  7247. -+ __cleanup_single_sta(sta);
  7248. - sta_info_free(local, sta);
  7249. - }
  7250. + #ifdef CPTCFG_MAC80211_NOINLINE
  7251. + #define debug_noinline noinline
  7252. + #else
  7253. +--- a/net/mac80211/iface.c
  7254. ++++ b/net/mac80211/iface.c
  7255. +@@ -399,6 +399,7 @@ int ieee80211_add_virtual_monitor(struct
  7256. + sdata->vif.type = NL80211_IFTYPE_MONITOR;
  7257. + snprintf(sdata->name, IFNAMSIZ, "%s-monitor",
  7258. + wiphy_name(local->hw.wiphy));
  7259. ++ sdata->wdev.iftype = NL80211_IFTYPE_MONITOR;
  7260. -@@ -330,6 +339,7 @@ struct sta_info *sta_info_alloc(struct i
  7261. - rcu_read_unlock();
  7262. + sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM;
  7263. - spin_lock_init(&sta->lock);
  7264. -+ spin_lock_init(&sta->ps_lock);
  7265. - INIT_WORK(&sta->drv_unblock_wk, sta_unblock);
  7266. - INIT_WORK(&sta->ampdu_mlme.work, ieee80211_ba_session_work);
  7267. - mutex_init(&sta->ampdu_mlme.mtx);
  7268. -@@ -487,21 +497,26 @@ static int sta_info_insert_finish(struct
  7269. - goto out_err;
  7270. - }
  7271. +@@ -1303,6 +1304,7 @@ static void ieee80211_setup_sdata(struct
  7272. + sdata->control_port_protocol = cpu_to_be16(ETH_P_PAE);
  7273. + sdata->control_port_no_encrypt = false;
  7274. + sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM;
  7275. ++ sdata->vif.bss_conf.idle = true;
  7276. -- /* notify driver */
  7277. -- err = sta_info_insert_drv_state(local, sdata, sta);
  7278. -- if (err)
  7279. -- goto out_err;
  7280. --
  7281. - local->num_sta++;
  7282. - local->sta_generation++;
  7283. - smp_mb();
  7284. + sdata->noack_map = 0;
  7285. -+ /* simplify things and don't accept BA sessions yet */
  7286. -+ set_sta_flag(sta, WLAN_STA_BLOCK_BA);
  7287. -+
  7288. - /* make the station visible */
  7289. - sta_info_hash_add(local, sta);
  7290. +@@ -1721,6 +1723,8 @@ int ieee80211_if_add(struct ieee80211_lo
  7291. - list_add_rcu(&sta->list, &local->sta_list);
  7292. + ndev->features |= local->hw.netdev_features;
  7293. -+ /* notify driver */
  7294. -+ err = sta_info_insert_drv_state(local, sdata, sta);
  7295. -+ if (err)
  7296. -+ goto out_remove;
  7297. ++ netdev_set_default_ethtool_ops(ndev, &ieee80211_ethtool_ops);
  7298. +
  7299. - set_sta_flag(sta, WLAN_STA_INSERTED);
  7300. -+ /* accept BA sessions now */
  7301. -+ clear_sta_flag(sta, WLAN_STA_BLOCK_BA);
  7302. + ret = register_netdevice(ndev);
  7303. + if (ret) {
  7304. + free_netdev(ndev);
  7305. +--- a/net/wireless/core.c
  7306. ++++ b/net/wireless/core.c
  7307. +@@ -25,7 +25,6 @@
  7308. + #include "sysfs.h"
  7309. + #include "debugfs.h"
  7310. + #include "wext-compat.h"
  7311. +-#include "ethtool.h"
  7312. + #include "rdev-ops.h"
  7313. - ieee80211_recalc_min_chandef(sdata);
  7314. - ieee80211_sta_debugfs_add(sta);
  7315. -@@ -522,6 +537,12 @@ static int sta_info_insert_finish(struct
  7316. - mesh_accept_plinks_update(sdata);
  7317. + /* name for sysfs, %d is appended */
  7318. +@@ -940,8 +939,6 @@ static int cfg80211_netdev_notifier_call
  7319. + /* allow mac80211 to determine the timeout */
  7320. + wdev->ps_timeout = -1;
  7321. - return 0;
  7322. -+ out_remove:
  7323. -+ sta_info_hash_del(local, sta);
  7324. -+ list_del_rcu(&sta->list);
  7325. -+ local->num_sta--;
  7326. -+ synchronize_net();
  7327. -+ __cleanup_single_sta(sta);
  7328. - out_err:
  7329. - mutex_unlock(&local->sta_mtx);
  7330. - rcu_read_lock();
  7331. -@@ -1071,10 +1092,14 @@ struct ieee80211_sta *ieee80211_find_sta
  7332. - }
  7333. - EXPORT_SYMBOL(ieee80211_find_sta);
  7334. +- netdev_set_default_ethtool_ops(dev, &cfg80211_ethtool_ops);
  7335. +-
  7336. + if ((wdev->iftype == NL80211_IFTYPE_STATION ||
  7337. + wdev->iftype == NL80211_IFTYPE_P2P_CLIENT ||
  7338. + wdev->iftype == NL80211_IFTYPE_ADHOC) && !wdev->use_4addr)
  7339. +--- a/net/wireless/ethtool.c
  7340. ++++ b/net/wireless/ethtool.c
  7341. +@@ -1,11 +1,9 @@
  7342. + #include <linux/utsname.h>
  7343. + #include <net/cfg80211.h>
  7344. + #include "core.h"
  7345. +-#include "ethtool.h"
  7346. + #include "rdev-ops.h"
  7347. --static void clear_sta_ps_flags(void *_sta)
  7348. -+/* powersave support code */
  7349. -+void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta)
  7350. +-static void cfg80211_get_drvinfo(struct net_device *dev,
  7351. +- struct ethtool_drvinfo *info)
  7352. ++void cfg80211_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
  7353. {
  7354. -- struct sta_info *sta = _sta;
  7355. - struct ieee80211_sub_if_data *sdata = sta->sdata;
  7356. -+ struct ieee80211_local *local = sdata->local;
  7357. -+ struct sk_buff_head pending;
  7358. -+ int filtered = 0, buffered = 0, ac;
  7359. -+ unsigned long flags;
  7360. - struct ps_data *ps;
  7361. -
  7362. - if (sdata->vif.type == NL80211_IFTYPE_AP ||
  7363. -@@ -1085,20 +1110,6 @@ static void clear_sta_ps_flags(void *_st
  7364. - else
  7365. - return;
  7366. + struct wireless_dev *wdev = dev->ieee80211_ptr;
  7367. -- clear_sta_flag(sta, WLAN_STA_PS_DRIVER);
  7368. -- if (test_and_clear_sta_flag(sta, WLAN_STA_PS_STA))
  7369. -- atomic_dec(&ps->num_sta_ps);
  7370. +@@ -23,84 +21,4 @@ static void cfg80211_get_drvinfo(struct
  7371. + strlcpy(info->bus_info, dev_name(wiphy_dev(wdev->wiphy)),
  7372. + sizeof(info->bus_info));
  7373. + }
  7374. +-
  7375. +-static int cfg80211_get_regs_len(struct net_device *dev)
  7376. +-{
  7377. +- /* For now, return 0... */
  7378. +- return 0;
  7379. -}
  7380. -
  7381. --/* powersave support code */
  7382. --void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta)
  7383. +-static void cfg80211_get_regs(struct net_device *dev, struct ethtool_regs *regs,
  7384. +- void *data)
  7385. -{
  7386. -- struct ieee80211_sub_if_data *sdata = sta->sdata;
  7387. -- struct ieee80211_local *local = sdata->local;
  7388. -- struct sk_buff_head pending;
  7389. -- int filtered = 0, buffered = 0, ac;
  7390. -- unsigned long flags;
  7391. +- struct wireless_dev *wdev = dev->ieee80211_ptr;
  7392. -
  7393. - clear_sta_flag(sta, WLAN_STA_SP);
  7394. -
  7395. - BUILD_BUG_ON(BITS_TO_LONGS(IEEE80211_NUM_TIDS) > 1);
  7396. -@@ -1109,6 +1120,8 @@ void ieee80211_sta_ps_deliver_wakeup(str
  7397. +- regs->version = wdev->wiphy->hw_version;
  7398. +- regs->len = 0;
  7399. +-}
  7400. +-
  7401. +-static void cfg80211_get_ringparam(struct net_device *dev,
  7402. +- struct ethtool_ringparam *rp)
  7403. +-{
  7404. +- struct wireless_dev *wdev = dev->ieee80211_ptr;
  7405. +- struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
  7406. +-
  7407. +- memset(rp, 0, sizeof(*rp));
  7408. +-
  7409. +- if (rdev->ops->get_ringparam)
  7410. +- rdev_get_ringparam(rdev, &rp->tx_pending, &rp->tx_max_pending,
  7411. +- &rp->rx_pending, &rp->rx_max_pending);
  7412. +-}
  7413. +-
  7414. +-static int cfg80211_set_ringparam(struct net_device *dev,
  7415. +- struct ethtool_ringparam *rp)
  7416. +-{
  7417. +- struct wireless_dev *wdev = dev->ieee80211_ptr;
  7418. +- struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
  7419. +-
  7420. +- if (rp->rx_mini_pending != 0 || rp->rx_jumbo_pending != 0)
  7421. +- return -EINVAL;
  7422. +-
  7423. +- if (rdev->ops->set_ringparam)
  7424. +- return rdev_set_ringparam(rdev, rp->tx_pending, rp->rx_pending);
  7425. +-
  7426. +- return -ENOTSUPP;
  7427. +-}
  7428. +-
  7429. +-static int cfg80211_get_sset_count(struct net_device *dev, int sset)
  7430. +-{
  7431. +- struct wireless_dev *wdev = dev->ieee80211_ptr;
  7432. +- struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
  7433. +- if (rdev->ops->get_et_sset_count)
  7434. +- return rdev_get_et_sset_count(rdev, dev, sset);
  7435. +- return -EOPNOTSUPP;
  7436. +-}
  7437. +-
  7438. +-static void cfg80211_get_stats(struct net_device *dev,
  7439. +- struct ethtool_stats *stats, u64 *data)
  7440. +-{
  7441. +- struct wireless_dev *wdev = dev->ieee80211_ptr;
  7442. +- struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
  7443. +- if (rdev->ops->get_et_stats)
  7444. +- rdev_get_et_stats(rdev, dev, stats, data);
  7445. +-}
  7446. +-
  7447. +-static void cfg80211_get_strings(struct net_device *dev, u32 sset, u8 *data)
  7448. +-{
  7449. +- struct wireless_dev *wdev = dev->ieee80211_ptr;
  7450. +- struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
  7451. +- if (rdev->ops->get_et_strings)
  7452. +- rdev_get_et_strings(rdev, dev, sset, data);
  7453. +-}
  7454. +-
  7455. +-const struct ethtool_ops cfg80211_ethtool_ops = {
  7456. +- .get_drvinfo = cfg80211_get_drvinfo,
  7457. +- .get_regs_len = cfg80211_get_regs_len,
  7458. +- .get_regs = cfg80211_get_regs,
  7459. +- .get_link = ethtool_op_get_link,
  7460. +- .get_ringparam = cfg80211_get_ringparam,
  7461. +- .set_ringparam = cfg80211_set_ringparam,
  7462. +- .get_strings = cfg80211_get_strings,
  7463. +- .get_ethtool_stats = cfg80211_get_stats,
  7464. +- .get_sset_count = cfg80211_get_sset_count,
  7465. +-};
  7466. ++EXPORT_SYMBOL(cfg80211_get_drvinfo);
  7467. +--- a/net/wireless/ethtool.h
  7468. ++++ /dev/null
  7469. +@@ -1,6 +0,0 @@
  7470. +-#ifndef __CFG80211_ETHTOOL__
  7471. +-#define __CFG80211_ETHTOOL__
  7472. +-
  7473. +-extern const struct ethtool_ops cfg80211_ethtool_ops;
  7474. +-
  7475. +-#endif /* __CFG80211_ETHTOOL__ */
  7476. +--- a/net/wireless/rdev-ops.h
  7477. ++++ b/net/wireless/rdev-ops.h
  7478. +@@ -714,25 +714,6 @@ static inline int rdev_get_antenna(struc
  7479. + return ret;
  7480. + }
  7481. - skb_queue_head_init(&pending);
  7482. +-static inline int rdev_set_ringparam(struct cfg80211_registered_device *rdev,
  7483. +- u32 tx, u32 rx)
  7484. +-{
  7485. +- int ret;
  7486. +- trace_rdev_set_ringparam(&rdev->wiphy, tx, rx);
  7487. +- ret = rdev->ops->set_ringparam(&rdev->wiphy, tx, rx);
  7488. +- trace_rdev_return_int(&rdev->wiphy, ret);
  7489. +- return ret;
  7490. +-}
  7491. +-
  7492. +-static inline void rdev_get_ringparam(struct cfg80211_registered_device *rdev,
  7493. +- u32 *tx, u32 *tx_max, u32 *rx,
  7494. +- u32 *rx_max)
  7495. +-{
  7496. +- trace_rdev_get_ringparam(&rdev->wiphy);
  7497. +- rdev->ops->get_ringparam(&rdev->wiphy, tx, tx_max, rx, rx_max);
  7498. +- trace_rdev_return_void_tx_rx(&rdev->wiphy, *tx, *tx_max, *rx, *rx_max);
  7499. +-}
  7500. +-
  7501. + static inline int
  7502. + rdev_sched_scan_start(struct cfg80211_registered_device *rdev,
  7503. + struct net_device *dev,
  7504. +@@ -816,35 +797,6 @@ static inline int rdev_set_noack_map(str
  7505. + }
  7506. -+ /* sync with ieee80211_tx_h_unicast_ps_buf */
  7507. -+ spin_lock(&sta->ps_lock);
  7508. - /* Send all buffered frames to the station */
  7509. - for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
  7510. - int count = skb_queue_len(&pending), tmp;
  7511. -@@ -1127,7 +1140,12 @@ void ieee80211_sta_ps_deliver_wakeup(str
  7512. - buffered += tmp - count;
  7513. - }
  7514. + static inline int
  7515. +-rdev_get_et_sset_count(struct cfg80211_registered_device *rdev,
  7516. +- struct net_device *dev, int sset)
  7517. +-{
  7518. +- int ret;
  7519. +- trace_rdev_get_et_sset_count(&rdev->wiphy, dev, sset);
  7520. +- ret = rdev->ops->get_et_sset_count(&rdev->wiphy, dev, sset);
  7521. +- trace_rdev_return_int(&rdev->wiphy, ret);
  7522. +- return ret;
  7523. +-}
  7524. +-
  7525. +-static inline void rdev_get_et_stats(struct cfg80211_registered_device *rdev,
  7526. +- struct net_device *dev,
  7527. +- struct ethtool_stats *stats, u64 *data)
  7528. +-{
  7529. +- trace_rdev_get_et_stats(&rdev->wiphy, dev);
  7530. +- rdev->ops->get_et_stats(&rdev->wiphy, dev, stats, data);
  7531. +- trace_rdev_return_void(&rdev->wiphy);
  7532. +-}
  7533. +-
  7534. +-static inline void rdev_get_et_strings(struct cfg80211_registered_device *rdev,
  7535. +- struct net_device *dev, u32 sset,
  7536. +- u8 *data)
  7537. +-{
  7538. +- trace_rdev_get_et_strings(&rdev->wiphy, dev, sset);
  7539. +- rdev->ops->get_et_strings(&rdev->wiphy, dev, sset, data);
  7540. +- trace_rdev_return_void(&rdev->wiphy);
  7541. +-}
  7542. +-
  7543. +-static inline int
  7544. + rdev_get_channel(struct cfg80211_registered_device *rdev,
  7545. + struct wireless_dev *wdev,
  7546. + struct cfg80211_chan_def *chandef)
  7547. +--- a/net/wireless/trace.h
  7548. ++++ b/net/wireless/trace.h
  7549. +@@ -298,11 +298,6 @@ DEFINE_EVENT(wiphy_only_evt, rdev_return
  7550. + TP_ARGS(wiphy)
  7551. + );
  7552. -- ieee80211_add_pending_skbs_fn(local, &pending, clear_sta_ps_flags, sta);
  7553. -+ ieee80211_add_pending_skbs(local, &pending);
  7554. -+ clear_sta_flag(sta, WLAN_STA_PS_DRIVER);
  7555. -+ clear_sta_flag(sta, WLAN_STA_PS_STA);
  7556. -+ spin_unlock(&sta->ps_lock);
  7557. -+
  7558. -+ atomic_dec(&ps->num_sta_ps);
  7559. +-DEFINE_EVENT(wiphy_only_evt, rdev_get_ringparam,
  7560. +- TP_PROTO(struct wiphy *wiphy),
  7561. +- TP_ARGS(wiphy)
  7562. +-);
  7563. +-
  7564. + DEFINE_EVENT(wiphy_only_evt, rdev_get_antenna,
  7565. + TP_PROTO(struct wiphy *wiphy),
  7566. + TP_ARGS(wiphy)
  7567. +@@ -580,11 +575,6 @@ DEFINE_EVENT(wiphy_netdev_evt, rdev_stop
  7568. + TP_ARGS(wiphy, netdev)
  7569. + );
  7570. - /* This station just woke up and isn't aware of our SMPS state */
  7571. - if (!ieee80211_smps_is_restrictive(sta->known_smps_mode,
  7572. ---- a/net/mac80211/sta_info.h
  7573. -+++ b/net/mac80211/sta_info.h
  7574. -@@ -267,6 +267,7 @@ struct ieee80211_tx_latency_stat {
  7575. - * @drv_unblock_wk: used for driver PS unblocking
  7576. - * @listen_interval: listen interval of this station, when we're acting as AP
  7577. - * @_flags: STA flags, see &enum ieee80211_sta_info_flags, do not use directly
  7578. -+ * @ps_lock: used for powersave (when mac80211 is the AP) related locking
  7579. - * @ps_tx_buf: buffers (per AC) of frames to transmit to this station
  7580. - * when it leaves power saving state or polls
  7581. - * @tx_filtered: buffers (per AC) of frames we already tried to
  7582. -@@ -356,10 +357,8 @@ struct sta_info {
  7583. - /* use the accessors defined below */
  7584. - unsigned long _flags;
  7585. -
  7586. -- /*
  7587. -- * STA powersave frame queues, no more than the internal
  7588. -- * locking required.
  7589. -- */
  7590. -+ /* STA powersave lock and frame queues */
  7591. -+ spinlock_t ps_lock;
  7592. - struct sk_buff_head ps_tx_buf[IEEE80211_NUM_ACS];
  7593. - struct sk_buff_head tx_filtered[IEEE80211_NUM_ACS];
  7594. - unsigned long driver_buffered_tids;
  7595. ---- a/net/mac80211/util.c
  7596. -+++ b/net/mac80211/util.c
  7597. -@@ -435,9 +435,8 @@ void ieee80211_add_pending_skb(struct ie
  7598. - spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
  7599. - }
  7600. +-DEFINE_EVENT(wiphy_netdev_evt, rdev_get_et_stats,
  7601. +- TP_PROTO(struct wiphy *wiphy, struct net_device *netdev),
  7602. +- TP_ARGS(wiphy, netdev)
  7603. +-);
  7604. +-
  7605. + DEFINE_EVENT(wiphy_netdev_evt, rdev_sched_scan_stop,
  7606. + TP_PROTO(struct wiphy *wiphy, struct net_device *netdev),
  7607. + TP_ARGS(wiphy, netdev)
  7608. +@@ -1439,11 +1429,6 @@ DECLARE_EVENT_CLASS(tx_rx_evt,
  7609. + WIPHY_PR_ARG, __entry->tx, __entry->rx)
  7610. + );
  7611. --void ieee80211_add_pending_skbs_fn(struct ieee80211_local *local,
  7612. -- struct sk_buff_head *skbs,
  7613. -- void (*fn)(void *data), void *data)
  7614. -+void ieee80211_add_pending_skbs(struct ieee80211_local *local,
  7615. -+ struct sk_buff_head *skbs)
  7616. - {
  7617. - struct ieee80211_hw *hw = &local->hw;
  7618. - struct sk_buff *skb;
  7619. -@@ -461,9 +460,6 @@ void ieee80211_add_pending_skbs_fn(struc
  7620. - __skb_queue_tail(&local->pending[queue], skb);
  7621. - }
  7622. +-DEFINE_EVENT(tx_rx_evt, rdev_set_ringparam,
  7623. +- TP_PROTO(struct wiphy *wiphy, u32 tx, u32 rx),
  7624. +- TP_ARGS(wiphy, rx, tx)
  7625. +-);
  7626. +-
  7627. + DEFINE_EVENT(tx_rx_evt, rdev_set_antenna,
  7628. + TP_PROTO(struct wiphy *wiphy, u32 tx, u32 rx),
  7629. + TP_ARGS(wiphy, rx, tx)
  7630. +@@ -1725,40 +1710,6 @@ TRACE_EVENT(rdev_set_noack_map,
  7631. + WIPHY_PR_ARG, NETDEV_PR_ARG, __entry->noack_map)
  7632. + );
  7633. -- if (fn)
  7634. -- fn(data);
  7635. +-TRACE_EVENT(rdev_get_et_sset_count,
  7636. +- TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, int sset),
  7637. +- TP_ARGS(wiphy, netdev, sset),
  7638. +- TP_STRUCT__entry(
  7639. +- WIPHY_ENTRY
  7640. +- NETDEV_ENTRY
  7641. +- __field(int, sset)
  7642. +- ),
  7643. +- TP_fast_assign(
  7644. +- WIPHY_ASSIGN;
  7645. +- NETDEV_ASSIGN;
  7646. +- __entry->sset = sset;
  7647. +- ),
  7648. +- TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", sset: %d",
  7649. +- WIPHY_PR_ARG, NETDEV_PR_ARG, __entry->sset)
  7650. +-);
  7651. -
  7652. - for (i = 0; i < hw->queues; i++)
  7653. - __ieee80211_wake_queue(hw, i,
  7654. - IEEE80211_QUEUE_STOP_REASON_SKB_ADD);
  7655. ---- a/net/wireless/reg.c
  7656. -+++ b/net/wireless/reg.c
  7657. -@@ -1700,7 +1700,7 @@ static void reg_process_hint(struct regu
  7658. - return;
  7659. - case NL80211_REGDOM_SET_BY_USER:
  7660. - treatment = reg_process_hint_user(reg_request);
  7661. -- if (treatment == REG_REQ_OK ||
  7662. -+ if (treatment == REG_REQ_IGNORE ||
  7663. - treatment == REG_REQ_ALREADY_SET)
  7664. - return;
  7665. - schedule_delayed_work(&reg_timeout, msecs_to_jiffies(3142));
  7666. ---- a/drivers/net/wireless/ath/ath9k/debug.c
  7667. -+++ b/drivers/net/wireless/ath/ath9k/debug.c
  7668. -@@ -138,43 +138,41 @@ static ssize_t read_file_ani(struct file
  7669. - unsigned int len = 0, size = 1024;
  7670. - ssize_t retval = 0;
  7671. - char *buf;
  7672. -+ int i;
  7673. -+ struct {
  7674. -+ const char *name;
  7675. -+ unsigned int val;
  7676. -+ } ani_info[] = {
  7677. -+ { "ANI RESET", ah->stats.ast_ani_reset },
  7678. -+ { "OFDM LEVEL", ah->ani.ofdmNoiseImmunityLevel },
  7679. -+ { "CCK LEVEL", ah->ani.cckNoiseImmunityLevel },
  7680. -+ { "SPUR UP", ah->stats.ast_ani_spurup },
  7681. -+ { "SPUR DOWN", ah->stats.ast_ani_spurup },
  7682. -+ { "OFDM WS-DET ON", ah->stats.ast_ani_ofdmon },
  7683. -+ { "OFDM WS-DET OFF", ah->stats.ast_ani_ofdmoff },
  7684. -+ { "MRC-CCK ON", ah->stats.ast_ani_ccklow },
  7685. -+ { "MRC-CCK OFF", ah->stats.ast_ani_cckhigh },
  7686. -+ { "FIR-STEP UP", ah->stats.ast_ani_stepup },
  7687. -+ { "FIR-STEP DOWN", ah->stats.ast_ani_stepdown },
  7688. -+ { "INV LISTENTIME", ah->stats.ast_ani_lneg_or_lzero },
  7689. -+ { "OFDM ERRORS", ah->stats.ast_ani_ofdmerrs },
  7690. -+ { "CCK ERRORS", ah->stats.ast_ani_cckerrs },
  7691. -+ };
  7692. -
  7693. - buf = kzalloc(size, GFP_KERNEL);
  7694. - if (buf == NULL)
  7695. - return -ENOMEM;
  7696. -
  7697. -- if (common->disable_ani) {
  7698. -- len += scnprintf(buf + len, size - len, "%s: %s\n",
  7699. -- "ANI", "DISABLED");
  7700. -+ len += scnprintf(buf + len, size - len, "%15s: %s\n", "ANI",
  7701. -+ common->disable_ani ? "DISABLED" : "ENABLED");
  7702. +-TRACE_EVENT(rdev_get_et_strings,
  7703. +- TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, u32 sset),
  7704. +- TP_ARGS(wiphy, netdev, sset),
  7705. +- TP_STRUCT__entry(
  7706. +- WIPHY_ENTRY
  7707. +- NETDEV_ENTRY
  7708. +- __field(u32, sset)
  7709. +- ),
  7710. +- TP_fast_assign(
  7711. +- WIPHY_ASSIGN;
  7712. +- NETDEV_ASSIGN;
  7713. +- __entry->sset = sset;
  7714. +- ),
  7715. +- TP_printk(WIPHY_PR_FMT ", " NETDEV_PR_FMT ", sset: %u",
  7716. +- WIPHY_PR_ARG, NETDEV_PR_ARG, __entry->sset)
  7717. +-);
  7718. +-
  7719. + DEFINE_EVENT(wiphy_wdev_evt, rdev_get_channel,
  7720. + TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev),
  7721. + TP_ARGS(wiphy, wdev)
  7722. +--- /dev/null
  7723. ++++ b/net/mac80211/ethtool.c
  7724. +@@ -0,0 +1,244 @@
  7725. ++/*
  7726. ++ * mac80211 ethtool hooks for cfg80211
  7727. ++ *
  7728. ++ * Copied from cfg.c - originally
  7729. ++ * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net>
  7730. ++ * Copyright 2014 Intel Corporation (Author: Johannes Berg)
  7731. ++ *
  7732. ++ * This file is GPLv2 as found in COPYING.
  7733. ++ */
  7734. ++#include <linux/types.h>
  7735. ++#include <net/cfg80211.h>
  7736. ++#include "ieee80211_i.h"
  7737. ++#include "sta_info.h"
  7738. ++#include "driver-ops.h"
  7739. ++
  7740. ++static int ieee80211_set_ringparam(struct net_device *dev,
  7741. ++ struct ethtool_ringparam *rp)
  7742. ++{
  7743. ++ struct ieee80211_local *local = wiphy_priv(dev->ieee80211_ptr->wiphy);
  7744. +
  7745. -+ if (common->disable_ani)
  7746. - goto exit;
  7747. -- }
  7748. -
  7749. -- len += scnprintf(buf + len, size - len, "%15s: %s\n",
  7750. -- "ANI", "ENABLED");
  7751. -- len += scnprintf(buf + len, size - len, "%15s: %u\n",
  7752. -- "ANI RESET", ah->stats.ast_ani_reset);
  7753. -- len += scnprintf(buf + len, size - len, "%15s: %u\n",
  7754. -- "SPUR UP", ah->stats.ast_ani_spurup);
  7755. -- len += scnprintf(buf + len, size - len, "%15s: %u\n",
  7756. -- "SPUR DOWN", ah->stats.ast_ani_spurup);
  7757. -- len += scnprintf(buf + len, size - len, "%15s: %u\n",
  7758. -- "OFDM WS-DET ON", ah->stats.ast_ani_ofdmon);
  7759. -- len += scnprintf(buf + len, size - len, "%15s: %u\n",
  7760. -- "OFDM WS-DET OFF", ah->stats.ast_ani_ofdmoff);
  7761. -- len += scnprintf(buf + len, size - len, "%15s: %u\n",
  7762. -- "MRC-CCK ON", ah->stats.ast_ani_ccklow);
  7763. -- len += scnprintf(buf + len, size - len, "%15s: %u\n",
  7764. -- "MRC-CCK OFF", ah->stats.ast_ani_cckhigh);
  7765. -- len += scnprintf(buf + len, size - len, "%15s: %u\n",
  7766. -- "FIR-STEP UP", ah->stats.ast_ani_stepup);
  7767. -- len += scnprintf(buf + len, size - len, "%15s: %u\n",
  7768. -- "FIR-STEP DOWN", ah->stats.ast_ani_stepdown);
  7769. -- len += scnprintf(buf + len, size - len, "%15s: %u\n",
  7770. -- "INV LISTENTIME", ah->stats.ast_ani_lneg_or_lzero);
  7771. -- len += scnprintf(buf + len, size - len, "%15s: %u\n",
  7772. -- "OFDM ERRORS", ah->stats.ast_ani_ofdmerrs);
  7773. -- len += scnprintf(buf + len, size - len, "%15s: %u\n",
  7774. -- "CCK ERRORS", ah->stats.ast_ani_cckerrs);
  7775. -+ for (i = 0; i < ARRAY_SIZE(ani_info); i++)
  7776. -+ len += scnprintf(buf + len, size - len, "%15s: %u\n",
  7777. -+ ani_info[i].name, ani_info[i].val);
  7778. ++ if (rp->rx_mini_pending != 0 || rp->rx_jumbo_pending != 0)
  7779. ++ return -EINVAL;
  7780. +
  7781. - exit:
  7782. - if (len > size)
  7783. - len = size;
  7784. -@@ -866,6 +864,12 @@ static ssize_t read_file_reset(struct fi
  7785. - "%17s: %2d\n", "PLL RX Hang",
  7786. - sc->debug.stats.reset[RESET_TYPE_PLL_HANG]);
  7787. - len += scnprintf(buf + len, sizeof(buf) - len,
  7788. -+ "%17s: %2d\n", "MAC Hang",
  7789. -+ sc->debug.stats.reset[RESET_TYPE_MAC_HANG]);
  7790. -+ len += scnprintf(buf + len, sizeof(buf) - len,
  7791. -+ "%17s: %2d\n", "Stuck Beacon",
  7792. -+ sc->debug.stats.reset[RESET_TYPE_BEACON_STUCK]);
  7793. -+ len += scnprintf(buf + len, sizeof(buf) - len,
  7794. - "%17s: %2d\n", "MCI Reset",
  7795. - sc->debug.stats.reset[RESET_TYPE_MCI]);
  7796. -
  7797. ---- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
  7798. -+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
  7799. -@@ -868,10 +868,6 @@ static void ar9003_hw_set_rfmode(struct
  7800. -
  7801. - if (IS_CHAN_A_FAST_CLOCK(ah, chan))
  7802. - rfMode |= (AR_PHY_MODE_DYNAMIC | AR_PHY_MODE_DYN_CCK_DISABLE);
  7803. -- if (IS_CHAN_QUARTER_RATE(chan))
  7804. -- rfMode |= AR_PHY_MODE_QUARTER;
  7805. -- if (IS_CHAN_HALF_RATE(chan))
  7806. -- rfMode |= AR_PHY_MODE_HALF;
  7807. -
  7808. - if (rfMode & (AR_PHY_MODE_QUARTER | AR_PHY_MODE_HALF))
  7809. - REG_RMW_FIELD(ah, AR_PHY_FRAME_CTL,
  7810. ---- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c
  7811. -+++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c
  7812. -@@ -706,6 +706,7 @@ ath5k_get_survey(struct ieee80211_hw *hw
  7813. - survey->channel = conf->chandef.chan;
  7814. - survey->noise = ah->ah_noise_floor;
  7815. - survey->filled = SURVEY_INFO_NOISE_DBM |
  7816. -+ SURVEY_INFO_IN_USE |
  7817. - SURVEY_INFO_CHANNEL_TIME |
  7818. - SURVEY_INFO_CHANNEL_TIME_BUSY |
  7819. - SURVEY_INFO_CHANNEL_TIME_RX |
  7820. ---- a/drivers/net/wireless/ath/ath9k/recv.c
  7821. -+++ b/drivers/net/wireless/ath/ath9k/recv.c
  7822. -@@ -732,11 +732,18 @@ static struct ath_rxbuf *ath_get_next_rx
  7823. - return NULL;
  7824. -
  7825. - /*
  7826. -- * mark descriptor as zero-length and set the 'more'
  7827. -- * flag to ensure that both buffers get discarded
  7828. -+ * Re-check previous descriptor, in case it has been filled
  7829. -+ * in the mean time.
  7830. - */
  7831. -- rs->rs_datalen = 0;
  7832. -- rs->rs_more = true;
  7833. -+ ret = ath9k_hw_rxprocdesc(ah, ds, rs);
  7834. -+ if (ret == -EINPROGRESS) {
  7835. -+ /*
  7836. -+ * mark descriptor as zero-length and set the 'more'
  7837. -+ * flag to ensure that both buffers get discarded
  7838. -+ */
  7839. -+ rs->rs_datalen = 0;
  7840. -+ rs->rs_more = true;
  7841. -+ }
  7842. - }
  7843. -
  7844. - list_del(&bf->list);
  7845. -@@ -985,32 +992,32 @@ static int ath9k_rx_skb_preprocess(struc
  7846. - struct ath_common *common = ath9k_hw_common(ah);
  7847. - struct ieee80211_hdr *hdr;
  7848. - bool discard_current = sc->rx.discard_next;
  7849. -- int ret = 0;
  7850. -
  7851. - /*
  7852. - * Discard corrupt descriptors which are marked in
  7853. - * ath_get_next_rx_buf().
  7854. - */
  7855. -- sc->rx.discard_next = rx_stats->rs_more;
  7856. - if (discard_current)
  7857. -- return -EINVAL;
  7858. -+ goto corrupt;
  7859. ++ return drv_set_ringparam(local, rp->tx_pending, rp->rx_pending);
  7860. ++}
  7861. +
  7862. -+ sc->rx.discard_next = false;
  7863. -
  7864. - /*
  7865. - * Discard zero-length packets.
  7866. - */
  7867. - if (!rx_stats->rs_datalen) {
  7868. - RX_STAT_INC(rx_len_err);
  7869. -- return -EINVAL;
  7870. -+ goto corrupt;
  7871. - }
  7872. -
  7873. -- /*
  7874. -- * rs_status follows rs_datalen so if rs_datalen is too large
  7875. -- * we can take a hint that hardware corrupted it, so ignore
  7876. -- * those frames.
  7877. -- */
  7878. -+ /*
  7879. -+ * rs_status follows rs_datalen so if rs_datalen is too large
  7880. -+ * we can take a hint that hardware corrupted it, so ignore
  7881. -+ * those frames.
  7882. ++static void ieee80211_get_ringparam(struct net_device *dev,
  7883. ++ struct ethtool_ringparam *rp)
  7884. ++{
  7885. ++ struct ieee80211_local *local = wiphy_priv(dev->ieee80211_ptr->wiphy);
  7886. ++
  7887. ++ memset(rp, 0, sizeof(*rp));
  7888. ++
  7889. ++ drv_get_ringparam(local, &rp->tx_pending, &rp->tx_max_pending,
  7890. ++ &rp->rx_pending, &rp->rx_max_pending);
  7891. ++}
  7892. ++
  7893. ++static const char ieee80211_gstrings_sta_stats[][ETH_GSTRING_LEN] = {
  7894. ++ "rx_packets", "rx_bytes",
  7895. ++ "rx_duplicates", "rx_fragments", "rx_dropped",
  7896. ++ "tx_packets", "tx_bytes", "tx_fragments",
  7897. ++ "tx_filtered", "tx_retry_failed", "tx_retries",
  7898. ++ "beacon_loss", "sta_state", "txrate", "rxrate", "signal",
  7899. ++ "channel", "noise", "ch_time", "ch_time_busy",
  7900. ++ "ch_time_ext_busy", "ch_time_rx", "ch_time_tx"
  7901. ++};
  7902. ++#define STA_STATS_LEN ARRAY_SIZE(ieee80211_gstrings_sta_stats)
  7903. ++
  7904. ++static int ieee80211_get_sset_count(struct net_device *dev, int sset)
  7905. ++{
  7906. ++ struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  7907. ++ int rv = 0;
  7908. ++
  7909. ++ if (sset == ETH_SS_STATS)
  7910. ++ rv += STA_STATS_LEN;
  7911. ++
  7912. ++ rv += drv_get_et_sset_count(sdata, sset);
  7913. ++
  7914. ++ if (rv == 0)
  7915. ++ return -EOPNOTSUPP;
  7916. ++ return rv;
  7917. ++}
  7918. ++
  7919. ++static void ieee80211_get_stats(struct net_device *dev,
  7920. ++ struct ethtool_stats *stats,
  7921. ++ u64 *data)
  7922. ++{
  7923. ++ struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  7924. ++ struct ieee80211_chanctx_conf *chanctx_conf;
  7925. ++ struct ieee80211_channel *channel;
  7926. ++ struct sta_info *sta;
  7927. ++ struct ieee80211_local *local = sdata->local;
  7928. ++ struct station_info sinfo;
  7929. ++ struct survey_info survey;
  7930. ++ int i, q;
  7931. ++#define STA_STATS_SURVEY_LEN 7
  7932. ++
  7933. ++ memset(data, 0, sizeof(u64) * STA_STATS_LEN);
  7934. ++
  7935. ++#define ADD_STA_STATS(sta) \
  7936. ++ do { \
  7937. ++ data[i++] += sta->rx_packets; \
  7938. ++ data[i++] += sta->rx_bytes; \
  7939. ++ data[i++] += sta->num_duplicates; \
  7940. ++ data[i++] += sta->rx_fragments; \
  7941. ++ data[i++] += sta->rx_dropped; \
  7942. ++ \
  7943. ++ data[i++] += sinfo.tx_packets; \
  7944. ++ data[i++] += sinfo.tx_bytes; \
  7945. ++ data[i++] += sta->tx_fragments; \
  7946. ++ data[i++] += sta->tx_filtered_count; \
  7947. ++ data[i++] += sta->tx_retry_failed; \
  7948. ++ data[i++] += sta->tx_retry_count; \
  7949. ++ data[i++] += sta->beacon_loss_count; \
  7950. ++ } while (0)
  7951. ++
  7952. ++ /* For Managed stations, find the single station based on BSSID
  7953. ++ * and use that. For interface types, iterate through all available
  7954. ++ * stations and add stats for any station that is assigned to this
  7955. ++ * network device.
  7956. + */
  7957. - if (rx_stats->rs_datalen > (common->rx_bufsize - ah->caps.rx_status_len)) {
  7958. - RX_STAT_INC(rx_len_err);
  7959. -- return -EINVAL;
  7960. -+ goto corrupt;
  7961. ++
  7962. ++ mutex_lock(&local->sta_mtx);
  7963. ++
  7964. ++ if (sdata->vif.type == NL80211_IFTYPE_STATION) {
  7965. ++ sta = sta_info_get_bss(sdata, sdata->u.mgd.bssid);
  7966. ++
  7967. ++ if (!(sta && !WARN_ON(sta->sdata->dev != dev)))
  7968. ++ goto do_survey;
  7969. ++
  7970. ++ sinfo.filled = 0;
  7971. ++ sta_set_sinfo(sta, &sinfo);
  7972. ++
  7973. ++ i = 0;
  7974. ++ ADD_STA_STATS(sta);
  7975. ++
  7976. ++ data[i++] = sta->sta_state;
  7977. ++
  7978. ++
  7979. ++ if (sinfo.filled & STATION_INFO_TX_BITRATE)
  7980. ++ data[i] = 100000 *
  7981. ++ cfg80211_calculate_bitrate(&sinfo.txrate);
  7982. ++ i++;
  7983. ++ if (sinfo.filled & STATION_INFO_RX_BITRATE)
  7984. ++ data[i] = 100000 *
  7985. ++ cfg80211_calculate_bitrate(&sinfo.rxrate);
  7986. ++ i++;
  7987. ++
  7988. ++ if (sinfo.filled & STATION_INFO_SIGNAL_AVG)
  7989. ++ data[i] = (u8)sinfo.signal_avg;
  7990. ++ i++;
  7991. ++ } else {
  7992. ++ list_for_each_entry(sta, &local->sta_list, list) {
  7993. ++ /* Make sure this station belongs to the proper dev */
  7994. ++ if (sta->sdata->dev != dev)
  7995. ++ continue;
  7996. ++
  7997. ++ sinfo.filled = 0;
  7998. ++ sta_set_sinfo(sta, &sinfo);
  7999. ++ i = 0;
  8000. ++ ADD_STA_STATS(sta);
  8001. ++ }
  8002. ++ }
  8003. ++
  8004. ++do_survey:
  8005. ++ i = STA_STATS_LEN - STA_STATS_SURVEY_LEN;
  8006. ++ /* Get survey stats for current channel */
  8007. ++ survey.filled = 0;
  8008. ++
  8009. ++ rcu_read_lock();
  8010. ++ chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
  8011. ++ if (chanctx_conf)
  8012. ++ channel = chanctx_conf->def.chan;
  8013. ++ else
  8014. ++ channel = NULL;
  8015. ++ rcu_read_unlock();
  8016. ++
  8017. ++ if (channel) {
  8018. ++ q = 0;
  8019. ++ do {
  8020. ++ survey.filled = 0;
  8021. ++ if (drv_get_survey(local, q, &survey) != 0) {
  8022. ++ survey.filled = 0;
  8023. ++ break;
  8024. ++ }
  8025. ++ q++;
  8026. ++ } while (channel != survey.channel);
  8027. ++ }
  8028. ++
  8029. ++ if (survey.filled)
  8030. ++ data[i++] = survey.channel->center_freq;
  8031. ++ else
  8032. ++ data[i++] = 0;
  8033. ++ if (survey.filled & SURVEY_INFO_NOISE_DBM)
  8034. ++ data[i++] = (u8)survey.noise;
  8035. ++ else
  8036. ++ data[i++] = -1LL;
  8037. ++ if (survey.filled & SURVEY_INFO_CHANNEL_TIME)
  8038. ++ data[i++] = survey.channel_time;
  8039. ++ else
  8040. ++ data[i++] = -1LL;
  8041. ++ if (survey.filled & SURVEY_INFO_CHANNEL_TIME_BUSY)
  8042. ++ data[i++] = survey.channel_time_busy;
  8043. ++ else
  8044. ++ data[i++] = -1LL;
  8045. ++ if (survey.filled & SURVEY_INFO_CHANNEL_TIME_EXT_BUSY)
  8046. ++ data[i++] = survey.channel_time_ext_busy;
  8047. ++ else
  8048. ++ data[i++] = -1LL;
  8049. ++ if (survey.filled & SURVEY_INFO_CHANNEL_TIME_RX)
  8050. ++ data[i++] = survey.channel_time_rx;
  8051. ++ else
  8052. ++ data[i++] = -1LL;
  8053. ++ if (survey.filled & SURVEY_INFO_CHANNEL_TIME_TX)
  8054. ++ data[i++] = survey.channel_time_tx;
  8055. ++ else
  8056. ++ data[i++] = -1LL;
  8057. ++
  8058. ++ mutex_unlock(&local->sta_mtx);
  8059. ++
  8060. ++ if (WARN_ON(i != STA_STATS_LEN))
  8061. ++ return;
  8062. ++
  8063. ++ drv_get_et_stats(sdata, stats, &(data[STA_STATS_LEN]));
  8064. ++}
  8065. ++
  8066. ++static void ieee80211_get_strings(struct net_device *dev, u32 sset, u8 *data)
  8067. ++{
  8068. ++ struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
  8069. ++ int sz_sta_stats = 0;
  8070. ++
  8071. ++ if (sset == ETH_SS_STATS) {
  8072. ++ sz_sta_stats = sizeof(ieee80211_gstrings_sta_stats);
  8073. ++ memcpy(data, ieee80211_gstrings_sta_stats, sz_sta_stats);
  8074. ++ }
  8075. ++ drv_get_et_strings(sdata, sset, &(data[sz_sta_stats]));
  8076. ++}
  8077. ++
  8078. ++static int ieee80211_get_regs_len(struct net_device *dev)
  8079. ++{
  8080. ++ return 0;
  8081. ++}
  8082. ++
  8083. ++static void ieee80211_get_regs(struct net_device *dev,
  8084. ++ struct ethtool_regs *regs,
  8085. ++ void *data)
  8086. ++{
  8087. ++ struct wireless_dev *wdev = dev->ieee80211_ptr;
  8088. ++
  8089. ++ regs->version = wdev->wiphy->hw_version;
  8090. ++ regs->len = 0;
  8091. ++}
  8092. ++
  8093. ++const struct ethtool_ops ieee80211_ethtool_ops = {
  8094. ++ .get_drvinfo = cfg80211_get_drvinfo,
  8095. ++ .get_regs_len = ieee80211_get_regs_len,
  8096. ++ .get_regs = ieee80211_get_regs,
  8097. ++ .get_link = ethtool_op_get_link,
  8098. ++ .get_ringparam = ieee80211_get_ringparam,
  8099. ++ .set_ringparam = ieee80211_set_ringparam,
  8100. ++ .get_strings = ieee80211_get_strings,
  8101. ++ .get_ethtool_stats = ieee80211_get_stats,
  8102. ++ .get_sset_count = ieee80211_get_sset_count,
  8103. ++};
  8104. +--- a/net/mac80211/ibss.c
  8105. ++++ b/net/mac80211/ibss.c
  8106. +@@ -143,7 +143,7 @@ ieee80211_ibss_build_presp(struct ieee80
  8107. + *pos++ = csa_settings->block_tx ? 1 : 0;
  8108. + *pos++ = ieee80211_frequency_to_channel(
  8109. + csa_settings->chandef.chan->center_freq);
  8110. +- sdata->csa_counter_offset_beacon[0] = (pos - presp->head);
  8111. ++ presp->csa_counter_offsets[0] = (pos - presp->head);
  8112. + *pos++ = csa_settings->count;
  8113. }
  8114. - /* Only use status info from the last fragment */
  8115. -@@ -1024,10 +1031,8 @@ static int ath9k_rx_skb_preprocess(struc
  8116. - * This is different from the other corrupt descriptor
  8117. - * condition handled above.
  8118. - */
  8119. -- if (rx_stats->rs_status & ATH9K_RXERR_CORRUPT_DESC) {
  8120. -- ret = -EINVAL;
  8121. -- goto exit;
  8122. -- }
  8123. -+ if (rx_stats->rs_status & ATH9K_RXERR_CORRUPT_DESC)
  8124. -+ goto corrupt;
  8125. -
  8126. - hdr = (struct ieee80211_hdr *) (skb->data + ah->caps.rx_status_len);
  8127. -
  8128. -@@ -1043,18 +1048,15 @@ static int ath9k_rx_skb_preprocess(struc
  8129. - if (ath_process_fft(sc, hdr, rx_stats, rx_status->mactime))
  8130. - RX_STAT_INC(rx_spectral);
  8131. +@@ -1677,6 +1677,7 @@ int ieee80211_ibss_join(struct ieee80211
  8132. + sdata->u.ibss.control_port = params->control_port;
  8133. + sdata->u.ibss.userspace_handles_dfs = params->userspace_handles_dfs;
  8134. + sdata->u.ibss.basic_rates = params->basic_rates;
  8135. ++ sdata->u.ibss.last_scan_completed = jiffies;
  8136. -- ret = -EINVAL;
  8137. -- goto exit;
  8138. -+ return -EINVAL;
  8139. + /* fix basic_rates if channel does not support these rates */
  8140. + rate_flags = ieee80211_chandef_rate_flags(&params->chandef);
  8141. +--- a/net/mac80211/mesh.c
  8142. ++++ b/net/mac80211/mesh.c
  8143. +@@ -679,7 +679,7 @@ ieee80211_mesh_build_beacon(struct ieee8
  8144. + *pos++ = 0x0;
  8145. + *pos++ = ieee80211_frequency_to_channel(
  8146. + csa->settings.chandef.chan->center_freq);
  8147. +- sdata->csa_counter_offset_beacon[0] = hdr_len + 6;
  8148. ++ bcn->csa_counter_offsets[0] = hdr_len + 6;
  8149. + *pos++ = csa->settings.count;
  8150. + *pos++ = WLAN_EID_CHAN_SWITCH_PARAM;
  8151. + *pos++ = 6;
  8152. +--- a/net/wireless/genregdb.awk
  8153. ++++ b/net/wireless/genregdb.awk
  8154. +@@ -65,17 +65,7 @@ function parse_reg_rule()
  8155. + sub(/,/, "", units)
  8156. + dfs_cac = $9
  8157. + if (units == "mW") {
  8158. +- if (power == 100) {
  8159. +- power = 20
  8160. +- } else if (power == 200) {
  8161. +- power = 23
  8162. +- } else if (power == 500) {
  8163. +- power = 27
  8164. +- } else if (power == 1000) {
  8165. +- power = 30
  8166. +- } else {
  8167. +- print "Unknown power value in database!"
  8168. +- }
  8169. ++ power = 10 * log(power)/log(10)
  8170. + } else {
  8171. + dfs_cac = $8
  8172. }
  8173. +@@ -114,7 +104,7 @@ function parse_reg_rule()
  8174. - /*
  8175. - * everything but the rate is checked here, the rate check is done
  8176. - * separately to avoid doing two lookups for a rate for each frame.
  8177. - */
  8178. -- if (!ath9k_rx_accept(common, hdr, rx_status, rx_stats, decrypt_error)) {
  8179. -- ret = -EINVAL;
  8180. -- goto exit;
  8181. -- }
  8182. -+ if (!ath9k_rx_accept(common, hdr, rx_status, rx_stats, decrypt_error))
  8183. -+ return -EINVAL;
  8184. -
  8185. - if (ath_is_mybeacon(common, hdr)) {
  8186. - RX_STAT_INC(rx_beacons);
  8187. -@@ -1064,15 +1066,11 @@ static int ath9k_rx_skb_preprocess(struc
  8188. - /*
  8189. - * This shouldn't happen, but have a safety check anyway.
  8190. - */
  8191. -- if (WARN_ON(!ah->curchan)) {
  8192. -- ret = -EINVAL;
  8193. -- goto exit;
  8194. -- }
  8195. -+ if (WARN_ON(!ah->curchan))
  8196. -+ return -EINVAL;
  8197. -
  8198. -- if (ath9k_process_rate(common, hw, rx_stats, rx_status)) {
  8199. -- ret =-EINVAL;
  8200. -- goto exit;
  8201. -- }
  8202. -+ if (ath9k_process_rate(common, hw, rx_stats, rx_status))
  8203. -+ return -EINVAL;
  8204. -
  8205. - ath9k_process_rssi(common, hw, rx_stats, rx_status);
  8206. + }
  8207. + flags = flags "0"
  8208. +- printf "\t\tREG_RULE_EXT(%d, %d, %d, %d, %d, %d, %s),\n", start, end, bw, gain, power, dfs_cac, flags
  8209. ++ printf "\t\tREG_RULE_EXT(%d, %d, %d, %d, %.0f, %d, %s),\n", start, end, bw, gain, power, dfs_cac, flags
  8210. + rules++
  8211. + }
  8212. -@@ -1087,9 +1085,11 @@ static int ath9k_rx_skb_preprocess(struc
  8213. - sc->rx.num_pkts++;
  8214. - #endif
  8215. +--- a/net/mac80211/debugfs_netdev.c
  8216. ++++ b/net/mac80211/debugfs_netdev.c
  8217. +@@ -34,8 +34,7 @@ static ssize_t ieee80211_if_read(
  8218. + ssize_t ret = -EINVAL;
  8219. --exit:
  8220. -- sc->rx.discard_next = false;
  8221. -- return ret;
  8222. -+ return 0;
  8223. -+
  8224. -+corrupt:
  8225. -+ sc->rx.discard_next = rx_stats->rs_more;
  8226. -+ return -EINVAL;
  8227. - }
  8228. + read_lock(&dev_base_lock);
  8229. +- if (sdata->dev->reg_state == NETREG_REGISTERED)
  8230. +- ret = (*format)(sdata, buf, sizeof(buf));
  8231. ++ ret = (*format)(sdata, buf, sizeof(buf));
  8232. + read_unlock(&dev_base_lock);
  8233. - static void ath9k_rx_skb_postprocess(struct ath_common *common,
  8234. ---- a/drivers/net/wireless/ath/ath9k/ani.c
  8235. -+++ b/drivers/net/wireless/ath/ath9k/ani.c
  8236. -@@ -176,16 +176,26 @@ static void ath9k_hw_set_ofdm_nil(struct
  8237. - if (ah->opmode == NL80211_IFTYPE_STATION &&
  8238. - BEACON_RSSI(ah) <= ATH9K_ANI_RSSI_THR_HIGH)
  8239. - weak_sig = true;
  8240. --
  8241. - /*
  8242. -- * OFDM Weak signal detection is always enabled for AP mode.
  8243. -+ * Newer chipsets are better at dealing with high PHY error counts -
  8244. -+ * keep weak signal detection enabled when no RSSI threshold is
  8245. -+ * available to determine if it is needed (mode != STA)
  8246. - */
  8247. -- if (ah->opmode != NL80211_IFTYPE_AP &&
  8248. -- aniState->ofdmWeakSigDetect != weak_sig) {
  8249. -- ath9k_hw_ani_control(ah,
  8250. -- ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
  8251. -- entry_ofdm->ofdm_weak_signal_on);
  8252. -- }
  8253. -+ else if (AR_SREV_9300_20_OR_LATER(ah) &&
  8254. -+ ah->opmode != NL80211_IFTYPE_STATION)
  8255. -+ weak_sig = true;
  8256. -+
  8257. -+ /* Older chipsets are more sensitive to high PHY error counts */
  8258. -+ else if (!AR_SREV_9300_20_OR_LATER(ah) &&
  8259. -+ aniState->ofdmNoiseImmunityLevel >= 8)
  8260. -+ weak_sig = false;
  8261. -+
  8262. -+ if (aniState->ofdmWeakSigDetect != weak_sig)
  8263. -+ ath9k_hw_ani_control(ah, ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION,
  8264. -+ weak_sig);
  8265. -+
  8266. -+ if (!AR_SREV_9300_20_OR_LATER(ah))
  8267. -+ return;
  8268. + if (ret >= 0)
  8269. +@@ -62,8 +61,7 @@ static ssize_t ieee80211_if_write(
  8270. - if (aniState->ofdmNoiseImmunityLevel >= ATH9K_ANI_OFDM_DEF_LEVEL) {
  8271. - ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH;
  8272. -@@ -308,17 +318,6 @@ void ath9k_ani_reset(struct ath_hw *ah,
  8273. - BUG_ON(aniState == NULL);
  8274. - ah->stats.ast_ani_reset++;
  8275. -
  8276. -- /* only allow a subset of functions in AP mode */
  8277. -- if (ah->opmode == NL80211_IFTYPE_AP) {
  8278. -- if (IS_CHAN_2GHZ(chan)) {
  8279. -- ah->ani_function = (ATH9K_ANI_SPUR_IMMUNITY_LEVEL |
  8280. -- ATH9K_ANI_FIRSTEP_LEVEL);
  8281. -- if (AR_SREV_9300_20_OR_LATER(ah))
  8282. -- ah->ani_function |= ATH9K_ANI_MRC_CCK;
  8283. -- } else
  8284. -- ah->ani_function = 0;
  8285. -- }
  8286. --
  8287. - ofdm_nil = max_t(int, ATH9K_ANI_OFDM_DEF_LEVEL,
  8288. - aniState->ofdmNoiseImmunityLevel);
  8289. - cck_nil = max_t(int, ATH9K_ANI_CCK_DEF_LEVEL,
  8290. -@@ -483,10 +482,17 @@ void ath9k_hw_ani_init(struct ath_hw *ah
  8291. -
  8292. - ath_dbg(common, ANI, "Initialize ANI\n");
  8293. -
  8294. -- ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH;
  8295. -- ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW;
  8296. -- ah->config.cck_trig_high = ATH9K_ANI_CCK_TRIG_HIGH;
  8297. -- ah->config.cck_trig_low = ATH9K_ANI_CCK_TRIG_LOW;
  8298. -+ if (AR_SREV_9300_20_OR_LATER(ah)) {
  8299. -+ ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH;
  8300. -+ ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW;
  8301. -+ ah->config.cck_trig_high = ATH9K_ANI_CCK_TRIG_HIGH;
  8302. -+ ah->config.cck_trig_low = ATH9K_ANI_CCK_TRIG_LOW;
  8303. -+ } else {
  8304. -+ ah->config.ofdm_trig_high = ATH9K_ANI_OFDM_TRIG_HIGH_OLD;
  8305. -+ ah->config.ofdm_trig_low = ATH9K_ANI_OFDM_TRIG_LOW_OLD;
  8306. -+ ah->config.cck_trig_high = ATH9K_ANI_CCK_TRIG_HIGH_OLD;
  8307. -+ ah->config.cck_trig_low = ATH9K_ANI_CCK_TRIG_LOW_OLD;
  8308. -+ }
  8309. + ret = -ENODEV;
  8310. + rtnl_lock();
  8311. +- if (sdata->dev->reg_state == NETREG_REGISTERED)
  8312. +- ret = (*write)(sdata, buf, count);
  8313. ++ ret = (*write)(sdata, buf, count);
  8314. + rtnl_unlock();
  8315. - ani->spurImmunityLevel = ATH9K_ANI_SPUR_IMMUNE_LVL;
  8316. - ani->firstepLevel = ATH9K_ANI_FIRSTEP_LVL;
  8317. ---- a/drivers/net/wireless/ath/ath9k/ani.h
  8318. -+++ b/drivers/net/wireless/ath/ath9k/ani.h
  8319. -@@ -22,12 +22,16 @@
  8320. - /* units are errors per second */
  8321. - #define ATH9K_ANI_OFDM_TRIG_HIGH 3500
  8322. - #define ATH9K_ANI_OFDM_TRIG_HIGH_BELOW_INI 1000
  8323. -+#define ATH9K_ANI_OFDM_TRIG_HIGH_OLD 500
  8324. -
  8325. - #define ATH9K_ANI_OFDM_TRIG_LOW 400
  8326. - #define ATH9K_ANI_OFDM_TRIG_LOW_ABOVE_INI 900
  8327. -+#define ATH9K_ANI_OFDM_TRIG_LOW_OLD 200
  8328. -
  8329. - #define ATH9K_ANI_CCK_TRIG_HIGH 600
  8330. -+#define ATH9K_ANI_CCK_TRIG_HIGH_OLD 200
  8331. - #define ATH9K_ANI_CCK_TRIG_LOW 300
  8332. -+#define ATH9K_ANI_CCK_TRIG_LOW_OLD 100
  8333. -
  8334. - #define ATH9K_ANI_SPUR_IMMUNE_LVL 3
  8335. - #define ATH9K_ANI_FIRSTEP_LVL 2
  8336. ---- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
  8337. -+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
  8338. -@@ -26,10 +26,6 @@ static const int firstep_table[] =
  8339. - /* level: 0 1 2 3 4 5 6 7 8 */
  8340. - { -4, -2, 0, 2, 4, 6, 8, 10, 12 }; /* lvl 0-8, default 2 */
  8341. -
  8342. --static const int cycpwrThr1_table[] =
  8343. --/* level: 0 1 2 3 4 5 6 7 8 */
  8344. -- { -6, -4, -2, 0, 2, 4, 6, 8 }; /* lvl 0-7, default 3 */
  8345. --
  8346. - /*
  8347. - * register values to turn OFDM weak signal detection OFF
  8348. - */
  8349. -@@ -921,7 +917,7 @@ static bool ar5008_hw_ani_control_new(st
  8350. - struct ath_common *common = ath9k_hw_common(ah);
  8351. - struct ath9k_channel *chan = ah->curchan;
  8352. - struct ar5416AniState *aniState = &ah->ani;
  8353. -- s32 value, value2;
  8354. -+ s32 value;
  8355. -
  8356. - switch (cmd & ah->ani_function) {
  8357. - case ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION:{
  8358. -@@ -1008,42 +1004,9 @@ static bool ar5008_hw_ani_control_new(st
  8359. - case ATH9K_ANI_FIRSTEP_LEVEL:{
  8360. - u32 level = param;
  8361. -
  8362. -- if (level >= ARRAY_SIZE(firstep_table)) {
  8363. -- ath_dbg(common, ANI,
  8364. -- "ATH9K_ANI_FIRSTEP_LEVEL: level out of range (%u > %zu)\n",
  8365. -- level, ARRAY_SIZE(firstep_table));
  8366. -- return false;
  8367. -- }
  8368. --
  8369. -- /*
  8370. -- * make register setting relative to default
  8371. -- * from INI file & cap value
  8372. -- */
  8373. -- value = firstep_table[level] -
  8374. -- firstep_table[ATH9K_ANI_FIRSTEP_LVL] +
  8375. -- aniState->iniDef.firstep;
  8376. -- if (value < ATH9K_SIG_FIRSTEP_SETTING_MIN)
  8377. -- value = ATH9K_SIG_FIRSTEP_SETTING_MIN;
  8378. -- if (value > ATH9K_SIG_FIRSTEP_SETTING_MAX)
  8379. -- value = ATH9K_SIG_FIRSTEP_SETTING_MAX;
  8380. -+ value = level;
  8381. - REG_RMW_FIELD(ah, AR_PHY_FIND_SIG,
  8382. -- AR_PHY_FIND_SIG_FIRSTEP,
  8383. -- value);
  8384. -- /*
  8385. -- * we need to set first step low register too
  8386. -- * make register setting relative to default
  8387. -- * from INI file & cap value
  8388. -- */
  8389. -- value2 = firstep_table[level] -
  8390. -- firstep_table[ATH9K_ANI_FIRSTEP_LVL] +
  8391. -- aniState->iniDef.firstepLow;
  8392. -- if (value2 < ATH9K_SIG_FIRSTEP_SETTING_MIN)
  8393. -- value2 = ATH9K_SIG_FIRSTEP_SETTING_MIN;
  8394. -- if (value2 > ATH9K_SIG_FIRSTEP_SETTING_MAX)
  8395. -- value2 = ATH9K_SIG_FIRSTEP_SETTING_MAX;
  8396. --
  8397. -- REG_RMW_FIELD(ah, AR_PHY_FIND_SIG_LOW,
  8398. -- AR_PHY_FIND_SIG_FIRSTEP_LOW, value2);
  8399. -+ AR_PHY_FIND_SIG_FIRSTEP, value);
  8400. -
  8401. - if (level != aniState->firstepLevel) {
  8402. - ath_dbg(common, ANI,
  8403. -@@ -1060,7 +1023,7 @@ static bool ar5008_hw_ani_control_new(st
  8404. - aniState->firstepLevel,
  8405. - level,
  8406. - ATH9K_ANI_FIRSTEP_LVL,
  8407. -- value2,
  8408. -+ value,
  8409. - aniState->iniDef.firstepLow);
  8410. - if (level > aniState->firstepLevel)
  8411. - ah->stats.ast_ani_stepup++;
  8412. -@@ -1073,41 +1036,13 @@ static bool ar5008_hw_ani_control_new(st
  8413. - case ATH9K_ANI_SPUR_IMMUNITY_LEVEL:{
  8414. - u32 level = param;
  8415. -
  8416. -- if (level >= ARRAY_SIZE(cycpwrThr1_table)) {
  8417. -- ath_dbg(common, ANI,
  8418. -- "ATH9K_ANI_SPUR_IMMUNITY_LEVEL: level out of range (%u > %zu)\n",
  8419. -- level, ARRAY_SIZE(cycpwrThr1_table));
  8420. -- return false;
  8421. -- }
  8422. -- /*
  8423. -- * make register setting relative to default
  8424. -- * from INI file & cap value
  8425. -- */
  8426. -- value = cycpwrThr1_table[level] -
  8427. -- cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL] +
  8428. -- aniState->iniDef.cycpwrThr1;
  8429. -- if (value < ATH9K_SIG_SPUR_IMM_SETTING_MIN)
  8430. -- value = ATH9K_SIG_SPUR_IMM_SETTING_MIN;
  8431. -- if (value > ATH9K_SIG_SPUR_IMM_SETTING_MAX)
  8432. -- value = ATH9K_SIG_SPUR_IMM_SETTING_MAX;
  8433. -+ value = (level + 1) * 2;
  8434. - REG_RMW_FIELD(ah, AR_PHY_TIMING5,
  8435. -- AR_PHY_TIMING5_CYCPWR_THR1,
  8436. -- value);
  8437. -+ AR_PHY_TIMING5_CYCPWR_THR1, value);
  8438. -
  8439. -- /*
  8440. -- * set AR_PHY_EXT_CCA for extension channel
  8441. -- * make register setting relative to default
  8442. -- * from INI file & cap value
  8443. -- */
  8444. -- value2 = cycpwrThr1_table[level] -
  8445. -- cycpwrThr1_table[ATH9K_ANI_SPUR_IMMUNE_LVL] +
  8446. -- aniState->iniDef.cycpwrThr1Ext;
  8447. -- if (value2 < ATH9K_SIG_SPUR_IMM_SETTING_MIN)
  8448. -- value2 = ATH9K_SIG_SPUR_IMM_SETTING_MIN;
  8449. -- if (value2 > ATH9K_SIG_SPUR_IMM_SETTING_MAX)
  8450. -- value2 = ATH9K_SIG_SPUR_IMM_SETTING_MAX;
  8451. -- REG_RMW_FIELD(ah, AR_PHY_EXT_CCA,
  8452. -- AR_PHY_EXT_TIMING5_CYCPWR_THR1, value2);
  8453. -+ if (IS_CHAN_HT40(ah->curchan))
  8454. -+ REG_RMW_FIELD(ah, AR_PHY_EXT_CCA,
  8455. -+ AR_PHY_EXT_TIMING5_CYCPWR_THR1, value);
  8456. -
  8457. - if (level != aniState->spurImmunityLevel) {
  8458. - ath_dbg(common, ANI,
  8459. -@@ -1124,7 +1059,7 @@ static bool ar5008_hw_ani_control_new(st
  8460. - aniState->spurImmunityLevel,
  8461. - level,
  8462. - ATH9K_ANI_SPUR_IMMUNE_LVL,
  8463. -- value2,
  8464. -+ value,
  8465. - aniState->iniDef.cycpwrThr1Ext);
  8466. - if (level > aniState->spurImmunityLevel)
  8467. - ah->stats.ast_ani_spurup++;
  8468. + return ret;
  8469. diff --git a/package/mac80211/patches/310-ap_scan.patch b/package/mac80211/patches/310-ap_scan.patch
  8470. index 389a003..23ecd37 100644
  8471. --- a/package/mac80211/patches/310-ap_scan.patch
  8472. +++ b/package/mac80211/patches/310-ap_scan.patch
  8473. @@ -1,6 +1,6 @@
  8474. --- a/net/mac80211/cfg.c
  8475. +++ b/net/mac80211/cfg.c
  8476. -@@ -2148,7 +2148,7 @@ static int ieee80211_scan(struct wiphy *
  8477. +@@ -1903,7 +1903,7 @@ static int ieee80211_scan(struct wiphy *
  8478. * the frames sent while scanning on other channel will be
  8479. * lost)
  8480. */
  8481. diff --git a/package/mac80211/patches/400-ath_move_debug_code.patch b/package/mac80211/patches/400-ath_move_debug_code.patch
  8482. index 0dba7ac..4cc77af 100644
  8483. --- a/package/mac80211/patches/400-ath_move_debug_code.patch
  8484. +++ b/package/mac80211/patches/400-ath_move_debug_code.patch
  8485. @@ -12,7 +12,7 @@
  8486. ccflags-y += -D__CHECK_ENDIAN__
  8487. --- a/drivers/net/wireless/ath/ath.h
  8488. +++ b/drivers/net/wireless/ath/ath.h
  8489. -@@ -282,13 +282,6 @@ void _ath_dbg(struct ath_common *common,
  8490. +@@ -295,13 +295,6 @@ void _ath_dbg(struct ath_common *common,
  8491. #endif /* CPTCFG_ATH_DEBUG */
  8492. /** Returns string describing opmode, or NULL if unknown mode. */
  8493. diff --git a/package/mac80211/patches/403-ath_regd_optional.patch b/package/mac80211/patches/403-ath_regd_optional.patch
  8494. index 07c54cc..808e729 100644
  8495. --- a/package/mac80211/patches/403-ath_regd_optional.patch
  8496. +++ b/package/mac80211/patches/403-ath_regd_optional.patch
  8497. @@ -58,7 +58,7 @@
  8498. ---help---
  8499. --- a/.local-symbols
  8500. +++ b/.local-symbols
  8501. -@@ -119,6 +119,7 @@ RTL8187_LEDS=
  8502. +@@ -116,6 +116,7 @@ RTL8187_LEDS=
  8503. ATH_COMMON=
  8504. ATH_CARDS=
  8505. ATH_DEBUG=
  8506. diff --git a/package/mac80211/patches/405-regd_no_assoc_hints.patch b/package/mac80211/patches/405-regd_no_assoc_hints.patch
  8507. index 6ad4fda..2152433 100644
  8508. --- a/package/mac80211/patches/405-regd_no_assoc_hints.patch
  8509. +++ b/package/mac80211/patches/405-regd_no_assoc_hints.patch
  8510. @@ -1,6 +1,6 @@
  8511. --- a/net/wireless/reg.c
  8512. +++ b/net/wireless/reg.c
  8513. -@@ -1878,6 +1878,8 @@ void regulatory_hint_country_ie(struct w
  8514. +@@ -2080,6 +2080,8 @@ void regulatory_hint_country_ie(struct w
  8515. enum environment_cap env = ENVIRON_ANY;
  8516. struct regulatory_request *request = NULL, *lr;
  8517. @@ -9,7 +9,7 @@
  8518. /* IE len must be evenly divisible by 2 */
  8519. if (country_ie_len & 0x01)
  8520. return;
  8521. -@@ -2072,6 +2074,7 @@ static void restore_regulatory_settings(
  8522. +@@ -2276,6 +2278,7 @@ static void restore_regulatory_settings(
  8523. void regulatory_hint_disconnect(void)
  8524. {
  8525. diff --git a/package/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch b/package/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch
  8526. index 1f71e0b..ce752f1 100644
  8527. --- a/package/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch
  8528. +++ b/package/mac80211/patches/410-ath9k_allow_adhoc_and_ap.patch
  8529. @@ -1,8 +1,8 @@
  8530. --- a/drivers/net/wireless/ath/ath9k/init.c
  8531. +++ b/drivers/net/wireless/ath/ath9k/init.c
  8532. -@@ -866,6 +866,7 @@ static const struct ieee80211_iface_limi
  8533. - #endif
  8534. - BIT(NL80211_IFTYPE_AP) |
  8535. +@@ -655,6 +655,7 @@ static const struct ieee80211_iface_limi
  8536. + BIT(NL80211_IFTYPE_AP) },
  8537. + { .max = 1, .types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
  8538. BIT(NL80211_IFTYPE_P2P_GO) },
  8539. + { .max = 1, .types = BIT(NL80211_IFTYPE_ADHOC) },
  8540. };
  8541. diff --git a/package/mac80211/patches/411-ath5k_allow_adhoc_and_ap.patch b/package/mac80211/patches/411-ath5k_allow_adhoc_and_ap.patch
  8542. index 3487ab2..1f06994 100644
  8543. --- a/package/mac80211/patches/411-ath5k_allow_adhoc_and_ap.patch
  8544. +++ b/package/mac80211/patches/411-ath5k_allow_adhoc_and_ap.patch
  8545. @@ -18,7 +18,7 @@
  8546. goto end;
  8547. --- a/drivers/net/wireless/ath/ath5k/base.c
  8548. +++ b/drivers/net/wireless/ath/ath5k/base.c
  8549. -@@ -1934,7 +1934,7 @@ ath5k_beacon_send(struct ath5k_hw *ah)
  8550. +@@ -1937,7 +1937,7 @@ ath5k_beacon_send(struct ath5k_hw *ah)
  8551. }
  8552. if ((ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs +
  8553. @@ -27,7 +27,7 @@
  8554. ah->opmode == NL80211_IFTYPE_MESH_POINT) {
  8555. u64 tsf = ath5k_hw_get_tsf64(ah);
  8556. u32 tsftu = TSF_TO_TU(tsf);
  8557. -@@ -2020,7 +2020,7 @@ ath5k_beacon_update_timers(struct ath5k_
  8558. +@@ -2023,7 +2023,7 @@ ath5k_beacon_update_timers(struct ath5k_
  8559. intval = ah->bintval & AR5K_BEACON_PERIOD;
  8560. if (ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs
  8561. @@ -36,7 +36,7 @@
  8562. intval /= ATH_BCBUF; /* staggered multi-bss beacons */
  8563. if (intval < 15)
  8564. ATH5K_WARN(ah, "intval %u is too low, min 15\n",
  8565. -@@ -2487,6 +2487,7 @@ static const struct ieee80211_iface_limi
  8566. +@@ -2490,6 +2490,7 @@ static const struct ieee80211_iface_limi
  8567. BIT(NL80211_IFTYPE_MESH_POINT) |
  8568. #endif
  8569. BIT(NL80211_IFTYPE_AP) },
  8570. diff --git a/package/mac80211/patches/431-add_platform_eeprom_support_to_ath5k.patch b/package/mac80211/patches/431-add_platform_eeprom_support_to_ath5k.patch
  8571. index a223b38..5cb4b51 100644
  8572. --- a/package/mac80211/patches/431-add_platform_eeprom_support_to_ath5k.patch
  8573. +++ b/package/mac80211/patches/431-add_platform_eeprom_support_to_ath5k.patch
  8574. @@ -22,14 +22,14 @@
  8575. u32 status, timeout;
  8576. + struct ath5k_platform_data *pdata = NULL;
  8577. -+
  8578. ++
  8579. + if (ah->pdev)
  8580. + pdata = ah->pdev->dev.platform_data;
  8581. +
  8582. + if (pdata && pdata->eeprom_data && pdata->eeprom_data[61] == AR5K_EEPROM_MAGIC_VALUE) {
  8583. -+ if (offset >= ATH5K_PLAT_EEP_MAX_WORDS)
  8584. ++ if (offset >= ATH5K_PLAT_EEP_MAX_WORDS)
  8585. + return false;
  8586. -+
  8587. ++
  8588. + *data = pdata->eeprom_data[offset];
  8589. + return true;
  8590. + }
  8591. diff --git a/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch b/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch
  8592. index 664cf45..65821fe 100644
  8593. --- a/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch
  8594. +++ b/package/mac80211/patches/500-ath9k_eeprom_debugfs.patch
  8595. @@ -1,6 +1,6 @@
  8596. --- a/drivers/net/wireless/ath/ath9k/debug.c
  8597. +++ b/drivers/net/wireless/ath/ath9k/debug.c
  8598. -@@ -1481,6 +1481,53 @@ void ath9k_deinit_debug(struct ath_softc
  8599. +@@ -1289,6 +1289,53 @@ void ath9k_deinit_debug(struct ath_softc
  8600. ath9k_spectral_deinit_debug(sc);
  8601. }
  8602. @@ -54,7 +54,7 @@
  8603. int ath9k_init_debug(struct ath_hw *ah)
  8604. {
  8605. struct ath_common *common = ath9k_hw_common(ah);
  8606. -@@ -1500,6 +1547,8 @@ int ath9k_init_debug(struct ath_hw *ah)
  8607. +@@ -1308,6 +1355,8 @@ int ath9k_init_debug(struct ath_hw *ah)
  8608. ath9k_tx99_init_debug(sc);
  8609. ath9k_spectral_init_debug(sc);
  8610. diff --git a/package/mac80211/patches/501-ath9k-eeprom_endianess.patch b/package/mac80211/patches/501-ath9k-eeprom_endianess.patch
  8611. index 96e7c6d..169eb9a 100644
  8612. --- a/package/mac80211/patches/501-ath9k-eeprom_endianess.patch
  8613. +++ b/package/mac80211/patches/501-ath9k-eeprom_endianess.patch
  8614. @@ -81,7 +81,7 @@
  8615. struct ath_ops reg_ops;
  8616. --- a/drivers/net/wireless/ath/ath9k/init.c
  8617. +++ b/drivers/net/wireless/ath/ath9k/init.c
  8618. -@@ -722,6 +722,8 @@ static int ath9k_init_softc(u16 devid, s
  8619. +@@ -518,6 +518,8 @@ static int ath9k_init_softc(u16 devid, s
  8620. ah->is_clk_25mhz = pdata->is_clk_25mhz;
  8621. ah->get_mac_revision = pdata->get_mac_revision;
  8622. ah->external_reset = pdata->external_reset;
  8623. diff --git a/package/mac80211/patches/502-ath9k_ahb_init.patch b/package/mac80211/patches/502-ath9k_ahb_init.patch
  8624. index 4edc63b..0c8e813 100644
  8625. --- a/package/mac80211/patches/502-ath9k_ahb_init.patch
  8626. +++ b/package/mac80211/patches/502-ath9k_ahb_init.patch
  8627. @@ -1,15 +1,15 @@
  8628. --- a/drivers/net/wireless/ath/ath9k/init.c
  8629. +++ b/drivers/net/wireless/ath/ath9k/init.c
  8630. -@@ -1112,23 +1112,23 @@ static int __init ath9k_init(void)
  8631. - goto err_out;
  8632. - }
  8633. +@@ -904,23 +904,23 @@ static int __init ath9k_init(void)
  8634. + {
  8635. + int error;
  8636. - error = ath_pci_init();
  8637. + error = ath_ahb_init();
  8638. if (error < 0) {
  8639. - pr_err("No PCI devices found, driver not installed\n");
  8640. error = -ENODEV;
  8641. - goto err_rate_unregister;
  8642. + goto err_out;
  8643. }
  8644. - error = ath_ahb_init();
  8645. @@ -27,6 +27,6 @@
  8646. - ath_pci_exit();
  8647. + err_ahb_exit:
  8648. + ath_ahb_exit();
  8649. -
  8650. - err_rate_unregister:
  8651. - ath_rate_control_unregister();
  8652. + err_out:
  8653. + return error;
  8654. + }
  8655. diff --git a/package/mac80211/patches/511-ath9k_reduce_rxbuf.patch b/package/mac80211/patches/511-ath9k_reduce_rxbuf.patch
  8656. index ef0b9a1..e457267 100644
  8657. --- a/package/mac80211/patches/511-ath9k_reduce_rxbuf.patch
  8658. +++ b/package/mac80211/patches/511-ath9k_reduce_rxbuf.patch
  8659. @@ -1,6 +1,6 @@
  8660. --- a/drivers/net/wireless/ath/ath9k/ath9k.h
  8661. +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
  8662. -@@ -90,7 +90,7 @@ int ath_descdma_setup(struct ath_softc *
  8663. +@@ -89,7 +89,7 @@ int ath_descdma_setup(struct ath_softc *
  8664. (_l) &= ((_sz) - 1); \
  8665. } while (0)
  8666. diff --git a/package/mac80211/patches/512-ath9k_channelbw_debugfs.patch b/package/mac80211/patches/512-ath9k_channelbw_debugfs.patch
  8667. index 8f3cc03..c0e173f 100644
  8668. --- a/package/mac80211/patches/512-ath9k_channelbw_debugfs.patch
  8669. +++ b/package/mac80211/patches/512-ath9k_channelbw_debugfs.patch
  8670. @@ -1,6 +1,6 @@
  8671. --- a/drivers/net/wireless/ath/ath9k/debug.c
  8672. +++ b/drivers/net/wireless/ath/ath9k/debug.c
  8673. -@@ -1528,6 +1528,52 @@ static const struct file_operations fops
  8674. +@@ -1336,6 +1336,52 @@ static const struct file_operations fops
  8675. .owner = THIS_MODULE
  8676. };
  8677. @@ -35,7 +35,7 @@
  8678. + return -EINVAL;
  8679. +
  8680. + common->chan_bw = chan_bw;
  8681. -+ if (!test_bit(SC_OP_INVALID, &sc->sc_flags))
  8682. ++ if (!test_bit(ATH_OP_INVALID, &common->op_flags))
  8683. + ath9k_ops.config(sc->hw, IEEE80211_CONF_CHANGE_CHANNEL);
  8684. +
  8685. + return count;
  8686. @@ -53,7 +53,7 @@
  8687. int ath9k_init_debug(struct ath_hw *ah)
  8688. {
  8689. struct ath_common *common = ath9k_hw_common(ah);
  8690. -@@ -1549,6 +1595,8 @@ int ath9k_init_debug(struct ath_hw *ah)
  8691. +@@ -1357,6 +1403,8 @@ int ath9k_init_debug(struct ath_hw *ah)
  8692. debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
  8693. &fops_eeprom);
  8694. @@ -64,17 +64,17 @@
  8695. debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
  8696. --- a/drivers/net/wireless/ath/ath.h
  8697. +++ b/drivers/net/wireless/ath/ath.h
  8698. -@@ -130,6 +130,7 @@ struct ath_common {
  8699. - struct ieee80211_hw *hw;
  8700. +@@ -140,6 +140,7 @@ struct ath_common {
  8701. int debug_mask;
  8702. enum ath_device_state state;
  8703. + unsigned long op_flags;
  8704. + u32 chan_bw;
  8705. struct ath_ani ani;
  8706. --- a/drivers/net/wireless/ath/ath9k/common.c
  8707. +++ b/drivers/net/wireless/ath/ath9k/common.c
  8708. -@@ -52,11 +52,13 @@ EXPORT_SYMBOL(ath9k_cmn_get_hw_crypto_ke
  8709. +@@ -296,11 +296,13 @@ EXPORT_SYMBOL(ath9k_cmn_get_hw_crypto_ke
  8710. /*
  8711. * Update internal channel flags.
  8712. */
  8713. @@ -89,7 +89,7 @@
  8714. ichan->channel = chan->center_freq;
  8715. ichan->chan = chan;
  8716. -@@ -64,7 +66,19 @@ static void ath9k_cmn_update_ichannel(st
  8717. +@@ -308,7 +310,19 @@ static void ath9k_cmn_update_ichannel(st
  8718. if (chan->band == IEEE80211_BAND_5GHZ)
  8719. flags |= CHANNEL_5GHZ;
  8720. @@ -110,7 +110,7 @@
  8721. case NL80211_CHAN_WIDTH_5:
  8722. flags |= CHANNEL_QUARTER;
  8723. break;
  8724. -@@ -97,10 +111,11 @@ struct ath9k_channel *ath9k_cmn_get_chan
  8725. +@@ -341,10 +355,11 @@ struct ath9k_channel *ath9k_cmn_get_chan
  8726. struct cfg80211_chan_def *chandef)
  8727. {
  8728. struct ieee80211_channel *curchan = chandef->chan;
  8729. diff --git a/package/mac80211/patches/520-mac80211_cur_txpower.patch b/package/mac80211/patches/520-mac80211_cur_txpower.patch
  8730. index 6df95bc..ef7906e 100644
  8731. --- a/package/mac80211/patches/520-mac80211_cur_txpower.patch
  8732. +++ b/package/mac80211/patches/520-mac80211_cur_txpower.patch
  8733. @@ -1,6 +1,6 @@
  8734. --- a/include/net/mac80211.h
  8735. +++ b/include/net/mac80211.h
  8736. -@@ -1711,6 +1711,7 @@ struct ieee80211_hw {
  8737. +@@ -1718,6 +1718,7 @@ struct ieee80211_hw {
  8738. u8 max_tx_aggregation_subframes;
  8739. u8 offchannel_tx_hw_queue;
  8740. u8 radiotap_mcs_details;
  8741. @@ -10,7 +10,7 @@
  8742. u8 uapsd_queues;
  8743. --- a/net/mac80211/cfg.c
  8744. +++ b/net/mac80211/cfg.c
  8745. -@@ -2329,7 +2329,9 @@ static int ieee80211_get_tx_power(struct
  8746. +@@ -2084,7 +2084,9 @@ static int ieee80211_get_tx_power(struct
  8747. struct ieee80211_local *local = wiphy_priv(wiphy);
  8748. struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
  8749. @@ -23,7 +23,7 @@
  8750. *dbm = sdata->vif.bss_conf.txpower;
  8751. --- a/net/mac80211/main.c
  8752. +++ b/net/mac80211/main.c
  8753. -@@ -158,6 +158,7 @@ static u32 ieee80211_hw_conf_chan(struct
  8754. +@@ -156,6 +156,7 @@ static u32 ieee80211_hw_conf_chan(struct
  8755. if (local->hw.conf.power_level != power) {
  8756. changed |= IEEE80211_CONF_CHANGE_POWER;
  8757. diff --git a/package/mac80211/patches/521-ath9k_cur_txpower.patch b/package/mac80211/patches/521-ath9k_cur_txpower.patch
  8758. index 0d6c360..83ff465 100644
  8759. --- a/package/mac80211/patches/521-ath9k_cur_txpower.patch
  8760. +++ b/package/mac80211/patches/521-ath9k_cur_txpower.patch
  8761. @@ -1,6 +1,6 @@
  8762. --- a/drivers/net/wireless/ath/ath9k/main.c
  8763. +++ b/drivers/net/wireless/ath/ath9k/main.c
  8764. -@@ -308,8 +308,12 @@ static int ath_reset_internal(struct ath
  8765. +@@ -310,8 +310,12 @@ static int ath_reset_internal(struct ath
  8766. (sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL))
  8767. ath9k_mci_set_txpower(sc, true, false);
  8768. @@ -14,7 +14,7 @@
  8769. out:
  8770. spin_unlock_bh(&sc->sc_pcu_lock);
  8771. -@@ -1371,6 +1375,7 @@ static int ath9k_config(struct ieee80211
  8772. +@@ -1405,6 +1409,7 @@ static int ath9k_config(struct ieee80211
  8773. sc->config.txpowlimit = 2 * conf->power_level;
  8774. ath9k_cmn_update_txpow(ah, sc->curtxpow,
  8775. sc->config.txpowlimit, &sc->curtxpow);
  8776. diff --git a/package/mac80211/patches/522-mac80211_configure_antenna_gain.patch b/package/mac80211/patches/522-mac80211_configure_antenna_gain.patch
  8777. index 308ee6e..2109d2e 100644
  8778. --- a/package/mac80211/patches/522-mac80211_configure_antenna_gain.patch
  8779. +++ b/package/mac80211/patches/522-mac80211_configure_antenna_gain.patch
  8780. @@ -1,6 +1,6 @@
  8781. --- a/include/net/cfg80211.h
  8782. +++ b/include/net/cfg80211.h
  8783. -@@ -2156,6 +2156,7 @@ struct cfg80211_qos_map {
  8784. +@@ -2207,6 +2207,7 @@ struct cfg80211_qos_map {
  8785. * (as advertised by the nl80211 feature flag.)
  8786. * @get_tx_power: store the current TX power into the dbm variable;
  8787. * return 0 if successful
  8788. @@ -8,7 +8,7 @@
  8789. *
  8790. * @set_wds_peer: set the WDS peer for a WDS interface
  8791. *
  8792. -@@ -2380,6 +2381,7 @@ struct cfg80211_ops {
  8793. +@@ -2431,6 +2432,7 @@ struct cfg80211_ops {
  8794. enum nl80211_tx_power_setting type, int mbm);
  8795. int (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev,
  8796. int *dbm);
  8797. @@ -18,7 +18,7 @@
  8798. const u8 *addr);
  8799. --- a/include/net/mac80211.h
  8800. +++ b/include/net/mac80211.h
  8801. -@@ -1033,6 +1033,7 @@ enum ieee80211_smps_mode {
  8802. +@@ -1032,6 +1032,7 @@ enum ieee80211_smps_mode {
  8803. *
  8804. * @power_level: requested transmit power (in dBm), backward compatibility
  8805. * value only that is set to the minimum of all interfaces
  8806. @@ -26,7 +26,7 @@
  8807. *
  8808. * @chandef: the channel definition to tune to
  8809. * @radar_enabled: whether radar detection is enabled
  8810. -@@ -1054,6 +1055,7 @@ struct ieee80211_conf {
  8811. +@@ -1053,6 +1054,7 @@ struct ieee80211_conf {
  8812. u32 flags;
  8813. int power_level, dynamic_ps_timeout;
  8814. int max_sleep_period;
  8815. @@ -36,9 +36,9 @@
  8816. u8 ps_dtim_period;
  8817. --- a/include/uapi/linux/nl80211.h
  8818. +++ b/include/uapi/linux/nl80211.h
  8819. -@@ -1555,6 +1555,9 @@ enum nl80211_commands {
  8820. - * data is in the format defined for the payload of the QoS Map Set element
  8821. - * in IEEE Std 802.11-2012, 8.4.2.97.
  8822. +@@ -1591,6 +1591,9 @@ enum nl80211_commands {
  8823. + * creation then the new interface will be owned by the netlink socket
  8824. + * that created it and will be destroyed when the socket is closed
  8825. *
  8826. + * @NL80211_ATTR_WIPHY_ANTENNA_GAIN: Configured antenna gain. Used to reduce
  8827. + * transmit power to stay within regulatory limits. u32, dBi.
  8828. @@ -46,9 +46,9 @@
  8829. * @NL80211_ATTR_MAX: highest attribute number currently defined
  8830. * @__NL80211_ATTR_AFTER_LAST: internal use
  8831. */
  8832. -@@ -1883,6 +1886,8 @@ enum nl80211_attrs {
  8833. -
  8834. - NL80211_ATTR_QOS_MAP,
  8835. +@@ -1931,6 +1934,8 @@ enum nl80211_attrs {
  8836. + NL80211_ATTR_CSA_C_OFFSETS_TX,
  8837. + NL80211_ATTR_MAX_CSA_COUNTERS,
  8838. + NL80211_ATTR_WIPHY_ANTENNA_GAIN,
  8839. +
  8840. @@ -57,7 +57,7 @@
  8841. __NL80211_ATTR_AFTER_LAST,
  8842. --- a/net/mac80211/cfg.c
  8843. +++ b/net/mac80211/cfg.c
  8844. -@@ -2339,6 +2339,19 @@ static int ieee80211_get_tx_power(struct
  8845. +@@ -2094,6 +2094,19 @@ static int ieee80211_get_tx_power(struct
  8846. return 0;
  8847. }
  8848. @@ -77,7 +77,7 @@
  8849. static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev,
  8850. const u8 *addr)
  8851. {
  8852. -@@ -3924,6 +3937,7 @@ struct cfg80211_ops mac80211_config_ops
  8853. +@@ -3517,6 +3530,7 @@ const struct cfg80211_ops mac80211_confi
  8854. .set_wiphy_params = ieee80211_set_wiphy_params,
  8855. .set_tx_power = ieee80211_set_tx_power,
  8856. .get_tx_power = ieee80211_get_tx_power,
  8857. @@ -87,7 +87,7 @@
  8858. CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd)
  8859. --- a/net/mac80211/ieee80211_i.h
  8860. +++ b/net/mac80211/ieee80211_i.h
  8861. -@@ -1221,6 +1221,7 @@ struct ieee80211_local {
  8862. +@@ -1243,6 +1243,7 @@ struct ieee80211_local {
  8863. int dynamic_ps_forced_timeout;
  8864. int user_power_level; /* in dBm, for all interfaces */
  8865. @@ -97,39 +97,29 @@
  8866. --- a/net/mac80211/main.c
  8867. +++ b/net/mac80211/main.c
  8868. -@@ -101,7 +101,7 @@ static u32 ieee80211_hw_conf_chan(struct
  8869. +@@ -97,7 +97,7 @@ static u32 ieee80211_hw_conf_chan(struct
  8870. struct ieee80211_sub_if_data *sdata;
  8871. struct cfg80211_chan_def chandef = {};
  8872. u32 changed = 0;
  8873. - int power;
  8874. -+ int power, ant_gain, max_power;
  8875. ++ int power, max_power;
  8876. u32 offchannel_flag;
  8877. offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL;
  8878. -@@ -156,8 +156,21 @@ static u32 ieee80211_hw_conf_chan(struct
  8879. +@@ -154,6 +154,12 @@ static u32 ieee80211_hw_conf_chan(struct
  8880. }
  8881. rcu_read_unlock();
  8882. -- if (local->hw.conf.power_level != power) {
  8883. + max_power = chandef.chan->max_reg_power;
  8884. -+ ant_gain = chandef.chan->max_antenna_gain;
  8885. + if (local->user_antenna_gain > 0) {
  8886. -+ if (local->user_antenna_gain > ant_gain) {
  8887. -+ max_power -= local->user_antenna_gain - ant_gain;
  8888. -+ ant_gain = 0;
  8889. -+ } else
  8890. -+ ant_gain -= local->user_antenna_gain;
  8891. ++ max_power -= local->user_antenna_gain;
  8892. + power = min(power, max_power);
  8893. + }
  8894. +
  8895. -+ if (local->hw.conf.power_level != power ||
  8896. -+ local->hw.conf.max_antenna_gain != ant_gain) {
  8897. + if (local->hw.conf.power_level != power) {
  8898. changed |= IEEE80211_CONF_CHANGE_POWER;
  8899. -+ local->hw.conf.max_antenna_gain = ant_gain;
  8900. local->hw.cur_power_level = power;
  8901. - local->hw.conf.power_level = power;
  8902. - }
  8903. -@@ -584,6 +597,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(
  8904. +@@ -584,6 +590,7 @@ struct ieee80211_hw *ieee80211_alloc_hw(
  8905. IEEE80211_RADIOTAP_MCS_HAVE_BW;
  8906. local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI |
  8907. IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH;
  8908. @@ -139,32 +129,30 @@
  8909. local->user_power_level = IEEE80211_UNSET_POWER_LEVEL;
  8910. --- a/net/wireless/nl80211.c
  8911. +++ b/net/wireless/nl80211.c
  8912. -@@ -384,6 +384,7 @@ static const struct nla_policy nl80211_p
  8913. - [NL80211_ATTR_VENDOR_DATA] = { .type = NLA_BINARY },
  8914. - [NL80211_ATTR_QOS_MAP] = { .type = NLA_BINARY,
  8915. - .len = IEEE80211_QOS_MAP_LEN_MAX },
  8916. +@@ -387,6 +387,7 @@ static const struct nla_policy nl80211_p
  8917. + [NL80211_ATTR_TDLS_PEER_CAPABILITY] = { .type = NLA_U32 },
  8918. + [NL80211_ATTR_IFACE_SOCKET_OWNER] = { .type = NLA_FLAG },
  8919. + [NL80211_ATTR_CSA_C_OFFSETS_TX] = { .type = NLA_BINARY },
  8920. + [NL80211_ATTR_WIPHY_ANTENNA_GAIN] = { .type = NLA_U32 },
  8921. };
  8922. /* policy for the key attributes */
  8923. -@@ -2105,6 +2106,22 @@ static int nl80211_set_wiphy(struct sk_b
  8924. - goto bad_res;
  8925. +@@ -2162,6 +2163,20 @@ static int nl80211_set_wiphy(struct sk_b
  8926. + return result;
  8927. }
  8928. + if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_GAIN]) {
  8929. + int idx, dbi = 0;
  8930. +
  8931. -+ if (!rdev->ops->set_antenna_gain) {
  8932. -+ result = -EOPNOTSUPP;
  8933. -+ goto bad_res;
  8934. -+ }
  8935. ++ if (!rdev->ops->set_antenna_gain)
  8936. ++ return -EOPNOTSUPP;
  8937. +
  8938. + idx = NL80211_ATTR_WIPHY_ANTENNA_GAIN;
  8939. + dbi = nla_get_u32(info->attrs[idx]);
  8940. +
  8941. + result = rdev->ops->set_antenna_gain(&rdev->wiphy, dbi);
  8942. + if (result)
  8943. -+ goto bad_res;
  8944. ++ return result;
  8945. + }
  8946. +
  8947. if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
  8948. diff --git a/package/mac80211/patches/523-ath9k_use_configured_antenna_gain.patch b/package/mac80211/patches/523-ath9k_use_configured_antenna_gain.patch
  8949. index 30aa9ee..0b28ab8 100644
  8950. --- a/package/mac80211/patches/523-ath9k_use_configured_antenna_gain.patch
  8951. +++ b/package/mac80211/patches/523-ath9k_use_configured_antenna_gain.patch
  8952. @@ -1,6 +1,6 @@
  8953. --- a/drivers/net/wireless/ath/ath.h
  8954. +++ b/drivers/net/wireless/ath/ath.h
  8955. -@@ -74,6 +74,7 @@ struct ath_regulatory {
  8956. +@@ -83,6 +83,7 @@ struct ath_regulatory {
  8957. u16 max_power_level;
  8958. u16 current_rd;
  8959. int16_t power_limit;
  8960. @@ -21,7 +21,7 @@
  8961. if (ant_gain > max_gain)
  8962. --- a/drivers/net/wireless/ath/ath9k/main.c
  8963. +++ b/drivers/net/wireless/ath/ath9k/main.c
  8964. -@@ -1371,7 +1371,10 @@ static int ath9k_config(struct ieee80211
  8965. +@@ -1405,7 +1405,10 @@ static int ath9k_config(struct ieee80211
  8966. }
  8967. if (changed & IEEE80211_CONF_CHANGE_POWER) {
  8968. diff --git a/package/mac80211/patches/530-ath9k_extra_leds.patch b/package/mac80211/patches/530-ath9k_extra_leds.patch
  8969. index 59f78d9..b5f2f8b 100644
  8970. --- a/package/mac80211/patches/530-ath9k_extra_leds.patch
  8971. +++ b/package/mac80211/patches/530-ath9k_extra_leds.patch
  8972. @@ -1,6 +1,6 @@
  8973. --- a/drivers/net/wireless/ath/ath9k/ath9k.h
  8974. +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
  8975. -@@ -563,6 +563,9 @@ static inline int ath9k_dump_btcoex(stru
  8976. +@@ -564,6 +564,9 @@ static inline int ath9k_dump_btcoex(stru
  8977. void ath_init_leds(struct ath_softc *sc);
  8978. void ath_deinit_leds(struct ath_softc *sc);
  8979. void ath_fill_led_pin(struct ath_softc *sc);
  8980. @@ -10,7 +10,7 @@
  8981. #else
  8982. static inline void ath_init_leds(struct ath_softc *sc)
  8983. {
  8984. -@@ -710,6 +713,13 @@ enum sc_op_flags {
  8985. +@@ -702,6 +705,13 @@ void ath_ant_comb_scan(struct ath_softc
  8986. #define PS_BEACON_SYNC BIT(4)
  8987. #define PS_WAIT_FOR_ANI BIT(5)
  8988. @@ -24,8 +24,8 @@
  8989. struct ath_softc {
  8990. struct ieee80211_hw *hw;
  8991. struct device *dev;
  8992. -@@ -751,9 +761,8 @@ struct ath_softc {
  8993. - struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS];
  8994. +@@ -744,9 +754,8 @@ struct ath_softc {
  8995. + struct ath_beacon beacon;
  8996. #ifdef CPTCFG_MAC80211_LEDS
  8997. - bool led_registered;
  8998. @@ -162,7 +162,7 @@
  8999. void ath_fill_led_pin(struct ath_softc *sc)
  9000. --- a/drivers/net/wireless/ath/ath9k/init.c
  9001. +++ b/drivers/net/wireless/ath/ath9k/init.c
  9002. -@@ -1018,7 +1018,7 @@ int ath9k_init_device(u16 devid, struct
  9003. +@@ -815,7 +815,7 @@ int ath9k_init_device(u16 devid, struct
  9004. #ifdef CPTCFG_MAC80211_LEDS
  9005. /* must be initialized before ieee80211_register_hw */
  9006. @@ -173,7 +173,7 @@
  9007. #endif
  9008. --- a/drivers/net/wireless/ath/ath9k/debug.c
  9009. +++ b/drivers/net/wireless/ath/ath9k/debug.c
  9010. -@@ -1573,6 +1573,61 @@ static const struct file_operations fops
  9011. +@@ -1381,6 +1381,61 @@ static const struct file_operations fops
  9012. .llseek = default_llseek,
  9013. };
  9014. @@ -235,7 +235,7 @@
  9015. int ath9k_init_debug(struct ath_hw *ah)
  9016. {
  9017. -@@ -1597,6 +1652,10 @@ int ath9k_init_debug(struct ath_hw *ah)
  9018. +@@ -1405,6 +1460,10 @@ int ath9k_init_debug(struct ath_hw *ah)
  9019. &fops_eeprom);
  9020. debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
  9021. sc, &fops_chanbw);
  9022. diff --git a/package/mac80211/patches/531-ath9k_extra_platform_leds.patch b/package/mac80211/patches/531-ath9k_extra_platform_leds.patch
  9023. index 6c9832c..718a3d0 100644
  9024. --- a/package/mac80211/patches/531-ath9k_extra_platform_leds.patch
  9025. +++ b/package/mac80211/patches/531-ath9k_extra_platform_leds.patch
  9026. @@ -1,9 +1,9 @@
  9027. --- a/include/linux/ath9k_platform.h
  9028. +++ b/include/linux/ath9k_platform.h
  9029. -@@ -37,6 +37,9 @@ struct ath9k_platform_data {
  9030. -
  9031. - int (*get_mac_revision)(void);
  9032. +@@ -39,6 +39,9 @@ struct ath9k_platform_data {
  9033. int (*external_reset)(void);
  9034. +
  9035. + bool use_eeprom;
  9036. +
  9037. + int num_leds;
  9038. + const struct gpio_led *leds;
  9039. diff --git a/package/mac80211/patches/542-ath9k_debugfs_diag.patch b/package/mac80211/patches/542-ath9k_debugfs_diag.patch
  9040. index e1b6ff1..2a56352 100644
  9041. --- a/package/mac80211/patches/542-ath9k_debugfs_diag.patch
  9042. +++ b/package/mac80211/patches/542-ath9k_debugfs_diag.patch
  9043. @@ -1,6 +1,6 @@
  9044. --- a/drivers/net/wireless/ath/ath9k/debug.c
  9045. +++ b/drivers/net/wireless/ath/ath9k/debug.c
  9046. -@@ -1629,6 +1629,50 @@ static const struct file_operations fops
  9047. +@@ -1437,6 +1437,50 @@ static const struct file_operations fops
  9048. #endif
  9049. @@ -51,7 +51,7 @@
  9050. int ath9k_init_debug(struct ath_hw *ah)
  9051. {
  9052. struct ath_common *common = ath9k_hw_common(ah);
  9053. -@@ -1656,6 +1700,8 @@ int ath9k_init_debug(struct ath_hw *ah)
  9054. +@@ -1464,6 +1508,8 @@ int ath9k_init_debug(struct ath_hw *ah)
  9055. debugfs_create_file("gpio_led", S_IWUSR,
  9056. sc->debug.debugfs_phy, sc, &fops_gpio_led);
  9057. #endif
  9058. @@ -125,7 +125,7 @@
  9059. REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
  9060. --- a/drivers/net/wireless/ath/ath9k/main.c
  9061. +++ b/drivers/net/wireless/ath/ath9k/main.c
  9062. -@@ -602,6 +602,11 @@ irqreturn_t ath_isr(int irq, void *dev)
  9063. +@@ -606,6 +606,11 @@ irqreturn_t ath_isr(int irq, void *dev)
  9064. ath9k_debug_sync_cause(sc, sync_cause);
  9065. status &= ah->imask; /* discard unasked-for bits */
  9066. diff --git a/package/mac80211/patches/543-ath9k-allow-to-disable-bands-via-platform-data.patch b/package/mac80211/patches/543-ath9k-allow-to-disable-bands-via-platform-data.patch
  9067. index d26a5af..0501582 100644
  9068. --- a/package/mac80211/patches/543-ath9k-allow-to-disable-bands-via-platform-data.patch
  9069. +++ b/package/mac80211/patches/543-ath9k-allow-to-disable-bands-via-platform-data.patch
  9070. @@ -58,7 +58,7 @@
  9071. };
  9072. --- a/drivers/net/wireless/ath/ath9k/init.c
  9073. +++ b/drivers/net/wireless/ath/ath9k/init.c
  9074. -@@ -722,6 +722,8 @@ static int ath9k_init_softc(u16 devid, s
  9075. +@@ -518,6 +518,8 @@ static int ath9k_init_softc(u16 devid, s
  9076. ah->is_clk_25mhz = pdata->is_clk_25mhz;
  9077. ah->get_mac_revision = pdata->get_mac_revision;
  9078. ah->external_reset = pdata->external_reset;
  9079. diff --git a/package/mac80211/patches/550-ath9k_entropy_from_adc.patch b/package/mac80211/patches/550-ath9k_entropy_from_adc.patch
  9080. index b59c362..7210a02 100644
  9081. --- a/package/mac80211/patches/550-ath9k_entropy_from_adc.patch
  9082. +++ b/package/mac80211/patches/550-ath9k_entropy_from_adc.patch
  9083. @@ -55,7 +55,7 @@
  9084. ops->spectral_scan_config = ar9003_hw_spectral_scan_config;
  9085. --- a/drivers/net/wireless/ath/ath9k/init.c
  9086. +++ b/drivers/net/wireless/ath/ath9k/init.c
  9087. -@@ -846,7 +846,8 @@ static void ath9k_init_txpower_limits(st
  9088. +@@ -646,7 +646,8 @@ static void ath9k_init_txpower_limits(st
  9089. if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ)
  9090. ath9k_init_band_txpower(sc, IEEE80211_BAND_5GHZ);
  9091. @@ -64,8 +64,8 @@
  9092. + ah->curchan = curchan;
  9093. }
  9094. - void ath9k_reload_chainmask_settings(struct ath_softc *sc)
  9095. -@@ -980,6 +981,18 @@ static void ath9k_set_hw_capab(struct at
  9096. + static const struct ieee80211_iface_limit if_limits[] = {
  9097. +@@ -774,6 +775,18 @@ static void ath9k_set_hw_capab(struct at
  9098. SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
  9099. }
  9100. @@ -84,7 +84,7 @@
  9101. int ath9k_init_device(u16 devid, struct ath_softc *sc,
  9102. const struct ath_bus_ops *bus_ops)
  9103. {
  9104. -@@ -1025,6 +1038,8 @@ int ath9k_init_device(u16 devid, struct
  9105. +@@ -822,6 +835,8 @@ int ath9k_init_device(u16 devid, struct
  9106. ARRAY_SIZE(ath9k_tpt_blink));
  9107. #endif
  9108. @@ -110,7 +110,7 @@
  9109. static inline void ath9k_hw_set_bt_ant_diversity(struct ath_hw *ah, bool enable)
  9110. --- a/drivers/net/wireless/ath/ath9k/link.c
  9111. +++ b/drivers/net/wireless/ath/ath9k/link.c
  9112. -@@ -307,6 +307,11 @@ void ath_ani_calibrate(unsigned long dat
  9113. +@@ -308,6 +308,11 @@ void ath_ani_calibrate(unsigned long dat
  9114. unsigned int timestamp = jiffies_to_msecs(jiffies);
  9115. u32 cal_interval, short_cal_interval, long_cal_interval;
  9116. unsigned long flags;
  9117. diff --git a/package/mac80211/patches/551-ath9k-ar933x-usb-hang-workaround.patch b/package/mac80211/patches/551-ath9k-ar933x-usb-hang-workaround.patch
  9118. new file mode 100644
  9119. index 0000000..10280d9
  9120. --- /dev/null
  9121. +++ b/package/mac80211/patches/551-ath9k-ar933x-usb-hang-workaround.patch
  9122. @@ -0,0 +1,79 @@
  9123. +--- a/drivers/net/wireless/ath/ath9k/hw.c
  9124. ++++ b/drivers/net/wireless/ath/ath9k/hw.c
  9125. +@@ -215,6 +215,19 @@ void ath9k_hw_get_channel_centers(struct
  9126. + centers->synth_center + (extoff * HT40_CHANNEL_CENTER_SHIFT);
  9127. + }
  9128. +
  9129. ++static inline void ath9k_hw_disable_pll_lock_detect(struct ath_hw *ah)
  9130. ++{
  9131. ++ /* On AR9330 and AR9340 devices, some PHY registers must be
  9132. ++ * tuned to gain better stability/performance. These registers
  9133. ++ * might be changed while doing wlan reset so the registers must
  9134. ++ * be reprogrammed after each reset.
  9135. ++ */
  9136. ++ REG_CLR_BIT(ah, AR_PHY_USB_CTRL1, BIT(20));
  9137. ++ REG_RMW(ah, AR_PHY_USB_CTRL2,
  9138. ++ (1 << 21) | (0xf << 22),
  9139. ++ (1 << 21) | (0x3 << 22));
  9140. ++}
  9141. ++
  9142. + /******************/
  9143. + /* Chip Revisions */
  9144. + /******************/
  9145. +@@ -1337,6 +1350,9 @@ static bool ath9k_hw_set_reset(struct at
  9146. + if (AR_SREV_9100(ah))
  9147. + udelay(50);
  9148. +
  9149. ++ if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
  9150. ++ ath9k_hw_disable_pll_lock_detect(ah);
  9151. ++
  9152. + return true;
  9153. + }
  9154. +
  9155. +@@ -1436,6 +1452,9 @@ static bool ath9k_hw_chip_reset(struct a
  9156. + ar9003_hw_internal_regulator_apply(ah);
  9157. + ath9k_hw_init_pll(ah, chan);
  9158. +
  9159. ++ if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
  9160. ++ ath9k_hw_disable_pll_lock_detect(ah);
  9161. ++
  9162. + return true;
  9163. + }
  9164. +
  9165. +@@ -1730,8 +1749,14 @@ static int ath9k_hw_do_fastcc(struct ath
  9166. + if (AR_SREV_9271(ah))
  9167. + ar9002_hw_load_ani_reg(ah, chan);
  9168. +
  9169. ++ if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
  9170. ++ ath9k_hw_disable_pll_lock_detect(ah);
  9171. ++
  9172. + return 0;
  9173. + fail:
  9174. ++ if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
  9175. ++ ath9k_hw_disable_pll_lock_detect(ah);
  9176. ++
  9177. + return -EINVAL;
  9178. + }
  9179. +
  9180. +@@ -1959,6 +1984,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st
  9181. + if (AR_SREV_9565(ah) && common->bt_ant_diversity)
  9182. + REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
  9183. +
  9184. ++ if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
  9185. ++ ath9k_hw_disable_pll_lock_detect(ah);
  9186. ++
  9187. + return 0;
  9188. + }
  9189. + EXPORT_SYMBOL(ath9k_hw_reset);
  9190. +--- a/drivers/net/wireless/ath/ath9k/phy.h
  9191. ++++ b/drivers/net/wireless/ath/ath9k/phy.h
  9192. +@@ -48,6 +48,9 @@
  9193. + #define AR_PHY_PLL_CONTROL 0x16180
  9194. + #define AR_PHY_PLL_MODE 0x16184
  9195. +
  9196. ++#define AR_PHY_USB_CTRL1 0x16c84
  9197. ++#define AR_PHY_USB_CTRL2 0x16c88
  9198. ++
  9199. + enum ath9k_ant_div_comb_lna_conf {
  9200. + ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2,
  9201. + ATH_ANT_DIV_COMB_LNA2,
  9202. diff --git a/package/mac80211/patches/551-ath9k_p2p_ifcomb.patch b/package/mac80211/patches/551-ath9k_p2p_ifcomb.patch
  9203. deleted file mode 100644
  9204. index ffffe0c..0000000
  9205. --- a/package/mac80211/patches/551-ath9k_p2p_ifcomb.patch
  9206. +++ /dev/null
  9207. @@ -1,33 +0,0 @@
  9208. -From c997a1da25fe7c717ed099888b8eb35d4e139e70 Mon Sep 17 00:00:00 2001
  9209. -From: Felix Fietkau <nbd@openwrt.org>
  9210. -Date: Sun, 8 Dec 2013 08:52:52 +0100
  9211. -Subject: [PATCH] ath9k: support only one P2P interface
  9212. -
  9213. -Preparation for adding P2P powersave and multi-channel support.
  9214. -
  9215. -Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  9216. ----
  9217. - drivers/net/wireless/ath/ath9k/init.c | 4 ++--
  9218. - 1 file changed, 2 insertions(+), 2 deletions(-)
  9219. -
  9220. ---- a/drivers/net/wireless/ath/ath9k/init.c
  9221. -+++ b/drivers/net/wireless/ath/ath9k/init.c
  9222. -@@ -863,15 +863,15 @@ void ath9k_reload_chainmask_settings(str
  9223. -
  9224. - static const struct ieee80211_iface_limit if_limits[] = {
  9225. - { .max = 2048, .types = BIT(NL80211_IFTYPE_STATION) |
  9226. -- BIT(NL80211_IFTYPE_P2P_CLIENT) |
  9227. - BIT(NL80211_IFTYPE_WDS) },
  9228. - { .max = 8, .types =
  9229. - #ifdef CPTCFG_MAC80211_MESH
  9230. - BIT(NL80211_IFTYPE_MESH_POINT) |
  9231. - #endif
  9232. -- BIT(NL80211_IFTYPE_AP) |
  9233. -- BIT(NL80211_IFTYPE_P2P_GO) },
  9234. -+ BIT(NL80211_IFTYPE_AP) },
  9235. - { .max = 1, .types = BIT(NL80211_IFTYPE_ADHOC) },
  9236. -+ { .max = 1, .types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
  9237. -+ BIT(NL80211_IFTYPE_P2P_GO) },
  9238. - };
  9239. -
  9240. - static const struct ieee80211_iface_limit if_dfs_limits[] = {
  9241. diff --git a/package/mac80211/patches/552-ath9k_p2p_ps_support.patch b/package/mac80211/patches/552-ath9k_p2p_ps_support.patch
  9242. deleted file mode 100644
  9243. index 4a61db3..0000000
  9244. --- a/package/mac80211/patches/552-ath9k_p2p_ps_support.patch
  9245. +++ /dev/null
  9246. @@ -1,247 +0,0 @@
  9247. -From 6744d0a7ea037c7d65e13ca906da93009b241d00 Mon Sep 17 00:00:00 2001
  9248. -From: Felix Fietkau <nbd@openwrt.org>
  9249. -Date: Tue, 11 Feb 2014 11:16:24 +0100
  9250. -Subject: [PATCH] ath9k: implement p2p client powersave support
  9251. -
  9252. -Use generic TSF timers to trigger powersave state changes based
  9253. -information from the P2P NoA attribute.
  9254. -Opportunistic Powersave is not handled, because the driver does not
  9255. -support powersave at the moment.
  9256. -
  9257. -Signed-off-by: Felix Fietkau <nbd@openwrt.org>
  9258. ----
  9259. - drivers/net/wireless/ath/ath9k/ath9k.h | 12 ++++
  9260. - drivers/net/wireless/ath/ath9k/init.c | 6 ++
  9261. - drivers/net/wireless/ath/ath9k/main.c | 104 +++++++++++++++++++++++++++++++++
  9262. - drivers/net/wireless/ath/ath9k/recv.c | 3 +
  9263. - 4 files changed, 125 insertions(+)
  9264. -
  9265. ---- a/drivers/net/wireless/ath/ath9k/main.c
  9266. -+++ b/drivers/net/wireless/ath/ath9k/main.c
  9267. -@@ -261,6 +261,8 @@ static bool ath_complete_reset(struct at
  9268. - sc->gtt_cnt = 0;
  9269. - ieee80211_wake_queues(sc->hw);
  9270. -
  9271. -+ ath9k_p2p_ps_timer(sc);
  9272. -+
  9273. - return true;
  9274. - }
  9275. -
  9276. -@@ -1126,6 +1128,8 @@ static int ath9k_add_interface(struct ie
  9277. - if (ath9k_uses_beacons(vif->type))
  9278. - ath9k_beacon_assign_slot(sc, vif);
  9279. -
  9280. -+ avp->vif = vif;
  9281. -+
  9282. - an->sc = sc;
  9283. - an->sta = NULL;
  9284. - an->vif = vif;
  9285. -@@ -1170,6 +1174,29 @@ static int ath9k_change_interface(struct
  9286. - return 0;
  9287. - }
  9288. -
  9289. -+static void
  9290. -+ath9k_update_p2p_ps_timer(struct ath_softc *sc, struct ath_vif *avp)
  9291. -+{
  9292. -+ struct ath_hw *ah = sc->sc_ah;
  9293. -+ s32 tsf, target_tsf;
  9294. -+
  9295. -+ if (!avp || !avp->noa.has_next_tsf)
  9296. -+ return;
  9297. -+
  9298. -+ ath9k_hw_gen_timer_stop(ah, sc->p2p_ps_timer);
  9299. -+
  9300. -+ tsf = ath9k_hw_gettsf32(sc->sc_ah);
  9301. -+
  9302. -+ target_tsf = avp->noa.next_tsf;
  9303. -+ if (!avp->noa.absent)
  9304. -+ target_tsf -= ATH_P2P_PS_STOP_TIME;
  9305. -+
  9306. -+ if (target_tsf - tsf < ATH_P2P_PS_STOP_TIME)
  9307. -+ target_tsf = tsf + ATH_P2P_PS_STOP_TIME;
  9308. -+
  9309. -+ ath9k_hw_gen_timer_start(ah, sc->p2p_ps_timer, (u32) target_tsf, 1000000);
  9310. -+}
  9311. -+
  9312. - static void ath9k_remove_interface(struct ieee80211_hw *hw,
  9313. - struct ieee80211_vif *vif)
  9314. - {
  9315. -@@ -1181,6 +1208,13 @@ static void ath9k_remove_interface(struc
  9316. -
  9317. - mutex_lock(&sc->mutex);
  9318. -
  9319. -+ spin_lock_bh(&sc->sc_pcu_lock);
  9320. -+ if (avp == sc->p2p_ps_vif) {
  9321. -+ sc->p2p_ps_vif = NULL;
  9322. -+ ath9k_update_p2p_ps_timer(sc, NULL);
  9323. -+ }
  9324. -+ spin_unlock_bh(&sc->sc_pcu_lock);
  9325. -+
  9326. - sc->nvifs--;
  9327. - sc->tx99_vif = NULL;
  9328. -
  9329. -@@ -1649,6 +1683,70 @@ static void ath9k_bss_assoc_iter(void *d
  9330. - ath9k_set_assoc_state(sc, vif);
  9331. - }
  9332. -
  9333. -+void ath9k_p2p_ps_timer(void *priv)
  9334. -+{
  9335. -+ struct ath_softc *sc = priv;
  9336. -+ struct ath_vif *avp = sc->p2p_ps_vif;
  9337. -+ struct ieee80211_vif *vif;
  9338. -+ struct ieee80211_sta *sta;
  9339. -+ struct ath_node *an;
  9340. -+ u32 tsf;
  9341. -+
  9342. -+ if (!avp)
  9343. -+ return;
  9344. -+
  9345. -+ tsf = ath9k_hw_gettsf32(sc->sc_ah);
  9346. -+ if (!avp->noa.absent)
  9347. -+ tsf += ATH_P2P_PS_STOP_TIME;
  9348. -+
  9349. -+ if (!avp->noa.has_next_tsf ||
  9350. -+ avp->noa.next_tsf - tsf > BIT(31))
  9351. -+ ieee80211_update_p2p_noa(&avp->noa, tsf);
  9352. -+
  9353. -+ ath9k_update_p2p_ps_timer(sc, avp);
  9354. -+
  9355. -+ rcu_read_lock();
  9356. -+
  9357. -+ vif = avp->vif;
  9358. -+ sta = ieee80211_find_sta(vif, vif->bss_conf.bssid);
  9359. -+ if (!sta)
  9360. -+ goto out;
  9361. -+
  9362. -+ an = (void *) sta->drv_priv;
  9363. -+ if (an->sleeping == !!avp->noa.absent)
  9364. -+ goto out;
  9365. -+
  9366. -+ an->sleeping = avp->noa.absent;
  9367. -+ if (an->sleeping)
  9368. -+ ath_tx_aggr_sleep(sta, sc, an);
  9369. -+ else
  9370. -+ ath_tx_aggr_wakeup(sc, an);
  9371. -+
  9372. -+out:
  9373. -+ rcu_read_unlock();
  9374. -+}
  9375. -+
  9376. -+void ath9k_update_p2p_ps(struct ath_softc *sc, struct ieee80211_vif *vif)
  9377. -+{
  9378. -+ struct ath_vif *avp = (void *)vif->drv_priv;
  9379. -+ u32 tsf;
  9380. -+
  9381. -+ if (!sc->p2p_ps_timer)
  9382. -+ return;
  9383. -+
  9384. -+ if (vif->type != NL80211_IFTYPE_STATION || !vif->p2p)
  9385. -+ return;
  9386. -+
  9387. -+ sc->p2p_ps_vif = avp;
  9388. -+
  9389. -+ if (sc->ps_flags & PS_BEACON_SYNC)
  9390. -+ return;
  9391. -+
  9392. -+ tsf = ath9k_hw_gettsf32(sc->sc_ah);
  9393. -+ ieee80211_parse_p2p_noa(&vif->bss_conf.p2p_noa_attr, &avp->noa, tsf);
  9394. -+ ath9k_update_p2p_ps_timer(sc, avp);
  9395. -+}
  9396. -+
  9397. - static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
  9398. - struct ieee80211_vif *vif,
  9399. - struct ieee80211_bss_conf *bss_conf,
  9400. -@@ -1723,6 +1821,12 @@ static void ath9k_bss_info_changed(struc
  9401. - }
  9402. - }
  9403. -
  9404. -+ if (changed & BSS_CHANGED_P2P_PS) {
  9405. -+ spin_lock_bh(&sc->sc_pcu_lock);
  9406. -+ ath9k_update_p2p_ps(sc, vif);
  9407. -+ spin_unlock_bh(&sc->sc_pcu_lock);
  9408. -+ }
  9409. -+
  9410. - if (changed & CHECK_ANI)
  9411. - ath_check_ani(sc);
  9412. -
  9413. ---- a/drivers/net/wireless/ath/ath9k/ath9k.h
  9414. -+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
  9415. -@@ -115,6 +115,9 @@ int ath_descdma_setup(struct ath_softc *
  9416. - #define ATH_TXFIFO_DEPTH 8
  9417. - #define ATH_TX_ERROR 0x01
  9418. -
  9419. -+/* Stop tx traffic 1ms before the GO goes away */
  9420. -+#define ATH_P2P_PS_STOP_TIME 1000
  9421. -+
  9422. - #define IEEE80211_SEQ_SEQ_SHIFT 4
  9423. - #define IEEE80211_SEQ_MAX 4096
  9424. - #define IEEE80211_WEP_IVLEN 3
  9425. -@@ -363,11 +366,15 @@ void ath9k_release_buffered_frames(struc
  9426. - /********/
  9427. -
  9428. - struct ath_vif {
  9429. -+ struct ieee80211_vif *vif;
  9430. - struct ath_node mcast_node;
  9431. - int av_bslot;
  9432. - bool primary_sta_vif;
  9433. - __le64 tsf_adjust; /* TSF adjustment for staggered beacons */
  9434. - struct ath_buf *av_bcbuf;
  9435. -+
  9436. -+ /* P2P Client */
  9437. -+ struct ieee80211_noa_data noa;
  9438. - };
  9439. -
  9440. - struct ath9k_vif_iter_data {
  9441. -@@ -472,6 +479,8 @@ int ath_update_survey_stats(struct ath_s
  9442. - void ath_update_survey_nf(struct ath_softc *sc, int channel);
  9443. - void ath9k_queue_reset(struct ath_softc *sc, enum ath_reset_type type);
  9444. - void ath_ps_full_sleep(unsigned long data);
  9445. -+void ath9k_p2p_ps_timer(void *priv);
  9446. -+void ath9k_update_p2p_ps(struct ath_softc *sc, struct ieee80211_vif *vif);
  9447. -
  9448. - /**********/
  9449. - /* BTCOEX */
  9450. -@@ -741,6 +750,9 @@ struct ath_softc {
  9451. - struct completion paprd_complete;
  9452. - wait_queue_head_t tx_wait;
  9453. -
  9454. -+ struct ath_gen_timer *p2p_ps_timer;
  9455. -+ struct ath_vif *p2p_ps_vif;
  9456. -+
  9457. - unsigned long sc_flags;
  9458. - unsigned long driver_data;
  9459. -
  9460. ---- a/drivers/net/wireless/ath/ath9k/init.c
  9461. -+++ b/drivers/net/wireless/ath/ath9k/init.c
  9462. -@@ -797,6 +797,9 @@ static int ath9k_init_softc(u16 devid, s
  9463. - if (ret)
  9464. - goto err_btcoex;
  9465. -
  9466. -+ sc->p2p_ps_timer = ath_gen_timer_alloc(sc->sc_ah, ath9k_p2p_ps_timer,
  9467. -+ NULL, sc, AR_FIRST_NDP_TIMER);
  9468. -+
  9469. - ath9k_cmn_init_crypto(sc->sc_ah);
  9470. - ath9k_init_misc(sc);
  9471. - ath_fill_led_pin(sc);
  9472. -@@ -1082,6 +1085,9 @@ static void ath9k_deinit_softc(struct at
  9473. - {
  9474. - int i = 0;
  9475. -
  9476. -+ if (sc->p2p_ps_timer)
  9477. -+ ath_gen_timer_free(sc->sc_ah, sc->p2p_ps_timer);
  9478. -+
  9479. - ath9k_deinit_btcoex(sc);
  9480. -
  9481. - for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++)
  9482. ---- a/drivers/net/wireless/ath/ath9k/recv.c
  9483. -+++ b/drivers/net/wireless/ath/ath9k/recv.c
  9484. -@@ -539,6 +539,9 @@ static void ath_rx_ps_beacon(struct ath_
  9485. - ath_dbg(common, PS,
  9486. - "Reconfigure beacon timers based on synchronized timestamp\n");
  9487. - ath9k_set_beacon(sc);
  9488. -+
  9489. -+ if (sc->p2p_ps_vif)
  9490. -+ ath9k_update_p2p_ps(sc, sc->p2p_ps_vif->vif);
  9491. - }
  9492. -
  9493. - if (ath_beacon_dtim_pending_cab(skb)) {
  9494. diff --git a/package/mac80211/patches/560-ath9k_pcoem_optional.patch b/package/mac80211/patches/560-ath9k_pcoem_optional.patch
  9495. new file mode 100644
  9496. index 0000000..4d4ea3b
  9497. --- /dev/null
  9498. +++ b/package/mac80211/patches/560-ath9k_pcoem_optional.patch
  9499. @@ -0,0 +1,249 @@
  9500. +--- a/drivers/net/wireless/ath/ath9k/Kconfig
  9501. ++++ b/drivers/net/wireless/ath/ath9k/Kconfig
  9502. +@@ -133,6 +133,11 @@ config ATH9K_RFKILL
  9503. + seconds. Turn off to save power, but enable it if you have
  9504. + a platform that can toggle the RF-Kill GPIO.
  9505. +
  9506. ++config ATH9K_PCOEM
  9507. ++ bool "Atheros ath9k support for PC OEM cards" if EXPERT
  9508. ++ depends on ATH9K
  9509. ++ default y
  9510. ++
  9511. + config ATH9K_HTC
  9512. + tristate "Atheros HTC based wireless cards support"
  9513. + depends on m
  9514. +--- a/drivers/net/wireless/ath/ath9k/Makefile
  9515. ++++ b/drivers/net/wireless/ath/ath9k/Makefile
  9516. +@@ -31,7 +31,6 @@ ath9k_hw-y:= \
  9517. + ar5008_phy.o \
  9518. + ar9002_calib.o \
  9519. + ar9003_calib.o \
  9520. +- ar9003_rtt.o \
  9521. + calib.o \
  9522. + eeprom.o \
  9523. + eeprom_def.o \
  9524. +@@ -48,6 +47,8 @@ ath9k_hw-$(CPTCFG_ATH9K_WOW) += ar9003_w
  9525. +
  9526. + ath9k_hw-$(CPTCFG_ATH9K_BTCOEX_SUPPORT) += btcoex.o \
  9527. + ar9003_mci.o
  9528. ++ath9k_hw-$(CPTCFG_ATH9K_PCOEM) += ar9003_rtt.o
  9529. ++
  9530. + obj-$(CPTCFG_ATH9K_HW) += ath9k_hw.o
  9531. +
  9532. + obj-$(CPTCFG_ATH9K_COMMON) += ath9k_common.o
  9533. +--- a/drivers/net/wireless/ath/ath9k/ar9003_rtt.h
  9534. ++++ b/drivers/net/wireless/ath/ath9k/ar9003_rtt.h
  9535. +@@ -17,6 +17,7 @@
  9536. + #ifndef AR9003_RTT_H
  9537. + #define AR9003_RTT_H
  9538. +
  9539. ++#ifdef CPTCFG_ATH9K_PCOEM
  9540. + void ar9003_hw_rtt_enable(struct ath_hw *ah);
  9541. + void ar9003_hw_rtt_disable(struct ath_hw *ah);
  9542. + void ar9003_hw_rtt_set_mask(struct ath_hw *ah, u32 rtt_mask);
  9543. +@@ -25,5 +26,40 @@ void ar9003_hw_rtt_load_hist(struct ath_
  9544. + void ar9003_hw_rtt_fill_hist(struct ath_hw *ah);
  9545. + void ar9003_hw_rtt_clear_hist(struct ath_hw *ah);
  9546. + bool ar9003_hw_rtt_restore(struct ath_hw *ah, struct ath9k_channel *chan);
  9547. ++#else
  9548. ++static inline void ar9003_hw_rtt_enable(struct ath_hw *ah)
  9549. ++{
  9550. ++}
  9551. ++
  9552. ++static inline void ar9003_hw_rtt_disable(struct ath_hw *ah)
  9553. ++{
  9554. ++}
  9555. ++
  9556. ++static inline void ar9003_hw_rtt_set_mask(struct ath_hw *ah, u32 rtt_mask)
  9557. ++{
  9558. ++}
  9559. ++
  9560. ++static inline bool ar9003_hw_rtt_force_restore(struct ath_hw *ah)
  9561. ++{
  9562. ++ return false;
  9563. ++}
  9564. ++
  9565. ++static inline void ar9003_hw_rtt_load_hist(struct ath_hw *ah)
  9566. ++{
  9567. ++}
  9568. ++
  9569. ++static inline void ar9003_hw_rtt_fill_hist(struct ath_hw *ah)
  9570. ++{
  9571. ++}
  9572. ++
  9573. ++static inline void ar9003_hw_rtt_clear_hist(struct ath_hw *ah)
  9574. ++{
  9575. ++}
  9576. ++
  9577. ++static inline bool ar9003_hw_rtt_restore(struct ath_hw *ah, struct ath9k_channel *chan)
  9578. ++{
  9579. ++ return false;
  9580. ++}
  9581. ++#endif
  9582. +
  9583. + #endif
  9584. +--- a/drivers/net/wireless/ath/ath9k/hw.h
  9585. ++++ b/drivers/net/wireless/ath/ath9k/hw.h
  9586. +@@ -244,13 +244,20 @@ enum ath9k_hw_caps {
  9587. + ATH9K_HW_CAP_2GHZ = BIT(11),
  9588. + ATH9K_HW_CAP_5GHZ = BIT(12),
  9589. + ATH9K_HW_CAP_APM = BIT(13),
  9590. ++#ifdef CPTCFG_ATH9K_PCOEM
  9591. + ATH9K_HW_CAP_RTT = BIT(14),
  9592. + ATH9K_HW_CAP_MCI = BIT(15),
  9593. +- ATH9K_HW_CAP_DFS = BIT(16),
  9594. +- ATH9K_HW_WOW_DEVICE_CAPABLE = BIT(17),
  9595. +- ATH9K_HW_CAP_PAPRD = BIT(18),
  9596. +- ATH9K_HW_CAP_FCC_BAND_SWITCH = BIT(19),
  9597. +- ATH9K_HW_CAP_BT_ANT_DIV = BIT(20),
  9598. ++ ATH9K_HW_WOW_DEVICE_CAPABLE = BIT(16),
  9599. ++ ATH9K_HW_CAP_BT_ANT_DIV = BIT(17),
  9600. ++#else
  9601. ++ ATH9K_HW_CAP_RTT = 0,
  9602. ++ ATH9K_HW_CAP_MCI = 0,
  9603. ++ ATH9K_HW_WOW_DEVICE_CAPABLE = 0,
  9604. ++ ATH9K_HW_CAP_BT_ANT_DIV = 0,
  9605. ++#endif
  9606. ++ ATH9K_HW_CAP_DFS = BIT(18),
  9607. ++ ATH9K_HW_CAP_PAPRD = BIT(19),
  9608. ++ ATH9K_HW_CAP_FCC_BAND_SWITCH = BIT(20),
  9609. + };
  9610. +
  9611. + /*
  9612. +--- a/drivers/net/wireless/ath/ath9k/init.c
  9613. ++++ b/drivers/net/wireless/ath/ath9k/init.c
  9614. +@@ -355,6 +355,9 @@ static void ath9k_init_pcoem_platform(st
  9615. + struct ath9k_hw_capabilities *pCap = &ah->caps;
  9616. + struct ath_common *common = ath9k_hw_common(ah);
  9617. +
  9618. ++ if (!IS_ENABLED(CPTCFG_ATH9K_PCOEM))
  9619. ++ return;
  9620. ++
  9621. + if (common->bus_ops->ath_bus_type != ATH_PCI)
  9622. + return;
  9623. +
  9624. +--- a/drivers/net/wireless/ath/ath9k/pci.c
  9625. ++++ b/drivers/net/wireless/ath/ath9k/pci.c
  9626. +@@ -30,6 +30,7 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_i
  9627. + { PCI_VDEVICE(ATHEROS, 0x0029) }, /* PCI */
  9628. + { PCI_VDEVICE(ATHEROS, 0x002A) }, /* PCI-E */
  9629. +
  9630. ++#ifdef CPTCFG_ATH9K_PCOEM
  9631. + { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
  9632. + 0x002A,
  9633. + PCI_VENDOR_ID_AZWAVE,
  9634. +@@ -82,6 +83,7 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_i
  9635. + PCI_VENDOR_ID_AZWAVE,
  9636. + 0x2C37),
  9637. + .driver_data = ATH9K_PCI_BT_ANT_DIV },
  9638. ++#endif
  9639. +
  9640. + { PCI_VDEVICE(ATHEROS, 0x002B) }, /* PCI-E */
  9641. + { PCI_VDEVICE(ATHEROS, 0x002C) }, /* PCI-E 802.11n bonded out */
  9642. +@@ -102,6 +104,7 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_i
  9643. +
  9644. + { PCI_VDEVICE(ATHEROS, 0x0030) }, /* PCI-E AR9300 */
  9645. +
  9646. ++#ifdef CPTCFG_ATH9K_PCOEM
  9647. + /* PCI-E CUS198 */
  9648. + { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
  9649. + 0x0032,
  9650. +@@ -294,10 +297,12 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_i
  9651. + PCI_VENDOR_ID_ASUSTEK,
  9652. + 0x850D),
  9653. + .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
  9654. ++#endif
  9655. +
  9656. + { PCI_VDEVICE(ATHEROS, 0x0032) }, /* PCI-E AR9485 */
  9657. + { PCI_VDEVICE(ATHEROS, 0x0033) }, /* PCI-E AR9580 */
  9658. +
  9659. ++#ifdef CPTCFG_ATH9K_PCOEM
  9660. + /* PCI-E CUS217 */
  9661. + { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
  9662. + 0x0034,
  9663. +@@ -657,6 +662,7 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_i
  9664. + /* PCI-E AR9565 (WB335) */
  9665. + { PCI_VDEVICE(ATHEROS, 0x0036),
  9666. + .driver_data = ATH9K_PCI_BT_ANT_DIV },
  9667. ++#endif
  9668. +
  9669. + { PCI_VDEVICE(ATHEROS, 0xabcd) }, /* PCI-E internal chip default ID */
  9670. + { 0 }
  9671. +--- a/drivers/net/wireless/ath/ath9k/reg.h
  9672. ++++ b/drivers/net/wireless/ath/ath9k/reg.h
  9673. +@@ -891,10 +891,21 @@
  9674. + (AR_SREV_9330((_ah)) && \
  9675. + ((_ah)->hw_version.macRev == AR_SREV_REVISION_9330_12))
  9676. +
  9677. ++#ifdef CPTCFG_ATH9K_PCOEM
  9678. ++#define AR_SREV_9462(_ah) \
  9679. ++ (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9462))
  9680. + #define AR_SREV_9485(_ah) \
  9681. + (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9485))
  9682. ++#define AR_SREV_9565(_ah) \
  9683. ++ (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9565))
  9684. ++#else
  9685. ++#define AR_SREV_9462(_ah) 0
  9686. ++#define AR_SREV_9485(_ah) 0
  9687. ++#define AR_SREV_9565(_ah) 0
  9688. ++#endif
  9689. ++
  9690. + #define AR_SREV_9485_11_OR_LATER(_ah) \
  9691. +- (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9485) && \
  9692. ++ (AR_SREV_9485(_ah) && \
  9693. + ((_ah)->hw_version.macRev >= AR_SREV_REVISION_9485_11))
  9694. + #define AR_SREV_9485_OR_LATER(_ah) \
  9695. + (((_ah)->hw_version.macVersion >= AR_SREV_VERSION_9485))
  9696. +@@ -910,34 +921,30 @@
  9697. + (AR_SREV_9285_12_OR_LATER(_ah) && \
  9698. + ((REG_READ(_ah, AR_AN_SYNTH9) & 0x7) == 0x1))
  9699. +
  9700. +-#define AR_SREV_9462(_ah) \
  9701. +- (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9462))
  9702. + #define AR_SREV_9462_20(_ah) \
  9703. +- (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9462) && \
  9704. ++ (AR_SREV_9462(_ah) && \
  9705. + ((_ah)->hw_version.macRev == AR_SREV_REVISION_9462_20))
  9706. + #define AR_SREV_9462_21(_ah) \
  9707. +- (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9462) && \
  9708. ++ (AR_SREV_9462(_ah) && \
  9709. + ((_ah)->hw_version.macRev == AR_SREV_REVISION_9462_21))
  9710. + #define AR_SREV_9462_20_OR_LATER(_ah) \
  9711. +- (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9462) && \
  9712. ++ (AR_SREV_9462(_ah) && \
  9713. + ((_ah)->hw_version.macRev >= AR_SREV_REVISION_9462_20))
  9714. + #define AR_SREV_9462_21_OR_LATER(_ah) \
  9715. +- (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9462) && \
  9716. ++ (AR_SREV_9462(_ah) && \
  9717. + ((_ah)->hw_version.macRev >= AR_SREV_REVISION_9462_21))
  9718. +
  9719. +-#define AR_SREV_9565(_ah) \
  9720. +- (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9565))
  9721. + #define AR_SREV_9565_10(_ah) \
  9722. +- (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9565) && \
  9723. ++ (AR_SREV_9565(_ah) && \
  9724. + ((_ah)->hw_version.macRev == AR_SREV_REVISION_9565_10))
  9725. + #define AR_SREV_9565_101(_ah) \
  9726. +- (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9565) && \
  9727. ++ (AR_SREV_9565(_ah) && \
  9728. + ((_ah)->hw_version.macRev == AR_SREV_REVISION_9565_101))
  9729. + #define AR_SREV_9565_11(_ah) \
  9730. +- (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9565) && \
  9731. ++ (AR_SREV_9565(_ah) && \
  9732. + ((_ah)->hw_version.macRev == AR_SREV_REVISION_9565_11))
  9733. + #define AR_SREV_9565_11_OR_LATER(_ah) \
  9734. +- (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9565) && \
  9735. ++ (AR_SREV_9565(_ah) && \
  9736. + ((_ah)->hw_version.macRev >= AR_SREV_REVISION_9565_11))
  9737. +
  9738. + #define AR_SREV_9550(_ah) \
  9739. +--- a/.local-symbols
  9740. ++++ b/.local-symbols
  9741. +@@ -129,6 +129,7 @@ ATH9K_HW=
  9742. + ATH9K_COMMON=
  9743. + ATH9K_DFS_DEBUGFS=
  9744. + ATH9K_BTCOEX_SUPPORT=
  9745. ++ATH9K_PCOEM=
  9746. + ATH9K=
  9747. + ATH9K_PCI=
  9748. + ATH9K_AHB=
  9749. diff --git a/package/mac80211/patches/561-ath9k_remove_gain_tables.patch b/package/mac80211/patches/561-ath9k_remove_gain_tables.patch
  9750. new file mode 100644
  9751. index 0000000..852eae3
  9752. --- /dev/null
  9753. +++ b/package/mac80211/patches/561-ath9k_remove_gain_tables.patch
  9754. @@ -0,0 +1,12 @@
  9755. +--- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c
  9756. ++++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
  9757. +@@ -663,9 +663,6 @@ static void ar9003_tx_gain_table_mode5(s
  9758. + if (AR_SREV_9485_11_OR_LATER(ah))
  9759. + INIT_INI_ARRAY(&ah->iniModesTxGain,
  9760. + ar9485Modes_green_ob_db_tx_gain_1_1);
  9761. +- else if (AR_SREV_9340(ah))
  9762. +- INIT_INI_ARRAY(&ah->iniModesTxGain,
  9763. +- ar9340Modes_ub124_tx_gain_table_1p0);
  9764. + else if (AR_SREV_9580(ah))
  9765. + INIT_INI_ARRAY(&ah->iniModesTxGain,
  9766. + ar9580_1p0_type5_tx_gain_table);
  9767. diff --git a/package/mac80211/patches/562-ath9k_ani_ws_detect.patch b/package/mac80211/patches/562-ath9k_ani_ws_detect.patch
  9768. new file mode 100644
  9769. index 0000000..1e4f451
  9770. --- /dev/null
  9771. +++ b/package/mac80211/patches/562-ath9k_ani_ws_detect.patch
  9772. @@ -0,0 +1,155 @@
  9773. +--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
  9774. ++++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
  9775. +@@ -929,55 +929,6 @@ static bool ar5008_hw_ani_control_new(st
  9776. + * on == 0 means more noise imm
  9777. + */
  9778. + u32 on = param ? 1 : 0;
  9779. +- /*
  9780. +- * make register setting for default
  9781. +- * (weak sig detect ON) come from INI file
  9782. +- */
  9783. +- int m1ThreshLow = on ?
  9784. +- aniState->iniDef.m1ThreshLow : m1ThreshLow_off;
  9785. +- int m2ThreshLow = on ?
  9786. +- aniState->iniDef.m2ThreshLow : m2ThreshLow_off;
  9787. +- int m1Thresh = on ?
  9788. +- aniState->iniDef.m1Thresh : m1Thresh_off;
  9789. +- int m2Thresh = on ?
  9790. +- aniState->iniDef.m2Thresh : m2Thresh_off;
  9791. +- int m2CountThr = on ?
  9792. +- aniState->iniDef.m2CountThr : m2CountThr_off;
  9793. +- int m2CountThrLow = on ?
  9794. +- aniState->iniDef.m2CountThrLow : m2CountThrLow_off;
  9795. +- int m1ThreshLowExt = on ?
  9796. +- aniState->iniDef.m1ThreshLowExt : m1ThreshLowExt_off;
  9797. +- int m2ThreshLowExt = on ?
  9798. +- aniState->iniDef.m2ThreshLowExt : m2ThreshLowExt_off;
  9799. +- int m1ThreshExt = on ?
  9800. +- aniState->iniDef.m1ThreshExt : m1ThreshExt_off;
  9801. +- int m2ThreshExt = on ?
  9802. +- aniState->iniDef.m2ThreshExt : m2ThreshExt_off;
  9803. +-
  9804. +- REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW,
  9805. +- AR_PHY_SFCORR_LOW_M1_THRESH_LOW,
  9806. +- m1ThreshLow);
  9807. +- REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW,
  9808. +- AR_PHY_SFCORR_LOW_M2_THRESH_LOW,
  9809. +- m2ThreshLow);
  9810. +- REG_RMW_FIELD(ah, AR_PHY_SFCORR,
  9811. +- AR_PHY_SFCORR_M1_THRESH, m1Thresh);
  9812. +- REG_RMW_FIELD(ah, AR_PHY_SFCORR,
  9813. +- AR_PHY_SFCORR_M2_THRESH, m2Thresh);
  9814. +- REG_RMW_FIELD(ah, AR_PHY_SFCORR,
  9815. +- AR_PHY_SFCORR_M2COUNT_THR, m2CountThr);
  9816. +- REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW,
  9817. +- AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW,
  9818. +- m2CountThrLow);
  9819. +-
  9820. +- REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
  9821. +- AR_PHY_SFCORR_EXT_M1_THRESH_LOW, m1ThreshLowExt);
  9822. +- REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
  9823. +- AR_PHY_SFCORR_EXT_M2_THRESH_LOW, m2ThreshLowExt);
  9824. +- REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
  9825. +- AR_PHY_SFCORR_EXT_M1_THRESH, m1ThreshExt);
  9826. +- REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
  9827. +- AR_PHY_SFCORR_EXT_M2_THRESH, m2ThreshExt);
  9828. +
  9829. + if (on)
  9830. + REG_SET_BIT(ah, AR_PHY_SFCORR_LOW,
  9831. +--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
  9832. ++++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
  9833. +@@ -26,20 +26,6 @@ static const int cycpwrThr1_table[] =
  9834. + /* level: 0 1 2 3 4 5 6 7 8 */
  9835. + { -6, -4, -2, 0, 2, 4, 6, 8 }; /* lvl 0-7, default 3 */
  9836. +
  9837. +-/*
  9838. +- * register values to turn OFDM weak signal detection OFF
  9839. +- */
  9840. +-static const int m1ThreshLow_off = 127;
  9841. +-static const int m2ThreshLow_off = 127;
  9842. +-static const int m1Thresh_off = 127;
  9843. +-static const int m2Thresh_off = 127;
  9844. +-static const int m2CountThr_off = 31;
  9845. +-static const int m2CountThrLow_off = 63;
  9846. +-static const int m1ThreshLowExt_off = 127;
  9847. +-static const int m2ThreshLowExt_off = 127;
  9848. +-static const int m1ThreshExt_off = 127;
  9849. +-static const int m2ThreshExt_off = 127;
  9850. +-
  9851. + /**
  9852. + * ar9003_hw_set_channel - set channel on single-chip device
  9853. + * @ah: atheros hardware structure
  9854. +@@ -954,11 +940,6 @@ static bool ar9003_hw_ani_control(struct
  9855. + struct ath_common *common = ath9k_hw_common(ah);
  9856. + struct ath9k_channel *chan = ah->curchan;
  9857. + struct ar5416AniState *aniState = &ah->ani;
  9858. +- int m1ThreshLow, m2ThreshLow;
  9859. +- int m1Thresh, m2Thresh;
  9860. +- int m2CountThr, m2CountThrLow;
  9861. +- int m1ThreshLowExt, m2ThreshLowExt;
  9862. +- int m1ThreshExt, m2ThreshExt;
  9863. + s32 value, value2;
  9864. +
  9865. + switch (cmd & ah->ani_function) {
  9866. +@@ -972,61 +953,6 @@ static bool ar9003_hw_ani_control(struct
  9867. + */
  9868. + u32 on = param ? 1 : 0;
  9869. +
  9870. +- if (AR_SREV_9462(ah) || AR_SREV_9565(ah))
  9871. +- goto skip_ws_det;
  9872. +-
  9873. +- m1ThreshLow = on ?
  9874. +- aniState->iniDef.m1ThreshLow : m1ThreshLow_off;
  9875. +- m2ThreshLow = on ?
  9876. +- aniState->iniDef.m2ThreshLow : m2ThreshLow_off;
  9877. +- m1Thresh = on ?
  9878. +- aniState->iniDef.m1Thresh : m1Thresh_off;
  9879. +- m2Thresh = on ?
  9880. +- aniState->iniDef.m2Thresh : m2Thresh_off;
  9881. +- m2CountThr = on ?
  9882. +- aniState->iniDef.m2CountThr : m2CountThr_off;
  9883. +- m2CountThrLow = on ?
  9884. +- aniState->iniDef.m2CountThrLow : m2CountThrLow_off;
  9885. +- m1ThreshLowExt = on ?
  9886. +- aniState->iniDef.m1ThreshLowExt : m1ThreshLowExt_off;
  9887. +- m2ThreshLowExt = on ?
  9888. +- aniState->iniDef.m2ThreshLowExt : m2ThreshLowExt_off;
  9889. +- m1ThreshExt = on ?
  9890. +- aniState->iniDef.m1ThreshExt : m1ThreshExt_off;
  9891. +- m2ThreshExt = on ?
  9892. +- aniState->iniDef.m2ThreshExt : m2ThreshExt_off;
  9893. +-
  9894. +- REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW,
  9895. +- AR_PHY_SFCORR_LOW_M1_THRESH_LOW,
  9896. +- m1ThreshLow);
  9897. +- REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW,
  9898. +- AR_PHY_SFCORR_LOW_M2_THRESH_LOW,
  9899. +- m2ThreshLow);
  9900. +- REG_RMW_FIELD(ah, AR_PHY_SFCORR,
  9901. +- AR_PHY_SFCORR_M1_THRESH,
  9902. +- m1Thresh);
  9903. +- REG_RMW_FIELD(ah, AR_PHY_SFCORR,
  9904. +- AR_PHY_SFCORR_M2_THRESH,
  9905. +- m2Thresh);
  9906. +- REG_RMW_FIELD(ah, AR_PHY_SFCORR,
  9907. +- AR_PHY_SFCORR_M2COUNT_THR,
  9908. +- m2CountThr);
  9909. +- REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW,
  9910. +- AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW,
  9911. +- m2CountThrLow);
  9912. +- REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
  9913. +- AR_PHY_SFCORR_EXT_M1_THRESH_LOW,
  9914. +- m1ThreshLowExt);
  9915. +- REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
  9916. +- AR_PHY_SFCORR_EXT_M2_THRESH_LOW,
  9917. +- m2ThreshLowExt);
  9918. +- REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
  9919. +- AR_PHY_SFCORR_EXT_M1_THRESH,
  9920. +- m1ThreshExt);
  9921. +- REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT,
  9922. +- AR_PHY_SFCORR_EXT_M2_THRESH,
  9923. +- m2ThreshExt);
  9924. +-skip_ws_det:
  9925. + if (on)
  9926. + REG_SET_BIT(ah, AR_PHY_SFCORR_LOW,
  9927. + AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW);
  9928. diff --git a/package/mac80211/patches/563-ath9k_rxorn_intr_fix.patch b/package/mac80211/patches/563-ath9k_rxorn_intr_fix.patch
  9929. new file mode 100644
  9930. index 0000000..47a7d82
  9931. --- /dev/null
  9932. +++ b/package/mac80211/patches/563-ath9k_rxorn_intr_fix.patch
  9933. @@ -0,0 +1,12 @@
  9934. +--- a/drivers/net/wireless/ath/ath9k/main.c
  9935. ++++ b/drivers/net/wireless/ath/ath9k/main.c
  9936. +@@ -628,8 +628,7 @@ irqreturn_t ath_isr(int irq, void *dev)
  9937. + * If a FATAL or RXORN interrupt is received, we have to reset the
  9938. + * chip immediately.
  9939. + */
  9940. +- if ((status & ATH9K_INT_FATAL) || ((status & ATH9K_INT_RXORN) &&
  9941. +- !(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)))
  9942. ++ if (status & ATH9K_INT_FATAL)
  9943. + goto chip_reset;
  9944. +
  9945. + if ((ah->config.hw_hang_checks & HW_BB_WATCHDOG) &&
  9946. diff --git a/package/mac80211/patches/566-ath9k-ar933x-usb-hang-workaround.patch b/package/mac80211/patches/566-ath9k-ar933x-usb-hang-workaround.patch
  9947. deleted file mode 100644
  9948. index af94c9e..0000000
  9949. --- a/package/mac80211/patches/566-ath9k-ar933x-usb-hang-workaround.patch
  9950. +++ /dev/null
  9951. @@ -1,79 +0,0 @@
  9952. ---- a/drivers/net/wireless/ath/ath9k/hw.c
  9953. -+++ b/drivers/net/wireless/ath/ath9k/hw.c
  9954. -@@ -217,6 +217,19 @@ void ath9k_hw_get_channel_centers(struct
  9955. - centers->synth_center + (extoff * HT40_CHANNEL_CENTER_SHIFT);
  9956. - }
  9957. -
  9958. -+static inline void ath9k_hw_disable_pll_lock_detect(struct ath_hw *ah)
  9959. -+{
  9960. -+ /* On AR9330 and AR9340 devices, some PHY registers must be
  9961. -+ * tuned to gain better stability/performance. These registers
  9962. -+ * might be changed while doing wlan reset so the registers must
  9963. -+ * be reprogrammed after each reset.
  9964. -+ */
  9965. -+ REG_CLR_BIT(ah, AR_PHY_USB_CTRL1, BIT(20));
  9966. -+ REG_RMW(ah, AR_PHY_USB_CTRL2,
  9967. -+ (1 << 21) | (0xf << 22),
  9968. -+ (1 << 21) | (0x3 << 22));
  9969. -+}
  9970. -+
  9971. - /******************/
  9972. - /* Chip Revisions */
  9973. - /******************/
  9974. -@@ -1337,6 +1350,9 @@ static bool ath9k_hw_set_reset(struct at
  9975. - if (AR_SREV_9100(ah))
  9976. - udelay(50);
  9977. -
  9978. -+ if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
  9979. -+ ath9k_hw_disable_pll_lock_detect(ah);
  9980. -+
  9981. - return true;
  9982. - }
  9983. -
  9984. -@@ -1436,6 +1452,9 @@ static bool ath9k_hw_chip_reset(struct a
  9985. - ar9003_hw_internal_regulator_apply(ah);
  9986. - ath9k_hw_init_pll(ah, chan);
  9987. -
  9988. -+ if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
  9989. -+ ath9k_hw_disable_pll_lock_detect(ah);
  9990. -+
  9991. - return true;
  9992. - }
  9993. -
  9994. -@@ -1730,8 +1749,14 @@ static int ath9k_hw_do_fastcc(struct ath
  9995. - if (AR_SREV_9271(ah))
  9996. - ar9002_hw_load_ani_reg(ah, chan);
  9997. -
  9998. -+ if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
  9999. -+ ath9k_hw_disable_pll_lock_detect(ah);
  10000. -+
  10001. - return 0;
  10002. - fail:
  10003. -+ if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
  10004. -+ ath9k_hw_disable_pll_lock_detect(ah);
  10005. -+
  10006. - return -EINVAL;
  10007. - }
  10008. -
  10009. -@@ -1959,6 +1984,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st
  10010. - if (AR_SREV_9565(ah) && common->bt_ant_diversity)
  10011. - REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);
  10012. -
  10013. -+ if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
  10014. -+ ath9k_hw_disable_pll_lock_detect(ah);
  10015. -+
  10016. - return 0;
  10017. - }
  10018. - EXPORT_SYMBOL(ath9k_hw_reset);
  10019. ---- a/drivers/net/wireless/ath/ath9k/phy.h
  10020. -+++ b/drivers/net/wireless/ath/ath9k/phy.h
  10021. -@@ -48,6 +48,9 @@
  10022. - #define AR_PHY_PLL_CONTROL 0x16180
  10023. - #define AR_PHY_PLL_MODE 0x16184
  10024. -
  10025. -+#define AR_PHY_USB_CTRL1 0x16c84
  10026. -+#define AR_PHY_USB_CTRL2 0x16c88
  10027. -+
  10028. - enum ath9k_ant_div_comb_lna_conf {
  10029. - ATH_ANT_DIV_COMB_LNA1_MINUS_LNA2,
  10030. - ATH_ANT_DIV_COMB_LNA2,
  10031. diff --git a/package/mac80211/patches/600-0001-rt2x00-rt2800lib-move-rt2800_drv_data-declaration-in.patch b/package/mac80211/patches/600-0001-rt2x00-rt2800lib-move-rt2800_drv_data-declaration-in.patch
  10032. new file mode 100644
  10033. index 0000000..d344957
  10034. --- /dev/null
  10035. +++ b/package/mac80211/patches/600-0001-rt2x00-rt2800lib-move-rt2800_drv_data-declaration-in.patch
  10036. @@ -0,0 +1,62 @@
  10037. +From 7a69da907de668fb22a30ae218062d6f081864ea Mon Sep 17 00:00:00 2001
  10038. +From: Gabor Juhos <juhosg@openwrt.org>
  10039. +Date: Sat, 17 Aug 2013 19:31:41 +0200
  10040. +Subject: [PATCH] rt2x00: rt2800lib: move rt2800_drv_data declaration into
  10041. + rt2800lib.h
  10042. +
  10043. +The rt2800_drv_data structure contains driver specific
  10044. +information. Move the declaration into the rt2800lib.h
  10045. +header which is a more logical place for it. Also fix
  10046. +the comment style to avoid checkpatch warning.
  10047. +
  10048. +The patch contains no functional changes, it is in
  10049. +preparation for the next patch.
  10050. +
  10051. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  10052. +---
  10053. +Changes since v1: ---
  10054. +---
  10055. + drivers/net/wireless/rt2x00/rt2800.h | 13 -------------
  10056. + drivers/net/wireless/rt2x00/rt2800lib.h | 11 +++++++++++
  10057. + 2 files changed, 11 insertions(+), 13 deletions(-)
  10058. +
  10059. +--- a/drivers/net/wireless/rt2x00/rt2800.h
  10060. ++++ b/drivers/net/wireless/rt2x00/rt2800.h
  10061. +@@ -2958,17 +2958,4 @@ enum rt2800_eeprom_word {
  10062. + */
  10063. + #define BCN_TBTT_OFFSET 64
  10064. +
  10065. +-/*
  10066. +- * RT2800 driver data structure
  10067. +- */
  10068. +-struct rt2800_drv_data {
  10069. +- u8 calibration_bw20;
  10070. +- u8 calibration_bw40;
  10071. +- u8 bbp25;
  10072. +- u8 bbp26;
  10073. +- u8 txmixer_gain_24g;
  10074. +- u8 txmixer_gain_5g;
  10075. +- unsigned int tbtt_tick;
  10076. +-};
  10077. +-
  10078. + #endif /* RT2800_H */
  10079. +--- a/drivers/net/wireless/rt2x00/rt2800lib.h
  10080. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.h
  10081. +@@ -20,6 +20,17 @@
  10082. + #ifndef RT2800LIB_H
  10083. + #define RT2800LIB_H
  10084. +
  10085. ++/* RT2800 driver data structure */
  10086. ++struct rt2800_drv_data {
  10087. ++ u8 calibration_bw20;
  10088. ++ u8 calibration_bw40;
  10089. ++ u8 bbp25;
  10090. ++ u8 bbp26;
  10091. ++ u8 txmixer_gain_24g;
  10092. ++ u8 txmixer_gain_5g;
  10093. ++ unsigned int tbtt_tick;
  10094. ++};
  10095. ++
  10096. + struct rt2800_ops {
  10097. + void (*register_read)(struct rt2x00_dev *rt2x00dev,
  10098. + const unsigned int offset, u32 *value);
  10099. diff --git a/package/mac80211/patches/600-0002-rt2x00-rt2800lib-introduce-RT2800_HAS_HIGH_SHARED_ME.patch b/package/mac80211/patches/600-0002-rt2x00-rt2800lib-introduce-RT2800_HAS_HIGH_SHARED_ME.patch
  10100. new file mode 100644
  10101. index 0000000..60d4c55
  10102. --- /dev/null
  10103. +++ b/package/mac80211/patches/600-0002-rt2x00-rt2800lib-introduce-RT2800_HAS_HIGH_SHARED_ME.patch
  10104. @@ -0,0 +1,80 @@
  10105. +From a7f268af31dddf763fe3dbe9cbf96ea77e0540e0 Mon Sep 17 00:00:00 2001
  10106. +From: Gabor Juhos <juhosg@openwrt.org>
  10107. +Date: Sat, 17 Aug 2013 19:31:41 +0200
  10108. +Subject: [PATCH] rt2x00: rt2800lib: introduce RT2800_HAS_HIGH_SHARED_MEM flag
  10109. +
  10110. +Some chipsets have more than 16KB of shared memory.
  10111. +Introduce a new rt2800 specific flag to indicate that
  10112. +and add a helper function which helps to check the
  10113. +presence of the new flag.
  10114. +
  10115. +Also enable the new flag for the RT3593 chipset which
  10116. +has 24KB of shared memory. The flag can also be used
  10117. +for other chipsets, but none of those has been tested
  10118. +yet.
  10119. +
  10120. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  10121. +---
  10122. +Changes since v1:
  10123. + - don't enable the new flag for RT3071 and RT5592
  10124. +---
  10125. + drivers/net/wireless/rt2x00/rt2800lib.c | 4 ++++
  10126. + drivers/net/wireless/rt2x00/rt2800lib.h | 13 +++++++++++++
  10127. + 2 files changed, 17 insertions(+)
  10128. +
  10129. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  10130. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  10131. +@@ -7734,6 +7734,7 @@ static int rt2800_probe_rt(struct rt2x00
  10132. +
  10133. + int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
  10134. + {
  10135. ++ struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
  10136. + int retval;
  10137. + u32 reg;
  10138. +
  10139. +@@ -7741,6 +7742,9 @@ int rt2800_probe_hw(struct rt2x00_dev *r
  10140. + if (retval)
  10141. + return retval;
  10142. +
  10143. ++ if (rt2x00_rt(rt2x00dev, RT3593))
  10144. ++ __set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags);
  10145. ++
  10146. + /*
  10147. + * Allocate eeprom data.
  10148. + */
  10149. +--- a/drivers/net/wireless/rt2x00/rt2800lib.h
  10150. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.h
  10151. +@@ -20,6 +20,10 @@
  10152. + #ifndef RT2800LIB_H
  10153. + #define RT2800LIB_H
  10154. +
  10155. ++enum rt2800_flag {
  10156. ++ RT2800_HAS_HIGH_SHARED_MEM,
  10157. ++};
  10158. ++
  10159. + /* RT2800 driver data structure */
  10160. + struct rt2800_drv_data {
  10161. + u8 calibration_bw20;
  10162. +@@ -29,6 +33,8 @@ struct rt2800_drv_data {
  10163. + u8 txmixer_gain_24g;
  10164. + u8 txmixer_gain_5g;
  10165. + unsigned int tbtt_tick;
  10166. ++
  10167. ++ unsigned long rt2800_flags;
  10168. + };
  10169. +
  10170. + struct rt2800_ops {
  10171. +@@ -61,6 +67,13 @@ struct rt2800_ops {
  10172. + __le32 *(*drv_get_txwi)(struct queue_entry *entry);
  10173. + };
  10174. +
  10175. ++static inline bool rt2800_has_high_shared_mem(struct rt2x00_dev *rt2x00dev)
  10176. ++{
  10177. ++ struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
  10178. ++
  10179. ++ return test_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags);
  10180. ++}
  10181. ++
  10182. + static inline void rt2800_register_read(struct rt2x00_dev *rt2x00dev,
  10183. + const unsigned int offset,
  10184. + u32 *value)
  10185. diff --git a/package/mac80211/patches/600-0003-rt2x00-rt2800-serialize-shared-memory-access.patch b/package/mac80211/patches/600-0003-rt2x00-rt2800-serialize-shared-memory-access.patch
  10186. new file mode 100644
  10187. index 0000000..2accf73
  10188. --- /dev/null
  10189. +++ b/package/mac80211/patches/600-0003-rt2x00-rt2800-serialize-shared-memory-access.patch
  10190. @@ -0,0 +1,531 @@
  10191. +From 250a1b520cd7fdc0df4fc3fedea9066913f49ecf Mon Sep 17 00:00:00 2001
  10192. +From: Gabor Juhos <juhosg@openwrt.org>
  10193. +Date: Sat, 17 Aug 2013 19:31:42 +0200
  10194. +Subject: [PATCH] rt2x00: rt2800: serialize shared memory access
  10195. +
  10196. +The shared memory of the rt2800 devices is accessible
  10197. +through the register offset range between 0x4000 and
  10198. +0x8000. The size of this range is 16KB only and on
  10199. +devices which have more than 16KB of shared memory either
  10200. +the low or the high part of the memory is accessible at a
  10201. +time.
  10202. +
  10203. +Serialize all accesses to the shared memory by a mutex,
  10204. +in order to avoid concurrent use of that.
  10205. +
  10206. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  10207. +---
  10208. +Changes since v1: ---
  10209. +---
  10210. + drivers/net/wireless/rt2x00/rt2800lib.c | 55 +++++++++++++++++++++++++++++-
  10211. + drivers/net/wireless/rt2x00/rt2800lib.h | 32 +++++++++++++++++
  10212. + drivers/net/wireless/rt2x00/rt2800mmio.c | 26 ++++++++++++++
  10213. + drivers/net/wireless/rt2x00/rt2800mmio.h | 4 +++
  10214. + drivers/net/wireless/rt2x00/rt2800pci.c | 14 ++++++++
  10215. + drivers/net/wireless/rt2x00/rt2800soc.c | 3 ++
  10216. + drivers/net/wireless/rt2x00/rt2800usb.c | 31 +++++++++++++++++
  10217. + 7 files changed, 164 insertions(+), 1 deletion(-)
  10218. +
  10219. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  10220. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  10221. +@@ -451,11 +451,13 @@ void rt2800_mcu_request(struct rt2x00_de
  10222. + rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_CMD_TOKEN, token);
  10223. + rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_ARG0, arg0);
  10224. + rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_ARG1, arg1);
  10225. ++ rt2800_shared_mem_lock(rt2x00dev);
  10226. + rt2800_register_write_lock(rt2x00dev, H2M_MAILBOX_CSR, reg);
  10227. +
  10228. + reg = 0;
  10229. + rt2x00_set_field32(&reg, HOST_CMD_CSR_HOST_COMMAND, command);
  10230. + rt2800_register_write_lock(rt2x00dev, HOST_CMD_CSR, reg);
  10231. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10232. + }
  10233. +
  10234. + mutex_unlock(&rt2x00dev->csr_mutex);
  10235. +@@ -674,7 +676,9 @@ int rt2800_load_firmware(struct rt2x00_d
  10236. + * Wait for device to stabilize.
  10237. + */
  10238. + for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
  10239. ++ rt2800_shared_mem_lock(rt2x00dev);
  10240. + rt2800_register_read(rt2x00dev, PBF_SYS_CTRL, &reg);
  10241. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10242. + if (rt2x00_get_field32(reg, PBF_SYS_CTRL_READY))
  10243. + break;
  10244. + msleep(1);
  10245. +@@ -694,10 +698,16 @@ int rt2800_load_firmware(struct rt2x00_d
  10246. + /*
  10247. + * Initialize firmware.
  10248. + */
  10249. ++ rt2800_shared_mem_lock(rt2x00dev);
  10250. + rt2800_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
  10251. + rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
  10252. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10253. ++
  10254. + if (rt2x00_is_usb(rt2x00dev)) {
  10255. ++ rt2800_shared_mem_lock(rt2x00dev);
  10256. + rt2800_register_write(rt2x00dev, H2M_INT_SRC, 0);
  10257. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10258. ++
  10259. + rt2800_mcu_request(rt2x00dev, MCU_BOOT_SIGNAL, 0, 0, 0);
  10260. + }
  10261. + msleep(1);
  10262. +@@ -1035,8 +1045,10 @@ void rt2800_write_beacon(struct queue_en
  10263. +
  10264. + beacon_base = rt2800_hw_beacon_base(rt2x00dev, entry->entry_idx);
  10265. +
  10266. ++ rt2800_shared_mem_lock(rt2x00dev);
  10267. + rt2800_register_multiwrite(rt2x00dev, beacon_base, entry->skb->data,
  10268. + entry->skb->len + padding_len);
  10269. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10270. + __set_bit(ENTRY_BCN_ENABLED, &entry->flags);
  10271. +
  10272. + /*
  10273. +@@ -1066,6 +1078,8 @@ static inline void rt2800_clear_beacon_r
  10274. +
  10275. + beacon_base = rt2800_hw_beacon_base(rt2x00dev, index);
  10276. +
  10277. ++ rt2800_shared_mem_lock(rt2x00dev);
  10278. ++
  10279. + /*
  10280. + * For the Beacon base registers we only need to clear
  10281. + * the whole TXWI which (when set to 0) will invalidate
  10282. +@@ -1073,6 +1087,8 @@ static inline void rt2800_clear_beacon_r
  10283. + */
  10284. + for (i = 0; i < txwi_desc_size; i += sizeof(__le32))
  10285. + rt2800_register_write(rt2x00dev, beacon_base + i, 0);
  10286. ++
  10287. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10288. + }
  10289. +
  10290. + void rt2800_clear_beacon(struct queue_entry *entry)
  10291. +@@ -1261,7 +1277,9 @@ static void rt2800_delete_wcid_attr(stru
  10292. + {
  10293. + u32 offset;
  10294. + offset = MAC_WCID_ATTR_ENTRY(wcid);
  10295. ++ rt2800_shared_mem_lock(rt2x00dev);
  10296. + rt2800_register_write(rt2x00dev, offset, 0);
  10297. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10298. + }
  10299. +
  10300. + static void rt2800_config_wcid_attr_bssidx(struct rt2x00_dev *rt2x00dev,
  10301. +@@ -1274,11 +1292,13 @@ static void rt2800_config_wcid_attr_bssi
  10302. + * The BSS Idx numbers is split in a main value of 3 bits,
  10303. + * and a extended field for adding one additional bit to the value.
  10304. + */
  10305. ++ rt2800_shared_mem_lock(rt2x00dev);
  10306. + rt2800_register_read(rt2x00dev, offset, &reg);
  10307. + rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_BSS_IDX, (bssidx & 0x7));
  10308. + rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_BSS_IDX_EXT,
  10309. + (bssidx & 0x8) >> 3);
  10310. + rt2800_register_write(rt2x00dev, offset, reg);
  10311. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10312. + }
  10313. +
  10314. + static void rt2800_config_wcid_attr_cipher(struct rt2x00_dev *rt2x00dev,
  10315. +@@ -1291,6 +1311,7 @@ static void rt2800_config_wcid_attr_ciph
  10316. +
  10317. + offset = MAC_WCID_ATTR_ENTRY(key->hw_key_idx);
  10318. +
  10319. ++ rt2800_shared_mem_lock(rt2x00dev);
  10320. + if (crypto->cmd == SET_KEY) {
  10321. + rt2800_register_read(rt2x00dev, offset, &reg);
  10322. + rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_KEYTAB,
  10323. +@@ -1315,6 +1336,7 @@ static void rt2800_config_wcid_attr_ciph
  10324. + rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_RX_WIUDF, 0);
  10325. + rt2800_register_write(rt2x00dev, offset, reg);
  10326. + }
  10327. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10328. +
  10329. + offset = MAC_IVEIV_ENTRY(key->hw_key_idx);
  10330. +
  10331. +@@ -1324,8 +1346,11 @@ static void rt2800_config_wcid_attr_ciph
  10332. + (crypto->cipher == CIPHER_AES))
  10333. + iveiv_entry.iv[3] |= 0x20;
  10334. + iveiv_entry.iv[3] |= key->keyidx << 6;
  10335. ++
  10336. ++ rt2800_shared_mem_lock(rt2x00dev);
  10337. + rt2800_register_multiwrite(rt2x00dev, offset,
  10338. + &iveiv_entry, sizeof(iveiv_entry));
  10339. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10340. + }
  10341. +
  10342. + int rt2800_config_shared_key(struct rt2x00_dev *rt2x00dev,
  10343. +@@ -1348,8 +1373,11 @@ int rt2800_config_shared_key(struct rt2x
  10344. + sizeof(key_entry.rx_mic));
  10345. +
  10346. + offset = SHARED_KEY_ENTRY(key->hw_key_idx);
  10347. ++
  10348. ++ rt2800_shared_mem_lock(rt2x00dev);
  10349. + rt2800_register_multiwrite(rt2x00dev, offset,
  10350. + &key_entry, sizeof(key_entry));
  10351. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10352. + }
  10353. +
  10354. + /*
  10355. +@@ -1364,10 +1392,12 @@ int rt2800_config_shared_key(struct rt2x
  10356. +
  10357. + offset = SHARED_KEY_MODE_ENTRY(key->hw_key_idx / 8);
  10358. +
  10359. ++ rt2800_shared_mem_lock(rt2x00dev);
  10360. + rt2800_register_read(rt2x00dev, offset, &reg);
  10361. + rt2x00_set_field32(&reg, field,
  10362. + (crypto->cmd == SET_KEY) * crypto->cipher);
  10363. + rt2800_register_write(rt2x00dev, offset, reg);
  10364. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10365. +
  10366. + /*
  10367. + * Update WCID information
  10368. +@@ -1437,8 +1467,11 @@ int rt2800_config_pairwise_key(struct rt
  10369. + sizeof(key_entry.rx_mic));
  10370. +
  10371. + offset = PAIRWISE_KEY_ENTRY(key->hw_key_idx);
  10372. ++
  10373. ++ rt2800_shared_mem_lock(rt2x00dev);
  10374. + rt2800_register_multiwrite(rt2x00dev, offset,
  10375. + &key_entry, sizeof(key_entry));
  10376. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10377. + }
  10378. +
  10379. + /*
  10380. +@@ -4898,14 +4931,19 @@ static int rt2800_init_registers(struct
  10381. + /*
  10382. + * ASIC will keep garbage value after boot, clear encryption keys.
  10383. + */
  10384. ++ rt2800_shared_mem_lock(rt2x00dev);
  10385. + for (i = 0; i < 4; i++)
  10386. + rt2800_register_write(rt2x00dev,
  10387. + SHARED_KEY_MODE_ENTRY(i), 0);
  10388. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10389. +
  10390. + for (i = 0; i < 256; i++) {
  10391. + rt2800_config_wcid(rt2x00dev, NULL, i);
  10392. + rt2800_delete_wcid_attr(rt2x00dev, i);
  10393. ++
  10394. ++ rt2800_shared_mem_lock(rt2x00dev);
  10395. + rt2800_register_write(rt2x00dev, MAC_IVEIV_ENTRY(i), 0);
  10396. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10397. + }
  10398. +
  10399. + /*
  10400. +@@ -5031,8 +5069,10 @@ static int rt2800_wait_bbp_ready(struct
  10401. + * BBP was enabled after firmware was loaded,
  10402. + * but we need to reactivate it now.
  10403. + */
  10404. ++ rt2800_shared_mem_lock(rt2x00dev);
  10405. + rt2800_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
  10406. + rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
  10407. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10408. + msleep(1);
  10409. +
  10410. + for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
  10411. +@@ -6728,11 +6768,19 @@ int rt2800_enable_radio(struct rt2x00_de
  10412. + /*
  10413. + * Send signal during boot time to initialize firmware.
  10414. + */
  10415. ++ rt2800_shared_mem_lock(rt2x00dev);
  10416. + rt2800_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
  10417. + rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
  10418. +- if (rt2x00_is_usb(rt2x00dev))
  10419. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10420. ++
  10421. ++ if (rt2x00_is_usb(rt2x00dev)) {
  10422. ++ rt2800_shared_mem_lock(rt2x00dev);
  10423. + rt2800_register_write(rt2x00dev, H2M_INT_SRC, 0);
  10424. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10425. ++ }
  10426. ++
  10427. + rt2800_mcu_request(rt2x00dev, MCU_BOOT_SIGNAL, 0, 0, 0);
  10428. ++
  10429. + msleep(1);
  10430. +
  10431. + /*
  10432. +@@ -7738,6 +7786,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r
  10433. + int retval;
  10434. + u32 reg;
  10435. +
  10436. ++ rt2800_shared_mem_init_lock(rt2x00dev);
  10437. ++
  10438. + retval = rt2800_probe_rt(rt2x00dev);
  10439. + if (retval)
  10440. + return retval;
  10441. +@@ -7817,8 +7867,11 @@ void rt2800_get_tkip_seq(struct ieee8021
  10442. + u32 offset;
  10443. +
  10444. + offset = MAC_IVEIV_ENTRY(hw_key_idx);
  10445. ++
  10446. ++ rt2800_shared_mem_lock(rt2x00dev);
  10447. + rt2800_register_multiread(rt2x00dev, offset,
  10448. + &iveiv_entry, sizeof(iveiv_entry));
  10449. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10450. +
  10451. + memcpy(iv16, &iveiv_entry.iv[0], sizeof(*iv16));
  10452. + memcpy(iv32, &iveiv_entry.iv[4], sizeof(*iv32));
  10453. +--- a/drivers/net/wireless/rt2x00/rt2800lib.h
  10454. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.h
  10455. +@@ -35,6 +35,11 @@ struct rt2800_drv_data {
  10456. + unsigned int tbtt_tick;
  10457. +
  10458. + unsigned long rt2800_flags;
  10459. ++
  10460. ++ union {
  10461. ++ spinlock_t spin;
  10462. ++ struct mutex mutex;
  10463. ++ } shmem_lock;
  10464. + };
  10465. +
  10466. + struct rt2800_ops {
  10467. +@@ -65,6 +70,10 @@ struct rt2800_ops {
  10468. + const u8 *data, const size_t len);
  10469. + int (*drv_init_registers)(struct rt2x00_dev *rt2x00dev);
  10470. + __le32 *(*drv_get_txwi)(struct queue_entry *entry);
  10471. ++
  10472. ++ void (*shmem_init_lock)(struct rt2x00_dev *rt2x00dev);
  10473. ++ void (*shmem_lock)(struct rt2x00_dev *rt2x00dev);
  10474. ++ void (*shmem_unlock)(struct rt2x00_dev *rt2x00dev);
  10475. + };
  10476. +
  10477. + static inline bool rt2800_has_high_shared_mem(struct rt2x00_dev *rt2x00dev)
  10478. +@@ -74,6 +83,29 @@ static inline bool rt2800_has_high_share
  10479. + return test_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags);
  10480. + }
  10481. +
  10482. ++static inline void rt2800_shared_mem_init_lock(struct rt2x00_dev *rt2x00dev)
  10483. ++{
  10484. ++ const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
  10485. ++
  10486. ++ rt2800ops->shmem_init_lock(rt2x00dev);
  10487. ++}
  10488. ++
  10489. ++static inline void rt2800_shared_mem_lock(struct rt2x00_dev *rt2x00dev)
  10490. ++{
  10491. ++ const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
  10492. ++
  10493. ++ if (rt2800_has_high_shared_mem(rt2x00dev))
  10494. ++ rt2800ops->shmem_lock(rt2x00dev);
  10495. ++}
  10496. ++
  10497. ++static inline void rt2800_shared_mem_unlock(struct rt2x00_dev *rt2x00dev)
  10498. ++{
  10499. ++ const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
  10500. ++
  10501. ++ if (rt2800_has_high_shared_mem(rt2x00dev))
  10502. ++ rt2800ops->shmem_unlock(rt2x00dev);
  10503. ++}
  10504. ++
  10505. + static inline void rt2800_register_read(struct rt2x00_dev *rt2x00dev,
  10506. + const unsigned int offset,
  10507. + u32 *value)
  10508. +--- a/drivers/net/wireless/rt2x00/rt2800mmio.c
  10509. ++++ b/drivers/net/wireless/rt2x00/rt2800mmio.c
  10510. +@@ -820,8 +820,10 @@ int rt2800mmio_init_registers(struct rt2
  10511. + rt2x00_set_field32(&reg, WPDMA_RST_IDX_DRX_IDX0, 1);
  10512. + rt2x00mmio_register_write(rt2x00dev, WPDMA_RST_IDX, reg);
  10513. +
  10514. ++ rt2800_shared_mem_lock(rt2x00dev);
  10515. + rt2x00mmio_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e1f);
  10516. + rt2x00mmio_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e00);
  10517. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10518. +
  10519. + if (rt2x00_is_pcie(rt2x00dev) &&
  10520. + (rt2x00_rt(rt2x00dev, RT3090) ||
  10521. +@@ -865,6 +867,30 @@ int rt2800mmio_enable_radio(struct rt2x0
  10522. + }
  10523. + EXPORT_SYMBOL_GPL(rt2800mmio_enable_radio);
  10524. +
  10525. ++void rt2800mmio_shmem_init_lock(struct rt2x00_dev *rt2x00dev)
  10526. ++{
  10527. ++ struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
  10528. ++
  10529. ++ spin_lock_init(&drv_data->shmem_lock.spin);
  10530. ++}
  10531. ++EXPORT_SYMBOL_GPL(rt2800mmio_shmem_init_lock);
  10532. ++
  10533. ++void rt2800mmio_shmem_lock(struct rt2x00_dev *rt2x00dev)
  10534. ++{
  10535. ++ struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
  10536. ++
  10537. ++ spin_lock_bh(&drv_data->shmem_lock.spin);
  10538. ++}
  10539. ++EXPORT_SYMBOL_GPL(rt2800mmio_shmem_lock);
  10540. ++
  10541. ++void rt2800mmio_shmem_unlock(struct rt2x00_dev *rt2x00dev)
  10542. ++{
  10543. ++ struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
  10544. ++
  10545. ++ spin_unlock_bh(&drv_data->shmem_lock.spin);
  10546. ++}
  10547. ++EXPORT_SYMBOL_GPL(rt2800mmio_shmem_unlock);
  10548. ++
  10549. + MODULE_AUTHOR(DRV_PROJECT);
  10550. + MODULE_VERSION(DRV_VERSION);
  10551. + MODULE_DESCRIPTION("rt2800 MMIO library");
  10552. +--- a/drivers/net/wireless/rt2x00/rt2800mmio.h
  10553. ++++ b/drivers/net/wireless/rt2x00/rt2800mmio.h
  10554. +@@ -160,4 +160,8 @@ int rt2800mmio_init_registers(struct rt2
  10555. + /* Device state switch handlers. */
  10556. + int rt2800mmio_enable_radio(struct rt2x00_dev *rt2x00dev);
  10557. +
  10558. ++void rt2800mmio_shmem_init_lock(struct rt2x00_dev *rt2x00dev);
  10559. ++void rt2800mmio_shmem_lock(struct rt2x00_dev *rt2x00dev);
  10560. ++void rt2800mmio_shmem_unlock(struct rt2x00_dev *rt2x00dev);
  10561. ++
  10562. + #endif /* RT2800MMIO_H */
  10563. +--- a/drivers/net/wireless/rt2x00/rt2800pci.c
  10564. ++++ b/drivers/net/wireless/rt2x00/rt2800pci.c
  10565. +@@ -69,7 +69,9 @@ static void rt2800pci_mcu_status(struct
  10566. + return;
  10567. +
  10568. + for (i = 0; i < 200; i++) {
  10569. ++ rt2800_shared_mem_lock(rt2x00dev);
  10570. + rt2x00mmio_register_read(rt2x00dev, H2M_MAILBOX_CID, &reg);
  10571. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10572. +
  10573. + if ((rt2x00_get_field32(reg, H2M_MAILBOX_CID_CMD0) == token) ||
  10574. + (rt2x00_get_field32(reg, H2M_MAILBOX_CID_CMD1) == token) ||
  10575. +@@ -83,8 +85,10 @@ static void rt2800pci_mcu_status(struct
  10576. + if (i == 200)
  10577. + rt2x00_err(rt2x00dev, "MCU request failed, no response from hardware\n");
  10578. +
  10579. ++ rt2800_shared_mem_lock(rt2x00dev);
  10580. + rt2x00mmio_register_write(rt2x00dev, H2M_MAILBOX_STATUS, ~0);
  10581. + rt2x00mmio_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
  10582. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10583. + }
  10584. +
  10585. + static void rt2800pci_eepromregister_read(struct eeprom_93cx6 *eeprom)
  10586. +@@ -184,6 +188,8 @@ static int rt2800pci_write_firmware(stru
  10587. + */
  10588. + reg = 0;
  10589. + rt2x00_set_field32(&reg, PBF_SYS_CTRL_HOST_RAM_WRITE, 1);
  10590. ++
  10591. ++ rt2800_shared_mem_lock(rt2x00dev);
  10592. + rt2x00mmio_register_write(rt2x00dev, PBF_SYS_CTRL, reg);
  10593. +
  10594. + /*
  10595. +@@ -197,6 +203,7 @@ static int rt2800pci_write_firmware(stru
  10596. +
  10597. + rt2x00mmio_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
  10598. + rt2x00mmio_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
  10599. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10600. +
  10601. + return 0;
  10602. + }
  10603. +@@ -213,8 +220,10 @@ static int rt2800pci_enable_radio(struct
  10604. + return retval;
  10605. +
  10606. + /* After resume MCU_BOOT_SIGNAL will trash these. */
  10607. ++ rt2800_shared_mem_lock(rt2x00dev);
  10608. + rt2x00mmio_register_write(rt2x00dev, H2M_MAILBOX_STATUS, ~0);
  10609. + rt2x00mmio_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
  10610. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10611. +
  10612. + rt2800_mcu_request(rt2x00dev, MCU_SLEEP, TOKEN_RADIO_OFF, 0xff, 0x02);
  10613. + rt2800pci_mcu_status(rt2x00dev, TOKEN_RADIO_OFF);
  10614. +@@ -233,10 +242,12 @@ static int rt2800pci_set_state(struct rt
  10615. + 0, 0x02);
  10616. + rt2800pci_mcu_status(rt2x00dev, TOKEN_WAKEUP);
  10617. + } else if (state == STATE_SLEEP) {
  10618. ++ rt2800_shared_mem_lock(rt2x00dev);
  10619. + rt2x00mmio_register_write(rt2x00dev, H2M_MAILBOX_STATUS,
  10620. + 0xffffffff);
  10621. + rt2x00mmio_register_write(rt2x00dev, H2M_MAILBOX_CID,
  10622. + 0xffffffff);
  10623. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10624. + rt2800_mcu_request(rt2x00dev, MCU_SLEEP, TOKEN_SLEEP,
  10625. + 0xff, 0x01);
  10626. + }
  10627. +@@ -337,6 +348,9 @@ static const struct rt2800_ops rt2800pci
  10628. + .drv_write_firmware = rt2800pci_write_firmware,
  10629. + .drv_init_registers = rt2800mmio_init_registers,
  10630. + .drv_get_txwi = rt2800mmio_get_txwi,
  10631. ++ .shmem_init_lock = rt2800mmio_shmem_init_lock,
  10632. ++ .shmem_lock = rt2800mmio_shmem_lock,
  10633. ++ .shmem_unlock = rt2800mmio_shmem_unlock,
  10634. + };
  10635. +
  10636. + static const struct rt2x00lib_ops rt2800pci_rt2x00_ops = {
  10637. +--- a/drivers/net/wireless/rt2x00/rt2800soc.c
  10638. ++++ b/drivers/net/wireless/rt2x00/rt2800soc.c
  10639. +@@ -176,6 +176,9 @@ static const struct rt2800_ops rt2800soc
  10640. + .drv_write_firmware = rt2800soc_write_firmware,
  10641. + .drv_init_registers = rt2800mmio_init_registers,
  10642. + .drv_get_txwi = rt2800mmio_get_txwi,
  10643. ++ .shmem_init_lock = rt2800mmio_shmem_init_lock,
  10644. ++ .shmem_lock = rt2800mmio_shmem_lock,
  10645. ++ .shmem_unlock = rt2800mmio_shmem_unlock,
  10646. + };
  10647. +
  10648. + static const struct rt2x00lib_ops rt2800soc_rt2x00_ops = {
  10649. +--- a/drivers/net/wireless/rt2x00/rt2800usb.c
  10650. ++++ b/drivers/net/wireless/rt2x00/rt2800usb.c
  10651. +@@ -51,6 +51,27 @@ static bool rt2800usb_hwcrypt_disabled(s
  10652. + return modparam_nohwcrypt;
  10653. + }
  10654. +
  10655. ++static void rt2800usb_shmem_init_lock(struct rt2x00_dev *rt2x00dev)
  10656. ++{
  10657. ++ struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
  10658. ++
  10659. ++ mutex_init(&drv_data->shmem_lock.mutex);
  10660. ++}
  10661. ++
  10662. ++static void rt2800usb_shmem_lock(struct rt2x00_dev *rt2x00dev)
  10663. ++{
  10664. ++ struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
  10665. ++
  10666. ++ mutex_lock(&drv_data->shmem_lock.mutex);
  10667. ++}
  10668. ++
  10669. ++static void rt2800usb_shmem_unlock(struct rt2x00_dev *rt2x00dev)
  10670. ++{
  10671. ++ struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
  10672. ++
  10673. ++ mutex_unlock(&drv_data->shmem_lock.mutex);
  10674. ++}
  10675. ++
  10676. + /*
  10677. + * Queue handlers.
  10678. + */
  10679. +@@ -260,8 +281,10 @@ static int rt2800usb_write_firmware(stru
  10680. + rt2x00usb_register_multiwrite(rt2x00dev, FIRMWARE_IMAGE_BASE,
  10681. + data + offset, length);
  10682. +
  10683. ++ rt2800_shared_mem_lock(rt2x00dev);
  10684. + rt2x00usb_register_write(rt2x00dev, H2M_MAILBOX_CID, ~0);
  10685. + rt2x00usb_register_write(rt2x00dev, H2M_MAILBOX_STATUS, ~0);
  10686. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10687. +
  10688. + /*
  10689. + * Send firmware request to device to load firmware,
  10690. +@@ -276,7 +299,10 @@ static int rt2800usb_write_firmware(stru
  10691. + }
  10692. +
  10693. + msleep(10);
  10694. ++
  10695. ++ rt2800_shared_mem_lock(rt2x00dev);
  10696. + rt2x00usb_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
  10697. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10698. +
  10699. + return 0;
  10700. + }
  10701. +@@ -294,8 +320,10 @@ static int rt2800usb_init_registers(stru
  10702. + if (rt2800_wait_csr_ready(rt2x00dev))
  10703. + return -EBUSY;
  10704. +
  10705. ++ rt2800_shared_mem_lock(rt2x00dev);
  10706. + rt2x00usb_register_read(rt2x00dev, PBF_SYS_CTRL, &reg);
  10707. + rt2x00usb_register_write(rt2x00dev, PBF_SYS_CTRL, reg & ~0x00002000);
  10708. ++ rt2800_shared_mem_unlock(rt2x00dev);
  10709. +
  10710. + reg = 0;
  10711. + rt2x00_set_field32(&reg, MAC_SYS_CTRL_RESET_CSR, 1);
  10712. +@@ -810,6 +838,9 @@ static const struct rt2800_ops rt2800usb
  10713. + .drv_write_firmware = rt2800usb_write_firmware,
  10714. + .drv_init_registers = rt2800usb_init_registers,
  10715. + .drv_get_txwi = rt2800usb_get_txwi,
  10716. ++ .shmem_init_lock = rt2800usb_shmem_init_lock,
  10717. ++ .shmem_lock = rt2800usb_shmem_lock,
  10718. ++ .shmem_unlock = rt2800usb_shmem_unlock,
  10719. + };
  10720. +
  10721. + static const struct rt2x00lib_ops rt2800usb_rt2x00_ops = {
  10722. diff --git a/package/mac80211/patches/600-0004-rt2x00-rt2800lib-fix-beacon-generation-on-RT3593.patch b/package/mac80211/patches/600-0004-rt2x00-rt2800lib-fix-beacon-generation-on-RT3593.patch
  10723. new file mode 100644
  10724. index 0000000..7167f28
  10725. --- /dev/null
  10726. +++ b/package/mac80211/patches/600-0004-rt2x00-rt2800lib-fix-beacon-generation-on-RT3593.patch
  10727. @@ -0,0 +1,131 @@
  10728. +From dcfe3dd46242050f100162dce2bcad24d2c942c6 Mon Sep 17 00:00:00 2001
  10729. +From: Gabor Juhos <juhosg@openwrt.org>
  10730. +Date: Sat, 17 Aug 2013 19:31:42 +0200
  10731. +Subject: [PATCH] rt2x00: rt2800lib: fix beacon generation on RT3593
  10732. +
  10733. +On the RT3593 chipset, the beacon registers are located
  10734. +in the high 8KB part of the shared memory.
  10735. +
  10736. +The high part of the shared memory is only accessible
  10737. +if it is explicitly selected. Add a helper function
  10738. +in order to be able to control the SHR_MSEL bit in
  10739. +the PBF_SYS_CTRL register. Also add a few more helper
  10740. +functions and use those to select the correct part of
  10741. +the shared memory before and after accessing the beacon
  10742. +registers.
  10743. +
  10744. +The base addresses of the beacon registers are also
  10745. +different from the actually used values, so fix the
  10746. +'rt2800_hw_beacon_base' function to return the correct
  10747. +values.
  10748. +
  10749. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  10750. +---
  10751. +Changes since v1: ---
  10752. +---
  10753. + drivers/net/wireless/rt2x00/rt2800.h | 3 +++
  10754. + drivers/net/wireless/rt2x00/rt2800lib.c | 44 +++++++++++++++++++++++++++++++
  10755. + 2 files changed, 47 insertions(+)
  10756. +
  10757. +--- a/drivers/net/wireless/rt2x00/rt2800.h
  10758. ++++ b/drivers/net/wireless/rt2x00/rt2800.h
  10759. +@@ -572,6 +572,7 @@
  10760. + #define PBF_SYS_CTRL 0x0400
  10761. + #define PBF_SYS_CTRL_READY FIELD32(0x00000080)
  10762. + #define PBF_SYS_CTRL_HOST_RAM_WRITE FIELD32(0x00010000)
  10763. ++#define PBF_SYS_CTRL_SHR_MSEL FIELD32(0x00080000)
  10764. +
  10765. + /*
  10766. + * HOST-MCU shared memory
  10767. +@@ -2024,6 +2025,8 @@ struct mac_iveiv_entry {
  10768. + (((__index) < 6) ? (HW_BEACON_BASE4 + ((__index - 4) * 0x0200)) : \
  10769. + (HW_BEACON_BASE6 - ((__index - 6) * 0x0200))))
  10770. +
  10771. ++#define HW_BEACON_BASE_HIGH(__index) (0x4000 + (__index) * 512)
  10772. ++
  10773. + #define BEACON_BASE_TO_OFFSET(_base) (((_base) - 0x4000) / 64)
  10774. +
  10775. + /*
  10776. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  10777. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  10778. +@@ -82,6 +82,39 @@ static inline bool rt2800_is_305x_soc(st
  10779. + return false;
  10780. + }
  10781. +
  10782. ++static inline void rt2800_shared_mem_select(struct rt2x00_dev *rt2x00dev,
  10783. ++ bool high)
  10784. ++{
  10785. ++ u32 reg;
  10786. ++
  10787. ++ if (WARN_ON_ONCE(!rt2800_has_high_shared_mem(rt2x00dev)))
  10788. ++ return;
  10789. ++
  10790. ++ rt2800_register_read(rt2x00dev, PBF_SYS_CTRL, &reg);
  10791. ++ rt2x00_set_field32(&reg, PBF_SYS_CTRL_SHR_MSEL, high);
  10792. ++ rt2800_register_write(rt2x00dev, PBF_SYS_CTRL, reg);
  10793. ++}
  10794. ++
  10795. ++static inline bool rt2800_beacon_uses_high_mem(struct rt2x00_dev *rt2x00dev)
  10796. ++{
  10797. ++ if (rt2x00_rt(rt2x00dev, RT3593))
  10798. ++ return true;
  10799. ++
  10800. ++ return false;
  10801. ++}
  10802. ++
  10803. ++static inline void rt2800_select_beacon_mem(struct rt2x00_dev *rt2x00dev)
  10804. ++{
  10805. ++ if (rt2800_beacon_uses_high_mem(rt2x00dev))
  10806. ++ rt2800_shared_mem_select(rt2x00dev, true);
  10807. ++}
  10808. ++
  10809. ++static inline void rt2800_deselect_beacon_mem(struct rt2x00_dev *rt2x00dev)
  10810. ++{
  10811. ++ if (rt2800_beacon_uses_high_mem(rt2x00dev))
  10812. ++ rt2800_shared_mem_select(rt2x00dev, false);
  10813. ++}
  10814. ++
  10815. + static void rt2800_bbp_write(struct rt2x00_dev *rt2x00dev,
  10816. + const unsigned int word, const u8 value)
  10817. + {
  10818. +@@ -948,6 +981,9 @@ EXPORT_SYMBOL_GPL(rt2800_txdone_entry);
  10819. + static unsigned int rt2800_hw_beacon_base(struct rt2x00_dev *rt2x00dev,
  10820. + unsigned int index)
  10821. + {
  10822. ++ if (rt2x00_rt(rt2x00dev, RT3593))
  10823. ++ return HW_BEACON_BASE_HIGH(index);
  10824. ++
  10825. + return HW_BEACON_BASE(index);
  10826. + }
  10827. +
  10828. +@@ -1046,8 +1082,12 @@ void rt2800_write_beacon(struct queue_en
  10829. + beacon_base = rt2800_hw_beacon_base(rt2x00dev, entry->entry_idx);
  10830. +
  10831. + rt2800_shared_mem_lock(rt2x00dev);
  10832. ++
  10833. ++ rt2800_select_beacon_mem(rt2x00dev);
  10834. + rt2800_register_multiwrite(rt2x00dev, beacon_base, entry->skb->data,
  10835. + entry->skb->len + padding_len);
  10836. ++ rt2800_deselect_beacon_mem(rt2x00dev);
  10837. ++
  10838. + rt2800_shared_mem_unlock(rt2x00dev);
  10839. + __set_bit(ENTRY_BCN_ENABLED, &entry->flags);
  10840. +
  10841. +@@ -1080,6 +1120,8 @@ static inline void rt2800_clear_beacon_r
  10842. +
  10843. + rt2800_shared_mem_lock(rt2x00dev);
  10844. +
  10845. ++ rt2800_select_beacon_mem(rt2x00dev);
  10846. ++
  10847. + /*
  10848. + * For the Beacon base registers we only need to clear
  10849. + * the whole TXWI which (when set to 0) will invalidate
  10850. +@@ -1088,6 +1130,8 @@ static inline void rt2800_clear_beacon_r
  10851. + for (i = 0; i < txwi_desc_size; i += sizeof(__le32))
  10852. + rt2800_register_write(rt2x00dev, beacon_base + i, 0);
  10853. +
  10854. ++ rt2800_deselect_beacon_mem(rt2x00dev);
  10855. ++
  10856. + rt2800_shared_mem_unlock(rt2x00dev);
  10857. + }
  10858. +
  10859. diff --git a/package/mac80211/patches/600-0005-rt2x00-rt2800lib-add-hw_beacon_count-field-to-struct.patch b/package/mac80211/patches/600-0005-rt2x00-rt2800lib-add-hw_beacon_count-field-to-struct.patch
  10860. new file mode 100644
  10861. index 0000000..0b509df
  10862. --- /dev/null
  10863. +++ b/package/mac80211/patches/600-0005-rt2x00-rt2800lib-add-hw_beacon_count-field-to-struct.patch
  10864. @@ -0,0 +1,62 @@
  10865. +From a058825fa7b53fab3b003d8928b60e5b686b3421 Mon Sep 17 00:00:00 2001
  10866. +From: Gabor Juhos <juhosg@openwrt.org>
  10867. +Date: Sun, 4 Aug 2013 14:36:11 +0200
  10868. +Subject: [PATCH] rt2x00: rt2800lib: add hw_beacon_count field to struct
  10869. + rt2800_drv_data
  10870. +
  10871. +Some chipsets can handle more than 8 beacons at once.
  10872. +Add a new field to the rt2800_drv_data structure which
  10873. +will hold the number of supported beacons of the given
  10874. +chipset.
  10875. +
  10876. +Update the rt2x00_init_registers function to get the
  10877. +beacon count from the new field instead of using a
  10878. +hardcoded value.
  10879. +
  10880. +In order to keep the current behaviour, initialize the
  10881. +new field with the actually used value.
  10882. +
  10883. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  10884. +---
  10885. + drivers/net/wireless/rt2x00/rt2800lib.c | 5 ++++-
  10886. + drivers/net/wireless/rt2x00/rt2800lib.h | 1 +
  10887. + 2 files changed, 5 insertions(+), 1 deletion(-)
  10888. +
  10889. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  10890. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  10891. +@@ -4628,6 +4628,7 @@ EXPORT_SYMBOL_GPL(rt2800_link_tuner);
  10892. + */
  10893. + static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
  10894. + {
  10895. ++ struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
  10896. + u32 reg;
  10897. + u16 eeprom;
  10898. + unsigned int i;
  10899. +@@ -4993,7 +4994,7 @@ static int rt2800_init_registers(struct
  10900. + /*
  10901. + * Clear all beacons
  10902. + */
  10903. +- for (i = 0; i < 8; i++)
  10904. ++ for (i = 0; i < drv_data->hw_beacon_count; i++)
  10905. + rt2800_clear_beacon_register(rt2x00dev, i);
  10906. +
  10907. + if (rt2x00_is_usb(rt2x00dev)) {
  10908. +@@ -7839,6 +7840,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r
  10909. + if (rt2x00_rt(rt2x00dev, RT3593))
  10910. + __set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags);
  10911. +
  10912. ++ drv_data->hw_beacon_count = 8;
  10913. ++
  10914. + /*
  10915. + * Allocate eeprom data.
  10916. + */
  10917. +--- a/drivers/net/wireless/rt2x00/rt2800lib.h
  10918. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.h
  10919. +@@ -33,6 +33,7 @@ struct rt2800_drv_data {
  10920. + u8 txmixer_gain_24g;
  10921. + u8 txmixer_gain_5g;
  10922. + unsigned int tbtt_tick;
  10923. ++ unsigned int hw_beacon_count;
  10924. +
  10925. + unsigned long rt2800_flags;
  10926. +
  10927. diff --git a/package/mac80211/patches/600-0006-rt2x00-rt2800lib-init-additional-beacon-offset-regis.patch b/package/mac80211/patches/600-0006-rt2x00-rt2800lib-init-additional-beacon-offset-regis.patch
  10928. new file mode 100644
  10929. index 0000000..95f44b5
  10930. --- /dev/null
  10931. +++ b/package/mac80211/patches/600-0006-rt2x00-rt2800lib-init-additional-beacon-offset-regis.patch
  10932. @@ -0,0 +1,67 @@
  10933. +From 1bfa43ca8f30be53ce4fa79cfc3e219642a812b6 Mon Sep 17 00:00:00 2001
  10934. +From: Gabor Juhos <juhosg@openwrt.org>
  10935. +Date: Mon, 2 Sep 2013 10:58:32 +0200
  10936. +Subject: [PATCH] rt2x00: rt2800lib: init additional beacon offset registers
  10937. +
  10938. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  10939. +---
  10940. + drivers/net/wireless/rt2x00/rt2800.h | 14 ++++++++++++++
  10941. + drivers/net/wireless/rt2x00/rt2800lib.c | 24 ++++++++++++++++++++++++
  10942. + 2 files changed, 38 insertions(+)
  10943. +
  10944. +--- a/drivers/net/wireless/rt2x00/rt2800.h
  10945. ++++ b/drivers/net/wireless/rt2x00/rt2800.h
  10946. +@@ -627,6 +627,20 @@
  10947. + */
  10948. + #define PBF_DBG 0x043c
  10949. +
  10950. ++/* BCN_OFFSET2 */
  10951. ++#define BCN_OFFSET2 0x0444
  10952. ++#define BCN_OFFSET2_BCN8 FIELD32(0x000000ff)
  10953. ++#define BCN_OFFSET2_BCN9 FIELD32(0x0000ff00)
  10954. ++#define BCN_OFFSET2_BCN10 FIELD32(0x00ff0000)
  10955. ++#define BCN_OFFSET2_BCN11 FIELD32(0xff000000)
  10956. ++
  10957. ++/* BCN_OFFSET3 */
  10958. ++#define BCN_OFFSET3 0x0448
  10959. ++#define BCN_OFFSET3_BCN12 FIELD32(0x000000ff)
  10960. ++#define BCN_OFFSET3_BCN13 FIELD32(0x0000ff00)
  10961. ++#define BCN_OFFSET3_BCN14 FIELD32(0x00ff0000)
  10962. ++#define BCN_OFFSET3_BCN15 FIELD32(0xff000000)
  10963. ++
  10964. + /*
  10965. + * RF registers
  10966. + */
  10967. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  10968. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  10969. +@@ -4640,6 +4640,30 @@ static int rt2800_init_registers(struct
  10970. + if (ret)
  10971. + return ret;
  10972. +
  10973. ++ if (drv_data->hw_beacon_count == 16) {
  10974. ++ rt2800_register_read(rt2x00dev, BCN_OFFSET2, &reg);
  10975. ++ rt2x00_set_field32(&reg, BCN_OFFSET2_BCN8,
  10976. ++ rt2800_get_beacon_offset(rt2x00dev, 8));
  10977. ++ rt2x00_set_field32(&reg, BCN_OFFSET2_BCN9,
  10978. ++ rt2800_get_beacon_offset(rt2x00dev, 9));
  10979. ++ rt2x00_set_field32(&reg, BCN_OFFSET2_BCN10,
  10980. ++ rt2800_get_beacon_offset(rt2x00dev, 10));
  10981. ++ rt2x00_set_field32(&reg, BCN_OFFSET2_BCN11,
  10982. ++ rt2800_get_beacon_offset(rt2x00dev, 11));
  10983. ++ rt2800_register_write(rt2x00dev, BCN_OFFSET2, reg);
  10984. ++
  10985. ++ rt2800_register_read(rt2x00dev, BCN_OFFSET3, &reg);
  10986. ++ rt2x00_set_field32(&reg, BCN_OFFSET3_BCN12,
  10987. ++ rt2800_get_beacon_offset(rt2x00dev, 12));
  10988. ++ rt2x00_set_field32(&reg, BCN_OFFSET3_BCN13,
  10989. ++ rt2800_get_beacon_offset(rt2x00dev, 13));
  10990. ++ rt2x00_set_field32(&reg, BCN_OFFSET3_BCN14,
  10991. ++ rt2800_get_beacon_offset(rt2x00dev, 14));
  10992. ++ rt2x00_set_field32(&reg, BCN_OFFSET3_BCN15,
  10993. ++ rt2800_get_beacon_offset(rt2x00dev, 15));
  10994. ++ rt2800_register_write(rt2x00dev, BCN_OFFSET3, reg);
  10995. ++ }
  10996. ++
  10997. + rt2800_register_write(rt2x00dev, LEGACY_BASIC_RATE, 0x0000013f);
  10998. + rt2800_register_write(rt2x00dev, HT_BASIC_RATE, 0x00008003);
  10999. +
  11000. diff --git a/package/mac80211/patches/600-0007-rt2x00-rt2800lib-fix-max-supported-beacon-count-for-.patch b/package/mac80211/patches/600-0007-rt2x00-rt2800lib-fix-max-supported-beacon-count-for-.patch
  11001. new file mode 100644
  11002. index 0000000..303d2be
  11003. --- /dev/null
  11004. +++ b/package/mac80211/patches/600-0007-rt2x00-rt2800lib-fix-max-supported-beacon-count-for-.patch
  11005. @@ -0,0 +1,24 @@
  11006. +From 9bea8b61f6025cd633bd5ac71be258620b49bcb3 Mon Sep 17 00:00:00 2001
  11007. +From: Gabor Juhos <juhosg@openwrt.org>
  11008. +Date: Mon, 2 Sep 2013 11:00:06 +0200
  11009. +Subject: [PATCH] rt2x00: rt2800lib: fix max supported beacon count for RT3593
  11010. +
  11011. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  11012. +---
  11013. + drivers/net/wireless/rt2x00/rt2800lib.c | 5 ++++-
  11014. + 1 file changed, 4 insertions(+), 1 deletion(-)
  11015. +
  11016. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  11017. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  11018. +@@ -7864,7 +7864,10 @@ int rt2800_probe_hw(struct rt2x00_dev *r
  11019. + if (rt2x00_rt(rt2x00dev, RT3593))
  11020. + __set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags);
  11021. +
  11022. +- drv_data->hw_beacon_count = 8;
  11023. ++ if (rt2x00_rt(rt2x00dev, RT3593))
  11024. ++ drv_data->hw_beacon_count = 16;
  11025. ++ else
  11026. ++ drv_data->hw_beacon_count = 8;
  11027. +
  11028. + /*
  11029. + * Allocate eeprom data.
  11030. diff --git a/package/mac80211/patches/600-0008-rt2x00-allow-to-build-rt2800soc-module-for-RT3883.patch b/package/mac80211/patches/600-0008-rt2x00-allow-to-build-rt2800soc-module-for-RT3883.patch
  11031. new file mode 100644
  11032. index 0000000..8a10c6e
  11033. --- /dev/null
  11034. +++ b/package/mac80211/patches/600-0008-rt2x00-allow-to-build-rt2800soc-module-for-RT3883.patch
  11035. @@ -0,0 +1,30 @@
  11036. +From 91094ed065f7794886b4a5490fd6de942f036bb4 Mon Sep 17 00:00:00 2001
  11037. +From: Gabor Juhos <juhosg@openwrt.org>
  11038. +Date: Sun, 24 Mar 2013 19:26:26 +0100
  11039. +Subject: [PATCH] rt2x00: allow to build rt2800soc module for RT3883
  11040. +
  11041. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  11042. +---
  11043. + drivers/net/wireless/rt2x00/Kconfig | 2 +-
  11044. + 1 file changed, 1 insertion(+), 1 deletion(-)
  11045. +
  11046. +--- a/drivers/net/wireless/rt2x00/Kconfig
  11047. ++++ b/drivers/net/wireless/rt2x00/Kconfig
  11048. +@@ -210,7 +210,7 @@ endif
  11049. + config RT2800SOC
  11050. + tristate "Ralink WiSoC support"
  11051. + depends on m
  11052. +- depends on SOC_RT288X || SOC_RT305X
  11053. ++ depends on SOC_RT288X || SOC_RT305X || SOC_RT3883
  11054. + select RT2X00_LIB_SOC
  11055. + select RT2X00_LIB_MMIO
  11056. + select RT2X00_LIB_CRYPTO
  11057. +@@ -245,7 +245,7 @@ config RT2X00_LIB_PCI
  11058. +
  11059. + config RT2X00_LIB_SOC
  11060. + tristate "RT2x00 SoC support"
  11061. +- depends on SOC_RT288X || SOC_RT305X
  11062. ++ depends on SOC_RT288X || SOC_RT305X || SOC_RT3883
  11063. + depends on m
  11064. + select RT2X00_LIB
  11065. +
  11066. diff --git a/package/mac80211/patches/600-0009-rt2x00-rt2800lib-enable-support-for-RT3883.patch b/package/mac80211/patches/600-0009-rt2x00-rt2800lib-enable-support-for-RT3883.patch
  11067. new file mode 100644
  11068. index 0000000..848d95f
  11069. --- /dev/null
  11070. +++ b/package/mac80211/patches/600-0009-rt2x00-rt2800lib-enable-support-for-RT3883.patch
  11071. @@ -0,0 +1,20 @@
  11072. +From 4f16582c93a71eba9d389e0f0a8aa9099a9587cd Mon Sep 17 00:00:00 2001
  11073. +From: Gabor Juhos <juhosg@openwrt.org>
  11074. +Date: Sun, 24 Mar 2013 19:26:26 +0100
  11075. +Subject: [PATCH] rt2x00: rt2800lib: enable support for RT3883
  11076. +
  11077. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  11078. +---
  11079. + drivers/net/wireless/rt2x00/rt2800lib.c | 1 +
  11080. + 1 file changed, 1 insertion(+)
  11081. +
  11082. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  11083. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  11084. +@@ -7834,6 +7834,7 @@ static int rt2800_probe_rt(struct rt2x00
  11085. + case RT3390:
  11086. + case RT3572:
  11087. + case RT3593:
  11088. ++ case RT3883:
  11089. + case RT5390:
  11090. + case RT5392:
  11091. + case RT5592:
  11092. diff --git a/package/mac80211/patches/600-0010-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch b/package/mac80211/patches/600-0010-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch
  11093. new file mode 100644
  11094. index 0000000..4ccd47f
  11095. --- /dev/null
  11096. +++ b/package/mac80211/patches/600-0010-rt2x00-rt2800lib-add-rf_vals-for-RF3853.patch
  11097. @@ -0,0 +1,112 @@
  11098. +From ecb394ccf248d8652c463133c4f404458a57a9c1 Mon Sep 17 00:00:00 2001
  11099. +From: Gabor Juhos <juhosg@openwrt.org>
  11100. +Date: Sun, 24 Mar 2013 19:26:26 +0100
  11101. +Subject: [PATCH] rt2x00: rt2800lib: add rf_vals for RF3853
  11102. +
  11103. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  11104. +---
  11105. + drivers/net/wireless/rt2x00/rt2800.h | 4 +-
  11106. + drivers/net/wireless/rt2x00/rt2800lib.c | 65 +++++++++++++++++++++++++++++++
  11107. + 2 files changed, 68 insertions(+), 1 deletion(-)
  11108. +
  11109. +--- a/drivers/net/wireless/rt2x00/rt2800.h
  11110. ++++ b/drivers/net/wireless/rt2x00/rt2800.h
  11111. +@@ -48,7 +48,8 @@
  11112. + * RF2853 2.4G/5G 3T3R
  11113. + * RF3320 2.4G 1T1R(RT3350/RT3370/RT3390)
  11114. + * RF3322 2.4G 2T2R(RT3352/RT3371/RT3372/RT3391/RT3392)
  11115. +- * RF3053 2.4G/5G 3T3R(RT3883/RT3563/RT3573/RT3593/RT3662)
  11116. ++ * RF3053 2.4G/5G 3T3R(RT3563/RT3573/RT3593)
  11117. ++ * RF3853 2.4G/5G 3T3R(RT3883/RT3662)
  11118. + * RF5592 2.4G/5G 2T2R
  11119. + * RF3070 2.4G 1T1R
  11120. + * RF5360 2.4G 1T1R
  11121. +@@ -71,6 +72,7 @@
  11122. + #define RF5592 0x000f
  11123. + #define RF3070 0x3070
  11124. + #define RF3290 0x3290
  11125. ++#define RF3853 0x3853
  11126. + #define RF5360 0x5360
  11127. + #define RF5370 0x5370
  11128. + #define RF5372 0x5372
  11129. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  11130. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  11131. +@@ -7454,6 +7454,66 @@ static const struct rf_channel rf_vals_3
  11132. + {173, 0x61, 0, 9},
  11133. + };
  11134. +
  11135. ++static const struct rf_channel rf_vals_3853[] = {
  11136. ++ {1, 241, 6, 2},
  11137. ++ {2, 241, 6, 7},
  11138. ++ {3, 242, 6, 2},
  11139. ++ {4, 242, 6, 7},
  11140. ++ {5, 243, 6, 2},
  11141. ++ {6, 243, 6, 7},
  11142. ++ {7, 244, 6, 2},
  11143. ++ {8, 244, 6, 7},
  11144. ++ {9, 245, 6, 2},
  11145. ++ {10, 245, 6, 7},
  11146. ++ {11, 246, 6, 2},
  11147. ++ {12, 246, 6, 7},
  11148. ++ {13, 247, 6, 2},
  11149. ++ {14, 248, 6, 4},
  11150. ++
  11151. ++ {36, 0x56, 8, 4},
  11152. ++ {38, 0x56, 8, 6},
  11153. ++ {40, 0x56, 8, 8},
  11154. ++ {44, 0x57, 8, 0},
  11155. ++ {46, 0x57, 8, 2},
  11156. ++ {48, 0x57, 8, 4},
  11157. ++ {52, 0x57, 8, 8},
  11158. ++ {54, 0x57, 8, 10},
  11159. ++ {56, 0x58, 8, 0},
  11160. ++ {60, 0x58, 8, 4},
  11161. ++ {62, 0x58, 8, 6},
  11162. ++ {64, 0x58, 8, 8},
  11163. ++
  11164. ++ {100, 0x5b, 8, 8},
  11165. ++ {102, 0x5b, 8, 10},
  11166. ++ {104, 0x5c, 8, 0},
  11167. ++ {108, 0x5c, 8, 4},
  11168. ++ {110, 0x5c, 8, 6},
  11169. ++ {112, 0x5c, 8, 8},
  11170. ++ {114, 0x5c, 8, 10},
  11171. ++ {116, 0x5d, 8, 0},
  11172. ++ {118, 0x5d, 8, 2},
  11173. ++ {120, 0x5d, 8, 4},
  11174. ++ {124, 0x5d, 8, 8},
  11175. ++ {126, 0x5d, 8, 10},
  11176. ++ {128, 0x5e, 8, 0},
  11177. ++ {132, 0x5e, 8, 4},
  11178. ++ {134, 0x5e, 8, 6},
  11179. ++ {136, 0x5e, 8, 8},
  11180. ++ {140, 0x5f, 8, 0},
  11181. ++
  11182. ++ {149, 0x5f, 8, 9},
  11183. ++ {151, 0x5f, 8, 11},
  11184. ++ {153, 0x60, 8, 1},
  11185. ++ {157, 0x60, 8, 5},
  11186. ++ {159, 0x60, 8, 7},
  11187. ++ {161, 0x60, 8, 9},
  11188. ++ {165, 0x61, 8, 1},
  11189. ++ {167, 0x61, 8, 3},
  11190. ++ {169, 0x61, 8, 5},
  11191. ++ {171, 0x61, 8, 7},
  11192. ++ {173, 0x61, 8, 9},
  11193. ++};
  11194. ++
  11195. + static const struct rf_channel rf_vals_5592_xtal20[] = {
  11196. + /* Channel, N, K, mod, R */
  11197. + {1, 482, 4, 10, 3},
  11198. +@@ -7682,6 +7742,11 @@ static int rt2800_probe_hw_mode(struct r
  11199. + spec->channels = rf_vals_3x;
  11200. + break;
  11201. +
  11202. ++ case RF3853:
  11203. ++ spec->num_channels = ARRAY_SIZE(rf_vals_3853);
  11204. ++ spec->channels = rf_vals_3853;
  11205. ++ break;
  11206. ++
  11207. + case RF5592:
  11208. + rt2800_register_read(rt2x00dev, MAC_DEBUG_INDEX, &reg);
  11209. + if (rt2x00_get_field32(reg, MAC_DEBUG_INDEX_XTAL)) {
  11210. diff --git a/package/mac80211/patches/600-0011-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch b/package/mac80211/patches/600-0011-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch
  11211. new file mode 100644
  11212. index 0000000..7dbfd7f
  11213. --- /dev/null
  11214. +++ b/package/mac80211/patches/600-0011-rt2x00-rt2800lib-enable-VCO-calibration-for-RF3853.patch
  11215. @@ -0,0 +1,28 @@
  11216. +From f8e3fcf18e1f2d7f9e6a9680c5452da090f33d88 Mon Sep 17 00:00:00 2001
  11217. +From: Gabor Juhos <juhosg@openwrt.org>
  11218. +Date: Thu, 1 Aug 2013 14:40:44 +0200
  11219. +Subject: [PATCH] rt2x00: rt2800lib: enable VCO calibration for RF3853
  11220. +
  11221. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  11222. +---
  11223. + drivers/net/wireless/rt2x00/rt2800lib.c | 2 ++
  11224. + 1 file changed, 2 insertions(+)
  11225. +
  11226. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  11227. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  11228. +@@ -4393,6 +4393,7 @@ void rt2800_vco_calibration(struct rt2x0
  11229. + case RF3053:
  11230. + case RF3070:
  11231. + case RF3290:
  11232. ++ case RF3853:
  11233. + case RF5360:
  11234. + case RF5370:
  11235. + case RF5372:
  11236. +@@ -7861,6 +7862,7 @@ static int rt2800_probe_hw_mode(struct r
  11237. + case RF3053:
  11238. + case RF3070:
  11239. + case RF3290:
  11240. ++ case RF3853:
  11241. + case RF5360:
  11242. + case RF5370:
  11243. + case RF5372:
  11244. diff --git a/package/mac80211/patches/600-0012-rt2x00-rt2800lib-add-channel-configuration-function-.patch b/package/mac80211/patches/600-0012-rt2x00-rt2800lib-add-channel-configuration-function-.patch
  11245. new file mode 100644
  11246. index 0000000..4c28f9b
  11247. --- /dev/null
  11248. +++ b/package/mac80211/patches/600-0012-rt2x00-rt2800lib-add-channel-configuration-function-.patch
  11249. @@ -0,0 +1,235 @@
  11250. +From 6e3a17190815c6aa4dc53c2cfe9125fb1154f187 Mon Sep 17 00:00:00 2001
  11251. +From: Gabor Juhos <juhosg@openwrt.org>
  11252. +Date: Sun, 24 Mar 2013 19:26:27 +0100
  11253. +Subject: [PATCH] rt2x00: rt2800lib: add channel configuration function for
  11254. + RF3853
  11255. +
  11256. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  11257. +---
  11258. + drivers/net/wireless/rt2x00/rt2800lib.c | 208 +++++++++++++++++++++++++++++++
  11259. + 1 file changed, 208 insertions(+)
  11260. +
  11261. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  11262. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  11263. +@@ -2649,6 +2649,211 @@ static void rt2800_config_channel_rf3053
  11264. + }
  11265. + }
  11266. +
  11267. ++static void rt2800_config_channel_rf3853(struct rt2x00_dev *rt2x00dev,
  11268. ++ struct ieee80211_conf *conf,
  11269. ++ struct rf_channel *rf,
  11270. ++ struct channel_info *info)
  11271. ++{
  11272. ++ u8 rfcsr;
  11273. ++ u8 bbp;
  11274. ++ u8 pwr1, pwr2, pwr3;
  11275. ++
  11276. ++ const bool txbf_enabled = false; /* TODO */
  11277. ++
  11278. ++ /* TODO: add band selection */
  11279. ++
  11280. ++ if (rf->channel <= 14)
  11281. ++ rt2800_rfcsr_write(rt2x00dev, 6, 0x40);
  11282. ++ else if (rf->channel < 132)
  11283. ++ rt2800_rfcsr_write(rt2x00dev, 6, 0x80);
  11284. ++ else
  11285. ++ rt2800_rfcsr_write(rt2x00dev, 6, 0x40);
  11286. ++
  11287. ++ rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1);
  11288. ++ rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3);
  11289. ++
  11290. ++ if (rf->channel <= 14)
  11291. ++ rt2800_rfcsr_write(rt2x00dev, 11, 0x46);
  11292. ++ else
  11293. ++ rt2800_rfcsr_write(rt2x00dev, 11, 0x48);
  11294. ++
  11295. ++ if (rf->channel <= 14)
  11296. ++ rt2800_rfcsr_write(rt2x00dev, 12, 0x1a);
  11297. ++ else
  11298. ++ rt2800_rfcsr_write(rt2x00dev, 12, 0x52);
  11299. ++
  11300. ++ rt2800_rfcsr_write(rt2x00dev, 13, 0x12);
  11301. ++
  11302. ++ rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr);
  11303. ++ rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0);
  11304. ++ rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0);
  11305. ++ rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0);
  11306. ++ rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 0);
  11307. ++ rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0);
  11308. ++ rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0);
  11309. ++ rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1);
  11310. ++ rt2x00_set_field8(&rfcsr, RFCSR1_PLL_PD, 1);
  11311. ++
  11312. ++ switch (rt2x00dev->default_ant.tx_chain_num) {
  11313. ++ case 3:
  11314. ++ rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1);
  11315. ++ /* fallthrough */
  11316. ++ case 2:
  11317. ++ rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1);
  11318. ++ /* fallthrough */
  11319. ++ case 1:
  11320. ++ rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1);
  11321. ++ break;
  11322. ++ }
  11323. ++
  11324. ++ switch (rt2x00dev->default_ant.rx_chain_num) {
  11325. ++ case 3:
  11326. ++ rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1);
  11327. ++ /* fallthrough */
  11328. ++ case 2:
  11329. ++ rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1);
  11330. ++ /* fallthrough */
  11331. ++ case 1:
  11332. ++ rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1);
  11333. ++ break;
  11334. ++ }
  11335. ++ rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
  11336. ++
  11337. ++ rt2800_adjust_freq_offset(rt2x00dev);
  11338. ++
  11339. ++ rt2800_rfcsr_read(rt2x00dev, 30, &rfcsr);
  11340. ++ if (!conf_is_ht40(conf))
  11341. ++ rfcsr &= ~(0x06);
  11342. ++ else
  11343. ++ rfcsr |= 0x06;
  11344. ++ rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
  11345. ++
  11346. ++ if (rf->channel <= 14)
  11347. ++ rt2800_rfcsr_write(rt2x00dev, 31, 0xa0);
  11348. ++ else
  11349. ++ rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
  11350. ++
  11351. ++ if (conf_is_ht40(conf))
  11352. ++ rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
  11353. ++ else
  11354. ++ rt2800_rfcsr_write(rt2x00dev, 32, 0xd8);
  11355. ++
  11356. ++ if (rf->channel <= 14)
  11357. ++ rt2800_rfcsr_write(rt2x00dev, 34, 0x3c);
  11358. ++ else
  11359. ++ rt2800_rfcsr_write(rt2x00dev, 34, 0x20);
  11360. ++
  11361. ++ /* loopback RF_BS */
  11362. ++ rt2800_rfcsr_read(rt2x00dev, 36, &rfcsr);
  11363. ++ if (rf->channel <= 14)
  11364. ++ rt2x00_set_field8(&rfcsr, RFCSR36_RF_BS, 1);
  11365. ++ else
  11366. ++ rt2x00_set_field8(&rfcsr, RFCSR36_RF_BS, 0);
  11367. ++ rt2800_rfcsr_write(rt2x00dev, 36, rfcsr);
  11368. ++
  11369. ++ if (rf->channel <= 14)
  11370. ++ rfcsr = 0x23;
  11371. ++ else if (rf->channel < 100)
  11372. ++ rfcsr = 0x36;
  11373. ++ else if (rf->channel < 132)
  11374. ++ rfcsr = 0x32;
  11375. ++ else
  11376. ++ rfcsr = 0x30;
  11377. ++
  11378. ++ if (txbf_enabled)
  11379. ++ rfcsr |= 0x40;
  11380. ++
  11381. ++ rt2800_rfcsr_write(rt2x00dev, 39, rfcsr);
  11382. ++
  11383. ++ if (rf->channel <= 14)
  11384. ++ rt2800_rfcsr_write(rt2x00dev, 44, 0x93);
  11385. ++ else
  11386. ++ rt2800_rfcsr_write(rt2x00dev, 44, 0x9b);
  11387. ++
  11388. ++ if (rf->channel <= 14)
  11389. ++ rfcsr = 0xbb;
  11390. ++ else if (rf->channel < 100)
  11391. ++ rfcsr = 0xeb;
  11392. ++ else if (rf->channel < 132)
  11393. ++ rfcsr = 0xb3;
  11394. ++ else
  11395. ++ rfcsr = 0x9b;
  11396. ++ rt2800_rfcsr_write(rt2x00dev, 45, rfcsr);
  11397. ++
  11398. ++ if (rf->channel <= 14)
  11399. ++ rfcsr = 0x8e;
  11400. ++ else
  11401. ++ rfcsr = 0x8a;
  11402. ++
  11403. ++ if (txbf_enabled)
  11404. ++ rfcsr |= 0x20;
  11405. ++
  11406. ++ rt2800_rfcsr_write(rt2x00dev, 49, rfcsr);
  11407. ++
  11408. ++ rt2800_rfcsr_write(rt2x00dev, 50, 0x86);
  11409. ++
  11410. ++ rt2800_rfcsr_read(rt2x00dev, 51, &rfcsr);
  11411. ++ if (rf->channel <= 14)
  11412. ++ rt2800_rfcsr_write(rt2x00dev, 51, 0x75);
  11413. ++ else
  11414. ++ rt2800_rfcsr_write(rt2x00dev, 51, 0x51);
  11415. ++
  11416. ++ rt2800_rfcsr_read(rt2x00dev, 52, &rfcsr);
  11417. ++ if (rf->channel <= 14)
  11418. ++ rt2800_rfcsr_write(rt2x00dev, 52, 0x45);
  11419. ++ else
  11420. ++ rt2800_rfcsr_write(rt2x00dev, 52, 0x05);
  11421. ++
  11422. ++ if (rf->channel <= 14) {
  11423. ++ pwr1 = info->default_power1 & 0x1f;
  11424. ++ pwr2 = info->default_power2 & 0x1f;
  11425. ++ pwr3 = info->default_power3 & 0x1f;
  11426. ++ } else {
  11427. ++ pwr1 = 0x48 | ((info->default_power1 & 0x18) << 1) |
  11428. ++ (info->default_power1 & 0x7);
  11429. ++ pwr2 = 0x48 | ((info->default_power2 & 0x18) << 1) |
  11430. ++ (info->default_power2 & 0x7);
  11431. ++ pwr3 = 0x48 | ((info->default_power3 & 0x18) << 1) |
  11432. ++ (info->default_power3 & 0x7);
  11433. ++ }
  11434. ++
  11435. ++ rt2800_rfcsr_write(rt2x00dev, 53, pwr1);
  11436. ++ rt2800_rfcsr_write(rt2x00dev, 54, pwr2);
  11437. ++ rt2800_rfcsr_write(rt2x00dev, 55, pwr3);
  11438. ++
  11439. ++ rt2x00_dbg(rt2x00dev, "Channel:%d, pwr1:%02x, pwr2:%02x, pwr3:%02x\n",
  11440. ++ rf->channel, pwr1, pwr2, pwr3);
  11441. ++
  11442. ++ bbp = (info->default_power1 >> 5) |
  11443. ++ ((info->default_power2 & 0xe0) >> 1);
  11444. ++ rt2800_bbp_write(rt2x00dev, 109, bbp);
  11445. ++
  11446. ++ rt2800_bbp_read(rt2x00dev, 110, &bbp);
  11447. ++ bbp &= 0x0f;
  11448. ++ bbp |= (info->default_power3 & 0xe0) >> 1;
  11449. ++ rt2800_bbp_write(rt2x00dev, 110, bbp);
  11450. ++
  11451. ++ rt2800_rfcsr_read(rt2x00dev, 57, &rfcsr);
  11452. ++ if (rf->channel <= 14)
  11453. ++ rt2800_rfcsr_write(rt2x00dev, 57, 0x6e);
  11454. ++ else
  11455. ++ rt2800_rfcsr_write(rt2x00dev, 57, 0x3e);
  11456. ++
  11457. ++ /* Enable RF tuning */
  11458. ++ rt2800_rfcsr_read(rt2x00dev, 3, &rfcsr);
  11459. ++ rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1);
  11460. ++ rt2800_rfcsr_write(rt2x00dev, 3, rfcsr);
  11461. ++
  11462. ++ udelay(2000);
  11463. ++
  11464. ++ rt2800_bbp_read(rt2x00dev, 49, &bbp);
  11465. ++ /* clear update flag */
  11466. ++ rt2800_bbp_write(rt2x00dev, 49, bbp & 0xfe);
  11467. ++ rt2800_bbp_write(rt2x00dev, 49, bbp);
  11468. ++
  11469. ++ /* TODO: add calibration for TxBF */
  11470. ++}
  11471. ++
  11472. + #define POWER_BOUND 0x27
  11473. + #define POWER_BOUND_5G 0x2b
  11474. +
  11475. +@@ -3261,6 +3466,9 @@ static void rt2800_config_channel(struct
  11476. + case RF3322:
  11477. + rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info);
  11478. + break;
  11479. ++ case RF3853:
  11480. ++ rt2800_config_channel_rf3853(rt2x00dev, conf, rf, info);
  11481. ++ break;
  11482. + case RF3070:
  11483. + case RF5360:
  11484. + case RF5370:
  11485. diff --git a/package/mac80211/patches/600-0013-rt2x00-rt2800lib-enable-RF3853-support.patch b/package/mac80211/patches/600-0013-rt2x00-rt2800lib-enable-RF3853-support.patch
  11486. new file mode 100644
  11487. index 0000000..9419e62
  11488. --- /dev/null
  11489. +++ b/package/mac80211/patches/600-0013-rt2x00-rt2800lib-enable-RF3853-support.patch
  11490. @@ -0,0 +1,20 @@
  11491. +From afd38ae82226551bf879b6c7c4b620c271fee9d2 Mon Sep 17 00:00:00 2001
  11492. +From: Gabor Juhos <juhosg@openwrt.org>
  11493. +Date: Thu, 1 Aug 2013 14:42:05 +0200
  11494. +Subject: [PATCH] rt2x00: rt2800lib: enable RF3853 support
  11495. +
  11496. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  11497. +---
  11498. + drivers/net/wireless/rt2x00/rt2800lib.c | 1 +
  11499. + 1 file changed, 1 insertion(+)
  11500. +
  11501. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  11502. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  11503. +@@ -7420,6 +7420,7 @@ static int rt2800_init_eeprom(struct rt2
  11504. + case RF3290:
  11505. + case RF3320:
  11506. + case RF3322:
  11507. ++ case RF3853:
  11508. + case RF5360:
  11509. + case RF5370:
  11510. + case RF5372:
  11511. diff --git a/package/mac80211/patches/600-0014-rt2x00-rt2800lib-add-MAC-register-initialization-for.patch b/package/mac80211/patches/600-0014-rt2x00-rt2800lib-add-MAC-register-initialization-for.patch
  11512. new file mode 100644
  11513. index 0000000..65c6720
  11514. --- /dev/null
  11515. +++ b/package/mac80211/patches/600-0014-rt2x00-rt2800lib-add-MAC-register-initialization-for.patch
  11516. @@ -0,0 +1,77 @@
  11517. +From 0094872a5e8e4664c6ea1b2dfa487063d39ae363 Mon Sep 17 00:00:00 2001
  11518. +From: Gabor Juhos <juhosg@openwrt.org>
  11519. +Date: Sun, 24 Mar 2013 19:26:26 +0100
  11520. +Subject: [PATCH] rt2x00: rt2800lib: add MAC register initialization for
  11521. + RT3883
  11522. +
  11523. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  11524. +---
  11525. + drivers/net/wireless/rt2x00/rt2800.h | 14 ++++++++++++++
  11526. + drivers/net/wireless/rt2x00/rt2800lib.c | 19 ++++++++++++++++---
  11527. + 2 files changed, 30 insertions(+), 3 deletions(-)
  11528. +
  11529. +--- a/drivers/net/wireless/rt2x00/rt2800.h
  11530. ++++ b/drivers/net/wireless/rt2x00/rt2800.h
  11531. +@@ -1586,6 +1586,20 @@
  11532. + #define TX_PWR_CFG_9_STBC7_CH2 FIELD32(0x00000f00)
  11533. +
  11534. + /*
  11535. ++ * TX_TXBF_CFG:
  11536. ++ */
  11537. ++#define TX_TXBF_CFG_0 0x138c
  11538. ++#define TX_TXBF_CFG_1 0x13a4
  11539. ++#define TX_TXBF_CFG_2 0x13a8
  11540. ++#define TX_TXBF_CFG_3 0x13ac
  11541. ++
  11542. ++/*
  11543. ++ * TX_FBK_CFG_3S:
  11544. ++ */
  11545. ++#define TX_FBK_CFG_3S_0 0x13c4
  11546. ++#define TX_FBK_CFG_3S_1 0x13c8
  11547. ++
  11548. ++/*
  11549. + * RX_FILTER_CFG: RX configuration register.
  11550. + */
  11551. + #define RX_FILTER_CFG 0x1400
  11552. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  11553. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  11554. +@@ -4995,6 +4995,12 @@ static int rt2800_init_registers(struct
  11555. + rt2800_register_write(rt2x00dev, TX_SW_CFG2,
  11556. + 0x00000000);
  11557. + }
  11558. ++ } else if (rt2x00_rt(rt2x00dev, RT3883)) {
  11559. ++ rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000402);
  11560. ++ rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000);
  11561. ++ rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00040000);
  11562. ++ rt2800_register_write(rt2x00dev, TX_TXBF_CFG_0, 0x8000fc21);
  11563. ++ rt2800_register_write(rt2x00dev, TX_TXBF_CFG_3, 0x00009c40);
  11564. + } else if (rt2x00_rt(rt2x00dev, RT5390) ||
  11565. + rt2x00_rt(rt2x00dev, RT5392) ||
  11566. + rt2x00_rt(rt2x00dev, RT5592)) {
  11567. +@@ -5025,9 +5031,11 @@ static int rt2800_init_registers(struct
  11568. +
  11569. + rt2800_register_read(rt2x00dev, MAX_LEN_CFG, &reg);
  11570. + rt2x00_set_field32(&reg, MAX_LEN_CFG_MAX_MPDU, AGGREGATION_SIZE);
  11571. +- if (rt2x00_rt_rev_gte(rt2x00dev, RT2872, REV_RT2872E) ||
  11572. +- rt2x00_rt(rt2x00dev, RT2883) ||
  11573. +- rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070E))
  11574. ++ if (rt2x00_rt(rt2x00dev, RT3883))
  11575. ++ rt2x00_set_field32(&reg, MAX_LEN_CFG_MAX_PSDU, 3);
  11576. ++ else if (rt2x00_rt_rev_gte(rt2x00dev, RT2872, REV_RT2872E) ||
  11577. ++ rt2x00_rt(rt2x00dev, RT2883) ||
  11578. ++ rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070E))
  11579. + rt2x00_set_field32(&reg, MAX_LEN_CFG_MAX_PSDU, 2);
  11580. + else
  11581. + rt2x00_set_field32(&reg, MAX_LEN_CFG_MAX_PSDU, 1);
  11582. +@@ -5180,6 +5188,11 @@ static int rt2800_init_registers(struct
  11583. + reg = rt2x00_rt(rt2x00dev, RT5592) ? 0x00000082 : 0x00000002;
  11584. + rt2800_register_write(rt2x00dev, TXOP_HLDR_ET, reg);
  11585. +
  11586. ++ if (rt2x00_rt(rt2x00dev, RT3883)) {
  11587. ++ rt2800_register_write(rt2x00dev, TX_FBK_CFG_3S_0, 0x12111008);
  11588. ++ rt2800_register_write(rt2x00dev, TX_FBK_CFG_3S_1, 0x16151413);
  11589. ++ }
  11590. ++
  11591. + rt2800_register_read(rt2x00dev, TX_RTS_CFG, &reg);
  11592. + rt2x00_set_field32(&reg, TX_RTS_CFG_AUTO_RTS_RETRY_LIMIT, 32);
  11593. + rt2x00_set_field32(&reg, TX_RTS_CFG_RTS_THRES,
  11594. diff --git a/package/mac80211/patches/600-0015-rt2x00-rt2800soc-fix-rt2800soc_disable_radio-for-RT3.patch b/package/mac80211/patches/600-0015-rt2x00-rt2800soc-fix-rt2800soc_disable_radio-for-RT3.patch
  11595. new file mode 100644
  11596. index 0000000..837c025
  11597. --- /dev/null
  11598. +++ b/package/mac80211/patches/600-0015-rt2x00-rt2800soc-fix-rt2800soc_disable_radio-for-RT3.patch
  11599. @@ -0,0 +1,30 @@
  11600. +From 6c2d32478159fffff0b85abb6817a21bb2338231 Mon Sep 17 00:00:00 2001
  11601. +From: Gabor Juhos <juhosg@openwrt.org>
  11602. +Date: Sun, 24 Mar 2013 19:26:27 +0100
  11603. +Subject: [PATCH] rt2x00: rt2800soc: fix rt2800soc_disable_radio for RT3883
  11604. +
  11605. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  11606. +---
  11607. + drivers/net/wireless/rt2x00/rt2800soc.c | 9 ++++++++-
  11608. + 1 file changed, 8 insertions(+), 1 deletion(-)
  11609. +
  11610. +--- a/drivers/net/wireless/rt2x00/rt2800soc.c
  11611. ++++ b/drivers/net/wireless/rt2x00/rt2800soc.c
  11612. +@@ -51,9 +51,16 @@ static bool rt2800soc_hwcrypt_disabled(s
  11613. +
  11614. + static void rt2800soc_disable_radio(struct rt2x00_dev *rt2x00dev)
  11615. + {
  11616. ++ u32 reg;
  11617. ++
  11618. + rt2800_disable_radio(rt2x00dev);
  11619. + rt2x00mmio_register_write(rt2x00dev, PWR_PIN_CFG, 0);
  11620. +- rt2x00mmio_register_write(rt2x00dev, TX_PIN_CFG, 0);
  11621. ++
  11622. ++ reg = 0;
  11623. ++ if (rt2x00_rt(rt2x00dev, RT3883))
  11624. ++ rt2x00_set_field32(&reg, TX_PIN_CFG_RFTR_EN, 1);
  11625. ++
  11626. ++ rt2x00mmio_register_write(rt2x00dev, TX_PIN_CFG, reg);
  11627. + }
  11628. +
  11629. + static int rt2800soc_set_device_state(struct rt2x00_dev *rt2x00dev,
  11630. diff --git a/package/mac80211/patches/600-0016-rt2x00-rt2800lib-add-BBP-register-initialization-for.patch b/package/mac80211/patches/600-0016-rt2x00-rt2800lib-add-BBP-register-initialization-for.patch
  11631. new file mode 100644
  11632. index 0000000..bba96db
  11633. --- /dev/null
  11634. +++ b/package/mac80211/patches/600-0016-rt2x00-rt2800lib-add-BBP-register-initialization-for.patch
  11635. @@ -0,0 +1,71 @@
  11636. +From 84833056aa7dd25f5b097e31c78f2a0914c5160c Mon Sep 17 00:00:00 2001
  11637. +From: Gabor Juhos <juhosg@openwrt.org>
  11638. +Date: Sun, 24 Mar 2013 19:26:26 +0100
  11639. +Subject: [PATCH] rt2x00: rt2800lib: add BBP register initialization for
  11640. + RT3883
  11641. +
  11642. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  11643. +---
  11644. + drivers/net/wireless/rt2x00/rt2800lib.c | 44 +++++++++++++++++++++++++++++++
  11645. + 1 file changed, 44 insertions(+)
  11646. +
  11647. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  11648. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  11649. +@@ -5798,6 +5798,47 @@ static void rt2800_init_bbp_3593(struct
  11650. + rt2800_bbp_write(rt2x00dev, 103, 0xc0);
  11651. + }
  11652. +
  11653. ++static void rt2800_init_bbp_3883(struct rt2x00_dev *rt2x00dev)
  11654. ++{
  11655. ++ rt2800_init_bbp_early(rt2x00dev);
  11656. ++
  11657. ++ rt2800_bbp_write(rt2x00dev, 4, 0x50);
  11658. ++ rt2800_bbp_write(rt2x00dev, 47, 0x48);
  11659. ++
  11660. ++ rt2800_bbp_write(rt2x00dev, 86, 0x46);
  11661. ++ rt2800_bbp_write(rt2x00dev, 88, 0x90);
  11662. ++
  11663. ++ rt2800_bbp_write(rt2x00dev, 92, 0x02);
  11664. ++
  11665. ++ rt2800_bbp_write(rt2x00dev, 103, 0xc0);
  11666. ++ rt2800_bbp_write(rt2x00dev, 104, 0x92);
  11667. ++ rt2800_bbp_write(rt2x00dev, 105, 0x34);
  11668. ++ rt2800_bbp_write(rt2x00dev, 106, 0x12);
  11669. ++ rt2800_bbp_write(rt2x00dev, 120, 0x50);
  11670. ++ rt2800_bbp_write(rt2x00dev, 137, 0x0f);
  11671. ++ rt2800_bbp_write(rt2x00dev, 163, 0x9d);
  11672. ++
  11673. ++ /* Set ITxBF timeout to 0x9C40=1000msec */
  11674. ++ rt2800_bbp_write(rt2x00dev, 179, 0x02);
  11675. ++ rt2800_bbp_write(rt2x00dev, 180, 0x00);
  11676. ++ rt2800_bbp_write(rt2x00dev, 182, 0x40);
  11677. ++ rt2800_bbp_write(rt2x00dev, 180, 0x01);
  11678. ++ rt2800_bbp_write(rt2x00dev, 182, 0x9c);
  11679. ++
  11680. ++ rt2800_bbp_write(rt2x00dev, 179, 0x00);
  11681. ++
  11682. ++ /* Reprogram the inband interface to put right values in RXWI */
  11683. ++ rt2800_bbp_write(rt2x00dev, 142, 0x04);
  11684. ++ rt2800_bbp_write(rt2x00dev, 143, 0x3b);
  11685. ++ rt2800_bbp_write(rt2x00dev, 142, 0x06);
  11686. ++ rt2800_bbp_write(rt2x00dev, 143, 0xa0);
  11687. ++ rt2800_bbp_write(rt2x00dev, 142, 0x07);
  11688. ++ rt2800_bbp_write(rt2x00dev, 143, 0xa1);
  11689. ++ rt2800_bbp_write(rt2x00dev, 142, 0x08);
  11690. ++ rt2800_bbp_write(rt2x00dev, 143, 0xa2);
  11691. ++ rt2800_bbp_write(rt2x00dev, 148, 0xc8);
  11692. ++}
  11693. ++
  11694. + static void rt2800_init_bbp_53xx(struct rt2x00_dev *rt2x00dev)
  11695. + {
  11696. + int ant, div_mode;
  11697. +@@ -6016,6 +6057,9 @@ static void rt2800_init_bbp(struct rt2x0
  11698. + case RT3593:
  11699. + rt2800_init_bbp_3593(rt2x00dev);
  11700. + return;
  11701. ++ case RT3883:
  11702. ++ rt2800_init_bbp_3883(rt2x00dev);
  11703. ++ return;
  11704. + case RT5390:
  11705. + case RT5392:
  11706. + rt2800_init_bbp_53xx(rt2x00dev);
  11707. diff --git a/package/mac80211/patches/600-0017-rt2x00-rt2800lib-add-RFCSR-initialization-for-RT3883.patch b/package/mac80211/patches/600-0017-rt2x00-rt2800lib-add-RFCSR-initialization-for-RT3883.patch
  11708. new file mode 100644
  11709. index 0000000..568e60e
  11710. --- /dev/null
  11711. +++ b/package/mac80211/patches/600-0017-rt2x00-rt2800lib-add-RFCSR-initialization-for-RT3883.patch
  11712. @@ -0,0 +1,178 @@
  11713. +From 99c659cf345640fd0f733cbcaf4583cc2c868ec0 Mon Sep 17 00:00:00 2001
  11714. +From: Gabor Juhos <juhosg@openwrt.org>
  11715. +Date: Mon, 29 Apr 2013 13:21:48 +0200
  11716. +Subject: [PATCH] rt2x00: rt2800lib: add RFCSR initialization for RT3883
  11717. +
  11718. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  11719. +---
  11720. + drivers/net/wireless/rt2x00/rt2800.h | 1 +
  11721. + drivers/net/wireless/rt2x00/rt2800lib.c | 141 +++++++++++++++++++++++++++++++
  11722. + 2 files changed, 142 insertions(+)
  11723. +
  11724. +--- a/drivers/net/wireless/rt2x00/rt2800.h
  11725. ++++ b/drivers/net/wireless/rt2x00/rt2800.h
  11726. +@@ -2169,6 +2169,7 @@ struct mac_iveiv_entry {
  11727. + /*
  11728. + * RFCSR 2:
  11729. + */
  11730. ++#define RFCSR2_RESCAL_BP FIELD8(0x40)
  11731. + #define RFCSR2_RESCAL_EN FIELD8(0x80)
  11732. +
  11733. + /*
  11734. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  11735. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  11736. +@@ -6833,6 +6833,144 @@ static void rt2800_init_rfcsr_3593(struc
  11737. + /* TODO: enable stream mode support */
  11738. + }
  11739. +
  11740. ++static void rt2800_init_rfcsr_3883(struct rt2x00_dev *rt2x00dev)
  11741. ++{
  11742. ++ u8 rfcsr;
  11743. ++
  11744. ++ /* TODO: get the actual ECO value from the SoC */
  11745. ++ const unsigned int eco = 5;
  11746. ++
  11747. ++ rt2800_rf_init_calibration(rt2x00dev, 2);
  11748. ++
  11749. ++ rt2800_rfcsr_write(rt2x00dev, 0, 0xe0);
  11750. ++ rt2800_rfcsr_write(rt2x00dev, 1, 0x03);
  11751. ++ rt2800_rfcsr_write(rt2x00dev, 2, 0x50);
  11752. ++ rt2800_rfcsr_write(rt2x00dev, 3, 0x20);
  11753. ++ rt2800_rfcsr_write(rt2x00dev, 4, 0x00);
  11754. ++ rt2800_rfcsr_write(rt2x00dev, 5, 0x00);
  11755. ++ rt2800_rfcsr_write(rt2x00dev, 6, 0x40);
  11756. ++ rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
  11757. ++ rt2800_rfcsr_write(rt2x00dev, 8, 0x5b);
  11758. ++ rt2800_rfcsr_write(rt2x00dev, 9, 0x08);
  11759. ++ rt2800_rfcsr_write(rt2x00dev, 10, 0xd3);
  11760. ++ rt2800_rfcsr_write(rt2x00dev, 11, 0x48);
  11761. ++ rt2800_rfcsr_write(rt2x00dev, 12, 0x1a);
  11762. ++ rt2800_rfcsr_write(rt2x00dev, 13, 0x12);
  11763. ++ rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
  11764. ++ rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
  11765. ++ rt2800_rfcsr_write(rt2x00dev, 16, 0x00);
  11766. ++
  11767. ++ /* RFCSR 17 will be initialized later based on the
  11768. ++ * frequency offset stored in the EEPROM
  11769. ++ */
  11770. ++
  11771. ++ rt2800_rfcsr_write(rt2x00dev, 18, 0x40);
  11772. ++ rt2800_rfcsr_write(rt2x00dev, 19, 0x00);
  11773. ++ rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
  11774. ++ rt2800_rfcsr_write(rt2x00dev, 21, 0x00);
  11775. ++ rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
  11776. ++ rt2800_rfcsr_write(rt2x00dev, 23, 0xc0);
  11777. ++ rt2800_rfcsr_write(rt2x00dev, 24, 0x00);
  11778. ++ rt2800_rfcsr_write(rt2x00dev, 25, 0x00);
  11779. ++ rt2800_rfcsr_write(rt2x00dev, 26, 0x00);
  11780. ++ rt2800_rfcsr_write(rt2x00dev, 27, 0x00);
  11781. ++ rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
  11782. ++ rt2800_rfcsr_write(rt2x00dev, 29, 0x00);
  11783. ++ rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
  11784. ++ rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
  11785. ++ rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
  11786. ++ rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
  11787. ++ rt2800_rfcsr_write(rt2x00dev, 34, 0x20);
  11788. ++ rt2800_rfcsr_write(rt2x00dev, 35, 0x00);
  11789. ++ rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
  11790. ++ rt2800_rfcsr_write(rt2x00dev, 37, 0x00);
  11791. ++ rt2800_rfcsr_write(rt2x00dev, 38, 0x86);
  11792. ++ rt2800_rfcsr_write(rt2x00dev, 39, 0x23);
  11793. ++ rt2800_rfcsr_write(rt2x00dev, 40, 0x00);
  11794. ++ rt2800_rfcsr_write(rt2x00dev, 41, 0x00);
  11795. ++ rt2800_rfcsr_write(rt2x00dev, 42, 0x00);
  11796. ++ rt2800_rfcsr_write(rt2x00dev, 43, 0x00);
  11797. ++ rt2800_rfcsr_write(rt2x00dev, 44, 0x93);
  11798. ++ rt2800_rfcsr_write(rt2x00dev, 45, 0xbb);
  11799. ++ rt2800_rfcsr_write(rt2x00dev, 46, 0x60);
  11800. ++ rt2800_rfcsr_write(rt2x00dev, 47, 0x00);
  11801. ++ rt2800_rfcsr_write(rt2x00dev, 48, 0x00);
  11802. ++ rt2800_rfcsr_write(rt2x00dev, 49, 0x8e);
  11803. ++ rt2800_rfcsr_write(rt2x00dev, 50, 0x86);
  11804. ++ rt2800_rfcsr_write(rt2x00dev, 51, 0x51);
  11805. ++ rt2800_rfcsr_write(rt2x00dev, 52, 0x05);
  11806. ++ rt2800_rfcsr_write(rt2x00dev, 53, 0x76);
  11807. ++ rt2800_rfcsr_write(rt2x00dev, 54, 0x76);
  11808. ++ rt2800_rfcsr_write(rt2x00dev, 55, 0x76);
  11809. ++ rt2800_rfcsr_write(rt2x00dev, 56, 0xdb);
  11810. ++ rt2800_rfcsr_write(rt2x00dev, 57, 0x3e);
  11811. ++ rt2800_rfcsr_write(rt2x00dev, 58, 0x00);
  11812. ++ rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
  11813. ++ rt2800_rfcsr_write(rt2x00dev, 60, 0x00);
  11814. ++ rt2800_rfcsr_write(rt2x00dev, 61, 0x00);
  11815. ++ rt2800_rfcsr_write(rt2x00dev, 62, 0x00);
  11816. ++ rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
  11817. ++
  11818. ++ /* TODO: rx filter calibration? */
  11819. ++
  11820. ++ rt2800_bbp_write(rt2x00dev, 137, 0x0f);
  11821. ++
  11822. ++ rt2800_bbp_write(rt2x00dev, 163, 0x9d);
  11823. ++
  11824. ++ rt2800_bbp_write(rt2x00dev, 105, 0x05);
  11825. ++
  11826. ++ rt2800_bbp_write(rt2x00dev, 179, 0x02);
  11827. ++ rt2800_bbp_write(rt2x00dev, 180, 0x00);
  11828. ++ rt2800_bbp_write(rt2x00dev, 182, 0x40);
  11829. ++ rt2800_bbp_write(rt2x00dev, 180, 0x01);
  11830. ++ rt2800_bbp_write(rt2x00dev, 182, 0x9c);
  11831. ++
  11832. ++ rt2800_bbp_write(rt2x00dev, 179, 0x00);
  11833. ++
  11834. ++ rt2800_bbp_write(rt2x00dev, 142, 0x04);
  11835. ++ rt2800_bbp_write(rt2x00dev, 143, 0x3b);
  11836. ++ rt2800_bbp_write(rt2x00dev, 142, 0x06);
  11837. ++ rt2800_bbp_write(rt2x00dev, 143, 0xa0);
  11838. ++ rt2800_bbp_write(rt2x00dev, 142, 0x07);
  11839. ++ rt2800_bbp_write(rt2x00dev, 143, 0xa1);
  11840. ++ rt2800_bbp_write(rt2x00dev, 142, 0x08);
  11841. ++ rt2800_bbp_write(rt2x00dev, 143, 0xa2);
  11842. ++ rt2800_bbp_write(rt2x00dev, 148, 0xc8);
  11843. ++
  11844. ++ if (eco == 5) {
  11845. ++ rt2800_rfcsr_write(rt2x00dev, 32, 0xd8);
  11846. ++ rt2800_rfcsr_write(rt2x00dev, 33, 0x32);
  11847. ++ }
  11848. ++
  11849. ++ rt2800_rfcsr_read(rt2x00dev, 2, &rfcsr);
  11850. ++ rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_BP, 0);
  11851. ++ rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 1);
  11852. ++ rt2800_rfcsr_write(rt2x00dev, 2, rfcsr);
  11853. ++ msleep(1);
  11854. ++ rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 0);
  11855. ++ rt2800_rfcsr_write(rt2x00dev, 2, rfcsr);
  11856. ++
  11857. ++ rt2800_rfcsr_read(rt2x00dev, 1, &rfcsr);
  11858. ++ rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1);
  11859. ++ rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
  11860. ++
  11861. ++ rt2800_rfcsr_read(rt2x00dev, 6, &rfcsr);
  11862. ++ rfcsr |= 0xc0;
  11863. ++ rt2800_rfcsr_write(rt2x00dev, 6, rfcsr);
  11864. ++
  11865. ++ rt2800_rfcsr_read(rt2x00dev, 22, &rfcsr);
  11866. ++ rfcsr |= 0x20;
  11867. ++ rt2800_rfcsr_write(rt2x00dev, 22, rfcsr);
  11868. ++
  11869. ++ rt2800_rfcsr_read(rt2x00dev, 46, &rfcsr);
  11870. ++ rfcsr |= 0x20;
  11871. ++ rt2800_rfcsr_write(rt2x00dev, 46, rfcsr);
  11872. ++
  11873. ++ rt2800_rfcsr_read(rt2x00dev, 20, &rfcsr);
  11874. ++ rfcsr &= ~0xee;
  11875. ++ rt2800_rfcsr_write(rt2x00dev, 20, rfcsr);
  11876. ++}
  11877. ++
  11878. + static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev)
  11879. + {
  11880. + rt2800_rf_init_calibration(rt2x00dev, 2);
  11881. +@@ -7064,6 +7202,9 @@ static void rt2800_init_rfcsr(struct rt2
  11882. + case RT3390:
  11883. + rt2800_init_rfcsr_3390(rt2x00dev);
  11884. + break;
  11885. ++ case RT3883:
  11886. ++ rt2800_init_rfcsr_3883(rt2x00dev);
  11887. ++ break;
  11888. + case RT3572:
  11889. + rt2800_init_rfcsr_3572(rt2x00dev);
  11890. + break;
  11891. diff --git a/package/mac80211/patches/600-0018-rt2x00-rt2800lib-use-the-extended-EEPROM-map-for-RT3.patch b/package/mac80211/patches/600-0018-rt2x00-rt2800lib-use-the-extended-EEPROM-map-for-RT3.patch
  11892. new file mode 100644
  11893. index 0000000..57af961
  11894. --- /dev/null
  11895. +++ b/package/mac80211/patches/600-0018-rt2x00-rt2800lib-use-the-extended-EEPROM-map-for-RT3.patch
  11896. @@ -0,0 +1,22 @@
  11897. +From 86022438ffeb1b87dfcd018bf477fdbb43076691 Mon Sep 17 00:00:00 2001
  11898. +From: Gabor Juhos <juhosg@openwrt.org>
  11899. +Date: Wed, 8 May 2013 19:35:33 +0200
  11900. +Subject: [PATCH] rt2x00: rt2800lib: use the extended EEPROM map for RT3883
  11901. +
  11902. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  11903. +---
  11904. + drivers/net/wireless/rt2x00/rt2800lib.c | 3 ++-
  11905. + 1 file changed, 2 insertions(+), 1 deletion(-)
  11906. +
  11907. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  11908. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  11909. +@@ -342,7 +342,8 @@ static unsigned int rt2800_eeprom_word_i
  11910. + wiphy_name(rt2x00dev->hw->wiphy), word))
  11911. + return 0;
  11912. +
  11913. +- if (rt2x00_rt(rt2x00dev, RT3593))
  11914. ++ if (rt2x00_rt(rt2x00dev, RT3593) ||
  11915. ++ rt2x00_rt(rt2x00dev, RT3883))
  11916. + map = rt2800_eeprom_map_ext;
  11917. + else
  11918. + map = rt2800_eeprom_map;
  11919. diff --git a/package/mac80211/patches/600-0019-rt2x00-rt2800lib-force-rf-type-to-RF3853-on-RT3883.patch b/package/mac80211/patches/600-0019-rt2x00-rt2800lib-force-rf-type-to-RF3853-on-RT3883.patch
  11920. new file mode 100644
  11921. index 0000000..50fa94f
  11922. --- /dev/null
  11923. +++ b/package/mac80211/patches/600-0019-rt2x00-rt2800lib-force-rf-type-to-RF3853-on-RT3883.patch
  11924. @@ -0,0 +1,21 @@
  11925. +From 4cf5403f02fa65dc2207f61d223cffa9ae50e907 Mon Sep 17 00:00:00 2001
  11926. +From: Gabor Juhos <juhosg@openwrt.org>
  11927. +Date: Thu, 1 Aug 2013 14:48:21 +0200
  11928. +Subject: [PATCH] rt2x00: rt2800lib: force rf type to RF3853 on RT3883
  11929. +
  11930. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  11931. +---
  11932. + drivers/net/wireless/rt2x00/rt2800lib.c | 2 ++
  11933. + 1 file changed, 2 insertions(+)
  11934. +
  11935. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  11936. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  11937. +@@ -7601,6 +7601,8 @@ static int rt2800_init_eeprom(struct rt2
  11938. + rt2x00_rt(rt2x00dev, RT5390) ||
  11939. + rt2x00_rt(rt2x00dev, RT5392))
  11940. + rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
  11941. ++ else if (rt2x00_rt(rt2x00dev, RT3883))
  11942. ++ rf = RF3853;
  11943. + else
  11944. + rf = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
  11945. +
  11946. diff --git a/package/mac80211/patches/600-0020-rt2x00-rt2800lib-add-channel-configuration-code-for-.patch b/package/mac80211/patches/600-0020-rt2x00-rt2800lib-add-channel-configuration-code-for-.patch
  11947. new file mode 100644
  11948. index 0000000..e717baa
  11949. --- /dev/null
  11950. +++ b/package/mac80211/patches/600-0020-rt2x00-rt2800lib-add-channel-configuration-code-for-.patch
  11951. @@ -0,0 +1,136 @@
  11952. +From 269f19c848a2380db03a3f207cafb88e28d71c53 Mon Sep 17 00:00:00 2001
  11953. +From: Gabor Juhos <juhosg@openwrt.org>
  11954. +Date: Sun, 24 Mar 2013 19:26:28 +0100
  11955. +Subject: [PATCH] rt2x00: rt2800lib: add channel configuration code for RT3883
  11956. +
  11957. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  11958. +---
  11959. + drivers/net/wireless/rt2x00/rt2800lib.c | 72 +++++++++++++++++++++++++++++--
  11960. + 1 file changed, 69 insertions(+), 3 deletions(-)
  11961. +
  11962. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  11963. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  11964. +@@ -3429,6 +3429,36 @@ static char rt2800_txpower_to_dev(struct
  11965. + return clamp_t(char, txpower, MIN_A_TXPOWER, MAX_A_TXPOWER);
  11966. + }
  11967. +
  11968. ++static void rt3883_bbp_adjust(struct rt2x00_dev *rt2x00dev,
  11969. ++ struct rf_channel *rf)
  11970. ++{
  11971. ++ u8 bbp;
  11972. ++
  11973. ++ bbp = (rf->channel > 14) ? 0x48 : 0x38;
  11974. ++ rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, bbp);
  11975. ++
  11976. ++ rt2800_bbp_write(rt2x00dev, 69, 0x12);
  11977. ++
  11978. ++ if (rf->channel <= 14) {
  11979. ++ rt2800_bbp_write(rt2x00dev, 70, 0x0a);
  11980. ++ } else {
  11981. ++ /* Disable CCK packet detection */
  11982. ++ rt2800_bbp_write(rt2x00dev, 70, 0x00);
  11983. ++ }
  11984. ++
  11985. ++ rt2800_bbp_write(rt2x00dev, 73, 0x10);
  11986. ++
  11987. ++ if (rf->channel > 14) {
  11988. ++ rt2800_bbp_write(rt2x00dev, 62, 0x1d);
  11989. ++ rt2800_bbp_write(rt2x00dev, 63, 0x1d);
  11990. ++ rt2800_bbp_write(rt2x00dev, 64, 0x1d);
  11991. ++ } else {
  11992. ++ rt2800_bbp_write(rt2x00dev, 62, 0x2d);
  11993. ++ rt2800_bbp_write(rt2x00dev, 63, 0x2d);
  11994. ++ rt2800_bbp_write(rt2x00dev, 64, 0x2d);
  11995. ++ }
  11996. ++}
  11997. ++
  11998. + static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
  11999. + struct ieee80211_conf *conf,
  12000. + struct rf_channel *rf,
  12001. +@@ -3447,6 +3477,12 @@ static void rt2800_config_channel(struct
  12002. + rt2800_txpower_to_dev(rt2x00dev, rf->channel,
  12003. + info->default_power3);
  12004. +
  12005. ++ switch (rt2x00dev->chip.rt) {
  12006. ++ case RT3883:
  12007. ++ rt3883_bbp_adjust(rt2x00dev, rf);
  12008. ++ break;
  12009. ++ }
  12010. ++
  12011. + switch (rt2x00dev->chip.rf) {
  12012. + case RF2020:
  12013. + case RF3020:
  12014. +@@ -3528,6 +3564,15 @@ static void rt2800_config_channel(struct
  12015. + rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
  12016. + rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
  12017. + rt2800_bbp_write(rt2x00dev, 77, 0x98);
  12018. ++ } else if (rt2x00_rt(rt2x00dev, RT3883)) {
  12019. ++ rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
  12020. ++ rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
  12021. ++ rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
  12022. ++
  12023. ++ if (rt2x00dev->default_ant.rx_chain_num > 1)
  12024. ++ rt2800_bbp_write(rt2x00dev, 86, 0x46);
  12025. ++ else
  12026. ++ rt2800_bbp_write(rt2x00dev, 86, 0);
  12027. + } else {
  12028. + rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
  12029. + rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
  12030. +@@ -3540,6 +3585,7 @@ static void rt2800_config_channel(struct
  12031. + !rt2x00_rt(rt2x00dev, RT5392)) {
  12032. + if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
  12033. + rt2800_bbp_write(rt2x00dev, 82, 0x62);
  12034. ++ rt2800_bbp_write(rt2x00dev, 82, 0x62);
  12035. + rt2800_bbp_write(rt2x00dev, 75, 0x46);
  12036. + } else {
  12037. + if (rt2x00_rt(rt2x00dev, RT3593))
  12038. +@@ -3548,19 +3594,22 @@ static void rt2800_config_channel(struct
  12039. + rt2800_bbp_write(rt2x00dev, 82, 0x84);
  12040. + rt2800_bbp_write(rt2x00dev, 75, 0x50);
  12041. + }
  12042. +- if (rt2x00_rt(rt2x00dev, RT3593))
  12043. ++ if (rt2x00_rt(rt2x00dev, RT3593) ||
  12044. ++ rt2x00_rt(rt2x00dev, RT3883))
  12045. + rt2800_bbp_write(rt2x00dev, 83, 0x8a);
  12046. + }
  12047. +
  12048. + } else {
  12049. + if (rt2x00_rt(rt2x00dev, RT3572))
  12050. + rt2800_bbp_write(rt2x00dev, 82, 0x94);
  12051. +- else if (rt2x00_rt(rt2x00dev, RT3593))
  12052. ++ else if (rt2x00_rt(rt2x00dev, RT3593) ||
  12053. ++ rt2x00_rt(rt2x00dev, RT3883))
  12054. + rt2800_bbp_write(rt2x00dev, 82, 0x82);
  12055. + else
  12056. + rt2800_bbp_write(rt2x00dev, 82, 0xf2);
  12057. +
  12058. +- if (rt2x00_rt(rt2x00dev, RT3593))
  12059. ++ if (rt2x00_rt(rt2x00dev, RT3593) ||
  12060. ++ rt2x00_rt(rt2x00dev, RT3883))
  12061. + rt2800_bbp_write(rt2x00dev, 83, 0x9a);
  12062. +
  12063. + if (rt2x00_has_cap_external_lna_a(rt2x00dev))
  12064. +@@ -3685,6 +3734,23 @@ static void rt2800_config_channel(struct
  12065. + usleep_range(1000, 1500);
  12066. + }
  12067. +
  12068. ++ if (rt2x00_rt(rt2x00dev, RT3883)) {
  12069. ++ if (!conf_is_ht40(conf))
  12070. ++ rt2800_bbp_write(rt2x00dev, 105, 0x34);
  12071. ++ else
  12072. ++ rt2800_bbp_write(rt2x00dev, 105, 0x04);
  12073. ++
  12074. ++ /* AGC init */
  12075. ++ if (rf->channel <= 14)
  12076. ++ reg = 0x2e + rt2x00dev->lna_gain;
  12077. ++ else
  12078. ++ reg = 0x20 + ((rt2x00dev->lna_gain * 5) / 3);
  12079. ++
  12080. ++ rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
  12081. ++
  12082. ++ usleep_range(1000, 1500);
  12083. ++ }
  12084. ++
  12085. + if (rt2x00_rt(rt2x00dev, RT5592)) {
  12086. + rt2800_bbp_write(rt2x00dev, 195, 141);
  12087. + rt2800_bbp_write(rt2x00dev, 196, conf_is_ht40(conf) ? 0x10 : 0x1a);
  12088. diff --git a/package/mac80211/patches/600-0021-rt2x00-rt2800lib-fix-txpower_to_dev-function-for-RT3.patch b/package/mac80211/patches/600-0021-rt2x00-rt2800lib-fix-txpower_to_dev-function-for-RT3.patch
  12089. new file mode 100644
  12090. index 0000000..1773128
  12091. --- /dev/null
  12092. +++ b/package/mac80211/patches/600-0021-rt2x00-rt2800lib-fix-txpower_to_dev-function-for-RT3.patch
  12093. @@ -0,0 +1,30 @@
  12094. +From e37d93abaabe3ab72b0332a18092acc162307274 Mon Sep 17 00:00:00 2001
  12095. +From: Gabor Juhos <juhosg@openwrt.org>
  12096. +Date: Mon, 30 Sep 2013 13:57:26 +0200
  12097. +Subject: [PATCH] rt2x00: rt2800lib: fix txpower_to_dev function for RT3883
  12098. +
  12099. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  12100. +---
  12101. + drivers/net/wireless/rt2x00/rt2800lib.c | 6 ++++--
  12102. + 1 file changed, 4 insertions(+), 2 deletions(-)
  12103. +
  12104. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  12105. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  12106. +@@ -3416,13 +3416,15 @@ static char rt2800_txpower_to_dev(struct
  12107. + unsigned int channel,
  12108. + char txpower)
  12109. + {
  12110. +- if (rt2x00_rt(rt2x00dev, RT3593))
  12111. ++ if (rt2x00_rt(rt2x00dev, RT3593) ||
  12112. ++ rt2x00_rt(rt2x00dev, RT3883))
  12113. + txpower = rt2x00_get_field8(txpower, EEPROM_TXPOWER_ALC);
  12114. +
  12115. + if (channel <= 14)
  12116. + return clamp_t(char, txpower, MIN_G_TXPOWER, MAX_G_TXPOWER);
  12117. +
  12118. +- if (rt2x00_rt(rt2x00dev, RT3593))
  12119. ++ if (rt2x00_rt(rt2x00dev, RT3593) ||
  12120. ++ rt2x00_rt(rt2x00dev, RT3883))
  12121. + return clamp_t(char, txpower, MIN_A_TXPOWER_3593,
  12122. + MAX_A_TXPOWER_3593);
  12123. + else
  12124. diff --git a/package/mac80211/patches/600-0022-rt2x00-rt2800lib-use-correct-txpower-calculation-fun.patch b/package/mac80211/patches/600-0022-rt2x00-rt2800lib-use-correct-txpower-calculation-fun.patch
  12125. new file mode 100644
  12126. index 0000000..4956373
  12127. --- /dev/null
  12128. +++ b/package/mac80211/patches/600-0022-rt2x00-rt2800lib-use-correct-txpower-calculation-fun.patch
  12129. @@ -0,0 +1,23 @@
  12130. +From c4d79e344bd580d85821390d49f92dced7d8e125 Mon Sep 17 00:00:00 2001
  12131. +From: Gabor Juhos <juhosg@openwrt.org>
  12132. +Date: Sun, 24 Mar 2013 19:26:29 +0100
  12133. +Subject: [PATCH] rt2x00: rt2800lib: use correct txpower calculation function
  12134. + for RT3883
  12135. +
  12136. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  12137. +---
  12138. + drivers/net/wireless/rt2x00/rt2800lib.c | 3 ++-
  12139. + 1 file changed, 2 insertions(+), 1 deletion(-)
  12140. +
  12141. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  12142. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  12143. +@@ -4626,7 +4626,8 @@ static void rt2800_config_txpower(struct
  12144. + struct ieee80211_channel *chan,
  12145. + int power_level)
  12146. + {
  12147. +- if (rt2x00_rt(rt2x00dev, RT3593))
  12148. ++ if (rt2x00_rt(rt2x00dev, RT3593) ||
  12149. ++ rt2x00_rt(rt2x00dev, RT3883))
  12150. + rt2800_config_txpower_rt3593(rt2x00dev, chan, power_level);
  12151. + else
  12152. + rt2800_config_txpower_rt28xx(rt2x00dev, chan, power_level);
  12153. diff --git a/package/mac80211/patches/600-0023-rt2x00-rt2800lib-hardcode-txmixer-gain-values-to-zer.patch b/package/mac80211/patches/600-0023-rt2x00-rt2800lib-hardcode-txmixer-gain-values-to-zer.patch
  12154. new file mode 100644
  12155. index 0000000..a692fd8
  12156. --- /dev/null
  12157. +++ b/package/mac80211/patches/600-0023-rt2x00-rt2800lib-hardcode-txmixer-gain-values-to-zer.patch
  12158. @@ -0,0 +1,33 @@
  12159. +From caea0671cd8fd9ade4f5969cbe0ee545e94ae105 Mon Sep 17 00:00:00 2001
  12160. +From: Gabor Juhos <juhosg@openwrt.org>
  12161. +Date: Sat, 24 Aug 2013 11:49:55 +0200
  12162. +Subject: [PATCH] rt2x00: rt2800lib: hardcode txmixer gain values to zero for
  12163. + RT3883
  12164. +
  12165. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  12166. +---
  12167. + drivers/net/wireless/rt2x00/rt2800lib.c | 6 ++++--
  12168. + 1 file changed, 4 insertions(+), 2 deletions(-)
  12169. +
  12170. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  12171. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  12172. +@@ -7483,7 +7483,8 @@ static u8 rt2800_get_txmixer_gain_24g(st
  12173. + {
  12174. + u16 word;
  12175. +
  12176. +- if (rt2x00_rt(rt2x00dev, RT3593))
  12177. ++ if (rt2x00_rt(rt2x00dev, RT3593) ||
  12178. ++ rt2x00_rt(rt2x00dev, RT3883))
  12179. + return 0;
  12180. +
  12181. + rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_BG, &word);
  12182. +@@ -7497,7 +7498,8 @@ static u8 rt2800_get_txmixer_gain_5g(str
  12183. + {
  12184. + u16 word;
  12185. +
  12186. +- if (rt2x00_rt(rt2x00dev, RT3593))
  12187. ++ if (rt2x00_rt(rt2x00dev, RT3593) ||
  12188. ++ rt2x00_rt(rt2x00dev, RT3883))
  12189. + return 0;
  12190. +
  12191. + rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_A, &word);
  12192. diff --git a/package/mac80211/patches/600-0024-rt2x00-rt2800lib-use-correct-RT-XWI-size-for-RT3883.patch b/package/mac80211/patches/600-0024-rt2x00-rt2800lib-use-correct-RT-XWI-size-for-RT3883.patch
  12193. new file mode 100644
  12194. index 0000000..53435aa
  12195. --- /dev/null
  12196. +++ b/package/mac80211/patches/600-0024-rt2x00-rt2800lib-use-correct-RT-XWI-size-for-RT3883.patch
  12197. @@ -0,0 +1,20 @@
  12198. +From 11c40fb47c4a4dd6ad060c2ae127ced89ffb9fe1 Mon Sep 17 00:00:00 2001
  12199. +From: Gabor Juhos <juhosg@openwrt.org>
  12200. +Date: Thu, 18 Apr 2013 14:33:33 +0200
  12201. +Subject: [PATCH] rt2x00: rt2800lib: use correct [RT]XWI size for RT3883
  12202. +
  12203. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  12204. +---
  12205. + drivers/net/wireless/rt2x00/rt2800lib.c | 1 +
  12206. + 1 file changed, 1 insertion(+)
  12207. +
  12208. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  12209. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  12210. +@@ -558,6 +558,7 @@ void rt2800_get_txwi_rxwi_size(struct rt
  12211. + {
  12212. + switch (rt2x00dev->chip.rt) {
  12213. + case RT3593:
  12214. ++ case RT3883:
  12215. + *txwi_size = TXWI_DESC_SIZE_4WORDS;
  12216. + *rxwi_size = RXWI_DESC_SIZE_5WORDS;
  12217. + break;
  12218. diff --git a/package/mac80211/patches/600-0025-rt2x00-rt2800lib-use-correct-beacon-base-for-RT3883.patch b/package/mac80211/patches/600-0025-rt2x00-rt2800lib-use-correct-beacon-base-for-RT3883.patch
  12219. new file mode 100644
  12220. index 0000000..08f3f88
  12221. --- /dev/null
  12222. +++ b/package/mac80211/patches/600-0025-rt2x00-rt2800lib-use-correct-beacon-base-for-RT3883.patch
  12223. @@ -0,0 +1,22 @@
  12224. +From b403bdfa00665ce6b53583bdb837ffad0b91c09f Mon Sep 17 00:00:00 2001
  12225. +From: Gabor Juhos <juhosg@openwrt.org>
  12226. +Date: Sun, 24 Mar 2013 19:26:29 +0100
  12227. +Subject: [PATCH] rt2x00: rt2800lib: use correct beacon base for RT3883
  12228. +
  12229. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  12230. +---
  12231. + drivers/net/wireless/rt2x00/rt2800lib.c | 3 ++-
  12232. + 1 file changed, 2 insertions(+), 1 deletion(-)
  12233. +
  12234. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  12235. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  12236. +@@ -983,7 +983,8 @@ EXPORT_SYMBOL_GPL(rt2800_txdone_entry);
  12237. + static unsigned int rt2800_hw_beacon_base(struct rt2x00_dev *rt2x00dev,
  12238. + unsigned int index)
  12239. + {
  12240. +- if (rt2x00_rt(rt2x00dev, RT3593))
  12241. ++ if (rt2x00_rt(rt2x00dev, RT3593) ||
  12242. ++ rt2x00_rt(rt2x00dev, RT3883))
  12243. + return HW_BEACON_BASE_HIGH(index);
  12244. +
  12245. + return HW_BEACON_BASE(index);
  12246. diff --git a/package/mac80211/patches/600-0026-rt2x00-rt2800lib-use-correct-beacon-count-for-RT3883.patch b/package/mac80211/patches/600-0026-rt2x00-rt2800lib-use-correct-beacon-count-for-RT3883.patch
  12247. new file mode 100644
  12248. index 0000000..f8fe496
  12249. --- /dev/null
  12250. +++ b/package/mac80211/patches/600-0026-rt2x00-rt2800lib-use-correct-beacon-count-for-RT3883.patch
  12251. @@ -0,0 +1,22 @@
  12252. +From 74b7eaf75fc6eb86292056ef705e543f9cd6086b Mon Sep 17 00:00:00 2001
  12253. +From: Gabor Juhos <juhosg@openwrt.org>
  12254. +Date: Sun, 18 Aug 2013 09:57:58 +0200
  12255. +Subject: [PATCH] rt2x00: rt2800lib: use correct beacon count for RT3883
  12256. +
  12257. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  12258. +---
  12259. + drivers/net/wireless/rt2x00/rt2800lib.c | 3 ++-
  12260. + 1 file changed, 2 insertions(+), 1 deletion(-)
  12261. +
  12262. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  12263. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  12264. +@@ -8415,7 +8415,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r
  12265. + if (rt2x00_rt(rt2x00dev, RT3593))
  12266. + __set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags);
  12267. +
  12268. +- if (rt2x00_rt(rt2x00dev, RT3593))
  12269. ++ if (rt2x00_rt(rt2x00dev, RT3593) ||
  12270. ++ rt2x00_rt(rt2x00dev, RT3883))
  12271. + drv_data->hw_beacon_count = 16;
  12272. + else
  12273. + drv_data->hw_beacon_count = 8;
  12274. diff --git a/package/mac80211/patches/600-0027-rt2x00-rt2800lib-fix-antenna-configuration-for-RT388.patch b/package/mac80211/patches/600-0027-rt2x00-rt2800lib-fix-antenna-configuration-for-RT388.patch
  12275. new file mode 100644
  12276. index 0000000..22f7110
  12277. --- /dev/null
  12278. +++ b/package/mac80211/patches/600-0027-rt2x00-rt2800lib-fix-antenna-configuration-for-RT388.patch
  12279. @@ -0,0 +1,22 @@
  12280. +From fa5ad9c025610c22048add2f0ad03f62b6ca1e74 Mon Sep 17 00:00:00 2001
  12281. +From: Gabor Juhos <juhosg@openwrt.org>
  12282. +Date: Mon, 30 Sep 2013 16:53:33 +0200
  12283. +Subject: [PATCH] rt2x00: rt2800lib: fix antenna configuration for RT3883
  12284. +
  12285. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  12286. +---
  12287. + drivers/net/wireless/rt2x00/rt2800lib.c | 3 ++-
  12288. + 1 file changed, 2 insertions(+), 1 deletion(-)
  12289. +
  12290. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  12291. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  12292. +@@ -1961,7 +1961,8 @@ void rt2800_config_ant(struct rt2x00_dev
  12293. + rt2800_bbp_write(rt2x00dev, 3, r3);
  12294. + rt2800_bbp_write(rt2x00dev, 1, r1);
  12295. +
  12296. +- if (rt2x00_rt(rt2x00dev, RT3593)) {
  12297. ++ if (rt2x00_rt(rt2x00dev, RT3593) ||
  12298. ++ rt2x00_rt(rt2x00dev, RT3883)) {
  12299. + if (ant->rx_chain_num == 1)
  12300. + rt2800_bbp_write(rt2x00dev, 86, 0x00);
  12301. + else
  12302. diff --git a/package/mac80211/patches/600-0028-rt2x00-rt2800lib-fix-LNA-gain-configuration-for-RT38.patch b/package/mac80211/patches/600-0028-rt2x00-rt2800lib-fix-LNA-gain-configuration-for-RT38.patch
  12303. new file mode 100644
  12304. index 0000000..9945f38
  12305. --- /dev/null
  12306. +++ b/package/mac80211/patches/600-0028-rt2x00-rt2800lib-fix-LNA-gain-configuration-for-RT38.patch
  12307. @@ -0,0 +1,32 @@
  12308. +From 6d668fef3a1baa60bdd715ee062ddb6333d2647c Mon Sep 17 00:00:00 2001
  12309. +From: Gabor Juhos <juhosg@openwrt.org>
  12310. +Date: Mon, 30 Sep 2013 16:58:23 +0200
  12311. +Subject: [PATCH] rt2x00: rt2800lib: fix LNA gain configuration for RT3883
  12312. +
  12313. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  12314. +---
  12315. + drivers/net/wireless/rt2x00/rt2800lib.c | 6 ++++--
  12316. + 1 file changed, 4 insertions(+), 2 deletions(-)
  12317. +
  12318. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  12319. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  12320. +@@ -1984,7 +1984,8 @@ static void rt2800_config_lna_gain(struc
  12321. + rt2800_eeprom_read(rt2x00dev, EEPROM_LNA, &eeprom);
  12322. + lna_gain = rt2x00_get_field16(eeprom, EEPROM_LNA_A0);
  12323. + } else if (libconf->rf.channel <= 128) {
  12324. +- if (rt2x00_rt(rt2x00dev, RT3593)) {
  12325. ++ if (rt2x00_rt(rt2x00dev, RT3593) ||
  12326. ++ rt2x00_rt(rt2x00dev, RT3883)) {
  12327. + rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2, &eeprom);
  12328. + lna_gain = rt2x00_get_field16(eeprom,
  12329. + EEPROM_EXT_LNA2_A1);
  12330. +@@ -1994,7 +1995,8 @@ static void rt2800_config_lna_gain(struc
  12331. + EEPROM_RSSI_BG2_LNA_A1);
  12332. + }
  12333. + } else {
  12334. +- if (rt2x00_rt(rt2x00dev, RT3593)) {
  12335. ++ if (rt2x00_rt(rt2x00dev, RT3593) ||
  12336. ++ rt2x00_rt(rt2x00dev, RT3883)) {
  12337. + rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2, &eeprom);
  12338. + lna_gain = rt2x00_get_field16(eeprom,
  12339. + EEPROM_EXT_LNA2_A2);
  12340. diff --git a/package/mac80211/patches/600-0029-rt2x00-rt2800lib-fix-VGC-setup-for-RT3883.patch b/package/mac80211/patches/600-0029-rt2x00-rt2800lib-fix-VGC-setup-for-RT3883.patch
  12341. new file mode 100644
  12342. index 0000000..80b3668
  12343. --- /dev/null
  12344. +++ b/package/mac80211/patches/600-0029-rt2x00-rt2800lib-fix-VGC-setup-for-RT3883.patch
  12345. @@ -0,0 +1,44 @@
  12346. +From c49b2d829aa1c816a46a577cdec6d2ff14d9f06e Mon Sep 17 00:00:00 2001
  12347. +From: Gabor Juhos <juhosg@openwrt.org>
  12348. +Date: Tue, 1 Oct 2013 15:40:08 +0200
  12349. +Subject: [PATCH] rt2x00: rt2800lib: fix VGC setup for RT3883
  12350. +
  12351. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  12352. +---
  12353. + drivers/net/wireless/rt2x00/rt2800lib.c | 11 +++++++++--
  12354. + 1 file changed, 9 insertions(+), 2 deletions(-)
  12355. +
  12356. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  12357. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  12358. +@@ -4825,7 +4825,8 @@ static u8 rt2800_get_default_vgc(struct
  12359. + else
  12360. + vgc = 0x2e + rt2x00dev->lna_gain;
  12361. + } else { /* 5GHZ band */
  12362. +- if (rt2x00_rt(rt2x00dev, RT3593))
  12363. ++ if (rt2x00_rt(rt2x00dev, RT3593) ||
  12364. ++ rt2x00_rt(rt2x00dev, RT3883))
  12365. + vgc = 0x20 + (rt2x00dev->lna_gain * 5) / 3;
  12366. + else if (rt2x00_rt(rt2x00dev, RT5592))
  12367. + vgc = 0x24 + (2 * rt2x00dev->lna_gain);
  12368. +@@ -4845,7 +4846,8 @@ static inline void rt2800_set_vgc(struct
  12369. + {
  12370. + if (qual->vgc_level != vgc_level) {
  12371. + if (rt2x00_rt(rt2x00dev, RT3572) ||
  12372. +- rt2x00_rt(rt2x00dev, RT3593)) {
  12373. ++ rt2x00_rt(rt2x00dev, RT3593) ||
  12374. ++ rt2x00_rt(rt2x00dev, RT3883)) {
  12375. + rt2800_bbp_write_with_rx_chain(rt2x00dev, 66,
  12376. + vgc_level);
  12377. + } else if (rt2x00_rt(rt2x00dev, RT5592)) {
  12378. +@@ -4892,6 +4894,11 @@ void rt2800_link_tuner(struct rt2x00_dev
  12379. + }
  12380. + break;
  12381. +
  12382. ++ case RT3883:
  12383. ++ if (qual->rssi > -65)
  12384. ++ vgc += 0x10;
  12385. ++ break;
  12386. ++
  12387. + case RT5592:
  12388. + if (qual->rssi > -65)
  12389. + vgc += 0x20;
  12390. diff --git a/package/mac80211/patches/600-0030-rt2x00-rt2800lib-fix-EEPROM-LNA-validation-for-RT388.patch b/package/mac80211/patches/600-0030-rt2x00-rt2800lib-fix-EEPROM-LNA-validation-for-RT388.patch
  12391. new file mode 100644
  12392. index 0000000..424acff
  12393. --- /dev/null
  12394. +++ b/package/mac80211/patches/600-0030-rt2x00-rt2800lib-fix-EEPROM-LNA-validation-for-RT388.patch
  12395. @@ -0,0 +1,42 @@
  12396. +From 1616650aea676541d4dc8adc6f4219856d193c8b Mon Sep 17 00:00:00 2001
  12397. +From: Gabor Juhos <juhosg@openwrt.org>
  12398. +Date: Tue, 1 Oct 2013 17:27:57 +0200
  12399. +Subject: [PATCH] rt2x00: rt2800lib: fix EEPROM LNA validation for RT3883
  12400. +
  12401. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  12402. +---
  12403. + drivers/net/wireless/rt2x00/rt2800lib.c | 9 ++++++---
  12404. + 1 file changed, 6 insertions(+), 3 deletions(-)
  12405. +
  12406. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  12407. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  12408. +@@ -7620,7 +7620,8 @@ static int rt2800_validate_eeprom(struct
  12409. + rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, &word);
  12410. + if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG2_OFFSET2)) > 10)
  12411. + rt2x00_set_field16(&word, EEPROM_RSSI_BG2_OFFSET2, 0);
  12412. +- if (!rt2x00_rt(rt2x00dev, RT3593)) {
  12413. ++ if (!rt2x00_rt(rt2x00dev, RT3593) &&
  12414. ++ !rt2x00_rt(rt2x00dev, RT3883)) {
  12415. + if (rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0x00 ||
  12416. + rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0xff)
  12417. + rt2x00_set_field16(&word, EEPROM_RSSI_BG2_LNA_A1,
  12418. +@@ -7640,7 +7641,8 @@ static int rt2800_validate_eeprom(struct
  12419. + rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2, &word);
  12420. + if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A2_OFFSET2)) > 10)
  12421. + rt2x00_set_field16(&word, EEPROM_RSSI_A2_OFFSET2, 0);
  12422. +- if (!rt2x00_rt(rt2x00dev, RT3593)) {
  12423. ++ if (!rt2x00_rt(rt2x00dev, RT3593) &&
  12424. ++ !rt2x00_rt(rt2x00dev, RT3883)) {
  12425. + if (rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0x00 ||
  12426. + rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0xff)
  12427. + rt2x00_set_field16(&word, EEPROM_RSSI_A2_LNA_A2,
  12428. +@@ -7648,7 +7650,8 @@ static int rt2800_validate_eeprom(struct
  12429. + }
  12430. + rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_A2, word);
  12431. +
  12432. +- if (rt2x00_rt(rt2x00dev, RT3593)) {
  12433. ++ if (rt2x00_rt(rt2x00dev, RT3593) ||
  12434. ++ rt2x00_rt(rt2x00dev, RT3883)) {
  12435. + rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2, &word);
  12436. + if (rt2x00_get_field16(word, EEPROM_EXT_LNA2_A1) == 0x00 ||
  12437. + rt2x00_get_field16(word, EEPROM_EXT_LNA2_A1) == 0xff)
  12438. diff --git a/package/mac80211/patches/600-0031-rt2x00-rt2800lib-fix-txpower-compensation-for-RT3883.patch b/package/mac80211/patches/600-0031-rt2x00-rt2800lib-fix-txpower-compensation-for-RT3883.patch
  12439. new file mode 100644
  12440. index 0000000..00be526
  12441. --- /dev/null
  12442. +++ b/package/mac80211/patches/600-0031-rt2x00-rt2800lib-fix-txpower-compensation-for-RT3883.patch
  12443. @@ -0,0 +1,22 @@
  12444. +From e3871034a0e7c8a95152dc3eafbcc4535398cbdc Mon Sep 17 00:00:00 2001
  12445. +From: Gabor Juhos <juhosg@openwrt.org>
  12446. +Date: Wed, 2 Oct 2013 10:11:59 +0200
  12447. +Subject: [PATCH] rt2x00: rt2800lib: fix txpower compensation for RT3883
  12448. +
  12449. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  12450. +---
  12451. + drivers/net/wireless/rt2x00/rt2800lib.c | 3 +++
  12452. + 1 file changed, 3 insertions(+)
  12453. +
  12454. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  12455. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  12456. +@@ -4003,6 +4003,9 @@ static u8 rt2800_compensate_txpower(stru
  12457. + if (rt2x00_rt(rt2x00dev, RT3593))
  12458. + return min_t(u8, txpower, 0xc);
  12459. +
  12460. ++ if (rt2x00_rt(rt2x00dev, RT3883))
  12461. ++ return min_t(u8, txpower, 0xf);
  12462. ++
  12463. + if (rt2x00_has_cap_power_limit(rt2x00dev)) {
  12464. + /*
  12465. + * Check if eirp txpower exceed txpower_limit.
  12466. diff --git a/package/mac80211/patches/600-0032-rt2x00-rt2800lib-enable-RT2800_HAS_HIGH_SHARED_MEM-f.patch b/package/mac80211/patches/600-0032-rt2x00-rt2800lib-enable-RT2800_HAS_HIGH_SHARED_MEM-f.patch
  12467. new file mode 100644
  12468. index 0000000..7c4c1ab
  12469. --- /dev/null
  12470. +++ b/package/mac80211/patches/600-0032-rt2x00-rt2800lib-enable-RT2800_HAS_HIGH_SHARED_MEM-f.patch
  12471. @@ -0,0 +1,23 @@
  12472. +From f6734ec72da936989a8ce4186b3ede28fbc47836 Mon Sep 17 00:00:00 2001
  12473. +From: Gabor Juhos <juhosg@openwrt.org>
  12474. +Date: Sun, 18 Aug 2013 21:57:34 +0200
  12475. +Subject: [PATCH] rt2x00: rt2800lib: enable RT2800_HAS_HIGH_SHARED_MEM for
  12476. + RT3883
  12477. +
  12478. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  12479. +---
  12480. + drivers/net/wireless/rt2x00/rt2800lib.c | 3 ++-
  12481. + 1 file changed, 2 insertions(+), 1 deletion(-)
  12482. +
  12483. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  12484. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  12485. +@@ -8428,7 +8428,8 @@ int rt2800_probe_hw(struct rt2x00_dev *r
  12486. + if (retval)
  12487. + return retval;
  12488. +
  12489. +- if (rt2x00_rt(rt2x00dev, RT3593))
  12490. ++ if (rt2x00_rt(rt2x00dev, RT3593) ||
  12491. ++ rt2x00_rt(rt2x00dev, RT3883))
  12492. + __set_bit(RT2800_HAS_HIGH_SHARED_MEM, &drv_data->rt2800_flags);
  12493. +
  12494. + if (rt2x00_rt(rt2x00dev, RT3593) ||
  12495. diff --git a/package/mac80211/patches/600-0033-rt2x00-rt2800lib-use-high-memory-for-beacons-on-RT38.patch b/package/mac80211/patches/600-0033-rt2x00-rt2800lib-use-high-memory-for-beacons-on-RT38.patch
  12496. new file mode 100644
  12497. index 0000000..dc06e6a
  12498. --- /dev/null
  12499. +++ b/package/mac80211/patches/600-0033-rt2x00-rt2800lib-use-high-memory-for-beacons-on-RT38.patch
  12500. @@ -0,0 +1,22 @@
  12501. +From f1acfc2f397e86548ae1b479c198d4bef57050f6 Mon Sep 17 00:00:00 2001
  12502. +From: Gabor Juhos <juhosg@openwrt.org>
  12503. +Date: Sun, 29 Sep 2013 18:10:34 +0200
  12504. +Subject: [PATCH] rt2x00: rt2800lib: use high memory for beacons on RT3883
  12505. +
  12506. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  12507. +---
  12508. + drivers/net/wireless/rt2x00/rt2800lib.c | 3 ++-
  12509. + 1 file changed, 2 insertions(+), 1 deletion(-)
  12510. +
  12511. +--- a/drivers/net/wireless/rt2x00/rt2800lib.c
  12512. ++++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  12513. +@@ -97,7 +97,8 @@ static inline void rt2800_shared_mem_sel
  12514. +
  12515. + static inline bool rt2800_beacon_uses_high_mem(struct rt2x00_dev *rt2x00dev)
  12516. + {
  12517. +- if (rt2x00_rt(rt2x00dev, RT3593))
  12518. ++ if (rt2x00_rt(rt2x00dev, RT3593) ||
  12519. ++ rt2x00_rt(rt2x00dev, RT3883))
  12520. + return true;
  12521. +
  12522. + return false;
  12523. diff --git a/package/mac80211/patches/600-0034-rt2x00-rt2800mmio-add-a-workaround-for-spurious-TX_F.patch b/package/mac80211/patches/600-0034-rt2x00-rt2800mmio-add-a-workaround-for-spurious-TX_F.patch
  12524. new file mode 100644
  12525. index 0000000..79334dd
  12526. --- /dev/null
  12527. +++ b/package/mac80211/patches/600-0034-rt2x00-rt2800mmio-add-a-workaround-for-spurious-TX_F.patch
  12528. @@ -0,0 +1,136 @@
  12529. +From 5e67d4f8a46d19748b501c2ef86de3f50d3cfd51 Mon Sep 17 00:00:00 2001
  12530. +From: Gabor Juhos <juhosg@openwrt.org>
  12531. +Date: Sun, 24 Mar 2013 19:26:27 +0100
  12532. +Subject: [PATCH] rt2x00: rt2800mmio: add a workaround for spurious
  12533. + TX_FIFO_STATUS interrupts
  12534. +
  12535. +Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  12536. +---
  12537. + drivers/net/wireless/rt2x00/rt2800mmio.c | 72 +++++++++++++++++++++++++-----
  12538. + drivers/net/wireless/rt2x00/rt2x00.h | 5 +++
  12539. + 2 files changed, 65 insertions(+), 12 deletions(-)
  12540. +
  12541. +--- a/drivers/net/wireless/rt2x00/rt2800mmio.c
  12542. ++++ b/drivers/net/wireless/rt2x00/rt2800mmio.c
  12543. +@@ -415,9 +415,9 @@ void rt2800mmio_autowake_tasklet(unsigne
  12544. + }
  12545. + EXPORT_SYMBOL_GPL(rt2800mmio_autowake_tasklet);
  12546. +
  12547. +-static void rt2800mmio_txstatus_interrupt(struct rt2x00_dev *rt2x00dev)
  12548. ++static void rt2800mmio_txstatus_interrupt(struct rt2x00_dev *rt2x00dev,
  12549. ++ u32 status)
  12550. + {
  12551. +- u32 status;
  12552. + int i;
  12553. +
  12554. + /*
  12555. +@@ -438,29 +438,77 @@ static void rt2800mmio_txstatus_interrup
  12556. + * Since we have only one producer and one consumer we don't
  12557. + * need to lock the kfifo.
  12558. + */
  12559. +- for (i = 0; i < rt2x00dev->tx->limit; i++) {
  12560. +- rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO, &status);
  12561. +-
  12562. +- if (!rt2x00_get_field32(status, TX_STA_FIFO_VALID))
  12563. +- break;
  12564. +-
  12565. ++ i = 0;
  12566. ++ do {
  12567. + if (!kfifo_put(&rt2x00dev->txstatus_fifo, status)) {
  12568. +- rt2x00_warn(rt2x00dev, "TX status FIFO overrun, drop tx status report\n");
  12569. ++ rt2x00_warn(rt2x00dev,
  12570. ++ "TX status FIFO overrun, drop TX status report\n");
  12571. + break;
  12572. + }
  12573. +- }
  12574. ++
  12575. ++ if (++i >= rt2x00dev->tx->limit)
  12576. ++ break;
  12577. ++
  12578. ++ rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO, &status);
  12579. ++ } while (rt2x00_get_field32(status, TX_STA_FIFO_VALID));
  12580. +
  12581. + /* Schedule the tasklet for processing the tx status. */
  12582. + tasklet_schedule(&rt2x00dev->txstatus_tasklet);
  12583. + }
  12584. +
  12585. ++#define RT2800MMIO_TXSTATUS_IRQ_MAX_RETRIES 4
  12586. ++
  12587. ++static bool rt2800mmio_txstatus_is_spurious(struct rt2x00_dev *rt2x00dev,
  12588. ++ u32 txstatus)
  12589. ++{
  12590. ++ if (likely(rt2x00_get_field32(txstatus, TX_STA_FIFO_VALID))) {
  12591. ++ rt2x00dev->txstatus_irq_retries = 0;
  12592. ++ return false;
  12593. ++ }
  12594. ++
  12595. ++ rt2x00dev->txstatus_irq_retries++;
  12596. ++
  12597. ++ /* Ensure that we don't go into an infinite IRQ loop. */
  12598. ++ if (rt2x00dev->txstatus_irq_retries >=
  12599. ++ RT2800MMIO_TXSTATUS_IRQ_MAX_RETRIES) {
  12600. ++ rt2x00_warn(rt2x00dev,
  12601. ++ "%u spurious TX_FIFO_STATUS interrupt(s)\n",
  12602. ++ rt2x00dev->txstatus_irq_retries);
  12603. ++ rt2x00dev->txstatus_irq_retries = 0;
  12604. ++ return false;
  12605. ++ }
  12606. ++
  12607. ++ return true;
  12608. ++}
  12609. ++
  12610. + irqreturn_t rt2800mmio_interrupt(int irq, void *dev_instance)
  12611. + {
  12612. + struct rt2x00_dev *rt2x00dev = dev_instance;
  12613. + u32 reg, mask;
  12614. ++ u32 txstatus = 0;
  12615. +
  12616. +- /* Read status and ACK all interrupts */
  12617. ++ /* Read status */
  12618. + rt2x00mmio_register_read(rt2x00dev, INT_SOURCE_CSR, &reg);
  12619. ++
  12620. ++ if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS)) {
  12621. ++ /* Due to unknown reason the hardware generates a
  12622. ++ * TX_FIFO_STATUS interrupt before the TX_STA_FIFO
  12623. ++ * register contain valid data. Read the TX status
  12624. ++ * here to see if we have to process the actual
  12625. ++ * request.
  12626. ++ */
  12627. ++ rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO, &txstatus);
  12628. ++ if (rt2800mmio_txstatus_is_spurious(rt2x00dev, txstatus)) {
  12629. ++ /* Remove the TX_FIFO_STATUS bit so it won't be
  12630. ++ * processed in this turn. The hardware will
  12631. ++ * generate another IRQ for us.
  12632. ++ */
  12633. ++ rt2x00_set_field32(&reg,
  12634. ++ INT_SOURCE_CSR_TX_FIFO_STATUS, 0);
  12635. ++ }
  12636. ++ }
  12637. ++
  12638. ++ /* ACK interrupts */
  12639. + rt2x00mmio_register_write(rt2x00dev, INT_SOURCE_CSR, reg);
  12640. +
  12641. + if (!reg)
  12642. +@@ -477,7 +525,7 @@ irqreturn_t rt2800mmio_interrupt(int irq
  12643. + mask = ~reg;
  12644. +
  12645. + if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS)) {
  12646. +- rt2800mmio_txstatus_interrupt(rt2x00dev);
  12647. ++ rt2800mmio_txstatus_interrupt(rt2x00dev, txstatus);
  12648. + /*
  12649. + * Never disable the TX_FIFO_STATUS interrupt.
  12650. + */
  12651. +--- a/drivers/net/wireless/rt2x00/rt2x00.h
  12652. ++++ b/drivers/net/wireless/rt2x00/rt2x00.h
  12653. +@@ -986,6 +986,11 @@ struct rt2x00_dev {
  12654. + int rf_channel;
  12655. +
  12656. + /*
  12657. ++ * Counter for tx status irq retries (rt2800pci).
  12658. ++ */
  12659. ++ unsigned int txstatus_irq_retries;
  12660. ++
  12661. ++ /*
  12662. + * Protect the interrupt mask register.
  12663. + */
  12664. + spinlock_t irqmask_lock;
  12665. diff --git a/package/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch b/package/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch
  12666. index 2bbc6f1..e5ba10e 100644
  12667. --- a/package/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch
  12668. +++ b/package/mac80211/patches/603-rt2x00-introduce-rt2x00eeprom.patch
  12669. @@ -1,6 +1,6 @@
  12670. --- a/.local-symbols
  12671. +++ b/.local-symbols
  12672. -@@ -279,6 +279,7 @@ RT2X00_LIB_FIRMWARE=
  12673. +@@ -281,6 +281,7 @@ RT2X00_LIB_FIRMWARE=
  12674. RT2X00_LIB_CRYPTO=
  12675. RT2X00_LIB_LEDS=
  12676. RT2X00_LIB_DEBUGFS=
  12677. @@ -48,16 +48,16 @@
  12678. obj-$(CPTCFG_RT2X00_LIB_MMIO) += rt2x00mmio.o
  12679. --- a/drivers/net/wireless/rt2x00/rt2800lib.h
  12680. +++ b/drivers/net/wireless/rt2x00/rt2800lib.h
  12681. -@@ -20,6 +20,8 @@
  12682. - #ifndef RT2800LIB_H
  12683. - #define RT2800LIB_H
  12684. +@@ -43,6 +43,8 @@ struct rt2800_drv_data {
  12685. + } shmem_lock;
  12686. + };
  12687. +#include "rt2800.h"
  12688. +
  12689. struct rt2800_ops {
  12690. void (*register_read)(struct rt2x00_dev *rt2x00dev,
  12691. const unsigned int offset, u32 *value);
  12692. -@@ -119,6 +121,15 @@ static inline int rt2800_read_eeprom(str
  12693. +@@ -176,6 +178,15 @@ static inline int rt2800_read_eeprom(str
  12694. {
  12695. const struct rt2800_ops *rt2800ops = rt2x00dev->ops->drv;
  12696. @@ -75,7 +75,7 @@
  12697. --- a/drivers/net/wireless/rt2x00/rt2800soc.c
  12698. +++ b/drivers/net/wireless/rt2x00/rt2800soc.c
  12699. -@@ -95,19 +95,6 @@ static int rt2800soc_set_device_state(st
  12700. +@@ -102,19 +102,6 @@ static int rt2800soc_set_device_state(st
  12701. return retval;
  12702. }
  12703. @@ -95,7 +95,7 @@
  12704. /* Firmware functions */
  12705. static char *rt2800soc_get_firmware_name(struct rt2x00_dev *rt2x00dev)
  12706. {
  12707. -@@ -171,7 +158,6 @@ static const struct rt2800_ops rt2800soc
  12708. +@@ -178,7 +165,6 @@ static const struct rt2800_ops rt2800soc
  12709. .register_multiread = rt2x00mmio_register_multiread,
  12710. .register_multiwrite = rt2x00mmio_register_multiwrite,
  12711. .regbusy_read = rt2x00mmio_regbusy_read,
  12712. @@ -127,7 +127,7 @@
  12713. DECLARE_KFIFO_PTR(txstatus_fifo, u32);
  12714. --- a/drivers/net/wireless/rt2x00/rt2x00dev.c
  12715. +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
  12716. -@@ -1324,6 +1324,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
  12717. +@@ -1327,6 +1327,10 @@ int rt2x00lib_probe_dev(struct rt2x00_de
  12718. INIT_DELAYED_WORK(&rt2x00dev->autowakeup_work, rt2x00lib_autowakeup);
  12719. INIT_WORK(&rt2x00dev->sleep_work, rt2x00lib_sleep);
  12720. @@ -138,7 +138,7 @@
  12721. /*
  12722. * Let the driver probe the device to detect the capabilities.
  12723. */
  12724. -@@ -1454,6 +1458,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
  12725. +@@ -1457,6 +1461,11 @@ void rt2x00lib_remove_dev(struct rt2x00_
  12726. */
  12727. if (rt2x00dev->drv_data)
  12728. kfree(rt2x00dev->drv_data);
  12729. diff --git a/package/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch b/package/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch
  12730. index 4116735..70f7b78 100644
  12731. --- a/package/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch
  12732. +++ b/package/mac80211/patches/607-rt2x00-allow_disabling_bands_through_platform_data.patch
  12733. @@ -12,7 +12,7 @@
  12734. #endif /* _RT2X00_PLATFORM_H */
  12735. --- a/drivers/net/wireless/rt2x00/rt2x00dev.c
  12736. +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
  12737. -@@ -937,6 +937,22 @@ static int rt2x00lib_probe_hw_modes(stru
  12738. +@@ -940,6 +940,22 @@ static int rt2x00lib_probe_hw_modes(stru
  12739. unsigned int num_rates;
  12740. unsigned int i;
  12741. diff --git a/package/mac80211/patches/608-add_platform_data_mac_addr.patch b/package/mac80211/patches/608-add_platform_data_mac_addr.patch
  12742. index a910cc3..4c2a8b8 100644
  12743. --- a/package/mac80211/patches/608-add_platform_data_mac_addr.patch
  12744. +++ b/package/mac80211/patches/608-add_platform_data_mac_addr.patch
  12745. @@ -10,7 +10,7 @@
  12746. int disable_5ghz;
  12747. --- a/drivers/net/wireless/rt2x00/rt2x00dev.c
  12748. +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
  12749. -@@ -928,6 +928,18 @@ static void rt2x00lib_rate(struct ieee80
  12750. +@@ -931,6 +931,18 @@ static void rt2x00lib_rate(struct ieee80
  12751. entry->flags |= IEEE80211_RATE_SHORT_PREAMBLE;
  12752. }
  12753. @@ -31,7 +31,7 @@
  12754. {
  12755. --- a/drivers/net/wireless/rt2x00/rt2x00.h
  12756. +++ b/drivers/net/wireless/rt2x00/rt2x00.h
  12757. -@@ -1401,6 +1401,7 @@ static inline void rt2x00debug_dump_fram
  12758. +@@ -1406,6 +1406,7 @@ static inline void rt2x00debug_dump_fram
  12759. */
  12760. u32 rt2x00lib_get_bssidx(struct rt2x00_dev *rt2x00dev,
  12761. struct ieee80211_vif *vif);
  12762. diff --git a/package/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch b/package/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch
  12763. index 83fbcd0..010a9e2 100644
  12764. --- a/package/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch
  12765. +++ b/package/mac80211/patches/610-rt2x00-fix-rt3352-ext-pa.patch
  12766. @@ -1,14 +1,15 @@
  12767. --- a/drivers/net/wireless/rt2x00/rt2800lib.c
  12768. +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  12769. -@@ -3176,11 +3176,17 @@ static void rt2800_config_channel(struct
  12770. +@@ -3550,11 +3550,18 @@ static void rt2800_config_channel(struct
  12771. /*
  12772. * Change BBP settings
  12773. */
  12774. -+ rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
  12775. -+ rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
  12776. -+ rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
  12777. +
  12778. if (rt2x00_rt(rt2x00dev, RT3352)) {
  12779. ++ rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
  12780. ++ rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
  12781. ++ rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
  12782. ++
  12783. rt2800_bbp_write(rt2x00dev, 27, 0x0);
  12784. rt2800_bbp_write(rt2x00dev, 66, 0x26 + rt2x00dev->lna_gain);
  12785. rt2800_bbp_write(rt2x00dev, 27, 0x20);
  12786. @@ -18,22 +19,7 @@
  12787. } else if (rt2x00_rt(rt2x00dev, RT3593)) {
  12788. if (rf->channel > 14) {
  12789. /* Disable CCK Packet detection on 5GHz */
  12790. -@@ -3194,14 +3200,8 @@ static void rt2800_config_channel(struct
  12791. - else
  12792. - rt2800_bbp_write(rt2x00dev, 105, 0x34);
  12793. -
  12794. -- rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
  12795. -- rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
  12796. -- rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
  12797. - rt2800_bbp_write(rt2x00dev, 77, 0x98);
  12798. - } else {
  12799. -- rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
  12800. -- rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
  12801. -- rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
  12802. - rt2800_bbp_write(rt2x00dev, 86, 0);
  12803. - }
  12804. -
  12805. -@@ -6125,6 +6125,12 @@ static void rt2800_init_rfcsr_3290(struc
  12806. +@@ -6608,6 +6615,12 @@ static void rt2800_init_rfcsr_3290(struc
  12807. static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev)
  12808. {
  12809. @@ -46,7 +32,7 @@
  12810. rt2800_rf_init_calibration(rt2x00dev, 30);
  12811. rt2800_rfcsr_write(rt2x00dev, 0, 0xf0);
  12812. -@@ -6160,15 +6166,30 @@ static void rt2800_init_rfcsr_3352(struc
  12813. +@@ -6643,15 +6656,30 @@ static void rt2800_init_rfcsr_3352(struc
  12814. rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
  12815. rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
  12816. rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
  12817. @@ -80,7 +66,7 @@
  12818. rt2800_rfcsr_write(rt2x00dev, 43, 0xdb);
  12819. rt2800_rfcsr_write(rt2x00dev, 44, 0xdb);
  12820. rt2800_rfcsr_write(rt2x00dev, 45, 0xdb);
  12821. -@@ -6176,15 +6197,20 @@ static void rt2800_init_rfcsr_3352(struc
  12822. +@@ -6659,15 +6687,20 @@ static void rt2800_init_rfcsr_3352(struc
  12823. rt2800_rfcsr_write(rt2x00dev, 47, 0x0d);
  12824. rt2800_rfcsr_write(rt2x00dev, 48, 0x14);
  12825. rt2800_rfcsr_write(rt2x00dev, 49, 0x00);
  12826. @@ -110,7 +96,7 @@
  12827. rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
  12828. rt2800_rfcsr_write(rt2x00dev, 60, 0x00);
  12829. rt2800_rfcsr_write(rt2x00dev, 61, 0x00);
  12830. -@@ -7051,6 +7077,7 @@ static int rt2800_init_eeprom(struct rt2
  12831. +@@ -7688,6 +7721,7 @@ static int rt2800_init_eeprom(struct rt2
  12832. * RT53xx: defined in "EEPROM_CHIP_ID" field
  12833. */
  12834. if (rt2x00_rt(rt2x00dev, RT3290) ||
  12835. @@ -118,7 +104,7 @@
  12836. rt2x00_rt(rt2x00dev, RT5390) ||
  12837. rt2x00_rt(rt2x00dev, RT5392))
  12838. rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
  12839. -@@ -7142,7 +7169,8 @@ static int rt2800_init_eeprom(struct rt2
  12840. +@@ -7782,7 +7816,8 @@ static int rt2800_init_eeprom(struct rt2
  12841. /*
  12842. * Detect if this device has Bluetooth co-existence.
  12843. */
  12844. @@ -128,7 +114,7 @@
  12845. __set_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags);
  12846. /*
  12847. -@@ -7171,6 +7199,22 @@ static int rt2800_init_eeprom(struct rt2
  12848. +@@ -7811,6 +7846,22 @@ static int rt2800_init_eeprom(struct rt2
  12849. EIRP_MAX_TX_POWER_LIMIT)
  12850. __set_bit(CAPABILITY_POWER_LIMIT, &rt2x00dev->cap_flags);
  12851. @@ -153,7 +139,7 @@
  12852. --- a/drivers/net/wireless/rt2x00/rt2800.h
  12853. +++ b/drivers/net/wireless/rt2x00/rt2800.h
  12854. -@@ -2299,6 +2299,12 @@ struct mac_iveiv_entry {
  12855. +@@ -2333,6 +2333,12 @@ struct mac_iveiv_entry {
  12856. #define RFCSR36_RF_BS FIELD8(0x80)
  12857. /*
  12858. @@ -166,7 +152,7 @@
  12859. * RFCSR 38:
  12860. */
  12861. #define RFCSR38_RX_LO1_EN FIELD8(0x20)
  12862. -@@ -2310,6 +2316,18 @@ struct mac_iveiv_entry {
  12863. +@@ -2344,6 +2350,18 @@ struct mac_iveiv_entry {
  12864. #define RFCSR39_RX_LO2_EN FIELD8(0x80)
  12865. /*
  12866. @@ -185,7 +171,7 @@
  12867. * RFCSR 49:
  12868. */
  12869. #define RFCSR49_TX FIELD8(0x3f)
  12870. -@@ -2322,6 +2340,8 @@ struct mac_iveiv_entry {
  12871. +@@ -2356,6 +2374,8 @@ struct mac_iveiv_entry {
  12872. * RFCSR 50:
  12873. */
  12874. #define RFCSR50_TX FIELD8(0x3f)
  12875. @@ -194,7 +180,7 @@
  12876. #define RFCSR50_EP FIELD8(0xc0)
  12877. /* bits for RT3593 */
  12878. #define RFCSR50_TX_LO1_EN FIELD8(0x20)
  12879. -@@ -2469,6 +2489,8 @@ enum rt2800_eeprom_word {
  12880. +@@ -2503,6 +2523,8 @@ enum rt2800_eeprom_word {
  12881. * INTERNAL_TX_ALC: 0: disable, 1: enable
  12882. * BT_COEXIST: 0: disable, 1: enable
  12883. * DAC_TEST: 0: disable, 1: enable
  12884. @@ -203,7 +189,7 @@
  12885. */
  12886. #define EEPROM_NIC_CONF1_HW_RADIO FIELD16(0x0001)
  12887. #define EEPROM_NIC_CONF1_EXTERNAL_TX_ALC FIELD16(0x0002)
  12888. -@@ -2485,6 +2507,8 @@ enum rt2800_eeprom_word {
  12889. +@@ -2519,6 +2541,8 @@ enum rt2800_eeprom_word {
  12890. #define EEPROM_NIC_CONF1_INTERNAL_TX_ALC FIELD16(0x2000)
  12891. #define EEPROM_NIC_CONF1_BT_COEXIST FIELD16(0x4000)
  12892. #define EEPROM_NIC_CONF1_DAC_TEST FIELD16(0x8000)
  12893. diff --git a/package/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch b/package/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch
  12894. index 478a0f2..65af89a 100644
  12895. --- a/package/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch
  12896. +++ b/package/mac80211/patches/611-rt2x00-rf_vals-rt3352-xtal20.patch
  12897. @@ -1,6 +1,6 @@
  12898. --- a/drivers/net/wireless/rt2x00/rt2800lib.c
  12899. +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  12900. -@@ -7491,6 +7491,27 @@ static const struct rf_channel rf_vals_5
  12901. +@@ -8198,6 +8198,27 @@ static const struct rf_channel rf_vals_5
  12902. {196, 83, 0, 12, 1},
  12903. };
  12904. @@ -28,7 +28,7 @@
  12905. static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
  12906. {
  12907. struct hw_mode_spec *spec = &rt2x00dev->spec;
  12908. -@@ -7579,7 +7600,10 @@ static int rt2800_probe_hw_mode(struct r
  12909. +@@ -8285,7 +8306,10 @@ static int rt2800_probe_hw_mode(struct r
  12910. case RF5390:
  12911. case RF5392:
  12912. spec->num_channels = 14;
  12913. @@ -40,7 +40,7 @@
  12914. break;
  12915. case RF3052:
  12916. -@@ -7755,6 +7779,19 @@ static int rt2800_probe_rt(struct rt2x00
  12917. +@@ -8468,6 +8492,19 @@ static int rt2800_probe_rt(struct rt2x00
  12918. return 0;
  12919. }
  12920. @@ -59,8 +59,8 @@
  12921. +
  12922. int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
  12923. {
  12924. - int retval;
  12925. -@@ -7784,6 +7821,15 @@ int rt2800_probe_hw(struct rt2x00_dev *r
  12926. + struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
  12927. +@@ -8510,6 +8547,15 @@ int rt2800_probe_hw(struct rt2x00_dev *r
  12928. rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
  12929. /*
  12930. diff --git a/package/mac80211/patches/612-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch b/package/mac80211/patches/612-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch
  12931. index f6b4808..119e95c 100644
  12932. --- a/package/mac80211/patches/612-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch
  12933. +++ b/package/mac80211/patches/612-rt2x00-make-wmac-loadable-via-OF-on-rt288x-305x-SoC.patch
  12934. @@ -13,7 +13,7 @@ Signed-off-by: John Crispin <blogic@openwrt.org>
  12935. --- a/drivers/net/wireless/rt2x00/rt2800soc.c
  12936. +++ b/drivers/net/wireless/rt2x00/rt2800soc.c
  12937. -@@ -227,11 +227,18 @@ static int rt2800soc_probe(struct platfo
  12938. +@@ -237,11 +237,18 @@ static int rt2800soc_probe(struct platfo
  12939. return rt2x00soc_probe(pdev, &rt2800soc_ops);
  12940. }
  12941. diff --git a/package/mac80211/patches/616-rt2x00-support-rt5350.patch b/package/mac80211/patches/616-rt2x00-support-rt5350.patch
  12942. index 3bafa16..41a7f34 100644
  12943. --- a/package/mac80211/patches/616-rt2x00-support-rt5350.patch
  12944. +++ b/package/mac80211/patches/616-rt2x00-support-rt5350.patch
  12945. @@ -1,16 +1,16 @@
  12946. --- a/drivers/net/wireless/rt2x00/rt2800.h
  12947. +++ b/drivers/net/wireless/rt2x00/rt2800.h
  12948. -@@ -71,6 +71,7 @@
  12949. - #define RF5592 0x000f
  12950. +@@ -73,6 +73,7 @@
  12951. #define RF3070 0x3070
  12952. #define RF3290 0x3290
  12953. + #define RF3853 0x3853
  12954. +#define RF5350 0x5350
  12955. #define RF5360 0x5360
  12956. #define RF5370 0x5370
  12957. #define RF5372 0x5372
  12958. --- a/drivers/net/wireless/rt2x00/rt2800lib.c
  12959. +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  12960. -@@ -2704,6 +2704,13 @@ static void rt2800_config_channel_rf53xx
  12961. +@@ -3038,6 +3038,13 @@ static void rt2800_config_channel_rf53xx
  12962. rt2800_rfcsr_write(rt2x00dev, 59,
  12963. r59_non_bt[idx]);
  12964. @@ -24,15 +24,15 @@
  12965. }
  12966. }
  12967. }
  12968. -@@ -3141,6 +3148,7 @@ static void rt2800_config_channel(struct
  12969. - rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info);
  12970. +@@ -3516,6 +3523,7 @@ static void rt2800_config_channel(struct
  12971. + rt2800_config_channel_rf3853(rt2x00dev, conf, rf, info);
  12972. break;
  12973. case RF3070:
  12974. + case RF5350:
  12975. case RF5360:
  12976. case RF5370:
  12977. case RF5372:
  12978. -@@ -3158,6 +3166,7 @@ static void rt2800_config_channel(struct
  12979. +@@ -3533,6 +3541,7 @@ static void rt2800_config_channel(struct
  12980. if (rt2x00_rf(rt2x00dev, RF3070) ||
  12981. rt2x00_rf(rt2x00dev, RF3290) ||
  12982. rt2x00_rf(rt2x00dev, RF3322) ||
  12983. @@ -40,7 +40,7 @@
  12984. rt2x00_rf(rt2x00dev, RF5360) ||
  12985. rt2x00_rf(rt2x00dev, RF5370) ||
  12986. rt2x00_rf(rt2x00dev, RF5372) ||
  12987. -@@ -3398,7 +3407,8 @@ static void rt2800_config_channel(struct
  12988. +@@ -3810,7 +3819,8 @@ static void rt2800_config_channel(struct
  12989. /*
  12990. * Clear update flag
  12991. */
  12992. @@ -50,15 +50,15 @@
  12993. rt2800_bbp_read(rt2x00dev, 49, &bbp);
  12994. rt2x00_set_field8(&bbp, BBP49_UPDATE_FLAG, 0);
  12995. rt2800_bbp_write(rt2x00dev, 49, bbp);
  12996. -@@ -4272,6 +4282,7 @@ void rt2800_vco_calibration(struct rt2x0
  12997. - case RF3053:
  12998. +@@ -4689,6 +4699,7 @@ void rt2800_vco_calibration(struct rt2x0
  12999. case RF3070:
  13000. case RF3290:
  13001. + case RF3853:
  13002. + case RF5350:
  13003. case RF5360:
  13004. case RF5370:
  13005. case RF5372:
  13006. -@@ -4668,6 +4679,8 @@ static int rt2800_init_registers(struct
  13007. +@@ -5101,6 +5112,8 @@ static int rt2800_init_registers(struct
  13008. rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
  13009. rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
  13010. rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
  13011. @@ -67,7 +67,7 @@
  13012. } else {
  13013. rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000000);
  13014. rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
  13015. -@@ -5309,9 +5322,13 @@ static void rt2800_init_bbp_3352(struct
  13016. +@@ -5756,9 +5769,13 @@ static void rt2800_init_bbp_3352(struct
  13017. rt2800_bbp_write(rt2x00dev, 82, 0x62);
  13018. @@ -84,7 +84,7 @@
  13019. rt2800_bbp_write(rt2x00dev, 86, 0x38);
  13020. -@@ -5325,9 +5342,13 @@ static void rt2800_init_bbp_3352(struct
  13021. +@@ -5772,9 +5789,13 @@ static void rt2800_init_bbp_3352(struct
  13022. rt2800_bbp_write(rt2x00dev, 104, 0x92);
  13023. @@ -101,7 +101,7 @@
  13024. rt2800_bbp_write(rt2x00dev, 120, 0x50);
  13025. -@@ -5352,6 +5373,13 @@ static void rt2800_init_bbp_3352(struct
  13026. +@@ -5799,6 +5820,13 @@ static void rt2800_init_bbp_3352(struct
  13027. rt2800_bbp_write(rt2x00dev, 143, 0xa2);
  13028. rt2800_bbp_write(rt2x00dev, 148, 0xc8);
  13029. @@ -115,7 +115,7 @@
  13030. }
  13031. static void rt2800_init_bbp_3390(struct rt2x00_dev *rt2x00dev)
  13032. -@@ -5652,6 +5680,7 @@ static void rt2800_init_bbp(struct rt2x0
  13033. +@@ -6140,6 +6168,7 @@ static void rt2800_init_bbp(struct rt2x0
  13034. rt2800_init_bbp_3290(rt2x00dev);
  13035. break;
  13036. case RT3352:
  13037. @@ -123,8 +123,8 @@
  13038. rt2800_init_bbp_3352(rt2x00dev);
  13039. break;
  13040. case RT3390:
  13041. -@@ -6462,6 +6491,76 @@ static void rt2800_init_rfcsr_3593(struc
  13042. - /* TODO: enable stream mode support */
  13043. +@@ -7091,6 +7120,76 @@ static void rt2800_init_rfcsr_3883(struc
  13044. + rt2800_rfcsr_write(rt2x00dev, 20, rfcsr);
  13045. }
  13046. +static void rt2800_init_rfcsr_5350(struct rt2x00_dev *rt2x00dev)
  13047. @@ -200,7 +200,7 @@
  13048. static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev)
  13049. {
  13050. rt2800_rf_init_calibration(rt2x00dev, 2);
  13051. -@@ -6699,6 +6798,9 @@ static void rt2800_init_rfcsr(struct rt2
  13052. +@@ -7331,6 +7430,9 @@ static void rt2800_init_rfcsr(struct rt2
  13053. case RT3593:
  13054. rt2800_init_rfcsr_3593(rt2x00dev);
  13055. break;
  13056. @@ -210,7 +210,7 @@
  13057. case RT5390:
  13058. rt2800_init_rfcsr_5390(rt2x00dev);
  13059. break;
  13060. -@@ -6948,6 +7050,12 @@ static int rt2800_validate_eeprom(struct
  13061. +@@ -7590,6 +7692,12 @@ static int rt2800_validate_eeprom(struct
  13062. rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RF_TYPE, RF2820);
  13063. rt2800_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word);
  13064. rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word);
  13065. @@ -223,24 +223,24 @@
  13066. } else if (rt2x00_rt(rt2x00dev, RT2860) ||
  13067. rt2x00_rt(rt2x00dev, RT2872)) {
  13068. /*
  13069. -@@ -7081,6 +7189,8 @@ static int rt2800_init_eeprom(struct rt2
  13070. - rt2x00_rt(rt2x00dev, RT5390) ||
  13071. - rt2x00_rt(rt2x00dev, RT5392))
  13072. +@@ -7728,6 +7836,8 @@ static int rt2800_init_eeprom(struct rt2
  13073. rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
  13074. + else if (rt2x00_rt(rt2x00dev, RT3883))
  13075. + rf = RF3853;
  13076. + else if (rt2x00_rt(rt2x00dev, RT5350))
  13077. + rf = RF5350;
  13078. else
  13079. rf = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
  13080. -@@ -7099,6 +7209,7 @@ static int rt2800_init_eeprom(struct rt2
  13081. - case RF3290:
  13082. +@@ -7747,6 +7857,7 @@ static int rt2800_init_eeprom(struct rt2
  13083. case RF3320:
  13084. case RF3322:
  13085. + case RF3853:
  13086. + case RF5350:
  13087. case RF5360:
  13088. case RF5370:
  13089. case RF5372:
  13090. -@@ -7594,6 +7705,7 @@ static int rt2800_probe_hw_mode(struct r
  13091. +@@ -8301,6 +8412,7 @@ static int rt2800_probe_hw_mode(struct r
  13092. case RF3290:
  13093. case RF3320:
  13094. case RF3322:
  13095. @@ -248,18 +248,18 @@
  13096. case RF5360:
  13097. case RF5370:
  13098. case RF5372:
  13099. -@@ -7726,6 +7838,7 @@ static int rt2800_probe_hw_mode(struct r
  13100. - case RF3053:
  13101. +@@ -8439,6 +8551,7 @@ static int rt2800_probe_hw_mode(struct r
  13102. case RF3070:
  13103. case RF3290:
  13104. + case RF3853:
  13105. + case RF5350:
  13106. case RF5360:
  13107. case RF5370:
  13108. case RF5372:
  13109. -@@ -7764,6 +7877,7 @@ static int rt2800_probe_rt(struct rt2x00
  13110. - case RT3390:
  13111. +@@ -8478,6 +8591,7 @@ static int rt2800_probe_rt(struct rt2x00
  13112. case RT3572:
  13113. case RT3593:
  13114. + case RT3883:
  13115. + case RT5350:
  13116. case RT5390:
  13117. case RT5392:
  13118. diff --git a/package/mac80211/patches/619-rt2x00-change-led-polarity-from-OF.patch b/package/mac80211/patches/619-rt2x00-change-led-polarity-from-OF.patch
  13119. index f9186d8..d966321 100644
  13120. --- a/package/mac80211/patches/619-rt2x00-change-led-polarity-from-OF.patch
  13121. +++ b/package/mac80211/patches/619-rt2x00-change-led-polarity-from-OF.patch
  13122. @@ -1,6 +1,6 @@
  13123. --- a/drivers/net/wireless/rt2x00/rt2800lib.c
  13124. +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  13125. -@@ -36,6 +36,7 @@
  13126. +@@ -37,6 +37,7 @@
  13127. #include <linux/kernel.h>
  13128. #include <linux/module.h>
  13129. #include <linux/slab.h>
  13130. @@ -8,7 +8,7 @@
  13131. #include "rt2x00.h"
  13132. #include "rt2800lib.h"
  13133. -@@ -7298,6 +7299,17 @@ static int rt2800_init_eeprom(struct rt2
  13134. +@@ -7946,6 +7947,17 @@ static int rt2800_init_eeprom(struct rt2
  13135. rt2800_init_led(rt2x00dev, &rt2x00dev->led_assoc, LED_TYPE_ASSOC);
  13136. rt2800_init_led(rt2x00dev, &rt2x00dev->led_qual, LED_TYPE_QUALITY);
  13137. diff --git a/package/mac80211/patches/620-rt2x00-add-AP+STA-support.patch b/package/mac80211/patches/620-rt2x00-add-AP+STA-support.patch
  13138. index 419cb60..ce667b8 100644
  13139. --- a/package/mac80211/patches/620-rt2x00-add-AP+STA-support.patch
  13140. +++ b/package/mac80211/patches/620-rt2x00-add-AP+STA-support.patch
  13141. @@ -1,6 +1,6 @@
  13142. --- a/drivers/net/wireless/rt2x00/rt2x00dev.c
  13143. +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
  13144. -@@ -1262,7 +1262,7 @@ static inline void rt2x00lib_set_if_comb
  13145. +@@ -1265,7 +1265,7 @@ static inline void rt2x00lib_set_if_comb
  13146. */
  13147. if_limit = &rt2x00dev->if_limits_ap;
  13148. if_limit->max = rt2x00dev->ops->max_ap_intf;
  13149. diff --git a/package/mac80211/patches/620-rt2x00-rt3352-rf-id.patch b/package/mac80211/patches/620-rt2x00-rt3352-rf-id.patch
  13150. index 5e67344..90eab13 100644
  13151. --- a/package/mac80211/patches/620-rt2x00-rt3352-rf-id.patch
  13152. +++ b/package/mac80211/patches/620-rt2x00-rt3352-rf-id.patch
  13153. @@ -1,6 +1,6 @@
  13154. --- a/drivers/net/wireless/rt2x00/rt2800lib.c
  13155. +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
  13156. -@@ -7186,10 +7186,11 @@ static int rt2800_init_eeprom(struct rt2
  13157. +@@ -7831,10 +7831,11 @@ static int rt2800_init_eeprom(struct rt2
  13158. * RT53xx: defined in "EEPROM_CHIP_ID" field
  13159. */
  13160. if (rt2x00_rt(rt2x00dev, RT3290) ||
  13161. @@ -10,6 +10,6 @@
  13162. rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID, &rf);
  13163. + else if (rt2x00_rt(rt2x00dev, RT3352))
  13164. + rf = RF3322;
  13165. + else if (rt2x00_rt(rt2x00dev, RT3883))
  13166. + rf = RF3853;
  13167. else if (rt2x00_rt(rt2x00dev, RT5350))
  13168. - rf = RF5350;
  13169. - else
  13170. diff --git a/package/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch b/package/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch
  13171. index 484c075..ae7e927 100644
  13172. --- a/package/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch
  13173. +++ b/package/mac80211/patches/700-mwl8k-missing-pci-id-for-WNR854T.patch
  13174. @@ -1,6 +1,6 @@
  13175. --- a/drivers/net/wireless/mwl8k.c
  13176. +++ b/drivers/net/wireless/mwl8k.c
  13177. -@@ -5529,6 +5529,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
  13178. +@@ -5682,6 +5682,7 @@ MODULE_FIRMWARE("mwl8k/fmimage_8366.fw")
  13179. MODULE_FIRMWARE(MWL8K_8366_AP_FW(MWL8K_8366_AP_FW_API));
  13180. static DEFINE_PCI_DEVICE_TABLE(mwl8k_pci_id_table) = {
  13181. diff --git a/package/mac80211/patches/800-b43-gpio-mask-module-option.patch b/package/mac80211/patches/800-b43-gpio-mask-module-option.patch
  13182. index fc874ad..7c56369 100644
  13183. --- a/package/mac80211/patches/800-b43-gpio-mask-module-option.patch
  13184. +++ b/package/mac80211/patches/800-b43-gpio-mask-module-option.patch
  13185. @@ -22,7 +22,7 @@
  13186. static int modparam_bad_frames_preempt;
  13187. module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444);
  13188. MODULE_PARM_DESC(bad_frames_preempt,
  13189. -@@ -2747,10 +2752,10 @@ static int b43_gpio_init(struct b43_wlde
  13190. +@@ -2749,10 +2754,10 @@ static int b43_gpio_init(struct b43_wlde
  13191. u32 mask, set;
  13192. b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_GPOUTSMSK, 0);
  13193. diff --git a/package/mac80211/patches/810-b43_no_pio.patch b/package/mac80211/patches/810-b43_no_pio.patch
  13194. index 5cd1b8b..2023bf6 100644
  13195. --- a/package/mac80211/patches/810-b43_no_pio.patch
  13196. +++ b/package/mac80211/patches/810-b43_no_pio.patch
  13197. @@ -11,7 +11,7 @@
  13198. b43-$(CPTCFG_B43_PCMCIA) += pcmcia.o
  13199. --- a/drivers/net/wireless/b43/main.c
  13200. +++ b/drivers/net/wireless/b43/main.c
  13201. -@@ -1915,10 +1915,12 @@ static void b43_do_interrupt_thread(stru
  13202. +@@ -1909,10 +1909,12 @@ static void b43_do_interrupt_thread(stru
  13203. dma_reason[0], dma_reason[1],
  13204. dma_reason[2], dma_reason[3],
  13205. dma_reason[4], dma_reason[5]);
  13206. @@ -75,12 +75,12 @@
  13207. #endif /* B43_PIO_H_ */
  13208. --- a/drivers/net/wireless/b43/Kconfig
  13209. +++ b/drivers/net/wireless/b43/Kconfig
  13210. -@@ -98,7 +98,7 @@ config B43_BCMA_PIO
  13211. +@@ -118,7 +118,7 @@ config B43_BCMA_PIO
  13212. default y
  13213. config B43_PIO
  13214. - bool
  13215. + bool "Broadcom 43xx PIO support"
  13216. - depends on B43
  13217. + depends on B43 && B43_SSB
  13218. select SSB_BLOCKIO
  13219. default y
  13220. diff --git a/package/mac80211/patches/820-b43-add-antenna-control.patch b/package/mac80211/patches/820-b43-add-antenna-control.patch
  13221. index dea9830..5a23967 100644
  13222. --- a/package/mac80211/patches/820-b43-add-antenna-control.patch
  13223. +++ b/package/mac80211/patches/820-b43-add-antenna-control.patch
  13224. @@ -1,6 +1,6 @@
  13225. --- a/drivers/net/wireless/b43/main.c
  13226. +++ b/drivers/net/wireless/b43/main.c
  13227. -@@ -1562,7 +1562,7 @@ static void b43_write_beacon_template(st
  13228. +@@ -1556,7 +1556,7 @@ static void b43_write_beacon_template(st
  13229. len, ram_offset, shm_size_offset, rate);
  13230. /* Write the PHY TX control parameters. */
  13231. @@ -9,7 +9,7 @@
  13232. antenna = b43_antenna_to_phyctl(antenna);
  13233. ctl = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL);
  13234. /* We can't send beacons with short preamble. Would get PHY errors. */
  13235. -@@ -3105,8 +3105,8 @@ static int b43_chip_init(struct b43_wlde
  13236. +@@ -3113,8 +3113,8 @@ static int b43_chip_init(struct b43_wlde
  13237. /* Select the antennae */
  13238. if (phy->ops->set_rx_antenna)
  13239. @@ -20,7 +20,7 @@
  13240. if (phy->type == B43_PHYTYPE_B) {
  13241. value16 = b43_read16(dev, 0x005E);
  13242. -@@ -3850,7 +3850,6 @@ static int b43_op_config(struct ieee8021
  13243. +@@ -3806,7 +3806,6 @@ static int b43_op_config(struct ieee8021
  13244. struct b43_wldev *dev;
  13245. struct b43_phy *phy;
  13246. struct ieee80211_conf *conf = &hw->conf;
  13247. @@ -28,7 +28,7 @@
  13248. int err = 0;
  13249. bool reload_bss = false;
  13250. -@@ -3904,11 +3903,9 @@ static int b43_op_config(struct ieee8021
  13251. +@@ -3860,11 +3859,9 @@ static int b43_op_config(struct ieee8021
  13252. }
  13253. /* Antennas for RX and management frame TX. */
  13254. @@ -42,7 +42,7 @@
  13255. if (wl->radio_enabled != phy->radio_on) {
  13256. if (wl->radio_enabled) {
  13257. -@@ -5041,6 +5038,47 @@ static int b43_op_get_survey(struct ieee
  13258. +@@ -4988,6 +4985,47 @@ static int b43_op_get_survey(struct ieee
  13259. return 0;
  13260. }
  13261. @@ -90,7 +90,7 @@
  13262. static const struct ieee80211_ops b43_hw_ops = {
  13263. .tx = b43_op_tx,
  13264. .conf_tx = b43_op_conf_tx,
  13265. -@@ -5062,6 +5100,8 @@ static const struct ieee80211_ops b43_hw
  13266. +@@ -5009,6 +5047,8 @@ static const struct ieee80211_ops b43_hw
  13267. .sw_scan_complete = b43_op_sw_scan_complete_notifier,
  13268. .get_survey = b43_op_get_survey,
  13269. .rfkill_poll = b43_rfkill_poll,
  13270. @@ -99,7 +99,7 @@
  13271. };
  13272. /* Hard-reset the chip. Do not call this directly.
  13273. -@@ -5308,6 +5348,8 @@ static int b43_one_core_attach(struct b4
  13274. +@@ -5295,6 +5335,8 @@ static int b43_one_core_attach(struct b4
  13275. if (!wldev)
  13276. goto out;
  13277. @@ -108,7 +108,7 @@
  13278. wldev->use_pio = b43_modparam_pio;
  13279. wldev->dev = dev;
  13280. wldev->wl = wl;
  13281. -@@ -5398,6 +5440,9 @@ static struct b43_wl *b43_wireless_init(
  13282. +@@ -5385,6 +5427,9 @@ static struct b43_wl *b43_wireless_init(
  13283. hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
  13284. diff --git a/package/mac80211/patches/830-b43-workaround-pcie-bcm4716.patch b/package/mac80211/patches/830-b43-workaround-pcie-bcm4716.patch
  13285. index e76758c..b6db3ac 100644
  13286. --- a/package/mac80211/patches/830-b43-workaround-pcie-bcm4716.patch
  13287. +++ b/package/mac80211/patches/830-b43-workaround-pcie-bcm4716.patch
  13288. @@ -19,7 +19,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
  13289. --- a/drivers/net/wireless/b43/b43.h
  13290. +++ b/drivers/net/wireless/b43/b43.h
  13291. -@@ -1061,6 +1061,31 @@ static inline bool b43_using_pio_transfe
  13292. +@@ -1054,6 +1054,31 @@ static inline bool b43_using_pio_transfe
  13293. return dev->__using_pio_transfers;
  13294. }
  13295. @@ -53,18 +53,20 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
  13296. __printf(2, 3) void b43err(struct b43_wl *wl, const char *fmt, ...);
  13297. --- a/drivers/net/wireless/b43/bus.h
  13298. +++ b/drivers/net/wireless/b43/bus.h
  13299. -@@ -60,6 +60,16 @@ static inline bool b43_bus_host_is_sdio(
  13300. - return (dev->bus_type == B43_BUS_SSB &&
  13301. - dev->sdev->bus->bustype == SSB_BUSTYPE_SDIO);
  13302. +@@ -70,6 +70,18 @@ static inline bool b43_bus_host_is_sdio(
  13303. + return false;
  13304. + #endif
  13305. }
  13306. +static inline bool b43_bus_host_is_pci(struct b43_bus_dev *dev)
  13307. +{
  13308. -+ if (dev->bus_type == B43_BUS_SSB)
  13309. -+ return (dev->sdev->bus->bustype == SSB_BUSTYPE_PCI);
  13310. +#ifdef CPTCFG_B43_BCMA
  13311. + if (dev->bus_type == B43_BUS_BCMA)
  13312. + return (dev->bdev->bus->hosttype == BCMA_HOSTTYPE_PCI);
  13313. +#endif
  13314. ++#ifdef CPTCFG_B43_SSB
  13315. ++ if (dev->bus_type == B43_BUS_SSB)
  13316. ++ return (dev->sdev->bus->bustype == SSB_BUSTYPE_PCI);
  13317. ++#endif
  13318. + return false;
  13319. +}
  13320. @@ -72,7 +74,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
  13321. struct b43_bus_dev *b43_bus_dev_ssb_init(struct ssb_device *sdev);
  13322. --- a/drivers/net/wireless/b43/main.c
  13323. +++ b/drivers/net/wireless/b43/main.c
  13324. -@@ -4437,7 +4437,7 @@ static int b43_phy_versioning(struct b43
  13325. +@@ -4380,7 +4380,7 @@ static int b43_phy_versioning(struct b43
  13326. u16 radio24[3];
  13327. for (tmp = 0; tmp < 3; tmp++) {
  13328. @@ -81,7 +83,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
  13329. radio24[tmp] = b43_read16(dev, B43_MMIO_RADIO24_DATA);
  13330. }
  13331. -@@ -4456,10 +4456,10 @@ static int b43_phy_versioning(struct b43
  13332. +@@ -4399,10 +4399,10 @@ static int b43_phy_versioning(struct b43
  13333. else
  13334. tmp = 0x5205017F;
  13335. } else {
  13336. @@ -96,7 +98,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
  13337. << 16;
  13338. --- a/drivers/net/wireless/b43/phy_common.c
  13339. +++ b/drivers/net/wireless/b43/phy_common.c
  13340. -@@ -266,6 +266,12 @@ void b43_phy_write(struct b43_wldev *dev
  13341. +@@ -267,6 +267,12 @@ void b43_phy_write(struct b43_wldev *dev
  13342. {
  13343. assert_mac_suspended(dev);
  13344. dev->phy.ops->phy_write(dev, reg, value);
  13345. @@ -197,7 +199,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
  13346. --- a/drivers/net/wireless/b43/phy_n.c
  13347. +++ b/drivers/net/wireless/b43/phy_n.c
  13348. -@@ -5418,14 +5418,14 @@ static inline void check_phyreg(struct b
  13349. +@@ -5641,14 +5641,14 @@ static inline void check_phyreg(struct b
  13350. static u16 b43_nphy_op_read(struct b43_wldev *dev, u16 reg)
  13351. {
  13352. check_phyreg(dev, reg);
  13353. @@ -214,7 +216,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
  13354. b43_write16(dev, B43_MMIO_PHY_DATA, value);
  13355. }
  13356. -@@ -5433,7 +5433,7 @@ static void b43_nphy_op_maskset(struct b
  13357. +@@ -5656,7 +5656,7 @@ static void b43_nphy_op_maskset(struct b
  13358. u16 set)
  13359. {
  13360. check_phyreg(dev, reg);
  13361. @@ -223,16 +225,16 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
  13362. b43_maskset16(dev, B43_MMIO_PHY_DATA, mask, set);
  13363. }
  13364. -@@ -5444,7 +5444,7 @@ static u16 b43_nphy_op_radio_read(struct
  13365. - /* N-PHY needs 0x100 for read access */
  13366. - reg |= 0x100;
  13367. +@@ -5670,7 +5670,7 @@ static u16 b43_nphy_op_radio_read(struct
  13368. + else
  13369. + reg |= 0x100;
  13370. - b43_write16(dev, B43_MMIO_RADIO_CONTROL, reg);
  13371. + b43_wflush16(dev, B43_MMIO_RADIO_CONTROL, reg);
  13372. return b43_read16(dev, B43_MMIO_RADIO_DATA_LOW);
  13373. }
  13374. -@@ -5453,7 +5453,7 @@ static void b43_nphy_op_radio_write(stru
  13375. +@@ -5679,7 +5679,7 @@ static void b43_nphy_op_radio_write(stru
  13376. /* Register 1 is a 32-bit register. */
  13377. B43_WARN_ON(reg == 1);
  13378. diff --git a/package/mac80211/patches/845-b43-only-use-gpio-0-1-for-led.patch b/package/mac80211/patches/845-b43-only-use-gpio-0-1-for-led.patch
  13379. index 50347cd..efc3451 100644
  13380. --- a/package/mac80211/patches/845-b43-only-use-gpio-0-1-for-led.patch
  13381. +++ b/package/mac80211/patches/845-b43-only-use-gpio-0-1-for-led.patch
  13382. @@ -1,6 +1,6 @@
  13383. --- a/drivers/net/wireless/b43/main.c
  13384. +++ b/drivers/net/wireless/b43/main.c
  13385. -@@ -2764,6 +2764,14 @@ static int b43_gpio_init(struct b43_wlde
  13386. +@@ -2766,6 +2766,14 @@ static int b43_gpio_init(struct b43_wlde
  13387. } else if (dev->dev->chip_id == 0x5354) {
  13388. /* Don't allow overtaking buttons GPIOs */
  13389. set &= 0x2; /* 0x2 is LED GPIO on BCM5354 */
  13390. diff --git a/package/mac80211/patches/900-wl1251-split-wl251-platform-data-to-a-separate-structure.patch b/package/mac80211/patches/900-wl1251-split-wl251-platform-data-to-a-separate-structure.patch
  13391. deleted file mode 100644
  13392. index a8af257..0000000
  13393. --- a/package/mac80211/patches/900-wl1251-split-wl251-platform-data-to-a-separate-structure.patch
  13394. +++ /dev/null
  13395. @@ -1,109 +0,0 @@
  13396. -Move the wl1251 part of the wl12xx platform data structure into a new
  13397. -structure specifically for wl1251. Change the platform data built-in
  13398. -block and board files accordingly.
  13399. -
  13400. -Cc: Tony Lindgren <tony@atomide.com>
  13401. -Signed-off-by: Luciano Coelho <coelho@ti.com>
  13402. -Acked-by: Tony Lindgren <tony@atomide.com>
  13403. -Reviewed-by: Felipe Balbi <balbi@ti.com>
  13404. -
  13405. ---- a/drivers/net/wireless/ti/wilink_platform_data.c
  13406. -+++ b/drivers/net/wireless/ti/wilink_platform_data.c
  13407. -@@ -23,17 +23,17 @@
  13408. - #include <linux/err.h>
  13409. - #include <linux/wl12xx.h>
  13410. -
  13411. --static struct wl12xx_platform_data *platform_data;
  13412. -+static struct wl12xx_platform_data *wl12xx_platform_data;
  13413. -
  13414. - int __init wl12xx_set_platform_data(const struct wl12xx_platform_data *data)
  13415. - {
  13416. -- if (platform_data)
  13417. -+ if (wl12xx_platform_data)
  13418. - return -EBUSY;
  13419. - if (!data)
  13420. - return -EINVAL;
  13421. -
  13422. -- platform_data = kmemdup(data, sizeof(*data), GFP_KERNEL);
  13423. -- if (!platform_data)
  13424. -+ wl12xx_platform_data = kmemdup(data, sizeof(*data), GFP_KERNEL);
  13425. -+ if (!wl12xx_platform_data)
  13426. - return -ENOMEM;
  13427. -
  13428. - return 0;
  13429. -@@ -41,9 +41,34 @@ int __init wl12xx_set_platform_data(cons
  13430. -
  13431. - struct wl12xx_platform_data *wl12xx_get_platform_data(void)
  13432. - {
  13433. -- if (!platform_data)
  13434. -+ if (!wl12xx_platform_data)
  13435. - return ERR_PTR(-ENODEV);
  13436. -
  13437. -- return platform_data;
  13438. -+ return wl12xx_platform_data;
  13439. - }
  13440. - EXPORT_SYMBOL(wl12xx_get_platform_data);
  13441. -+
  13442. -+static struct wl1251_platform_data *wl1251_platform_data;
  13443. -+
  13444. -+int __init wl1251_set_platform_data(const struct wl1251_platform_data *data)
  13445. -+{
  13446. -+ if (wl1251_platform_data)
  13447. -+ return -EBUSY;
  13448. -+ if (!data)
  13449. -+ return -EINVAL;
  13450. -+
  13451. -+ wl1251_platform_data = kmemdup(data, sizeof(*data), GFP_KERNEL);
  13452. -+ if (!wl1251_platform_data)
  13453. -+ return -ENOMEM;
  13454. -+
  13455. -+ return 0;
  13456. -+}
  13457. -+
  13458. -+struct wl1251_platform_data *wl1251_get_platform_data(void)
  13459. -+{
  13460. -+ if (!wl1251_platform_data)
  13461. -+ return ERR_PTR(-ENODEV);
  13462. -+
  13463. -+ return wl1251_platform_data;
  13464. -+}
  13465. -+EXPORT_SYMBOL(wl1251_get_platform_data);
  13466. ---- a/drivers/net/wireless/ti/wl1251/sdio.c
  13467. -+++ b/drivers/net/wireless/ti/wl1251/sdio.c
  13468. -@@ -227,7 +227,7 @@ static int wl1251_sdio_probe(struct sdio
  13469. - struct wl1251 *wl;
  13470. - struct ieee80211_hw *hw;
  13471. - struct wl1251_sdio *wl_sdio;
  13472. -- const struct wl12xx_platform_data *wl12xx_board_data;
  13473. -+ const struct wl1251_platform_data *wl1251_board_data;
  13474. -
  13475. - hw = wl1251_alloc_hw();
  13476. - if (IS_ERR(hw))
  13477. -@@ -254,11 +254,11 @@ static int wl1251_sdio_probe(struct sdio
  13478. - wl->if_priv = wl_sdio;
  13479. - wl->if_ops = &wl1251_sdio_ops;
  13480. -
  13481. -- wl12xx_board_data = wl12xx_get_platform_data();
  13482. -- if (!IS_ERR(wl12xx_board_data)) {
  13483. -- wl->set_power = wl12xx_board_data->set_power;
  13484. -- wl->irq = wl12xx_board_data->irq;
  13485. -- wl->use_eeprom = wl12xx_board_data->use_eeprom;
  13486. -+ wl1251_board_data = wl1251_get_platform_data();
  13487. -+ if (!IS_ERR(wl1251_board_data)) {
  13488. -+ wl->set_power = wl1251_board_data->set_power;
  13489. -+ wl->irq = wl1251_board_data->irq;
  13490. -+ wl->use_eeprom = wl1251_board_data->use_eeprom;
  13491. - }
  13492. -
  13493. - if (wl->irq) {
  13494. ---- a/drivers/net/wireless/ti/wl1251/spi.c
  13495. -+++ b/drivers/net/wireless/ti/wl1251/spi.c
  13496. -@@ -241,7 +241,7 @@ static const struct wl1251_if_operations
  13497. -
  13498. - static int wl1251_spi_probe(struct spi_device *spi)
  13499. - {
  13500. -- struct wl12xx_platform_data *pdata;
  13501. -+ struct wl1251_platform_data *pdata;
  13502. - struct ieee80211_hw *hw;
  13503. - struct wl1251 *wl;
  13504. - int ret;
  13505. diff --git a/package/mac80211/patches/900-wlcore-Add-support-for-DT-platform-data.patch b/package/mac80211/patches/900-wlcore-Add-support-for-DT-platform-data.patch
  13506. new file mode 100644
  13507. index 0000000..856dea8
  13508. --- /dev/null
  13509. +++ b/package/mac80211/patches/900-wlcore-Add-support-for-DT-platform-data.patch
  13510. @@ -0,0 +1,139 @@
  13511. +When running with DT, we no longer have a board file that can set up the
  13512. +platform data for wlcore. Allow this data to be passed from DT.
  13513. +
  13514. +Since some platforms use a gpio-irq, add support for passing either the
  13515. +irq number or the gpio number. For the latter case, the driver will
  13516. +request the gpio and convert it to the irq number. If an irq is
  13517. +specified, it'll be used as is.
  13518. +
  13519. +[Arik - the pdev_data pointer does not belong to us and is freed when
  13520. +the device is released. Dereference to our private data first.]
  13521. +
  13522. +Signed-off-by: Ido Yariv <ido@wizery.com>
  13523. +Signed-off-by: Arik Nemtsov <arik@wizery.com>
  13524. +---
  13525. + drivers/net/wireless/ti/wlcore/sdio.c | 71 ++++++++++++++++++++++++++++++++---
  13526. + include/linux/wl12xx.h | 3 +-
  13527. + 2 files changed, 67 insertions(+), 7 deletions(-)
  13528. +
  13529. +--- a/drivers/net/wireless/ti/wlcore/sdio.c
  13530. ++++ b/drivers/net/wireless/ti/wlcore/sdio.c
  13531. +@@ -34,6 +34,7 @@
  13532. + #include <linux/wl12xx.h>
  13533. + #include <linux/pm_runtime.h>
  13534. + #include <linux/printk.h>
  13535. ++#include <linux/of.h>
  13536. +
  13537. + #include "wlcore.h"
  13538. + #include "wl12xx_80211.h"
  13539. +@@ -214,6 +215,61 @@ static struct wl1271_if_operations sdio_
  13540. + .set_block_size = wl1271_sdio_set_block_size,
  13541. + };
  13542. +
  13543. ++static const struct of_device_id wlcore_of_match[] = {
  13544. ++ {
  13545. ++ .compatible = "wlcore",
  13546. ++ },
  13547. ++ {}
  13548. ++};
  13549. ++MODULE_DEVICE_TABLE(of, wlcore_of_match);
  13550. ++
  13551. ++static struct wl12xx_platform_data *get_platform_data(struct device *dev)
  13552. ++{
  13553. ++ struct wl12xx_platform_data *pdata;
  13554. ++ struct device_node *np;
  13555. ++ u32 gpio;
  13556. ++
  13557. ++ pdata = wl12xx_get_platform_data();
  13558. ++ if (!IS_ERR(pdata))
  13559. ++ return kmemdup(pdata, sizeof(*pdata), GFP_KERNEL);
  13560. ++
  13561. ++ np = of_find_matching_node(NULL, wlcore_of_match);
  13562. ++ if (!np) {
  13563. ++ dev_err(dev, "No platform data set\n");
  13564. ++ return NULL;
  13565. ++ }
  13566. ++
  13567. ++ pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
  13568. ++ if (!pdata) {
  13569. ++ dev_err(dev, "Can't allocate platform data\n");
  13570. ++ return NULL;
  13571. ++ }
  13572. ++
  13573. ++ if (of_property_read_u32(np, "irq", &pdata->irq)) {
  13574. ++ if (!of_property_read_u32(np, "gpio", &gpio) &&
  13575. ++ !gpio_request_one(gpio, GPIOF_IN, "wlcore_irq")) {
  13576. ++ pdata->gpio = gpio;
  13577. ++ pdata->irq = gpio_to_irq(gpio);
  13578. ++ }
  13579. ++ }
  13580. ++
  13581. ++ /* Optional fields */
  13582. ++ pdata->use_eeprom = of_property_read_bool(np, "use-eeprom");
  13583. ++ of_property_read_u32(np, "board-ref-clock", &pdata->board_ref_clock);
  13584. ++ of_property_read_u32(np, "board-tcxo-clock", &pdata->board_tcxo_clock);
  13585. ++ of_property_read_u32(np, "platform-quirks", &pdata->platform_quirks);
  13586. ++
  13587. ++ return pdata;
  13588. ++}
  13589. ++
  13590. ++static void del_platform_data(struct wl12xx_platform_data *pdata)
  13591. ++{
  13592. ++ if (pdata->gpio)
  13593. ++ gpio_free(pdata->gpio);
  13594. ++
  13595. ++ kfree(pdata);
  13596. ++}
  13597. ++
  13598. + static int wl1271_probe(struct sdio_func *func,
  13599. + const struct sdio_device_id *id)
  13600. + {
  13601. +@@ -245,10 +301,10 @@ static int wl1271_probe(struct sdio_func
  13602. + /* Use block mode for transferring over one block size of data */
  13603. + func->card->quirks |= MMC_QUIRK_BLKSZ_FOR_BYTE_MODE;
  13604. +
  13605. +- pdev_data.pdata = wl12xx_get_platform_data();
  13606. +- if (IS_ERR(pdev_data.pdata)) {
  13607. +- ret = PTR_ERR(pdev_data.pdata);
  13608. +- dev_err(glue->dev, "missing wlan platform data: %d\n", ret);
  13609. ++ pdev_data.pdata = get_platform_data(&func->dev);
  13610. ++ if (!pdev_data.pdata) {
  13611. ++ ret = -EINVAL;
  13612. ++ dev_err(glue->dev, "missing wlan platform data\n");
  13613. + goto out_free_glue;
  13614. + }
  13615. +
  13616. +@@ -279,7 +335,7 @@ static int wl1271_probe(struct sdio_func
  13617. + if (!glue->core) {
  13618. + dev_err(glue->dev, "can't allocate platform_device");
  13619. + ret = -ENOMEM;
  13620. +- goto out_free_glue;
  13621. ++ goto out_free_pdata;
  13622. + }
  13623. +
  13624. + glue->core->dev.parent = &func->dev;
  13625. +@@ -313,6 +369,9 @@ static int wl1271_probe(struct sdio_func
  13626. + out_dev_put:
  13627. + platform_device_put(glue->core);
  13628. +
  13629. ++out_free_pdata:
  13630. ++ del_platform_data(pdev_data->pdata);
  13631. ++
  13632. + out_free_glue:
  13633. + kfree(glue);
  13634. +
  13635. +@@ -323,11 +382,14 @@ out:
  13636. + static void wl1271_remove(struct sdio_func *func)
  13637. + {
  13638. + struct wl12xx_sdio_glue *glue = sdio_get_drvdata(func);
  13639. ++ struct wlcore_platdev_data *pdev_data = glue->core->dev.platform_data;
  13640. ++ struct wl12xx_platform_data *pdata = pdev_data->pdata;
  13641. +
  13642. + /* Undo decrement done above in wl1271_probe */
  13643. + pm_runtime_get_noresume(&func->dev);
  13644. +
  13645. + platform_device_unregister(glue->core);
  13646. ++ del_platform_data(pdata);
  13647. + kfree(glue);
  13648. + }
  13649. +
  13650. diff --git a/package/mac80211/patches/901-wlcore-don-t-switch-channels-on-disconnected-STA-vif.patch b/package/mac80211/patches/901-wlcore-don-t-switch-channels-on-disconnected-STA-vif.patch
  13651. new file mode 100644
  13652. index 0000000..d90508e
  13653. --- /dev/null
  13654. +++ b/package/mac80211/patches/901-wlcore-don-t-switch-channels-on-disconnected-STA-vif.patch
  13655. @@ -0,0 +1,36 @@
  13656. +From 4101e8dc540d19f1f6c24930629149191786e4cd Mon Sep 17 00:00:00 2001
  13657. +From: Arik Nemtsov <arik@wizery.com>
  13658. +Date: Mon, 9 Sep 2013 16:48:59 +0300
  13659. +Subject: [PATCH 27/75] wlcore: don't switch channels on disconnected STA vifs
  13660. +
  13661. +Sending the FW a channel switch command on a disconnected vif may result
  13662. +in a beacon loss event. Avoid this edge case.
  13663. +
  13664. +Signed-off-by: Arik Nemtsov <arik@wizery.com>
  13665. +---
  13666. + drivers/net/wireless/ti/wlcore/main.c | 7 +++++++
  13667. + 1 file changed, 7 insertions(+)
  13668. +
  13669. +--- a/drivers/net/wireless/ti/wlcore/main.c
  13670. ++++ b/drivers/net/wireless/ti/wlcore/main.c
  13671. +@@ -5148,6 +5148,10 @@ static void wl12xx_op_channel_switch(str
  13672. + if (unlikely(wl->state == WLCORE_STATE_OFF)) {
  13673. + wl12xx_for_each_wlvif_sta(wl, wlvif) {
  13674. + struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
  13675. ++
  13676. ++ if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
  13677. ++ continue;
  13678. ++
  13679. + ieee80211_chswitch_done(vif, false);
  13680. + }
  13681. + goto out;
  13682. +@@ -5163,6 +5167,9 @@ static void wl12xx_op_channel_switch(str
  13683. + wl12xx_for_each_wlvif_sta(wl, wlvif) {
  13684. + unsigned long delay_usec;
  13685. +
  13686. ++ if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
  13687. ++ continue;
  13688. ++
  13689. + ret = wl->ops->channel_switch(wl, wlvif, ch_switch);
  13690. + if (ret)
  13691. + goto out_sleep;
  13692. diff --git a/package/mac80211/patches/901-wlcore-set-irq_flags-in-the-board-files.patch b/package/mac80211/patches/901-wlcore-set-irq_flags-in-the-board-files.patch
  13693. deleted file mode 100644
  13694. index f2789a9..0000000
  13695. --- a/package/mac80211/patches/901-wlcore-set-irq_flags-in-the-board-files.patch
  13696. +++ /dev/null
  13697. @@ -1,118 +0,0 @@
  13698. -The platform_quirk element in the platform data was used to change the
  13699. -way the IRQ is triggered. When set, the EDGE_IRQ quirk would change
  13700. -the irqflags used and treat edge trigger differently from the rest.
  13701. -
  13702. -Instead of hiding this irq flag setting behind the quirk, have the
  13703. -board files set the flags during initialization. This will be more
  13704. -meaningful than driver-specific quirks when we switch to DT.
  13705. -
  13706. -Additionally, fix missing gpio_request() calls in the boarding files
  13707. -(so that setting the flags actually works).
  13708. -
  13709. -Cc: Tony Lindgren <tony@atomide.com>
  13710. -Cc: Sekhar Nori <nsekhar@ti.com>
  13711. -Signed-off-by: Luciano Coelho <coelho@ti.com>
  13712. -Reviewed-by: Felipe Balbi <balbi@ti.com>
  13713. -Acked-by: Sekhar Nori <nsekhar@ti.com>
  13714. -
  13715. ---- a/drivers/net/wireless/ti/wlcore/debugfs.c
  13716. -+++ b/drivers/net/wireless/ti/wlcore/debugfs.c
  13717. -@@ -502,7 +502,7 @@ static ssize_t driver_state_read(struct
  13718. - DRIVER_STATE_PRINT_HEX(irq);
  13719. - /* TODO: ref_clock and tcxo_clock were moved to wl12xx priv */
  13720. - DRIVER_STATE_PRINT_HEX(hw_pg_ver);
  13721. -- DRIVER_STATE_PRINT_HEX(platform_quirks);
  13722. -+ DRIVER_STATE_PRINT_HEX(irq_flags);
  13723. - DRIVER_STATE_PRINT_HEX(chip.id);
  13724. - DRIVER_STATE_PRINT_STR(chip.fw_ver_str);
  13725. - DRIVER_STATE_PRINT_STR(chip.phy_fw_ver_str);
  13726. ---- a/drivers/net/wireless/ti/wlcore/main.c
  13727. -+++ b/drivers/net/wireless/ti/wlcore/main.c
  13728. -@@ -27,6 +27,7 @@
  13729. - #include <linux/vmalloc.h>
  13730. - #include <linux/wl12xx.h>
  13731. - #include <linux/interrupt.h>
  13732. -+#include <linux/irq.h>
  13733. -
  13734. - #include "wlcore.h"
  13735. - #include "debug.h"
  13736. -@@ -528,7 +529,7 @@ static int wlcore_irq_locked(struct wl12
  13737. - * In case edge triggered interrupt must be used, we cannot iterate
  13738. - * more than once without introducing race conditions with the hardirq.
  13739. - */
  13740. -- if (wl->platform_quirks & WL12XX_PLATFORM_QUIRK_EDGE_IRQ)
  13741. -+ if (wl->irq_flags & IRQF_TRIGGER_RISING)
  13742. - loopcount = 1;
  13743. -
  13744. - wl1271_debug(DEBUG_IRQ, "IRQ work");
  13745. -@@ -5934,7 +5935,6 @@ struct ieee80211_hw *wlcore_alloc_hw(siz
  13746. - wl->ap_ps_map = 0;
  13747. - wl->ap_fw_ps_map = 0;
  13748. - wl->quirks = 0;
  13749. -- wl->platform_quirks = 0;
  13750. - wl->system_hlid = WL12XX_SYSTEM_HLID;
  13751. - wl->active_sta_count = 0;
  13752. - wl->active_link_count = 0;
  13753. -@@ -6075,7 +6075,7 @@ static void wlcore_nvs_cb(const struct f
  13754. - struct platform_device *pdev = wl->pdev;
  13755. - struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
  13756. - struct wl12xx_platform_data *pdata = pdev_data->pdata;
  13757. -- unsigned long irqflags;
  13758. -+
  13759. - int ret;
  13760. - irq_handler_t hardirq_fn = NULL;
  13761. -
  13762. -@@ -6103,29 +6103,19 @@ static void wlcore_nvs_cb(const struct f
  13763. - wlcore_adjust_conf(wl);
  13764. -
  13765. - wl->irq = platform_get_irq(pdev, 0);
  13766. -- wl->platform_quirks = pdata->platform_quirks;
  13767. - wl->if_ops = pdev_data->if_ops;
  13768. -
  13769. --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,32)
  13770. -- irqflags = IRQF_TRIGGER_RISING;
  13771. -+ wl->irq_flags = irq_get_trigger_type(wl->irq) | IRQF_ONESHOT;
  13772. - hardirq_fn = wlcore_hardirq;
  13773. --#else
  13774. -- if (wl->platform_quirks & WL12XX_PLATFORM_QUIRK_EDGE_IRQ) {
  13775. -- irqflags = IRQF_TRIGGER_RISING;
  13776. -- hardirq_fn = wlcore_hardirq;
  13777. -- } else {
  13778. -- irqflags = IRQF_TRIGGER_HIGH | IRQF_ONESHOT;
  13779. -- }
  13780. --#endif
  13781. -
  13782. - #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,31)
  13783. - ret = compat_request_threaded_irq(&wl->irq_compat, wl->irq,
  13784. - hardirq_fn, wlcore_irq,
  13785. -- irqflags,
  13786. -+ wl->irqflags,
  13787. - pdev->name, wl);
  13788. - #else
  13789. - ret = request_threaded_irq(wl->irq, hardirq_fn, wlcore_irq,
  13790. -- irqflags, pdev->name, wl);
  13791. -+ wl->irq_flags, pdev->name, wl);
  13792. - #endif
  13793. - if (ret < 0) {
  13794. - wl1271_error("request_irq() failed: %d", ret);
  13795. ---- a/drivers/net/wireless/ti/wlcore/wlcore.h
  13796. -+++ b/drivers/net/wireless/ti/wlcore/wlcore.h
  13797. -@@ -188,6 +188,8 @@ struct wl1271 {
  13798. -
  13799. - int irq;
  13800. -
  13801. -+ int irq_flags;
  13802. -+
  13803. - spinlock_t wl_lock;
  13804. -
  13805. - enum wlcore_state state;
  13806. -@@ -395,9 +397,6 @@ struct wl1271 {
  13807. - /* Quirks of specific hardware revisions */
  13808. - unsigned int quirks;
  13809. -
  13810. -- /* Platform limitations */
  13811. -- unsigned int platform_quirks;
  13812. --
  13813. - /* number of currently active RX BA sessions */
  13814. - int ba_rx_session_count;
  13815. -
  13816. diff --git a/package/mac80211/patches/902-wlcore-remove-pwr_in_suspend-from-platform-data.patch b/package/mac80211/patches/902-wlcore-remove-pwr_in_suspend-from-platform-data.patch
  13817. deleted file mode 100644
  13818. index 6394377..0000000
  13819. --- a/package/mac80211/patches/902-wlcore-remove-pwr_in_suspend-from-platform-data.patch
  13820. +++ /dev/null
  13821. @@ -1,48 +0,0 @@
  13822. -The pwr_in_suspend flag depends on the MMC settings which can be
  13823. -retrieved from the SDIO subsystem, so it doesn't need to be part of
  13824. -the platform data structure. Move it to the platform device data that
  13825. -is passed from SDIO to wlcore.
  13826. -
  13827. -Signed-off-by: Luciano Coelho <coelho@ti.com>
  13828. -Reviewed-by: Felipe Balbi <balbi@ti.com>
  13829. -
  13830. ---- a/drivers/net/wireless/ti/wlcore/main.c
  13831. -+++ b/drivers/net/wireless/ti/wlcore/main.c
  13832. -@@ -6074,7 +6074,6 @@ static void wlcore_nvs_cb(const struct f
  13833. - struct wl1271 *wl = context;
  13834. - struct platform_device *pdev = wl->pdev;
  13835. - struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
  13836. -- struct wl12xx_platform_data *pdata = pdev_data->pdata;
  13837. -
  13838. - int ret;
  13839. - irq_handler_t hardirq_fn = NULL;
  13840. -@@ -6127,7 +6126,7 @@ static void wlcore_nvs_cb(const struct f
  13841. - if (!ret) {
  13842. - wl->irq_wake_enabled = true;
  13843. - device_init_wakeup(wl->dev, 1);
  13844. -- if (pdata->pwr_in_suspend)
  13845. -+ if (pdev_data->pwr_in_suspend)
  13846. - wl->hw->wiphy->wowlan = &wlcore_wowlan_support;
  13847. - }
  13848. - #endif
  13849. ---- a/drivers/net/wireless/ti/wlcore/sdio.c
  13850. -+++ b/drivers/net/wireless/ti/wlcore/sdio.c
  13851. -@@ -260,7 +260,7 @@ static int wl1271_probe(struct sdio_func
  13852. - dev_dbg(glue->dev, "sdio PM caps = 0x%x\n", mmcflags);
  13853. -
  13854. - if (mmcflags & MMC_PM_KEEP_POWER)
  13855. -- pdev_data->pdata->pwr_in_suspend = true;
  13856. -+ pdev_data->pwr_in_suspend = true;
  13857. -
  13858. - sdio_set_drvdata(func, glue);
  13859. -
  13860. ---- a/drivers/net/wireless/ti/wlcore/wlcore_i.h
  13861. -+++ b/drivers/net/wireless/ti/wlcore/wlcore_i.h
  13862. -@@ -209,6 +209,7 @@ struct wl1271_if_operations {
  13863. - struct wlcore_platdev_data {
  13864. - struct wl12xx_platform_data *pdata;
  13865. - struct wl1271_if_operations *if_ops;
  13866. -+ bool pwr_in_suspend;
  13867. - };
  13868. -
  13869. - #define MAX_NUM_KEYS 14
  13870. diff --git a/package/mac80211/patches/903-wl12xx-use-frequency-instead-of-enumerations-for-pdata-clocks.patch b/package/mac80211/patches/903-wl12xx-use-frequency-instead-of-enumerations-for-pdata-clocks.patch
  13871. deleted file mode 100644
  13872. index 4b20932..0000000
  13873. --- a/package/mac80211/patches/903-wl12xx-use-frequency-instead-of-enumerations-for-pdata-clocks.patch
  13874. +++ /dev/null
  13875. @@ -1,131 +0,0 @@
  13876. -Instead of defining an enumeration with the FW specific values for the
  13877. -different clock rates, use the actual frequency instead. Also add a
  13878. -boolean to specify whether the clock is XTAL or not.
  13879. -
  13880. -Change all board files to reflect this.
  13881. -
  13882. -Additionally, this reverts commit 26f45c (ARM: OMAP2+: Legacy support
  13883. -for wl12xx when booted with devicetree), since this is not be needed
  13884. -anymore, now that DT support for WiLink is implemented.
  13885. -
  13886. -Cc: Tony Lindgren <tony@atomide.com>
  13887. -Cc: Sekhar Nori <nsekhar@ti.com>
  13888. -Signed-off-by: Luciano Coelho <coelho@ti.com>
  13889. -Reviewed-by: Felipe Balbi <balbi@ti.com>
  13890. -
  13891. ---- a/drivers/net/wireless/ti/wl12xx/main.c
  13892. -+++ b/drivers/net/wireless/ti/wl12xx/main.c
  13893. -@@ -1711,6 +1711,43 @@ static struct ieee80211_sta_ht_cap wl12x
  13894. - },
  13895. - };
  13896. -
  13897. -+static const struct wl12xx_clock wl12xx_refclock_table[] = {
  13898. -+ { 19200000, false, WL12XX_REFCLOCK_19 },
  13899. -+ { 26000000, false, WL12XX_REFCLOCK_26 },
  13900. -+ { 26000000, true, WL12XX_REFCLOCK_26_XTAL },
  13901. -+ { 38400000, false, WL12XX_REFCLOCK_38 },
  13902. -+ { 38400000, true, WL12XX_REFCLOCK_38_XTAL },
  13903. -+ { 52000000, false, WL12XX_REFCLOCK_52 },
  13904. -+ { 0, false, 0 }
  13905. -+};
  13906. -+
  13907. -+static const struct wl12xx_clock wl12xx_tcxoclock_table[] = {
  13908. -+ { 16368000, true, WL12XX_TCXOCLOCK_16_368 },
  13909. -+ { 16800000, true, WL12XX_TCXOCLOCK_16_8 },
  13910. -+ { 19200000, true, WL12XX_TCXOCLOCK_19_2 },
  13911. -+ { 26000000, true, WL12XX_TCXOCLOCK_26 },
  13912. -+ { 32736000, true, WL12XX_TCXOCLOCK_32_736 },
  13913. -+ { 33600000, true, WL12XX_TCXOCLOCK_33_6 },
  13914. -+ { 38400000, true, WL12XX_TCXOCLOCK_38_4 },
  13915. -+ { 52000000, true, WL12XX_TCXOCLOCK_52 },
  13916. -+ { 0, false, 0 }
  13917. -+};
  13918. -+
  13919. -+static int wl12xx_get_clock_idx(const struct wl12xx_clock *table,
  13920. -+ u32 freq, bool xtal)
  13921. -+{
  13922. -+ int i = 0;
  13923. -+
  13924. -+ while(table[i].freq != 0) {
  13925. -+ if ((table[i].freq == freq) &&
  13926. -+ (table[i].xtal == xtal))
  13927. -+ return table[i].hw_idx;
  13928. -+ i++;
  13929. -+ };
  13930. -+
  13931. -+ return -EINVAL;
  13932. -+}
  13933. -+
  13934. - static int wl12xx_setup(struct wl1271 *wl)
  13935. - {
  13936. - struct wl12xx_priv *priv = wl->priv;
  13937. -@@ -1732,7 +1769,16 @@ static int wl12xx_setup(struct wl1271 *w
  13938. - wl12xx_conf_init(wl);
  13939. -
  13940. - if (!fref_param) {
  13941. -- priv->ref_clock = pdata->board_ref_clock;
  13942. -+ priv->ref_clock = wl12xx_get_clock_idx(wl12xx_refclock_table,
  13943. -+ pdata->ref_clock_freq,
  13944. -+ pdata->ref_clock_xtal);
  13945. -+ if (priv->ref_clock < 0) {
  13946. -+ wl1271_error("Invalid ref_clock frequency (%d Hz, %s)",
  13947. -+ pdata->ref_clock_freq,
  13948. -+ pdata->ref_clock_xtal ? "XTAL" : "not XTAL");
  13949. -+
  13950. -+ return priv->ref_clock;
  13951. -+ }
  13952. - } else {
  13953. - if (!strcmp(fref_param, "19.2"))
  13954. - priv->ref_clock = WL12XX_REFCLOCK_19;
  13955. -@@ -1751,7 +1797,15 @@ static int wl12xx_setup(struct wl1271 *w
  13956. - }
  13957. -
  13958. - if (!tcxo_param) {
  13959. -- priv->tcxo_clock = pdata->board_tcxo_clock;
  13960. -+ priv->tcxo_clock = wl12xx_get_clock_idx(wl12xx_tcxoclock_table,
  13961. -+ pdata->tcxo_clock_freq,
  13962. -+ true);
  13963. -+ if (priv->tcxo_clock < 0) {
  13964. -+ wl1271_error("Invalid tcxo_clock frequency (%d Hz)",
  13965. -+ pdata->tcxo_clock_freq);
  13966. -+
  13967. -+ return priv->tcxo_clock;
  13968. -+ }
  13969. - } else {
  13970. - if (!strcmp(tcxo_param, "19.2"))
  13971. - priv->tcxo_clock = WL12XX_TCXOCLOCK_19_2;
  13972. ---- a/drivers/net/wireless/ti/wl12xx/wl12xx.h
  13973. -+++ b/drivers/net/wireless/ti/wl12xx/wl12xx.h
  13974. -@@ -79,4 +79,32 @@ struct wl12xx_priv {
  13975. - struct wl127x_rx_mem_pool_addr *rx_mem_addr;
  13976. - };
  13977. -
  13978. -+/* Reference clock values */
  13979. -+enum {
  13980. -+ WL12XX_REFCLOCK_19 = 0, /* 19.2 MHz */
  13981. -+ WL12XX_REFCLOCK_26 = 1, /* 26 MHz */
  13982. -+ WL12XX_REFCLOCK_38 = 2, /* 38.4 MHz */
  13983. -+ WL12XX_REFCLOCK_52 = 3, /* 52 MHz */
  13984. -+ WL12XX_REFCLOCK_38_XTAL = 4, /* 38.4 MHz, XTAL */
  13985. -+ WL12XX_REFCLOCK_26_XTAL = 5, /* 26 MHz, XTAL */
  13986. -+};
  13987. -+
  13988. -+/* TCXO clock values */
  13989. -+enum {
  13990. -+ WL12XX_TCXOCLOCK_19_2 = 0, /* 19.2MHz */
  13991. -+ WL12XX_TCXOCLOCK_26 = 1, /* 26 MHz */
  13992. -+ WL12XX_TCXOCLOCK_38_4 = 2, /* 38.4MHz */
  13993. -+ WL12XX_TCXOCLOCK_52 = 3, /* 52 MHz */
  13994. -+ WL12XX_TCXOCLOCK_16_368 = 4, /* 16.368 MHz */
  13995. -+ WL12XX_TCXOCLOCK_32_736 = 5, /* 32.736 MHz */
  13996. -+ WL12XX_TCXOCLOCK_16_8 = 6, /* 16.8 MHz */
  13997. -+ WL12XX_TCXOCLOCK_33_6 = 7, /* 33.6 MHz */
  13998. -+};
  13999. -+
  14000. -+struct wl12xx_clock {
  14001. -+ u32 freq;
  14002. -+ bool xtal;
  14003. -+ u8 hw_idx;
  14004. -+};
  14005. -+
  14006. - #endif /* __WL12XX_PRIV_H__ */
  14007. diff --git a/package/mac80211/patches/904-wlcore-add-initial-device-tree-support-to-the-sdio-module.patch b/package/mac80211/patches/904-wlcore-add-initial-device-tree-support-to-the-sdio-module.patch
  14008. deleted file mode 100644
  14009. index 9e1d190..0000000
  14010. --- a/package/mac80211/patches/904-wlcore-add-initial-device-tree-support-to-the-sdio-module.patch
  14011. +++ /dev/null
  14012. @@ -1,118 +0,0 @@
  14013. -If platform data is not available, try to get the required information
  14014. -from the device tree. Register an OF match table and parse the
  14015. -appropriate device tree nodes.
  14016. -
  14017. -Parse interrupt property only, for now.
  14018. -
  14019. -Signed-off-by: Luciano Coelho <coelho@ti.com>
  14020. -Reviewed-by: Felipe Balbi <balbi@ti.com>
  14021. -
  14022. ---- a/drivers/net/wireless/ti/wlcore/sdio.c
  14023. -+++ b/drivers/net/wireless/ti/wlcore/sdio.c
  14024. -@@ -30,7 +30,7 @@
  14025. - #include <linux/mmc/sdio_ids.h>
  14026. - #include <linux/mmc/card.h>
  14027. - #include <linux/mmc/host.h>
  14028. --#include <linux/gpio.h>
  14029. -+#include <linux/of_irq.h>
  14030. - #include <linux/wl12xx.h>
  14031. - #include <linux/pm_runtime.h>
  14032. - #include <linux/printk.h>
  14033. -@@ -214,6 +214,43 @@ static struct wl1271_if_operations sdio_
  14034. - .set_block_size = wl1271_sdio_set_block_size,
  14035. - };
  14036. -
  14037. -+static struct wl12xx_platform_data *wlcore_get_pdata_from_of(struct device *dev)
  14038. -+{
  14039. -+ struct wl12xx_platform_data *pdata;
  14040. -+ struct device_node *np = dev->of_node;
  14041. -+
  14042. -+ if (!np) {
  14043. -+ np = of_find_matching_node(NULL, dev->driver->of_match_table);
  14044. -+ if (!np) {
  14045. -+ dev_notice(dev, "device tree node not available\n");
  14046. -+ pdata = ERR_PTR(-ENODEV);
  14047. -+ goto out;
  14048. -+ }
  14049. -+ }
  14050. -+
  14051. -+ pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
  14052. -+ if (!pdata) {
  14053. -+ dev_err(dev, "can't allocate platform data\n");
  14054. -+ pdata = ERR_PTR(-ENODEV);
  14055. -+ goto out;
  14056. -+ }
  14057. -+
  14058. -+ pdata->irq = irq_of_parse_and_map(np, 0);
  14059. -+ if (pdata->irq < 0) {
  14060. -+ dev_err(dev, "can't get interrupt gpio from the device tree\n");
  14061. -+ goto out_free;
  14062. -+ }
  14063. -+
  14064. -+ goto out;
  14065. -+
  14066. -+out_free:
  14067. -+ kfree(pdata);
  14068. -+ pdata = ERR_PTR(-ENODEV);
  14069. -+
  14070. -+out:
  14071. -+ return pdata;
  14072. -+}
  14073. -+
  14074. - static int wl1271_probe(struct sdio_func *func,
  14075. - const struct sdio_device_id *id)
  14076. - {
  14077. -@@ -248,11 +285,22 @@ static int wl1271_probe(struct sdio_func
  14078. - /* Use block mode for transferring over one block size of data */
  14079. - func->card->quirks |= MMC_QUIRK_BLKSZ_FOR_BYTE_MODE;
  14080. -
  14081. -+ /* The pdata allocated here is freed when the device is freed,
  14082. -+ * so we don't need an additional out label to free it in case
  14083. -+ * of error further on.
  14084. -+ */
  14085. -+
  14086. -+ /* Try to get legacy platform data from the board file */
  14087. - pdev_data->pdata = wl12xx_get_platform_data();
  14088. - if (IS_ERR(pdev_data->pdata)) {
  14089. -- ret = PTR_ERR(pdev_data->pdata);
  14090. -- dev_err(glue->dev, "missing wlan platform data: %d\n", ret);
  14091. -- goto out_free_glue;
  14092. -+ dev_info(&func->dev,
  14093. -+ "legacy platform data not found, trying device tree\n");
  14094. -+
  14095. -+ pdev_data->pdata = wlcore_get_pdata_from_of(&func->dev);
  14096. -+ if (IS_ERR(pdev_data->pdata)) {
  14097. -+ dev_err(&func->dev, "can't get platform data\n");
  14098. -+ goto out_free_glue;
  14099. -+ }
  14100. - }
  14101. -
  14102. - /* if sdio can keep power while host is suspended, enable wow */
  14103. -@@ -386,16 +434,25 @@ static const struct dev_pm_ops wl1271_sd
  14104. - };
  14105. - #endif
  14106. -
  14107. -+static const struct of_device_id wlcore_sdio_of_match_table[] = {
  14108. -+ { .compatible = "ti,wilink6" },
  14109. -+ { .compatible = "ti,wilink7" },
  14110. -+ { .compatible = "ti,wilink8" },
  14111. -+ { }
  14112. -+};
  14113. -+MODULE_DEVICE_TABLE(of, wlcore_sdio_of_match_table);
  14114. -+
  14115. - static struct sdio_driver wl1271_sdio_driver = {
  14116. - .name = "wl1271_sdio",
  14117. - .id_table = wl1271_devices,
  14118. - .probe = wl1271_probe,
  14119. - .remove = wl1271_remove,
  14120. --#ifdef CONFIG_PM
  14121. - .drv = {
  14122. -+#ifdef CONFIG_PM
  14123. - .pm = &wl1271_sdio_pm_ops,
  14124. -- },
  14125. - #endif
  14126. -+ .of_match_table = of_match_ptr(wlcore_sdio_of_match_table),
  14127. -+ },
  14128. - };
  14129. -
  14130. - static int __init wl1271_init(void)
  14131. diff --git a/package/mac80211/patches/905-wlcore-sdio-add-wilink-clock-providers.patch b/package/mac80211/patches/905-wlcore-sdio-add-wilink-clock-providers.patch
  14132. deleted file mode 100644
  14133. index be1f9ad..0000000
  14134. --- a/package/mac80211/patches/905-wlcore-sdio-add-wilink-clock-providers.patch
  14135. +++ /dev/null
  14136. @@ -1,50 +0,0 @@
  14137. -Add refclock and tcxoclock as clock providers in WiLink. These clocks
  14138. -are not accesible outside the WiLink module, but they are registered
  14139. -in the clock framework anyway. Only the WiLink chip consumes these
  14140. -clocks.
  14141. -
  14142. -In theory, the WiLink chip could be connected to external clocks
  14143. -instead of using these internal clocks, so make the clock consumer
  14144. -code generic enough. If external clocks are used, then the internal
  14145. -clock device tree nodes are not necessary, but the external ones must
  14146. -be specified.
  14147. -
  14148. -Signed-off-by: Luciano Coelho <coelho@ti.com>
  14149. -Reviewed-by: Felipe Balbi <balbi@ti.com>
  14150. -
  14151. ---- a/drivers/net/wireless/ti/wlcore/sdio.c
  14152. -+++ b/drivers/net/wireless/ti/wlcore/sdio.c
  14153. -@@ -34,6 +34,7 @@
  14154. - #include <linux/wl12xx.h>
  14155. - #include <linux/pm_runtime.h>
  14156. - #include <linux/printk.h>
  14157. -+#include <linux/clk-provider.h>
  14158. -
  14159. - #include "wlcore.h"
  14160. - #include "wl12xx_80211.h"
  14161. -@@ -214,10 +215,15 @@ static struct wl1271_if_operations sdio_
  14162. - .set_block_size = wl1271_sdio_set_block_size,
  14163. - };
  14164. -
  14165. -+static const struct of_device_id wlcore_sdio_of_clk_match_table[] = {
  14166. -+ { .compatible = "ti,wilink-clock" },
  14167. -+};
  14168. -+
  14169. - static struct wl12xx_platform_data *wlcore_get_pdata_from_of(struct device *dev)
  14170. - {
  14171. - struct wl12xx_platform_data *pdata;
  14172. - struct device_node *np = dev->of_node;
  14173. -+ struct device_node *clock_node;
  14174. -
  14175. - if (!np) {
  14176. - np = of_find_matching_node(NULL, dev->driver->of_match_table);
  14177. -@@ -241,6 +247,9 @@ static struct wl12xx_platform_data *wlco
  14178. - goto out_free;
  14179. - }
  14180. -
  14181. -+ for_each_matching_node(clock_node, wlcore_sdio_of_clk_match_table)
  14182. -+ of_fixed_clk_setup(clock_node);
  14183. -+
  14184. - goto out;
  14185. -
  14186. - out_free:
  14187. diff --git a/package/mac80211/patches/906-wlcore-sdio-get-clocks-from-device-tree.patch b/package/mac80211/patches/906-wlcore-sdio-get-clocks-from-device-tree.patch
  14188. deleted file mode 100644
  14189. index 09ff4af..0000000
  14190. --- a/package/mac80211/patches/906-wlcore-sdio-get-clocks-from-device-tree.patch
  14191. +++ /dev/null
  14192. @@ -1,90 +0,0 @@
  14193. -Read the clock nodes from the device tree and use them to set the
  14194. -frequency for the refclock and the tcxo clock.
  14195. -
  14196. -Also, call sdio_set_drvdata() earlier, so the glue is already set in
  14197. -the driver data when we call wlcore_get_pdata_from_of() and we don't
  14198. -need to pass it as a parameter.
  14199. -
  14200. -Signed-off-by: Luciano Coelho <coelho@ti.com>
  14201. -Reviewed-by: Felipe Balbi <balbi@ti.com>
  14202. -
  14203. ---- a/drivers/net/wireless/ti/wlcore/sdio.c
  14204. -+++ b/drivers/net/wireless/ti/wlcore/sdio.c
  14205. -@@ -53,6 +53,7 @@ static bool dump = false;
  14206. - struct wl12xx_sdio_glue {
  14207. - struct device *dev;
  14208. - struct platform_device *core;
  14209. -+ struct clk *refclock, *tcxoclock;
  14210. - };
  14211. -
  14212. - static const struct sdio_device_id wl1271_devices[] = {
  14213. -@@ -224,6 +225,7 @@ static struct wl12xx_platform_data *wlco
  14214. - struct wl12xx_platform_data *pdata;
  14215. - struct device_node *np = dev->of_node;
  14216. - struct device_node *clock_node;
  14217. -+ struct wl12xx_sdio_glue *glue = sdio_get_drvdata(dev_to_sdio_func(dev));
  14218. -
  14219. - if (!np) {
  14220. - np = of_find_matching_node(NULL, dev->driver->of_match_table);
  14221. -@@ -250,6 +252,26 @@ static struct wl12xx_platform_data *wlco
  14222. - for_each_matching_node(clock_node, wlcore_sdio_of_clk_match_table)
  14223. - of_fixed_clk_setup(clock_node);
  14224. -
  14225. -+ /* TODO: make sure we have this when needed (ie. for WL6 and WL7) */
  14226. -+ glue->refclock = of_clk_get_by_name(np, "refclock");
  14227. -+ if (IS_ERR(glue->refclock)) {
  14228. -+ dev_err(dev, "couldn't find refclock on the device tree\n");
  14229. -+ glue->refclock = NULL;
  14230. -+ } else {
  14231. -+ clk_prepare_enable(glue->refclock);
  14232. -+ pdata->ref_clock_freq = clk_get_rate(glue->refclock);
  14233. -+ }
  14234. -+
  14235. -+ /* TODO: make sure we have this when needed (ie. for WL7) */
  14236. -+ glue->tcxoclock = of_clk_get_by_name(np, "tcxoclock");
  14237. -+ if (IS_ERR(glue->tcxoclock)) {
  14238. -+ dev_err(dev, "couldn't find tcxoclock on the device tree\n");
  14239. -+ glue->tcxoclock = NULL;
  14240. -+ } else {
  14241. -+ clk_prepare_enable(glue->tcxoclock);
  14242. -+ pdata->ref_clock_freq = clk_get_rate(glue->tcxoclock);
  14243. -+ }
  14244. -+
  14245. - goto out;
  14246. -
  14247. - out_free:
  14248. -@@ -294,6 +316,8 @@ static int wl1271_probe(struct sdio_func
  14249. - /* Use block mode for transferring over one block size of data */
  14250. - func->card->quirks |= MMC_QUIRK_BLKSZ_FOR_BYTE_MODE;
  14251. -
  14252. -+ sdio_set_drvdata(func, glue);
  14253. -+
  14254. - /* The pdata allocated here is freed when the device is freed,
  14255. - * so we don't need an additional out label to free it in case
  14256. - * of error further on.
  14257. -@@ -319,8 +343,6 @@ static int wl1271_probe(struct sdio_func
  14258. - if (mmcflags & MMC_PM_KEEP_POWER)
  14259. - pdev_data->pwr_in_suspend = true;
  14260. -
  14261. -- sdio_set_drvdata(func, glue);
  14262. --
  14263. - /* Tell PM core that we don't need the card to be powered now */
  14264. - pm_runtime_put_noidle(&func->dev);
  14265. -
  14266. -@@ -387,6 +409,16 @@ static void wl1271_remove(struct sdio_fu
  14267. - {
  14268. - struct wl12xx_sdio_glue *glue = sdio_get_drvdata(func);
  14269. -
  14270. -+ if (glue->refclock) {
  14271. -+ clk_disable_unprepare(glue->refclock);
  14272. -+ clk_put(glue->refclock);
  14273. -+ }
  14274. -+
  14275. -+ if (glue->tcxoclock) {
  14276. -+ clk_disable_unprepare(glue->tcxoclock);
  14277. -+ clk_put(glue->tcxoclock);
  14278. -+ }
  14279. -+
  14280. - /* Undo decrement done above in wl1271_probe */
  14281. - pm_runtime_get_noresume(&func->dev);
  14282. -
  14283. diff --git a/package/mac80211/patches/907-wlcore-wl12xx-check-if-we-got-correct-clock-data-from-DT.patch b/package/mac80211/patches/907-wlcore-wl12xx-check-if-we-got-correct-clock-data-from-DT.patch
  14284. deleted file mode 100644
  14285. index 6b09177..0000000
  14286. --- a/package/mac80211/patches/907-wlcore-wl12xx-check-if-we-got-correct-clock-data-from-DT.patch
  14287. +++ /dev/null
  14288. @@ -1,96 +0,0 @@
  14289. -The fref and the tcxo clocks settings are optional in some platforms.
  14290. -WiLink8 doesn't need either, so we don't check the values. WiLink 6
  14291. -only needs the fref clock, so we check that it is valid or return with
  14292. -an error. WiLink7 needs both clocks, if either is not available we
  14293. -return with an error.
  14294. -
  14295. -Signed-off-by: Luciano Coelho <coelho@ti.com>
  14296. -Reviewed-by: Felipe Balbi <balbi@ti.com>
  14297. -
  14298. ---- a/drivers/net/wireless/ti/wl12xx/main.c
  14299. -+++ b/drivers/net/wireless/ti/wl12xx/main.c
  14300. -@@ -930,6 +930,11 @@ static int wl128x_boot_clk(struct wl1271
  14301. - u16 sys_clk_cfg;
  14302. - int ret;
  14303. -
  14304. -+ if ((priv->ref_clock < 0) || (priv->tcxo_clock < 0)) {
  14305. -+ wl1271_error("Missing fref and/or tcxo clock settings\n");
  14306. -+ return -EINVAL;
  14307. -+ }
  14308. -+
  14309. - /* For XTAL-only modes, FREF will be used after switching from TCXO */
  14310. - if (priv->ref_clock == WL12XX_REFCLOCK_26_XTAL ||
  14311. - priv->ref_clock == WL12XX_REFCLOCK_38_XTAL) {
  14312. -@@ -979,6 +984,11 @@ static int wl127x_boot_clk(struct wl1271
  14313. - u32 clk;
  14314. - int ret;
  14315. -
  14316. -+ if (priv->ref_clock < 0) {
  14317. -+ wl1271_error("Missing fref clock settings\n");
  14318. -+ return -EINVAL;
  14319. -+ }
  14320. -+
  14321. - if (WL127X_PG_GET_MAJOR(wl->hw_pg_ver) < 3)
  14322. - wl->quirks |= WLCORE_QUIRK_END_OF_TRANSACTION;
  14323. -
  14324. -@@ -1768,7 +1778,7 @@ static int wl12xx_setup(struct wl1271 *w
  14325. - wlcore_set_ht_cap(wl, IEEE80211_BAND_5GHZ, &wl12xx_ht_cap);
  14326. - wl12xx_conf_init(wl);
  14327. -
  14328. -- if (!fref_param) {
  14329. -+ if (!fref_param && (pdata->ref_clock_freq > 0)) {
  14330. - priv->ref_clock = wl12xx_get_clock_idx(wl12xx_refclock_table,
  14331. - pdata->ref_clock_freq,
  14332. - pdata->ref_clock_xtal);
  14333. -@@ -1779,6 +1789,8 @@ static int wl12xx_setup(struct wl1271 *w
  14334. -
  14335. - return priv->ref_clock;
  14336. - }
  14337. -+ } else if (!fref_param) {
  14338. -+ priv->ref_clock = -EINVAL;
  14339. - } else {
  14340. - if (!strcmp(fref_param, "19.2"))
  14341. - priv->ref_clock = WL12XX_REFCLOCK_19;
  14342. -@@ -1796,7 +1808,7 @@ static int wl12xx_setup(struct wl1271 *w
  14343. - wl1271_error("Invalid fref parameter %s", fref_param);
  14344. - }
  14345. -
  14346. -- if (!tcxo_param) {
  14347. -+ if (!fref_param && (pdata->tcxo_clock_freq > 0)) {
  14348. - priv->tcxo_clock = wl12xx_get_clock_idx(wl12xx_tcxoclock_table,
  14349. - pdata->tcxo_clock_freq,
  14350. - true);
  14351. -@@ -1806,7 +1818,9 @@ static int wl12xx_setup(struct wl1271 *w
  14352. -
  14353. - return priv->tcxo_clock;
  14354. - }
  14355. -- } else {
  14356. -+ } else if (!fref_param) {
  14357. -+ priv->tcxo_clock = -EINVAL;
  14358. -+ }else {
  14359. - if (!strcmp(tcxo_param, "19.2"))
  14360. - priv->tcxo_clock = WL12XX_TCXOCLOCK_19_2;
  14361. - else if (!strcmp(tcxo_param, "26"))
  14362. ---- a/drivers/net/wireless/ti/wlcore/sdio.c
  14363. -+++ b/drivers/net/wireless/ti/wlcore/sdio.c
  14364. -@@ -252,20 +252,16 @@ static struct wl12xx_platform_data *wlco
  14365. - for_each_matching_node(clock_node, wlcore_sdio_of_clk_match_table)
  14366. - of_fixed_clk_setup(clock_node);
  14367. -
  14368. -- /* TODO: make sure we have this when needed (ie. for WL6 and WL7) */
  14369. - glue->refclock = of_clk_get_by_name(np, "refclock");
  14370. - if (IS_ERR(glue->refclock)) {
  14371. -- dev_err(dev, "couldn't find refclock on the device tree\n");
  14372. - glue->refclock = NULL;
  14373. - } else {
  14374. - clk_prepare_enable(glue->refclock);
  14375. - pdata->ref_clock_freq = clk_get_rate(glue->refclock);
  14376. - }
  14377. -
  14378. -- /* TODO: make sure we have this when needed (ie. for WL7) */
  14379. - glue->tcxoclock = of_clk_get_by_name(np, "tcxoclock");
  14380. - if (IS_ERR(glue->tcxoclock)) {
  14381. -- dev_err(dev, "couldn't find tcxoclock on the device tree\n");
  14382. - glue->tcxoclock = NULL;
  14383. - } else {
  14384. - clk_prepare_enable(glue->tcxoclock);
  14385. diff --git a/package/mac80211/patches/a01-compat_fix_compile.patch b/package/mac80211/patches/a01-compat_fix_compile.patch
  14386. new file mode 100644
  14387. index 0000000..9e9e6c7
  14388. --- /dev/null
  14389. +++ b/package/mac80211/patches/a01-compat_fix_compile.patch
  14390. @@ -0,0 +1,15 @@
  14391. +--- a/compat/compat-3.6.c
  14392. ++++ b/compat/compat-3.6.c
  14393. +@@ -148,6 +148,7 @@ int sg_alloc_table_from_pages(struct sg_
  14394. + }
  14395. + EXPORT_SYMBOL_GPL(sg_alloc_table_from_pages);
  14396. +
  14397. ++#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,4,0))
  14398. + /* whoopsie ! */
  14399. + #ifndef CONFIG_COMMON_CLK
  14400. + int clk_enable(struct clk *clk)
  14401. +@@ -161,3 +162,4 @@ void clk_disable(struct clk *clk)
  14402. + }
  14403. + EXPORT_SYMBOL_GPL(clk_disable);
  14404. + #endif
  14405. ++#endif
  14406. diff --git a/target/linux/generic/files/include/linux/ath9k_platform.h b/target/linux/generic/files/include/linux/ath9k_platform.h
  14407. index a0b7531..03aa636 100644
  14408. --- a/target/linux/generic/files/include/linux/ath9k_platform.h
  14409. +++ b/target/linux/generic/files/include/linux/ath9k_platform.h
  14410. @@ -39,6 +39,8 @@ struct ath9k_platform_data {
  14411. int (*get_mac_revision)(void);
  14412. int (*external_reset)(void);
  14413. + bool use_eeprom;
  14414. +
  14415. int num_leds;
  14416. const struct gpio_led *leds;
  14417. };