bcmgenet.c 115 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Broadcom GENET (Gigabit Ethernet) controller driver
  4. *
  5. * Copyright (c) 2014-2024 Broadcom
  6. */
  7. #define pr_fmt(fmt) "bcmgenet: " fmt
  8. #include <linux/acpi.h>
  9. #include <linux/kernel.h>
  10. #include <linux/module.h>
  11. #include <linux/sched.h>
  12. #include <linux/types.h>
  13. #include <linux/fcntl.h>
  14. #include <linux/interrupt.h>
  15. #include <linux/string.h>
  16. #include <linux/if_ether.h>
  17. #include <linux/init.h>
  18. #include <linux/errno.h>
  19. #include <linux/delay.h>
  20. #include <linux/platform_device.h>
  21. #include <linux/dma-mapping.h>
  22. #include <linux/pm.h>
  23. #include <linux/clk.h>
  24. #include <net/arp.h>
  25. #include <linux/mii.h>
  26. #include <linux/ethtool.h>
  27. #include <linux/netdevice.h>
  28. #include <linux/inetdevice.h>
  29. #include <linux/etherdevice.h>
  30. #include <linux/skbuff.h>
  31. #include <linux/in.h>
  32. #include <linux/ip.h>
  33. #include <linux/ipv6.h>
  34. #include <linux/phy.h>
  35. #include <linux/platform_data/bcmgenet.h>
  36. #include <linux/unaligned.h>
  37. #include "bcmgenet.h"
  38. /* Maximum number of hardware queues, downsized if needed */
  39. #define GENET_MAX_MQ_CNT 4
  40. /* Default highest priority queue for multi queue support */
  41. #define GENET_Q0_PRIORITY 0
  42. #define GENET_Q16_RX_BD_CNT \
  43. (TOTAL_DESC - priv->hw_params->rx_queues * priv->hw_params->rx_bds_per_q)
  44. #define GENET_Q16_TX_BD_CNT \
  45. (TOTAL_DESC - priv->hw_params->tx_queues * priv->hw_params->tx_bds_per_q)
  46. #define RX_BUF_LENGTH 2048
  47. #define SKB_ALIGNMENT 32
  48. /* Tx/Rx DMA register offset, skip 256 descriptors */
  49. #define WORDS_PER_BD(p) (p->hw_params->words_per_bd)
  50. #define DMA_DESC_SIZE (WORDS_PER_BD(priv) * sizeof(u32))
  51. #define GENET_TDMA_REG_OFF (priv->hw_params->tdma_offset + \
  52. TOTAL_DESC * DMA_DESC_SIZE)
  53. #define GENET_RDMA_REG_OFF (priv->hw_params->rdma_offset + \
  54. TOTAL_DESC * DMA_DESC_SIZE)
  55. /* Forward declarations */
  56. static void bcmgenet_set_rx_mode(struct net_device *dev);
  57. static inline void bcmgenet_writel(u32 value, void __iomem *offset)
  58. {
  59. /* MIPS chips strapped for BE will automagically configure the
  60. * peripheral registers for CPU-native byte order.
  61. */
  62. if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
  63. __raw_writel(value, offset);
  64. else
  65. writel_relaxed(value, offset);
  66. }
  67. static inline u32 bcmgenet_readl(void __iomem *offset)
  68. {
  69. if (IS_ENABLED(CONFIG_MIPS) && IS_ENABLED(CONFIG_CPU_BIG_ENDIAN))
  70. return __raw_readl(offset);
  71. else
  72. return readl_relaxed(offset);
  73. }
  74. static inline void dmadesc_set_length_status(struct bcmgenet_priv *priv,
  75. void __iomem *d, u32 value)
  76. {
  77. bcmgenet_writel(value, d + DMA_DESC_LENGTH_STATUS);
  78. }
  79. static inline void dmadesc_set_addr(struct bcmgenet_priv *priv,
  80. void __iomem *d,
  81. dma_addr_t addr)
  82. {
  83. bcmgenet_writel(lower_32_bits(addr), d + DMA_DESC_ADDRESS_LO);
  84. /* Register writes to GISB bus can take couple hundred nanoseconds
  85. * and are done for each packet, save these expensive writes unless
  86. * the platform is explicitly configured for 64-bits/LPAE.
  87. */
  88. #ifdef CONFIG_PHYS_ADDR_T_64BIT
  89. if (priv->hw_params->flags & GENET_HAS_40BITS)
  90. bcmgenet_writel(upper_32_bits(addr), d + DMA_DESC_ADDRESS_HI);
  91. #endif
  92. }
  93. /* Combined address + length/status setter */
  94. static inline void dmadesc_set(struct bcmgenet_priv *priv,
  95. void __iomem *d, dma_addr_t addr, u32 val)
  96. {
  97. dmadesc_set_addr(priv, d, addr);
  98. dmadesc_set_length_status(priv, d, val);
  99. }
  100. #define GENET_VER_FMT "%1d.%1d EPHY: 0x%04x"
  101. #define GENET_MSG_DEFAULT (NETIF_MSG_DRV | NETIF_MSG_PROBE | \
  102. NETIF_MSG_LINK)
  103. static inline u32 bcmgenet_rbuf_ctrl_get(struct bcmgenet_priv *priv)
  104. {
  105. if (GENET_IS_V1(priv))
  106. return bcmgenet_rbuf_readl(priv, RBUF_FLUSH_CTRL_V1);
  107. else
  108. return bcmgenet_sys_readl(priv, SYS_RBUF_FLUSH_CTRL);
  109. }
  110. static inline void bcmgenet_rbuf_ctrl_set(struct bcmgenet_priv *priv, u32 val)
  111. {
  112. if (GENET_IS_V1(priv))
  113. bcmgenet_rbuf_writel(priv, val, RBUF_FLUSH_CTRL_V1);
  114. else
  115. bcmgenet_sys_writel(priv, val, SYS_RBUF_FLUSH_CTRL);
  116. }
  117. /* These macros are defined to deal with register map change
  118. * between GENET1.1 and GENET2. Only those currently being used
  119. * by driver are defined.
  120. */
  121. static inline u32 bcmgenet_tbuf_ctrl_get(struct bcmgenet_priv *priv)
  122. {
  123. if (GENET_IS_V1(priv))
  124. return bcmgenet_rbuf_readl(priv, TBUF_CTRL_V1);
  125. else
  126. return bcmgenet_readl(priv->base +
  127. priv->hw_params->tbuf_offset + TBUF_CTRL);
  128. }
  129. static inline void bcmgenet_tbuf_ctrl_set(struct bcmgenet_priv *priv, u32 val)
  130. {
  131. if (GENET_IS_V1(priv))
  132. bcmgenet_rbuf_writel(priv, val, TBUF_CTRL_V1);
  133. else
  134. bcmgenet_writel(val, priv->base +
  135. priv->hw_params->tbuf_offset + TBUF_CTRL);
  136. }
  137. static inline u32 bcmgenet_bp_mc_get(struct bcmgenet_priv *priv)
  138. {
  139. if (GENET_IS_V1(priv))
  140. return bcmgenet_rbuf_readl(priv, TBUF_BP_MC_V1);
  141. else
  142. return bcmgenet_readl(priv->base +
  143. priv->hw_params->tbuf_offset + TBUF_BP_MC);
  144. }
  145. static inline void bcmgenet_bp_mc_set(struct bcmgenet_priv *priv, u32 val)
  146. {
  147. if (GENET_IS_V1(priv))
  148. bcmgenet_rbuf_writel(priv, val, TBUF_BP_MC_V1);
  149. else
  150. bcmgenet_writel(val, priv->base +
  151. priv->hw_params->tbuf_offset + TBUF_BP_MC);
  152. }
  153. /* RX/TX DMA register accessors */
  154. enum dma_reg {
  155. DMA_RING_CFG = 0,
  156. DMA_CTRL,
  157. DMA_STATUS,
  158. DMA_SCB_BURST_SIZE,
  159. DMA_ARB_CTRL,
  160. DMA_PRIORITY_0,
  161. DMA_PRIORITY_1,
  162. DMA_PRIORITY_2,
  163. DMA_INDEX2RING_0,
  164. DMA_INDEX2RING_1,
  165. DMA_INDEX2RING_2,
  166. DMA_INDEX2RING_3,
  167. DMA_INDEX2RING_4,
  168. DMA_INDEX2RING_5,
  169. DMA_INDEX2RING_6,
  170. DMA_INDEX2RING_7,
  171. DMA_RING0_TIMEOUT,
  172. DMA_RING1_TIMEOUT,
  173. DMA_RING2_TIMEOUT,
  174. DMA_RING3_TIMEOUT,
  175. DMA_RING4_TIMEOUT,
  176. DMA_RING5_TIMEOUT,
  177. DMA_RING6_TIMEOUT,
  178. DMA_RING7_TIMEOUT,
  179. DMA_RING8_TIMEOUT,
  180. DMA_RING9_TIMEOUT,
  181. DMA_RING10_TIMEOUT,
  182. DMA_RING11_TIMEOUT,
  183. DMA_RING12_TIMEOUT,
  184. DMA_RING13_TIMEOUT,
  185. DMA_RING14_TIMEOUT,
  186. DMA_RING15_TIMEOUT,
  187. DMA_RING16_TIMEOUT,
  188. };
  189. static const u8 bcmgenet_dma_regs_v3plus[] = {
  190. [DMA_RING_CFG] = 0x00,
  191. [DMA_CTRL] = 0x04,
  192. [DMA_STATUS] = 0x08,
  193. [DMA_SCB_BURST_SIZE] = 0x0C,
  194. [DMA_ARB_CTRL] = 0x2C,
  195. [DMA_PRIORITY_0] = 0x30,
  196. [DMA_PRIORITY_1] = 0x34,
  197. [DMA_PRIORITY_2] = 0x38,
  198. [DMA_RING0_TIMEOUT] = 0x2C,
  199. [DMA_RING1_TIMEOUT] = 0x30,
  200. [DMA_RING2_TIMEOUT] = 0x34,
  201. [DMA_RING3_TIMEOUT] = 0x38,
  202. [DMA_RING4_TIMEOUT] = 0x3c,
  203. [DMA_RING5_TIMEOUT] = 0x40,
  204. [DMA_RING6_TIMEOUT] = 0x44,
  205. [DMA_RING7_TIMEOUT] = 0x48,
  206. [DMA_RING8_TIMEOUT] = 0x4c,
  207. [DMA_RING9_TIMEOUT] = 0x50,
  208. [DMA_RING10_TIMEOUT] = 0x54,
  209. [DMA_RING11_TIMEOUT] = 0x58,
  210. [DMA_RING12_TIMEOUT] = 0x5c,
  211. [DMA_RING13_TIMEOUT] = 0x60,
  212. [DMA_RING14_TIMEOUT] = 0x64,
  213. [DMA_RING15_TIMEOUT] = 0x68,
  214. [DMA_RING16_TIMEOUT] = 0x6C,
  215. [DMA_INDEX2RING_0] = 0x70,
  216. [DMA_INDEX2RING_1] = 0x74,
  217. [DMA_INDEX2RING_2] = 0x78,
  218. [DMA_INDEX2RING_3] = 0x7C,
  219. [DMA_INDEX2RING_4] = 0x80,
  220. [DMA_INDEX2RING_5] = 0x84,
  221. [DMA_INDEX2RING_6] = 0x88,
  222. [DMA_INDEX2RING_7] = 0x8C,
  223. };
  224. static const u8 bcmgenet_dma_regs_v2[] = {
  225. [DMA_RING_CFG] = 0x00,
  226. [DMA_CTRL] = 0x04,
  227. [DMA_STATUS] = 0x08,
  228. [DMA_SCB_BURST_SIZE] = 0x0C,
  229. [DMA_ARB_CTRL] = 0x30,
  230. [DMA_PRIORITY_0] = 0x34,
  231. [DMA_PRIORITY_1] = 0x38,
  232. [DMA_PRIORITY_2] = 0x3C,
  233. [DMA_RING0_TIMEOUT] = 0x2C,
  234. [DMA_RING1_TIMEOUT] = 0x30,
  235. [DMA_RING2_TIMEOUT] = 0x34,
  236. [DMA_RING3_TIMEOUT] = 0x38,
  237. [DMA_RING4_TIMEOUT] = 0x3c,
  238. [DMA_RING5_TIMEOUT] = 0x40,
  239. [DMA_RING6_TIMEOUT] = 0x44,
  240. [DMA_RING7_TIMEOUT] = 0x48,
  241. [DMA_RING8_TIMEOUT] = 0x4c,
  242. [DMA_RING9_TIMEOUT] = 0x50,
  243. [DMA_RING10_TIMEOUT] = 0x54,
  244. [DMA_RING11_TIMEOUT] = 0x58,
  245. [DMA_RING12_TIMEOUT] = 0x5c,
  246. [DMA_RING13_TIMEOUT] = 0x60,
  247. [DMA_RING14_TIMEOUT] = 0x64,
  248. [DMA_RING15_TIMEOUT] = 0x68,
  249. [DMA_RING16_TIMEOUT] = 0x6C,
  250. };
  251. static const u8 bcmgenet_dma_regs_v1[] = {
  252. [DMA_CTRL] = 0x00,
  253. [DMA_STATUS] = 0x04,
  254. [DMA_SCB_BURST_SIZE] = 0x0C,
  255. [DMA_ARB_CTRL] = 0x30,
  256. [DMA_PRIORITY_0] = 0x34,
  257. [DMA_PRIORITY_1] = 0x38,
  258. [DMA_PRIORITY_2] = 0x3C,
  259. [DMA_RING0_TIMEOUT] = 0x2C,
  260. [DMA_RING1_TIMEOUT] = 0x30,
  261. [DMA_RING2_TIMEOUT] = 0x34,
  262. [DMA_RING3_TIMEOUT] = 0x38,
  263. [DMA_RING4_TIMEOUT] = 0x3c,
  264. [DMA_RING5_TIMEOUT] = 0x40,
  265. [DMA_RING6_TIMEOUT] = 0x44,
  266. [DMA_RING7_TIMEOUT] = 0x48,
  267. [DMA_RING8_TIMEOUT] = 0x4c,
  268. [DMA_RING9_TIMEOUT] = 0x50,
  269. [DMA_RING10_TIMEOUT] = 0x54,
  270. [DMA_RING11_TIMEOUT] = 0x58,
  271. [DMA_RING12_TIMEOUT] = 0x5c,
  272. [DMA_RING13_TIMEOUT] = 0x60,
  273. [DMA_RING14_TIMEOUT] = 0x64,
  274. [DMA_RING15_TIMEOUT] = 0x68,
  275. [DMA_RING16_TIMEOUT] = 0x6C,
  276. };
  277. /* Set at runtime once bcmgenet version is known */
  278. static const u8 *bcmgenet_dma_regs;
  279. static inline struct bcmgenet_priv *dev_to_priv(struct device *dev)
  280. {
  281. return netdev_priv(dev_get_drvdata(dev));
  282. }
  283. static inline u32 bcmgenet_tdma_readl(struct bcmgenet_priv *priv,
  284. enum dma_reg r)
  285. {
  286. return bcmgenet_readl(priv->base + GENET_TDMA_REG_OFF +
  287. DMA_RINGS_SIZE + bcmgenet_dma_regs[r]);
  288. }
  289. static inline void bcmgenet_tdma_writel(struct bcmgenet_priv *priv,
  290. u32 val, enum dma_reg r)
  291. {
  292. bcmgenet_writel(val, priv->base + GENET_TDMA_REG_OFF +
  293. DMA_RINGS_SIZE + bcmgenet_dma_regs[r]);
  294. }
  295. static inline u32 bcmgenet_rdma_readl(struct bcmgenet_priv *priv,
  296. enum dma_reg r)
  297. {
  298. return bcmgenet_readl(priv->base + GENET_RDMA_REG_OFF +
  299. DMA_RINGS_SIZE + bcmgenet_dma_regs[r]);
  300. }
  301. static inline void bcmgenet_rdma_writel(struct bcmgenet_priv *priv,
  302. u32 val, enum dma_reg r)
  303. {
  304. bcmgenet_writel(val, priv->base + GENET_RDMA_REG_OFF +
  305. DMA_RINGS_SIZE + bcmgenet_dma_regs[r]);
  306. }
  307. /* RDMA/TDMA ring registers and accessors
  308. * we merge the common fields and just prefix with T/D the registers
  309. * having different meaning depending on the direction
  310. */
  311. enum dma_ring_reg {
  312. TDMA_READ_PTR = 0,
  313. RDMA_WRITE_PTR = TDMA_READ_PTR,
  314. TDMA_READ_PTR_HI,
  315. RDMA_WRITE_PTR_HI = TDMA_READ_PTR_HI,
  316. TDMA_CONS_INDEX,
  317. RDMA_PROD_INDEX = TDMA_CONS_INDEX,
  318. TDMA_PROD_INDEX,
  319. RDMA_CONS_INDEX = TDMA_PROD_INDEX,
  320. DMA_RING_BUF_SIZE,
  321. DMA_START_ADDR,
  322. DMA_START_ADDR_HI,
  323. DMA_END_ADDR,
  324. DMA_END_ADDR_HI,
  325. DMA_MBUF_DONE_THRESH,
  326. TDMA_FLOW_PERIOD,
  327. RDMA_XON_XOFF_THRESH = TDMA_FLOW_PERIOD,
  328. TDMA_WRITE_PTR,
  329. RDMA_READ_PTR = TDMA_WRITE_PTR,
  330. TDMA_WRITE_PTR_HI,
  331. RDMA_READ_PTR_HI = TDMA_WRITE_PTR_HI
  332. };
  333. /* GENET v4 supports 40-bits pointer addressing
  334. * for obvious reasons the LO and HI word parts
  335. * are contiguous, but this offsets the other
  336. * registers.
  337. */
  338. static const u8 genet_dma_ring_regs_v4[] = {
  339. [TDMA_READ_PTR] = 0x00,
  340. [TDMA_READ_PTR_HI] = 0x04,
  341. [TDMA_CONS_INDEX] = 0x08,
  342. [TDMA_PROD_INDEX] = 0x0C,
  343. [DMA_RING_BUF_SIZE] = 0x10,
  344. [DMA_START_ADDR] = 0x14,
  345. [DMA_START_ADDR_HI] = 0x18,
  346. [DMA_END_ADDR] = 0x1C,
  347. [DMA_END_ADDR_HI] = 0x20,
  348. [DMA_MBUF_DONE_THRESH] = 0x24,
  349. [TDMA_FLOW_PERIOD] = 0x28,
  350. [TDMA_WRITE_PTR] = 0x2C,
  351. [TDMA_WRITE_PTR_HI] = 0x30,
  352. };
  353. static const u8 genet_dma_ring_regs_v123[] = {
  354. [TDMA_READ_PTR] = 0x00,
  355. [TDMA_CONS_INDEX] = 0x04,
  356. [TDMA_PROD_INDEX] = 0x08,
  357. [DMA_RING_BUF_SIZE] = 0x0C,
  358. [DMA_START_ADDR] = 0x10,
  359. [DMA_END_ADDR] = 0x14,
  360. [DMA_MBUF_DONE_THRESH] = 0x18,
  361. [TDMA_FLOW_PERIOD] = 0x1C,
  362. [TDMA_WRITE_PTR] = 0x20,
  363. };
  364. /* Set at runtime once GENET version is known */
  365. static const u8 *genet_dma_ring_regs;
  366. static inline u32 bcmgenet_tdma_ring_readl(struct bcmgenet_priv *priv,
  367. unsigned int ring,
  368. enum dma_ring_reg r)
  369. {
  370. return bcmgenet_readl(priv->base + GENET_TDMA_REG_OFF +
  371. (DMA_RING_SIZE * ring) +
  372. genet_dma_ring_regs[r]);
  373. }
  374. static inline void bcmgenet_tdma_ring_writel(struct bcmgenet_priv *priv,
  375. unsigned int ring, u32 val,
  376. enum dma_ring_reg r)
  377. {
  378. bcmgenet_writel(val, priv->base + GENET_TDMA_REG_OFF +
  379. (DMA_RING_SIZE * ring) +
  380. genet_dma_ring_regs[r]);
  381. }
  382. static inline u32 bcmgenet_rdma_ring_readl(struct bcmgenet_priv *priv,
  383. unsigned int ring,
  384. enum dma_ring_reg r)
  385. {
  386. return bcmgenet_readl(priv->base + GENET_RDMA_REG_OFF +
  387. (DMA_RING_SIZE * ring) +
  388. genet_dma_ring_regs[r]);
  389. }
  390. static inline void bcmgenet_rdma_ring_writel(struct bcmgenet_priv *priv,
  391. unsigned int ring, u32 val,
  392. enum dma_ring_reg r)
  393. {
  394. bcmgenet_writel(val, priv->base + GENET_RDMA_REG_OFF +
  395. (DMA_RING_SIZE * ring) +
  396. genet_dma_ring_regs[r]);
  397. }
  398. static void bcmgenet_hfb_enable_filter(struct bcmgenet_priv *priv, u32 f_index)
  399. {
  400. u32 offset;
  401. u32 reg;
  402. offset = HFB_FLT_ENABLE_V3PLUS + (f_index < 32) * sizeof(u32);
  403. reg = bcmgenet_hfb_reg_readl(priv, offset);
  404. reg |= (1 << (f_index % 32));
  405. bcmgenet_hfb_reg_writel(priv, reg, offset);
  406. reg = bcmgenet_hfb_reg_readl(priv, HFB_CTRL);
  407. reg |= RBUF_HFB_EN;
  408. bcmgenet_hfb_reg_writel(priv, reg, HFB_CTRL);
  409. }
  410. static void bcmgenet_hfb_disable_filter(struct bcmgenet_priv *priv, u32 f_index)
  411. {
  412. u32 offset, reg, reg1;
  413. offset = HFB_FLT_ENABLE_V3PLUS;
  414. reg = bcmgenet_hfb_reg_readl(priv, offset);
  415. reg1 = bcmgenet_hfb_reg_readl(priv, offset + sizeof(u32));
  416. if (f_index < 32) {
  417. reg1 &= ~(1 << (f_index % 32));
  418. bcmgenet_hfb_reg_writel(priv, reg1, offset + sizeof(u32));
  419. } else {
  420. reg &= ~(1 << (f_index % 32));
  421. bcmgenet_hfb_reg_writel(priv, reg, offset);
  422. }
  423. if (!reg && !reg1) {
  424. reg = bcmgenet_hfb_reg_readl(priv, HFB_CTRL);
  425. reg &= ~RBUF_HFB_EN;
  426. bcmgenet_hfb_reg_writel(priv, reg, HFB_CTRL);
  427. }
  428. }
  429. static void bcmgenet_hfb_set_filter_rx_queue_mapping(struct bcmgenet_priv *priv,
  430. u32 f_index, u32 rx_queue)
  431. {
  432. u32 offset;
  433. u32 reg;
  434. offset = f_index / 8;
  435. reg = bcmgenet_rdma_readl(priv, DMA_INDEX2RING_0 + offset);
  436. reg &= ~(0xF << (4 * (f_index % 8)));
  437. reg |= ((rx_queue & 0xF) << (4 * (f_index % 8)));
  438. bcmgenet_rdma_writel(priv, reg, DMA_INDEX2RING_0 + offset);
  439. }
  440. static void bcmgenet_hfb_set_filter_length(struct bcmgenet_priv *priv,
  441. u32 f_index, u32 f_length)
  442. {
  443. u32 offset;
  444. u32 reg;
  445. offset = HFB_FLT_LEN_V3PLUS +
  446. ((priv->hw_params->hfb_filter_cnt - 1 - f_index) / 4) *
  447. sizeof(u32);
  448. reg = bcmgenet_hfb_reg_readl(priv, offset);
  449. reg &= ~(0xFF << (8 * (f_index % 4)));
  450. reg |= ((f_length & 0xFF) << (8 * (f_index % 4)));
  451. bcmgenet_hfb_reg_writel(priv, reg, offset);
  452. }
  453. static int bcmgenet_hfb_validate_mask(void *mask, size_t size)
  454. {
  455. while (size) {
  456. switch (*(unsigned char *)mask++) {
  457. case 0x00:
  458. case 0x0f:
  459. case 0xf0:
  460. case 0xff:
  461. size--;
  462. continue;
  463. default:
  464. return -EINVAL;
  465. }
  466. }
  467. return 0;
  468. }
  469. #define VALIDATE_MASK(x) \
  470. bcmgenet_hfb_validate_mask(&(x), sizeof(x))
  471. static int bcmgenet_hfb_insert_data(struct bcmgenet_priv *priv, u32 f_index,
  472. u32 offset, void *val, void *mask,
  473. size_t size)
  474. {
  475. u32 index, tmp;
  476. index = f_index * priv->hw_params->hfb_filter_size + offset / 2;
  477. tmp = bcmgenet_hfb_readl(priv, index * sizeof(u32));
  478. while (size--) {
  479. if (offset++ & 1) {
  480. tmp &= ~0x300FF;
  481. tmp |= (*(unsigned char *)val++);
  482. switch ((*(unsigned char *)mask++)) {
  483. case 0xFF:
  484. tmp |= 0x30000;
  485. break;
  486. case 0xF0:
  487. tmp |= 0x20000;
  488. break;
  489. case 0x0F:
  490. tmp |= 0x10000;
  491. break;
  492. }
  493. bcmgenet_hfb_writel(priv, tmp, index++ * sizeof(u32));
  494. if (size)
  495. tmp = bcmgenet_hfb_readl(priv,
  496. index * sizeof(u32));
  497. } else {
  498. tmp &= ~0xCFF00;
  499. tmp |= (*(unsigned char *)val++) << 8;
  500. switch ((*(unsigned char *)mask++)) {
  501. case 0xFF:
  502. tmp |= 0xC0000;
  503. break;
  504. case 0xF0:
  505. tmp |= 0x80000;
  506. break;
  507. case 0x0F:
  508. tmp |= 0x40000;
  509. break;
  510. }
  511. if (!size)
  512. bcmgenet_hfb_writel(priv, tmp, index * sizeof(u32));
  513. }
  514. }
  515. return 0;
  516. }
  517. static void bcmgenet_hfb_create_rxnfc_filter(struct bcmgenet_priv *priv,
  518. struct bcmgenet_rxnfc_rule *rule)
  519. {
  520. struct ethtool_rx_flow_spec *fs = &rule->fs;
  521. u32 offset = 0, f_length = 0, f;
  522. u8 val_8, mask_8;
  523. __be16 val_16;
  524. u16 mask_16;
  525. size_t size;
  526. f = fs->location;
  527. if (fs->flow_type & FLOW_MAC_EXT) {
  528. bcmgenet_hfb_insert_data(priv, f, 0,
  529. &fs->h_ext.h_dest, &fs->m_ext.h_dest,
  530. sizeof(fs->h_ext.h_dest));
  531. }
  532. if (fs->flow_type & FLOW_EXT) {
  533. if (fs->m_ext.vlan_etype ||
  534. fs->m_ext.vlan_tci) {
  535. bcmgenet_hfb_insert_data(priv, f, 12,
  536. &fs->h_ext.vlan_etype,
  537. &fs->m_ext.vlan_etype,
  538. sizeof(fs->h_ext.vlan_etype));
  539. bcmgenet_hfb_insert_data(priv, f, 14,
  540. &fs->h_ext.vlan_tci,
  541. &fs->m_ext.vlan_tci,
  542. sizeof(fs->h_ext.vlan_tci));
  543. offset += VLAN_HLEN;
  544. f_length += DIV_ROUND_UP(VLAN_HLEN, 2);
  545. }
  546. }
  547. switch (fs->flow_type & ~(FLOW_EXT | FLOW_MAC_EXT)) {
  548. case ETHER_FLOW:
  549. f_length += DIV_ROUND_UP(ETH_HLEN, 2);
  550. bcmgenet_hfb_insert_data(priv, f, 0,
  551. &fs->h_u.ether_spec.h_dest,
  552. &fs->m_u.ether_spec.h_dest,
  553. sizeof(fs->h_u.ether_spec.h_dest));
  554. bcmgenet_hfb_insert_data(priv, f, ETH_ALEN,
  555. &fs->h_u.ether_spec.h_source,
  556. &fs->m_u.ether_spec.h_source,
  557. sizeof(fs->h_u.ether_spec.h_source));
  558. bcmgenet_hfb_insert_data(priv, f, (2 * ETH_ALEN) + offset,
  559. &fs->h_u.ether_spec.h_proto,
  560. &fs->m_u.ether_spec.h_proto,
  561. sizeof(fs->h_u.ether_spec.h_proto));
  562. break;
  563. case IP_USER_FLOW:
  564. f_length += DIV_ROUND_UP(ETH_HLEN + 20, 2);
  565. /* Specify IP Ether Type */
  566. val_16 = htons(ETH_P_IP);
  567. mask_16 = 0xFFFF;
  568. bcmgenet_hfb_insert_data(priv, f, (2 * ETH_ALEN) + offset,
  569. &val_16, &mask_16, sizeof(val_16));
  570. bcmgenet_hfb_insert_data(priv, f, 15 + offset,
  571. &fs->h_u.usr_ip4_spec.tos,
  572. &fs->m_u.usr_ip4_spec.tos,
  573. sizeof(fs->h_u.usr_ip4_spec.tos));
  574. bcmgenet_hfb_insert_data(priv, f, 23 + offset,
  575. &fs->h_u.usr_ip4_spec.proto,
  576. &fs->m_u.usr_ip4_spec.proto,
  577. sizeof(fs->h_u.usr_ip4_spec.proto));
  578. bcmgenet_hfb_insert_data(priv, f, 26 + offset,
  579. &fs->h_u.usr_ip4_spec.ip4src,
  580. &fs->m_u.usr_ip4_spec.ip4src,
  581. sizeof(fs->h_u.usr_ip4_spec.ip4src));
  582. bcmgenet_hfb_insert_data(priv, f, 30 + offset,
  583. &fs->h_u.usr_ip4_spec.ip4dst,
  584. &fs->m_u.usr_ip4_spec.ip4dst,
  585. sizeof(fs->h_u.usr_ip4_spec.ip4dst));
  586. if (!fs->m_u.usr_ip4_spec.l4_4_bytes)
  587. break;
  588. /* Only supports 20 byte IPv4 header */
  589. val_8 = 0x45;
  590. mask_8 = 0xFF;
  591. bcmgenet_hfb_insert_data(priv, f, ETH_HLEN + offset,
  592. &val_8, &mask_8,
  593. sizeof(val_8));
  594. size = sizeof(fs->h_u.usr_ip4_spec.l4_4_bytes);
  595. bcmgenet_hfb_insert_data(priv, f,
  596. ETH_HLEN + 20 + offset,
  597. &fs->h_u.usr_ip4_spec.l4_4_bytes,
  598. &fs->m_u.usr_ip4_spec.l4_4_bytes,
  599. size);
  600. f_length += DIV_ROUND_UP(size, 2);
  601. break;
  602. }
  603. bcmgenet_hfb_set_filter_length(priv, f, 2 * f_length);
  604. if (!fs->ring_cookie || fs->ring_cookie == RX_CLS_FLOW_WAKE) {
  605. /* Ring 0 flows can be handled by the default Descriptor Ring
  606. * We'll map them to ring 0, but don't enable the filter
  607. */
  608. bcmgenet_hfb_set_filter_rx_queue_mapping(priv, f, 0);
  609. rule->state = BCMGENET_RXNFC_STATE_DISABLED;
  610. } else {
  611. /* Other Rx rings are direct mapped here */
  612. bcmgenet_hfb_set_filter_rx_queue_mapping(priv, f,
  613. fs->ring_cookie);
  614. bcmgenet_hfb_enable_filter(priv, f);
  615. rule->state = BCMGENET_RXNFC_STATE_ENABLED;
  616. }
  617. }
  618. /* bcmgenet_hfb_clear
  619. *
  620. * Clear Hardware Filter Block and disable all filtering.
  621. */
  622. static void bcmgenet_hfb_clear_filter(struct bcmgenet_priv *priv, u32 f_index)
  623. {
  624. u32 base, i;
  625. base = f_index * priv->hw_params->hfb_filter_size;
  626. for (i = 0; i < priv->hw_params->hfb_filter_size; i++)
  627. bcmgenet_hfb_writel(priv, 0x0, (base + i) * sizeof(u32));
  628. }
  629. static void bcmgenet_hfb_clear(struct bcmgenet_priv *priv)
  630. {
  631. u32 i;
  632. if (GENET_IS_V1(priv) || GENET_IS_V2(priv))
  633. return;
  634. bcmgenet_hfb_reg_writel(priv, 0x0, HFB_CTRL);
  635. bcmgenet_hfb_reg_writel(priv, 0x0, HFB_FLT_ENABLE_V3PLUS);
  636. bcmgenet_hfb_reg_writel(priv, 0x0, HFB_FLT_ENABLE_V3PLUS + 4);
  637. for (i = DMA_INDEX2RING_0; i <= DMA_INDEX2RING_7; i++)
  638. bcmgenet_rdma_writel(priv, 0x0, i);
  639. for (i = 0; i < (priv->hw_params->hfb_filter_cnt / 4); i++)
  640. bcmgenet_hfb_reg_writel(priv, 0x0,
  641. HFB_FLT_LEN_V3PLUS + i * sizeof(u32));
  642. for (i = 0; i < priv->hw_params->hfb_filter_cnt; i++)
  643. bcmgenet_hfb_clear_filter(priv, i);
  644. }
  645. static void bcmgenet_hfb_init(struct bcmgenet_priv *priv)
  646. {
  647. int i;
  648. INIT_LIST_HEAD(&priv->rxnfc_list);
  649. if (GENET_IS_V1(priv) || GENET_IS_V2(priv))
  650. return;
  651. for (i = 0; i < MAX_NUM_OF_FS_RULES; i++) {
  652. INIT_LIST_HEAD(&priv->rxnfc_rules[i].list);
  653. priv->rxnfc_rules[i].state = BCMGENET_RXNFC_STATE_UNUSED;
  654. }
  655. bcmgenet_hfb_clear(priv);
  656. }
  657. static int bcmgenet_begin(struct net_device *dev)
  658. {
  659. struct bcmgenet_priv *priv = netdev_priv(dev);
  660. /* Turn on the clock */
  661. return clk_prepare_enable(priv->clk);
  662. }
  663. static void bcmgenet_complete(struct net_device *dev)
  664. {
  665. struct bcmgenet_priv *priv = netdev_priv(dev);
  666. /* Turn off the clock */
  667. clk_disable_unprepare(priv->clk);
  668. }
  669. static int bcmgenet_get_link_ksettings(struct net_device *dev,
  670. struct ethtool_link_ksettings *cmd)
  671. {
  672. if (!netif_running(dev))
  673. return -EINVAL;
  674. if (!dev->phydev)
  675. return -ENODEV;
  676. phy_ethtool_ksettings_get(dev->phydev, cmd);
  677. return 0;
  678. }
  679. static int bcmgenet_set_link_ksettings(struct net_device *dev,
  680. const struct ethtool_link_ksettings *cmd)
  681. {
  682. if (!netif_running(dev))
  683. return -EINVAL;
  684. if (!dev->phydev)
  685. return -ENODEV;
  686. return phy_ethtool_ksettings_set(dev->phydev, cmd);
  687. }
  688. static int bcmgenet_set_features(struct net_device *dev,
  689. netdev_features_t features)
  690. {
  691. struct bcmgenet_priv *priv = netdev_priv(dev);
  692. u32 reg;
  693. int ret;
  694. ret = clk_prepare_enable(priv->clk);
  695. if (ret)
  696. return ret;
  697. /* Make sure we reflect the value of CRC_CMD_FWD */
  698. reg = bcmgenet_umac_readl(priv, UMAC_CMD);
  699. priv->crc_fwd_en = !!(reg & CMD_CRC_FWD);
  700. clk_disable_unprepare(priv->clk);
  701. return ret;
  702. }
  703. static u32 bcmgenet_get_msglevel(struct net_device *dev)
  704. {
  705. struct bcmgenet_priv *priv = netdev_priv(dev);
  706. return priv->msg_enable;
  707. }
  708. static void bcmgenet_set_msglevel(struct net_device *dev, u32 level)
  709. {
  710. struct bcmgenet_priv *priv = netdev_priv(dev);
  711. priv->msg_enable = level;
  712. }
  713. static int bcmgenet_get_coalesce(struct net_device *dev,
  714. struct ethtool_coalesce *ec,
  715. struct kernel_ethtool_coalesce *kernel_coal,
  716. struct netlink_ext_ack *extack)
  717. {
  718. struct bcmgenet_priv *priv = netdev_priv(dev);
  719. struct bcmgenet_rx_ring *ring;
  720. unsigned int i;
  721. ec->tx_max_coalesced_frames =
  722. bcmgenet_tdma_ring_readl(priv, DESC_INDEX,
  723. DMA_MBUF_DONE_THRESH);
  724. ec->rx_max_coalesced_frames =
  725. bcmgenet_rdma_ring_readl(priv, DESC_INDEX,
  726. DMA_MBUF_DONE_THRESH);
  727. ec->rx_coalesce_usecs =
  728. bcmgenet_rdma_readl(priv, DMA_RING16_TIMEOUT) * 8192 / 1000;
  729. for (i = 0; i < priv->hw_params->rx_queues; i++) {
  730. ring = &priv->rx_rings[i];
  731. ec->use_adaptive_rx_coalesce |= ring->dim.use_dim;
  732. }
  733. ring = &priv->rx_rings[DESC_INDEX];
  734. ec->use_adaptive_rx_coalesce |= ring->dim.use_dim;
  735. return 0;
  736. }
  737. static void bcmgenet_set_rx_coalesce(struct bcmgenet_rx_ring *ring,
  738. u32 usecs, u32 pkts)
  739. {
  740. struct bcmgenet_priv *priv = ring->priv;
  741. unsigned int i = ring->index;
  742. u32 reg;
  743. bcmgenet_rdma_ring_writel(priv, i, pkts, DMA_MBUF_DONE_THRESH);
  744. reg = bcmgenet_rdma_readl(priv, DMA_RING0_TIMEOUT + i);
  745. reg &= ~DMA_TIMEOUT_MASK;
  746. reg |= DIV_ROUND_UP(usecs * 1000, 8192);
  747. bcmgenet_rdma_writel(priv, reg, DMA_RING0_TIMEOUT + i);
  748. }
  749. static void bcmgenet_set_ring_rx_coalesce(struct bcmgenet_rx_ring *ring,
  750. struct ethtool_coalesce *ec)
  751. {
  752. struct dim_cq_moder moder;
  753. u32 usecs, pkts;
  754. ring->rx_coalesce_usecs = ec->rx_coalesce_usecs;
  755. ring->rx_max_coalesced_frames = ec->rx_max_coalesced_frames;
  756. usecs = ring->rx_coalesce_usecs;
  757. pkts = ring->rx_max_coalesced_frames;
  758. if (ec->use_adaptive_rx_coalesce && !ring->dim.use_dim) {
  759. moder = net_dim_get_def_rx_moderation(ring->dim.dim.mode);
  760. usecs = moder.usec;
  761. pkts = moder.pkts;
  762. }
  763. ring->dim.use_dim = ec->use_adaptive_rx_coalesce;
  764. bcmgenet_set_rx_coalesce(ring, usecs, pkts);
  765. }
  766. static int bcmgenet_set_coalesce(struct net_device *dev,
  767. struct ethtool_coalesce *ec,
  768. struct kernel_ethtool_coalesce *kernel_coal,
  769. struct netlink_ext_ack *extack)
  770. {
  771. struct bcmgenet_priv *priv = netdev_priv(dev);
  772. unsigned int i;
  773. /* Base system clock is 125Mhz, DMA timeout is this reference clock
  774. * divided by 1024, which yields roughly 8.192us, our maximum value
  775. * has to fit in the DMA_TIMEOUT_MASK (16 bits)
  776. */
  777. if (ec->tx_max_coalesced_frames > DMA_INTR_THRESHOLD_MASK ||
  778. ec->tx_max_coalesced_frames == 0 ||
  779. ec->rx_max_coalesced_frames > DMA_INTR_THRESHOLD_MASK ||
  780. ec->rx_coalesce_usecs > (DMA_TIMEOUT_MASK * 8) + 1)
  781. return -EINVAL;
  782. if (ec->rx_coalesce_usecs == 0 && ec->rx_max_coalesced_frames == 0)
  783. return -EINVAL;
  784. /* GENET TDMA hardware does not support a configurable timeout, but will
  785. * always generate an interrupt either after MBDONE packets have been
  786. * transmitted, or when the ring is empty.
  787. */
  788. /* Program all TX queues with the same values, as there is no
  789. * ethtool knob to do coalescing on a per-queue basis
  790. */
  791. for (i = 0; i < priv->hw_params->tx_queues; i++)
  792. bcmgenet_tdma_ring_writel(priv, i,
  793. ec->tx_max_coalesced_frames,
  794. DMA_MBUF_DONE_THRESH);
  795. bcmgenet_tdma_ring_writel(priv, DESC_INDEX,
  796. ec->tx_max_coalesced_frames,
  797. DMA_MBUF_DONE_THRESH);
  798. for (i = 0; i < priv->hw_params->rx_queues; i++)
  799. bcmgenet_set_ring_rx_coalesce(&priv->rx_rings[i], ec);
  800. bcmgenet_set_ring_rx_coalesce(&priv->rx_rings[DESC_INDEX], ec);
  801. return 0;
  802. }
  803. static void bcmgenet_get_pauseparam(struct net_device *dev,
  804. struct ethtool_pauseparam *epause)
  805. {
  806. struct bcmgenet_priv *priv;
  807. u32 umac_cmd;
  808. priv = netdev_priv(dev);
  809. epause->autoneg = priv->autoneg_pause;
  810. if (netif_carrier_ok(dev)) {
  811. /* report active state when link is up */
  812. umac_cmd = bcmgenet_umac_readl(priv, UMAC_CMD);
  813. epause->tx_pause = !(umac_cmd & CMD_TX_PAUSE_IGNORE);
  814. epause->rx_pause = !(umac_cmd & CMD_RX_PAUSE_IGNORE);
  815. } else {
  816. /* otherwise report stored settings */
  817. epause->tx_pause = priv->tx_pause;
  818. epause->rx_pause = priv->rx_pause;
  819. }
  820. }
  821. static int bcmgenet_set_pauseparam(struct net_device *dev,
  822. struct ethtool_pauseparam *epause)
  823. {
  824. struct bcmgenet_priv *priv = netdev_priv(dev);
  825. if (!dev->phydev)
  826. return -ENODEV;
  827. if (!phy_validate_pause(dev->phydev, epause))
  828. return -EINVAL;
  829. priv->autoneg_pause = !!epause->autoneg;
  830. priv->tx_pause = !!epause->tx_pause;
  831. priv->rx_pause = !!epause->rx_pause;
  832. bcmgenet_phy_pause_set(dev, priv->rx_pause, priv->tx_pause);
  833. return 0;
  834. }
  835. /* standard ethtool support functions. */
  836. enum bcmgenet_stat_type {
  837. BCMGENET_STAT_NETDEV = -1,
  838. BCMGENET_STAT_MIB_RX,
  839. BCMGENET_STAT_MIB_TX,
  840. BCMGENET_STAT_RUNT,
  841. BCMGENET_STAT_MISC,
  842. BCMGENET_STAT_SOFT,
  843. };
  844. struct bcmgenet_stats {
  845. char stat_string[ETH_GSTRING_LEN];
  846. int stat_sizeof;
  847. int stat_offset;
  848. enum bcmgenet_stat_type type;
  849. /* reg offset from UMAC base for misc counters */
  850. u16 reg_offset;
  851. };
  852. #define STAT_NETDEV(m) { \
  853. .stat_string = __stringify(m), \
  854. .stat_sizeof = sizeof(((struct net_device_stats *)0)->m), \
  855. .stat_offset = offsetof(struct net_device_stats, m), \
  856. .type = BCMGENET_STAT_NETDEV, \
  857. }
  858. #define STAT_GENET_MIB(str, m, _type) { \
  859. .stat_string = str, \
  860. .stat_sizeof = sizeof(((struct bcmgenet_priv *)0)->m), \
  861. .stat_offset = offsetof(struct bcmgenet_priv, m), \
  862. .type = _type, \
  863. }
  864. #define STAT_GENET_MIB_RX(str, m) STAT_GENET_MIB(str, m, BCMGENET_STAT_MIB_RX)
  865. #define STAT_GENET_MIB_TX(str, m) STAT_GENET_MIB(str, m, BCMGENET_STAT_MIB_TX)
  866. #define STAT_GENET_RUNT(str, m) STAT_GENET_MIB(str, m, BCMGENET_STAT_RUNT)
  867. #define STAT_GENET_SOFT_MIB(str, m) STAT_GENET_MIB(str, m, BCMGENET_STAT_SOFT)
  868. #define STAT_GENET_MISC(str, m, offset) { \
  869. .stat_string = str, \
  870. .stat_sizeof = sizeof(((struct bcmgenet_priv *)0)->m), \
  871. .stat_offset = offsetof(struct bcmgenet_priv, m), \
  872. .type = BCMGENET_STAT_MISC, \
  873. .reg_offset = offset, \
  874. }
  875. #define STAT_GENET_Q(num) \
  876. STAT_GENET_SOFT_MIB("txq" __stringify(num) "_packets", \
  877. tx_rings[num].packets), \
  878. STAT_GENET_SOFT_MIB("txq" __stringify(num) "_bytes", \
  879. tx_rings[num].bytes), \
  880. STAT_GENET_SOFT_MIB("rxq" __stringify(num) "_bytes", \
  881. rx_rings[num].bytes), \
  882. STAT_GENET_SOFT_MIB("rxq" __stringify(num) "_packets", \
  883. rx_rings[num].packets), \
  884. STAT_GENET_SOFT_MIB("rxq" __stringify(num) "_errors", \
  885. rx_rings[num].errors), \
  886. STAT_GENET_SOFT_MIB("rxq" __stringify(num) "_dropped", \
  887. rx_rings[num].dropped)
  888. /* There is a 0xC gap between the end of RX and beginning of TX stats and then
  889. * between the end of TX stats and the beginning of the RX RUNT
  890. */
  891. #define BCMGENET_STAT_OFFSET 0xc
  892. /* Hardware counters must be kept in sync because the order/offset
  893. * is important here (order in structure declaration = order in hardware)
  894. */
  895. static const struct bcmgenet_stats bcmgenet_gstrings_stats[] = {
  896. /* general stats */
  897. STAT_NETDEV(rx_packets),
  898. STAT_NETDEV(tx_packets),
  899. STAT_NETDEV(rx_bytes),
  900. STAT_NETDEV(tx_bytes),
  901. STAT_NETDEV(rx_errors),
  902. STAT_NETDEV(tx_errors),
  903. STAT_NETDEV(rx_dropped),
  904. STAT_NETDEV(tx_dropped),
  905. STAT_NETDEV(multicast),
  906. /* UniMAC RSV counters */
  907. STAT_GENET_MIB_RX("rx_64_octets", mib.rx.pkt_cnt.cnt_64),
  908. STAT_GENET_MIB_RX("rx_65_127_oct", mib.rx.pkt_cnt.cnt_127),
  909. STAT_GENET_MIB_RX("rx_128_255_oct", mib.rx.pkt_cnt.cnt_255),
  910. STAT_GENET_MIB_RX("rx_256_511_oct", mib.rx.pkt_cnt.cnt_511),
  911. STAT_GENET_MIB_RX("rx_512_1023_oct", mib.rx.pkt_cnt.cnt_1023),
  912. STAT_GENET_MIB_RX("rx_1024_1518_oct", mib.rx.pkt_cnt.cnt_1518),
  913. STAT_GENET_MIB_RX("rx_vlan_1519_1522_oct", mib.rx.pkt_cnt.cnt_mgv),
  914. STAT_GENET_MIB_RX("rx_1522_2047_oct", mib.rx.pkt_cnt.cnt_2047),
  915. STAT_GENET_MIB_RX("rx_2048_4095_oct", mib.rx.pkt_cnt.cnt_4095),
  916. STAT_GENET_MIB_RX("rx_4096_9216_oct", mib.rx.pkt_cnt.cnt_9216),
  917. STAT_GENET_MIB_RX("rx_pkts", mib.rx.pkt),
  918. STAT_GENET_MIB_RX("rx_bytes", mib.rx.bytes),
  919. STAT_GENET_MIB_RX("rx_multicast", mib.rx.mca),
  920. STAT_GENET_MIB_RX("rx_broadcast", mib.rx.bca),
  921. STAT_GENET_MIB_RX("rx_fcs", mib.rx.fcs),
  922. STAT_GENET_MIB_RX("rx_control", mib.rx.cf),
  923. STAT_GENET_MIB_RX("rx_pause", mib.rx.pf),
  924. STAT_GENET_MIB_RX("rx_unknown", mib.rx.uo),
  925. STAT_GENET_MIB_RX("rx_align", mib.rx.aln),
  926. STAT_GENET_MIB_RX("rx_outrange", mib.rx.flr),
  927. STAT_GENET_MIB_RX("rx_code", mib.rx.cde),
  928. STAT_GENET_MIB_RX("rx_carrier", mib.rx.fcr),
  929. STAT_GENET_MIB_RX("rx_oversize", mib.rx.ovr),
  930. STAT_GENET_MIB_RX("rx_jabber", mib.rx.jbr),
  931. STAT_GENET_MIB_RX("rx_mtu_err", mib.rx.mtue),
  932. STAT_GENET_MIB_RX("rx_good_pkts", mib.rx.pok),
  933. STAT_GENET_MIB_RX("rx_unicast", mib.rx.uc),
  934. STAT_GENET_MIB_RX("rx_ppp", mib.rx.ppp),
  935. STAT_GENET_MIB_RX("rx_crc", mib.rx.rcrc),
  936. /* UniMAC TSV counters */
  937. STAT_GENET_MIB_TX("tx_64_octets", mib.tx.pkt_cnt.cnt_64),
  938. STAT_GENET_MIB_TX("tx_65_127_oct", mib.tx.pkt_cnt.cnt_127),
  939. STAT_GENET_MIB_TX("tx_128_255_oct", mib.tx.pkt_cnt.cnt_255),
  940. STAT_GENET_MIB_TX("tx_256_511_oct", mib.tx.pkt_cnt.cnt_511),
  941. STAT_GENET_MIB_TX("tx_512_1023_oct", mib.tx.pkt_cnt.cnt_1023),
  942. STAT_GENET_MIB_TX("tx_1024_1518_oct", mib.tx.pkt_cnt.cnt_1518),
  943. STAT_GENET_MIB_TX("tx_vlan_1519_1522_oct", mib.tx.pkt_cnt.cnt_mgv),
  944. STAT_GENET_MIB_TX("tx_1522_2047_oct", mib.tx.pkt_cnt.cnt_2047),
  945. STAT_GENET_MIB_TX("tx_2048_4095_oct", mib.tx.pkt_cnt.cnt_4095),
  946. STAT_GENET_MIB_TX("tx_4096_9216_oct", mib.tx.pkt_cnt.cnt_9216),
  947. STAT_GENET_MIB_TX("tx_pkts", mib.tx.pkts),
  948. STAT_GENET_MIB_TX("tx_multicast", mib.tx.mca),
  949. STAT_GENET_MIB_TX("tx_broadcast", mib.tx.bca),
  950. STAT_GENET_MIB_TX("tx_pause", mib.tx.pf),
  951. STAT_GENET_MIB_TX("tx_control", mib.tx.cf),
  952. STAT_GENET_MIB_TX("tx_fcs_err", mib.tx.fcs),
  953. STAT_GENET_MIB_TX("tx_oversize", mib.tx.ovr),
  954. STAT_GENET_MIB_TX("tx_defer", mib.tx.drf),
  955. STAT_GENET_MIB_TX("tx_excess_defer", mib.tx.edf),
  956. STAT_GENET_MIB_TX("tx_single_col", mib.tx.scl),
  957. STAT_GENET_MIB_TX("tx_multi_col", mib.tx.mcl),
  958. STAT_GENET_MIB_TX("tx_late_col", mib.tx.lcl),
  959. STAT_GENET_MIB_TX("tx_excess_col", mib.tx.ecl),
  960. STAT_GENET_MIB_TX("tx_frags", mib.tx.frg),
  961. STAT_GENET_MIB_TX("tx_total_col", mib.tx.ncl),
  962. STAT_GENET_MIB_TX("tx_jabber", mib.tx.jbr),
  963. STAT_GENET_MIB_TX("tx_bytes", mib.tx.bytes),
  964. STAT_GENET_MIB_TX("tx_good_pkts", mib.tx.pok),
  965. STAT_GENET_MIB_TX("tx_unicast", mib.tx.uc),
  966. /* UniMAC RUNT counters */
  967. STAT_GENET_RUNT("rx_runt_pkts", mib.rx_runt_cnt),
  968. STAT_GENET_RUNT("rx_runt_valid_fcs", mib.rx_runt_fcs),
  969. STAT_GENET_RUNT("rx_runt_inval_fcs_align", mib.rx_runt_fcs_align),
  970. STAT_GENET_RUNT("rx_runt_bytes", mib.rx_runt_bytes),
  971. /* Misc UniMAC counters */
  972. STAT_GENET_MISC("rbuf_ovflow_cnt", mib.rbuf_ovflow_cnt,
  973. UMAC_RBUF_OVFL_CNT_V1),
  974. STAT_GENET_MISC("rbuf_err_cnt", mib.rbuf_err_cnt,
  975. UMAC_RBUF_ERR_CNT_V1),
  976. STAT_GENET_MISC("mdf_err_cnt", mib.mdf_err_cnt, UMAC_MDF_ERR_CNT),
  977. STAT_GENET_SOFT_MIB("alloc_rx_buff_failed", mib.alloc_rx_buff_failed),
  978. STAT_GENET_SOFT_MIB("rx_dma_failed", mib.rx_dma_failed),
  979. STAT_GENET_SOFT_MIB("tx_dma_failed", mib.tx_dma_failed),
  980. STAT_GENET_SOFT_MIB("tx_realloc_tsb", mib.tx_realloc_tsb),
  981. STAT_GENET_SOFT_MIB("tx_realloc_tsb_failed",
  982. mib.tx_realloc_tsb_failed),
  983. /* Per TX queues */
  984. STAT_GENET_Q(0),
  985. STAT_GENET_Q(1),
  986. STAT_GENET_Q(2),
  987. STAT_GENET_Q(3),
  988. STAT_GENET_Q(16),
  989. };
  990. #define BCMGENET_STATS_LEN ARRAY_SIZE(bcmgenet_gstrings_stats)
  991. static void bcmgenet_get_drvinfo(struct net_device *dev,
  992. struct ethtool_drvinfo *info)
  993. {
  994. strscpy(info->driver, "bcmgenet", sizeof(info->driver));
  995. }
  996. static int bcmgenet_get_sset_count(struct net_device *dev, int string_set)
  997. {
  998. switch (string_set) {
  999. case ETH_SS_STATS:
  1000. return BCMGENET_STATS_LEN;
  1001. default:
  1002. return -EOPNOTSUPP;
  1003. }
  1004. }
  1005. static void bcmgenet_get_strings(struct net_device *dev, u32 stringset,
  1006. u8 *data)
  1007. {
  1008. int i;
  1009. switch (stringset) {
  1010. case ETH_SS_STATS:
  1011. for (i = 0; i < BCMGENET_STATS_LEN; i++) {
  1012. memcpy(data + i * ETH_GSTRING_LEN,
  1013. bcmgenet_gstrings_stats[i].stat_string,
  1014. ETH_GSTRING_LEN);
  1015. }
  1016. break;
  1017. }
  1018. }
  1019. static u32 bcmgenet_update_stat_misc(struct bcmgenet_priv *priv, u16 offset)
  1020. {
  1021. u16 new_offset;
  1022. u32 val;
  1023. switch (offset) {
  1024. case UMAC_RBUF_OVFL_CNT_V1:
  1025. if (GENET_IS_V2(priv))
  1026. new_offset = RBUF_OVFL_CNT_V2;
  1027. else
  1028. new_offset = RBUF_OVFL_CNT_V3PLUS;
  1029. val = bcmgenet_rbuf_readl(priv, new_offset);
  1030. /* clear if overflowed */
  1031. if (val == ~0)
  1032. bcmgenet_rbuf_writel(priv, 0, new_offset);
  1033. break;
  1034. case UMAC_RBUF_ERR_CNT_V1:
  1035. if (GENET_IS_V2(priv))
  1036. new_offset = RBUF_ERR_CNT_V2;
  1037. else
  1038. new_offset = RBUF_ERR_CNT_V3PLUS;
  1039. val = bcmgenet_rbuf_readl(priv, new_offset);
  1040. /* clear if overflowed */
  1041. if (val == ~0)
  1042. bcmgenet_rbuf_writel(priv, 0, new_offset);
  1043. break;
  1044. default:
  1045. val = bcmgenet_umac_readl(priv, offset);
  1046. /* clear if overflowed */
  1047. if (val == ~0)
  1048. bcmgenet_umac_writel(priv, 0, offset);
  1049. break;
  1050. }
  1051. return val;
  1052. }
  1053. static void bcmgenet_update_mib_counters(struct bcmgenet_priv *priv)
  1054. {
  1055. int i, j = 0;
  1056. for (i = 0; i < BCMGENET_STATS_LEN; i++) {
  1057. const struct bcmgenet_stats *s;
  1058. u8 offset = 0;
  1059. u32 val = 0;
  1060. char *p;
  1061. s = &bcmgenet_gstrings_stats[i];
  1062. switch (s->type) {
  1063. case BCMGENET_STAT_NETDEV:
  1064. case BCMGENET_STAT_SOFT:
  1065. continue;
  1066. case BCMGENET_STAT_RUNT:
  1067. offset += BCMGENET_STAT_OFFSET;
  1068. fallthrough;
  1069. case BCMGENET_STAT_MIB_TX:
  1070. offset += BCMGENET_STAT_OFFSET;
  1071. fallthrough;
  1072. case BCMGENET_STAT_MIB_RX:
  1073. val = bcmgenet_umac_readl(priv,
  1074. UMAC_MIB_START + j + offset);
  1075. offset = 0; /* Reset Offset */
  1076. break;
  1077. case BCMGENET_STAT_MISC:
  1078. if (GENET_IS_V1(priv)) {
  1079. val = bcmgenet_umac_readl(priv, s->reg_offset);
  1080. /* clear if overflowed */
  1081. if (val == ~0)
  1082. bcmgenet_umac_writel(priv, 0,
  1083. s->reg_offset);
  1084. } else {
  1085. val = bcmgenet_update_stat_misc(priv,
  1086. s->reg_offset);
  1087. }
  1088. break;
  1089. }
  1090. j += s->stat_sizeof;
  1091. p = (char *)priv + s->stat_offset;
  1092. *(u32 *)p = val;
  1093. }
  1094. }
  1095. static void bcmgenet_get_ethtool_stats(struct net_device *dev,
  1096. struct ethtool_stats *stats,
  1097. u64 *data)
  1098. {
  1099. struct bcmgenet_priv *priv = netdev_priv(dev);
  1100. int i;
  1101. if (netif_running(dev))
  1102. bcmgenet_update_mib_counters(priv);
  1103. dev->netdev_ops->ndo_get_stats(dev);
  1104. for (i = 0; i < BCMGENET_STATS_LEN; i++) {
  1105. const struct bcmgenet_stats *s;
  1106. char *p;
  1107. s = &bcmgenet_gstrings_stats[i];
  1108. if (s->type == BCMGENET_STAT_NETDEV)
  1109. p = (char *)&dev->stats;
  1110. else
  1111. p = (char *)priv;
  1112. p += s->stat_offset;
  1113. if (sizeof(unsigned long) != sizeof(u32) &&
  1114. s->stat_sizeof == sizeof(unsigned long))
  1115. data[i] = *(unsigned long *)p;
  1116. else
  1117. data[i] = *(u32 *)p;
  1118. }
  1119. }
  1120. void bcmgenet_eee_enable_set(struct net_device *dev, bool enable,
  1121. bool tx_lpi_enabled)
  1122. {
  1123. struct bcmgenet_priv *priv = netdev_priv(dev);
  1124. u32 off = priv->hw_params->tbuf_offset + TBUF_ENERGY_CTRL;
  1125. u32 reg;
  1126. if (enable && !priv->clk_eee_enabled) {
  1127. clk_prepare_enable(priv->clk_eee);
  1128. priv->clk_eee_enabled = true;
  1129. }
  1130. reg = bcmgenet_umac_readl(priv, UMAC_EEE_CTRL);
  1131. if (enable)
  1132. reg |= EEE_EN;
  1133. else
  1134. reg &= ~EEE_EN;
  1135. bcmgenet_umac_writel(priv, reg, UMAC_EEE_CTRL);
  1136. /* Enable EEE and switch to a 27Mhz clock automatically */
  1137. reg = bcmgenet_readl(priv->base + off);
  1138. if (tx_lpi_enabled)
  1139. reg |= TBUF_EEE_EN | TBUF_PM_EN;
  1140. else
  1141. reg &= ~(TBUF_EEE_EN | TBUF_PM_EN);
  1142. bcmgenet_writel(reg, priv->base + off);
  1143. /* Do the same for thing for RBUF */
  1144. reg = bcmgenet_rbuf_readl(priv, RBUF_ENERGY_CTRL);
  1145. if (enable)
  1146. reg |= RBUF_EEE_EN | RBUF_PM_EN;
  1147. else
  1148. reg &= ~(RBUF_EEE_EN | RBUF_PM_EN);
  1149. bcmgenet_rbuf_writel(priv, reg, RBUF_ENERGY_CTRL);
  1150. if (!enable && priv->clk_eee_enabled) {
  1151. clk_disable_unprepare(priv->clk_eee);
  1152. priv->clk_eee_enabled = false;
  1153. }
  1154. priv->eee.eee_enabled = enable;
  1155. priv->eee.tx_lpi_enabled = tx_lpi_enabled;
  1156. }
  1157. static int bcmgenet_get_eee(struct net_device *dev, struct ethtool_keee *e)
  1158. {
  1159. struct bcmgenet_priv *priv = netdev_priv(dev);
  1160. struct ethtool_keee *p = &priv->eee;
  1161. if (GENET_IS_V1(priv))
  1162. return -EOPNOTSUPP;
  1163. if (!dev->phydev)
  1164. return -ENODEV;
  1165. e->tx_lpi_enabled = p->tx_lpi_enabled;
  1166. e->tx_lpi_timer = bcmgenet_umac_readl(priv, UMAC_EEE_LPI_TIMER);
  1167. return phy_ethtool_get_eee(dev->phydev, e);
  1168. }
  1169. static int bcmgenet_set_eee(struct net_device *dev, struct ethtool_keee *e)
  1170. {
  1171. struct bcmgenet_priv *priv = netdev_priv(dev);
  1172. struct ethtool_keee *p = &priv->eee;
  1173. bool active;
  1174. if (GENET_IS_V1(priv))
  1175. return -EOPNOTSUPP;
  1176. if (!dev->phydev)
  1177. return -ENODEV;
  1178. p->eee_enabled = e->eee_enabled;
  1179. if (!p->eee_enabled) {
  1180. bcmgenet_eee_enable_set(dev, false, false);
  1181. } else {
  1182. active = phy_init_eee(dev->phydev, false) >= 0;
  1183. bcmgenet_umac_writel(priv, e->tx_lpi_timer, UMAC_EEE_LPI_TIMER);
  1184. bcmgenet_eee_enable_set(dev, active, e->tx_lpi_enabled);
  1185. }
  1186. return phy_ethtool_set_eee(dev->phydev, e);
  1187. }
  1188. static int bcmgenet_validate_flow(struct net_device *dev,
  1189. struct ethtool_rxnfc *cmd)
  1190. {
  1191. struct ethtool_usrip4_spec *l4_mask;
  1192. struct ethhdr *eth_mask;
  1193. if (cmd->fs.location >= MAX_NUM_OF_FS_RULES &&
  1194. cmd->fs.location != RX_CLS_LOC_ANY) {
  1195. netdev_err(dev, "rxnfc: Invalid location (%d)\n",
  1196. cmd->fs.location);
  1197. return -EINVAL;
  1198. }
  1199. switch (cmd->fs.flow_type & ~(FLOW_EXT | FLOW_MAC_EXT)) {
  1200. case IP_USER_FLOW:
  1201. l4_mask = &cmd->fs.m_u.usr_ip4_spec;
  1202. /* don't allow mask which isn't valid */
  1203. if (VALIDATE_MASK(l4_mask->ip4src) ||
  1204. VALIDATE_MASK(l4_mask->ip4dst) ||
  1205. VALIDATE_MASK(l4_mask->l4_4_bytes) ||
  1206. VALIDATE_MASK(l4_mask->proto) ||
  1207. VALIDATE_MASK(l4_mask->ip_ver) ||
  1208. VALIDATE_MASK(l4_mask->tos)) {
  1209. netdev_err(dev, "rxnfc: Unsupported mask\n");
  1210. return -EINVAL;
  1211. }
  1212. break;
  1213. case ETHER_FLOW:
  1214. eth_mask = &cmd->fs.m_u.ether_spec;
  1215. /* don't allow mask which isn't valid */
  1216. if (VALIDATE_MASK(eth_mask->h_dest) ||
  1217. VALIDATE_MASK(eth_mask->h_source) ||
  1218. VALIDATE_MASK(eth_mask->h_proto)) {
  1219. netdev_err(dev, "rxnfc: Unsupported mask\n");
  1220. return -EINVAL;
  1221. }
  1222. break;
  1223. default:
  1224. netdev_err(dev, "rxnfc: Unsupported flow type (0x%x)\n",
  1225. cmd->fs.flow_type);
  1226. return -EINVAL;
  1227. }
  1228. if ((cmd->fs.flow_type & FLOW_EXT)) {
  1229. /* don't allow mask which isn't valid */
  1230. if (VALIDATE_MASK(cmd->fs.m_ext.vlan_etype) ||
  1231. VALIDATE_MASK(cmd->fs.m_ext.vlan_tci)) {
  1232. netdev_err(dev, "rxnfc: Unsupported mask\n");
  1233. return -EINVAL;
  1234. }
  1235. if (cmd->fs.m_ext.data[0] || cmd->fs.m_ext.data[1]) {
  1236. netdev_err(dev, "rxnfc: user-def not supported\n");
  1237. return -EINVAL;
  1238. }
  1239. }
  1240. if ((cmd->fs.flow_type & FLOW_MAC_EXT)) {
  1241. /* don't allow mask which isn't valid */
  1242. if (VALIDATE_MASK(cmd->fs.m_ext.h_dest)) {
  1243. netdev_err(dev, "rxnfc: Unsupported mask\n");
  1244. return -EINVAL;
  1245. }
  1246. }
  1247. return 0;
  1248. }
  1249. static int bcmgenet_insert_flow(struct net_device *dev,
  1250. struct ethtool_rxnfc *cmd)
  1251. {
  1252. struct bcmgenet_priv *priv = netdev_priv(dev);
  1253. struct bcmgenet_rxnfc_rule *loc_rule;
  1254. int err, i;
  1255. if (priv->hw_params->hfb_filter_size < 128) {
  1256. netdev_err(dev, "rxnfc: Not supported by this device\n");
  1257. return -EINVAL;
  1258. }
  1259. if (cmd->fs.ring_cookie > priv->hw_params->rx_queues &&
  1260. cmd->fs.ring_cookie != RX_CLS_FLOW_WAKE) {
  1261. netdev_err(dev, "rxnfc: Unsupported action (%llu)\n",
  1262. cmd->fs.ring_cookie);
  1263. return -EINVAL;
  1264. }
  1265. err = bcmgenet_validate_flow(dev, cmd);
  1266. if (err)
  1267. return err;
  1268. if (cmd->fs.location == RX_CLS_LOC_ANY) {
  1269. list_for_each_entry(loc_rule, &priv->rxnfc_list, list) {
  1270. cmd->fs.location = loc_rule->fs.location;
  1271. err = memcmp(&loc_rule->fs, &cmd->fs,
  1272. sizeof(struct ethtool_rx_flow_spec));
  1273. if (!err)
  1274. /* rule exists so return current location */
  1275. return 0;
  1276. }
  1277. for (i = 0; i < MAX_NUM_OF_FS_RULES; i++) {
  1278. loc_rule = &priv->rxnfc_rules[i];
  1279. if (loc_rule->state == BCMGENET_RXNFC_STATE_UNUSED) {
  1280. cmd->fs.location = i;
  1281. break;
  1282. }
  1283. }
  1284. if (i == MAX_NUM_OF_FS_RULES) {
  1285. cmd->fs.location = RX_CLS_LOC_ANY;
  1286. return -ENOSPC;
  1287. }
  1288. } else {
  1289. loc_rule = &priv->rxnfc_rules[cmd->fs.location];
  1290. }
  1291. if (loc_rule->state == BCMGENET_RXNFC_STATE_ENABLED)
  1292. bcmgenet_hfb_disable_filter(priv, cmd->fs.location);
  1293. if (loc_rule->state != BCMGENET_RXNFC_STATE_UNUSED) {
  1294. list_del(&loc_rule->list);
  1295. bcmgenet_hfb_clear_filter(priv, cmd->fs.location);
  1296. }
  1297. loc_rule->state = BCMGENET_RXNFC_STATE_UNUSED;
  1298. memcpy(&loc_rule->fs, &cmd->fs,
  1299. sizeof(struct ethtool_rx_flow_spec));
  1300. bcmgenet_hfb_create_rxnfc_filter(priv, loc_rule);
  1301. list_add_tail(&loc_rule->list, &priv->rxnfc_list);
  1302. return 0;
  1303. }
  1304. static int bcmgenet_delete_flow(struct net_device *dev,
  1305. struct ethtool_rxnfc *cmd)
  1306. {
  1307. struct bcmgenet_priv *priv = netdev_priv(dev);
  1308. struct bcmgenet_rxnfc_rule *rule;
  1309. int err = 0;
  1310. if (cmd->fs.location >= MAX_NUM_OF_FS_RULES)
  1311. return -EINVAL;
  1312. rule = &priv->rxnfc_rules[cmd->fs.location];
  1313. if (rule->state == BCMGENET_RXNFC_STATE_UNUSED) {
  1314. err = -ENOENT;
  1315. goto out;
  1316. }
  1317. if (rule->state == BCMGENET_RXNFC_STATE_ENABLED)
  1318. bcmgenet_hfb_disable_filter(priv, cmd->fs.location);
  1319. if (rule->state != BCMGENET_RXNFC_STATE_UNUSED) {
  1320. list_del(&rule->list);
  1321. bcmgenet_hfb_clear_filter(priv, cmd->fs.location);
  1322. }
  1323. rule->state = BCMGENET_RXNFC_STATE_UNUSED;
  1324. memset(&rule->fs, 0, sizeof(struct ethtool_rx_flow_spec));
  1325. out:
  1326. return err;
  1327. }
  1328. static int bcmgenet_set_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd)
  1329. {
  1330. struct bcmgenet_priv *priv = netdev_priv(dev);
  1331. int err = 0;
  1332. switch (cmd->cmd) {
  1333. case ETHTOOL_SRXCLSRLINS:
  1334. err = bcmgenet_insert_flow(dev, cmd);
  1335. break;
  1336. case ETHTOOL_SRXCLSRLDEL:
  1337. err = bcmgenet_delete_flow(dev, cmd);
  1338. break;
  1339. default:
  1340. netdev_warn(priv->dev, "Unsupported ethtool command. (%d)\n",
  1341. cmd->cmd);
  1342. return -EINVAL;
  1343. }
  1344. return err;
  1345. }
  1346. static int bcmgenet_get_flow(struct net_device *dev, struct ethtool_rxnfc *cmd,
  1347. int loc)
  1348. {
  1349. struct bcmgenet_priv *priv = netdev_priv(dev);
  1350. struct bcmgenet_rxnfc_rule *rule;
  1351. int err = 0;
  1352. if (loc < 0 || loc >= MAX_NUM_OF_FS_RULES)
  1353. return -EINVAL;
  1354. rule = &priv->rxnfc_rules[loc];
  1355. if (rule->state == BCMGENET_RXNFC_STATE_UNUSED)
  1356. err = -ENOENT;
  1357. else
  1358. memcpy(&cmd->fs, &rule->fs,
  1359. sizeof(struct ethtool_rx_flow_spec));
  1360. return err;
  1361. }
  1362. static int bcmgenet_get_num_flows(struct bcmgenet_priv *priv)
  1363. {
  1364. struct list_head *pos;
  1365. int res = 0;
  1366. list_for_each(pos, &priv->rxnfc_list)
  1367. res++;
  1368. return res;
  1369. }
  1370. static int bcmgenet_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd,
  1371. u32 *rule_locs)
  1372. {
  1373. struct bcmgenet_priv *priv = netdev_priv(dev);
  1374. struct bcmgenet_rxnfc_rule *rule;
  1375. int err = 0;
  1376. int i = 0;
  1377. switch (cmd->cmd) {
  1378. case ETHTOOL_GRXRINGS:
  1379. cmd->data = priv->hw_params->rx_queues ?: 1;
  1380. break;
  1381. case ETHTOOL_GRXCLSRLCNT:
  1382. cmd->rule_cnt = bcmgenet_get_num_flows(priv);
  1383. cmd->data = MAX_NUM_OF_FS_RULES | RX_CLS_LOC_SPECIAL;
  1384. break;
  1385. case ETHTOOL_GRXCLSRULE:
  1386. err = bcmgenet_get_flow(dev, cmd, cmd->fs.location);
  1387. break;
  1388. case ETHTOOL_GRXCLSRLALL:
  1389. list_for_each_entry(rule, &priv->rxnfc_list, list)
  1390. if (i < cmd->rule_cnt)
  1391. rule_locs[i++] = rule->fs.location;
  1392. cmd->rule_cnt = i;
  1393. cmd->data = MAX_NUM_OF_FS_RULES;
  1394. break;
  1395. default:
  1396. err = -EOPNOTSUPP;
  1397. break;
  1398. }
  1399. return err;
  1400. }
  1401. /* standard ethtool support functions. */
  1402. static const struct ethtool_ops bcmgenet_ethtool_ops = {
  1403. .supported_coalesce_params = ETHTOOL_COALESCE_RX_USECS |
  1404. ETHTOOL_COALESCE_MAX_FRAMES |
  1405. ETHTOOL_COALESCE_USE_ADAPTIVE_RX,
  1406. .begin = bcmgenet_begin,
  1407. .complete = bcmgenet_complete,
  1408. .get_strings = bcmgenet_get_strings,
  1409. .get_sset_count = bcmgenet_get_sset_count,
  1410. .get_ethtool_stats = bcmgenet_get_ethtool_stats,
  1411. .get_drvinfo = bcmgenet_get_drvinfo,
  1412. .get_link = ethtool_op_get_link,
  1413. .get_msglevel = bcmgenet_get_msglevel,
  1414. .set_msglevel = bcmgenet_set_msglevel,
  1415. .get_wol = bcmgenet_get_wol,
  1416. .set_wol = bcmgenet_set_wol,
  1417. .get_eee = bcmgenet_get_eee,
  1418. .set_eee = bcmgenet_set_eee,
  1419. .nway_reset = phy_ethtool_nway_reset,
  1420. .get_coalesce = bcmgenet_get_coalesce,
  1421. .set_coalesce = bcmgenet_set_coalesce,
  1422. .get_link_ksettings = bcmgenet_get_link_ksettings,
  1423. .set_link_ksettings = bcmgenet_set_link_ksettings,
  1424. .get_ts_info = ethtool_op_get_ts_info,
  1425. .get_rxnfc = bcmgenet_get_rxnfc,
  1426. .set_rxnfc = bcmgenet_set_rxnfc,
  1427. .get_pauseparam = bcmgenet_get_pauseparam,
  1428. .set_pauseparam = bcmgenet_set_pauseparam,
  1429. };
  1430. /* Power down the unimac, based on mode. */
  1431. static int bcmgenet_power_down(struct bcmgenet_priv *priv,
  1432. enum bcmgenet_power_mode mode)
  1433. {
  1434. int ret = 0;
  1435. u32 reg;
  1436. switch (mode) {
  1437. case GENET_POWER_CABLE_SENSE:
  1438. phy_detach(priv->dev->phydev);
  1439. break;
  1440. case GENET_POWER_WOL_MAGIC:
  1441. ret = bcmgenet_wol_power_down_cfg(priv, mode);
  1442. break;
  1443. case GENET_POWER_PASSIVE:
  1444. /* Power down LED */
  1445. if (priv->hw_params->flags & GENET_HAS_EXT) {
  1446. reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT);
  1447. if (GENET_IS_V5(priv) && !priv->ephy_16nm)
  1448. reg |= EXT_PWR_DOWN_PHY_EN |
  1449. EXT_PWR_DOWN_PHY_RD |
  1450. EXT_PWR_DOWN_PHY_SD |
  1451. EXT_PWR_DOWN_PHY_RX |
  1452. EXT_PWR_DOWN_PHY_TX |
  1453. EXT_IDDQ_GLBL_PWR;
  1454. else
  1455. reg |= EXT_PWR_DOWN_PHY;
  1456. reg |= (EXT_PWR_DOWN_DLL | EXT_PWR_DOWN_BIAS);
  1457. bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT);
  1458. bcmgenet_phy_power_set(priv->dev, false);
  1459. }
  1460. break;
  1461. default:
  1462. break;
  1463. }
  1464. return ret;
  1465. }
  1466. static void bcmgenet_power_up(struct bcmgenet_priv *priv,
  1467. enum bcmgenet_power_mode mode)
  1468. {
  1469. u32 reg;
  1470. if (!(priv->hw_params->flags & GENET_HAS_EXT))
  1471. return;
  1472. reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT);
  1473. switch (mode) {
  1474. case GENET_POWER_PASSIVE:
  1475. reg &= ~(EXT_PWR_DOWN_DLL | EXT_PWR_DOWN_BIAS |
  1476. EXT_ENERGY_DET_MASK);
  1477. if (GENET_IS_V5(priv) && !priv->ephy_16nm) {
  1478. reg &= ~(EXT_PWR_DOWN_PHY_EN |
  1479. EXT_PWR_DOWN_PHY_RD |
  1480. EXT_PWR_DOWN_PHY_SD |
  1481. EXT_PWR_DOWN_PHY_RX |
  1482. EXT_PWR_DOWN_PHY_TX |
  1483. EXT_IDDQ_GLBL_PWR);
  1484. reg |= EXT_PHY_RESET;
  1485. bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT);
  1486. mdelay(1);
  1487. reg &= ~EXT_PHY_RESET;
  1488. } else {
  1489. reg &= ~EXT_PWR_DOWN_PHY;
  1490. reg |= EXT_PWR_DN_EN_LD;
  1491. }
  1492. bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT);
  1493. bcmgenet_phy_power_set(priv->dev, true);
  1494. break;
  1495. case GENET_POWER_CABLE_SENSE:
  1496. /* enable APD */
  1497. if (!GENET_IS_V5(priv)) {
  1498. reg |= EXT_PWR_DN_EN_LD;
  1499. bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT);
  1500. }
  1501. break;
  1502. case GENET_POWER_WOL_MAGIC:
  1503. bcmgenet_wol_power_up_cfg(priv, mode);
  1504. return;
  1505. default:
  1506. break;
  1507. }
  1508. }
  1509. static struct enet_cb *bcmgenet_get_txcb(struct bcmgenet_priv *priv,
  1510. struct bcmgenet_tx_ring *ring)
  1511. {
  1512. struct enet_cb *tx_cb_ptr;
  1513. tx_cb_ptr = ring->cbs;
  1514. tx_cb_ptr += ring->write_ptr - ring->cb_ptr;
  1515. /* Advancing local write pointer */
  1516. if (ring->write_ptr == ring->end_ptr)
  1517. ring->write_ptr = ring->cb_ptr;
  1518. else
  1519. ring->write_ptr++;
  1520. return tx_cb_ptr;
  1521. }
  1522. static struct enet_cb *bcmgenet_put_txcb(struct bcmgenet_priv *priv,
  1523. struct bcmgenet_tx_ring *ring)
  1524. {
  1525. struct enet_cb *tx_cb_ptr;
  1526. tx_cb_ptr = ring->cbs;
  1527. tx_cb_ptr += ring->write_ptr - ring->cb_ptr;
  1528. /* Rewinding local write pointer */
  1529. if (ring->write_ptr == ring->cb_ptr)
  1530. ring->write_ptr = ring->end_ptr;
  1531. else
  1532. ring->write_ptr--;
  1533. return tx_cb_ptr;
  1534. }
  1535. static inline void bcmgenet_rx_ring16_int_disable(struct bcmgenet_rx_ring *ring)
  1536. {
  1537. bcmgenet_intrl2_0_writel(ring->priv, UMAC_IRQ_RXDMA_DONE,
  1538. INTRL2_CPU_MASK_SET);
  1539. }
  1540. static inline void bcmgenet_rx_ring16_int_enable(struct bcmgenet_rx_ring *ring)
  1541. {
  1542. bcmgenet_intrl2_0_writel(ring->priv, UMAC_IRQ_RXDMA_DONE,
  1543. INTRL2_CPU_MASK_CLEAR);
  1544. }
  1545. static inline void bcmgenet_rx_ring_int_disable(struct bcmgenet_rx_ring *ring)
  1546. {
  1547. bcmgenet_intrl2_1_writel(ring->priv,
  1548. 1 << (UMAC_IRQ1_RX_INTR_SHIFT + ring->index),
  1549. INTRL2_CPU_MASK_SET);
  1550. }
  1551. static inline void bcmgenet_rx_ring_int_enable(struct bcmgenet_rx_ring *ring)
  1552. {
  1553. bcmgenet_intrl2_1_writel(ring->priv,
  1554. 1 << (UMAC_IRQ1_RX_INTR_SHIFT + ring->index),
  1555. INTRL2_CPU_MASK_CLEAR);
  1556. }
  1557. static inline void bcmgenet_tx_ring16_int_disable(struct bcmgenet_tx_ring *ring)
  1558. {
  1559. bcmgenet_intrl2_0_writel(ring->priv, UMAC_IRQ_TXDMA_DONE,
  1560. INTRL2_CPU_MASK_SET);
  1561. }
  1562. static inline void bcmgenet_tx_ring16_int_enable(struct bcmgenet_tx_ring *ring)
  1563. {
  1564. bcmgenet_intrl2_0_writel(ring->priv, UMAC_IRQ_TXDMA_DONE,
  1565. INTRL2_CPU_MASK_CLEAR);
  1566. }
  1567. static inline void bcmgenet_tx_ring_int_enable(struct bcmgenet_tx_ring *ring)
  1568. {
  1569. bcmgenet_intrl2_1_writel(ring->priv, 1 << ring->index,
  1570. INTRL2_CPU_MASK_CLEAR);
  1571. }
  1572. static inline void bcmgenet_tx_ring_int_disable(struct bcmgenet_tx_ring *ring)
  1573. {
  1574. bcmgenet_intrl2_1_writel(ring->priv, 1 << ring->index,
  1575. INTRL2_CPU_MASK_SET);
  1576. }
  1577. /* Simple helper to free a transmit control block's resources
  1578. * Returns an skb when the last transmit control block associated with the
  1579. * skb is freed. The skb should be freed by the caller if necessary.
  1580. */
  1581. static struct sk_buff *bcmgenet_free_tx_cb(struct device *dev,
  1582. struct enet_cb *cb)
  1583. {
  1584. struct sk_buff *skb;
  1585. skb = cb->skb;
  1586. if (skb) {
  1587. cb->skb = NULL;
  1588. if (cb == GENET_CB(skb)->first_cb)
  1589. dma_unmap_single(dev, dma_unmap_addr(cb, dma_addr),
  1590. dma_unmap_len(cb, dma_len),
  1591. DMA_TO_DEVICE);
  1592. else
  1593. dma_unmap_page(dev, dma_unmap_addr(cb, dma_addr),
  1594. dma_unmap_len(cb, dma_len),
  1595. DMA_TO_DEVICE);
  1596. dma_unmap_addr_set(cb, dma_addr, 0);
  1597. if (cb == GENET_CB(skb)->last_cb)
  1598. return skb;
  1599. } else if (dma_unmap_addr(cb, dma_addr)) {
  1600. dma_unmap_page(dev,
  1601. dma_unmap_addr(cb, dma_addr),
  1602. dma_unmap_len(cb, dma_len),
  1603. DMA_TO_DEVICE);
  1604. dma_unmap_addr_set(cb, dma_addr, 0);
  1605. }
  1606. return NULL;
  1607. }
  1608. /* Simple helper to free a receive control block's resources */
  1609. static struct sk_buff *bcmgenet_free_rx_cb(struct device *dev,
  1610. struct enet_cb *cb)
  1611. {
  1612. struct sk_buff *skb;
  1613. skb = cb->skb;
  1614. cb->skb = NULL;
  1615. if (dma_unmap_addr(cb, dma_addr)) {
  1616. dma_unmap_single(dev, dma_unmap_addr(cb, dma_addr),
  1617. dma_unmap_len(cb, dma_len), DMA_FROM_DEVICE);
  1618. dma_unmap_addr_set(cb, dma_addr, 0);
  1619. }
  1620. return skb;
  1621. }
  1622. /* Unlocked version of the reclaim routine */
  1623. static unsigned int __bcmgenet_tx_reclaim(struct net_device *dev,
  1624. struct bcmgenet_tx_ring *ring)
  1625. {
  1626. struct bcmgenet_priv *priv = netdev_priv(dev);
  1627. unsigned int txbds_processed = 0;
  1628. unsigned int bytes_compl = 0;
  1629. unsigned int pkts_compl = 0;
  1630. unsigned int txbds_ready;
  1631. unsigned int c_index;
  1632. struct sk_buff *skb;
  1633. /* Clear status before servicing to reduce spurious interrupts */
  1634. if (ring->index == DESC_INDEX)
  1635. bcmgenet_intrl2_0_writel(priv, UMAC_IRQ_TXDMA_DONE,
  1636. INTRL2_CPU_CLEAR);
  1637. else
  1638. bcmgenet_intrl2_1_writel(priv, (1 << ring->index),
  1639. INTRL2_CPU_CLEAR);
  1640. /* Compute how many buffers are transmitted since last xmit call */
  1641. c_index = bcmgenet_tdma_ring_readl(priv, ring->index, TDMA_CONS_INDEX)
  1642. & DMA_C_INDEX_MASK;
  1643. txbds_ready = (c_index - ring->c_index) & DMA_C_INDEX_MASK;
  1644. netif_dbg(priv, tx_done, dev,
  1645. "%s ring=%d old_c_index=%u c_index=%u txbds_ready=%u\n",
  1646. __func__, ring->index, ring->c_index, c_index, txbds_ready);
  1647. /* Reclaim transmitted buffers */
  1648. while (txbds_processed < txbds_ready) {
  1649. skb = bcmgenet_free_tx_cb(&priv->pdev->dev,
  1650. &priv->tx_cbs[ring->clean_ptr]);
  1651. if (skb) {
  1652. pkts_compl++;
  1653. bytes_compl += GENET_CB(skb)->bytes_sent;
  1654. dev_consume_skb_any(skb);
  1655. }
  1656. txbds_processed++;
  1657. if (likely(ring->clean_ptr < ring->end_ptr))
  1658. ring->clean_ptr++;
  1659. else
  1660. ring->clean_ptr = ring->cb_ptr;
  1661. }
  1662. ring->free_bds += txbds_processed;
  1663. ring->c_index = c_index;
  1664. ring->packets += pkts_compl;
  1665. ring->bytes += bytes_compl;
  1666. netdev_tx_completed_queue(netdev_get_tx_queue(dev, ring->queue),
  1667. pkts_compl, bytes_compl);
  1668. return txbds_processed;
  1669. }
  1670. static unsigned int bcmgenet_tx_reclaim(struct net_device *dev,
  1671. struct bcmgenet_tx_ring *ring)
  1672. {
  1673. unsigned int released;
  1674. spin_lock_bh(&ring->lock);
  1675. released = __bcmgenet_tx_reclaim(dev, ring);
  1676. spin_unlock_bh(&ring->lock);
  1677. return released;
  1678. }
  1679. static int bcmgenet_tx_poll(struct napi_struct *napi, int budget)
  1680. {
  1681. struct bcmgenet_tx_ring *ring =
  1682. container_of(napi, struct bcmgenet_tx_ring, napi);
  1683. unsigned int work_done = 0;
  1684. struct netdev_queue *txq;
  1685. spin_lock(&ring->lock);
  1686. work_done = __bcmgenet_tx_reclaim(ring->priv->dev, ring);
  1687. if (ring->free_bds > (MAX_SKB_FRAGS + 1)) {
  1688. txq = netdev_get_tx_queue(ring->priv->dev, ring->queue);
  1689. netif_tx_wake_queue(txq);
  1690. }
  1691. spin_unlock(&ring->lock);
  1692. if (work_done == 0) {
  1693. napi_complete(napi);
  1694. ring->int_enable(ring);
  1695. return 0;
  1696. }
  1697. return budget;
  1698. }
  1699. static void bcmgenet_tx_reclaim_all(struct net_device *dev)
  1700. {
  1701. struct bcmgenet_priv *priv = netdev_priv(dev);
  1702. int i;
  1703. if (netif_is_multiqueue(dev)) {
  1704. for (i = 0; i < priv->hw_params->tx_queues; i++)
  1705. bcmgenet_tx_reclaim(dev, &priv->tx_rings[i]);
  1706. }
  1707. bcmgenet_tx_reclaim(dev, &priv->tx_rings[DESC_INDEX]);
  1708. }
  1709. /* Reallocate the SKB to put enough headroom in front of it and insert
  1710. * the transmit checksum offsets in the descriptors
  1711. */
  1712. static struct sk_buff *bcmgenet_add_tsb(struct net_device *dev,
  1713. struct sk_buff *skb)
  1714. {
  1715. struct bcmgenet_priv *priv = netdev_priv(dev);
  1716. struct status_64 *status = NULL;
  1717. struct sk_buff *new_skb;
  1718. u16 offset;
  1719. u8 ip_proto;
  1720. __be16 ip_ver;
  1721. u32 tx_csum_info;
  1722. if (unlikely(skb_headroom(skb) < sizeof(*status))) {
  1723. /* If 64 byte status block enabled, must make sure skb has
  1724. * enough headroom for us to insert 64B status block.
  1725. */
  1726. new_skb = skb_realloc_headroom(skb, sizeof(*status));
  1727. if (!new_skb) {
  1728. dev_kfree_skb_any(skb);
  1729. priv->mib.tx_realloc_tsb_failed++;
  1730. dev->stats.tx_dropped++;
  1731. return NULL;
  1732. }
  1733. dev_consume_skb_any(skb);
  1734. skb = new_skb;
  1735. priv->mib.tx_realloc_tsb++;
  1736. }
  1737. skb_push(skb, sizeof(*status));
  1738. status = (struct status_64 *)skb->data;
  1739. if (skb->ip_summed == CHECKSUM_PARTIAL) {
  1740. ip_ver = skb->protocol;
  1741. switch (ip_ver) {
  1742. case htons(ETH_P_IP):
  1743. ip_proto = ip_hdr(skb)->protocol;
  1744. break;
  1745. case htons(ETH_P_IPV6):
  1746. ip_proto = ipv6_hdr(skb)->nexthdr;
  1747. break;
  1748. default:
  1749. /* don't use UDP flag */
  1750. ip_proto = 0;
  1751. break;
  1752. }
  1753. offset = skb_checksum_start_offset(skb) - sizeof(*status);
  1754. tx_csum_info = (offset << STATUS_TX_CSUM_START_SHIFT) |
  1755. (offset + skb->csum_offset) |
  1756. STATUS_TX_CSUM_LV;
  1757. /* Set the special UDP flag for UDP */
  1758. if (ip_proto == IPPROTO_UDP)
  1759. tx_csum_info |= STATUS_TX_CSUM_PROTO_UDP;
  1760. status->tx_csum_info = tx_csum_info;
  1761. }
  1762. return skb;
  1763. }
  1764. static void bcmgenet_hide_tsb(struct sk_buff *skb)
  1765. {
  1766. __skb_pull(skb, sizeof(struct status_64));
  1767. }
  1768. static netdev_tx_t bcmgenet_xmit(struct sk_buff *skb, struct net_device *dev)
  1769. {
  1770. struct bcmgenet_priv *priv = netdev_priv(dev);
  1771. struct device *kdev = &priv->pdev->dev;
  1772. struct bcmgenet_tx_ring *ring = NULL;
  1773. struct enet_cb *tx_cb_ptr;
  1774. struct netdev_queue *txq;
  1775. int nr_frags, index;
  1776. dma_addr_t mapping;
  1777. unsigned int size;
  1778. skb_frag_t *frag;
  1779. u32 len_stat;
  1780. int ret;
  1781. int i;
  1782. index = skb_get_queue_mapping(skb);
  1783. /* Mapping strategy:
  1784. * queue_mapping = 0, unclassified, packet xmited through ring16
  1785. * queue_mapping = 1, goes to ring 0. (highest priority queue
  1786. * queue_mapping = 2, goes to ring 1.
  1787. * queue_mapping = 3, goes to ring 2.
  1788. * queue_mapping = 4, goes to ring 3.
  1789. */
  1790. if (index == 0)
  1791. index = DESC_INDEX;
  1792. else
  1793. index -= 1;
  1794. ring = &priv->tx_rings[index];
  1795. txq = netdev_get_tx_queue(dev, ring->queue);
  1796. nr_frags = skb_shinfo(skb)->nr_frags;
  1797. spin_lock(&ring->lock);
  1798. if (ring->free_bds <= (nr_frags + 1)) {
  1799. if (!netif_tx_queue_stopped(txq))
  1800. netif_tx_stop_queue(txq);
  1801. ret = NETDEV_TX_BUSY;
  1802. goto out;
  1803. }
  1804. /* Retain how many bytes will be sent on the wire, without TSB inserted
  1805. * by transmit checksum offload
  1806. */
  1807. GENET_CB(skb)->bytes_sent = skb->len;
  1808. /* add the Transmit Status Block */
  1809. skb = bcmgenet_add_tsb(dev, skb);
  1810. if (!skb) {
  1811. ret = NETDEV_TX_OK;
  1812. goto out;
  1813. }
  1814. for (i = 0; i <= nr_frags; i++) {
  1815. tx_cb_ptr = bcmgenet_get_txcb(priv, ring);
  1816. BUG_ON(!tx_cb_ptr);
  1817. if (!i) {
  1818. /* Transmit single SKB or head of fragment list */
  1819. GENET_CB(skb)->first_cb = tx_cb_ptr;
  1820. size = skb_headlen(skb);
  1821. mapping = dma_map_single(kdev, skb->data, size,
  1822. DMA_TO_DEVICE);
  1823. } else {
  1824. /* xmit fragment */
  1825. frag = &skb_shinfo(skb)->frags[i - 1];
  1826. size = skb_frag_size(frag);
  1827. mapping = skb_frag_dma_map(kdev, frag, 0, size,
  1828. DMA_TO_DEVICE);
  1829. }
  1830. ret = dma_mapping_error(kdev, mapping);
  1831. if (ret) {
  1832. priv->mib.tx_dma_failed++;
  1833. netif_err(priv, tx_err, dev, "Tx DMA map failed\n");
  1834. ret = NETDEV_TX_OK;
  1835. goto out_unmap_frags;
  1836. }
  1837. dma_unmap_addr_set(tx_cb_ptr, dma_addr, mapping);
  1838. dma_unmap_len_set(tx_cb_ptr, dma_len, size);
  1839. tx_cb_ptr->skb = skb;
  1840. len_stat = (size << DMA_BUFLENGTH_SHIFT) |
  1841. (priv->hw_params->qtag_mask << DMA_TX_QTAG_SHIFT);
  1842. /* Note: if we ever change from DMA_TX_APPEND_CRC below we
  1843. * will need to restore software padding of "runt" packets
  1844. */
  1845. len_stat |= DMA_TX_APPEND_CRC;
  1846. if (!i) {
  1847. len_stat |= DMA_SOP;
  1848. if (skb->ip_summed == CHECKSUM_PARTIAL)
  1849. len_stat |= DMA_TX_DO_CSUM;
  1850. }
  1851. if (i == nr_frags)
  1852. len_stat |= DMA_EOP;
  1853. dmadesc_set(priv, tx_cb_ptr->bd_addr, mapping, len_stat);
  1854. }
  1855. GENET_CB(skb)->last_cb = tx_cb_ptr;
  1856. bcmgenet_hide_tsb(skb);
  1857. skb_tx_timestamp(skb);
  1858. /* Decrement total BD count and advance our write pointer */
  1859. ring->free_bds -= nr_frags + 1;
  1860. ring->prod_index += nr_frags + 1;
  1861. ring->prod_index &= DMA_P_INDEX_MASK;
  1862. netdev_tx_sent_queue(txq, GENET_CB(skb)->bytes_sent);
  1863. if (ring->free_bds <= (MAX_SKB_FRAGS + 1))
  1864. netif_tx_stop_queue(txq);
  1865. if (!netdev_xmit_more() || netif_xmit_stopped(txq))
  1866. /* Packets are ready, update producer index */
  1867. bcmgenet_tdma_ring_writel(priv, ring->index,
  1868. ring->prod_index, TDMA_PROD_INDEX);
  1869. out:
  1870. spin_unlock(&ring->lock);
  1871. return ret;
  1872. out_unmap_frags:
  1873. /* Back up for failed control block mapping */
  1874. bcmgenet_put_txcb(priv, ring);
  1875. /* Unmap successfully mapped control blocks */
  1876. while (i-- > 0) {
  1877. tx_cb_ptr = bcmgenet_put_txcb(priv, ring);
  1878. bcmgenet_free_tx_cb(kdev, tx_cb_ptr);
  1879. }
  1880. dev_kfree_skb(skb);
  1881. goto out;
  1882. }
  1883. static struct sk_buff *bcmgenet_rx_refill(struct bcmgenet_priv *priv,
  1884. struct enet_cb *cb)
  1885. {
  1886. struct device *kdev = &priv->pdev->dev;
  1887. struct sk_buff *skb;
  1888. struct sk_buff *rx_skb;
  1889. dma_addr_t mapping;
  1890. /* Allocate a new Rx skb */
  1891. skb = __netdev_alloc_skb(priv->dev, priv->rx_buf_len + SKB_ALIGNMENT,
  1892. GFP_ATOMIC | __GFP_NOWARN);
  1893. if (!skb) {
  1894. priv->mib.alloc_rx_buff_failed++;
  1895. netif_err(priv, rx_err, priv->dev,
  1896. "%s: Rx skb allocation failed\n", __func__);
  1897. return NULL;
  1898. }
  1899. /* DMA-map the new Rx skb */
  1900. mapping = dma_map_single(kdev, skb->data, priv->rx_buf_len,
  1901. DMA_FROM_DEVICE);
  1902. if (dma_mapping_error(kdev, mapping)) {
  1903. priv->mib.rx_dma_failed++;
  1904. dev_kfree_skb_any(skb);
  1905. netif_err(priv, rx_err, priv->dev,
  1906. "%s: Rx skb DMA mapping failed\n", __func__);
  1907. return NULL;
  1908. }
  1909. /* Grab the current Rx skb from the ring and DMA-unmap it */
  1910. rx_skb = bcmgenet_free_rx_cb(kdev, cb);
  1911. /* Put the new Rx skb on the ring */
  1912. cb->skb = skb;
  1913. dma_unmap_addr_set(cb, dma_addr, mapping);
  1914. dma_unmap_len_set(cb, dma_len, priv->rx_buf_len);
  1915. dmadesc_set_addr(priv, cb->bd_addr, mapping);
  1916. /* Return the current Rx skb to caller */
  1917. return rx_skb;
  1918. }
  1919. /* bcmgenet_desc_rx - descriptor based rx process.
  1920. * this could be called from bottom half, or from NAPI polling method.
  1921. */
  1922. static unsigned int bcmgenet_desc_rx(struct bcmgenet_rx_ring *ring,
  1923. unsigned int budget)
  1924. {
  1925. struct bcmgenet_priv *priv = ring->priv;
  1926. struct net_device *dev = priv->dev;
  1927. struct enet_cb *cb;
  1928. struct sk_buff *skb;
  1929. u32 dma_length_status;
  1930. unsigned long dma_flag;
  1931. int len;
  1932. unsigned int rxpktprocessed = 0, rxpkttoprocess;
  1933. unsigned int bytes_processed = 0;
  1934. unsigned int p_index, mask;
  1935. unsigned int discards;
  1936. /* Clear status before servicing to reduce spurious interrupts */
  1937. if (ring->index == DESC_INDEX) {
  1938. bcmgenet_intrl2_0_writel(priv, UMAC_IRQ_RXDMA_DONE,
  1939. INTRL2_CPU_CLEAR);
  1940. } else {
  1941. mask = 1 << (UMAC_IRQ1_RX_INTR_SHIFT + ring->index);
  1942. bcmgenet_intrl2_1_writel(priv,
  1943. mask,
  1944. INTRL2_CPU_CLEAR);
  1945. }
  1946. p_index = bcmgenet_rdma_ring_readl(priv, ring->index, RDMA_PROD_INDEX);
  1947. discards = (p_index >> DMA_P_INDEX_DISCARD_CNT_SHIFT) &
  1948. DMA_P_INDEX_DISCARD_CNT_MASK;
  1949. if (discards > ring->old_discards) {
  1950. discards = discards - ring->old_discards;
  1951. ring->errors += discards;
  1952. ring->old_discards += discards;
  1953. /* Clear HW register when we reach 75% of maximum 0xFFFF */
  1954. if (ring->old_discards >= 0xC000) {
  1955. ring->old_discards = 0;
  1956. bcmgenet_rdma_ring_writel(priv, ring->index, 0,
  1957. RDMA_PROD_INDEX);
  1958. }
  1959. }
  1960. p_index &= DMA_P_INDEX_MASK;
  1961. rxpkttoprocess = (p_index - ring->c_index) & DMA_C_INDEX_MASK;
  1962. netif_dbg(priv, rx_status, dev,
  1963. "RDMA: rxpkttoprocess=%d\n", rxpkttoprocess);
  1964. while ((rxpktprocessed < rxpkttoprocess) &&
  1965. (rxpktprocessed < budget)) {
  1966. struct status_64 *status;
  1967. __be16 rx_csum;
  1968. cb = &priv->rx_cbs[ring->read_ptr];
  1969. skb = bcmgenet_rx_refill(priv, cb);
  1970. if (unlikely(!skb)) {
  1971. ring->dropped++;
  1972. goto next;
  1973. }
  1974. status = (struct status_64 *)skb->data;
  1975. dma_length_status = status->length_status;
  1976. if (dev->features & NETIF_F_RXCSUM) {
  1977. rx_csum = (__force __be16)(status->rx_csum & 0xffff);
  1978. if (rx_csum) {
  1979. skb->csum = (__force __wsum)ntohs(rx_csum);
  1980. skb->ip_summed = CHECKSUM_COMPLETE;
  1981. }
  1982. }
  1983. /* DMA flags and length are still valid no matter how
  1984. * we got the Receive Status Vector (64B RSB or register)
  1985. */
  1986. dma_flag = dma_length_status & 0xffff;
  1987. len = dma_length_status >> DMA_BUFLENGTH_SHIFT;
  1988. netif_dbg(priv, rx_status, dev,
  1989. "%s:p_ind=%d c_ind=%d read_ptr=%d len_stat=0x%08x\n",
  1990. __func__, p_index, ring->c_index,
  1991. ring->read_ptr, dma_length_status);
  1992. if (unlikely(len > RX_BUF_LENGTH)) {
  1993. netif_err(priv, rx_status, dev, "oversized packet\n");
  1994. dev->stats.rx_length_errors++;
  1995. dev->stats.rx_errors++;
  1996. dev_kfree_skb_any(skb);
  1997. goto next;
  1998. }
  1999. if (unlikely(!(dma_flag & DMA_EOP) || !(dma_flag & DMA_SOP))) {
  2000. netif_err(priv, rx_status, dev,
  2001. "dropping fragmented packet!\n");
  2002. ring->errors++;
  2003. dev_kfree_skb_any(skb);
  2004. goto next;
  2005. }
  2006. /* report errors */
  2007. if (unlikely(dma_flag & (DMA_RX_CRC_ERROR |
  2008. DMA_RX_OV |
  2009. DMA_RX_NO |
  2010. DMA_RX_LG |
  2011. DMA_RX_RXER))) {
  2012. netif_err(priv, rx_status, dev, "dma_flag=0x%x\n",
  2013. (unsigned int)dma_flag);
  2014. if (dma_flag & DMA_RX_CRC_ERROR)
  2015. dev->stats.rx_crc_errors++;
  2016. if (dma_flag & DMA_RX_OV)
  2017. dev->stats.rx_over_errors++;
  2018. if (dma_flag & DMA_RX_NO)
  2019. dev->stats.rx_frame_errors++;
  2020. if (dma_flag & DMA_RX_LG)
  2021. dev->stats.rx_length_errors++;
  2022. dev->stats.rx_errors++;
  2023. dev_kfree_skb_any(skb);
  2024. goto next;
  2025. } /* error packet */
  2026. skb_put(skb, len);
  2027. /* remove RSB and hardware 2bytes added for IP alignment */
  2028. skb_pull(skb, 66);
  2029. len -= 66;
  2030. if (priv->crc_fwd_en) {
  2031. skb_trim(skb, len - ETH_FCS_LEN);
  2032. len -= ETH_FCS_LEN;
  2033. }
  2034. bytes_processed += len;
  2035. /*Finish setting up the received SKB and send it to the kernel*/
  2036. skb->protocol = eth_type_trans(skb, priv->dev);
  2037. ring->packets++;
  2038. ring->bytes += len;
  2039. if (dma_flag & DMA_RX_MULT)
  2040. dev->stats.multicast++;
  2041. /* Notify kernel */
  2042. napi_gro_receive(&ring->napi, skb);
  2043. netif_dbg(priv, rx_status, dev, "pushed up to kernel\n");
  2044. next:
  2045. rxpktprocessed++;
  2046. if (likely(ring->read_ptr < ring->end_ptr))
  2047. ring->read_ptr++;
  2048. else
  2049. ring->read_ptr = ring->cb_ptr;
  2050. ring->c_index = (ring->c_index + 1) & DMA_C_INDEX_MASK;
  2051. bcmgenet_rdma_ring_writel(priv, ring->index, ring->c_index, RDMA_CONS_INDEX);
  2052. }
  2053. ring->dim.bytes = bytes_processed;
  2054. ring->dim.packets = rxpktprocessed;
  2055. return rxpktprocessed;
  2056. }
  2057. /* Rx NAPI polling method */
  2058. static int bcmgenet_rx_poll(struct napi_struct *napi, int budget)
  2059. {
  2060. struct bcmgenet_rx_ring *ring = container_of(napi,
  2061. struct bcmgenet_rx_ring, napi);
  2062. struct dim_sample dim_sample = {};
  2063. unsigned int work_done;
  2064. work_done = bcmgenet_desc_rx(ring, budget);
  2065. if (work_done < budget) {
  2066. napi_complete_done(napi, work_done);
  2067. ring->int_enable(ring);
  2068. }
  2069. if (ring->dim.use_dim) {
  2070. dim_update_sample(ring->dim.event_ctr, ring->dim.packets,
  2071. ring->dim.bytes, &dim_sample);
  2072. net_dim(&ring->dim.dim, dim_sample);
  2073. }
  2074. return work_done;
  2075. }
  2076. static void bcmgenet_dim_work(struct work_struct *work)
  2077. {
  2078. struct dim *dim = container_of(work, struct dim, work);
  2079. struct bcmgenet_net_dim *ndim =
  2080. container_of(dim, struct bcmgenet_net_dim, dim);
  2081. struct bcmgenet_rx_ring *ring =
  2082. container_of(ndim, struct bcmgenet_rx_ring, dim);
  2083. struct dim_cq_moder cur_profile =
  2084. net_dim_get_rx_moderation(dim->mode, dim->profile_ix);
  2085. bcmgenet_set_rx_coalesce(ring, cur_profile.usec, cur_profile.pkts);
  2086. dim->state = DIM_START_MEASURE;
  2087. }
  2088. /* Assign skb to RX DMA descriptor. */
  2089. static int bcmgenet_alloc_rx_buffers(struct bcmgenet_priv *priv,
  2090. struct bcmgenet_rx_ring *ring)
  2091. {
  2092. struct enet_cb *cb;
  2093. struct sk_buff *skb;
  2094. int i;
  2095. netif_dbg(priv, hw, priv->dev, "%s\n", __func__);
  2096. /* loop here for each buffer needing assign */
  2097. for (i = 0; i < ring->size; i++) {
  2098. cb = ring->cbs + i;
  2099. skb = bcmgenet_rx_refill(priv, cb);
  2100. if (skb)
  2101. dev_consume_skb_any(skb);
  2102. if (!cb->skb)
  2103. return -ENOMEM;
  2104. }
  2105. return 0;
  2106. }
  2107. static void bcmgenet_free_rx_buffers(struct bcmgenet_priv *priv)
  2108. {
  2109. struct sk_buff *skb;
  2110. struct enet_cb *cb;
  2111. int i;
  2112. for (i = 0; i < priv->num_rx_bds; i++) {
  2113. cb = &priv->rx_cbs[i];
  2114. skb = bcmgenet_free_rx_cb(&priv->pdev->dev, cb);
  2115. if (skb)
  2116. dev_consume_skb_any(skb);
  2117. }
  2118. }
  2119. static void umac_enable_set(struct bcmgenet_priv *priv, u32 mask, bool enable)
  2120. {
  2121. u32 reg;
  2122. spin_lock_bh(&priv->reg_lock);
  2123. reg = bcmgenet_umac_readl(priv, UMAC_CMD);
  2124. if (reg & CMD_SW_RESET) {
  2125. spin_unlock_bh(&priv->reg_lock);
  2126. return;
  2127. }
  2128. if (enable)
  2129. reg |= mask;
  2130. else
  2131. reg &= ~mask;
  2132. bcmgenet_umac_writel(priv, reg, UMAC_CMD);
  2133. spin_unlock_bh(&priv->reg_lock);
  2134. /* UniMAC stops on a packet boundary, wait for a full-size packet
  2135. * to be processed
  2136. */
  2137. if (enable == 0)
  2138. usleep_range(1000, 2000);
  2139. }
  2140. static void reset_umac(struct bcmgenet_priv *priv)
  2141. {
  2142. /* 7358a0/7552a0: bad default in RBUF_FLUSH_CTRL.umac_sw_rst */
  2143. bcmgenet_rbuf_ctrl_set(priv, 0);
  2144. udelay(10);
  2145. /* issue soft reset and disable MAC while updating its registers */
  2146. spin_lock_bh(&priv->reg_lock);
  2147. bcmgenet_umac_writel(priv, CMD_SW_RESET, UMAC_CMD);
  2148. udelay(2);
  2149. spin_unlock_bh(&priv->reg_lock);
  2150. }
  2151. static void bcmgenet_intr_disable(struct bcmgenet_priv *priv)
  2152. {
  2153. /* Mask all interrupts.*/
  2154. bcmgenet_intrl2_0_writel(priv, 0xFFFFFFFF, INTRL2_CPU_MASK_SET);
  2155. bcmgenet_intrl2_0_writel(priv, 0xFFFFFFFF, INTRL2_CPU_CLEAR);
  2156. bcmgenet_intrl2_1_writel(priv, 0xFFFFFFFF, INTRL2_CPU_MASK_SET);
  2157. bcmgenet_intrl2_1_writel(priv, 0xFFFFFFFF, INTRL2_CPU_CLEAR);
  2158. }
  2159. static void bcmgenet_link_intr_enable(struct bcmgenet_priv *priv)
  2160. {
  2161. u32 int0_enable = 0;
  2162. /* Monitor cable plug/unplugged event for internal PHY, external PHY
  2163. * and MoCA PHY
  2164. */
  2165. if (priv->internal_phy) {
  2166. int0_enable |= UMAC_IRQ_LINK_EVENT;
  2167. if (GENET_IS_V1(priv) || GENET_IS_V2(priv) || GENET_IS_V3(priv))
  2168. int0_enable |= UMAC_IRQ_PHY_DET_R;
  2169. } else if (priv->ext_phy) {
  2170. int0_enable |= UMAC_IRQ_LINK_EVENT;
  2171. } else if (priv->phy_interface == PHY_INTERFACE_MODE_MOCA) {
  2172. if (priv->hw_params->flags & GENET_HAS_MOCA_LINK_DET)
  2173. int0_enable |= UMAC_IRQ_LINK_EVENT;
  2174. }
  2175. bcmgenet_intrl2_0_writel(priv, int0_enable, INTRL2_CPU_MASK_CLEAR);
  2176. }
  2177. static void init_umac(struct bcmgenet_priv *priv)
  2178. {
  2179. struct device *kdev = &priv->pdev->dev;
  2180. u32 reg;
  2181. u32 int0_enable = 0;
  2182. dev_dbg(&priv->pdev->dev, "bcmgenet: init_umac\n");
  2183. reset_umac(priv);
  2184. /* clear tx/rx counter */
  2185. bcmgenet_umac_writel(priv,
  2186. MIB_RESET_RX | MIB_RESET_TX | MIB_RESET_RUNT,
  2187. UMAC_MIB_CTRL);
  2188. bcmgenet_umac_writel(priv, 0, UMAC_MIB_CTRL);
  2189. bcmgenet_umac_writel(priv, ENET_MAX_MTU_SIZE, UMAC_MAX_FRAME_LEN);
  2190. /* init tx registers, enable TSB */
  2191. reg = bcmgenet_tbuf_ctrl_get(priv);
  2192. reg |= TBUF_64B_EN;
  2193. bcmgenet_tbuf_ctrl_set(priv, reg);
  2194. /* init rx registers, enable ip header optimization and RSB */
  2195. reg = bcmgenet_rbuf_readl(priv, RBUF_CTRL);
  2196. reg |= RBUF_ALIGN_2B | RBUF_64B_EN;
  2197. bcmgenet_rbuf_writel(priv, reg, RBUF_CTRL);
  2198. /* enable rx checksumming */
  2199. reg = bcmgenet_rbuf_readl(priv, RBUF_CHK_CTRL);
  2200. reg |= RBUF_RXCHK_EN | RBUF_L3_PARSE_DIS;
  2201. /* If UniMAC forwards CRC, we need to skip over it to get
  2202. * a valid CHK bit to be set in the per-packet status word
  2203. */
  2204. if (priv->crc_fwd_en)
  2205. reg |= RBUF_SKIP_FCS;
  2206. else
  2207. reg &= ~RBUF_SKIP_FCS;
  2208. bcmgenet_rbuf_writel(priv, reg, RBUF_CHK_CTRL);
  2209. if (!GENET_IS_V1(priv) && !GENET_IS_V2(priv))
  2210. bcmgenet_rbuf_writel(priv, 1, RBUF_TBUF_SIZE_CTRL);
  2211. bcmgenet_intr_disable(priv);
  2212. /* Configure backpressure vectors for MoCA */
  2213. if (priv->phy_interface == PHY_INTERFACE_MODE_MOCA) {
  2214. reg = bcmgenet_bp_mc_get(priv);
  2215. reg |= BIT(priv->hw_params->bp_in_en_shift);
  2216. /* bp_mask: back pressure mask */
  2217. if (netif_is_multiqueue(priv->dev))
  2218. reg |= priv->hw_params->bp_in_mask;
  2219. else
  2220. reg &= ~priv->hw_params->bp_in_mask;
  2221. bcmgenet_bp_mc_set(priv, reg);
  2222. }
  2223. /* Enable MDIO interrupts on GENET v3+ */
  2224. if (priv->hw_params->flags & GENET_HAS_MDIO_INTR)
  2225. int0_enable |= (UMAC_IRQ_MDIO_DONE | UMAC_IRQ_MDIO_ERROR);
  2226. bcmgenet_intrl2_0_writel(priv, int0_enable, INTRL2_CPU_MASK_CLEAR);
  2227. dev_dbg(kdev, "done init umac\n");
  2228. }
  2229. static void bcmgenet_init_dim(struct bcmgenet_rx_ring *ring,
  2230. void (*cb)(struct work_struct *work))
  2231. {
  2232. struct bcmgenet_net_dim *dim = &ring->dim;
  2233. INIT_WORK(&dim->dim.work, cb);
  2234. dim->dim.mode = DIM_CQ_PERIOD_MODE_START_FROM_EQE;
  2235. dim->event_ctr = 0;
  2236. dim->packets = 0;
  2237. dim->bytes = 0;
  2238. }
  2239. static void bcmgenet_init_rx_coalesce(struct bcmgenet_rx_ring *ring)
  2240. {
  2241. struct bcmgenet_net_dim *dim = &ring->dim;
  2242. struct dim_cq_moder moder;
  2243. u32 usecs, pkts;
  2244. usecs = ring->rx_coalesce_usecs;
  2245. pkts = ring->rx_max_coalesced_frames;
  2246. /* If DIM was enabled, re-apply default parameters */
  2247. if (dim->use_dim) {
  2248. moder = net_dim_get_def_rx_moderation(dim->dim.mode);
  2249. usecs = moder.usec;
  2250. pkts = moder.pkts;
  2251. }
  2252. bcmgenet_set_rx_coalesce(ring, usecs, pkts);
  2253. }
  2254. /* Initialize a Tx ring along with corresponding hardware registers */
  2255. static void bcmgenet_init_tx_ring(struct bcmgenet_priv *priv,
  2256. unsigned int index, unsigned int size,
  2257. unsigned int start_ptr, unsigned int end_ptr)
  2258. {
  2259. struct bcmgenet_tx_ring *ring = &priv->tx_rings[index];
  2260. u32 words_per_bd = WORDS_PER_BD(priv);
  2261. u32 flow_period_val = 0;
  2262. spin_lock_init(&ring->lock);
  2263. ring->priv = priv;
  2264. ring->index = index;
  2265. if (index == DESC_INDEX) {
  2266. ring->queue = 0;
  2267. ring->int_enable = bcmgenet_tx_ring16_int_enable;
  2268. ring->int_disable = bcmgenet_tx_ring16_int_disable;
  2269. } else {
  2270. ring->queue = index + 1;
  2271. ring->int_enable = bcmgenet_tx_ring_int_enable;
  2272. ring->int_disable = bcmgenet_tx_ring_int_disable;
  2273. }
  2274. ring->cbs = priv->tx_cbs + start_ptr;
  2275. ring->size = size;
  2276. ring->clean_ptr = start_ptr;
  2277. ring->c_index = 0;
  2278. ring->free_bds = size;
  2279. ring->write_ptr = start_ptr;
  2280. ring->cb_ptr = start_ptr;
  2281. ring->end_ptr = end_ptr - 1;
  2282. ring->prod_index = 0;
  2283. /* Set flow period for ring != 16 */
  2284. if (index != DESC_INDEX)
  2285. flow_period_val = ENET_MAX_MTU_SIZE << 16;
  2286. bcmgenet_tdma_ring_writel(priv, index, 0, TDMA_PROD_INDEX);
  2287. bcmgenet_tdma_ring_writel(priv, index, 0, TDMA_CONS_INDEX);
  2288. bcmgenet_tdma_ring_writel(priv, index, 1, DMA_MBUF_DONE_THRESH);
  2289. /* Disable rate control for now */
  2290. bcmgenet_tdma_ring_writel(priv, index, flow_period_val,
  2291. TDMA_FLOW_PERIOD);
  2292. bcmgenet_tdma_ring_writel(priv, index,
  2293. ((size << DMA_RING_SIZE_SHIFT) |
  2294. RX_BUF_LENGTH), DMA_RING_BUF_SIZE);
  2295. /* Set start and end address, read and write pointers */
  2296. bcmgenet_tdma_ring_writel(priv, index, start_ptr * words_per_bd,
  2297. DMA_START_ADDR);
  2298. bcmgenet_tdma_ring_writel(priv, index, start_ptr * words_per_bd,
  2299. TDMA_READ_PTR);
  2300. bcmgenet_tdma_ring_writel(priv, index, start_ptr * words_per_bd,
  2301. TDMA_WRITE_PTR);
  2302. bcmgenet_tdma_ring_writel(priv, index, end_ptr * words_per_bd - 1,
  2303. DMA_END_ADDR);
  2304. /* Initialize Tx NAPI */
  2305. netif_napi_add_tx(priv->dev, &ring->napi, bcmgenet_tx_poll);
  2306. }
  2307. /* Initialize a RDMA ring */
  2308. static int bcmgenet_init_rx_ring(struct bcmgenet_priv *priv,
  2309. unsigned int index, unsigned int size,
  2310. unsigned int start_ptr, unsigned int end_ptr)
  2311. {
  2312. struct bcmgenet_rx_ring *ring = &priv->rx_rings[index];
  2313. u32 words_per_bd = WORDS_PER_BD(priv);
  2314. int ret;
  2315. ring->priv = priv;
  2316. ring->index = index;
  2317. if (index == DESC_INDEX) {
  2318. ring->int_enable = bcmgenet_rx_ring16_int_enable;
  2319. ring->int_disable = bcmgenet_rx_ring16_int_disable;
  2320. } else {
  2321. ring->int_enable = bcmgenet_rx_ring_int_enable;
  2322. ring->int_disable = bcmgenet_rx_ring_int_disable;
  2323. }
  2324. ring->cbs = priv->rx_cbs + start_ptr;
  2325. ring->size = size;
  2326. ring->c_index = 0;
  2327. ring->read_ptr = start_ptr;
  2328. ring->cb_ptr = start_ptr;
  2329. ring->end_ptr = end_ptr - 1;
  2330. ret = bcmgenet_alloc_rx_buffers(priv, ring);
  2331. if (ret)
  2332. return ret;
  2333. bcmgenet_init_dim(ring, bcmgenet_dim_work);
  2334. bcmgenet_init_rx_coalesce(ring);
  2335. /* Initialize Rx NAPI */
  2336. netif_napi_add(priv->dev, &ring->napi, bcmgenet_rx_poll);
  2337. bcmgenet_rdma_ring_writel(priv, index, 0, RDMA_PROD_INDEX);
  2338. bcmgenet_rdma_ring_writel(priv, index, 0, RDMA_CONS_INDEX);
  2339. bcmgenet_rdma_ring_writel(priv, index,
  2340. ((size << DMA_RING_SIZE_SHIFT) |
  2341. RX_BUF_LENGTH), DMA_RING_BUF_SIZE);
  2342. bcmgenet_rdma_ring_writel(priv, index,
  2343. (DMA_FC_THRESH_LO <<
  2344. DMA_XOFF_THRESHOLD_SHIFT) |
  2345. DMA_FC_THRESH_HI, RDMA_XON_XOFF_THRESH);
  2346. /* Set start and end address, read and write pointers */
  2347. bcmgenet_rdma_ring_writel(priv, index, start_ptr * words_per_bd,
  2348. DMA_START_ADDR);
  2349. bcmgenet_rdma_ring_writel(priv, index, start_ptr * words_per_bd,
  2350. RDMA_READ_PTR);
  2351. bcmgenet_rdma_ring_writel(priv, index, start_ptr * words_per_bd,
  2352. RDMA_WRITE_PTR);
  2353. bcmgenet_rdma_ring_writel(priv, index, end_ptr * words_per_bd - 1,
  2354. DMA_END_ADDR);
  2355. return ret;
  2356. }
  2357. static void bcmgenet_enable_tx_napi(struct bcmgenet_priv *priv)
  2358. {
  2359. unsigned int i;
  2360. struct bcmgenet_tx_ring *ring;
  2361. for (i = 0; i < priv->hw_params->tx_queues; ++i) {
  2362. ring = &priv->tx_rings[i];
  2363. napi_enable(&ring->napi);
  2364. ring->int_enable(ring);
  2365. }
  2366. ring = &priv->tx_rings[DESC_INDEX];
  2367. napi_enable(&ring->napi);
  2368. ring->int_enable(ring);
  2369. }
  2370. static void bcmgenet_disable_tx_napi(struct bcmgenet_priv *priv)
  2371. {
  2372. unsigned int i;
  2373. struct bcmgenet_tx_ring *ring;
  2374. for (i = 0; i < priv->hw_params->tx_queues; ++i) {
  2375. ring = &priv->tx_rings[i];
  2376. napi_disable(&ring->napi);
  2377. }
  2378. ring = &priv->tx_rings[DESC_INDEX];
  2379. napi_disable(&ring->napi);
  2380. }
  2381. static void bcmgenet_fini_tx_napi(struct bcmgenet_priv *priv)
  2382. {
  2383. unsigned int i;
  2384. struct bcmgenet_tx_ring *ring;
  2385. for (i = 0; i < priv->hw_params->tx_queues; ++i) {
  2386. ring = &priv->tx_rings[i];
  2387. netif_napi_del(&ring->napi);
  2388. }
  2389. ring = &priv->tx_rings[DESC_INDEX];
  2390. netif_napi_del(&ring->napi);
  2391. }
  2392. /* Initialize Tx queues
  2393. *
  2394. * Queues 0-3 are priority-based, each one has 32 descriptors,
  2395. * with queue 0 being the highest priority queue.
  2396. *
  2397. * Queue 16 is the default Tx queue with
  2398. * GENET_Q16_TX_BD_CNT = 256 - 4 * 32 = 128 descriptors.
  2399. *
  2400. * The transmit control block pool is then partitioned as follows:
  2401. * - Tx queue 0 uses tx_cbs[0..31]
  2402. * - Tx queue 1 uses tx_cbs[32..63]
  2403. * - Tx queue 2 uses tx_cbs[64..95]
  2404. * - Tx queue 3 uses tx_cbs[96..127]
  2405. * - Tx queue 16 uses tx_cbs[128..255]
  2406. */
  2407. static void bcmgenet_init_tx_queues(struct net_device *dev)
  2408. {
  2409. struct bcmgenet_priv *priv = netdev_priv(dev);
  2410. u32 i, dma_enable;
  2411. u32 dma_ctrl, ring_cfg;
  2412. u32 dma_priority[3] = {0, 0, 0};
  2413. dma_ctrl = bcmgenet_tdma_readl(priv, DMA_CTRL);
  2414. dma_enable = dma_ctrl & DMA_EN;
  2415. dma_ctrl &= ~DMA_EN;
  2416. bcmgenet_tdma_writel(priv, dma_ctrl, DMA_CTRL);
  2417. dma_ctrl = 0;
  2418. ring_cfg = 0;
  2419. /* Enable strict priority arbiter mode */
  2420. bcmgenet_tdma_writel(priv, DMA_ARBITER_SP, DMA_ARB_CTRL);
  2421. /* Initialize Tx priority queues */
  2422. for (i = 0; i < priv->hw_params->tx_queues; i++) {
  2423. bcmgenet_init_tx_ring(priv, i, priv->hw_params->tx_bds_per_q,
  2424. i * priv->hw_params->tx_bds_per_q,
  2425. (i + 1) * priv->hw_params->tx_bds_per_q);
  2426. ring_cfg |= (1 << i);
  2427. dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT));
  2428. dma_priority[DMA_PRIO_REG_INDEX(i)] |=
  2429. ((GENET_Q0_PRIORITY + i) << DMA_PRIO_REG_SHIFT(i));
  2430. }
  2431. /* Initialize Tx default queue 16 */
  2432. bcmgenet_init_tx_ring(priv, DESC_INDEX, GENET_Q16_TX_BD_CNT,
  2433. priv->hw_params->tx_queues *
  2434. priv->hw_params->tx_bds_per_q,
  2435. TOTAL_DESC);
  2436. ring_cfg |= (1 << DESC_INDEX);
  2437. dma_ctrl |= (1 << (DESC_INDEX + DMA_RING_BUF_EN_SHIFT));
  2438. dma_priority[DMA_PRIO_REG_INDEX(DESC_INDEX)] |=
  2439. ((GENET_Q0_PRIORITY + priv->hw_params->tx_queues) <<
  2440. DMA_PRIO_REG_SHIFT(DESC_INDEX));
  2441. /* Set Tx queue priorities */
  2442. bcmgenet_tdma_writel(priv, dma_priority[0], DMA_PRIORITY_0);
  2443. bcmgenet_tdma_writel(priv, dma_priority[1], DMA_PRIORITY_1);
  2444. bcmgenet_tdma_writel(priv, dma_priority[2], DMA_PRIORITY_2);
  2445. /* Enable Tx queues */
  2446. bcmgenet_tdma_writel(priv, ring_cfg, DMA_RING_CFG);
  2447. /* Enable Tx DMA */
  2448. if (dma_enable)
  2449. dma_ctrl |= DMA_EN;
  2450. bcmgenet_tdma_writel(priv, dma_ctrl, DMA_CTRL);
  2451. }
  2452. static void bcmgenet_enable_rx_napi(struct bcmgenet_priv *priv)
  2453. {
  2454. unsigned int i;
  2455. struct bcmgenet_rx_ring *ring;
  2456. for (i = 0; i < priv->hw_params->rx_queues; ++i) {
  2457. ring = &priv->rx_rings[i];
  2458. napi_enable(&ring->napi);
  2459. ring->int_enable(ring);
  2460. }
  2461. ring = &priv->rx_rings[DESC_INDEX];
  2462. napi_enable(&ring->napi);
  2463. ring->int_enable(ring);
  2464. }
  2465. static void bcmgenet_disable_rx_napi(struct bcmgenet_priv *priv)
  2466. {
  2467. unsigned int i;
  2468. struct bcmgenet_rx_ring *ring;
  2469. for (i = 0; i < priv->hw_params->rx_queues; ++i) {
  2470. ring = &priv->rx_rings[i];
  2471. napi_disable(&ring->napi);
  2472. cancel_work_sync(&ring->dim.dim.work);
  2473. }
  2474. ring = &priv->rx_rings[DESC_INDEX];
  2475. napi_disable(&ring->napi);
  2476. cancel_work_sync(&ring->dim.dim.work);
  2477. }
  2478. static void bcmgenet_fini_rx_napi(struct bcmgenet_priv *priv)
  2479. {
  2480. unsigned int i;
  2481. struct bcmgenet_rx_ring *ring;
  2482. for (i = 0; i < priv->hw_params->rx_queues; ++i) {
  2483. ring = &priv->rx_rings[i];
  2484. netif_napi_del(&ring->napi);
  2485. }
  2486. ring = &priv->rx_rings[DESC_INDEX];
  2487. netif_napi_del(&ring->napi);
  2488. }
  2489. /* Initialize Rx queues
  2490. *
  2491. * Queues 0-15 are priority queues. Hardware Filtering Block (HFB) can be
  2492. * used to direct traffic to these queues.
  2493. *
  2494. * Queue 16 is the default Rx queue with GENET_Q16_RX_BD_CNT descriptors.
  2495. */
  2496. static int bcmgenet_init_rx_queues(struct net_device *dev)
  2497. {
  2498. struct bcmgenet_priv *priv = netdev_priv(dev);
  2499. u32 i;
  2500. u32 dma_enable;
  2501. u32 dma_ctrl;
  2502. u32 ring_cfg;
  2503. int ret;
  2504. dma_ctrl = bcmgenet_rdma_readl(priv, DMA_CTRL);
  2505. dma_enable = dma_ctrl & DMA_EN;
  2506. dma_ctrl &= ~DMA_EN;
  2507. bcmgenet_rdma_writel(priv, dma_ctrl, DMA_CTRL);
  2508. dma_ctrl = 0;
  2509. ring_cfg = 0;
  2510. /* Initialize Rx priority queues */
  2511. for (i = 0; i < priv->hw_params->rx_queues; i++) {
  2512. ret = bcmgenet_init_rx_ring(priv, i,
  2513. priv->hw_params->rx_bds_per_q,
  2514. i * priv->hw_params->rx_bds_per_q,
  2515. (i + 1) *
  2516. priv->hw_params->rx_bds_per_q);
  2517. if (ret)
  2518. return ret;
  2519. ring_cfg |= (1 << i);
  2520. dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT));
  2521. }
  2522. /* Initialize Rx default queue 16 */
  2523. ret = bcmgenet_init_rx_ring(priv, DESC_INDEX, GENET_Q16_RX_BD_CNT,
  2524. priv->hw_params->rx_queues *
  2525. priv->hw_params->rx_bds_per_q,
  2526. TOTAL_DESC);
  2527. if (ret)
  2528. return ret;
  2529. ring_cfg |= (1 << DESC_INDEX);
  2530. dma_ctrl |= (1 << (DESC_INDEX + DMA_RING_BUF_EN_SHIFT));
  2531. /* Enable rings */
  2532. bcmgenet_rdma_writel(priv, ring_cfg, DMA_RING_CFG);
  2533. /* Configure ring as descriptor ring and re-enable DMA if enabled */
  2534. if (dma_enable)
  2535. dma_ctrl |= DMA_EN;
  2536. bcmgenet_rdma_writel(priv, dma_ctrl, DMA_CTRL);
  2537. return 0;
  2538. }
  2539. static int bcmgenet_dma_teardown(struct bcmgenet_priv *priv)
  2540. {
  2541. int ret = 0;
  2542. int timeout = 0;
  2543. u32 reg;
  2544. u32 dma_ctrl;
  2545. int i;
  2546. /* Disable TDMA to stop add more frames in TX DMA */
  2547. reg = bcmgenet_tdma_readl(priv, DMA_CTRL);
  2548. reg &= ~DMA_EN;
  2549. bcmgenet_tdma_writel(priv, reg, DMA_CTRL);
  2550. /* Check TDMA status register to confirm TDMA is disabled */
  2551. while (timeout++ < DMA_TIMEOUT_VAL) {
  2552. reg = bcmgenet_tdma_readl(priv, DMA_STATUS);
  2553. if (reg & DMA_DISABLED)
  2554. break;
  2555. udelay(1);
  2556. }
  2557. if (timeout == DMA_TIMEOUT_VAL) {
  2558. netdev_warn(priv->dev, "Timed out while disabling TX DMA\n");
  2559. ret = -ETIMEDOUT;
  2560. }
  2561. /* Wait 10ms for packet drain in both tx and rx dma */
  2562. usleep_range(10000, 20000);
  2563. /* Disable RDMA */
  2564. reg = bcmgenet_rdma_readl(priv, DMA_CTRL);
  2565. reg &= ~DMA_EN;
  2566. bcmgenet_rdma_writel(priv, reg, DMA_CTRL);
  2567. timeout = 0;
  2568. /* Check RDMA status register to confirm RDMA is disabled */
  2569. while (timeout++ < DMA_TIMEOUT_VAL) {
  2570. reg = bcmgenet_rdma_readl(priv, DMA_STATUS);
  2571. if (reg & DMA_DISABLED)
  2572. break;
  2573. udelay(1);
  2574. }
  2575. if (timeout == DMA_TIMEOUT_VAL) {
  2576. netdev_warn(priv->dev, "Timed out while disabling RX DMA\n");
  2577. ret = -ETIMEDOUT;
  2578. }
  2579. dma_ctrl = 0;
  2580. for (i = 0; i < priv->hw_params->rx_queues; i++)
  2581. dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT));
  2582. reg = bcmgenet_rdma_readl(priv, DMA_CTRL);
  2583. reg &= ~dma_ctrl;
  2584. bcmgenet_rdma_writel(priv, reg, DMA_CTRL);
  2585. dma_ctrl = 0;
  2586. for (i = 0; i < priv->hw_params->tx_queues; i++)
  2587. dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT));
  2588. reg = bcmgenet_tdma_readl(priv, DMA_CTRL);
  2589. reg &= ~dma_ctrl;
  2590. bcmgenet_tdma_writel(priv, reg, DMA_CTRL);
  2591. return ret;
  2592. }
  2593. static void bcmgenet_fini_dma(struct bcmgenet_priv *priv)
  2594. {
  2595. struct netdev_queue *txq;
  2596. int i;
  2597. bcmgenet_fini_rx_napi(priv);
  2598. bcmgenet_fini_tx_napi(priv);
  2599. for (i = 0; i < priv->num_tx_bds; i++)
  2600. dev_kfree_skb(bcmgenet_free_tx_cb(&priv->pdev->dev,
  2601. priv->tx_cbs + i));
  2602. for (i = 0; i < priv->hw_params->tx_queues; i++) {
  2603. txq = netdev_get_tx_queue(priv->dev, priv->tx_rings[i].queue);
  2604. netdev_tx_reset_queue(txq);
  2605. }
  2606. txq = netdev_get_tx_queue(priv->dev, priv->tx_rings[DESC_INDEX].queue);
  2607. netdev_tx_reset_queue(txq);
  2608. bcmgenet_free_rx_buffers(priv);
  2609. kfree(priv->rx_cbs);
  2610. kfree(priv->tx_cbs);
  2611. }
  2612. /* init_edma: Initialize DMA control register */
  2613. static int bcmgenet_init_dma(struct bcmgenet_priv *priv)
  2614. {
  2615. int ret;
  2616. unsigned int i;
  2617. struct enet_cb *cb;
  2618. netif_dbg(priv, hw, priv->dev, "%s\n", __func__);
  2619. /* Initialize common Rx ring structures */
  2620. priv->rx_bds = priv->base + priv->hw_params->rdma_offset;
  2621. priv->num_rx_bds = TOTAL_DESC;
  2622. priv->rx_cbs = kcalloc(priv->num_rx_bds, sizeof(struct enet_cb),
  2623. GFP_KERNEL);
  2624. if (!priv->rx_cbs)
  2625. return -ENOMEM;
  2626. for (i = 0; i < priv->num_rx_bds; i++) {
  2627. cb = priv->rx_cbs + i;
  2628. cb->bd_addr = priv->rx_bds + i * DMA_DESC_SIZE;
  2629. }
  2630. /* Initialize common TX ring structures */
  2631. priv->tx_bds = priv->base + priv->hw_params->tdma_offset;
  2632. priv->num_tx_bds = TOTAL_DESC;
  2633. priv->tx_cbs = kcalloc(priv->num_tx_bds, sizeof(struct enet_cb),
  2634. GFP_KERNEL);
  2635. if (!priv->tx_cbs) {
  2636. kfree(priv->rx_cbs);
  2637. return -ENOMEM;
  2638. }
  2639. for (i = 0; i < priv->num_tx_bds; i++) {
  2640. cb = priv->tx_cbs + i;
  2641. cb->bd_addr = priv->tx_bds + i * DMA_DESC_SIZE;
  2642. }
  2643. /* Init rDma */
  2644. bcmgenet_rdma_writel(priv, priv->dma_max_burst_length,
  2645. DMA_SCB_BURST_SIZE);
  2646. /* Initialize Rx queues */
  2647. ret = bcmgenet_init_rx_queues(priv->dev);
  2648. if (ret) {
  2649. netdev_err(priv->dev, "failed to initialize Rx queues\n");
  2650. bcmgenet_free_rx_buffers(priv);
  2651. kfree(priv->rx_cbs);
  2652. kfree(priv->tx_cbs);
  2653. return ret;
  2654. }
  2655. /* Init tDma */
  2656. bcmgenet_tdma_writel(priv, priv->dma_max_burst_length,
  2657. DMA_SCB_BURST_SIZE);
  2658. /* Initialize Tx queues */
  2659. bcmgenet_init_tx_queues(priv->dev);
  2660. return 0;
  2661. }
  2662. /* Interrupt bottom half */
  2663. static void bcmgenet_irq_task(struct work_struct *work)
  2664. {
  2665. unsigned int status;
  2666. struct bcmgenet_priv *priv = container_of(
  2667. work, struct bcmgenet_priv, bcmgenet_irq_work);
  2668. netif_dbg(priv, intr, priv->dev, "%s\n", __func__);
  2669. spin_lock_irq(&priv->lock);
  2670. status = priv->irq0_stat;
  2671. priv->irq0_stat = 0;
  2672. spin_unlock_irq(&priv->lock);
  2673. if (status & UMAC_IRQ_PHY_DET_R &&
  2674. priv->dev->phydev->autoneg != AUTONEG_ENABLE) {
  2675. phy_init_hw(priv->dev->phydev);
  2676. genphy_config_aneg(priv->dev->phydev);
  2677. }
  2678. /* Link UP/DOWN event */
  2679. if (status & UMAC_IRQ_LINK_EVENT)
  2680. phy_mac_interrupt(priv->dev->phydev);
  2681. }
  2682. /* bcmgenet_isr1: handle Rx and Tx priority queues */
  2683. static irqreturn_t bcmgenet_isr1(int irq, void *dev_id)
  2684. {
  2685. struct bcmgenet_priv *priv = dev_id;
  2686. struct bcmgenet_rx_ring *rx_ring;
  2687. struct bcmgenet_tx_ring *tx_ring;
  2688. unsigned int index, status;
  2689. /* Read irq status */
  2690. status = bcmgenet_intrl2_1_readl(priv, INTRL2_CPU_STAT) &
  2691. ~bcmgenet_intrl2_1_readl(priv, INTRL2_CPU_MASK_STATUS);
  2692. /* clear interrupts */
  2693. bcmgenet_intrl2_1_writel(priv, status, INTRL2_CPU_CLEAR);
  2694. netif_dbg(priv, intr, priv->dev,
  2695. "%s: IRQ=0x%x\n", __func__, status);
  2696. /* Check Rx priority queue interrupts */
  2697. for (index = 0; index < priv->hw_params->rx_queues; index++) {
  2698. if (!(status & BIT(UMAC_IRQ1_RX_INTR_SHIFT + index)))
  2699. continue;
  2700. rx_ring = &priv->rx_rings[index];
  2701. rx_ring->dim.event_ctr++;
  2702. if (likely(napi_schedule_prep(&rx_ring->napi))) {
  2703. rx_ring->int_disable(rx_ring);
  2704. __napi_schedule_irqoff(&rx_ring->napi);
  2705. }
  2706. }
  2707. /* Check Tx priority queue interrupts */
  2708. for (index = 0; index < priv->hw_params->tx_queues; index++) {
  2709. if (!(status & BIT(index)))
  2710. continue;
  2711. tx_ring = &priv->tx_rings[index];
  2712. if (likely(napi_schedule_prep(&tx_ring->napi))) {
  2713. tx_ring->int_disable(tx_ring);
  2714. __napi_schedule_irqoff(&tx_ring->napi);
  2715. }
  2716. }
  2717. return IRQ_HANDLED;
  2718. }
  2719. /* bcmgenet_isr0: handle Rx and Tx default queues + other stuff */
  2720. static irqreturn_t bcmgenet_isr0(int irq, void *dev_id)
  2721. {
  2722. struct bcmgenet_priv *priv = dev_id;
  2723. struct bcmgenet_rx_ring *rx_ring;
  2724. struct bcmgenet_tx_ring *tx_ring;
  2725. unsigned int status;
  2726. unsigned long flags;
  2727. /* Read irq status */
  2728. status = bcmgenet_intrl2_0_readl(priv, INTRL2_CPU_STAT) &
  2729. ~bcmgenet_intrl2_0_readl(priv, INTRL2_CPU_MASK_STATUS);
  2730. /* clear interrupts */
  2731. bcmgenet_intrl2_0_writel(priv, status, INTRL2_CPU_CLEAR);
  2732. netif_dbg(priv, intr, priv->dev,
  2733. "IRQ=0x%x\n", status);
  2734. if (status & UMAC_IRQ_RXDMA_DONE) {
  2735. rx_ring = &priv->rx_rings[DESC_INDEX];
  2736. rx_ring->dim.event_ctr++;
  2737. if (likely(napi_schedule_prep(&rx_ring->napi))) {
  2738. rx_ring->int_disable(rx_ring);
  2739. __napi_schedule_irqoff(&rx_ring->napi);
  2740. }
  2741. }
  2742. if (status & UMAC_IRQ_TXDMA_DONE) {
  2743. tx_ring = &priv->tx_rings[DESC_INDEX];
  2744. if (likely(napi_schedule_prep(&tx_ring->napi))) {
  2745. tx_ring->int_disable(tx_ring);
  2746. __napi_schedule_irqoff(&tx_ring->napi);
  2747. }
  2748. }
  2749. if ((priv->hw_params->flags & GENET_HAS_MDIO_INTR) &&
  2750. status & (UMAC_IRQ_MDIO_DONE | UMAC_IRQ_MDIO_ERROR)) {
  2751. wake_up(&priv->wq);
  2752. }
  2753. /* all other interested interrupts handled in bottom half */
  2754. status &= (UMAC_IRQ_LINK_EVENT | UMAC_IRQ_PHY_DET_R);
  2755. if (status) {
  2756. /* Save irq status for bottom-half processing. */
  2757. spin_lock_irqsave(&priv->lock, flags);
  2758. priv->irq0_stat |= status;
  2759. spin_unlock_irqrestore(&priv->lock, flags);
  2760. schedule_work(&priv->bcmgenet_irq_work);
  2761. }
  2762. return IRQ_HANDLED;
  2763. }
  2764. static irqreturn_t bcmgenet_wol_isr(int irq, void *dev_id)
  2765. {
  2766. /* Acknowledge the interrupt */
  2767. return IRQ_HANDLED;
  2768. }
  2769. static void bcmgenet_umac_reset(struct bcmgenet_priv *priv)
  2770. {
  2771. u32 reg;
  2772. reg = bcmgenet_rbuf_ctrl_get(priv);
  2773. reg |= BIT(1);
  2774. bcmgenet_rbuf_ctrl_set(priv, reg);
  2775. udelay(10);
  2776. reg &= ~BIT(1);
  2777. bcmgenet_rbuf_ctrl_set(priv, reg);
  2778. udelay(10);
  2779. }
  2780. static void bcmgenet_set_hw_addr(struct bcmgenet_priv *priv,
  2781. const unsigned char *addr)
  2782. {
  2783. bcmgenet_umac_writel(priv, get_unaligned_be32(&addr[0]), UMAC_MAC0);
  2784. bcmgenet_umac_writel(priv, get_unaligned_be16(&addr[4]), UMAC_MAC1);
  2785. }
  2786. static void bcmgenet_get_hw_addr(struct bcmgenet_priv *priv,
  2787. unsigned char *addr)
  2788. {
  2789. u32 addr_tmp;
  2790. addr_tmp = bcmgenet_umac_readl(priv, UMAC_MAC0);
  2791. put_unaligned_be32(addr_tmp, &addr[0]);
  2792. addr_tmp = bcmgenet_umac_readl(priv, UMAC_MAC1);
  2793. put_unaligned_be16(addr_tmp, &addr[4]);
  2794. }
  2795. /* Returns a reusable dma control register value */
  2796. static u32 bcmgenet_dma_disable(struct bcmgenet_priv *priv, bool flush_rx)
  2797. {
  2798. unsigned int i;
  2799. u32 reg;
  2800. u32 dma_ctrl;
  2801. /* disable DMA */
  2802. dma_ctrl = 1 << (DESC_INDEX + DMA_RING_BUF_EN_SHIFT) | DMA_EN;
  2803. for (i = 0; i < priv->hw_params->tx_queues; i++)
  2804. dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT));
  2805. reg = bcmgenet_tdma_readl(priv, DMA_CTRL);
  2806. reg &= ~dma_ctrl;
  2807. bcmgenet_tdma_writel(priv, reg, DMA_CTRL);
  2808. dma_ctrl = 1 << (DESC_INDEX + DMA_RING_BUF_EN_SHIFT) | DMA_EN;
  2809. for (i = 0; i < priv->hw_params->rx_queues; i++)
  2810. dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT));
  2811. reg = bcmgenet_rdma_readl(priv, DMA_CTRL);
  2812. reg &= ~dma_ctrl;
  2813. bcmgenet_rdma_writel(priv, reg, DMA_CTRL);
  2814. bcmgenet_umac_writel(priv, 1, UMAC_TX_FLUSH);
  2815. udelay(10);
  2816. bcmgenet_umac_writel(priv, 0, UMAC_TX_FLUSH);
  2817. if (flush_rx) {
  2818. reg = bcmgenet_rbuf_ctrl_get(priv);
  2819. bcmgenet_rbuf_ctrl_set(priv, reg | BIT(0));
  2820. udelay(10);
  2821. bcmgenet_rbuf_ctrl_set(priv, reg);
  2822. udelay(10);
  2823. }
  2824. return dma_ctrl;
  2825. }
  2826. static void bcmgenet_enable_dma(struct bcmgenet_priv *priv, u32 dma_ctrl)
  2827. {
  2828. u32 reg;
  2829. reg = bcmgenet_rdma_readl(priv, DMA_CTRL);
  2830. reg |= dma_ctrl;
  2831. bcmgenet_rdma_writel(priv, reg, DMA_CTRL);
  2832. reg = bcmgenet_tdma_readl(priv, DMA_CTRL);
  2833. reg |= dma_ctrl;
  2834. bcmgenet_tdma_writel(priv, reg, DMA_CTRL);
  2835. }
  2836. static void bcmgenet_netif_start(struct net_device *dev)
  2837. {
  2838. struct bcmgenet_priv *priv = netdev_priv(dev);
  2839. /* Start the network engine */
  2840. netif_addr_lock_bh(dev);
  2841. bcmgenet_set_rx_mode(dev);
  2842. netif_addr_unlock_bh(dev);
  2843. bcmgenet_enable_rx_napi(priv);
  2844. umac_enable_set(priv, CMD_TX_EN | CMD_RX_EN, true);
  2845. bcmgenet_enable_tx_napi(priv);
  2846. /* Monitor link interrupts now */
  2847. bcmgenet_link_intr_enable(priv);
  2848. phy_start(dev->phydev);
  2849. }
  2850. static int bcmgenet_open(struct net_device *dev)
  2851. {
  2852. struct bcmgenet_priv *priv = netdev_priv(dev);
  2853. unsigned long dma_ctrl;
  2854. int ret;
  2855. netif_dbg(priv, ifup, dev, "bcmgenet_open\n");
  2856. /* Turn on the clock */
  2857. clk_prepare_enable(priv->clk);
  2858. /* If this is an internal GPHY, power it back on now, before UniMAC is
  2859. * brought out of reset as absolutely no UniMAC activity is allowed
  2860. */
  2861. if (priv->internal_phy)
  2862. bcmgenet_power_up(priv, GENET_POWER_PASSIVE);
  2863. /* take MAC out of reset */
  2864. bcmgenet_umac_reset(priv);
  2865. init_umac(priv);
  2866. /* Apply features again in case we changed them while interface was
  2867. * down
  2868. */
  2869. bcmgenet_set_features(dev, dev->features);
  2870. bcmgenet_set_hw_addr(priv, dev->dev_addr);
  2871. /* Disable RX/TX DMA and flush TX and RX queues */
  2872. dma_ctrl = bcmgenet_dma_disable(priv, true);
  2873. /* Reinitialize TDMA and RDMA and SW housekeeping */
  2874. ret = bcmgenet_init_dma(priv);
  2875. if (ret) {
  2876. netdev_err(dev, "failed to initialize DMA\n");
  2877. goto err_clk_disable;
  2878. }
  2879. /* Always enable ring 16 - descriptor ring */
  2880. bcmgenet_enable_dma(priv, dma_ctrl);
  2881. /* HFB init */
  2882. bcmgenet_hfb_init(priv);
  2883. ret = request_irq(priv->irq0, bcmgenet_isr0, IRQF_SHARED,
  2884. dev->name, priv);
  2885. if (ret < 0) {
  2886. netdev_err(dev, "can't request IRQ %d\n", priv->irq0);
  2887. goto err_fini_dma;
  2888. }
  2889. ret = request_irq(priv->irq1, bcmgenet_isr1, IRQF_SHARED,
  2890. dev->name, priv);
  2891. if (ret < 0) {
  2892. netdev_err(dev, "can't request IRQ %d\n", priv->irq1);
  2893. goto err_irq0;
  2894. }
  2895. ret = bcmgenet_mii_probe(dev);
  2896. if (ret) {
  2897. netdev_err(dev, "failed to connect to PHY\n");
  2898. goto err_irq1;
  2899. }
  2900. bcmgenet_phy_pause_set(dev, priv->rx_pause, priv->tx_pause);
  2901. bcmgenet_netif_start(dev);
  2902. netif_tx_start_all_queues(dev);
  2903. return 0;
  2904. err_irq1:
  2905. free_irq(priv->irq1, priv);
  2906. err_irq0:
  2907. free_irq(priv->irq0, priv);
  2908. err_fini_dma:
  2909. bcmgenet_dma_teardown(priv);
  2910. bcmgenet_fini_dma(priv);
  2911. err_clk_disable:
  2912. if (priv->internal_phy)
  2913. bcmgenet_power_down(priv, GENET_POWER_PASSIVE);
  2914. clk_disable_unprepare(priv->clk);
  2915. return ret;
  2916. }
  2917. static void bcmgenet_netif_stop(struct net_device *dev, bool stop_phy)
  2918. {
  2919. struct bcmgenet_priv *priv = netdev_priv(dev);
  2920. bcmgenet_disable_tx_napi(priv);
  2921. netif_tx_disable(dev);
  2922. /* Disable MAC receive */
  2923. umac_enable_set(priv, CMD_RX_EN, false);
  2924. bcmgenet_dma_teardown(priv);
  2925. /* Disable MAC transmit. TX DMA disabled must be done before this */
  2926. umac_enable_set(priv, CMD_TX_EN, false);
  2927. if (stop_phy)
  2928. phy_stop(dev->phydev);
  2929. bcmgenet_disable_rx_napi(priv);
  2930. bcmgenet_intr_disable(priv);
  2931. /* Wait for pending work items to complete. Since interrupts are
  2932. * disabled no new work will be scheduled.
  2933. */
  2934. cancel_work_sync(&priv->bcmgenet_irq_work);
  2935. /* tx reclaim */
  2936. bcmgenet_tx_reclaim_all(dev);
  2937. bcmgenet_fini_dma(priv);
  2938. }
  2939. static int bcmgenet_close(struct net_device *dev)
  2940. {
  2941. struct bcmgenet_priv *priv = netdev_priv(dev);
  2942. int ret = 0;
  2943. netif_dbg(priv, ifdown, dev, "bcmgenet_close\n");
  2944. bcmgenet_netif_stop(dev, false);
  2945. /* Really kill the PHY state machine and disconnect from it */
  2946. phy_disconnect(dev->phydev);
  2947. free_irq(priv->irq0, priv);
  2948. free_irq(priv->irq1, priv);
  2949. if (priv->internal_phy)
  2950. ret = bcmgenet_power_down(priv, GENET_POWER_PASSIVE);
  2951. clk_disable_unprepare(priv->clk);
  2952. return ret;
  2953. }
  2954. static void bcmgenet_dump_tx_queue(struct bcmgenet_tx_ring *ring)
  2955. {
  2956. struct bcmgenet_priv *priv = ring->priv;
  2957. u32 p_index, c_index, intsts, intmsk;
  2958. struct netdev_queue *txq;
  2959. unsigned int free_bds;
  2960. bool txq_stopped;
  2961. if (!netif_msg_tx_err(priv))
  2962. return;
  2963. txq = netdev_get_tx_queue(priv->dev, ring->queue);
  2964. spin_lock(&ring->lock);
  2965. if (ring->index == DESC_INDEX) {
  2966. intsts = ~bcmgenet_intrl2_0_readl(priv, INTRL2_CPU_MASK_STATUS);
  2967. intmsk = UMAC_IRQ_TXDMA_DONE | UMAC_IRQ_TXDMA_MBDONE;
  2968. } else {
  2969. intsts = ~bcmgenet_intrl2_1_readl(priv, INTRL2_CPU_MASK_STATUS);
  2970. intmsk = 1 << ring->index;
  2971. }
  2972. c_index = bcmgenet_tdma_ring_readl(priv, ring->index, TDMA_CONS_INDEX);
  2973. p_index = bcmgenet_tdma_ring_readl(priv, ring->index, TDMA_PROD_INDEX);
  2974. txq_stopped = netif_tx_queue_stopped(txq);
  2975. free_bds = ring->free_bds;
  2976. spin_unlock(&ring->lock);
  2977. netif_err(priv, tx_err, priv->dev, "Ring %d queue %d status summary\n"
  2978. "TX queue status: %s, interrupts: %s\n"
  2979. "(sw)free_bds: %d (sw)size: %d\n"
  2980. "(sw)p_index: %d (hw)p_index: %d\n"
  2981. "(sw)c_index: %d (hw)c_index: %d\n"
  2982. "(sw)clean_p: %d (sw)write_p: %d\n"
  2983. "(sw)cb_ptr: %d (sw)end_ptr: %d\n",
  2984. ring->index, ring->queue,
  2985. txq_stopped ? "stopped" : "active",
  2986. intsts & intmsk ? "enabled" : "disabled",
  2987. free_bds, ring->size,
  2988. ring->prod_index, p_index & DMA_P_INDEX_MASK,
  2989. ring->c_index, c_index & DMA_C_INDEX_MASK,
  2990. ring->clean_ptr, ring->write_ptr,
  2991. ring->cb_ptr, ring->end_ptr);
  2992. }
  2993. static void bcmgenet_timeout(struct net_device *dev, unsigned int txqueue)
  2994. {
  2995. struct bcmgenet_priv *priv = netdev_priv(dev);
  2996. u32 int0_enable = 0;
  2997. u32 int1_enable = 0;
  2998. unsigned int q;
  2999. netif_dbg(priv, tx_err, dev, "bcmgenet_timeout\n");
  3000. for (q = 0; q < priv->hw_params->tx_queues; q++)
  3001. bcmgenet_dump_tx_queue(&priv->tx_rings[q]);
  3002. bcmgenet_dump_tx_queue(&priv->tx_rings[DESC_INDEX]);
  3003. bcmgenet_tx_reclaim_all(dev);
  3004. for (q = 0; q < priv->hw_params->tx_queues; q++)
  3005. int1_enable |= (1 << q);
  3006. int0_enable = UMAC_IRQ_TXDMA_DONE;
  3007. /* Re-enable TX interrupts if disabled */
  3008. bcmgenet_intrl2_0_writel(priv, int0_enable, INTRL2_CPU_MASK_CLEAR);
  3009. bcmgenet_intrl2_1_writel(priv, int1_enable, INTRL2_CPU_MASK_CLEAR);
  3010. netif_trans_update(dev);
  3011. dev->stats.tx_errors++;
  3012. netif_tx_wake_all_queues(dev);
  3013. }
  3014. #define MAX_MDF_FILTER 17
  3015. static inline void bcmgenet_set_mdf_addr(struct bcmgenet_priv *priv,
  3016. const unsigned char *addr,
  3017. int *i)
  3018. {
  3019. bcmgenet_umac_writel(priv, addr[0] << 8 | addr[1],
  3020. UMAC_MDF_ADDR + (*i * 4));
  3021. bcmgenet_umac_writel(priv, addr[2] << 24 | addr[3] << 16 |
  3022. addr[4] << 8 | addr[5],
  3023. UMAC_MDF_ADDR + ((*i + 1) * 4));
  3024. *i += 2;
  3025. }
  3026. static void bcmgenet_set_rx_mode(struct net_device *dev)
  3027. {
  3028. struct bcmgenet_priv *priv = netdev_priv(dev);
  3029. struct netdev_hw_addr *ha;
  3030. int i, nfilter;
  3031. u32 reg;
  3032. netif_dbg(priv, hw, dev, "%s: %08X\n", __func__, dev->flags);
  3033. /* Number of filters needed */
  3034. nfilter = netdev_uc_count(dev) + netdev_mc_count(dev) + 2;
  3035. /*
  3036. * Turn on promicuous mode for three scenarios
  3037. * 1. IFF_PROMISC flag is set
  3038. * 2. IFF_ALLMULTI flag is set
  3039. * 3. The number of filters needed exceeds the number filters
  3040. * supported by the hardware.
  3041. */
  3042. spin_lock(&priv->reg_lock);
  3043. reg = bcmgenet_umac_readl(priv, UMAC_CMD);
  3044. if ((dev->flags & (IFF_PROMISC | IFF_ALLMULTI)) ||
  3045. (nfilter > MAX_MDF_FILTER)) {
  3046. reg |= CMD_PROMISC;
  3047. bcmgenet_umac_writel(priv, reg, UMAC_CMD);
  3048. spin_unlock(&priv->reg_lock);
  3049. bcmgenet_umac_writel(priv, 0, UMAC_MDF_CTRL);
  3050. return;
  3051. } else {
  3052. reg &= ~CMD_PROMISC;
  3053. bcmgenet_umac_writel(priv, reg, UMAC_CMD);
  3054. spin_unlock(&priv->reg_lock);
  3055. }
  3056. /* update MDF filter */
  3057. i = 0;
  3058. /* Broadcast */
  3059. bcmgenet_set_mdf_addr(priv, dev->broadcast, &i);
  3060. /* my own address.*/
  3061. bcmgenet_set_mdf_addr(priv, dev->dev_addr, &i);
  3062. /* Unicast */
  3063. netdev_for_each_uc_addr(ha, dev)
  3064. bcmgenet_set_mdf_addr(priv, ha->addr, &i);
  3065. /* Multicast */
  3066. netdev_for_each_mc_addr(ha, dev)
  3067. bcmgenet_set_mdf_addr(priv, ha->addr, &i);
  3068. /* Enable filters */
  3069. reg = GENMASK(MAX_MDF_FILTER - 1, MAX_MDF_FILTER - nfilter);
  3070. bcmgenet_umac_writel(priv, reg, UMAC_MDF_CTRL);
  3071. }
  3072. /* Set the hardware MAC address. */
  3073. static int bcmgenet_set_mac_addr(struct net_device *dev, void *p)
  3074. {
  3075. struct sockaddr *addr = p;
  3076. /* Setting the MAC address at the hardware level is not possible
  3077. * without disabling the UniMAC RX/TX enable bits.
  3078. */
  3079. if (netif_running(dev))
  3080. return -EBUSY;
  3081. eth_hw_addr_set(dev, addr->sa_data);
  3082. return 0;
  3083. }
  3084. static struct net_device_stats *bcmgenet_get_stats(struct net_device *dev)
  3085. {
  3086. struct bcmgenet_priv *priv = netdev_priv(dev);
  3087. unsigned long tx_bytes = 0, tx_packets = 0;
  3088. unsigned long rx_bytes = 0, rx_packets = 0;
  3089. unsigned long rx_errors = 0, rx_dropped = 0;
  3090. struct bcmgenet_tx_ring *tx_ring;
  3091. struct bcmgenet_rx_ring *rx_ring;
  3092. unsigned int q;
  3093. for (q = 0; q < priv->hw_params->tx_queues; q++) {
  3094. tx_ring = &priv->tx_rings[q];
  3095. tx_bytes += tx_ring->bytes;
  3096. tx_packets += tx_ring->packets;
  3097. }
  3098. tx_ring = &priv->tx_rings[DESC_INDEX];
  3099. tx_bytes += tx_ring->bytes;
  3100. tx_packets += tx_ring->packets;
  3101. for (q = 0; q < priv->hw_params->rx_queues; q++) {
  3102. rx_ring = &priv->rx_rings[q];
  3103. rx_bytes += rx_ring->bytes;
  3104. rx_packets += rx_ring->packets;
  3105. rx_errors += rx_ring->errors;
  3106. rx_dropped += rx_ring->dropped;
  3107. }
  3108. rx_ring = &priv->rx_rings[DESC_INDEX];
  3109. rx_bytes += rx_ring->bytes;
  3110. rx_packets += rx_ring->packets;
  3111. rx_errors += rx_ring->errors;
  3112. rx_dropped += rx_ring->dropped;
  3113. dev->stats.tx_bytes = tx_bytes;
  3114. dev->stats.tx_packets = tx_packets;
  3115. dev->stats.rx_bytes = rx_bytes;
  3116. dev->stats.rx_packets = rx_packets;
  3117. dev->stats.rx_errors = rx_errors;
  3118. dev->stats.rx_missed_errors = rx_errors;
  3119. dev->stats.rx_dropped = rx_dropped;
  3120. return &dev->stats;
  3121. }
  3122. static int bcmgenet_change_carrier(struct net_device *dev, bool new_carrier)
  3123. {
  3124. struct bcmgenet_priv *priv = netdev_priv(dev);
  3125. if (!dev->phydev || !phy_is_pseudo_fixed_link(dev->phydev) ||
  3126. priv->phy_interface != PHY_INTERFACE_MODE_MOCA)
  3127. return -EOPNOTSUPP;
  3128. if (new_carrier)
  3129. netif_carrier_on(dev);
  3130. else
  3131. netif_carrier_off(dev);
  3132. return 0;
  3133. }
  3134. static const struct net_device_ops bcmgenet_netdev_ops = {
  3135. .ndo_open = bcmgenet_open,
  3136. .ndo_stop = bcmgenet_close,
  3137. .ndo_start_xmit = bcmgenet_xmit,
  3138. .ndo_tx_timeout = bcmgenet_timeout,
  3139. .ndo_set_rx_mode = bcmgenet_set_rx_mode,
  3140. .ndo_set_mac_address = bcmgenet_set_mac_addr,
  3141. .ndo_eth_ioctl = phy_do_ioctl_running,
  3142. .ndo_set_features = bcmgenet_set_features,
  3143. .ndo_get_stats = bcmgenet_get_stats,
  3144. .ndo_change_carrier = bcmgenet_change_carrier,
  3145. };
  3146. /* Array of GENET hardware parameters/characteristics */
  3147. static struct bcmgenet_hw_params bcmgenet_hw_params[] = {
  3148. [GENET_V1] = {
  3149. .tx_queues = 0,
  3150. .tx_bds_per_q = 0,
  3151. .rx_queues = 0,
  3152. .rx_bds_per_q = 0,
  3153. .bp_in_en_shift = 16,
  3154. .bp_in_mask = 0xffff,
  3155. .hfb_filter_cnt = 16,
  3156. .qtag_mask = 0x1F,
  3157. .hfb_offset = 0x1000,
  3158. .rdma_offset = 0x2000,
  3159. .tdma_offset = 0x3000,
  3160. .words_per_bd = 2,
  3161. },
  3162. [GENET_V2] = {
  3163. .tx_queues = 4,
  3164. .tx_bds_per_q = 32,
  3165. .rx_queues = 0,
  3166. .rx_bds_per_q = 0,
  3167. .bp_in_en_shift = 16,
  3168. .bp_in_mask = 0xffff,
  3169. .hfb_filter_cnt = 16,
  3170. .qtag_mask = 0x1F,
  3171. .tbuf_offset = 0x0600,
  3172. .hfb_offset = 0x1000,
  3173. .hfb_reg_offset = 0x2000,
  3174. .rdma_offset = 0x3000,
  3175. .tdma_offset = 0x4000,
  3176. .words_per_bd = 2,
  3177. .flags = GENET_HAS_EXT,
  3178. },
  3179. [GENET_V3] = {
  3180. .tx_queues = 4,
  3181. .tx_bds_per_q = 32,
  3182. .rx_queues = 0,
  3183. .rx_bds_per_q = 0,
  3184. .bp_in_en_shift = 17,
  3185. .bp_in_mask = 0x1ffff,
  3186. .hfb_filter_cnt = 48,
  3187. .hfb_filter_size = 128,
  3188. .qtag_mask = 0x3F,
  3189. .tbuf_offset = 0x0600,
  3190. .hfb_offset = 0x8000,
  3191. .hfb_reg_offset = 0xfc00,
  3192. .rdma_offset = 0x10000,
  3193. .tdma_offset = 0x11000,
  3194. .words_per_bd = 2,
  3195. .flags = GENET_HAS_EXT | GENET_HAS_MDIO_INTR |
  3196. GENET_HAS_MOCA_LINK_DET,
  3197. },
  3198. [GENET_V4] = {
  3199. .tx_queues = 4,
  3200. .tx_bds_per_q = 32,
  3201. .rx_queues = 0,
  3202. .rx_bds_per_q = 0,
  3203. .bp_in_en_shift = 17,
  3204. .bp_in_mask = 0x1ffff,
  3205. .hfb_filter_cnt = 48,
  3206. .hfb_filter_size = 128,
  3207. .qtag_mask = 0x3F,
  3208. .tbuf_offset = 0x0600,
  3209. .hfb_offset = 0x8000,
  3210. .hfb_reg_offset = 0xfc00,
  3211. .rdma_offset = 0x2000,
  3212. .tdma_offset = 0x4000,
  3213. .words_per_bd = 3,
  3214. .flags = GENET_HAS_40BITS | GENET_HAS_EXT |
  3215. GENET_HAS_MDIO_INTR | GENET_HAS_MOCA_LINK_DET,
  3216. },
  3217. [GENET_V5] = {
  3218. .tx_queues = 4,
  3219. .tx_bds_per_q = 32,
  3220. .rx_queues = 0,
  3221. .rx_bds_per_q = 0,
  3222. .bp_in_en_shift = 17,
  3223. .bp_in_mask = 0x1ffff,
  3224. .hfb_filter_cnt = 48,
  3225. .hfb_filter_size = 128,
  3226. .qtag_mask = 0x3F,
  3227. .tbuf_offset = 0x0600,
  3228. .hfb_offset = 0x8000,
  3229. .hfb_reg_offset = 0xfc00,
  3230. .rdma_offset = 0x2000,
  3231. .tdma_offset = 0x4000,
  3232. .words_per_bd = 3,
  3233. .flags = GENET_HAS_40BITS | GENET_HAS_EXT |
  3234. GENET_HAS_MDIO_INTR | GENET_HAS_MOCA_LINK_DET,
  3235. },
  3236. };
  3237. /* Infer hardware parameters from the detected GENET version */
  3238. static void bcmgenet_set_hw_params(struct bcmgenet_priv *priv)
  3239. {
  3240. struct bcmgenet_hw_params *params;
  3241. u32 reg;
  3242. u8 major;
  3243. u16 gphy_rev;
  3244. if (GENET_IS_V5(priv) || GENET_IS_V4(priv)) {
  3245. bcmgenet_dma_regs = bcmgenet_dma_regs_v3plus;
  3246. genet_dma_ring_regs = genet_dma_ring_regs_v4;
  3247. } else if (GENET_IS_V3(priv)) {
  3248. bcmgenet_dma_regs = bcmgenet_dma_regs_v3plus;
  3249. genet_dma_ring_regs = genet_dma_ring_regs_v123;
  3250. } else if (GENET_IS_V2(priv)) {
  3251. bcmgenet_dma_regs = bcmgenet_dma_regs_v2;
  3252. genet_dma_ring_regs = genet_dma_ring_regs_v123;
  3253. } else if (GENET_IS_V1(priv)) {
  3254. bcmgenet_dma_regs = bcmgenet_dma_regs_v1;
  3255. genet_dma_ring_regs = genet_dma_ring_regs_v123;
  3256. }
  3257. /* enum genet_version starts at 1 */
  3258. priv->hw_params = &bcmgenet_hw_params[priv->version];
  3259. params = priv->hw_params;
  3260. /* Read GENET HW version */
  3261. reg = bcmgenet_sys_readl(priv, SYS_REV_CTRL);
  3262. major = (reg >> 24 & 0x0f);
  3263. if (major == 6)
  3264. major = 5;
  3265. else if (major == 5)
  3266. major = 4;
  3267. else if (major == 0)
  3268. major = 1;
  3269. if (major != priv->version) {
  3270. dev_err(&priv->pdev->dev,
  3271. "GENET version mismatch, got: %d, configured for: %d\n",
  3272. major, priv->version);
  3273. }
  3274. /* Print the GENET core version */
  3275. dev_info(&priv->pdev->dev, "GENET " GENET_VER_FMT,
  3276. major, (reg >> 16) & 0x0f, reg & 0xffff);
  3277. /* Store the integrated PHY revision for the MDIO probing function
  3278. * to pass this information to the PHY driver. The PHY driver expects
  3279. * to find the PHY major revision in bits 15:8 while the GENET register
  3280. * stores that information in bits 7:0, account for that.
  3281. *
  3282. * On newer chips, starting with PHY revision G0, a new scheme is
  3283. * deployed similar to the Starfighter 2 switch with GPHY major
  3284. * revision in bits 15:8 and patch level in bits 7:0. Major revision 0
  3285. * is reserved as well as special value 0x01ff, we have a small
  3286. * heuristic to check for the new GPHY revision and re-arrange things
  3287. * so the GPHY driver is happy.
  3288. */
  3289. gphy_rev = reg & 0xffff;
  3290. if (GENET_IS_V5(priv)) {
  3291. /* The EPHY revision should come from the MDIO registers of
  3292. * the PHY not from GENET.
  3293. */
  3294. if (gphy_rev != 0) {
  3295. pr_warn("GENET is reporting EPHY revision: 0x%04x\n",
  3296. gphy_rev);
  3297. }
  3298. /* This is reserved so should require special treatment */
  3299. } else if (gphy_rev == 0 || gphy_rev == 0x01ff) {
  3300. pr_warn("Invalid GPHY revision detected: 0x%04x\n", gphy_rev);
  3301. return;
  3302. /* This is the good old scheme, just GPHY major, no minor nor patch */
  3303. } else if ((gphy_rev & 0xf0) != 0) {
  3304. priv->gphy_rev = gphy_rev << 8;
  3305. /* This is the new scheme, GPHY major rolls over with 0x10 = rev G0 */
  3306. } else if ((gphy_rev & 0xff00) != 0) {
  3307. priv->gphy_rev = gphy_rev;
  3308. }
  3309. #ifdef CONFIG_PHYS_ADDR_T_64BIT
  3310. if (!(params->flags & GENET_HAS_40BITS))
  3311. pr_warn("GENET does not support 40-bits PA\n");
  3312. #endif
  3313. pr_debug("Configuration for version: %d\n"
  3314. "TXq: %1d, TXqBDs: %1d, RXq: %1d, RXqBDs: %1d\n"
  3315. "BP << en: %2d, BP msk: 0x%05x\n"
  3316. "HFB count: %2d, QTAQ msk: 0x%05x\n"
  3317. "TBUF: 0x%04x, HFB: 0x%04x, HFBreg: 0x%04x\n"
  3318. "RDMA: 0x%05x, TDMA: 0x%05x\n"
  3319. "Words/BD: %d\n",
  3320. priv->version,
  3321. params->tx_queues, params->tx_bds_per_q,
  3322. params->rx_queues, params->rx_bds_per_q,
  3323. params->bp_in_en_shift, params->bp_in_mask,
  3324. params->hfb_filter_cnt, params->qtag_mask,
  3325. params->tbuf_offset, params->hfb_offset,
  3326. params->hfb_reg_offset,
  3327. params->rdma_offset, params->tdma_offset,
  3328. params->words_per_bd);
  3329. }
  3330. struct bcmgenet_plat_data {
  3331. enum bcmgenet_version version;
  3332. u32 dma_max_burst_length;
  3333. bool ephy_16nm;
  3334. };
  3335. static const struct bcmgenet_plat_data v1_plat_data = {
  3336. .version = GENET_V1,
  3337. .dma_max_burst_length = DMA_MAX_BURST_LENGTH,
  3338. };
  3339. static const struct bcmgenet_plat_data v2_plat_data = {
  3340. .version = GENET_V2,
  3341. .dma_max_burst_length = DMA_MAX_BURST_LENGTH,
  3342. };
  3343. static const struct bcmgenet_plat_data v3_plat_data = {
  3344. .version = GENET_V3,
  3345. .dma_max_burst_length = DMA_MAX_BURST_LENGTH,
  3346. };
  3347. static const struct bcmgenet_plat_data v4_plat_data = {
  3348. .version = GENET_V4,
  3349. .dma_max_burst_length = DMA_MAX_BURST_LENGTH,
  3350. };
  3351. static const struct bcmgenet_plat_data v5_plat_data = {
  3352. .version = GENET_V5,
  3353. .dma_max_burst_length = DMA_MAX_BURST_LENGTH,
  3354. };
  3355. static const struct bcmgenet_plat_data bcm2711_plat_data = {
  3356. .version = GENET_V5,
  3357. .dma_max_burst_length = 0x08,
  3358. };
  3359. static const struct bcmgenet_plat_data bcm7712_plat_data = {
  3360. .version = GENET_V5,
  3361. .dma_max_burst_length = DMA_MAX_BURST_LENGTH,
  3362. .ephy_16nm = true,
  3363. };
  3364. static const struct of_device_id bcmgenet_match[] = {
  3365. { .compatible = "brcm,genet-v1", .data = &v1_plat_data },
  3366. { .compatible = "brcm,genet-v2", .data = &v2_plat_data },
  3367. { .compatible = "brcm,genet-v3", .data = &v3_plat_data },
  3368. { .compatible = "brcm,genet-v4", .data = &v4_plat_data },
  3369. { .compatible = "brcm,genet-v5", .data = &v5_plat_data },
  3370. { .compatible = "brcm,bcm2711-genet-v5", .data = &bcm2711_plat_data },
  3371. { .compatible = "brcm,bcm7712-genet-v5", .data = &bcm7712_plat_data },
  3372. { },
  3373. };
  3374. MODULE_DEVICE_TABLE(of, bcmgenet_match);
  3375. static int bcmgenet_probe(struct platform_device *pdev)
  3376. {
  3377. struct bcmgenet_platform_data *pd = pdev->dev.platform_data;
  3378. const struct bcmgenet_plat_data *pdata;
  3379. struct bcmgenet_priv *priv;
  3380. struct net_device *dev;
  3381. unsigned int i;
  3382. int err = -EIO;
  3383. /* Up to GENET_MAX_MQ_CNT + 1 TX queues and RX queues */
  3384. dev = alloc_etherdev_mqs(sizeof(*priv), GENET_MAX_MQ_CNT + 1,
  3385. GENET_MAX_MQ_CNT + 1);
  3386. if (!dev) {
  3387. dev_err(&pdev->dev, "can't allocate net device\n");
  3388. return -ENOMEM;
  3389. }
  3390. priv = netdev_priv(dev);
  3391. priv->irq0 = platform_get_irq(pdev, 0);
  3392. if (priv->irq0 < 0) {
  3393. err = priv->irq0;
  3394. goto err;
  3395. }
  3396. priv->irq1 = platform_get_irq(pdev, 1);
  3397. if (priv->irq1 < 0) {
  3398. err = priv->irq1;
  3399. goto err;
  3400. }
  3401. priv->wol_irq = platform_get_irq_optional(pdev, 2);
  3402. if (priv->wol_irq == -EPROBE_DEFER) {
  3403. err = priv->wol_irq;
  3404. goto err;
  3405. }
  3406. priv->base = devm_platform_ioremap_resource(pdev, 0);
  3407. if (IS_ERR(priv->base)) {
  3408. err = PTR_ERR(priv->base);
  3409. goto err;
  3410. }
  3411. spin_lock_init(&priv->reg_lock);
  3412. spin_lock_init(&priv->lock);
  3413. /* Set default pause parameters */
  3414. priv->autoneg_pause = 1;
  3415. priv->tx_pause = 1;
  3416. priv->rx_pause = 1;
  3417. SET_NETDEV_DEV(dev, &pdev->dev);
  3418. dev_set_drvdata(&pdev->dev, dev);
  3419. dev->watchdog_timeo = 2 * HZ;
  3420. dev->ethtool_ops = &bcmgenet_ethtool_ops;
  3421. dev->netdev_ops = &bcmgenet_netdev_ops;
  3422. priv->msg_enable = netif_msg_init(-1, GENET_MSG_DEFAULT);
  3423. /* Set default features */
  3424. dev->features |= NETIF_F_SG | NETIF_F_HIGHDMA | NETIF_F_HW_CSUM |
  3425. NETIF_F_RXCSUM;
  3426. dev->hw_features |= dev->features;
  3427. dev->vlan_features |= dev->features;
  3428. /* Request the WOL interrupt and advertise suspend if available */
  3429. priv->wol_irq_disabled = true;
  3430. if (priv->wol_irq > 0) {
  3431. err = devm_request_irq(&pdev->dev, priv->wol_irq,
  3432. bcmgenet_wol_isr, 0, dev->name, priv);
  3433. if (!err)
  3434. device_set_wakeup_capable(&pdev->dev, 1);
  3435. }
  3436. /* Set the needed headroom to account for any possible
  3437. * features enabling/disabling at runtime
  3438. */
  3439. dev->needed_headroom += 64;
  3440. priv->dev = dev;
  3441. priv->pdev = pdev;
  3442. pdata = device_get_match_data(&pdev->dev);
  3443. if (pdata) {
  3444. priv->version = pdata->version;
  3445. priv->dma_max_burst_length = pdata->dma_max_burst_length;
  3446. priv->ephy_16nm = pdata->ephy_16nm;
  3447. } else {
  3448. priv->version = pd->genet_version;
  3449. priv->dma_max_burst_length = DMA_MAX_BURST_LENGTH;
  3450. }
  3451. priv->clk = devm_clk_get_optional(&priv->pdev->dev, "enet");
  3452. if (IS_ERR(priv->clk)) {
  3453. dev_dbg(&priv->pdev->dev, "failed to get enet clock\n");
  3454. err = PTR_ERR(priv->clk);
  3455. goto err;
  3456. }
  3457. err = clk_prepare_enable(priv->clk);
  3458. if (err)
  3459. goto err;
  3460. bcmgenet_set_hw_params(priv);
  3461. err = -EIO;
  3462. if (priv->hw_params->flags & GENET_HAS_40BITS)
  3463. err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(40));
  3464. if (err)
  3465. err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
  3466. if (err)
  3467. goto err_clk_disable;
  3468. /* Mii wait queue */
  3469. init_waitqueue_head(&priv->wq);
  3470. /* Always use RX_BUF_LENGTH (2KB) buffer for all chips */
  3471. priv->rx_buf_len = RX_BUF_LENGTH;
  3472. INIT_WORK(&priv->bcmgenet_irq_work, bcmgenet_irq_task);
  3473. priv->clk_wol = devm_clk_get_optional(&priv->pdev->dev, "enet-wol");
  3474. if (IS_ERR(priv->clk_wol)) {
  3475. dev_dbg(&priv->pdev->dev, "failed to get enet-wol clock\n");
  3476. err = PTR_ERR(priv->clk_wol);
  3477. goto err_clk_disable;
  3478. }
  3479. priv->clk_eee = devm_clk_get_optional(&priv->pdev->dev, "enet-eee");
  3480. if (IS_ERR(priv->clk_eee)) {
  3481. dev_dbg(&priv->pdev->dev, "failed to get enet-eee clock\n");
  3482. err = PTR_ERR(priv->clk_eee);
  3483. goto err_clk_disable;
  3484. }
  3485. /* If this is an internal GPHY, power it on now, before UniMAC is
  3486. * brought out of reset as absolutely no UniMAC activity is allowed
  3487. */
  3488. if (device_get_phy_mode(&pdev->dev) == PHY_INTERFACE_MODE_INTERNAL)
  3489. bcmgenet_power_up(priv, GENET_POWER_PASSIVE);
  3490. if (pd && !IS_ERR_OR_NULL(pd->mac_address))
  3491. eth_hw_addr_set(dev, pd->mac_address);
  3492. else
  3493. if (device_get_ethdev_address(&pdev->dev, dev))
  3494. if (has_acpi_companion(&pdev->dev)) {
  3495. u8 addr[ETH_ALEN];
  3496. bcmgenet_get_hw_addr(priv, addr);
  3497. eth_hw_addr_set(dev, addr);
  3498. }
  3499. if (!is_valid_ether_addr(dev->dev_addr)) {
  3500. dev_warn(&pdev->dev, "using random Ethernet MAC\n");
  3501. eth_hw_addr_random(dev);
  3502. }
  3503. reset_umac(priv);
  3504. err = bcmgenet_mii_init(dev);
  3505. if (err)
  3506. goto err_clk_disable;
  3507. /* setup number of real queues + 1 (GENET_V1 has 0 hardware queues
  3508. * just the ring 16 descriptor based TX
  3509. */
  3510. netif_set_real_num_tx_queues(priv->dev, priv->hw_params->tx_queues + 1);
  3511. netif_set_real_num_rx_queues(priv->dev, priv->hw_params->rx_queues + 1);
  3512. /* Set default coalescing parameters */
  3513. for (i = 0; i < priv->hw_params->rx_queues; i++)
  3514. priv->rx_rings[i].rx_max_coalesced_frames = 1;
  3515. priv->rx_rings[DESC_INDEX].rx_max_coalesced_frames = 1;
  3516. /* libphy will determine the link state */
  3517. netif_carrier_off(dev);
  3518. /* Turn off the main clock, WOL clock is handled separately */
  3519. clk_disable_unprepare(priv->clk);
  3520. err = register_netdev(dev);
  3521. if (err) {
  3522. bcmgenet_mii_exit(dev);
  3523. goto err;
  3524. }
  3525. return err;
  3526. err_clk_disable:
  3527. clk_disable_unprepare(priv->clk);
  3528. err:
  3529. free_netdev(dev);
  3530. return err;
  3531. }
  3532. static void bcmgenet_remove(struct platform_device *pdev)
  3533. {
  3534. struct bcmgenet_priv *priv = dev_to_priv(&pdev->dev);
  3535. dev_set_drvdata(&pdev->dev, NULL);
  3536. unregister_netdev(priv->dev);
  3537. bcmgenet_mii_exit(priv->dev);
  3538. free_netdev(priv->dev);
  3539. }
  3540. static void bcmgenet_shutdown(struct platform_device *pdev)
  3541. {
  3542. bcmgenet_remove(pdev);
  3543. }
  3544. #ifdef CONFIG_PM_SLEEP
  3545. static int bcmgenet_resume_noirq(struct device *d)
  3546. {
  3547. struct net_device *dev = dev_get_drvdata(d);
  3548. struct bcmgenet_priv *priv = netdev_priv(dev);
  3549. int ret;
  3550. u32 reg;
  3551. if (!netif_running(dev))
  3552. return 0;
  3553. /* Turn on the clock */
  3554. ret = clk_prepare_enable(priv->clk);
  3555. if (ret)
  3556. return ret;
  3557. if (device_may_wakeup(d) && priv->wolopts) {
  3558. /* Account for Wake-on-LAN events and clear those events
  3559. * (Some devices need more time between enabling the clocks
  3560. * and the interrupt register reflecting the wake event so
  3561. * read the register twice)
  3562. */
  3563. reg = bcmgenet_intrl2_0_readl(priv, INTRL2_CPU_STAT);
  3564. reg = bcmgenet_intrl2_0_readl(priv, INTRL2_CPU_STAT);
  3565. if (reg & UMAC_IRQ_WAKE_EVENT)
  3566. pm_wakeup_event(&priv->pdev->dev, 0);
  3567. }
  3568. bcmgenet_intrl2_0_writel(priv, UMAC_IRQ_WAKE_EVENT, INTRL2_CPU_CLEAR);
  3569. return 0;
  3570. }
  3571. static int bcmgenet_resume(struct device *d)
  3572. {
  3573. struct net_device *dev = dev_get_drvdata(d);
  3574. struct bcmgenet_priv *priv = netdev_priv(dev);
  3575. struct bcmgenet_rxnfc_rule *rule;
  3576. unsigned long dma_ctrl;
  3577. int ret;
  3578. if (!netif_running(dev))
  3579. return 0;
  3580. /* From WOL-enabled suspend, switch to regular clock */
  3581. if (device_may_wakeup(d) && priv->wolopts)
  3582. bcmgenet_power_up(priv, GENET_POWER_WOL_MAGIC);
  3583. /* If this is an internal GPHY, power it back on now, before UniMAC is
  3584. * brought out of reset as absolutely no UniMAC activity is allowed
  3585. */
  3586. if (priv->internal_phy)
  3587. bcmgenet_power_up(priv, GENET_POWER_PASSIVE);
  3588. bcmgenet_umac_reset(priv);
  3589. init_umac(priv);
  3590. phy_init_hw(dev->phydev);
  3591. /* Speed settings must be restored */
  3592. genphy_config_aneg(dev->phydev);
  3593. bcmgenet_mii_config(priv->dev, false);
  3594. /* Restore enabled features */
  3595. bcmgenet_set_features(dev, dev->features);
  3596. bcmgenet_set_hw_addr(priv, dev->dev_addr);
  3597. /* Restore hardware filters */
  3598. bcmgenet_hfb_clear(priv);
  3599. list_for_each_entry(rule, &priv->rxnfc_list, list)
  3600. if (rule->state != BCMGENET_RXNFC_STATE_UNUSED)
  3601. bcmgenet_hfb_create_rxnfc_filter(priv, rule);
  3602. /* Disable RX/TX DMA and flush TX queues */
  3603. dma_ctrl = bcmgenet_dma_disable(priv, false);
  3604. /* Reinitialize TDMA and RDMA and SW housekeeping */
  3605. ret = bcmgenet_init_dma(priv);
  3606. if (ret) {
  3607. netdev_err(dev, "failed to initialize DMA\n");
  3608. goto out_clk_disable;
  3609. }
  3610. /* Always enable ring 16 - descriptor ring */
  3611. bcmgenet_enable_dma(priv, dma_ctrl);
  3612. if (!device_may_wakeup(d))
  3613. phy_resume(dev->phydev);
  3614. bcmgenet_netif_start(dev);
  3615. netif_device_attach(dev);
  3616. return 0;
  3617. out_clk_disable:
  3618. if (priv->internal_phy)
  3619. bcmgenet_power_down(priv, GENET_POWER_PASSIVE);
  3620. clk_disable_unprepare(priv->clk);
  3621. return ret;
  3622. }
  3623. static int bcmgenet_suspend(struct device *d)
  3624. {
  3625. struct net_device *dev = dev_get_drvdata(d);
  3626. struct bcmgenet_priv *priv = netdev_priv(dev);
  3627. if (!netif_running(dev))
  3628. return 0;
  3629. netif_device_detach(dev);
  3630. bcmgenet_netif_stop(dev, true);
  3631. if (!device_may_wakeup(d))
  3632. phy_suspend(dev->phydev);
  3633. /* Disable filtering */
  3634. bcmgenet_hfb_reg_writel(priv, 0, HFB_CTRL);
  3635. return 0;
  3636. }
  3637. static int bcmgenet_suspend_noirq(struct device *d)
  3638. {
  3639. struct net_device *dev = dev_get_drvdata(d);
  3640. struct bcmgenet_priv *priv = netdev_priv(dev);
  3641. int ret = 0;
  3642. if (!netif_running(dev))
  3643. return 0;
  3644. /* Prepare the device for Wake-on-LAN and switch to the slow clock */
  3645. if (device_may_wakeup(d) && priv->wolopts)
  3646. ret = bcmgenet_power_down(priv, GENET_POWER_WOL_MAGIC);
  3647. else if (priv->internal_phy)
  3648. ret = bcmgenet_power_down(priv, GENET_POWER_PASSIVE);
  3649. /* Let the framework handle resumption and leave the clocks on */
  3650. if (ret)
  3651. return ret;
  3652. /* Turn off the clocks */
  3653. clk_disable_unprepare(priv->clk);
  3654. return 0;
  3655. }
  3656. #else
  3657. #define bcmgenet_suspend NULL
  3658. #define bcmgenet_suspend_noirq NULL
  3659. #define bcmgenet_resume NULL
  3660. #define bcmgenet_resume_noirq NULL
  3661. #endif /* CONFIG_PM_SLEEP */
  3662. static const struct dev_pm_ops bcmgenet_pm_ops = {
  3663. .suspend = bcmgenet_suspend,
  3664. .suspend_noirq = bcmgenet_suspend_noirq,
  3665. .resume = bcmgenet_resume,
  3666. .resume_noirq = bcmgenet_resume_noirq,
  3667. };
  3668. static const struct acpi_device_id genet_acpi_match[] = {
  3669. { "BCM6E4E", (kernel_ulong_t)&bcm2711_plat_data },
  3670. { },
  3671. };
  3672. MODULE_DEVICE_TABLE(acpi, genet_acpi_match);
  3673. static struct platform_driver bcmgenet_driver = {
  3674. .probe = bcmgenet_probe,
  3675. .remove_new = bcmgenet_remove,
  3676. .shutdown = bcmgenet_shutdown,
  3677. .driver = {
  3678. .name = "bcmgenet",
  3679. .of_match_table = bcmgenet_match,
  3680. .pm = &bcmgenet_pm_ops,
  3681. .acpi_match_table = genet_acpi_match,
  3682. },
  3683. };
  3684. module_platform_driver(bcmgenet_driver);
  3685. MODULE_AUTHOR("Broadcom Corporation");
  3686. MODULE_DESCRIPTION("Broadcom GENET Ethernet controller driver");
  3687. MODULE_ALIAS("platform:bcmgenet");
  3688. MODULE_LICENSE("GPL");
  3689. MODULE_SOFTDEP("pre: mdio-bcm-unimac");