bnxt.c 432 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523
  1. /* Broadcom NetXtreme-C/E network driver.
  2. *
  3. * Copyright (c) 2014-2016 Broadcom Corporation
  4. * Copyright (c) 2016-2019 Broadcom Limited
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation.
  9. */
  10. #include <linux/module.h>
  11. #include <linux/stringify.h>
  12. #include <linux/kernel.h>
  13. #include <linux/timer.h>
  14. #include <linux/errno.h>
  15. #include <linux/ioport.h>
  16. #include <linux/slab.h>
  17. #include <linux/vmalloc.h>
  18. #include <linux/interrupt.h>
  19. #include <linux/pci.h>
  20. #include <linux/netdevice.h>
  21. #include <linux/etherdevice.h>
  22. #include <linux/skbuff.h>
  23. #include <linux/dma-mapping.h>
  24. #include <linux/bitops.h>
  25. #include <linux/io.h>
  26. #include <linux/irq.h>
  27. #include <linux/delay.h>
  28. #include <asm/byteorder.h>
  29. #include <asm/page.h>
  30. #include <linux/time.h>
  31. #include <linux/mii.h>
  32. #include <linux/mdio.h>
  33. #include <linux/if.h>
  34. #include <linux/if_vlan.h>
  35. #include <linux/if_bridge.h>
  36. #include <linux/rtc.h>
  37. #include <linux/bpf.h>
  38. #include <net/gro.h>
  39. #include <net/ip.h>
  40. #include <net/tcp.h>
  41. #include <net/udp.h>
  42. #include <net/checksum.h>
  43. #include <net/ip6_checksum.h>
  44. #include <net/udp_tunnel.h>
  45. #include <linux/workqueue.h>
  46. #include <linux/prefetch.h>
  47. #include <linux/cache.h>
  48. #include <linux/log2.h>
  49. #include <linux/bitmap.h>
  50. #include <linux/cpu_rmap.h>
  51. #include <linux/cpumask.h>
  52. #include <net/pkt_cls.h>
  53. #include <net/page_pool/helpers.h>
  54. #include <linux/align.h>
  55. #include <net/netdev_queues.h>
  56. #include "bnxt_hsi.h"
  57. #include "bnxt.h"
  58. #include "bnxt_hwrm.h"
  59. #include "bnxt_ulp.h"
  60. #include "bnxt_sriov.h"
  61. #include "bnxt_ethtool.h"
  62. #include "bnxt_dcb.h"
  63. #include "bnxt_xdp.h"
  64. #include "bnxt_ptp.h"
  65. #include "bnxt_vfr.h"
  66. #include "bnxt_tc.h"
  67. #include "bnxt_devlink.h"
  68. #include "bnxt_debugfs.h"
  69. #include "bnxt_coredump.h"
  70. #include "bnxt_hwmon.h"
  71. #define BNXT_TX_TIMEOUT (5 * HZ)
  72. #define BNXT_DEF_MSG_ENABLE (NETIF_MSG_DRV | NETIF_MSG_HW | \
  73. NETIF_MSG_TX_ERR)
  74. MODULE_LICENSE("GPL");
  75. MODULE_DESCRIPTION("Broadcom NetXtreme network driver");
  76. #define BNXT_RX_OFFSET (NET_SKB_PAD + NET_IP_ALIGN)
  77. #define BNXT_RX_DMA_OFFSET NET_SKB_PAD
  78. #define BNXT_RX_COPY_THRESH 256
  79. #define BNXT_TX_PUSH_THRESH 164
  80. /* indexed by enum board_idx */
  81. static const struct {
  82. char *name;
  83. } board_info[] = {
  84. [BCM57301] = { "Broadcom BCM57301 NetXtreme-C 10Gb Ethernet" },
  85. [BCM57302] = { "Broadcom BCM57302 NetXtreme-C 10Gb/25Gb Ethernet" },
  86. [BCM57304] = { "Broadcom BCM57304 NetXtreme-C 10Gb/25Gb/40Gb/50Gb Ethernet" },
  87. [BCM57417_NPAR] = { "Broadcom BCM57417 NetXtreme-E Ethernet Partition" },
  88. [BCM58700] = { "Broadcom BCM58700 Nitro 1Gb/2.5Gb/10Gb Ethernet" },
  89. [BCM57311] = { "Broadcom BCM57311 NetXtreme-C 10Gb Ethernet" },
  90. [BCM57312] = { "Broadcom BCM57312 NetXtreme-C 10Gb/25Gb Ethernet" },
  91. [BCM57402] = { "Broadcom BCM57402 NetXtreme-E 10Gb Ethernet" },
  92. [BCM57404] = { "Broadcom BCM57404 NetXtreme-E 10Gb/25Gb Ethernet" },
  93. [BCM57406] = { "Broadcom BCM57406 NetXtreme-E 10GBase-T Ethernet" },
  94. [BCM57402_NPAR] = { "Broadcom BCM57402 NetXtreme-E Ethernet Partition" },
  95. [BCM57407] = { "Broadcom BCM57407 NetXtreme-E 10GBase-T Ethernet" },
  96. [BCM57412] = { "Broadcom BCM57412 NetXtreme-E 10Gb Ethernet" },
  97. [BCM57414] = { "Broadcom BCM57414 NetXtreme-E 10Gb/25Gb Ethernet" },
  98. [BCM57416] = { "Broadcom BCM57416 NetXtreme-E 10GBase-T Ethernet" },
  99. [BCM57417] = { "Broadcom BCM57417 NetXtreme-E 10GBase-T Ethernet" },
  100. [BCM57412_NPAR] = { "Broadcom BCM57412 NetXtreme-E Ethernet Partition" },
  101. [BCM57314] = { "Broadcom BCM57314 NetXtreme-C 10Gb/25Gb/40Gb/50Gb Ethernet" },
  102. [BCM57417_SFP] = { "Broadcom BCM57417 NetXtreme-E 10Gb/25Gb Ethernet" },
  103. [BCM57416_SFP] = { "Broadcom BCM57416 NetXtreme-E 10Gb Ethernet" },
  104. [BCM57404_NPAR] = { "Broadcom BCM57404 NetXtreme-E Ethernet Partition" },
  105. [BCM57406_NPAR] = { "Broadcom BCM57406 NetXtreme-E Ethernet Partition" },
  106. [BCM57407_SFP] = { "Broadcom BCM57407 NetXtreme-E 25Gb Ethernet" },
  107. [BCM57407_NPAR] = { "Broadcom BCM57407 NetXtreme-E Ethernet Partition" },
  108. [BCM57414_NPAR] = { "Broadcom BCM57414 NetXtreme-E Ethernet Partition" },
  109. [BCM57416_NPAR] = { "Broadcom BCM57416 NetXtreme-E Ethernet Partition" },
  110. [BCM57452] = { "Broadcom BCM57452 NetXtreme-E 10Gb/25Gb/40Gb/50Gb Ethernet" },
  111. [BCM57454] = { "Broadcom BCM57454 NetXtreme-E 10Gb/25Gb/40Gb/50Gb/100Gb Ethernet" },
  112. [BCM5745x_NPAR] = { "Broadcom BCM5745x NetXtreme-E Ethernet Partition" },
  113. [BCM57508] = { "Broadcom BCM57508 NetXtreme-E 10Gb/25Gb/50Gb/100Gb/200Gb Ethernet" },
  114. [BCM57504] = { "Broadcom BCM57504 NetXtreme-E 10Gb/25Gb/50Gb/100Gb/200Gb Ethernet" },
  115. [BCM57502] = { "Broadcom BCM57502 NetXtreme-E 10Gb/25Gb/50Gb Ethernet" },
  116. [BCM57608] = { "Broadcom BCM57608 NetXtreme-E 10Gb/25Gb/50Gb/100Gb/200Gb/400Gb Ethernet" },
  117. [BCM57604] = { "Broadcom BCM57604 NetXtreme-E 10Gb/25Gb/50Gb/100Gb/200Gb Ethernet" },
  118. [BCM57602] = { "Broadcom BCM57602 NetXtreme-E 10Gb/25Gb/50Gb/100Gb Ethernet" },
  119. [BCM57601] = { "Broadcom BCM57601 NetXtreme-E 10Gb/25Gb/50Gb/100Gb/200Gb/400Gb Ethernet" },
  120. [BCM57508_NPAR] = { "Broadcom BCM57508 NetXtreme-E Ethernet Partition" },
  121. [BCM57504_NPAR] = { "Broadcom BCM57504 NetXtreme-E Ethernet Partition" },
  122. [BCM57502_NPAR] = { "Broadcom BCM57502 NetXtreme-E Ethernet Partition" },
  123. [BCM58802] = { "Broadcom BCM58802 NetXtreme-S 10Gb/25Gb/40Gb/50Gb Ethernet" },
  124. [BCM58804] = { "Broadcom BCM58804 NetXtreme-S 10Gb/25Gb/40Gb/50Gb/100Gb Ethernet" },
  125. [BCM58808] = { "Broadcom BCM58808 NetXtreme-S 10Gb/25Gb/40Gb/50Gb/100Gb Ethernet" },
  126. [NETXTREME_E_VF] = { "Broadcom NetXtreme-E Ethernet Virtual Function" },
  127. [NETXTREME_C_VF] = { "Broadcom NetXtreme-C Ethernet Virtual Function" },
  128. [NETXTREME_S_VF] = { "Broadcom NetXtreme-S Ethernet Virtual Function" },
  129. [NETXTREME_C_VF_HV] = { "Broadcom NetXtreme-C Virtual Function for Hyper-V" },
  130. [NETXTREME_E_VF_HV] = { "Broadcom NetXtreme-E Virtual Function for Hyper-V" },
  131. [NETXTREME_E_P5_VF] = { "Broadcom BCM5750X NetXtreme-E Ethernet Virtual Function" },
  132. [NETXTREME_E_P5_VF_HV] = { "Broadcom BCM5750X NetXtreme-E Virtual Function for Hyper-V" },
  133. [NETXTREME_E_P7_VF] = { "Broadcom BCM5760X Virtual Function" },
  134. };
  135. static const struct pci_device_id bnxt_pci_tbl[] = {
  136. { PCI_VDEVICE(BROADCOM, 0x1604), .driver_data = BCM5745x_NPAR },
  137. { PCI_VDEVICE(BROADCOM, 0x1605), .driver_data = BCM5745x_NPAR },
  138. { PCI_VDEVICE(BROADCOM, 0x1614), .driver_data = BCM57454 },
  139. { PCI_VDEVICE(BROADCOM, 0x16c0), .driver_data = BCM57417_NPAR },
  140. { PCI_VDEVICE(BROADCOM, 0x16c8), .driver_data = BCM57301 },
  141. { PCI_VDEVICE(BROADCOM, 0x16c9), .driver_data = BCM57302 },
  142. { PCI_VDEVICE(BROADCOM, 0x16ca), .driver_data = BCM57304 },
  143. { PCI_VDEVICE(BROADCOM, 0x16cc), .driver_data = BCM57417_NPAR },
  144. { PCI_VDEVICE(BROADCOM, 0x16cd), .driver_data = BCM58700 },
  145. { PCI_VDEVICE(BROADCOM, 0x16ce), .driver_data = BCM57311 },
  146. { PCI_VDEVICE(BROADCOM, 0x16cf), .driver_data = BCM57312 },
  147. { PCI_VDEVICE(BROADCOM, 0x16d0), .driver_data = BCM57402 },
  148. { PCI_VDEVICE(BROADCOM, 0x16d1), .driver_data = BCM57404 },
  149. { PCI_VDEVICE(BROADCOM, 0x16d2), .driver_data = BCM57406 },
  150. { PCI_VDEVICE(BROADCOM, 0x16d4), .driver_data = BCM57402_NPAR },
  151. { PCI_VDEVICE(BROADCOM, 0x16d5), .driver_data = BCM57407 },
  152. { PCI_VDEVICE(BROADCOM, 0x16d6), .driver_data = BCM57412 },
  153. { PCI_VDEVICE(BROADCOM, 0x16d7), .driver_data = BCM57414 },
  154. { PCI_VDEVICE(BROADCOM, 0x16d8), .driver_data = BCM57416 },
  155. { PCI_VDEVICE(BROADCOM, 0x16d9), .driver_data = BCM57417 },
  156. { PCI_VDEVICE(BROADCOM, 0x16de), .driver_data = BCM57412_NPAR },
  157. { PCI_VDEVICE(BROADCOM, 0x16df), .driver_data = BCM57314 },
  158. { PCI_VDEVICE(BROADCOM, 0x16e2), .driver_data = BCM57417_SFP },
  159. { PCI_VDEVICE(BROADCOM, 0x16e3), .driver_data = BCM57416_SFP },
  160. { PCI_VDEVICE(BROADCOM, 0x16e7), .driver_data = BCM57404_NPAR },
  161. { PCI_VDEVICE(BROADCOM, 0x16e8), .driver_data = BCM57406_NPAR },
  162. { PCI_VDEVICE(BROADCOM, 0x16e9), .driver_data = BCM57407_SFP },
  163. { PCI_VDEVICE(BROADCOM, 0x16ea), .driver_data = BCM57407_NPAR },
  164. { PCI_VDEVICE(BROADCOM, 0x16eb), .driver_data = BCM57412_NPAR },
  165. { PCI_VDEVICE(BROADCOM, 0x16ec), .driver_data = BCM57414_NPAR },
  166. { PCI_VDEVICE(BROADCOM, 0x16ed), .driver_data = BCM57414_NPAR },
  167. { PCI_VDEVICE(BROADCOM, 0x16ee), .driver_data = BCM57416_NPAR },
  168. { PCI_VDEVICE(BROADCOM, 0x16ef), .driver_data = BCM57416_NPAR },
  169. { PCI_VDEVICE(BROADCOM, 0x16f0), .driver_data = BCM58808 },
  170. { PCI_VDEVICE(BROADCOM, 0x16f1), .driver_data = BCM57452 },
  171. { PCI_VDEVICE(BROADCOM, 0x1750), .driver_data = BCM57508 },
  172. { PCI_VDEVICE(BROADCOM, 0x1751), .driver_data = BCM57504 },
  173. { PCI_VDEVICE(BROADCOM, 0x1752), .driver_data = BCM57502 },
  174. { PCI_VDEVICE(BROADCOM, 0x1760), .driver_data = BCM57608 },
  175. { PCI_VDEVICE(BROADCOM, 0x1761), .driver_data = BCM57604 },
  176. { PCI_VDEVICE(BROADCOM, 0x1762), .driver_data = BCM57602 },
  177. { PCI_VDEVICE(BROADCOM, 0x1763), .driver_data = BCM57601 },
  178. { PCI_VDEVICE(BROADCOM, 0x1800), .driver_data = BCM57502_NPAR },
  179. { PCI_VDEVICE(BROADCOM, 0x1801), .driver_data = BCM57504_NPAR },
  180. { PCI_VDEVICE(BROADCOM, 0x1802), .driver_data = BCM57508_NPAR },
  181. { PCI_VDEVICE(BROADCOM, 0x1803), .driver_data = BCM57502_NPAR },
  182. { PCI_VDEVICE(BROADCOM, 0x1804), .driver_data = BCM57504_NPAR },
  183. { PCI_VDEVICE(BROADCOM, 0x1805), .driver_data = BCM57508_NPAR },
  184. { PCI_VDEVICE(BROADCOM, 0xd802), .driver_data = BCM58802 },
  185. { PCI_VDEVICE(BROADCOM, 0xd804), .driver_data = BCM58804 },
  186. #ifdef CONFIG_BNXT_SRIOV
  187. { PCI_VDEVICE(BROADCOM, 0x1606), .driver_data = NETXTREME_E_VF },
  188. { PCI_VDEVICE(BROADCOM, 0x1607), .driver_data = NETXTREME_E_VF_HV },
  189. { PCI_VDEVICE(BROADCOM, 0x1608), .driver_data = NETXTREME_E_VF_HV },
  190. { PCI_VDEVICE(BROADCOM, 0x1609), .driver_data = NETXTREME_E_VF },
  191. { PCI_VDEVICE(BROADCOM, 0x16bd), .driver_data = NETXTREME_E_VF_HV },
  192. { PCI_VDEVICE(BROADCOM, 0x16c1), .driver_data = NETXTREME_E_VF },
  193. { PCI_VDEVICE(BROADCOM, 0x16c2), .driver_data = NETXTREME_C_VF_HV },
  194. { PCI_VDEVICE(BROADCOM, 0x16c3), .driver_data = NETXTREME_C_VF_HV },
  195. { PCI_VDEVICE(BROADCOM, 0x16c4), .driver_data = NETXTREME_E_VF_HV },
  196. { PCI_VDEVICE(BROADCOM, 0x16c5), .driver_data = NETXTREME_E_VF_HV },
  197. { PCI_VDEVICE(BROADCOM, 0x16cb), .driver_data = NETXTREME_C_VF },
  198. { PCI_VDEVICE(BROADCOM, 0x16d3), .driver_data = NETXTREME_E_VF },
  199. { PCI_VDEVICE(BROADCOM, 0x16dc), .driver_data = NETXTREME_E_VF },
  200. { PCI_VDEVICE(BROADCOM, 0x16e1), .driver_data = NETXTREME_C_VF },
  201. { PCI_VDEVICE(BROADCOM, 0x16e5), .driver_data = NETXTREME_C_VF },
  202. { PCI_VDEVICE(BROADCOM, 0x16e6), .driver_data = NETXTREME_C_VF_HV },
  203. { PCI_VDEVICE(BROADCOM, 0x1806), .driver_data = NETXTREME_E_P5_VF },
  204. { PCI_VDEVICE(BROADCOM, 0x1807), .driver_data = NETXTREME_E_P5_VF },
  205. { PCI_VDEVICE(BROADCOM, 0x1808), .driver_data = NETXTREME_E_P5_VF_HV },
  206. { PCI_VDEVICE(BROADCOM, 0x1809), .driver_data = NETXTREME_E_P5_VF_HV },
  207. { PCI_VDEVICE(BROADCOM, 0x1819), .driver_data = NETXTREME_E_P7_VF },
  208. { PCI_VDEVICE(BROADCOM, 0xd800), .driver_data = NETXTREME_S_VF },
  209. #endif
  210. { 0 }
  211. };
  212. MODULE_DEVICE_TABLE(pci, bnxt_pci_tbl);
  213. static const u16 bnxt_vf_req_snif[] = {
  214. HWRM_FUNC_CFG,
  215. HWRM_FUNC_VF_CFG,
  216. HWRM_PORT_PHY_QCFG,
  217. HWRM_CFA_L2_FILTER_ALLOC,
  218. };
  219. static const u16 bnxt_async_events_arr[] = {
  220. ASYNC_EVENT_CMPL_EVENT_ID_LINK_STATUS_CHANGE,
  221. ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CHANGE,
  222. ASYNC_EVENT_CMPL_EVENT_ID_PF_DRVR_UNLOAD,
  223. ASYNC_EVENT_CMPL_EVENT_ID_PORT_CONN_NOT_ALLOWED,
  224. ASYNC_EVENT_CMPL_EVENT_ID_VF_CFG_CHANGE,
  225. ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CFG_CHANGE,
  226. ASYNC_EVENT_CMPL_EVENT_ID_PORT_PHY_CFG_CHANGE,
  227. ASYNC_EVENT_CMPL_EVENT_ID_RESET_NOTIFY,
  228. ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY,
  229. ASYNC_EVENT_CMPL_EVENT_ID_DEBUG_NOTIFICATION,
  230. ASYNC_EVENT_CMPL_EVENT_ID_DEFERRED_RESPONSE,
  231. ASYNC_EVENT_CMPL_EVENT_ID_RING_MONITOR_MSG,
  232. ASYNC_EVENT_CMPL_EVENT_ID_ECHO_REQUEST,
  233. ASYNC_EVENT_CMPL_EVENT_ID_PPS_TIMESTAMP,
  234. ASYNC_EVENT_CMPL_EVENT_ID_ERROR_REPORT,
  235. ASYNC_EVENT_CMPL_EVENT_ID_PHC_UPDATE,
  236. };
  237. static struct workqueue_struct *bnxt_pf_wq;
  238. #define BNXT_IPV6_MASK_ALL {{{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \
  239. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }}}
  240. #define BNXT_IPV6_MASK_NONE {{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }}}
  241. const struct bnxt_flow_masks BNXT_FLOW_MASK_NONE = {
  242. .ports = {
  243. .src = 0,
  244. .dst = 0,
  245. },
  246. .addrs = {
  247. .v6addrs = {
  248. .src = BNXT_IPV6_MASK_NONE,
  249. .dst = BNXT_IPV6_MASK_NONE,
  250. },
  251. },
  252. };
  253. const struct bnxt_flow_masks BNXT_FLOW_IPV6_MASK_ALL = {
  254. .ports = {
  255. .src = cpu_to_be16(0xffff),
  256. .dst = cpu_to_be16(0xffff),
  257. },
  258. .addrs = {
  259. .v6addrs = {
  260. .src = BNXT_IPV6_MASK_ALL,
  261. .dst = BNXT_IPV6_MASK_ALL,
  262. },
  263. },
  264. };
  265. const struct bnxt_flow_masks BNXT_FLOW_IPV4_MASK_ALL = {
  266. .ports = {
  267. .src = cpu_to_be16(0xffff),
  268. .dst = cpu_to_be16(0xffff),
  269. },
  270. .addrs = {
  271. .v4addrs = {
  272. .src = cpu_to_be32(0xffffffff),
  273. .dst = cpu_to_be32(0xffffffff),
  274. },
  275. },
  276. };
  277. static bool bnxt_vf_pciid(enum board_idx idx)
  278. {
  279. return (idx == NETXTREME_C_VF || idx == NETXTREME_E_VF ||
  280. idx == NETXTREME_S_VF || idx == NETXTREME_C_VF_HV ||
  281. idx == NETXTREME_E_VF_HV || idx == NETXTREME_E_P5_VF ||
  282. idx == NETXTREME_E_P5_VF_HV || idx == NETXTREME_E_P7_VF);
  283. }
  284. #define DB_CP_REARM_FLAGS (DB_KEY_CP | DB_IDX_VALID)
  285. #define DB_CP_FLAGS (DB_KEY_CP | DB_IDX_VALID | DB_IRQ_DIS)
  286. #define BNXT_DB_CQ(db, idx) \
  287. writel(DB_CP_FLAGS | DB_RING_IDX(db, idx), (db)->doorbell)
  288. #define BNXT_DB_NQ_P5(db, idx) \
  289. bnxt_writeq(bp, (db)->db_key64 | DBR_TYPE_NQ | DB_RING_IDX(db, idx),\
  290. (db)->doorbell)
  291. #define BNXT_DB_NQ_P7(db, idx) \
  292. bnxt_writeq(bp, (db)->db_key64 | DBR_TYPE_NQ_MASK | \
  293. DB_RING_IDX(db, idx), (db)->doorbell)
  294. #define BNXT_DB_CQ_ARM(db, idx) \
  295. writel(DB_CP_REARM_FLAGS | DB_RING_IDX(db, idx), (db)->doorbell)
  296. #define BNXT_DB_NQ_ARM_P5(db, idx) \
  297. bnxt_writeq(bp, (db)->db_key64 | DBR_TYPE_NQ_ARM | \
  298. DB_RING_IDX(db, idx), (db)->doorbell)
  299. static void bnxt_db_nq(struct bnxt *bp, struct bnxt_db_info *db, u32 idx)
  300. {
  301. if (bp->flags & BNXT_FLAG_CHIP_P7)
  302. BNXT_DB_NQ_P7(db, idx);
  303. else if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  304. BNXT_DB_NQ_P5(db, idx);
  305. else
  306. BNXT_DB_CQ(db, idx);
  307. }
  308. static void bnxt_db_nq_arm(struct bnxt *bp, struct bnxt_db_info *db, u32 idx)
  309. {
  310. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  311. BNXT_DB_NQ_ARM_P5(db, idx);
  312. else
  313. BNXT_DB_CQ_ARM(db, idx);
  314. }
  315. static void bnxt_db_cq(struct bnxt *bp, struct bnxt_db_info *db, u32 idx)
  316. {
  317. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  318. bnxt_writeq(bp, db->db_key64 | DBR_TYPE_CQ_ARMALL |
  319. DB_RING_IDX(db, idx), db->doorbell);
  320. else
  321. BNXT_DB_CQ(db, idx);
  322. }
  323. static void bnxt_queue_fw_reset_work(struct bnxt *bp, unsigned long delay)
  324. {
  325. if (!(test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)))
  326. return;
  327. if (BNXT_PF(bp))
  328. queue_delayed_work(bnxt_pf_wq, &bp->fw_reset_task, delay);
  329. else
  330. schedule_delayed_work(&bp->fw_reset_task, delay);
  331. }
  332. static void __bnxt_queue_sp_work(struct bnxt *bp)
  333. {
  334. if (BNXT_PF(bp))
  335. queue_work(bnxt_pf_wq, &bp->sp_task);
  336. else
  337. schedule_work(&bp->sp_task);
  338. }
  339. static void bnxt_queue_sp_work(struct bnxt *bp, unsigned int event)
  340. {
  341. set_bit(event, &bp->sp_event);
  342. __bnxt_queue_sp_work(bp);
  343. }
  344. static void bnxt_sched_reset_rxr(struct bnxt *bp, struct bnxt_rx_ring_info *rxr)
  345. {
  346. if (!rxr->bnapi->in_reset) {
  347. rxr->bnapi->in_reset = true;
  348. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  349. set_bit(BNXT_RESET_TASK_SP_EVENT, &bp->sp_event);
  350. else
  351. set_bit(BNXT_RST_RING_SP_EVENT, &bp->sp_event);
  352. __bnxt_queue_sp_work(bp);
  353. }
  354. rxr->rx_next_cons = 0xffff;
  355. }
  356. void bnxt_sched_reset_txr(struct bnxt *bp, struct bnxt_tx_ring_info *txr,
  357. u16 curr)
  358. {
  359. struct bnxt_napi *bnapi = txr->bnapi;
  360. if (bnapi->tx_fault)
  361. return;
  362. netdev_err(bp->dev, "Invalid Tx completion (ring:%d tx_hw_cons:%u cons:%u prod:%u curr:%u)",
  363. txr->txq_index, txr->tx_hw_cons,
  364. txr->tx_cons, txr->tx_prod, curr);
  365. WARN_ON_ONCE(1);
  366. bnapi->tx_fault = 1;
  367. bnxt_queue_sp_work(bp, BNXT_RESET_TASK_SP_EVENT);
  368. }
  369. const u16 bnxt_lhint_arr[] = {
  370. TX_BD_FLAGS_LHINT_512_AND_SMALLER,
  371. TX_BD_FLAGS_LHINT_512_TO_1023,
  372. TX_BD_FLAGS_LHINT_1024_TO_2047,
  373. TX_BD_FLAGS_LHINT_1024_TO_2047,
  374. TX_BD_FLAGS_LHINT_2048_AND_LARGER,
  375. TX_BD_FLAGS_LHINT_2048_AND_LARGER,
  376. TX_BD_FLAGS_LHINT_2048_AND_LARGER,
  377. TX_BD_FLAGS_LHINT_2048_AND_LARGER,
  378. TX_BD_FLAGS_LHINT_2048_AND_LARGER,
  379. TX_BD_FLAGS_LHINT_2048_AND_LARGER,
  380. TX_BD_FLAGS_LHINT_2048_AND_LARGER,
  381. TX_BD_FLAGS_LHINT_2048_AND_LARGER,
  382. TX_BD_FLAGS_LHINT_2048_AND_LARGER,
  383. TX_BD_FLAGS_LHINT_2048_AND_LARGER,
  384. TX_BD_FLAGS_LHINT_2048_AND_LARGER,
  385. TX_BD_FLAGS_LHINT_2048_AND_LARGER,
  386. TX_BD_FLAGS_LHINT_2048_AND_LARGER,
  387. TX_BD_FLAGS_LHINT_2048_AND_LARGER,
  388. TX_BD_FLAGS_LHINT_2048_AND_LARGER,
  389. };
  390. static u16 bnxt_xmit_get_cfa_action(struct sk_buff *skb)
  391. {
  392. struct metadata_dst *md_dst = skb_metadata_dst(skb);
  393. if (!md_dst || md_dst->type != METADATA_HW_PORT_MUX)
  394. return 0;
  395. return md_dst->u.port_info.port_id;
  396. }
  397. static void bnxt_txr_db_kick(struct bnxt *bp, struct bnxt_tx_ring_info *txr,
  398. u16 prod)
  399. {
  400. /* Sync BD data before updating doorbell */
  401. wmb();
  402. bnxt_db_write(bp, &txr->tx_db, prod);
  403. txr->kick_pending = 0;
  404. }
  405. static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb, struct net_device *dev)
  406. {
  407. struct bnxt *bp = netdev_priv(dev);
  408. struct tx_bd *txbd, *txbd0;
  409. struct tx_bd_ext *txbd1;
  410. struct netdev_queue *txq;
  411. int i;
  412. dma_addr_t mapping;
  413. unsigned int length, pad = 0;
  414. u32 len, free_size, vlan_tag_flags, cfa_action, flags;
  415. struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;
  416. struct pci_dev *pdev = bp->pdev;
  417. u16 prod, last_frag, txts_prod;
  418. struct bnxt_tx_ring_info *txr;
  419. struct bnxt_sw_tx_bd *tx_buf;
  420. __le32 lflags = 0;
  421. i = skb_get_queue_mapping(skb);
  422. if (unlikely(i >= bp->tx_nr_rings)) {
  423. dev_kfree_skb_any(skb);
  424. dev_core_stats_tx_dropped_inc(dev);
  425. return NETDEV_TX_OK;
  426. }
  427. txq = netdev_get_tx_queue(dev, i);
  428. txr = &bp->tx_ring[bp->tx_ring_map[i]];
  429. prod = txr->tx_prod;
  430. free_size = bnxt_tx_avail(bp, txr);
  431. if (unlikely(free_size < skb_shinfo(skb)->nr_frags + 2)) {
  432. /* We must have raced with NAPI cleanup */
  433. if (net_ratelimit() && txr->kick_pending)
  434. netif_warn(bp, tx_err, dev,
  435. "bnxt: ring busy w/ flush pending!\n");
  436. if (!netif_txq_try_stop(txq, bnxt_tx_avail(bp, txr),
  437. bp->tx_wake_thresh))
  438. return NETDEV_TX_BUSY;
  439. }
  440. if (unlikely(ipv6_hopopt_jumbo_remove(skb)))
  441. goto tx_free;
  442. length = skb->len;
  443. len = skb_headlen(skb);
  444. last_frag = skb_shinfo(skb)->nr_frags;
  445. txbd = &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)];
  446. tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)];
  447. tx_buf->skb = skb;
  448. tx_buf->nr_frags = last_frag;
  449. vlan_tag_flags = 0;
  450. cfa_action = bnxt_xmit_get_cfa_action(skb);
  451. if (skb_vlan_tag_present(skb)) {
  452. vlan_tag_flags = TX_BD_CFA_META_KEY_VLAN |
  453. skb_vlan_tag_get(skb);
  454. /* Currently supports 8021Q, 8021AD vlan offloads
  455. * QINQ1, QINQ2, QINQ3 vlan headers are deprecated
  456. */
  457. if (skb->vlan_proto == htons(ETH_P_8021Q))
  458. vlan_tag_flags |= 1 << TX_BD_CFA_META_TPID_SHIFT;
  459. }
  460. if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) && ptp &&
  461. ptp->tx_tstamp_en) {
  462. if (bp->fw_cap & BNXT_FW_CAP_TX_TS_CMP) {
  463. lflags |= cpu_to_le32(TX_BD_FLAGS_STAMP);
  464. tx_buf->is_ts_pkt = 1;
  465. skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
  466. } else if (!skb_is_gso(skb)) {
  467. u16 seq_id, hdr_off;
  468. if (!bnxt_ptp_parse(skb, &seq_id, &hdr_off) &&
  469. !bnxt_ptp_get_txts_prod(ptp, &txts_prod)) {
  470. if (vlan_tag_flags)
  471. hdr_off += VLAN_HLEN;
  472. lflags |= cpu_to_le32(TX_BD_FLAGS_STAMP);
  473. tx_buf->is_ts_pkt = 1;
  474. skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
  475. ptp->txts_req[txts_prod].tx_seqid = seq_id;
  476. ptp->txts_req[txts_prod].tx_hdr_off = hdr_off;
  477. tx_buf->txts_prod = txts_prod;
  478. }
  479. }
  480. }
  481. if (unlikely(skb->no_fcs))
  482. lflags |= cpu_to_le32(TX_BD_FLAGS_NO_CRC);
  483. if (free_size == bp->tx_ring_size && length <= bp->tx_push_thresh &&
  484. !lflags) {
  485. struct tx_push_buffer *tx_push_buf = txr->tx_push;
  486. struct tx_push_bd *tx_push = &tx_push_buf->push_bd;
  487. struct tx_bd_ext *tx_push1 = &tx_push->txbd2;
  488. void __iomem *db = txr->tx_db.doorbell;
  489. void *pdata = tx_push_buf->data;
  490. u64 *end;
  491. int j, push_len;
  492. /* Set COAL_NOW to be ready quickly for the next push */
  493. tx_push->tx_bd_len_flags_type =
  494. cpu_to_le32((length << TX_BD_LEN_SHIFT) |
  495. TX_BD_TYPE_LONG_TX_BD |
  496. TX_BD_FLAGS_LHINT_512_AND_SMALLER |
  497. TX_BD_FLAGS_COAL_NOW |
  498. TX_BD_FLAGS_PACKET_END |
  499. (2 << TX_BD_FLAGS_BD_CNT_SHIFT));
  500. if (skb->ip_summed == CHECKSUM_PARTIAL)
  501. tx_push1->tx_bd_hsize_lflags =
  502. cpu_to_le32(TX_BD_FLAGS_TCP_UDP_CHKSUM);
  503. else
  504. tx_push1->tx_bd_hsize_lflags = 0;
  505. tx_push1->tx_bd_cfa_meta = cpu_to_le32(vlan_tag_flags);
  506. tx_push1->tx_bd_cfa_action =
  507. cpu_to_le32(cfa_action << TX_BD_CFA_ACTION_SHIFT);
  508. end = pdata + length;
  509. end = PTR_ALIGN(end, 8) - 1;
  510. *end = 0;
  511. skb_copy_from_linear_data(skb, pdata, len);
  512. pdata += len;
  513. for (j = 0; j < last_frag; j++) {
  514. skb_frag_t *frag = &skb_shinfo(skb)->frags[j];
  515. void *fptr;
  516. fptr = skb_frag_address_safe(frag);
  517. if (!fptr)
  518. goto normal_tx;
  519. memcpy(pdata, fptr, skb_frag_size(frag));
  520. pdata += skb_frag_size(frag);
  521. }
  522. txbd->tx_bd_len_flags_type = tx_push->tx_bd_len_flags_type;
  523. txbd->tx_bd_haddr = txr->data_mapping;
  524. txbd->tx_bd_opaque = SET_TX_OPAQUE(bp, txr, prod, 2);
  525. prod = NEXT_TX(prod);
  526. tx_push->tx_bd_opaque = txbd->tx_bd_opaque;
  527. txbd = &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)];
  528. memcpy(txbd, tx_push1, sizeof(*txbd));
  529. prod = NEXT_TX(prod);
  530. tx_push->doorbell =
  531. cpu_to_le32(DB_KEY_TX_PUSH | DB_LONG_TX_PUSH |
  532. DB_RING_IDX(&txr->tx_db, prod));
  533. WRITE_ONCE(txr->tx_prod, prod);
  534. tx_buf->is_push = 1;
  535. netdev_tx_sent_queue(txq, skb->len);
  536. wmb(); /* Sync is_push and byte queue before pushing data */
  537. push_len = (length + sizeof(*tx_push) + 7) / 8;
  538. if (push_len > 16) {
  539. __iowrite64_copy(db, tx_push_buf, 16);
  540. __iowrite32_copy(db + 4, tx_push_buf + 1,
  541. (push_len - 16) << 1);
  542. } else {
  543. __iowrite64_copy(db, tx_push_buf, push_len);
  544. }
  545. goto tx_done;
  546. }
  547. normal_tx:
  548. if (length < BNXT_MIN_PKT_SIZE) {
  549. pad = BNXT_MIN_PKT_SIZE - length;
  550. if (skb_pad(skb, pad))
  551. /* SKB already freed. */
  552. goto tx_kick_pending;
  553. length = BNXT_MIN_PKT_SIZE;
  554. }
  555. mapping = dma_map_single(&pdev->dev, skb->data, len, DMA_TO_DEVICE);
  556. if (unlikely(dma_mapping_error(&pdev->dev, mapping)))
  557. goto tx_free;
  558. dma_unmap_addr_set(tx_buf, mapping, mapping);
  559. flags = (len << TX_BD_LEN_SHIFT) | TX_BD_TYPE_LONG_TX_BD |
  560. ((last_frag + 2) << TX_BD_FLAGS_BD_CNT_SHIFT);
  561. txbd->tx_bd_haddr = cpu_to_le64(mapping);
  562. txbd->tx_bd_opaque = SET_TX_OPAQUE(bp, txr, prod, 2 + last_frag);
  563. prod = NEXT_TX(prod);
  564. txbd1 = (struct tx_bd_ext *)
  565. &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)];
  566. txbd1->tx_bd_hsize_lflags = lflags;
  567. if (skb_is_gso(skb)) {
  568. bool udp_gso = !!(skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4);
  569. u32 hdr_len;
  570. if (skb->encapsulation) {
  571. if (udp_gso)
  572. hdr_len = skb_inner_transport_offset(skb) +
  573. sizeof(struct udphdr);
  574. else
  575. hdr_len = skb_inner_tcp_all_headers(skb);
  576. } else if (udp_gso) {
  577. hdr_len = skb_transport_offset(skb) +
  578. sizeof(struct udphdr);
  579. } else {
  580. hdr_len = skb_tcp_all_headers(skb);
  581. }
  582. txbd1->tx_bd_hsize_lflags |= cpu_to_le32(TX_BD_FLAGS_LSO |
  583. TX_BD_FLAGS_T_IPID |
  584. (hdr_len << (TX_BD_HSIZE_SHIFT - 1)));
  585. length = skb_shinfo(skb)->gso_size;
  586. txbd1->tx_bd_mss = cpu_to_le32(length);
  587. length += hdr_len;
  588. } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
  589. txbd1->tx_bd_hsize_lflags |=
  590. cpu_to_le32(TX_BD_FLAGS_TCP_UDP_CHKSUM);
  591. txbd1->tx_bd_mss = 0;
  592. }
  593. length >>= 9;
  594. if (unlikely(length >= ARRAY_SIZE(bnxt_lhint_arr))) {
  595. dev_warn_ratelimited(&pdev->dev, "Dropped oversize %d bytes TX packet.\n",
  596. skb->len);
  597. i = 0;
  598. goto tx_dma_error;
  599. }
  600. flags |= bnxt_lhint_arr[length];
  601. txbd->tx_bd_len_flags_type = cpu_to_le32(flags);
  602. txbd1->tx_bd_cfa_meta = cpu_to_le32(vlan_tag_flags);
  603. txbd1->tx_bd_cfa_action =
  604. cpu_to_le32(cfa_action << TX_BD_CFA_ACTION_SHIFT);
  605. txbd0 = txbd;
  606. for (i = 0; i < last_frag; i++) {
  607. skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
  608. prod = NEXT_TX(prod);
  609. txbd = &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)];
  610. len = skb_frag_size(frag);
  611. mapping = skb_frag_dma_map(&pdev->dev, frag, 0, len,
  612. DMA_TO_DEVICE);
  613. if (unlikely(dma_mapping_error(&pdev->dev, mapping)))
  614. goto tx_dma_error;
  615. tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)];
  616. dma_unmap_addr_set(tx_buf, mapping, mapping);
  617. txbd->tx_bd_haddr = cpu_to_le64(mapping);
  618. flags = len << TX_BD_LEN_SHIFT;
  619. txbd->tx_bd_len_flags_type = cpu_to_le32(flags);
  620. }
  621. flags &= ~TX_BD_LEN;
  622. txbd->tx_bd_len_flags_type =
  623. cpu_to_le32(((len + pad) << TX_BD_LEN_SHIFT) | flags |
  624. TX_BD_FLAGS_PACKET_END);
  625. netdev_tx_sent_queue(txq, skb->len);
  626. skb_tx_timestamp(skb);
  627. prod = NEXT_TX(prod);
  628. WRITE_ONCE(txr->tx_prod, prod);
  629. if (!netdev_xmit_more() || netif_xmit_stopped(txq)) {
  630. bnxt_txr_db_kick(bp, txr, prod);
  631. } else {
  632. if (free_size >= bp->tx_wake_thresh)
  633. txbd0->tx_bd_len_flags_type |=
  634. cpu_to_le32(TX_BD_FLAGS_NO_CMPL);
  635. txr->kick_pending = 1;
  636. }
  637. tx_done:
  638. if (unlikely(bnxt_tx_avail(bp, txr) <= MAX_SKB_FRAGS + 1)) {
  639. if (netdev_xmit_more() && !tx_buf->is_push) {
  640. txbd0->tx_bd_len_flags_type &=
  641. cpu_to_le32(~TX_BD_FLAGS_NO_CMPL);
  642. bnxt_txr_db_kick(bp, txr, prod);
  643. }
  644. netif_txq_try_stop(txq, bnxt_tx_avail(bp, txr),
  645. bp->tx_wake_thresh);
  646. }
  647. return NETDEV_TX_OK;
  648. tx_dma_error:
  649. last_frag = i;
  650. /* start back at beginning and unmap skb */
  651. prod = txr->tx_prod;
  652. tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)];
  653. dma_unmap_single(&pdev->dev, dma_unmap_addr(tx_buf, mapping),
  654. skb_headlen(skb), DMA_TO_DEVICE);
  655. prod = NEXT_TX(prod);
  656. /* unmap remaining mapped pages */
  657. for (i = 0; i < last_frag; i++) {
  658. prod = NEXT_TX(prod);
  659. tx_buf = &txr->tx_buf_ring[RING_TX(bp, prod)];
  660. dma_unmap_page(&pdev->dev, dma_unmap_addr(tx_buf, mapping),
  661. skb_frag_size(&skb_shinfo(skb)->frags[i]),
  662. DMA_TO_DEVICE);
  663. }
  664. tx_free:
  665. dev_kfree_skb_any(skb);
  666. tx_kick_pending:
  667. if (BNXT_TX_PTP_IS_SET(lflags)) {
  668. txr->tx_buf_ring[RING_TX(bp, txr->tx_prod)].is_ts_pkt = 0;
  669. atomic64_inc(&bp->ptp_cfg->stats.ts_err);
  670. if (!(bp->fw_cap & BNXT_FW_CAP_TX_TS_CMP))
  671. /* set SKB to err so PTP worker will clean up */
  672. ptp->txts_req[txts_prod].tx_skb = ERR_PTR(-EIO);
  673. }
  674. if (txr->kick_pending)
  675. bnxt_txr_db_kick(bp, txr, txr->tx_prod);
  676. txr->tx_buf_ring[RING_TX(bp, txr->tx_prod)].skb = NULL;
  677. dev_core_stats_tx_dropped_inc(dev);
  678. return NETDEV_TX_OK;
  679. }
  680. /* Returns true if some remaining TX packets not processed. */
  681. static bool __bnxt_tx_int(struct bnxt *bp, struct bnxt_tx_ring_info *txr,
  682. int budget)
  683. {
  684. struct netdev_queue *txq = netdev_get_tx_queue(bp->dev, txr->txq_index);
  685. struct pci_dev *pdev = bp->pdev;
  686. u16 hw_cons = txr->tx_hw_cons;
  687. unsigned int tx_bytes = 0;
  688. u16 cons = txr->tx_cons;
  689. int tx_pkts = 0;
  690. bool rc = false;
  691. while (RING_TX(bp, cons) != hw_cons) {
  692. struct bnxt_sw_tx_bd *tx_buf;
  693. struct sk_buff *skb;
  694. bool is_ts_pkt;
  695. int j, last;
  696. tx_buf = &txr->tx_buf_ring[RING_TX(bp, cons)];
  697. skb = tx_buf->skb;
  698. if (unlikely(!skb)) {
  699. bnxt_sched_reset_txr(bp, txr, cons);
  700. return rc;
  701. }
  702. is_ts_pkt = tx_buf->is_ts_pkt;
  703. if (is_ts_pkt && (bp->fw_cap & BNXT_FW_CAP_TX_TS_CMP)) {
  704. rc = true;
  705. break;
  706. }
  707. cons = NEXT_TX(cons);
  708. tx_pkts++;
  709. tx_bytes += skb->len;
  710. tx_buf->skb = NULL;
  711. tx_buf->is_ts_pkt = 0;
  712. if (tx_buf->is_push) {
  713. tx_buf->is_push = 0;
  714. goto next_tx_int;
  715. }
  716. dma_unmap_single(&pdev->dev, dma_unmap_addr(tx_buf, mapping),
  717. skb_headlen(skb), DMA_TO_DEVICE);
  718. last = tx_buf->nr_frags;
  719. for (j = 0; j < last; j++) {
  720. cons = NEXT_TX(cons);
  721. tx_buf = &txr->tx_buf_ring[RING_TX(bp, cons)];
  722. dma_unmap_page(
  723. &pdev->dev,
  724. dma_unmap_addr(tx_buf, mapping),
  725. skb_frag_size(&skb_shinfo(skb)->frags[j]),
  726. DMA_TO_DEVICE);
  727. }
  728. if (unlikely(is_ts_pkt)) {
  729. if (BNXT_CHIP_P5(bp)) {
  730. /* PTP worker takes ownership of the skb */
  731. bnxt_get_tx_ts_p5(bp, skb, tx_buf->txts_prod);
  732. skb = NULL;
  733. }
  734. }
  735. next_tx_int:
  736. cons = NEXT_TX(cons);
  737. dev_consume_skb_any(skb);
  738. }
  739. WRITE_ONCE(txr->tx_cons, cons);
  740. __netif_txq_completed_wake(txq, tx_pkts, tx_bytes,
  741. bnxt_tx_avail(bp, txr), bp->tx_wake_thresh,
  742. READ_ONCE(txr->dev_state) == BNXT_DEV_STATE_CLOSING);
  743. return rc;
  744. }
  745. static void bnxt_tx_int(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
  746. {
  747. struct bnxt_tx_ring_info *txr;
  748. bool more = false;
  749. int i;
  750. bnxt_for_each_napi_tx(i, bnapi, txr) {
  751. if (txr->tx_hw_cons != RING_TX(bp, txr->tx_cons))
  752. more |= __bnxt_tx_int(bp, txr, budget);
  753. }
  754. if (!more)
  755. bnapi->events &= ~BNXT_TX_CMP_EVENT;
  756. }
  757. static bool bnxt_separate_head_pool(void)
  758. {
  759. return PAGE_SIZE > BNXT_RX_PAGE_SIZE;
  760. }
  761. static struct page *__bnxt_alloc_rx_page(struct bnxt *bp, dma_addr_t *mapping,
  762. struct bnxt_rx_ring_info *rxr,
  763. unsigned int *offset,
  764. gfp_t gfp)
  765. {
  766. struct page *page;
  767. if (PAGE_SIZE > BNXT_RX_PAGE_SIZE) {
  768. page = page_pool_dev_alloc_frag(rxr->page_pool, offset,
  769. BNXT_RX_PAGE_SIZE);
  770. } else {
  771. page = page_pool_dev_alloc_pages(rxr->page_pool);
  772. *offset = 0;
  773. }
  774. if (!page)
  775. return NULL;
  776. *mapping = page_pool_get_dma_addr(page) + *offset;
  777. return page;
  778. }
  779. static inline u8 *__bnxt_alloc_rx_frag(struct bnxt *bp, dma_addr_t *mapping,
  780. struct bnxt_rx_ring_info *rxr,
  781. gfp_t gfp)
  782. {
  783. unsigned int offset;
  784. struct page *page;
  785. page = page_pool_alloc_frag(rxr->head_pool, &offset,
  786. bp->rx_buf_size, gfp);
  787. if (!page)
  788. return NULL;
  789. *mapping = page_pool_get_dma_addr(page) + bp->rx_dma_offset + offset;
  790. return page_address(page) + offset;
  791. }
  792. int bnxt_alloc_rx_data(struct bnxt *bp, struct bnxt_rx_ring_info *rxr,
  793. u16 prod, gfp_t gfp)
  794. {
  795. struct rx_bd *rxbd = &rxr->rx_desc_ring[RX_RING(bp, prod)][RX_IDX(prod)];
  796. struct bnxt_sw_rx_bd *rx_buf = &rxr->rx_buf_ring[RING_RX(bp, prod)];
  797. dma_addr_t mapping;
  798. if (BNXT_RX_PAGE_MODE(bp)) {
  799. unsigned int offset;
  800. struct page *page =
  801. __bnxt_alloc_rx_page(bp, &mapping, rxr, &offset, gfp);
  802. if (!page)
  803. return -ENOMEM;
  804. mapping += bp->rx_dma_offset;
  805. rx_buf->data = page;
  806. rx_buf->data_ptr = page_address(page) + offset + bp->rx_offset;
  807. } else {
  808. u8 *data = __bnxt_alloc_rx_frag(bp, &mapping, rxr, gfp);
  809. if (!data)
  810. return -ENOMEM;
  811. rx_buf->data = data;
  812. rx_buf->data_ptr = data + bp->rx_offset;
  813. }
  814. rx_buf->mapping = mapping;
  815. rxbd->rx_bd_haddr = cpu_to_le64(mapping);
  816. return 0;
  817. }
  818. void bnxt_reuse_rx_data(struct bnxt_rx_ring_info *rxr, u16 cons, void *data)
  819. {
  820. u16 prod = rxr->rx_prod;
  821. struct bnxt_sw_rx_bd *cons_rx_buf, *prod_rx_buf;
  822. struct bnxt *bp = rxr->bnapi->bp;
  823. struct rx_bd *cons_bd, *prod_bd;
  824. prod_rx_buf = &rxr->rx_buf_ring[RING_RX(bp, prod)];
  825. cons_rx_buf = &rxr->rx_buf_ring[cons];
  826. prod_rx_buf->data = data;
  827. prod_rx_buf->data_ptr = cons_rx_buf->data_ptr;
  828. prod_rx_buf->mapping = cons_rx_buf->mapping;
  829. prod_bd = &rxr->rx_desc_ring[RX_RING(bp, prod)][RX_IDX(prod)];
  830. cons_bd = &rxr->rx_desc_ring[RX_RING(bp, cons)][RX_IDX(cons)];
  831. prod_bd->rx_bd_haddr = cons_bd->rx_bd_haddr;
  832. }
  833. static inline u16 bnxt_find_next_agg_idx(struct bnxt_rx_ring_info *rxr, u16 idx)
  834. {
  835. u16 next, max = rxr->rx_agg_bmap_size;
  836. next = find_next_zero_bit(rxr->rx_agg_bmap, max, idx);
  837. if (next >= max)
  838. next = find_first_zero_bit(rxr->rx_agg_bmap, max);
  839. return next;
  840. }
  841. static inline int bnxt_alloc_rx_page(struct bnxt *bp,
  842. struct bnxt_rx_ring_info *rxr,
  843. u16 prod, gfp_t gfp)
  844. {
  845. struct rx_bd *rxbd =
  846. &rxr->rx_agg_desc_ring[RX_AGG_RING(bp, prod)][RX_IDX(prod)];
  847. struct bnxt_sw_rx_agg_bd *rx_agg_buf;
  848. struct page *page;
  849. dma_addr_t mapping;
  850. u16 sw_prod = rxr->rx_sw_agg_prod;
  851. unsigned int offset = 0;
  852. page = __bnxt_alloc_rx_page(bp, &mapping, rxr, &offset, gfp);
  853. if (!page)
  854. return -ENOMEM;
  855. if (unlikely(test_bit(sw_prod, rxr->rx_agg_bmap)))
  856. sw_prod = bnxt_find_next_agg_idx(rxr, sw_prod);
  857. __set_bit(sw_prod, rxr->rx_agg_bmap);
  858. rx_agg_buf = &rxr->rx_agg_ring[sw_prod];
  859. rxr->rx_sw_agg_prod = RING_RX_AGG(bp, NEXT_RX_AGG(sw_prod));
  860. rx_agg_buf->page = page;
  861. rx_agg_buf->offset = offset;
  862. rx_agg_buf->mapping = mapping;
  863. rxbd->rx_bd_haddr = cpu_to_le64(mapping);
  864. rxbd->rx_bd_opaque = sw_prod;
  865. return 0;
  866. }
  867. static struct rx_agg_cmp *bnxt_get_agg(struct bnxt *bp,
  868. struct bnxt_cp_ring_info *cpr,
  869. u16 cp_cons, u16 curr)
  870. {
  871. struct rx_agg_cmp *agg;
  872. cp_cons = RING_CMP(ADV_RAW_CMP(cp_cons, curr));
  873. agg = (struct rx_agg_cmp *)
  874. &cpr->cp_desc_ring[CP_RING(cp_cons)][CP_IDX(cp_cons)];
  875. return agg;
  876. }
  877. static struct rx_agg_cmp *bnxt_get_tpa_agg_p5(struct bnxt *bp,
  878. struct bnxt_rx_ring_info *rxr,
  879. u16 agg_id, u16 curr)
  880. {
  881. struct bnxt_tpa_info *tpa_info = &rxr->rx_tpa[agg_id];
  882. return &tpa_info->agg_arr[curr];
  883. }
  884. static void bnxt_reuse_rx_agg_bufs(struct bnxt_cp_ring_info *cpr, u16 idx,
  885. u16 start, u32 agg_bufs, bool tpa)
  886. {
  887. struct bnxt_napi *bnapi = cpr->bnapi;
  888. struct bnxt *bp = bnapi->bp;
  889. struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
  890. u16 prod = rxr->rx_agg_prod;
  891. u16 sw_prod = rxr->rx_sw_agg_prod;
  892. bool p5_tpa = false;
  893. u32 i;
  894. if ((bp->flags & BNXT_FLAG_CHIP_P5_PLUS) && tpa)
  895. p5_tpa = true;
  896. for (i = 0; i < agg_bufs; i++) {
  897. u16 cons;
  898. struct rx_agg_cmp *agg;
  899. struct bnxt_sw_rx_agg_bd *cons_rx_buf, *prod_rx_buf;
  900. struct rx_bd *prod_bd;
  901. struct page *page;
  902. if (p5_tpa)
  903. agg = bnxt_get_tpa_agg_p5(bp, rxr, idx, start + i);
  904. else
  905. agg = bnxt_get_agg(bp, cpr, idx, start + i);
  906. cons = agg->rx_agg_cmp_opaque;
  907. __clear_bit(cons, rxr->rx_agg_bmap);
  908. if (unlikely(test_bit(sw_prod, rxr->rx_agg_bmap)))
  909. sw_prod = bnxt_find_next_agg_idx(rxr, sw_prod);
  910. __set_bit(sw_prod, rxr->rx_agg_bmap);
  911. prod_rx_buf = &rxr->rx_agg_ring[sw_prod];
  912. cons_rx_buf = &rxr->rx_agg_ring[cons];
  913. /* It is possible for sw_prod to be equal to cons, so
  914. * set cons_rx_buf->page to NULL first.
  915. */
  916. page = cons_rx_buf->page;
  917. cons_rx_buf->page = NULL;
  918. prod_rx_buf->page = page;
  919. prod_rx_buf->offset = cons_rx_buf->offset;
  920. prod_rx_buf->mapping = cons_rx_buf->mapping;
  921. prod_bd = &rxr->rx_agg_desc_ring[RX_AGG_RING(bp, prod)][RX_IDX(prod)];
  922. prod_bd->rx_bd_haddr = cpu_to_le64(cons_rx_buf->mapping);
  923. prod_bd->rx_bd_opaque = sw_prod;
  924. prod = NEXT_RX_AGG(prod);
  925. sw_prod = RING_RX_AGG(bp, NEXT_RX_AGG(sw_prod));
  926. }
  927. rxr->rx_agg_prod = prod;
  928. rxr->rx_sw_agg_prod = sw_prod;
  929. }
  930. static struct sk_buff *bnxt_rx_multi_page_skb(struct bnxt *bp,
  931. struct bnxt_rx_ring_info *rxr,
  932. u16 cons, void *data, u8 *data_ptr,
  933. dma_addr_t dma_addr,
  934. unsigned int offset_and_len)
  935. {
  936. unsigned int len = offset_and_len & 0xffff;
  937. struct page *page = data;
  938. u16 prod = rxr->rx_prod;
  939. struct sk_buff *skb;
  940. int err;
  941. err = bnxt_alloc_rx_data(bp, rxr, prod, GFP_ATOMIC);
  942. if (unlikely(err)) {
  943. bnxt_reuse_rx_data(rxr, cons, data);
  944. return NULL;
  945. }
  946. dma_addr -= bp->rx_dma_offset;
  947. dma_sync_single_for_cpu(&bp->pdev->dev, dma_addr, BNXT_RX_PAGE_SIZE,
  948. bp->rx_dir);
  949. skb = napi_build_skb(data_ptr - bp->rx_offset, BNXT_RX_PAGE_SIZE);
  950. if (!skb) {
  951. page_pool_recycle_direct(rxr->page_pool, page);
  952. return NULL;
  953. }
  954. skb_mark_for_recycle(skb);
  955. skb_reserve(skb, bp->rx_offset);
  956. __skb_put(skb, len);
  957. return skb;
  958. }
  959. static struct sk_buff *bnxt_rx_page_skb(struct bnxt *bp,
  960. struct bnxt_rx_ring_info *rxr,
  961. u16 cons, void *data, u8 *data_ptr,
  962. dma_addr_t dma_addr,
  963. unsigned int offset_and_len)
  964. {
  965. unsigned int payload = offset_and_len >> 16;
  966. unsigned int len = offset_and_len & 0xffff;
  967. skb_frag_t *frag;
  968. struct page *page = data;
  969. u16 prod = rxr->rx_prod;
  970. struct sk_buff *skb;
  971. int off, err;
  972. err = bnxt_alloc_rx_data(bp, rxr, prod, GFP_ATOMIC);
  973. if (unlikely(err)) {
  974. bnxt_reuse_rx_data(rxr, cons, data);
  975. return NULL;
  976. }
  977. dma_addr -= bp->rx_dma_offset;
  978. dma_sync_single_for_cpu(&bp->pdev->dev, dma_addr, BNXT_RX_PAGE_SIZE,
  979. bp->rx_dir);
  980. if (unlikely(!payload))
  981. payload = eth_get_headlen(bp->dev, data_ptr, len);
  982. skb = napi_alloc_skb(&rxr->bnapi->napi, payload);
  983. if (!skb) {
  984. page_pool_recycle_direct(rxr->page_pool, page);
  985. return NULL;
  986. }
  987. skb_mark_for_recycle(skb);
  988. off = (void *)data_ptr - page_address(page);
  989. skb_add_rx_frag(skb, 0, page, off, len, BNXT_RX_PAGE_SIZE);
  990. memcpy(skb->data - NET_IP_ALIGN, data_ptr - NET_IP_ALIGN,
  991. payload + NET_IP_ALIGN);
  992. frag = &skb_shinfo(skb)->frags[0];
  993. skb_frag_size_sub(frag, payload);
  994. skb_frag_off_add(frag, payload);
  995. skb->data_len -= payload;
  996. skb->tail += payload;
  997. return skb;
  998. }
  999. static struct sk_buff *bnxt_rx_skb(struct bnxt *bp,
  1000. struct bnxt_rx_ring_info *rxr, u16 cons,
  1001. void *data, u8 *data_ptr,
  1002. dma_addr_t dma_addr,
  1003. unsigned int offset_and_len)
  1004. {
  1005. u16 prod = rxr->rx_prod;
  1006. struct sk_buff *skb;
  1007. int err;
  1008. err = bnxt_alloc_rx_data(bp, rxr, prod, GFP_ATOMIC);
  1009. if (unlikely(err)) {
  1010. bnxt_reuse_rx_data(rxr, cons, data);
  1011. return NULL;
  1012. }
  1013. skb = napi_build_skb(data, bp->rx_buf_size);
  1014. dma_sync_single_for_cpu(&bp->pdev->dev, dma_addr, bp->rx_buf_use_size,
  1015. bp->rx_dir);
  1016. if (!skb) {
  1017. page_pool_free_va(rxr->head_pool, data, true);
  1018. return NULL;
  1019. }
  1020. skb_mark_for_recycle(skb);
  1021. skb_reserve(skb, bp->rx_offset);
  1022. skb_put(skb, offset_and_len & 0xffff);
  1023. return skb;
  1024. }
  1025. static u32 __bnxt_rx_agg_pages(struct bnxt *bp,
  1026. struct bnxt_cp_ring_info *cpr,
  1027. struct skb_shared_info *shinfo,
  1028. u16 idx, u32 agg_bufs, bool tpa,
  1029. struct xdp_buff *xdp)
  1030. {
  1031. struct bnxt_napi *bnapi = cpr->bnapi;
  1032. struct pci_dev *pdev = bp->pdev;
  1033. struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
  1034. u16 prod = rxr->rx_agg_prod;
  1035. u32 i, total_frag_len = 0;
  1036. bool p5_tpa = false;
  1037. if ((bp->flags & BNXT_FLAG_CHIP_P5_PLUS) && tpa)
  1038. p5_tpa = true;
  1039. for (i = 0; i < agg_bufs; i++) {
  1040. skb_frag_t *frag = &shinfo->frags[i];
  1041. u16 cons, frag_len;
  1042. struct rx_agg_cmp *agg;
  1043. struct bnxt_sw_rx_agg_bd *cons_rx_buf;
  1044. struct page *page;
  1045. dma_addr_t mapping;
  1046. if (p5_tpa)
  1047. agg = bnxt_get_tpa_agg_p5(bp, rxr, idx, i);
  1048. else
  1049. agg = bnxt_get_agg(bp, cpr, idx, i);
  1050. cons = agg->rx_agg_cmp_opaque;
  1051. frag_len = (le32_to_cpu(agg->rx_agg_cmp_len_flags_type) &
  1052. RX_AGG_CMP_LEN) >> RX_AGG_CMP_LEN_SHIFT;
  1053. cons_rx_buf = &rxr->rx_agg_ring[cons];
  1054. skb_frag_fill_page_desc(frag, cons_rx_buf->page,
  1055. cons_rx_buf->offset, frag_len);
  1056. shinfo->nr_frags = i + 1;
  1057. __clear_bit(cons, rxr->rx_agg_bmap);
  1058. /* It is possible for bnxt_alloc_rx_page() to allocate
  1059. * a sw_prod index that equals the cons index, so we
  1060. * need to clear the cons entry now.
  1061. */
  1062. mapping = cons_rx_buf->mapping;
  1063. page = cons_rx_buf->page;
  1064. cons_rx_buf->page = NULL;
  1065. if (xdp && page_is_pfmemalloc(page))
  1066. xdp_buff_set_frag_pfmemalloc(xdp);
  1067. if (bnxt_alloc_rx_page(bp, rxr, prod, GFP_ATOMIC) != 0) {
  1068. --shinfo->nr_frags;
  1069. cons_rx_buf->page = page;
  1070. /* Update prod since possibly some pages have been
  1071. * allocated already.
  1072. */
  1073. rxr->rx_agg_prod = prod;
  1074. bnxt_reuse_rx_agg_bufs(cpr, idx, i, agg_bufs - i, tpa);
  1075. return 0;
  1076. }
  1077. dma_sync_single_for_cpu(&pdev->dev, mapping, BNXT_RX_PAGE_SIZE,
  1078. bp->rx_dir);
  1079. total_frag_len += frag_len;
  1080. prod = NEXT_RX_AGG(prod);
  1081. }
  1082. rxr->rx_agg_prod = prod;
  1083. return total_frag_len;
  1084. }
  1085. static struct sk_buff *bnxt_rx_agg_pages_skb(struct bnxt *bp,
  1086. struct bnxt_cp_ring_info *cpr,
  1087. struct sk_buff *skb, u16 idx,
  1088. u32 agg_bufs, bool tpa)
  1089. {
  1090. struct skb_shared_info *shinfo = skb_shinfo(skb);
  1091. u32 total_frag_len = 0;
  1092. total_frag_len = __bnxt_rx_agg_pages(bp, cpr, shinfo, idx,
  1093. agg_bufs, tpa, NULL);
  1094. if (!total_frag_len) {
  1095. skb_mark_for_recycle(skb);
  1096. dev_kfree_skb(skb);
  1097. return NULL;
  1098. }
  1099. skb->data_len += total_frag_len;
  1100. skb->len += total_frag_len;
  1101. skb->truesize += BNXT_RX_PAGE_SIZE * agg_bufs;
  1102. return skb;
  1103. }
  1104. static u32 bnxt_rx_agg_pages_xdp(struct bnxt *bp,
  1105. struct bnxt_cp_ring_info *cpr,
  1106. struct xdp_buff *xdp, u16 idx,
  1107. u32 agg_bufs, bool tpa)
  1108. {
  1109. struct skb_shared_info *shinfo = xdp_get_shared_info_from_buff(xdp);
  1110. u32 total_frag_len = 0;
  1111. if (!xdp_buff_has_frags(xdp))
  1112. shinfo->nr_frags = 0;
  1113. total_frag_len = __bnxt_rx_agg_pages(bp, cpr, shinfo,
  1114. idx, agg_bufs, tpa, xdp);
  1115. if (total_frag_len) {
  1116. xdp_buff_set_frags_flag(xdp);
  1117. shinfo->nr_frags = agg_bufs;
  1118. shinfo->xdp_frags_size = total_frag_len;
  1119. }
  1120. return total_frag_len;
  1121. }
  1122. static int bnxt_agg_bufs_valid(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
  1123. u8 agg_bufs, u32 *raw_cons)
  1124. {
  1125. u16 last;
  1126. struct rx_agg_cmp *agg;
  1127. *raw_cons = ADV_RAW_CMP(*raw_cons, agg_bufs);
  1128. last = RING_CMP(*raw_cons);
  1129. agg = (struct rx_agg_cmp *)
  1130. &cpr->cp_desc_ring[CP_RING(last)][CP_IDX(last)];
  1131. return RX_AGG_CMP_VALID(agg, *raw_cons);
  1132. }
  1133. static struct sk_buff *bnxt_copy_data(struct bnxt_napi *bnapi, u8 *data,
  1134. unsigned int len,
  1135. dma_addr_t mapping)
  1136. {
  1137. struct bnxt *bp = bnapi->bp;
  1138. struct pci_dev *pdev = bp->pdev;
  1139. struct sk_buff *skb;
  1140. skb = napi_alloc_skb(&bnapi->napi, len);
  1141. if (!skb)
  1142. return NULL;
  1143. dma_sync_single_for_cpu(&pdev->dev, mapping, bp->rx_copy_thresh,
  1144. bp->rx_dir);
  1145. memcpy(skb->data - NET_IP_ALIGN, data - NET_IP_ALIGN,
  1146. len + NET_IP_ALIGN);
  1147. dma_sync_single_for_device(&pdev->dev, mapping, bp->rx_copy_thresh,
  1148. bp->rx_dir);
  1149. skb_put(skb, len);
  1150. return skb;
  1151. }
  1152. static struct sk_buff *bnxt_copy_skb(struct bnxt_napi *bnapi, u8 *data,
  1153. unsigned int len,
  1154. dma_addr_t mapping)
  1155. {
  1156. return bnxt_copy_data(bnapi, data, len, mapping);
  1157. }
  1158. static struct sk_buff *bnxt_copy_xdp(struct bnxt_napi *bnapi,
  1159. struct xdp_buff *xdp,
  1160. unsigned int len,
  1161. dma_addr_t mapping)
  1162. {
  1163. unsigned int metasize = 0;
  1164. u8 *data = xdp->data;
  1165. struct sk_buff *skb;
  1166. len = xdp->data_end - xdp->data_meta;
  1167. metasize = xdp->data - xdp->data_meta;
  1168. data = xdp->data_meta;
  1169. skb = bnxt_copy_data(bnapi, data, len, mapping);
  1170. if (!skb)
  1171. return skb;
  1172. if (metasize) {
  1173. skb_metadata_set(skb, metasize);
  1174. __skb_pull(skb, metasize);
  1175. }
  1176. return skb;
  1177. }
  1178. static int bnxt_discard_rx(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
  1179. u32 *raw_cons, void *cmp)
  1180. {
  1181. struct rx_cmp *rxcmp = cmp;
  1182. u32 tmp_raw_cons = *raw_cons;
  1183. u8 cmp_type, agg_bufs = 0;
  1184. cmp_type = RX_CMP_TYPE(rxcmp);
  1185. if (cmp_type == CMP_TYPE_RX_L2_CMP) {
  1186. agg_bufs = (le32_to_cpu(rxcmp->rx_cmp_misc_v1) &
  1187. RX_CMP_AGG_BUFS) >>
  1188. RX_CMP_AGG_BUFS_SHIFT;
  1189. } else if (cmp_type == CMP_TYPE_RX_L2_TPA_END_CMP) {
  1190. struct rx_tpa_end_cmp *tpa_end = cmp;
  1191. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  1192. return 0;
  1193. agg_bufs = TPA_END_AGG_BUFS(tpa_end);
  1194. }
  1195. if (agg_bufs) {
  1196. if (!bnxt_agg_bufs_valid(bp, cpr, agg_bufs, &tmp_raw_cons))
  1197. return -EBUSY;
  1198. }
  1199. *raw_cons = tmp_raw_cons;
  1200. return 0;
  1201. }
  1202. static u16 bnxt_alloc_agg_idx(struct bnxt_rx_ring_info *rxr, u16 agg_id)
  1203. {
  1204. struct bnxt_tpa_idx_map *map = rxr->rx_tpa_idx_map;
  1205. u16 idx = agg_id & MAX_TPA_P5_MASK;
  1206. if (test_bit(idx, map->agg_idx_bmap))
  1207. idx = find_first_zero_bit(map->agg_idx_bmap,
  1208. BNXT_AGG_IDX_BMAP_SIZE);
  1209. __set_bit(idx, map->agg_idx_bmap);
  1210. map->agg_id_tbl[agg_id] = idx;
  1211. return idx;
  1212. }
  1213. static void bnxt_free_agg_idx(struct bnxt_rx_ring_info *rxr, u16 idx)
  1214. {
  1215. struct bnxt_tpa_idx_map *map = rxr->rx_tpa_idx_map;
  1216. __clear_bit(idx, map->agg_idx_bmap);
  1217. }
  1218. static u16 bnxt_lookup_agg_idx(struct bnxt_rx_ring_info *rxr, u16 agg_id)
  1219. {
  1220. struct bnxt_tpa_idx_map *map = rxr->rx_tpa_idx_map;
  1221. return map->agg_id_tbl[agg_id];
  1222. }
  1223. static void bnxt_tpa_metadata(struct bnxt_tpa_info *tpa_info,
  1224. struct rx_tpa_start_cmp *tpa_start,
  1225. struct rx_tpa_start_cmp_ext *tpa_start1)
  1226. {
  1227. tpa_info->cfa_code_valid = 1;
  1228. tpa_info->cfa_code = TPA_START_CFA_CODE(tpa_start1);
  1229. tpa_info->vlan_valid = 0;
  1230. if (tpa_info->flags2 & RX_CMP_FLAGS2_META_FORMAT_VLAN) {
  1231. tpa_info->vlan_valid = 1;
  1232. tpa_info->metadata =
  1233. le32_to_cpu(tpa_start1->rx_tpa_start_cmp_metadata);
  1234. }
  1235. }
  1236. static void bnxt_tpa_metadata_v2(struct bnxt_tpa_info *tpa_info,
  1237. struct rx_tpa_start_cmp *tpa_start,
  1238. struct rx_tpa_start_cmp_ext *tpa_start1)
  1239. {
  1240. tpa_info->vlan_valid = 0;
  1241. if (TPA_START_VLAN_VALID(tpa_start)) {
  1242. u32 tpid_sel = TPA_START_VLAN_TPID_SEL(tpa_start);
  1243. u32 vlan_proto = ETH_P_8021Q;
  1244. tpa_info->vlan_valid = 1;
  1245. if (tpid_sel == RX_TPA_START_METADATA1_TPID_8021AD)
  1246. vlan_proto = ETH_P_8021AD;
  1247. tpa_info->metadata = vlan_proto << 16 |
  1248. TPA_START_METADATA0_TCI(tpa_start1);
  1249. }
  1250. }
  1251. static void bnxt_tpa_start(struct bnxt *bp, struct bnxt_rx_ring_info *rxr,
  1252. u8 cmp_type, struct rx_tpa_start_cmp *tpa_start,
  1253. struct rx_tpa_start_cmp_ext *tpa_start1)
  1254. {
  1255. struct bnxt_sw_rx_bd *cons_rx_buf, *prod_rx_buf;
  1256. struct bnxt_tpa_info *tpa_info;
  1257. u16 cons, prod, agg_id;
  1258. struct rx_bd *prod_bd;
  1259. dma_addr_t mapping;
  1260. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  1261. agg_id = TPA_START_AGG_ID_P5(tpa_start);
  1262. agg_id = bnxt_alloc_agg_idx(rxr, agg_id);
  1263. } else {
  1264. agg_id = TPA_START_AGG_ID(tpa_start);
  1265. }
  1266. cons = tpa_start->rx_tpa_start_cmp_opaque;
  1267. prod = rxr->rx_prod;
  1268. cons_rx_buf = &rxr->rx_buf_ring[cons];
  1269. prod_rx_buf = &rxr->rx_buf_ring[RING_RX(bp, prod)];
  1270. tpa_info = &rxr->rx_tpa[agg_id];
  1271. if (unlikely(cons != rxr->rx_next_cons ||
  1272. TPA_START_ERROR(tpa_start))) {
  1273. netdev_warn(bp->dev, "TPA cons %x, expected cons %x, error code %x\n",
  1274. cons, rxr->rx_next_cons,
  1275. TPA_START_ERROR_CODE(tpa_start1));
  1276. bnxt_sched_reset_rxr(bp, rxr);
  1277. return;
  1278. }
  1279. prod_rx_buf->data = tpa_info->data;
  1280. prod_rx_buf->data_ptr = tpa_info->data_ptr;
  1281. mapping = tpa_info->mapping;
  1282. prod_rx_buf->mapping = mapping;
  1283. prod_bd = &rxr->rx_desc_ring[RX_RING(bp, prod)][RX_IDX(prod)];
  1284. prod_bd->rx_bd_haddr = cpu_to_le64(mapping);
  1285. tpa_info->data = cons_rx_buf->data;
  1286. tpa_info->data_ptr = cons_rx_buf->data_ptr;
  1287. cons_rx_buf->data = NULL;
  1288. tpa_info->mapping = cons_rx_buf->mapping;
  1289. tpa_info->len =
  1290. le32_to_cpu(tpa_start->rx_tpa_start_cmp_len_flags_type) >>
  1291. RX_TPA_START_CMP_LEN_SHIFT;
  1292. if (likely(TPA_START_HASH_VALID(tpa_start))) {
  1293. tpa_info->hash_type = PKT_HASH_TYPE_L4;
  1294. tpa_info->gso_type = SKB_GSO_TCPV4;
  1295. if (TPA_START_IS_IPV6(tpa_start1))
  1296. tpa_info->gso_type = SKB_GSO_TCPV6;
  1297. /* RSS profiles 1 and 3 with extract code 0 for inner 4-tuple */
  1298. else if (!BNXT_CHIP_P4_PLUS(bp) &&
  1299. TPA_START_HASH_TYPE(tpa_start) == 3)
  1300. tpa_info->gso_type = SKB_GSO_TCPV6;
  1301. tpa_info->rss_hash =
  1302. le32_to_cpu(tpa_start->rx_tpa_start_cmp_rss_hash);
  1303. } else {
  1304. tpa_info->hash_type = PKT_HASH_TYPE_NONE;
  1305. tpa_info->gso_type = 0;
  1306. netif_warn(bp, rx_err, bp->dev, "TPA packet without valid hash\n");
  1307. }
  1308. tpa_info->flags2 = le32_to_cpu(tpa_start1->rx_tpa_start_cmp_flags2);
  1309. tpa_info->hdr_info = le32_to_cpu(tpa_start1->rx_tpa_start_cmp_hdr_info);
  1310. if (cmp_type == CMP_TYPE_RX_L2_TPA_START_CMP)
  1311. bnxt_tpa_metadata(tpa_info, tpa_start, tpa_start1);
  1312. else
  1313. bnxt_tpa_metadata_v2(tpa_info, tpa_start, tpa_start1);
  1314. tpa_info->agg_count = 0;
  1315. rxr->rx_prod = NEXT_RX(prod);
  1316. cons = RING_RX(bp, NEXT_RX(cons));
  1317. rxr->rx_next_cons = RING_RX(bp, NEXT_RX(cons));
  1318. cons_rx_buf = &rxr->rx_buf_ring[cons];
  1319. bnxt_reuse_rx_data(rxr, cons, cons_rx_buf->data);
  1320. rxr->rx_prod = NEXT_RX(rxr->rx_prod);
  1321. cons_rx_buf->data = NULL;
  1322. }
  1323. static void bnxt_abort_tpa(struct bnxt_cp_ring_info *cpr, u16 idx, u32 agg_bufs)
  1324. {
  1325. if (agg_bufs)
  1326. bnxt_reuse_rx_agg_bufs(cpr, idx, 0, agg_bufs, true);
  1327. }
  1328. #ifdef CONFIG_INET
  1329. static void bnxt_gro_tunnel(struct sk_buff *skb, __be16 ip_proto)
  1330. {
  1331. struct udphdr *uh = NULL;
  1332. if (ip_proto == htons(ETH_P_IP)) {
  1333. struct iphdr *iph = (struct iphdr *)skb->data;
  1334. if (iph->protocol == IPPROTO_UDP)
  1335. uh = (struct udphdr *)(iph + 1);
  1336. } else {
  1337. struct ipv6hdr *iph = (struct ipv6hdr *)skb->data;
  1338. if (iph->nexthdr == IPPROTO_UDP)
  1339. uh = (struct udphdr *)(iph + 1);
  1340. }
  1341. if (uh) {
  1342. if (uh->check)
  1343. skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_TUNNEL_CSUM;
  1344. else
  1345. skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_TUNNEL;
  1346. }
  1347. }
  1348. #endif
  1349. static struct sk_buff *bnxt_gro_func_5731x(struct bnxt_tpa_info *tpa_info,
  1350. int payload_off, int tcp_ts,
  1351. struct sk_buff *skb)
  1352. {
  1353. #ifdef CONFIG_INET
  1354. struct tcphdr *th;
  1355. int len, nw_off;
  1356. u16 outer_ip_off, inner_ip_off, inner_mac_off;
  1357. u32 hdr_info = tpa_info->hdr_info;
  1358. bool loopback = false;
  1359. inner_ip_off = BNXT_TPA_INNER_L3_OFF(hdr_info);
  1360. inner_mac_off = BNXT_TPA_INNER_L2_OFF(hdr_info);
  1361. outer_ip_off = BNXT_TPA_OUTER_L3_OFF(hdr_info);
  1362. /* If the packet is an internal loopback packet, the offsets will
  1363. * have an extra 4 bytes.
  1364. */
  1365. if (inner_mac_off == 4) {
  1366. loopback = true;
  1367. } else if (inner_mac_off > 4) {
  1368. __be16 proto = *((__be16 *)(skb->data + inner_ip_off -
  1369. ETH_HLEN - 2));
  1370. /* We only support inner iPv4/ipv6. If we don't see the
  1371. * correct protocol ID, it must be a loopback packet where
  1372. * the offsets are off by 4.
  1373. */
  1374. if (proto != htons(ETH_P_IP) && proto != htons(ETH_P_IPV6))
  1375. loopback = true;
  1376. }
  1377. if (loopback) {
  1378. /* internal loopback packet, subtract all offsets by 4 */
  1379. inner_ip_off -= 4;
  1380. inner_mac_off -= 4;
  1381. outer_ip_off -= 4;
  1382. }
  1383. nw_off = inner_ip_off - ETH_HLEN;
  1384. skb_set_network_header(skb, nw_off);
  1385. if (tpa_info->flags2 & RX_TPA_START_CMP_FLAGS2_IP_TYPE) {
  1386. struct ipv6hdr *iph = ipv6_hdr(skb);
  1387. skb_set_transport_header(skb, nw_off + sizeof(struct ipv6hdr));
  1388. len = skb->len - skb_transport_offset(skb);
  1389. th = tcp_hdr(skb);
  1390. th->check = ~tcp_v6_check(len, &iph->saddr, &iph->daddr, 0);
  1391. } else {
  1392. struct iphdr *iph = ip_hdr(skb);
  1393. skb_set_transport_header(skb, nw_off + sizeof(struct iphdr));
  1394. len = skb->len - skb_transport_offset(skb);
  1395. th = tcp_hdr(skb);
  1396. th->check = ~tcp_v4_check(len, iph->saddr, iph->daddr, 0);
  1397. }
  1398. if (inner_mac_off) { /* tunnel */
  1399. __be16 proto = *((__be16 *)(skb->data + outer_ip_off -
  1400. ETH_HLEN - 2));
  1401. bnxt_gro_tunnel(skb, proto);
  1402. }
  1403. #endif
  1404. return skb;
  1405. }
  1406. static struct sk_buff *bnxt_gro_func_5750x(struct bnxt_tpa_info *tpa_info,
  1407. int payload_off, int tcp_ts,
  1408. struct sk_buff *skb)
  1409. {
  1410. #ifdef CONFIG_INET
  1411. u16 outer_ip_off, inner_ip_off, inner_mac_off;
  1412. u32 hdr_info = tpa_info->hdr_info;
  1413. int iphdr_len, nw_off;
  1414. inner_ip_off = BNXT_TPA_INNER_L3_OFF(hdr_info);
  1415. inner_mac_off = BNXT_TPA_INNER_L2_OFF(hdr_info);
  1416. outer_ip_off = BNXT_TPA_OUTER_L3_OFF(hdr_info);
  1417. nw_off = inner_ip_off - ETH_HLEN;
  1418. skb_set_network_header(skb, nw_off);
  1419. iphdr_len = (tpa_info->flags2 & RX_TPA_START_CMP_FLAGS2_IP_TYPE) ?
  1420. sizeof(struct ipv6hdr) : sizeof(struct iphdr);
  1421. skb_set_transport_header(skb, nw_off + iphdr_len);
  1422. if (inner_mac_off) { /* tunnel */
  1423. __be16 proto = *((__be16 *)(skb->data + outer_ip_off -
  1424. ETH_HLEN - 2));
  1425. bnxt_gro_tunnel(skb, proto);
  1426. }
  1427. #endif
  1428. return skb;
  1429. }
  1430. #define BNXT_IPV4_HDR_SIZE (sizeof(struct iphdr) + sizeof(struct tcphdr))
  1431. #define BNXT_IPV6_HDR_SIZE (sizeof(struct ipv6hdr) + sizeof(struct tcphdr))
  1432. static struct sk_buff *bnxt_gro_func_5730x(struct bnxt_tpa_info *tpa_info,
  1433. int payload_off, int tcp_ts,
  1434. struct sk_buff *skb)
  1435. {
  1436. #ifdef CONFIG_INET
  1437. struct tcphdr *th;
  1438. int len, nw_off, tcp_opt_len = 0;
  1439. if (tcp_ts)
  1440. tcp_opt_len = 12;
  1441. if (tpa_info->gso_type == SKB_GSO_TCPV4) {
  1442. struct iphdr *iph;
  1443. nw_off = payload_off - BNXT_IPV4_HDR_SIZE - tcp_opt_len -
  1444. ETH_HLEN;
  1445. skb_set_network_header(skb, nw_off);
  1446. iph = ip_hdr(skb);
  1447. skb_set_transport_header(skb, nw_off + sizeof(struct iphdr));
  1448. len = skb->len - skb_transport_offset(skb);
  1449. th = tcp_hdr(skb);
  1450. th->check = ~tcp_v4_check(len, iph->saddr, iph->daddr, 0);
  1451. } else if (tpa_info->gso_type == SKB_GSO_TCPV6) {
  1452. struct ipv6hdr *iph;
  1453. nw_off = payload_off - BNXT_IPV6_HDR_SIZE - tcp_opt_len -
  1454. ETH_HLEN;
  1455. skb_set_network_header(skb, nw_off);
  1456. iph = ipv6_hdr(skb);
  1457. skb_set_transport_header(skb, nw_off + sizeof(struct ipv6hdr));
  1458. len = skb->len - skb_transport_offset(skb);
  1459. th = tcp_hdr(skb);
  1460. th->check = ~tcp_v6_check(len, &iph->saddr, &iph->daddr, 0);
  1461. } else {
  1462. dev_kfree_skb_any(skb);
  1463. return NULL;
  1464. }
  1465. if (nw_off) /* tunnel */
  1466. bnxt_gro_tunnel(skb, skb->protocol);
  1467. #endif
  1468. return skb;
  1469. }
  1470. static inline struct sk_buff *bnxt_gro_skb(struct bnxt *bp,
  1471. struct bnxt_tpa_info *tpa_info,
  1472. struct rx_tpa_end_cmp *tpa_end,
  1473. struct rx_tpa_end_cmp_ext *tpa_end1,
  1474. struct sk_buff *skb)
  1475. {
  1476. #ifdef CONFIG_INET
  1477. int payload_off;
  1478. u16 segs;
  1479. segs = TPA_END_TPA_SEGS(tpa_end);
  1480. if (segs == 1)
  1481. return skb;
  1482. NAPI_GRO_CB(skb)->count = segs;
  1483. skb_shinfo(skb)->gso_size =
  1484. le32_to_cpu(tpa_end1->rx_tpa_end_cmp_seg_len);
  1485. skb_shinfo(skb)->gso_type = tpa_info->gso_type;
  1486. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  1487. payload_off = TPA_END_PAYLOAD_OFF_P5(tpa_end1);
  1488. else
  1489. payload_off = TPA_END_PAYLOAD_OFF(tpa_end);
  1490. skb = bp->gro_func(tpa_info, payload_off, TPA_END_GRO_TS(tpa_end), skb);
  1491. if (likely(skb))
  1492. tcp_gro_complete(skb);
  1493. #endif
  1494. return skb;
  1495. }
  1496. /* Given the cfa_code of a received packet determine which
  1497. * netdev (vf-rep or PF) the packet is destined to.
  1498. */
  1499. static struct net_device *bnxt_get_pkt_dev(struct bnxt *bp, u16 cfa_code)
  1500. {
  1501. struct net_device *dev = bnxt_get_vf_rep(bp, cfa_code);
  1502. /* if vf-rep dev is NULL, the must belongs to the PF */
  1503. return dev ? dev : bp->dev;
  1504. }
  1505. static inline struct sk_buff *bnxt_tpa_end(struct bnxt *bp,
  1506. struct bnxt_cp_ring_info *cpr,
  1507. u32 *raw_cons,
  1508. struct rx_tpa_end_cmp *tpa_end,
  1509. struct rx_tpa_end_cmp_ext *tpa_end1,
  1510. u8 *event)
  1511. {
  1512. struct bnxt_napi *bnapi = cpr->bnapi;
  1513. struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
  1514. struct net_device *dev = bp->dev;
  1515. u8 *data_ptr, agg_bufs;
  1516. unsigned int len;
  1517. struct bnxt_tpa_info *tpa_info;
  1518. dma_addr_t mapping;
  1519. struct sk_buff *skb;
  1520. u16 idx = 0, agg_id;
  1521. void *data;
  1522. bool gro;
  1523. if (unlikely(bnapi->in_reset)) {
  1524. int rc = bnxt_discard_rx(bp, cpr, raw_cons, tpa_end);
  1525. if (rc < 0)
  1526. return ERR_PTR(-EBUSY);
  1527. return NULL;
  1528. }
  1529. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  1530. agg_id = TPA_END_AGG_ID_P5(tpa_end);
  1531. agg_id = bnxt_lookup_agg_idx(rxr, agg_id);
  1532. agg_bufs = TPA_END_AGG_BUFS_P5(tpa_end1);
  1533. tpa_info = &rxr->rx_tpa[agg_id];
  1534. if (unlikely(agg_bufs != tpa_info->agg_count)) {
  1535. netdev_warn(bp->dev, "TPA end agg_buf %d != expected agg_bufs %d\n",
  1536. agg_bufs, tpa_info->agg_count);
  1537. agg_bufs = tpa_info->agg_count;
  1538. }
  1539. tpa_info->agg_count = 0;
  1540. *event |= BNXT_AGG_EVENT;
  1541. bnxt_free_agg_idx(rxr, agg_id);
  1542. idx = agg_id;
  1543. gro = !!(bp->flags & BNXT_FLAG_GRO);
  1544. } else {
  1545. agg_id = TPA_END_AGG_ID(tpa_end);
  1546. agg_bufs = TPA_END_AGG_BUFS(tpa_end);
  1547. tpa_info = &rxr->rx_tpa[agg_id];
  1548. idx = RING_CMP(*raw_cons);
  1549. if (agg_bufs) {
  1550. if (!bnxt_agg_bufs_valid(bp, cpr, agg_bufs, raw_cons))
  1551. return ERR_PTR(-EBUSY);
  1552. *event |= BNXT_AGG_EVENT;
  1553. idx = NEXT_CMP(idx);
  1554. }
  1555. gro = !!TPA_END_GRO(tpa_end);
  1556. }
  1557. data = tpa_info->data;
  1558. data_ptr = tpa_info->data_ptr;
  1559. prefetch(data_ptr);
  1560. len = tpa_info->len;
  1561. mapping = tpa_info->mapping;
  1562. if (unlikely(agg_bufs > MAX_SKB_FRAGS || TPA_END_ERRORS(tpa_end1))) {
  1563. bnxt_abort_tpa(cpr, idx, agg_bufs);
  1564. if (agg_bufs > MAX_SKB_FRAGS)
  1565. netdev_warn(bp->dev, "TPA frags %d exceeded MAX_SKB_FRAGS %d\n",
  1566. agg_bufs, (int)MAX_SKB_FRAGS);
  1567. return NULL;
  1568. }
  1569. if (len <= bp->rx_copy_thresh) {
  1570. skb = bnxt_copy_skb(bnapi, data_ptr, len, mapping);
  1571. if (!skb) {
  1572. bnxt_abort_tpa(cpr, idx, agg_bufs);
  1573. cpr->sw_stats->rx.rx_oom_discards += 1;
  1574. return NULL;
  1575. }
  1576. } else {
  1577. u8 *new_data;
  1578. dma_addr_t new_mapping;
  1579. new_data = __bnxt_alloc_rx_frag(bp, &new_mapping, rxr,
  1580. GFP_ATOMIC);
  1581. if (!new_data) {
  1582. bnxt_abort_tpa(cpr, idx, agg_bufs);
  1583. cpr->sw_stats->rx.rx_oom_discards += 1;
  1584. return NULL;
  1585. }
  1586. tpa_info->data = new_data;
  1587. tpa_info->data_ptr = new_data + bp->rx_offset;
  1588. tpa_info->mapping = new_mapping;
  1589. skb = napi_build_skb(data, bp->rx_buf_size);
  1590. dma_sync_single_for_cpu(&bp->pdev->dev, mapping,
  1591. bp->rx_buf_use_size, bp->rx_dir);
  1592. if (!skb) {
  1593. page_pool_free_va(rxr->head_pool, data, true);
  1594. bnxt_abort_tpa(cpr, idx, agg_bufs);
  1595. cpr->sw_stats->rx.rx_oom_discards += 1;
  1596. return NULL;
  1597. }
  1598. skb_mark_for_recycle(skb);
  1599. skb_reserve(skb, bp->rx_offset);
  1600. skb_put(skb, len);
  1601. }
  1602. if (agg_bufs) {
  1603. skb = bnxt_rx_agg_pages_skb(bp, cpr, skb, idx, agg_bufs, true);
  1604. if (!skb) {
  1605. /* Page reuse already handled by bnxt_rx_pages(). */
  1606. cpr->sw_stats->rx.rx_oom_discards += 1;
  1607. return NULL;
  1608. }
  1609. }
  1610. if (tpa_info->cfa_code_valid)
  1611. dev = bnxt_get_pkt_dev(bp, tpa_info->cfa_code);
  1612. skb->protocol = eth_type_trans(skb, dev);
  1613. if (tpa_info->hash_type != PKT_HASH_TYPE_NONE)
  1614. skb_set_hash(skb, tpa_info->rss_hash, tpa_info->hash_type);
  1615. if (tpa_info->vlan_valid &&
  1616. (dev->features & BNXT_HW_FEATURE_VLAN_ALL_RX)) {
  1617. __be16 vlan_proto = htons(tpa_info->metadata >>
  1618. RX_CMP_FLAGS2_METADATA_TPID_SFT);
  1619. u16 vtag = tpa_info->metadata & RX_CMP_FLAGS2_METADATA_TCI_MASK;
  1620. if (eth_type_vlan(vlan_proto)) {
  1621. __vlan_hwaccel_put_tag(skb, vlan_proto, vtag);
  1622. } else {
  1623. dev_kfree_skb(skb);
  1624. return NULL;
  1625. }
  1626. }
  1627. skb_checksum_none_assert(skb);
  1628. if (likely(tpa_info->flags2 & RX_TPA_START_CMP_FLAGS2_L4_CS_CALC)) {
  1629. skb->ip_summed = CHECKSUM_UNNECESSARY;
  1630. skb->csum_level =
  1631. (tpa_info->flags2 & RX_CMP_FLAGS2_T_L4_CS_CALC) >> 3;
  1632. }
  1633. if (gro)
  1634. skb = bnxt_gro_skb(bp, tpa_info, tpa_end, tpa_end1, skb);
  1635. return skb;
  1636. }
  1637. static void bnxt_tpa_agg(struct bnxt *bp, struct bnxt_rx_ring_info *rxr,
  1638. struct rx_agg_cmp *rx_agg)
  1639. {
  1640. u16 agg_id = TPA_AGG_AGG_ID(rx_agg);
  1641. struct bnxt_tpa_info *tpa_info;
  1642. agg_id = bnxt_lookup_agg_idx(rxr, agg_id);
  1643. tpa_info = &rxr->rx_tpa[agg_id];
  1644. BUG_ON(tpa_info->agg_count >= MAX_SKB_FRAGS);
  1645. tpa_info->agg_arr[tpa_info->agg_count++] = *rx_agg;
  1646. }
  1647. static void bnxt_deliver_skb(struct bnxt *bp, struct bnxt_napi *bnapi,
  1648. struct sk_buff *skb)
  1649. {
  1650. skb_mark_for_recycle(skb);
  1651. if (skb->dev != bp->dev) {
  1652. /* this packet belongs to a vf-rep */
  1653. bnxt_vf_rep_rx(bp, skb);
  1654. return;
  1655. }
  1656. skb_record_rx_queue(skb, bnapi->index);
  1657. napi_gro_receive(&bnapi->napi, skb);
  1658. }
  1659. static bool bnxt_rx_ts_valid(struct bnxt *bp, u32 flags,
  1660. struct rx_cmp_ext *rxcmp1, u32 *cmpl_ts)
  1661. {
  1662. u32 ts = le32_to_cpu(rxcmp1->rx_cmp_timestamp);
  1663. if (BNXT_PTP_RX_TS_VALID(flags))
  1664. goto ts_valid;
  1665. if (!bp->ptp_all_rx_tstamp || !ts || !BNXT_ALL_RX_TS_VALID(flags))
  1666. return false;
  1667. ts_valid:
  1668. *cmpl_ts = ts;
  1669. return true;
  1670. }
  1671. static struct sk_buff *bnxt_rx_vlan(struct sk_buff *skb, u8 cmp_type,
  1672. struct rx_cmp *rxcmp,
  1673. struct rx_cmp_ext *rxcmp1)
  1674. {
  1675. __be16 vlan_proto;
  1676. u16 vtag;
  1677. if (cmp_type == CMP_TYPE_RX_L2_CMP) {
  1678. __le32 flags2 = rxcmp1->rx_cmp_flags2;
  1679. u32 meta_data;
  1680. if (!(flags2 & cpu_to_le32(RX_CMP_FLAGS2_META_FORMAT_VLAN)))
  1681. return skb;
  1682. meta_data = le32_to_cpu(rxcmp1->rx_cmp_meta_data);
  1683. vtag = meta_data & RX_CMP_FLAGS2_METADATA_TCI_MASK;
  1684. vlan_proto = htons(meta_data >> RX_CMP_FLAGS2_METADATA_TPID_SFT);
  1685. if (eth_type_vlan(vlan_proto))
  1686. __vlan_hwaccel_put_tag(skb, vlan_proto, vtag);
  1687. else
  1688. goto vlan_err;
  1689. } else if (cmp_type == CMP_TYPE_RX_L2_V3_CMP) {
  1690. if (RX_CMP_VLAN_VALID(rxcmp)) {
  1691. u32 tpid_sel = RX_CMP_VLAN_TPID_SEL(rxcmp);
  1692. if (tpid_sel == RX_CMP_METADATA1_TPID_8021Q)
  1693. vlan_proto = htons(ETH_P_8021Q);
  1694. else if (tpid_sel == RX_CMP_METADATA1_TPID_8021AD)
  1695. vlan_proto = htons(ETH_P_8021AD);
  1696. else
  1697. goto vlan_err;
  1698. vtag = RX_CMP_METADATA0_TCI(rxcmp1);
  1699. __vlan_hwaccel_put_tag(skb, vlan_proto, vtag);
  1700. }
  1701. }
  1702. return skb;
  1703. vlan_err:
  1704. skb_mark_for_recycle(skb);
  1705. dev_kfree_skb(skb);
  1706. return NULL;
  1707. }
  1708. static enum pkt_hash_types bnxt_rss_ext_op(struct bnxt *bp,
  1709. struct rx_cmp *rxcmp)
  1710. {
  1711. u8 ext_op;
  1712. ext_op = RX_CMP_V3_HASH_TYPE(bp, rxcmp);
  1713. switch (ext_op) {
  1714. case EXT_OP_INNER_4:
  1715. case EXT_OP_OUTER_4:
  1716. case EXT_OP_INNFL_3:
  1717. case EXT_OP_OUTFL_3:
  1718. return PKT_HASH_TYPE_L4;
  1719. default:
  1720. return PKT_HASH_TYPE_L3;
  1721. }
  1722. }
  1723. /* returns the following:
  1724. * 1 - 1 packet successfully received
  1725. * 0 - successful TPA_START, packet not completed yet
  1726. * -EBUSY - completion ring does not have all the agg buffers yet
  1727. * -ENOMEM - packet aborted due to out of memory
  1728. * -EIO - packet aborted due to hw error indicated in BD
  1729. */
  1730. static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
  1731. u32 *raw_cons, u8 *event)
  1732. {
  1733. struct bnxt_napi *bnapi = cpr->bnapi;
  1734. struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
  1735. struct net_device *dev = bp->dev;
  1736. struct rx_cmp *rxcmp;
  1737. struct rx_cmp_ext *rxcmp1;
  1738. u32 tmp_raw_cons = *raw_cons;
  1739. u16 cons, prod, cp_cons = RING_CMP(tmp_raw_cons);
  1740. struct skb_shared_info *sinfo;
  1741. struct bnxt_sw_rx_bd *rx_buf;
  1742. unsigned int len;
  1743. u8 *data_ptr, agg_bufs, cmp_type;
  1744. bool xdp_active = false;
  1745. dma_addr_t dma_addr;
  1746. struct sk_buff *skb;
  1747. struct xdp_buff xdp;
  1748. u32 flags, misc;
  1749. u32 cmpl_ts;
  1750. void *data;
  1751. int rc = 0;
  1752. rxcmp = (struct rx_cmp *)
  1753. &cpr->cp_desc_ring[CP_RING(cp_cons)][CP_IDX(cp_cons)];
  1754. cmp_type = RX_CMP_TYPE(rxcmp);
  1755. if (cmp_type == CMP_TYPE_RX_TPA_AGG_CMP) {
  1756. bnxt_tpa_agg(bp, rxr, (struct rx_agg_cmp *)rxcmp);
  1757. goto next_rx_no_prod_no_len;
  1758. }
  1759. tmp_raw_cons = NEXT_RAW_CMP(tmp_raw_cons);
  1760. cp_cons = RING_CMP(tmp_raw_cons);
  1761. rxcmp1 = (struct rx_cmp_ext *)
  1762. &cpr->cp_desc_ring[CP_RING(cp_cons)][CP_IDX(cp_cons)];
  1763. if (!RX_CMP_VALID(rxcmp1, tmp_raw_cons))
  1764. return -EBUSY;
  1765. /* The valid test of the entry must be done first before
  1766. * reading any further.
  1767. */
  1768. dma_rmb();
  1769. prod = rxr->rx_prod;
  1770. if (cmp_type == CMP_TYPE_RX_L2_TPA_START_CMP ||
  1771. cmp_type == CMP_TYPE_RX_L2_TPA_START_V3_CMP) {
  1772. bnxt_tpa_start(bp, rxr, cmp_type,
  1773. (struct rx_tpa_start_cmp *)rxcmp,
  1774. (struct rx_tpa_start_cmp_ext *)rxcmp1);
  1775. *event |= BNXT_RX_EVENT;
  1776. goto next_rx_no_prod_no_len;
  1777. } else if (cmp_type == CMP_TYPE_RX_L2_TPA_END_CMP) {
  1778. skb = bnxt_tpa_end(bp, cpr, &tmp_raw_cons,
  1779. (struct rx_tpa_end_cmp *)rxcmp,
  1780. (struct rx_tpa_end_cmp_ext *)rxcmp1, event);
  1781. if (IS_ERR(skb))
  1782. return -EBUSY;
  1783. rc = -ENOMEM;
  1784. if (likely(skb)) {
  1785. bnxt_deliver_skb(bp, bnapi, skb);
  1786. rc = 1;
  1787. }
  1788. *event |= BNXT_RX_EVENT;
  1789. goto next_rx_no_prod_no_len;
  1790. }
  1791. cons = rxcmp->rx_cmp_opaque;
  1792. if (unlikely(cons != rxr->rx_next_cons)) {
  1793. int rc1 = bnxt_discard_rx(bp, cpr, &tmp_raw_cons, rxcmp);
  1794. /* 0xffff is forced error, don't print it */
  1795. if (rxr->rx_next_cons != 0xffff)
  1796. netdev_warn(bp->dev, "RX cons %x != expected cons %x\n",
  1797. cons, rxr->rx_next_cons);
  1798. bnxt_sched_reset_rxr(bp, rxr);
  1799. if (rc1)
  1800. return rc1;
  1801. goto next_rx_no_prod_no_len;
  1802. }
  1803. rx_buf = &rxr->rx_buf_ring[cons];
  1804. data = rx_buf->data;
  1805. data_ptr = rx_buf->data_ptr;
  1806. prefetch(data_ptr);
  1807. misc = le32_to_cpu(rxcmp->rx_cmp_misc_v1);
  1808. agg_bufs = (misc & RX_CMP_AGG_BUFS) >> RX_CMP_AGG_BUFS_SHIFT;
  1809. if (agg_bufs) {
  1810. if (!bnxt_agg_bufs_valid(bp, cpr, agg_bufs, &tmp_raw_cons))
  1811. return -EBUSY;
  1812. cp_cons = NEXT_CMP(cp_cons);
  1813. *event |= BNXT_AGG_EVENT;
  1814. }
  1815. *event |= BNXT_RX_EVENT;
  1816. rx_buf->data = NULL;
  1817. if (rxcmp1->rx_cmp_cfa_code_errors_v2 & RX_CMP_L2_ERRORS) {
  1818. u32 rx_err = le32_to_cpu(rxcmp1->rx_cmp_cfa_code_errors_v2);
  1819. bnxt_reuse_rx_data(rxr, cons, data);
  1820. if (agg_bufs)
  1821. bnxt_reuse_rx_agg_bufs(cpr, cp_cons, 0, agg_bufs,
  1822. false);
  1823. rc = -EIO;
  1824. if (rx_err & RX_CMPL_ERRORS_BUFFER_ERROR_MASK) {
  1825. bnapi->cp_ring.sw_stats->rx.rx_buf_errors++;
  1826. if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS) &&
  1827. !(bp->fw_cap & BNXT_FW_CAP_RING_MONITOR)) {
  1828. netdev_warn_once(bp->dev, "RX buffer error %x\n",
  1829. rx_err);
  1830. bnxt_sched_reset_rxr(bp, rxr);
  1831. }
  1832. }
  1833. goto next_rx_no_len;
  1834. }
  1835. flags = le32_to_cpu(rxcmp->rx_cmp_len_flags_type);
  1836. len = flags >> RX_CMP_LEN_SHIFT;
  1837. dma_addr = rx_buf->mapping;
  1838. if (bnxt_xdp_attached(bp, rxr)) {
  1839. bnxt_xdp_buff_init(bp, rxr, cons, data_ptr, len, &xdp);
  1840. if (agg_bufs) {
  1841. u32 frag_len = bnxt_rx_agg_pages_xdp(bp, cpr, &xdp,
  1842. cp_cons, agg_bufs,
  1843. false);
  1844. if (!frag_len)
  1845. goto oom_next_rx;
  1846. }
  1847. xdp_active = true;
  1848. }
  1849. if (xdp_active) {
  1850. if (bnxt_rx_xdp(bp, rxr, cons, &xdp, data, &data_ptr, &len, event)) {
  1851. rc = 1;
  1852. goto next_rx;
  1853. }
  1854. if (xdp_buff_has_frags(&xdp)) {
  1855. sinfo = xdp_get_shared_info_from_buff(&xdp);
  1856. agg_bufs = sinfo->nr_frags;
  1857. } else {
  1858. agg_bufs = 0;
  1859. }
  1860. }
  1861. if (len <= bp->rx_copy_thresh) {
  1862. if (!xdp_active)
  1863. skb = bnxt_copy_skb(bnapi, data_ptr, len, dma_addr);
  1864. else
  1865. skb = bnxt_copy_xdp(bnapi, &xdp, len, dma_addr);
  1866. bnxt_reuse_rx_data(rxr, cons, data);
  1867. if (!skb) {
  1868. if (agg_bufs) {
  1869. if (!xdp_active)
  1870. bnxt_reuse_rx_agg_bufs(cpr, cp_cons, 0,
  1871. agg_bufs, false);
  1872. else
  1873. bnxt_xdp_buff_frags_free(rxr, &xdp);
  1874. }
  1875. goto oom_next_rx;
  1876. }
  1877. } else {
  1878. u32 payload;
  1879. if (rx_buf->data_ptr == data_ptr)
  1880. payload = misc & RX_CMP_PAYLOAD_OFFSET;
  1881. else
  1882. payload = 0;
  1883. skb = bp->rx_skb_func(bp, rxr, cons, data, data_ptr, dma_addr,
  1884. payload | len);
  1885. if (!skb)
  1886. goto oom_next_rx;
  1887. }
  1888. if (agg_bufs) {
  1889. if (!xdp_active) {
  1890. skb = bnxt_rx_agg_pages_skb(bp, cpr, skb, cp_cons, agg_bufs, false);
  1891. if (!skb)
  1892. goto oom_next_rx;
  1893. } else {
  1894. skb = bnxt_xdp_build_skb(bp, skb, agg_bufs,
  1895. rxr->page_pool, &xdp);
  1896. if (!skb) {
  1897. /* we should be able to free the old skb here */
  1898. bnxt_xdp_buff_frags_free(rxr, &xdp);
  1899. goto oom_next_rx;
  1900. }
  1901. }
  1902. }
  1903. if (RX_CMP_HASH_VALID(rxcmp)) {
  1904. enum pkt_hash_types type;
  1905. if (cmp_type == CMP_TYPE_RX_L2_V3_CMP) {
  1906. type = bnxt_rss_ext_op(bp, rxcmp);
  1907. } else {
  1908. u32 itypes = RX_CMP_ITYPES(rxcmp);
  1909. if (itypes == RX_CMP_FLAGS_ITYPE_TCP ||
  1910. itypes == RX_CMP_FLAGS_ITYPE_UDP)
  1911. type = PKT_HASH_TYPE_L4;
  1912. else
  1913. type = PKT_HASH_TYPE_L3;
  1914. }
  1915. skb_set_hash(skb, le32_to_cpu(rxcmp->rx_cmp_rss_hash), type);
  1916. }
  1917. if (cmp_type == CMP_TYPE_RX_L2_CMP)
  1918. dev = bnxt_get_pkt_dev(bp, RX_CMP_CFA_CODE(rxcmp1));
  1919. skb->protocol = eth_type_trans(skb, dev);
  1920. if (skb->dev->features & BNXT_HW_FEATURE_VLAN_ALL_RX) {
  1921. skb = bnxt_rx_vlan(skb, cmp_type, rxcmp, rxcmp1);
  1922. if (!skb)
  1923. goto next_rx;
  1924. }
  1925. skb_checksum_none_assert(skb);
  1926. if (RX_CMP_L4_CS_OK(rxcmp1)) {
  1927. if (dev->features & NETIF_F_RXCSUM) {
  1928. skb->ip_summed = CHECKSUM_UNNECESSARY;
  1929. skb->csum_level = RX_CMP_ENCAP(rxcmp1);
  1930. }
  1931. } else {
  1932. if (rxcmp1->rx_cmp_cfa_code_errors_v2 & RX_CMP_L4_CS_ERR_BITS) {
  1933. if (dev->features & NETIF_F_RXCSUM)
  1934. bnapi->cp_ring.sw_stats->rx.rx_l4_csum_errors++;
  1935. }
  1936. }
  1937. if (bnxt_rx_ts_valid(bp, flags, rxcmp1, &cmpl_ts)) {
  1938. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  1939. u64 ns, ts;
  1940. if (!bnxt_get_rx_ts_p5(bp, &ts, cmpl_ts)) {
  1941. struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;
  1942. unsigned long flags;
  1943. spin_lock_irqsave(&ptp->ptp_lock, flags);
  1944. ns = timecounter_cyc2time(&ptp->tc, ts);
  1945. spin_unlock_irqrestore(&ptp->ptp_lock, flags);
  1946. memset(skb_hwtstamps(skb), 0,
  1947. sizeof(*skb_hwtstamps(skb)));
  1948. skb_hwtstamps(skb)->hwtstamp = ns_to_ktime(ns);
  1949. }
  1950. }
  1951. }
  1952. bnxt_deliver_skb(bp, bnapi, skb);
  1953. rc = 1;
  1954. next_rx:
  1955. cpr->rx_packets += 1;
  1956. cpr->rx_bytes += len;
  1957. next_rx_no_len:
  1958. rxr->rx_prod = NEXT_RX(prod);
  1959. rxr->rx_next_cons = RING_RX(bp, NEXT_RX(cons));
  1960. next_rx_no_prod_no_len:
  1961. *raw_cons = tmp_raw_cons;
  1962. return rc;
  1963. oom_next_rx:
  1964. cpr->sw_stats->rx.rx_oom_discards += 1;
  1965. rc = -ENOMEM;
  1966. goto next_rx;
  1967. }
  1968. /* In netpoll mode, if we are using a combined completion ring, we need to
  1969. * discard the rx packets and recycle the buffers.
  1970. */
  1971. static int bnxt_force_rx_discard(struct bnxt *bp,
  1972. struct bnxt_cp_ring_info *cpr,
  1973. u32 *raw_cons, u8 *event)
  1974. {
  1975. u32 tmp_raw_cons = *raw_cons;
  1976. struct rx_cmp_ext *rxcmp1;
  1977. struct rx_cmp *rxcmp;
  1978. u16 cp_cons;
  1979. u8 cmp_type;
  1980. int rc;
  1981. cp_cons = RING_CMP(tmp_raw_cons);
  1982. rxcmp = (struct rx_cmp *)
  1983. &cpr->cp_desc_ring[CP_RING(cp_cons)][CP_IDX(cp_cons)];
  1984. tmp_raw_cons = NEXT_RAW_CMP(tmp_raw_cons);
  1985. cp_cons = RING_CMP(tmp_raw_cons);
  1986. rxcmp1 = (struct rx_cmp_ext *)
  1987. &cpr->cp_desc_ring[CP_RING(cp_cons)][CP_IDX(cp_cons)];
  1988. if (!RX_CMP_VALID(rxcmp1, tmp_raw_cons))
  1989. return -EBUSY;
  1990. /* The valid test of the entry must be done first before
  1991. * reading any further.
  1992. */
  1993. dma_rmb();
  1994. cmp_type = RX_CMP_TYPE(rxcmp);
  1995. if (cmp_type == CMP_TYPE_RX_L2_CMP ||
  1996. cmp_type == CMP_TYPE_RX_L2_V3_CMP) {
  1997. rxcmp1->rx_cmp_cfa_code_errors_v2 |=
  1998. cpu_to_le32(RX_CMPL_ERRORS_CRC_ERROR);
  1999. } else if (cmp_type == CMP_TYPE_RX_L2_TPA_END_CMP) {
  2000. struct rx_tpa_end_cmp_ext *tpa_end1;
  2001. tpa_end1 = (struct rx_tpa_end_cmp_ext *)rxcmp1;
  2002. tpa_end1->rx_tpa_end_cmp_errors_v2 |=
  2003. cpu_to_le32(RX_TPA_END_CMP_ERRORS);
  2004. }
  2005. rc = bnxt_rx_pkt(bp, cpr, raw_cons, event);
  2006. if (rc && rc != -EBUSY)
  2007. cpr->sw_stats->rx.rx_netpoll_discards += 1;
  2008. return rc;
  2009. }
  2010. u32 bnxt_fw_health_readl(struct bnxt *bp, int reg_idx)
  2011. {
  2012. struct bnxt_fw_health *fw_health = bp->fw_health;
  2013. u32 reg = fw_health->regs[reg_idx];
  2014. u32 reg_type, reg_off, val = 0;
  2015. reg_type = BNXT_FW_HEALTH_REG_TYPE(reg);
  2016. reg_off = BNXT_FW_HEALTH_REG_OFF(reg);
  2017. switch (reg_type) {
  2018. case BNXT_FW_HEALTH_REG_TYPE_CFG:
  2019. pci_read_config_dword(bp->pdev, reg_off, &val);
  2020. break;
  2021. case BNXT_FW_HEALTH_REG_TYPE_GRC:
  2022. reg_off = fw_health->mapped_regs[reg_idx];
  2023. fallthrough;
  2024. case BNXT_FW_HEALTH_REG_TYPE_BAR0:
  2025. val = readl(bp->bar0 + reg_off);
  2026. break;
  2027. case BNXT_FW_HEALTH_REG_TYPE_BAR1:
  2028. val = readl(bp->bar1 + reg_off);
  2029. break;
  2030. }
  2031. if (reg_idx == BNXT_FW_RESET_INPROG_REG)
  2032. val &= fw_health->fw_reset_inprog_reg_mask;
  2033. return val;
  2034. }
  2035. static u16 bnxt_agg_ring_id_to_grp_idx(struct bnxt *bp, u16 ring_id)
  2036. {
  2037. int i;
  2038. for (i = 0; i < bp->rx_nr_rings; i++) {
  2039. u16 grp_idx = bp->rx_ring[i].bnapi->index;
  2040. struct bnxt_ring_grp_info *grp_info;
  2041. grp_info = &bp->grp_info[grp_idx];
  2042. if (grp_info->agg_fw_ring_id == ring_id)
  2043. return grp_idx;
  2044. }
  2045. return INVALID_HW_RING_ID;
  2046. }
  2047. static u16 bnxt_get_force_speed(struct bnxt_link_info *link_info)
  2048. {
  2049. struct bnxt *bp = container_of(link_info, struct bnxt, link_info);
  2050. if (bp->phy_flags & BNXT_PHY_FL_SPEEDS2)
  2051. return link_info->force_link_speed2;
  2052. if (link_info->req_signal_mode == BNXT_SIG_MODE_PAM4)
  2053. return link_info->force_pam4_link_speed;
  2054. return link_info->force_link_speed;
  2055. }
  2056. static void bnxt_set_force_speed(struct bnxt_link_info *link_info)
  2057. {
  2058. struct bnxt *bp = container_of(link_info, struct bnxt, link_info);
  2059. if (bp->phy_flags & BNXT_PHY_FL_SPEEDS2) {
  2060. link_info->req_link_speed = link_info->force_link_speed2;
  2061. link_info->req_signal_mode = BNXT_SIG_MODE_NRZ;
  2062. switch (link_info->req_link_speed) {
  2063. case BNXT_LINK_SPEED_50GB_PAM4:
  2064. case BNXT_LINK_SPEED_100GB_PAM4:
  2065. case BNXT_LINK_SPEED_200GB_PAM4:
  2066. case BNXT_LINK_SPEED_400GB_PAM4:
  2067. link_info->req_signal_mode = BNXT_SIG_MODE_PAM4;
  2068. break;
  2069. case BNXT_LINK_SPEED_100GB_PAM4_112:
  2070. case BNXT_LINK_SPEED_200GB_PAM4_112:
  2071. case BNXT_LINK_SPEED_400GB_PAM4_112:
  2072. link_info->req_signal_mode = BNXT_SIG_MODE_PAM4_112;
  2073. break;
  2074. default:
  2075. link_info->req_signal_mode = BNXT_SIG_MODE_NRZ;
  2076. }
  2077. return;
  2078. }
  2079. link_info->req_link_speed = link_info->force_link_speed;
  2080. link_info->req_signal_mode = BNXT_SIG_MODE_NRZ;
  2081. if (link_info->force_pam4_link_speed) {
  2082. link_info->req_link_speed = link_info->force_pam4_link_speed;
  2083. link_info->req_signal_mode = BNXT_SIG_MODE_PAM4;
  2084. }
  2085. }
  2086. static void bnxt_set_auto_speed(struct bnxt_link_info *link_info)
  2087. {
  2088. struct bnxt *bp = container_of(link_info, struct bnxt, link_info);
  2089. if (bp->phy_flags & BNXT_PHY_FL_SPEEDS2) {
  2090. link_info->advertising = link_info->auto_link_speeds2;
  2091. return;
  2092. }
  2093. link_info->advertising = link_info->auto_link_speeds;
  2094. link_info->advertising_pam4 = link_info->auto_pam4_link_speeds;
  2095. }
  2096. static bool bnxt_force_speed_updated(struct bnxt_link_info *link_info)
  2097. {
  2098. struct bnxt *bp = container_of(link_info, struct bnxt, link_info);
  2099. if (bp->phy_flags & BNXT_PHY_FL_SPEEDS2) {
  2100. if (link_info->req_link_speed != link_info->force_link_speed2)
  2101. return true;
  2102. return false;
  2103. }
  2104. if (link_info->req_signal_mode == BNXT_SIG_MODE_NRZ &&
  2105. link_info->req_link_speed != link_info->force_link_speed)
  2106. return true;
  2107. if (link_info->req_signal_mode == BNXT_SIG_MODE_PAM4 &&
  2108. link_info->req_link_speed != link_info->force_pam4_link_speed)
  2109. return true;
  2110. return false;
  2111. }
  2112. static bool bnxt_auto_speed_updated(struct bnxt_link_info *link_info)
  2113. {
  2114. struct bnxt *bp = container_of(link_info, struct bnxt, link_info);
  2115. if (bp->phy_flags & BNXT_PHY_FL_SPEEDS2) {
  2116. if (link_info->advertising != link_info->auto_link_speeds2)
  2117. return true;
  2118. return false;
  2119. }
  2120. if (link_info->advertising != link_info->auto_link_speeds ||
  2121. link_info->advertising_pam4 != link_info->auto_pam4_link_speeds)
  2122. return true;
  2123. return false;
  2124. }
  2125. #define BNXT_EVENT_THERMAL_CURRENT_TEMP(data2) \
  2126. ((data2) & \
  2127. ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA2_CURRENT_TEMP_MASK)
  2128. #define BNXT_EVENT_THERMAL_THRESHOLD_TEMP(data2) \
  2129. (((data2) & \
  2130. ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA2_THRESHOLD_TEMP_MASK) >>\
  2131. ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA2_THRESHOLD_TEMP_SFT)
  2132. #define EVENT_DATA1_THERMAL_THRESHOLD_TYPE(data1) \
  2133. ((data1) & \
  2134. ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA1_THRESHOLD_TYPE_MASK)
  2135. #define EVENT_DATA1_THERMAL_THRESHOLD_DIR_INCREASING(data1) \
  2136. (((data1) & \
  2137. ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA1_TRANSITION_DIR) ==\
  2138. ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA1_TRANSITION_DIR_INCREASING)
  2139. /* Return true if the workqueue has to be scheduled */
  2140. static bool bnxt_event_error_report(struct bnxt *bp, u32 data1, u32 data2)
  2141. {
  2142. u32 err_type = BNXT_EVENT_ERROR_REPORT_TYPE(data1);
  2143. switch (err_type) {
  2144. case ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_INVALID_SIGNAL:
  2145. netdev_err(bp->dev, "1PPS: Received invalid signal on pin%lu from the external source. Please fix the signal and reconfigure the pin\n",
  2146. BNXT_EVENT_INVALID_SIGNAL_DATA(data2));
  2147. break;
  2148. case ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_PAUSE_STORM:
  2149. netdev_warn(bp->dev, "Pause Storm detected!\n");
  2150. break;
  2151. case ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_DOORBELL_DROP_THRESHOLD:
  2152. netdev_warn(bp->dev, "One or more MMIO doorbells dropped by the device!\n");
  2153. break;
  2154. case ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_THERMAL_THRESHOLD: {
  2155. u32 type = EVENT_DATA1_THERMAL_THRESHOLD_TYPE(data1);
  2156. char *threshold_type;
  2157. bool notify = false;
  2158. char *dir_str;
  2159. switch (type) {
  2160. case ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA1_THRESHOLD_TYPE_WARN:
  2161. threshold_type = "warning";
  2162. break;
  2163. case ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA1_THRESHOLD_TYPE_CRITICAL:
  2164. threshold_type = "critical";
  2165. break;
  2166. case ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA1_THRESHOLD_TYPE_FATAL:
  2167. threshold_type = "fatal";
  2168. break;
  2169. case ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA1_THRESHOLD_TYPE_SHUTDOWN:
  2170. threshold_type = "shutdown";
  2171. break;
  2172. default:
  2173. netdev_err(bp->dev, "Unknown Thermal threshold type event\n");
  2174. return false;
  2175. }
  2176. if (EVENT_DATA1_THERMAL_THRESHOLD_DIR_INCREASING(data1)) {
  2177. dir_str = "above";
  2178. notify = true;
  2179. } else {
  2180. dir_str = "below";
  2181. }
  2182. netdev_warn(bp->dev, "Chip temperature has gone %s the %s thermal threshold!\n",
  2183. dir_str, threshold_type);
  2184. netdev_warn(bp->dev, "Temperature (In Celsius), Current: %lu, threshold: %lu\n",
  2185. BNXT_EVENT_THERMAL_CURRENT_TEMP(data2),
  2186. BNXT_EVENT_THERMAL_THRESHOLD_TEMP(data2));
  2187. if (notify) {
  2188. bp->thermal_threshold_type = type;
  2189. set_bit(BNXT_THERMAL_THRESHOLD_SP_EVENT, &bp->sp_event);
  2190. return true;
  2191. }
  2192. return false;
  2193. }
  2194. case ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_DUAL_DATA_RATE_NOT_SUPPORTED:
  2195. netdev_warn(bp->dev, "Speed change not supported with dual rate transceivers on this board\n");
  2196. break;
  2197. default:
  2198. netdev_err(bp->dev, "FW reported unknown error type %u\n",
  2199. err_type);
  2200. break;
  2201. }
  2202. return false;
  2203. }
  2204. #define BNXT_GET_EVENT_PORT(data) \
  2205. ((data) & \
  2206. ASYNC_EVENT_CMPL_PORT_CONN_NOT_ALLOWED_EVENT_DATA1_PORT_ID_MASK)
  2207. #define BNXT_EVENT_RING_TYPE(data2) \
  2208. ((data2) & \
  2209. ASYNC_EVENT_CMPL_RING_MONITOR_MSG_EVENT_DATA2_DISABLE_RING_TYPE_MASK)
  2210. #define BNXT_EVENT_RING_TYPE_RX(data2) \
  2211. (BNXT_EVENT_RING_TYPE(data2) == \
  2212. ASYNC_EVENT_CMPL_RING_MONITOR_MSG_EVENT_DATA2_DISABLE_RING_TYPE_RX)
  2213. #define BNXT_EVENT_PHC_EVENT_TYPE(data1) \
  2214. (((data1) & ASYNC_EVENT_CMPL_PHC_UPDATE_EVENT_DATA1_FLAGS_MASK) >>\
  2215. ASYNC_EVENT_CMPL_PHC_UPDATE_EVENT_DATA1_FLAGS_SFT)
  2216. #define BNXT_EVENT_PHC_RTC_UPDATE(data1) \
  2217. (((data1) & ASYNC_EVENT_CMPL_PHC_UPDATE_EVENT_DATA1_PHC_TIME_MSB_MASK) >>\
  2218. ASYNC_EVENT_CMPL_PHC_UPDATE_EVENT_DATA1_PHC_TIME_MSB_SFT)
  2219. #define BNXT_PHC_BITS 48
  2220. static int bnxt_async_event_process(struct bnxt *bp,
  2221. struct hwrm_async_event_cmpl *cmpl)
  2222. {
  2223. u16 event_id = le16_to_cpu(cmpl->event_id);
  2224. u32 data1 = le32_to_cpu(cmpl->event_data1);
  2225. u32 data2 = le32_to_cpu(cmpl->event_data2);
  2226. netdev_dbg(bp->dev, "hwrm event 0x%x {0x%x, 0x%x}\n",
  2227. event_id, data1, data2);
  2228. /* TODO CHIMP_FW: Define event id's for link change, error etc */
  2229. switch (event_id) {
  2230. case ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CFG_CHANGE: {
  2231. struct bnxt_link_info *link_info = &bp->link_info;
  2232. if (BNXT_VF(bp))
  2233. goto async_event_process_exit;
  2234. /* print unsupported speed warning in forced speed mode only */
  2235. if (!(link_info->autoneg & BNXT_AUTONEG_SPEED) &&
  2236. (data1 & 0x20000)) {
  2237. u16 fw_speed = bnxt_get_force_speed(link_info);
  2238. u32 speed = bnxt_fw_to_ethtool_speed(fw_speed);
  2239. if (speed != SPEED_UNKNOWN)
  2240. netdev_warn(bp->dev, "Link speed %d no longer supported\n",
  2241. speed);
  2242. }
  2243. set_bit(BNXT_LINK_SPEED_CHNG_SP_EVENT, &bp->sp_event);
  2244. }
  2245. fallthrough;
  2246. case ASYNC_EVENT_CMPL_EVENT_ID_LINK_SPEED_CHANGE:
  2247. case ASYNC_EVENT_CMPL_EVENT_ID_PORT_PHY_CFG_CHANGE:
  2248. set_bit(BNXT_LINK_CFG_CHANGE_SP_EVENT, &bp->sp_event);
  2249. fallthrough;
  2250. case ASYNC_EVENT_CMPL_EVENT_ID_LINK_STATUS_CHANGE:
  2251. set_bit(BNXT_LINK_CHNG_SP_EVENT, &bp->sp_event);
  2252. break;
  2253. case ASYNC_EVENT_CMPL_EVENT_ID_PF_DRVR_UNLOAD:
  2254. set_bit(BNXT_HWRM_PF_UNLOAD_SP_EVENT, &bp->sp_event);
  2255. break;
  2256. case ASYNC_EVENT_CMPL_EVENT_ID_PORT_CONN_NOT_ALLOWED: {
  2257. u16 port_id = BNXT_GET_EVENT_PORT(data1);
  2258. if (BNXT_VF(bp))
  2259. break;
  2260. if (bp->pf.port_id != port_id)
  2261. break;
  2262. set_bit(BNXT_HWRM_PORT_MODULE_SP_EVENT, &bp->sp_event);
  2263. break;
  2264. }
  2265. case ASYNC_EVENT_CMPL_EVENT_ID_VF_CFG_CHANGE:
  2266. if (BNXT_PF(bp))
  2267. goto async_event_process_exit;
  2268. set_bit(BNXT_RESET_TASK_SILENT_SP_EVENT, &bp->sp_event);
  2269. break;
  2270. case ASYNC_EVENT_CMPL_EVENT_ID_RESET_NOTIFY: {
  2271. char *type_str = "Solicited";
  2272. if (!bp->fw_health)
  2273. goto async_event_process_exit;
  2274. bp->fw_reset_timestamp = jiffies;
  2275. bp->fw_reset_min_dsecs = cmpl->timestamp_lo;
  2276. if (!bp->fw_reset_min_dsecs)
  2277. bp->fw_reset_min_dsecs = BNXT_DFLT_FW_RST_MIN_DSECS;
  2278. bp->fw_reset_max_dsecs = le16_to_cpu(cmpl->timestamp_hi);
  2279. if (!bp->fw_reset_max_dsecs)
  2280. bp->fw_reset_max_dsecs = BNXT_DFLT_FW_RST_MAX_DSECS;
  2281. if (EVENT_DATA1_RESET_NOTIFY_FW_ACTIVATION(data1)) {
  2282. set_bit(BNXT_STATE_FW_ACTIVATE_RESET, &bp->state);
  2283. } else if (EVENT_DATA1_RESET_NOTIFY_FATAL(data1)) {
  2284. type_str = "Fatal";
  2285. bp->fw_health->fatalities++;
  2286. set_bit(BNXT_STATE_FW_FATAL_COND, &bp->state);
  2287. } else if (data2 && BNXT_FW_STATUS_HEALTHY !=
  2288. EVENT_DATA2_RESET_NOTIFY_FW_STATUS_CODE(data2)) {
  2289. type_str = "Non-fatal";
  2290. bp->fw_health->survivals++;
  2291. set_bit(BNXT_STATE_FW_NON_FATAL_COND, &bp->state);
  2292. }
  2293. netif_warn(bp, hw, bp->dev,
  2294. "%s firmware reset event, data1: 0x%x, data2: 0x%x, min wait %u ms, max wait %u ms\n",
  2295. type_str, data1, data2,
  2296. bp->fw_reset_min_dsecs * 100,
  2297. bp->fw_reset_max_dsecs * 100);
  2298. set_bit(BNXT_FW_RESET_NOTIFY_SP_EVENT, &bp->sp_event);
  2299. break;
  2300. }
  2301. case ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY: {
  2302. struct bnxt_fw_health *fw_health = bp->fw_health;
  2303. char *status_desc = "healthy";
  2304. u32 status;
  2305. if (!fw_health)
  2306. goto async_event_process_exit;
  2307. if (!EVENT_DATA1_RECOVERY_ENABLED(data1)) {
  2308. fw_health->enabled = false;
  2309. netif_info(bp, drv, bp->dev, "Driver recovery watchdog is disabled\n");
  2310. break;
  2311. }
  2312. fw_health->primary = EVENT_DATA1_RECOVERY_MASTER_FUNC(data1);
  2313. fw_health->tmr_multiplier =
  2314. DIV_ROUND_UP(fw_health->polling_dsecs * HZ,
  2315. bp->current_interval * 10);
  2316. fw_health->tmr_counter = fw_health->tmr_multiplier;
  2317. if (!fw_health->enabled)
  2318. fw_health->last_fw_heartbeat =
  2319. bnxt_fw_health_readl(bp, BNXT_FW_HEARTBEAT_REG);
  2320. fw_health->last_fw_reset_cnt =
  2321. bnxt_fw_health_readl(bp, BNXT_FW_RESET_CNT_REG);
  2322. status = bnxt_fw_health_readl(bp, BNXT_FW_HEALTH_REG);
  2323. if (status != BNXT_FW_STATUS_HEALTHY)
  2324. status_desc = "unhealthy";
  2325. netif_info(bp, drv, bp->dev,
  2326. "Driver recovery watchdog, role: %s, firmware status: 0x%x (%s), resets: %u\n",
  2327. fw_health->primary ? "primary" : "backup", status,
  2328. status_desc, fw_health->last_fw_reset_cnt);
  2329. if (!fw_health->enabled) {
  2330. /* Make sure tmr_counter is set and visible to
  2331. * bnxt_health_check() before setting enabled to true.
  2332. */
  2333. smp_wmb();
  2334. fw_health->enabled = true;
  2335. }
  2336. goto async_event_process_exit;
  2337. }
  2338. case ASYNC_EVENT_CMPL_EVENT_ID_DEBUG_NOTIFICATION:
  2339. netif_notice(bp, hw, bp->dev,
  2340. "Received firmware debug notification, data1: 0x%x, data2: 0x%x\n",
  2341. data1, data2);
  2342. goto async_event_process_exit;
  2343. case ASYNC_EVENT_CMPL_EVENT_ID_RING_MONITOR_MSG: {
  2344. struct bnxt_rx_ring_info *rxr;
  2345. u16 grp_idx;
  2346. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  2347. goto async_event_process_exit;
  2348. netdev_warn(bp->dev, "Ring monitor event, ring type %lu id 0x%x\n",
  2349. BNXT_EVENT_RING_TYPE(data2), data1);
  2350. if (!BNXT_EVENT_RING_TYPE_RX(data2))
  2351. goto async_event_process_exit;
  2352. grp_idx = bnxt_agg_ring_id_to_grp_idx(bp, data1);
  2353. if (grp_idx == INVALID_HW_RING_ID) {
  2354. netdev_warn(bp->dev, "Unknown RX agg ring id 0x%x\n",
  2355. data1);
  2356. goto async_event_process_exit;
  2357. }
  2358. rxr = bp->bnapi[grp_idx]->rx_ring;
  2359. bnxt_sched_reset_rxr(bp, rxr);
  2360. goto async_event_process_exit;
  2361. }
  2362. case ASYNC_EVENT_CMPL_EVENT_ID_ECHO_REQUEST: {
  2363. struct bnxt_fw_health *fw_health = bp->fw_health;
  2364. netif_notice(bp, hw, bp->dev,
  2365. "Received firmware echo request, data1: 0x%x, data2: 0x%x\n",
  2366. data1, data2);
  2367. if (fw_health) {
  2368. fw_health->echo_req_data1 = data1;
  2369. fw_health->echo_req_data2 = data2;
  2370. set_bit(BNXT_FW_ECHO_REQUEST_SP_EVENT, &bp->sp_event);
  2371. break;
  2372. }
  2373. goto async_event_process_exit;
  2374. }
  2375. case ASYNC_EVENT_CMPL_EVENT_ID_PPS_TIMESTAMP: {
  2376. bnxt_ptp_pps_event(bp, data1, data2);
  2377. goto async_event_process_exit;
  2378. }
  2379. case ASYNC_EVENT_CMPL_EVENT_ID_ERROR_REPORT: {
  2380. if (bnxt_event_error_report(bp, data1, data2))
  2381. break;
  2382. goto async_event_process_exit;
  2383. }
  2384. case ASYNC_EVENT_CMPL_EVENT_ID_PHC_UPDATE: {
  2385. switch (BNXT_EVENT_PHC_EVENT_TYPE(data1)) {
  2386. case ASYNC_EVENT_CMPL_PHC_UPDATE_EVENT_DATA1_FLAGS_PHC_RTC_UPDATE:
  2387. if (BNXT_PTP_USE_RTC(bp)) {
  2388. struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;
  2389. unsigned long flags;
  2390. u64 ns;
  2391. if (!ptp)
  2392. goto async_event_process_exit;
  2393. spin_lock_irqsave(&ptp->ptp_lock, flags);
  2394. bnxt_ptp_update_current_time(bp);
  2395. ns = (((u64)BNXT_EVENT_PHC_RTC_UPDATE(data1) <<
  2396. BNXT_PHC_BITS) | ptp->current_time);
  2397. bnxt_ptp_rtc_timecounter_init(ptp, ns);
  2398. spin_unlock_irqrestore(&ptp->ptp_lock, flags);
  2399. }
  2400. break;
  2401. }
  2402. goto async_event_process_exit;
  2403. }
  2404. case ASYNC_EVENT_CMPL_EVENT_ID_DEFERRED_RESPONSE: {
  2405. u16 seq_id = le32_to_cpu(cmpl->event_data2) & 0xffff;
  2406. hwrm_update_token(bp, seq_id, BNXT_HWRM_DEFERRED);
  2407. goto async_event_process_exit;
  2408. }
  2409. default:
  2410. goto async_event_process_exit;
  2411. }
  2412. __bnxt_queue_sp_work(bp);
  2413. async_event_process_exit:
  2414. return 0;
  2415. }
  2416. static int bnxt_hwrm_handler(struct bnxt *bp, struct tx_cmp *txcmp)
  2417. {
  2418. u16 cmpl_type = TX_CMP_TYPE(txcmp), vf_id, seq_id;
  2419. struct hwrm_cmpl *h_cmpl = (struct hwrm_cmpl *)txcmp;
  2420. struct hwrm_fwd_req_cmpl *fwd_req_cmpl =
  2421. (struct hwrm_fwd_req_cmpl *)txcmp;
  2422. switch (cmpl_type) {
  2423. case CMPL_BASE_TYPE_HWRM_DONE:
  2424. seq_id = le16_to_cpu(h_cmpl->sequence_id);
  2425. hwrm_update_token(bp, seq_id, BNXT_HWRM_COMPLETE);
  2426. break;
  2427. case CMPL_BASE_TYPE_HWRM_FWD_REQ:
  2428. vf_id = le16_to_cpu(fwd_req_cmpl->source_id);
  2429. if ((vf_id < bp->pf.first_vf_id) ||
  2430. (vf_id >= bp->pf.first_vf_id + bp->pf.active_vfs)) {
  2431. netdev_err(bp->dev, "Msg contains invalid VF id %x\n",
  2432. vf_id);
  2433. return -EINVAL;
  2434. }
  2435. set_bit(vf_id - bp->pf.first_vf_id, bp->pf.vf_event_bmap);
  2436. bnxt_queue_sp_work(bp, BNXT_HWRM_EXEC_FWD_REQ_SP_EVENT);
  2437. break;
  2438. case CMPL_BASE_TYPE_HWRM_ASYNC_EVENT:
  2439. bnxt_async_event_process(bp,
  2440. (struct hwrm_async_event_cmpl *)txcmp);
  2441. break;
  2442. default:
  2443. break;
  2444. }
  2445. return 0;
  2446. }
  2447. static bool bnxt_vnic_is_active(struct bnxt *bp)
  2448. {
  2449. struct bnxt_vnic_info *vnic = &bp->vnic_info[0];
  2450. return vnic->fw_vnic_id != INVALID_HW_RING_ID && vnic->mru > 0;
  2451. }
  2452. static irqreturn_t bnxt_msix(int irq, void *dev_instance)
  2453. {
  2454. struct bnxt_napi *bnapi = dev_instance;
  2455. struct bnxt *bp = bnapi->bp;
  2456. struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
  2457. u32 cons = RING_CMP(cpr->cp_raw_cons);
  2458. cpr->event_ctr++;
  2459. prefetch(&cpr->cp_desc_ring[CP_RING(cons)][CP_IDX(cons)]);
  2460. napi_schedule(&bnapi->napi);
  2461. return IRQ_HANDLED;
  2462. }
  2463. static inline int bnxt_has_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr)
  2464. {
  2465. u32 raw_cons = cpr->cp_raw_cons;
  2466. u16 cons = RING_CMP(raw_cons);
  2467. struct tx_cmp *txcmp;
  2468. txcmp = &cpr->cp_desc_ring[CP_RING(cons)][CP_IDX(cons)];
  2469. return TX_CMP_VALID(txcmp, raw_cons);
  2470. }
  2471. static int __bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
  2472. int budget)
  2473. {
  2474. struct bnxt_napi *bnapi = cpr->bnapi;
  2475. u32 raw_cons = cpr->cp_raw_cons;
  2476. bool flush_xdp = false;
  2477. u32 cons;
  2478. int rx_pkts = 0;
  2479. u8 event = 0;
  2480. struct tx_cmp *txcmp;
  2481. cpr->has_more_work = 0;
  2482. cpr->had_work_done = 1;
  2483. while (1) {
  2484. u8 cmp_type;
  2485. int rc;
  2486. cons = RING_CMP(raw_cons);
  2487. txcmp = &cpr->cp_desc_ring[CP_RING(cons)][CP_IDX(cons)];
  2488. if (!TX_CMP_VALID(txcmp, raw_cons))
  2489. break;
  2490. /* The valid test of the entry must be done first before
  2491. * reading any further.
  2492. */
  2493. dma_rmb();
  2494. cmp_type = TX_CMP_TYPE(txcmp);
  2495. if (cmp_type == CMP_TYPE_TX_L2_CMP ||
  2496. cmp_type == CMP_TYPE_TX_L2_COAL_CMP) {
  2497. u32 opaque = txcmp->tx_cmp_opaque;
  2498. struct bnxt_tx_ring_info *txr;
  2499. u16 tx_freed;
  2500. txr = bnapi->tx_ring[TX_OPAQUE_RING(opaque)];
  2501. event |= BNXT_TX_CMP_EVENT;
  2502. if (cmp_type == CMP_TYPE_TX_L2_COAL_CMP)
  2503. txr->tx_hw_cons = TX_CMP_SQ_CONS_IDX(txcmp);
  2504. else
  2505. txr->tx_hw_cons = TX_OPAQUE_PROD(bp, opaque);
  2506. tx_freed = (txr->tx_hw_cons - txr->tx_cons) &
  2507. bp->tx_ring_mask;
  2508. /* return full budget so NAPI will complete. */
  2509. if (unlikely(tx_freed >= bp->tx_wake_thresh)) {
  2510. rx_pkts = budget;
  2511. raw_cons = NEXT_RAW_CMP(raw_cons);
  2512. if (budget)
  2513. cpr->has_more_work = 1;
  2514. break;
  2515. }
  2516. } else if (cmp_type == CMP_TYPE_TX_L2_PKT_TS_CMP) {
  2517. bnxt_tx_ts_cmp(bp, bnapi, (struct tx_ts_cmp *)txcmp);
  2518. } else if (cmp_type >= CMP_TYPE_RX_L2_CMP &&
  2519. cmp_type <= CMP_TYPE_RX_L2_TPA_START_V3_CMP) {
  2520. if (likely(budget))
  2521. rc = bnxt_rx_pkt(bp, cpr, &raw_cons, &event);
  2522. else
  2523. rc = bnxt_force_rx_discard(bp, cpr, &raw_cons,
  2524. &event);
  2525. if (event & BNXT_REDIRECT_EVENT)
  2526. flush_xdp = true;
  2527. if (likely(rc >= 0))
  2528. rx_pkts += rc;
  2529. /* Increment rx_pkts when rc is -ENOMEM to count towards
  2530. * the NAPI budget. Otherwise, we may potentially loop
  2531. * here forever if we consistently cannot allocate
  2532. * buffers.
  2533. */
  2534. else if (rc == -ENOMEM && budget)
  2535. rx_pkts++;
  2536. else if (rc == -EBUSY) /* partial completion */
  2537. break;
  2538. } else if (unlikely(cmp_type == CMPL_BASE_TYPE_HWRM_DONE ||
  2539. cmp_type == CMPL_BASE_TYPE_HWRM_FWD_REQ ||
  2540. cmp_type == CMPL_BASE_TYPE_HWRM_ASYNC_EVENT)) {
  2541. bnxt_hwrm_handler(bp, txcmp);
  2542. }
  2543. raw_cons = NEXT_RAW_CMP(raw_cons);
  2544. if (rx_pkts && rx_pkts == budget) {
  2545. cpr->has_more_work = 1;
  2546. break;
  2547. }
  2548. }
  2549. if (flush_xdp) {
  2550. xdp_do_flush();
  2551. event &= ~BNXT_REDIRECT_EVENT;
  2552. }
  2553. if (event & BNXT_TX_EVENT) {
  2554. struct bnxt_tx_ring_info *txr = bnapi->tx_ring[0];
  2555. u16 prod = txr->tx_prod;
  2556. /* Sync BD data before updating doorbell */
  2557. wmb();
  2558. bnxt_db_write_relaxed(bp, &txr->tx_db, prod);
  2559. event &= ~BNXT_TX_EVENT;
  2560. }
  2561. cpr->cp_raw_cons = raw_cons;
  2562. bnapi->events |= event;
  2563. return rx_pkts;
  2564. }
  2565. static void __bnxt_poll_work_done(struct bnxt *bp, struct bnxt_napi *bnapi,
  2566. int budget)
  2567. {
  2568. if ((bnapi->events & BNXT_TX_CMP_EVENT) && !bnapi->tx_fault)
  2569. bnapi->tx_int(bp, bnapi, budget);
  2570. if ((bnapi->events & BNXT_RX_EVENT) && !(bnapi->in_reset)) {
  2571. struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
  2572. bnxt_db_write(bp, &rxr->rx_db, rxr->rx_prod);
  2573. bnapi->events &= ~BNXT_RX_EVENT;
  2574. }
  2575. if (bnapi->events & BNXT_AGG_EVENT) {
  2576. struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
  2577. bnxt_db_write(bp, &rxr->rx_agg_db, rxr->rx_agg_prod);
  2578. bnapi->events &= ~BNXT_AGG_EVENT;
  2579. }
  2580. }
  2581. static int bnxt_poll_work(struct bnxt *bp, struct bnxt_cp_ring_info *cpr,
  2582. int budget)
  2583. {
  2584. struct bnxt_napi *bnapi = cpr->bnapi;
  2585. int rx_pkts;
  2586. rx_pkts = __bnxt_poll_work(bp, cpr, budget);
  2587. /* ACK completion ring before freeing tx ring and producing new
  2588. * buffers in rx/agg rings to prevent overflowing the completion
  2589. * ring.
  2590. */
  2591. bnxt_db_cq(bp, &cpr->cp_db, cpr->cp_raw_cons);
  2592. __bnxt_poll_work_done(bp, bnapi, budget);
  2593. return rx_pkts;
  2594. }
  2595. static int bnxt_poll_nitroa0(struct napi_struct *napi, int budget)
  2596. {
  2597. struct bnxt_napi *bnapi = container_of(napi, struct bnxt_napi, napi);
  2598. struct bnxt *bp = bnapi->bp;
  2599. struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
  2600. struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
  2601. struct tx_cmp *txcmp;
  2602. struct rx_cmp_ext *rxcmp1;
  2603. u32 cp_cons, tmp_raw_cons;
  2604. u32 raw_cons = cpr->cp_raw_cons;
  2605. bool flush_xdp = false;
  2606. u32 rx_pkts = 0;
  2607. u8 event = 0;
  2608. while (1) {
  2609. int rc;
  2610. cp_cons = RING_CMP(raw_cons);
  2611. txcmp = &cpr->cp_desc_ring[CP_RING(cp_cons)][CP_IDX(cp_cons)];
  2612. if (!TX_CMP_VALID(txcmp, raw_cons))
  2613. break;
  2614. /* The valid test of the entry must be done first before
  2615. * reading any further.
  2616. */
  2617. dma_rmb();
  2618. if ((TX_CMP_TYPE(txcmp) & 0x30) == 0x10) {
  2619. tmp_raw_cons = NEXT_RAW_CMP(raw_cons);
  2620. cp_cons = RING_CMP(tmp_raw_cons);
  2621. rxcmp1 = (struct rx_cmp_ext *)
  2622. &cpr->cp_desc_ring[CP_RING(cp_cons)][CP_IDX(cp_cons)];
  2623. if (!RX_CMP_VALID(rxcmp1, tmp_raw_cons))
  2624. break;
  2625. /* force an error to recycle the buffer */
  2626. rxcmp1->rx_cmp_cfa_code_errors_v2 |=
  2627. cpu_to_le32(RX_CMPL_ERRORS_CRC_ERROR);
  2628. rc = bnxt_rx_pkt(bp, cpr, &raw_cons, &event);
  2629. if (likely(rc == -EIO) && budget)
  2630. rx_pkts++;
  2631. else if (rc == -EBUSY) /* partial completion */
  2632. break;
  2633. if (event & BNXT_REDIRECT_EVENT)
  2634. flush_xdp = true;
  2635. } else if (unlikely(TX_CMP_TYPE(txcmp) ==
  2636. CMPL_BASE_TYPE_HWRM_DONE)) {
  2637. bnxt_hwrm_handler(bp, txcmp);
  2638. } else {
  2639. netdev_err(bp->dev,
  2640. "Invalid completion received on special ring\n");
  2641. }
  2642. raw_cons = NEXT_RAW_CMP(raw_cons);
  2643. if (rx_pkts == budget)
  2644. break;
  2645. }
  2646. cpr->cp_raw_cons = raw_cons;
  2647. BNXT_DB_CQ(&cpr->cp_db, cpr->cp_raw_cons);
  2648. bnxt_db_write(bp, &rxr->rx_db, rxr->rx_prod);
  2649. if (event & BNXT_AGG_EVENT)
  2650. bnxt_db_write(bp, &rxr->rx_agg_db, rxr->rx_agg_prod);
  2651. if (flush_xdp)
  2652. xdp_do_flush();
  2653. if (!bnxt_has_work(bp, cpr) && rx_pkts < budget) {
  2654. napi_complete_done(napi, rx_pkts);
  2655. BNXT_DB_CQ_ARM(&cpr->cp_db, cpr->cp_raw_cons);
  2656. }
  2657. return rx_pkts;
  2658. }
  2659. static int bnxt_poll(struct napi_struct *napi, int budget)
  2660. {
  2661. struct bnxt_napi *bnapi = container_of(napi, struct bnxt_napi, napi);
  2662. struct bnxt *bp = bnapi->bp;
  2663. struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
  2664. int work_done = 0;
  2665. if (unlikely(test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state))) {
  2666. napi_complete(napi);
  2667. return 0;
  2668. }
  2669. while (1) {
  2670. work_done += bnxt_poll_work(bp, cpr, budget - work_done);
  2671. if (work_done >= budget) {
  2672. if (!budget)
  2673. BNXT_DB_CQ_ARM(&cpr->cp_db, cpr->cp_raw_cons);
  2674. break;
  2675. }
  2676. if (!bnxt_has_work(bp, cpr)) {
  2677. if (napi_complete_done(napi, work_done))
  2678. BNXT_DB_CQ_ARM(&cpr->cp_db, cpr->cp_raw_cons);
  2679. break;
  2680. }
  2681. }
  2682. if ((bp->flags & BNXT_FLAG_DIM) && bnxt_vnic_is_active(bp)) {
  2683. struct dim_sample dim_sample = {};
  2684. dim_update_sample(cpr->event_ctr,
  2685. cpr->rx_packets,
  2686. cpr->rx_bytes,
  2687. &dim_sample);
  2688. net_dim(&cpr->dim, dim_sample);
  2689. }
  2690. return work_done;
  2691. }
  2692. static int __bnxt_poll_cqs(struct bnxt *bp, struct bnxt_napi *bnapi, int budget)
  2693. {
  2694. struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
  2695. int i, work_done = 0;
  2696. for (i = 0; i < cpr->cp_ring_count; i++) {
  2697. struct bnxt_cp_ring_info *cpr2 = &cpr->cp_ring_arr[i];
  2698. if (cpr2->had_nqe_notify) {
  2699. work_done += __bnxt_poll_work(bp, cpr2,
  2700. budget - work_done);
  2701. cpr->has_more_work |= cpr2->has_more_work;
  2702. }
  2703. }
  2704. return work_done;
  2705. }
  2706. static void __bnxt_poll_cqs_done(struct bnxt *bp, struct bnxt_napi *bnapi,
  2707. u64 dbr_type, int budget)
  2708. {
  2709. struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
  2710. int i;
  2711. for (i = 0; i < cpr->cp_ring_count; i++) {
  2712. struct bnxt_cp_ring_info *cpr2 = &cpr->cp_ring_arr[i];
  2713. struct bnxt_db_info *db;
  2714. if (cpr2->had_work_done) {
  2715. u32 tgl = 0;
  2716. if (dbr_type == DBR_TYPE_CQ_ARMALL) {
  2717. cpr2->had_nqe_notify = 0;
  2718. tgl = cpr2->toggle;
  2719. }
  2720. db = &cpr2->cp_db;
  2721. bnxt_writeq(bp,
  2722. db->db_key64 | dbr_type | DB_TOGGLE(tgl) |
  2723. DB_RING_IDX(db, cpr2->cp_raw_cons),
  2724. db->doorbell);
  2725. cpr2->had_work_done = 0;
  2726. }
  2727. }
  2728. __bnxt_poll_work_done(bp, bnapi, budget);
  2729. }
  2730. static int bnxt_poll_p5(struct napi_struct *napi, int budget)
  2731. {
  2732. struct bnxt_napi *bnapi = container_of(napi, struct bnxt_napi, napi);
  2733. struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
  2734. struct bnxt_cp_ring_info *cpr_rx;
  2735. u32 raw_cons = cpr->cp_raw_cons;
  2736. struct bnxt *bp = bnapi->bp;
  2737. struct nqe_cn *nqcmp;
  2738. int work_done = 0;
  2739. u32 cons;
  2740. if (unlikely(test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state))) {
  2741. napi_complete(napi);
  2742. return 0;
  2743. }
  2744. if (cpr->has_more_work) {
  2745. cpr->has_more_work = 0;
  2746. work_done = __bnxt_poll_cqs(bp, bnapi, budget);
  2747. }
  2748. while (1) {
  2749. u16 type;
  2750. cons = RING_CMP(raw_cons);
  2751. nqcmp = &cpr->nq_desc_ring[CP_RING(cons)][CP_IDX(cons)];
  2752. if (!NQ_CMP_VALID(nqcmp, raw_cons)) {
  2753. if (cpr->has_more_work)
  2754. break;
  2755. __bnxt_poll_cqs_done(bp, bnapi, DBR_TYPE_CQ_ARMALL,
  2756. budget);
  2757. cpr->cp_raw_cons = raw_cons;
  2758. if (napi_complete_done(napi, work_done))
  2759. BNXT_DB_NQ_ARM_P5(&cpr->cp_db,
  2760. cpr->cp_raw_cons);
  2761. goto poll_done;
  2762. }
  2763. /* The valid test of the entry must be done first before
  2764. * reading any further.
  2765. */
  2766. dma_rmb();
  2767. type = le16_to_cpu(nqcmp->type);
  2768. if (NQE_CN_TYPE(type) == NQ_CN_TYPE_CQ_NOTIFICATION) {
  2769. u32 idx = le32_to_cpu(nqcmp->cq_handle_low);
  2770. u32 cq_type = BNXT_NQ_HDL_TYPE(idx);
  2771. struct bnxt_cp_ring_info *cpr2;
  2772. /* No more budget for RX work */
  2773. if (budget && work_done >= budget &&
  2774. cq_type == BNXT_NQ_HDL_TYPE_RX)
  2775. break;
  2776. idx = BNXT_NQ_HDL_IDX(idx);
  2777. cpr2 = &cpr->cp_ring_arr[idx];
  2778. cpr2->had_nqe_notify = 1;
  2779. cpr2->toggle = NQE_CN_TOGGLE(type);
  2780. work_done += __bnxt_poll_work(bp, cpr2,
  2781. budget - work_done);
  2782. cpr->has_more_work |= cpr2->has_more_work;
  2783. } else {
  2784. bnxt_hwrm_handler(bp, (struct tx_cmp *)nqcmp);
  2785. }
  2786. raw_cons = NEXT_RAW_CMP(raw_cons);
  2787. }
  2788. __bnxt_poll_cqs_done(bp, bnapi, DBR_TYPE_CQ, budget);
  2789. if (raw_cons != cpr->cp_raw_cons) {
  2790. cpr->cp_raw_cons = raw_cons;
  2791. BNXT_DB_NQ_P5(&cpr->cp_db, raw_cons);
  2792. }
  2793. poll_done:
  2794. cpr_rx = &cpr->cp_ring_arr[0];
  2795. if (cpr_rx->cp_ring_type == BNXT_NQ_HDL_TYPE_RX &&
  2796. (bp->flags & BNXT_FLAG_DIM) && bnxt_vnic_is_active(bp)) {
  2797. struct dim_sample dim_sample = {};
  2798. dim_update_sample(cpr->event_ctr,
  2799. cpr_rx->rx_packets,
  2800. cpr_rx->rx_bytes,
  2801. &dim_sample);
  2802. net_dim(&cpr->dim, dim_sample);
  2803. }
  2804. return work_done;
  2805. }
  2806. static void bnxt_free_tx_skbs(struct bnxt *bp)
  2807. {
  2808. int i, max_idx;
  2809. struct pci_dev *pdev = bp->pdev;
  2810. if (!bp->tx_ring)
  2811. return;
  2812. max_idx = bp->tx_nr_pages * TX_DESC_CNT;
  2813. for (i = 0; i < bp->tx_nr_rings; i++) {
  2814. struct bnxt_tx_ring_info *txr = &bp->tx_ring[i];
  2815. int j;
  2816. if (!txr->tx_buf_ring)
  2817. continue;
  2818. for (j = 0; j < max_idx;) {
  2819. struct bnxt_sw_tx_bd *tx_buf = &txr->tx_buf_ring[j];
  2820. struct sk_buff *skb;
  2821. int k, last;
  2822. if (i < bp->tx_nr_rings_xdp &&
  2823. tx_buf->action == XDP_REDIRECT) {
  2824. dma_unmap_single(&pdev->dev,
  2825. dma_unmap_addr(tx_buf, mapping),
  2826. dma_unmap_len(tx_buf, len),
  2827. DMA_TO_DEVICE);
  2828. xdp_return_frame(tx_buf->xdpf);
  2829. tx_buf->action = 0;
  2830. tx_buf->xdpf = NULL;
  2831. j++;
  2832. continue;
  2833. }
  2834. skb = tx_buf->skb;
  2835. if (!skb) {
  2836. j++;
  2837. continue;
  2838. }
  2839. tx_buf->skb = NULL;
  2840. if (tx_buf->is_push) {
  2841. dev_kfree_skb(skb);
  2842. j += 2;
  2843. continue;
  2844. }
  2845. dma_unmap_single(&pdev->dev,
  2846. dma_unmap_addr(tx_buf, mapping),
  2847. skb_headlen(skb),
  2848. DMA_TO_DEVICE);
  2849. last = tx_buf->nr_frags;
  2850. j += 2;
  2851. for (k = 0; k < last; k++, j++) {
  2852. int ring_idx = j & bp->tx_ring_mask;
  2853. skb_frag_t *frag = &skb_shinfo(skb)->frags[k];
  2854. tx_buf = &txr->tx_buf_ring[ring_idx];
  2855. dma_unmap_page(
  2856. &pdev->dev,
  2857. dma_unmap_addr(tx_buf, mapping),
  2858. skb_frag_size(frag), DMA_TO_DEVICE);
  2859. }
  2860. dev_kfree_skb(skb);
  2861. }
  2862. netdev_tx_reset_queue(netdev_get_tx_queue(bp->dev, i));
  2863. }
  2864. if (bp->ptp_cfg && !(bp->fw_cap & BNXT_FW_CAP_TX_TS_CMP))
  2865. bnxt_ptp_free_txts_skbs(bp->ptp_cfg);
  2866. }
  2867. static void bnxt_free_one_rx_ring(struct bnxt *bp, struct bnxt_rx_ring_info *rxr)
  2868. {
  2869. int i, max_idx;
  2870. max_idx = bp->rx_nr_pages * RX_DESC_CNT;
  2871. for (i = 0; i < max_idx; i++) {
  2872. struct bnxt_sw_rx_bd *rx_buf = &rxr->rx_buf_ring[i];
  2873. void *data = rx_buf->data;
  2874. if (!data)
  2875. continue;
  2876. rx_buf->data = NULL;
  2877. if (BNXT_RX_PAGE_MODE(bp))
  2878. page_pool_recycle_direct(rxr->page_pool, data);
  2879. else
  2880. page_pool_free_va(rxr->head_pool, data, true);
  2881. }
  2882. }
  2883. static void bnxt_free_one_rx_agg_ring(struct bnxt *bp, struct bnxt_rx_ring_info *rxr)
  2884. {
  2885. int i, max_idx;
  2886. max_idx = bp->rx_agg_nr_pages * RX_DESC_CNT;
  2887. for (i = 0; i < max_idx; i++) {
  2888. struct bnxt_sw_rx_agg_bd *rx_agg_buf = &rxr->rx_agg_ring[i];
  2889. struct page *page = rx_agg_buf->page;
  2890. if (!page)
  2891. continue;
  2892. rx_agg_buf->page = NULL;
  2893. __clear_bit(i, rxr->rx_agg_bmap);
  2894. page_pool_recycle_direct(rxr->page_pool, page);
  2895. }
  2896. }
  2897. static void bnxt_free_one_tpa_info_data(struct bnxt *bp,
  2898. struct bnxt_rx_ring_info *rxr)
  2899. {
  2900. int i;
  2901. for (i = 0; i < bp->max_tpa; i++) {
  2902. struct bnxt_tpa_info *tpa_info = &rxr->rx_tpa[i];
  2903. u8 *data = tpa_info->data;
  2904. if (!data)
  2905. continue;
  2906. tpa_info->data = NULL;
  2907. page_pool_free_va(rxr->head_pool, data, false);
  2908. }
  2909. }
  2910. static void bnxt_free_one_rx_ring_skbs(struct bnxt *bp,
  2911. struct bnxt_rx_ring_info *rxr)
  2912. {
  2913. struct bnxt_tpa_idx_map *map;
  2914. if (!rxr->rx_tpa)
  2915. goto skip_rx_tpa_free;
  2916. bnxt_free_one_tpa_info_data(bp, rxr);
  2917. skip_rx_tpa_free:
  2918. if (!rxr->rx_buf_ring)
  2919. goto skip_rx_buf_free;
  2920. bnxt_free_one_rx_ring(bp, rxr);
  2921. skip_rx_buf_free:
  2922. if (!rxr->rx_agg_ring)
  2923. goto skip_rx_agg_free;
  2924. bnxt_free_one_rx_agg_ring(bp, rxr);
  2925. skip_rx_agg_free:
  2926. map = rxr->rx_tpa_idx_map;
  2927. if (map)
  2928. memset(map->agg_idx_bmap, 0, sizeof(map->agg_idx_bmap));
  2929. }
  2930. static void bnxt_free_rx_skbs(struct bnxt *bp)
  2931. {
  2932. int i;
  2933. if (!bp->rx_ring)
  2934. return;
  2935. for (i = 0; i < bp->rx_nr_rings; i++)
  2936. bnxt_free_one_rx_ring_skbs(bp, &bp->rx_ring[i]);
  2937. }
  2938. static void bnxt_free_skbs(struct bnxt *bp)
  2939. {
  2940. bnxt_free_tx_skbs(bp);
  2941. bnxt_free_rx_skbs(bp);
  2942. }
  2943. static void bnxt_init_ctx_mem(struct bnxt_ctx_mem_type *ctxm, void *p, int len)
  2944. {
  2945. u8 init_val = ctxm->init_value;
  2946. u16 offset = ctxm->init_offset;
  2947. u8 *p2 = p;
  2948. int i;
  2949. if (!init_val)
  2950. return;
  2951. if (offset == BNXT_CTX_INIT_INVALID_OFFSET) {
  2952. memset(p, init_val, len);
  2953. return;
  2954. }
  2955. for (i = 0; i < len; i += ctxm->entry_size)
  2956. *(p2 + i + offset) = init_val;
  2957. }
  2958. static void bnxt_free_ring(struct bnxt *bp, struct bnxt_ring_mem_info *rmem)
  2959. {
  2960. struct pci_dev *pdev = bp->pdev;
  2961. int i;
  2962. if (!rmem->pg_arr)
  2963. goto skip_pages;
  2964. for (i = 0; i < rmem->nr_pages; i++) {
  2965. if (!rmem->pg_arr[i])
  2966. continue;
  2967. dma_free_coherent(&pdev->dev, rmem->page_size,
  2968. rmem->pg_arr[i], rmem->dma_arr[i]);
  2969. rmem->pg_arr[i] = NULL;
  2970. }
  2971. skip_pages:
  2972. if (rmem->pg_tbl) {
  2973. size_t pg_tbl_size = rmem->nr_pages * 8;
  2974. if (rmem->flags & BNXT_RMEM_USE_FULL_PAGE_FLAG)
  2975. pg_tbl_size = rmem->page_size;
  2976. dma_free_coherent(&pdev->dev, pg_tbl_size,
  2977. rmem->pg_tbl, rmem->pg_tbl_map);
  2978. rmem->pg_tbl = NULL;
  2979. }
  2980. if (rmem->vmem_size && *rmem->vmem) {
  2981. vfree(*rmem->vmem);
  2982. *rmem->vmem = NULL;
  2983. }
  2984. }
  2985. static int bnxt_alloc_ring(struct bnxt *bp, struct bnxt_ring_mem_info *rmem)
  2986. {
  2987. struct pci_dev *pdev = bp->pdev;
  2988. u64 valid_bit = 0;
  2989. int i;
  2990. if (rmem->flags & (BNXT_RMEM_VALID_PTE_FLAG | BNXT_RMEM_RING_PTE_FLAG))
  2991. valid_bit = PTU_PTE_VALID;
  2992. if ((rmem->nr_pages > 1 || rmem->depth > 0) && !rmem->pg_tbl) {
  2993. size_t pg_tbl_size = rmem->nr_pages * 8;
  2994. if (rmem->flags & BNXT_RMEM_USE_FULL_PAGE_FLAG)
  2995. pg_tbl_size = rmem->page_size;
  2996. rmem->pg_tbl = dma_alloc_coherent(&pdev->dev, pg_tbl_size,
  2997. &rmem->pg_tbl_map,
  2998. GFP_KERNEL);
  2999. if (!rmem->pg_tbl)
  3000. return -ENOMEM;
  3001. }
  3002. for (i = 0; i < rmem->nr_pages; i++) {
  3003. u64 extra_bits = valid_bit;
  3004. rmem->pg_arr[i] = dma_alloc_coherent(&pdev->dev,
  3005. rmem->page_size,
  3006. &rmem->dma_arr[i],
  3007. GFP_KERNEL);
  3008. if (!rmem->pg_arr[i])
  3009. return -ENOMEM;
  3010. if (rmem->ctx_mem)
  3011. bnxt_init_ctx_mem(rmem->ctx_mem, rmem->pg_arr[i],
  3012. rmem->page_size);
  3013. if (rmem->nr_pages > 1 || rmem->depth > 0) {
  3014. if (i == rmem->nr_pages - 2 &&
  3015. (rmem->flags & BNXT_RMEM_RING_PTE_FLAG))
  3016. extra_bits |= PTU_PTE_NEXT_TO_LAST;
  3017. else if (i == rmem->nr_pages - 1 &&
  3018. (rmem->flags & BNXT_RMEM_RING_PTE_FLAG))
  3019. extra_bits |= PTU_PTE_LAST;
  3020. rmem->pg_tbl[i] =
  3021. cpu_to_le64(rmem->dma_arr[i] | extra_bits);
  3022. }
  3023. }
  3024. if (rmem->vmem_size) {
  3025. *rmem->vmem = vzalloc(rmem->vmem_size);
  3026. if (!(*rmem->vmem))
  3027. return -ENOMEM;
  3028. }
  3029. return 0;
  3030. }
  3031. static void bnxt_free_one_tpa_info(struct bnxt *bp,
  3032. struct bnxt_rx_ring_info *rxr)
  3033. {
  3034. int i;
  3035. kfree(rxr->rx_tpa_idx_map);
  3036. rxr->rx_tpa_idx_map = NULL;
  3037. if (rxr->rx_tpa) {
  3038. for (i = 0; i < bp->max_tpa; i++) {
  3039. kfree(rxr->rx_tpa[i].agg_arr);
  3040. rxr->rx_tpa[i].agg_arr = NULL;
  3041. }
  3042. }
  3043. kfree(rxr->rx_tpa);
  3044. rxr->rx_tpa = NULL;
  3045. }
  3046. static void bnxt_free_tpa_info(struct bnxt *bp)
  3047. {
  3048. int i;
  3049. for (i = 0; i < bp->rx_nr_rings; i++) {
  3050. struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
  3051. bnxt_free_one_tpa_info(bp, rxr);
  3052. }
  3053. }
  3054. static int bnxt_alloc_one_tpa_info(struct bnxt *bp,
  3055. struct bnxt_rx_ring_info *rxr)
  3056. {
  3057. struct rx_agg_cmp *agg;
  3058. int i;
  3059. rxr->rx_tpa = kcalloc(bp->max_tpa, sizeof(struct bnxt_tpa_info),
  3060. GFP_KERNEL);
  3061. if (!rxr->rx_tpa)
  3062. return -ENOMEM;
  3063. if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS))
  3064. return 0;
  3065. for (i = 0; i < bp->max_tpa; i++) {
  3066. agg = kcalloc(MAX_SKB_FRAGS, sizeof(*agg), GFP_KERNEL);
  3067. if (!agg)
  3068. return -ENOMEM;
  3069. rxr->rx_tpa[i].agg_arr = agg;
  3070. }
  3071. rxr->rx_tpa_idx_map = kzalloc(sizeof(*rxr->rx_tpa_idx_map),
  3072. GFP_KERNEL);
  3073. if (!rxr->rx_tpa_idx_map)
  3074. return -ENOMEM;
  3075. return 0;
  3076. }
  3077. static int bnxt_alloc_tpa_info(struct bnxt *bp)
  3078. {
  3079. int i, rc;
  3080. bp->max_tpa = MAX_TPA;
  3081. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  3082. if (!bp->max_tpa_v2)
  3083. return 0;
  3084. bp->max_tpa = max_t(u16, bp->max_tpa_v2, MAX_TPA_P5);
  3085. }
  3086. for (i = 0; i < bp->rx_nr_rings; i++) {
  3087. struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
  3088. rc = bnxt_alloc_one_tpa_info(bp, rxr);
  3089. if (rc)
  3090. return rc;
  3091. }
  3092. return 0;
  3093. }
  3094. static void bnxt_free_rx_rings(struct bnxt *bp)
  3095. {
  3096. int i;
  3097. if (!bp->rx_ring)
  3098. return;
  3099. bnxt_free_tpa_info(bp);
  3100. for (i = 0; i < bp->rx_nr_rings; i++) {
  3101. struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
  3102. struct bnxt_ring_struct *ring;
  3103. if (rxr->xdp_prog)
  3104. bpf_prog_put(rxr->xdp_prog);
  3105. if (xdp_rxq_info_is_reg(&rxr->xdp_rxq))
  3106. xdp_rxq_info_unreg(&rxr->xdp_rxq);
  3107. page_pool_destroy(rxr->page_pool);
  3108. if (bnxt_separate_head_pool())
  3109. page_pool_destroy(rxr->head_pool);
  3110. rxr->page_pool = rxr->head_pool = NULL;
  3111. kfree(rxr->rx_agg_bmap);
  3112. rxr->rx_agg_bmap = NULL;
  3113. ring = &rxr->rx_ring_struct;
  3114. bnxt_free_ring(bp, &ring->ring_mem);
  3115. ring = &rxr->rx_agg_ring_struct;
  3116. bnxt_free_ring(bp, &ring->ring_mem);
  3117. }
  3118. }
  3119. static int bnxt_alloc_rx_page_pool(struct bnxt *bp,
  3120. struct bnxt_rx_ring_info *rxr,
  3121. int numa_node)
  3122. {
  3123. struct page_pool_params pp = { 0 };
  3124. struct page_pool *pool;
  3125. pp.pool_size = bp->rx_agg_ring_size;
  3126. if (BNXT_RX_PAGE_MODE(bp))
  3127. pp.pool_size += bp->rx_ring_size;
  3128. pp.nid = numa_node;
  3129. pp.napi = &rxr->bnapi->napi;
  3130. pp.netdev = bp->dev;
  3131. pp.dev = &bp->pdev->dev;
  3132. pp.dma_dir = bp->rx_dir;
  3133. pp.max_len = PAGE_SIZE;
  3134. pp.flags = PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV;
  3135. pool = page_pool_create(&pp);
  3136. if (IS_ERR(pool))
  3137. return PTR_ERR(pool);
  3138. rxr->page_pool = pool;
  3139. if (bnxt_separate_head_pool()) {
  3140. pp.pool_size = max(bp->rx_ring_size, 1024);
  3141. pool = page_pool_create(&pp);
  3142. if (IS_ERR(pool))
  3143. goto err_destroy_pp;
  3144. }
  3145. rxr->head_pool = pool;
  3146. return 0;
  3147. err_destroy_pp:
  3148. page_pool_destroy(rxr->page_pool);
  3149. rxr->page_pool = NULL;
  3150. return PTR_ERR(pool);
  3151. }
  3152. static int bnxt_alloc_rx_rings(struct bnxt *bp)
  3153. {
  3154. int numa_node = dev_to_node(&bp->pdev->dev);
  3155. int i, rc = 0, agg_rings = 0, cpu;
  3156. if (!bp->rx_ring)
  3157. return -ENOMEM;
  3158. if (bp->flags & BNXT_FLAG_AGG_RINGS)
  3159. agg_rings = 1;
  3160. for (i = 0; i < bp->rx_nr_rings; i++) {
  3161. struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
  3162. struct bnxt_ring_struct *ring;
  3163. int cpu_node;
  3164. ring = &rxr->rx_ring_struct;
  3165. cpu = cpumask_local_spread(i, numa_node);
  3166. cpu_node = cpu_to_node(cpu);
  3167. netdev_dbg(bp->dev, "Allocating page pool for rx_ring[%d] on numa_node: %d\n",
  3168. i, cpu_node);
  3169. rc = bnxt_alloc_rx_page_pool(bp, rxr, cpu_node);
  3170. if (rc)
  3171. return rc;
  3172. rc = xdp_rxq_info_reg(&rxr->xdp_rxq, bp->dev, i, 0);
  3173. if (rc < 0)
  3174. return rc;
  3175. rc = xdp_rxq_info_reg_mem_model(&rxr->xdp_rxq,
  3176. MEM_TYPE_PAGE_POOL,
  3177. rxr->page_pool);
  3178. if (rc) {
  3179. xdp_rxq_info_unreg(&rxr->xdp_rxq);
  3180. return rc;
  3181. }
  3182. rc = bnxt_alloc_ring(bp, &ring->ring_mem);
  3183. if (rc)
  3184. return rc;
  3185. ring->grp_idx = i;
  3186. if (agg_rings) {
  3187. u16 mem_size;
  3188. ring = &rxr->rx_agg_ring_struct;
  3189. rc = bnxt_alloc_ring(bp, &ring->ring_mem);
  3190. if (rc)
  3191. return rc;
  3192. ring->grp_idx = i;
  3193. rxr->rx_agg_bmap_size = bp->rx_agg_ring_mask + 1;
  3194. mem_size = rxr->rx_agg_bmap_size / 8;
  3195. rxr->rx_agg_bmap = kzalloc(mem_size, GFP_KERNEL);
  3196. if (!rxr->rx_agg_bmap)
  3197. return -ENOMEM;
  3198. }
  3199. }
  3200. if (bp->flags & BNXT_FLAG_TPA)
  3201. rc = bnxt_alloc_tpa_info(bp);
  3202. return rc;
  3203. }
  3204. static void bnxt_free_tx_rings(struct bnxt *bp)
  3205. {
  3206. int i;
  3207. struct pci_dev *pdev = bp->pdev;
  3208. if (!bp->tx_ring)
  3209. return;
  3210. for (i = 0; i < bp->tx_nr_rings; i++) {
  3211. struct bnxt_tx_ring_info *txr = &bp->tx_ring[i];
  3212. struct bnxt_ring_struct *ring;
  3213. if (txr->tx_push) {
  3214. dma_free_coherent(&pdev->dev, bp->tx_push_size,
  3215. txr->tx_push, txr->tx_push_mapping);
  3216. txr->tx_push = NULL;
  3217. }
  3218. ring = &txr->tx_ring_struct;
  3219. bnxt_free_ring(bp, &ring->ring_mem);
  3220. }
  3221. }
  3222. #define BNXT_TC_TO_RING_BASE(bp, tc) \
  3223. ((tc) * (bp)->tx_nr_rings_per_tc)
  3224. #define BNXT_RING_TO_TC_OFF(bp, tx) \
  3225. ((tx) % (bp)->tx_nr_rings_per_tc)
  3226. #define BNXT_RING_TO_TC(bp, tx) \
  3227. ((tx) / (bp)->tx_nr_rings_per_tc)
  3228. static int bnxt_alloc_tx_rings(struct bnxt *bp)
  3229. {
  3230. int i, j, rc;
  3231. struct pci_dev *pdev = bp->pdev;
  3232. bp->tx_push_size = 0;
  3233. if (bp->tx_push_thresh) {
  3234. int push_size;
  3235. push_size = L1_CACHE_ALIGN(sizeof(struct tx_push_bd) +
  3236. bp->tx_push_thresh);
  3237. if (push_size > 256) {
  3238. push_size = 0;
  3239. bp->tx_push_thresh = 0;
  3240. }
  3241. bp->tx_push_size = push_size;
  3242. }
  3243. for (i = 0, j = 0; i < bp->tx_nr_rings; i++) {
  3244. struct bnxt_tx_ring_info *txr = &bp->tx_ring[i];
  3245. struct bnxt_ring_struct *ring;
  3246. u8 qidx;
  3247. ring = &txr->tx_ring_struct;
  3248. rc = bnxt_alloc_ring(bp, &ring->ring_mem);
  3249. if (rc)
  3250. return rc;
  3251. ring->grp_idx = txr->bnapi->index;
  3252. if (bp->tx_push_size) {
  3253. dma_addr_t mapping;
  3254. /* One pre-allocated DMA buffer to backup
  3255. * TX push operation
  3256. */
  3257. txr->tx_push = dma_alloc_coherent(&pdev->dev,
  3258. bp->tx_push_size,
  3259. &txr->tx_push_mapping,
  3260. GFP_KERNEL);
  3261. if (!txr->tx_push)
  3262. return -ENOMEM;
  3263. mapping = txr->tx_push_mapping +
  3264. sizeof(struct tx_push_bd);
  3265. txr->data_mapping = cpu_to_le64(mapping);
  3266. }
  3267. qidx = bp->tc_to_qidx[j];
  3268. ring->queue_id = bp->q_info[qidx].queue_id;
  3269. spin_lock_init(&txr->xdp_tx_lock);
  3270. if (i < bp->tx_nr_rings_xdp)
  3271. continue;
  3272. if (BNXT_RING_TO_TC_OFF(bp, i) == (bp->tx_nr_rings_per_tc - 1))
  3273. j++;
  3274. }
  3275. return 0;
  3276. }
  3277. static void bnxt_free_cp_arrays(struct bnxt_cp_ring_info *cpr)
  3278. {
  3279. struct bnxt_ring_struct *ring = &cpr->cp_ring_struct;
  3280. kfree(cpr->cp_desc_ring);
  3281. cpr->cp_desc_ring = NULL;
  3282. ring->ring_mem.pg_arr = NULL;
  3283. kfree(cpr->cp_desc_mapping);
  3284. cpr->cp_desc_mapping = NULL;
  3285. ring->ring_mem.dma_arr = NULL;
  3286. }
  3287. static int bnxt_alloc_cp_arrays(struct bnxt_cp_ring_info *cpr, int n)
  3288. {
  3289. cpr->cp_desc_ring = kcalloc(n, sizeof(*cpr->cp_desc_ring), GFP_KERNEL);
  3290. if (!cpr->cp_desc_ring)
  3291. return -ENOMEM;
  3292. cpr->cp_desc_mapping = kcalloc(n, sizeof(*cpr->cp_desc_mapping),
  3293. GFP_KERNEL);
  3294. if (!cpr->cp_desc_mapping)
  3295. return -ENOMEM;
  3296. return 0;
  3297. }
  3298. static void bnxt_free_all_cp_arrays(struct bnxt *bp)
  3299. {
  3300. int i;
  3301. if (!bp->bnapi)
  3302. return;
  3303. for (i = 0; i < bp->cp_nr_rings; i++) {
  3304. struct bnxt_napi *bnapi = bp->bnapi[i];
  3305. if (!bnapi)
  3306. continue;
  3307. bnxt_free_cp_arrays(&bnapi->cp_ring);
  3308. }
  3309. }
  3310. static int bnxt_alloc_all_cp_arrays(struct bnxt *bp)
  3311. {
  3312. int i, n = bp->cp_nr_pages;
  3313. for (i = 0; i < bp->cp_nr_rings; i++) {
  3314. struct bnxt_napi *bnapi = bp->bnapi[i];
  3315. int rc;
  3316. if (!bnapi)
  3317. continue;
  3318. rc = bnxt_alloc_cp_arrays(&bnapi->cp_ring, n);
  3319. if (rc)
  3320. return rc;
  3321. }
  3322. return 0;
  3323. }
  3324. static void bnxt_free_cp_rings(struct bnxt *bp)
  3325. {
  3326. int i;
  3327. if (!bp->bnapi)
  3328. return;
  3329. for (i = 0; i < bp->cp_nr_rings; i++) {
  3330. struct bnxt_napi *bnapi = bp->bnapi[i];
  3331. struct bnxt_cp_ring_info *cpr;
  3332. struct bnxt_ring_struct *ring;
  3333. int j;
  3334. if (!bnapi)
  3335. continue;
  3336. cpr = &bnapi->cp_ring;
  3337. ring = &cpr->cp_ring_struct;
  3338. bnxt_free_ring(bp, &ring->ring_mem);
  3339. if (!cpr->cp_ring_arr)
  3340. continue;
  3341. for (j = 0; j < cpr->cp_ring_count; j++) {
  3342. struct bnxt_cp_ring_info *cpr2 = &cpr->cp_ring_arr[j];
  3343. ring = &cpr2->cp_ring_struct;
  3344. bnxt_free_ring(bp, &ring->ring_mem);
  3345. bnxt_free_cp_arrays(cpr2);
  3346. }
  3347. kfree(cpr->cp_ring_arr);
  3348. cpr->cp_ring_arr = NULL;
  3349. cpr->cp_ring_count = 0;
  3350. }
  3351. }
  3352. static int bnxt_alloc_cp_sub_ring(struct bnxt *bp,
  3353. struct bnxt_cp_ring_info *cpr)
  3354. {
  3355. struct bnxt_ring_mem_info *rmem;
  3356. struct bnxt_ring_struct *ring;
  3357. int rc;
  3358. rc = bnxt_alloc_cp_arrays(cpr, bp->cp_nr_pages);
  3359. if (rc) {
  3360. bnxt_free_cp_arrays(cpr);
  3361. return -ENOMEM;
  3362. }
  3363. ring = &cpr->cp_ring_struct;
  3364. rmem = &ring->ring_mem;
  3365. rmem->nr_pages = bp->cp_nr_pages;
  3366. rmem->page_size = HW_CMPD_RING_SIZE;
  3367. rmem->pg_arr = (void **)cpr->cp_desc_ring;
  3368. rmem->dma_arr = cpr->cp_desc_mapping;
  3369. rmem->flags = BNXT_RMEM_RING_PTE_FLAG;
  3370. rc = bnxt_alloc_ring(bp, rmem);
  3371. if (rc) {
  3372. bnxt_free_ring(bp, rmem);
  3373. bnxt_free_cp_arrays(cpr);
  3374. }
  3375. return rc;
  3376. }
  3377. static int bnxt_alloc_cp_rings(struct bnxt *bp)
  3378. {
  3379. bool sh = !!(bp->flags & BNXT_FLAG_SHARED_RINGS);
  3380. int i, j, rc, ulp_msix;
  3381. int tcs = bp->num_tc;
  3382. if (!tcs)
  3383. tcs = 1;
  3384. ulp_msix = bnxt_get_ulp_msix_num(bp);
  3385. for (i = 0, j = 0; i < bp->cp_nr_rings; i++) {
  3386. struct bnxt_napi *bnapi = bp->bnapi[i];
  3387. struct bnxt_cp_ring_info *cpr, *cpr2;
  3388. struct bnxt_ring_struct *ring;
  3389. int cp_count = 0, k;
  3390. int rx = 0, tx = 0;
  3391. if (!bnapi)
  3392. continue;
  3393. cpr = &bnapi->cp_ring;
  3394. cpr->bnapi = bnapi;
  3395. ring = &cpr->cp_ring_struct;
  3396. rc = bnxt_alloc_ring(bp, &ring->ring_mem);
  3397. if (rc)
  3398. return rc;
  3399. ring->map_idx = ulp_msix + i;
  3400. if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS))
  3401. continue;
  3402. if (i < bp->rx_nr_rings) {
  3403. cp_count++;
  3404. rx = 1;
  3405. }
  3406. if (i < bp->tx_nr_rings_xdp) {
  3407. cp_count++;
  3408. tx = 1;
  3409. } else if ((sh && i < bp->tx_nr_rings) ||
  3410. (!sh && i >= bp->rx_nr_rings)) {
  3411. cp_count += tcs;
  3412. tx = 1;
  3413. }
  3414. cpr->cp_ring_arr = kcalloc(cp_count, sizeof(*cpr),
  3415. GFP_KERNEL);
  3416. if (!cpr->cp_ring_arr)
  3417. return -ENOMEM;
  3418. cpr->cp_ring_count = cp_count;
  3419. for (k = 0; k < cp_count; k++) {
  3420. cpr2 = &cpr->cp_ring_arr[k];
  3421. rc = bnxt_alloc_cp_sub_ring(bp, cpr2);
  3422. if (rc)
  3423. return rc;
  3424. cpr2->bnapi = bnapi;
  3425. cpr2->sw_stats = cpr->sw_stats;
  3426. cpr2->cp_idx = k;
  3427. if (!k && rx) {
  3428. bp->rx_ring[i].rx_cpr = cpr2;
  3429. cpr2->cp_ring_type = BNXT_NQ_HDL_TYPE_RX;
  3430. } else {
  3431. int n, tc = k - rx;
  3432. n = BNXT_TC_TO_RING_BASE(bp, tc) + j;
  3433. bp->tx_ring[n].tx_cpr = cpr2;
  3434. cpr2->cp_ring_type = BNXT_NQ_HDL_TYPE_TX;
  3435. }
  3436. }
  3437. if (tx)
  3438. j++;
  3439. }
  3440. return 0;
  3441. }
  3442. static void bnxt_init_rx_ring_struct(struct bnxt *bp,
  3443. struct bnxt_rx_ring_info *rxr)
  3444. {
  3445. struct bnxt_ring_mem_info *rmem;
  3446. struct bnxt_ring_struct *ring;
  3447. ring = &rxr->rx_ring_struct;
  3448. rmem = &ring->ring_mem;
  3449. rmem->nr_pages = bp->rx_nr_pages;
  3450. rmem->page_size = HW_RXBD_RING_SIZE;
  3451. rmem->pg_arr = (void **)rxr->rx_desc_ring;
  3452. rmem->dma_arr = rxr->rx_desc_mapping;
  3453. rmem->vmem_size = SW_RXBD_RING_SIZE * bp->rx_nr_pages;
  3454. rmem->vmem = (void **)&rxr->rx_buf_ring;
  3455. ring = &rxr->rx_agg_ring_struct;
  3456. rmem = &ring->ring_mem;
  3457. rmem->nr_pages = bp->rx_agg_nr_pages;
  3458. rmem->page_size = HW_RXBD_RING_SIZE;
  3459. rmem->pg_arr = (void **)rxr->rx_agg_desc_ring;
  3460. rmem->dma_arr = rxr->rx_agg_desc_mapping;
  3461. rmem->vmem_size = SW_RXBD_AGG_RING_SIZE * bp->rx_agg_nr_pages;
  3462. rmem->vmem = (void **)&rxr->rx_agg_ring;
  3463. }
  3464. static void bnxt_reset_rx_ring_struct(struct bnxt *bp,
  3465. struct bnxt_rx_ring_info *rxr)
  3466. {
  3467. struct bnxt_ring_mem_info *rmem;
  3468. struct bnxt_ring_struct *ring;
  3469. int i;
  3470. rxr->page_pool->p.napi = NULL;
  3471. rxr->page_pool = NULL;
  3472. memset(&rxr->xdp_rxq, 0, sizeof(struct xdp_rxq_info));
  3473. ring = &rxr->rx_ring_struct;
  3474. rmem = &ring->ring_mem;
  3475. rmem->pg_tbl = NULL;
  3476. rmem->pg_tbl_map = 0;
  3477. for (i = 0; i < rmem->nr_pages; i++) {
  3478. rmem->pg_arr[i] = NULL;
  3479. rmem->dma_arr[i] = 0;
  3480. }
  3481. *rmem->vmem = NULL;
  3482. ring = &rxr->rx_agg_ring_struct;
  3483. rmem = &ring->ring_mem;
  3484. rmem->pg_tbl = NULL;
  3485. rmem->pg_tbl_map = 0;
  3486. for (i = 0; i < rmem->nr_pages; i++) {
  3487. rmem->pg_arr[i] = NULL;
  3488. rmem->dma_arr[i] = 0;
  3489. }
  3490. *rmem->vmem = NULL;
  3491. }
  3492. static void bnxt_init_ring_struct(struct bnxt *bp)
  3493. {
  3494. int i, j;
  3495. for (i = 0; i < bp->cp_nr_rings; i++) {
  3496. struct bnxt_napi *bnapi = bp->bnapi[i];
  3497. struct bnxt_ring_mem_info *rmem;
  3498. struct bnxt_cp_ring_info *cpr;
  3499. struct bnxt_rx_ring_info *rxr;
  3500. struct bnxt_tx_ring_info *txr;
  3501. struct bnxt_ring_struct *ring;
  3502. if (!bnapi)
  3503. continue;
  3504. cpr = &bnapi->cp_ring;
  3505. ring = &cpr->cp_ring_struct;
  3506. rmem = &ring->ring_mem;
  3507. rmem->nr_pages = bp->cp_nr_pages;
  3508. rmem->page_size = HW_CMPD_RING_SIZE;
  3509. rmem->pg_arr = (void **)cpr->cp_desc_ring;
  3510. rmem->dma_arr = cpr->cp_desc_mapping;
  3511. rmem->vmem_size = 0;
  3512. rxr = bnapi->rx_ring;
  3513. if (!rxr)
  3514. goto skip_rx;
  3515. ring = &rxr->rx_ring_struct;
  3516. rmem = &ring->ring_mem;
  3517. rmem->nr_pages = bp->rx_nr_pages;
  3518. rmem->page_size = HW_RXBD_RING_SIZE;
  3519. rmem->pg_arr = (void **)rxr->rx_desc_ring;
  3520. rmem->dma_arr = rxr->rx_desc_mapping;
  3521. rmem->vmem_size = SW_RXBD_RING_SIZE * bp->rx_nr_pages;
  3522. rmem->vmem = (void **)&rxr->rx_buf_ring;
  3523. ring = &rxr->rx_agg_ring_struct;
  3524. rmem = &ring->ring_mem;
  3525. rmem->nr_pages = bp->rx_agg_nr_pages;
  3526. rmem->page_size = HW_RXBD_RING_SIZE;
  3527. rmem->pg_arr = (void **)rxr->rx_agg_desc_ring;
  3528. rmem->dma_arr = rxr->rx_agg_desc_mapping;
  3529. rmem->vmem_size = SW_RXBD_AGG_RING_SIZE * bp->rx_agg_nr_pages;
  3530. rmem->vmem = (void **)&rxr->rx_agg_ring;
  3531. skip_rx:
  3532. bnxt_for_each_napi_tx(j, bnapi, txr) {
  3533. ring = &txr->tx_ring_struct;
  3534. rmem = &ring->ring_mem;
  3535. rmem->nr_pages = bp->tx_nr_pages;
  3536. rmem->page_size = HW_TXBD_RING_SIZE;
  3537. rmem->pg_arr = (void **)txr->tx_desc_ring;
  3538. rmem->dma_arr = txr->tx_desc_mapping;
  3539. rmem->vmem_size = SW_TXBD_RING_SIZE * bp->tx_nr_pages;
  3540. rmem->vmem = (void **)&txr->tx_buf_ring;
  3541. }
  3542. }
  3543. }
  3544. static void bnxt_init_rxbd_pages(struct bnxt_ring_struct *ring, u32 type)
  3545. {
  3546. int i;
  3547. u32 prod;
  3548. struct rx_bd **rx_buf_ring;
  3549. rx_buf_ring = (struct rx_bd **)ring->ring_mem.pg_arr;
  3550. for (i = 0, prod = 0; i < ring->ring_mem.nr_pages; i++) {
  3551. int j;
  3552. struct rx_bd *rxbd;
  3553. rxbd = rx_buf_ring[i];
  3554. if (!rxbd)
  3555. continue;
  3556. for (j = 0; j < RX_DESC_CNT; j++, rxbd++, prod++) {
  3557. rxbd->rx_bd_len_flags_type = cpu_to_le32(type);
  3558. rxbd->rx_bd_opaque = prod;
  3559. }
  3560. }
  3561. }
  3562. static void bnxt_alloc_one_rx_ring_skb(struct bnxt *bp,
  3563. struct bnxt_rx_ring_info *rxr,
  3564. int ring_nr)
  3565. {
  3566. u32 prod;
  3567. int i;
  3568. prod = rxr->rx_prod;
  3569. for (i = 0; i < bp->rx_ring_size; i++) {
  3570. if (bnxt_alloc_rx_data(bp, rxr, prod, GFP_KERNEL)) {
  3571. netdev_warn(bp->dev, "init'ed rx ring %d with %d/%d skbs only\n",
  3572. ring_nr, i, bp->rx_ring_size);
  3573. break;
  3574. }
  3575. prod = NEXT_RX(prod);
  3576. }
  3577. rxr->rx_prod = prod;
  3578. }
  3579. static void bnxt_alloc_one_rx_ring_page(struct bnxt *bp,
  3580. struct bnxt_rx_ring_info *rxr,
  3581. int ring_nr)
  3582. {
  3583. u32 prod;
  3584. int i;
  3585. prod = rxr->rx_agg_prod;
  3586. for (i = 0; i < bp->rx_agg_ring_size; i++) {
  3587. if (bnxt_alloc_rx_page(bp, rxr, prod, GFP_KERNEL)) {
  3588. netdev_warn(bp->dev, "init'ed rx ring %d with %d/%d pages only\n",
  3589. ring_nr, i, bp->rx_agg_ring_size);
  3590. break;
  3591. }
  3592. prod = NEXT_RX_AGG(prod);
  3593. }
  3594. rxr->rx_agg_prod = prod;
  3595. }
  3596. static int bnxt_alloc_one_tpa_info_data(struct bnxt *bp,
  3597. struct bnxt_rx_ring_info *rxr)
  3598. {
  3599. dma_addr_t mapping;
  3600. u8 *data;
  3601. int i;
  3602. for (i = 0; i < bp->max_tpa; i++) {
  3603. data = __bnxt_alloc_rx_frag(bp, &mapping, rxr,
  3604. GFP_KERNEL);
  3605. if (!data)
  3606. return -ENOMEM;
  3607. rxr->rx_tpa[i].data = data;
  3608. rxr->rx_tpa[i].data_ptr = data + bp->rx_offset;
  3609. rxr->rx_tpa[i].mapping = mapping;
  3610. }
  3611. return 0;
  3612. }
  3613. static int bnxt_alloc_one_rx_ring(struct bnxt *bp, int ring_nr)
  3614. {
  3615. struct bnxt_rx_ring_info *rxr = &bp->rx_ring[ring_nr];
  3616. int rc;
  3617. bnxt_alloc_one_rx_ring_skb(bp, rxr, ring_nr);
  3618. if (!(bp->flags & BNXT_FLAG_AGG_RINGS))
  3619. return 0;
  3620. bnxt_alloc_one_rx_ring_page(bp, rxr, ring_nr);
  3621. if (rxr->rx_tpa) {
  3622. rc = bnxt_alloc_one_tpa_info_data(bp, rxr);
  3623. if (rc)
  3624. return rc;
  3625. }
  3626. return 0;
  3627. }
  3628. static void bnxt_init_one_rx_ring_rxbd(struct bnxt *bp,
  3629. struct bnxt_rx_ring_info *rxr)
  3630. {
  3631. struct bnxt_ring_struct *ring;
  3632. u32 type;
  3633. type = (bp->rx_buf_use_size << RX_BD_LEN_SHIFT) |
  3634. RX_BD_TYPE_RX_PACKET_BD | RX_BD_FLAGS_EOP;
  3635. if (NET_IP_ALIGN == 2)
  3636. type |= RX_BD_FLAGS_SOP;
  3637. ring = &rxr->rx_ring_struct;
  3638. bnxt_init_rxbd_pages(ring, type);
  3639. ring->fw_ring_id = INVALID_HW_RING_ID;
  3640. }
  3641. static void bnxt_init_one_rx_agg_ring_rxbd(struct bnxt *bp,
  3642. struct bnxt_rx_ring_info *rxr)
  3643. {
  3644. struct bnxt_ring_struct *ring;
  3645. u32 type;
  3646. ring = &rxr->rx_agg_ring_struct;
  3647. ring->fw_ring_id = INVALID_HW_RING_ID;
  3648. if ((bp->flags & BNXT_FLAG_AGG_RINGS)) {
  3649. type = ((u32)BNXT_RX_PAGE_SIZE << RX_BD_LEN_SHIFT) |
  3650. RX_BD_TYPE_RX_AGG_BD | RX_BD_FLAGS_SOP;
  3651. bnxt_init_rxbd_pages(ring, type);
  3652. }
  3653. }
  3654. static int bnxt_init_one_rx_ring(struct bnxt *bp, int ring_nr)
  3655. {
  3656. struct bnxt_rx_ring_info *rxr;
  3657. rxr = &bp->rx_ring[ring_nr];
  3658. bnxt_init_one_rx_ring_rxbd(bp, rxr);
  3659. netif_queue_set_napi(bp->dev, ring_nr, NETDEV_QUEUE_TYPE_RX,
  3660. &rxr->bnapi->napi);
  3661. if (BNXT_RX_PAGE_MODE(bp) && bp->xdp_prog) {
  3662. bpf_prog_add(bp->xdp_prog, 1);
  3663. rxr->xdp_prog = bp->xdp_prog;
  3664. }
  3665. bnxt_init_one_rx_agg_ring_rxbd(bp, rxr);
  3666. return bnxt_alloc_one_rx_ring(bp, ring_nr);
  3667. }
  3668. static void bnxt_init_cp_rings(struct bnxt *bp)
  3669. {
  3670. int i, j;
  3671. for (i = 0; i < bp->cp_nr_rings; i++) {
  3672. struct bnxt_cp_ring_info *cpr = &bp->bnapi[i]->cp_ring;
  3673. struct bnxt_ring_struct *ring = &cpr->cp_ring_struct;
  3674. ring->fw_ring_id = INVALID_HW_RING_ID;
  3675. cpr->rx_ring_coal.coal_ticks = bp->rx_coal.coal_ticks;
  3676. cpr->rx_ring_coal.coal_bufs = bp->rx_coal.coal_bufs;
  3677. if (!cpr->cp_ring_arr)
  3678. continue;
  3679. for (j = 0; j < cpr->cp_ring_count; j++) {
  3680. struct bnxt_cp_ring_info *cpr2 = &cpr->cp_ring_arr[j];
  3681. ring = &cpr2->cp_ring_struct;
  3682. ring->fw_ring_id = INVALID_HW_RING_ID;
  3683. cpr2->rx_ring_coal.coal_ticks = bp->rx_coal.coal_ticks;
  3684. cpr2->rx_ring_coal.coal_bufs = bp->rx_coal.coal_bufs;
  3685. }
  3686. }
  3687. }
  3688. static int bnxt_init_rx_rings(struct bnxt *bp)
  3689. {
  3690. int i, rc = 0;
  3691. if (BNXT_RX_PAGE_MODE(bp)) {
  3692. bp->rx_offset = NET_IP_ALIGN + XDP_PACKET_HEADROOM;
  3693. bp->rx_dma_offset = XDP_PACKET_HEADROOM;
  3694. } else {
  3695. bp->rx_offset = BNXT_RX_OFFSET;
  3696. bp->rx_dma_offset = BNXT_RX_DMA_OFFSET;
  3697. }
  3698. for (i = 0; i < bp->rx_nr_rings; i++) {
  3699. rc = bnxt_init_one_rx_ring(bp, i);
  3700. if (rc)
  3701. break;
  3702. }
  3703. return rc;
  3704. }
  3705. static int bnxt_init_tx_rings(struct bnxt *bp)
  3706. {
  3707. u16 i;
  3708. bp->tx_wake_thresh = max_t(int, bp->tx_ring_size / 2,
  3709. BNXT_MIN_TX_DESC_CNT);
  3710. for (i = 0; i < bp->tx_nr_rings; i++) {
  3711. struct bnxt_tx_ring_info *txr = &bp->tx_ring[i];
  3712. struct bnxt_ring_struct *ring = &txr->tx_ring_struct;
  3713. ring->fw_ring_id = INVALID_HW_RING_ID;
  3714. if (i >= bp->tx_nr_rings_xdp)
  3715. netif_queue_set_napi(bp->dev, i - bp->tx_nr_rings_xdp,
  3716. NETDEV_QUEUE_TYPE_TX,
  3717. &txr->bnapi->napi);
  3718. }
  3719. return 0;
  3720. }
  3721. static void bnxt_free_ring_grps(struct bnxt *bp)
  3722. {
  3723. kfree(bp->grp_info);
  3724. bp->grp_info = NULL;
  3725. }
  3726. static int bnxt_init_ring_grps(struct bnxt *bp, bool irq_re_init)
  3727. {
  3728. int i;
  3729. if (irq_re_init) {
  3730. bp->grp_info = kcalloc(bp->cp_nr_rings,
  3731. sizeof(struct bnxt_ring_grp_info),
  3732. GFP_KERNEL);
  3733. if (!bp->grp_info)
  3734. return -ENOMEM;
  3735. }
  3736. for (i = 0; i < bp->cp_nr_rings; i++) {
  3737. if (irq_re_init)
  3738. bp->grp_info[i].fw_stats_ctx = INVALID_HW_RING_ID;
  3739. bp->grp_info[i].fw_grp_id = INVALID_HW_RING_ID;
  3740. bp->grp_info[i].rx_fw_ring_id = INVALID_HW_RING_ID;
  3741. bp->grp_info[i].agg_fw_ring_id = INVALID_HW_RING_ID;
  3742. bp->grp_info[i].cp_fw_ring_id = INVALID_HW_RING_ID;
  3743. }
  3744. return 0;
  3745. }
  3746. static void bnxt_free_vnics(struct bnxt *bp)
  3747. {
  3748. kfree(bp->vnic_info);
  3749. bp->vnic_info = NULL;
  3750. bp->nr_vnics = 0;
  3751. }
  3752. static int bnxt_alloc_vnics(struct bnxt *bp)
  3753. {
  3754. int num_vnics = 1;
  3755. #ifdef CONFIG_RFS_ACCEL
  3756. if (bp->flags & BNXT_FLAG_RFS) {
  3757. if (BNXT_SUPPORTS_NTUPLE_VNIC(bp))
  3758. num_vnics++;
  3759. else if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS))
  3760. num_vnics += bp->rx_nr_rings;
  3761. }
  3762. #endif
  3763. if (BNXT_CHIP_TYPE_NITRO_A0(bp))
  3764. num_vnics++;
  3765. bp->vnic_info = kcalloc(num_vnics, sizeof(struct bnxt_vnic_info),
  3766. GFP_KERNEL);
  3767. if (!bp->vnic_info)
  3768. return -ENOMEM;
  3769. bp->nr_vnics = num_vnics;
  3770. return 0;
  3771. }
  3772. static void bnxt_init_vnics(struct bnxt *bp)
  3773. {
  3774. struct bnxt_vnic_info *vnic0 = &bp->vnic_info[BNXT_VNIC_DEFAULT];
  3775. int i;
  3776. for (i = 0; i < bp->nr_vnics; i++) {
  3777. struct bnxt_vnic_info *vnic = &bp->vnic_info[i];
  3778. int j;
  3779. vnic->fw_vnic_id = INVALID_HW_RING_ID;
  3780. vnic->vnic_id = i;
  3781. for (j = 0; j < BNXT_MAX_CTX_PER_VNIC; j++)
  3782. vnic->fw_rss_cos_lb_ctx[j] = INVALID_HW_RING_ID;
  3783. vnic->fw_l2_ctx_id = INVALID_HW_RING_ID;
  3784. if (bp->vnic_info[i].rss_hash_key) {
  3785. if (i == BNXT_VNIC_DEFAULT) {
  3786. u8 *key = (void *)vnic->rss_hash_key;
  3787. int k;
  3788. if (!bp->rss_hash_key_valid &&
  3789. !bp->rss_hash_key_updated) {
  3790. get_random_bytes(bp->rss_hash_key,
  3791. HW_HASH_KEY_SIZE);
  3792. bp->rss_hash_key_updated = true;
  3793. }
  3794. memcpy(vnic->rss_hash_key, bp->rss_hash_key,
  3795. HW_HASH_KEY_SIZE);
  3796. if (!bp->rss_hash_key_updated)
  3797. continue;
  3798. bp->rss_hash_key_updated = false;
  3799. bp->rss_hash_key_valid = true;
  3800. bp->toeplitz_prefix = 0;
  3801. for (k = 0; k < 8; k++) {
  3802. bp->toeplitz_prefix <<= 8;
  3803. bp->toeplitz_prefix |= key[k];
  3804. }
  3805. } else {
  3806. memcpy(vnic->rss_hash_key, vnic0->rss_hash_key,
  3807. HW_HASH_KEY_SIZE);
  3808. }
  3809. }
  3810. }
  3811. }
  3812. static int bnxt_calc_nr_ring_pages(u32 ring_size, int desc_per_pg)
  3813. {
  3814. int pages;
  3815. pages = ring_size / desc_per_pg;
  3816. if (!pages)
  3817. return 1;
  3818. pages++;
  3819. while (pages & (pages - 1))
  3820. pages++;
  3821. return pages;
  3822. }
  3823. void bnxt_set_tpa_flags(struct bnxt *bp)
  3824. {
  3825. bp->flags &= ~BNXT_FLAG_TPA;
  3826. if (bp->flags & BNXT_FLAG_NO_AGG_RINGS)
  3827. return;
  3828. if (bp->dev->features & NETIF_F_LRO)
  3829. bp->flags |= BNXT_FLAG_LRO;
  3830. else if (bp->dev->features & NETIF_F_GRO_HW)
  3831. bp->flags |= BNXT_FLAG_GRO;
  3832. }
  3833. /* bp->rx_ring_size, bp->tx_ring_size, dev->mtu, BNXT_FLAG_{G|L}RO flags must
  3834. * be set on entry.
  3835. */
  3836. void bnxt_set_ring_params(struct bnxt *bp)
  3837. {
  3838. u32 ring_size, rx_size, rx_space, max_rx_cmpl;
  3839. u32 agg_factor = 0, agg_ring_size = 0;
  3840. /* 8 for CRC and VLAN */
  3841. rx_size = SKB_DATA_ALIGN(bp->dev->mtu + ETH_HLEN + NET_IP_ALIGN + 8);
  3842. rx_space = rx_size + ALIGN(max(NET_SKB_PAD, XDP_PACKET_HEADROOM), 8) +
  3843. SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
  3844. bp->rx_copy_thresh = BNXT_RX_COPY_THRESH;
  3845. ring_size = bp->rx_ring_size;
  3846. bp->rx_agg_ring_size = 0;
  3847. bp->rx_agg_nr_pages = 0;
  3848. if (bp->flags & BNXT_FLAG_TPA)
  3849. agg_factor = min_t(u32, 4, 65536 / BNXT_RX_PAGE_SIZE);
  3850. bp->flags &= ~BNXT_FLAG_JUMBO;
  3851. if (rx_space > PAGE_SIZE && !(bp->flags & BNXT_FLAG_NO_AGG_RINGS)) {
  3852. u32 jumbo_factor;
  3853. bp->flags |= BNXT_FLAG_JUMBO;
  3854. jumbo_factor = PAGE_ALIGN(bp->dev->mtu - 40) >> PAGE_SHIFT;
  3855. if (jumbo_factor > agg_factor)
  3856. agg_factor = jumbo_factor;
  3857. }
  3858. if (agg_factor) {
  3859. if (ring_size > BNXT_MAX_RX_DESC_CNT_JUM_ENA) {
  3860. ring_size = BNXT_MAX_RX_DESC_CNT_JUM_ENA;
  3861. netdev_warn(bp->dev, "RX ring size reduced from %d to %d because the jumbo ring is now enabled\n",
  3862. bp->rx_ring_size, ring_size);
  3863. bp->rx_ring_size = ring_size;
  3864. }
  3865. agg_ring_size = ring_size * agg_factor;
  3866. bp->rx_agg_nr_pages = bnxt_calc_nr_ring_pages(agg_ring_size,
  3867. RX_DESC_CNT);
  3868. if (bp->rx_agg_nr_pages > MAX_RX_AGG_PAGES) {
  3869. u32 tmp = agg_ring_size;
  3870. bp->rx_agg_nr_pages = MAX_RX_AGG_PAGES;
  3871. agg_ring_size = MAX_RX_AGG_PAGES * RX_DESC_CNT - 1;
  3872. netdev_warn(bp->dev, "rx agg ring size %d reduced to %d.\n",
  3873. tmp, agg_ring_size);
  3874. }
  3875. bp->rx_agg_ring_size = agg_ring_size;
  3876. bp->rx_agg_ring_mask = (bp->rx_agg_nr_pages * RX_DESC_CNT) - 1;
  3877. if (BNXT_RX_PAGE_MODE(bp)) {
  3878. rx_space = PAGE_SIZE;
  3879. rx_size = PAGE_SIZE -
  3880. ALIGN(max(NET_SKB_PAD, XDP_PACKET_HEADROOM), 8) -
  3881. SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
  3882. } else {
  3883. rx_size = SKB_DATA_ALIGN(BNXT_RX_COPY_THRESH + NET_IP_ALIGN);
  3884. rx_space = rx_size + NET_SKB_PAD +
  3885. SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
  3886. }
  3887. }
  3888. bp->rx_buf_use_size = rx_size;
  3889. bp->rx_buf_size = rx_space;
  3890. bp->rx_nr_pages = bnxt_calc_nr_ring_pages(ring_size, RX_DESC_CNT);
  3891. bp->rx_ring_mask = (bp->rx_nr_pages * RX_DESC_CNT) - 1;
  3892. ring_size = bp->tx_ring_size;
  3893. bp->tx_nr_pages = bnxt_calc_nr_ring_pages(ring_size, TX_DESC_CNT);
  3894. bp->tx_ring_mask = (bp->tx_nr_pages * TX_DESC_CNT) - 1;
  3895. max_rx_cmpl = bp->rx_ring_size;
  3896. /* MAX TPA needs to be added because TPA_START completions are
  3897. * immediately recycled, so the TPA completions are not bound by
  3898. * the RX ring size.
  3899. */
  3900. if (bp->flags & BNXT_FLAG_TPA)
  3901. max_rx_cmpl += bp->max_tpa;
  3902. /* RX and TPA completions are 32-byte, all others are 16-byte */
  3903. ring_size = max_rx_cmpl * 2 + agg_ring_size + bp->tx_ring_size;
  3904. bp->cp_ring_size = ring_size;
  3905. bp->cp_nr_pages = bnxt_calc_nr_ring_pages(ring_size, CP_DESC_CNT);
  3906. if (bp->cp_nr_pages > MAX_CP_PAGES) {
  3907. bp->cp_nr_pages = MAX_CP_PAGES;
  3908. bp->cp_ring_size = MAX_CP_PAGES * CP_DESC_CNT - 1;
  3909. netdev_warn(bp->dev, "completion ring size %d reduced to %d.\n",
  3910. ring_size, bp->cp_ring_size);
  3911. }
  3912. bp->cp_bit = bp->cp_nr_pages * CP_DESC_CNT;
  3913. bp->cp_ring_mask = bp->cp_bit - 1;
  3914. }
  3915. /* Changing allocation mode of RX rings.
  3916. * TODO: Update when extending xdp_rxq_info to support allocation modes.
  3917. */
  3918. static void __bnxt_set_rx_skb_mode(struct bnxt *bp, bool page_mode)
  3919. {
  3920. struct net_device *dev = bp->dev;
  3921. if (page_mode) {
  3922. bp->flags &= ~(BNXT_FLAG_AGG_RINGS | BNXT_FLAG_NO_AGG_RINGS);
  3923. bp->flags |= BNXT_FLAG_RX_PAGE_MODE;
  3924. if (bp->xdp_prog->aux->xdp_has_frags)
  3925. dev->max_mtu = min_t(u16, bp->max_mtu, BNXT_MAX_MTU);
  3926. else
  3927. dev->max_mtu =
  3928. min_t(u16, bp->max_mtu, BNXT_MAX_PAGE_MODE_MTU);
  3929. if (dev->mtu > BNXT_MAX_PAGE_MODE_MTU) {
  3930. bp->flags |= BNXT_FLAG_JUMBO;
  3931. bp->rx_skb_func = bnxt_rx_multi_page_skb;
  3932. } else {
  3933. bp->flags |= BNXT_FLAG_NO_AGG_RINGS;
  3934. bp->rx_skb_func = bnxt_rx_page_skb;
  3935. }
  3936. bp->rx_dir = DMA_BIDIRECTIONAL;
  3937. } else {
  3938. dev->max_mtu = bp->max_mtu;
  3939. bp->flags &= ~BNXT_FLAG_RX_PAGE_MODE;
  3940. bp->rx_dir = DMA_FROM_DEVICE;
  3941. bp->rx_skb_func = bnxt_rx_skb;
  3942. }
  3943. }
  3944. void bnxt_set_rx_skb_mode(struct bnxt *bp, bool page_mode)
  3945. {
  3946. __bnxt_set_rx_skb_mode(bp, page_mode);
  3947. if (!page_mode) {
  3948. int rx, tx;
  3949. bnxt_get_max_rings(bp, &rx, &tx, true);
  3950. if (rx > 1) {
  3951. bp->flags &= ~BNXT_FLAG_NO_AGG_RINGS;
  3952. bp->dev->hw_features |= NETIF_F_LRO;
  3953. }
  3954. }
  3955. /* Update LRO and GRO_HW availability */
  3956. netdev_update_features(bp->dev);
  3957. }
  3958. static void bnxt_free_vnic_attributes(struct bnxt *bp)
  3959. {
  3960. int i;
  3961. struct bnxt_vnic_info *vnic;
  3962. struct pci_dev *pdev = bp->pdev;
  3963. if (!bp->vnic_info)
  3964. return;
  3965. for (i = 0; i < bp->nr_vnics; i++) {
  3966. vnic = &bp->vnic_info[i];
  3967. kfree(vnic->fw_grp_ids);
  3968. vnic->fw_grp_ids = NULL;
  3969. kfree(vnic->uc_list);
  3970. vnic->uc_list = NULL;
  3971. if (vnic->mc_list) {
  3972. dma_free_coherent(&pdev->dev, vnic->mc_list_size,
  3973. vnic->mc_list, vnic->mc_list_mapping);
  3974. vnic->mc_list = NULL;
  3975. }
  3976. if (vnic->rss_table) {
  3977. dma_free_coherent(&pdev->dev, vnic->rss_table_size,
  3978. vnic->rss_table,
  3979. vnic->rss_table_dma_addr);
  3980. vnic->rss_table = NULL;
  3981. }
  3982. vnic->rss_hash_key = NULL;
  3983. vnic->flags = 0;
  3984. }
  3985. }
  3986. static int bnxt_alloc_vnic_attributes(struct bnxt *bp)
  3987. {
  3988. int i, rc = 0, size;
  3989. struct bnxt_vnic_info *vnic;
  3990. struct pci_dev *pdev = bp->pdev;
  3991. int max_rings;
  3992. for (i = 0; i < bp->nr_vnics; i++) {
  3993. vnic = &bp->vnic_info[i];
  3994. if (vnic->flags & BNXT_VNIC_UCAST_FLAG) {
  3995. int mem_size = (BNXT_MAX_UC_ADDRS - 1) * ETH_ALEN;
  3996. if (mem_size > 0) {
  3997. vnic->uc_list = kmalloc(mem_size, GFP_KERNEL);
  3998. if (!vnic->uc_list) {
  3999. rc = -ENOMEM;
  4000. goto out;
  4001. }
  4002. }
  4003. }
  4004. if (vnic->flags & BNXT_VNIC_MCAST_FLAG) {
  4005. vnic->mc_list_size = BNXT_MAX_MC_ADDRS * ETH_ALEN;
  4006. vnic->mc_list =
  4007. dma_alloc_coherent(&pdev->dev,
  4008. vnic->mc_list_size,
  4009. &vnic->mc_list_mapping,
  4010. GFP_KERNEL);
  4011. if (!vnic->mc_list) {
  4012. rc = -ENOMEM;
  4013. goto out;
  4014. }
  4015. }
  4016. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  4017. goto vnic_skip_grps;
  4018. if (vnic->flags & BNXT_VNIC_RSS_FLAG)
  4019. max_rings = bp->rx_nr_rings;
  4020. else
  4021. max_rings = 1;
  4022. vnic->fw_grp_ids = kcalloc(max_rings, sizeof(u16), GFP_KERNEL);
  4023. if (!vnic->fw_grp_ids) {
  4024. rc = -ENOMEM;
  4025. goto out;
  4026. }
  4027. vnic_skip_grps:
  4028. if ((bp->rss_cap & BNXT_RSS_CAP_NEW_RSS_CAP) &&
  4029. !(vnic->flags & BNXT_VNIC_RSS_FLAG))
  4030. continue;
  4031. /* Allocate rss table and hash key */
  4032. size = L1_CACHE_ALIGN(HW_HASH_INDEX_SIZE * sizeof(u16));
  4033. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  4034. size = L1_CACHE_ALIGN(BNXT_MAX_RSS_TABLE_SIZE_P5);
  4035. vnic->rss_table_size = size + HW_HASH_KEY_SIZE;
  4036. vnic->rss_table = dma_alloc_coherent(&pdev->dev,
  4037. vnic->rss_table_size,
  4038. &vnic->rss_table_dma_addr,
  4039. GFP_KERNEL);
  4040. if (!vnic->rss_table) {
  4041. rc = -ENOMEM;
  4042. goto out;
  4043. }
  4044. vnic->rss_hash_key = ((void *)vnic->rss_table) + size;
  4045. vnic->rss_hash_key_dma_addr = vnic->rss_table_dma_addr + size;
  4046. }
  4047. return 0;
  4048. out:
  4049. return rc;
  4050. }
  4051. static void bnxt_free_hwrm_resources(struct bnxt *bp)
  4052. {
  4053. struct bnxt_hwrm_wait_token *token;
  4054. dma_pool_destroy(bp->hwrm_dma_pool);
  4055. bp->hwrm_dma_pool = NULL;
  4056. rcu_read_lock();
  4057. hlist_for_each_entry_rcu(token, &bp->hwrm_pending_list, node)
  4058. WRITE_ONCE(token->state, BNXT_HWRM_CANCELLED);
  4059. rcu_read_unlock();
  4060. }
  4061. static int bnxt_alloc_hwrm_resources(struct bnxt *bp)
  4062. {
  4063. bp->hwrm_dma_pool = dma_pool_create("bnxt_hwrm", &bp->pdev->dev,
  4064. BNXT_HWRM_DMA_SIZE,
  4065. BNXT_HWRM_DMA_ALIGN, 0);
  4066. if (!bp->hwrm_dma_pool)
  4067. return -ENOMEM;
  4068. INIT_HLIST_HEAD(&bp->hwrm_pending_list);
  4069. return 0;
  4070. }
  4071. static void bnxt_free_stats_mem(struct bnxt *bp, struct bnxt_stats_mem *stats)
  4072. {
  4073. kfree(stats->hw_masks);
  4074. stats->hw_masks = NULL;
  4075. kfree(stats->sw_stats);
  4076. stats->sw_stats = NULL;
  4077. if (stats->hw_stats) {
  4078. dma_free_coherent(&bp->pdev->dev, stats->len, stats->hw_stats,
  4079. stats->hw_stats_map);
  4080. stats->hw_stats = NULL;
  4081. }
  4082. }
  4083. static int bnxt_alloc_stats_mem(struct bnxt *bp, struct bnxt_stats_mem *stats,
  4084. bool alloc_masks)
  4085. {
  4086. stats->hw_stats = dma_alloc_coherent(&bp->pdev->dev, stats->len,
  4087. &stats->hw_stats_map, GFP_KERNEL);
  4088. if (!stats->hw_stats)
  4089. return -ENOMEM;
  4090. stats->sw_stats = kzalloc(stats->len, GFP_KERNEL);
  4091. if (!stats->sw_stats)
  4092. goto stats_mem_err;
  4093. if (alloc_masks) {
  4094. stats->hw_masks = kzalloc(stats->len, GFP_KERNEL);
  4095. if (!stats->hw_masks)
  4096. goto stats_mem_err;
  4097. }
  4098. return 0;
  4099. stats_mem_err:
  4100. bnxt_free_stats_mem(bp, stats);
  4101. return -ENOMEM;
  4102. }
  4103. static void bnxt_fill_masks(u64 *mask_arr, u64 mask, int count)
  4104. {
  4105. int i;
  4106. for (i = 0; i < count; i++)
  4107. mask_arr[i] = mask;
  4108. }
  4109. static void bnxt_copy_hw_masks(u64 *mask_arr, __le64 *hw_mask_arr, int count)
  4110. {
  4111. int i;
  4112. for (i = 0; i < count; i++)
  4113. mask_arr[i] = le64_to_cpu(hw_mask_arr[i]);
  4114. }
  4115. static int bnxt_hwrm_func_qstat_ext(struct bnxt *bp,
  4116. struct bnxt_stats_mem *stats)
  4117. {
  4118. struct hwrm_func_qstats_ext_output *resp;
  4119. struct hwrm_func_qstats_ext_input *req;
  4120. __le64 *hw_masks;
  4121. int rc;
  4122. if (!(bp->fw_cap & BNXT_FW_CAP_EXT_HW_STATS_SUPPORTED) ||
  4123. !(bp->flags & BNXT_FLAG_CHIP_P5_PLUS))
  4124. return -EOPNOTSUPP;
  4125. rc = hwrm_req_init(bp, req, HWRM_FUNC_QSTATS_EXT);
  4126. if (rc)
  4127. return rc;
  4128. req->fid = cpu_to_le16(0xffff);
  4129. req->flags = FUNC_QSTATS_EXT_REQ_FLAGS_COUNTER_MASK;
  4130. resp = hwrm_req_hold(bp, req);
  4131. rc = hwrm_req_send(bp, req);
  4132. if (!rc) {
  4133. hw_masks = &resp->rx_ucast_pkts;
  4134. bnxt_copy_hw_masks(stats->hw_masks, hw_masks, stats->len / 8);
  4135. }
  4136. hwrm_req_drop(bp, req);
  4137. return rc;
  4138. }
  4139. static int bnxt_hwrm_port_qstats(struct bnxt *bp, u8 flags);
  4140. static int bnxt_hwrm_port_qstats_ext(struct bnxt *bp, u8 flags);
  4141. static void bnxt_init_stats(struct bnxt *bp)
  4142. {
  4143. struct bnxt_napi *bnapi = bp->bnapi[0];
  4144. struct bnxt_cp_ring_info *cpr;
  4145. struct bnxt_stats_mem *stats;
  4146. __le64 *rx_stats, *tx_stats;
  4147. int rc, rx_count, tx_count;
  4148. u64 *rx_masks, *tx_masks;
  4149. u64 mask;
  4150. u8 flags;
  4151. cpr = &bnapi->cp_ring;
  4152. stats = &cpr->stats;
  4153. rc = bnxt_hwrm_func_qstat_ext(bp, stats);
  4154. if (rc) {
  4155. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  4156. mask = (1ULL << 48) - 1;
  4157. else
  4158. mask = -1ULL;
  4159. bnxt_fill_masks(stats->hw_masks, mask, stats->len / 8);
  4160. }
  4161. if (bp->flags & BNXT_FLAG_PORT_STATS) {
  4162. stats = &bp->port_stats;
  4163. rx_stats = stats->hw_stats;
  4164. rx_masks = stats->hw_masks;
  4165. rx_count = sizeof(struct rx_port_stats) / 8;
  4166. tx_stats = rx_stats + BNXT_TX_PORT_STATS_BYTE_OFFSET / 8;
  4167. tx_masks = rx_masks + BNXT_TX_PORT_STATS_BYTE_OFFSET / 8;
  4168. tx_count = sizeof(struct tx_port_stats) / 8;
  4169. flags = PORT_QSTATS_REQ_FLAGS_COUNTER_MASK;
  4170. rc = bnxt_hwrm_port_qstats(bp, flags);
  4171. if (rc) {
  4172. mask = (1ULL << 40) - 1;
  4173. bnxt_fill_masks(rx_masks, mask, rx_count);
  4174. bnxt_fill_masks(tx_masks, mask, tx_count);
  4175. } else {
  4176. bnxt_copy_hw_masks(rx_masks, rx_stats, rx_count);
  4177. bnxt_copy_hw_masks(tx_masks, tx_stats, tx_count);
  4178. bnxt_hwrm_port_qstats(bp, 0);
  4179. }
  4180. }
  4181. if (bp->flags & BNXT_FLAG_PORT_STATS_EXT) {
  4182. stats = &bp->rx_port_stats_ext;
  4183. rx_stats = stats->hw_stats;
  4184. rx_masks = stats->hw_masks;
  4185. rx_count = sizeof(struct rx_port_stats_ext) / 8;
  4186. stats = &bp->tx_port_stats_ext;
  4187. tx_stats = stats->hw_stats;
  4188. tx_masks = stats->hw_masks;
  4189. tx_count = sizeof(struct tx_port_stats_ext) / 8;
  4190. flags = PORT_QSTATS_EXT_REQ_FLAGS_COUNTER_MASK;
  4191. rc = bnxt_hwrm_port_qstats_ext(bp, flags);
  4192. if (rc) {
  4193. mask = (1ULL << 40) - 1;
  4194. bnxt_fill_masks(rx_masks, mask, rx_count);
  4195. if (tx_stats)
  4196. bnxt_fill_masks(tx_masks, mask, tx_count);
  4197. } else {
  4198. bnxt_copy_hw_masks(rx_masks, rx_stats, rx_count);
  4199. if (tx_stats)
  4200. bnxt_copy_hw_masks(tx_masks, tx_stats,
  4201. tx_count);
  4202. bnxt_hwrm_port_qstats_ext(bp, 0);
  4203. }
  4204. }
  4205. }
  4206. static void bnxt_free_port_stats(struct bnxt *bp)
  4207. {
  4208. bp->flags &= ~BNXT_FLAG_PORT_STATS;
  4209. bp->flags &= ~BNXT_FLAG_PORT_STATS_EXT;
  4210. bnxt_free_stats_mem(bp, &bp->port_stats);
  4211. bnxt_free_stats_mem(bp, &bp->rx_port_stats_ext);
  4212. bnxt_free_stats_mem(bp, &bp->tx_port_stats_ext);
  4213. }
  4214. static void bnxt_free_ring_stats(struct bnxt *bp)
  4215. {
  4216. int i;
  4217. if (!bp->bnapi)
  4218. return;
  4219. for (i = 0; i < bp->cp_nr_rings; i++) {
  4220. struct bnxt_napi *bnapi = bp->bnapi[i];
  4221. struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
  4222. bnxt_free_stats_mem(bp, &cpr->stats);
  4223. kfree(cpr->sw_stats);
  4224. cpr->sw_stats = NULL;
  4225. }
  4226. }
  4227. static int bnxt_alloc_stats(struct bnxt *bp)
  4228. {
  4229. u32 size, i;
  4230. int rc;
  4231. size = bp->hw_ring_stats_size;
  4232. for (i = 0; i < bp->cp_nr_rings; i++) {
  4233. struct bnxt_napi *bnapi = bp->bnapi[i];
  4234. struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
  4235. cpr->sw_stats = kzalloc(sizeof(*cpr->sw_stats), GFP_KERNEL);
  4236. if (!cpr->sw_stats)
  4237. return -ENOMEM;
  4238. cpr->stats.len = size;
  4239. rc = bnxt_alloc_stats_mem(bp, &cpr->stats, !i);
  4240. if (rc)
  4241. return rc;
  4242. cpr->hw_stats_ctx_id = INVALID_STATS_CTX_ID;
  4243. }
  4244. if (BNXT_VF(bp) || bp->chip_num == CHIP_NUM_58700)
  4245. return 0;
  4246. if (bp->port_stats.hw_stats)
  4247. goto alloc_ext_stats;
  4248. bp->port_stats.len = BNXT_PORT_STATS_SIZE;
  4249. rc = bnxt_alloc_stats_mem(bp, &bp->port_stats, true);
  4250. if (rc)
  4251. return rc;
  4252. bp->flags |= BNXT_FLAG_PORT_STATS;
  4253. alloc_ext_stats:
  4254. /* Display extended statistics only if FW supports it */
  4255. if (bp->hwrm_spec_code < 0x10804 || bp->hwrm_spec_code == 0x10900)
  4256. if (!(bp->fw_cap & BNXT_FW_CAP_EXT_STATS_SUPPORTED))
  4257. return 0;
  4258. if (bp->rx_port_stats_ext.hw_stats)
  4259. goto alloc_tx_ext_stats;
  4260. bp->rx_port_stats_ext.len = sizeof(struct rx_port_stats_ext);
  4261. rc = bnxt_alloc_stats_mem(bp, &bp->rx_port_stats_ext, true);
  4262. /* Extended stats are optional */
  4263. if (rc)
  4264. return 0;
  4265. alloc_tx_ext_stats:
  4266. if (bp->tx_port_stats_ext.hw_stats)
  4267. return 0;
  4268. if (bp->hwrm_spec_code >= 0x10902 ||
  4269. (bp->fw_cap & BNXT_FW_CAP_EXT_STATS_SUPPORTED)) {
  4270. bp->tx_port_stats_ext.len = sizeof(struct tx_port_stats_ext);
  4271. rc = bnxt_alloc_stats_mem(bp, &bp->tx_port_stats_ext, true);
  4272. /* Extended stats are optional */
  4273. if (rc)
  4274. return 0;
  4275. }
  4276. bp->flags |= BNXT_FLAG_PORT_STATS_EXT;
  4277. return 0;
  4278. }
  4279. static void bnxt_clear_ring_indices(struct bnxt *bp)
  4280. {
  4281. int i, j;
  4282. if (!bp->bnapi)
  4283. return;
  4284. for (i = 0; i < bp->cp_nr_rings; i++) {
  4285. struct bnxt_napi *bnapi = bp->bnapi[i];
  4286. struct bnxt_cp_ring_info *cpr;
  4287. struct bnxt_rx_ring_info *rxr;
  4288. struct bnxt_tx_ring_info *txr;
  4289. if (!bnapi)
  4290. continue;
  4291. cpr = &bnapi->cp_ring;
  4292. cpr->cp_raw_cons = 0;
  4293. bnxt_for_each_napi_tx(j, bnapi, txr) {
  4294. txr->tx_prod = 0;
  4295. txr->tx_cons = 0;
  4296. txr->tx_hw_cons = 0;
  4297. }
  4298. rxr = bnapi->rx_ring;
  4299. if (rxr) {
  4300. rxr->rx_prod = 0;
  4301. rxr->rx_agg_prod = 0;
  4302. rxr->rx_sw_agg_prod = 0;
  4303. rxr->rx_next_cons = 0;
  4304. }
  4305. bnapi->events = 0;
  4306. }
  4307. }
  4308. void bnxt_insert_usr_fltr(struct bnxt *bp, struct bnxt_filter_base *fltr)
  4309. {
  4310. u8 type = fltr->type, flags = fltr->flags;
  4311. INIT_LIST_HEAD(&fltr->list);
  4312. if ((type == BNXT_FLTR_TYPE_L2 && flags & BNXT_ACT_RING_DST) ||
  4313. (type == BNXT_FLTR_TYPE_NTUPLE && flags & BNXT_ACT_NO_AGING))
  4314. list_add_tail(&fltr->list, &bp->usr_fltr_list);
  4315. }
  4316. void bnxt_del_one_usr_fltr(struct bnxt *bp, struct bnxt_filter_base *fltr)
  4317. {
  4318. if (!list_empty(&fltr->list))
  4319. list_del_init(&fltr->list);
  4320. }
  4321. static void bnxt_clear_usr_fltrs(struct bnxt *bp, bool all)
  4322. {
  4323. struct bnxt_filter_base *usr_fltr, *tmp;
  4324. list_for_each_entry_safe(usr_fltr, tmp, &bp->usr_fltr_list, list) {
  4325. if (!all && usr_fltr->type == BNXT_FLTR_TYPE_L2)
  4326. continue;
  4327. bnxt_del_one_usr_fltr(bp, usr_fltr);
  4328. }
  4329. }
  4330. static void bnxt_del_fltr(struct bnxt *bp, struct bnxt_filter_base *fltr)
  4331. {
  4332. hlist_del(&fltr->hash);
  4333. bnxt_del_one_usr_fltr(bp, fltr);
  4334. if (fltr->flags) {
  4335. clear_bit(fltr->sw_id, bp->ntp_fltr_bmap);
  4336. bp->ntp_fltr_count--;
  4337. }
  4338. kfree(fltr);
  4339. }
  4340. static void bnxt_free_ntp_fltrs(struct bnxt *bp, bool all)
  4341. {
  4342. int i;
  4343. /* Under rtnl_lock and all our NAPIs have been disabled. It's
  4344. * safe to delete the hash table.
  4345. */
  4346. for (i = 0; i < BNXT_NTP_FLTR_HASH_SIZE; i++) {
  4347. struct hlist_head *head;
  4348. struct hlist_node *tmp;
  4349. struct bnxt_ntuple_filter *fltr;
  4350. head = &bp->ntp_fltr_hash_tbl[i];
  4351. hlist_for_each_entry_safe(fltr, tmp, head, base.hash) {
  4352. bnxt_del_l2_filter(bp, fltr->l2_fltr);
  4353. if (!all && ((fltr->base.flags & BNXT_ACT_FUNC_DST) ||
  4354. !list_empty(&fltr->base.list)))
  4355. continue;
  4356. bnxt_del_fltr(bp, &fltr->base);
  4357. }
  4358. }
  4359. if (!all)
  4360. return;
  4361. bitmap_free(bp->ntp_fltr_bmap);
  4362. bp->ntp_fltr_bmap = NULL;
  4363. bp->ntp_fltr_count = 0;
  4364. }
  4365. static int bnxt_alloc_ntp_fltrs(struct bnxt *bp)
  4366. {
  4367. int i, rc = 0;
  4368. if (!(bp->flags & BNXT_FLAG_RFS) || bp->ntp_fltr_bmap)
  4369. return 0;
  4370. for (i = 0; i < BNXT_NTP_FLTR_HASH_SIZE; i++)
  4371. INIT_HLIST_HEAD(&bp->ntp_fltr_hash_tbl[i]);
  4372. bp->ntp_fltr_count = 0;
  4373. bp->ntp_fltr_bmap = bitmap_zalloc(bp->max_fltr, GFP_KERNEL);
  4374. if (!bp->ntp_fltr_bmap)
  4375. rc = -ENOMEM;
  4376. return rc;
  4377. }
  4378. static void bnxt_free_l2_filters(struct bnxt *bp, bool all)
  4379. {
  4380. int i;
  4381. for (i = 0; i < BNXT_L2_FLTR_HASH_SIZE; i++) {
  4382. struct hlist_head *head;
  4383. struct hlist_node *tmp;
  4384. struct bnxt_l2_filter *fltr;
  4385. head = &bp->l2_fltr_hash_tbl[i];
  4386. hlist_for_each_entry_safe(fltr, tmp, head, base.hash) {
  4387. if (!all && ((fltr->base.flags & BNXT_ACT_FUNC_DST) ||
  4388. !list_empty(&fltr->base.list)))
  4389. continue;
  4390. bnxt_del_fltr(bp, &fltr->base);
  4391. }
  4392. }
  4393. }
  4394. static void bnxt_init_l2_fltr_tbl(struct bnxt *bp)
  4395. {
  4396. int i;
  4397. for (i = 0; i < BNXT_L2_FLTR_HASH_SIZE; i++)
  4398. INIT_HLIST_HEAD(&bp->l2_fltr_hash_tbl[i]);
  4399. get_random_bytes(&bp->hash_seed, sizeof(bp->hash_seed));
  4400. }
  4401. static void bnxt_free_mem(struct bnxt *bp, bool irq_re_init)
  4402. {
  4403. bnxt_free_vnic_attributes(bp);
  4404. bnxt_free_tx_rings(bp);
  4405. bnxt_free_rx_rings(bp);
  4406. bnxt_free_cp_rings(bp);
  4407. bnxt_free_all_cp_arrays(bp);
  4408. bnxt_free_ntp_fltrs(bp, false);
  4409. bnxt_free_l2_filters(bp, false);
  4410. if (irq_re_init) {
  4411. bnxt_free_ring_stats(bp);
  4412. if (!(bp->phy_flags & BNXT_PHY_FL_PORT_STATS_NO_RESET) ||
  4413. test_bit(BNXT_STATE_IN_FW_RESET, &bp->state))
  4414. bnxt_free_port_stats(bp);
  4415. bnxt_free_ring_grps(bp);
  4416. bnxt_free_vnics(bp);
  4417. kfree(bp->tx_ring_map);
  4418. bp->tx_ring_map = NULL;
  4419. kfree(bp->tx_ring);
  4420. bp->tx_ring = NULL;
  4421. kfree(bp->rx_ring);
  4422. bp->rx_ring = NULL;
  4423. kfree(bp->bnapi);
  4424. bp->bnapi = NULL;
  4425. } else {
  4426. bnxt_clear_ring_indices(bp);
  4427. }
  4428. }
  4429. static int bnxt_alloc_mem(struct bnxt *bp, bool irq_re_init)
  4430. {
  4431. int i, j, rc, size, arr_size;
  4432. void *bnapi;
  4433. if (irq_re_init) {
  4434. /* Allocate bnapi mem pointer array and mem block for
  4435. * all queues
  4436. */
  4437. arr_size = L1_CACHE_ALIGN(sizeof(struct bnxt_napi *) *
  4438. bp->cp_nr_rings);
  4439. size = L1_CACHE_ALIGN(sizeof(struct bnxt_napi));
  4440. bnapi = kzalloc(arr_size + size * bp->cp_nr_rings, GFP_KERNEL);
  4441. if (!bnapi)
  4442. return -ENOMEM;
  4443. bp->bnapi = bnapi;
  4444. bnapi += arr_size;
  4445. for (i = 0; i < bp->cp_nr_rings; i++, bnapi += size) {
  4446. bp->bnapi[i] = bnapi;
  4447. bp->bnapi[i]->index = i;
  4448. bp->bnapi[i]->bp = bp;
  4449. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  4450. struct bnxt_cp_ring_info *cpr =
  4451. &bp->bnapi[i]->cp_ring;
  4452. cpr->cp_ring_struct.ring_mem.flags =
  4453. BNXT_RMEM_RING_PTE_FLAG;
  4454. }
  4455. }
  4456. bp->rx_ring = kcalloc(bp->rx_nr_rings,
  4457. sizeof(struct bnxt_rx_ring_info),
  4458. GFP_KERNEL);
  4459. if (!bp->rx_ring)
  4460. return -ENOMEM;
  4461. for (i = 0; i < bp->rx_nr_rings; i++) {
  4462. struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
  4463. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  4464. rxr->rx_ring_struct.ring_mem.flags =
  4465. BNXT_RMEM_RING_PTE_FLAG;
  4466. rxr->rx_agg_ring_struct.ring_mem.flags =
  4467. BNXT_RMEM_RING_PTE_FLAG;
  4468. } else {
  4469. rxr->rx_cpr = &bp->bnapi[i]->cp_ring;
  4470. }
  4471. rxr->bnapi = bp->bnapi[i];
  4472. bp->bnapi[i]->rx_ring = &bp->rx_ring[i];
  4473. }
  4474. bp->tx_ring = kcalloc(bp->tx_nr_rings,
  4475. sizeof(struct bnxt_tx_ring_info),
  4476. GFP_KERNEL);
  4477. if (!bp->tx_ring)
  4478. return -ENOMEM;
  4479. bp->tx_ring_map = kcalloc(bp->tx_nr_rings, sizeof(u16),
  4480. GFP_KERNEL);
  4481. if (!bp->tx_ring_map)
  4482. return -ENOMEM;
  4483. if (bp->flags & BNXT_FLAG_SHARED_RINGS)
  4484. j = 0;
  4485. else
  4486. j = bp->rx_nr_rings;
  4487. for (i = 0; i < bp->tx_nr_rings; i++) {
  4488. struct bnxt_tx_ring_info *txr = &bp->tx_ring[i];
  4489. struct bnxt_napi *bnapi2;
  4490. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  4491. txr->tx_ring_struct.ring_mem.flags =
  4492. BNXT_RMEM_RING_PTE_FLAG;
  4493. bp->tx_ring_map[i] = bp->tx_nr_rings_xdp + i;
  4494. if (i >= bp->tx_nr_rings_xdp) {
  4495. int k = j + BNXT_RING_TO_TC_OFF(bp, i);
  4496. bnapi2 = bp->bnapi[k];
  4497. txr->txq_index = i - bp->tx_nr_rings_xdp;
  4498. txr->tx_napi_idx =
  4499. BNXT_RING_TO_TC(bp, txr->txq_index);
  4500. bnapi2->tx_ring[txr->tx_napi_idx] = txr;
  4501. bnapi2->tx_int = bnxt_tx_int;
  4502. } else {
  4503. bnapi2 = bp->bnapi[j];
  4504. bnapi2->flags |= BNXT_NAPI_FLAG_XDP;
  4505. bnapi2->tx_ring[0] = txr;
  4506. bnapi2->tx_int = bnxt_tx_int_xdp;
  4507. j++;
  4508. }
  4509. txr->bnapi = bnapi2;
  4510. if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS))
  4511. txr->tx_cpr = &bnapi2->cp_ring;
  4512. }
  4513. rc = bnxt_alloc_stats(bp);
  4514. if (rc)
  4515. goto alloc_mem_err;
  4516. bnxt_init_stats(bp);
  4517. rc = bnxt_alloc_ntp_fltrs(bp);
  4518. if (rc)
  4519. goto alloc_mem_err;
  4520. rc = bnxt_alloc_vnics(bp);
  4521. if (rc)
  4522. goto alloc_mem_err;
  4523. }
  4524. rc = bnxt_alloc_all_cp_arrays(bp);
  4525. if (rc)
  4526. goto alloc_mem_err;
  4527. bnxt_init_ring_struct(bp);
  4528. rc = bnxt_alloc_rx_rings(bp);
  4529. if (rc)
  4530. goto alloc_mem_err;
  4531. rc = bnxt_alloc_tx_rings(bp);
  4532. if (rc)
  4533. goto alloc_mem_err;
  4534. rc = bnxt_alloc_cp_rings(bp);
  4535. if (rc)
  4536. goto alloc_mem_err;
  4537. bp->vnic_info[BNXT_VNIC_DEFAULT].flags |= BNXT_VNIC_RSS_FLAG |
  4538. BNXT_VNIC_MCAST_FLAG |
  4539. BNXT_VNIC_UCAST_FLAG;
  4540. if (BNXT_SUPPORTS_NTUPLE_VNIC(bp) && (bp->flags & BNXT_FLAG_RFS))
  4541. bp->vnic_info[BNXT_VNIC_NTUPLE].flags |=
  4542. BNXT_VNIC_RSS_FLAG | BNXT_VNIC_NTUPLE_FLAG;
  4543. rc = bnxt_alloc_vnic_attributes(bp);
  4544. if (rc)
  4545. goto alloc_mem_err;
  4546. return 0;
  4547. alloc_mem_err:
  4548. bnxt_free_mem(bp, true);
  4549. return rc;
  4550. }
  4551. static void bnxt_disable_int(struct bnxt *bp)
  4552. {
  4553. int i;
  4554. if (!bp->bnapi)
  4555. return;
  4556. for (i = 0; i < bp->cp_nr_rings; i++) {
  4557. struct bnxt_napi *bnapi = bp->bnapi[i];
  4558. struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
  4559. struct bnxt_ring_struct *ring = &cpr->cp_ring_struct;
  4560. if (ring->fw_ring_id != INVALID_HW_RING_ID)
  4561. bnxt_db_nq(bp, &cpr->cp_db, cpr->cp_raw_cons);
  4562. }
  4563. }
  4564. static int bnxt_cp_num_to_irq_num(struct bnxt *bp, int n)
  4565. {
  4566. struct bnxt_napi *bnapi = bp->bnapi[n];
  4567. struct bnxt_cp_ring_info *cpr;
  4568. cpr = &bnapi->cp_ring;
  4569. return cpr->cp_ring_struct.map_idx;
  4570. }
  4571. static void bnxt_disable_int_sync(struct bnxt *bp)
  4572. {
  4573. int i;
  4574. if (!bp->irq_tbl)
  4575. return;
  4576. atomic_inc(&bp->intr_sem);
  4577. bnxt_disable_int(bp);
  4578. for (i = 0; i < bp->cp_nr_rings; i++) {
  4579. int map_idx = bnxt_cp_num_to_irq_num(bp, i);
  4580. synchronize_irq(bp->irq_tbl[map_idx].vector);
  4581. }
  4582. }
  4583. static void bnxt_enable_int(struct bnxt *bp)
  4584. {
  4585. int i;
  4586. atomic_set(&bp->intr_sem, 0);
  4587. for (i = 0; i < bp->cp_nr_rings; i++) {
  4588. struct bnxt_napi *bnapi = bp->bnapi[i];
  4589. struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
  4590. bnxt_db_nq_arm(bp, &cpr->cp_db, cpr->cp_raw_cons);
  4591. }
  4592. }
  4593. int bnxt_hwrm_func_drv_rgtr(struct bnxt *bp, unsigned long *bmap, int bmap_size,
  4594. bool async_only)
  4595. {
  4596. DECLARE_BITMAP(async_events_bmap, 256);
  4597. u32 *events = (u32 *)async_events_bmap;
  4598. struct hwrm_func_drv_rgtr_output *resp;
  4599. struct hwrm_func_drv_rgtr_input *req;
  4600. u32 flags;
  4601. int rc, i;
  4602. rc = hwrm_req_init(bp, req, HWRM_FUNC_DRV_RGTR);
  4603. if (rc)
  4604. return rc;
  4605. req->enables = cpu_to_le32(FUNC_DRV_RGTR_REQ_ENABLES_OS_TYPE |
  4606. FUNC_DRV_RGTR_REQ_ENABLES_VER |
  4607. FUNC_DRV_RGTR_REQ_ENABLES_ASYNC_EVENT_FWD);
  4608. req->os_type = cpu_to_le16(FUNC_DRV_RGTR_REQ_OS_TYPE_LINUX);
  4609. flags = FUNC_DRV_RGTR_REQ_FLAGS_16BIT_VER_MODE;
  4610. if (bp->fw_cap & BNXT_FW_CAP_HOT_RESET)
  4611. flags |= FUNC_DRV_RGTR_REQ_FLAGS_HOT_RESET_SUPPORT;
  4612. if (bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY)
  4613. flags |= FUNC_DRV_RGTR_REQ_FLAGS_ERROR_RECOVERY_SUPPORT |
  4614. FUNC_DRV_RGTR_REQ_FLAGS_MASTER_SUPPORT;
  4615. req->flags = cpu_to_le32(flags);
  4616. req->ver_maj_8b = DRV_VER_MAJ;
  4617. req->ver_min_8b = DRV_VER_MIN;
  4618. req->ver_upd_8b = DRV_VER_UPD;
  4619. req->ver_maj = cpu_to_le16(DRV_VER_MAJ);
  4620. req->ver_min = cpu_to_le16(DRV_VER_MIN);
  4621. req->ver_upd = cpu_to_le16(DRV_VER_UPD);
  4622. if (BNXT_PF(bp)) {
  4623. u32 data[8];
  4624. int i;
  4625. memset(data, 0, sizeof(data));
  4626. for (i = 0; i < ARRAY_SIZE(bnxt_vf_req_snif); i++) {
  4627. u16 cmd = bnxt_vf_req_snif[i];
  4628. unsigned int bit, idx;
  4629. idx = cmd / 32;
  4630. bit = cmd % 32;
  4631. data[idx] |= 1 << bit;
  4632. }
  4633. for (i = 0; i < 8; i++)
  4634. req->vf_req_fwd[i] = cpu_to_le32(data[i]);
  4635. req->enables |=
  4636. cpu_to_le32(FUNC_DRV_RGTR_REQ_ENABLES_VF_REQ_FWD);
  4637. }
  4638. if (bp->fw_cap & BNXT_FW_CAP_OVS_64BIT_HANDLE)
  4639. req->flags |= cpu_to_le32(
  4640. FUNC_DRV_RGTR_REQ_FLAGS_FLOW_HANDLE_64BIT_MODE);
  4641. memset(async_events_bmap, 0, sizeof(async_events_bmap));
  4642. for (i = 0; i < ARRAY_SIZE(bnxt_async_events_arr); i++) {
  4643. u16 event_id = bnxt_async_events_arr[i];
  4644. if (event_id == ASYNC_EVENT_CMPL_EVENT_ID_ERROR_RECOVERY &&
  4645. !(bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY))
  4646. continue;
  4647. if (event_id == ASYNC_EVENT_CMPL_EVENT_ID_PHC_UPDATE &&
  4648. !bp->ptp_cfg)
  4649. continue;
  4650. __set_bit(bnxt_async_events_arr[i], async_events_bmap);
  4651. }
  4652. if (bmap && bmap_size) {
  4653. for (i = 0; i < bmap_size; i++) {
  4654. if (test_bit(i, bmap))
  4655. __set_bit(i, async_events_bmap);
  4656. }
  4657. }
  4658. for (i = 0; i < 8; i++)
  4659. req->async_event_fwd[i] |= cpu_to_le32(events[i]);
  4660. if (async_only)
  4661. req->enables =
  4662. cpu_to_le32(FUNC_DRV_RGTR_REQ_ENABLES_ASYNC_EVENT_FWD);
  4663. resp = hwrm_req_hold(bp, req);
  4664. rc = hwrm_req_send(bp, req);
  4665. if (!rc) {
  4666. set_bit(BNXT_STATE_DRV_REGISTERED, &bp->state);
  4667. if (resp->flags &
  4668. cpu_to_le32(FUNC_DRV_RGTR_RESP_FLAGS_IF_CHANGE_SUPPORTED))
  4669. bp->fw_cap |= BNXT_FW_CAP_IF_CHANGE;
  4670. }
  4671. hwrm_req_drop(bp, req);
  4672. return rc;
  4673. }
  4674. int bnxt_hwrm_func_drv_unrgtr(struct bnxt *bp)
  4675. {
  4676. struct hwrm_func_drv_unrgtr_input *req;
  4677. int rc;
  4678. if (!test_and_clear_bit(BNXT_STATE_DRV_REGISTERED, &bp->state))
  4679. return 0;
  4680. rc = hwrm_req_init(bp, req, HWRM_FUNC_DRV_UNRGTR);
  4681. if (rc)
  4682. return rc;
  4683. return hwrm_req_send(bp, req);
  4684. }
  4685. static int bnxt_set_tpa(struct bnxt *bp, bool set_tpa);
  4686. static int bnxt_hwrm_tunnel_dst_port_free(struct bnxt *bp, u8 tunnel_type)
  4687. {
  4688. struct hwrm_tunnel_dst_port_free_input *req;
  4689. int rc;
  4690. if (tunnel_type == TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN &&
  4691. bp->vxlan_fw_dst_port_id == INVALID_HW_RING_ID)
  4692. return 0;
  4693. if (tunnel_type == TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_GENEVE &&
  4694. bp->nge_fw_dst_port_id == INVALID_HW_RING_ID)
  4695. return 0;
  4696. rc = hwrm_req_init(bp, req, HWRM_TUNNEL_DST_PORT_FREE);
  4697. if (rc)
  4698. return rc;
  4699. req->tunnel_type = tunnel_type;
  4700. switch (tunnel_type) {
  4701. case TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN:
  4702. req->tunnel_dst_port_id = cpu_to_le16(bp->vxlan_fw_dst_port_id);
  4703. bp->vxlan_port = 0;
  4704. bp->vxlan_fw_dst_port_id = INVALID_HW_RING_ID;
  4705. break;
  4706. case TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_GENEVE:
  4707. req->tunnel_dst_port_id = cpu_to_le16(bp->nge_fw_dst_port_id);
  4708. bp->nge_port = 0;
  4709. bp->nge_fw_dst_port_id = INVALID_HW_RING_ID;
  4710. break;
  4711. case TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN_GPE:
  4712. req->tunnel_dst_port_id = cpu_to_le16(bp->vxlan_gpe_fw_dst_port_id);
  4713. bp->vxlan_gpe_port = 0;
  4714. bp->vxlan_gpe_fw_dst_port_id = INVALID_HW_RING_ID;
  4715. break;
  4716. default:
  4717. break;
  4718. }
  4719. rc = hwrm_req_send(bp, req);
  4720. if (rc)
  4721. netdev_err(bp->dev, "hwrm_tunnel_dst_port_free failed. rc:%d\n",
  4722. rc);
  4723. if (bp->flags & BNXT_FLAG_TPA)
  4724. bnxt_set_tpa(bp, true);
  4725. return rc;
  4726. }
  4727. static int bnxt_hwrm_tunnel_dst_port_alloc(struct bnxt *bp, __be16 port,
  4728. u8 tunnel_type)
  4729. {
  4730. struct hwrm_tunnel_dst_port_alloc_output *resp;
  4731. struct hwrm_tunnel_dst_port_alloc_input *req;
  4732. int rc;
  4733. rc = hwrm_req_init(bp, req, HWRM_TUNNEL_DST_PORT_ALLOC);
  4734. if (rc)
  4735. return rc;
  4736. req->tunnel_type = tunnel_type;
  4737. req->tunnel_dst_port_val = port;
  4738. resp = hwrm_req_hold(bp, req);
  4739. rc = hwrm_req_send(bp, req);
  4740. if (rc) {
  4741. netdev_err(bp->dev, "hwrm_tunnel_dst_port_alloc failed. rc:%d\n",
  4742. rc);
  4743. goto err_out;
  4744. }
  4745. switch (tunnel_type) {
  4746. case TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_VXLAN:
  4747. bp->vxlan_port = port;
  4748. bp->vxlan_fw_dst_port_id =
  4749. le16_to_cpu(resp->tunnel_dst_port_id);
  4750. break;
  4751. case TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_GENEVE:
  4752. bp->nge_port = port;
  4753. bp->nge_fw_dst_port_id = le16_to_cpu(resp->tunnel_dst_port_id);
  4754. break;
  4755. case TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_VXLAN_GPE:
  4756. bp->vxlan_gpe_port = port;
  4757. bp->vxlan_gpe_fw_dst_port_id =
  4758. le16_to_cpu(resp->tunnel_dst_port_id);
  4759. break;
  4760. default:
  4761. break;
  4762. }
  4763. if (bp->flags & BNXT_FLAG_TPA)
  4764. bnxt_set_tpa(bp, true);
  4765. err_out:
  4766. hwrm_req_drop(bp, req);
  4767. return rc;
  4768. }
  4769. static int bnxt_hwrm_cfa_l2_set_rx_mask(struct bnxt *bp, u16 vnic_id)
  4770. {
  4771. struct hwrm_cfa_l2_set_rx_mask_input *req;
  4772. struct bnxt_vnic_info *vnic = &bp->vnic_info[vnic_id];
  4773. int rc;
  4774. rc = hwrm_req_init(bp, req, HWRM_CFA_L2_SET_RX_MASK);
  4775. if (rc)
  4776. return rc;
  4777. req->vnic_id = cpu_to_le32(vnic->fw_vnic_id);
  4778. if (vnic->rx_mask & CFA_L2_SET_RX_MASK_REQ_MASK_MCAST) {
  4779. req->num_mc_entries = cpu_to_le32(vnic->mc_list_count);
  4780. req->mc_tbl_addr = cpu_to_le64(vnic->mc_list_mapping);
  4781. }
  4782. req->mask = cpu_to_le32(vnic->rx_mask);
  4783. return hwrm_req_send_silent(bp, req);
  4784. }
  4785. void bnxt_del_l2_filter(struct bnxt *bp, struct bnxt_l2_filter *fltr)
  4786. {
  4787. if (!atomic_dec_and_test(&fltr->refcnt))
  4788. return;
  4789. spin_lock_bh(&bp->ntp_fltr_lock);
  4790. if (!test_and_clear_bit(BNXT_FLTR_INSERTED, &fltr->base.state)) {
  4791. spin_unlock_bh(&bp->ntp_fltr_lock);
  4792. return;
  4793. }
  4794. hlist_del_rcu(&fltr->base.hash);
  4795. bnxt_del_one_usr_fltr(bp, &fltr->base);
  4796. if (fltr->base.flags) {
  4797. clear_bit(fltr->base.sw_id, bp->ntp_fltr_bmap);
  4798. bp->ntp_fltr_count--;
  4799. }
  4800. spin_unlock_bh(&bp->ntp_fltr_lock);
  4801. kfree_rcu(fltr, base.rcu);
  4802. }
  4803. static struct bnxt_l2_filter *__bnxt_lookup_l2_filter(struct bnxt *bp,
  4804. struct bnxt_l2_key *key,
  4805. u32 idx)
  4806. {
  4807. struct hlist_head *head = &bp->l2_fltr_hash_tbl[idx];
  4808. struct bnxt_l2_filter *fltr;
  4809. hlist_for_each_entry_rcu(fltr, head, base.hash) {
  4810. struct bnxt_l2_key *l2_key = &fltr->l2_key;
  4811. if (ether_addr_equal(l2_key->dst_mac_addr, key->dst_mac_addr) &&
  4812. l2_key->vlan == key->vlan)
  4813. return fltr;
  4814. }
  4815. return NULL;
  4816. }
  4817. static struct bnxt_l2_filter *bnxt_lookup_l2_filter(struct bnxt *bp,
  4818. struct bnxt_l2_key *key,
  4819. u32 idx)
  4820. {
  4821. struct bnxt_l2_filter *fltr = NULL;
  4822. rcu_read_lock();
  4823. fltr = __bnxt_lookup_l2_filter(bp, key, idx);
  4824. if (fltr)
  4825. atomic_inc(&fltr->refcnt);
  4826. rcu_read_unlock();
  4827. return fltr;
  4828. }
  4829. #define BNXT_IPV4_4TUPLE(bp, fkeys) \
  4830. (((fkeys)->basic.ip_proto == IPPROTO_TCP && \
  4831. (bp)->rss_hash_cfg & VNIC_RSS_CFG_REQ_HASH_TYPE_TCP_IPV4) || \
  4832. ((fkeys)->basic.ip_proto == IPPROTO_UDP && \
  4833. (bp)->rss_hash_cfg & VNIC_RSS_CFG_REQ_HASH_TYPE_UDP_IPV4))
  4834. #define BNXT_IPV6_4TUPLE(bp, fkeys) \
  4835. (((fkeys)->basic.ip_proto == IPPROTO_TCP && \
  4836. (bp)->rss_hash_cfg & VNIC_RSS_CFG_REQ_HASH_TYPE_TCP_IPV6) || \
  4837. ((fkeys)->basic.ip_proto == IPPROTO_UDP && \
  4838. (bp)->rss_hash_cfg & VNIC_RSS_CFG_REQ_HASH_TYPE_UDP_IPV6))
  4839. static u32 bnxt_get_rss_flow_tuple_len(struct bnxt *bp, struct flow_keys *fkeys)
  4840. {
  4841. if (fkeys->basic.n_proto == htons(ETH_P_IP)) {
  4842. if (BNXT_IPV4_4TUPLE(bp, fkeys))
  4843. return sizeof(fkeys->addrs.v4addrs) +
  4844. sizeof(fkeys->ports);
  4845. if (bp->rss_hash_cfg & VNIC_RSS_CFG_REQ_HASH_TYPE_IPV4)
  4846. return sizeof(fkeys->addrs.v4addrs);
  4847. }
  4848. if (fkeys->basic.n_proto == htons(ETH_P_IPV6)) {
  4849. if (BNXT_IPV6_4TUPLE(bp, fkeys))
  4850. return sizeof(fkeys->addrs.v6addrs) +
  4851. sizeof(fkeys->ports);
  4852. if (bp->rss_hash_cfg & VNIC_RSS_CFG_REQ_HASH_TYPE_IPV6)
  4853. return sizeof(fkeys->addrs.v6addrs);
  4854. }
  4855. return 0;
  4856. }
  4857. static u32 bnxt_toeplitz(struct bnxt *bp, struct flow_keys *fkeys,
  4858. const unsigned char *key)
  4859. {
  4860. u64 prefix = bp->toeplitz_prefix, hash = 0;
  4861. struct bnxt_ipv4_tuple tuple4;
  4862. struct bnxt_ipv6_tuple tuple6;
  4863. int i, j, len = 0;
  4864. u8 *four_tuple;
  4865. len = bnxt_get_rss_flow_tuple_len(bp, fkeys);
  4866. if (!len)
  4867. return 0;
  4868. if (fkeys->basic.n_proto == htons(ETH_P_IP)) {
  4869. tuple4.v4addrs = fkeys->addrs.v4addrs;
  4870. tuple4.ports = fkeys->ports;
  4871. four_tuple = (unsigned char *)&tuple4;
  4872. } else {
  4873. tuple6.v6addrs = fkeys->addrs.v6addrs;
  4874. tuple6.ports = fkeys->ports;
  4875. four_tuple = (unsigned char *)&tuple6;
  4876. }
  4877. for (i = 0, j = 8; i < len; i++, j++) {
  4878. u8 byte = four_tuple[i];
  4879. int bit;
  4880. for (bit = 0; bit < 8; bit++, prefix <<= 1, byte <<= 1) {
  4881. if (byte & 0x80)
  4882. hash ^= prefix;
  4883. }
  4884. prefix |= (j < HW_HASH_KEY_SIZE) ? key[j] : 0;
  4885. }
  4886. /* The valid part of the hash is in the upper 32 bits. */
  4887. return (hash >> 32) & BNXT_NTP_FLTR_HASH_MASK;
  4888. }
  4889. #ifdef CONFIG_RFS_ACCEL
  4890. static struct bnxt_l2_filter *
  4891. bnxt_lookup_l2_filter_from_key(struct bnxt *bp, struct bnxt_l2_key *key)
  4892. {
  4893. struct bnxt_l2_filter *fltr;
  4894. u32 idx;
  4895. idx = jhash2(&key->filter_key, BNXT_L2_KEY_SIZE, bp->hash_seed) &
  4896. BNXT_L2_FLTR_HASH_MASK;
  4897. fltr = bnxt_lookup_l2_filter(bp, key, idx);
  4898. return fltr;
  4899. }
  4900. #endif
  4901. static int bnxt_init_l2_filter(struct bnxt *bp, struct bnxt_l2_filter *fltr,
  4902. struct bnxt_l2_key *key, u32 idx)
  4903. {
  4904. struct hlist_head *head;
  4905. ether_addr_copy(fltr->l2_key.dst_mac_addr, key->dst_mac_addr);
  4906. fltr->l2_key.vlan = key->vlan;
  4907. fltr->base.type = BNXT_FLTR_TYPE_L2;
  4908. if (fltr->base.flags) {
  4909. int bit_id;
  4910. bit_id = bitmap_find_free_region(bp->ntp_fltr_bmap,
  4911. bp->max_fltr, 0);
  4912. if (bit_id < 0)
  4913. return -ENOMEM;
  4914. fltr->base.sw_id = (u16)bit_id;
  4915. bp->ntp_fltr_count++;
  4916. }
  4917. head = &bp->l2_fltr_hash_tbl[idx];
  4918. hlist_add_head_rcu(&fltr->base.hash, head);
  4919. bnxt_insert_usr_fltr(bp, &fltr->base);
  4920. set_bit(BNXT_FLTR_INSERTED, &fltr->base.state);
  4921. atomic_set(&fltr->refcnt, 1);
  4922. return 0;
  4923. }
  4924. static struct bnxt_l2_filter *bnxt_alloc_l2_filter(struct bnxt *bp,
  4925. struct bnxt_l2_key *key,
  4926. gfp_t gfp)
  4927. {
  4928. struct bnxt_l2_filter *fltr;
  4929. u32 idx;
  4930. int rc;
  4931. idx = jhash2(&key->filter_key, BNXT_L2_KEY_SIZE, bp->hash_seed) &
  4932. BNXT_L2_FLTR_HASH_MASK;
  4933. fltr = bnxt_lookup_l2_filter(bp, key, idx);
  4934. if (fltr)
  4935. return fltr;
  4936. fltr = kzalloc(sizeof(*fltr), gfp);
  4937. if (!fltr)
  4938. return ERR_PTR(-ENOMEM);
  4939. spin_lock_bh(&bp->ntp_fltr_lock);
  4940. rc = bnxt_init_l2_filter(bp, fltr, key, idx);
  4941. spin_unlock_bh(&bp->ntp_fltr_lock);
  4942. if (rc) {
  4943. bnxt_del_l2_filter(bp, fltr);
  4944. fltr = ERR_PTR(rc);
  4945. }
  4946. return fltr;
  4947. }
  4948. struct bnxt_l2_filter *bnxt_alloc_new_l2_filter(struct bnxt *bp,
  4949. struct bnxt_l2_key *key,
  4950. u16 flags)
  4951. {
  4952. struct bnxt_l2_filter *fltr;
  4953. u32 idx;
  4954. int rc;
  4955. idx = jhash2(&key->filter_key, BNXT_L2_KEY_SIZE, bp->hash_seed) &
  4956. BNXT_L2_FLTR_HASH_MASK;
  4957. spin_lock_bh(&bp->ntp_fltr_lock);
  4958. fltr = __bnxt_lookup_l2_filter(bp, key, idx);
  4959. if (fltr) {
  4960. fltr = ERR_PTR(-EEXIST);
  4961. goto l2_filter_exit;
  4962. }
  4963. fltr = kzalloc(sizeof(*fltr), GFP_ATOMIC);
  4964. if (!fltr) {
  4965. fltr = ERR_PTR(-ENOMEM);
  4966. goto l2_filter_exit;
  4967. }
  4968. fltr->base.flags = flags;
  4969. rc = bnxt_init_l2_filter(bp, fltr, key, idx);
  4970. if (rc) {
  4971. spin_unlock_bh(&bp->ntp_fltr_lock);
  4972. bnxt_del_l2_filter(bp, fltr);
  4973. return ERR_PTR(rc);
  4974. }
  4975. l2_filter_exit:
  4976. spin_unlock_bh(&bp->ntp_fltr_lock);
  4977. return fltr;
  4978. }
  4979. static u16 bnxt_vf_target_id(struct bnxt_pf_info *pf, u16 vf_idx)
  4980. {
  4981. #ifdef CONFIG_BNXT_SRIOV
  4982. struct bnxt_vf_info *vf = &pf->vf[vf_idx];
  4983. return vf->fw_fid;
  4984. #else
  4985. return INVALID_HW_RING_ID;
  4986. #endif
  4987. }
  4988. int bnxt_hwrm_l2_filter_free(struct bnxt *bp, struct bnxt_l2_filter *fltr)
  4989. {
  4990. struct hwrm_cfa_l2_filter_free_input *req;
  4991. u16 target_id = 0xffff;
  4992. int rc;
  4993. if (fltr->base.flags & BNXT_ACT_FUNC_DST) {
  4994. struct bnxt_pf_info *pf = &bp->pf;
  4995. if (fltr->base.vf_idx >= pf->active_vfs)
  4996. return -EINVAL;
  4997. target_id = bnxt_vf_target_id(pf, fltr->base.vf_idx);
  4998. if (target_id == INVALID_HW_RING_ID)
  4999. return -EINVAL;
  5000. }
  5001. rc = hwrm_req_init(bp, req, HWRM_CFA_L2_FILTER_FREE);
  5002. if (rc)
  5003. return rc;
  5004. req->target_id = cpu_to_le16(target_id);
  5005. req->l2_filter_id = fltr->base.filter_id;
  5006. return hwrm_req_send(bp, req);
  5007. }
  5008. int bnxt_hwrm_l2_filter_alloc(struct bnxt *bp, struct bnxt_l2_filter *fltr)
  5009. {
  5010. struct hwrm_cfa_l2_filter_alloc_output *resp;
  5011. struct hwrm_cfa_l2_filter_alloc_input *req;
  5012. u16 target_id = 0xffff;
  5013. int rc;
  5014. if (fltr->base.flags & BNXT_ACT_FUNC_DST) {
  5015. struct bnxt_pf_info *pf = &bp->pf;
  5016. if (fltr->base.vf_idx >= pf->active_vfs)
  5017. return -EINVAL;
  5018. target_id = bnxt_vf_target_id(pf, fltr->base.vf_idx);
  5019. }
  5020. rc = hwrm_req_init(bp, req, HWRM_CFA_L2_FILTER_ALLOC);
  5021. if (rc)
  5022. return rc;
  5023. req->target_id = cpu_to_le16(target_id);
  5024. req->flags = cpu_to_le32(CFA_L2_FILTER_ALLOC_REQ_FLAGS_PATH_RX);
  5025. if (!BNXT_CHIP_TYPE_NITRO_A0(bp))
  5026. req->flags |=
  5027. cpu_to_le32(CFA_L2_FILTER_ALLOC_REQ_FLAGS_OUTERMOST);
  5028. req->dst_id = cpu_to_le16(fltr->base.fw_vnic_id);
  5029. req->enables =
  5030. cpu_to_le32(CFA_L2_FILTER_ALLOC_REQ_ENABLES_L2_ADDR |
  5031. CFA_L2_FILTER_ALLOC_REQ_ENABLES_DST_ID |
  5032. CFA_L2_FILTER_ALLOC_REQ_ENABLES_L2_ADDR_MASK);
  5033. ether_addr_copy(req->l2_addr, fltr->l2_key.dst_mac_addr);
  5034. eth_broadcast_addr(req->l2_addr_mask);
  5035. if (fltr->l2_key.vlan) {
  5036. req->enables |=
  5037. cpu_to_le32(CFA_L2_FILTER_ALLOC_REQ_ENABLES_L2_IVLAN |
  5038. CFA_L2_FILTER_ALLOC_REQ_ENABLES_L2_IVLAN_MASK |
  5039. CFA_L2_FILTER_ALLOC_REQ_ENABLES_NUM_VLANS);
  5040. req->num_vlans = 1;
  5041. req->l2_ivlan = cpu_to_le16(fltr->l2_key.vlan);
  5042. req->l2_ivlan_mask = cpu_to_le16(0xfff);
  5043. }
  5044. resp = hwrm_req_hold(bp, req);
  5045. rc = hwrm_req_send(bp, req);
  5046. if (!rc) {
  5047. fltr->base.filter_id = resp->l2_filter_id;
  5048. set_bit(BNXT_FLTR_VALID, &fltr->base.state);
  5049. }
  5050. hwrm_req_drop(bp, req);
  5051. return rc;
  5052. }
  5053. int bnxt_hwrm_cfa_ntuple_filter_free(struct bnxt *bp,
  5054. struct bnxt_ntuple_filter *fltr)
  5055. {
  5056. struct hwrm_cfa_ntuple_filter_free_input *req;
  5057. int rc;
  5058. set_bit(BNXT_FLTR_FW_DELETED, &fltr->base.state);
  5059. rc = hwrm_req_init(bp, req, HWRM_CFA_NTUPLE_FILTER_FREE);
  5060. if (rc)
  5061. return rc;
  5062. req->ntuple_filter_id = fltr->base.filter_id;
  5063. return hwrm_req_send(bp, req);
  5064. }
  5065. #define BNXT_NTP_FLTR_FLAGS \
  5066. (CFA_NTUPLE_FILTER_ALLOC_REQ_ENABLES_L2_FILTER_ID | \
  5067. CFA_NTUPLE_FILTER_ALLOC_REQ_ENABLES_ETHERTYPE | \
  5068. CFA_NTUPLE_FILTER_ALLOC_REQ_ENABLES_IPADDR_TYPE | \
  5069. CFA_NTUPLE_FILTER_ALLOC_REQ_ENABLES_SRC_IPADDR | \
  5070. CFA_NTUPLE_FILTER_ALLOC_REQ_ENABLES_SRC_IPADDR_MASK | \
  5071. CFA_NTUPLE_FILTER_ALLOC_REQ_ENABLES_DST_IPADDR | \
  5072. CFA_NTUPLE_FILTER_ALLOC_REQ_ENABLES_DST_IPADDR_MASK | \
  5073. CFA_NTUPLE_FILTER_ALLOC_REQ_ENABLES_IP_PROTOCOL | \
  5074. CFA_NTUPLE_FILTER_ALLOC_REQ_ENABLES_SRC_PORT | \
  5075. CFA_NTUPLE_FILTER_ALLOC_REQ_ENABLES_SRC_PORT_MASK | \
  5076. CFA_NTUPLE_FILTER_ALLOC_REQ_ENABLES_DST_PORT | \
  5077. CFA_NTUPLE_FILTER_ALLOC_REQ_ENABLES_DST_PORT_MASK | \
  5078. CFA_NTUPLE_FILTER_ALLOC_REQ_ENABLES_DST_ID)
  5079. #define BNXT_NTP_TUNNEL_FLTR_FLAG \
  5080. CFA_NTUPLE_FILTER_ALLOC_REQ_ENABLES_TUNNEL_TYPE
  5081. void bnxt_fill_ipv6_mask(__be32 mask[4])
  5082. {
  5083. int i;
  5084. for (i = 0; i < 4; i++)
  5085. mask[i] = cpu_to_be32(~0);
  5086. }
  5087. static void
  5088. bnxt_cfg_rfs_ring_tbl_idx(struct bnxt *bp,
  5089. struct hwrm_cfa_ntuple_filter_alloc_input *req,
  5090. struct bnxt_ntuple_filter *fltr)
  5091. {
  5092. u16 rxq = fltr->base.rxq;
  5093. if (fltr->base.flags & BNXT_ACT_RSS_CTX) {
  5094. struct ethtool_rxfh_context *ctx;
  5095. struct bnxt_rss_ctx *rss_ctx;
  5096. struct bnxt_vnic_info *vnic;
  5097. ctx = xa_load(&bp->dev->ethtool->rss_ctx,
  5098. fltr->base.fw_vnic_id);
  5099. if (ctx) {
  5100. rss_ctx = ethtool_rxfh_context_priv(ctx);
  5101. vnic = &rss_ctx->vnic;
  5102. req->dst_id = cpu_to_le16(vnic->fw_vnic_id);
  5103. }
  5104. return;
  5105. }
  5106. if (BNXT_SUPPORTS_NTUPLE_VNIC(bp)) {
  5107. struct bnxt_vnic_info *vnic;
  5108. u32 enables;
  5109. vnic = &bp->vnic_info[BNXT_VNIC_NTUPLE];
  5110. req->dst_id = cpu_to_le16(vnic->fw_vnic_id);
  5111. enables = CFA_NTUPLE_FILTER_ALLOC_REQ_ENABLES_RFS_RING_TBL_IDX;
  5112. req->enables |= cpu_to_le32(enables);
  5113. req->rfs_ring_tbl_idx = cpu_to_le16(rxq);
  5114. } else {
  5115. u32 flags;
  5116. flags = CFA_NTUPLE_FILTER_ALLOC_REQ_FLAGS_DEST_RFS_RING_IDX;
  5117. req->flags |= cpu_to_le32(flags);
  5118. req->dst_id = cpu_to_le16(rxq);
  5119. }
  5120. }
  5121. int bnxt_hwrm_cfa_ntuple_filter_alloc(struct bnxt *bp,
  5122. struct bnxt_ntuple_filter *fltr)
  5123. {
  5124. struct hwrm_cfa_ntuple_filter_alloc_output *resp;
  5125. struct hwrm_cfa_ntuple_filter_alloc_input *req;
  5126. struct bnxt_flow_masks *masks = &fltr->fmasks;
  5127. struct flow_keys *keys = &fltr->fkeys;
  5128. struct bnxt_l2_filter *l2_fltr;
  5129. struct bnxt_vnic_info *vnic;
  5130. int rc;
  5131. rc = hwrm_req_init(bp, req, HWRM_CFA_NTUPLE_FILTER_ALLOC);
  5132. if (rc)
  5133. return rc;
  5134. l2_fltr = fltr->l2_fltr;
  5135. req->l2_filter_id = l2_fltr->base.filter_id;
  5136. if (fltr->base.flags & BNXT_ACT_DROP) {
  5137. req->flags =
  5138. cpu_to_le32(CFA_NTUPLE_FILTER_ALLOC_REQ_FLAGS_DROP);
  5139. } else if (bp->fw_cap & BNXT_FW_CAP_CFA_RFS_RING_TBL_IDX_V2) {
  5140. bnxt_cfg_rfs_ring_tbl_idx(bp, req, fltr);
  5141. } else {
  5142. vnic = &bp->vnic_info[fltr->base.rxq + 1];
  5143. req->dst_id = cpu_to_le16(vnic->fw_vnic_id);
  5144. }
  5145. req->enables |= cpu_to_le32(BNXT_NTP_FLTR_FLAGS);
  5146. req->ethertype = htons(ETH_P_IP);
  5147. req->ip_addr_type = CFA_NTUPLE_FILTER_ALLOC_REQ_IP_ADDR_TYPE_IPV4;
  5148. req->ip_protocol = keys->basic.ip_proto;
  5149. if (keys->basic.n_proto == htons(ETH_P_IPV6)) {
  5150. req->ethertype = htons(ETH_P_IPV6);
  5151. req->ip_addr_type =
  5152. CFA_NTUPLE_FILTER_ALLOC_REQ_IP_ADDR_TYPE_IPV6;
  5153. *(struct in6_addr *)&req->src_ipaddr[0] = keys->addrs.v6addrs.src;
  5154. *(struct in6_addr *)&req->src_ipaddr_mask[0] = masks->addrs.v6addrs.src;
  5155. *(struct in6_addr *)&req->dst_ipaddr[0] = keys->addrs.v6addrs.dst;
  5156. *(struct in6_addr *)&req->dst_ipaddr_mask[0] = masks->addrs.v6addrs.dst;
  5157. } else {
  5158. req->src_ipaddr[0] = keys->addrs.v4addrs.src;
  5159. req->src_ipaddr_mask[0] = masks->addrs.v4addrs.src;
  5160. req->dst_ipaddr[0] = keys->addrs.v4addrs.dst;
  5161. req->dst_ipaddr_mask[0] = masks->addrs.v4addrs.dst;
  5162. }
  5163. if (keys->control.flags & FLOW_DIS_ENCAPSULATION) {
  5164. req->enables |= cpu_to_le32(BNXT_NTP_TUNNEL_FLTR_FLAG);
  5165. req->tunnel_type =
  5166. CFA_NTUPLE_FILTER_ALLOC_REQ_TUNNEL_TYPE_ANYTUNNEL;
  5167. }
  5168. req->src_port = keys->ports.src;
  5169. req->src_port_mask = masks->ports.src;
  5170. req->dst_port = keys->ports.dst;
  5171. req->dst_port_mask = masks->ports.dst;
  5172. resp = hwrm_req_hold(bp, req);
  5173. rc = hwrm_req_send(bp, req);
  5174. if (!rc)
  5175. fltr->base.filter_id = resp->ntuple_filter_id;
  5176. hwrm_req_drop(bp, req);
  5177. return rc;
  5178. }
  5179. static int bnxt_hwrm_set_vnic_filter(struct bnxt *bp, u16 vnic_id, u16 idx,
  5180. const u8 *mac_addr)
  5181. {
  5182. struct bnxt_l2_filter *fltr;
  5183. struct bnxt_l2_key key;
  5184. int rc;
  5185. ether_addr_copy(key.dst_mac_addr, mac_addr);
  5186. key.vlan = 0;
  5187. fltr = bnxt_alloc_l2_filter(bp, &key, GFP_KERNEL);
  5188. if (IS_ERR(fltr))
  5189. return PTR_ERR(fltr);
  5190. fltr->base.fw_vnic_id = bp->vnic_info[vnic_id].fw_vnic_id;
  5191. rc = bnxt_hwrm_l2_filter_alloc(bp, fltr);
  5192. if (rc)
  5193. bnxt_del_l2_filter(bp, fltr);
  5194. else
  5195. bp->vnic_info[vnic_id].l2_filters[idx] = fltr;
  5196. return rc;
  5197. }
  5198. static void bnxt_hwrm_clear_vnic_filter(struct bnxt *bp)
  5199. {
  5200. u16 i, j, num_of_vnics = 1; /* only vnic 0 supported */
  5201. /* Any associated ntuple filters will also be cleared by firmware. */
  5202. for (i = 0; i < num_of_vnics; i++) {
  5203. struct bnxt_vnic_info *vnic = &bp->vnic_info[i];
  5204. for (j = 0; j < vnic->uc_filter_count; j++) {
  5205. struct bnxt_l2_filter *fltr = vnic->l2_filters[j];
  5206. bnxt_hwrm_l2_filter_free(bp, fltr);
  5207. bnxt_del_l2_filter(bp, fltr);
  5208. }
  5209. vnic->uc_filter_count = 0;
  5210. }
  5211. }
  5212. #define BNXT_DFLT_TUNL_TPA_BMAP \
  5213. (VNIC_TPA_CFG_REQ_TNL_TPA_EN_BITMAP_GRE | \
  5214. VNIC_TPA_CFG_REQ_TNL_TPA_EN_BITMAP_IPV4 | \
  5215. VNIC_TPA_CFG_REQ_TNL_TPA_EN_BITMAP_IPV6)
  5216. static void bnxt_hwrm_vnic_update_tunl_tpa(struct bnxt *bp,
  5217. struct hwrm_vnic_tpa_cfg_input *req)
  5218. {
  5219. u32 tunl_tpa_bmap = BNXT_DFLT_TUNL_TPA_BMAP;
  5220. if (!(bp->fw_cap & BNXT_FW_CAP_VNIC_TUNNEL_TPA))
  5221. return;
  5222. if (bp->vxlan_port)
  5223. tunl_tpa_bmap |= VNIC_TPA_CFG_REQ_TNL_TPA_EN_BITMAP_VXLAN;
  5224. if (bp->vxlan_gpe_port)
  5225. tunl_tpa_bmap |= VNIC_TPA_CFG_REQ_TNL_TPA_EN_BITMAP_VXLAN_GPE;
  5226. if (bp->nge_port)
  5227. tunl_tpa_bmap |= VNIC_TPA_CFG_REQ_TNL_TPA_EN_BITMAP_GENEVE;
  5228. req->enables |= cpu_to_le32(VNIC_TPA_CFG_REQ_ENABLES_TNL_TPA_EN);
  5229. req->tnl_tpa_en_bitmap = cpu_to_le32(tunl_tpa_bmap);
  5230. }
  5231. int bnxt_hwrm_vnic_set_tpa(struct bnxt *bp, struct bnxt_vnic_info *vnic,
  5232. u32 tpa_flags)
  5233. {
  5234. u16 max_aggs = VNIC_TPA_CFG_REQ_MAX_AGGS_MAX;
  5235. struct hwrm_vnic_tpa_cfg_input *req;
  5236. int rc;
  5237. if (vnic->fw_vnic_id == INVALID_HW_RING_ID)
  5238. return 0;
  5239. rc = hwrm_req_init(bp, req, HWRM_VNIC_TPA_CFG);
  5240. if (rc)
  5241. return rc;
  5242. if (tpa_flags) {
  5243. u16 mss = bp->dev->mtu - 40;
  5244. u32 nsegs, n, segs = 0, flags;
  5245. flags = VNIC_TPA_CFG_REQ_FLAGS_TPA |
  5246. VNIC_TPA_CFG_REQ_FLAGS_ENCAP_TPA |
  5247. VNIC_TPA_CFG_REQ_FLAGS_RSC_WND_UPDATE |
  5248. VNIC_TPA_CFG_REQ_FLAGS_AGG_WITH_ECN |
  5249. VNIC_TPA_CFG_REQ_FLAGS_AGG_WITH_SAME_GRE_SEQ;
  5250. if (tpa_flags & BNXT_FLAG_GRO)
  5251. flags |= VNIC_TPA_CFG_REQ_FLAGS_GRO;
  5252. req->flags = cpu_to_le32(flags);
  5253. req->enables =
  5254. cpu_to_le32(VNIC_TPA_CFG_REQ_ENABLES_MAX_AGG_SEGS |
  5255. VNIC_TPA_CFG_REQ_ENABLES_MAX_AGGS |
  5256. VNIC_TPA_CFG_REQ_ENABLES_MIN_AGG_LEN);
  5257. /* Number of segs are log2 units, and first packet is not
  5258. * included as part of this units.
  5259. */
  5260. if (mss <= BNXT_RX_PAGE_SIZE) {
  5261. n = BNXT_RX_PAGE_SIZE / mss;
  5262. nsegs = (MAX_SKB_FRAGS - 1) * n;
  5263. } else {
  5264. n = mss / BNXT_RX_PAGE_SIZE;
  5265. if (mss & (BNXT_RX_PAGE_SIZE - 1))
  5266. n++;
  5267. nsegs = (MAX_SKB_FRAGS - n) / n;
  5268. }
  5269. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  5270. segs = MAX_TPA_SEGS_P5;
  5271. max_aggs = bp->max_tpa;
  5272. } else {
  5273. segs = ilog2(nsegs);
  5274. }
  5275. req->max_agg_segs = cpu_to_le16(segs);
  5276. req->max_aggs = cpu_to_le16(max_aggs);
  5277. req->min_agg_len = cpu_to_le32(512);
  5278. bnxt_hwrm_vnic_update_tunl_tpa(bp, req);
  5279. }
  5280. req->vnic_id = cpu_to_le16(vnic->fw_vnic_id);
  5281. return hwrm_req_send(bp, req);
  5282. }
  5283. static u16 bnxt_cp_ring_from_grp(struct bnxt *bp, struct bnxt_ring_struct *ring)
  5284. {
  5285. struct bnxt_ring_grp_info *grp_info;
  5286. grp_info = &bp->grp_info[ring->grp_idx];
  5287. return grp_info->cp_fw_ring_id;
  5288. }
  5289. static u16 bnxt_cp_ring_for_rx(struct bnxt *bp, struct bnxt_rx_ring_info *rxr)
  5290. {
  5291. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  5292. return rxr->rx_cpr->cp_ring_struct.fw_ring_id;
  5293. else
  5294. return bnxt_cp_ring_from_grp(bp, &rxr->rx_ring_struct);
  5295. }
  5296. static u16 bnxt_cp_ring_for_tx(struct bnxt *bp, struct bnxt_tx_ring_info *txr)
  5297. {
  5298. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  5299. return txr->tx_cpr->cp_ring_struct.fw_ring_id;
  5300. else
  5301. return bnxt_cp_ring_from_grp(bp, &txr->tx_ring_struct);
  5302. }
  5303. static int bnxt_alloc_rss_indir_tbl(struct bnxt *bp)
  5304. {
  5305. int entries;
  5306. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  5307. entries = BNXT_MAX_RSS_TABLE_ENTRIES_P5;
  5308. else
  5309. entries = HW_HASH_INDEX_SIZE;
  5310. bp->rss_indir_tbl_entries = entries;
  5311. bp->rss_indir_tbl =
  5312. kmalloc_array(entries, sizeof(*bp->rss_indir_tbl), GFP_KERNEL);
  5313. if (!bp->rss_indir_tbl)
  5314. return -ENOMEM;
  5315. return 0;
  5316. }
  5317. void bnxt_set_dflt_rss_indir_tbl(struct bnxt *bp,
  5318. struct ethtool_rxfh_context *rss_ctx)
  5319. {
  5320. u16 max_rings, max_entries, pad, i;
  5321. u32 *rss_indir_tbl;
  5322. if (!bp->rx_nr_rings)
  5323. return;
  5324. if (BNXT_CHIP_TYPE_NITRO_A0(bp))
  5325. max_rings = bp->rx_nr_rings - 1;
  5326. else
  5327. max_rings = bp->rx_nr_rings;
  5328. max_entries = bnxt_get_rxfh_indir_size(bp->dev);
  5329. if (rss_ctx)
  5330. rss_indir_tbl = ethtool_rxfh_context_indir(rss_ctx);
  5331. else
  5332. rss_indir_tbl = &bp->rss_indir_tbl[0];
  5333. for (i = 0; i < max_entries; i++)
  5334. rss_indir_tbl[i] = ethtool_rxfh_indir_default(i, max_rings);
  5335. pad = bp->rss_indir_tbl_entries - max_entries;
  5336. if (pad)
  5337. memset(&rss_indir_tbl[i], 0, pad * sizeof(*rss_indir_tbl));
  5338. }
  5339. static u16 bnxt_get_max_rss_ring(struct bnxt *bp)
  5340. {
  5341. u32 i, tbl_size, max_ring = 0;
  5342. if (!bp->rss_indir_tbl)
  5343. return 0;
  5344. tbl_size = bnxt_get_rxfh_indir_size(bp->dev);
  5345. for (i = 0; i < tbl_size; i++)
  5346. max_ring = max(max_ring, bp->rss_indir_tbl[i]);
  5347. return max_ring;
  5348. }
  5349. int bnxt_get_nr_rss_ctxs(struct bnxt *bp, int rx_rings)
  5350. {
  5351. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  5352. if (!rx_rings)
  5353. return 0;
  5354. return bnxt_calc_nr_ring_pages(rx_rings - 1,
  5355. BNXT_RSS_TABLE_ENTRIES_P5);
  5356. }
  5357. if (BNXT_CHIP_TYPE_NITRO_A0(bp))
  5358. return 2;
  5359. return 1;
  5360. }
  5361. static void bnxt_fill_hw_rss_tbl(struct bnxt *bp, struct bnxt_vnic_info *vnic)
  5362. {
  5363. bool no_rss = !(vnic->flags & BNXT_VNIC_RSS_FLAG);
  5364. u16 i, j;
  5365. /* Fill the RSS indirection table with ring group ids */
  5366. for (i = 0, j = 0; i < HW_HASH_INDEX_SIZE; i++) {
  5367. if (!no_rss)
  5368. j = bp->rss_indir_tbl[i];
  5369. vnic->rss_table[i] = cpu_to_le16(vnic->fw_grp_ids[j]);
  5370. }
  5371. }
  5372. static void bnxt_fill_hw_rss_tbl_p5(struct bnxt *bp,
  5373. struct bnxt_vnic_info *vnic)
  5374. {
  5375. __le16 *ring_tbl = vnic->rss_table;
  5376. struct bnxt_rx_ring_info *rxr;
  5377. u16 tbl_size, i;
  5378. tbl_size = bnxt_get_rxfh_indir_size(bp->dev);
  5379. for (i = 0; i < tbl_size; i++) {
  5380. u16 ring_id, j;
  5381. if (vnic->flags & BNXT_VNIC_NTUPLE_FLAG)
  5382. j = ethtool_rxfh_indir_default(i, bp->rx_nr_rings);
  5383. else if (vnic->flags & BNXT_VNIC_RSSCTX_FLAG)
  5384. j = ethtool_rxfh_context_indir(vnic->rss_ctx)[i];
  5385. else
  5386. j = bp->rss_indir_tbl[i];
  5387. rxr = &bp->rx_ring[j];
  5388. ring_id = rxr->rx_ring_struct.fw_ring_id;
  5389. *ring_tbl++ = cpu_to_le16(ring_id);
  5390. ring_id = bnxt_cp_ring_for_rx(bp, rxr);
  5391. *ring_tbl++ = cpu_to_le16(ring_id);
  5392. }
  5393. }
  5394. static void
  5395. __bnxt_hwrm_vnic_set_rss(struct bnxt *bp, struct hwrm_vnic_rss_cfg_input *req,
  5396. struct bnxt_vnic_info *vnic)
  5397. {
  5398. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  5399. bnxt_fill_hw_rss_tbl_p5(bp, vnic);
  5400. if (bp->flags & BNXT_FLAG_CHIP_P7)
  5401. req->flags |= VNIC_RSS_CFG_REQ_FLAGS_IPSEC_HASH_TYPE_CFG_SUPPORT;
  5402. } else {
  5403. bnxt_fill_hw_rss_tbl(bp, vnic);
  5404. }
  5405. if (bp->rss_hash_delta) {
  5406. req->hash_type = cpu_to_le32(bp->rss_hash_delta);
  5407. if (bp->rss_hash_cfg & bp->rss_hash_delta)
  5408. req->flags |= VNIC_RSS_CFG_REQ_FLAGS_HASH_TYPE_INCLUDE;
  5409. else
  5410. req->flags |= VNIC_RSS_CFG_REQ_FLAGS_HASH_TYPE_EXCLUDE;
  5411. } else {
  5412. req->hash_type = cpu_to_le32(bp->rss_hash_cfg);
  5413. }
  5414. req->hash_mode_flags = VNIC_RSS_CFG_REQ_HASH_MODE_FLAGS_DEFAULT;
  5415. req->ring_grp_tbl_addr = cpu_to_le64(vnic->rss_table_dma_addr);
  5416. req->hash_key_tbl_addr = cpu_to_le64(vnic->rss_hash_key_dma_addr);
  5417. }
  5418. static int bnxt_hwrm_vnic_set_rss(struct bnxt *bp, struct bnxt_vnic_info *vnic,
  5419. bool set_rss)
  5420. {
  5421. struct hwrm_vnic_rss_cfg_input *req;
  5422. int rc;
  5423. if ((bp->flags & BNXT_FLAG_CHIP_P5_PLUS) ||
  5424. vnic->fw_rss_cos_lb_ctx[0] == INVALID_HW_RING_ID)
  5425. return 0;
  5426. rc = hwrm_req_init(bp, req, HWRM_VNIC_RSS_CFG);
  5427. if (rc)
  5428. return rc;
  5429. if (set_rss)
  5430. __bnxt_hwrm_vnic_set_rss(bp, req, vnic);
  5431. req->rss_ctx_idx = cpu_to_le16(vnic->fw_rss_cos_lb_ctx[0]);
  5432. return hwrm_req_send(bp, req);
  5433. }
  5434. static int bnxt_hwrm_vnic_set_rss_p5(struct bnxt *bp,
  5435. struct bnxt_vnic_info *vnic, bool set_rss)
  5436. {
  5437. struct hwrm_vnic_rss_cfg_input *req;
  5438. dma_addr_t ring_tbl_map;
  5439. u32 i, nr_ctxs;
  5440. int rc;
  5441. rc = hwrm_req_init(bp, req, HWRM_VNIC_RSS_CFG);
  5442. if (rc)
  5443. return rc;
  5444. req->vnic_id = cpu_to_le16(vnic->fw_vnic_id);
  5445. if (!set_rss)
  5446. return hwrm_req_send(bp, req);
  5447. __bnxt_hwrm_vnic_set_rss(bp, req, vnic);
  5448. ring_tbl_map = vnic->rss_table_dma_addr;
  5449. nr_ctxs = bnxt_get_nr_rss_ctxs(bp, bp->rx_nr_rings);
  5450. hwrm_req_hold(bp, req);
  5451. for (i = 0; i < nr_ctxs; ring_tbl_map += BNXT_RSS_TABLE_SIZE_P5, i++) {
  5452. req->ring_grp_tbl_addr = cpu_to_le64(ring_tbl_map);
  5453. req->ring_table_pair_index = i;
  5454. req->rss_ctx_idx = cpu_to_le16(vnic->fw_rss_cos_lb_ctx[i]);
  5455. rc = hwrm_req_send(bp, req);
  5456. if (rc)
  5457. goto exit;
  5458. }
  5459. exit:
  5460. hwrm_req_drop(bp, req);
  5461. return rc;
  5462. }
  5463. static void bnxt_hwrm_update_rss_hash_cfg(struct bnxt *bp)
  5464. {
  5465. struct bnxt_vnic_info *vnic = &bp->vnic_info[BNXT_VNIC_DEFAULT];
  5466. struct hwrm_vnic_rss_qcfg_output *resp;
  5467. struct hwrm_vnic_rss_qcfg_input *req;
  5468. if (hwrm_req_init(bp, req, HWRM_VNIC_RSS_QCFG))
  5469. return;
  5470. req->vnic_id = cpu_to_le16(vnic->fw_vnic_id);
  5471. /* all contexts configured to same hash_type, zero always exists */
  5472. req->rss_ctx_idx = cpu_to_le16(vnic->fw_rss_cos_lb_ctx[0]);
  5473. resp = hwrm_req_hold(bp, req);
  5474. if (!hwrm_req_send(bp, req)) {
  5475. bp->rss_hash_cfg = le32_to_cpu(resp->hash_type) ?: bp->rss_hash_cfg;
  5476. bp->rss_hash_delta = 0;
  5477. }
  5478. hwrm_req_drop(bp, req);
  5479. }
  5480. static int bnxt_hwrm_vnic_set_hds(struct bnxt *bp, struct bnxt_vnic_info *vnic)
  5481. {
  5482. struct hwrm_vnic_plcmodes_cfg_input *req;
  5483. int rc;
  5484. rc = hwrm_req_init(bp, req, HWRM_VNIC_PLCMODES_CFG);
  5485. if (rc)
  5486. return rc;
  5487. req->flags = cpu_to_le32(VNIC_PLCMODES_CFG_REQ_FLAGS_JUMBO_PLACEMENT);
  5488. req->enables = cpu_to_le32(VNIC_PLCMODES_CFG_REQ_ENABLES_JUMBO_THRESH_VALID);
  5489. if (BNXT_RX_PAGE_MODE(bp)) {
  5490. req->jumbo_thresh = cpu_to_le16(bp->rx_buf_use_size);
  5491. } else {
  5492. req->flags |= cpu_to_le32(VNIC_PLCMODES_CFG_REQ_FLAGS_HDS_IPV4 |
  5493. VNIC_PLCMODES_CFG_REQ_FLAGS_HDS_IPV6);
  5494. req->enables |=
  5495. cpu_to_le32(VNIC_PLCMODES_CFG_REQ_ENABLES_HDS_THRESHOLD_VALID);
  5496. req->jumbo_thresh = cpu_to_le16(bp->rx_copy_thresh);
  5497. req->hds_threshold = cpu_to_le16(bp->rx_copy_thresh);
  5498. }
  5499. req->vnic_id = cpu_to_le32(vnic->fw_vnic_id);
  5500. return hwrm_req_send(bp, req);
  5501. }
  5502. static void bnxt_hwrm_vnic_ctx_free_one(struct bnxt *bp,
  5503. struct bnxt_vnic_info *vnic,
  5504. u16 ctx_idx)
  5505. {
  5506. struct hwrm_vnic_rss_cos_lb_ctx_free_input *req;
  5507. if (hwrm_req_init(bp, req, HWRM_VNIC_RSS_COS_LB_CTX_FREE))
  5508. return;
  5509. req->rss_cos_lb_ctx_id =
  5510. cpu_to_le16(vnic->fw_rss_cos_lb_ctx[ctx_idx]);
  5511. hwrm_req_send(bp, req);
  5512. vnic->fw_rss_cos_lb_ctx[ctx_idx] = INVALID_HW_RING_ID;
  5513. }
  5514. static void bnxt_hwrm_vnic_ctx_free(struct bnxt *bp)
  5515. {
  5516. int i, j;
  5517. for (i = 0; i < bp->nr_vnics; i++) {
  5518. struct bnxt_vnic_info *vnic = &bp->vnic_info[i];
  5519. for (j = 0; j < BNXT_MAX_CTX_PER_VNIC; j++) {
  5520. if (vnic->fw_rss_cos_lb_ctx[j] != INVALID_HW_RING_ID)
  5521. bnxt_hwrm_vnic_ctx_free_one(bp, vnic, j);
  5522. }
  5523. }
  5524. bp->rsscos_nr_ctxs = 0;
  5525. }
  5526. static int bnxt_hwrm_vnic_ctx_alloc(struct bnxt *bp,
  5527. struct bnxt_vnic_info *vnic, u16 ctx_idx)
  5528. {
  5529. struct hwrm_vnic_rss_cos_lb_ctx_alloc_output *resp;
  5530. struct hwrm_vnic_rss_cos_lb_ctx_alloc_input *req;
  5531. int rc;
  5532. rc = hwrm_req_init(bp, req, HWRM_VNIC_RSS_COS_LB_CTX_ALLOC);
  5533. if (rc)
  5534. return rc;
  5535. resp = hwrm_req_hold(bp, req);
  5536. rc = hwrm_req_send(bp, req);
  5537. if (!rc)
  5538. vnic->fw_rss_cos_lb_ctx[ctx_idx] =
  5539. le16_to_cpu(resp->rss_cos_lb_ctx_id);
  5540. hwrm_req_drop(bp, req);
  5541. return rc;
  5542. }
  5543. static u32 bnxt_get_roce_vnic_mode(struct bnxt *bp)
  5544. {
  5545. if (bp->flags & BNXT_FLAG_ROCE_MIRROR_CAP)
  5546. return VNIC_CFG_REQ_FLAGS_ROCE_MIRRORING_CAPABLE_VNIC_MODE;
  5547. return VNIC_CFG_REQ_FLAGS_ROCE_DUAL_VNIC_MODE;
  5548. }
  5549. int bnxt_hwrm_vnic_cfg(struct bnxt *bp, struct bnxt_vnic_info *vnic)
  5550. {
  5551. struct bnxt_vnic_info *vnic0 = &bp->vnic_info[BNXT_VNIC_DEFAULT];
  5552. struct hwrm_vnic_cfg_input *req;
  5553. unsigned int ring = 0, grp_idx;
  5554. u16 def_vlan = 0;
  5555. int rc;
  5556. rc = hwrm_req_init(bp, req, HWRM_VNIC_CFG);
  5557. if (rc)
  5558. return rc;
  5559. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  5560. struct bnxt_rx_ring_info *rxr = &bp->rx_ring[0];
  5561. req->default_rx_ring_id =
  5562. cpu_to_le16(rxr->rx_ring_struct.fw_ring_id);
  5563. req->default_cmpl_ring_id =
  5564. cpu_to_le16(bnxt_cp_ring_for_rx(bp, rxr));
  5565. req->enables =
  5566. cpu_to_le32(VNIC_CFG_REQ_ENABLES_DEFAULT_RX_RING_ID |
  5567. VNIC_CFG_REQ_ENABLES_DEFAULT_CMPL_RING_ID);
  5568. goto vnic_mru;
  5569. }
  5570. req->enables = cpu_to_le32(VNIC_CFG_REQ_ENABLES_DFLT_RING_GRP);
  5571. /* Only RSS support for now TBD: COS & LB */
  5572. if (vnic->fw_rss_cos_lb_ctx[0] != INVALID_HW_RING_ID) {
  5573. req->rss_rule = cpu_to_le16(vnic->fw_rss_cos_lb_ctx[0]);
  5574. req->enables |= cpu_to_le32(VNIC_CFG_REQ_ENABLES_RSS_RULE |
  5575. VNIC_CFG_REQ_ENABLES_MRU);
  5576. } else if (vnic->flags & BNXT_VNIC_RFS_NEW_RSS_FLAG) {
  5577. req->rss_rule = cpu_to_le16(vnic0->fw_rss_cos_lb_ctx[0]);
  5578. req->enables |= cpu_to_le32(VNIC_CFG_REQ_ENABLES_RSS_RULE |
  5579. VNIC_CFG_REQ_ENABLES_MRU);
  5580. req->flags |= cpu_to_le32(VNIC_CFG_REQ_FLAGS_RSS_DFLT_CR_MODE);
  5581. } else {
  5582. req->rss_rule = cpu_to_le16(0xffff);
  5583. }
  5584. if (BNXT_CHIP_TYPE_NITRO_A0(bp) &&
  5585. (vnic->fw_rss_cos_lb_ctx[0] != INVALID_HW_RING_ID)) {
  5586. req->cos_rule = cpu_to_le16(vnic->fw_rss_cos_lb_ctx[1]);
  5587. req->enables |= cpu_to_le32(VNIC_CFG_REQ_ENABLES_COS_RULE);
  5588. } else {
  5589. req->cos_rule = cpu_to_le16(0xffff);
  5590. }
  5591. if (vnic->flags & BNXT_VNIC_RSS_FLAG)
  5592. ring = 0;
  5593. else if (vnic->flags & BNXT_VNIC_RFS_FLAG)
  5594. ring = vnic->vnic_id - 1;
  5595. else if ((vnic->vnic_id == 1) && BNXT_CHIP_TYPE_NITRO_A0(bp))
  5596. ring = bp->rx_nr_rings - 1;
  5597. grp_idx = bp->rx_ring[ring].bnapi->index;
  5598. req->dflt_ring_grp = cpu_to_le16(bp->grp_info[grp_idx].fw_grp_id);
  5599. req->lb_rule = cpu_to_le16(0xffff);
  5600. vnic_mru:
  5601. vnic->mru = bp->dev->mtu + ETH_HLEN + VLAN_HLEN;
  5602. req->mru = cpu_to_le16(vnic->mru);
  5603. req->vnic_id = cpu_to_le16(vnic->fw_vnic_id);
  5604. #ifdef CONFIG_BNXT_SRIOV
  5605. if (BNXT_VF(bp))
  5606. def_vlan = bp->vf.vlan;
  5607. #endif
  5608. if ((bp->flags & BNXT_FLAG_STRIP_VLAN) || def_vlan)
  5609. req->flags |= cpu_to_le32(VNIC_CFG_REQ_FLAGS_VLAN_STRIP_MODE);
  5610. if (vnic->vnic_id == BNXT_VNIC_DEFAULT && bnxt_ulp_registered(bp->edev))
  5611. req->flags |= cpu_to_le32(bnxt_get_roce_vnic_mode(bp));
  5612. return hwrm_req_send(bp, req);
  5613. }
  5614. static void bnxt_hwrm_vnic_free_one(struct bnxt *bp,
  5615. struct bnxt_vnic_info *vnic)
  5616. {
  5617. if (vnic->fw_vnic_id != INVALID_HW_RING_ID) {
  5618. struct hwrm_vnic_free_input *req;
  5619. if (hwrm_req_init(bp, req, HWRM_VNIC_FREE))
  5620. return;
  5621. req->vnic_id = cpu_to_le32(vnic->fw_vnic_id);
  5622. hwrm_req_send(bp, req);
  5623. vnic->fw_vnic_id = INVALID_HW_RING_ID;
  5624. }
  5625. }
  5626. static void bnxt_hwrm_vnic_free(struct bnxt *bp)
  5627. {
  5628. u16 i;
  5629. for (i = 0; i < bp->nr_vnics; i++)
  5630. bnxt_hwrm_vnic_free_one(bp, &bp->vnic_info[i]);
  5631. }
  5632. int bnxt_hwrm_vnic_alloc(struct bnxt *bp, struct bnxt_vnic_info *vnic,
  5633. unsigned int start_rx_ring_idx,
  5634. unsigned int nr_rings)
  5635. {
  5636. unsigned int i, j, grp_idx, end_idx = start_rx_ring_idx + nr_rings;
  5637. struct hwrm_vnic_alloc_output *resp;
  5638. struct hwrm_vnic_alloc_input *req;
  5639. int rc;
  5640. rc = hwrm_req_init(bp, req, HWRM_VNIC_ALLOC);
  5641. if (rc)
  5642. return rc;
  5643. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  5644. goto vnic_no_ring_grps;
  5645. /* map ring groups to this vnic */
  5646. for (i = start_rx_ring_idx, j = 0; i < end_idx; i++, j++) {
  5647. grp_idx = bp->rx_ring[i].bnapi->index;
  5648. if (bp->grp_info[grp_idx].fw_grp_id == INVALID_HW_RING_ID) {
  5649. netdev_err(bp->dev, "Not enough ring groups avail:%x req:%x\n",
  5650. j, nr_rings);
  5651. break;
  5652. }
  5653. vnic->fw_grp_ids[j] = bp->grp_info[grp_idx].fw_grp_id;
  5654. }
  5655. vnic_no_ring_grps:
  5656. for (i = 0; i < BNXT_MAX_CTX_PER_VNIC; i++)
  5657. vnic->fw_rss_cos_lb_ctx[i] = INVALID_HW_RING_ID;
  5658. if (vnic->vnic_id == BNXT_VNIC_DEFAULT)
  5659. req->flags = cpu_to_le32(VNIC_ALLOC_REQ_FLAGS_DEFAULT);
  5660. resp = hwrm_req_hold(bp, req);
  5661. rc = hwrm_req_send(bp, req);
  5662. if (!rc)
  5663. vnic->fw_vnic_id = le32_to_cpu(resp->vnic_id);
  5664. hwrm_req_drop(bp, req);
  5665. return rc;
  5666. }
  5667. static int bnxt_hwrm_vnic_qcaps(struct bnxt *bp)
  5668. {
  5669. struct hwrm_vnic_qcaps_output *resp;
  5670. struct hwrm_vnic_qcaps_input *req;
  5671. int rc;
  5672. bp->hw_ring_stats_size = sizeof(struct ctx_hw_stats);
  5673. bp->flags &= ~BNXT_FLAG_ROCE_MIRROR_CAP;
  5674. bp->rss_cap &= ~BNXT_RSS_CAP_NEW_RSS_CAP;
  5675. if (bp->hwrm_spec_code < 0x10600)
  5676. return 0;
  5677. rc = hwrm_req_init(bp, req, HWRM_VNIC_QCAPS);
  5678. if (rc)
  5679. return rc;
  5680. resp = hwrm_req_hold(bp, req);
  5681. rc = hwrm_req_send(bp, req);
  5682. if (!rc) {
  5683. u32 flags = le32_to_cpu(resp->flags);
  5684. if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS) &&
  5685. (flags & VNIC_QCAPS_RESP_FLAGS_RSS_DFLT_CR_CAP))
  5686. bp->rss_cap |= BNXT_RSS_CAP_NEW_RSS_CAP;
  5687. if (flags &
  5688. VNIC_QCAPS_RESP_FLAGS_ROCE_MIRRORING_CAPABLE_VNIC_CAP)
  5689. bp->flags |= BNXT_FLAG_ROCE_MIRROR_CAP;
  5690. /* Older P5 fw before EXT_HW_STATS support did not set
  5691. * VLAN_STRIP_CAP properly.
  5692. */
  5693. if ((flags & VNIC_QCAPS_RESP_FLAGS_VLAN_STRIP_CAP) ||
  5694. (BNXT_CHIP_P5(bp) &&
  5695. !(bp->fw_cap & BNXT_FW_CAP_EXT_HW_STATS_SUPPORTED)))
  5696. bp->fw_cap |= BNXT_FW_CAP_VLAN_RX_STRIP;
  5697. if (flags & VNIC_QCAPS_RESP_FLAGS_RSS_HASH_TYPE_DELTA_CAP)
  5698. bp->rss_cap |= BNXT_RSS_CAP_RSS_HASH_TYPE_DELTA;
  5699. if (flags & VNIC_QCAPS_RESP_FLAGS_RSS_PROF_TCAM_MODE_ENABLED)
  5700. bp->rss_cap |= BNXT_RSS_CAP_RSS_TCAM;
  5701. bp->max_tpa_v2 = le16_to_cpu(resp->max_aggs_supported);
  5702. if (bp->max_tpa_v2) {
  5703. if (BNXT_CHIP_P5(bp))
  5704. bp->hw_ring_stats_size = BNXT_RING_STATS_SIZE_P5;
  5705. else
  5706. bp->hw_ring_stats_size = BNXT_RING_STATS_SIZE_P7;
  5707. }
  5708. if (flags & VNIC_QCAPS_RESP_FLAGS_HW_TUNNEL_TPA_CAP)
  5709. bp->fw_cap |= BNXT_FW_CAP_VNIC_TUNNEL_TPA;
  5710. if (flags & VNIC_QCAPS_RESP_FLAGS_RSS_IPSEC_AH_SPI_IPV4_CAP)
  5711. bp->rss_cap |= BNXT_RSS_CAP_AH_V4_RSS_CAP;
  5712. if (flags & VNIC_QCAPS_RESP_FLAGS_RSS_IPSEC_AH_SPI_IPV6_CAP)
  5713. bp->rss_cap |= BNXT_RSS_CAP_AH_V6_RSS_CAP;
  5714. if (flags & VNIC_QCAPS_RESP_FLAGS_RSS_IPSEC_ESP_SPI_IPV4_CAP)
  5715. bp->rss_cap |= BNXT_RSS_CAP_ESP_V4_RSS_CAP;
  5716. if (flags & VNIC_QCAPS_RESP_FLAGS_RSS_IPSEC_ESP_SPI_IPV6_CAP)
  5717. bp->rss_cap |= BNXT_RSS_CAP_ESP_V6_RSS_CAP;
  5718. if (flags & VNIC_QCAPS_RESP_FLAGS_RE_FLUSH_CAP)
  5719. bp->fw_cap |= BNXT_FW_CAP_VNIC_RE_FLUSH;
  5720. }
  5721. hwrm_req_drop(bp, req);
  5722. return rc;
  5723. }
  5724. static int bnxt_hwrm_ring_grp_alloc(struct bnxt *bp)
  5725. {
  5726. struct hwrm_ring_grp_alloc_output *resp;
  5727. struct hwrm_ring_grp_alloc_input *req;
  5728. int rc;
  5729. u16 i;
  5730. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  5731. return 0;
  5732. rc = hwrm_req_init(bp, req, HWRM_RING_GRP_ALLOC);
  5733. if (rc)
  5734. return rc;
  5735. resp = hwrm_req_hold(bp, req);
  5736. for (i = 0; i < bp->rx_nr_rings; i++) {
  5737. unsigned int grp_idx = bp->rx_ring[i].bnapi->index;
  5738. req->cr = cpu_to_le16(bp->grp_info[grp_idx].cp_fw_ring_id);
  5739. req->rr = cpu_to_le16(bp->grp_info[grp_idx].rx_fw_ring_id);
  5740. req->ar = cpu_to_le16(bp->grp_info[grp_idx].agg_fw_ring_id);
  5741. req->sc = cpu_to_le16(bp->grp_info[grp_idx].fw_stats_ctx);
  5742. rc = hwrm_req_send(bp, req);
  5743. if (rc)
  5744. break;
  5745. bp->grp_info[grp_idx].fw_grp_id =
  5746. le32_to_cpu(resp->ring_group_id);
  5747. }
  5748. hwrm_req_drop(bp, req);
  5749. return rc;
  5750. }
  5751. static void bnxt_hwrm_ring_grp_free(struct bnxt *bp)
  5752. {
  5753. struct hwrm_ring_grp_free_input *req;
  5754. u16 i;
  5755. if (!bp->grp_info || (bp->flags & BNXT_FLAG_CHIP_P5_PLUS))
  5756. return;
  5757. if (hwrm_req_init(bp, req, HWRM_RING_GRP_FREE))
  5758. return;
  5759. hwrm_req_hold(bp, req);
  5760. for (i = 0; i < bp->cp_nr_rings; i++) {
  5761. if (bp->grp_info[i].fw_grp_id == INVALID_HW_RING_ID)
  5762. continue;
  5763. req->ring_group_id =
  5764. cpu_to_le32(bp->grp_info[i].fw_grp_id);
  5765. hwrm_req_send(bp, req);
  5766. bp->grp_info[i].fw_grp_id = INVALID_HW_RING_ID;
  5767. }
  5768. hwrm_req_drop(bp, req);
  5769. }
  5770. static int hwrm_ring_alloc_send_msg(struct bnxt *bp,
  5771. struct bnxt_ring_struct *ring,
  5772. u32 ring_type, u32 map_index)
  5773. {
  5774. struct hwrm_ring_alloc_output *resp;
  5775. struct hwrm_ring_alloc_input *req;
  5776. struct bnxt_ring_mem_info *rmem = &ring->ring_mem;
  5777. struct bnxt_ring_grp_info *grp_info;
  5778. int rc, err = 0;
  5779. u16 ring_id;
  5780. rc = hwrm_req_init(bp, req, HWRM_RING_ALLOC);
  5781. if (rc)
  5782. goto exit;
  5783. req->enables = 0;
  5784. if (rmem->nr_pages > 1) {
  5785. req->page_tbl_addr = cpu_to_le64(rmem->pg_tbl_map);
  5786. /* Page size is in log2 units */
  5787. req->page_size = BNXT_PAGE_SHIFT;
  5788. req->page_tbl_depth = 1;
  5789. } else {
  5790. req->page_tbl_addr = cpu_to_le64(rmem->dma_arr[0]);
  5791. }
  5792. req->fbo = 0;
  5793. /* Association of ring index with doorbell index and MSIX number */
  5794. req->logical_id = cpu_to_le16(map_index);
  5795. switch (ring_type) {
  5796. case HWRM_RING_ALLOC_TX: {
  5797. struct bnxt_tx_ring_info *txr;
  5798. u16 flags = 0;
  5799. txr = container_of(ring, struct bnxt_tx_ring_info,
  5800. tx_ring_struct);
  5801. req->ring_type = RING_ALLOC_REQ_RING_TYPE_TX;
  5802. /* Association of transmit ring with completion ring */
  5803. grp_info = &bp->grp_info[ring->grp_idx];
  5804. req->cmpl_ring_id = cpu_to_le16(bnxt_cp_ring_for_tx(bp, txr));
  5805. req->length = cpu_to_le32(bp->tx_ring_mask + 1);
  5806. req->stat_ctx_id = cpu_to_le32(grp_info->fw_stats_ctx);
  5807. req->queue_id = cpu_to_le16(ring->queue_id);
  5808. if (bp->flags & BNXT_FLAG_TX_COAL_CMPL)
  5809. req->cmpl_coal_cnt =
  5810. RING_ALLOC_REQ_CMPL_COAL_CNT_COAL_64;
  5811. if ((bp->fw_cap & BNXT_FW_CAP_TX_TS_CMP) && bp->ptp_cfg)
  5812. flags |= RING_ALLOC_REQ_FLAGS_TX_PKT_TS_CMPL_ENABLE;
  5813. req->flags = cpu_to_le16(flags);
  5814. break;
  5815. }
  5816. case HWRM_RING_ALLOC_RX:
  5817. req->ring_type = RING_ALLOC_REQ_RING_TYPE_RX;
  5818. req->length = cpu_to_le32(bp->rx_ring_mask + 1);
  5819. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  5820. u16 flags = 0;
  5821. /* Association of rx ring with stats context */
  5822. grp_info = &bp->grp_info[ring->grp_idx];
  5823. req->rx_buf_size = cpu_to_le16(bp->rx_buf_use_size);
  5824. req->stat_ctx_id = cpu_to_le32(grp_info->fw_stats_ctx);
  5825. req->enables |= cpu_to_le32(
  5826. RING_ALLOC_REQ_ENABLES_RX_BUF_SIZE_VALID);
  5827. if (NET_IP_ALIGN == 2)
  5828. flags = RING_ALLOC_REQ_FLAGS_RX_SOP_PAD;
  5829. req->flags = cpu_to_le16(flags);
  5830. }
  5831. break;
  5832. case HWRM_RING_ALLOC_AGG:
  5833. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  5834. req->ring_type = RING_ALLOC_REQ_RING_TYPE_RX_AGG;
  5835. /* Association of agg ring with rx ring */
  5836. grp_info = &bp->grp_info[ring->grp_idx];
  5837. req->rx_ring_id = cpu_to_le16(grp_info->rx_fw_ring_id);
  5838. req->rx_buf_size = cpu_to_le16(BNXT_RX_PAGE_SIZE);
  5839. req->stat_ctx_id = cpu_to_le32(grp_info->fw_stats_ctx);
  5840. req->enables |= cpu_to_le32(
  5841. RING_ALLOC_REQ_ENABLES_RX_RING_ID_VALID |
  5842. RING_ALLOC_REQ_ENABLES_RX_BUF_SIZE_VALID);
  5843. } else {
  5844. req->ring_type = RING_ALLOC_REQ_RING_TYPE_RX;
  5845. }
  5846. req->length = cpu_to_le32(bp->rx_agg_ring_mask + 1);
  5847. break;
  5848. case HWRM_RING_ALLOC_CMPL:
  5849. req->ring_type = RING_ALLOC_REQ_RING_TYPE_L2_CMPL;
  5850. req->length = cpu_to_le32(bp->cp_ring_mask + 1);
  5851. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  5852. /* Association of cp ring with nq */
  5853. grp_info = &bp->grp_info[map_index];
  5854. req->nq_ring_id = cpu_to_le16(grp_info->cp_fw_ring_id);
  5855. req->cq_handle = cpu_to_le64(ring->handle);
  5856. req->enables |= cpu_to_le32(
  5857. RING_ALLOC_REQ_ENABLES_NQ_RING_ID_VALID);
  5858. } else {
  5859. req->int_mode = RING_ALLOC_REQ_INT_MODE_MSIX;
  5860. }
  5861. break;
  5862. case HWRM_RING_ALLOC_NQ:
  5863. req->ring_type = RING_ALLOC_REQ_RING_TYPE_NQ;
  5864. req->length = cpu_to_le32(bp->cp_ring_mask + 1);
  5865. req->int_mode = RING_ALLOC_REQ_INT_MODE_MSIX;
  5866. break;
  5867. default:
  5868. netdev_err(bp->dev, "hwrm alloc invalid ring type %d\n",
  5869. ring_type);
  5870. return -1;
  5871. }
  5872. resp = hwrm_req_hold(bp, req);
  5873. rc = hwrm_req_send(bp, req);
  5874. err = le16_to_cpu(resp->error_code);
  5875. ring_id = le16_to_cpu(resp->ring_id);
  5876. hwrm_req_drop(bp, req);
  5877. exit:
  5878. if (rc || err) {
  5879. netdev_err(bp->dev, "hwrm_ring_alloc type %d failed. rc:%x err:%x\n",
  5880. ring_type, rc, err);
  5881. return -EIO;
  5882. }
  5883. ring->fw_ring_id = ring_id;
  5884. return rc;
  5885. }
  5886. static int bnxt_hwrm_set_async_event_cr(struct bnxt *bp, int idx)
  5887. {
  5888. int rc;
  5889. if (BNXT_PF(bp)) {
  5890. struct hwrm_func_cfg_input *req;
  5891. rc = bnxt_hwrm_func_cfg_short_req_init(bp, &req);
  5892. if (rc)
  5893. return rc;
  5894. req->fid = cpu_to_le16(0xffff);
  5895. req->enables = cpu_to_le32(FUNC_CFG_REQ_ENABLES_ASYNC_EVENT_CR);
  5896. req->async_event_cr = cpu_to_le16(idx);
  5897. return hwrm_req_send(bp, req);
  5898. } else {
  5899. struct hwrm_func_vf_cfg_input *req;
  5900. rc = hwrm_req_init(bp, req, HWRM_FUNC_VF_CFG);
  5901. if (rc)
  5902. return rc;
  5903. req->enables =
  5904. cpu_to_le32(FUNC_VF_CFG_REQ_ENABLES_ASYNC_EVENT_CR);
  5905. req->async_event_cr = cpu_to_le16(idx);
  5906. return hwrm_req_send(bp, req);
  5907. }
  5908. }
  5909. static void bnxt_set_db_mask(struct bnxt *bp, struct bnxt_db_info *db,
  5910. u32 ring_type)
  5911. {
  5912. switch (ring_type) {
  5913. case HWRM_RING_ALLOC_TX:
  5914. db->db_ring_mask = bp->tx_ring_mask;
  5915. break;
  5916. case HWRM_RING_ALLOC_RX:
  5917. db->db_ring_mask = bp->rx_ring_mask;
  5918. break;
  5919. case HWRM_RING_ALLOC_AGG:
  5920. db->db_ring_mask = bp->rx_agg_ring_mask;
  5921. break;
  5922. case HWRM_RING_ALLOC_CMPL:
  5923. case HWRM_RING_ALLOC_NQ:
  5924. db->db_ring_mask = bp->cp_ring_mask;
  5925. break;
  5926. }
  5927. if (bp->flags & BNXT_FLAG_CHIP_P7) {
  5928. db->db_epoch_mask = db->db_ring_mask + 1;
  5929. db->db_epoch_shift = DBR_EPOCH_SFT - ilog2(db->db_epoch_mask);
  5930. }
  5931. }
  5932. static void bnxt_set_db(struct bnxt *bp, struct bnxt_db_info *db, u32 ring_type,
  5933. u32 map_idx, u32 xid)
  5934. {
  5935. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  5936. switch (ring_type) {
  5937. case HWRM_RING_ALLOC_TX:
  5938. db->db_key64 = DBR_PATH_L2 | DBR_TYPE_SQ;
  5939. break;
  5940. case HWRM_RING_ALLOC_RX:
  5941. case HWRM_RING_ALLOC_AGG:
  5942. db->db_key64 = DBR_PATH_L2 | DBR_TYPE_SRQ;
  5943. break;
  5944. case HWRM_RING_ALLOC_CMPL:
  5945. db->db_key64 = DBR_PATH_L2;
  5946. break;
  5947. case HWRM_RING_ALLOC_NQ:
  5948. db->db_key64 = DBR_PATH_L2;
  5949. break;
  5950. }
  5951. db->db_key64 |= (u64)xid << DBR_XID_SFT;
  5952. if (bp->flags & BNXT_FLAG_CHIP_P7)
  5953. db->db_key64 |= DBR_VALID;
  5954. db->doorbell = bp->bar1 + bp->db_offset;
  5955. } else {
  5956. db->doorbell = bp->bar1 + map_idx * 0x80;
  5957. switch (ring_type) {
  5958. case HWRM_RING_ALLOC_TX:
  5959. db->db_key32 = DB_KEY_TX;
  5960. break;
  5961. case HWRM_RING_ALLOC_RX:
  5962. case HWRM_RING_ALLOC_AGG:
  5963. db->db_key32 = DB_KEY_RX;
  5964. break;
  5965. case HWRM_RING_ALLOC_CMPL:
  5966. db->db_key32 = DB_KEY_CP;
  5967. break;
  5968. }
  5969. }
  5970. bnxt_set_db_mask(bp, db, ring_type);
  5971. }
  5972. static int bnxt_hwrm_rx_ring_alloc(struct bnxt *bp,
  5973. struct bnxt_rx_ring_info *rxr)
  5974. {
  5975. struct bnxt_ring_struct *ring = &rxr->rx_ring_struct;
  5976. struct bnxt_napi *bnapi = rxr->bnapi;
  5977. u32 type = HWRM_RING_ALLOC_RX;
  5978. u32 map_idx = bnapi->index;
  5979. int rc;
  5980. rc = hwrm_ring_alloc_send_msg(bp, ring, type, map_idx);
  5981. if (rc)
  5982. return rc;
  5983. bnxt_set_db(bp, &rxr->rx_db, type, map_idx, ring->fw_ring_id);
  5984. bp->grp_info[map_idx].rx_fw_ring_id = ring->fw_ring_id;
  5985. return 0;
  5986. }
  5987. static int bnxt_hwrm_rx_agg_ring_alloc(struct bnxt *bp,
  5988. struct bnxt_rx_ring_info *rxr)
  5989. {
  5990. struct bnxt_ring_struct *ring = &rxr->rx_agg_ring_struct;
  5991. u32 type = HWRM_RING_ALLOC_AGG;
  5992. u32 grp_idx = ring->grp_idx;
  5993. u32 map_idx;
  5994. int rc;
  5995. map_idx = grp_idx + bp->rx_nr_rings;
  5996. rc = hwrm_ring_alloc_send_msg(bp, ring, type, map_idx);
  5997. if (rc)
  5998. return rc;
  5999. bnxt_set_db(bp, &rxr->rx_agg_db, type, map_idx,
  6000. ring->fw_ring_id);
  6001. bnxt_db_write(bp, &rxr->rx_agg_db, rxr->rx_agg_prod);
  6002. bnxt_db_write(bp, &rxr->rx_db, rxr->rx_prod);
  6003. bp->grp_info[grp_idx].agg_fw_ring_id = ring->fw_ring_id;
  6004. return 0;
  6005. }
  6006. static int bnxt_hwrm_ring_alloc(struct bnxt *bp)
  6007. {
  6008. bool agg_rings = !!(bp->flags & BNXT_FLAG_AGG_RINGS);
  6009. int i, rc = 0;
  6010. u32 type;
  6011. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  6012. type = HWRM_RING_ALLOC_NQ;
  6013. else
  6014. type = HWRM_RING_ALLOC_CMPL;
  6015. for (i = 0; i < bp->cp_nr_rings; i++) {
  6016. struct bnxt_napi *bnapi = bp->bnapi[i];
  6017. struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
  6018. struct bnxt_ring_struct *ring = &cpr->cp_ring_struct;
  6019. u32 map_idx = ring->map_idx;
  6020. unsigned int vector;
  6021. vector = bp->irq_tbl[map_idx].vector;
  6022. disable_irq_nosync(vector);
  6023. rc = hwrm_ring_alloc_send_msg(bp, ring, type, map_idx);
  6024. if (rc) {
  6025. enable_irq(vector);
  6026. goto err_out;
  6027. }
  6028. bnxt_set_db(bp, &cpr->cp_db, type, map_idx, ring->fw_ring_id);
  6029. bnxt_db_nq(bp, &cpr->cp_db, cpr->cp_raw_cons);
  6030. enable_irq(vector);
  6031. bp->grp_info[i].cp_fw_ring_id = ring->fw_ring_id;
  6032. if (!i) {
  6033. rc = bnxt_hwrm_set_async_event_cr(bp, ring->fw_ring_id);
  6034. if (rc)
  6035. netdev_warn(bp->dev, "Failed to set async event completion ring.\n");
  6036. }
  6037. }
  6038. type = HWRM_RING_ALLOC_TX;
  6039. for (i = 0; i < bp->tx_nr_rings; i++) {
  6040. struct bnxt_tx_ring_info *txr = &bp->tx_ring[i];
  6041. struct bnxt_ring_struct *ring;
  6042. u32 map_idx;
  6043. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  6044. struct bnxt_cp_ring_info *cpr2 = txr->tx_cpr;
  6045. struct bnxt_napi *bnapi = txr->bnapi;
  6046. u32 type2 = HWRM_RING_ALLOC_CMPL;
  6047. ring = &cpr2->cp_ring_struct;
  6048. ring->handle = BNXT_SET_NQ_HDL(cpr2);
  6049. map_idx = bnapi->index;
  6050. rc = hwrm_ring_alloc_send_msg(bp, ring, type2, map_idx);
  6051. if (rc)
  6052. goto err_out;
  6053. bnxt_set_db(bp, &cpr2->cp_db, type2, map_idx,
  6054. ring->fw_ring_id);
  6055. bnxt_db_cq(bp, &cpr2->cp_db, cpr2->cp_raw_cons);
  6056. }
  6057. ring = &txr->tx_ring_struct;
  6058. map_idx = i;
  6059. rc = hwrm_ring_alloc_send_msg(bp, ring, type, map_idx);
  6060. if (rc)
  6061. goto err_out;
  6062. bnxt_set_db(bp, &txr->tx_db, type, map_idx, ring->fw_ring_id);
  6063. }
  6064. for (i = 0; i < bp->rx_nr_rings; i++) {
  6065. struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
  6066. rc = bnxt_hwrm_rx_ring_alloc(bp, rxr);
  6067. if (rc)
  6068. goto err_out;
  6069. /* If we have agg rings, post agg buffers first. */
  6070. if (!agg_rings)
  6071. bnxt_db_write(bp, &rxr->rx_db, rxr->rx_prod);
  6072. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  6073. struct bnxt_cp_ring_info *cpr2 = rxr->rx_cpr;
  6074. struct bnxt_napi *bnapi = rxr->bnapi;
  6075. u32 type2 = HWRM_RING_ALLOC_CMPL;
  6076. struct bnxt_ring_struct *ring;
  6077. u32 map_idx = bnapi->index;
  6078. ring = &cpr2->cp_ring_struct;
  6079. ring->handle = BNXT_SET_NQ_HDL(cpr2);
  6080. rc = hwrm_ring_alloc_send_msg(bp, ring, type2, map_idx);
  6081. if (rc)
  6082. goto err_out;
  6083. bnxt_set_db(bp, &cpr2->cp_db, type2, map_idx,
  6084. ring->fw_ring_id);
  6085. bnxt_db_cq(bp, &cpr2->cp_db, cpr2->cp_raw_cons);
  6086. }
  6087. }
  6088. if (agg_rings) {
  6089. for (i = 0; i < bp->rx_nr_rings; i++) {
  6090. rc = bnxt_hwrm_rx_agg_ring_alloc(bp, &bp->rx_ring[i]);
  6091. if (rc)
  6092. goto err_out;
  6093. }
  6094. }
  6095. err_out:
  6096. return rc;
  6097. }
  6098. static void bnxt_cancel_dim(struct bnxt *bp)
  6099. {
  6100. int i;
  6101. /* DIM work is initialized in bnxt_enable_napi(). Proceed only
  6102. * if NAPI is enabled.
  6103. */
  6104. if (!bp->bnapi || test_bit(BNXT_STATE_NAPI_DISABLED, &bp->state))
  6105. return;
  6106. /* Make sure NAPI sees that the VNIC is disabled */
  6107. synchronize_net();
  6108. for (i = 0; i < bp->rx_nr_rings; i++) {
  6109. struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
  6110. struct bnxt_napi *bnapi = rxr->bnapi;
  6111. cancel_work_sync(&bnapi->cp_ring.dim.work);
  6112. }
  6113. }
  6114. static int hwrm_ring_free_send_msg(struct bnxt *bp,
  6115. struct bnxt_ring_struct *ring,
  6116. u32 ring_type, int cmpl_ring_id)
  6117. {
  6118. struct hwrm_ring_free_output *resp;
  6119. struct hwrm_ring_free_input *req;
  6120. u16 error_code = 0;
  6121. int rc;
  6122. if (BNXT_NO_FW_ACCESS(bp))
  6123. return 0;
  6124. rc = hwrm_req_init(bp, req, HWRM_RING_FREE);
  6125. if (rc)
  6126. goto exit;
  6127. req->cmpl_ring = cpu_to_le16(cmpl_ring_id);
  6128. req->ring_type = ring_type;
  6129. req->ring_id = cpu_to_le16(ring->fw_ring_id);
  6130. resp = hwrm_req_hold(bp, req);
  6131. rc = hwrm_req_send(bp, req);
  6132. error_code = le16_to_cpu(resp->error_code);
  6133. hwrm_req_drop(bp, req);
  6134. exit:
  6135. if (rc || error_code) {
  6136. netdev_err(bp->dev, "hwrm_ring_free type %d failed. rc:%x err:%x\n",
  6137. ring_type, rc, error_code);
  6138. return -EIO;
  6139. }
  6140. return 0;
  6141. }
  6142. static void bnxt_hwrm_rx_ring_free(struct bnxt *bp,
  6143. struct bnxt_rx_ring_info *rxr,
  6144. bool close_path)
  6145. {
  6146. struct bnxt_ring_struct *ring = &rxr->rx_ring_struct;
  6147. u32 grp_idx = rxr->bnapi->index;
  6148. u32 cmpl_ring_id;
  6149. if (ring->fw_ring_id == INVALID_HW_RING_ID)
  6150. return;
  6151. cmpl_ring_id = bnxt_cp_ring_for_rx(bp, rxr);
  6152. hwrm_ring_free_send_msg(bp, ring,
  6153. RING_FREE_REQ_RING_TYPE_RX,
  6154. close_path ? cmpl_ring_id :
  6155. INVALID_HW_RING_ID);
  6156. ring->fw_ring_id = INVALID_HW_RING_ID;
  6157. bp->grp_info[grp_idx].rx_fw_ring_id = INVALID_HW_RING_ID;
  6158. }
  6159. static void bnxt_hwrm_rx_agg_ring_free(struct bnxt *bp,
  6160. struct bnxt_rx_ring_info *rxr,
  6161. bool close_path)
  6162. {
  6163. struct bnxt_ring_struct *ring = &rxr->rx_agg_ring_struct;
  6164. u32 grp_idx = rxr->bnapi->index;
  6165. u32 type, cmpl_ring_id;
  6166. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  6167. type = RING_FREE_REQ_RING_TYPE_RX_AGG;
  6168. else
  6169. type = RING_FREE_REQ_RING_TYPE_RX;
  6170. if (ring->fw_ring_id == INVALID_HW_RING_ID)
  6171. return;
  6172. cmpl_ring_id = bnxt_cp_ring_for_rx(bp, rxr);
  6173. hwrm_ring_free_send_msg(bp, ring, type,
  6174. close_path ? cmpl_ring_id :
  6175. INVALID_HW_RING_ID);
  6176. ring->fw_ring_id = INVALID_HW_RING_ID;
  6177. bp->grp_info[grp_idx].agg_fw_ring_id = INVALID_HW_RING_ID;
  6178. }
  6179. static void bnxt_hwrm_ring_free(struct bnxt *bp, bool close_path)
  6180. {
  6181. u32 type;
  6182. int i;
  6183. if (!bp->bnapi)
  6184. return;
  6185. for (i = 0; i < bp->tx_nr_rings; i++) {
  6186. struct bnxt_tx_ring_info *txr = &bp->tx_ring[i];
  6187. struct bnxt_ring_struct *ring = &txr->tx_ring_struct;
  6188. if (ring->fw_ring_id != INVALID_HW_RING_ID) {
  6189. u32 cmpl_ring_id = bnxt_cp_ring_for_tx(bp, txr);
  6190. hwrm_ring_free_send_msg(bp, ring,
  6191. RING_FREE_REQ_RING_TYPE_TX,
  6192. close_path ? cmpl_ring_id :
  6193. INVALID_HW_RING_ID);
  6194. ring->fw_ring_id = INVALID_HW_RING_ID;
  6195. }
  6196. }
  6197. bnxt_cancel_dim(bp);
  6198. for (i = 0; i < bp->rx_nr_rings; i++) {
  6199. bnxt_hwrm_rx_ring_free(bp, &bp->rx_ring[i], close_path);
  6200. bnxt_hwrm_rx_agg_ring_free(bp, &bp->rx_ring[i], close_path);
  6201. }
  6202. /* The completion rings are about to be freed. After that the
  6203. * IRQ doorbell will not work anymore. So we need to disable
  6204. * IRQ here.
  6205. */
  6206. bnxt_disable_int_sync(bp);
  6207. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  6208. type = RING_FREE_REQ_RING_TYPE_NQ;
  6209. else
  6210. type = RING_FREE_REQ_RING_TYPE_L2_CMPL;
  6211. for (i = 0; i < bp->cp_nr_rings; i++) {
  6212. struct bnxt_napi *bnapi = bp->bnapi[i];
  6213. struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
  6214. struct bnxt_ring_struct *ring;
  6215. int j;
  6216. for (j = 0; j < cpr->cp_ring_count && cpr->cp_ring_arr; j++) {
  6217. struct bnxt_cp_ring_info *cpr2 = &cpr->cp_ring_arr[j];
  6218. ring = &cpr2->cp_ring_struct;
  6219. if (ring->fw_ring_id == INVALID_HW_RING_ID)
  6220. continue;
  6221. hwrm_ring_free_send_msg(bp, ring,
  6222. RING_FREE_REQ_RING_TYPE_L2_CMPL,
  6223. INVALID_HW_RING_ID);
  6224. ring->fw_ring_id = INVALID_HW_RING_ID;
  6225. }
  6226. ring = &cpr->cp_ring_struct;
  6227. if (ring->fw_ring_id != INVALID_HW_RING_ID) {
  6228. hwrm_ring_free_send_msg(bp, ring, type,
  6229. INVALID_HW_RING_ID);
  6230. ring->fw_ring_id = INVALID_HW_RING_ID;
  6231. bp->grp_info[i].cp_fw_ring_id = INVALID_HW_RING_ID;
  6232. }
  6233. }
  6234. }
  6235. static int __bnxt_trim_rings(struct bnxt *bp, int *rx, int *tx, int max,
  6236. bool shared);
  6237. static int bnxt_trim_rings(struct bnxt *bp, int *rx, int *tx, int max,
  6238. bool shared);
  6239. static int bnxt_hwrm_get_rings(struct bnxt *bp)
  6240. {
  6241. struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
  6242. struct hwrm_func_qcfg_output *resp;
  6243. struct hwrm_func_qcfg_input *req;
  6244. int rc;
  6245. if (bp->hwrm_spec_code < 0x10601)
  6246. return 0;
  6247. rc = hwrm_req_init(bp, req, HWRM_FUNC_QCFG);
  6248. if (rc)
  6249. return rc;
  6250. req->fid = cpu_to_le16(0xffff);
  6251. resp = hwrm_req_hold(bp, req);
  6252. rc = hwrm_req_send(bp, req);
  6253. if (rc) {
  6254. hwrm_req_drop(bp, req);
  6255. return rc;
  6256. }
  6257. hw_resc->resv_tx_rings = le16_to_cpu(resp->alloc_tx_rings);
  6258. if (BNXT_NEW_RM(bp)) {
  6259. u16 cp, stats;
  6260. hw_resc->resv_rx_rings = le16_to_cpu(resp->alloc_rx_rings);
  6261. hw_resc->resv_hw_ring_grps =
  6262. le32_to_cpu(resp->alloc_hw_ring_grps);
  6263. hw_resc->resv_vnics = le16_to_cpu(resp->alloc_vnics);
  6264. hw_resc->resv_rsscos_ctxs = le16_to_cpu(resp->alloc_rsscos_ctx);
  6265. cp = le16_to_cpu(resp->alloc_cmpl_rings);
  6266. stats = le16_to_cpu(resp->alloc_stat_ctx);
  6267. hw_resc->resv_irqs = cp;
  6268. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  6269. int rx = hw_resc->resv_rx_rings;
  6270. int tx = hw_resc->resv_tx_rings;
  6271. if (bp->flags & BNXT_FLAG_AGG_RINGS)
  6272. rx >>= 1;
  6273. if (cp < (rx + tx)) {
  6274. rc = __bnxt_trim_rings(bp, &rx, &tx, cp, false);
  6275. if (rc)
  6276. goto get_rings_exit;
  6277. if (bp->flags & BNXT_FLAG_AGG_RINGS)
  6278. rx <<= 1;
  6279. hw_resc->resv_rx_rings = rx;
  6280. hw_resc->resv_tx_rings = tx;
  6281. }
  6282. hw_resc->resv_irqs = le16_to_cpu(resp->alloc_msix);
  6283. hw_resc->resv_hw_ring_grps = rx;
  6284. }
  6285. hw_resc->resv_cp_rings = cp;
  6286. hw_resc->resv_stat_ctxs = stats;
  6287. }
  6288. get_rings_exit:
  6289. hwrm_req_drop(bp, req);
  6290. return rc;
  6291. }
  6292. int __bnxt_hwrm_get_tx_rings(struct bnxt *bp, u16 fid, int *tx_rings)
  6293. {
  6294. struct hwrm_func_qcfg_output *resp;
  6295. struct hwrm_func_qcfg_input *req;
  6296. int rc;
  6297. if (bp->hwrm_spec_code < 0x10601)
  6298. return 0;
  6299. rc = hwrm_req_init(bp, req, HWRM_FUNC_QCFG);
  6300. if (rc)
  6301. return rc;
  6302. req->fid = cpu_to_le16(fid);
  6303. resp = hwrm_req_hold(bp, req);
  6304. rc = hwrm_req_send(bp, req);
  6305. if (!rc)
  6306. *tx_rings = le16_to_cpu(resp->alloc_tx_rings);
  6307. hwrm_req_drop(bp, req);
  6308. return rc;
  6309. }
  6310. static bool bnxt_rfs_supported(struct bnxt *bp);
  6311. static struct hwrm_func_cfg_input *
  6312. __bnxt_hwrm_reserve_pf_rings(struct bnxt *bp, struct bnxt_hw_rings *hwr)
  6313. {
  6314. struct hwrm_func_cfg_input *req;
  6315. u32 enables = 0;
  6316. if (bnxt_hwrm_func_cfg_short_req_init(bp, &req))
  6317. return NULL;
  6318. req->fid = cpu_to_le16(0xffff);
  6319. enables |= hwr->tx ? FUNC_CFG_REQ_ENABLES_NUM_TX_RINGS : 0;
  6320. req->num_tx_rings = cpu_to_le16(hwr->tx);
  6321. if (BNXT_NEW_RM(bp)) {
  6322. enables |= hwr->rx ? FUNC_CFG_REQ_ENABLES_NUM_RX_RINGS : 0;
  6323. enables |= hwr->stat ? FUNC_CFG_REQ_ENABLES_NUM_STAT_CTXS : 0;
  6324. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  6325. enables |= hwr->cp ? FUNC_CFG_REQ_ENABLES_NUM_MSIX : 0;
  6326. enables |= hwr->cp_p5 ?
  6327. FUNC_CFG_REQ_ENABLES_NUM_CMPL_RINGS : 0;
  6328. } else {
  6329. enables |= hwr->cp ?
  6330. FUNC_CFG_REQ_ENABLES_NUM_CMPL_RINGS : 0;
  6331. enables |= hwr->grp ?
  6332. FUNC_CFG_REQ_ENABLES_NUM_HW_RING_GRPS : 0;
  6333. }
  6334. enables |= hwr->vnic ? FUNC_CFG_REQ_ENABLES_NUM_VNICS : 0;
  6335. enables |= hwr->rss_ctx ? FUNC_CFG_REQ_ENABLES_NUM_RSSCOS_CTXS :
  6336. 0;
  6337. req->num_rx_rings = cpu_to_le16(hwr->rx);
  6338. req->num_rsscos_ctxs = cpu_to_le16(hwr->rss_ctx);
  6339. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  6340. req->num_cmpl_rings = cpu_to_le16(hwr->cp_p5);
  6341. req->num_msix = cpu_to_le16(hwr->cp);
  6342. } else {
  6343. req->num_cmpl_rings = cpu_to_le16(hwr->cp);
  6344. req->num_hw_ring_grps = cpu_to_le16(hwr->grp);
  6345. }
  6346. req->num_stat_ctxs = cpu_to_le16(hwr->stat);
  6347. req->num_vnics = cpu_to_le16(hwr->vnic);
  6348. }
  6349. req->enables = cpu_to_le32(enables);
  6350. return req;
  6351. }
  6352. static struct hwrm_func_vf_cfg_input *
  6353. __bnxt_hwrm_reserve_vf_rings(struct bnxt *bp, struct bnxt_hw_rings *hwr)
  6354. {
  6355. struct hwrm_func_vf_cfg_input *req;
  6356. u32 enables = 0;
  6357. if (hwrm_req_init(bp, req, HWRM_FUNC_VF_CFG))
  6358. return NULL;
  6359. enables |= hwr->tx ? FUNC_VF_CFG_REQ_ENABLES_NUM_TX_RINGS : 0;
  6360. enables |= hwr->rx ? FUNC_VF_CFG_REQ_ENABLES_NUM_RX_RINGS |
  6361. FUNC_VF_CFG_REQ_ENABLES_NUM_RSSCOS_CTXS : 0;
  6362. enables |= hwr->stat ? FUNC_VF_CFG_REQ_ENABLES_NUM_STAT_CTXS : 0;
  6363. enables |= hwr->rss_ctx ? FUNC_VF_CFG_REQ_ENABLES_NUM_RSSCOS_CTXS : 0;
  6364. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  6365. enables |= hwr->cp_p5 ?
  6366. FUNC_VF_CFG_REQ_ENABLES_NUM_CMPL_RINGS : 0;
  6367. } else {
  6368. enables |= hwr->cp ? FUNC_VF_CFG_REQ_ENABLES_NUM_CMPL_RINGS : 0;
  6369. enables |= hwr->grp ?
  6370. FUNC_VF_CFG_REQ_ENABLES_NUM_HW_RING_GRPS : 0;
  6371. }
  6372. enables |= hwr->vnic ? FUNC_VF_CFG_REQ_ENABLES_NUM_VNICS : 0;
  6373. enables |= FUNC_VF_CFG_REQ_ENABLES_NUM_L2_CTXS;
  6374. req->num_l2_ctxs = cpu_to_le16(BNXT_VF_MAX_L2_CTX);
  6375. req->num_tx_rings = cpu_to_le16(hwr->tx);
  6376. req->num_rx_rings = cpu_to_le16(hwr->rx);
  6377. req->num_rsscos_ctxs = cpu_to_le16(hwr->rss_ctx);
  6378. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  6379. req->num_cmpl_rings = cpu_to_le16(hwr->cp_p5);
  6380. } else {
  6381. req->num_cmpl_rings = cpu_to_le16(hwr->cp);
  6382. req->num_hw_ring_grps = cpu_to_le16(hwr->grp);
  6383. }
  6384. req->num_stat_ctxs = cpu_to_le16(hwr->stat);
  6385. req->num_vnics = cpu_to_le16(hwr->vnic);
  6386. req->enables = cpu_to_le32(enables);
  6387. return req;
  6388. }
  6389. static int
  6390. bnxt_hwrm_reserve_pf_rings(struct bnxt *bp, struct bnxt_hw_rings *hwr)
  6391. {
  6392. struct hwrm_func_cfg_input *req;
  6393. int rc;
  6394. req = __bnxt_hwrm_reserve_pf_rings(bp, hwr);
  6395. if (!req)
  6396. return -ENOMEM;
  6397. if (!req->enables) {
  6398. hwrm_req_drop(bp, req);
  6399. return 0;
  6400. }
  6401. rc = hwrm_req_send(bp, req);
  6402. if (rc)
  6403. return rc;
  6404. if (bp->hwrm_spec_code < 0x10601)
  6405. bp->hw_resc.resv_tx_rings = hwr->tx;
  6406. return bnxt_hwrm_get_rings(bp);
  6407. }
  6408. static int
  6409. bnxt_hwrm_reserve_vf_rings(struct bnxt *bp, struct bnxt_hw_rings *hwr)
  6410. {
  6411. struct hwrm_func_vf_cfg_input *req;
  6412. int rc;
  6413. if (!BNXT_NEW_RM(bp)) {
  6414. bp->hw_resc.resv_tx_rings = hwr->tx;
  6415. return 0;
  6416. }
  6417. req = __bnxt_hwrm_reserve_vf_rings(bp, hwr);
  6418. if (!req)
  6419. return -ENOMEM;
  6420. rc = hwrm_req_send(bp, req);
  6421. if (rc)
  6422. return rc;
  6423. return bnxt_hwrm_get_rings(bp);
  6424. }
  6425. static int bnxt_hwrm_reserve_rings(struct bnxt *bp, struct bnxt_hw_rings *hwr)
  6426. {
  6427. if (BNXT_PF(bp))
  6428. return bnxt_hwrm_reserve_pf_rings(bp, hwr);
  6429. else
  6430. return bnxt_hwrm_reserve_vf_rings(bp, hwr);
  6431. }
  6432. int bnxt_nq_rings_in_use(struct bnxt *bp)
  6433. {
  6434. return bp->cp_nr_rings + bnxt_get_ulp_msix_num(bp);
  6435. }
  6436. static int bnxt_cp_rings_in_use(struct bnxt *bp)
  6437. {
  6438. int cp;
  6439. if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS))
  6440. return bnxt_nq_rings_in_use(bp);
  6441. cp = bp->tx_nr_rings + bp->rx_nr_rings;
  6442. return cp;
  6443. }
  6444. static int bnxt_get_func_stat_ctxs(struct bnxt *bp)
  6445. {
  6446. return bp->cp_nr_rings + bnxt_get_ulp_stat_ctxs(bp);
  6447. }
  6448. static int bnxt_get_total_rss_ctxs(struct bnxt *bp, struct bnxt_hw_rings *hwr)
  6449. {
  6450. if (!hwr->grp)
  6451. return 0;
  6452. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  6453. int rss_ctx = bnxt_get_nr_rss_ctxs(bp, hwr->grp);
  6454. if (BNXT_SUPPORTS_NTUPLE_VNIC(bp))
  6455. rss_ctx *= hwr->vnic;
  6456. return rss_ctx;
  6457. }
  6458. if (BNXT_VF(bp))
  6459. return BNXT_VF_MAX_RSS_CTX;
  6460. if (!(bp->rss_cap & BNXT_RSS_CAP_NEW_RSS_CAP) && bnxt_rfs_supported(bp))
  6461. return hwr->grp + 1;
  6462. return 1;
  6463. }
  6464. /* Check if a default RSS map needs to be setup. This function is only
  6465. * used on older firmware that does not require reserving RX rings.
  6466. */
  6467. static void bnxt_check_rss_tbl_no_rmgr(struct bnxt *bp)
  6468. {
  6469. struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
  6470. /* The RSS map is valid for RX rings set to resv_rx_rings */
  6471. if (hw_resc->resv_rx_rings != bp->rx_nr_rings) {
  6472. hw_resc->resv_rx_rings = bp->rx_nr_rings;
  6473. if (!netif_is_rxfh_configured(bp->dev))
  6474. bnxt_set_dflt_rss_indir_tbl(bp, NULL);
  6475. }
  6476. }
  6477. static int bnxt_get_total_vnics(struct bnxt *bp, int rx_rings)
  6478. {
  6479. if (bp->flags & BNXT_FLAG_RFS) {
  6480. if (BNXT_SUPPORTS_NTUPLE_VNIC(bp))
  6481. return 2 + bp->num_rss_ctx;
  6482. if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS))
  6483. return rx_rings + 1;
  6484. }
  6485. return 1;
  6486. }
  6487. static bool bnxt_need_reserve_rings(struct bnxt *bp)
  6488. {
  6489. struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
  6490. int cp = bnxt_cp_rings_in_use(bp);
  6491. int nq = bnxt_nq_rings_in_use(bp);
  6492. int rx = bp->rx_nr_rings, stat;
  6493. int vnic, grp = rx;
  6494. /* Old firmware does not need RX ring reservations but we still
  6495. * need to setup a default RSS map when needed. With new firmware
  6496. * we go through RX ring reservations first and then set up the
  6497. * RSS map for the successfully reserved RX rings when needed.
  6498. */
  6499. if (!BNXT_NEW_RM(bp))
  6500. bnxt_check_rss_tbl_no_rmgr(bp);
  6501. if (hw_resc->resv_tx_rings != bp->tx_nr_rings &&
  6502. bp->hwrm_spec_code >= 0x10601)
  6503. return true;
  6504. if (!BNXT_NEW_RM(bp))
  6505. return false;
  6506. vnic = bnxt_get_total_vnics(bp, rx);
  6507. if (bp->flags & BNXT_FLAG_AGG_RINGS)
  6508. rx <<= 1;
  6509. stat = bnxt_get_func_stat_ctxs(bp);
  6510. if (hw_resc->resv_rx_rings != rx || hw_resc->resv_cp_rings != cp ||
  6511. hw_resc->resv_vnics != vnic || hw_resc->resv_stat_ctxs != stat ||
  6512. (hw_resc->resv_hw_ring_grps != grp &&
  6513. !(bp->flags & BNXT_FLAG_CHIP_P5_PLUS)))
  6514. return true;
  6515. if ((bp->flags & BNXT_FLAG_CHIP_P5_PLUS) && BNXT_PF(bp) &&
  6516. hw_resc->resv_irqs != nq)
  6517. return true;
  6518. return false;
  6519. }
  6520. static void bnxt_copy_reserved_rings(struct bnxt *bp, struct bnxt_hw_rings *hwr)
  6521. {
  6522. struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
  6523. hwr->tx = hw_resc->resv_tx_rings;
  6524. if (BNXT_NEW_RM(bp)) {
  6525. hwr->rx = hw_resc->resv_rx_rings;
  6526. hwr->cp = hw_resc->resv_irqs;
  6527. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  6528. hwr->cp_p5 = hw_resc->resv_cp_rings;
  6529. hwr->grp = hw_resc->resv_hw_ring_grps;
  6530. hwr->vnic = hw_resc->resv_vnics;
  6531. hwr->stat = hw_resc->resv_stat_ctxs;
  6532. hwr->rss_ctx = hw_resc->resv_rsscos_ctxs;
  6533. }
  6534. }
  6535. static bool bnxt_rings_ok(struct bnxt *bp, struct bnxt_hw_rings *hwr)
  6536. {
  6537. return hwr->tx && hwr->rx && hwr->cp && hwr->grp && hwr->vnic &&
  6538. hwr->stat && (hwr->cp_p5 || !(bp->flags & BNXT_FLAG_CHIP_P5_PLUS));
  6539. }
  6540. static int bnxt_get_avail_msix(struct bnxt *bp, int num);
  6541. static int __bnxt_reserve_rings(struct bnxt *bp)
  6542. {
  6543. struct bnxt_hw_rings hwr = {0};
  6544. int rx_rings, old_rx_rings, rc;
  6545. int cp = bp->cp_nr_rings;
  6546. int ulp_msix = 0;
  6547. bool sh = false;
  6548. int tx_cp;
  6549. if (!bnxt_need_reserve_rings(bp))
  6550. return 0;
  6551. if (BNXT_NEW_RM(bp) && !bnxt_ulp_registered(bp->edev)) {
  6552. ulp_msix = bnxt_get_avail_msix(bp, bp->ulp_num_msix_want);
  6553. if (!ulp_msix)
  6554. bnxt_set_ulp_stat_ctxs(bp, 0);
  6555. if (ulp_msix > bp->ulp_num_msix_want)
  6556. ulp_msix = bp->ulp_num_msix_want;
  6557. hwr.cp = cp + ulp_msix;
  6558. } else {
  6559. hwr.cp = bnxt_nq_rings_in_use(bp);
  6560. }
  6561. hwr.tx = bp->tx_nr_rings;
  6562. hwr.rx = bp->rx_nr_rings;
  6563. if (bp->flags & BNXT_FLAG_SHARED_RINGS)
  6564. sh = true;
  6565. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  6566. hwr.cp_p5 = hwr.rx + hwr.tx;
  6567. hwr.vnic = bnxt_get_total_vnics(bp, hwr.rx);
  6568. if (bp->flags & BNXT_FLAG_AGG_RINGS)
  6569. hwr.rx <<= 1;
  6570. hwr.grp = bp->rx_nr_rings;
  6571. hwr.rss_ctx = bnxt_get_total_rss_ctxs(bp, &hwr);
  6572. hwr.stat = bnxt_get_func_stat_ctxs(bp);
  6573. old_rx_rings = bp->hw_resc.resv_rx_rings;
  6574. rc = bnxt_hwrm_reserve_rings(bp, &hwr);
  6575. if (rc)
  6576. return rc;
  6577. bnxt_copy_reserved_rings(bp, &hwr);
  6578. rx_rings = hwr.rx;
  6579. if (bp->flags & BNXT_FLAG_AGG_RINGS) {
  6580. if (hwr.rx >= 2) {
  6581. rx_rings = hwr.rx >> 1;
  6582. } else {
  6583. if (netif_running(bp->dev))
  6584. return -ENOMEM;
  6585. bp->flags &= ~BNXT_FLAG_AGG_RINGS;
  6586. bp->flags |= BNXT_FLAG_NO_AGG_RINGS;
  6587. bp->dev->hw_features &= ~NETIF_F_LRO;
  6588. bp->dev->features &= ~NETIF_F_LRO;
  6589. bnxt_set_ring_params(bp);
  6590. }
  6591. }
  6592. rx_rings = min_t(int, rx_rings, hwr.grp);
  6593. hwr.cp = min_t(int, hwr.cp, bp->cp_nr_rings);
  6594. if (bnxt_ulp_registered(bp->edev) &&
  6595. hwr.stat > bnxt_get_ulp_stat_ctxs(bp))
  6596. hwr.stat -= bnxt_get_ulp_stat_ctxs(bp);
  6597. hwr.cp = min_t(int, hwr.cp, hwr.stat);
  6598. rc = bnxt_trim_rings(bp, &rx_rings, &hwr.tx, hwr.cp, sh);
  6599. if (bp->flags & BNXT_FLAG_AGG_RINGS)
  6600. hwr.rx = rx_rings << 1;
  6601. tx_cp = bnxt_num_tx_to_cp(bp, hwr.tx);
  6602. hwr.cp = sh ? max_t(int, tx_cp, rx_rings) : tx_cp + rx_rings;
  6603. if (hwr.tx != bp->tx_nr_rings) {
  6604. netdev_warn(bp->dev,
  6605. "Able to reserve only %d out of %d requested TX rings\n",
  6606. hwr.tx, bp->tx_nr_rings);
  6607. }
  6608. bp->tx_nr_rings = hwr.tx;
  6609. /* If we cannot reserve all the RX rings, reset the RSS map only
  6610. * if absolutely necessary
  6611. */
  6612. if (rx_rings != bp->rx_nr_rings) {
  6613. netdev_warn(bp->dev, "Able to reserve only %d out of %d requested RX rings\n",
  6614. rx_rings, bp->rx_nr_rings);
  6615. if (netif_is_rxfh_configured(bp->dev) &&
  6616. (bnxt_get_nr_rss_ctxs(bp, bp->rx_nr_rings) !=
  6617. bnxt_get_nr_rss_ctxs(bp, rx_rings) ||
  6618. bnxt_get_max_rss_ring(bp) >= rx_rings)) {
  6619. netdev_warn(bp->dev, "RSS table entries reverting to default\n");
  6620. bp->dev->priv_flags &= ~IFF_RXFH_CONFIGURED;
  6621. }
  6622. }
  6623. bp->rx_nr_rings = rx_rings;
  6624. bp->cp_nr_rings = hwr.cp;
  6625. if (!bnxt_rings_ok(bp, &hwr))
  6626. return -ENOMEM;
  6627. if (old_rx_rings != bp->hw_resc.resv_rx_rings &&
  6628. !netif_is_rxfh_configured(bp->dev))
  6629. bnxt_set_dflt_rss_indir_tbl(bp, NULL);
  6630. if (!bnxt_ulp_registered(bp->edev) && BNXT_NEW_RM(bp)) {
  6631. int resv_msix, resv_ctx, ulp_ctxs;
  6632. struct bnxt_hw_resc *hw_resc;
  6633. hw_resc = &bp->hw_resc;
  6634. resv_msix = hw_resc->resv_irqs - bp->cp_nr_rings;
  6635. ulp_msix = min_t(int, resv_msix, ulp_msix);
  6636. bnxt_set_ulp_msix_num(bp, ulp_msix);
  6637. resv_ctx = hw_resc->resv_stat_ctxs - bp->cp_nr_rings;
  6638. ulp_ctxs = min(resv_ctx, bnxt_get_ulp_stat_ctxs(bp));
  6639. bnxt_set_ulp_stat_ctxs(bp, ulp_ctxs);
  6640. }
  6641. return rc;
  6642. }
  6643. static int bnxt_hwrm_check_vf_rings(struct bnxt *bp, struct bnxt_hw_rings *hwr)
  6644. {
  6645. struct hwrm_func_vf_cfg_input *req;
  6646. u32 flags;
  6647. if (!BNXT_NEW_RM(bp))
  6648. return 0;
  6649. req = __bnxt_hwrm_reserve_vf_rings(bp, hwr);
  6650. flags = FUNC_VF_CFG_REQ_FLAGS_TX_ASSETS_TEST |
  6651. FUNC_VF_CFG_REQ_FLAGS_RX_ASSETS_TEST |
  6652. FUNC_VF_CFG_REQ_FLAGS_CMPL_ASSETS_TEST |
  6653. FUNC_VF_CFG_REQ_FLAGS_STAT_CTX_ASSETS_TEST |
  6654. FUNC_VF_CFG_REQ_FLAGS_VNIC_ASSETS_TEST |
  6655. FUNC_VF_CFG_REQ_FLAGS_RSSCOS_CTX_ASSETS_TEST;
  6656. if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS))
  6657. flags |= FUNC_VF_CFG_REQ_FLAGS_RING_GRP_ASSETS_TEST;
  6658. req->flags = cpu_to_le32(flags);
  6659. return hwrm_req_send_silent(bp, req);
  6660. }
  6661. static int bnxt_hwrm_check_pf_rings(struct bnxt *bp, struct bnxt_hw_rings *hwr)
  6662. {
  6663. struct hwrm_func_cfg_input *req;
  6664. u32 flags;
  6665. req = __bnxt_hwrm_reserve_pf_rings(bp, hwr);
  6666. flags = FUNC_CFG_REQ_FLAGS_TX_ASSETS_TEST;
  6667. if (BNXT_NEW_RM(bp)) {
  6668. flags |= FUNC_CFG_REQ_FLAGS_RX_ASSETS_TEST |
  6669. FUNC_CFG_REQ_FLAGS_CMPL_ASSETS_TEST |
  6670. FUNC_CFG_REQ_FLAGS_STAT_CTX_ASSETS_TEST |
  6671. FUNC_CFG_REQ_FLAGS_VNIC_ASSETS_TEST;
  6672. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  6673. flags |= FUNC_CFG_REQ_FLAGS_RSSCOS_CTX_ASSETS_TEST |
  6674. FUNC_CFG_REQ_FLAGS_NQ_ASSETS_TEST;
  6675. else
  6676. flags |= FUNC_CFG_REQ_FLAGS_RING_GRP_ASSETS_TEST;
  6677. }
  6678. req->flags = cpu_to_le32(flags);
  6679. return hwrm_req_send_silent(bp, req);
  6680. }
  6681. static int bnxt_hwrm_check_rings(struct bnxt *bp, struct bnxt_hw_rings *hwr)
  6682. {
  6683. if (bp->hwrm_spec_code < 0x10801)
  6684. return 0;
  6685. if (BNXT_PF(bp))
  6686. return bnxt_hwrm_check_pf_rings(bp, hwr);
  6687. return bnxt_hwrm_check_vf_rings(bp, hwr);
  6688. }
  6689. static void bnxt_hwrm_coal_params_qcaps(struct bnxt *bp)
  6690. {
  6691. struct bnxt_coal_cap *coal_cap = &bp->coal_cap;
  6692. struct hwrm_ring_aggint_qcaps_output *resp;
  6693. struct hwrm_ring_aggint_qcaps_input *req;
  6694. int rc;
  6695. coal_cap->cmpl_params = BNXT_LEGACY_COAL_CMPL_PARAMS;
  6696. coal_cap->num_cmpl_dma_aggr_max = 63;
  6697. coal_cap->num_cmpl_dma_aggr_during_int_max = 63;
  6698. coal_cap->cmpl_aggr_dma_tmr_max = 65535;
  6699. coal_cap->cmpl_aggr_dma_tmr_during_int_max = 65535;
  6700. coal_cap->int_lat_tmr_min_max = 65535;
  6701. coal_cap->int_lat_tmr_max_max = 65535;
  6702. coal_cap->num_cmpl_aggr_int_max = 65535;
  6703. coal_cap->timer_units = 80;
  6704. if (bp->hwrm_spec_code < 0x10902)
  6705. return;
  6706. if (hwrm_req_init(bp, req, HWRM_RING_AGGINT_QCAPS))
  6707. return;
  6708. resp = hwrm_req_hold(bp, req);
  6709. rc = hwrm_req_send_silent(bp, req);
  6710. if (!rc) {
  6711. coal_cap->cmpl_params = le32_to_cpu(resp->cmpl_params);
  6712. coal_cap->nq_params = le32_to_cpu(resp->nq_params);
  6713. coal_cap->num_cmpl_dma_aggr_max =
  6714. le16_to_cpu(resp->num_cmpl_dma_aggr_max);
  6715. coal_cap->num_cmpl_dma_aggr_during_int_max =
  6716. le16_to_cpu(resp->num_cmpl_dma_aggr_during_int_max);
  6717. coal_cap->cmpl_aggr_dma_tmr_max =
  6718. le16_to_cpu(resp->cmpl_aggr_dma_tmr_max);
  6719. coal_cap->cmpl_aggr_dma_tmr_during_int_max =
  6720. le16_to_cpu(resp->cmpl_aggr_dma_tmr_during_int_max);
  6721. coal_cap->int_lat_tmr_min_max =
  6722. le16_to_cpu(resp->int_lat_tmr_min_max);
  6723. coal_cap->int_lat_tmr_max_max =
  6724. le16_to_cpu(resp->int_lat_tmr_max_max);
  6725. coal_cap->num_cmpl_aggr_int_max =
  6726. le16_to_cpu(resp->num_cmpl_aggr_int_max);
  6727. coal_cap->timer_units = le16_to_cpu(resp->timer_units);
  6728. }
  6729. hwrm_req_drop(bp, req);
  6730. }
  6731. static u16 bnxt_usec_to_coal_tmr(struct bnxt *bp, u16 usec)
  6732. {
  6733. struct bnxt_coal_cap *coal_cap = &bp->coal_cap;
  6734. return usec * 1000 / coal_cap->timer_units;
  6735. }
  6736. static void bnxt_hwrm_set_coal_params(struct bnxt *bp,
  6737. struct bnxt_coal *hw_coal,
  6738. struct hwrm_ring_cmpl_ring_cfg_aggint_params_input *req)
  6739. {
  6740. struct bnxt_coal_cap *coal_cap = &bp->coal_cap;
  6741. u16 val, tmr, max, flags = hw_coal->flags;
  6742. u32 cmpl_params = coal_cap->cmpl_params;
  6743. max = hw_coal->bufs_per_record * 128;
  6744. if (hw_coal->budget)
  6745. max = hw_coal->bufs_per_record * hw_coal->budget;
  6746. max = min_t(u16, max, coal_cap->num_cmpl_aggr_int_max);
  6747. val = clamp_t(u16, hw_coal->coal_bufs, 1, max);
  6748. req->num_cmpl_aggr_int = cpu_to_le16(val);
  6749. val = min_t(u16, val, coal_cap->num_cmpl_dma_aggr_max);
  6750. req->num_cmpl_dma_aggr = cpu_to_le16(val);
  6751. val = clamp_t(u16, hw_coal->coal_bufs_irq, 1,
  6752. coal_cap->num_cmpl_dma_aggr_during_int_max);
  6753. req->num_cmpl_dma_aggr_during_int = cpu_to_le16(val);
  6754. tmr = bnxt_usec_to_coal_tmr(bp, hw_coal->coal_ticks);
  6755. tmr = clamp_t(u16, tmr, 1, coal_cap->int_lat_tmr_max_max);
  6756. req->int_lat_tmr_max = cpu_to_le16(tmr);
  6757. /* min timer set to 1/2 of interrupt timer */
  6758. if (cmpl_params & RING_AGGINT_QCAPS_RESP_CMPL_PARAMS_INT_LAT_TMR_MIN) {
  6759. val = tmr / 2;
  6760. val = clamp_t(u16, val, 1, coal_cap->int_lat_tmr_min_max);
  6761. req->int_lat_tmr_min = cpu_to_le16(val);
  6762. req->enables |= cpu_to_le16(BNXT_COAL_CMPL_MIN_TMR_ENABLE);
  6763. }
  6764. /* buf timer set to 1/4 of interrupt timer */
  6765. val = clamp_t(u16, tmr / 4, 1, coal_cap->cmpl_aggr_dma_tmr_max);
  6766. req->cmpl_aggr_dma_tmr = cpu_to_le16(val);
  6767. if (cmpl_params &
  6768. RING_AGGINT_QCAPS_RESP_CMPL_PARAMS_NUM_CMPL_DMA_AGGR_DURING_INT) {
  6769. tmr = bnxt_usec_to_coal_tmr(bp, hw_coal->coal_ticks_irq);
  6770. val = clamp_t(u16, tmr, 1,
  6771. coal_cap->cmpl_aggr_dma_tmr_during_int_max);
  6772. req->cmpl_aggr_dma_tmr_during_int = cpu_to_le16(val);
  6773. req->enables |=
  6774. cpu_to_le16(BNXT_COAL_CMPL_AGGR_TMR_DURING_INT_ENABLE);
  6775. }
  6776. if ((cmpl_params & RING_AGGINT_QCAPS_RESP_CMPL_PARAMS_RING_IDLE) &&
  6777. hw_coal->idle_thresh && hw_coal->coal_ticks < hw_coal->idle_thresh)
  6778. flags |= RING_CMPL_RING_CFG_AGGINT_PARAMS_REQ_FLAGS_RING_IDLE;
  6779. req->flags = cpu_to_le16(flags);
  6780. req->enables |= cpu_to_le16(BNXT_COAL_CMPL_ENABLES);
  6781. }
  6782. static int __bnxt_hwrm_set_coal_nq(struct bnxt *bp, struct bnxt_napi *bnapi,
  6783. struct bnxt_coal *hw_coal)
  6784. {
  6785. struct hwrm_ring_cmpl_ring_cfg_aggint_params_input *req;
  6786. struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
  6787. struct bnxt_coal_cap *coal_cap = &bp->coal_cap;
  6788. u32 nq_params = coal_cap->nq_params;
  6789. u16 tmr;
  6790. int rc;
  6791. if (!(nq_params & RING_AGGINT_QCAPS_RESP_NQ_PARAMS_INT_LAT_TMR_MIN))
  6792. return 0;
  6793. rc = hwrm_req_init(bp, req, HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS);
  6794. if (rc)
  6795. return rc;
  6796. req->ring_id = cpu_to_le16(cpr->cp_ring_struct.fw_ring_id);
  6797. req->flags =
  6798. cpu_to_le16(RING_CMPL_RING_CFG_AGGINT_PARAMS_REQ_FLAGS_IS_NQ);
  6799. tmr = bnxt_usec_to_coal_tmr(bp, hw_coal->coal_ticks) / 2;
  6800. tmr = clamp_t(u16, tmr, 1, coal_cap->int_lat_tmr_min_max);
  6801. req->int_lat_tmr_min = cpu_to_le16(tmr);
  6802. req->enables |= cpu_to_le16(BNXT_COAL_CMPL_MIN_TMR_ENABLE);
  6803. return hwrm_req_send(bp, req);
  6804. }
  6805. int bnxt_hwrm_set_ring_coal(struct bnxt *bp, struct bnxt_napi *bnapi)
  6806. {
  6807. struct hwrm_ring_cmpl_ring_cfg_aggint_params_input *req_rx;
  6808. struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
  6809. struct bnxt_coal coal;
  6810. int rc;
  6811. /* Tick values in micro seconds.
  6812. * 1 coal_buf x bufs_per_record = 1 completion record.
  6813. */
  6814. memcpy(&coal, &bp->rx_coal, sizeof(struct bnxt_coal));
  6815. coal.coal_ticks = cpr->rx_ring_coal.coal_ticks;
  6816. coal.coal_bufs = cpr->rx_ring_coal.coal_bufs;
  6817. if (!bnapi->rx_ring)
  6818. return -ENODEV;
  6819. rc = hwrm_req_init(bp, req_rx, HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS);
  6820. if (rc)
  6821. return rc;
  6822. bnxt_hwrm_set_coal_params(bp, &coal, req_rx);
  6823. req_rx->ring_id = cpu_to_le16(bnxt_cp_ring_for_rx(bp, bnapi->rx_ring));
  6824. return hwrm_req_send(bp, req_rx);
  6825. }
  6826. static int
  6827. bnxt_hwrm_set_rx_coal(struct bnxt *bp, struct bnxt_napi *bnapi,
  6828. struct hwrm_ring_cmpl_ring_cfg_aggint_params_input *req)
  6829. {
  6830. u16 ring_id = bnxt_cp_ring_for_rx(bp, bnapi->rx_ring);
  6831. req->ring_id = cpu_to_le16(ring_id);
  6832. return hwrm_req_send(bp, req);
  6833. }
  6834. static int
  6835. bnxt_hwrm_set_tx_coal(struct bnxt *bp, struct bnxt_napi *bnapi,
  6836. struct hwrm_ring_cmpl_ring_cfg_aggint_params_input *req)
  6837. {
  6838. struct bnxt_tx_ring_info *txr;
  6839. int i, rc;
  6840. bnxt_for_each_napi_tx(i, bnapi, txr) {
  6841. u16 ring_id;
  6842. ring_id = bnxt_cp_ring_for_tx(bp, txr);
  6843. req->ring_id = cpu_to_le16(ring_id);
  6844. rc = hwrm_req_send(bp, req);
  6845. if (rc)
  6846. return rc;
  6847. if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS))
  6848. return 0;
  6849. }
  6850. return 0;
  6851. }
  6852. int bnxt_hwrm_set_coal(struct bnxt *bp)
  6853. {
  6854. struct hwrm_ring_cmpl_ring_cfg_aggint_params_input *req_rx, *req_tx;
  6855. int i, rc;
  6856. rc = hwrm_req_init(bp, req_rx, HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS);
  6857. if (rc)
  6858. return rc;
  6859. rc = hwrm_req_init(bp, req_tx, HWRM_RING_CMPL_RING_CFG_AGGINT_PARAMS);
  6860. if (rc) {
  6861. hwrm_req_drop(bp, req_rx);
  6862. return rc;
  6863. }
  6864. bnxt_hwrm_set_coal_params(bp, &bp->rx_coal, req_rx);
  6865. bnxt_hwrm_set_coal_params(bp, &bp->tx_coal, req_tx);
  6866. hwrm_req_hold(bp, req_rx);
  6867. hwrm_req_hold(bp, req_tx);
  6868. for (i = 0; i < bp->cp_nr_rings; i++) {
  6869. struct bnxt_napi *bnapi = bp->bnapi[i];
  6870. struct bnxt_coal *hw_coal;
  6871. if (!bnapi->rx_ring)
  6872. rc = bnxt_hwrm_set_tx_coal(bp, bnapi, req_tx);
  6873. else
  6874. rc = bnxt_hwrm_set_rx_coal(bp, bnapi, req_rx);
  6875. if (rc)
  6876. break;
  6877. if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS))
  6878. continue;
  6879. if (bnapi->rx_ring && bnapi->tx_ring[0]) {
  6880. rc = bnxt_hwrm_set_tx_coal(bp, bnapi, req_tx);
  6881. if (rc)
  6882. break;
  6883. }
  6884. if (bnapi->rx_ring)
  6885. hw_coal = &bp->rx_coal;
  6886. else
  6887. hw_coal = &bp->tx_coal;
  6888. __bnxt_hwrm_set_coal_nq(bp, bnapi, hw_coal);
  6889. }
  6890. hwrm_req_drop(bp, req_rx);
  6891. hwrm_req_drop(bp, req_tx);
  6892. return rc;
  6893. }
  6894. static void bnxt_hwrm_stat_ctx_free(struct bnxt *bp)
  6895. {
  6896. struct hwrm_stat_ctx_clr_stats_input *req0 = NULL;
  6897. struct hwrm_stat_ctx_free_input *req;
  6898. int i;
  6899. if (!bp->bnapi)
  6900. return;
  6901. if (BNXT_CHIP_TYPE_NITRO_A0(bp))
  6902. return;
  6903. if (hwrm_req_init(bp, req, HWRM_STAT_CTX_FREE))
  6904. return;
  6905. if (BNXT_FW_MAJ(bp) <= 20) {
  6906. if (hwrm_req_init(bp, req0, HWRM_STAT_CTX_CLR_STATS)) {
  6907. hwrm_req_drop(bp, req);
  6908. return;
  6909. }
  6910. hwrm_req_hold(bp, req0);
  6911. }
  6912. hwrm_req_hold(bp, req);
  6913. for (i = 0; i < bp->cp_nr_rings; i++) {
  6914. struct bnxt_napi *bnapi = bp->bnapi[i];
  6915. struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
  6916. if (cpr->hw_stats_ctx_id != INVALID_STATS_CTX_ID) {
  6917. req->stat_ctx_id = cpu_to_le32(cpr->hw_stats_ctx_id);
  6918. if (req0) {
  6919. req0->stat_ctx_id = req->stat_ctx_id;
  6920. hwrm_req_send(bp, req0);
  6921. }
  6922. hwrm_req_send(bp, req);
  6923. cpr->hw_stats_ctx_id = INVALID_STATS_CTX_ID;
  6924. }
  6925. }
  6926. hwrm_req_drop(bp, req);
  6927. if (req0)
  6928. hwrm_req_drop(bp, req0);
  6929. }
  6930. static int bnxt_hwrm_stat_ctx_alloc(struct bnxt *bp)
  6931. {
  6932. struct hwrm_stat_ctx_alloc_output *resp;
  6933. struct hwrm_stat_ctx_alloc_input *req;
  6934. int rc, i;
  6935. if (BNXT_CHIP_TYPE_NITRO_A0(bp))
  6936. return 0;
  6937. rc = hwrm_req_init(bp, req, HWRM_STAT_CTX_ALLOC);
  6938. if (rc)
  6939. return rc;
  6940. req->stats_dma_length = cpu_to_le16(bp->hw_ring_stats_size);
  6941. req->update_period_ms = cpu_to_le32(bp->stats_coal_ticks / 1000);
  6942. resp = hwrm_req_hold(bp, req);
  6943. for (i = 0; i < bp->cp_nr_rings; i++) {
  6944. struct bnxt_napi *bnapi = bp->bnapi[i];
  6945. struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
  6946. req->stats_dma_addr = cpu_to_le64(cpr->stats.hw_stats_map);
  6947. rc = hwrm_req_send(bp, req);
  6948. if (rc)
  6949. break;
  6950. cpr->hw_stats_ctx_id = le32_to_cpu(resp->stat_ctx_id);
  6951. bp->grp_info[i].fw_stats_ctx = cpr->hw_stats_ctx_id;
  6952. }
  6953. hwrm_req_drop(bp, req);
  6954. return rc;
  6955. }
  6956. static int bnxt_hwrm_func_qcfg(struct bnxt *bp)
  6957. {
  6958. struct hwrm_func_qcfg_output *resp;
  6959. struct hwrm_func_qcfg_input *req;
  6960. u16 flags;
  6961. int rc;
  6962. rc = hwrm_req_init(bp, req, HWRM_FUNC_QCFG);
  6963. if (rc)
  6964. return rc;
  6965. req->fid = cpu_to_le16(0xffff);
  6966. resp = hwrm_req_hold(bp, req);
  6967. rc = hwrm_req_send(bp, req);
  6968. if (rc)
  6969. goto func_qcfg_exit;
  6970. #ifdef CONFIG_BNXT_SRIOV
  6971. if (BNXT_VF(bp)) {
  6972. struct bnxt_vf_info *vf = &bp->vf;
  6973. vf->vlan = le16_to_cpu(resp->vlan) & VLAN_VID_MASK;
  6974. } else {
  6975. bp->pf.registered_vfs = le16_to_cpu(resp->registered_vfs);
  6976. }
  6977. #endif
  6978. flags = le16_to_cpu(resp->flags);
  6979. if (flags & (FUNC_QCFG_RESP_FLAGS_FW_DCBX_AGENT_ENABLED |
  6980. FUNC_QCFG_RESP_FLAGS_FW_LLDP_AGENT_ENABLED)) {
  6981. bp->fw_cap |= BNXT_FW_CAP_LLDP_AGENT;
  6982. if (flags & FUNC_QCFG_RESP_FLAGS_FW_DCBX_AGENT_ENABLED)
  6983. bp->fw_cap |= BNXT_FW_CAP_DCBX_AGENT;
  6984. }
  6985. if (BNXT_PF(bp) && (flags & FUNC_QCFG_RESP_FLAGS_MULTI_HOST))
  6986. bp->flags |= BNXT_FLAG_MULTI_HOST;
  6987. if (flags & FUNC_QCFG_RESP_FLAGS_RING_MONITOR_ENABLED)
  6988. bp->fw_cap |= BNXT_FW_CAP_RING_MONITOR;
  6989. switch (resp->port_partition_type) {
  6990. case FUNC_QCFG_RESP_PORT_PARTITION_TYPE_NPAR1_0:
  6991. case FUNC_QCFG_RESP_PORT_PARTITION_TYPE_NPAR1_5:
  6992. case FUNC_QCFG_RESP_PORT_PARTITION_TYPE_NPAR2_0:
  6993. bp->port_partition_type = resp->port_partition_type;
  6994. break;
  6995. }
  6996. if (bp->hwrm_spec_code < 0x10707 ||
  6997. resp->evb_mode == FUNC_QCFG_RESP_EVB_MODE_VEB)
  6998. bp->br_mode = BRIDGE_MODE_VEB;
  6999. else if (resp->evb_mode == FUNC_QCFG_RESP_EVB_MODE_VEPA)
  7000. bp->br_mode = BRIDGE_MODE_VEPA;
  7001. else
  7002. bp->br_mode = BRIDGE_MODE_UNDEF;
  7003. bp->max_mtu = le16_to_cpu(resp->max_mtu_configured);
  7004. if (!bp->max_mtu)
  7005. bp->max_mtu = BNXT_MAX_MTU;
  7006. if (bp->db_size)
  7007. goto func_qcfg_exit;
  7008. bp->db_offset = le16_to_cpu(resp->legacy_l2_db_size_kb) * 1024;
  7009. if (BNXT_CHIP_P5(bp)) {
  7010. if (BNXT_PF(bp))
  7011. bp->db_offset = DB_PF_OFFSET_P5;
  7012. else
  7013. bp->db_offset = DB_VF_OFFSET_P5;
  7014. }
  7015. bp->db_size = PAGE_ALIGN(le16_to_cpu(resp->l2_doorbell_bar_size_kb) *
  7016. 1024);
  7017. if (!bp->db_size || bp->db_size > pci_resource_len(bp->pdev, 2) ||
  7018. bp->db_size <= bp->db_offset)
  7019. bp->db_size = pci_resource_len(bp->pdev, 2);
  7020. func_qcfg_exit:
  7021. hwrm_req_drop(bp, req);
  7022. return rc;
  7023. }
  7024. static void bnxt_init_ctx_initializer(struct bnxt_ctx_mem_type *ctxm,
  7025. u8 init_val, u8 init_offset,
  7026. bool init_mask_set)
  7027. {
  7028. ctxm->init_value = init_val;
  7029. ctxm->init_offset = BNXT_CTX_INIT_INVALID_OFFSET;
  7030. if (init_mask_set)
  7031. ctxm->init_offset = init_offset * 4;
  7032. else
  7033. ctxm->init_value = 0;
  7034. }
  7035. static int bnxt_alloc_all_ctx_pg_info(struct bnxt *bp, int ctx_max)
  7036. {
  7037. struct bnxt_ctx_mem_info *ctx = bp->ctx;
  7038. u16 type;
  7039. for (type = 0; type < ctx_max; type++) {
  7040. struct bnxt_ctx_mem_type *ctxm = &ctx->ctx_arr[type];
  7041. int n = 1;
  7042. if (!ctxm->max_entries)
  7043. continue;
  7044. if (ctxm->instance_bmap)
  7045. n = hweight32(ctxm->instance_bmap);
  7046. ctxm->pg_info = kcalloc(n, sizeof(*ctxm->pg_info), GFP_KERNEL);
  7047. if (!ctxm->pg_info)
  7048. return -ENOMEM;
  7049. }
  7050. return 0;
  7051. }
  7052. #define BNXT_CTX_INIT_VALID(flags) \
  7053. (!!((flags) & \
  7054. FUNC_BACKING_STORE_QCAPS_V2_RESP_FLAGS_ENABLE_CTX_KIND_INIT))
  7055. static int bnxt_hwrm_func_backing_store_qcaps_v2(struct bnxt *bp)
  7056. {
  7057. struct hwrm_func_backing_store_qcaps_v2_output *resp;
  7058. struct hwrm_func_backing_store_qcaps_v2_input *req;
  7059. struct bnxt_ctx_mem_info *ctx;
  7060. u16 type;
  7061. int rc;
  7062. rc = hwrm_req_init(bp, req, HWRM_FUNC_BACKING_STORE_QCAPS_V2);
  7063. if (rc)
  7064. return rc;
  7065. ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
  7066. if (!ctx)
  7067. return -ENOMEM;
  7068. bp->ctx = ctx;
  7069. resp = hwrm_req_hold(bp, req);
  7070. for (type = 0; type < BNXT_CTX_V2_MAX; ) {
  7071. struct bnxt_ctx_mem_type *ctxm = &ctx->ctx_arr[type];
  7072. u8 init_val, init_off, i;
  7073. __le32 *p;
  7074. u32 flags;
  7075. req->type = cpu_to_le16(type);
  7076. rc = hwrm_req_send(bp, req);
  7077. if (rc)
  7078. goto ctx_done;
  7079. flags = le32_to_cpu(resp->flags);
  7080. type = le16_to_cpu(resp->next_valid_type);
  7081. if (!(flags & FUNC_BACKING_STORE_QCAPS_V2_RESP_FLAGS_TYPE_VALID))
  7082. continue;
  7083. ctxm->type = le16_to_cpu(resp->type);
  7084. ctxm->entry_size = le16_to_cpu(resp->entry_size);
  7085. ctxm->flags = flags;
  7086. ctxm->instance_bmap = le32_to_cpu(resp->instance_bit_map);
  7087. ctxm->entry_multiple = resp->entry_multiple;
  7088. ctxm->max_entries = le32_to_cpu(resp->max_num_entries);
  7089. ctxm->min_entries = le32_to_cpu(resp->min_num_entries);
  7090. init_val = resp->ctx_init_value;
  7091. init_off = resp->ctx_init_offset;
  7092. bnxt_init_ctx_initializer(ctxm, init_val, init_off,
  7093. BNXT_CTX_INIT_VALID(flags));
  7094. ctxm->split_entry_cnt = min_t(u8, resp->subtype_valid_cnt,
  7095. BNXT_MAX_SPLIT_ENTRY);
  7096. for (i = 0, p = &resp->split_entry_0; i < ctxm->split_entry_cnt;
  7097. i++, p++)
  7098. ctxm->split[i] = le32_to_cpu(*p);
  7099. }
  7100. rc = bnxt_alloc_all_ctx_pg_info(bp, BNXT_CTX_V2_MAX);
  7101. ctx_done:
  7102. hwrm_req_drop(bp, req);
  7103. return rc;
  7104. }
  7105. static int bnxt_hwrm_func_backing_store_qcaps(struct bnxt *bp)
  7106. {
  7107. struct hwrm_func_backing_store_qcaps_output *resp;
  7108. struct hwrm_func_backing_store_qcaps_input *req;
  7109. int rc;
  7110. if (bp->hwrm_spec_code < 0x10902 || BNXT_VF(bp) || bp->ctx)
  7111. return 0;
  7112. if (bp->fw_cap & BNXT_FW_CAP_BACKING_STORE_V2)
  7113. return bnxt_hwrm_func_backing_store_qcaps_v2(bp);
  7114. rc = hwrm_req_init(bp, req, HWRM_FUNC_BACKING_STORE_QCAPS);
  7115. if (rc)
  7116. return rc;
  7117. resp = hwrm_req_hold(bp, req);
  7118. rc = hwrm_req_send_silent(bp, req);
  7119. if (!rc) {
  7120. struct bnxt_ctx_mem_type *ctxm;
  7121. struct bnxt_ctx_mem_info *ctx;
  7122. u8 init_val, init_idx = 0;
  7123. u16 init_mask;
  7124. ctx = bp->ctx;
  7125. if (!ctx) {
  7126. ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
  7127. if (!ctx) {
  7128. rc = -ENOMEM;
  7129. goto ctx_err;
  7130. }
  7131. bp->ctx = ctx;
  7132. }
  7133. init_val = resp->ctx_kind_initializer;
  7134. init_mask = le16_to_cpu(resp->ctx_init_mask);
  7135. ctxm = &ctx->ctx_arr[BNXT_CTX_QP];
  7136. ctxm->max_entries = le32_to_cpu(resp->qp_max_entries);
  7137. ctxm->qp_qp1_entries = le16_to_cpu(resp->qp_min_qp1_entries);
  7138. ctxm->qp_l2_entries = le16_to_cpu(resp->qp_max_l2_entries);
  7139. ctxm->qp_fast_qpmd_entries = le16_to_cpu(resp->fast_qpmd_qp_num_entries);
  7140. ctxm->entry_size = le16_to_cpu(resp->qp_entry_size);
  7141. bnxt_init_ctx_initializer(ctxm, init_val, resp->qp_init_offset,
  7142. (init_mask & (1 << init_idx++)) != 0);
  7143. ctxm = &ctx->ctx_arr[BNXT_CTX_SRQ];
  7144. ctxm->srq_l2_entries = le16_to_cpu(resp->srq_max_l2_entries);
  7145. ctxm->max_entries = le32_to_cpu(resp->srq_max_entries);
  7146. ctxm->entry_size = le16_to_cpu(resp->srq_entry_size);
  7147. bnxt_init_ctx_initializer(ctxm, init_val, resp->srq_init_offset,
  7148. (init_mask & (1 << init_idx++)) != 0);
  7149. ctxm = &ctx->ctx_arr[BNXT_CTX_CQ];
  7150. ctxm->cq_l2_entries = le16_to_cpu(resp->cq_max_l2_entries);
  7151. ctxm->max_entries = le32_to_cpu(resp->cq_max_entries);
  7152. ctxm->entry_size = le16_to_cpu(resp->cq_entry_size);
  7153. bnxt_init_ctx_initializer(ctxm, init_val, resp->cq_init_offset,
  7154. (init_mask & (1 << init_idx++)) != 0);
  7155. ctxm = &ctx->ctx_arr[BNXT_CTX_VNIC];
  7156. ctxm->vnic_entries = le16_to_cpu(resp->vnic_max_vnic_entries);
  7157. ctxm->max_entries = ctxm->vnic_entries +
  7158. le16_to_cpu(resp->vnic_max_ring_table_entries);
  7159. ctxm->entry_size = le16_to_cpu(resp->vnic_entry_size);
  7160. bnxt_init_ctx_initializer(ctxm, init_val,
  7161. resp->vnic_init_offset,
  7162. (init_mask & (1 << init_idx++)) != 0);
  7163. ctxm = &ctx->ctx_arr[BNXT_CTX_STAT];
  7164. ctxm->max_entries = le32_to_cpu(resp->stat_max_entries);
  7165. ctxm->entry_size = le16_to_cpu(resp->stat_entry_size);
  7166. bnxt_init_ctx_initializer(ctxm, init_val,
  7167. resp->stat_init_offset,
  7168. (init_mask & (1 << init_idx++)) != 0);
  7169. ctxm = &ctx->ctx_arr[BNXT_CTX_STQM];
  7170. ctxm->entry_size = le16_to_cpu(resp->tqm_entry_size);
  7171. ctxm->min_entries = le32_to_cpu(resp->tqm_min_entries_per_ring);
  7172. ctxm->max_entries = le32_to_cpu(resp->tqm_max_entries_per_ring);
  7173. ctxm->entry_multiple = resp->tqm_entries_multiple;
  7174. if (!ctxm->entry_multiple)
  7175. ctxm->entry_multiple = 1;
  7176. memcpy(&ctx->ctx_arr[BNXT_CTX_FTQM], ctxm, sizeof(*ctxm));
  7177. ctxm = &ctx->ctx_arr[BNXT_CTX_MRAV];
  7178. ctxm->max_entries = le32_to_cpu(resp->mrav_max_entries);
  7179. ctxm->entry_size = le16_to_cpu(resp->mrav_entry_size);
  7180. ctxm->mrav_num_entries_units =
  7181. le16_to_cpu(resp->mrav_num_entries_units);
  7182. bnxt_init_ctx_initializer(ctxm, init_val,
  7183. resp->mrav_init_offset,
  7184. (init_mask & (1 << init_idx++)) != 0);
  7185. ctxm = &ctx->ctx_arr[BNXT_CTX_TIM];
  7186. ctxm->entry_size = le16_to_cpu(resp->tim_entry_size);
  7187. ctxm->max_entries = le32_to_cpu(resp->tim_max_entries);
  7188. ctx->tqm_fp_rings_count = resp->tqm_fp_rings_count;
  7189. if (!ctx->tqm_fp_rings_count)
  7190. ctx->tqm_fp_rings_count = bp->max_q;
  7191. else if (ctx->tqm_fp_rings_count > BNXT_MAX_TQM_FP_RINGS)
  7192. ctx->tqm_fp_rings_count = BNXT_MAX_TQM_FP_RINGS;
  7193. ctxm = &ctx->ctx_arr[BNXT_CTX_FTQM];
  7194. memcpy(ctxm, &ctx->ctx_arr[BNXT_CTX_STQM], sizeof(*ctxm));
  7195. ctxm->instance_bmap = (1 << ctx->tqm_fp_rings_count) - 1;
  7196. rc = bnxt_alloc_all_ctx_pg_info(bp, BNXT_CTX_MAX);
  7197. } else {
  7198. rc = 0;
  7199. }
  7200. ctx_err:
  7201. hwrm_req_drop(bp, req);
  7202. return rc;
  7203. }
  7204. static void bnxt_hwrm_set_pg_attr(struct bnxt_ring_mem_info *rmem, u8 *pg_attr,
  7205. __le64 *pg_dir)
  7206. {
  7207. if (!rmem->nr_pages)
  7208. return;
  7209. BNXT_SET_CTX_PAGE_ATTR(*pg_attr);
  7210. if (rmem->depth >= 1) {
  7211. if (rmem->depth == 2)
  7212. *pg_attr |= 2;
  7213. else
  7214. *pg_attr |= 1;
  7215. *pg_dir = cpu_to_le64(rmem->pg_tbl_map);
  7216. } else {
  7217. *pg_dir = cpu_to_le64(rmem->dma_arr[0]);
  7218. }
  7219. }
  7220. #define FUNC_BACKING_STORE_CFG_REQ_DFLT_ENABLES \
  7221. (FUNC_BACKING_STORE_CFG_REQ_ENABLES_QP | \
  7222. FUNC_BACKING_STORE_CFG_REQ_ENABLES_SRQ | \
  7223. FUNC_BACKING_STORE_CFG_REQ_ENABLES_CQ | \
  7224. FUNC_BACKING_STORE_CFG_REQ_ENABLES_VNIC | \
  7225. FUNC_BACKING_STORE_CFG_REQ_ENABLES_STAT)
  7226. static int bnxt_hwrm_func_backing_store_cfg(struct bnxt *bp, u32 enables)
  7227. {
  7228. struct hwrm_func_backing_store_cfg_input *req;
  7229. struct bnxt_ctx_mem_info *ctx = bp->ctx;
  7230. struct bnxt_ctx_pg_info *ctx_pg;
  7231. struct bnxt_ctx_mem_type *ctxm;
  7232. void **__req = (void **)&req;
  7233. u32 req_len = sizeof(*req);
  7234. __le32 *num_entries;
  7235. __le64 *pg_dir;
  7236. u32 flags = 0;
  7237. u8 *pg_attr;
  7238. u32 ena;
  7239. int rc;
  7240. int i;
  7241. if (!ctx)
  7242. return 0;
  7243. if (req_len > bp->hwrm_max_ext_req_len)
  7244. req_len = BNXT_BACKING_STORE_CFG_LEGACY_LEN;
  7245. rc = __hwrm_req_init(bp, __req, HWRM_FUNC_BACKING_STORE_CFG, req_len);
  7246. if (rc)
  7247. return rc;
  7248. req->enables = cpu_to_le32(enables);
  7249. if (enables & FUNC_BACKING_STORE_CFG_REQ_ENABLES_QP) {
  7250. ctxm = &ctx->ctx_arr[BNXT_CTX_QP];
  7251. ctx_pg = ctxm->pg_info;
  7252. req->qp_num_entries = cpu_to_le32(ctx_pg->entries);
  7253. req->qp_num_qp1_entries = cpu_to_le16(ctxm->qp_qp1_entries);
  7254. req->qp_num_l2_entries = cpu_to_le16(ctxm->qp_l2_entries);
  7255. req->qp_entry_size = cpu_to_le16(ctxm->entry_size);
  7256. bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem,
  7257. &req->qpc_pg_size_qpc_lvl,
  7258. &req->qpc_page_dir);
  7259. if (enables & FUNC_BACKING_STORE_CFG_REQ_ENABLES_QP_FAST_QPMD)
  7260. req->qp_num_fast_qpmd_entries = cpu_to_le16(ctxm->qp_fast_qpmd_entries);
  7261. }
  7262. if (enables & FUNC_BACKING_STORE_CFG_REQ_ENABLES_SRQ) {
  7263. ctxm = &ctx->ctx_arr[BNXT_CTX_SRQ];
  7264. ctx_pg = ctxm->pg_info;
  7265. req->srq_num_entries = cpu_to_le32(ctx_pg->entries);
  7266. req->srq_num_l2_entries = cpu_to_le16(ctxm->srq_l2_entries);
  7267. req->srq_entry_size = cpu_to_le16(ctxm->entry_size);
  7268. bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem,
  7269. &req->srq_pg_size_srq_lvl,
  7270. &req->srq_page_dir);
  7271. }
  7272. if (enables & FUNC_BACKING_STORE_CFG_REQ_ENABLES_CQ) {
  7273. ctxm = &ctx->ctx_arr[BNXT_CTX_CQ];
  7274. ctx_pg = ctxm->pg_info;
  7275. req->cq_num_entries = cpu_to_le32(ctx_pg->entries);
  7276. req->cq_num_l2_entries = cpu_to_le16(ctxm->cq_l2_entries);
  7277. req->cq_entry_size = cpu_to_le16(ctxm->entry_size);
  7278. bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem,
  7279. &req->cq_pg_size_cq_lvl,
  7280. &req->cq_page_dir);
  7281. }
  7282. if (enables & FUNC_BACKING_STORE_CFG_REQ_ENABLES_VNIC) {
  7283. ctxm = &ctx->ctx_arr[BNXT_CTX_VNIC];
  7284. ctx_pg = ctxm->pg_info;
  7285. req->vnic_num_vnic_entries = cpu_to_le16(ctxm->vnic_entries);
  7286. req->vnic_num_ring_table_entries =
  7287. cpu_to_le16(ctxm->max_entries - ctxm->vnic_entries);
  7288. req->vnic_entry_size = cpu_to_le16(ctxm->entry_size);
  7289. bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem,
  7290. &req->vnic_pg_size_vnic_lvl,
  7291. &req->vnic_page_dir);
  7292. }
  7293. if (enables & FUNC_BACKING_STORE_CFG_REQ_ENABLES_STAT) {
  7294. ctxm = &ctx->ctx_arr[BNXT_CTX_STAT];
  7295. ctx_pg = ctxm->pg_info;
  7296. req->stat_num_entries = cpu_to_le32(ctxm->max_entries);
  7297. req->stat_entry_size = cpu_to_le16(ctxm->entry_size);
  7298. bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem,
  7299. &req->stat_pg_size_stat_lvl,
  7300. &req->stat_page_dir);
  7301. }
  7302. if (enables & FUNC_BACKING_STORE_CFG_REQ_ENABLES_MRAV) {
  7303. u32 units;
  7304. ctxm = &ctx->ctx_arr[BNXT_CTX_MRAV];
  7305. ctx_pg = ctxm->pg_info;
  7306. req->mrav_num_entries = cpu_to_le32(ctx_pg->entries);
  7307. units = ctxm->mrav_num_entries_units;
  7308. if (units) {
  7309. u32 num_mr, num_ah = ctxm->mrav_av_entries;
  7310. u32 entries;
  7311. num_mr = ctx_pg->entries - num_ah;
  7312. entries = ((num_mr / units) << 16) | (num_ah / units);
  7313. req->mrav_num_entries = cpu_to_le32(entries);
  7314. flags |= FUNC_BACKING_STORE_CFG_REQ_FLAGS_MRAV_RESERVATION_SPLIT;
  7315. }
  7316. req->mrav_entry_size = cpu_to_le16(ctxm->entry_size);
  7317. bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem,
  7318. &req->mrav_pg_size_mrav_lvl,
  7319. &req->mrav_page_dir);
  7320. }
  7321. if (enables & FUNC_BACKING_STORE_CFG_REQ_ENABLES_TIM) {
  7322. ctxm = &ctx->ctx_arr[BNXT_CTX_TIM];
  7323. ctx_pg = ctxm->pg_info;
  7324. req->tim_num_entries = cpu_to_le32(ctx_pg->entries);
  7325. req->tim_entry_size = cpu_to_le16(ctxm->entry_size);
  7326. bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem,
  7327. &req->tim_pg_size_tim_lvl,
  7328. &req->tim_page_dir);
  7329. }
  7330. ctxm = &ctx->ctx_arr[BNXT_CTX_STQM];
  7331. for (i = 0, num_entries = &req->tqm_sp_num_entries,
  7332. pg_attr = &req->tqm_sp_pg_size_tqm_sp_lvl,
  7333. pg_dir = &req->tqm_sp_page_dir,
  7334. ena = FUNC_BACKING_STORE_CFG_REQ_ENABLES_TQM_SP,
  7335. ctx_pg = ctxm->pg_info;
  7336. i < BNXT_MAX_TQM_RINGS;
  7337. ctx_pg = &ctx->ctx_arr[BNXT_CTX_FTQM].pg_info[i],
  7338. i++, num_entries++, pg_attr++, pg_dir++, ena <<= 1) {
  7339. if (!(enables & ena))
  7340. continue;
  7341. req->tqm_entry_size = cpu_to_le16(ctxm->entry_size);
  7342. *num_entries = cpu_to_le32(ctx_pg->entries);
  7343. bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem, pg_attr, pg_dir);
  7344. }
  7345. req->flags = cpu_to_le32(flags);
  7346. return hwrm_req_send(bp, req);
  7347. }
  7348. static int bnxt_alloc_ctx_mem_blk(struct bnxt *bp,
  7349. struct bnxt_ctx_pg_info *ctx_pg)
  7350. {
  7351. struct bnxt_ring_mem_info *rmem = &ctx_pg->ring_mem;
  7352. rmem->page_size = BNXT_PAGE_SIZE;
  7353. rmem->pg_arr = ctx_pg->ctx_pg_arr;
  7354. rmem->dma_arr = ctx_pg->ctx_dma_arr;
  7355. rmem->flags = BNXT_RMEM_VALID_PTE_FLAG;
  7356. if (rmem->depth >= 1)
  7357. rmem->flags |= BNXT_RMEM_USE_FULL_PAGE_FLAG;
  7358. return bnxt_alloc_ring(bp, rmem);
  7359. }
  7360. static int bnxt_alloc_ctx_pg_tbls(struct bnxt *bp,
  7361. struct bnxt_ctx_pg_info *ctx_pg, u32 mem_size,
  7362. u8 depth, struct bnxt_ctx_mem_type *ctxm)
  7363. {
  7364. struct bnxt_ring_mem_info *rmem = &ctx_pg->ring_mem;
  7365. int rc;
  7366. if (!mem_size)
  7367. return -EINVAL;
  7368. ctx_pg->nr_pages = DIV_ROUND_UP(mem_size, BNXT_PAGE_SIZE);
  7369. if (ctx_pg->nr_pages > MAX_CTX_TOTAL_PAGES) {
  7370. ctx_pg->nr_pages = 0;
  7371. return -EINVAL;
  7372. }
  7373. if (ctx_pg->nr_pages > MAX_CTX_PAGES || depth > 1) {
  7374. int nr_tbls, i;
  7375. rmem->depth = 2;
  7376. ctx_pg->ctx_pg_tbl = kcalloc(MAX_CTX_PAGES, sizeof(ctx_pg),
  7377. GFP_KERNEL);
  7378. if (!ctx_pg->ctx_pg_tbl)
  7379. return -ENOMEM;
  7380. nr_tbls = DIV_ROUND_UP(ctx_pg->nr_pages, MAX_CTX_PAGES);
  7381. rmem->nr_pages = nr_tbls;
  7382. rc = bnxt_alloc_ctx_mem_blk(bp, ctx_pg);
  7383. if (rc)
  7384. return rc;
  7385. for (i = 0; i < nr_tbls; i++) {
  7386. struct bnxt_ctx_pg_info *pg_tbl;
  7387. pg_tbl = kzalloc(sizeof(*pg_tbl), GFP_KERNEL);
  7388. if (!pg_tbl)
  7389. return -ENOMEM;
  7390. ctx_pg->ctx_pg_tbl[i] = pg_tbl;
  7391. rmem = &pg_tbl->ring_mem;
  7392. rmem->pg_tbl = ctx_pg->ctx_pg_arr[i];
  7393. rmem->pg_tbl_map = ctx_pg->ctx_dma_arr[i];
  7394. rmem->depth = 1;
  7395. rmem->nr_pages = MAX_CTX_PAGES;
  7396. rmem->ctx_mem = ctxm;
  7397. if (i == (nr_tbls - 1)) {
  7398. int rem = ctx_pg->nr_pages % MAX_CTX_PAGES;
  7399. if (rem)
  7400. rmem->nr_pages = rem;
  7401. }
  7402. rc = bnxt_alloc_ctx_mem_blk(bp, pg_tbl);
  7403. if (rc)
  7404. break;
  7405. }
  7406. } else {
  7407. rmem->nr_pages = DIV_ROUND_UP(mem_size, BNXT_PAGE_SIZE);
  7408. if (rmem->nr_pages > 1 || depth)
  7409. rmem->depth = 1;
  7410. rmem->ctx_mem = ctxm;
  7411. rc = bnxt_alloc_ctx_mem_blk(bp, ctx_pg);
  7412. }
  7413. return rc;
  7414. }
  7415. static void bnxt_free_ctx_pg_tbls(struct bnxt *bp,
  7416. struct bnxt_ctx_pg_info *ctx_pg)
  7417. {
  7418. struct bnxt_ring_mem_info *rmem = &ctx_pg->ring_mem;
  7419. if (rmem->depth > 1 || ctx_pg->nr_pages > MAX_CTX_PAGES ||
  7420. ctx_pg->ctx_pg_tbl) {
  7421. int i, nr_tbls = rmem->nr_pages;
  7422. for (i = 0; i < nr_tbls; i++) {
  7423. struct bnxt_ctx_pg_info *pg_tbl;
  7424. struct bnxt_ring_mem_info *rmem2;
  7425. pg_tbl = ctx_pg->ctx_pg_tbl[i];
  7426. if (!pg_tbl)
  7427. continue;
  7428. rmem2 = &pg_tbl->ring_mem;
  7429. bnxt_free_ring(bp, rmem2);
  7430. ctx_pg->ctx_pg_arr[i] = NULL;
  7431. kfree(pg_tbl);
  7432. ctx_pg->ctx_pg_tbl[i] = NULL;
  7433. }
  7434. kfree(ctx_pg->ctx_pg_tbl);
  7435. ctx_pg->ctx_pg_tbl = NULL;
  7436. }
  7437. bnxt_free_ring(bp, rmem);
  7438. ctx_pg->nr_pages = 0;
  7439. }
  7440. static int bnxt_setup_ctxm_pg_tbls(struct bnxt *bp,
  7441. struct bnxt_ctx_mem_type *ctxm, u32 entries,
  7442. u8 pg_lvl)
  7443. {
  7444. struct bnxt_ctx_pg_info *ctx_pg = ctxm->pg_info;
  7445. int i, rc = 0, n = 1;
  7446. u32 mem_size;
  7447. if (!ctxm->entry_size || !ctx_pg)
  7448. return -EINVAL;
  7449. if (ctxm->instance_bmap)
  7450. n = hweight32(ctxm->instance_bmap);
  7451. if (ctxm->entry_multiple)
  7452. entries = roundup(entries, ctxm->entry_multiple);
  7453. entries = clamp_t(u32, entries, ctxm->min_entries, ctxm->max_entries);
  7454. mem_size = entries * ctxm->entry_size;
  7455. for (i = 0; i < n && !rc; i++) {
  7456. ctx_pg[i].entries = entries;
  7457. rc = bnxt_alloc_ctx_pg_tbls(bp, &ctx_pg[i], mem_size, pg_lvl,
  7458. ctxm->init_value ? ctxm : NULL);
  7459. }
  7460. return rc;
  7461. }
  7462. static int bnxt_hwrm_func_backing_store_cfg_v2(struct bnxt *bp,
  7463. struct bnxt_ctx_mem_type *ctxm,
  7464. bool last)
  7465. {
  7466. struct hwrm_func_backing_store_cfg_v2_input *req;
  7467. u32 instance_bmap = ctxm->instance_bmap;
  7468. int i, j, rc = 0, n = 1;
  7469. __le32 *p;
  7470. if (!(ctxm->flags & BNXT_CTX_MEM_TYPE_VALID) || !ctxm->pg_info)
  7471. return 0;
  7472. if (instance_bmap)
  7473. n = hweight32(ctxm->instance_bmap);
  7474. else
  7475. instance_bmap = 1;
  7476. rc = hwrm_req_init(bp, req, HWRM_FUNC_BACKING_STORE_CFG_V2);
  7477. if (rc)
  7478. return rc;
  7479. hwrm_req_hold(bp, req);
  7480. req->type = cpu_to_le16(ctxm->type);
  7481. req->entry_size = cpu_to_le16(ctxm->entry_size);
  7482. req->subtype_valid_cnt = ctxm->split_entry_cnt;
  7483. for (i = 0, p = &req->split_entry_0; i < ctxm->split_entry_cnt; i++)
  7484. p[i] = cpu_to_le32(ctxm->split[i]);
  7485. for (i = 0, j = 0; j < n && !rc; i++) {
  7486. struct bnxt_ctx_pg_info *ctx_pg;
  7487. if (!(instance_bmap & (1 << i)))
  7488. continue;
  7489. req->instance = cpu_to_le16(i);
  7490. ctx_pg = &ctxm->pg_info[j++];
  7491. if (!ctx_pg->entries)
  7492. continue;
  7493. req->num_entries = cpu_to_le32(ctx_pg->entries);
  7494. bnxt_hwrm_set_pg_attr(&ctx_pg->ring_mem,
  7495. &req->page_size_pbl_level,
  7496. &req->page_dir);
  7497. if (last && j == n)
  7498. req->flags =
  7499. cpu_to_le32(FUNC_BACKING_STORE_CFG_V2_REQ_FLAGS_BS_CFG_ALL_DONE);
  7500. rc = hwrm_req_send(bp, req);
  7501. }
  7502. hwrm_req_drop(bp, req);
  7503. return rc;
  7504. }
  7505. static int bnxt_backing_store_cfg_v2(struct bnxt *bp, u32 ena)
  7506. {
  7507. struct bnxt_ctx_mem_info *ctx = bp->ctx;
  7508. struct bnxt_ctx_mem_type *ctxm;
  7509. u16 last_type;
  7510. int rc = 0;
  7511. u16 type;
  7512. if (!ena)
  7513. return 0;
  7514. else if (ena & FUNC_BACKING_STORE_CFG_REQ_ENABLES_TIM)
  7515. last_type = BNXT_CTX_MAX - 1;
  7516. else
  7517. last_type = BNXT_CTX_L2_MAX - 1;
  7518. ctx->ctx_arr[last_type].last = 1;
  7519. for (type = 0 ; type < BNXT_CTX_V2_MAX; type++) {
  7520. ctxm = &ctx->ctx_arr[type];
  7521. rc = bnxt_hwrm_func_backing_store_cfg_v2(bp, ctxm, ctxm->last);
  7522. if (rc)
  7523. return rc;
  7524. }
  7525. return 0;
  7526. }
  7527. void bnxt_free_ctx_mem(struct bnxt *bp)
  7528. {
  7529. struct bnxt_ctx_mem_info *ctx = bp->ctx;
  7530. u16 type;
  7531. if (!ctx)
  7532. return;
  7533. for (type = 0; type < BNXT_CTX_V2_MAX; type++) {
  7534. struct bnxt_ctx_mem_type *ctxm = &ctx->ctx_arr[type];
  7535. struct bnxt_ctx_pg_info *ctx_pg = ctxm->pg_info;
  7536. int i, n = 1;
  7537. if (!ctx_pg)
  7538. continue;
  7539. if (ctxm->instance_bmap)
  7540. n = hweight32(ctxm->instance_bmap);
  7541. for (i = 0; i < n; i++)
  7542. bnxt_free_ctx_pg_tbls(bp, &ctx_pg[i]);
  7543. kfree(ctx_pg);
  7544. ctxm->pg_info = NULL;
  7545. }
  7546. ctx->flags &= ~BNXT_CTX_FLAG_INITED;
  7547. kfree(ctx);
  7548. bp->ctx = NULL;
  7549. }
  7550. static int bnxt_alloc_ctx_mem(struct bnxt *bp)
  7551. {
  7552. struct bnxt_ctx_mem_type *ctxm;
  7553. struct bnxt_ctx_mem_info *ctx;
  7554. u32 l2_qps, qp1_qps, max_qps;
  7555. u32 ena, entries_sp, entries;
  7556. u32 srqs, max_srqs, min;
  7557. u32 num_mr, num_ah;
  7558. u32 extra_srqs = 0;
  7559. u32 extra_qps = 0;
  7560. u32 fast_qpmd_qps;
  7561. u8 pg_lvl = 1;
  7562. int i, rc;
  7563. rc = bnxt_hwrm_func_backing_store_qcaps(bp);
  7564. if (rc) {
  7565. netdev_err(bp->dev, "Failed querying context mem capability, rc = %d.\n",
  7566. rc);
  7567. return rc;
  7568. }
  7569. ctx = bp->ctx;
  7570. if (!ctx || (ctx->flags & BNXT_CTX_FLAG_INITED))
  7571. return 0;
  7572. ctxm = &ctx->ctx_arr[BNXT_CTX_QP];
  7573. l2_qps = ctxm->qp_l2_entries;
  7574. qp1_qps = ctxm->qp_qp1_entries;
  7575. fast_qpmd_qps = ctxm->qp_fast_qpmd_entries;
  7576. max_qps = ctxm->max_entries;
  7577. ctxm = &ctx->ctx_arr[BNXT_CTX_SRQ];
  7578. srqs = ctxm->srq_l2_entries;
  7579. max_srqs = ctxm->max_entries;
  7580. ena = 0;
  7581. if ((bp->flags & BNXT_FLAG_ROCE_CAP) && !is_kdump_kernel()) {
  7582. pg_lvl = 2;
  7583. extra_qps = min_t(u32, 65536, max_qps - l2_qps - qp1_qps);
  7584. /* allocate extra qps if fw supports RoCE fast qp destroy feature */
  7585. extra_qps += fast_qpmd_qps;
  7586. extra_srqs = min_t(u32, 8192, max_srqs - srqs);
  7587. if (fast_qpmd_qps)
  7588. ena |= FUNC_BACKING_STORE_CFG_REQ_ENABLES_QP_FAST_QPMD;
  7589. }
  7590. ctxm = &ctx->ctx_arr[BNXT_CTX_QP];
  7591. rc = bnxt_setup_ctxm_pg_tbls(bp, ctxm, l2_qps + qp1_qps + extra_qps,
  7592. pg_lvl);
  7593. if (rc)
  7594. return rc;
  7595. ctxm = &ctx->ctx_arr[BNXT_CTX_SRQ];
  7596. rc = bnxt_setup_ctxm_pg_tbls(bp, ctxm, srqs + extra_srqs, pg_lvl);
  7597. if (rc)
  7598. return rc;
  7599. ctxm = &ctx->ctx_arr[BNXT_CTX_CQ];
  7600. rc = bnxt_setup_ctxm_pg_tbls(bp, ctxm, ctxm->cq_l2_entries +
  7601. extra_qps * 2, pg_lvl);
  7602. if (rc)
  7603. return rc;
  7604. ctxm = &ctx->ctx_arr[BNXT_CTX_VNIC];
  7605. rc = bnxt_setup_ctxm_pg_tbls(bp, ctxm, ctxm->max_entries, 1);
  7606. if (rc)
  7607. return rc;
  7608. ctxm = &ctx->ctx_arr[BNXT_CTX_STAT];
  7609. rc = bnxt_setup_ctxm_pg_tbls(bp, ctxm, ctxm->max_entries, 1);
  7610. if (rc)
  7611. return rc;
  7612. if (!(bp->flags & BNXT_FLAG_ROCE_CAP))
  7613. goto skip_rdma;
  7614. ctxm = &ctx->ctx_arr[BNXT_CTX_MRAV];
  7615. /* 128K extra is needed to accommodate static AH context
  7616. * allocation by f/w.
  7617. */
  7618. num_mr = min_t(u32, ctxm->max_entries / 2, 1024 * 256);
  7619. num_ah = min_t(u32, num_mr, 1024 * 128);
  7620. ctxm->split_entry_cnt = BNXT_CTX_MRAV_AV_SPLIT_ENTRY + 1;
  7621. if (!ctxm->mrav_av_entries || ctxm->mrav_av_entries > num_ah)
  7622. ctxm->mrav_av_entries = num_ah;
  7623. rc = bnxt_setup_ctxm_pg_tbls(bp, ctxm, num_mr + num_ah, 2);
  7624. if (rc)
  7625. return rc;
  7626. ena |= FUNC_BACKING_STORE_CFG_REQ_ENABLES_MRAV;
  7627. ctxm = &ctx->ctx_arr[BNXT_CTX_TIM];
  7628. rc = bnxt_setup_ctxm_pg_tbls(bp, ctxm, l2_qps + qp1_qps + extra_qps, 1);
  7629. if (rc)
  7630. return rc;
  7631. ena |= FUNC_BACKING_STORE_CFG_REQ_ENABLES_TIM;
  7632. skip_rdma:
  7633. ctxm = &ctx->ctx_arr[BNXT_CTX_STQM];
  7634. min = ctxm->min_entries;
  7635. entries_sp = ctx->ctx_arr[BNXT_CTX_VNIC].vnic_entries + l2_qps +
  7636. 2 * (extra_qps + qp1_qps) + min;
  7637. rc = bnxt_setup_ctxm_pg_tbls(bp, ctxm, entries_sp, 2);
  7638. if (rc)
  7639. return rc;
  7640. ctxm = &ctx->ctx_arr[BNXT_CTX_FTQM];
  7641. entries = l2_qps + 2 * (extra_qps + qp1_qps);
  7642. rc = bnxt_setup_ctxm_pg_tbls(bp, ctxm, entries, 2);
  7643. if (rc)
  7644. return rc;
  7645. for (i = 0; i < ctx->tqm_fp_rings_count + 1; i++)
  7646. ena |= FUNC_BACKING_STORE_CFG_REQ_ENABLES_TQM_SP << i;
  7647. ena |= FUNC_BACKING_STORE_CFG_REQ_DFLT_ENABLES;
  7648. if (bp->fw_cap & BNXT_FW_CAP_BACKING_STORE_V2)
  7649. rc = bnxt_backing_store_cfg_v2(bp, ena);
  7650. else
  7651. rc = bnxt_hwrm_func_backing_store_cfg(bp, ena);
  7652. if (rc) {
  7653. netdev_err(bp->dev, "Failed configuring context mem, rc = %d.\n",
  7654. rc);
  7655. return rc;
  7656. }
  7657. ctx->flags |= BNXT_CTX_FLAG_INITED;
  7658. return 0;
  7659. }
  7660. static int bnxt_hwrm_crash_dump_mem_cfg(struct bnxt *bp)
  7661. {
  7662. struct hwrm_dbg_crashdump_medium_cfg_input *req;
  7663. u16 page_attr;
  7664. int rc;
  7665. if (!(bp->fw_dbg_cap & DBG_QCAPS_RESP_FLAGS_CRASHDUMP_HOST_DDR))
  7666. return 0;
  7667. rc = hwrm_req_init(bp, req, HWRM_DBG_CRASHDUMP_MEDIUM_CFG);
  7668. if (rc)
  7669. return rc;
  7670. if (BNXT_PAGE_SIZE == 0x2000)
  7671. page_attr = DBG_CRASHDUMP_MEDIUM_CFG_REQ_PG_SIZE_PG_8K;
  7672. else if (BNXT_PAGE_SIZE == 0x10000)
  7673. page_attr = DBG_CRASHDUMP_MEDIUM_CFG_REQ_PG_SIZE_PG_64K;
  7674. else
  7675. page_attr = DBG_CRASHDUMP_MEDIUM_CFG_REQ_PG_SIZE_PG_4K;
  7676. req->pg_size_lvl = cpu_to_le16(page_attr |
  7677. bp->fw_crash_mem->ring_mem.depth);
  7678. req->pbl = cpu_to_le64(bp->fw_crash_mem->ring_mem.pg_tbl_map);
  7679. req->size = cpu_to_le32(bp->fw_crash_len);
  7680. req->output_dest_flags = cpu_to_le16(BNXT_DBG_CR_DUMP_MDM_CFG_DDR);
  7681. return hwrm_req_send(bp, req);
  7682. }
  7683. static void bnxt_free_crash_dump_mem(struct bnxt *bp)
  7684. {
  7685. if (bp->fw_crash_mem) {
  7686. bnxt_free_ctx_pg_tbls(bp, bp->fw_crash_mem);
  7687. kfree(bp->fw_crash_mem);
  7688. bp->fw_crash_mem = NULL;
  7689. }
  7690. }
  7691. static int bnxt_alloc_crash_dump_mem(struct bnxt *bp)
  7692. {
  7693. u32 mem_size = 0;
  7694. int rc;
  7695. if (!(bp->fw_dbg_cap & DBG_QCAPS_RESP_FLAGS_CRASHDUMP_HOST_DDR))
  7696. return 0;
  7697. rc = bnxt_hwrm_get_dump_len(bp, BNXT_DUMP_CRASH, &mem_size);
  7698. if (rc)
  7699. return rc;
  7700. mem_size = round_up(mem_size, 4);
  7701. /* keep and use the existing pages */
  7702. if (bp->fw_crash_mem &&
  7703. mem_size <= bp->fw_crash_mem->nr_pages * BNXT_PAGE_SIZE)
  7704. goto alloc_done;
  7705. if (bp->fw_crash_mem)
  7706. bnxt_free_ctx_pg_tbls(bp, bp->fw_crash_mem);
  7707. else
  7708. bp->fw_crash_mem = kzalloc(sizeof(*bp->fw_crash_mem),
  7709. GFP_KERNEL);
  7710. if (!bp->fw_crash_mem)
  7711. return -ENOMEM;
  7712. rc = bnxt_alloc_ctx_pg_tbls(bp, bp->fw_crash_mem, mem_size, 1, NULL);
  7713. if (rc) {
  7714. bnxt_free_crash_dump_mem(bp);
  7715. return rc;
  7716. }
  7717. alloc_done:
  7718. bp->fw_crash_len = mem_size;
  7719. return 0;
  7720. }
  7721. int bnxt_hwrm_func_resc_qcaps(struct bnxt *bp, bool all)
  7722. {
  7723. struct hwrm_func_resource_qcaps_output *resp;
  7724. struct hwrm_func_resource_qcaps_input *req;
  7725. struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
  7726. int rc;
  7727. rc = hwrm_req_init(bp, req, HWRM_FUNC_RESOURCE_QCAPS);
  7728. if (rc)
  7729. return rc;
  7730. req->fid = cpu_to_le16(0xffff);
  7731. resp = hwrm_req_hold(bp, req);
  7732. rc = hwrm_req_send_silent(bp, req);
  7733. if (rc)
  7734. goto hwrm_func_resc_qcaps_exit;
  7735. hw_resc->max_tx_sch_inputs = le16_to_cpu(resp->max_tx_scheduler_inputs);
  7736. if (!all)
  7737. goto hwrm_func_resc_qcaps_exit;
  7738. hw_resc->min_rsscos_ctxs = le16_to_cpu(resp->min_rsscos_ctx);
  7739. hw_resc->max_rsscos_ctxs = le16_to_cpu(resp->max_rsscos_ctx);
  7740. hw_resc->min_cp_rings = le16_to_cpu(resp->min_cmpl_rings);
  7741. hw_resc->max_cp_rings = le16_to_cpu(resp->max_cmpl_rings);
  7742. hw_resc->min_tx_rings = le16_to_cpu(resp->min_tx_rings);
  7743. hw_resc->max_tx_rings = le16_to_cpu(resp->max_tx_rings);
  7744. hw_resc->min_rx_rings = le16_to_cpu(resp->min_rx_rings);
  7745. hw_resc->max_rx_rings = le16_to_cpu(resp->max_rx_rings);
  7746. hw_resc->min_hw_ring_grps = le16_to_cpu(resp->min_hw_ring_grps);
  7747. hw_resc->max_hw_ring_grps = le16_to_cpu(resp->max_hw_ring_grps);
  7748. hw_resc->min_l2_ctxs = le16_to_cpu(resp->min_l2_ctxs);
  7749. hw_resc->max_l2_ctxs = le16_to_cpu(resp->max_l2_ctxs);
  7750. hw_resc->min_vnics = le16_to_cpu(resp->min_vnics);
  7751. hw_resc->max_vnics = le16_to_cpu(resp->max_vnics);
  7752. hw_resc->min_stat_ctxs = le16_to_cpu(resp->min_stat_ctx);
  7753. hw_resc->max_stat_ctxs = le16_to_cpu(resp->max_stat_ctx);
  7754. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  7755. u16 max_msix = le16_to_cpu(resp->max_msix);
  7756. hw_resc->max_nqs = max_msix;
  7757. hw_resc->max_hw_ring_grps = hw_resc->max_rx_rings;
  7758. }
  7759. if (BNXT_PF(bp)) {
  7760. struct bnxt_pf_info *pf = &bp->pf;
  7761. pf->vf_resv_strategy =
  7762. le16_to_cpu(resp->vf_reservation_strategy);
  7763. if (pf->vf_resv_strategy > BNXT_VF_RESV_STRATEGY_MINIMAL_STATIC)
  7764. pf->vf_resv_strategy = BNXT_VF_RESV_STRATEGY_MAXIMAL;
  7765. }
  7766. hwrm_func_resc_qcaps_exit:
  7767. hwrm_req_drop(bp, req);
  7768. return rc;
  7769. }
  7770. static int __bnxt_hwrm_ptp_qcfg(struct bnxt *bp)
  7771. {
  7772. struct hwrm_port_mac_ptp_qcfg_output *resp;
  7773. struct hwrm_port_mac_ptp_qcfg_input *req;
  7774. struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;
  7775. u8 flags;
  7776. int rc;
  7777. if (bp->hwrm_spec_code < 0x10801 || !BNXT_CHIP_P5_PLUS(bp)) {
  7778. rc = -ENODEV;
  7779. goto no_ptp;
  7780. }
  7781. rc = hwrm_req_init(bp, req, HWRM_PORT_MAC_PTP_QCFG);
  7782. if (rc)
  7783. goto no_ptp;
  7784. req->port_id = cpu_to_le16(bp->pf.port_id);
  7785. resp = hwrm_req_hold(bp, req);
  7786. rc = hwrm_req_send(bp, req);
  7787. if (rc)
  7788. goto exit;
  7789. flags = resp->flags;
  7790. if (BNXT_CHIP_P5_AND_MINUS(bp) &&
  7791. !(flags & PORT_MAC_PTP_QCFG_RESP_FLAGS_HWRM_ACCESS)) {
  7792. rc = -ENODEV;
  7793. goto exit;
  7794. }
  7795. if (!ptp) {
  7796. ptp = kzalloc(sizeof(*ptp), GFP_KERNEL);
  7797. if (!ptp) {
  7798. rc = -ENOMEM;
  7799. goto exit;
  7800. }
  7801. ptp->bp = bp;
  7802. bp->ptp_cfg = ptp;
  7803. }
  7804. if (flags &
  7805. (PORT_MAC_PTP_QCFG_RESP_FLAGS_PARTIAL_DIRECT_ACCESS_REF_CLOCK |
  7806. PORT_MAC_PTP_QCFG_RESP_FLAGS_64B_PHC_TIME)) {
  7807. ptp->refclk_regs[0] = le32_to_cpu(resp->ts_ref_clock_reg_lower);
  7808. ptp->refclk_regs[1] = le32_to_cpu(resp->ts_ref_clock_reg_upper);
  7809. } else if (BNXT_CHIP_P5(bp)) {
  7810. ptp->refclk_regs[0] = BNXT_TS_REG_TIMESYNC_TS0_LOWER;
  7811. ptp->refclk_regs[1] = BNXT_TS_REG_TIMESYNC_TS0_UPPER;
  7812. } else {
  7813. rc = -ENODEV;
  7814. goto exit;
  7815. }
  7816. ptp->rtc_configured =
  7817. (flags & PORT_MAC_PTP_QCFG_RESP_FLAGS_RTC_CONFIGURED) != 0;
  7818. rc = bnxt_ptp_init(bp);
  7819. if (rc)
  7820. netdev_warn(bp->dev, "PTP initialization failed.\n");
  7821. exit:
  7822. hwrm_req_drop(bp, req);
  7823. if (!rc)
  7824. return 0;
  7825. no_ptp:
  7826. bnxt_ptp_clear(bp);
  7827. kfree(ptp);
  7828. bp->ptp_cfg = NULL;
  7829. return rc;
  7830. }
  7831. static int __bnxt_hwrm_func_qcaps(struct bnxt *bp)
  7832. {
  7833. struct hwrm_func_qcaps_output *resp;
  7834. struct hwrm_func_qcaps_input *req;
  7835. struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
  7836. u32 flags, flags_ext, flags_ext2;
  7837. int rc;
  7838. rc = hwrm_req_init(bp, req, HWRM_FUNC_QCAPS);
  7839. if (rc)
  7840. return rc;
  7841. req->fid = cpu_to_le16(0xffff);
  7842. resp = hwrm_req_hold(bp, req);
  7843. rc = hwrm_req_send(bp, req);
  7844. if (rc)
  7845. goto hwrm_func_qcaps_exit;
  7846. flags = le32_to_cpu(resp->flags);
  7847. if (flags & FUNC_QCAPS_RESP_FLAGS_ROCE_V1_SUPPORTED)
  7848. bp->flags |= BNXT_FLAG_ROCEV1_CAP;
  7849. if (flags & FUNC_QCAPS_RESP_FLAGS_ROCE_V2_SUPPORTED)
  7850. bp->flags |= BNXT_FLAG_ROCEV2_CAP;
  7851. if (flags & FUNC_QCAPS_RESP_FLAGS_PCIE_STATS_SUPPORTED)
  7852. bp->fw_cap |= BNXT_FW_CAP_PCIE_STATS_SUPPORTED;
  7853. if (flags & FUNC_QCAPS_RESP_FLAGS_HOT_RESET_CAPABLE)
  7854. bp->fw_cap |= BNXT_FW_CAP_HOT_RESET;
  7855. if (flags & FUNC_QCAPS_RESP_FLAGS_EXT_STATS_SUPPORTED)
  7856. bp->fw_cap |= BNXT_FW_CAP_EXT_STATS_SUPPORTED;
  7857. if (flags & FUNC_QCAPS_RESP_FLAGS_ERROR_RECOVERY_CAPABLE)
  7858. bp->fw_cap |= BNXT_FW_CAP_ERROR_RECOVERY;
  7859. if (flags & FUNC_QCAPS_RESP_FLAGS_ERR_RECOVER_RELOAD)
  7860. bp->fw_cap |= BNXT_FW_CAP_ERR_RECOVER_RELOAD;
  7861. if (!(flags & FUNC_QCAPS_RESP_FLAGS_VLAN_ACCELERATION_TX_DISABLED))
  7862. bp->fw_cap |= BNXT_FW_CAP_VLAN_TX_INSERT;
  7863. if (flags & FUNC_QCAPS_RESP_FLAGS_DBG_QCAPS_CMD_SUPPORTED)
  7864. bp->fw_cap |= BNXT_FW_CAP_DBG_QCAPS;
  7865. flags_ext = le32_to_cpu(resp->flags_ext);
  7866. if (flags_ext & FUNC_QCAPS_RESP_FLAGS_EXT_EXT_HW_STATS_SUPPORTED)
  7867. bp->fw_cap |= BNXT_FW_CAP_EXT_HW_STATS_SUPPORTED;
  7868. if (BNXT_PF(bp) && (flags_ext & FUNC_QCAPS_RESP_FLAGS_EXT_PTP_PPS_SUPPORTED))
  7869. bp->fw_cap |= BNXT_FW_CAP_PTP_PPS;
  7870. if (flags_ext & FUNC_QCAPS_RESP_FLAGS_EXT_PTP_64BIT_RTC_SUPPORTED)
  7871. bp->fw_cap |= BNXT_FW_CAP_PTP_RTC;
  7872. if (BNXT_PF(bp) && (flags_ext & FUNC_QCAPS_RESP_FLAGS_EXT_HOT_RESET_IF_SUPPORT))
  7873. bp->fw_cap |= BNXT_FW_CAP_HOT_RESET_IF;
  7874. if (BNXT_PF(bp) && (flags_ext & FUNC_QCAPS_RESP_FLAGS_EXT_FW_LIVEPATCH_SUPPORTED))
  7875. bp->fw_cap |= BNXT_FW_CAP_LIVEPATCH;
  7876. if (BNXT_PF(bp) && (flags_ext & FUNC_QCAPS_RESP_FLAGS_EXT_DFLT_VLAN_TPID_PCP_SUPPORTED))
  7877. bp->fw_cap |= BNXT_FW_CAP_DFLT_VLAN_TPID_PCP;
  7878. if (flags_ext & FUNC_QCAPS_RESP_FLAGS_EXT_BS_V2_SUPPORTED)
  7879. bp->fw_cap |= BNXT_FW_CAP_BACKING_STORE_V2;
  7880. if (flags_ext & FUNC_QCAPS_RESP_FLAGS_EXT_TX_COAL_CMPL_CAP)
  7881. bp->flags |= BNXT_FLAG_TX_COAL_CMPL;
  7882. flags_ext2 = le32_to_cpu(resp->flags_ext2);
  7883. if (flags_ext2 & FUNC_QCAPS_RESP_FLAGS_EXT2_RX_ALL_PKTS_TIMESTAMPS_SUPPORTED)
  7884. bp->fw_cap |= BNXT_FW_CAP_RX_ALL_PKT_TS;
  7885. if (flags_ext2 & FUNC_QCAPS_RESP_FLAGS_EXT2_UDP_GSO_SUPPORTED)
  7886. bp->flags |= BNXT_FLAG_UDP_GSO_CAP;
  7887. if (flags_ext2 & FUNC_QCAPS_RESP_FLAGS_EXT2_TX_PKT_TS_CMPL_SUPPORTED)
  7888. bp->fw_cap |= BNXT_FW_CAP_TX_TS_CMP;
  7889. bp->tx_push_thresh = 0;
  7890. if ((flags & FUNC_QCAPS_RESP_FLAGS_PUSH_MODE_SUPPORTED) &&
  7891. BNXT_FW_MAJ(bp) > 217)
  7892. bp->tx_push_thresh = BNXT_TX_PUSH_THRESH;
  7893. hw_resc->max_rsscos_ctxs = le16_to_cpu(resp->max_rsscos_ctx);
  7894. hw_resc->max_cp_rings = le16_to_cpu(resp->max_cmpl_rings);
  7895. hw_resc->max_tx_rings = le16_to_cpu(resp->max_tx_rings);
  7896. hw_resc->max_rx_rings = le16_to_cpu(resp->max_rx_rings);
  7897. hw_resc->max_hw_ring_grps = le32_to_cpu(resp->max_hw_ring_grps);
  7898. if (!hw_resc->max_hw_ring_grps)
  7899. hw_resc->max_hw_ring_grps = hw_resc->max_tx_rings;
  7900. hw_resc->max_l2_ctxs = le16_to_cpu(resp->max_l2_ctxs);
  7901. hw_resc->max_vnics = le16_to_cpu(resp->max_vnics);
  7902. hw_resc->max_stat_ctxs = le16_to_cpu(resp->max_stat_ctx);
  7903. hw_resc->max_encap_records = le32_to_cpu(resp->max_encap_records);
  7904. hw_resc->max_decap_records = le32_to_cpu(resp->max_decap_records);
  7905. hw_resc->max_tx_em_flows = le32_to_cpu(resp->max_tx_em_flows);
  7906. hw_resc->max_tx_wm_flows = le32_to_cpu(resp->max_tx_wm_flows);
  7907. hw_resc->max_rx_em_flows = le32_to_cpu(resp->max_rx_em_flows);
  7908. hw_resc->max_rx_wm_flows = le32_to_cpu(resp->max_rx_wm_flows);
  7909. if (BNXT_PF(bp)) {
  7910. struct bnxt_pf_info *pf = &bp->pf;
  7911. pf->fw_fid = le16_to_cpu(resp->fid);
  7912. pf->port_id = le16_to_cpu(resp->port_id);
  7913. memcpy(pf->mac_addr, resp->mac_address, ETH_ALEN);
  7914. pf->first_vf_id = le16_to_cpu(resp->first_vf_id);
  7915. pf->max_vfs = le16_to_cpu(resp->max_vfs);
  7916. bp->flags &= ~BNXT_FLAG_WOL_CAP;
  7917. if (flags & FUNC_QCAPS_RESP_FLAGS_WOL_MAGICPKT_SUPPORTED)
  7918. bp->flags |= BNXT_FLAG_WOL_CAP;
  7919. if (flags & FUNC_QCAPS_RESP_FLAGS_PTP_SUPPORTED) {
  7920. bp->fw_cap |= BNXT_FW_CAP_PTP;
  7921. } else {
  7922. bnxt_ptp_clear(bp);
  7923. kfree(bp->ptp_cfg);
  7924. bp->ptp_cfg = NULL;
  7925. }
  7926. } else {
  7927. #ifdef CONFIG_BNXT_SRIOV
  7928. struct bnxt_vf_info *vf = &bp->vf;
  7929. vf->fw_fid = le16_to_cpu(resp->fid);
  7930. memcpy(vf->mac_addr, resp->mac_address, ETH_ALEN);
  7931. #endif
  7932. }
  7933. bp->tso_max_segs = le16_to_cpu(resp->max_tso_segs);
  7934. hwrm_func_qcaps_exit:
  7935. hwrm_req_drop(bp, req);
  7936. return rc;
  7937. }
  7938. static void bnxt_hwrm_dbg_qcaps(struct bnxt *bp)
  7939. {
  7940. struct hwrm_dbg_qcaps_output *resp;
  7941. struct hwrm_dbg_qcaps_input *req;
  7942. int rc;
  7943. bp->fw_dbg_cap = 0;
  7944. if (!(bp->fw_cap & BNXT_FW_CAP_DBG_QCAPS))
  7945. return;
  7946. rc = hwrm_req_init(bp, req, HWRM_DBG_QCAPS);
  7947. if (rc)
  7948. return;
  7949. req->fid = cpu_to_le16(0xffff);
  7950. resp = hwrm_req_hold(bp, req);
  7951. rc = hwrm_req_send(bp, req);
  7952. if (rc)
  7953. goto hwrm_dbg_qcaps_exit;
  7954. bp->fw_dbg_cap = le32_to_cpu(resp->flags);
  7955. hwrm_dbg_qcaps_exit:
  7956. hwrm_req_drop(bp, req);
  7957. }
  7958. static int bnxt_hwrm_queue_qportcfg(struct bnxt *bp);
  7959. int bnxt_hwrm_func_qcaps(struct bnxt *bp)
  7960. {
  7961. int rc;
  7962. rc = __bnxt_hwrm_func_qcaps(bp);
  7963. if (rc)
  7964. return rc;
  7965. bnxt_hwrm_dbg_qcaps(bp);
  7966. rc = bnxt_hwrm_queue_qportcfg(bp);
  7967. if (rc) {
  7968. netdev_err(bp->dev, "hwrm query qportcfg failure rc: %d\n", rc);
  7969. return rc;
  7970. }
  7971. if (bp->hwrm_spec_code >= 0x10803) {
  7972. rc = bnxt_alloc_ctx_mem(bp);
  7973. if (rc)
  7974. return rc;
  7975. rc = bnxt_hwrm_func_resc_qcaps(bp, true);
  7976. if (!rc)
  7977. bp->fw_cap |= BNXT_FW_CAP_NEW_RM;
  7978. }
  7979. return 0;
  7980. }
  7981. static int bnxt_hwrm_cfa_adv_flow_mgnt_qcaps(struct bnxt *bp)
  7982. {
  7983. struct hwrm_cfa_adv_flow_mgnt_qcaps_output *resp;
  7984. struct hwrm_cfa_adv_flow_mgnt_qcaps_input *req;
  7985. u32 flags;
  7986. int rc;
  7987. if (!(bp->fw_cap & BNXT_FW_CAP_CFA_ADV_FLOW))
  7988. return 0;
  7989. rc = hwrm_req_init(bp, req, HWRM_CFA_ADV_FLOW_MGNT_QCAPS);
  7990. if (rc)
  7991. return rc;
  7992. resp = hwrm_req_hold(bp, req);
  7993. rc = hwrm_req_send(bp, req);
  7994. if (rc)
  7995. goto hwrm_cfa_adv_qcaps_exit;
  7996. flags = le32_to_cpu(resp->flags);
  7997. if (flags &
  7998. CFA_ADV_FLOW_MGNT_QCAPS_RESP_FLAGS_RFS_RING_TBL_IDX_V2_SUPPORTED)
  7999. bp->fw_cap |= BNXT_FW_CAP_CFA_RFS_RING_TBL_IDX_V2;
  8000. if (flags &
  8001. CFA_ADV_FLOW_MGNT_QCAPS_RESP_FLAGS_RFS_RING_TBL_IDX_V3_SUPPORTED)
  8002. bp->fw_cap |= BNXT_FW_CAP_CFA_RFS_RING_TBL_IDX_V3;
  8003. if (flags &
  8004. CFA_ADV_FLOW_MGNT_QCAPS_RESP_FLAGS_NTUPLE_FLOW_RX_EXT_IP_PROTO_SUPPORTED)
  8005. bp->fw_cap |= BNXT_FW_CAP_CFA_NTUPLE_RX_EXT_IP_PROTO;
  8006. hwrm_cfa_adv_qcaps_exit:
  8007. hwrm_req_drop(bp, req);
  8008. return rc;
  8009. }
  8010. static int __bnxt_alloc_fw_health(struct bnxt *bp)
  8011. {
  8012. if (bp->fw_health)
  8013. return 0;
  8014. bp->fw_health = kzalloc(sizeof(*bp->fw_health), GFP_KERNEL);
  8015. if (!bp->fw_health)
  8016. return -ENOMEM;
  8017. mutex_init(&bp->fw_health->lock);
  8018. return 0;
  8019. }
  8020. static int bnxt_alloc_fw_health(struct bnxt *bp)
  8021. {
  8022. int rc;
  8023. if (!(bp->fw_cap & BNXT_FW_CAP_HOT_RESET) &&
  8024. !(bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY))
  8025. return 0;
  8026. rc = __bnxt_alloc_fw_health(bp);
  8027. if (rc) {
  8028. bp->fw_cap &= ~BNXT_FW_CAP_HOT_RESET;
  8029. bp->fw_cap &= ~BNXT_FW_CAP_ERROR_RECOVERY;
  8030. return rc;
  8031. }
  8032. return 0;
  8033. }
  8034. static void __bnxt_map_fw_health_reg(struct bnxt *bp, u32 reg)
  8035. {
  8036. writel(reg & BNXT_GRC_BASE_MASK, bp->bar0 +
  8037. BNXT_GRCPF_REG_WINDOW_BASE_OUT +
  8038. BNXT_FW_HEALTH_WIN_MAP_OFF);
  8039. }
  8040. static void bnxt_inv_fw_health_reg(struct bnxt *bp)
  8041. {
  8042. struct bnxt_fw_health *fw_health = bp->fw_health;
  8043. u32 reg_type;
  8044. if (!fw_health)
  8045. return;
  8046. reg_type = BNXT_FW_HEALTH_REG_TYPE(fw_health->regs[BNXT_FW_HEALTH_REG]);
  8047. if (reg_type == BNXT_FW_HEALTH_REG_TYPE_GRC)
  8048. fw_health->status_reliable = false;
  8049. reg_type = BNXT_FW_HEALTH_REG_TYPE(fw_health->regs[BNXT_FW_RESET_CNT_REG]);
  8050. if (reg_type == BNXT_FW_HEALTH_REG_TYPE_GRC)
  8051. fw_health->resets_reliable = false;
  8052. }
  8053. static void bnxt_try_map_fw_health_reg(struct bnxt *bp)
  8054. {
  8055. void __iomem *hs;
  8056. u32 status_loc;
  8057. u32 reg_type;
  8058. u32 sig;
  8059. if (bp->fw_health)
  8060. bp->fw_health->status_reliable = false;
  8061. __bnxt_map_fw_health_reg(bp, HCOMM_STATUS_STRUCT_LOC);
  8062. hs = bp->bar0 + BNXT_FW_HEALTH_WIN_OFF(HCOMM_STATUS_STRUCT_LOC);
  8063. sig = readl(hs + offsetof(struct hcomm_status, sig_ver));
  8064. if ((sig & HCOMM_STATUS_SIGNATURE_MASK) != HCOMM_STATUS_SIGNATURE_VAL) {
  8065. if (!bp->chip_num) {
  8066. __bnxt_map_fw_health_reg(bp, BNXT_GRC_REG_BASE);
  8067. bp->chip_num = readl(bp->bar0 +
  8068. BNXT_FW_HEALTH_WIN_BASE +
  8069. BNXT_GRC_REG_CHIP_NUM);
  8070. }
  8071. if (!BNXT_CHIP_P5_PLUS(bp))
  8072. return;
  8073. status_loc = BNXT_GRC_REG_STATUS_P5 |
  8074. BNXT_FW_HEALTH_REG_TYPE_BAR0;
  8075. } else {
  8076. status_loc = readl(hs + offsetof(struct hcomm_status,
  8077. fw_status_loc));
  8078. }
  8079. if (__bnxt_alloc_fw_health(bp)) {
  8080. netdev_warn(bp->dev, "no memory for firmware status checks\n");
  8081. return;
  8082. }
  8083. bp->fw_health->regs[BNXT_FW_HEALTH_REG] = status_loc;
  8084. reg_type = BNXT_FW_HEALTH_REG_TYPE(status_loc);
  8085. if (reg_type == BNXT_FW_HEALTH_REG_TYPE_GRC) {
  8086. __bnxt_map_fw_health_reg(bp, status_loc);
  8087. bp->fw_health->mapped_regs[BNXT_FW_HEALTH_REG] =
  8088. BNXT_FW_HEALTH_WIN_OFF(status_loc);
  8089. }
  8090. bp->fw_health->status_reliable = true;
  8091. }
  8092. static int bnxt_map_fw_health_regs(struct bnxt *bp)
  8093. {
  8094. struct bnxt_fw_health *fw_health = bp->fw_health;
  8095. u32 reg_base = 0xffffffff;
  8096. int i;
  8097. bp->fw_health->status_reliable = false;
  8098. bp->fw_health->resets_reliable = false;
  8099. /* Only pre-map the monitoring GRC registers using window 3 */
  8100. for (i = 0; i < 4; i++) {
  8101. u32 reg = fw_health->regs[i];
  8102. if (BNXT_FW_HEALTH_REG_TYPE(reg) != BNXT_FW_HEALTH_REG_TYPE_GRC)
  8103. continue;
  8104. if (reg_base == 0xffffffff)
  8105. reg_base = reg & BNXT_GRC_BASE_MASK;
  8106. if ((reg & BNXT_GRC_BASE_MASK) != reg_base)
  8107. return -ERANGE;
  8108. fw_health->mapped_regs[i] = BNXT_FW_HEALTH_WIN_OFF(reg);
  8109. }
  8110. bp->fw_health->status_reliable = true;
  8111. bp->fw_health->resets_reliable = true;
  8112. if (reg_base == 0xffffffff)
  8113. return 0;
  8114. __bnxt_map_fw_health_reg(bp, reg_base);
  8115. return 0;
  8116. }
  8117. static void bnxt_remap_fw_health_regs(struct bnxt *bp)
  8118. {
  8119. if (!bp->fw_health)
  8120. return;
  8121. if (bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY) {
  8122. bp->fw_health->status_reliable = true;
  8123. bp->fw_health->resets_reliable = true;
  8124. } else {
  8125. bnxt_try_map_fw_health_reg(bp);
  8126. }
  8127. }
  8128. static int bnxt_hwrm_error_recovery_qcfg(struct bnxt *bp)
  8129. {
  8130. struct bnxt_fw_health *fw_health = bp->fw_health;
  8131. struct hwrm_error_recovery_qcfg_output *resp;
  8132. struct hwrm_error_recovery_qcfg_input *req;
  8133. int rc, i;
  8134. if (!(bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY))
  8135. return 0;
  8136. rc = hwrm_req_init(bp, req, HWRM_ERROR_RECOVERY_QCFG);
  8137. if (rc)
  8138. return rc;
  8139. resp = hwrm_req_hold(bp, req);
  8140. rc = hwrm_req_send(bp, req);
  8141. if (rc)
  8142. goto err_recovery_out;
  8143. fw_health->flags = le32_to_cpu(resp->flags);
  8144. if ((fw_health->flags & ERROR_RECOVERY_QCFG_RESP_FLAGS_CO_CPU) &&
  8145. !(bp->fw_cap & BNXT_FW_CAP_KONG_MB_CHNL)) {
  8146. rc = -EINVAL;
  8147. goto err_recovery_out;
  8148. }
  8149. fw_health->polling_dsecs = le32_to_cpu(resp->driver_polling_freq);
  8150. fw_health->master_func_wait_dsecs =
  8151. le32_to_cpu(resp->master_func_wait_period);
  8152. fw_health->normal_func_wait_dsecs =
  8153. le32_to_cpu(resp->normal_func_wait_period);
  8154. fw_health->post_reset_wait_dsecs =
  8155. le32_to_cpu(resp->master_func_wait_period_after_reset);
  8156. fw_health->post_reset_max_wait_dsecs =
  8157. le32_to_cpu(resp->max_bailout_time_after_reset);
  8158. fw_health->regs[BNXT_FW_HEALTH_REG] =
  8159. le32_to_cpu(resp->fw_health_status_reg);
  8160. fw_health->regs[BNXT_FW_HEARTBEAT_REG] =
  8161. le32_to_cpu(resp->fw_heartbeat_reg);
  8162. fw_health->regs[BNXT_FW_RESET_CNT_REG] =
  8163. le32_to_cpu(resp->fw_reset_cnt_reg);
  8164. fw_health->regs[BNXT_FW_RESET_INPROG_REG] =
  8165. le32_to_cpu(resp->reset_inprogress_reg);
  8166. fw_health->fw_reset_inprog_reg_mask =
  8167. le32_to_cpu(resp->reset_inprogress_reg_mask);
  8168. fw_health->fw_reset_seq_cnt = resp->reg_array_cnt;
  8169. if (fw_health->fw_reset_seq_cnt >= 16) {
  8170. rc = -EINVAL;
  8171. goto err_recovery_out;
  8172. }
  8173. for (i = 0; i < fw_health->fw_reset_seq_cnt; i++) {
  8174. fw_health->fw_reset_seq_regs[i] =
  8175. le32_to_cpu(resp->reset_reg[i]);
  8176. fw_health->fw_reset_seq_vals[i] =
  8177. le32_to_cpu(resp->reset_reg_val[i]);
  8178. fw_health->fw_reset_seq_delay_msec[i] =
  8179. resp->delay_after_reset[i];
  8180. }
  8181. err_recovery_out:
  8182. hwrm_req_drop(bp, req);
  8183. if (!rc)
  8184. rc = bnxt_map_fw_health_regs(bp);
  8185. if (rc)
  8186. bp->fw_cap &= ~BNXT_FW_CAP_ERROR_RECOVERY;
  8187. return rc;
  8188. }
  8189. static int bnxt_hwrm_func_reset(struct bnxt *bp)
  8190. {
  8191. struct hwrm_func_reset_input *req;
  8192. int rc;
  8193. rc = hwrm_req_init(bp, req, HWRM_FUNC_RESET);
  8194. if (rc)
  8195. return rc;
  8196. req->enables = 0;
  8197. hwrm_req_timeout(bp, req, HWRM_RESET_TIMEOUT);
  8198. return hwrm_req_send(bp, req);
  8199. }
  8200. static void bnxt_nvm_cfg_ver_get(struct bnxt *bp)
  8201. {
  8202. struct hwrm_nvm_get_dev_info_output nvm_info;
  8203. if (!bnxt_hwrm_nvm_get_dev_info(bp, &nvm_info))
  8204. snprintf(bp->nvm_cfg_ver, FW_VER_STR_LEN, "%d.%d.%d",
  8205. nvm_info.nvm_cfg_ver_maj, nvm_info.nvm_cfg_ver_min,
  8206. nvm_info.nvm_cfg_ver_upd);
  8207. }
  8208. static int bnxt_hwrm_queue_qportcfg(struct bnxt *bp)
  8209. {
  8210. struct hwrm_queue_qportcfg_output *resp;
  8211. struct hwrm_queue_qportcfg_input *req;
  8212. u8 i, j, *qptr;
  8213. bool no_rdma;
  8214. int rc = 0;
  8215. rc = hwrm_req_init(bp, req, HWRM_QUEUE_QPORTCFG);
  8216. if (rc)
  8217. return rc;
  8218. resp = hwrm_req_hold(bp, req);
  8219. rc = hwrm_req_send(bp, req);
  8220. if (rc)
  8221. goto qportcfg_exit;
  8222. if (!resp->max_configurable_queues) {
  8223. rc = -EINVAL;
  8224. goto qportcfg_exit;
  8225. }
  8226. bp->max_tc = resp->max_configurable_queues;
  8227. bp->max_lltc = resp->max_configurable_lossless_queues;
  8228. if (bp->max_tc > BNXT_MAX_QUEUE)
  8229. bp->max_tc = BNXT_MAX_QUEUE;
  8230. no_rdma = !(bp->flags & BNXT_FLAG_ROCE_CAP);
  8231. qptr = &resp->queue_id0;
  8232. for (i = 0, j = 0; i < bp->max_tc; i++) {
  8233. bp->q_info[j].queue_id = *qptr;
  8234. bp->q_ids[i] = *qptr++;
  8235. bp->q_info[j].queue_profile = *qptr++;
  8236. bp->tc_to_qidx[j] = j;
  8237. if (!BNXT_CNPQ(bp->q_info[j].queue_profile) ||
  8238. (no_rdma && BNXT_PF(bp)))
  8239. j++;
  8240. }
  8241. bp->max_q = bp->max_tc;
  8242. bp->max_tc = max_t(u8, j, 1);
  8243. if (resp->queue_cfg_info & QUEUE_QPORTCFG_RESP_QUEUE_CFG_INFO_ASYM_CFG)
  8244. bp->max_tc = 1;
  8245. if (bp->max_lltc > bp->max_tc)
  8246. bp->max_lltc = bp->max_tc;
  8247. qportcfg_exit:
  8248. hwrm_req_drop(bp, req);
  8249. return rc;
  8250. }
  8251. static int bnxt_hwrm_poll(struct bnxt *bp)
  8252. {
  8253. struct hwrm_ver_get_input *req;
  8254. int rc;
  8255. rc = hwrm_req_init(bp, req, HWRM_VER_GET);
  8256. if (rc)
  8257. return rc;
  8258. req->hwrm_intf_maj = HWRM_VERSION_MAJOR;
  8259. req->hwrm_intf_min = HWRM_VERSION_MINOR;
  8260. req->hwrm_intf_upd = HWRM_VERSION_UPDATE;
  8261. hwrm_req_flags(bp, req, BNXT_HWRM_CTX_SILENT | BNXT_HWRM_FULL_WAIT);
  8262. rc = hwrm_req_send(bp, req);
  8263. return rc;
  8264. }
  8265. static int bnxt_hwrm_ver_get(struct bnxt *bp)
  8266. {
  8267. struct hwrm_ver_get_output *resp;
  8268. struct hwrm_ver_get_input *req;
  8269. u16 fw_maj, fw_min, fw_bld, fw_rsv;
  8270. u32 dev_caps_cfg, hwrm_ver;
  8271. int rc, len;
  8272. rc = hwrm_req_init(bp, req, HWRM_VER_GET);
  8273. if (rc)
  8274. return rc;
  8275. hwrm_req_flags(bp, req, BNXT_HWRM_FULL_WAIT);
  8276. bp->hwrm_max_req_len = HWRM_MAX_REQ_LEN;
  8277. req->hwrm_intf_maj = HWRM_VERSION_MAJOR;
  8278. req->hwrm_intf_min = HWRM_VERSION_MINOR;
  8279. req->hwrm_intf_upd = HWRM_VERSION_UPDATE;
  8280. resp = hwrm_req_hold(bp, req);
  8281. rc = hwrm_req_send(bp, req);
  8282. if (rc)
  8283. goto hwrm_ver_get_exit;
  8284. memcpy(&bp->ver_resp, resp, sizeof(struct hwrm_ver_get_output));
  8285. bp->hwrm_spec_code = resp->hwrm_intf_maj_8b << 16 |
  8286. resp->hwrm_intf_min_8b << 8 |
  8287. resp->hwrm_intf_upd_8b;
  8288. if (resp->hwrm_intf_maj_8b < 1) {
  8289. netdev_warn(bp->dev, "HWRM interface %d.%d.%d is older than 1.0.0.\n",
  8290. resp->hwrm_intf_maj_8b, resp->hwrm_intf_min_8b,
  8291. resp->hwrm_intf_upd_8b);
  8292. netdev_warn(bp->dev, "Please update firmware with HWRM interface 1.0.0 or newer.\n");
  8293. }
  8294. hwrm_ver = HWRM_VERSION_MAJOR << 16 | HWRM_VERSION_MINOR << 8 |
  8295. HWRM_VERSION_UPDATE;
  8296. if (bp->hwrm_spec_code > hwrm_ver)
  8297. snprintf(bp->hwrm_ver_supp, FW_VER_STR_LEN, "%d.%d.%d",
  8298. HWRM_VERSION_MAJOR, HWRM_VERSION_MINOR,
  8299. HWRM_VERSION_UPDATE);
  8300. else
  8301. snprintf(bp->hwrm_ver_supp, FW_VER_STR_LEN, "%d.%d.%d",
  8302. resp->hwrm_intf_maj_8b, resp->hwrm_intf_min_8b,
  8303. resp->hwrm_intf_upd_8b);
  8304. fw_maj = le16_to_cpu(resp->hwrm_fw_major);
  8305. if (bp->hwrm_spec_code > 0x10803 && fw_maj) {
  8306. fw_min = le16_to_cpu(resp->hwrm_fw_minor);
  8307. fw_bld = le16_to_cpu(resp->hwrm_fw_build);
  8308. fw_rsv = le16_to_cpu(resp->hwrm_fw_patch);
  8309. len = FW_VER_STR_LEN;
  8310. } else {
  8311. fw_maj = resp->hwrm_fw_maj_8b;
  8312. fw_min = resp->hwrm_fw_min_8b;
  8313. fw_bld = resp->hwrm_fw_bld_8b;
  8314. fw_rsv = resp->hwrm_fw_rsvd_8b;
  8315. len = BC_HWRM_STR_LEN;
  8316. }
  8317. bp->fw_ver_code = BNXT_FW_VER_CODE(fw_maj, fw_min, fw_bld, fw_rsv);
  8318. snprintf(bp->fw_ver_str, len, "%d.%d.%d.%d", fw_maj, fw_min, fw_bld,
  8319. fw_rsv);
  8320. if (strlen(resp->active_pkg_name)) {
  8321. int fw_ver_len = strlen(bp->fw_ver_str);
  8322. snprintf(bp->fw_ver_str + fw_ver_len,
  8323. FW_VER_STR_LEN - fw_ver_len - 1, "/pkg %s",
  8324. resp->active_pkg_name);
  8325. bp->fw_cap |= BNXT_FW_CAP_PKG_VER;
  8326. }
  8327. bp->hwrm_cmd_timeout = le16_to_cpu(resp->def_req_timeout);
  8328. if (!bp->hwrm_cmd_timeout)
  8329. bp->hwrm_cmd_timeout = DFLT_HWRM_CMD_TIMEOUT;
  8330. bp->hwrm_cmd_max_timeout = le16_to_cpu(resp->max_req_timeout) * 1000;
  8331. if (!bp->hwrm_cmd_max_timeout)
  8332. bp->hwrm_cmd_max_timeout = HWRM_CMD_MAX_TIMEOUT;
  8333. else if (bp->hwrm_cmd_max_timeout > HWRM_CMD_MAX_TIMEOUT)
  8334. netdev_warn(bp->dev, "Device requests max timeout of %d seconds, may trigger hung task watchdog\n",
  8335. bp->hwrm_cmd_max_timeout / 1000);
  8336. if (resp->hwrm_intf_maj_8b >= 1) {
  8337. bp->hwrm_max_req_len = le16_to_cpu(resp->max_req_win_len);
  8338. bp->hwrm_max_ext_req_len = le16_to_cpu(resp->max_ext_req_len);
  8339. }
  8340. if (bp->hwrm_max_ext_req_len < HWRM_MAX_REQ_LEN)
  8341. bp->hwrm_max_ext_req_len = HWRM_MAX_REQ_LEN;
  8342. bp->chip_num = le16_to_cpu(resp->chip_num);
  8343. bp->chip_rev = resp->chip_rev;
  8344. if (bp->chip_num == CHIP_NUM_58700 && !resp->chip_rev &&
  8345. !resp->chip_metal)
  8346. bp->flags |= BNXT_FLAG_CHIP_NITRO_A0;
  8347. dev_caps_cfg = le32_to_cpu(resp->dev_caps_cfg);
  8348. if ((dev_caps_cfg & VER_GET_RESP_DEV_CAPS_CFG_SHORT_CMD_SUPPORTED) &&
  8349. (dev_caps_cfg & VER_GET_RESP_DEV_CAPS_CFG_SHORT_CMD_REQUIRED))
  8350. bp->fw_cap |= BNXT_FW_CAP_SHORT_CMD;
  8351. if (dev_caps_cfg & VER_GET_RESP_DEV_CAPS_CFG_KONG_MB_CHNL_SUPPORTED)
  8352. bp->fw_cap |= BNXT_FW_CAP_KONG_MB_CHNL;
  8353. if (dev_caps_cfg &
  8354. VER_GET_RESP_DEV_CAPS_CFG_FLOW_HANDLE_64BIT_SUPPORTED)
  8355. bp->fw_cap |= BNXT_FW_CAP_OVS_64BIT_HANDLE;
  8356. if (dev_caps_cfg &
  8357. VER_GET_RESP_DEV_CAPS_CFG_TRUSTED_VF_SUPPORTED)
  8358. bp->fw_cap |= BNXT_FW_CAP_TRUSTED_VF;
  8359. if (dev_caps_cfg &
  8360. VER_GET_RESP_DEV_CAPS_CFG_CFA_ADV_FLOW_MGNT_SUPPORTED)
  8361. bp->fw_cap |= BNXT_FW_CAP_CFA_ADV_FLOW;
  8362. hwrm_ver_get_exit:
  8363. hwrm_req_drop(bp, req);
  8364. return rc;
  8365. }
  8366. int bnxt_hwrm_fw_set_time(struct bnxt *bp)
  8367. {
  8368. struct hwrm_fw_set_time_input *req;
  8369. struct tm tm;
  8370. time64_t now = ktime_get_real_seconds();
  8371. int rc;
  8372. if ((BNXT_VF(bp) && bp->hwrm_spec_code < 0x10901) ||
  8373. bp->hwrm_spec_code < 0x10400)
  8374. return -EOPNOTSUPP;
  8375. time64_to_tm(now, 0, &tm);
  8376. rc = hwrm_req_init(bp, req, HWRM_FW_SET_TIME);
  8377. if (rc)
  8378. return rc;
  8379. req->year = cpu_to_le16(1900 + tm.tm_year);
  8380. req->month = 1 + tm.tm_mon;
  8381. req->day = tm.tm_mday;
  8382. req->hour = tm.tm_hour;
  8383. req->minute = tm.tm_min;
  8384. req->second = tm.tm_sec;
  8385. return hwrm_req_send(bp, req);
  8386. }
  8387. static void bnxt_add_one_ctr(u64 hw, u64 *sw, u64 mask)
  8388. {
  8389. u64 sw_tmp;
  8390. hw &= mask;
  8391. sw_tmp = (*sw & ~mask) | hw;
  8392. if (hw < (*sw & mask))
  8393. sw_tmp += mask + 1;
  8394. WRITE_ONCE(*sw, sw_tmp);
  8395. }
  8396. static void __bnxt_accumulate_stats(__le64 *hw_stats, u64 *sw_stats, u64 *masks,
  8397. int count, bool ignore_zero)
  8398. {
  8399. int i;
  8400. for (i = 0; i < count; i++) {
  8401. u64 hw = le64_to_cpu(READ_ONCE(hw_stats[i]));
  8402. if (ignore_zero && !hw)
  8403. continue;
  8404. if (masks[i] == -1ULL)
  8405. sw_stats[i] = hw;
  8406. else
  8407. bnxt_add_one_ctr(hw, &sw_stats[i], masks[i]);
  8408. }
  8409. }
  8410. static void bnxt_accumulate_stats(struct bnxt_stats_mem *stats)
  8411. {
  8412. if (!stats->hw_stats)
  8413. return;
  8414. __bnxt_accumulate_stats(stats->hw_stats, stats->sw_stats,
  8415. stats->hw_masks, stats->len / 8, false);
  8416. }
  8417. static void bnxt_accumulate_all_stats(struct bnxt *bp)
  8418. {
  8419. struct bnxt_stats_mem *ring0_stats;
  8420. bool ignore_zero = false;
  8421. int i;
  8422. /* Chip bug. Counter intermittently becomes 0. */
  8423. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  8424. ignore_zero = true;
  8425. for (i = 0; i < bp->cp_nr_rings; i++) {
  8426. struct bnxt_napi *bnapi = bp->bnapi[i];
  8427. struct bnxt_cp_ring_info *cpr;
  8428. struct bnxt_stats_mem *stats;
  8429. cpr = &bnapi->cp_ring;
  8430. stats = &cpr->stats;
  8431. if (!i)
  8432. ring0_stats = stats;
  8433. __bnxt_accumulate_stats(stats->hw_stats, stats->sw_stats,
  8434. ring0_stats->hw_masks,
  8435. ring0_stats->len / 8, ignore_zero);
  8436. }
  8437. if (bp->flags & BNXT_FLAG_PORT_STATS) {
  8438. struct bnxt_stats_mem *stats = &bp->port_stats;
  8439. __le64 *hw_stats = stats->hw_stats;
  8440. u64 *sw_stats = stats->sw_stats;
  8441. u64 *masks = stats->hw_masks;
  8442. int cnt;
  8443. cnt = sizeof(struct rx_port_stats) / 8;
  8444. __bnxt_accumulate_stats(hw_stats, sw_stats, masks, cnt, false);
  8445. hw_stats += BNXT_TX_PORT_STATS_BYTE_OFFSET / 8;
  8446. sw_stats += BNXT_TX_PORT_STATS_BYTE_OFFSET / 8;
  8447. masks += BNXT_TX_PORT_STATS_BYTE_OFFSET / 8;
  8448. cnt = sizeof(struct tx_port_stats) / 8;
  8449. __bnxt_accumulate_stats(hw_stats, sw_stats, masks, cnt, false);
  8450. }
  8451. if (bp->flags & BNXT_FLAG_PORT_STATS_EXT) {
  8452. bnxt_accumulate_stats(&bp->rx_port_stats_ext);
  8453. bnxt_accumulate_stats(&bp->tx_port_stats_ext);
  8454. }
  8455. }
  8456. static int bnxt_hwrm_port_qstats(struct bnxt *bp, u8 flags)
  8457. {
  8458. struct hwrm_port_qstats_input *req;
  8459. struct bnxt_pf_info *pf = &bp->pf;
  8460. int rc;
  8461. if (!(bp->flags & BNXT_FLAG_PORT_STATS))
  8462. return 0;
  8463. if (flags && !(bp->fw_cap & BNXT_FW_CAP_EXT_HW_STATS_SUPPORTED))
  8464. return -EOPNOTSUPP;
  8465. rc = hwrm_req_init(bp, req, HWRM_PORT_QSTATS);
  8466. if (rc)
  8467. return rc;
  8468. req->flags = flags;
  8469. req->port_id = cpu_to_le16(pf->port_id);
  8470. req->tx_stat_host_addr = cpu_to_le64(bp->port_stats.hw_stats_map +
  8471. BNXT_TX_PORT_STATS_BYTE_OFFSET);
  8472. req->rx_stat_host_addr = cpu_to_le64(bp->port_stats.hw_stats_map);
  8473. return hwrm_req_send(bp, req);
  8474. }
  8475. static int bnxt_hwrm_port_qstats_ext(struct bnxt *bp, u8 flags)
  8476. {
  8477. struct hwrm_queue_pri2cos_qcfg_output *resp_qc;
  8478. struct hwrm_queue_pri2cos_qcfg_input *req_qc;
  8479. struct hwrm_port_qstats_ext_output *resp_qs;
  8480. struct hwrm_port_qstats_ext_input *req_qs;
  8481. struct bnxt_pf_info *pf = &bp->pf;
  8482. u32 tx_stat_size;
  8483. int rc;
  8484. if (!(bp->flags & BNXT_FLAG_PORT_STATS_EXT))
  8485. return 0;
  8486. if (flags && !(bp->fw_cap & BNXT_FW_CAP_EXT_HW_STATS_SUPPORTED))
  8487. return -EOPNOTSUPP;
  8488. rc = hwrm_req_init(bp, req_qs, HWRM_PORT_QSTATS_EXT);
  8489. if (rc)
  8490. return rc;
  8491. req_qs->flags = flags;
  8492. req_qs->port_id = cpu_to_le16(pf->port_id);
  8493. req_qs->rx_stat_size = cpu_to_le16(sizeof(struct rx_port_stats_ext));
  8494. req_qs->rx_stat_host_addr = cpu_to_le64(bp->rx_port_stats_ext.hw_stats_map);
  8495. tx_stat_size = bp->tx_port_stats_ext.hw_stats ?
  8496. sizeof(struct tx_port_stats_ext) : 0;
  8497. req_qs->tx_stat_size = cpu_to_le16(tx_stat_size);
  8498. req_qs->tx_stat_host_addr = cpu_to_le64(bp->tx_port_stats_ext.hw_stats_map);
  8499. resp_qs = hwrm_req_hold(bp, req_qs);
  8500. rc = hwrm_req_send(bp, req_qs);
  8501. if (!rc) {
  8502. bp->fw_rx_stats_ext_size =
  8503. le16_to_cpu(resp_qs->rx_stat_size) / 8;
  8504. if (BNXT_FW_MAJ(bp) < 220 &&
  8505. bp->fw_rx_stats_ext_size > BNXT_RX_STATS_EXT_NUM_LEGACY)
  8506. bp->fw_rx_stats_ext_size = BNXT_RX_STATS_EXT_NUM_LEGACY;
  8507. bp->fw_tx_stats_ext_size = tx_stat_size ?
  8508. le16_to_cpu(resp_qs->tx_stat_size) / 8 : 0;
  8509. } else {
  8510. bp->fw_rx_stats_ext_size = 0;
  8511. bp->fw_tx_stats_ext_size = 0;
  8512. }
  8513. hwrm_req_drop(bp, req_qs);
  8514. if (flags)
  8515. return rc;
  8516. if (bp->fw_tx_stats_ext_size <=
  8517. offsetof(struct tx_port_stats_ext, pfc_pri0_tx_duration_us) / 8) {
  8518. bp->pri2cos_valid = 0;
  8519. return rc;
  8520. }
  8521. rc = hwrm_req_init(bp, req_qc, HWRM_QUEUE_PRI2COS_QCFG);
  8522. if (rc)
  8523. return rc;
  8524. req_qc->flags = cpu_to_le32(QUEUE_PRI2COS_QCFG_REQ_FLAGS_IVLAN);
  8525. resp_qc = hwrm_req_hold(bp, req_qc);
  8526. rc = hwrm_req_send(bp, req_qc);
  8527. if (!rc) {
  8528. u8 *pri2cos;
  8529. int i, j;
  8530. pri2cos = &resp_qc->pri0_cos_queue_id;
  8531. for (i = 0; i < 8; i++) {
  8532. u8 queue_id = pri2cos[i];
  8533. u8 queue_idx;
  8534. /* Per port queue IDs start from 0, 10, 20, etc */
  8535. queue_idx = queue_id % 10;
  8536. if (queue_idx > BNXT_MAX_QUEUE) {
  8537. bp->pri2cos_valid = false;
  8538. hwrm_req_drop(bp, req_qc);
  8539. return rc;
  8540. }
  8541. for (j = 0; j < bp->max_q; j++) {
  8542. if (bp->q_ids[j] == queue_id)
  8543. bp->pri2cos_idx[i] = queue_idx;
  8544. }
  8545. }
  8546. bp->pri2cos_valid = true;
  8547. }
  8548. hwrm_req_drop(bp, req_qc);
  8549. return rc;
  8550. }
  8551. static void bnxt_hwrm_free_tunnel_ports(struct bnxt *bp)
  8552. {
  8553. bnxt_hwrm_tunnel_dst_port_free(bp,
  8554. TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN);
  8555. bnxt_hwrm_tunnel_dst_port_free(bp,
  8556. TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_GENEVE);
  8557. }
  8558. static int bnxt_set_tpa(struct bnxt *bp, bool set_tpa)
  8559. {
  8560. int rc, i;
  8561. u32 tpa_flags = 0;
  8562. if (set_tpa)
  8563. tpa_flags = bp->flags & BNXT_FLAG_TPA;
  8564. else if (BNXT_NO_FW_ACCESS(bp))
  8565. return 0;
  8566. for (i = 0; i < bp->nr_vnics; i++) {
  8567. rc = bnxt_hwrm_vnic_set_tpa(bp, &bp->vnic_info[i], tpa_flags);
  8568. if (rc) {
  8569. netdev_err(bp->dev, "hwrm vnic set tpa failure rc for vnic %d: %x\n",
  8570. i, rc);
  8571. return rc;
  8572. }
  8573. }
  8574. return 0;
  8575. }
  8576. static void bnxt_hwrm_clear_vnic_rss(struct bnxt *bp)
  8577. {
  8578. int i;
  8579. for (i = 0; i < bp->nr_vnics; i++)
  8580. bnxt_hwrm_vnic_set_rss(bp, &bp->vnic_info[i], false);
  8581. }
  8582. static void bnxt_clear_vnic(struct bnxt *bp)
  8583. {
  8584. if (!bp->vnic_info)
  8585. return;
  8586. bnxt_hwrm_clear_vnic_filter(bp);
  8587. if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS)) {
  8588. /* clear all RSS setting before free vnic ctx */
  8589. bnxt_hwrm_clear_vnic_rss(bp);
  8590. bnxt_hwrm_vnic_ctx_free(bp);
  8591. }
  8592. /* before free the vnic, undo the vnic tpa settings */
  8593. if (bp->flags & BNXT_FLAG_TPA)
  8594. bnxt_set_tpa(bp, false);
  8595. bnxt_hwrm_vnic_free(bp);
  8596. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  8597. bnxt_hwrm_vnic_ctx_free(bp);
  8598. }
  8599. static void bnxt_hwrm_resource_free(struct bnxt *bp, bool close_path,
  8600. bool irq_re_init)
  8601. {
  8602. bnxt_clear_vnic(bp);
  8603. bnxt_hwrm_ring_free(bp, close_path);
  8604. bnxt_hwrm_ring_grp_free(bp);
  8605. if (irq_re_init) {
  8606. bnxt_hwrm_stat_ctx_free(bp);
  8607. bnxt_hwrm_free_tunnel_ports(bp);
  8608. }
  8609. }
  8610. static int bnxt_hwrm_set_br_mode(struct bnxt *bp, u16 br_mode)
  8611. {
  8612. struct hwrm_func_cfg_input *req;
  8613. u8 evb_mode;
  8614. int rc;
  8615. if (br_mode == BRIDGE_MODE_VEB)
  8616. evb_mode = FUNC_CFG_REQ_EVB_MODE_VEB;
  8617. else if (br_mode == BRIDGE_MODE_VEPA)
  8618. evb_mode = FUNC_CFG_REQ_EVB_MODE_VEPA;
  8619. else
  8620. return -EINVAL;
  8621. rc = bnxt_hwrm_func_cfg_short_req_init(bp, &req);
  8622. if (rc)
  8623. return rc;
  8624. req->fid = cpu_to_le16(0xffff);
  8625. req->enables = cpu_to_le32(FUNC_CFG_REQ_ENABLES_EVB_MODE);
  8626. req->evb_mode = evb_mode;
  8627. return hwrm_req_send(bp, req);
  8628. }
  8629. static int bnxt_hwrm_set_cache_line_size(struct bnxt *bp, int size)
  8630. {
  8631. struct hwrm_func_cfg_input *req;
  8632. int rc;
  8633. if (BNXT_VF(bp) || bp->hwrm_spec_code < 0x10803)
  8634. return 0;
  8635. rc = bnxt_hwrm_func_cfg_short_req_init(bp, &req);
  8636. if (rc)
  8637. return rc;
  8638. req->fid = cpu_to_le16(0xffff);
  8639. req->enables = cpu_to_le32(FUNC_CFG_REQ_ENABLES_CACHE_LINESIZE);
  8640. req->options = FUNC_CFG_REQ_OPTIONS_CACHE_LINESIZE_SIZE_64;
  8641. if (size == 128)
  8642. req->options = FUNC_CFG_REQ_OPTIONS_CACHE_LINESIZE_SIZE_128;
  8643. return hwrm_req_send(bp, req);
  8644. }
  8645. static int __bnxt_setup_vnic(struct bnxt *bp, struct bnxt_vnic_info *vnic)
  8646. {
  8647. int rc;
  8648. if (vnic->flags & BNXT_VNIC_RFS_NEW_RSS_FLAG)
  8649. goto skip_rss_ctx;
  8650. /* allocate context for vnic */
  8651. rc = bnxt_hwrm_vnic_ctx_alloc(bp, vnic, 0);
  8652. if (rc) {
  8653. netdev_err(bp->dev, "hwrm vnic %d alloc failure rc: %x\n",
  8654. vnic->vnic_id, rc);
  8655. goto vnic_setup_err;
  8656. }
  8657. bp->rsscos_nr_ctxs++;
  8658. if (BNXT_CHIP_TYPE_NITRO_A0(bp)) {
  8659. rc = bnxt_hwrm_vnic_ctx_alloc(bp, vnic, 1);
  8660. if (rc) {
  8661. netdev_err(bp->dev, "hwrm vnic %d cos ctx alloc failure rc: %x\n",
  8662. vnic->vnic_id, rc);
  8663. goto vnic_setup_err;
  8664. }
  8665. bp->rsscos_nr_ctxs++;
  8666. }
  8667. skip_rss_ctx:
  8668. /* configure default vnic, ring grp */
  8669. rc = bnxt_hwrm_vnic_cfg(bp, vnic);
  8670. if (rc) {
  8671. netdev_err(bp->dev, "hwrm vnic %d cfg failure rc: %x\n",
  8672. vnic->vnic_id, rc);
  8673. goto vnic_setup_err;
  8674. }
  8675. /* Enable RSS hashing on vnic */
  8676. rc = bnxt_hwrm_vnic_set_rss(bp, vnic, true);
  8677. if (rc) {
  8678. netdev_err(bp->dev, "hwrm vnic %d set rss failure rc: %x\n",
  8679. vnic->vnic_id, rc);
  8680. goto vnic_setup_err;
  8681. }
  8682. if (bp->flags & BNXT_FLAG_AGG_RINGS) {
  8683. rc = bnxt_hwrm_vnic_set_hds(bp, vnic);
  8684. if (rc) {
  8685. netdev_err(bp->dev, "hwrm vnic %d set hds failure rc: %x\n",
  8686. vnic->vnic_id, rc);
  8687. }
  8688. }
  8689. vnic_setup_err:
  8690. return rc;
  8691. }
  8692. int bnxt_hwrm_vnic_update(struct bnxt *bp, struct bnxt_vnic_info *vnic,
  8693. u8 valid)
  8694. {
  8695. struct hwrm_vnic_update_input *req;
  8696. int rc;
  8697. rc = hwrm_req_init(bp, req, HWRM_VNIC_UPDATE);
  8698. if (rc)
  8699. return rc;
  8700. req->vnic_id = cpu_to_le32(vnic->fw_vnic_id);
  8701. if (valid & VNIC_UPDATE_REQ_ENABLES_MRU_VALID)
  8702. req->mru = cpu_to_le16(vnic->mru);
  8703. req->enables = cpu_to_le32(valid);
  8704. return hwrm_req_send(bp, req);
  8705. }
  8706. int bnxt_hwrm_vnic_rss_cfg_p5(struct bnxt *bp, struct bnxt_vnic_info *vnic)
  8707. {
  8708. int rc;
  8709. rc = bnxt_hwrm_vnic_set_rss_p5(bp, vnic, true);
  8710. if (rc) {
  8711. netdev_err(bp->dev, "hwrm vnic %d set rss failure rc: %d\n",
  8712. vnic->vnic_id, rc);
  8713. return rc;
  8714. }
  8715. rc = bnxt_hwrm_vnic_cfg(bp, vnic);
  8716. if (rc)
  8717. netdev_err(bp->dev, "hwrm vnic %d cfg failure rc: %x\n",
  8718. vnic->vnic_id, rc);
  8719. return rc;
  8720. }
  8721. int __bnxt_setup_vnic_p5(struct bnxt *bp, struct bnxt_vnic_info *vnic)
  8722. {
  8723. int rc, i, nr_ctxs;
  8724. nr_ctxs = bnxt_get_nr_rss_ctxs(bp, bp->rx_nr_rings);
  8725. for (i = 0; i < nr_ctxs; i++) {
  8726. rc = bnxt_hwrm_vnic_ctx_alloc(bp, vnic, i);
  8727. if (rc) {
  8728. netdev_err(bp->dev, "hwrm vnic %d ctx %d alloc failure rc: %x\n",
  8729. vnic->vnic_id, i, rc);
  8730. break;
  8731. }
  8732. bp->rsscos_nr_ctxs++;
  8733. }
  8734. if (i < nr_ctxs)
  8735. return -ENOMEM;
  8736. rc = bnxt_hwrm_vnic_rss_cfg_p5(bp, vnic);
  8737. if (rc)
  8738. return rc;
  8739. if (bp->flags & BNXT_FLAG_AGG_RINGS) {
  8740. rc = bnxt_hwrm_vnic_set_hds(bp, vnic);
  8741. if (rc) {
  8742. netdev_err(bp->dev, "hwrm vnic %d set hds failure rc: %x\n",
  8743. vnic->vnic_id, rc);
  8744. }
  8745. }
  8746. return rc;
  8747. }
  8748. static int bnxt_setup_vnic(struct bnxt *bp, struct bnxt_vnic_info *vnic)
  8749. {
  8750. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  8751. return __bnxt_setup_vnic_p5(bp, vnic);
  8752. else
  8753. return __bnxt_setup_vnic(bp, vnic);
  8754. }
  8755. static int bnxt_alloc_and_setup_vnic(struct bnxt *bp,
  8756. struct bnxt_vnic_info *vnic,
  8757. u16 start_rx_ring_idx, int rx_rings)
  8758. {
  8759. int rc;
  8760. rc = bnxt_hwrm_vnic_alloc(bp, vnic, start_rx_ring_idx, rx_rings);
  8761. if (rc) {
  8762. netdev_err(bp->dev, "hwrm vnic %d alloc failure rc: %x\n",
  8763. vnic->vnic_id, rc);
  8764. return rc;
  8765. }
  8766. return bnxt_setup_vnic(bp, vnic);
  8767. }
  8768. static int bnxt_alloc_rfs_vnics(struct bnxt *bp)
  8769. {
  8770. struct bnxt_vnic_info *vnic;
  8771. int i, rc = 0;
  8772. if (BNXT_SUPPORTS_NTUPLE_VNIC(bp)) {
  8773. vnic = &bp->vnic_info[BNXT_VNIC_NTUPLE];
  8774. return bnxt_alloc_and_setup_vnic(bp, vnic, 0, bp->rx_nr_rings);
  8775. }
  8776. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  8777. return 0;
  8778. for (i = 0; i < bp->rx_nr_rings; i++) {
  8779. u16 vnic_id = i + 1;
  8780. u16 ring_id = i;
  8781. if (vnic_id >= bp->nr_vnics)
  8782. break;
  8783. vnic = &bp->vnic_info[vnic_id];
  8784. vnic->flags |= BNXT_VNIC_RFS_FLAG;
  8785. if (bp->rss_cap & BNXT_RSS_CAP_NEW_RSS_CAP)
  8786. vnic->flags |= BNXT_VNIC_RFS_NEW_RSS_FLAG;
  8787. if (bnxt_alloc_and_setup_vnic(bp, &bp->vnic_info[vnic_id], ring_id, 1))
  8788. break;
  8789. }
  8790. return rc;
  8791. }
  8792. void bnxt_del_one_rss_ctx(struct bnxt *bp, struct bnxt_rss_ctx *rss_ctx,
  8793. bool all)
  8794. {
  8795. struct bnxt_vnic_info *vnic = &rss_ctx->vnic;
  8796. struct bnxt_filter_base *usr_fltr, *tmp;
  8797. struct bnxt_ntuple_filter *ntp_fltr;
  8798. int i;
  8799. if (netif_running(bp->dev)) {
  8800. bnxt_hwrm_vnic_free_one(bp, &rss_ctx->vnic);
  8801. for (i = 0; i < BNXT_MAX_CTX_PER_VNIC; i++) {
  8802. if (vnic->fw_rss_cos_lb_ctx[i] != INVALID_HW_RING_ID)
  8803. bnxt_hwrm_vnic_ctx_free_one(bp, vnic, i);
  8804. }
  8805. }
  8806. if (!all)
  8807. return;
  8808. list_for_each_entry_safe(usr_fltr, tmp, &bp->usr_fltr_list, list) {
  8809. if ((usr_fltr->flags & BNXT_ACT_RSS_CTX) &&
  8810. usr_fltr->fw_vnic_id == rss_ctx->index) {
  8811. ntp_fltr = container_of(usr_fltr,
  8812. struct bnxt_ntuple_filter,
  8813. base);
  8814. bnxt_hwrm_cfa_ntuple_filter_free(bp, ntp_fltr);
  8815. bnxt_del_ntp_filter(bp, ntp_fltr);
  8816. bnxt_del_one_usr_fltr(bp, usr_fltr);
  8817. }
  8818. }
  8819. if (vnic->rss_table)
  8820. dma_free_coherent(&bp->pdev->dev, vnic->rss_table_size,
  8821. vnic->rss_table,
  8822. vnic->rss_table_dma_addr);
  8823. bp->num_rss_ctx--;
  8824. }
  8825. static bool bnxt_vnic_has_rx_ring(struct bnxt *bp, struct bnxt_vnic_info *vnic,
  8826. int rxr_id)
  8827. {
  8828. u16 tbl_size = bnxt_get_rxfh_indir_size(bp->dev);
  8829. int i, vnic_rx;
  8830. /* Ntuple VNIC always has all the rx rings. Any change of ring id
  8831. * must be updated because a future filter may use it.
  8832. */
  8833. if (vnic->flags & BNXT_VNIC_NTUPLE_FLAG)
  8834. return true;
  8835. for (i = 0; i < tbl_size; i++) {
  8836. if (vnic->flags & BNXT_VNIC_RSSCTX_FLAG)
  8837. vnic_rx = ethtool_rxfh_context_indir(vnic->rss_ctx)[i];
  8838. else
  8839. vnic_rx = bp->rss_indir_tbl[i];
  8840. if (rxr_id == vnic_rx)
  8841. return true;
  8842. }
  8843. return false;
  8844. }
  8845. static int bnxt_set_vnic_mru_p5(struct bnxt *bp, struct bnxt_vnic_info *vnic,
  8846. u16 mru, int rxr_id)
  8847. {
  8848. int rc;
  8849. if (!bnxt_vnic_has_rx_ring(bp, vnic, rxr_id))
  8850. return 0;
  8851. if (mru) {
  8852. rc = bnxt_hwrm_vnic_set_rss_p5(bp, vnic, true);
  8853. if (rc) {
  8854. netdev_err(bp->dev, "hwrm vnic %d set rss failure rc: %d\n",
  8855. vnic->vnic_id, rc);
  8856. return rc;
  8857. }
  8858. }
  8859. vnic->mru = mru;
  8860. bnxt_hwrm_vnic_update(bp, vnic,
  8861. VNIC_UPDATE_REQ_ENABLES_MRU_VALID);
  8862. return 0;
  8863. }
  8864. static int bnxt_set_rss_ctx_vnic_mru(struct bnxt *bp, u16 mru, int rxr_id)
  8865. {
  8866. struct ethtool_rxfh_context *ctx;
  8867. unsigned long context;
  8868. int rc;
  8869. xa_for_each(&bp->dev->ethtool->rss_ctx, context, ctx) {
  8870. struct bnxt_rss_ctx *rss_ctx = ethtool_rxfh_context_priv(ctx);
  8871. struct bnxt_vnic_info *vnic = &rss_ctx->vnic;
  8872. rc = bnxt_set_vnic_mru_p5(bp, vnic, mru, rxr_id);
  8873. if (rc)
  8874. return rc;
  8875. }
  8876. return 0;
  8877. }
  8878. static void bnxt_hwrm_realloc_rss_ctx_vnic(struct bnxt *bp)
  8879. {
  8880. bool set_tpa = !!(bp->flags & BNXT_FLAG_TPA);
  8881. struct ethtool_rxfh_context *ctx;
  8882. unsigned long context;
  8883. xa_for_each(&bp->dev->ethtool->rss_ctx, context, ctx) {
  8884. struct bnxt_rss_ctx *rss_ctx = ethtool_rxfh_context_priv(ctx);
  8885. struct bnxt_vnic_info *vnic = &rss_ctx->vnic;
  8886. if (bnxt_hwrm_vnic_alloc(bp, vnic, 0, bp->rx_nr_rings) ||
  8887. bnxt_hwrm_vnic_set_tpa(bp, vnic, set_tpa) ||
  8888. __bnxt_setup_vnic_p5(bp, vnic)) {
  8889. netdev_err(bp->dev, "Failed to restore RSS ctx %d\n",
  8890. rss_ctx->index);
  8891. bnxt_del_one_rss_ctx(bp, rss_ctx, true);
  8892. ethtool_rxfh_context_lost(bp->dev, rss_ctx->index);
  8893. }
  8894. }
  8895. }
  8896. static void bnxt_clear_rss_ctxs(struct bnxt *bp)
  8897. {
  8898. struct ethtool_rxfh_context *ctx;
  8899. unsigned long context;
  8900. xa_for_each(&bp->dev->ethtool->rss_ctx, context, ctx) {
  8901. struct bnxt_rss_ctx *rss_ctx = ethtool_rxfh_context_priv(ctx);
  8902. bnxt_del_one_rss_ctx(bp, rss_ctx, false);
  8903. }
  8904. }
  8905. /* Allow PF, trusted VFs and VFs with default VLAN to be in promiscuous mode */
  8906. static bool bnxt_promisc_ok(struct bnxt *bp)
  8907. {
  8908. #ifdef CONFIG_BNXT_SRIOV
  8909. if (BNXT_VF(bp) && !bp->vf.vlan && !bnxt_is_trusted_vf(bp, &bp->vf))
  8910. return false;
  8911. #endif
  8912. return true;
  8913. }
  8914. static int bnxt_setup_nitroa0_vnic(struct bnxt *bp)
  8915. {
  8916. struct bnxt_vnic_info *vnic = &bp->vnic_info[1];
  8917. unsigned int rc = 0;
  8918. rc = bnxt_hwrm_vnic_alloc(bp, vnic, bp->rx_nr_rings - 1, 1);
  8919. if (rc) {
  8920. netdev_err(bp->dev, "Cannot allocate special vnic for NS2 A0: %x\n",
  8921. rc);
  8922. return rc;
  8923. }
  8924. rc = bnxt_hwrm_vnic_cfg(bp, vnic);
  8925. if (rc) {
  8926. netdev_err(bp->dev, "Cannot allocate special vnic for NS2 A0: %x\n",
  8927. rc);
  8928. return rc;
  8929. }
  8930. return rc;
  8931. }
  8932. static int bnxt_cfg_rx_mode(struct bnxt *);
  8933. static bool bnxt_mc_list_updated(struct bnxt *, u32 *);
  8934. static int bnxt_init_chip(struct bnxt *bp, bool irq_re_init)
  8935. {
  8936. struct bnxt_vnic_info *vnic = &bp->vnic_info[BNXT_VNIC_DEFAULT];
  8937. int rc = 0;
  8938. unsigned int rx_nr_rings = bp->rx_nr_rings;
  8939. if (irq_re_init) {
  8940. rc = bnxt_hwrm_stat_ctx_alloc(bp);
  8941. if (rc) {
  8942. netdev_err(bp->dev, "hwrm stat ctx alloc failure rc: %x\n",
  8943. rc);
  8944. goto err_out;
  8945. }
  8946. }
  8947. rc = bnxt_hwrm_ring_alloc(bp);
  8948. if (rc) {
  8949. netdev_err(bp->dev, "hwrm ring alloc failure rc: %x\n", rc);
  8950. goto err_out;
  8951. }
  8952. rc = bnxt_hwrm_ring_grp_alloc(bp);
  8953. if (rc) {
  8954. netdev_err(bp->dev, "hwrm_ring_grp alloc failure: %x\n", rc);
  8955. goto err_out;
  8956. }
  8957. if (BNXT_CHIP_TYPE_NITRO_A0(bp))
  8958. rx_nr_rings--;
  8959. /* default vnic 0 */
  8960. rc = bnxt_hwrm_vnic_alloc(bp, vnic, 0, rx_nr_rings);
  8961. if (rc) {
  8962. netdev_err(bp->dev, "hwrm vnic alloc failure rc: %x\n", rc);
  8963. goto err_out;
  8964. }
  8965. if (BNXT_VF(bp))
  8966. bnxt_hwrm_func_qcfg(bp);
  8967. rc = bnxt_setup_vnic(bp, vnic);
  8968. if (rc)
  8969. goto err_out;
  8970. if (bp->rss_cap & BNXT_RSS_CAP_RSS_HASH_TYPE_DELTA)
  8971. bnxt_hwrm_update_rss_hash_cfg(bp);
  8972. if (bp->flags & BNXT_FLAG_RFS) {
  8973. rc = bnxt_alloc_rfs_vnics(bp);
  8974. if (rc)
  8975. goto err_out;
  8976. }
  8977. if (bp->flags & BNXT_FLAG_TPA) {
  8978. rc = bnxt_set_tpa(bp, true);
  8979. if (rc)
  8980. goto err_out;
  8981. }
  8982. if (BNXT_VF(bp))
  8983. bnxt_update_vf_mac(bp);
  8984. /* Filter for default vnic 0 */
  8985. rc = bnxt_hwrm_set_vnic_filter(bp, 0, 0, bp->dev->dev_addr);
  8986. if (rc) {
  8987. if (BNXT_VF(bp) && rc == -ENODEV)
  8988. netdev_err(bp->dev, "Cannot configure L2 filter while PF is unavailable\n");
  8989. else
  8990. netdev_err(bp->dev, "HWRM vnic filter failure rc: %x\n", rc);
  8991. goto err_out;
  8992. }
  8993. vnic->uc_filter_count = 1;
  8994. vnic->rx_mask = 0;
  8995. if (test_bit(BNXT_STATE_HALF_OPEN, &bp->state))
  8996. goto skip_rx_mask;
  8997. if (bp->dev->flags & IFF_BROADCAST)
  8998. vnic->rx_mask |= CFA_L2_SET_RX_MASK_REQ_MASK_BCAST;
  8999. if (bp->dev->flags & IFF_PROMISC)
  9000. vnic->rx_mask |= CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS;
  9001. if (bp->dev->flags & IFF_ALLMULTI) {
  9002. vnic->rx_mask |= CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST;
  9003. vnic->mc_list_count = 0;
  9004. } else if (bp->dev->flags & IFF_MULTICAST) {
  9005. u32 mask = 0;
  9006. bnxt_mc_list_updated(bp, &mask);
  9007. vnic->rx_mask |= mask;
  9008. }
  9009. rc = bnxt_cfg_rx_mode(bp);
  9010. if (rc)
  9011. goto err_out;
  9012. skip_rx_mask:
  9013. rc = bnxt_hwrm_set_coal(bp);
  9014. if (rc)
  9015. netdev_warn(bp->dev, "HWRM set coalescing failure rc: %x\n",
  9016. rc);
  9017. if (BNXT_CHIP_TYPE_NITRO_A0(bp)) {
  9018. rc = bnxt_setup_nitroa0_vnic(bp);
  9019. if (rc)
  9020. netdev_err(bp->dev, "Special vnic setup failure for NS2 A0 rc: %x\n",
  9021. rc);
  9022. }
  9023. if (BNXT_VF(bp)) {
  9024. bnxt_hwrm_func_qcfg(bp);
  9025. netdev_update_features(bp->dev);
  9026. }
  9027. return 0;
  9028. err_out:
  9029. bnxt_hwrm_resource_free(bp, 0, true);
  9030. return rc;
  9031. }
  9032. static int bnxt_shutdown_nic(struct bnxt *bp, bool irq_re_init)
  9033. {
  9034. bnxt_hwrm_resource_free(bp, 1, irq_re_init);
  9035. return 0;
  9036. }
  9037. static int bnxt_init_nic(struct bnxt *bp, bool irq_re_init)
  9038. {
  9039. bnxt_init_cp_rings(bp);
  9040. bnxt_init_rx_rings(bp);
  9041. bnxt_init_tx_rings(bp);
  9042. bnxt_init_ring_grps(bp, irq_re_init);
  9043. bnxt_init_vnics(bp);
  9044. return bnxt_init_chip(bp, irq_re_init);
  9045. }
  9046. static int bnxt_set_real_num_queues(struct bnxt *bp)
  9047. {
  9048. int rc;
  9049. struct net_device *dev = bp->dev;
  9050. rc = netif_set_real_num_tx_queues(dev, bp->tx_nr_rings -
  9051. bp->tx_nr_rings_xdp);
  9052. if (rc)
  9053. return rc;
  9054. rc = netif_set_real_num_rx_queues(dev, bp->rx_nr_rings);
  9055. if (rc)
  9056. return rc;
  9057. #ifdef CONFIG_RFS_ACCEL
  9058. if (bp->flags & BNXT_FLAG_RFS)
  9059. dev->rx_cpu_rmap = alloc_irq_cpu_rmap(bp->rx_nr_rings);
  9060. #endif
  9061. return rc;
  9062. }
  9063. static int __bnxt_trim_rings(struct bnxt *bp, int *rx, int *tx, int max,
  9064. bool shared)
  9065. {
  9066. int _rx = *rx, _tx = *tx;
  9067. if (shared) {
  9068. *rx = min_t(int, _rx, max);
  9069. *tx = min_t(int, _tx, max);
  9070. } else {
  9071. if (max < 2)
  9072. return -ENOMEM;
  9073. while (_rx + _tx > max) {
  9074. if (_rx > _tx && _rx > 1)
  9075. _rx--;
  9076. else if (_tx > 1)
  9077. _tx--;
  9078. }
  9079. *rx = _rx;
  9080. *tx = _tx;
  9081. }
  9082. return 0;
  9083. }
  9084. static int __bnxt_num_tx_to_cp(struct bnxt *bp, int tx, int tx_sets, int tx_xdp)
  9085. {
  9086. return (tx - tx_xdp) / tx_sets + tx_xdp;
  9087. }
  9088. int bnxt_num_tx_to_cp(struct bnxt *bp, int tx)
  9089. {
  9090. int tcs = bp->num_tc;
  9091. if (!tcs)
  9092. tcs = 1;
  9093. return __bnxt_num_tx_to_cp(bp, tx, tcs, bp->tx_nr_rings_xdp);
  9094. }
  9095. static int bnxt_num_cp_to_tx(struct bnxt *bp, int tx_cp)
  9096. {
  9097. int tcs = bp->num_tc;
  9098. return (tx_cp - bp->tx_nr_rings_xdp) * tcs +
  9099. bp->tx_nr_rings_xdp;
  9100. }
  9101. static int bnxt_trim_rings(struct bnxt *bp, int *rx, int *tx, int max,
  9102. bool sh)
  9103. {
  9104. int tx_cp = bnxt_num_tx_to_cp(bp, *tx);
  9105. if (tx_cp != *tx) {
  9106. int tx_saved = tx_cp, rc;
  9107. rc = __bnxt_trim_rings(bp, rx, &tx_cp, max, sh);
  9108. if (rc)
  9109. return rc;
  9110. if (tx_cp != tx_saved)
  9111. *tx = bnxt_num_cp_to_tx(bp, tx_cp);
  9112. return 0;
  9113. }
  9114. return __bnxt_trim_rings(bp, rx, tx, max, sh);
  9115. }
  9116. static void bnxt_setup_msix(struct bnxt *bp)
  9117. {
  9118. const int len = sizeof(bp->irq_tbl[0].name);
  9119. struct net_device *dev = bp->dev;
  9120. int tcs, i;
  9121. tcs = bp->num_tc;
  9122. if (tcs) {
  9123. int i, off, count;
  9124. for (i = 0; i < tcs; i++) {
  9125. count = bp->tx_nr_rings_per_tc;
  9126. off = BNXT_TC_TO_RING_BASE(bp, i);
  9127. netdev_set_tc_queue(dev, i, count, off);
  9128. }
  9129. }
  9130. for (i = 0; i < bp->cp_nr_rings; i++) {
  9131. int map_idx = bnxt_cp_num_to_irq_num(bp, i);
  9132. char *attr;
  9133. if (bp->flags & BNXT_FLAG_SHARED_RINGS)
  9134. attr = "TxRx";
  9135. else if (i < bp->rx_nr_rings)
  9136. attr = "rx";
  9137. else
  9138. attr = "tx";
  9139. snprintf(bp->irq_tbl[map_idx].name, len, "%s-%s-%d", dev->name,
  9140. attr, i);
  9141. bp->irq_tbl[map_idx].handler = bnxt_msix;
  9142. }
  9143. }
  9144. static int bnxt_init_int_mode(struct bnxt *bp);
  9145. static int bnxt_change_msix(struct bnxt *bp, int total)
  9146. {
  9147. struct msi_map map;
  9148. int i;
  9149. /* add MSIX to the end if needed */
  9150. for (i = bp->total_irqs; i < total; i++) {
  9151. map = pci_msix_alloc_irq_at(bp->pdev, i, NULL);
  9152. if (map.index < 0)
  9153. return bp->total_irqs;
  9154. bp->irq_tbl[i].vector = map.virq;
  9155. bp->total_irqs++;
  9156. }
  9157. /* trim MSIX from the end if needed */
  9158. for (i = bp->total_irqs; i > total; i--) {
  9159. map.index = i - 1;
  9160. map.virq = bp->irq_tbl[i - 1].vector;
  9161. pci_msix_free_irq(bp->pdev, map);
  9162. bp->total_irqs--;
  9163. }
  9164. return bp->total_irqs;
  9165. }
  9166. static int bnxt_setup_int_mode(struct bnxt *bp)
  9167. {
  9168. int rc;
  9169. if (!bp->irq_tbl) {
  9170. rc = bnxt_init_int_mode(bp);
  9171. if (rc || !bp->irq_tbl)
  9172. return rc ?: -ENODEV;
  9173. }
  9174. bnxt_setup_msix(bp);
  9175. rc = bnxt_set_real_num_queues(bp);
  9176. return rc;
  9177. }
  9178. static unsigned int bnxt_get_max_func_rss_ctxs(struct bnxt *bp)
  9179. {
  9180. return bp->hw_resc.max_rsscos_ctxs;
  9181. }
  9182. static unsigned int bnxt_get_max_func_vnics(struct bnxt *bp)
  9183. {
  9184. return bp->hw_resc.max_vnics;
  9185. }
  9186. unsigned int bnxt_get_max_func_stat_ctxs(struct bnxt *bp)
  9187. {
  9188. return bp->hw_resc.max_stat_ctxs;
  9189. }
  9190. unsigned int bnxt_get_max_func_cp_rings(struct bnxt *bp)
  9191. {
  9192. return bp->hw_resc.max_cp_rings;
  9193. }
  9194. static unsigned int bnxt_get_max_func_cp_rings_for_en(struct bnxt *bp)
  9195. {
  9196. unsigned int cp = bp->hw_resc.max_cp_rings;
  9197. if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS))
  9198. cp -= bnxt_get_ulp_msix_num(bp);
  9199. return cp;
  9200. }
  9201. static unsigned int bnxt_get_max_func_irqs(struct bnxt *bp)
  9202. {
  9203. struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
  9204. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  9205. return min_t(unsigned int, hw_resc->max_irqs, hw_resc->max_nqs);
  9206. return min_t(unsigned int, hw_resc->max_irqs, hw_resc->max_cp_rings);
  9207. }
  9208. static void bnxt_set_max_func_irqs(struct bnxt *bp, unsigned int max_irqs)
  9209. {
  9210. bp->hw_resc.max_irqs = max_irqs;
  9211. }
  9212. unsigned int bnxt_get_avail_cp_rings_for_en(struct bnxt *bp)
  9213. {
  9214. unsigned int cp;
  9215. cp = bnxt_get_max_func_cp_rings_for_en(bp);
  9216. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  9217. return cp - bp->rx_nr_rings - bp->tx_nr_rings;
  9218. else
  9219. return cp - bp->cp_nr_rings;
  9220. }
  9221. unsigned int bnxt_get_avail_stat_ctxs_for_en(struct bnxt *bp)
  9222. {
  9223. return bnxt_get_max_func_stat_ctxs(bp) - bnxt_get_func_stat_ctxs(bp);
  9224. }
  9225. static int bnxt_get_avail_msix(struct bnxt *bp, int num)
  9226. {
  9227. int max_irq = bnxt_get_max_func_irqs(bp);
  9228. int total_req = bp->cp_nr_rings + num;
  9229. if (max_irq < total_req) {
  9230. num = max_irq - bp->cp_nr_rings;
  9231. if (num <= 0)
  9232. return 0;
  9233. }
  9234. return num;
  9235. }
  9236. static int bnxt_get_num_msix(struct bnxt *bp)
  9237. {
  9238. if (!BNXT_NEW_RM(bp))
  9239. return bnxt_get_max_func_irqs(bp);
  9240. return bnxt_nq_rings_in_use(bp);
  9241. }
  9242. static int bnxt_init_int_mode(struct bnxt *bp)
  9243. {
  9244. int i, total_vecs, max, rc = 0, min = 1, ulp_msix, tx_cp, tbl_size;
  9245. total_vecs = bnxt_get_num_msix(bp);
  9246. max = bnxt_get_max_func_irqs(bp);
  9247. if (total_vecs > max)
  9248. total_vecs = max;
  9249. if (!total_vecs)
  9250. return 0;
  9251. if (!(bp->flags & BNXT_FLAG_SHARED_RINGS))
  9252. min = 2;
  9253. total_vecs = pci_alloc_irq_vectors(bp->pdev, min, total_vecs,
  9254. PCI_IRQ_MSIX);
  9255. ulp_msix = bnxt_get_ulp_msix_num(bp);
  9256. if (total_vecs < 0 || total_vecs < ulp_msix) {
  9257. rc = -ENODEV;
  9258. goto msix_setup_exit;
  9259. }
  9260. tbl_size = total_vecs;
  9261. if (pci_msix_can_alloc_dyn(bp->pdev))
  9262. tbl_size = max;
  9263. bp->irq_tbl = kcalloc(tbl_size, sizeof(*bp->irq_tbl), GFP_KERNEL);
  9264. if (bp->irq_tbl) {
  9265. for (i = 0; i < total_vecs; i++)
  9266. bp->irq_tbl[i].vector = pci_irq_vector(bp->pdev, i);
  9267. bp->total_irqs = total_vecs;
  9268. /* Trim rings based upon num of vectors allocated */
  9269. rc = bnxt_trim_rings(bp, &bp->rx_nr_rings, &bp->tx_nr_rings,
  9270. total_vecs - ulp_msix, min == 1);
  9271. if (rc)
  9272. goto msix_setup_exit;
  9273. tx_cp = bnxt_num_tx_to_cp(bp, bp->tx_nr_rings);
  9274. bp->cp_nr_rings = (min == 1) ?
  9275. max_t(int, tx_cp, bp->rx_nr_rings) :
  9276. tx_cp + bp->rx_nr_rings;
  9277. } else {
  9278. rc = -ENOMEM;
  9279. goto msix_setup_exit;
  9280. }
  9281. return 0;
  9282. msix_setup_exit:
  9283. netdev_err(bp->dev, "bnxt_init_int_mode err: %x\n", rc);
  9284. kfree(bp->irq_tbl);
  9285. bp->irq_tbl = NULL;
  9286. pci_free_irq_vectors(bp->pdev);
  9287. return rc;
  9288. }
  9289. static void bnxt_clear_int_mode(struct bnxt *bp)
  9290. {
  9291. pci_free_irq_vectors(bp->pdev);
  9292. kfree(bp->irq_tbl);
  9293. bp->irq_tbl = NULL;
  9294. }
  9295. int bnxt_reserve_rings(struct bnxt *bp, bool irq_re_init)
  9296. {
  9297. bool irq_cleared = false;
  9298. bool irq_change = false;
  9299. int tcs = bp->num_tc;
  9300. int irqs_required;
  9301. int rc;
  9302. if (!bnxt_need_reserve_rings(bp))
  9303. return 0;
  9304. if (BNXT_NEW_RM(bp) && !bnxt_ulp_registered(bp->edev)) {
  9305. int ulp_msix = bnxt_get_avail_msix(bp, bp->ulp_num_msix_want);
  9306. if (ulp_msix > bp->ulp_num_msix_want)
  9307. ulp_msix = bp->ulp_num_msix_want;
  9308. irqs_required = ulp_msix + bp->cp_nr_rings;
  9309. } else {
  9310. irqs_required = bnxt_get_num_msix(bp);
  9311. }
  9312. if (irq_re_init && BNXT_NEW_RM(bp) && irqs_required != bp->total_irqs) {
  9313. irq_change = true;
  9314. if (!pci_msix_can_alloc_dyn(bp->pdev)) {
  9315. bnxt_ulp_irq_stop(bp);
  9316. bnxt_clear_int_mode(bp);
  9317. irq_cleared = true;
  9318. }
  9319. }
  9320. rc = __bnxt_reserve_rings(bp);
  9321. if (irq_cleared) {
  9322. if (!rc)
  9323. rc = bnxt_init_int_mode(bp);
  9324. bnxt_ulp_irq_restart(bp, rc);
  9325. } else if (irq_change && !rc) {
  9326. if (bnxt_change_msix(bp, irqs_required) != irqs_required)
  9327. rc = -ENOSPC;
  9328. }
  9329. if (rc) {
  9330. netdev_err(bp->dev, "ring reservation/IRQ init failure rc: %d\n", rc);
  9331. return rc;
  9332. }
  9333. if (tcs && (bp->tx_nr_rings_per_tc * tcs !=
  9334. bp->tx_nr_rings - bp->tx_nr_rings_xdp)) {
  9335. netdev_err(bp->dev, "tx ring reservation failure\n");
  9336. netdev_reset_tc(bp->dev);
  9337. bp->num_tc = 0;
  9338. if (bp->tx_nr_rings_xdp)
  9339. bp->tx_nr_rings_per_tc = bp->tx_nr_rings_xdp;
  9340. else
  9341. bp->tx_nr_rings_per_tc = bp->tx_nr_rings;
  9342. return -ENOMEM;
  9343. }
  9344. return 0;
  9345. }
  9346. static void bnxt_free_irq(struct bnxt *bp)
  9347. {
  9348. struct bnxt_irq *irq;
  9349. int i;
  9350. #ifdef CONFIG_RFS_ACCEL
  9351. free_irq_cpu_rmap(bp->dev->rx_cpu_rmap);
  9352. bp->dev->rx_cpu_rmap = NULL;
  9353. #endif
  9354. if (!bp->irq_tbl || !bp->bnapi)
  9355. return;
  9356. for (i = 0; i < bp->cp_nr_rings; i++) {
  9357. int map_idx = bnxt_cp_num_to_irq_num(bp, i);
  9358. irq = &bp->irq_tbl[map_idx];
  9359. if (irq->requested) {
  9360. if (irq->have_cpumask) {
  9361. irq_set_affinity_hint(irq->vector, NULL);
  9362. free_cpumask_var(irq->cpu_mask);
  9363. irq->have_cpumask = 0;
  9364. }
  9365. free_irq(irq->vector, bp->bnapi[i]);
  9366. }
  9367. irq->requested = 0;
  9368. }
  9369. }
  9370. static int bnxt_request_irq(struct bnxt *bp)
  9371. {
  9372. struct cpu_rmap *rmap = NULL;
  9373. int i, j, rc = 0;
  9374. unsigned long flags = 0;
  9375. rc = bnxt_setup_int_mode(bp);
  9376. if (rc) {
  9377. netdev_err(bp->dev, "bnxt_setup_int_mode err: %x\n",
  9378. rc);
  9379. return rc;
  9380. }
  9381. #ifdef CONFIG_RFS_ACCEL
  9382. rmap = bp->dev->rx_cpu_rmap;
  9383. #endif
  9384. for (i = 0, j = 0; i < bp->cp_nr_rings; i++) {
  9385. int map_idx = bnxt_cp_num_to_irq_num(bp, i);
  9386. struct bnxt_irq *irq = &bp->irq_tbl[map_idx];
  9387. if (IS_ENABLED(CONFIG_RFS_ACCEL) &&
  9388. rmap && bp->bnapi[i]->rx_ring) {
  9389. rc = irq_cpu_rmap_add(rmap, irq->vector);
  9390. if (rc)
  9391. netdev_warn(bp->dev, "failed adding irq rmap for ring %d\n",
  9392. j);
  9393. j++;
  9394. }
  9395. rc = request_irq(irq->vector, irq->handler, flags, irq->name,
  9396. bp->bnapi[i]);
  9397. if (rc)
  9398. break;
  9399. netif_napi_set_irq(&bp->bnapi[i]->napi, irq->vector);
  9400. irq->requested = 1;
  9401. if (zalloc_cpumask_var(&irq->cpu_mask, GFP_KERNEL)) {
  9402. int numa_node = dev_to_node(&bp->pdev->dev);
  9403. irq->have_cpumask = 1;
  9404. cpumask_set_cpu(cpumask_local_spread(i, numa_node),
  9405. irq->cpu_mask);
  9406. rc = irq_set_affinity_hint(irq->vector, irq->cpu_mask);
  9407. if (rc) {
  9408. netdev_warn(bp->dev,
  9409. "Set affinity failed, IRQ = %d\n",
  9410. irq->vector);
  9411. break;
  9412. }
  9413. }
  9414. }
  9415. return rc;
  9416. }
  9417. static void bnxt_del_napi(struct bnxt *bp)
  9418. {
  9419. int i;
  9420. if (!bp->bnapi)
  9421. return;
  9422. for (i = 0; i < bp->rx_nr_rings; i++)
  9423. netif_queue_set_napi(bp->dev, i, NETDEV_QUEUE_TYPE_RX, NULL);
  9424. for (i = 0; i < bp->tx_nr_rings - bp->tx_nr_rings_xdp; i++)
  9425. netif_queue_set_napi(bp->dev, i, NETDEV_QUEUE_TYPE_TX, NULL);
  9426. for (i = 0; i < bp->cp_nr_rings; i++) {
  9427. struct bnxt_napi *bnapi = bp->bnapi[i];
  9428. __netif_napi_del(&bnapi->napi);
  9429. }
  9430. /* We called __netif_napi_del(), we need
  9431. * to respect an RCU grace period before freeing napi structures.
  9432. */
  9433. synchronize_net();
  9434. }
  9435. static void bnxt_init_napi(struct bnxt *bp)
  9436. {
  9437. int (*poll_fn)(struct napi_struct *, int) = bnxt_poll;
  9438. unsigned int cp_nr_rings = bp->cp_nr_rings;
  9439. struct bnxt_napi *bnapi;
  9440. int i;
  9441. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  9442. poll_fn = bnxt_poll_p5;
  9443. else if (BNXT_CHIP_TYPE_NITRO_A0(bp))
  9444. cp_nr_rings--;
  9445. set_bit(BNXT_STATE_NAPI_DISABLED, &bp->state);
  9446. for (i = 0; i < cp_nr_rings; i++) {
  9447. bnapi = bp->bnapi[i];
  9448. netif_napi_add(bp->dev, &bnapi->napi, poll_fn);
  9449. }
  9450. if (BNXT_CHIP_TYPE_NITRO_A0(bp)) {
  9451. bnapi = bp->bnapi[cp_nr_rings];
  9452. netif_napi_add(bp->dev, &bnapi->napi, bnxt_poll_nitroa0);
  9453. }
  9454. }
  9455. static void bnxt_disable_napi(struct bnxt *bp)
  9456. {
  9457. int i;
  9458. if (!bp->bnapi ||
  9459. test_and_set_bit(BNXT_STATE_NAPI_DISABLED, &bp->state))
  9460. return;
  9461. for (i = 0; i < bp->cp_nr_rings; i++) {
  9462. struct bnxt_napi *bnapi = bp->bnapi[i];
  9463. struct bnxt_cp_ring_info *cpr;
  9464. cpr = &bnapi->cp_ring;
  9465. if (bnapi->tx_fault)
  9466. cpr->sw_stats->tx.tx_resets++;
  9467. if (bnapi->in_reset)
  9468. cpr->sw_stats->rx.rx_resets++;
  9469. napi_disable(&bnapi->napi);
  9470. }
  9471. }
  9472. static void bnxt_enable_napi(struct bnxt *bp)
  9473. {
  9474. int i;
  9475. clear_bit(BNXT_STATE_NAPI_DISABLED, &bp->state);
  9476. for (i = 0; i < bp->cp_nr_rings; i++) {
  9477. struct bnxt_napi *bnapi = bp->bnapi[i];
  9478. struct bnxt_cp_ring_info *cpr;
  9479. bnapi->tx_fault = 0;
  9480. cpr = &bnapi->cp_ring;
  9481. bnapi->in_reset = false;
  9482. if (bnapi->rx_ring) {
  9483. INIT_WORK(&cpr->dim.work, bnxt_dim_work);
  9484. cpr->dim.mode = DIM_CQ_PERIOD_MODE_START_FROM_EQE;
  9485. }
  9486. napi_enable(&bnapi->napi);
  9487. }
  9488. }
  9489. void bnxt_tx_disable(struct bnxt *bp)
  9490. {
  9491. int i;
  9492. struct bnxt_tx_ring_info *txr;
  9493. if (bp->tx_ring) {
  9494. for (i = 0; i < bp->tx_nr_rings; i++) {
  9495. txr = &bp->tx_ring[i];
  9496. WRITE_ONCE(txr->dev_state, BNXT_DEV_STATE_CLOSING);
  9497. }
  9498. }
  9499. /* Make sure napi polls see @dev_state change */
  9500. synchronize_net();
  9501. /* Drop carrier first to prevent TX timeout */
  9502. netif_carrier_off(bp->dev);
  9503. /* Stop all TX queues */
  9504. netif_tx_disable(bp->dev);
  9505. }
  9506. void bnxt_tx_enable(struct bnxt *bp)
  9507. {
  9508. int i;
  9509. struct bnxt_tx_ring_info *txr;
  9510. for (i = 0; i < bp->tx_nr_rings; i++) {
  9511. txr = &bp->tx_ring[i];
  9512. WRITE_ONCE(txr->dev_state, 0);
  9513. }
  9514. /* Make sure napi polls see @dev_state change */
  9515. synchronize_net();
  9516. netif_tx_wake_all_queues(bp->dev);
  9517. if (BNXT_LINK_IS_UP(bp))
  9518. netif_carrier_on(bp->dev);
  9519. }
  9520. static char *bnxt_report_fec(struct bnxt_link_info *link_info)
  9521. {
  9522. u8 active_fec = link_info->active_fec_sig_mode &
  9523. PORT_PHY_QCFG_RESP_ACTIVE_FEC_MASK;
  9524. switch (active_fec) {
  9525. default:
  9526. case PORT_PHY_QCFG_RESP_ACTIVE_FEC_FEC_NONE_ACTIVE:
  9527. return "None";
  9528. case PORT_PHY_QCFG_RESP_ACTIVE_FEC_FEC_CLAUSE74_ACTIVE:
  9529. return "Clause 74 BaseR";
  9530. case PORT_PHY_QCFG_RESP_ACTIVE_FEC_FEC_CLAUSE91_ACTIVE:
  9531. return "Clause 91 RS(528,514)";
  9532. case PORT_PHY_QCFG_RESP_ACTIVE_FEC_FEC_RS544_1XN_ACTIVE:
  9533. return "Clause 91 RS544_1XN";
  9534. case PORT_PHY_QCFG_RESP_ACTIVE_FEC_FEC_RS544_IEEE_ACTIVE:
  9535. return "Clause 91 RS(544,514)";
  9536. case PORT_PHY_QCFG_RESP_ACTIVE_FEC_FEC_RS272_1XN_ACTIVE:
  9537. return "Clause 91 RS272_1XN";
  9538. case PORT_PHY_QCFG_RESP_ACTIVE_FEC_FEC_RS272_IEEE_ACTIVE:
  9539. return "Clause 91 RS(272,257)";
  9540. }
  9541. }
  9542. void bnxt_report_link(struct bnxt *bp)
  9543. {
  9544. if (BNXT_LINK_IS_UP(bp)) {
  9545. const char *signal = "";
  9546. const char *flow_ctrl;
  9547. const char *duplex;
  9548. u32 speed;
  9549. u16 fec;
  9550. netif_carrier_on(bp->dev);
  9551. speed = bnxt_fw_to_ethtool_speed(bp->link_info.link_speed);
  9552. if (speed == SPEED_UNKNOWN) {
  9553. netdev_info(bp->dev, "NIC Link is Up, speed unknown\n");
  9554. return;
  9555. }
  9556. if (bp->link_info.duplex == BNXT_LINK_DUPLEX_FULL)
  9557. duplex = "full";
  9558. else
  9559. duplex = "half";
  9560. if (bp->link_info.pause == BNXT_LINK_PAUSE_BOTH)
  9561. flow_ctrl = "ON - receive & transmit";
  9562. else if (bp->link_info.pause == BNXT_LINK_PAUSE_TX)
  9563. flow_ctrl = "ON - transmit";
  9564. else if (bp->link_info.pause == BNXT_LINK_PAUSE_RX)
  9565. flow_ctrl = "ON - receive";
  9566. else
  9567. flow_ctrl = "none";
  9568. if (bp->link_info.phy_qcfg_resp.option_flags &
  9569. PORT_PHY_QCFG_RESP_OPTION_FLAGS_SIGNAL_MODE_KNOWN) {
  9570. u8 sig_mode = bp->link_info.active_fec_sig_mode &
  9571. PORT_PHY_QCFG_RESP_SIGNAL_MODE_MASK;
  9572. switch (sig_mode) {
  9573. case PORT_PHY_QCFG_RESP_SIGNAL_MODE_NRZ:
  9574. signal = "(NRZ) ";
  9575. break;
  9576. case PORT_PHY_QCFG_RESP_SIGNAL_MODE_PAM4:
  9577. signal = "(PAM4 56Gbps) ";
  9578. break;
  9579. case PORT_PHY_QCFG_RESP_SIGNAL_MODE_PAM4_112:
  9580. signal = "(PAM4 112Gbps) ";
  9581. break;
  9582. default:
  9583. break;
  9584. }
  9585. }
  9586. netdev_info(bp->dev, "NIC Link is Up, %u Mbps %s%s duplex, Flow control: %s\n",
  9587. speed, signal, duplex, flow_ctrl);
  9588. if (bp->phy_flags & BNXT_PHY_FL_EEE_CAP)
  9589. netdev_info(bp->dev, "EEE is %s\n",
  9590. bp->eee.eee_active ? "active" :
  9591. "not active");
  9592. fec = bp->link_info.fec_cfg;
  9593. if (!(fec & PORT_PHY_QCFG_RESP_FEC_CFG_FEC_NONE_SUPPORTED))
  9594. netdev_info(bp->dev, "FEC autoneg %s encoding: %s\n",
  9595. (fec & BNXT_FEC_AUTONEG) ? "on" : "off",
  9596. bnxt_report_fec(&bp->link_info));
  9597. } else {
  9598. netif_carrier_off(bp->dev);
  9599. netdev_err(bp->dev, "NIC Link is Down\n");
  9600. }
  9601. }
  9602. static bool bnxt_phy_qcaps_no_speed(struct hwrm_port_phy_qcaps_output *resp)
  9603. {
  9604. if (!resp->supported_speeds_auto_mode &&
  9605. !resp->supported_speeds_force_mode &&
  9606. !resp->supported_pam4_speeds_auto_mode &&
  9607. !resp->supported_pam4_speeds_force_mode &&
  9608. !resp->supported_speeds2_auto_mode &&
  9609. !resp->supported_speeds2_force_mode)
  9610. return true;
  9611. return false;
  9612. }
  9613. static int bnxt_hwrm_phy_qcaps(struct bnxt *bp)
  9614. {
  9615. struct bnxt_link_info *link_info = &bp->link_info;
  9616. struct hwrm_port_phy_qcaps_output *resp;
  9617. struct hwrm_port_phy_qcaps_input *req;
  9618. int rc = 0;
  9619. if (bp->hwrm_spec_code < 0x10201)
  9620. return 0;
  9621. rc = hwrm_req_init(bp, req, HWRM_PORT_PHY_QCAPS);
  9622. if (rc)
  9623. return rc;
  9624. resp = hwrm_req_hold(bp, req);
  9625. rc = hwrm_req_send(bp, req);
  9626. if (rc)
  9627. goto hwrm_phy_qcaps_exit;
  9628. bp->phy_flags = resp->flags | (le16_to_cpu(resp->flags2) << 8);
  9629. if (resp->flags & PORT_PHY_QCAPS_RESP_FLAGS_EEE_SUPPORTED) {
  9630. struct ethtool_keee *eee = &bp->eee;
  9631. u16 fw_speeds = le16_to_cpu(resp->supported_speeds_eee_mode);
  9632. _bnxt_fw_to_linkmode(eee->supported, fw_speeds);
  9633. bp->lpi_tmr_lo = le32_to_cpu(resp->tx_lpi_timer_low) &
  9634. PORT_PHY_QCAPS_RESP_TX_LPI_TIMER_LOW_MASK;
  9635. bp->lpi_tmr_hi = le32_to_cpu(resp->valid_tx_lpi_timer_high) &
  9636. PORT_PHY_QCAPS_RESP_TX_LPI_TIMER_HIGH_MASK;
  9637. }
  9638. if (bp->hwrm_spec_code >= 0x10a01) {
  9639. if (bnxt_phy_qcaps_no_speed(resp)) {
  9640. link_info->phy_state = BNXT_PHY_STATE_DISABLED;
  9641. netdev_warn(bp->dev, "Ethernet link disabled\n");
  9642. } else if (link_info->phy_state == BNXT_PHY_STATE_DISABLED) {
  9643. link_info->phy_state = BNXT_PHY_STATE_ENABLED;
  9644. netdev_info(bp->dev, "Ethernet link enabled\n");
  9645. /* Phy re-enabled, reprobe the speeds */
  9646. link_info->support_auto_speeds = 0;
  9647. link_info->support_pam4_auto_speeds = 0;
  9648. link_info->support_auto_speeds2 = 0;
  9649. }
  9650. }
  9651. if (resp->supported_speeds_auto_mode)
  9652. link_info->support_auto_speeds =
  9653. le16_to_cpu(resp->supported_speeds_auto_mode);
  9654. if (resp->supported_pam4_speeds_auto_mode)
  9655. link_info->support_pam4_auto_speeds =
  9656. le16_to_cpu(resp->supported_pam4_speeds_auto_mode);
  9657. if (resp->supported_speeds2_auto_mode)
  9658. link_info->support_auto_speeds2 =
  9659. le16_to_cpu(resp->supported_speeds2_auto_mode);
  9660. bp->port_count = resp->port_cnt;
  9661. hwrm_phy_qcaps_exit:
  9662. hwrm_req_drop(bp, req);
  9663. return rc;
  9664. }
  9665. static bool bnxt_support_dropped(u16 advertising, u16 supported)
  9666. {
  9667. u16 diff = advertising ^ supported;
  9668. return ((supported | diff) != supported);
  9669. }
  9670. static bool bnxt_support_speed_dropped(struct bnxt_link_info *link_info)
  9671. {
  9672. struct bnxt *bp = container_of(link_info, struct bnxt, link_info);
  9673. /* Check if any advertised speeds are no longer supported. The caller
  9674. * holds the link_lock mutex, so we can modify link_info settings.
  9675. */
  9676. if (bp->phy_flags & BNXT_PHY_FL_SPEEDS2) {
  9677. if (bnxt_support_dropped(link_info->advertising,
  9678. link_info->support_auto_speeds2)) {
  9679. link_info->advertising = link_info->support_auto_speeds2;
  9680. return true;
  9681. }
  9682. return false;
  9683. }
  9684. if (bnxt_support_dropped(link_info->advertising,
  9685. link_info->support_auto_speeds)) {
  9686. link_info->advertising = link_info->support_auto_speeds;
  9687. return true;
  9688. }
  9689. if (bnxt_support_dropped(link_info->advertising_pam4,
  9690. link_info->support_pam4_auto_speeds)) {
  9691. link_info->advertising_pam4 = link_info->support_pam4_auto_speeds;
  9692. return true;
  9693. }
  9694. return false;
  9695. }
  9696. int bnxt_update_link(struct bnxt *bp, bool chng_link_state)
  9697. {
  9698. struct bnxt_link_info *link_info = &bp->link_info;
  9699. struct hwrm_port_phy_qcfg_output *resp;
  9700. struct hwrm_port_phy_qcfg_input *req;
  9701. u8 link_state = link_info->link_state;
  9702. bool support_changed;
  9703. int rc;
  9704. rc = hwrm_req_init(bp, req, HWRM_PORT_PHY_QCFG);
  9705. if (rc)
  9706. return rc;
  9707. resp = hwrm_req_hold(bp, req);
  9708. rc = hwrm_req_send(bp, req);
  9709. if (rc) {
  9710. hwrm_req_drop(bp, req);
  9711. if (BNXT_VF(bp) && rc == -ENODEV) {
  9712. netdev_warn(bp->dev, "Cannot obtain link state while PF unavailable.\n");
  9713. rc = 0;
  9714. }
  9715. return rc;
  9716. }
  9717. memcpy(&link_info->phy_qcfg_resp, resp, sizeof(*resp));
  9718. link_info->phy_link_status = resp->link;
  9719. link_info->duplex = resp->duplex_cfg;
  9720. if (bp->hwrm_spec_code >= 0x10800)
  9721. link_info->duplex = resp->duplex_state;
  9722. link_info->pause = resp->pause;
  9723. link_info->auto_mode = resp->auto_mode;
  9724. link_info->auto_pause_setting = resp->auto_pause;
  9725. link_info->lp_pause = resp->link_partner_adv_pause;
  9726. link_info->force_pause_setting = resp->force_pause;
  9727. link_info->duplex_setting = resp->duplex_cfg;
  9728. if (link_info->phy_link_status == BNXT_LINK_LINK) {
  9729. link_info->link_speed = le16_to_cpu(resp->link_speed);
  9730. if (bp->phy_flags & BNXT_PHY_FL_SPEEDS2)
  9731. link_info->active_lanes = resp->active_lanes;
  9732. } else {
  9733. link_info->link_speed = 0;
  9734. link_info->active_lanes = 0;
  9735. }
  9736. link_info->force_link_speed = le16_to_cpu(resp->force_link_speed);
  9737. link_info->force_pam4_link_speed =
  9738. le16_to_cpu(resp->force_pam4_link_speed);
  9739. link_info->force_link_speed2 = le16_to_cpu(resp->force_link_speeds2);
  9740. link_info->support_speeds = le16_to_cpu(resp->support_speeds);
  9741. link_info->support_pam4_speeds = le16_to_cpu(resp->support_pam4_speeds);
  9742. link_info->support_speeds2 = le16_to_cpu(resp->support_speeds2);
  9743. link_info->auto_link_speeds = le16_to_cpu(resp->auto_link_speed_mask);
  9744. link_info->auto_pam4_link_speeds =
  9745. le16_to_cpu(resp->auto_pam4_link_speed_mask);
  9746. link_info->auto_link_speeds2 = le16_to_cpu(resp->auto_link_speeds2);
  9747. link_info->lp_auto_link_speeds =
  9748. le16_to_cpu(resp->link_partner_adv_speeds);
  9749. link_info->lp_auto_pam4_link_speeds =
  9750. resp->link_partner_pam4_adv_speeds;
  9751. link_info->preemphasis = le32_to_cpu(resp->preemphasis);
  9752. link_info->phy_ver[0] = resp->phy_maj;
  9753. link_info->phy_ver[1] = resp->phy_min;
  9754. link_info->phy_ver[2] = resp->phy_bld;
  9755. link_info->media_type = resp->media_type;
  9756. link_info->phy_type = resp->phy_type;
  9757. link_info->transceiver = resp->xcvr_pkg_type;
  9758. link_info->phy_addr = resp->eee_config_phy_addr &
  9759. PORT_PHY_QCFG_RESP_PHY_ADDR_MASK;
  9760. link_info->module_status = resp->module_status;
  9761. if (bp->phy_flags & BNXT_PHY_FL_EEE_CAP) {
  9762. struct ethtool_keee *eee = &bp->eee;
  9763. u16 fw_speeds;
  9764. eee->eee_active = 0;
  9765. if (resp->eee_config_phy_addr &
  9766. PORT_PHY_QCFG_RESP_EEE_CONFIG_EEE_ACTIVE) {
  9767. eee->eee_active = 1;
  9768. fw_speeds = le16_to_cpu(
  9769. resp->link_partner_adv_eee_link_speed_mask);
  9770. _bnxt_fw_to_linkmode(eee->lp_advertised, fw_speeds);
  9771. }
  9772. /* Pull initial EEE config */
  9773. if (!chng_link_state) {
  9774. if (resp->eee_config_phy_addr &
  9775. PORT_PHY_QCFG_RESP_EEE_CONFIG_EEE_ENABLED)
  9776. eee->eee_enabled = 1;
  9777. fw_speeds = le16_to_cpu(resp->adv_eee_link_speed_mask);
  9778. _bnxt_fw_to_linkmode(eee->advertised, fw_speeds);
  9779. if (resp->eee_config_phy_addr &
  9780. PORT_PHY_QCFG_RESP_EEE_CONFIG_EEE_TX_LPI) {
  9781. __le32 tmr;
  9782. eee->tx_lpi_enabled = 1;
  9783. tmr = resp->xcvr_identifier_type_tx_lpi_timer;
  9784. eee->tx_lpi_timer = le32_to_cpu(tmr) &
  9785. PORT_PHY_QCFG_RESP_TX_LPI_TIMER_MASK;
  9786. }
  9787. }
  9788. }
  9789. link_info->fec_cfg = PORT_PHY_QCFG_RESP_FEC_CFG_FEC_NONE_SUPPORTED;
  9790. if (bp->hwrm_spec_code >= 0x10504) {
  9791. link_info->fec_cfg = le16_to_cpu(resp->fec_cfg);
  9792. link_info->active_fec_sig_mode = resp->active_fec_signal_mode;
  9793. }
  9794. /* TODO: need to add more logic to report VF link */
  9795. if (chng_link_state) {
  9796. if (link_info->phy_link_status == BNXT_LINK_LINK)
  9797. link_info->link_state = BNXT_LINK_STATE_UP;
  9798. else
  9799. link_info->link_state = BNXT_LINK_STATE_DOWN;
  9800. if (link_state != link_info->link_state)
  9801. bnxt_report_link(bp);
  9802. } else {
  9803. /* always link down if not require to update link state */
  9804. link_info->link_state = BNXT_LINK_STATE_DOWN;
  9805. }
  9806. hwrm_req_drop(bp, req);
  9807. if (!BNXT_PHY_CFG_ABLE(bp))
  9808. return 0;
  9809. support_changed = bnxt_support_speed_dropped(link_info);
  9810. if (support_changed && (link_info->autoneg & BNXT_AUTONEG_SPEED))
  9811. bnxt_hwrm_set_link_setting(bp, true, false);
  9812. return 0;
  9813. }
  9814. static void bnxt_get_port_module_status(struct bnxt *bp)
  9815. {
  9816. struct bnxt_link_info *link_info = &bp->link_info;
  9817. struct hwrm_port_phy_qcfg_output *resp = &link_info->phy_qcfg_resp;
  9818. u8 module_status;
  9819. if (bnxt_update_link(bp, true))
  9820. return;
  9821. module_status = link_info->module_status;
  9822. switch (module_status) {
  9823. case PORT_PHY_QCFG_RESP_MODULE_STATUS_DISABLETX:
  9824. case PORT_PHY_QCFG_RESP_MODULE_STATUS_PWRDOWN:
  9825. case PORT_PHY_QCFG_RESP_MODULE_STATUS_WARNINGMSG:
  9826. netdev_warn(bp->dev, "Unqualified SFP+ module detected on port %d\n",
  9827. bp->pf.port_id);
  9828. if (bp->hwrm_spec_code >= 0x10201) {
  9829. netdev_warn(bp->dev, "Module part number %s\n",
  9830. resp->phy_vendor_partnumber);
  9831. }
  9832. if (module_status == PORT_PHY_QCFG_RESP_MODULE_STATUS_DISABLETX)
  9833. netdev_warn(bp->dev, "TX is disabled\n");
  9834. if (module_status == PORT_PHY_QCFG_RESP_MODULE_STATUS_PWRDOWN)
  9835. netdev_warn(bp->dev, "SFP+ module is shutdown\n");
  9836. }
  9837. }
  9838. static void
  9839. bnxt_hwrm_set_pause_common(struct bnxt *bp, struct hwrm_port_phy_cfg_input *req)
  9840. {
  9841. if (bp->link_info.autoneg & BNXT_AUTONEG_FLOW_CTRL) {
  9842. if (bp->hwrm_spec_code >= 0x10201)
  9843. req->auto_pause =
  9844. PORT_PHY_CFG_REQ_AUTO_PAUSE_AUTONEG_PAUSE;
  9845. if (bp->link_info.req_flow_ctrl & BNXT_LINK_PAUSE_RX)
  9846. req->auto_pause |= PORT_PHY_CFG_REQ_AUTO_PAUSE_RX;
  9847. if (bp->link_info.req_flow_ctrl & BNXT_LINK_PAUSE_TX)
  9848. req->auto_pause |= PORT_PHY_CFG_REQ_AUTO_PAUSE_TX;
  9849. req->enables |=
  9850. cpu_to_le32(PORT_PHY_CFG_REQ_ENABLES_AUTO_PAUSE);
  9851. } else {
  9852. if (bp->link_info.req_flow_ctrl & BNXT_LINK_PAUSE_RX)
  9853. req->force_pause |= PORT_PHY_CFG_REQ_FORCE_PAUSE_RX;
  9854. if (bp->link_info.req_flow_ctrl & BNXT_LINK_PAUSE_TX)
  9855. req->force_pause |= PORT_PHY_CFG_REQ_FORCE_PAUSE_TX;
  9856. req->enables |=
  9857. cpu_to_le32(PORT_PHY_CFG_REQ_ENABLES_FORCE_PAUSE);
  9858. if (bp->hwrm_spec_code >= 0x10201) {
  9859. req->auto_pause = req->force_pause;
  9860. req->enables |= cpu_to_le32(
  9861. PORT_PHY_CFG_REQ_ENABLES_AUTO_PAUSE);
  9862. }
  9863. }
  9864. }
  9865. static void bnxt_hwrm_set_link_common(struct bnxt *bp, struct hwrm_port_phy_cfg_input *req)
  9866. {
  9867. if (bp->link_info.autoneg & BNXT_AUTONEG_SPEED) {
  9868. req->auto_mode |= PORT_PHY_CFG_REQ_AUTO_MODE_SPEED_MASK;
  9869. if (bp->phy_flags & BNXT_PHY_FL_SPEEDS2) {
  9870. req->enables |=
  9871. cpu_to_le32(PORT_PHY_CFG_REQ_ENABLES_AUTO_LINK_SPEEDS2_MASK);
  9872. req->auto_link_speeds2_mask = cpu_to_le16(bp->link_info.advertising);
  9873. } else if (bp->link_info.advertising) {
  9874. req->enables |= cpu_to_le32(PORT_PHY_CFG_REQ_ENABLES_AUTO_LINK_SPEED_MASK);
  9875. req->auto_link_speed_mask = cpu_to_le16(bp->link_info.advertising);
  9876. }
  9877. if (bp->link_info.advertising_pam4) {
  9878. req->enables |=
  9879. cpu_to_le32(PORT_PHY_CFG_REQ_ENABLES_AUTO_PAM4_LINK_SPEED_MASK);
  9880. req->auto_link_pam4_speed_mask =
  9881. cpu_to_le16(bp->link_info.advertising_pam4);
  9882. }
  9883. req->enables |= cpu_to_le32(PORT_PHY_CFG_REQ_ENABLES_AUTO_MODE);
  9884. req->flags |= cpu_to_le32(PORT_PHY_CFG_REQ_FLAGS_RESTART_AUTONEG);
  9885. } else {
  9886. req->flags |= cpu_to_le32(PORT_PHY_CFG_REQ_FLAGS_FORCE);
  9887. if (bp->phy_flags & BNXT_PHY_FL_SPEEDS2) {
  9888. req->force_link_speeds2 = cpu_to_le16(bp->link_info.req_link_speed);
  9889. req->enables |= cpu_to_le32(PORT_PHY_CFG_REQ_ENABLES_FORCE_LINK_SPEEDS2);
  9890. netif_info(bp, link, bp->dev, "Forcing FW speed2: %d\n",
  9891. (u32)bp->link_info.req_link_speed);
  9892. } else if (bp->link_info.req_signal_mode == BNXT_SIG_MODE_PAM4) {
  9893. req->force_pam4_link_speed = cpu_to_le16(bp->link_info.req_link_speed);
  9894. req->enables |= cpu_to_le32(PORT_PHY_CFG_REQ_ENABLES_FORCE_PAM4_LINK_SPEED);
  9895. } else {
  9896. req->force_link_speed = cpu_to_le16(bp->link_info.req_link_speed);
  9897. }
  9898. }
  9899. /* tell chimp that the setting takes effect immediately */
  9900. req->flags |= cpu_to_le32(PORT_PHY_CFG_REQ_FLAGS_RESET_PHY);
  9901. }
  9902. int bnxt_hwrm_set_pause(struct bnxt *bp)
  9903. {
  9904. struct hwrm_port_phy_cfg_input *req;
  9905. int rc;
  9906. rc = hwrm_req_init(bp, req, HWRM_PORT_PHY_CFG);
  9907. if (rc)
  9908. return rc;
  9909. bnxt_hwrm_set_pause_common(bp, req);
  9910. if ((bp->link_info.autoneg & BNXT_AUTONEG_FLOW_CTRL) ||
  9911. bp->link_info.force_link_chng)
  9912. bnxt_hwrm_set_link_common(bp, req);
  9913. rc = hwrm_req_send(bp, req);
  9914. if (!rc && !(bp->link_info.autoneg & BNXT_AUTONEG_FLOW_CTRL)) {
  9915. /* since changing of pause setting doesn't trigger any link
  9916. * change event, the driver needs to update the current pause
  9917. * result upon successfully return of the phy_cfg command
  9918. */
  9919. bp->link_info.pause =
  9920. bp->link_info.force_pause_setting = bp->link_info.req_flow_ctrl;
  9921. bp->link_info.auto_pause_setting = 0;
  9922. if (!bp->link_info.force_link_chng)
  9923. bnxt_report_link(bp);
  9924. }
  9925. bp->link_info.force_link_chng = false;
  9926. return rc;
  9927. }
  9928. static void bnxt_hwrm_set_eee(struct bnxt *bp,
  9929. struct hwrm_port_phy_cfg_input *req)
  9930. {
  9931. struct ethtool_keee *eee = &bp->eee;
  9932. if (eee->eee_enabled) {
  9933. u16 eee_speeds;
  9934. u32 flags = PORT_PHY_CFG_REQ_FLAGS_EEE_ENABLE;
  9935. if (eee->tx_lpi_enabled)
  9936. flags |= PORT_PHY_CFG_REQ_FLAGS_EEE_TX_LPI_ENABLE;
  9937. else
  9938. flags |= PORT_PHY_CFG_REQ_FLAGS_EEE_TX_LPI_DISABLE;
  9939. req->flags |= cpu_to_le32(flags);
  9940. eee_speeds = bnxt_get_fw_auto_link_speeds(eee->advertised);
  9941. req->eee_link_speed_mask = cpu_to_le16(eee_speeds);
  9942. req->tx_lpi_timer = cpu_to_le32(eee->tx_lpi_timer);
  9943. } else {
  9944. req->flags |= cpu_to_le32(PORT_PHY_CFG_REQ_FLAGS_EEE_DISABLE);
  9945. }
  9946. }
  9947. int bnxt_hwrm_set_link_setting(struct bnxt *bp, bool set_pause, bool set_eee)
  9948. {
  9949. struct hwrm_port_phy_cfg_input *req;
  9950. int rc;
  9951. rc = hwrm_req_init(bp, req, HWRM_PORT_PHY_CFG);
  9952. if (rc)
  9953. return rc;
  9954. if (set_pause)
  9955. bnxt_hwrm_set_pause_common(bp, req);
  9956. bnxt_hwrm_set_link_common(bp, req);
  9957. if (set_eee)
  9958. bnxt_hwrm_set_eee(bp, req);
  9959. return hwrm_req_send(bp, req);
  9960. }
  9961. static int bnxt_hwrm_shutdown_link(struct bnxt *bp)
  9962. {
  9963. struct hwrm_port_phy_cfg_input *req;
  9964. int rc;
  9965. if (!BNXT_SINGLE_PF(bp))
  9966. return 0;
  9967. if (pci_num_vf(bp->pdev) &&
  9968. !(bp->phy_flags & BNXT_PHY_FL_FW_MANAGED_LKDN))
  9969. return 0;
  9970. rc = hwrm_req_init(bp, req, HWRM_PORT_PHY_CFG);
  9971. if (rc)
  9972. return rc;
  9973. req->flags = cpu_to_le32(PORT_PHY_CFG_REQ_FLAGS_FORCE_LINK_DWN);
  9974. rc = hwrm_req_send(bp, req);
  9975. if (!rc) {
  9976. mutex_lock(&bp->link_lock);
  9977. /* Device is not obliged link down in certain scenarios, even
  9978. * when forced. Setting the state unknown is consistent with
  9979. * driver startup and will force link state to be reported
  9980. * during subsequent open based on PORT_PHY_QCFG.
  9981. */
  9982. bp->link_info.link_state = BNXT_LINK_STATE_UNKNOWN;
  9983. mutex_unlock(&bp->link_lock);
  9984. }
  9985. return rc;
  9986. }
  9987. static int bnxt_fw_reset_via_optee(struct bnxt *bp)
  9988. {
  9989. #ifdef CONFIG_TEE_BNXT_FW
  9990. int rc = tee_bnxt_fw_load();
  9991. if (rc)
  9992. netdev_err(bp->dev, "Failed FW reset via OP-TEE, rc=%d\n", rc);
  9993. return rc;
  9994. #else
  9995. netdev_err(bp->dev, "OP-TEE not supported\n");
  9996. return -ENODEV;
  9997. #endif
  9998. }
  9999. static int bnxt_try_recover_fw(struct bnxt *bp)
  10000. {
  10001. if (bp->fw_health && bp->fw_health->status_reliable) {
  10002. int retry = 0, rc;
  10003. u32 sts;
  10004. do {
  10005. sts = bnxt_fw_health_readl(bp, BNXT_FW_HEALTH_REG);
  10006. rc = bnxt_hwrm_poll(bp);
  10007. if (!BNXT_FW_IS_BOOTING(sts) &&
  10008. !BNXT_FW_IS_RECOVERING(sts))
  10009. break;
  10010. retry++;
  10011. } while (rc == -EBUSY && retry < BNXT_FW_RETRY);
  10012. if (!BNXT_FW_IS_HEALTHY(sts)) {
  10013. netdev_err(bp->dev,
  10014. "Firmware not responding, status: 0x%x\n",
  10015. sts);
  10016. rc = -ENODEV;
  10017. }
  10018. if (sts & FW_STATUS_REG_CRASHED_NO_MASTER) {
  10019. netdev_warn(bp->dev, "Firmware recover via OP-TEE requested\n");
  10020. return bnxt_fw_reset_via_optee(bp);
  10021. }
  10022. return rc;
  10023. }
  10024. return -ENODEV;
  10025. }
  10026. static void bnxt_clear_reservations(struct bnxt *bp, bool fw_reset)
  10027. {
  10028. struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
  10029. if (!BNXT_NEW_RM(bp))
  10030. return; /* no resource reservations required */
  10031. hw_resc->resv_cp_rings = 0;
  10032. hw_resc->resv_stat_ctxs = 0;
  10033. hw_resc->resv_irqs = 0;
  10034. hw_resc->resv_tx_rings = 0;
  10035. hw_resc->resv_rx_rings = 0;
  10036. hw_resc->resv_hw_ring_grps = 0;
  10037. hw_resc->resv_vnics = 0;
  10038. hw_resc->resv_rsscos_ctxs = 0;
  10039. if (!fw_reset) {
  10040. bp->tx_nr_rings = 0;
  10041. bp->rx_nr_rings = 0;
  10042. }
  10043. }
  10044. int bnxt_cancel_reservations(struct bnxt *bp, bool fw_reset)
  10045. {
  10046. int rc;
  10047. if (!BNXT_NEW_RM(bp))
  10048. return 0; /* no resource reservations required */
  10049. rc = bnxt_hwrm_func_resc_qcaps(bp, true);
  10050. if (rc)
  10051. netdev_err(bp->dev, "resc_qcaps failed\n");
  10052. bnxt_clear_reservations(bp, fw_reset);
  10053. return rc;
  10054. }
  10055. static int bnxt_hwrm_if_change(struct bnxt *bp, bool up)
  10056. {
  10057. struct hwrm_func_drv_if_change_output *resp;
  10058. struct hwrm_func_drv_if_change_input *req;
  10059. bool fw_reset = !bp->irq_tbl;
  10060. bool resc_reinit = false;
  10061. bool caps_change = false;
  10062. int rc, retry = 0;
  10063. u32 flags = 0;
  10064. if (!(bp->fw_cap & BNXT_FW_CAP_IF_CHANGE))
  10065. return 0;
  10066. rc = hwrm_req_init(bp, req, HWRM_FUNC_DRV_IF_CHANGE);
  10067. if (rc)
  10068. return rc;
  10069. if (up)
  10070. req->flags = cpu_to_le32(FUNC_DRV_IF_CHANGE_REQ_FLAGS_UP);
  10071. resp = hwrm_req_hold(bp, req);
  10072. hwrm_req_flags(bp, req, BNXT_HWRM_FULL_WAIT);
  10073. while (retry < BNXT_FW_IF_RETRY) {
  10074. rc = hwrm_req_send(bp, req);
  10075. if (rc != -EAGAIN)
  10076. break;
  10077. msleep(50);
  10078. retry++;
  10079. }
  10080. if (rc == -EAGAIN) {
  10081. hwrm_req_drop(bp, req);
  10082. return rc;
  10083. } else if (!rc) {
  10084. flags = le32_to_cpu(resp->flags);
  10085. } else if (up) {
  10086. rc = bnxt_try_recover_fw(bp);
  10087. fw_reset = true;
  10088. }
  10089. hwrm_req_drop(bp, req);
  10090. if (rc)
  10091. return rc;
  10092. if (!up) {
  10093. bnxt_inv_fw_health_reg(bp);
  10094. return 0;
  10095. }
  10096. if (flags & FUNC_DRV_IF_CHANGE_RESP_FLAGS_RESC_CHANGE)
  10097. resc_reinit = true;
  10098. if (flags & FUNC_DRV_IF_CHANGE_RESP_FLAGS_HOT_FW_RESET_DONE ||
  10099. test_bit(BNXT_STATE_FW_RESET_DET, &bp->state))
  10100. fw_reset = true;
  10101. else
  10102. bnxt_remap_fw_health_regs(bp);
  10103. if (test_bit(BNXT_STATE_IN_FW_RESET, &bp->state) && !fw_reset) {
  10104. netdev_err(bp->dev, "RESET_DONE not set during FW reset.\n");
  10105. set_bit(BNXT_STATE_ABORT_ERR, &bp->state);
  10106. return -ENODEV;
  10107. }
  10108. if (flags & FUNC_DRV_IF_CHANGE_RESP_FLAGS_CAPS_CHANGE)
  10109. caps_change = true;
  10110. if (resc_reinit || fw_reset || caps_change) {
  10111. if (fw_reset || caps_change) {
  10112. set_bit(BNXT_STATE_FW_RESET_DET, &bp->state);
  10113. if (!test_bit(BNXT_STATE_IN_FW_RESET, &bp->state))
  10114. bnxt_ulp_irq_stop(bp);
  10115. bnxt_free_ctx_mem(bp);
  10116. bnxt_dcb_free(bp);
  10117. rc = bnxt_fw_init_one(bp);
  10118. if (rc) {
  10119. clear_bit(BNXT_STATE_FW_RESET_DET, &bp->state);
  10120. set_bit(BNXT_STATE_ABORT_ERR, &bp->state);
  10121. return rc;
  10122. }
  10123. /* IRQ will be initialized later in bnxt_request_irq()*/
  10124. bnxt_clear_int_mode(bp);
  10125. }
  10126. rc = bnxt_cancel_reservations(bp, fw_reset);
  10127. }
  10128. return rc;
  10129. }
  10130. static int bnxt_hwrm_port_led_qcaps(struct bnxt *bp)
  10131. {
  10132. struct hwrm_port_led_qcaps_output *resp;
  10133. struct hwrm_port_led_qcaps_input *req;
  10134. struct bnxt_pf_info *pf = &bp->pf;
  10135. int rc;
  10136. bp->num_leds = 0;
  10137. if (BNXT_VF(bp) || bp->hwrm_spec_code < 0x10601)
  10138. return 0;
  10139. rc = hwrm_req_init(bp, req, HWRM_PORT_LED_QCAPS);
  10140. if (rc)
  10141. return rc;
  10142. req->port_id = cpu_to_le16(pf->port_id);
  10143. resp = hwrm_req_hold(bp, req);
  10144. rc = hwrm_req_send(bp, req);
  10145. if (rc) {
  10146. hwrm_req_drop(bp, req);
  10147. return rc;
  10148. }
  10149. if (resp->num_leds > 0 && resp->num_leds < BNXT_MAX_LED) {
  10150. int i;
  10151. bp->num_leds = resp->num_leds;
  10152. memcpy(bp->leds, &resp->led0_id, sizeof(bp->leds[0]) *
  10153. bp->num_leds);
  10154. for (i = 0; i < bp->num_leds; i++) {
  10155. struct bnxt_led_info *led = &bp->leds[i];
  10156. __le16 caps = led->led_state_caps;
  10157. if (!led->led_group_id ||
  10158. !BNXT_LED_ALT_BLINK_CAP(caps)) {
  10159. bp->num_leds = 0;
  10160. break;
  10161. }
  10162. }
  10163. }
  10164. hwrm_req_drop(bp, req);
  10165. return 0;
  10166. }
  10167. int bnxt_hwrm_alloc_wol_fltr(struct bnxt *bp)
  10168. {
  10169. struct hwrm_wol_filter_alloc_output *resp;
  10170. struct hwrm_wol_filter_alloc_input *req;
  10171. int rc;
  10172. rc = hwrm_req_init(bp, req, HWRM_WOL_FILTER_ALLOC);
  10173. if (rc)
  10174. return rc;
  10175. req->port_id = cpu_to_le16(bp->pf.port_id);
  10176. req->wol_type = WOL_FILTER_ALLOC_REQ_WOL_TYPE_MAGICPKT;
  10177. req->enables = cpu_to_le32(WOL_FILTER_ALLOC_REQ_ENABLES_MAC_ADDRESS);
  10178. memcpy(req->mac_address, bp->dev->dev_addr, ETH_ALEN);
  10179. resp = hwrm_req_hold(bp, req);
  10180. rc = hwrm_req_send(bp, req);
  10181. if (!rc)
  10182. bp->wol_filter_id = resp->wol_filter_id;
  10183. hwrm_req_drop(bp, req);
  10184. return rc;
  10185. }
  10186. int bnxt_hwrm_free_wol_fltr(struct bnxt *bp)
  10187. {
  10188. struct hwrm_wol_filter_free_input *req;
  10189. int rc;
  10190. rc = hwrm_req_init(bp, req, HWRM_WOL_FILTER_FREE);
  10191. if (rc)
  10192. return rc;
  10193. req->port_id = cpu_to_le16(bp->pf.port_id);
  10194. req->enables = cpu_to_le32(WOL_FILTER_FREE_REQ_ENABLES_WOL_FILTER_ID);
  10195. req->wol_filter_id = bp->wol_filter_id;
  10196. return hwrm_req_send(bp, req);
  10197. }
  10198. static u16 bnxt_hwrm_get_wol_fltrs(struct bnxt *bp, u16 handle)
  10199. {
  10200. struct hwrm_wol_filter_qcfg_output *resp;
  10201. struct hwrm_wol_filter_qcfg_input *req;
  10202. u16 next_handle = 0;
  10203. int rc;
  10204. rc = hwrm_req_init(bp, req, HWRM_WOL_FILTER_QCFG);
  10205. if (rc)
  10206. return rc;
  10207. req->port_id = cpu_to_le16(bp->pf.port_id);
  10208. req->handle = cpu_to_le16(handle);
  10209. resp = hwrm_req_hold(bp, req);
  10210. rc = hwrm_req_send(bp, req);
  10211. if (!rc) {
  10212. next_handle = le16_to_cpu(resp->next_handle);
  10213. if (next_handle != 0) {
  10214. if (resp->wol_type ==
  10215. WOL_FILTER_ALLOC_REQ_WOL_TYPE_MAGICPKT) {
  10216. bp->wol = 1;
  10217. bp->wol_filter_id = resp->wol_filter_id;
  10218. }
  10219. }
  10220. }
  10221. hwrm_req_drop(bp, req);
  10222. return next_handle;
  10223. }
  10224. static void bnxt_get_wol_settings(struct bnxt *bp)
  10225. {
  10226. u16 handle = 0;
  10227. bp->wol = 0;
  10228. if (!BNXT_PF(bp) || !(bp->flags & BNXT_FLAG_WOL_CAP))
  10229. return;
  10230. do {
  10231. handle = bnxt_hwrm_get_wol_fltrs(bp, handle);
  10232. } while (handle && handle != 0xffff);
  10233. }
  10234. static bool bnxt_eee_config_ok(struct bnxt *bp)
  10235. {
  10236. struct ethtool_keee *eee = &bp->eee;
  10237. struct bnxt_link_info *link_info = &bp->link_info;
  10238. if (!(bp->phy_flags & BNXT_PHY_FL_EEE_CAP))
  10239. return true;
  10240. if (eee->eee_enabled) {
  10241. __ETHTOOL_DECLARE_LINK_MODE_MASK(advertising);
  10242. __ETHTOOL_DECLARE_LINK_MODE_MASK(tmp);
  10243. _bnxt_fw_to_linkmode(advertising, link_info->advertising);
  10244. if (!(link_info->autoneg & BNXT_AUTONEG_SPEED)) {
  10245. eee->eee_enabled = 0;
  10246. return false;
  10247. }
  10248. if (linkmode_andnot(tmp, eee->advertised, advertising)) {
  10249. linkmode_and(eee->advertised, advertising,
  10250. eee->supported);
  10251. return false;
  10252. }
  10253. }
  10254. return true;
  10255. }
  10256. static int bnxt_update_phy_setting(struct bnxt *bp)
  10257. {
  10258. int rc;
  10259. bool update_link = false;
  10260. bool update_pause = false;
  10261. bool update_eee = false;
  10262. struct bnxt_link_info *link_info = &bp->link_info;
  10263. rc = bnxt_update_link(bp, true);
  10264. if (rc) {
  10265. netdev_err(bp->dev, "failed to update link (rc: %x)\n",
  10266. rc);
  10267. return rc;
  10268. }
  10269. if (!BNXT_SINGLE_PF(bp))
  10270. return 0;
  10271. if ((link_info->autoneg & BNXT_AUTONEG_FLOW_CTRL) &&
  10272. (link_info->auto_pause_setting & BNXT_LINK_PAUSE_BOTH) !=
  10273. link_info->req_flow_ctrl)
  10274. update_pause = true;
  10275. if (!(link_info->autoneg & BNXT_AUTONEG_FLOW_CTRL) &&
  10276. link_info->force_pause_setting != link_info->req_flow_ctrl)
  10277. update_pause = true;
  10278. if (!(link_info->autoneg & BNXT_AUTONEG_SPEED)) {
  10279. if (BNXT_AUTO_MODE(link_info->auto_mode))
  10280. update_link = true;
  10281. if (bnxt_force_speed_updated(link_info))
  10282. update_link = true;
  10283. if (link_info->req_duplex != link_info->duplex_setting)
  10284. update_link = true;
  10285. } else {
  10286. if (link_info->auto_mode == BNXT_LINK_AUTO_NONE)
  10287. update_link = true;
  10288. if (bnxt_auto_speed_updated(link_info))
  10289. update_link = true;
  10290. }
  10291. /* The last close may have shutdown the link, so need to call
  10292. * PHY_CFG to bring it back up.
  10293. */
  10294. if (!BNXT_LINK_IS_UP(bp))
  10295. update_link = true;
  10296. if (!bnxt_eee_config_ok(bp))
  10297. update_eee = true;
  10298. if (update_link)
  10299. rc = bnxt_hwrm_set_link_setting(bp, update_pause, update_eee);
  10300. else if (update_pause)
  10301. rc = bnxt_hwrm_set_pause(bp);
  10302. if (rc) {
  10303. netdev_err(bp->dev, "failed to update phy setting (rc: %x)\n",
  10304. rc);
  10305. return rc;
  10306. }
  10307. return rc;
  10308. }
  10309. static int bnxt_init_dflt_ring_mode(struct bnxt *bp);
  10310. static int bnxt_reinit_after_abort(struct bnxt *bp)
  10311. {
  10312. int rc;
  10313. if (test_bit(BNXT_STATE_IN_FW_RESET, &bp->state))
  10314. return -EBUSY;
  10315. if (bp->dev->reg_state == NETREG_UNREGISTERED)
  10316. return -ENODEV;
  10317. rc = bnxt_fw_init_one(bp);
  10318. if (!rc) {
  10319. bnxt_clear_int_mode(bp);
  10320. rc = bnxt_init_int_mode(bp);
  10321. if (!rc) {
  10322. clear_bit(BNXT_STATE_ABORT_ERR, &bp->state);
  10323. set_bit(BNXT_STATE_FW_RESET_DET, &bp->state);
  10324. }
  10325. }
  10326. return rc;
  10327. }
  10328. static void bnxt_cfg_one_usr_fltr(struct bnxt *bp, struct bnxt_filter_base *fltr)
  10329. {
  10330. struct bnxt_ntuple_filter *ntp_fltr;
  10331. struct bnxt_l2_filter *l2_fltr;
  10332. if (list_empty(&fltr->list))
  10333. return;
  10334. if (fltr->type == BNXT_FLTR_TYPE_NTUPLE) {
  10335. ntp_fltr = container_of(fltr, struct bnxt_ntuple_filter, base);
  10336. l2_fltr = bp->vnic_info[BNXT_VNIC_DEFAULT].l2_filters[0];
  10337. atomic_inc(&l2_fltr->refcnt);
  10338. ntp_fltr->l2_fltr = l2_fltr;
  10339. if (bnxt_hwrm_cfa_ntuple_filter_alloc(bp, ntp_fltr)) {
  10340. bnxt_del_ntp_filter(bp, ntp_fltr);
  10341. netdev_err(bp->dev, "restoring previously configured ntuple filter id %d failed\n",
  10342. fltr->sw_id);
  10343. }
  10344. } else if (fltr->type == BNXT_FLTR_TYPE_L2) {
  10345. l2_fltr = container_of(fltr, struct bnxt_l2_filter, base);
  10346. if (bnxt_hwrm_l2_filter_alloc(bp, l2_fltr)) {
  10347. bnxt_del_l2_filter(bp, l2_fltr);
  10348. netdev_err(bp->dev, "restoring previously configured l2 filter id %d failed\n",
  10349. fltr->sw_id);
  10350. }
  10351. }
  10352. }
  10353. static void bnxt_cfg_usr_fltrs(struct bnxt *bp)
  10354. {
  10355. struct bnxt_filter_base *usr_fltr, *tmp;
  10356. list_for_each_entry_safe(usr_fltr, tmp, &bp->usr_fltr_list, list)
  10357. bnxt_cfg_one_usr_fltr(bp, usr_fltr);
  10358. }
  10359. static int bnxt_set_xps_mapping(struct bnxt *bp)
  10360. {
  10361. int numa_node = dev_to_node(&bp->pdev->dev);
  10362. unsigned int q_idx, map_idx, cpu, i;
  10363. const struct cpumask *cpu_mask_ptr;
  10364. int nr_cpus = num_online_cpus();
  10365. cpumask_t *q_map;
  10366. int rc = 0;
  10367. q_map = kcalloc(bp->tx_nr_rings_per_tc, sizeof(*q_map), GFP_KERNEL);
  10368. if (!q_map)
  10369. return -ENOMEM;
  10370. /* Create CPU mask for all TX queues across MQPRIO traffic classes.
  10371. * Each TC has the same number of TX queues. The nth TX queue for each
  10372. * TC will have the same CPU mask.
  10373. */
  10374. for (i = 0; i < nr_cpus; i++) {
  10375. map_idx = i % bp->tx_nr_rings_per_tc;
  10376. cpu = cpumask_local_spread(i, numa_node);
  10377. cpu_mask_ptr = get_cpu_mask(cpu);
  10378. cpumask_or(&q_map[map_idx], &q_map[map_idx], cpu_mask_ptr);
  10379. }
  10380. /* Register CPU mask for each TX queue except the ones marked for XDP */
  10381. for (q_idx = 0; q_idx < bp->dev->real_num_tx_queues; q_idx++) {
  10382. map_idx = q_idx % bp->tx_nr_rings_per_tc;
  10383. rc = netif_set_xps_queue(bp->dev, &q_map[map_idx], q_idx);
  10384. if (rc) {
  10385. netdev_warn(bp->dev, "Error setting XPS for q:%d\n",
  10386. q_idx);
  10387. break;
  10388. }
  10389. }
  10390. kfree(q_map);
  10391. return rc;
  10392. }
  10393. static int bnxt_tx_nr_rings(struct bnxt *bp)
  10394. {
  10395. return bp->num_tc ? bp->tx_nr_rings_per_tc * bp->num_tc :
  10396. bp->tx_nr_rings_per_tc;
  10397. }
  10398. static int bnxt_tx_nr_rings_per_tc(struct bnxt *bp)
  10399. {
  10400. return bp->num_tc ? bp->tx_nr_rings / bp->num_tc : bp->tx_nr_rings;
  10401. }
  10402. static int __bnxt_open_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init)
  10403. {
  10404. int rc = 0;
  10405. netif_carrier_off(bp->dev);
  10406. if (irq_re_init) {
  10407. /* Reserve rings now if none were reserved at driver probe. */
  10408. rc = bnxt_init_dflt_ring_mode(bp);
  10409. if (rc) {
  10410. netdev_err(bp->dev, "Failed to reserve default rings at open\n");
  10411. return rc;
  10412. }
  10413. }
  10414. rc = bnxt_reserve_rings(bp, irq_re_init);
  10415. if (rc)
  10416. return rc;
  10417. /* Make adjustments if reserved TX rings are less than requested */
  10418. bp->tx_nr_rings -= bp->tx_nr_rings_xdp;
  10419. bp->tx_nr_rings_per_tc = bnxt_tx_nr_rings_per_tc(bp);
  10420. if (bp->tx_nr_rings_xdp) {
  10421. bp->tx_nr_rings_xdp = bp->tx_nr_rings_per_tc;
  10422. bp->tx_nr_rings += bp->tx_nr_rings_xdp;
  10423. }
  10424. rc = bnxt_alloc_mem(bp, irq_re_init);
  10425. if (rc) {
  10426. netdev_err(bp->dev, "bnxt_alloc_mem err: %x\n", rc);
  10427. goto open_err_free_mem;
  10428. }
  10429. if (irq_re_init) {
  10430. bnxt_init_napi(bp);
  10431. rc = bnxt_request_irq(bp);
  10432. if (rc) {
  10433. netdev_err(bp->dev, "bnxt_request_irq err: %x\n", rc);
  10434. goto open_err_irq;
  10435. }
  10436. }
  10437. rc = bnxt_init_nic(bp, irq_re_init);
  10438. if (rc) {
  10439. netdev_err(bp->dev, "bnxt_init_nic err: %x\n", rc);
  10440. goto open_err_irq;
  10441. }
  10442. bnxt_enable_napi(bp);
  10443. bnxt_debug_dev_init(bp);
  10444. if (link_re_init) {
  10445. mutex_lock(&bp->link_lock);
  10446. rc = bnxt_update_phy_setting(bp);
  10447. mutex_unlock(&bp->link_lock);
  10448. if (rc) {
  10449. netdev_warn(bp->dev, "failed to update phy settings\n");
  10450. if (BNXT_SINGLE_PF(bp)) {
  10451. bp->link_info.phy_retry = true;
  10452. bp->link_info.phy_retry_expires =
  10453. jiffies + 5 * HZ;
  10454. }
  10455. }
  10456. }
  10457. if (irq_re_init) {
  10458. udp_tunnel_nic_reset_ntf(bp->dev);
  10459. rc = bnxt_set_xps_mapping(bp);
  10460. if (rc)
  10461. netdev_warn(bp->dev, "failed to set xps mapping\n");
  10462. }
  10463. if (bp->tx_nr_rings_xdp < num_possible_cpus()) {
  10464. if (!static_key_enabled(&bnxt_xdp_locking_key))
  10465. static_branch_enable(&bnxt_xdp_locking_key);
  10466. } else if (static_key_enabled(&bnxt_xdp_locking_key)) {
  10467. static_branch_disable(&bnxt_xdp_locking_key);
  10468. }
  10469. set_bit(BNXT_STATE_OPEN, &bp->state);
  10470. bnxt_enable_int(bp);
  10471. /* Enable TX queues */
  10472. bnxt_tx_enable(bp);
  10473. mod_timer(&bp->timer, jiffies + bp->current_interval);
  10474. /* Poll link status and check for SFP+ module status */
  10475. mutex_lock(&bp->link_lock);
  10476. bnxt_get_port_module_status(bp);
  10477. mutex_unlock(&bp->link_lock);
  10478. /* VF-reps may need to be re-opened after the PF is re-opened */
  10479. if (BNXT_PF(bp))
  10480. bnxt_vf_reps_open(bp);
  10481. bnxt_ptp_init_rtc(bp, true);
  10482. bnxt_ptp_cfg_tstamp_filters(bp);
  10483. if (BNXT_SUPPORTS_MULTI_RSS_CTX(bp))
  10484. bnxt_hwrm_realloc_rss_ctx_vnic(bp);
  10485. bnxt_cfg_usr_fltrs(bp);
  10486. return 0;
  10487. open_err_irq:
  10488. bnxt_del_napi(bp);
  10489. open_err_free_mem:
  10490. bnxt_free_skbs(bp);
  10491. bnxt_free_irq(bp);
  10492. bnxt_free_mem(bp, true);
  10493. return rc;
  10494. }
  10495. /* rtnl_lock held */
  10496. int bnxt_open_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init)
  10497. {
  10498. int rc = 0;
  10499. if (test_bit(BNXT_STATE_ABORT_ERR, &bp->state))
  10500. rc = -EIO;
  10501. if (!rc)
  10502. rc = __bnxt_open_nic(bp, irq_re_init, link_re_init);
  10503. if (rc) {
  10504. netdev_err(bp->dev, "nic open fail (rc: %x)\n", rc);
  10505. dev_close(bp->dev);
  10506. }
  10507. return rc;
  10508. }
  10509. /* rtnl_lock held, open the NIC half way by allocating all resources, but
  10510. * NAPI, IRQ, and TX are not enabled. This is mainly used for offline
  10511. * self tests.
  10512. */
  10513. int bnxt_half_open_nic(struct bnxt *bp)
  10514. {
  10515. int rc = 0;
  10516. if (test_bit(BNXT_STATE_ABORT_ERR, &bp->state)) {
  10517. netdev_err(bp->dev, "A previous firmware reset has not completed, aborting half open\n");
  10518. rc = -ENODEV;
  10519. goto half_open_err;
  10520. }
  10521. rc = bnxt_alloc_mem(bp, true);
  10522. if (rc) {
  10523. netdev_err(bp->dev, "bnxt_alloc_mem err: %x\n", rc);
  10524. goto half_open_err;
  10525. }
  10526. bnxt_init_napi(bp);
  10527. set_bit(BNXT_STATE_HALF_OPEN, &bp->state);
  10528. rc = bnxt_init_nic(bp, true);
  10529. if (rc) {
  10530. clear_bit(BNXT_STATE_HALF_OPEN, &bp->state);
  10531. bnxt_del_napi(bp);
  10532. netdev_err(bp->dev, "bnxt_init_nic err: %x\n", rc);
  10533. goto half_open_err;
  10534. }
  10535. return 0;
  10536. half_open_err:
  10537. bnxt_free_skbs(bp);
  10538. bnxt_free_mem(bp, true);
  10539. dev_close(bp->dev);
  10540. return rc;
  10541. }
  10542. /* rtnl_lock held, this call can only be made after a previous successful
  10543. * call to bnxt_half_open_nic().
  10544. */
  10545. void bnxt_half_close_nic(struct bnxt *bp)
  10546. {
  10547. bnxt_hwrm_resource_free(bp, false, true);
  10548. bnxt_del_napi(bp);
  10549. bnxt_free_skbs(bp);
  10550. bnxt_free_mem(bp, true);
  10551. clear_bit(BNXT_STATE_HALF_OPEN, &bp->state);
  10552. }
  10553. void bnxt_reenable_sriov(struct bnxt *bp)
  10554. {
  10555. if (BNXT_PF(bp)) {
  10556. struct bnxt_pf_info *pf = &bp->pf;
  10557. int n = pf->active_vfs;
  10558. if (n)
  10559. bnxt_cfg_hw_sriov(bp, &n, true);
  10560. }
  10561. }
  10562. static int bnxt_open(struct net_device *dev)
  10563. {
  10564. struct bnxt *bp = netdev_priv(dev);
  10565. int rc;
  10566. if (test_bit(BNXT_STATE_ABORT_ERR, &bp->state)) {
  10567. rc = bnxt_reinit_after_abort(bp);
  10568. if (rc) {
  10569. if (rc == -EBUSY)
  10570. netdev_err(bp->dev, "A previous firmware reset has not completed, aborting\n");
  10571. else
  10572. netdev_err(bp->dev, "Failed to reinitialize after aborted firmware reset\n");
  10573. return -ENODEV;
  10574. }
  10575. }
  10576. rc = bnxt_hwrm_if_change(bp, true);
  10577. if (rc)
  10578. return rc;
  10579. rc = __bnxt_open_nic(bp, true, true);
  10580. if (rc) {
  10581. bnxt_hwrm_if_change(bp, false);
  10582. } else {
  10583. if (test_and_clear_bit(BNXT_STATE_FW_RESET_DET, &bp->state)) {
  10584. if (!test_bit(BNXT_STATE_IN_FW_RESET, &bp->state))
  10585. bnxt_queue_sp_work(bp,
  10586. BNXT_RESTART_ULP_SP_EVENT);
  10587. }
  10588. }
  10589. return rc;
  10590. }
  10591. static bool bnxt_drv_busy(struct bnxt *bp)
  10592. {
  10593. return (test_bit(BNXT_STATE_IN_SP_TASK, &bp->state) ||
  10594. test_bit(BNXT_STATE_READ_STATS, &bp->state));
  10595. }
  10596. static void bnxt_get_ring_stats(struct bnxt *bp,
  10597. struct rtnl_link_stats64 *stats);
  10598. static void __bnxt_close_nic(struct bnxt *bp, bool irq_re_init,
  10599. bool link_re_init)
  10600. {
  10601. /* Close the VF-reps before closing PF */
  10602. if (BNXT_PF(bp))
  10603. bnxt_vf_reps_close(bp);
  10604. /* Change device state to avoid TX queue wake up's */
  10605. bnxt_tx_disable(bp);
  10606. clear_bit(BNXT_STATE_OPEN, &bp->state);
  10607. smp_mb__after_atomic();
  10608. while (bnxt_drv_busy(bp))
  10609. msleep(20);
  10610. if (BNXT_SUPPORTS_MULTI_RSS_CTX(bp))
  10611. bnxt_clear_rss_ctxs(bp);
  10612. /* Flush rings and disable interrupts */
  10613. bnxt_shutdown_nic(bp, irq_re_init);
  10614. /* TODO CHIMP_FW: Link/PHY related cleanup if (link_re_init) */
  10615. bnxt_debug_dev_exit(bp);
  10616. bnxt_disable_napi(bp);
  10617. del_timer_sync(&bp->timer);
  10618. bnxt_free_skbs(bp);
  10619. /* Save ring stats before shutdown */
  10620. if (bp->bnapi && irq_re_init) {
  10621. bnxt_get_ring_stats(bp, &bp->net_stats_prev);
  10622. bnxt_get_ring_err_stats(bp, &bp->ring_err_stats_prev);
  10623. }
  10624. if (irq_re_init) {
  10625. bnxt_free_irq(bp);
  10626. bnxt_del_napi(bp);
  10627. }
  10628. bnxt_free_mem(bp, irq_re_init);
  10629. }
  10630. void bnxt_close_nic(struct bnxt *bp, bool irq_re_init, bool link_re_init)
  10631. {
  10632. if (test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) {
  10633. /* If we get here, it means firmware reset is in progress
  10634. * while we are trying to close. We can safely proceed with
  10635. * the close because we are holding rtnl_lock(). Some firmware
  10636. * messages may fail as we proceed to close. We set the
  10637. * ABORT_ERR flag here so that the FW reset thread will later
  10638. * abort when it gets the rtnl_lock() and sees the flag.
  10639. */
  10640. netdev_warn(bp->dev, "FW reset in progress during close, FW reset will be aborted\n");
  10641. set_bit(BNXT_STATE_ABORT_ERR, &bp->state);
  10642. }
  10643. #ifdef CONFIG_BNXT_SRIOV
  10644. if (bp->sriov_cfg) {
  10645. int rc;
  10646. rc = wait_event_interruptible_timeout(bp->sriov_cfg_wait,
  10647. !bp->sriov_cfg,
  10648. BNXT_SRIOV_CFG_WAIT_TMO);
  10649. if (!rc)
  10650. netdev_warn(bp->dev, "timeout waiting for SRIOV config operation to complete, proceeding to close!\n");
  10651. else if (rc < 0)
  10652. netdev_warn(bp->dev, "SRIOV config operation interrupted, proceeding to close!\n");
  10653. }
  10654. #endif
  10655. __bnxt_close_nic(bp, irq_re_init, link_re_init);
  10656. }
  10657. static int bnxt_close(struct net_device *dev)
  10658. {
  10659. struct bnxt *bp = netdev_priv(dev);
  10660. bnxt_close_nic(bp, true, true);
  10661. bnxt_hwrm_shutdown_link(bp);
  10662. bnxt_hwrm_if_change(bp, false);
  10663. return 0;
  10664. }
  10665. static int bnxt_hwrm_port_phy_read(struct bnxt *bp, u16 phy_addr, u16 reg,
  10666. u16 *val)
  10667. {
  10668. struct hwrm_port_phy_mdio_read_output *resp;
  10669. struct hwrm_port_phy_mdio_read_input *req;
  10670. int rc;
  10671. if (bp->hwrm_spec_code < 0x10a00)
  10672. return -EOPNOTSUPP;
  10673. rc = hwrm_req_init(bp, req, HWRM_PORT_PHY_MDIO_READ);
  10674. if (rc)
  10675. return rc;
  10676. req->port_id = cpu_to_le16(bp->pf.port_id);
  10677. req->phy_addr = phy_addr;
  10678. req->reg_addr = cpu_to_le16(reg & 0x1f);
  10679. if (mdio_phy_id_is_c45(phy_addr)) {
  10680. req->cl45_mdio = 1;
  10681. req->phy_addr = mdio_phy_id_prtad(phy_addr);
  10682. req->dev_addr = mdio_phy_id_devad(phy_addr);
  10683. req->reg_addr = cpu_to_le16(reg);
  10684. }
  10685. resp = hwrm_req_hold(bp, req);
  10686. rc = hwrm_req_send(bp, req);
  10687. if (!rc)
  10688. *val = le16_to_cpu(resp->reg_data);
  10689. hwrm_req_drop(bp, req);
  10690. return rc;
  10691. }
  10692. static int bnxt_hwrm_port_phy_write(struct bnxt *bp, u16 phy_addr, u16 reg,
  10693. u16 val)
  10694. {
  10695. struct hwrm_port_phy_mdio_write_input *req;
  10696. int rc;
  10697. if (bp->hwrm_spec_code < 0x10a00)
  10698. return -EOPNOTSUPP;
  10699. rc = hwrm_req_init(bp, req, HWRM_PORT_PHY_MDIO_WRITE);
  10700. if (rc)
  10701. return rc;
  10702. req->port_id = cpu_to_le16(bp->pf.port_id);
  10703. req->phy_addr = phy_addr;
  10704. req->reg_addr = cpu_to_le16(reg & 0x1f);
  10705. if (mdio_phy_id_is_c45(phy_addr)) {
  10706. req->cl45_mdio = 1;
  10707. req->phy_addr = mdio_phy_id_prtad(phy_addr);
  10708. req->dev_addr = mdio_phy_id_devad(phy_addr);
  10709. req->reg_addr = cpu_to_le16(reg);
  10710. }
  10711. req->reg_data = cpu_to_le16(val);
  10712. return hwrm_req_send(bp, req);
  10713. }
  10714. /* rtnl_lock held */
  10715. static int bnxt_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
  10716. {
  10717. struct mii_ioctl_data *mdio = if_mii(ifr);
  10718. struct bnxt *bp = netdev_priv(dev);
  10719. int rc;
  10720. switch (cmd) {
  10721. case SIOCGMIIPHY:
  10722. mdio->phy_id = bp->link_info.phy_addr;
  10723. fallthrough;
  10724. case SIOCGMIIREG: {
  10725. u16 mii_regval = 0;
  10726. if (!netif_running(dev))
  10727. return -EAGAIN;
  10728. rc = bnxt_hwrm_port_phy_read(bp, mdio->phy_id, mdio->reg_num,
  10729. &mii_regval);
  10730. mdio->val_out = mii_regval;
  10731. return rc;
  10732. }
  10733. case SIOCSMIIREG:
  10734. if (!netif_running(dev))
  10735. return -EAGAIN;
  10736. return bnxt_hwrm_port_phy_write(bp, mdio->phy_id, mdio->reg_num,
  10737. mdio->val_in);
  10738. case SIOCSHWTSTAMP:
  10739. return bnxt_hwtstamp_set(dev, ifr);
  10740. case SIOCGHWTSTAMP:
  10741. return bnxt_hwtstamp_get(dev, ifr);
  10742. default:
  10743. /* do nothing */
  10744. break;
  10745. }
  10746. return -EOPNOTSUPP;
  10747. }
  10748. static void bnxt_get_ring_stats(struct bnxt *bp,
  10749. struct rtnl_link_stats64 *stats)
  10750. {
  10751. int i;
  10752. for (i = 0; i < bp->cp_nr_rings; i++) {
  10753. struct bnxt_napi *bnapi = bp->bnapi[i];
  10754. struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
  10755. u64 *sw = cpr->stats.sw_stats;
  10756. stats->rx_packets += BNXT_GET_RING_STATS64(sw, rx_ucast_pkts);
  10757. stats->rx_packets += BNXT_GET_RING_STATS64(sw, rx_mcast_pkts);
  10758. stats->rx_packets += BNXT_GET_RING_STATS64(sw, rx_bcast_pkts);
  10759. stats->tx_packets += BNXT_GET_RING_STATS64(sw, tx_ucast_pkts);
  10760. stats->tx_packets += BNXT_GET_RING_STATS64(sw, tx_mcast_pkts);
  10761. stats->tx_packets += BNXT_GET_RING_STATS64(sw, tx_bcast_pkts);
  10762. stats->rx_bytes += BNXT_GET_RING_STATS64(sw, rx_ucast_bytes);
  10763. stats->rx_bytes += BNXT_GET_RING_STATS64(sw, rx_mcast_bytes);
  10764. stats->rx_bytes += BNXT_GET_RING_STATS64(sw, rx_bcast_bytes);
  10765. stats->tx_bytes += BNXT_GET_RING_STATS64(sw, tx_ucast_bytes);
  10766. stats->tx_bytes += BNXT_GET_RING_STATS64(sw, tx_mcast_bytes);
  10767. stats->tx_bytes += BNXT_GET_RING_STATS64(sw, tx_bcast_bytes);
  10768. stats->rx_missed_errors +=
  10769. BNXT_GET_RING_STATS64(sw, rx_discard_pkts);
  10770. stats->multicast += BNXT_GET_RING_STATS64(sw, rx_mcast_pkts);
  10771. stats->tx_dropped += BNXT_GET_RING_STATS64(sw, tx_error_pkts);
  10772. stats->rx_dropped +=
  10773. cpr->sw_stats->rx.rx_netpoll_discards +
  10774. cpr->sw_stats->rx.rx_oom_discards;
  10775. }
  10776. }
  10777. static void bnxt_add_prev_stats(struct bnxt *bp,
  10778. struct rtnl_link_stats64 *stats)
  10779. {
  10780. struct rtnl_link_stats64 *prev_stats = &bp->net_stats_prev;
  10781. stats->rx_packets += prev_stats->rx_packets;
  10782. stats->tx_packets += prev_stats->tx_packets;
  10783. stats->rx_bytes += prev_stats->rx_bytes;
  10784. stats->tx_bytes += prev_stats->tx_bytes;
  10785. stats->rx_missed_errors += prev_stats->rx_missed_errors;
  10786. stats->multicast += prev_stats->multicast;
  10787. stats->rx_dropped += prev_stats->rx_dropped;
  10788. stats->tx_dropped += prev_stats->tx_dropped;
  10789. }
  10790. static void
  10791. bnxt_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
  10792. {
  10793. struct bnxt *bp = netdev_priv(dev);
  10794. set_bit(BNXT_STATE_READ_STATS, &bp->state);
  10795. /* Make sure bnxt_close_nic() sees that we are reading stats before
  10796. * we check the BNXT_STATE_OPEN flag.
  10797. */
  10798. smp_mb__after_atomic();
  10799. if (!test_bit(BNXT_STATE_OPEN, &bp->state)) {
  10800. clear_bit(BNXT_STATE_READ_STATS, &bp->state);
  10801. *stats = bp->net_stats_prev;
  10802. return;
  10803. }
  10804. bnxt_get_ring_stats(bp, stats);
  10805. bnxt_add_prev_stats(bp, stats);
  10806. if (bp->flags & BNXT_FLAG_PORT_STATS) {
  10807. u64 *rx = bp->port_stats.sw_stats;
  10808. u64 *tx = bp->port_stats.sw_stats +
  10809. BNXT_TX_PORT_STATS_BYTE_OFFSET / 8;
  10810. stats->rx_crc_errors =
  10811. BNXT_GET_RX_PORT_STATS64(rx, rx_fcs_err_frames);
  10812. stats->rx_frame_errors =
  10813. BNXT_GET_RX_PORT_STATS64(rx, rx_align_err_frames);
  10814. stats->rx_length_errors =
  10815. BNXT_GET_RX_PORT_STATS64(rx, rx_undrsz_frames) +
  10816. BNXT_GET_RX_PORT_STATS64(rx, rx_ovrsz_frames) +
  10817. BNXT_GET_RX_PORT_STATS64(rx, rx_runt_frames);
  10818. stats->rx_errors =
  10819. BNXT_GET_RX_PORT_STATS64(rx, rx_false_carrier_frames) +
  10820. BNXT_GET_RX_PORT_STATS64(rx, rx_jbr_frames);
  10821. stats->collisions =
  10822. BNXT_GET_TX_PORT_STATS64(tx, tx_total_collisions);
  10823. stats->tx_fifo_errors =
  10824. BNXT_GET_TX_PORT_STATS64(tx, tx_fifo_underruns);
  10825. stats->tx_errors = BNXT_GET_TX_PORT_STATS64(tx, tx_err);
  10826. }
  10827. clear_bit(BNXT_STATE_READ_STATS, &bp->state);
  10828. }
  10829. static void bnxt_get_one_ring_err_stats(struct bnxt *bp,
  10830. struct bnxt_total_ring_err_stats *stats,
  10831. struct bnxt_cp_ring_info *cpr)
  10832. {
  10833. struct bnxt_sw_stats *sw_stats = cpr->sw_stats;
  10834. u64 *hw_stats = cpr->stats.sw_stats;
  10835. stats->rx_total_l4_csum_errors += sw_stats->rx.rx_l4_csum_errors;
  10836. stats->rx_total_resets += sw_stats->rx.rx_resets;
  10837. stats->rx_total_buf_errors += sw_stats->rx.rx_buf_errors;
  10838. stats->rx_total_oom_discards += sw_stats->rx.rx_oom_discards;
  10839. stats->rx_total_netpoll_discards += sw_stats->rx.rx_netpoll_discards;
  10840. stats->rx_total_ring_discards +=
  10841. BNXT_GET_RING_STATS64(hw_stats, rx_discard_pkts);
  10842. stats->tx_total_resets += sw_stats->tx.tx_resets;
  10843. stats->tx_total_ring_discards +=
  10844. BNXT_GET_RING_STATS64(hw_stats, tx_discard_pkts);
  10845. stats->total_missed_irqs += sw_stats->cmn.missed_irqs;
  10846. }
  10847. void bnxt_get_ring_err_stats(struct bnxt *bp,
  10848. struct bnxt_total_ring_err_stats *stats)
  10849. {
  10850. int i;
  10851. for (i = 0; i < bp->cp_nr_rings; i++)
  10852. bnxt_get_one_ring_err_stats(bp, stats, &bp->bnapi[i]->cp_ring);
  10853. }
  10854. static bool bnxt_mc_list_updated(struct bnxt *bp, u32 *rx_mask)
  10855. {
  10856. struct bnxt_vnic_info *vnic = &bp->vnic_info[BNXT_VNIC_DEFAULT];
  10857. struct net_device *dev = bp->dev;
  10858. struct netdev_hw_addr *ha;
  10859. u8 *haddr;
  10860. int mc_count = 0;
  10861. bool update = false;
  10862. int off = 0;
  10863. netdev_for_each_mc_addr(ha, dev) {
  10864. if (mc_count >= BNXT_MAX_MC_ADDRS) {
  10865. *rx_mask |= CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST;
  10866. vnic->mc_list_count = 0;
  10867. return false;
  10868. }
  10869. haddr = ha->addr;
  10870. if (!ether_addr_equal(haddr, vnic->mc_list + off)) {
  10871. memcpy(vnic->mc_list + off, haddr, ETH_ALEN);
  10872. update = true;
  10873. }
  10874. off += ETH_ALEN;
  10875. mc_count++;
  10876. }
  10877. if (mc_count)
  10878. *rx_mask |= CFA_L2_SET_RX_MASK_REQ_MASK_MCAST;
  10879. if (mc_count != vnic->mc_list_count) {
  10880. vnic->mc_list_count = mc_count;
  10881. update = true;
  10882. }
  10883. return update;
  10884. }
  10885. static bool bnxt_uc_list_updated(struct bnxt *bp)
  10886. {
  10887. struct net_device *dev = bp->dev;
  10888. struct bnxt_vnic_info *vnic = &bp->vnic_info[BNXT_VNIC_DEFAULT];
  10889. struct netdev_hw_addr *ha;
  10890. int off = 0;
  10891. if (netdev_uc_count(dev) != (vnic->uc_filter_count - 1))
  10892. return true;
  10893. netdev_for_each_uc_addr(ha, dev) {
  10894. if (!ether_addr_equal(ha->addr, vnic->uc_list + off))
  10895. return true;
  10896. off += ETH_ALEN;
  10897. }
  10898. return false;
  10899. }
  10900. static void bnxt_set_rx_mode(struct net_device *dev)
  10901. {
  10902. struct bnxt *bp = netdev_priv(dev);
  10903. struct bnxt_vnic_info *vnic;
  10904. bool mc_update = false;
  10905. bool uc_update;
  10906. u32 mask;
  10907. if (!test_bit(BNXT_STATE_OPEN, &bp->state))
  10908. return;
  10909. vnic = &bp->vnic_info[BNXT_VNIC_DEFAULT];
  10910. mask = vnic->rx_mask;
  10911. mask &= ~(CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS |
  10912. CFA_L2_SET_RX_MASK_REQ_MASK_MCAST |
  10913. CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST |
  10914. CFA_L2_SET_RX_MASK_REQ_MASK_BCAST);
  10915. if (dev->flags & IFF_PROMISC)
  10916. mask |= CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS;
  10917. uc_update = bnxt_uc_list_updated(bp);
  10918. if (dev->flags & IFF_BROADCAST)
  10919. mask |= CFA_L2_SET_RX_MASK_REQ_MASK_BCAST;
  10920. if (dev->flags & IFF_ALLMULTI) {
  10921. mask |= CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST;
  10922. vnic->mc_list_count = 0;
  10923. } else if (dev->flags & IFF_MULTICAST) {
  10924. mc_update = bnxt_mc_list_updated(bp, &mask);
  10925. }
  10926. if (mask != vnic->rx_mask || uc_update || mc_update) {
  10927. vnic->rx_mask = mask;
  10928. bnxt_queue_sp_work(bp, BNXT_RX_MASK_SP_EVENT);
  10929. }
  10930. }
  10931. static int bnxt_cfg_rx_mode(struct bnxt *bp)
  10932. {
  10933. struct net_device *dev = bp->dev;
  10934. struct bnxt_vnic_info *vnic = &bp->vnic_info[BNXT_VNIC_DEFAULT];
  10935. struct netdev_hw_addr *ha;
  10936. int i, off = 0, rc;
  10937. bool uc_update;
  10938. netif_addr_lock_bh(dev);
  10939. uc_update = bnxt_uc_list_updated(bp);
  10940. netif_addr_unlock_bh(dev);
  10941. if (!uc_update)
  10942. goto skip_uc;
  10943. for (i = 1; i < vnic->uc_filter_count; i++) {
  10944. struct bnxt_l2_filter *fltr = vnic->l2_filters[i];
  10945. bnxt_hwrm_l2_filter_free(bp, fltr);
  10946. bnxt_del_l2_filter(bp, fltr);
  10947. }
  10948. vnic->uc_filter_count = 1;
  10949. netif_addr_lock_bh(dev);
  10950. if (netdev_uc_count(dev) > (BNXT_MAX_UC_ADDRS - 1)) {
  10951. vnic->rx_mask |= CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS;
  10952. } else {
  10953. netdev_for_each_uc_addr(ha, dev) {
  10954. memcpy(vnic->uc_list + off, ha->addr, ETH_ALEN);
  10955. off += ETH_ALEN;
  10956. vnic->uc_filter_count++;
  10957. }
  10958. }
  10959. netif_addr_unlock_bh(dev);
  10960. for (i = 1, off = 0; i < vnic->uc_filter_count; i++, off += ETH_ALEN) {
  10961. rc = bnxt_hwrm_set_vnic_filter(bp, 0, i, vnic->uc_list + off);
  10962. if (rc) {
  10963. if (BNXT_VF(bp) && rc == -ENODEV) {
  10964. if (!test_and_set_bit(BNXT_STATE_L2_FILTER_RETRY, &bp->state))
  10965. netdev_warn(bp->dev, "Cannot configure L2 filters while PF is unavailable, will retry\n");
  10966. else
  10967. netdev_dbg(bp->dev, "PF still unavailable while configuring L2 filters.\n");
  10968. rc = 0;
  10969. } else {
  10970. netdev_err(bp->dev, "HWRM vnic filter failure rc: %x\n", rc);
  10971. }
  10972. vnic->uc_filter_count = i;
  10973. return rc;
  10974. }
  10975. }
  10976. if (test_and_clear_bit(BNXT_STATE_L2_FILTER_RETRY, &bp->state))
  10977. netdev_notice(bp->dev, "Retry of L2 filter configuration successful.\n");
  10978. skip_uc:
  10979. if ((vnic->rx_mask & CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS) &&
  10980. !bnxt_promisc_ok(bp))
  10981. vnic->rx_mask &= ~CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS;
  10982. rc = bnxt_hwrm_cfa_l2_set_rx_mask(bp, 0);
  10983. if (rc && (vnic->rx_mask & CFA_L2_SET_RX_MASK_REQ_MASK_MCAST)) {
  10984. netdev_info(bp->dev, "Failed setting MC filters rc: %d, turning on ALL_MCAST mode\n",
  10985. rc);
  10986. vnic->rx_mask &= ~CFA_L2_SET_RX_MASK_REQ_MASK_MCAST;
  10987. vnic->rx_mask |= CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST;
  10988. vnic->mc_list_count = 0;
  10989. rc = bnxt_hwrm_cfa_l2_set_rx_mask(bp, 0);
  10990. }
  10991. if (rc)
  10992. netdev_err(bp->dev, "HWRM cfa l2 rx mask failure rc: %d\n",
  10993. rc);
  10994. return rc;
  10995. }
  10996. static bool bnxt_can_reserve_rings(struct bnxt *bp)
  10997. {
  10998. #ifdef CONFIG_BNXT_SRIOV
  10999. if (BNXT_NEW_RM(bp) && BNXT_VF(bp)) {
  11000. struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
  11001. /* No minimum rings were provisioned by the PF. Don't
  11002. * reserve rings by default when device is down.
  11003. */
  11004. if (hw_resc->min_tx_rings || hw_resc->resv_tx_rings)
  11005. return true;
  11006. if (!netif_running(bp->dev))
  11007. return false;
  11008. }
  11009. #endif
  11010. return true;
  11011. }
  11012. /* If the chip and firmware supports RFS */
  11013. static bool bnxt_rfs_supported(struct bnxt *bp)
  11014. {
  11015. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  11016. if (bp->fw_cap & BNXT_FW_CAP_CFA_RFS_RING_TBL_IDX_V2)
  11017. return true;
  11018. return false;
  11019. }
  11020. /* 212 firmware is broken for aRFS */
  11021. if (BNXT_FW_MAJ(bp) == 212)
  11022. return false;
  11023. if (BNXT_PF(bp) && !BNXT_CHIP_TYPE_NITRO_A0(bp))
  11024. return true;
  11025. if (bp->rss_cap & BNXT_RSS_CAP_NEW_RSS_CAP)
  11026. return true;
  11027. return false;
  11028. }
  11029. /* If runtime conditions support RFS */
  11030. bool bnxt_rfs_capable(struct bnxt *bp, bool new_rss_ctx)
  11031. {
  11032. struct bnxt_hw_rings hwr = {0};
  11033. int max_vnics, max_rss_ctxs;
  11034. if ((bp->flags & BNXT_FLAG_CHIP_P5_PLUS) &&
  11035. !BNXT_SUPPORTS_NTUPLE_VNIC(bp))
  11036. return bnxt_rfs_supported(bp);
  11037. if (!bnxt_can_reserve_rings(bp) || !bp->rx_nr_rings)
  11038. return false;
  11039. hwr.grp = bp->rx_nr_rings;
  11040. hwr.vnic = bnxt_get_total_vnics(bp, bp->rx_nr_rings);
  11041. if (new_rss_ctx)
  11042. hwr.vnic++;
  11043. hwr.rss_ctx = bnxt_get_total_rss_ctxs(bp, &hwr);
  11044. max_vnics = bnxt_get_max_func_vnics(bp);
  11045. max_rss_ctxs = bnxt_get_max_func_rss_ctxs(bp);
  11046. if (hwr.vnic > max_vnics || hwr.rss_ctx > max_rss_ctxs) {
  11047. if (bp->rx_nr_rings > 1)
  11048. netdev_warn(bp->dev,
  11049. "Not enough resources to support NTUPLE filters, enough resources for up to %d rx rings\n",
  11050. min(max_rss_ctxs - 1, max_vnics - 1));
  11051. return false;
  11052. }
  11053. if (!BNXT_NEW_RM(bp))
  11054. return true;
  11055. /* Do not reduce VNIC and RSS ctx reservations. There is a FW
  11056. * issue that will mess up the default VNIC if we reduce the
  11057. * reservations.
  11058. */
  11059. if (hwr.vnic <= bp->hw_resc.resv_vnics &&
  11060. hwr.rss_ctx <= bp->hw_resc.resv_rsscos_ctxs)
  11061. return true;
  11062. bnxt_hwrm_reserve_rings(bp, &hwr);
  11063. if (hwr.vnic <= bp->hw_resc.resv_vnics &&
  11064. hwr.rss_ctx <= bp->hw_resc.resv_rsscos_ctxs)
  11065. return true;
  11066. netdev_warn(bp->dev, "Unable to reserve resources to support NTUPLE filters.\n");
  11067. hwr.vnic = 1;
  11068. hwr.rss_ctx = 0;
  11069. bnxt_hwrm_reserve_rings(bp, &hwr);
  11070. return false;
  11071. }
  11072. static netdev_features_t bnxt_fix_features(struct net_device *dev,
  11073. netdev_features_t features)
  11074. {
  11075. struct bnxt *bp = netdev_priv(dev);
  11076. netdev_features_t vlan_features;
  11077. if ((features & NETIF_F_NTUPLE) && !bnxt_rfs_capable(bp, false))
  11078. features &= ~NETIF_F_NTUPLE;
  11079. if ((bp->flags & BNXT_FLAG_NO_AGG_RINGS) || bp->xdp_prog)
  11080. features &= ~(NETIF_F_LRO | NETIF_F_GRO_HW);
  11081. if (!(features & NETIF_F_GRO))
  11082. features &= ~NETIF_F_GRO_HW;
  11083. if (features & NETIF_F_GRO_HW)
  11084. features &= ~NETIF_F_LRO;
  11085. /* Both CTAG and STAG VLAN accelaration on the RX side have to be
  11086. * turned on or off together.
  11087. */
  11088. vlan_features = features & BNXT_HW_FEATURE_VLAN_ALL_RX;
  11089. if (vlan_features != BNXT_HW_FEATURE_VLAN_ALL_RX) {
  11090. if (dev->features & BNXT_HW_FEATURE_VLAN_ALL_RX)
  11091. features &= ~BNXT_HW_FEATURE_VLAN_ALL_RX;
  11092. else if (vlan_features)
  11093. features |= BNXT_HW_FEATURE_VLAN_ALL_RX;
  11094. }
  11095. #ifdef CONFIG_BNXT_SRIOV
  11096. if (BNXT_VF(bp) && bp->vf.vlan)
  11097. features &= ~BNXT_HW_FEATURE_VLAN_ALL_RX;
  11098. #endif
  11099. return features;
  11100. }
  11101. static int bnxt_reinit_features(struct bnxt *bp, bool irq_re_init,
  11102. bool link_re_init, u32 flags, bool update_tpa)
  11103. {
  11104. bnxt_close_nic(bp, irq_re_init, link_re_init);
  11105. bp->flags = flags;
  11106. if (update_tpa)
  11107. bnxt_set_ring_params(bp);
  11108. return bnxt_open_nic(bp, irq_re_init, link_re_init);
  11109. }
  11110. static int bnxt_set_features(struct net_device *dev, netdev_features_t features)
  11111. {
  11112. bool update_tpa = false, update_ntuple = false;
  11113. struct bnxt *bp = netdev_priv(dev);
  11114. u32 flags = bp->flags;
  11115. u32 changes;
  11116. int rc = 0;
  11117. bool re_init = false;
  11118. flags &= ~BNXT_FLAG_ALL_CONFIG_FEATS;
  11119. if (features & NETIF_F_GRO_HW)
  11120. flags |= BNXT_FLAG_GRO;
  11121. else if (features & NETIF_F_LRO)
  11122. flags |= BNXT_FLAG_LRO;
  11123. if (bp->flags & BNXT_FLAG_NO_AGG_RINGS)
  11124. flags &= ~BNXT_FLAG_TPA;
  11125. if (features & BNXT_HW_FEATURE_VLAN_ALL_RX)
  11126. flags |= BNXT_FLAG_STRIP_VLAN;
  11127. if (features & NETIF_F_NTUPLE)
  11128. flags |= BNXT_FLAG_RFS;
  11129. else
  11130. bnxt_clear_usr_fltrs(bp, true);
  11131. changes = flags ^ bp->flags;
  11132. if (changes & BNXT_FLAG_TPA) {
  11133. update_tpa = true;
  11134. if ((bp->flags & BNXT_FLAG_TPA) == 0 ||
  11135. (flags & BNXT_FLAG_TPA) == 0 ||
  11136. (bp->flags & BNXT_FLAG_CHIP_P5_PLUS))
  11137. re_init = true;
  11138. }
  11139. if (changes & ~BNXT_FLAG_TPA)
  11140. re_init = true;
  11141. if (changes & BNXT_FLAG_RFS)
  11142. update_ntuple = true;
  11143. if (flags != bp->flags) {
  11144. u32 old_flags = bp->flags;
  11145. if (!test_bit(BNXT_STATE_OPEN, &bp->state)) {
  11146. bp->flags = flags;
  11147. if (update_tpa)
  11148. bnxt_set_ring_params(bp);
  11149. return rc;
  11150. }
  11151. if (update_ntuple)
  11152. return bnxt_reinit_features(bp, true, false, flags, update_tpa);
  11153. if (re_init)
  11154. return bnxt_reinit_features(bp, false, false, flags, update_tpa);
  11155. if (update_tpa) {
  11156. bp->flags = flags;
  11157. rc = bnxt_set_tpa(bp,
  11158. (flags & BNXT_FLAG_TPA) ?
  11159. true : false);
  11160. if (rc)
  11161. bp->flags = old_flags;
  11162. }
  11163. }
  11164. return rc;
  11165. }
  11166. static bool bnxt_exthdr_check(struct bnxt *bp, struct sk_buff *skb, int nw_off,
  11167. u8 **nextp)
  11168. {
  11169. struct ipv6hdr *ip6h = (struct ipv6hdr *)(skb->data + nw_off);
  11170. struct hop_jumbo_hdr *jhdr;
  11171. int hdr_count = 0;
  11172. u8 *nexthdr;
  11173. int start;
  11174. /* Check that there are at most 2 IPv6 extension headers, no
  11175. * fragment header, and each is <= 64 bytes.
  11176. */
  11177. start = nw_off + sizeof(*ip6h);
  11178. nexthdr = &ip6h->nexthdr;
  11179. while (ipv6_ext_hdr(*nexthdr)) {
  11180. struct ipv6_opt_hdr *hp;
  11181. int hdrlen;
  11182. if (hdr_count >= 3 || *nexthdr == NEXTHDR_NONE ||
  11183. *nexthdr == NEXTHDR_FRAGMENT)
  11184. return false;
  11185. hp = __skb_header_pointer(NULL, start, sizeof(*hp), skb->data,
  11186. skb_headlen(skb), NULL);
  11187. if (!hp)
  11188. return false;
  11189. if (*nexthdr == NEXTHDR_AUTH)
  11190. hdrlen = ipv6_authlen(hp);
  11191. else
  11192. hdrlen = ipv6_optlen(hp);
  11193. if (hdrlen > 64)
  11194. return false;
  11195. /* The ext header may be a hop-by-hop header inserted for
  11196. * big TCP purposes. This will be removed before sending
  11197. * from NIC, so do not count it.
  11198. */
  11199. if (*nexthdr == NEXTHDR_HOP) {
  11200. if (likely(skb->len <= GRO_LEGACY_MAX_SIZE))
  11201. goto increment_hdr;
  11202. jhdr = (struct hop_jumbo_hdr *)hp;
  11203. if (jhdr->tlv_type != IPV6_TLV_JUMBO || jhdr->hdrlen != 0 ||
  11204. jhdr->nexthdr != IPPROTO_TCP)
  11205. goto increment_hdr;
  11206. goto next_hdr;
  11207. }
  11208. increment_hdr:
  11209. hdr_count++;
  11210. next_hdr:
  11211. nexthdr = &hp->nexthdr;
  11212. start += hdrlen;
  11213. }
  11214. if (nextp) {
  11215. /* Caller will check inner protocol */
  11216. if (skb->encapsulation) {
  11217. *nextp = nexthdr;
  11218. return true;
  11219. }
  11220. *nextp = NULL;
  11221. }
  11222. /* Only support TCP/UDP for non-tunneled ipv6 and inner ipv6 */
  11223. return *nexthdr == IPPROTO_TCP || *nexthdr == IPPROTO_UDP;
  11224. }
  11225. /* For UDP, we can only handle 1 Vxlan port and 1 Geneve port. */
  11226. static bool bnxt_udp_tunl_check(struct bnxt *bp, struct sk_buff *skb)
  11227. {
  11228. struct udphdr *uh = udp_hdr(skb);
  11229. __be16 udp_port = uh->dest;
  11230. if (udp_port != bp->vxlan_port && udp_port != bp->nge_port &&
  11231. udp_port != bp->vxlan_gpe_port)
  11232. return false;
  11233. if (skb->inner_protocol == htons(ETH_P_TEB)) {
  11234. struct ethhdr *eh = inner_eth_hdr(skb);
  11235. switch (eh->h_proto) {
  11236. case htons(ETH_P_IP):
  11237. return true;
  11238. case htons(ETH_P_IPV6):
  11239. return bnxt_exthdr_check(bp, skb,
  11240. skb_inner_network_offset(skb),
  11241. NULL);
  11242. }
  11243. } else if (skb->inner_protocol == htons(ETH_P_IP)) {
  11244. return true;
  11245. } else if (skb->inner_protocol == htons(ETH_P_IPV6)) {
  11246. return bnxt_exthdr_check(bp, skb, skb_inner_network_offset(skb),
  11247. NULL);
  11248. }
  11249. return false;
  11250. }
  11251. static bool bnxt_tunl_check(struct bnxt *bp, struct sk_buff *skb, u8 l4_proto)
  11252. {
  11253. switch (l4_proto) {
  11254. case IPPROTO_UDP:
  11255. return bnxt_udp_tunl_check(bp, skb);
  11256. case IPPROTO_IPIP:
  11257. return true;
  11258. case IPPROTO_GRE: {
  11259. switch (skb->inner_protocol) {
  11260. default:
  11261. return false;
  11262. case htons(ETH_P_IP):
  11263. return true;
  11264. case htons(ETH_P_IPV6):
  11265. fallthrough;
  11266. }
  11267. }
  11268. case IPPROTO_IPV6:
  11269. /* Check ext headers of inner ipv6 */
  11270. return bnxt_exthdr_check(bp, skb, skb_inner_network_offset(skb),
  11271. NULL);
  11272. }
  11273. return false;
  11274. }
  11275. static netdev_features_t bnxt_features_check(struct sk_buff *skb,
  11276. struct net_device *dev,
  11277. netdev_features_t features)
  11278. {
  11279. struct bnxt *bp = netdev_priv(dev);
  11280. u8 *l4_proto;
  11281. features = vlan_features_check(skb, features);
  11282. switch (vlan_get_protocol(skb)) {
  11283. case htons(ETH_P_IP):
  11284. if (!skb->encapsulation)
  11285. return features;
  11286. l4_proto = &ip_hdr(skb)->protocol;
  11287. if (bnxt_tunl_check(bp, skb, *l4_proto))
  11288. return features;
  11289. break;
  11290. case htons(ETH_P_IPV6):
  11291. if (!bnxt_exthdr_check(bp, skb, skb_network_offset(skb),
  11292. &l4_proto))
  11293. break;
  11294. if (!l4_proto || bnxt_tunl_check(bp, skb, *l4_proto))
  11295. return features;
  11296. break;
  11297. }
  11298. return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK);
  11299. }
  11300. int bnxt_dbg_hwrm_rd_reg(struct bnxt *bp, u32 reg_off, u16 num_words,
  11301. u32 *reg_buf)
  11302. {
  11303. struct hwrm_dbg_read_direct_output *resp;
  11304. struct hwrm_dbg_read_direct_input *req;
  11305. __le32 *dbg_reg_buf;
  11306. dma_addr_t mapping;
  11307. int rc, i;
  11308. rc = hwrm_req_init(bp, req, HWRM_DBG_READ_DIRECT);
  11309. if (rc)
  11310. return rc;
  11311. dbg_reg_buf = hwrm_req_dma_slice(bp, req, num_words * 4,
  11312. &mapping);
  11313. if (!dbg_reg_buf) {
  11314. rc = -ENOMEM;
  11315. goto dbg_rd_reg_exit;
  11316. }
  11317. req->host_dest_addr = cpu_to_le64(mapping);
  11318. resp = hwrm_req_hold(bp, req);
  11319. req->read_addr = cpu_to_le32(reg_off + CHIMP_REG_VIEW_ADDR);
  11320. req->read_len32 = cpu_to_le32(num_words);
  11321. rc = hwrm_req_send(bp, req);
  11322. if (rc || resp->error_code) {
  11323. rc = -EIO;
  11324. goto dbg_rd_reg_exit;
  11325. }
  11326. for (i = 0; i < num_words; i++)
  11327. reg_buf[i] = le32_to_cpu(dbg_reg_buf[i]);
  11328. dbg_rd_reg_exit:
  11329. hwrm_req_drop(bp, req);
  11330. return rc;
  11331. }
  11332. static int bnxt_dbg_hwrm_ring_info_get(struct bnxt *bp, u8 ring_type,
  11333. u32 ring_id, u32 *prod, u32 *cons)
  11334. {
  11335. struct hwrm_dbg_ring_info_get_output *resp;
  11336. struct hwrm_dbg_ring_info_get_input *req;
  11337. int rc;
  11338. rc = hwrm_req_init(bp, req, HWRM_DBG_RING_INFO_GET);
  11339. if (rc)
  11340. return rc;
  11341. req->ring_type = ring_type;
  11342. req->fw_ring_id = cpu_to_le32(ring_id);
  11343. resp = hwrm_req_hold(bp, req);
  11344. rc = hwrm_req_send(bp, req);
  11345. if (!rc) {
  11346. *prod = le32_to_cpu(resp->producer_index);
  11347. *cons = le32_to_cpu(resp->consumer_index);
  11348. }
  11349. hwrm_req_drop(bp, req);
  11350. return rc;
  11351. }
  11352. static void bnxt_dump_tx_sw_state(struct bnxt_napi *bnapi)
  11353. {
  11354. struct bnxt_tx_ring_info *txr;
  11355. int i = bnapi->index, j;
  11356. bnxt_for_each_napi_tx(j, bnapi, txr)
  11357. netdev_info(bnapi->bp->dev, "[%d.%d]: tx{fw_ring: %d prod: %x cons: %x}\n",
  11358. i, j, txr->tx_ring_struct.fw_ring_id, txr->tx_prod,
  11359. txr->tx_cons);
  11360. }
  11361. static void bnxt_dump_rx_sw_state(struct bnxt_napi *bnapi)
  11362. {
  11363. struct bnxt_rx_ring_info *rxr = bnapi->rx_ring;
  11364. int i = bnapi->index;
  11365. if (!rxr)
  11366. return;
  11367. netdev_info(bnapi->bp->dev, "[%d]: rx{fw_ring: %d prod: %x} rx_agg{fw_ring: %d agg_prod: %x sw_agg_prod: %x}\n",
  11368. i, rxr->rx_ring_struct.fw_ring_id, rxr->rx_prod,
  11369. rxr->rx_agg_ring_struct.fw_ring_id, rxr->rx_agg_prod,
  11370. rxr->rx_sw_agg_prod);
  11371. }
  11372. static void bnxt_dump_cp_sw_state(struct bnxt_napi *bnapi)
  11373. {
  11374. struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;
  11375. int i = bnapi->index;
  11376. netdev_info(bnapi->bp->dev, "[%d]: cp{fw_ring: %d raw_cons: %x}\n",
  11377. i, cpr->cp_ring_struct.fw_ring_id, cpr->cp_raw_cons);
  11378. }
  11379. static void bnxt_dbg_dump_states(struct bnxt *bp)
  11380. {
  11381. int i;
  11382. struct bnxt_napi *bnapi;
  11383. for (i = 0; i < bp->cp_nr_rings; i++) {
  11384. bnapi = bp->bnapi[i];
  11385. if (netif_msg_drv(bp)) {
  11386. bnxt_dump_tx_sw_state(bnapi);
  11387. bnxt_dump_rx_sw_state(bnapi);
  11388. bnxt_dump_cp_sw_state(bnapi);
  11389. }
  11390. }
  11391. }
  11392. static int bnxt_hwrm_rx_ring_reset(struct bnxt *bp, int ring_nr)
  11393. {
  11394. struct bnxt_rx_ring_info *rxr = &bp->rx_ring[ring_nr];
  11395. struct hwrm_ring_reset_input *req;
  11396. struct bnxt_napi *bnapi = rxr->bnapi;
  11397. struct bnxt_cp_ring_info *cpr;
  11398. u16 cp_ring_id;
  11399. int rc;
  11400. rc = hwrm_req_init(bp, req, HWRM_RING_RESET);
  11401. if (rc)
  11402. return rc;
  11403. cpr = &bnapi->cp_ring;
  11404. cp_ring_id = cpr->cp_ring_struct.fw_ring_id;
  11405. req->cmpl_ring = cpu_to_le16(cp_ring_id);
  11406. req->ring_type = RING_RESET_REQ_RING_TYPE_RX_RING_GRP;
  11407. req->ring_id = cpu_to_le16(bp->grp_info[bnapi->index].fw_grp_id);
  11408. return hwrm_req_send_silent(bp, req);
  11409. }
  11410. static void bnxt_reset_task(struct bnxt *bp, bool silent)
  11411. {
  11412. if (!silent)
  11413. bnxt_dbg_dump_states(bp);
  11414. if (netif_running(bp->dev)) {
  11415. bnxt_close_nic(bp, !silent, false);
  11416. bnxt_open_nic(bp, !silent, false);
  11417. }
  11418. }
  11419. static void bnxt_tx_timeout(struct net_device *dev, unsigned int txqueue)
  11420. {
  11421. struct bnxt *bp = netdev_priv(dev);
  11422. netdev_err(bp->dev, "TX timeout detected, starting reset task!\n");
  11423. bnxt_queue_sp_work(bp, BNXT_RESET_TASK_SP_EVENT);
  11424. }
  11425. static void bnxt_fw_health_check(struct bnxt *bp)
  11426. {
  11427. struct bnxt_fw_health *fw_health = bp->fw_health;
  11428. struct pci_dev *pdev = bp->pdev;
  11429. u32 val;
  11430. if (!fw_health->enabled || test_bit(BNXT_STATE_IN_FW_RESET, &bp->state))
  11431. return;
  11432. /* Make sure it is enabled before checking the tmr_counter. */
  11433. smp_rmb();
  11434. if (fw_health->tmr_counter) {
  11435. fw_health->tmr_counter--;
  11436. return;
  11437. }
  11438. val = bnxt_fw_health_readl(bp, BNXT_FW_HEARTBEAT_REG);
  11439. if (val == fw_health->last_fw_heartbeat && pci_device_is_present(pdev)) {
  11440. fw_health->arrests++;
  11441. goto fw_reset;
  11442. }
  11443. fw_health->last_fw_heartbeat = val;
  11444. val = bnxt_fw_health_readl(bp, BNXT_FW_RESET_CNT_REG);
  11445. if (val != fw_health->last_fw_reset_cnt && pci_device_is_present(pdev)) {
  11446. fw_health->discoveries++;
  11447. goto fw_reset;
  11448. }
  11449. fw_health->tmr_counter = fw_health->tmr_multiplier;
  11450. return;
  11451. fw_reset:
  11452. bnxt_queue_sp_work(bp, BNXT_FW_EXCEPTION_SP_EVENT);
  11453. }
  11454. static void bnxt_timer(struct timer_list *t)
  11455. {
  11456. struct bnxt *bp = from_timer(bp, t, timer);
  11457. struct net_device *dev = bp->dev;
  11458. if (!netif_running(dev) || !test_bit(BNXT_STATE_OPEN, &bp->state))
  11459. return;
  11460. if (atomic_read(&bp->intr_sem) != 0)
  11461. goto bnxt_restart_timer;
  11462. if (bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY)
  11463. bnxt_fw_health_check(bp);
  11464. if (BNXT_LINK_IS_UP(bp) && bp->stats_coal_ticks)
  11465. bnxt_queue_sp_work(bp, BNXT_PERIODIC_STATS_SP_EVENT);
  11466. if (bnxt_tc_flower_enabled(bp))
  11467. bnxt_queue_sp_work(bp, BNXT_FLOW_STATS_SP_EVENT);
  11468. #ifdef CONFIG_RFS_ACCEL
  11469. if ((bp->flags & BNXT_FLAG_RFS) && bp->ntp_fltr_count)
  11470. bnxt_queue_sp_work(bp, BNXT_RX_NTP_FLTR_SP_EVENT);
  11471. #endif /*CONFIG_RFS_ACCEL*/
  11472. if (bp->link_info.phy_retry) {
  11473. if (time_after(jiffies, bp->link_info.phy_retry_expires)) {
  11474. bp->link_info.phy_retry = false;
  11475. netdev_warn(bp->dev, "failed to update phy settings after maximum retries.\n");
  11476. } else {
  11477. bnxt_queue_sp_work(bp, BNXT_UPDATE_PHY_SP_EVENT);
  11478. }
  11479. }
  11480. if (test_bit(BNXT_STATE_L2_FILTER_RETRY, &bp->state))
  11481. bnxt_queue_sp_work(bp, BNXT_RX_MASK_SP_EVENT);
  11482. if ((BNXT_CHIP_P5(bp)) && !bp->chip_rev && netif_carrier_ok(dev))
  11483. bnxt_queue_sp_work(bp, BNXT_RING_COAL_NOW_SP_EVENT);
  11484. bnxt_restart_timer:
  11485. mod_timer(&bp->timer, jiffies + bp->current_interval);
  11486. }
  11487. static void bnxt_rtnl_lock_sp(struct bnxt *bp)
  11488. {
  11489. /* We are called from bnxt_sp_task which has BNXT_STATE_IN_SP_TASK
  11490. * set. If the device is being closed, bnxt_close() may be holding
  11491. * rtnl() and waiting for BNXT_STATE_IN_SP_TASK to clear. So we
  11492. * must clear BNXT_STATE_IN_SP_TASK before holding rtnl().
  11493. */
  11494. clear_bit(BNXT_STATE_IN_SP_TASK, &bp->state);
  11495. rtnl_lock();
  11496. }
  11497. static void bnxt_rtnl_unlock_sp(struct bnxt *bp)
  11498. {
  11499. set_bit(BNXT_STATE_IN_SP_TASK, &bp->state);
  11500. rtnl_unlock();
  11501. }
  11502. /* Only called from bnxt_sp_task() */
  11503. static void bnxt_reset(struct bnxt *bp, bool silent)
  11504. {
  11505. bnxt_rtnl_lock_sp(bp);
  11506. if (test_bit(BNXT_STATE_OPEN, &bp->state))
  11507. bnxt_reset_task(bp, silent);
  11508. bnxt_rtnl_unlock_sp(bp);
  11509. }
  11510. /* Only called from bnxt_sp_task() */
  11511. static void bnxt_rx_ring_reset(struct bnxt *bp)
  11512. {
  11513. int i;
  11514. bnxt_rtnl_lock_sp(bp);
  11515. if (!test_bit(BNXT_STATE_OPEN, &bp->state)) {
  11516. bnxt_rtnl_unlock_sp(bp);
  11517. return;
  11518. }
  11519. /* Disable and flush TPA before resetting the RX ring */
  11520. if (bp->flags & BNXT_FLAG_TPA)
  11521. bnxt_set_tpa(bp, false);
  11522. for (i = 0; i < bp->rx_nr_rings; i++) {
  11523. struct bnxt_rx_ring_info *rxr = &bp->rx_ring[i];
  11524. struct bnxt_cp_ring_info *cpr;
  11525. int rc;
  11526. if (!rxr->bnapi->in_reset)
  11527. continue;
  11528. rc = bnxt_hwrm_rx_ring_reset(bp, i);
  11529. if (rc) {
  11530. if (rc == -EINVAL || rc == -EOPNOTSUPP)
  11531. netdev_info_once(bp->dev, "RX ring reset not supported by firmware, falling back to global reset\n");
  11532. else
  11533. netdev_warn(bp->dev, "RX ring reset failed, rc = %d, falling back to global reset\n",
  11534. rc);
  11535. bnxt_reset_task(bp, true);
  11536. break;
  11537. }
  11538. bnxt_free_one_rx_ring_skbs(bp, rxr);
  11539. rxr->rx_prod = 0;
  11540. rxr->rx_agg_prod = 0;
  11541. rxr->rx_sw_agg_prod = 0;
  11542. rxr->rx_next_cons = 0;
  11543. rxr->bnapi->in_reset = false;
  11544. bnxt_alloc_one_rx_ring(bp, i);
  11545. cpr = &rxr->bnapi->cp_ring;
  11546. cpr->sw_stats->rx.rx_resets++;
  11547. if (bp->flags & BNXT_FLAG_AGG_RINGS)
  11548. bnxt_db_write(bp, &rxr->rx_agg_db, rxr->rx_agg_prod);
  11549. bnxt_db_write(bp, &rxr->rx_db, rxr->rx_prod);
  11550. }
  11551. if (bp->flags & BNXT_FLAG_TPA)
  11552. bnxt_set_tpa(bp, true);
  11553. bnxt_rtnl_unlock_sp(bp);
  11554. }
  11555. static void bnxt_fw_fatal_close(struct bnxt *bp)
  11556. {
  11557. bnxt_tx_disable(bp);
  11558. bnxt_disable_napi(bp);
  11559. bnxt_disable_int_sync(bp);
  11560. bnxt_free_irq(bp);
  11561. bnxt_clear_int_mode(bp);
  11562. pci_disable_device(bp->pdev);
  11563. }
  11564. static void bnxt_fw_reset_close(struct bnxt *bp)
  11565. {
  11566. /* When firmware is in fatal state, quiesce device and disable
  11567. * bus master to prevent any potential bad DMAs before freeing
  11568. * kernel memory.
  11569. */
  11570. if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state)) {
  11571. u16 val = 0;
  11572. pci_read_config_word(bp->pdev, PCI_SUBSYSTEM_ID, &val);
  11573. if (val == 0xffff)
  11574. bp->fw_reset_min_dsecs = 0;
  11575. bnxt_fw_fatal_close(bp);
  11576. }
  11577. __bnxt_close_nic(bp, true, false);
  11578. bnxt_vf_reps_free(bp);
  11579. bnxt_clear_int_mode(bp);
  11580. bnxt_hwrm_func_drv_unrgtr(bp);
  11581. if (pci_is_enabled(bp->pdev))
  11582. pci_disable_device(bp->pdev);
  11583. bnxt_free_ctx_mem(bp);
  11584. }
  11585. static bool is_bnxt_fw_ok(struct bnxt *bp)
  11586. {
  11587. struct bnxt_fw_health *fw_health = bp->fw_health;
  11588. bool no_heartbeat = false, has_reset = false;
  11589. u32 val;
  11590. val = bnxt_fw_health_readl(bp, BNXT_FW_HEARTBEAT_REG);
  11591. if (val == fw_health->last_fw_heartbeat)
  11592. no_heartbeat = true;
  11593. val = bnxt_fw_health_readl(bp, BNXT_FW_RESET_CNT_REG);
  11594. if (val != fw_health->last_fw_reset_cnt)
  11595. has_reset = true;
  11596. if (!no_heartbeat && has_reset)
  11597. return true;
  11598. return false;
  11599. }
  11600. /* rtnl_lock is acquired before calling this function */
  11601. static void bnxt_force_fw_reset(struct bnxt *bp)
  11602. {
  11603. struct bnxt_fw_health *fw_health = bp->fw_health;
  11604. struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;
  11605. u32 wait_dsecs;
  11606. if (!test_bit(BNXT_STATE_OPEN, &bp->state) ||
  11607. test_bit(BNXT_STATE_IN_FW_RESET, &bp->state))
  11608. return;
  11609. if (ptp) {
  11610. unsigned long flags;
  11611. spin_lock_irqsave(&ptp->ptp_lock, flags);
  11612. set_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
  11613. spin_unlock_irqrestore(&ptp->ptp_lock, flags);
  11614. } else {
  11615. set_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
  11616. }
  11617. bnxt_fw_reset_close(bp);
  11618. wait_dsecs = fw_health->master_func_wait_dsecs;
  11619. if (fw_health->primary) {
  11620. if (fw_health->flags & ERROR_RECOVERY_QCFG_RESP_FLAGS_CO_CPU)
  11621. wait_dsecs = 0;
  11622. bp->fw_reset_state = BNXT_FW_RESET_STATE_RESET_FW;
  11623. } else {
  11624. bp->fw_reset_timestamp = jiffies + wait_dsecs * HZ / 10;
  11625. wait_dsecs = fw_health->normal_func_wait_dsecs;
  11626. bp->fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV;
  11627. }
  11628. bp->fw_reset_min_dsecs = fw_health->post_reset_wait_dsecs;
  11629. bp->fw_reset_max_dsecs = fw_health->post_reset_max_wait_dsecs;
  11630. bnxt_queue_fw_reset_work(bp, wait_dsecs * HZ / 10);
  11631. }
  11632. void bnxt_fw_exception(struct bnxt *bp)
  11633. {
  11634. netdev_warn(bp->dev, "Detected firmware fatal condition, initiating reset\n");
  11635. set_bit(BNXT_STATE_FW_FATAL_COND, &bp->state);
  11636. bnxt_ulp_stop(bp);
  11637. bnxt_rtnl_lock_sp(bp);
  11638. bnxt_force_fw_reset(bp);
  11639. bnxt_rtnl_unlock_sp(bp);
  11640. }
  11641. /* Returns the number of registered VFs, or 1 if VF configuration is pending, or
  11642. * < 0 on error.
  11643. */
  11644. static int bnxt_get_registered_vfs(struct bnxt *bp)
  11645. {
  11646. #ifdef CONFIG_BNXT_SRIOV
  11647. int rc;
  11648. if (!BNXT_PF(bp))
  11649. return 0;
  11650. rc = bnxt_hwrm_func_qcfg(bp);
  11651. if (rc) {
  11652. netdev_err(bp->dev, "func_qcfg cmd failed, rc = %d\n", rc);
  11653. return rc;
  11654. }
  11655. if (bp->pf.registered_vfs)
  11656. return bp->pf.registered_vfs;
  11657. if (bp->sriov_cfg)
  11658. return 1;
  11659. #endif
  11660. return 0;
  11661. }
  11662. void bnxt_fw_reset(struct bnxt *bp)
  11663. {
  11664. bnxt_ulp_stop(bp);
  11665. bnxt_rtnl_lock_sp(bp);
  11666. if (test_bit(BNXT_STATE_OPEN, &bp->state) &&
  11667. !test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) {
  11668. struct bnxt_ptp_cfg *ptp = bp->ptp_cfg;
  11669. int n = 0, tmo;
  11670. if (ptp) {
  11671. unsigned long flags;
  11672. spin_lock_irqsave(&ptp->ptp_lock, flags);
  11673. set_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
  11674. spin_unlock_irqrestore(&ptp->ptp_lock, flags);
  11675. } else {
  11676. set_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
  11677. }
  11678. if (bp->pf.active_vfs &&
  11679. !test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state))
  11680. n = bnxt_get_registered_vfs(bp);
  11681. if (n < 0) {
  11682. netdev_err(bp->dev, "Firmware reset aborted, rc = %d\n",
  11683. n);
  11684. clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
  11685. dev_close(bp->dev);
  11686. goto fw_reset_exit;
  11687. } else if (n > 0) {
  11688. u16 vf_tmo_dsecs = n * 10;
  11689. if (bp->fw_reset_max_dsecs < vf_tmo_dsecs)
  11690. bp->fw_reset_max_dsecs = vf_tmo_dsecs;
  11691. bp->fw_reset_state =
  11692. BNXT_FW_RESET_STATE_POLL_VF;
  11693. bnxt_queue_fw_reset_work(bp, HZ / 10);
  11694. goto fw_reset_exit;
  11695. }
  11696. bnxt_fw_reset_close(bp);
  11697. if (bp->fw_cap & BNXT_FW_CAP_ERR_RECOVER_RELOAD) {
  11698. bp->fw_reset_state = BNXT_FW_RESET_STATE_POLL_FW_DOWN;
  11699. tmo = HZ / 10;
  11700. } else {
  11701. bp->fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV;
  11702. tmo = bp->fw_reset_min_dsecs * HZ / 10;
  11703. }
  11704. bnxt_queue_fw_reset_work(bp, tmo);
  11705. }
  11706. fw_reset_exit:
  11707. bnxt_rtnl_unlock_sp(bp);
  11708. }
  11709. static void bnxt_chk_missed_irq(struct bnxt *bp)
  11710. {
  11711. int i;
  11712. if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS))
  11713. return;
  11714. for (i = 0; i < bp->cp_nr_rings; i++) {
  11715. struct bnxt_napi *bnapi = bp->bnapi[i];
  11716. struct bnxt_cp_ring_info *cpr;
  11717. u32 fw_ring_id;
  11718. int j;
  11719. if (!bnapi)
  11720. continue;
  11721. cpr = &bnapi->cp_ring;
  11722. for (j = 0; j < cpr->cp_ring_count; j++) {
  11723. struct bnxt_cp_ring_info *cpr2 = &cpr->cp_ring_arr[j];
  11724. u32 val[2];
  11725. if (cpr2->has_more_work || !bnxt_has_work(bp, cpr2))
  11726. continue;
  11727. if (cpr2->cp_raw_cons != cpr2->last_cp_raw_cons) {
  11728. cpr2->last_cp_raw_cons = cpr2->cp_raw_cons;
  11729. continue;
  11730. }
  11731. fw_ring_id = cpr2->cp_ring_struct.fw_ring_id;
  11732. bnxt_dbg_hwrm_ring_info_get(bp,
  11733. DBG_RING_INFO_GET_REQ_RING_TYPE_L2_CMPL,
  11734. fw_ring_id, &val[0], &val[1]);
  11735. cpr->sw_stats->cmn.missed_irqs++;
  11736. }
  11737. }
  11738. }
  11739. static void bnxt_cfg_ntp_filters(struct bnxt *);
  11740. static void bnxt_init_ethtool_link_settings(struct bnxt *bp)
  11741. {
  11742. struct bnxt_link_info *link_info = &bp->link_info;
  11743. if (BNXT_AUTO_MODE(link_info->auto_mode)) {
  11744. link_info->autoneg = BNXT_AUTONEG_SPEED;
  11745. if (bp->hwrm_spec_code >= 0x10201) {
  11746. if (link_info->auto_pause_setting &
  11747. PORT_PHY_CFG_REQ_AUTO_PAUSE_AUTONEG_PAUSE)
  11748. link_info->autoneg |= BNXT_AUTONEG_FLOW_CTRL;
  11749. } else {
  11750. link_info->autoneg |= BNXT_AUTONEG_FLOW_CTRL;
  11751. }
  11752. bnxt_set_auto_speed(link_info);
  11753. } else {
  11754. bnxt_set_force_speed(link_info);
  11755. link_info->req_duplex = link_info->duplex_setting;
  11756. }
  11757. if (link_info->autoneg & BNXT_AUTONEG_FLOW_CTRL)
  11758. link_info->req_flow_ctrl =
  11759. link_info->auto_pause_setting & BNXT_LINK_PAUSE_BOTH;
  11760. else
  11761. link_info->req_flow_ctrl = link_info->force_pause_setting;
  11762. }
  11763. static void bnxt_fw_echo_reply(struct bnxt *bp)
  11764. {
  11765. struct bnxt_fw_health *fw_health = bp->fw_health;
  11766. struct hwrm_func_echo_response_input *req;
  11767. int rc;
  11768. rc = hwrm_req_init(bp, req, HWRM_FUNC_ECHO_RESPONSE);
  11769. if (rc)
  11770. return;
  11771. req->event_data1 = cpu_to_le32(fw_health->echo_req_data1);
  11772. req->event_data2 = cpu_to_le32(fw_health->echo_req_data2);
  11773. hwrm_req_send(bp, req);
  11774. }
  11775. static void bnxt_ulp_restart(struct bnxt *bp)
  11776. {
  11777. bnxt_ulp_stop(bp);
  11778. bnxt_ulp_start(bp, 0);
  11779. }
  11780. static void bnxt_sp_task(struct work_struct *work)
  11781. {
  11782. struct bnxt *bp = container_of(work, struct bnxt, sp_task);
  11783. set_bit(BNXT_STATE_IN_SP_TASK, &bp->state);
  11784. smp_mb__after_atomic();
  11785. if (!test_bit(BNXT_STATE_OPEN, &bp->state)) {
  11786. clear_bit(BNXT_STATE_IN_SP_TASK, &bp->state);
  11787. return;
  11788. }
  11789. if (test_and_clear_bit(BNXT_RESTART_ULP_SP_EVENT, &bp->sp_event)) {
  11790. bnxt_ulp_restart(bp);
  11791. bnxt_reenable_sriov(bp);
  11792. }
  11793. if (test_and_clear_bit(BNXT_RX_MASK_SP_EVENT, &bp->sp_event))
  11794. bnxt_cfg_rx_mode(bp);
  11795. if (test_and_clear_bit(BNXT_RX_NTP_FLTR_SP_EVENT, &bp->sp_event))
  11796. bnxt_cfg_ntp_filters(bp);
  11797. if (test_and_clear_bit(BNXT_HWRM_EXEC_FWD_REQ_SP_EVENT, &bp->sp_event))
  11798. bnxt_hwrm_exec_fwd_req(bp);
  11799. if (test_and_clear_bit(BNXT_HWRM_PF_UNLOAD_SP_EVENT, &bp->sp_event))
  11800. netdev_info(bp->dev, "Receive PF driver unload event!\n");
  11801. if (test_and_clear_bit(BNXT_PERIODIC_STATS_SP_EVENT, &bp->sp_event)) {
  11802. bnxt_hwrm_port_qstats(bp, 0);
  11803. bnxt_hwrm_port_qstats_ext(bp, 0);
  11804. bnxt_accumulate_all_stats(bp);
  11805. }
  11806. if (test_and_clear_bit(BNXT_LINK_CHNG_SP_EVENT, &bp->sp_event)) {
  11807. int rc;
  11808. mutex_lock(&bp->link_lock);
  11809. if (test_and_clear_bit(BNXT_LINK_SPEED_CHNG_SP_EVENT,
  11810. &bp->sp_event))
  11811. bnxt_hwrm_phy_qcaps(bp);
  11812. rc = bnxt_update_link(bp, true);
  11813. if (rc)
  11814. netdev_err(bp->dev, "SP task can't update link (rc: %x)\n",
  11815. rc);
  11816. if (test_and_clear_bit(BNXT_LINK_CFG_CHANGE_SP_EVENT,
  11817. &bp->sp_event))
  11818. bnxt_init_ethtool_link_settings(bp);
  11819. mutex_unlock(&bp->link_lock);
  11820. }
  11821. if (test_and_clear_bit(BNXT_UPDATE_PHY_SP_EVENT, &bp->sp_event)) {
  11822. int rc;
  11823. mutex_lock(&bp->link_lock);
  11824. rc = bnxt_update_phy_setting(bp);
  11825. mutex_unlock(&bp->link_lock);
  11826. if (rc) {
  11827. netdev_warn(bp->dev, "update phy settings retry failed\n");
  11828. } else {
  11829. bp->link_info.phy_retry = false;
  11830. netdev_info(bp->dev, "update phy settings retry succeeded\n");
  11831. }
  11832. }
  11833. if (test_and_clear_bit(BNXT_HWRM_PORT_MODULE_SP_EVENT, &bp->sp_event)) {
  11834. mutex_lock(&bp->link_lock);
  11835. bnxt_get_port_module_status(bp);
  11836. mutex_unlock(&bp->link_lock);
  11837. }
  11838. if (test_and_clear_bit(BNXT_FLOW_STATS_SP_EVENT, &bp->sp_event))
  11839. bnxt_tc_flow_stats_work(bp);
  11840. if (test_and_clear_bit(BNXT_RING_COAL_NOW_SP_EVENT, &bp->sp_event))
  11841. bnxt_chk_missed_irq(bp);
  11842. if (test_and_clear_bit(BNXT_FW_ECHO_REQUEST_SP_EVENT, &bp->sp_event))
  11843. bnxt_fw_echo_reply(bp);
  11844. if (test_and_clear_bit(BNXT_THERMAL_THRESHOLD_SP_EVENT, &bp->sp_event))
  11845. bnxt_hwmon_notify_event(bp);
  11846. /* These functions below will clear BNXT_STATE_IN_SP_TASK. They
  11847. * must be the last functions to be called before exiting.
  11848. */
  11849. if (test_and_clear_bit(BNXT_RESET_TASK_SP_EVENT, &bp->sp_event))
  11850. bnxt_reset(bp, false);
  11851. if (test_and_clear_bit(BNXT_RESET_TASK_SILENT_SP_EVENT, &bp->sp_event))
  11852. bnxt_reset(bp, true);
  11853. if (test_and_clear_bit(BNXT_RST_RING_SP_EVENT, &bp->sp_event))
  11854. bnxt_rx_ring_reset(bp);
  11855. if (test_and_clear_bit(BNXT_FW_RESET_NOTIFY_SP_EVENT, &bp->sp_event)) {
  11856. if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state) ||
  11857. test_bit(BNXT_STATE_FW_NON_FATAL_COND, &bp->state))
  11858. bnxt_devlink_health_fw_report(bp);
  11859. else
  11860. bnxt_fw_reset(bp);
  11861. }
  11862. if (test_and_clear_bit(BNXT_FW_EXCEPTION_SP_EVENT, &bp->sp_event)) {
  11863. if (!is_bnxt_fw_ok(bp))
  11864. bnxt_devlink_health_fw_report(bp);
  11865. }
  11866. smp_mb__before_atomic();
  11867. clear_bit(BNXT_STATE_IN_SP_TASK, &bp->state);
  11868. }
  11869. static void _bnxt_get_max_rings(struct bnxt *bp, int *max_rx, int *max_tx,
  11870. int *max_cp);
  11871. /* Under rtnl_lock */
  11872. int bnxt_check_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs,
  11873. int tx_xdp)
  11874. {
  11875. int max_rx, max_tx, max_cp, tx_sets = 1, tx_cp;
  11876. struct bnxt_hw_rings hwr = {0};
  11877. int rx_rings = rx;
  11878. int rc;
  11879. if (tcs)
  11880. tx_sets = tcs;
  11881. _bnxt_get_max_rings(bp, &max_rx, &max_tx, &max_cp);
  11882. if (max_rx < rx_rings)
  11883. return -ENOMEM;
  11884. if (bp->flags & BNXT_FLAG_AGG_RINGS)
  11885. rx_rings <<= 1;
  11886. hwr.rx = rx_rings;
  11887. hwr.tx = tx * tx_sets + tx_xdp;
  11888. if (max_tx < hwr.tx)
  11889. return -ENOMEM;
  11890. hwr.vnic = bnxt_get_total_vnics(bp, rx);
  11891. tx_cp = __bnxt_num_tx_to_cp(bp, hwr.tx, tx_sets, tx_xdp);
  11892. hwr.cp = sh ? max_t(int, tx_cp, rx) : tx_cp + rx;
  11893. if (max_cp < hwr.cp)
  11894. return -ENOMEM;
  11895. hwr.stat = hwr.cp;
  11896. if (BNXT_NEW_RM(bp)) {
  11897. hwr.cp += bnxt_get_ulp_msix_num_in_use(bp);
  11898. hwr.stat += bnxt_get_ulp_stat_ctxs_in_use(bp);
  11899. hwr.grp = rx;
  11900. hwr.rss_ctx = bnxt_get_total_rss_ctxs(bp, &hwr);
  11901. }
  11902. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS)
  11903. hwr.cp_p5 = hwr.tx + rx;
  11904. rc = bnxt_hwrm_check_rings(bp, &hwr);
  11905. if (!rc && pci_msix_can_alloc_dyn(bp->pdev)) {
  11906. if (!bnxt_ulp_registered(bp->edev)) {
  11907. hwr.cp += bnxt_get_ulp_msix_num(bp);
  11908. hwr.cp = min_t(int, hwr.cp, bnxt_get_max_func_irqs(bp));
  11909. }
  11910. if (hwr.cp > bp->total_irqs) {
  11911. int total_msix = bnxt_change_msix(bp, hwr.cp);
  11912. if (total_msix < hwr.cp) {
  11913. netdev_warn(bp->dev, "Unable to allocate %d MSIX vectors, maximum available %d\n",
  11914. hwr.cp, total_msix);
  11915. rc = -ENOSPC;
  11916. }
  11917. }
  11918. }
  11919. return rc;
  11920. }
  11921. static void bnxt_unmap_bars(struct bnxt *bp, struct pci_dev *pdev)
  11922. {
  11923. if (bp->bar2) {
  11924. pci_iounmap(pdev, bp->bar2);
  11925. bp->bar2 = NULL;
  11926. }
  11927. if (bp->bar1) {
  11928. pci_iounmap(pdev, bp->bar1);
  11929. bp->bar1 = NULL;
  11930. }
  11931. if (bp->bar0) {
  11932. pci_iounmap(pdev, bp->bar0);
  11933. bp->bar0 = NULL;
  11934. }
  11935. }
  11936. static void bnxt_cleanup_pci(struct bnxt *bp)
  11937. {
  11938. bnxt_unmap_bars(bp, bp->pdev);
  11939. pci_release_regions(bp->pdev);
  11940. if (pci_is_enabled(bp->pdev))
  11941. pci_disable_device(bp->pdev);
  11942. }
  11943. static void bnxt_init_dflt_coal(struct bnxt *bp)
  11944. {
  11945. struct bnxt_coal_cap *coal_cap = &bp->coal_cap;
  11946. struct bnxt_coal *coal;
  11947. u16 flags = 0;
  11948. if (coal_cap->cmpl_params &
  11949. RING_AGGINT_QCAPS_RESP_CMPL_PARAMS_TIMER_RESET)
  11950. flags |= RING_CMPL_RING_CFG_AGGINT_PARAMS_REQ_FLAGS_TIMER_RESET;
  11951. /* Tick values in micro seconds.
  11952. * 1 coal_buf x bufs_per_record = 1 completion record.
  11953. */
  11954. coal = &bp->rx_coal;
  11955. coal->coal_ticks = 10;
  11956. coal->coal_bufs = 30;
  11957. coal->coal_ticks_irq = 1;
  11958. coal->coal_bufs_irq = 2;
  11959. coal->idle_thresh = 50;
  11960. coal->bufs_per_record = 2;
  11961. coal->budget = 64; /* NAPI budget */
  11962. coal->flags = flags;
  11963. coal = &bp->tx_coal;
  11964. coal->coal_ticks = 28;
  11965. coal->coal_bufs = 30;
  11966. coal->coal_ticks_irq = 2;
  11967. coal->coal_bufs_irq = 2;
  11968. coal->bufs_per_record = 1;
  11969. coal->flags = flags;
  11970. bp->stats_coal_ticks = BNXT_DEF_STATS_COAL_TICKS;
  11971. }
  11972. /* FW that pre-reserves 1 VNIC per function */
  11973. static bool bnxt_fw_pre_resv_vnics(struct bnxt *bp)
  11974. {
  11975. u16 fw_maj = BNXT_FW_MAJ(bp), fw_bld = BNXT_FW_BLD(bp);
  11976. if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS) &&
  11977. (fw_maj > 218 || (fw_maj == 218 && fw_bld >= 18)))
  11978. return true;
  11979. if ((bp->flags & BNXT_FLAG_CHIP_P5_PLUS) &&
  11980. (fw_maj > 216 || (fw_maj == 216 && fw_bld >= 172)))
  11981. return true;
  11982. return false;
  11983. }
  11984. static int bnxt_fw_init_one_p1(struct bnxt *bp)
  11985. {
  11986. int rc;
  11987. bp->fw_cap = 0;
  11988. rc = bnxt_hwrm_ver_get(bp);
  11989. /* FW may be unresponsive after FLR. FLR must complete within 100 msec
  11990. * so wait before continuing with recovery.
  11991. */
  11992. if (rc)
  11993. msleep(100);
  11994. bnxt_try_map_fw_health_reg(bp);
  11995. if (rc) {
  11996. rc = bnxt_try_recover_fw(bp);
  11997. if (rc)
  11998. return rc;
  11999. rc = bnxt_hwrm_ver_get(bp);
  12000. if (rc)
  12001. return rc;
  12002. }
  12003. bnxt_nvm_cfg_ver_get(bp);
  12004. rc = bnxt_hwrm_func_reset(bp);
  12005. if (rc)
  12006. return -ENODEV;
  12007. bnxt_hwrm_fw_set_time(bp);
  12008. return 0;
  12009. }
  12010. static int bnxt_fw_init_one_p2(struct bnxt *bp)
  12011. {
  12012. int rc;
  12013. /* Get the MAX capabilities for this function */
  12014. rc = bnxt_hwrm_func_qcaps(bp);
  12015. if (rc) {
  12016. netdev_err(bp->dev, "hwrm query capability failure rc: %x\n",
  12017. rc);
  12018. return -ENODEV;
  12019. }
  12020. rc = bnxt_hwrm_cfa_adv_flow_mgnt_qcaps(bp);
  12021. if (rc)
  12022. netdev_warn(bp->dev, "hwrm query adv flow mgnt failure rc: %d\n",
  12023. rc);
  12024. if (bnxt_alloc_fw_health(bp)) {
  12025. netdev_warn(bp->dev, "no memory for firmware error recovery\n");
  12026. } else {
  12027. rc = bnxt_hwrm_error_recovery_qcfg(bp);
  12028. if (rc)
  12029. netdev_warn(bp->dev, "hwrm query error recovery failure rc: %d\n",
  12030. rc);
  12031. }
  12032. rc = bnxt_hwrm_func_drv_rgtr(bp, NULL, 0, false);
  12033. if (rc)
  12034. return -ENODEV;
  12035. rc = bnxt_alloc_crash_dump_mem(bp);
  12036. if (rc)
  12037. netdev_warn(bp->dev, "crash dump mem alloc failure rc: %d\n",
  12038. rc);
  12039. if (!rc) {
  12040. rc = bnxt_hwrm_crash_dump_mem_cfg(bp);
  12041. if (rc) {
  12042. bnxt_free_crash_dump_mem(bp);
  12043. netdev_warn(bp->dev,
  12044. "hwrm crash dump mem failure rc: %d\n", rc);
  12045. }
  12046. }
  12047. if (bnxt_fw_pre_resv_vnics(bp))
  12048. bp->fw_cap |= BNXT_FW_CAP_PRE_RESV_VNICS;
  12049. bnxt_hwrm_func_qcfg(bp);
  12050. bnxt_hwrm_vnic_qcaps(bp);
  12051. bnxt_hwrm_port_led_qcaps(bp);
  12052. bnxt_ethtool_init(bp);
  12053. if (bp->fw_cap & BNXT_FW_CAP_PTP)
  12054. __bnxt_hwrm_ptp_qcfg(bp);
  12055. bnxt_dcb_init(bp);
  12056. bnxt_hwmon_init(bp);
  12057. return 0;
  12058. }
  12059. static void bnxt_set_dflt_rss_hash_type(struct bnxt *bp)
  12060. {
  12061. bp->rss_cap &= ~BNXT_RSS_CAP_UDP_RSS_CAP;
  12062. bp->rss_hash_cfg = VNIC_RSS_CFG_REQ_HASH_TYPE_IPV4 |
  12063. VNIC_RSS_CFG_REQ_HASH_TYPE_TCP_IPV4 |
  12064. VNIC_RSS_CFG_REQ_HASH_TYPE_IPV6 |
  12065. VNIC_RSS_CFG_REQ_HASH_TYPE_TCP_IPV6;
  12066. if (bp->rss_cap & BNXT_RSS_CAP_RSS_HASH_TYPE_DELTA)
  12067. bp->rss_hash_delta = bp->rss_hash_cfg;
  12068. if (BNXT_CHIP_P4_PLUS(bp) && bp->hwrm_spec_code >= 0x10501) {
  12069. bp->rss_cap |= BNXT_RSS_CAP_UDP_RSS_CAP;
  12070. bp->rss_hash_cfg |= VNIC_RSS_CFG_REQ_HASH_TYPE_UDP_IPV4 |
  12071. VNIC_RSS_CFG_REQ_HASH_TYPE_UDP_IPV6;
  12072. }
  12073. }
  12074. static void bnxt_set_dflt_rfs(struct bnxt *bp)
  12075. {
  12076. struct net_device *dev = bp->dev;
  12077. dev->hw_features &= ~NETIF_F_NTUPLE;
  12078. dev->features &= ~NETIF_F_NTUPLE;
  12079. bp->flags &= ~BNXT_FLAG_RFS;
  12080. if (bnxt_rfs_supported(bp)) {
  12081. dev->hw_features |= NETIF_F_NTUPLE;
  12082. if (bnxt_rfs_capable(bp, false)) {
  12083. bp->flags |= BNXT_FLAG_RFS;
  12084. dev->features |= NETIF_F_NTUPLE;
  12085. }
  12086. }
  12087. }
  12088. static void bnxt_fw_init_one_p3(struct bnxt *bp)
  12089. {
  12090. struct pci_dev *pdev = bp->pdev;
  12091. bnxt_set_dflt_rss_hash_type(bp);
  12092. bnxt_set_dflt_rfs(bp);
  12093. bnxt_get_wol_settings(bp);
  12094. if (bp->flags & BNXT_FLAG_WOL_CAP)
  12095. device_set_wakeup_enable(&pdev->dev, bp->wol);
  12096. else
  12097. device_set_wakeup_capable(&pdev->dev, false);
  12098. bnxt_hwrm_set_cache_line_size(bp, cache_line_size());
  12099. bnxt_hwrm_coal_params_qcaps(bp);
  12100. }
  12101. static int bnxt_probe_phy(struct bnxt *bp, bool fw_dflt);
  12102. int bnxt_fw_init_one(struct bnxt *bp)
  12103. {
  12104. int rc;
  12105. rc = bnxt_fw_init_one_p1(bp);
  12106. if (rc) {
  12107. netdev_err(bp->dev, "Firmware init phase 1 failed\n");
  12108. return rc;
  12109. }
  12110. rc = bnxt_fw_init_one_p2(bp);
  12111. if (rc) {
  12112. netdev_err(bp->dev, "Firmware init phase 2 failed\n");
  12113. return rc;
  12114. }
  12115. rc = bnxt_probe_phy(bp, false);
  12116. if (rc)
  12117. return rc;
  12118. rc = bnxt_approve_mac(bp, bp->dev->dev_addr, false);
  12119. if (rc)
  12120. return rc;
  12121. bnxt_fw_init_one_p3(bp);
  12122. return 0;
  12123. }
  12124. static void bnxt_fw_reset_writel(struct bnxt *bp, int reg_idx)
  12125. {
  12126. struct bnxt_fw_health *fw_health = bp->fw_health;
  12127. u32 reg = fw_health->fw_reset_seq_regs[reg_idx];
  12128. u32 val = fw_health->fw_reset_seq_vals[reg_idx];
  12129. u32 reg_type, reg_off, delay_msecs;
  12130. delay_msecs = fw_health->fw_reset_seq_delay_msec[reg_idx];
  12131. reg_type = BNXT_FW_HEALTH_REG_TYPE(reg);
  12132. reg_off = BNXT_FW_HEALTH_REG_OFF(reg);
  12133. switch (reg_type) {
  12134. case BNXT_FW_HEALTH_REG_TYPE_CFG:
  12135. pci_write_config_dword(bp->pdev, reg_off, val);
  12136. break;
  12137. case BNXT_FW_HEALTH_REG_TYPE_GRC:
  12138. writel(reg_off & BNXT_GRC_BASE_MASK,
  12139. bp->bar0 + BNXT_GRCPF_REG_WINDOW_BASE_OUT + 4);
  12140. reg_off = (reg_off & BNXT_GRC_OFFSET_MASK) + 0x2000;
  12141. fallthrough;
  12142. case BNXT_FW_HEALTH_REG_TYPE_BAR0:
  12143. writel(val, bp->bar0 + reg_off);
  12144. break;
  12145. case BNXT_FW_HEALTH_REG_TYPE_BAR1:
  12146. writel(val, bp->bar1 + reg_off);
  12147. break;
  12148. }
  12149. if (delay_msecs) {
  12150. pci_read_config_dword(bp->pdev, 0, &val);
  12151. msleep(delay_msecs);
  12152. }
  12153. }
  12154. bool bnxt_hwrm_reset_permitted(struct bnxt *bp)
  12155. {
  12156. struct hwrm_func_qcfg_output *resp;
  12157. struct hwrm_func_qcfg_input *req;
  12158. bool result = true; /* firmware will enforce if unknown */
  12159. if (~bp->fw_cap & BNXT_FW_CAP_HOT_RESET_IF)
  12160. return result;
  12161. if (hwrm_req_init(bp, req, HWRM_FUNC_QCFG))
  12162. return result;
  12163. req->fid = cpu_to_le16(0xffff);
  12164. resp = hwrm_req_hold(bp, req);
  12165. if (!hwrm_req_send(bp, req))
  12166. result = !!(le16_to_cpu(resp->flags) &
  12167. FUNC_QCFG_RESP_FLAGS_HOT_RESET_ALLOWED);
  12168. hwrm_req_drop(bp, req);
  12169. return result;
  12170. }
  12171. static void bnxt_reset_all(struct bnxt *bp)
  12172. {
  12173. struct bnxt_fw_health *fw_health = bp->fw_health;
  12174. int i, rc;
  12175. if (bp->fw_cap & BNXT_FW_CAP_ERR_RECOVER_RELOAD) {
  12176. bnxt_fw_reset_via_optee(bp);
  12177. bp->fw_reset_timestamp = jiffies;
  12178. return;
  12179. }
  12180. if (fw_health->flags & ERROR_RECOVERY_QCFG_RESP_FLAGS_HOST) {
  12181. for (i = 0; i < fw_health->fw_reset_seq_cnt; i++)
  12182. bnxt_fw_reset_writel(bp, i);
  12183. } else if (fw_health->flags & ERROR_RECOVERY_QCFG_RESP_FLAGS_CO_CPU) {
  12184. struct hwrm_fw_reset_input *req;
  12185. rc = hwrm_req_init(bp, req, HWRM_FW_RESET);
  12186. if (!rc) {
  12187. req->target_id = cpu_to_le16(HWRM_TARGET_ID_KONG);
  12188. req->embedded_proc_type = FW_RESET_REQ_EMBEDDED_PROC_TYPE_CHIP;
  12189. req->selfrst_status = FW_RESET_REQ_SELFRST_STATUS_SELFRSTASAP;
  12190. req->flags = FW_RESET_REQ_FLAGS_RESET_GRACEFUL;
  12191. rc = hwrm_req_send(bp, req);
  12192. }
  12193. if (rc != -ENODEV)
  12194. netdev_warn(bp->dev, "Unable to reset FW rc=%d\n", rc);
  12195. }
  12196. bp->fw_reset_timestamp = jiffies;
  12197. }
  12198. static bool bnxt_fw_reset_timeout(struct bnxt *bp)
  12199. {
  12200. return time_after(jiffies, bp->fw_reset_timestamp +
  12201. (bp->fw_reset_max_dsecs * HZ / 10));
  12202. }
  12203. static void bnxt_fw_reset_abort(struct bnxt *bp, int rc)
  12204. {
  12205. clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
  12206. if (bp->fw_reset_state != BNXT_FW_RESET_STATE_POLL_VF)
  12207. bnxt_dl_health_fw_status_update(bp, false);
  12208. bp->fw_reset_state = 0;
  12209. dev_close(bp->dev);
  12210. }
  12211. static void bnxt_fw_reset_task(struct work_struct *work)
  12212. {
  12213. struct bnxt *bp = container_of(work, struct bnxt, fw_reset_task.work);
  12214. int rc = 0;
  12215. if (!test_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) {
  12216. netdev_err(bp->dev, "bnxt_fw_reset_task() called when not in fw reset mode!\n");
  12217. return;
  12218. }
  12219. switch (bp->fw_reset_state) {
  12220. case BNXT_FW_RESET_STATE_POLL_VF: {
  12221. int n = bnxt_get_registered_vfs(bp);
  12222. int tmo;
  12223. if (n < 0) {
  12224. netdev_err(bp->dev, "Firmware reset aborted, subsequent func_qcfg cmd failed, rc = %d, %d msecs since reset timestamp\n",
  12225. n, jiffies_to_msecs(jiffies -
  12226. bp->fw_reset_timestamp));
  12227. goto fw_reset_abort;
  12228. } else if (n > 0) {
  12229. if (bnxt_fw_reset_timeout(bp)) {
  12230. clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
  12231. bp->fw_reset_state = 0;
  12232. netdev_err(bp->dev, "Firmware reset aborted, bnxt_get_registered_vfs() returns %d\n",
  12233. n);
  12234. goto ulp_start;
  12235. }
  12236. bnxt_queue_fw_reset_work(bp, HZ / 10);
  12237. return;
  12238. }
  12239. bp->fw_reset_timestamp = jiffies;
  12240. rtnl_lock();
  12241. if (test_bit(BNXT_STATE_ABORT_ERR, &bp->state)) {
  12242. bnxt_fw_reset_abort(bp, rc);
  12243. rtnl_unlock();
  12244. goto ulp_start;
  12245. }
  12246. bnxt_fw_reset_close(bp);
  12247. if (bp->fw_cap & BNXT_FW_CAP_ERR_RECOVER_RELOAD) {
  12248. bp->fw_reset_state = BNXT_FW_RESET_STATE_POLL_FW_DOWN;
  12249. tmo = HZ / 10;
  12250. } else {
  12251. bp->fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV;
  12252. tmo = bp->fw_reset_min_dsecs * HZ / 10;
  12253. }
  12254. rtnl_unlock();
  12255. bnxt_queue_fw_reset_work(bp, tmo);
  12256. return;
  12257. }
  12258. case BNXT_FW_RESET_STATE_POLL_FW_DOWN: {
  12259. u32 val;
  12260. val = bnxt_fw_health_readl(bp, BNXT_FW_HEALTH_REG);
  12261. if (!(val & BNXT_FW_STATUS_SHUTDOWN) &&
  12262. !bnxt_fw_reset_timeout(bp)) {
  12263. bnxt_queue_fw_reset_work(bp, HZ / 5);
  12264. return;
  12265. }
  12266. if (!bp->fw_health->primary) {
  12267. u32 wait_dsecs = bp->fw_health->normal_func_wait_dsecs;
  12268. bp->fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV;
  12269. bnxt_queue_fw_reset_work(bp, wait_dsecs * HZ / 10);
  12270. return;
  12271. }
  12272. bp->fw_reset_state = BNXT_FW_RESET_STATE_RESET_FW;
  12273. }
  12274. fallthrough;
  12275. case BNXT_FW_RESET_STATE_RESET_FW:
  12276. bnxt_reset_all(bp);
  12277. bp->fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV;
  12278. bnxt_queue_fw_reset_work(bp, bp->fw_reset_min_dsecs * HZ / 10);
  12279. return;
  12280. case BNXT_FW_RESET_STATE_ENABLE_DEV:
  12281. bnxt_inv_fw_health_reg(bp);
  12282. if (test_bit(BNXT_STATE_FW_FATAL_COND, &bp->state) &&
  12283. !bp->fw_reset_min_dsecs) {
  12284. u16 val;
  12285. pci_read_config_word(bp->pdev, PCI_SUBSYSTEM_ID, &val);
  12286. if (val == 0xffff) {
  12287. if (bnxt_fw_reset_timeout(bp)) {
  12288. netdev_err(bp->dev, "Firmware reset aborted, PCI config space invalid\n");
  12289. rc = -ETIMEDOUT;
  12290. goto fw_reset_abort;
  12291. }
  12292. bnxt_queue_fw_reset_work(bp, HZ / 1000);
  12293. return;
  12294. }
  12295. }
  12296. clear_bit(BNXT_STATE_FW_FATAL_COND, &bp->state);
  12297. clear_bit(BNXT_STATE_FW_NON_FATAL_COND, &bp->state);
  12298. if (test_and_clear_bit(BNXT_STATE_FW_ACTIVATE_RESET, &bp->state) &&
  12299. !test_bit(BNXT_STATE_FW_ACTIVATE, &bp->state))
  12300. bnxt_dl_remote_reload(bp);
  12301. if (pci_enable_device(bp->pdev)) {
  12302. netdev_err(bp->dev, "Cannot re-enable PCI device\n");
  12303. rc = -ENODEV;
  12304. goto fw_reset_abort;
  12305. }
  12306. pci_set_master(bp->pdev);
  12307. bp->fw_reset_state = BNXT_FW_RESET_STATE_POLL_FW;
  12308. fallthrough;
  12309. case BNXT_FW_RESET_STATE_POLL_FW:
  12310. bp->hwrm_cmd_timeout = SHORT_HWRM_CMD_TIMEOUT;
  12311. rc = bnxt_hwrm_poll(bp);
  12312. if (rc) {
  12313. if (bnxt_fw_reset_timeout(bp)) {
  12314. netdev_err(bp->dev, "Firmware reset aborted\n");
  12315. goto fw_reset_abort_status;
  12316. }
  12317. bnxt_queue_fw_reset_work(bp, HZ / 5);
  12318. return;
  12319. }
  12320. bp->hwrm_cmd_timeout = DFLT_HWRM_CMD_TIMEOUT;
  12321. bp->fw_reset_state = BNXT_FW_RESET_STATE_OPENING;
  12322. fallthrough;
  12323. case BNXT_FW_RESET_STATE_OPENING:
  12324. while (!rtnl_trylock()) {
  12325. bnxt_queue_fw_reset_work(bp, HZ / 10);
  12326. return;
  12327. }
  12328. rc = bnxt_open(bp->dev);
  12329. if (rc) {
  12330. netdev_err(bp->dev, "bnxt_open() failed during FW reset\n");
  12331. bnxt_fw_reset_abort(bp, rc);
  12332. rtnl_unlock();
  12333. goto ulp_start;
  12334. }
  12335. if ((bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY) &&
  12336. bp->fw_health->enabled) {
  12337. bp->fw_health->last_fw_reset_cnt =
  12338. bnxt_fw_health_readl(bp, BNXT_FW_RESET_CNT_REG);
  12339. }
  12340. bp->fw_reset_state = 0;
  12341. /* Make sure fw_reset_state is 0 before clearing the flag */
  12342. smp_mb__before_atomic();
  12343. clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
  12344. bnxt_ptp_reapply_pps(bp);
  12345. clear_bit(BNXT_STATE_FW_ACTIVATE, &bp->state);
  12346. if (test_and_clear_bit(BNXT_STATE_RECOVER, &bp->state)) {
  12347. bnxt_dl_health_fw_recovery_done(bp);
  12348. bnxt_dl_health_fw_status_update(bp, true);
  12349. }
  12350. rtnl_unlock();
  12351. bnxt_ulp_start(bp, 0);
  12352. bnxt_reenable_sriov(bp);
  12353. rtnl_lock();
  12354. bnxt_vf_reps_alloc(bp);
  12355. bnxt_vf_reps_open(bp);
  12356. rtnl_unlock();
  12357. break;
  12358. }
  12359. return;
  12360. fw_reset_abort_status:
  12361. if (bp->fw_health->status_reliable ||
  12362. (bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY)) {
  12363. u32 sts = bnxt_fw_health_readl(bp, BNXT_FW_HEALTH_REG);
  12364. netdev_err(bp->dev, "fw_health_status 0x%x\n", sts);
  12365. }
  12366. fw_reset_abort:
  12367. rtnl_lock();
  12368. bnxt_fw_reset_abort(bp, rc);
  12369. rtnl_unlock();
  12370. ulp_start:
  12371. bnxt_ulp_start(bp, rc);
  12372. }
  12373. static int bnxt_init_board(struct pci_dev *pdev, struct net_device *dev)
  12374. {
  12375. int rc;
  12376. struct bnxt *bp = netdev_priv(dev);
  12377. SET_NETDEV_DEV(dev, &pdev->dev);
  12378. /* enable device (incl. PCI PM wakeup), and bus-mastering */
  12379. rc = pci_enable_device(pdev);
  12380. if (rc) {
  12381. dev_err(&pdev->dev, "Cannot enable PCI device, aborting\n");
  12382. goto init_err;
  12383. }
  12384. if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
  12385. dev_err(&pdev->dev,
  12386. "Cannot find PCI device base address, aborting\n");
  12387. rc = -ENODEV;
  12388. goto init_err_disable;
  12389. }
  12390. rc = pci_request_regions(pdev, DRV_MODULE_NAME);
  12391. if (rc) {
  12392. dev_err(&pdev->dev, "Cannot obtain PCI resources, aborting\n");
  12393. goto init_err_disable;
  12394. }
  12395. if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)) != 0 &&
  12396. dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)) != 0) {
  12397. dev_err(&pdev->dev, "System does not support DMA, aborting\n");
  12398. rc = -EIO;
  12399. goto init_err_release;
  12400. }
  12401. pci_set_master(pdev);
  12402. bp->dev = dev;
  12403. bp->pdev = pdev;
  12404. /* Doorbell BAR bp->bar1 is mapped after bnxt_fw_init_one_p2()
  12405. * determines the BAR size.
  12406. */
  12407. bp->bar0 = pci_ioremap_bar(pdev, 0);
  12408. if (!bp->bar0) {
  12409. dev_err(&pdev->dev, "Cannot map device registers, aborting\n");
  12410. rc = -ENOMEM;
  12411. goto init_err_release;
  12412. }
  12413. bp->bar2 = pci_ioremap_bar(pdev, 4);
  12414. if (!bp->bar2) {
  12415. dev_err(&pdev->dev, "Cannot map bar4 registers, aborting\n");
  12416. rc = -ENOMEM;
  12417. goto init_err_release;
  12418. }
  12419. INIT_WORK(&bp->sp_task, bnxt_sp_task);
  12420. INIT_DELAYED_WORK(&bp->fw_reset_task, bnxt_fw_reset_task);
  12421. spin_lock_init(&bp->ntp_fltr_lock);
  12422. #if BITS_PER_LONG == 32
  12423. spin_lock_init(&bp->db_lock);
  12424. #endif
  12425. bp->rx_ring_size = BNXT_DEFAULT_RX_RING_SIZE;
  12426. bp->tx_ring_size = BNXT_DEFAULT_TX_RING_SIZE;
  12427. timer_setup(&bp->timer, bnxt_timer, 0);
  12428. bp->current_interval = BNXT_TIMER_INTERVAL;
  12429. bp->vxlan_fw_dst_port_id = INVALID_HW_RING_ID;
  12430. bp->nge_fw_dst_port_id = INVALID_HW_RING_ID;
  12431. clear_bit(BNXT_STATE_OPEN, &bp->state);
  12432. return 0;
  12433. init_err_release:
  12434. bnxt_unmap_bars(bp, pdev);
  12435. pci_release_regions(pdev);
  12436. init_err_disable:
  12437. pci_disable_device(pdev);
  12438. init_err:
  12439. return rc;
  12440. }
  12441. /* rtnl_lock held */
  12442. static int bnxt_change_mac_addr(struct net_device *dev, void *p)
  12443. {
  12444. struct sockaddr *addr = p;
  12445. struct bnxt *bp = netdev_priv(dev);
  12446. int rc = 0;
  12447. if (!is_valid_ether_addr(addr->sa_data))
  12448. return -EADDRNOTAVAIL;
  12449. if (ether_addr_equal(addr->sa_data, dev->dev_addr))
  12450. return 0;
  12451. rc = bnxt_approve_mac(bp, addr->sa_data, true);
  12452. if (rc)
  12453. return rc;
  12454. eth_hw_addr_set(dev, addr->sa_data);
  12455. bnxt_clear_usr_fltrs(bp, true);
  12456. if (netif_running(dev)) {
  12457. bnxt_close_nic(bp, false, false);
  12458. rc = bnxt_open_nic(bp, false, false);
  12459. }
  12460. return rc;
  12461. }
  12462. /* rtnl_lock held */
  12463. static int bnxt_change_mtu(struct net_device *dev, int new_mtu)
  12464. {
  12465. struct bnxt *bp = netdev_priv(dev);
  12466. if (netif_running(dev))
  12467. bnxt_close_nic(bp, true, false);
  12468. WRITE_ONCE(dev->mtu, new_mtu);
  12469. /* MTU change may change the AGG ring settings if an XDP multi-buffer
  12470. * program is attached. We need to set the AGG rings settings and
  12471. * rx_skb_func accordingly.
  12472. */
  12473. if (READ_ONCE(bp->xdp_prog))
  12474. bnxt_set_rx_skb_mode(bp, true);
  12475. bnxt_set_ring_params(bp);
  12476. if (netif_running(dev))
  12477. return bnxt_open_nic(bp, true, false);
  12478. return 0;
  12479. }
  12480. int bnxt_setup_mq_tc(struct net_device *dev, u8 tc)
  12481. {
  12482. struct bnxt *bp = netdev_priv(dev);
  12483. bool sh = false;
  12484. int rc, tx_cp;
  12485. if (tc > bp->max_tc) {
  12486. netdev_err(dev, "Too many traffic classes requested: %d. Max supported is %d.\n",
  12487. tc, bp->max_tc);
  12488. return -EINVAL;
  12489. }
  12490. if (bp->num_tc == tc)
  12491. return 0;
  12492. if (bp->flags & BNXT_FLAG_SHARED_RINGS)
  12493. sh = true;
  12494. rc = bnxt_check_rings(bp, bp->tx_nr_rings_per_tc, bp->rx_nr_rings,
  12495. sh, tc, bp->tx_nr_rings_xdp);
  12496. if (rc)
  12497. return rc;
  12498. /* Needs to close the device and do hw resource re-allocations */
  12499. if (netif_running(bp->dev))
  12500. bnxt_close_nic(bp, true, false);
  12501. if (tc) {
  12502. bp->tx_nr_rings = bp->tx_nr_rings_per_tc * tc;
  12503. netdev_set_num_tc(dev, tc);
  12504. bp->num_tc = tc;
  12505. } else {
  12506. bp->tx_nr_rings = bp->tx_nr_rings_per_tc;
  12507. netdev_reset_tc(dev);
  12508. bp->num_tc = 0;
  12509. }
  12510. bp->tx_nr_rings += bp->tx_nr_rings_xdp;
  12511. tx_cp = bnxt_num_tx_to_cp(bp, bp->tx_nr_rings);
  12512. bp->cp_nr_rings = sh ? max_t(int, tx_cp, bp->rx_nr_rings) :
  12513. tx_cp + bp->rx_nr_rings;
  12514. if (netif_running(bp->dev))
  12515. return bnxt_open_nic(bp, true, false);
  12516. return 0;
  12517. }
  12518. static int bnxt_setup_tc_block_cb(enum tc_setup_type type, void *type_data,
  12519. void *cb_priv)
  12520. {
  12521. struct bnxt *bp = cb_priv;
  12522. if (!bnxt_tc_flower_enabled(bp) ||
  12523. !tc_cls_can_offload_and_chain0(bp->dev, type_data))
  12524. return -EOPNOTSUPP;
  12525. switch (type) {
  12526. case TC_SETUP_CLSFLOWER:
  12527. return bnxt_tc_setup_flower(bp, bp->pf.fw_fid, type_data);
  12528. default:
  12529. return -EOPNOTSUPP;
  12530. }
  12531. }
  12532. LIST_HEAD(bnxt_block_cb_list);
  12533. static int bnxt_setup_tc(struct net_device *dev, enum tc_setup_type type,
  12534. void *type_data)
  12535. {
  12536. struct bnxt *bp = netdev_priv(dev);
  12537. switch (type) {
  12538. case TC_SETUP_BLOCK:
  12539. return flow_block_cb_setup_simple(type_data,
  12540. &bnxt_block_cb_list,
  12541. bnxt_setup_tc_block_cb,
  12542. bp, bp, true);
  12543. case TC_SETUP_QDISC_MQPRIO: {
  12544. struct tc_mqprio_qopt *mqprio = type_data;
  12545. mqprio->hw = TC_MQPRIO_HW_OFFLOAD_TCS;
  12546. return bnxt_setup_mq_tc(dev, mqprio->num_tc);
  12547. }
  12548. default:
  12549. return -EOPNOTSUPP;
  12550. }
  12551. }
  12552. u32 bnxt_get_ntp_filter_idx(struct bnxt *bp, struct flow_keys *fkeys,
  12553. const struct sk_buff *skb)
  12554. {
  12555. struct bnxt_vnic_info *vnic;
  12556. if (skb)
  12557. return skb_get_hash_raw(skb) & BNXT_NTP_FLTR_HASH_MASK;
  12558. vnic = &bp->vnic_info[BNXT_VNIC_DEFAULT];
  12559. return bnxt_toeplitz(bp, fkeys, (void *)vnic->rss_hash_key);
  12560. }
  12561. int bnxt_insert_ntp_filter(struct bnxt *bp, struct bnxt_ntuple_filter *fltr,
  12562. u32 idx)
  12563. {
  12564. struct hlist_head *head;
  12565. int bit_id;
  12566. spin_lock_bh(&bp->ntp_fltr_lock);
  12567. bit_id = bitmap_find_free_region(bp->ntp_fltr_bmap, bp->max_fltr, 0);
  12568. if (bit_id < 0) {
  12569. spin_unlock_bh(&bp->ntp_fltr_lock);
  12570. return -ENOMEM;
  12571. }
  12572. fltr->base.sw_id = (u16)bit_id;
  12573. fltr->base.type = BNXT_FLTR_TYPE_NTUPLE;
  12574. fltr->base.flags |= BNXT_ACT_RING_DST;
  12575. head = &bp->ntp_fltr_hash_tbl[idx];
  12576. hlist_add_head_rcu(&fltr->base.hash, head);
  12577. set_bit(BNXT_FLTR_INSERTED, &fltr->base.state);
  12578. bnxt_insert_usr_fltr(bp, &fltr->base);
  12579. bp->ntp_fltr_count++;
  12580. spin_unlock_bh(&bp->ntp_fltr_lock);
  12581. return 0;
  12582. }
  12583. static bool bnxt_fltr_match(struct bnxt_ntuple_filter *f1,
  12584. struct bnxt_ntuple_filter *f2)
  12585. {
  12586. struct bnxt_flow_masks *masks1 = &f1->fmasks;
  12587. struct bnxt_flow_masks *masks2 = &f2->fmasks;
  12588. struct flow_keys *keys1 = &f1->fkeys;
  12589. struct flow_keys *keys2 = &f2->fkeys;
  12590. if (keys1->basic.n_proto != keys2->basic.n_proto ||
  12591. keys1->basic.ip_proto != keys2->basic.ip_proto)
  12592. return false;
  12593. if (keys1->basic.n_proto == htons(ETH_P_IP)) {
  12594. if (keys1->addrs.v4addrs.src != keys2->addrs.v4addrs.src ||
  12595. masks1->addrs.v4addrs.src != masks2->addrs.v4addrs.src ||
  12596. keys1->addrs.v4addrs.dst != keys2->addrs.v4addrs.dst ||
  12597. masks1->addrs.v4addrs.dst != masks2->addrs.v4addrs.dst)
  12598. return false;
  12599. } else {
  12600. if (!ipv6_addr_equal(&keys1->addrs.v6addrs.src,
  12601. &keys2->addrs.v6addrs.src) ||
  12602. !ipv6_addr_equal(&masks1->addrs.v6addrs.src,
  12603. &masks2->addrs.v6addrs.src) ||
  12604. !ipv6_addr_equal(&keys1->addrs.v6addrs.dst,
  12605. &keys2->addrs.v6addrs.dst) ||
  12606. !ipv6_addr_equal(&masks1->addrs.v6addrs.dst,
  12607. &masks2->addrs.v6addrs.dst))
  12608. return false;
  12609. }
  12610. return keys1->ports.src == keys2->ports.src &&
  12611. masks1->ports.src == masks2->ports.src &&
  12612. keys1->ports.dst == keys2->ports.dst &&
  12613. masks1->ports.dst == masks2->ports.dst &&
  12614. keys1->control.flags == keys2->control.flags &&
  12615. f1->l2_fltr == f2->l2_fltr;
  12616. }
  12617. struct bnxt_ntuple_filter *
  12618. bnxt_lookup_ntp_filter_from_idx(struct bnxt *bp,
  12619. struct bnxt_ntuple_filter *fltr, u32 idx)
  12620. {
  12621. struct bnxt_ntuple_filter *f;
  12622. struct hlist_head *head;
  12623. head = &bp->ntp_fltr_hash_tbl[idx];
  12624. hlist_for_each_entry_rcu(f, head, base.hash) {
  12625. if (bnxt_fltr_match(f, fltr))
  12626. return f;
  12627. }
  12628. return NULL;
  12629. }
  12630. #ifdef CONFIG_RFS_ACCEL
  12631. static int bnxt_rx_flow_steer(struct net_device *dev, const struct sk_buff *skb,
  12632. u16 rxq_index, u32 flow_id)
  12633. {
  12634. struct bnxt *bp = netdev_priv(dev);
  12635. struct bnxt_ntuple_filter *fltr, *new_fltr;
  12636. struct flow_keys *fkeys;
  12637. struct ethhdr *eth = (struct ethhdr *)skb_mac_header(skb);
  12638. struct bnxt_l2_filter *l2_fltr;
  12639. int rc = 0, idx;
  12640. u32 flags;
  12641. if (ether_addr_equal(dev->dev_addr, eth->h_dest)) {
  12642. l2_fltr = bp->vnic_info[BNXT_VNIC_DEFAULT].l2_filters[0];
  12643. atomic_inc(&l2_fltr->refcnt);
  12644. } else {
  12645. struct bnxt_l2_key key;
  12646. ether_addr_copy(key.dst_mac_addr, eth->h_dest);
  12647. key.vlan = 0;
  12648. l2_fltr = bnxt_lookup_l2_filter_from_key(bp, &key);
  12649. if (!l2_fltr)
  12650. return -EINVAL;
  12651. if (l2_fltr->base.flags & BNXT_ACT_FUNC_DST) {
  12652. bnxt_del_l2_filter(bp, l2_fltr);
  12653. return -EINVAL;
  12654. }
  12655. }
  12656. new_fltr = kzalloc(sizeof(*new_fltr), GFP_ATOMIC);
  12657. if (!new_fltr) {
  12658. bnxt_del_l2_filter(bp, l2_fltr);
  12659. return -ENOMEM;
  12660. }
  12661. fkeys = &new_fltr->fkeys;
  12662. if (!skb_flow_dissect_flow_keys(skb, fkeys, 0)) {
  12663. rc = -EPROTONOSUPPORT;
  12664. goto err_free;
  12665. }
  12666. if ((fkeys->basic.n_proto != htons(ETH_P_IP) &&
  12667. fkeys->basic.n_proto != htons(ETH_P_IPV6)) ||
  12668. ((fkeys->basic.ip_proto != IPPROTO_TCP) &&
  12669. (fkeys->basic.ip_proto != IPPROTO_UDP))) {
  12670. rc = -EPROTONOSUPPORT;
  12671. goto err_free;
  12672. }
  12673. new_fltr->fmasks = BNXT_FLOW_IPV4_MASK_ALL;
  12674. if (fkeys->basic.n_proto == htons(ETH_P_IPV6)) {
  12675. if (bp->hwrm_spec_code < 0x10601) {
  12676. rc = -EPROTONOSUPPORT;
  12677. goto err_free;
  12678. }
  12679. new_fltr->fmasks = BNXT_FLOW_IPV6_MASK_ALL;
  12680. }
  12681. flags = fkeys->control.flags;
  12682. if (((flags & FLOW_DIS_ENCAPSULATION) &&
  12683. bp->hwrm_spec_code < 0x10601) || (flags & FLOW_DIS_IS_FRAGMENT)) {
  12684. rc = -EPROTONOSUPPORT;
  12685. goto err_free;
  12686. }
  12687. new_fltr->l2_fltr = l2_fltr;
  12688. idx = bnxt_get_ntp_filter_idx(bp, fkeys, skb);
  12689. rcu_read_lock();
  12690. fltr = bnxt_lookup_ntp_filter_from_idx(bp, new_fltr, idx);
  12691. if (fltr) {
  12692. rc = fltr->base.sw_id;
  12693. rcu_read_unlock();
  12694. goto err_free;
  12695. }
  12696. rcu_read_unlock();
  12697. new_fltr->flow_id = flow_id;
  12698. new_fltr->base.rxq = rxq_index;
  12699. rc = bnxt_insert_ntp_filter(bp, new_fltr, idx);
  12700. if (!rc) {
  12701. bnxt_queue_sp_work(bp, BNXT_RX_NTP_FLTR_SP_EVENT);
  12702. return new_fltr->base.sw_id;
  12703. }
  12704. err_free:
  12705. bnxt_del_l2_filter(bp, l2_fltr);
  12706. kfree(new_fltr);
  12707. return rc;
  12708. }
  12709. #endif
  12710. void bnxt_del_ntp_filter(struct bnxt *bp, struct bnxt_ntuple_filter *fltr)
  12711. {
  12712. spin_lock_bh(&bp->ntp_fltr_lock);
  12713. if (!test_and_clear_bit(BNXT_FLTR_INSERTED, &fltr->base.state)) {
  12714. spin_unlock_bh(&bp->ntp_fltr_lock);
  12715. return;
  12716. }
  12717. hlist_del_rcu(&fltr->base.hash);
  12718. bnxt_del_one_usr_fltr(bp, &fltr->base);
  12719. bp->ntp_fltr_count--;
  12720. spin_unlock_bh(&bp->ntp_fltr_lock);
  12721. bnxt_del_l2_filter(bp, fltr->l2_fltr);
  12722. clear_bit(fltr->base.sw_id, bp->ntp_fltr_bmap);
  12723. kfree_rcu(fltr, base.rcu);
  12724. }
  12725. static void bnxt_cfg_ntp_filters(struct bnxt *bp)
  12726. {
  12727. #ifdef CONFIG_RFS_ACCEL
  12728. int i;
  12729. for (i = 0; i < BNXT_NTP_FLTR_HASH_SIZE; i++) {
  12730. struct hlist_head *head;
  12731. struct hlist_node *tmp;
  12732. struct bnxt_ntuple_filter *fltr;
  12733. int rc;
  12734. head = &bp->ntp_fltr_hash_tbl[i];
  12735. hlist_for_each_entry_safe(fltr, tmp, head, base.hash) {
  12736. bool del = false;
  12737. if (test_bit(BNXT_FLTR_VALID, &fltr->base.state)) {
  12738. if (fltr->base.flags & BNXT_ACT_NO_AGING)
  12739. continue;
  12740. if (rps_may_expire_flow(bp->dev, fltr->base.rxq,
  12741. fltr->flow_id,
  12742. fltr->base.sw_id)) {
  12743. bnxt_hwrm_cfa_ntuple_filter_free(bp,
  12744. fltr);
  12745. del = true;
  12746. }
  12747. } else {
  12748. rc = bnxt_hwrm_cfa_ntuple_filter_alloc(bp,
  12749. fltr);
  12750. if (rc)
  12751. del = true;
  12752. else
  12753. set_bit(BNXT_FLTR_VALID, &fltr->base.state);
  12754. }
  12755. if (del)
  12756. bnxt_del_ntp_filter(bp, fltr);
  12757. }
  12758. }
  12759. #endif
  12760. }
  12761. static int bnxt_udp_tunnel_set_port(struct net_device *netdev, unsigned int table,
  12762. unsigned int entry, struct udp_tunnel_info *ti)
  12763. {
  12764. struct bnxt *bp = netdev_priv(netdev);
  12765. unsigned int cmd;
  12766. if (ti->type == UDP_TUNNEL_TYPE_VXLAN)
  12767. cmd = TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_VXLAN;
  12768. else if (ti->type == UDP_TUNNEL_TYPE_GENEVE)
  12769. cmd = TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_GENEVE;
  12770. else
  12771. cmd = TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_VXLAN_GPE;
  12772. return bnxt_hwrm_tunnel_dst_port_alloc(bp, ti->port, cmd);
  12773. }
  12774. static int bnxt_udp_tunnel_unset_port(struct net_device *netdev, unsigned int table,
  12775. unsigned int entry, struct udp_tunnel_info *ti)
  12776. {
  12777. struct bnxt *bp = netdev_priv(netdev);
  12778. unsigned int cmd;
  12779. if (ti->type == UDP_TUNNEL_TYPE_VXLAN)
  12780. cmd = TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN;
  12781. else if (ti->type == UDP_TUNNEL_TYPE_GENEVE)
  12782. cmd = TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_GENEVE;
  12783. else
  12784. cmd = TUNNEL_DST_PORT_FREE_REQ_TUNNEL_TYPE_VXLAN_GPE;
  12785. return bnxt_hwrm_tunnel_dst_port_free(bp, cmd);
  12786. }
  12787. static const struct udp_tunnel_nic_info bnxt_udp_tunnels = {
  12788. .set_port = bnxt_udp_tunnel_set_port,
  12789. .unset_port = bnxt_udp_tunnel_unset_port,
  12790. .flags = UDP_TUNNEL_NIC_INFO_MAY_SLEEP |
  12791. UDP_TUNNEL_NIC_INFO_OPEN_ONLY,
  12792. .tables = {
  12793. { .n_entries = 1, .tunnel_types = UDP_TUNNEL_TYPE_VXLAN, },
  12794. { .n_entries = 1, .tunnel_types = UDP_TUNNEL_TYPE_GENEVE, },
  12795. },
  12796. }, bnxt_udp_tunnels_p7 = {
  12797. .set_port = bnxt_udp_tunnel_set_port,
  12798. .unset_port = bnxt_udp_tunnel_unset_port,
  12799. .flags = UDP_TUNNEL_NIC_INFO_MAY_SLEEP |
  12800. UDP_TUNNEL_NIC_INFO_OPEN_ONLY,
  12801. .tables = {
  12802. { .n_entries = 1, .tunnel_types = UDP_TUNNEL_TYPE_VXLAN, },
  12803. { .n_entries = 1, .tunnel_types = UDP_TUNNEL_TYPE_GENEVE, },
  12804. { .n_entries = 1, .tunnel_types = UDP_TUNNEL_TYPE_VXLAN_GPE, },
  12805. },
  12806. };
  12807. static int bnxt_bridge_getlink(struct sk_buff *skb, u32 pid, u32 seq,
  12808. struct net_device *dev, u32 filter_mask,
  12809. int nlflags)
  12810. {
  12811. struct bnxt *bp = netdev_priv(dev);
  12812. return ndo_dflt_bridge_getlink(skb, pid, seq, dev, bp->br_mode, 0, 0,
  12813. nlflags, filter_mask, NULL);
  12814. }
  12815. static int bnxt_bridge_setlink(struct net_device *dev, struct nlmsghdr *nlh,
  12816. u16 flags, struct netlink_ext_ack *extack)
  12817. {
  12818. struct bnxt *bp = netdev_priv(dev);
  12819. struct nlattr *attr, *br_spec;
  12820. int rem, rc = 0;
  12821. if (bp->hwrm_spec_code < 0x10708 || !BNXT_SINGLE_PF(bp))
  12822. return -EOPNOTSUPP;
  12823. br_spec = nlmsg_find_attr(nlh, sizeof(struct ifinfomsg), IFLA_AF_SPEC);
  12824. if (!br_spec)
  12825. return -EINVAL;
  12826. nla_for_each_nested_type(attr, IFLA_BRIDGE_MODE, br_spec, rem) {
  12827. u16 mode;
  12828. mode = nla_get_u16(attr);
  12829. if (mode == bp->br_mode)
  12830. break;
  12831. rc = bnxt_hwrm_set_br_mode(bp, mode);
  12832. if (!rc)
  12833. bp->br_mode = mode;
  12834. break;
  12835. }
  12836. return rc;
  12837. }
  12838. int bnxt_get_port_parent_id(struct net_device *dev,
  12839. struct netdev_phys_item_id *ppid)
  12840. {
  12841. struct bnxt *bp = netdev_priv(dev);
  12842. if (bp->eswitch_mode != DEVLINK_ESWITCH_MODE_SWITCHDEV)
  12843. return -EOPNOTSUPP;
  12844. /* The PF and it's VF-reps only support the switchdev framework */
  12845. if (!BNXT_PF(bp) || !(bp->flags & BNXT_FLAG_DSN_VALID))
  12846. return -EOPNOTSUPP;
  12847. ppid->id_len = sizeof(bp->dsn);
  12848. memcpy(ppid->id, bp->dsn, ppid->id_len);
  12849. return 0;
  12850. }
  12851. static const struct net_device_ops bnxt_netdev_ops = {
  12852. .ndo_open = bnxt_open,
  12853. .ndo_start_xmit = bnxt_start_xmit,
  12854. .ndo_stop = bnxt_close,
  12855. .ndo_get_stats64 = bnxt_get_stats64,
  12856. .ndo_set_rx_mode = bnxt_set_rx_mode,
  12857. .ndo_eth_ioctl = bnxt_ioctl,
  12858. .ndo_validate_addr = eth_validate_addr,
  12859. .ndo_set_mac_address = bnxt_change_mac_addr,
  12860. .ndo_change_mtu = bnxt_change_mtu,
  12861. .ndo_fix_features = bnxt_fix_features,
  12862. .ndo_set_features = bnxt_set_features,
  12863. .ndo_features_check = bnxt_features_check,
  12864. .ndo_tx_timeout = bnxt_tx_timeout,
  12865. #ifdef CONFIG_BNXT_SRIOV
  12866. .ndo_get_vf_config = bnxt_get_vf_config,
  12867. .ndo_set_vf_mac = bnxt_set_vf_mac,
  12868. .ndo_set_vf_vlan = bnxt_set_vf_vlan,
  12869. .ndo_set_vf_rate = bnxt_set_vf_bw,
  12870. .ndo_set_vf_link_state = bnxt_set_vf_link_state,
  12871. .ndo_set_vf_spoofchk = bnxt_set_vf_spoofchk,
  12872. .ndo_set_vf_trust = bnxt_set_vf_trust,
  12873. #endif
  12874. .ndo_setup_tc = bnxt_setup_tc,
  12875. #ifdef CONFIG_RFS_ACCEL
  12876. .ndo_rx_flow_steer = bnxt_rx_flow_steer,
  12877. #endif
  12878. .ndo_bpf = bnxt_xdp,
  12879. .ndo_xdp_xmit = bnxt_xdp_xmit,
  12880. .ndo_bridge_getlink = bnxt_bridge_getlink,
  12881. .ndo_bridge_setlink = bnxt_bridge_setlink,
  12882. };
  12883. static void bnxt_get_queue_stats_rx(struct net_device *dev, int i,
  12884. struct netdev_queue_stats_rx *stats)
  12885. {
  12886. struct bnxt *bp = netdev_priv(dev);
  12887. struct bnxt_cp_ring_info *cpr;
  12888. u64 *sw;
  12889. if (!bp->bnapi)
  12890. return;
  12891. cpr = &bp->bnapi[i]->cp_ring;
  12892. sw = cpr->stats.sw_stats;
  12893. stats->packets = 0;
  12894. stats->packets += BNXT_GET_RING_STATS64(sw, rx_ucast_pkts);
  12895. stats->packets += BNXT_GET_RING_STATS64(sw, rx_mcast_pkts);
  12896. stats->packets += BNXT_GET_RING_STATS64(sw, rx_bcast_pkts);
  12897. stats->bytes = 0;
  12898. stats->bytes += BNXT_GET_RING_STATS64(sw, rx_ucast_bytes);
  12899. stats->bytes += BNXT_GET_RING_STATS64(sw, rx_mcast_bytes);
  12900. stats->bytes += BNXT_GET_RING_STATS64(sw, rx_bcast_bytes);
  12901. stats->alloc_fail = cpr->sw_stats->rx.rx_oom_discards;
  12902. }
  12903. static void bnxt_get_queue_stats_tx(struct net_device *dev, int i,
  12904. struct netdev_queue_stats_tx *stats)
  12905. {
  12906. struct bnxt *bp = netdev_priv(dev);
  12907. struct bnxt_napi *bnapi;
  12908. u64 *sw;
  12909. if (!bp->tx_ring)
  12910. return;
  12911. bnapi = bp->tx_ring[bp->tx_ring_map[i]].bnapi;
  12912. sw = bnapi->cp_ring.stats.sw_stats;
  12913. stats->packets = 0;
  12914. stats->packets += BNXT_GET_RING_STATS64(sw, tx_ucast_pkts);
  12915. stats->packets += BNXT_GET_RING_STATS64(sw, tx_mcast_pkts);
  12916. stats->packets += BNXT_GET_RING_STATS64(sw, tx_bcast_pkts);
  12917. stats->bytes = 0;
  12918. stats->bytes += BNXT_GET_RING_STATS64(sw, tx_ucast_bytes);
  12919. stats->bytes += BNXT_GET_RING_STATS64(sw, tx_mcast_bytes);
  12920. stats->bytes += BNXT_GET_RING_STATS64(sw, tx_bcast_bytes);
  12921. }
  12922. static void bnxt_get_base_stats(struct net_device *dev,
  12923. struct netdev_queue_stats_rx *rx,
  12924. struct netdev_queue_stats_tx *tx)
  12925. {
  12926. struct bnxt *bp = netdev_priv(dev);
  12927. rx->packets = bp->net_stats_prev.rx_packets;
  12928. rx->bytes = bp->net_stats_prev.rx_bytes;
  12929. rx->alloc_fail = bp->ring_err_stats_prev.rx_total_oom_discards;
  12930. tx->packets = bp->net_stats_prev.tx_packets;
  12931. tx->bytes = bp->net_stats_prev.tx_bytes;
  12932. }
  12933. static const struct netdev_stat_ops bnxt_stat_ops = {
  12934. .get_queue_stats_rx = bnxt_get_queue_stats_rx,
  12935. .get_queue_stats_tx = bnxt_get_queue_stats_tx,
  12936. .get_base_stats = bnxt_get_base_stats,
  12937. };
  12938. static int bnxt_alloc_rx_agg_bmap(struct bnxt *bp, struct bnxt_rx_ring_info *rxr)
  12939. {
  12940. u16 mem_size;
  12941. rxr->rx_agg_bmap_size = bp->rx_agg_ring_mask + 1;
  12942. mem_size = rxr->rx_agg_bmap_size / 8;
  12943. rxr->rx_agg_bmap = kzalloc(mem_size, GFP_KERNEL);
  12944. if (!rxr->rx_agg_bmap)
  12945. return -ENOMEM;
  12946. return 0;
  12947. }
  12948. static int bnxt_queue_mem_alloc(struct net_device *dev, void *qmem, int idx)
  12949. {
  12950. struct bnxt_rx_ring_info *rxr, *clone;
  12951. struct bnxt *bp = netdev_priv(dev);
  12952. struct bnxt_ring_struct *ring;
  12953. int rc;
  12954. if (!bp->rx_ring)
  12955. return -ENETDOWN;
  12956. rxr = &bp->rx_ring[idx];
  12957. clone = qmem;
  12958. memcpy(clone, rxr, sizeof(*rxr));
  12959. bnxt_init_rx_ring_struct(bp, clone);
  12960. bnxt_reset_rx_ring_struct(bp, clone);
  12961. clone->rx_prod = 0;
  12962. clone->rx_agg_prod = 0;
  12963. clone->rx_sw_agg_prod = 0;
  12964. clone->rx_next_cons = 0;
  12965. rc = bnxt_alloc_rx_page_pool(bp, clone, rxr->page_pool->p.nid);
  12966. if (rc)
  12967. return rc;
  12968. rc = xdp_rxq_info_reg(&clone->xdp_rxq, bp->dev, idx, 0);
  12969. if (rc < 0)
  12970. goto err_page_pool_destroy;
  12971. rc = xdp_rxq_info_reg_mem_model(&clone->xdp_rxq,
  12972. MEM_TYPE_PAGE_POOL,
  12973. clone->page_pool);
  12974. if (rc)
  12975. goto err_rxq_info_unreg;
  12976. ring = &clone->rx_ring_struct;
  12977. rc = bnxt_alloc_ring(bp, &ring->ring_mem);
  12978. if (rc)
  12979. goto err_free_rx_ring;
  12980. if (bp->flags & BNXT_FLAG_AGG_RINGS) {
  12981. ring = &clone->rx_agg_ring_struct;
  12982. rc = bnxt_alloc_ring(bp, &ring->ring_mem);
  12983. if (rc)
  12984. goto err_free_rx_agg_ring;
  12985. rc = bnxt_alloc_rx_agg_bmap(bp, clone);
  12986. if (rc)
  12987. goto err_free_rx_agg_ring;
  12988. }
  12989. if (bp->flags & BNXT_FLAG_TPA) {
  12990. rc = bnxt_alloc_one_tpa_info(bp, clone);
  12991. if (rc)
  12992. goto err_free_tpa_info;
  12993. }
  12994. bnxt_init_one_rx_ring_rxbd(bp, clone);
  12995. bnxt_init_one_rx_agg_ring_rxbd(bp, clone);
  12996. bnxt_alloc_one_rx_ring_skb(bp, clone, idx);
  12997. if (bp->flags & BNXT_FLAG_AGG_RINGS)
  12998. bnxt_alloc_one_rx_ring_page(bp, clone, idx);
  12999. if (bp->flags & BNXT_FLAG_TPA)
  13000. bnxt_alloc_one_tpa_info_data(bp, clone);
  13001. return 0;
  13002. err_free_tpa_info:
  13003. bnxt_free_one_tpa_info(bp, clone);
  13004. err_free_rx_agg_ring:
  13005. bnxt_free_ring(bp, &clone->rx_agg_ring_struct.ring_mem);
  13006. err_free_rx_ring:
  13007. bnxt_free_ring(bp, &clone->rx_ring_struct.ring_mem);
  13008. err_rxq_info_unreg:
  13009. xdp_rxq_info_unreg(&clone->xdp_rxq);
  13010. err_page_pool_destroy:
  13011. page_pool_destroy(clone->page_pool);
  13012. if (bnxt_separate_head_pool())
  13013. page_pool_destroy(clone->head_pool);
  13014. clone->page_pool = NULL;
  13015. clone->head_pool = NULL;
  13016. return rc;
  13017. }
  13018. static void bnxt_queue_mem_free(struct net_device *dev, void *qmem)
  13019. {
  13020. struct bnxt_rx_ring_info *rxr = qmem;
  13021. struct bnxt *bp = netdev_priv(dev);
  13022. struct bnxt_ring_struct *ring;
  13023. bnxt_free_one_rx_ring_skbs(bp, rxr);
  13024. bnxt_free_one_tpa_info(bp, rxr);
  13025. xdp_rxq_info_unreg(&rxr->xdp_rxq);
  13026. page_pool_destroy(rxr->page_pool);
  13027. if (bnxt_separate_head_pool())
  13028. page_pool_destroy(rxr->head_pool);
  13029. rxr->page_pool = NULL;
  13030. rxr->head_pool = NULL;
  13031. ring = &rxr->rx_ring_struct;
  13032. bnxt_free_ring(bp, &ring->ring_mem);
  13033. ring = &rxr->rx_agg_ring_struct;
  13034. bnxt_free_ring(bp, &ring->ring_mem);
  13035. kfree(rxr->rx_agg_bmap);
  13036. rxr->rx_agg_bmap = NULL;
  13037. }
  13038. static void bnxt_copy_rx_ring(struct bnxt *bp,
  13039. struct bnxt_rx_ring_info *dst,
  13040. struct bnxt_rx_ring_info *src)
  13041. {
  13042. struct bnxt_ring_mem_info *dst_rmem, *src_rmem;
  13043. struct bnxt_ring_struct *dst_ring, *src_ring;
  13044. int i;
  13045. dst_ring = &dst->rx_ring_struct;
  13046. dst_rmem = &dst_ring->ring_mem;
  13047. src_ring = &src->rx_ring_struct;
  13048. src_rmem = &src_ring->ring_mem;
  13049. WARN_ON(dst_rmem->nr_pages != src_rmem->nr_pages);
  13050. WARN_ON(dst_rmem->page_size != src_rmem->page_size);
  13051. WARN_ON(dst_rmem->flags != src_rmem->flags);
  13052. WARN_ON(dst_rmem->depth != src_rmem->depth);
  13053. WARN_ON(dst_rmem->vmem_size != src_rmem->vmem_size);
  13054. WARN_ON(dst_rmem->ctx_mem != src_rmem->ctx_mem);
  13055. dst_rmem->pg_tbl = src_rmem->pg_tbl;
  13056. dst_rmem->pg_tbl_map = src_rmem->pg_tbl_map;
  13057. *dst_rmem->vmem = *src_rmem->vmem;
  13058. for (i = 0; i < dst_rmem->nr_pages; i++) {
  13059. dst_rmem->pg_arr[i] = src_rmem->pg_arr[i];
  13060. dst_rmem->dma_arr[i] = src_rmem->dma_arr[i];
  13061. }
  13062. if (!(bp->flags & BNXT_FLAG_AGG_RINGS))
  13063. return;
  13064. dst_ring = &dst->rx_agg_ring_struct;
  13065. dst_rmem = &dst_ring->ring_mem;
  13066. src_ring = &src->rx_agg_ring_struct;
  13067. src_rmem = &src_ring->ring_mem;
  13068. WARN_ON(dst_rmem->nr_pages != src_rmem->nr_pages);
  13069. WARN_ON(dst_rmem->page_size != src_rmem->page_size);
  13070. WARN_ON(dst_rmem->flags != src_rmem->flags);
  13071. WARN_ON(dst_rmem->depth != src_rmem->depth);
  13072. WARN_ON(dst_rmem->vmem_size != src_rmem->vmem_size);
  13073. WARN_ON(dst_rmem->ctx_mem != src_rmem->ctx_mem);
  13074. WARN_ON(dst->rx_agg_bmap_size != src->rx_agg_bmap_size);
  13075. dst_rmem->pg_tbl = src_rmem->pg_tbl;
  13076. dst_rmem->pg_tbl_map = src_rmem->pg_tbl_map;
  13077. *dst_rmem->vmem = *src_rmem->vmem;
  13078. for (i = 0; i < dst_rmem->nr_pages; i++) {
  13079. dst_rmem->pg_arr[i] = src_rmem->pg_arr[i];
  13080. dst_rmem->dma_arr[i] = src_rmem->dma_arr[i];
  13081. }
  13082. dst->rx_agg_bmap = src->rx_agg_bmap;
  13083. }
  13084. static int bnxt_queue_start(struct net_device *dev, void *qmem, int idx)
  13085. {
  13086. struct bnxt *bp = netdev_priv(dev);
  13087. struct bnxt_rx_ring_info *rxr, *clone;
  13088. struct bnxt_cp_ring_info *cpr;
  13089. struct bnxt_vnic_info *vnic;
  13090. int i, rc;
  13091. u16 mru;
  13092. rxr = &bp->rx_ring[idx];
  13093. clone = qmem;
  13094. rxr->rx_prod = clone->rx_prod;
  13095. rxr->rx_agg_prod = clone->rx_agg_prod;
  13096. rxr->rx_sw_agg_prod = clone->rx_sw_agg_prod;
  13097. rxr->rx_next_cons = clone->rx_next_cons;
  13098. rxr->rx_tpa = clone->rx_tpa;
  13099. rxr->rx_tpa_idx_map = clone->rx_tpa_idx_map;
  13100. rxr->page_pool = clone->page_pool;
  13101. rxr->head_pool = clone->head_pool;
  13102. rxr->xdp_rxq = clone->xdp_rxq;
  13103. bnxt_copy_rx_ring(bp, rxr, clone);
  13104. rc = bnxt_hwrm_rx_ring_alloc(bp, rxr);
  13105. if (rc)
  13106. return rc;
  13107. rc = bnxt_hwrm_rx_agg_ring_alloc(bp, rxr);
  13108. if (rc)
  13109. goto err_free_hwrm_rx_ring;
  13110. bnxt_db_write(bp, &rxr->rx_db, rxr->rx_prod);
  13111. if (bp->flags & BNXT_FLAG_AGG_RINGS)
  13112. bnxt_db_write(bp, &rxr->rx_agg_db, rxr->rx_agg_prod);
  13113. cpr = &rxr->bnapi->cp_ring;
  13114. cpr->sw_stats->rx.rx_resets++;
  13115. mru = bp->dev->mtu + ETH_HLEN + VLAN_HLEN;
  13116. for (i = 0; i < bp->nr_vnics; i++) {
  13117. vnic = &bp->vnic_info[i];
  13118. rc = bnxt_set_vnic_mru_p5(bp, vnic, mru, idx);
  13119. if (rc)
  13120. return rc;
  13121. }
  13122. return bnxt_set_rss_ctx_vnic_mru(bp, mru, idx);
  13123. err_free_hwrm_rx_ring:
  13124. bnxt_hwrm_rx_ring_free(bp, rxr, false);
  13125. return rc;
  13126. }
  13127. static int bnxt_queue_stop(struct net_device *dev, void *qmem, int idx)
  13128. {
  13129. struct bnxt *bp = netdev_priv(dev);
  13130. struct bnxt_rx_ring_info *rxr;
  13131. struct bnxt_vnic_info *vnic;
  13132. int i;
  13133. for (i = 0; i < bp->nr_vnics; i++) {
  13134. vnic = &bp->vnic_info[i];
  13135. bnxt_set_vnic_mru_p5(bp, vnic, 0, idx);
  13136. }
  13137. bnxt_set_rss_ctx_vnic_mru(bp, 0, idx);
  13138. /* Make sure NAPI sees that the VNIC is disabled */
  13139. synchronize_net();
  13140. rxr = &bp->rx_ring[idx];
  13141. cancel_work_sync(&rxr->bnapi->cp_ring.dim.work);
  13142. bnxt_hwrm_rx_ring_free(bp, rxr, false);
  13143. bnxt_hwrm_rx_agg_ring_free(bp, rxr, false);
  13144. rxr->rx_next_cons = 0;
  13145. page_pool_disable_direct_recycling(rxr->page_pool);
  13146. if (bnxt_separate_head_pool())
  13147. page_pool_disable_direct_recycling(rxr->head_pool);
  13148. memcpy(qmem, rxr, sizeof(*rxr));
  13149. bnxt_init_rx_ring_struct(bp, qmem);
  13150. return 0;
  13151. }
  13152. static const struct netdev_queue_mgmt_ops bnxt_queue_mgmt_ops = {
  13153. .ndo_queue_mem_size = sizeof(struct bnxt_rx_ring_info),
  13154. .ndo_queue_mem_alloc = bnxt_queue_mem_alloc,
  13155. .ndo_queue_mem_free = bnxt_queue_mem_free,
  13156. .ndo_queue_start = bnxt_queue_start,
  13157. .ndo_queue_stop = bnxt_queue_stop,
  13158. };
  13159. static void bnxt_remove_one(struct pci_dev *pdev)
  13160. {
  13161. struct net_device *dev = pci_get_drvdata(pdev);
  13162. struct bnxt *bp = netdev_priv(dev);
  13163. if (BNXT_PF(bp))
  13164. bnxt_sriov_disable(bp);
  13165. bnxt_rdma_aux_device_del(bp);
  13166. unregister_netdev(dev);
  13167. bnxt_ptp_clear(bp);
  13168. bnxt_rdma_aux_device_uninit(bp);
  13169. bnxt_free_l2_filters(bp, true);
  13170. bnxt_free_ntp_fltrs(bp, true);
  13171. WARN_ON(bp->num_rss_ctx);
  13172. clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
  13173. /* Flush any pending tasks */
  13174. cancel_work_sync(&bp->sp_task);
  13175. cancel_delayed_work_sync(&bp->fw_reset_task);
  13176. bp->sp_event = 0;
  13177. bnxt_dl_fw_reporters_destroy(bp);
  13178. bnxt_dl_unregister(bp);
  13179. bnxt_shutdown_tc(bp);
  13180. bnxt_clear_int_mode(bp);
  13181. bnxt_hwrm_func_drv_unrgtr(bp);
  13182. bnxt_free_hwrm_resources(bp);
  13183. bnxt_hwmon_uninit(bp);
  13184. bnxt_ethtool_free(bp);
  13185. bnxt_dcb_free(bp);
  13186. kfree(bp->ptp_cfg);
  13187. bp->ptp_cfg = NULL;
  13188. kfree(bp->fw_health);
  13189. bp->fw_health = NULL;
  13190. bnxt_cleanup_pci(bp);
  13191. bnxt_free_ctx_mem(bp);
  13192. bnxt_free_crash_dump_mem(bp);
  13193. kfree(bp->rss_indir_tbl);
  13194. bp->rss_indir_tbl = NULL;
  13195. bnxt_free_port_stats(bp);
  13196. free_netdev(dev);
  13197. }
  13198. static int bnxt_probe_phy(struct bnxt *bp, bool fw_dflt)
  13199. {
  13200. int rc = 0;
  13201. struct bnxt_link_info *link_info = &bp->link_info;
  13202. bp->phy_flags = 0;
  13203. rc = bnxt_hwrm_phy_qcaps(bp);
  13204. if (rc) {
  13205. netdev_err(bp->dev, "Probe phy can't get phy capabilities (rc: %x)\n",
  13206. rc);
  13207. return rc;
  13208. }
  13209. if (bp->phy_flags & BNXT_PHY_FL_NO_FCS)
  13210. bp->dev->priv_flags |= IFF_SUPP_NOFCS;
  13211. else
  13212. bp->dev->priv_flags &= ~IFF_SUPP_NOFCS;
  13213. if (!fw_dflt)
  13214. return 0;
  13215. mutex_lock(&bp->link_lock);
  13216. rc = bnxt_update_link(bp, false);
  13217. if (rc) {
  13218. mutex_unlock(&bp->link_lock);
  13219. netdev_err(bp->dev, "Probe phy can't update link (rc: %x)\n",
  13220. rc);
  13221. return rc;
  13222. }
  13223. /* Older firmware does not have supported_auto_speeds, so assume
  13224. * that all supported speeds can be autonegotiated.
  13225. */
  13226. if (link_info->auto_link_speeds && !link_info->support_auto_speeds)
  13227. link_info->support_auto_speeds = link_info->support_speeds;
  13228. bnxt_init_ethtool_link_settings(bp);
  13229. mutex_unlock(&bp->link_lock);
  13230. return 0;
  13231. }
  13232. static int bnxt_get_max_irq(struct pci_dev *pdev)
  13233. {
  13234. u16 ctrl;
  13235. if (!pdev->msix_cap)
  13236. return 1;
  13237. pci_read_config_word(pdev, pdev->msix_cap + PCI_MSIX_FLAGS, &ctrl);
  13238. return (ctrl & PCI_MSIX_FLAGS_QSIZE) + 1;
  13239. }
  13240. static void _bnxt_get_max_rings(struct bnxt *bp, int *max_rx, int *max_tx,
  13241. int *max_cp)
  13242. {
  13243. struct bnxt_hw_resc *hw_resc = &bp->hw_resc;
  13244. int max_ring_grps = 0, max_irq;
  13245. *max_tx = hw_resc->max_tx_rings;
  13246. *max_rx = hw_resc->max_rx_rings;
  13247. *max_cp = bnxt_get_max_func_cp_rings_for_en(bp);
  13248. max_irq = min_t(int, bnxt_get_max_func_irqs(bp) -
  13249. bnxt_get_ulp_msix_num_in_use(bp),
  13250. hw_resc->max_stat_ctxs -
  13251. bnxt_get_ulp_stat_ctxs_in_use(bp));
  13252. if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS))
  13253. *max_cp = min_t(int, *max_cp, max_irq);
  13254. max_ring_grps = hw_resc->max_hw_ring_grps;
  13255. if (BNXT_CHIP_TYPE_NITRO_A0(bp) && BNXT_PF(bp)) {
  13256. *max_cp -= 1;
  13257. *max_rx -= 2;
  13258. }
  13259. if (bp->flags & BNXT_FLAG_AGG_RINGS)
  13260. *max_rx >>= 1;
  13261. if (bp->flags & BNXT_FLAG_CHIP_P5_PLUS) {
  13262. int rc;
  13263. rc = __bnxt_trim_rings(bp, max_rx, max_tx, *max_cp, false);
  13264. if (rc) {
  13265. *max_rx = 0;
  13266. *max_tx = 0;
  13267. }
  13268. /* On P5 chips, max_cp output param should be available NQs */
  13269. *max_cp = max_irq;
  13270. }
  13271. *max_rx = min_t(int, *max_rx, max_ring_grps);
  13272. }
  13273. int bnxt_get_max_rings(struct bnxt *bp, int *max_rx, int *max_tx, bool shared)
  13274. {
  13275. int rx, tx, cp;
  13276. _bnxt_get_max_rings(bp, &rx, &tx, &cp);
  13277. *max_rx = rx;
  13278. *max_tx = tx;
  13279. if (!rx || !tx || !cp)
  13280. return -ENOMEM;
  13281. return bnxt_trim_rings(bp, max_rx, max_tx, cp, shared);
  13282. }
  13283. static int bnxt_get_dflt_rings(struct bnxt *bp, int *max_rx, int *max_tx,
  13284. bool shared)
  13285. {
  13286. int rc;
  13287. rc = bnxt_get_max_rings(bp, max_rx, max_tx, shared);
  13288. if (rc && (bp->flags & BNXT_FLAG_AGG_RINGS)) {
  13289. /* Not enough rings, try disabling agg rings. */
  13290. bp->flags &= ~BNXT_FLAG_AGG_RINGS;
  13291. rc = bnxt_get_max_rings(bp, max_rx, max_tx, shared);
  13292. if (rc) {
  13293. /* set BNXT_FLAG_AGG_RINGS back for consistency */
  13294. bp->flags |= BNXT_FLAG_AGG_RINGS;
  13295. return rc;
  13296. }
  13297. bp->flags |= BNXT_FLAG_NO_AGG_RINGS;
  13298. bp->dev->hw_features &= ~(NETIF_F_LRO | NETIF_F_GRO_HW);
  13299. bp->dev->features &= ~(NETIF_F_LRO | NETIF_F_GRO_HW);
  13300. bnxt_set_ring_params(bp);
  13301. }
  13302. if (bp->flags & BNXT_FLAG_ROCE_CAP) {
  13303. int max_cp, max_stat, max_irq;
  13304. /* Reserve minimum resources for RoCE */
  13305. max_cp = bnxt_get_max_func_cp_rings(bp);
  13306. max_stat = bnxt_get_max_func_stat_ctxs(bp);
  13307. max_irq = bnxt_get_max_func_irqs(bp);
  13308. if (max_cp <= BNXT_MIN_ROCE_CP_RINGS ||
  13309. max_irq <= BNXT_MIN_ROCE_CP_RINGS ||
  13310. max_stat <= BNXT_MIN_ROCE_STAT_CTXS)
  13311. return 0;
  13312. max_cp -= BNXT_MIN_ROCE_CP_RINGS;
  13313. max_irq -= BNXT_MIN_ROCE_CP_RINGS;
  13314. max_stat -= BNXT_MIN_ROCE_STAT_CTXS;
  13315. max_cp = min_t(int, max_cp, max_irq);
  13316. max_cp = min_t(int, max_cp, max_stat);
  13317. rc = bnxt_trim_rings(bp, max_rx, max_tx, max_cp, shared);
  13318. if (rc)
  13319. rc = 0;
  13320. }
  13321. return rc;
  13322. }
  13323. /* In initial default shared ring setting, each shared ring must have a
  13324. * RX/TX ring pair.
  13325. */
  13326. static void bnxt_trim_dflt_sh_rings(struct bnxt *bp)
  13327. {
  13328. bp->cp_nr_rings = min_t(int, bp->tx_nr_rings_per_tc, bp->rx_nr_rings);
  13329. bp->rx_nr_rings = bp->cp_nr_rings;
  13330. bp->tx_nr_rings_per_tc = bp->cp_nr_rings;
  13331. bp->tx_nr_rings = bnxt_tx_nr_rings(bp);
  13332. }
  13333. static int bnxt_set_dflt_rings(struct bnxt *bp, bool sh)
  13334. {
  13335. int dflt_rings, max_rx_rings, max_tx_rings, rc;
  13336. int avail_msix;
  13337. if (!bnxt_can_reserve_rings(bp))
  13338. return 0;
  13339. if (sh)
  13340. bp->flags |= BNXT_FLAG_SHARED_RINGS;
  13341. dflt_rings = is_kdump_kernel() ? 1 : netif_get_num_default_rss_queues();
  13342. /* Reduce default rings on multi-port cards so that total default
  13343. * rings do not exceed CPU count.
  13344. */
  13345. if (bp->port_count > 1) {
  13346. int max_rings =
  13347. max_t(int, num_online_cpus() / bp->port_count, 1);
  13348. dflt_rings = min_t(int, dflt_rings, max_rings);
  13349. }
  13350. rc = bnxt_get_dflt_rings(bp, &max_rx_rings, &max_tx_rings, sh);
  13351. if (rc)
  13352. return rc;
  13353. bp->rx_nr_rings = min_t(int, dflt_rings, max_rx_rings);
  13354. bp->tx_nr_rings_per_tc = min_t(int, dflt_rings, max_tx_rings);
  13355. if (sh)
  13356. bnxt_trim_dflt_sh_rings(bp);
  13357. else
  13358. bp->cp_nr_rings = bp->tx_nr_rings_per_tc + bp->rx_nr_rings;
  13359. bp->tx_nr_rings = bnxt_tx_nr_rings(bp);
  13360. avail_msix = bnxt_get_max_func_irqs(bp) - bp->cp_nr_rings;
  13361. if (avail_msix >= BNXT_MIN_ROCE_CP_RINGS) {
  13362. int ulp_num_msix = min(avail_msix, bp->ulp_num_msix_want);
  13363. bnxt_set_ulp_msix_num(bp, ulp_num_msix);
  13364. bnxt_set_dflt_ulp_stat_ctxs(bp);
  13365. }
  13366. rc = __bnxt_reserve_rings(bp);
  13367. if (rc && rc != -ENODEV)
  13368. netdev_warn(bp->dev, "Unable to reserve tx rings\n");
  13369. bp->tx_nr_rings_per_tc = bnxt_tx_nr_rings_per_tc(bp);
  13370. if (sh)
  13371. bnxt_trim_dflt_sh_rings(bp);
  13372. /* Rings may have been trimmed, re-reserve the trimmed rings. */
  13373. if (bnxt_need_reserve_rings(bp)) {
  13374. rc = __bnxt_reserve_rings(bp);
  13375. if (rc && rc != -ENODEV)
  13376. netdev_warn(bp->dev, "2nd rings reservation failed.\n");
  13377. bp->tx_nr_rings_per_tc = bnxt_tx_nr_rings_per_tc(bp);
  13378. }
  13379. if (BNXT_CHIP_TYPE_NITRO_A0(bp)) {
  13380. bp->rx_nr_rings++;
  13381. bp->cp_nr_rings++;
  13382. }
  13383. if (rc) {
  13384. bp->tx_nr_rings = 0;
  13385. bp->rx_nr_rings = 0;
  13386. }
  13387. return rc;
  13388. }
  13389. static int bnxt_init_dflt_ring_mode(struct bnxt *bp)
  13390. {
  13391. int rc;
  13392. if (bp->tx_nr_rings)
  13393. return 0;
  13394. bnxt_ulp_irq_stop(bp);
  13395. bnxt_clear_int_mode(bp);
  13396. rc = bnxt_set_dflt_rings(bp, true);
  13397. if (rc) {
  13398. if (BNXT_VF(bp) && rc == -ENODEV)
  13399. netdev_err(bp->dev, "Cannot configure VF rings while PF is unavailable.\n");
  13400. else
  13401. netdev_err(bp->dev, "Not enough rings available.\n");
  13402. goto init_dflt_ring_err;
  13403. }
  13404. rc = bnxt_init_int_mode(bp);
  13405. if (rc)
  13406. goto init_dflt_ring_err;
  13407. bp->tx_nr_rings_per_tc = bnxt_tx_nr_rings_per_tc(bp);
  13408. bnxt_set_dflt_rfs(bp);
  13409. init_dflt_ring_err:
  13410. bnxt_ulp_irq_restart(bp, rc);
  13411. return rc;
  13412. }
  13413. int bnxt_restore_pf_fw_resources(struct bnxt *bp)
  13414. {
  13415. int rc;
  13416. ASSERT_RTNL();
  13417. bnxt_hwrm_func_qcaps(bp);
  13418. if (netif_running(bp->dev))
  13419. __bnxt_close_nic(bp, true, false);
  13420. bnxt_ulp_irq_stop(bp);
  13421. bnxt_clear_int_mode(bp);
  13422. rc = bnxt_init_int_mode(bp);
  13423. bnxt_ulp_irq_restart(bp, rc);
  13424. if (netif_running(bp->dev)) {
  13425. if (rc)
  13426. dev_close(bp->dev);
  13427. else
  13428. rc = bnxt_open_nic(bp, true, false);
  13429. }
  13430. return rc;
  13431. }
  13432. static int bnxt_init_mac_addr(struct bnxt *bp)
  13433. {
  13434. int rc = 0;
  13435. if (BNXT_PF(bp)) {
  13436. eth_hw_addr_set(bp->dev, bp->pf.mac_addr);
  13437. } else {
  13438. #ifdef CONFIG_BNXT_SRIOV
  13439. struct bnxt_vf_info *vf = &bp->vf;
  13440. bool strict_approval = true;
  13441. if (is_valid_ether_addr(vf->mac_addr)) {
  13442. /* overwrite netdev dev_addr with admin VF MAC */
  13443. eth_hw_addr_set(bp->dev, vf->mac_addr);
  13444. /* Older PF driver or firmware may not approve this
  13445. * correctly.
  13446. */
  13447. strict_approval = false;
  13448. } else {
  13449. eth_hw_addr_random(bp->dev);
  13450. }
  13451. rc = bnxt_approve_mac(bp, bp->dev->dev_addr, strict_approval);
  13452. #endif
  13453. }
  13454. return rc;
  13455. }
  13456. static void bnxt_vpd_read_info(struct bnxt *bp)
  13457. {
  13458. struct pci_dev *pdev = bp->pdev;
  13459. unsigned int vpd_size, kw_len;
  13460. int pos, size;
  13461. u8 *vpd_data;
  13462. vpd_data = pci_vpd_alloc(pdev, &vpd_size);
  13463. if (IS_ERR(vpd_data)) {
  13464. pci_warn(pdev, "Unable to read VPD\n");
  13465. return;
  13466. }
  13467. pos = pci_vpd_find_ro_info_keyword(vpd_data, vpd_size,
  13468. PCI_VPD_RO_KEYWORD_PARTNO, &kw_len);
  13469. if (pos < 0)
  13470. goto read_sn;
  13471. size = min_t(int, kw_len, BNXT_VPD_FLD_LEN - 1);
  13472. memcpy(bp->board_partno, &vpd_data[pos], size);
  13473. read_sn:
  13474. pos = pci_vpd_find_ro_info_keyword(vpd_data, vpd_size,
  13475. PCI_VPD_RO_KEYWORD_SERIALNO,
  13476. &kw_len);
  13477. if (pos < 0)
  13478. goto exit;
  13479. size = min_t(int, kw_len, BNXT_VPD_FLD_LEN - 1);
  13480. memcpy(bp->board_serialno, &vpd_data[pos], size);
  13481. exit:
  13482. kfree(vpd_data);
  13483. }
  13484. static int bnxt_pcie_dsn_get(struct bnxt *bp, u8 dsn[])
  13485. {
  13486. struct pci_dev *pdev = bp->pdev;
  13487. u64 qword;
  13488. qword = pci_get_dsn(pdev);
  13489. if (!qword) {
  13490. netdev_info(bp->dev, "Unable to read adapter's DSN\n");
  13491. return -EOPNOTSUPP;
  13492. }
  13493. put_unaligned_le64(qword, dsn);
  13494. bp->flags |= BNXT_FLAG_DSN_VALID;
  13495. return 0;
  13496. }
  13497. static int bnxt_map_db_bar(struct bnxt *bp)
  13498. {
  13499. if (!bp->db_size)
  13500. return -ENODEV;
  13501. bp->bar1 = pci_iomap(bp->pdev, 2, bp->db_size);
  13502. if (!bp->bar1)
  13503. return -ENOMEM;
  13504. return 0;
  13505. }
  13506. void bnxt_print_device_info(struct bnxt *bp)
  13507. {
  13508. netdev_info(bp->dev, "%s found at mem %lx, node addr %pM\n",
  13509. board_info[bp->board_idx].name,
  13510. (long)pci_resource_start(bp->pdev, 0), bp->dev->dev_addr);
  13511. pcie_print_link_status(bp->pdev);
  13512. }
  13513. static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
  13514. {
  13515. struct bnxt_hw_resc *hw_resc;
  13516. struct net_device *dev;
  13517. struct bnxt *bp;
  13518. int rc, max_irqs;
  13519. if (pci_is_bridge(pdev))
  13520. return -ENODEV;
  13521. if (!pdev->msix_cap) {
  13522. dev_err(&pdev->dev, "MSIX capability not found, aborting\n");
  13523. return -ENODEV;
  13524. }
  13525. /* Clear any pending DMA transactions from crash kernel
  13526. * while loading driver in capture kernel.
  13527. */
  13528. if (is_kdump_kernel()) {
  13529. pci_clear_master(pdev);
  13530. pcie_flr(pdev);
  13531. }
  13532. max_irqs = bnxt_get_max_irq(pdev);
  13533. dev = alloc_etherdev_mqs(sizeof(*bp), max_irqs * BNXT_MAX_QUEUE,
  13534. max_irqs);
  13535. if (!dev)
  13536. return -ENOMEM;
  13537. bp = netdev_priv(dev);
  13538. bp->board_idx = ent->driver_data;
  13539. bp->msg_enable = BNXT_DEF_MSG_ENABLE;
  13540. bnxt_set_max_func_irqs(bp, max_irqs);
  13541. if (bnxt_vf_pciid(bp->board_idx))
  13542. bp->flags |= BNXT_FLAG_VF;
  13543. /* No devlink port registration in case of a VF */
  13544. if (BNXT_PF(bp))
  13545. SET_NETDEV_DEVLINK_PORT(dev, &bp->dl_port);
  13546. rc = bnxt_init_board(pdev, dev);
  13547. if (rc < 0)
  13548. goto init_err_free;
  13549. dev->netdev_ops = &bnxt_netdev_ops;
  13550. dev->stat_ops = &bnxt_stat_ops;
  13551. dev->watchdog_timeo = BNXT_TX_TIMEOUT;
  13552. dev->ethtool_ops = &bnxt_ethtool_ops;
  13553. pci_set_drvdata(pdev, dev);
  13554. rc = bnxt_alloc_hwrm_resources(bp);
  13555. if (rc)
  13556. goto init_err_pci_clean;
  13557. mutex_init(&bp->hwrm_cmd_lock);
  13558. mutex_init(&bp->link_lock);
  13559. rc = bnxt_fw_init_one_p1(bp);
  13560. if (rc)
  13561. goto init_err_pci_clean;
  13562. if (BNXT_PF(bp))
  13563. bnxt_vpd_read_info(bp);
  13564. if (BNXT_CHIP_P5_PLUS(bp)) {
  13565. bp->flags |= BNXT_FLAG_CHIP_P5_PLUS;
  13566. if (BNXT_CHIP_P7(bp))
  13567. bp->flags |= BNXT_FLAG_CHIP_P7;
  13568. }
  13569. rc = bnxt_alloc_rss_indir_tbl(bp);
  13570. if (rc)
  13571. goto init_err_pci_clean;
  13572. rc = bnxt_fw_init_one_p2(bp);
  13573. if (rc)
  13574. goto init_err_pci_clean;
  13575. rc = bnxt_map_db_bar(bp);
  13576. if (rc) {
  13577. dev_err(&pdev->dev, "Cannot map doorbell BAR rc = %d, aborting\n",
  13578. rc);
  13579. goto init_err_pci_clean;
  13580. }
  13581. dev->hw_features = NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_SG |
  13582. NETIF_F_TSO | NETIF_F_TSO6 |
  13583. NETIF_F_GSO_UDP_TUNNEL | NETIF_F_GSO_GRE |
  13584. NETIF_F_GSO_IPXIP4 |
  13585. NETIF_F_GSO_UDP_TUNNEL_CSUM | NETIF_F_GSO_GRE_CSUM |
  13586. NETIF_F_GSO_PARTIAL | NETIF_F_RXHASH |
  13587. NETIF_F_RXCSUM | NETIF_F_GRO;
  13588. if (bp->flags & BNXT_FLAG_UDP_GSO_CAP)
  13589. dev->hw_features |= NETIF_F_GSO_UDP_L4;
  13590. if (BNXT_SUPPORTS_TPA(bp))
  13591. dev->hw_features |= NETIF_F_LRO;
  13592. dev->hw_enc_features =
  13593. NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_SG |
  13594. NETIF_F_TSO | NETIF_F_TSO6 |
  13595. NETIF_F_GSO_UDP_TUNNEL | NETIF_F_GSO_GRE |
  13596. NETIF_F_GSO_UDP_TUNNEL_CSUM | NETIF_F_GSO_GRE_CSUM |
  13597. NETIF_F_GSO_IPXIP4 | NETIF_F_GSO_PARTIAL;
  13598. if (bp->flags & BNXT_FLAG_UDP_GSO_CAP)
  13599. dev->hw_enc_features |= NETIF_F_GSO_UDP_L4;
  13600. if (bp->flags & BNXT_FLAG_CHIP_P7)
  13601. dev->udp_tunnel_nic_info = &bnxt_udp_tunnels_p7;
  13602. else
  13603. dev->udp_tunnel_nic_info = &bnxt_udp_tunnels;
  13604. dev->gso_partial_features = NETIF_F_GSO_UDP_TUNNEL_CSUM |
  13605. NETIF_F_GSO_GRE_CSUM;
  13606. dev->vlan_features = dev->hw_features | NETIF_F_HIGHDMA;
  13607. if (bp->fw_cap & BNXT_FW_CAP_VLAN_RX_STRIP)
  13608. dev->hw_features |= BNXT_HW_FEATURE_VLAN_ALL_RX;
  13609. if (bp->fw_cap & BNXT_FW_CAP_VLAN_TX_INSERT)
  13610. dev->hw_features |= BNXT_HW_FEATURE_VLAN_ALL_TX;
  13611. if (BNXT_SUPPORTS_TPA(bp))
  13612. dev->hw_features |= NETIF_F_GRO_HW;
  13613. dev->features |= dev->hw_features | NETIF_F_HIGHDMA;
  13614. if (dev->features & NETIF_F_GRO_HW)
  13615. dev->features &= ~NETIF_F_LRO;
  13616. dev->priv_flags |= IFF_UNICAST_FLT;
  13617. netif_set_tso_max_size(dev, GSO_MAX_SIZE);
  13618. if (bp->tso_max_segs)
  13619. netif_set_tso_max_segs(dev, bp->tso_max_segs);
  13620. dev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
  13621. NETDEV_XDP_ACT_RX_SG;
  13622. #ifdef CONFIG_BNXT_SRIOV
  13623. init_waitqueue_head(&bp->sriov_cfg_wait);
  13624. #endif
  13625. if (BNXT_SUPPORTS_TPA(bp)) {
  13626. bp->gro_func = bnxt_gro_func_5730x;
  13627. if (BNXT_CHIP_P4(bp))
  13628. bp->gro_func = bnxt_gro_func_5731x;
  13629. else if (BNXT_CHIP_P5_PLUS(bp))
  13630. bp->gro_func = bnxt_gro_func_5750x;
  13631. }
  13632. if (!BNXT_CHIP_P4_PLUS(bp))
  13633. bp->flags |= BNXT_FLAG_DOUBLE_DB;
  13634. rc = bnxt_init_mac_addr(bp);
  13635. if (rc) {
  13636. dev_err(&pdev->dev, "Unable to initialize mac address.\n");
  13637. rc = -EADDRNOTAVAIL;
  13638. goto init_err_pci_clean;
  13639. }
  13640. if (BNXT_PF(bp)) {
  13641. /* Read the adapter's DSN to use as the eswitch switch_id */
  13642. rc = bnxt_pcie_dsn_get(bp, bp->dsn);
  13643. }
  13644. /* MTU range: 60 - FW defined max */
  13645. dev->min_mtu = ETH_ZLEN;
  13646. dev->max_mtu = bp->max_mtu;
  13647. rc = bnxt_probe_phy(bp, true);
  13648. if (rc)
  13649. goto init_err_pci_clean;
  13650. hw_resc = &bp->hw_resc;
  13651. bp->max_fltr = hw_resc->max_rx_em_flows + hw_resc->max_rx_wm_flows +
  13652. BNXT_L2_FLTR_MAX_FLTR;
  13653. /* Older firmware may not report these filters properly */
  13654. if (bp->max_fltr < BNXT_MAX_FLTR)
  13655. bp->max_fltr = BNXT_MAX_FLTR;
  13656. bnxt_init_l2_fltr_tbl(bp);
  13657. __bnxt_set_rx_skb_mode(bp, false);
  13658. bnxt_set_tpa_flags(bp);
  13659. bnxt_set_ring_params(bp);
  13660. bnxt_rdma_aux_device_init(bp);
  13661. rc = bnxt_set_dflt_rings(bp, true);
  13662. if (rc) {
  13663. if (BNXT_VF(bp) && rc == -ENODEV) {
  13664. netdev_err(bp->dev, "Cannot configure VF rings while PF is unavailable.\n");
  13665. } else {
  13666. netdev_err(bp->dev, "Not enough rings available.\n");
  13667. rc = -ENOMEM;
  13668. }
  13669. goto init_err_pci_clean;
  13670. }
  13671. bnxt_fw_init_one_p3(bp);
  13672. bnxt_init_dflt_coal(bp);
  13673. if (dev->hw_features & BNXT_HW_FEATURE_VLAN_ALL_RX)
  13674. bp->flags |= BNXT_FLAG_STRIP_VLAN;
  13675. rc = bnxt_init_int_mode(bp);
  13676. if (rc)
  13677. goto init_err_pci_clean;
  13678. /* No TC has been set yet and rings may have been trimmed due to
  13679. * limited MSIX, so we re-initialize the TX rings per TC.
  13680. */
  13681. bp->tx_nr_rings_per_tc = bp->tx_nr_rings;
  13682. if (BNXT_PF(bp)) {
  13683. if (!bnxt_pf_wq) {
  13684. bnxt_pf_wq =
  13685. create_singlethread_workqueue("bnxt_pf_wq");
  13686. if (!bnxt_pf_wq) {
  13687. dev_err(&pdev->dev, "Unable to create workqueue.\n");
  13688. rc = -ENOMEM;
  13689. goto init_err_pci_clean;
  13690. }
  13691. }
  13692. rc = bnxt_init_tc(bp);
  13693. if (rc)
  13694. netdev_err(dev, "Failed to initialize TC flower offload, err = %d.\n",
  13695. rc);
  13696. }
  13697. bnxt_inv_fw_health_reg(bp);
  13698. rc = bnxt_dl_register(bp);
  13699. if (rc)
  13700. goto init_err_dl;
  13701. INIT_LIST_HEAD(&bp->usr_fltr_list);
  13702. if (BNXT_SUPPORTS_NTUPLE_VNIC(bp))
  13703. bp->rss_cap |= BNXT_RSS_CAP_MULTI_RSS_CTX;
  13704. if (BNXT_SUPPORTS_QUEUE_API(bp))
  13705. dev->queue_mgmt_ops = &bnxt_queue_mgmt_ops;
  13706. rc = register_netdev(dev);
  13707. if (rc)
  13708. goto init_err_cleanup;
  13709. bnxt_dl_fw_reporters_create(bp);
  13710. bnxt_rdma_aux_device_add(bp);
  13711. bnxt_print_device_info(bp);
  13712. pci_save_state(pdev);
  13713. return 0;
  13714. init_err_cleanup:
  13715. bnxt_rdma_aux_device_uninit(bp);
  13716. bnxt_dl_unregister(bp);
  13717. init_err_dl:
  13718. bnxt_shutdown_tc(bp);
  13719. bnxt_clear_int_mode(bp);
  13720. init_err_pci_clean:
  13721. bnxt_hwrm_func_drv_unrgtr(bp);
  13722. bnxt_free_hwrm_resources(bp);
  13723. bnxt_hwmon_uninit(bp);
  13724. bnxt_ethtool_free(bp);
  13725. bnxt_ptp_clear(bp);
  13726. kfree(bp->ptp_cfg);
  13727. bp->ptp_cfg = NULL;
  13728. kfree(bp->fw_health);
  13729. bp->fw_health = NULL;
  13730. bnxt_cleanup_pci(bp);
  13731. bnxt_free_ctx_mem(bp);
  13732. bnxt_free_crash_dump_mem(bp);
  13733. kfree(bp->rss_indir_tbl);
  13734. bp->rss_indir_tbl = NULL;
  13735. init_err_free:
  13736. free_netdev(dev);
  13737. return rc;
  13738. }
  13739. static void bnxt_shutdown(struct pci_dev *pdev)
  13740. {
  13741. struct net_device *dev = pci_get_drvdata(pdev);
  13742. struct bnxt *bp;
  13743. if (!dev)
  13744. return;
  13745. rtnl_lock();
  13746. bp = netdev_priv(dev);
  13747. if (!bp)
  13748. goto shutdown_exit;
  13749. if (netif_running(dev))
  13750. dev_close(dev);
  13751. bnxt_ptp_clear(bp);
  13752. bnxt_clear_int_mode(bp);
  13753. pci_disable_device(pdev);
  13754. if (system_state == SYSTEM_POWER_OFF) {
  13755. pci_wake_from_d3(pdev, bp->wol);
  13756. pci_set_power_state(pdev, PCI_D3hot);
  13757. }
  13758. shutdown_exit:
  13759. rtnl_unlock();
  13760. }
  13761. #ifdef CONFIG_PM_SLEEP
  13762. static int bnxt_suspend(struct device *device)
  13763. {
  13764. struct net_device *dev = dev_get_drvdata(device);
  13765. struct bnxt *bp = netdev_priv(dev);
  13766. int rc = 0;
  13767. bnxt_ulp_stop(bp);
  13768. rtnl_lock();
  13769. if (netif_running(dev)) {
  13770. netif_device_detach(dev);
  13771. rc = bnxt_close(dev);
  13772. }
  13773. bnxt_hwrm_func_drv_unrgtr(bp);
  13774. bnxt_ptp_clear(bp);
  13775. pci_disable_device(bp->pdev);
  13776. bnxt_free_ctx_mem(bp);
  13777. rtnl_unlock();
  13778. return rc;
  13779. }
  13780. static int bnxt_resume(struct device *device)
  13781. {
  13782. struct net_device *dev = dev_get_drvdata(device);
  13783. struct bnxt *bp = netdev_priv(dev);
  13784. int rc = 0;
  13785. rtnl_lock();
  13786. rc = pci_enable_device(bp->pdev);
  13787. if (rc) {
  13788. netdev_err(dev, "Cannot re-enable PCI device during resume, err = %d\n",
  13789. rc);
  13790. goto resume_exit;
  13791. }
  13792. pci_set_master(bp->pdev);
  13793. if (bnxt_hwrm_ver_get(bp)) {
  13794. rc = -ENODEV;
  13795. goto resume_exit;
  13796. }
  13797. rc = bnxt_hwrm_func_reset(bp);
  13798. if (rc) {
  13799. rc = -EBUSY;
  13800. goto resume_exit;
  13801. }
  13802. rc = bnxt_hwrm_func_qcaps(bp);
  13803. if (rc)
  13804. goto resume_exit;
  13805. bnxt_clear_reservations(bp, true);
  13806. if (bnxt_hwrm_func_drv_rgtr(bp, NULL, 0, false)) {
  13807. rc = -ENODEV;
  13808. goto resume_exit;
  13809. }
  13810. if (bp->fw_crash_mem)
  13811. bnxt_hwrm_crash_dump_mem_cfg(bp);
  13812. if (bnxt_ptp_init(bp)) {
  13813. kfree(bp->ptp_cfg);
  13814. bp->ptp_cfg = NULL;
  13815. }
  13816. bnxt_get_wol_settings(bp);
  13817. if (netif_running(dev)) {
  13818. rc = bnxt_open(dev);
  13819. if (!rc)
  13820. netif_device_attach(dev);
  13821. }
  13822. resume_exit:
  13823. rtnl_unlock();
  13824. bnxt_ulp_start(bp, rc);
  13825. if (!rc)
  13826. bnxt_reenable_sriov(bp);
  13827. return rc;
  13828. }
  13829. static SIMPLE_DEV_PM_OPS(bnxt_pm_ops, bnxt_suspend, bnxt_resume);
  13830. #define BNXT_PM_OPS (&bnxt_pm_ops)
  13831. #else
  13832. #define BNXT_PM_OPS NULL
  13833. #endif /* CONFIG_PM_SLEEP */
  13834. /**
  13835. * bnxt_io_error_detected - called when PCI error is detected
  13836. * @pdev: Pointer to PCI device
  13837. * @state: The current pci connection state
  13838. *
  13839. * This function is called after a PCI bus error affecting
  13840. * this device has been detected.
  13841. */
  13842. static pci_ers_result_t bnxt_io_error_detected(struct pci_dev *pdev,
  13843. pci_channel_state_t state)
  13844. {
  13845. struct net_device *netdev = pci_get_drvdata(pdev);
  13846. struct bnxt *bp = netdev_priv(netdev);
  13847. bool abort = false;
  13848. netdev_info(netdev, "PCI I/O error detected\n");
  13849. bnxt_ulp_stop(bp);
  13850. rtnl_lock();
  13851. netif_device_detach(netdev);
  13852. if (test_and_set_bit(BNXT_STATE_IN_FW_RESET, &bp->state)) {
  13853. netdev_err(bp->dev, "Firmware reset already in progress\n");
  13854. abort = true;
  13855. }
  13856. if (abort || state == pci_channel_io_perm_failure) {
  13857. rtnl_unlock();
  13858. return PCI_ERS_RESULT_DISCONNECT;
  13859. }
  13860. /* Link is not reliable anymore if state is pci_channel_io_frozen
  13861. * so we disable bus master to prevent any potential bad DMAs before
  13862. * freeing kernel memory.
  13863. */
  13864. if (state == pci_channel_io_frozen) {
  13865. set_bit(BNXT_STATE_PCI_CHANNEL_IO_FROZEN, &bp->state);
  13866. bnxt_fw_fatal_close(bp);
  13867. }
  13868. if (netif_running(netdev))
  13869. __bnxt_close_nic(bp, true, true);
  13870. if (pci_is_enabled(pdev))
  13871. pci_disable_device(pdev);
  13872. bnxt_free_ctx_mem(bp);
  13873. rtnl_unlock();
  13874. /* Request a slot slot reset. */
  13875. return PCI_ERS_RESULT_NEED_RESET;
  13876. }
  13877. /**
  13878. * bnxt_io_slot_reset - called after the pci bus has been reset.
  13879. * @pdev: Pointer to PCI device
  13880. *
  13881. * Restart the card from scratch, as if from a cold-boot.
  13882. * At this point, the card has exprienced a hard reset,
  13883. * followed by fixups by BIOS, and has its config space
  13884. * set up identically to what it was at cold boot.
  13885. */
  13886. static pci_ers_result_t bnxt_io_slot_reset(struct pci_dev *pdev)
  13887. {
  13888. pci_ers_result_t result = PCI_ERS_RESULT_DISCONNECT;
  13889. struct net_device *netdev = pci_get_drvdata(pdev);
  13890. struct bnxt *bp = netdev_priv(netdev);
  13891. int retry = 0;
  13892. int err = 0;
  13893. int off;
  13894. netdev_info(bp->dev, "PCI Slot Reset\n");
  13895. if (!(bp->flags & BNXT_FLAG_CHIP_P5_PLUS) &&
  13896. test_bit(BNXT_STATE_PCI_CHANNEL_IO_FROZEN, &bp->state))
  13897. msleep(900);
  13898. rtnl_lock();
  13899. if (pci_enable_device(pdev)) {
  13900. dev_err(&pdev->dev,
  13901. "Cannot re-enable PCI device after reset.\n");
  13902. } else {
  13903. pci_set_master(pdev);
  13904. /* Upon fatal error, our device internal logic that latches to
  13905. * BAR value is getting reset and will restore only upon
  13906. * rewritting the BARs.
  13907. *
  13908. * As pci_restore_state() does not re-write the BARs if the
  13909. * value is same as saved value earlier, driver needs to
  13910. * write the BARs to 0 to force restore, in case of fatal error.
  13911. */
  13912. if (test_and_clear_bit(BNXT_STATE_PCI_CHANNEL_IO_FROZEN,
  13913. &bp->state)) {
  13914. for (off = PCI_BASE_ADDRESS_0;
  13915. off <= PCI_BASE_ADDRESS_5; off += 4)
  13916. pci_write_config_dword(bp->pdev, off, 0);
  13917. }
  13918. pci_restore_state(pdev);
  13919. pci_save_state(pdev);
  13920. bnxt_inv_fw_health_reg(bp);
  13921. bnxt_try_map_fw_health_reg(bp);
  13922. /* In some PCIe AER scenarios, firmware may take up to
  13923. * 10 seconds to become ready in the worst case.
  13924. */
  13925. do {
  13926. err = bnxt_try_recover_fw(bp);
  13927. if (!err)
  13928. break;
  13929. retry++;
  13930. } while (retry < BNXT_FW_SLOT_RESET_RETRY);
  13931. if (err) {
  13932. dev_err(&pdev->dev, "Firmware not ready\n");
  13933. goto reset_exit;
  13934. }
  13935. err = bnxt_hwrm_func_reset(bp);
  13936. if (!err)
  13937. result = PCI_ERS_RESULT_RECOVERED;
  13938. bnxt_ulp_irq_stop(bp);
  13939. bnxt_clear_int_mode(bp);
  13940. err = bnxt_init_int_mode(bp);
  13941. bnxt_ulp_irq_restart(bp, err);
  13942. }
  13943. reset_exit:
  13944. clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
  13945. bnxt_clear_reservations(bp, true);
  13946. rtnl_unlock();
  13947. return result;
  13948. }
  13949. /**
  13950. * bnxt_io_resume - called when traffic can start flowing again.
  13951. * @pdev: Pointer to PCI device
  13952. *
  13953. * This callback is called when the error recovery driver tells
  13954. * us that its OK to resume normal operation.
  13955. */
  13956. static void bnxt_io_resume(struct pci_dev *pdev)
  13957. {
  13958. struct net_device *netdev = pci_get_drvdata(pdev);
  13959. struct bnxt *bp = netdev_priv(netdev);
  13960. int err;
  13961. netdev_info(bp->dev, "PCI Slot Resume\n");
  13962. rtnl_lock();
  13963. err = bnxt_hwrm_func_qcaps(bp);
  13964. if (!err) {
  13965. if (netif_running(netdev))
  13966. err = bnxt_open(netdev);
  13967. else
  13968. err = bnxt_reserve_rings(bp, true);
  13969. }
  13970. if (!err)
  13971. netif_device_attach(netdev);
  13972. rtnl_unlock();
  13973. bnxt_ulp_start(bp, err);
  13974. if (!err)
  13975. bnxt_reenable_sriov(bp);
  13976. }
  13977. static const struct pci_error_handlers bnxt_err_handler = {
  13978. .error_detected = bnxt_io_error_detected,
  13979. .slot_reset = bnxt_io_slot_reset,
  13980. .resume = bnxt_io_resume
  13981. };
  13982. static struct pci_driver bnxt_pci_driver = {
  13983. .name = DRV_MODULE_NAME,
  13984. .id_table = bnxt_pci_tbl,
  13985. .probe = bnxt_init_one,
  13986. .remove = bnxt_remove_one,
  13987. .shutdown = bnxt_shutdown,
  13988. .driver.pm = BNXT_PM_OPS,
  13989. .err_handler = &bnxt_err_handler,
  13990. #if defined(CONFIG_BNXT_SRIOV)
  13991. .sriov_configure = bnxt_sriov_configure,
  13992. #endif
  13993. };
  13994. static int __init bnxt_init(void)
  13995. {
  13996. int err;
  13997. bnxt_debug_init();
  13998. err = pci_register_driver(&bnxt_pci_driver);
  13999. if (err) {
  14000. bnxt_debug_exit();
  14001. return err;
  14002. }
  14003. return 0;
  14004. }
  14005. static void __exit bnxt_exit(void)
  14006. {
  14007. pci_unregister_driver(&bnxt_pci_driver);
  14008. if (bnxt_pf_wq)
  14009. destroy_workqueue(bnxt_pf_wq);
  14010. bnxt_debug_exit();
  14011. }
  14012. module_init(bnxt_init);
  14013. module_exit(bnxt_exit);