mtk_wed.c 74 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /* Copyright (C) 2021 Felix Fietkau <nbd@nbd.name> */
  3. #include <linux/kernel.h>
  4. #include <linux/platform_device.h>
  5. #include <linux/slab.h>
  6. #include <linux/module.h>
  7. #include <linux/bitfield.h>
  8. #include <linux/dma-mapping.h>
  9. #include <linux/skbuff.h>
  10. #include <linux/of_platform.h>
  11. #include <linux/of_address.h>
  12. #include <linux/of_reserved_mem.h>
  13. #include <linux/mfd/syscon.h>
  14. #include <linux/debugfs.h>
  15. #include <linux/soc/mediatek/mtk_wed.h>
  16. #include <net/flow_offload.h>
  17. #include <net/pkt_cls.h>
  18. #include "mtk_eth_soc.h"
  19. #include "mtk_wed.h"
  20. #include "mtk_ppe.h"
  21. #include "mtk_wed_wo.h"
  22. #define MTK_PCIE_BASE(n) (0x1a143000 + (n) * 0x2000)
  23. #define MTK_WED_PKT_SIZE 1920
  24. #define MTK_WED_BUF_SIZE 2048
  25. #define MTK_WED_PAGE_BUF_SIZE 128
  26. #define MTK_WED_BUF_PER_PAGE (PAGE_SIZE / 2048)
  27. #define MTK_WED_RX_BUF_PER_PAGE (PAGE_SIZE / MTK_WED_PAGE_BUF_SIZE)
  28. #define MTK_WED_RX_RING_SIZE 1536
  29. #define MTK_WED_RX_PG_BM_CNT 8192
  30. #define MTK_WED_AMSDU_BUF_SIZE (PAGE_SIZE << 4)
  31. #define MTK_WED_AMSDU_NPAGES 32
  32. #define MTK_WED_TX_RING_SIZE 2048
  33. #define MTK_WED_WDMA_RING_SIZE 1024
  34. #define MTK_WED_MAX_GROUP_SIZE 0x100
  35. #define MTK_WED_VLD_GROUP_SIZE 0x40
  36. #define MTK_WED_PER_GROUP_PKT 128
  37. #define MTK_WED_FBUF_SIZE 128
  38. #define MTK_WED_MIOD_CNT 16
  39. #define MTK_WED_FB_CMD_CNT 1024
  40. #define MTK_WED_RRO_QUE_CNT 8192
  41. #define MTK_WED_MIOD_ENTRY_CNT 128
  42. #define MTK_WED_TX_BM_DMA_SIZE 65536
  43. #define MTK_WED_TX_BM_PKT_CNT 32768
  44. static struct mtk_wed_hw *hw_list[3];
  45. static DEFINE_MUTEX(hw_lock);
  46. struct mtk_wed_flow_block_priv {
  47. struct mtk_wed_hw *hw;
  48. struct net_device *dev;
  49. };
  50. static const struct mtk_wed_soc_data mt7622_data = {
  51. .regmap = {
  52. .tx_bm_tkid = 0x088,
  53. .wpdma_rx_ring0 = 0x770,
  54. .reset_idx_tx_mask = GENMASK(3, 0),
  55. .reset_idx_rx_mask = GENMASK(17, 16),
  56. },
  57. .tx_ring_desc_size = sizeof(struct mtk_wdma_desc),
  58. .wdma_desc_size = sizeof(struct mtk_wdma_desc),
  59. };
  60. static const struct mtk_wed_soc_data mt7986_data = {
  61. .regmap = {
  62. .tx_bm_tkid = 0x0c8,
  63. .wpdma_rx_ring0 = 0x770,
  64. .reset_idx_tx_mask = GENMASK(1, 0),
  65. .reset_idx_rx_mask = GENMASK(7, 6),
  66. },
  67. .tx_ring_desc_size = sizeof(struct mtk_wdma_desc),
  68. .wdma_desc_size = 2 * sizeof(struct mtk_wdma_desc),
  69. };
  70. static const struct mtk_wed_soc_data mt7988_data = {
  71. .regmap = {
  72. .tx_bm_tkid = 0x0c8,
  73. .wpdma_rx_ring0 = 0x7d0,
  74. .reset_idx_tx_mask = GENMASK(1, 0),
  75. .reset_idx_rx_mask = GENMASK(7, 6),
  76. },
  77. .tx_ring_desc_size = sizeof(struct mtk_wed_bm_desc),
  78. .wdma_desc_size = 2 * sizeof(struct mtk_wdma_desc),
  79. };
  80. static void
  81. wed_m32(struct mtk_wed_device *dev, u32 reg, u32 mask, u32 val)
  82. {
  83. regmap_update_bits(dev->hw->regs, reg, mask | val, val);
  84. }
  85. static void
  86. wed_set(struct mtk_wed_device *dev, u32 reg, u32 mask)
  87. {
  88. return wed_m32(dev, reg, 0, mask);
  89. }
  90. static void
  91. wed_clr(struct mtk_wed_device *dev, u32 reg, u32 mask)
  92. {
  93. return wed_m32(dev, reg, mask, 0);
  94. }
  95. static void
  96. wdma_m32(struct mtk_wed_device *dev, u32 reg, u32 mask, u32 val)
  97. {
  98. wdma_w32(dev, reg, (wdma_r32(dev, reg) & ~mask) | val);
  99. }
  100. static void
  101. wdma_set(struct mtk_wed_device *dev, u32 reg, u32 mask)
  102. {
  103. wdma_m32(dev, reg, 0, mask);
  104. }
  105. static void
  106. wdma_clr(struct mtk_wed_device *dev, u32 reg, u32 mask)
  107. {
  108. wdma_m32(dev, reg, mask, 0);
  109. }
  110. static u32
  111. wifi_r32(struct mtk_wed_device *dev, u32 reg)
  112. {
  113. return readl(dev->wlan.base + reg);
  114. }
  115. static void
  116. wifi_w32(struct mtk_wed_device *dev, u32 reg, u32 val)
  117. {
  118. writel(val, dev->wlan.base + reg);
  119. }
  120. static u32
  121. mtk_wed_read_reset(struct mtk_wed_device *dev)
  122. {
  123. return wed_r32(dev, MTK_WED_RESET);
  124. }
  125. static u32
  126. mtk_wdma_read_reset(struct mtk_wed_device *dev)
  127. {
  128. return wdma_r32(dev, MTK_WDMA_GLO_CFG);
  129. }
  130. static void
  131. mtk_wdma_v3_rx_reset(struct mtk_wed_device *dev)
  132. {
  133. u32 status;
  134. if (!mtk_wed_is_v3_or_greater(dev->hw))
  135. return;
  136. wdma_clr(dev, MTK_WDMA_PREF_TX_CFG, MTK_WDMA_PREF_TX_CFG_PREF_EN);
  137. wdma_clr(dev, MTK_WDMA_PREF_RX_CFG, MTK_WDMA_PREF_RX_CFG_PREF_EN);
  138. if (read_poll_timeout(wdma_r32, status,
  139. !(status & MTK_WDMA_PREF_TX_CFG_PREF_BUSY),
  140. 0, 10000, false, dev, MTK_WDMA_PREF_TX_CFG))
  141. dev_err(dev->hw->dev, "rx reset failed\n");
  142. if (read_poll_timeout(wdma_r32, status,
  143. !(status & MTK_WDMA_PREF_RX_CFG_PREF_BUSY),
  144. 0, 10000, false, dev, MTK_WDMA_PREF_RX_CFG))
  145. dev_err(dev->hw->dev, "rx reset failed\n");
  146. wdma_clr(dev, MTK_WDMA_WRBK_TX_CFG, MTK_WDMA_WRBK_TX_CFG_WRBK_EN);
  147. wdma_clr(dev, MTK_WDMA_WRBK_RX_CFG, MTK_WDMA_WRBK_RX_CFG_WRBK_EN);
  148. if (read_poll_timeout(wdma_r32, status,
  149. !(status & MTK_WDMA_WRBK_TX_CFG_WRBK_BUSY),
  150. 0, 10000, false, dev, MTK_WDMA_WRBK_TX_CFG))
  151. dev_err(dev->hw->dev, "rx reset failed\n");
  152. if (read_poll_timeout(wdma_r32, status,
  153. !(status & MTK_WDMA_WRBK_RX_CFG_WRBK_BUSY),
  154. 0, 10000, false, dev, MTK_WDMA_WRBK_RX_CFG))
  155. dev_err(dev->hw->dev, "rx reset failed\n");
  156. /* prefetch FIFO */
  157. wdma_w32(dev, MTK_WDMA_PREF_RX_FIFO_CFG,
  158. MTK_WDMA_PREF_RX_FIFO_CFG_RING0_CLEAR |
  159. MTK_WDMA_PREF_RX_FIFO_CFG_RING1_CLEAR);
  160. wdma_clr(dev, MTK_WDMA_PREF_RX_FIFO_CFG,
  161. MTK_WDMA_PREF_RX_FIFO_CFG_RING0_CLEAR |
  162. MTK_WDMA_PREF_RX_FIFO_CFG_RING1_CLEAR);
  163. /* core FIFO */
  164. wdma_w32(dev, MTK_WDMA_XDMA_RX_FIFO_CFG,
  165. MTK_WDMA_XDMA_RX_FIFO_CFG_RX_PAR_FIFO_CLEAR |
  166. MTK_WDMA_XDMA_RX_FIFO_CFG_RX_CMD_FIFO_CLEAR |
  167. MTK_WDMA_XDMA_RX_FIFO_CFG_RX_DMAD_FIFO_CLEAR |
  168. MTK_WDMA_XDMA_RX_FIFO_CFG_RX_ARR_FIFO_CLEAR |
  169. MTK_WDMA_XDMA_RX_FIFO_CFG_RX_LEN_FIFO_CLEAR |
  170. MTK_WDMA_XDMA_RX_FIFO_CFG_RX_WID_FIFO_CLEAR |
  171. MTK_WDMA_XDMA_RX_FIFO_CFG_RX_BID_FIFO_CLEAR);
  172. wdma_clr(dev, MTK_WDMA_XDMA_RX_FIFO_CFG,
  173. MTK_WDMA_XDMA_RX_FIFO_CFG_RX_PAR_FIFO_CLEAR |
  174. MTK_WDMA_XDMA_RX_FIFO_CFG_RX_CMD_FIFO_CLEAR |
  175. MTK_WDMA_XDMA_RX_FIFO_CFG_RX_DMAD_FIFO_CLEAR |
  176. MTK_WDMA_XDMA_RX_FIFO_CFG_RX_ARR_FIFO_CLEAR |
  177. MTK_WDMA_XDMA_RX_FIFO_CFG_RX_LEN_FIFO_CLEAR |
  178. MTK_WDMA_XDMA_RX_FIFO_CFG_RX_WID_FIFO_CLEAR |
  179. MTK_WDMA_XDMA_RX_FIFO_CFG_RX_BID_FIFO_CLEAR);
  180. /* writeback FIFO */
  181. wdma_w32(dev, MTK_WDMA_WRBK_RX_FIFO_CFG(0),
  182. MTK_WDMA_WRBK_RX_FIFO_CFG_RING_CLEAR);
  183. wdma_w32(dev, MTK_WDMA_WRBK_RX_FIFO_CFG(1),
  184. MTK_WDMA_WRBK_RX_FIFO_CFG_RING_CLEAR);
  185. wdma_clr(dev, MTK_WDMA_WRBK_RX_FIFO_CFG(0),
  186. MTK_WDMA_WRBK_RX_FIFO_CFG_RING_CLEAR);
  187. wdma_clr(dev, MTK_WDMA_WRBK_RX_FIFO_CFG(1),
  188. MTK_WDMA_WRBK_RX_FIFO_CFG_RING_CLEAR);
  189. /* prefetch ring status */
  190. wdma_w32(dev, MTK_WDMA_PREF_SIDX_CFG,
  191. MTK_WDMA_PREF_SIDX_CFG_RX_RING_CLEAR);
  192. wdma_clr(dev, MTK_WDMA_PREF_SIDX_CFG,
  193. MTK_WDMA_PREF_SIDX_CFG_RX_RING_CLEAR);
  194. /* writeback ring status */
  195. wdma_w32(dev, MTK_WDMA_WRBK_SIDX_CFG,
  196. MTK_WDMA_WRBK_SIDX_CFG_RX_RING_CLEAR);
  197. wdma_clr(dev, MTK_WDMA_WRBK_SIDX_CFG,
  198. MTK_WDMA_WRBK_SIDX_CFG_RX_RING_CLEAR);
  199. }
  200. static int
  201. mtk_wdma_rx_reset(struct mtk_wed_device *dev)
  202. {
  203. u32 status, mask = MTK_WDMA_GLO_CFG_RX_DMA_BUSY;
  204. int i, ret;
  205. wdma_clr(dev, MTK_WDMA_GLO_CFG, MTK_WDMA_GLO_CFG_RX_DMA_EN);
  206. ret = readx_poll_timeout(mtk_wdma_read_reset, dev, status,
  207. !(status & mask), 0, 10000);
  208. if (ret)
  209. dev_err(dev->hw->dev, "rx reset failed\n");
  210. mtk_wdma_v3_rx_reset(dev);
  211. wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_RX);
  212. wdma_w32(dev, MTK_WDMA_RESET_IDX, 0);
  213. for (i = 0; i < ARRAY_SIZE(dev->rx_wdma); i++) {
  214. if (dev->rx_wdma[i].desc)
  215. continue;
  216. wdma_w32(dev,
  217. MTK_WDMA_RING_RX(i) + MTK_WED_RING_OFS_CPU_IDX, 0);
  218. }
  219. return ret;
  220. }
  221. static u32
  222. mtk_wed_check_busy(struct mtk_wed_device *dev, u32 reg, u32 mask)
  223. {
  224. return !!(wed_r32(dev, reg) & mask);
  225. }
  226. static int
  227. mtk_wed_poll_busy(struct mtk_wed_device *dev, u32 reg, u32 mask)
  228. {
  229. int sleep = 15000;
  230. int timeout = 100 * sleep;
  231. u32 val;
  232. return read_poll_timeout(mtk_wed_check_busy, val, !val, sleep,
  233. timeout, false, dev, reg, mask);
  234. }
  235. static void
  236. mtk_wdma_v3_tx_reset(struct mtk_wed_device *dev)
  237. {
  238. u32 status;
  239. if (!mtk_wed_is_v3_or_greater(dev->hw))
  240. return;
  241. wdma_clr(dev, MTK_WDMA_PREF_TX_CFG, MTK_WDMA_PREF_TX_CFG_PREF_EN);
  242. wdma_clr(dev, MTK_WDMA_PREF_RX_CFG, MTK_WDMA_PREF_RX_CFG_PREF_EN);
  243. if (read_poll_timeout(wdma_r32, status,
  244. !(status & MTK_WDMA_PREF_TX_CFG_PREF_BUSY),
  245. 0, 10000, false, dev, MTK_WDMA_PREF_TX_CFG))
  246. dev_err(dev->hw->dev, "tx reset failed\n");
  247. if (read_poll_timeout(wdma_r32, status,
  248. !(status & MTK_WDMA_PREF_RX_CFG_PREF_BUSY),
  249. 0, 10000, false, dev, MTK_WDMA_PREF_RX_CFG))
  250. dev_err(dev->hw->dev, "tx reset failed\n");
  251. wdma_clr(dev, MTK_WDMA_WRBK_TX_CFG, MTK_WDMA_WRBK_TX_CFG_WRBK_EN);
  252. wdma_clr(dev, MTK_WDMA_WRBK_RX_CFG, MTK_WDMA_WRBK_RX_CFG_WRBK_EN);
  253. if (read_poll_timeout(wdma_r32, status,
  254. !(status & MTK_WDMA_WRBK_TX_CFG_WRBK_BUSY),
  255. 0, 10000, false, dev, MTK_WDMA_WRBK_TX_CFG))
  256. dev_err(dev->hw->dev, "tx reset failed\n");
  257. if (read_poll_timeout(wdma_r32, status,
  258. !(status & MTK_WDMA_WRBK_RX_CFG_WRBK_BUSY),
  259. 0, 10000, false, dev, MTK_WDMA_WRBK_RX_CFG))
  260. dev_err(dev->hw->dev, "tx reset failed\n");
  261. /* prefetch FIFO */
  262. wdma_w32(dev, MTK_WDMA_PREF_TX_FIFO_CFG,
  263. MTK_WDMA_PREF_TX_FIFO_CFG_RING0_CLEAR |
  264. MTK_WDMA_PREF_TX_FIFO_CFG_RING1_CLEAR);
  265. wdma_clr(dev, MTK_WDMA_PREF_TX_FIFO_CFG,
  266. MTK_WDMA_PREF_TX_FIFO_CFG_RING0_CLEAR |
  267. MTK_WDMA_PREF_TX_FIFO_CFG_RING1_CLEAR);
  268. /* core FIFO */
  269. wdma_w32(dev, MTK_WDMA_XDMA_TX_FIFO_CFG,
  270. MTK_WDMA_XDMA_TX_FIFO_CFG_TX_PAR_FIFO_CLEAR |
  271. MTK_WDMA_XDMA_TX_FIFO_CFG_TX_CMD_FIFO_CLEAR |
  272. MTK_WDMA_XDMA_TX_FIFO_CFG_TX_DMAD_FIFO_CLEAR |
  273. MTK_WDMA_XDMA_TX_FIFO_CFG_TX_ARR_FIFO_CLEAR);
  274. wdma_clr(dev, MTK_WDMA_XDMA_TX_FIFO_CFG,
  275. MTK_WDMA_XDMA_TX_FIFO_CFG_TX_PAR_FIFO_CLEAR |
  276. MTK_WDMA_XDMA_TX_FIFO_CFG_TX_CMD_FIFO_CLEAR |
  277. MTK_WDMA_XDMA_TX_FIFO_CFG_TX_DMAD_FIFO_CLEAR |
  278. MTK_WDMA_XDMA_TX_FIFO_CFG_TX_ARR_FIFO_CLEAR);
  279. /* writeback FIFO */
  280. wdma_w32(dev, MTK_WDMA_WRBK_TX_FIFO_CFG(0),
  281. MTK_WDMA_WRBK_TX_FIFO_CFG_RING_CLEAR);
  282. wdma_w32(dev, MTK_WDMA_WRBK_TX_FIFO_CFG(1),
  283. MTK_WDMA_WRBK_TX_FIFO_CFG_RING_CLEAR);
  284. wdma_clr(dev, MTK_WDMA_WRBK_TX_FIFO_CFG(0),
  285. MTK_WDMA_WRBK_TX_FIFO_CFG_RING_CLEAR);
  286. wdma_clr(dev, MTK_WDMA_WRBK_TX_FIFO_CFG(1),
  287. MTK_WDMA_WRBK_TX_FIFO_CFG_RING_CLEAR);
  288. /* prefetch ring status */
  289. wdma_w32(dev, MTK_WDMA_PREF_SIDX_CFG,
  290. MTK_WDMA_PREF_SIDX_CFG_TX_RING_CLEAR);
  291. wdma_clr(dev, MTK_WDMA_PREF_SIDX_CFG,
  292. MTK_WDMA_PREF_SIDX_CFG_TX_RING_CLEAR);
  293. /* writeback ring status */
  294. wdma_w32(dev, MTK_WDMA_WRBK_SIDX_CFG,
  295. MTK_WDMA_WRBK_SIDX_CFG_TX_RING_CLEAR);
  296. wdma_clr(dev, MTK_WDMA_WRBK_SIDX_CFG,
  297. MTK_WDMA_WRBK_SIDX_CFG_TX_RING_CLEAR);
  298. }
  299. static void
  300. mtk_wdma_tx_reset(struct mtk_wed_device *dev)
  301. {
  302. u32 status, mask = MTK_WDMA_GLO_CFG_TX_DMA_BUSY;
  303. int i;
  304. wdma_clr(dev, MTK_WDMA_GLO_CFG, MTK_WDMA_GLO_CFG_TX_DMA_EN);
  305. if (readx_poll_timeout(mtk_wdma_read_reset, dev, status,
  306. !(status & mask), 0, 10000))
  307. dev_err(dev->hw->dev, "tx reset failed\n");
  308. mtk_wdma_v3_tx_reset(dev);
  309. wdma_w32(dev, MTK_WDMA_RESET_IDX, MTK_WDMA_RESET_IDX_TX);
  310. wdma_w32(dev, MTK_WDMA_RESET_IDX, 0);
  311. for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++)
  312. wdma_w32(dev,
  313. MTK_WDMA_RING_TX(i) + MTK_WED_RING_OFS_CPU_IDX, 0);
  314. }
  315. static void
  316. mtk_wed_reset(struct mtk_wed_device *dev, u32 mask)
  317. {
  318. u32 status;
  319. wed_w32(dev, MTK_WED_RESET, mask);
  320. if (readx_poll_timeout(mtk_wed_read_reset, dev, status,
  321. !(status & mask), 0, 1000))
  322. WARN_ON_ONCE(1);
  323. }
  324. static u32
  325. mtk_wed_wo_read_status(struct mtk_wed_device *dev)
  326. {
  327. return wed_r32(dev, MTK_WED_SCR0 + 4 * MTK_WED_DUMMY_CR_WO_STATUS);
  328. }
  329. static void
  330. mtk_wed_wo_reset(struct mtk_wed_device *dev)
  331. {
  332. struct mtk_wed_wo *wo = dev->hw->wed_wo;
  333. u8 state = MTK_WED_WO_STATE_DISABLE;
  334. void __iomem *reg;
  335. u32 val;
  336. mtk_wdma_tx_reset(dev);
  337. mtk_wed_reset(dev, MTK_WED_RESET_WED);
  338. if (mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO,
  339. MTK_WED_WO_CMD_CHANGE_STATE, &state,
  340. sizeof(state), false))
  341. return;
  342. if (readx_poll_timeout(mtk_wed_wo_read_status, dev, val,
  343. val == MTK_WED_WOIF_DISABLE_DONE,
  344. 100, MTK_WOCPU_TIMEOUT))
  345. dev_err(dev->hw->dev, "failed to disable wed-wo\n");
  346. reg = ioremap(MTK_WED_WO_CPU_MCUSYS_RESET_ADDR, 4);
  347. val = readl(reg);
  348. switch (dev->hw->index) {
  349. case 0:
  350. val |= MTK_WED_WO_CPU_WO0_MCUSYS_RESET_MASK;
  351. writel(val, reg);
  352. val &= ~MTK_WED_WO_CPU_WO0_MCUSYS_RESET_MASK;
  353. writel(val, reg);
  354. break;
  355. case 1:
  356. val |= MTK_WED_WO_CPU_WO1_MCUSYS_RESET_MASK;
  357. writel(val, reg);
  358. val &= ~MTK_WED_WO_CPU_WO1_MCUSYS_RESET_MASK;
  359. writel(val, reg);
  360. break;
  361. default:
  362. break;
  363. }
  364. iounmap(reg);
  365. }
  366. void mtk_wed_fe_reset(void)
  367. {
  368. int i;
  369. mutex_lock(&hw_lock);
  370. for (i = 0; i < ARRAY_SIZE(hw_list); i++) {
  371. struct mtk_wed_hw *hw = hw_list[i];
  372. struct mtk_wed_device *dev;
  373. int err;
  374. if (!hw)
  375. break;
  376. dev = hw->wed_dev;
  377. if (!dev || !dev->wlan.reset)
  378. continue;
  379. /* reset callback blocks until WLAN reset is completed */
  380. err = dev->wlan.reset(dev);
  381. if (err)
  382. dev_err(dev->dev, "wlan reset failed: %d\n", err);
  383. }
  384. mutex_unlock(&hw_lock);
  385. }
  386. void mtk_wed_fe_reset_complete(void)
  387. {
  388. int i;
  389. mutex_lock(&hw_lock);
  390. for (i = 0; i < ARRAY_SIZE(hw_list); i++) {
  391. struct mtk_wed_hw *hw = hw_list[i];
  392. struct mtk_wed_device *dev;
  393. if (!hw)
  394. break;
  395. dev = hw->wed_dev;
  396. if (!dev || !dev->wlan.reset_complete)
  397. continue;
  398. dev->wlan.reset_complete(dev);
  399. }
  400. mutex_unlock(&hw_lock);
  401. }
  402. static struct mtk_wed_hw *
  403. mtk_wed_assign(struct mtk_wed_device *dev)
  404. {
  405. struct mtk_wed_hw *hw;
  406. int i;
  407. if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) {
  408. hw = hw_list[pci_domain_nr(dev->wlan.pci_dev->bus)];
  409. if (!hw)
  410. return NULL;
  411. if (!hw->wed_dev)
  412. goto out;
  413. if (mtk_wed_is_v1(hw))
  414. return NULL;
  415. /* MT7986 WED devices do not have any pcie slot restrictions */
  416. }
  417. /* MT7986 PCIE or AXI */
  418. for (i = 0; i < ARRAY_SIZE(hw_list); i++) {
  419. hw = hw_list[i];
  420. if (hw && !hw->wed_dev)
  421. goto out;
  422. }
  423. return NULL;
  424. out:
  425. hw->wed_dev = dev;
  426. return hw;
  427. }
  428. static int
  429. mtk_wed_amsdu_buffer_alloc(struct mtk_wed_device *dev)
  430. {
  431. struct mtk_wed_hw *hw = dev->hw;
  432. struct mtk_wed_amsdu *wed_amsdu;
  433. int i;
  434. if (!mtk_wed_is_v3_or_greater(hw))
  435. return 0;
  436. wed_amsdu = devm_kcalloc(hw->dev, MTK_WED_AMSDU_NPAGES,
  437. sizeof(*wed_amsdu), GFP_KERNEL);
  438. if (!wed_amsdu)
  439. return -ENOMEM;
  440. for (i = 0; i < MTK_WED_AMSDU_NPAGES; i++) {
  441. void *ptr;
  442. /* each segment is 64K */
  443. ptr = (void *)__get_free_pages(GFP_KERNEL | __GFP_NOWARN |
  444. __GFP_ZERO | __GFP_COMP |
  445. GFP_DMA32,
  446. get_order(MTK_WED_AMSDU_BUF_SIZE));
  447. if (!ptr)
  448. goto error;
  449. wed_amsdu[i].txd = ptr;
  450. wed_amsdu[i].txd_phy = dma_map_single(hw->dev, ptr,
  451. MTK_WED_AMSDU_BUF_SIZE,
  452. DMA_TO_DEVICE);
  453. if (dma_mapping_error(hw->dev, wed_amsdu[i].txd_phy))
  454. goto error;
  455. }
  456. dev->hw->wed_amsdu = wed_amsdu;
  457. return 0;
  458. error:
  459. for (i--; i >= 0; i--)
  460. dma_unmap_single(hw->dev, wed_amsdu[i].txd_phy,
  461. MTK_WED_AMSDU_BUF_SIZE, DMA_TO_DEVICE);
  462. return -ENOMEM;
  463. }
  464. static void
  465. mtk_wed_amsdu_free_buffer(struct mtk_wed_device *dev)
  466. {
  467. struct mtk_wed_amsdu *wed_amsdu = dev->hw->wed_amsdu;
  468. int i;
  469. if (!wed_amsdu)
  470. return;
  471. for (i = 0; i < MTK_WED_AMSDU_NPAGES; i++) {
  472. dma_unmap_single(dev->hw->dev, wed_amsdu[i].txd_phy,
  473. MTK_WED_AMSDU_BUF_SIZE, DMA_TO_DEVICE);
  474. free_pages((unsigned long)wed_amsdu[i].txd,
  475. get_order(MTK_WED_AMSDU_BUF_SIZE));
  476. }
  477. }
  478. static int
  479. mtk_wed_amsdu_init(struct mtk_wed_device *dev)
  480. {
  481. struct mtk_wed_amsdu *wed_amsdu = dev->hw->wed_amsdu;
  482. int i, ret;
  483. if (!wed_amsdu)
  484. return 0;
  485. for (i = 0; i < MTK_WED_AMSDU_NPAGES; i++)
  486. wed_w32(dev, MTK_WED_AMSDU_HIFTXD_BASE_L(i),
  487. wed_amsdu[i].txd_phy);
  488. /* init all sta parameter */
  489. wed_w32(dev, MTK_WED_AMSDU_STA_INFO_INIT, MTK_WED_AMSDU_STA_RMVL |
  490. MTK_WED_AMSDU_STA_WTBL_HDRT_MODE |
  491. FIELD_PREP(MTK_WED_AMSDU_STA_MAX_AMSDU_LEN,
  492. dev->wlan.amsdu_max_len >> 8) |
  493. FIELD_PREP(MTK_WED_AMSDU_STA_MAX_AMSDU_NUM,
  494. dev->wlan.amsdu_max_subframes));
  495. wed_w32(dev, MTK_WED_AMSDU_STA_INFO, MTK_WED_AMSDU_STA_INFO_DO_INIT);
  496. ret = mtk_wed_poll_busy(dev, MTK_WED_AMSDU_STA_INFO,
  497. MTK_WED_AMSDU_STA_INFO_DO_INIT);
  498. if (ret) {
  499. dev_err(dev->hw->dev, "amsdu initialization failed\n");
  500. return ret;
  501. }
  502. /* init partial amsdu offload txd src */
  503. wed_set(dev, MTK_WED_AMSDU_HIFTXD_CFG,
  504. FIELD_PREP(MTK_WED_AMSDU_HIFTXD_SRC, dev->hw->index));
  505. /* init qmem */
  506. wed_set(dev, MTK_WED_AMSDU_PSE, MTK_WED_AMSDU_PSE_RESET);
  507. ret = mtk_wed_poll_busy(dev, MTK_WED_MON_AMSDU_QMEM_STS1, BIT(29));
  508. if (ret) {
  509. pr_info("%s: amsdu qmem initialization failed\n", __func__);
  510. return ret;
  511. }
  512. /* eagle E1 PCIE1 tx ring 22 flow control issue */
  513. if (dev->wlan.id == 0x7991)
  514. wed_clr(dev, MTK_WED_AMSDU_FIFO, MTK_WED_AMSDU_IS_PRIOR0_RING);
  515. wed_set(dev, MTK_WED_CTRL, MTK_WED_CTRL_TX_AMSDU_EN);
  516. return 0;
  517. }
  518. static int
  519. mtk_wed_tx_buffer_alloc(struct mtk_wed_device *dev)
  520. {
  521. u32 desc_size = dev->hw->soc->tx_ring_desc_size;
  522. int i, page_idx = 0, n_pages, ring_size;
  523. int token = dev->wlan.token_start;
  524. struct mtk_wed_buf *page_list;
  525. dma_addr_t desc_phys;
  526. void *desc_ptr;
  527. if (!mtk_wed_is_v3_or_greater(dev->hw)) {
  528. ring_size = dev->wlan.nbuf & ~(MTK_WED_BUF_PER_PAGE - 1);
  529. dev->tx_buf_ring.size = ring_size;
  530. } else {
  531. dev->tx_buf_ring.size = MTK_WED_TX_BM_DMA_SIZE;
  532. ring_size = MTK_WED_TX_BM_PKT_CNT;
  533. }
  534. n_pages = dev->tx_buf_ring.size / MTK_WED_BUF_PER_PAGE;
  535. page_list = kcalloc(n_pages, sizeof(*page_list), GFP_KERNEL);
  536. if (!page_list)
  537. return -ENOMEM;
  538. dev->tx_buf_ring.pages = page_list;
  539. desc_ptr = dma_alloc_coherent(dev->hw->dev,
  540. dev->tx_buf_ring.size * desc_size,
  541. &desc_phys, GFP_KERNEL);
  542. if (!desc_ptr)
  543. return -ENOMEM;
  544. dev->tx_buf_ring.desc = desc_ptr;
  545. dev->tx_buf_ring.desc_phys = desc_phys;
  546. for (i = 0; i < ring_size; i += MTK_WED_BUF_PER_PAGE) {
  547. dma_addr_t page_phys, buf_phys;
  548. struct page *page;
  549. void *buf;
  550. int s;
  551. page = __dev_alloc_page(GFP_KERNEL);
  552. if (!page)
  553. return -ENOMEM;
  554. page_phys = dma_map_page(dev->hw->dev, page, 0, PAGE_SIZE,
  555. DMA_BIDIRECTIONAL);
  556. if (dma_mapping_error(dev->hw->dev, page_phys)) {
  557. __free_page(page);
  558. return -ENOMEM;
  559. }
  560. page_list[page_idx].p = page;
  561. page_list[page_idx++].phy_addr = page_phys;
  562. dma_sync_single_for_cpu(dev->hw->dev, page_phys, PAGE_SIZE,
  563. DMA_BIDIRECTIONAL);
  564. buf = page_to_virt(page);
  565. buf_phys = page_phys;
  566. for (s = 0; s < MTK_WED_BUF_PER_PAGE; s++) {
  567. struct mtk_wdma_desc *desc = desc_ptr;
  568. u32 ctrl;
  569. desc->buf0 = cpu_to_le32(buf_phys);
  570. if (!mtk_wed_is_v3_or_greater(dev->hw)) {
  571. u32 txd_size;
  572. txd_size = dev->wlan.init_buf(buf, buf_phys,
  573. token++);
  574. desc->buf1 = cpu_to_le32(buf_phys + txd_size);
  575. ctrl = FIELD_PREP(MTK_WDMA_DESC_CTRL_LEN0, txd_size);
  576. if (mtk_wed_is_v1(dev->hw))
  577. ctrl |= MTK_WDMA_DESC_CTRL_LAST_SEG1 |
  578. FIELD_PREP(MTK_WDMA_DESC_CTRL_LEN1,
  579. MTK_WED_BUF_SIZE - txd_size);
  580. else
  581. ctrl |= MTK_WDMA_DESC_CTRL_LAST_SEG0 |
  582. FIELD_PREP(MTK_WDMA_DESC_CTRL_LEN1_V2,
  583. MTK_WED_BUF_SIZE - txd_size);
  584. desc->info = 0;
  585. } else {
  586. ctrl = token << 16 | TX_DMA_PREP_ADDR64(buf_phys);
  587. }
  588. desc->ctrl = cpu_to_le32(ctrl);
  589. desc_ptr += desc_size;
  590. buf += MTK_WED_BUF_SIZE;
  591. buf_phys += MTK_WED_BUF_SIZE;
  592. }
  593. dma_sync_single_for_device(dev->hw->dev, page_phys, PAGE_SIZE,
  594. DMA_BIDIRECTIONAL);
  595. }
  596. return 0;
  597. }
  598. static void
  599. mtk_wed_free_tx_buffer(struct mtk_wed_device *dev)
  600. {
  601. struct mtk_wed_buf *page_list = dev->tx_buf_ring.pages;
  602. struct mtk_wed_hw *hw = dev->hw;
  603. int i, page_idx = 0;
  604. if (!page_list)
  605. return;
  606. if (!dev->tx_buf_ring.desc)
  607. goto free_pagelist;
  608. for (i = 0; i < dev->tx_buf_ring.size; i += MTK_WED_BUF_PER_PAGE) {
  609. dma_addr_t page_phy = page_list[page_idx].phy_addr;
  610. void *page = page_list[page_idx++].p;
  611. if (!page)
  612. break;
  613. dma_unmap_page(dev->hw->dev, page_phy, PAGE_SIZE,
  614. DMA_BIDIRECTIONAL);
  615. __free_page(page);
  616. }
  617. dma_free_coherent(dev->hw->dev,
  618. dev->tx_buf_ring.size * hw->soc->tx_ring_desc_size,
  619. dev->tx_buf_ring.desc,
  620. dev->tx_buf_ring.desc_phys);
  621. free_pagelist:
  622. kfree(page_list);
  623. }
  624. static int
  625. mtk_wed_hwrro_buffer_alloc(struct mtk_wed_device *dev)
  626. {
  627. int n_pages = MTK_WED_RX_PG_BM_CNT / MTK_WED_RX_BUF_PER_PAGE;
  628. struct mtk_wed_buf *page_list;
  629. struct mtk_wed_bm_desc *desc;
  630. dma_addr_t desc_phys;
  631. int i, page_idx = 0;
  632. if (!dev->wlan.hw_rro)
  633. return 0;
  634. page_list = kcalloc(n_pages, sizeof(*page_list), GFP_KERNEL);
  635. if (!page_list)
  636. return -ENOMEM;
  637. dev->hw_rro.size = dev->wlan.rx_nbuf & ~(MTK_WED_BUF_PER_PAGE - 1);
  638. dev->hw_rro.pages = page_list;
  639. desc = dma_alloc_coherent(dev->hw->dev,
  640. dev->wlan.rx_nbuf * sizeof(*desc),
  641. &desc_phys, GFP_KERNEL);
  642. if (!desc)
  643. return -ENOMEM;
  644. dev->hw_rro.desc = desc;
  645. dev->hw_rro.desc_phys = desc_phys;
  646. for (i = 0; i < MTK_WED_RX_PG_BM_CNT; i += MTK_WED_RX_BUF_PER_PAGE) {
  647. dma_addr_t page_phys, buf_phys;
  648. struct page *page;
  649. int s;
  650. page = __dev_alloc_page(GFP_KERNEL);
  651. if (!page)
  652. return -ENOMEM;
  653. page_phys = dma_map_page(dev->hw->dev, page, 0, PAGE_SIZE,
  654. DMA_BIDIRECTIONAL);
  655. if (dma_mapping_error(dev->hw->dev, page_phys)) {
  656. __free_page(page);
  657. return -ENOMEM;
  658. }
  659. page_list[page_idx].p = page;
  660. page_list[page_idx++].phy_addr = page_phys;
  661. dma_sync_single_for_cpu(dev->hw->dev, page_phys, PAGE_SIZE,
  662. DMA_BIDIRECTIONAL);
  663. buf_phys = page_phys;
  664. for (s = 0; s < MTK_WED_RX_BUF_PER_PAGE; s++) {
  665. desc->buf0 = cpu_to_le32(buf_phys);
  666. desc->token = cpu_to_le32(RX_DMA_PREP_ADDR64(buf_phys));
  667. buf_phys += MTK_WED_PAGE_BUF_SIZE;
  668. desc++;
  669. }
  670. dma_sync_single_for_device(dev->hw->dev, page_phys, PAGE_SIZE,
  671. DMA_BIDIRECTIONAL);
  672. }
  673. return 0;
  674. }
  675. static int
  676. mtk_wed_rx_buffer_alloc(struct mtk_wed_device *dev)
  677. {
  678. struct mtk_wed_bm_desc *desc;
  679. dma_addr_t desc_phys;
  680. dev->rx_buf_ring.size = dev->wlan.rx_nbuf;
  681. desc = dma_alloc_coherent(dev->hw->dev,
  682. dev->wlan.rx_nbuf * sizeof(*desc),
  683. &desc_phys, GFP_KERNEL);
  684. if (!desc)
  685. return -ENOMEM;
  686. dev->rx_buf_ring.desc = desc;
  687. dev->rx_buf_ring.desc_phys = desc_phys;
  688. dev->wlan.init_rx_buf(dev, dev->wlan.rx_npkt);
  689. return mtk_wed_hwrro_buffer_alloc(dev);
  690. }
  691. static void
  692. mtk_wed_hwrro_free_buffer(struct mtk_wed_device *dev)
  693. {
  694. struct mtk_wed_buf *page_list = dev->hw_rro.pages;
  695. struct mtk_wed_bm_desc *desc = dev->hw_rro.desc;
  696. int i, page_idx = 0;
  697. if (!dev->wlan.hw_rro)
  698. return;
  699. if (!page_list)
  700. return;
  701. if (!desc)
  702. goto free_pagelist;
  703. for (i = 0; i < MTK_WED_RX_PG_BM_CNT; i += MTK_WED_RX_BUF_PER_PAGE) {
  704. dma_addr_t buf_addr = page_list[page_idx].phy_addr;
  705. void *page = page_list[page_idx++].p;
  706. if (!page)
  707. break;
  708. dma_unmap_page(dev->hw->dev, buf_addr, PAGE_SIZE,
  709. DMA_BIDIRECTIONAL);
  710. __free_page(page);
  711. }
  712. dma_free_coherent(dev->hw->dev, dev->hw_rro.size * sizeof(*desc),
  713. desc, dev->hw_rro.desc_phys);
  714. free_pagelist:
  715. kfree(page_list);
  716. }
  717. static void
  718. mtk_wed_free_rx_buffer(struct mtk_wed_device *dev)
  719. {
  720. struct mtk_wed_bm_desc *desc = dev->rx_buf_ring.desc;
  721. if (!desc)
  722. return;
  723. dev->wlan.release_rx_buf(dev);
  724. dma_free_coherent(dev->hw->dev, dev->rx_buf_ring.size * sizeof(*desc),
  725. desc, dev->rx_buf_ring.desc_phys);
  726. mtk_wed_hwrro_free_buffer(dev);
  727. }
  728. static void
  729. mtk_wed_hwrro_init(struct mtk_wed_device *dev)
  730. {
  731. if (!mtk_wed_get_rx_capa(dev) || !dev->wlan.hw_rro)
  732. return;
  733. wed_set(dev, MTK_WED_RRO_PG_BM_RX_DMAM,
  734. FIELD_PREP(MTK_WED_RRO_PG_BM_RX_SDL0, 128));
  735. wed_w32(dev, MTK_WED_RRO_PG_BM_BASE, dev->hw_rro.desc_phys);
  736. wed_w32(dev, MTK_WED_RRO_PG_BM_INIT_PTR,
  737. MTK_WED_RRO_PG_BM_INIT_SW_TAIL_IDX |
  738. FIELD_PREP(MTK_WED_RRO_PG_BM_SW_TAIL_IDX,
  739. MTK_WED_RX_PG_BM_CNT));
  740. /* enable rx_page_bm to fetch dmad */
  741. wed_set(dev, MTK_WED_CTRL, MTK_WED_CTRL_WED_RX_PG_BM_EN);
  742. }
  743. static void
  744. mtk_wed_rx_buffer_hw_init(struct mtk_wed_device *dev)
  745. {
  746. wed_w32(dev, MTK_WED_RX_BM_RX_DMAD,
  747. FIELD_PREP(MTK_WED_RX_BM_RX_DMAD_SDL0, dev->wlan.rx_size));
  748. wed_w32(dev, MTK_WED_RX_BM_BASE, dev->rx_buf_ring.desc_phys);
  749. wed_w32(dev, MTK_WED_RX_BM_INIT_PTR, MTK_WED_RX_BM_INIT_SW_TAIL |
  750. FIELD_PREP(MTK_WED_RX_BM_SW_TAIL, dev->wlan.rx_npkt));
  751. wed_w32(dev, MTK_WED_RX_BM_DYN_ALLOC_TH,
  752. FIELD_PREP(MTK_WED_RX_BM_DYN_ALLOC_TH_H, 0xffff));
  753. wed_set(dev, MTK_WED_CTRL, MTK_WED_CTRL_WED_RX_BM_EN);
  754. mtk_wed_hwrro_init(dev);
  755. }
  756. static void
  757. mtk_wed_free_ring(struct mtk_wed_device *dev, struct mtk_wed_ring *ring)
  758. {
  759. if (!ring->desc)
  760. return;
  761. dma_free_coherent(dev->hw->dev, ring->size * ring->desc_size,
  762. ring->desc, ring->desc_phys);
  763. }
  764. static void
  765. mtk_wed_free_rx_rings(struct mtk_wed_device *dev)
  766. {
  767. mtk_wed_free_rx_buffer(dev);
  768. mtk_wed_free_ring(dev, &dev->rro.ring);
  769. }
  770. static void
  771. mtk_wed_free_tx_rings(struct mtk_wed_device *dev)
  772. {
  773. int i;
  774. for (i = 0; i < ARRAY_SIZE(dev->tx_ring); i++)
  775. mtk_wed_free_ring(dev, &dev->tx_ring[i]);
  776. for (i = 0; i < ARRAY_SIZE(dev->rx_wdma); i++)
  777. mtk_wed_free_ring(dev, &dev->rx_wdma[i]);
  778. }
  779. static void
  780. mtk_wed_set_ext_int(struct mtk_wed_device *dev, bool en)
  781. {
  782. u32 mask = MTK_WED_EXT_INT_STATUS_ERROR_MASK;
  783. switch (dev->hw->version) {
  784. case 1:
  785. mask |= MTK_WED_EXT_INT_STATUS_TX_DRV_R_RESP_ERR;
  786. break;
  787. case 2:
  788. mask |= MTK_WED_EXT_INT_STATUS_RX_FBUF_LO_TH |
  789. MTK_WED_EXT_INT_STATUS_RX_FBUF_HI_TH |
  790. MTK_WED_EXT_INT_STATUS_RX_DRV_COHERENT |
  791. MTK_WED_EXT_INT_STATUS_TX_DMA_W_RESP_ERR;
  792. break;
  793. case 3:
  794. mask = MTK_WED_EXT_INT_STATUS_RX_DRV_COHERENT |
  795. MTK_WED_EXT_INT_STATUS_TKID_WO_PYLD;
  796. break;
  797. default:
  798. break;
  799. }
  800. if (!dev->hw->num_flows)
  801. mask &= ~MTK_WED_EXT_INT_STATUS_TKID_WO_PYLD;
  802. wed_w32(dev, MTK_WED_EXT_INT_MASK, en ? mask : 0);
  803. wed_r32(dev, MTK_WED_EXT_INT_MASK);
  804. }
  805. static void
  806. mtk_wed_set_512_support(struct mtk_wed_device *dev, bool enable)
  807. {
  808. if (!mtk_wed_is_v2(dev->hw))
  809. return;
  810. if (enable) {
  811. wed_w32(dev, MTK_WED_TXDP_CTRL, MTK_WED_TXDP_DW9_OVERWR);
  812. wed_w32(dev, MTK_WED_TXP_DW1,
  813. FIELD_PREP(MTK_WED_WPDMA_WRITE_TXP, 0x0103));
  814. } else {
  815. wed_w32(dev, MTK_WED_TXP_DW1,
  816. FIELD_PREP(MTK_WED_WPDMA_WRITE_TXP, 0x0100));
  817. wed_clr(dev, MTK_WED_TXDP_CTRL, MTK_WED_TXDP_DW9_OVERWR);
  818. }
  819. }
  820. static int
  821. mtk_wed_check_wfdma_rx_fill(struct mtk_wed_device *dev,
  822. struct mtk_wed_ring *ring)
  823. {
  824. int i;
  825. for (i = 0; i < 3; i++) {
  826. u32 cur_idx = readl(ring->wpdma + MTK_WED_RING_OFS_CPU_IDX);
  827. if (cur_idx == MTK_WED_RX_RING_SIZE - 1)
  828. break;
  829. usleep_range(100000, 200000);
  830. }
  831. if (i == 3) {
  832. dev_err(dev->hw->dev, "rx dma enable failed\n");
  833. return -ETIMEDOUT;
  834. }
  835. return 0;
  836. }
  837. static void
  838. mtk_wed_dma_disable(struct mtk_wed_device *dev)
  839. {
  840. wed_clr(dev, MTK_WED_WPDMA_GLO_CFG,
  841. MTK_WED_WPDMA_GLO_CFG_TX_DRV_EN |
  842. MTK_WED_WPDMA_GLO_CFG_RX_DRV_EN);
  843. wed_clr(dev, MTK_WED_WDMA_GLO_CFG, MTK_WED_WDMA_GLO_CFG_RX_DRV_EN);
  844. wed_clr(dev, MTK_WED_GLO_CFG,
  845. MTK_WED_GLO_CFG_TX_DMA_EN |
  846. MTK_WED_GLO_CFG_RX_DMA_EN);
  847. wdma_clr(dev, MTK_WDMA_GLO_CFG,
  848. MTK_WDMA_GLO_CFG_TX_DMA_EN |
  849. MTK_WDMA_GLO_CFG_RX_INFO1_PRERES |
  850. MTK_WDMA_GLO_CFG_RX_INFO2_PRERES);
  851. if (mtk_wed_is_v1(dev->hw)) {
  852. regmap_write(dev->hw->mirror, dev->hw->index * 4, 0);
  853. wdma_clr(dev, MTK_WDMA_GLO_CFG,
  854. MTK_WDMA_GLO_CFG_RX_INFO3_PRERES);
  855. } else {
  856. wed_clr(dev, MTK_WED_WPDMA_GLO_CFG,
  857. MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_PKT_PROC |
  858. MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_CRX_SYNC);
  859. wed_clr(dev, MTK_WED_WPDMA_RX_D_GLO_CFG,
  860. MTK_WED_WPDMA_RX_D_RX_DRV_EN);
  861. wed_clr(dev, MTK_WED_WDMA_GLO_CFG,
  862. MTK_WED_WDMA_GLO_CFG_TX_DDONE_CHK);
  863. if (mtk_wed_is_v3_or_greater(dev->hw) &&
  864. mtk_wed_get_rx_capa(dev)) {
  865. wdma_clr(dev, MTK_WDMA_PREF_TX_CFG,
  866. MTK_WDMA_PREF_TX_CFG_PREF_EN);
  867. wdma_clr(dev, MTK_WDMA_PREF_RX_CFG,
  868. MTK_WDMA_PREF_RX_CFG_PREF_EN);
  869. }
  870. }
  871. mtk_wed_set_512_support(dev, false);
  872. }
  873. static void
  874. mtk_wed_stop(struct mtk_wed_device *dev)
  875. {
  876. mtk_wed_dma_disable(dev);
  877. mtk_wed_set_ext_int(dev, false);
  878. wed_w32(dev, MTK_WED_WPDMA_INT_TRIGGER, 0);
  879. wed_w32(dev, MTK_WED_WDMA_INT_TRIGGER, 0);
  880. wdma_w32(dev, MTK_WDMA_INT_MASK, 0);
  881. wdma_w32(dev, MTK_WDMA_INT_GRP2, 0);
  882. if (!mtk_wed_get_rx_capa(dev))
  883. return;
  884. wed_w32(dev, MTK_WED_EXT_INT_MASK1, 0);
  885. wed_w32(dev, MTK_WED_EXT_INT_MASK2, 0);
  886. }
  887. static void
  888. mtk_wed_deinit(struct mtk_wed_device *dev)
  889. {
  890. mtk_wed_stop(dev);
  891. wed_clr(dev, MTK_WED_CTRL,
  892. MTK_WED_CTRL_WDMA_INT_AGENT_EN |
  893. MTK_WED_CTRL_WPDMA_INT_AGENT_EN |
  894. MTK_WED_CTRL_WED_TX_BM_EN |
  895. MTK_WED_CTRL_WED_TX_FREE_AGENT_EN);
  896. if (mtk_wed_is_v1(dev->hw))
  897. return;
  898. wed_clr(dev, MTK_WED_CTRL,
  899. MTK_WED_CTRL_RX_ROUTE_QM_EN |
  900. MTK_WED_CTRL_WED_RX_BM_EN |
  901. MTK_WED_CTRL_RX_RRO_QM_EN);
  902. if (mtk_wed_is_v3_or_greater(dev->hw)) {
  903. wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_TX_AMSDU_EN);
  904. wed_clr(dev, MTK_WED_RESET, MTK_WED_RESET_TX_AMSDU);
  905. wed_clr(dev, MTK_WED_PCIE_INT_CTRL,
  906. MTK_WED_PCIE_INT_CTRL_MSK_EN_POLA |
  907. MTK_WED_PCIE_INT_CTRL_MSK_IRQ_FILTER);
  908. }
  909. }
  910. static void
  911. __mtk_wed_detach(struct mtk_wed_device *dev)
  912. {
  913. struct mtk_wed_hw *hw = dev->hw;
  914. mtk_wed_deinit(dev);
  915. mtk_wdma_rx_reset(dev);
  916. mtk_wed_reset(dev, MTK_WED_RESET_WED);
  917. mtk_wed_amsdu_free_buffer(dev);
  918. mtk_wed_free_tx_buffer(dev);
  919. mtk_wed_free_tx_rings(dev);
  920. if (mtk_wed_get_rx_capa(dev)) {
  921. if (hw->wed_wo)
  922. mtk_wed_wo_reset(dev);
  923. mtk_wed_free_rx_rings(dev);
  924. if (hw->wed_wo)
  925. mtk_wed_wo_deinit(hw);
  926. }
  927. if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) {
  928. struct device_node *wlan_node;
  929. wlan_node = dev->wlan.pci_dev->dev.of_node;
  930. if (of_dma_is_coherent(wlan_node) && hw->hifsys)
  931. regmap_update_bits(hw->hifsys, HIFSYS_DMA_AG_MAP,
  932. BIT(hw->index), BIT(hw->index));
  933. }
  934. if ((!hw_list[!hw->index] || !hw_list[!hw->index]->wed_dev) &&
  935. hw->eth->dma_dev != hw->eth->dev)
  936. mtk_eth_set_dma_device(hw->eth, hw->eth->dev);
  937. memset(dev, 0, sizeof(*dev));
  938. module_put(THIS_MODULE);
  939. hw->wed_dev = NULL;
  940. }
  941. static void
  942. mtk_wed_detach(struct mtk_wed_device *dev)
  943. {
  944. mutex_lock(&hw_lock);
  945. __mtk_wed_detach(dev);
  946. mutex_unlock(&hw_lock);
  947. }
  948. static void
  949. mtk_wed_bus_init(struct mtk_wed_device *dev)
  950. {
  951. switch (dev->wlan.bus_type) {
  952. case MTK_WED_BUS_PCIE: {
  953. struct device_node *np = dev->hw->eth->dev->of_node;
  954. if (mtk_wed_is_v2(dev->hw)) {
  955. struct regmap *regs;
  956. regs = syscon_regmap_lookup_by_phandle(np,
  957. "mediatek,wed-pcie");
  958. if (IS_ERR(regs))
  959. break;
  960. regmap_update_bits(regs, 0, BIT(0), BIT(0));
  961. }
  962. if (dev->wlan.msi) {
  963. wed_w32(dev, MTK_WED_PCIE_CFG_INTM,
  964. dev->hw->pcie_base | 0xc08);
  965. wed_w32(dev, MTK_WED_PCIE_CFG_BASE,
  966. dev->hw->pcie_base | 0xc04);
  967. wed_w32(dev, MTK_WED_PCIE_INT_TRIGGER, BIT(8));
  968. } else {
  969. wed_w32(dev, MTK_WED_PCIE_CFG_INTM,
  970. dev->hw->pcie_base | 0x180);
  971. wed_w32(dev, MTK_WED_PCIE_CFG_BASE,
  972. dev->hw->pcie_base | 0x184);
  973. wed_w32(dev, MTK_WED_PCIE_INT_TRIGGER, BIT(24));
  974. }
  975. wed_w32(dev, MTK_WED_PCIE_INT_CTRL,
  976. FIELD_PREP(MTK_WED_PCIE_INT_CTRL_POLL_EN, 2));
  977. /* pcie interrupt control: pola/source selection */
  978. wed_set(dev, MTK_WED_PCIE_INT_CTRL,
  979. MTK_WED_PCIE_INT_CTRL_MSK_EN_POLA |
  980. MTK_WED_PCIE_INT_CTRL_MSK_IRQ_FILTER |
  981. FIELD_PREP(MTK_WED_PCIE_INT_CTRL_SRC_SEL,
  982. dev->hw->index));
  983. break;
  984. }
  985. case MTK_WED_BUS_AXI:
  986. wed_set(dev, MTK_WED_WPDMA_INT_CTRL,
  987. MTK_WED_WPDMA_INT_CTRL_SIG_SRC |
  988. FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_SRC_SEL, 0));
  989. break;
  990. default:
  991. break;
  992. }
  993. }
  994. static void
  995. mtk_wed_set_wpdma(struct mtk_wed_device *dev)
  996. {
  997. int i;
  998. if (mtk_wed_is_v1(dev->hw)) {
  999. wed_w32(dev, MTK_WED_WPDMA_CFG_BASE, dev->wlan.wpdma_phys);
  1000. return;
  1001. }
  1002. mtk_wed_bus_init(dev);
  1003. wed_w32(dev, MTK_WED_WPDMA_CFG_BASE, dev->wlan.wpdma_int);
  1004. wed_w32(dev, MTK_WED_WPDMA_CFG_INT_MASK, dev->wlan.wpdma_mask);
  1005. wed_w32(dev, MTK_WED_WPDMA_CFG_TX, dev->wlan.wpdma_tx);
  1006. wed_w32(dev, MTK_WED_WPDMA_CFG_TX_FREE, dev->wlan.wpdma_txfree);
  1007. if (!mtk_wed_get_rx_capa(dev))
  1008. return;
  1009. wed_w32(dev, MTK_WED_WPDMA_RX_GLO_CFG, dev->wlan.wpdma_rx_glo);
  1010. wed_w32(dev, dev->hw->soc->regmap.wpdma_rx_ring0, dev->wlan.wpdma_rx);
  1011. if (!dev->wlan.hw_rro)
  1012. return;
  1013. wed_w32(dev, MTK_WED_RRO_RX_D_CFG(0), dev->wlan.wpdma_rx_rro[0]);
  1014. wed_w32(dev, MTK_WED_RRO_RX_D_CFG(1), dev->wlan.wpdma_rx_rro[1]);
  1015. for (i = 0; i < MTK_WED_RX_PAGE_QUEUES; i++)
  1016. wed_w32(dev, MTK_WED_RRO_MSDU_PG_RING_CFG(i),
  1017. dev->wlan.wpdma_rx_pg + i * 0x10);
  1018. }
  1019. static void
  1020. mtk_wed_hw_init_early(struct mtk_wed_device *dev)
  1021. {
  1022. u32 set = FIELD_PREP(MTK_WED_WDMA_GLO_CFG_BT_SIZE, 2);
  1023. u32 mask = MTK_WED_WDMA_GLO_CFG_BT_SIZE;
  1024. mtk_wed_deinit(dev);
  1025. mtk_wed_reset(dev, MTK_WED_RESET_WED);
  1026. mtk_wed_set_wpdma(dev);
  1027. if (!mtk_wed_is_v3_or_greater(dev->hw)) {
  1028. mask |= MTK_WED_WDMA_GLO_CFG_DYNAMIC_DMAD_RECYCLE |
  1029. MTK_WED_WDMA_GLO_CFG_RX_DIS_FSM_AUTO_IDLE;
  1030. set |= MTK_WED_WDMA_GLO_CFG_DYNAMIC_SKIP_DMAD_PREP |
  1031. MTK_WED_WDMA_GLO_CFG_IDLE_DMAD_SUPPLY;
  1032. }
  1033. wed_m32(dev, MTK_WED_WDMA_GLO_CFG, mask, set);
  1034. if (mtk_wed_is_v1(dev->hw)) {
  1035. u32 offset = dev->hw->index ? 0x04000400 : 0;
  1036. wdma_set(dev, MTK_WDMA_GLO_CFG,
  1037. MTK_WDMA_GLO_CFG_RX_INFO1_PRERES |
  1038. MTK_WDMA_GLO_CFG_RX_INFO2_PRERES |
  1039. MTK_WDMA_GLO_CFG_RX_INFO3_PRERES);
  1040. wed_w32(dev, MTK_WED_WDMA_OFFSET0, 0x2a042a20 + offset);
  1041. wed_w32(dev, MTK_WED_WDMA_OFFSET1, 0x29002800 + offset);
  1042. wed_w32(dev, MTK_WED_PCIE_CFG_BASE,
  1043. MTK_PCIE_BASE(dev->hw->index));
  1044. } else {
  1045. wed_w32(dev, MTK_WED_WDMA_CFG_BASE, dev->hw->wdma_phy);
  1046. wed_set(dev, MTK_WED_CTRL, MTK_WED_CTRL_ETH_DMAD_FMT);
  1047. wed_w32(dev, MTK_WED_WDMA_OFFSET0,
  1048. FIELD_PREP(MTK_WED_WDMA_OFST0_GLO_INTS,
  1049. MTK_WDMA_INT_STATUS) |
  1050. FIELD_PREP(MTK_WED_WDMA_OFST0_GLO_CFG,
  1051. MTK_WDMA_GLO_CFG));
  1052. wed_w32(dev, MTK_WED_WDMA_OFFSET1,
  1053. FIELD_PREP(MTK_WED_WDMA_OFST1_TX_CTRL,
  1054. MTK_WDMA_RING_TX(0)) |
  1055. FIELD_PREP(MTK_WED_WDMA_OFST1_RX_CTRL,
  1056. MTK_WDMA_RING_RX(0)));
  1057. }
  1058. }
  1059. static int
  1060. mtk_wed_rro_ring_alloc(struct mtk_wed_device *dev, struct mtk_wed_ring *ring,
  1061. int size)
  1062. {
  1063. ring->desc = dma_alloc_coherent(dev->hw->dev,
  1064. size * sizeof(*ring->desc),
  1065. &ring->desc_phys, GFP_KERNEL);
  1066. if (!ring->desc)
  1067. return -ENOMEM;
  1068. ring->desc_size = sizeof(*ring->desc);
  1069. ring->size = size;
  1070. return 0;
  1071. }
  1072. #define MTK_WED_MIOD_COUNT (MTK_WED_MIOD_ENTRY_CNT * MTK_WED_MIOD_CNT)
  1073. static int
  1074. mtk_wed_rro_alloc(struct mtk_wed_device *dev)
  1075. {
  1076. struct reserved_mem *rmem;
  1077. struct device_node *np;
  1078. int index;
  1079. index = of_property_match_string(dev->hw->node, "memory-region-names",
  1080. "wo-dlm");
  1081. if (index < 0)
  1082. return index;
  1083. np = of_parse_phandle(dev->hw->node, "memory-region", index);
  1084. if (!np)
  1085. return -ENODEV;
  1086. rmem = of_reserved_mem_lookup(np);
  1087. of_node_put(np);
  1088. if (!rmem)
  1089. return -ENODEV;
  1090. dev->rro.miod_phys = rmem->base;
  1091. dev->rro.fdbk_phys = MTK_WED_MIOD_COUNT + dev->rro.miod_phys;
  1092. return mtk_wed_rro_ring_alloc(dev, &dev->rro.ring,
  1093. MTK_WED_RRO_QUE_CNT);
  1094. }
  1095. static int
  1096. mtk_wed_rro_cfg(struct mtk_wed_device *dev)
  1097. {
  1098. struct mtk_wed_wo *wo = dev->hw->wed_wo;
  1099. struct {
  1100. struct {
  1101. __le32 base;
  1102. __le32 cnt;
  1103. __le32 unit;
  1104. } ring[2];
  1105. __le32 wed;
  1106. u8 version;
  1107. } req = {
  1108. .ring[0] = {
  1109. .base = cpu_to_le32(MTK_WED_WOCPU_VIEW_MIOD_BASE),
  1110. .cnt = cpu_to_le32(MTK_WED_MIOD_CNT),
  1111. .unit = cpu_to_le32(MTK_WED_MIOD_ENTRY_CNT),
  1112. },
  1113. .ring[1] = {
  1114. .base = cpu_to_le32(MTK_WED_WOCPU_VIEW_MIOD_BASE +
  1115. MTK_WED_MIOD_COUNT),
  1116. .cnt = cpu_to_le32(MTK_WED_FB_CMD_CNT),
  1117. .unit = cpu_to_le32(4),
  1118. },
  1119. };
  1120. return mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO,
  1121. MTK_WED_WO_CMD_WED_CFG,
  1122. &req, sizeof(req), true);
  1123. }
  1124. static void
  1125. mtk_wed_rro_hw_init(struct mtk_wed_device *dev)
  1126. {
  1127. wed_w32(dev, MTK_WED_RROQM_MIOD_CFG,
  1128. FIELD_PREP(MTK_WED_RROQM_MIOD_MID_DW, 0x70 >> 2) |
  1129. FIELD_PREP(MTK_WED_RROQM_MIOD_MOD_DW, 0x10 >> 2) |
  1130. FIELD_PREP(MTK_WED_RROQM_MIOD_ENTRY_DW,
  1131. MTK_WED_MIOD_ENTRY_CNT >> 2));
  1132. wed_w32(dev, MTK_WED_RROQM_MIOD_CTRL0, dev->rro.miod_phys);
  1133. wed_w32(dev, MTK_WED_RROQM_MIOD_CTRL1,
  1134. FIELD_PREP(MTK_WED_RROQM_MIOD_CNT, MTK_WED_MIOD_CNT));
  1135. wed_w32(dev, MTK_WED_RROQM_FDBK_CTRL0, dev->rro.fdbk_phys);
  1136. wed_w32(dev, MTK_WED_RROQM_FDBK_CTRL1,
  1137. FIELD_PREP(MTK_WED_RROQM_FDBK_CNT, MTK_WED_FB_CMD_CNT));
  1138. wed_w32(dev, MTK_WED_RROQM_FDBK_CTRL2, 0);
  1139. wed_w32(dev, MTK_WED_RROQ_BASE_L, dev->rro.ring.desc_phys);
  1140. wed_set(dev, MTK_WED_RROQM_RST_IDX,
  1141. MTK_WED_RROQM_RST_IDX_MIOD |
  1142. MTK_WED_RROQM_RST_IDX_FDBK);
  1143. wed_w32(dev, MTK_WED_RROQM_RST_IDX, 0);
  1144. wed_w32(dev, MTK_WED_RROQM_MIOD_CTRL2, MTK_WED_MIOD_CNT - 1);
  1145. wed_set(dev, MTK_WED_CTRL, MTK_WED_CTRL_RX_RRO_QM_EN);
  1146. }
  1147. static void
  1148. mtk_wed_route_qm_hw_init(struct mtk_wed_device *dev)
  1149. {
  1150. wed_w32(dev, MTK_WED_RESET, MTK_WED_RESET_RX_ROUTE_QM);
  1151. for (;;) {
  1152. usleep_range(100, 200);
  1153. if (!(wed_r32(dev, MTK_WED_RESET) & MTK_WED_RESET_RX_ROUTE_QM))
  1154. break;
  1155. }
  1156. /* configure RX_ROUTE_QM */
  1157. if (mtk_wed_is_v2(dev->hw)) {
  1158. wed_clr(dev, MTK_WED_RTQM_GLO_CFG, MTK_WED_RTQM_Q_RST);
  1159. wed_clr(dev, MTK_WED_RTQM_GLO_CFG, MTK_WED_RTQM_TXDMAD_FPORT);
  1160. wed_set(dev, MTK_WED_RTQM_GLO_CFG,
  1161. FIELD_PREP(MTK_WED_RTQM_TXDMAD_FPORT,
  1162. 0x3 + dev->hw->index));
  1163. wed_clr(dev, MTK_WED_RTQM_GLO_CFG, MTK_WED_RTQM_Q_RST);
  1164. } else {
  1165. wed_set(dev, MTK_WED_RTQM_ENQ_CFG0,
  1166. FIELD_PREP(MTK_WED_RTQM_ENQ_CFG_TXDMAD_FPORT,
  1167. 0x3 + dev->hw->index));
  1168. }
  1169. /* enable RX_ROUTE_QM */
  1170. wed_set(dev, MTK_WED_CTRL, MTK_WED_CTRL_RX_ROUTE_QM_EN);
  1171. }
  1172. static void
  1173. mtk_wed_hw_init(struct mtk_wed_device *dev)
  1174. {
  1175. if (dev->init_done)
  1176. return;
  1177. dev->init_done = true;
  1178. mtk_wed_set_ext_int(dev, false);
  1179. wed_w32(dev, MTK_WED_TX_BM_BASE, dev->tx_buf_ring.desc_phys);
  1180. wed_w32(dev, MTK_WED_TX_BM_BUF_LEN, MTK_WED_PKT_SIZE);
  1181. if (mtk_wed_is_v1(dev->hw)) {
  1182. wed_w32(dev, MTK_WED_TX_BM_CTRL,
  1183. MTK_WED_TX_BM_CTRL_PAUSE |
  1184. FIELD_PREP(MTK_WED_TX_BM_CTRL_VLD_GRP_NUM,
  1185. dev->tx_buf_ring.size / 128) |
  1186. FIELD_PREP(MTK_WED_TX_BM_CTRL_RSV_GRP_NUM,
  1187. MTK_WED_TX_RING_SIZE / 256));
  1188. wed_w32(dev, MTK_WED_TX_BM_DYN_THR,
  1189. FIELD_PREP(MTK_WED_TX_BM_DYN_THR_LO, 1) |
  1190. MTK_WED_TX_BM_DYN_THR_HI);
  1191. } else if (mtk_wed_is_v2(dev->hw)) {
  1192. wed_w32(dev, MTK_WED_TX_BM_CTRL,
  1193. MTK_WED_TX_BM_CTRL_PAUSE |
  1194. FIELD_PREP(MTK_WED_TX_BM_CTRL_VLD_GRP_NUM,
  1195. dev->tx_buf_ring.size / 128) |
  1196. FIELD_PREP(MTK_WED_TX_BM_CTRL_RSV_GRP_NUM,
  1197. MTK_WED_TX_RING_SIZE / 256));
  1198. wed_w32(dev, MTK_WED_TX_TKID_DYN_THR,
  1199. FIELD_PREP(MTK_WED_TX_TKID_DYN_THR_LO, 0) |
  1200. MTK_WED_TX_TKID_DYN_THR_HI);
  1201. wed_w32(dev, MTK_WED_TX_BM_DYN_THR,
  1202. FIELD_PREP(MTK_WED_TX_BM_DYN_THR_LO_V2, 0) |
  1203. MTK_WED_TX_BM_DYN_THR_HI_V2);
  1204. wed_w32(dev, MTK_WED_TX_TKID_CTRL,
  1205. MTK_WED_TX_TKID_CTRL_PAUSE |
  1206. FIELD_PREP(MTK_WED_TX_TKID_CTRL_VLD_GRP_NUM,
  1207. dev->tx_buf_ring.size / 128) |
  1208. FIELD_PREP(MTK_WED_TX_TKID_CTRL_RSV_GRP_NUM,
  1209. dev->tx_buf_ring.size / 128));
  1210. }
  1211. wed_w32(dev, dev->hw->soc->regmap.tx_bm_tkid,
  1212. FIELD_PREP(MTK_WED_TX_BM_TKID_START, dev->wlan.token_start) |
  1213. FIELD_PREP(MTK_WED_TX_BM_TKID_END,
  1214. dev->wlan.token_start + dev->wlan.nbuf - 1));
  1215. mtk_wed_reset(dev, MTK_WED_RESET_TX_BM);
  1216. if (mtk_wed_is_v3_or_greater(dev->hw)) {
  1217. /* switch to new bm architecture */
  1218. wed_clr(dev, MTK_WED_TX_BM_CTRL,
  1219. MTK_WED_TX_BM_CTRL_LEGACY_EN);
  1220. wed_w32(dev, MTK_WED_TX_TKID_CTRL,
  1221. MTK_WED_TX_TKID_CTRL_PAUSE |
  1222. FIELD_PREP(MTK_WED_TX_TKID_CTRL_VLD_GRP_NUM_V3,
  1223. dev->wlan.nbuf / 128) |
  1224. FIELD_PREP(MTK_WED_TX_TKID_CTRL_RSV_GRP_NUM_V3,
  1225. dev->wlan.nbuf / 128));
  1226. /* return SKBID + SDP back to bm */
  1227. wed_set(dev, MTK_WED_TX_TKID_CTRL,
  1228. MTK_WED_TX_TKID_CTRL_FREE_FORMAT);
  1229. wed_w32(dev, MTK_WED_TX_BM_INIT_PTR,
  1230. MTK_WED_TX_BM_PKT_CNT |
  1231. MTK_WED_TX_BM_INIT_SW_TAIL_IDX);
  1232. }
  1233. if (mtk_wed_is_v1(dev->hw)) {
  1234. wed_set(dev, MTK_WED_CTRL,
  1235. MTK_WED_CTRL_WED_TX_BM_EN |
  1236. MTK_WED_CTRL_WED_TX_FREE_AGENT_EN);
  1237. } else if (mtk_wed_get_rx_capa(dev)) {
  1238. /* rx hw init */
  1239. wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX,
  1240. MTK_WED_WPDMA_RX_D_RST_CRX_IDX |
  1241. MTK_WED_WPDMA_RX_D_RST_DRV_IDX);
  1242. wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX, 0);
  1243. /* reset prefetch index of ring */
  1244. wed_set(dev, MTK_WED_WPDMA_RX_D_PREF_RX0_SIDX,
  1245. MTK_WED_WPDMA_RX_D_PREF_SIDX_IDX_CLR);
  1246. wed_clr(dev, MTK_WED_WPDMA_RX_D_PREF_RX0_SIDX,
  1247. MTK_WED_WPDMA_RX_D_PREF_SIDX_IDX_CLR);
  1248. wed_set(dev, MTK_WED_WPDMA_RX_D_PREF_RX1_SIDX,
  1249. MTK_WED_WPDMA_RX_D_PREF_SIDX_IDX_CLR);
  1250. wed_clr(dev, MTK_WED_WPDMA_RX_D_PREF_RX1_SIDX,
  1251. MTK_WED_WPDMA_RX_D_PREF_SIDX_IDX_CLR);
  1252. /* reset prefetch FIFO of ring */
  1253. wed_set(dev, MTK_WED_WPDMA_RX_D_PREF_FIFO_CFG,
  1254. MTK_WED_WPDMA_RX_D_PREF_FIFO_CFG_R0_CLR |
  1255. MTK_WED_WPDMA_RX_D_PREF_FIFO_CFG_R1_CLR);
  1256. wed_w32(dev, MTK_WED_WPDMA_RX_D_PREF_FIFO_CFG, 0);
  1257. mtk_wed_rx_buffer_hw_init(dev);
  1258. mtk_wed_rro_hw_init(dev);
  1259. mtk_wed_route_qm_hw_init(dev);
  1260. }
  1261. wed_clr(dev, MTK_WED_TX_BM_CTRL, MTK_WED_TX_BM_CTRL_PAUSE);
  1262. if (!mtk_wed_is_v1(dev->hw))
  1263. wed_clr(dev, MTK_WED_TX_TKID_CTRL, MTK_WED_TX_TKID_CTRL_PAUSE);
  1264. }
  1265. static void
  1266. mtk_wed_ring_reset(struct mtk_wed_ring *ring, int size, bool tx)
  1267. {
  1268. void *head = (void *)ring->desc;
  1269. int i;
  1270. for (i = 0; i < size; i++) {
  1271. struct mtk_wdma_desc *desc;
  1272. desc = (struct mtk_wdma_desc *)(head + i * ring->desc_size);
  1273. desc->buf0 = 0;
  1274. if (tx)
  1275. desc->ctrl = cpu_to_le32(MTK_WDMA_DESC_CTRL_DMA_DONE);
  1276. else
  1277. desc->ctrl = cpu_to_le32(MTK_WFDMA_DESC_CTRL_TO_HOST);
  1278. desc->buf1 = 0;
  1279. desc->info = 0;
  1280. }
  1281. }
  1282. static int
  1283. mtk_wed_rx_reset(struct mtk_wed_device *dev)
  1284. {
  1285. struct mtk_wed_wo *wo = dev->hw->wed_wo;
  1286. u8 val = MTK_WED_WO_STATE_SER_RESET;
  1287. int i, ret;
  1288. ret = mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO,
  1289. MTK_WED_WO_CMD_CHANGE_STATE, &val,
  1290. sizeof(val), true);
  1291. if (ret)
  1292. return ret;
  1293. if (dev->wlan.hw_rro) {
  1294. wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_WED_RX_IND_CMD_EN);
  1295. mtk_wed_poll_busy(dev, MTK_WED_RRO_RX_HW_STS,
  1296. MTK_WED_RX_IND_CMD_BUSY);
  1297. mtk_wed_reset(dev, MTK_WED_RESET_RRO_RX_TO_PG);
  1298. }
  1299. wed_clr(dev, MTK_WED_WPDMA_RX_D_GLO_CFG, MTK_WED_WPDMA_RX_D_RX_DRV_EN);
  1300. ret = mtk_wed_poll_busy(dev, MTK_WED_WPDMA_RX_D_GLO_CFG,
  1301. MTK_WED_WPDMA_RX_D_RX_DRV_BUSY);
  1302. if (!ret && mtk_wed_is_v3_or_greater(dev->hw))
  1303. ret = mtk_wed_poll_busy(dev, MTK_WED_WPDMA_RX_D_PREF_CFG,
  1304. MTK_WED_WPDMA_RX_D_PREF_BUSY);
  1305. if (ret) {
  1306. mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_INT_AGENT);
  1307. mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_RX_D_DRV);
  1308. } else {
  1309. if (mtk_wed_is_v3_or_greater(dev->hw)) {
  1310. /* 1.a. disable prefetch HW */
  1311. wed_clr(dev, MTK_WED_WPDMA_RX_D_PREF_CFG,
  1312. MTK_WED_WPDMA_RX_D_PREF_EN);
  1313. mtk_wed_poll_busy(dev, MTK_WED_WPDMA_RX_D_PREF_CFG,
  1314. MTK_WED_WPDMA_RX_D_PREF_BUSY);
  1315. wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX,
  1316. MTK_WED_WPDMA_RX_D_RST_DRV_IDX_ALL);
  1317. }
  1318. wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX,
  1319. MTK_WED_WPDMA_RX_D_RST_CRX_IDX |
  1320. MTK_WED_WPDMA_RX_D_RST_DRV_IDX);
  1321. wed_set(dev, MTK_WED_WPDMA_RX_D_GLO_CFG,
  1322. MTK_WED_WPDMA_RX_D_RST_INIT_COMPLETE |
  1323. MTK_WED_WPDMA_RX_D_FSM_RETURN_IDLE);
  1324. wed_clr(dev, MTK_WED_WPDMA_RX_D_GLO_CFG,
  1325. MTK_WED_WPDMA_RX_D_RST_INIT_COMPLETE |
  1326. MTK_WED_WPDMA_RX_D_FSM_RETURN_IDLE);
  1327. wed_w32(dev, MTK_WED_WPDMA_RX_D_RST_IDX, 0);
  1328. }
  1329. /* reset rro qm */
  1330. wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_RX_RRO_QM_EN);
  1331. ret = mtk_wed_poll_busy(dev, MTK_WED_CTRL,
  1332. MTK_WED_CTRL_RX_RRO_QM_BUSY);
  1333. if (ret) {
  1334. mtk_wed_reset(dev, MTK_WED_RESET_RX_RRO_QM);
  1335. } else {
  1336. wed_set(dev, MTK_WED_RROQM_RST_IDX,
  1337. MTK_WED_RROQM_RST_IDX_MIOD |
  1338. MTK_WED_RROQM_RST_IDX_FDBK);
  1339. wed_w32(dev, MTK_WED_RROQM_RST_IDX, 0);
  1340. }
  1341. if (dev->wlan.hw_rro) {
  1342. /* disable rro msdu page drv */
  1343. wed_clr(dev, MTK_WED_RRO_MSDU_PG_RING2_CFG,
  1344. MTK_WED_RRO_MSDU_PG_DRV_EN);
  1345. /* disable rro data drv */
  1346. wed_clr(dev, MTK_WED_RRO_RX_D_CFG(2), MTK_WED_RRO_RX_D_DRV_EN);
  1347. /* rro msdu page drv reset */
  1348. wed_w32(dev, MTK_WED_RRO_MSDU_PG_RING2_CFG,
  1349. MTK_WED_RRO_MSDU_PG_DRV_CLR);
  1350. mtk_wed_poll_busy(dev, MTK_WED_RRO_MSDU_PG_RING2_CFG,
  1351. MTK_WED_RRO_MSDU_PG_DRV_CLR);
  1352. /* rro data drv reset */
  1353. wed_w32(dev, MTK_WED_RRO_RX_D_CFG(2),
  1354. MTK_WED_RRO_RX_D_DRV_CLR);
  1355. mtk_wed_poll_busy(dev, MTK_WED_RRO_RX_D_CFG(2),
  1356. MTK_WED_RRO_RX_D_DRV_CLR);
  1357. }
  1358. /* reset route qm */
  1359. wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_RX_ROUTE_QM_EN);
  1360. ret = mtk_wed_poll_busy(dev, MTK_WED_CTRL,
  1361. MTK_WED_CTRL_RX_ROUTE_QM_BUSY);
  1362. if (ret) {
  1363. mtk_wed_reset(dev, MTK_WED_RESET_RX_ROUTE_QM);
  1364. } else if (mtk_wed_is_v3_or_greater(dev->hw)) {
  1365. wed_set(dev, MTK_WED_RTQM_RST, BIT(0));
  1366. wed_clr(dev, MTK_WED_RTQM_RST, BIT(0));
  1367. mtk_wed_reset(dev, MTK_WED_RESET_RX_ROUTE_QM);
  1368. } else {
  1369. wed_set(dev, MTK_WED_RTQM_GLO_CFG, MTK_WED_RTQM_Q_RST);
  1370. }
  1371. /* reset tx wdma */
  1372. mtk_wdma_tx_reset(dev);
  1373. /* reset tx wdma drv */
  1374. wed_clr(dev, MTK_WED_WDMA_GLO_CFG, MTK_WED_WDMA_GLO_CFG_TX_DRV_EN);
  1375. if (mtk_wed_is_v3_or_greater(dev->hw))
  1376. mtk_wed_poll_busy(dev, MTK_WED_WPDMA_STATUS,
  1377. MTK_WED_WPDMA_STATUS_TX_DRV);
  1378. else
  1379. mtk_wed_poll_busy(dev, MTK_WED_CTRL,
  1380. MTK_WED_CTRL_WDMA_INT_AGENT_BUSY);
  1381. mtk_wed_reset(dev, MTK_WED_RESET_WDMA_TX_DRV);
  1382. /* reset wed rx dma */
  1383. ret = mtk_wed_poll_busy(dev, MTK_WED_GLO_CFG,
  1384. MTK_WED_GLO_CFG_RX_DMA_BUSY);
  1385. wed_clr(dev, MTK_WED_GLO_CFG, MTK_WED_GLO_CFG_RX_DMA_EN);
  1386. if (ret) {
  1387. mtk_wed_reset(dev, MTK_WED_RESET_WED_RX_DMA);
  1388. } else {
  1389. wed_set(dev, MTK_WED_RESET_IDX,
  1390. dev->hw->soc->regmap.reset_idx_rx_mask);
  1391. wed_w32(dev, MTK_WED_RESET_IDX, 0);
  1392. }
  1393. /* reset rx bm */
  1394. wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_WED_RX_BM_EN);
  1395. mtk_wed_poll_busy(dev, MTK_WED_CTRL,
  1396. MTK_WED_CTRL_WED_RX_BM_BUSY);
  1397. mtk_wed_reset(dev, MTK_WED_RESET_RX_BM);
  1398. if (dev->wlan.hw_rro) {
  1399. wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_WED_RX_PG_BM_EN);
  1400. mtk_wed_poll_busy(dev, MTK_WED_CTRL,
  1401. MTK_WED_CTRL_WED_RX_PG_BM_BUSY);
  1402. wed_set(dev, MTK_WED_RESET, MTK_WED_RESET_RX_PG_BM);
  1403. wed_clr(dev, MTK_WED_RESET, MTK_WED_RESET_RX_PG_BM);
  1404. }
  1405. /* wo change to enable state */
  1406. val = MTK_WED_WO_STATE_ENABLE;
  1407. ret = mtk_wed_mcu_send_msg(wo, MTK_WED_MODULE_ID_WO,
  1408. MTK_WED_WO_CMD_CHANGE_STATE, &val,
  1409. sizeof(val), true);
  1410. if (ret)
  1411. return ret;
  1412. /* wed_rx_ring_reset */
  1413. for (i = 0; i < ARRAY_SIZE(dev->rx_ring); i++) {
  1414. if (!dev->rx_ring[i].desc)
  1415. continue;
  1416. mtk_wed_ring_reset(&dev->rx_ring[i], MTK_WED_RX_RING_SIZE,
  1417. false);
  1418. }
  1419. mtk_wed_free_rx_buffer(dev);
  1420. mtk_wed_hwrro_free_buffer(dev);
  1421. return 0;
  1422. }
  1423. static void
  1424. mtk_wed_reset_dma(struct mtk_wed_device *dev)
  1425. {
  1426. bool busy = false;
  1427. u32 val;
  1428. int i;
  1429. for (i = 0; i < ARRAY_SIZE(dev->tx_ring); i++) {
  1430. if (!dev->tx_ring[i].desc)
  1431. continue;
  1432. mtk_wed_ring_reset(&dev->tx_ring[i], MTK_WED_TX_RING_SIZE,
  1433. true);
  1434. }
  1435. /* 1. reset WED tx DMA */
  1436. wed_clr(dev, MTK_WED_GLO_CFG, MTK_WED_GLO_CFG_TX_DMA_EN);
  1437. busy = mtk_wed_poll_busy(dev, MTK_WED_GLO_CFG,
  1438. MTK_WED_GLO_CFG_TX_DMA_BUSY);
  1439. if (busy) {
  1440. mtk_wed_reset(dev, MTK_WED_RESET_WED_TX_DMA);
  1441. } else {
  1442. wed_w32(dev, MTK_WED_RESET_IDX,
  1443. dev->hw->soc->regmap.reset_idx_tx_mask);
  1444. wed_w32(dev, MTK_WED_RESET_IDX, 0);
  1445. }
  1446. /* 2. reset WDMA rx DMA */
  1447. busy = !!mtk_wdma_rx_reset(dev);
  1448. if (mtk_wed_is_v3_or_greater(dev->hw)) {
  1449. val = MTK_WED_WDMA_GLO_CFG_RX_DIS_FSM_AUTO_IDLE |
  1450. wed_r32(dev, MTK_WED_WDMA_GLO_CFG);
  1451. val &= ~MTK_WED_WDMA_GLO_CFG_RX_DRV_EN;
  1452. wed_w32(dev, MTK_WED_WDMA_GLO_CFG, val);
  1453. } else {
  1454. wed_clr(dev, MTK_WED_WDMA_GLO_CFG,
  1455. MTK_WED_WDMA_GLO_CFG_RX_DRV_EN);
  1456. }
  1457. if (!busy)
  1458. busy = mtk_wed_poll_busy(dev, MTK_WED_WDMA_GLO_CFG,
  1459. MTK_WED_WDMA_GLO_CFG_RX_DRV_BUSY);
  1460. if (!busy && mtk_wed_is_v3_or_greater(dev->hw))
  1461. busy = mtk_wed_poll_busy(dev, MTK_WED_WDMA_RX_PREF_CFG,
  1462. MTK_WED_WDMA_RX_PREF_BUSY);
  1463. if (busy) {
  1464. mtk_wed_reset(dev, MTK_WED_RESET_WDMA_INT_AGENT);
  1465. mtk_wed_reset(dev, MTK_WED_RESET_WDMA_RX_DRV);
  1466. } else {
  1467. if (mtk_wed_is_v3_or_greater(dev->hw)) {
  1468. /* 1.a. disable prefetch HW */
  1469. wed_clr(dev, MTK_WED_WDMA_RX_PREF_CFG,
  1470. MTK_WED_WDMA_RX_PREF_EN);
  1471. mtk_wed_poll_busy(dev, MTK_WED_WDMA_RX_PREF_CFG,
  1472. MTK_WED_WDMA_RX_PREF_BUSY);
  1473. wed_clr(dev, MTK_WED_WDMA_RX_PREF_CFG,
  1474. MTK_WED_WDMA_RX_PREF_DDONE2_EN);
  1475. /* 2. Reset dma index */
  1476. wed_w32(dev, MTK_WED_WDMA_RESET_IDX,
  1477. MTK_WED_WDMA_RESET_IDX_RX_ALL);
  1478. }
  1479. wed_w32(dev, MTK_WED_WDMA_RESET_IDX,
  1480. MTK_WED_WDMA_RESET_IDX_RX | MTK_WED_WDMA_RESET_IDX_DRV);
  1481. wed_w32(dev, MTK_WED_WDMA_RESET_IDX, 0);
  1482. wed_set(dev, MTK_WED_WDMA_GLO_CFG,
  1483. MTK_WED_WDMA_GLO_CFG_RST_INIT_COMPLETE);
  1484. wed_clr(dev, MTK_WED_WDMA_GLO_CFG,
  1485. MTK_WED_WDMA_GLO_CFG_RST_INIT_COMPLETE);
  1486. }
  1487. /* 3. reset WED WPDMA tx */
  1488. wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_WED_TX_FREE_AGENT_EN);
  1489. for (i = 0; i < 100; i++) {
  1490. if (mtk_wed_is_v1(dev->hw))
  1491. val = FIELD_GET(MTK_WED_TX_BM_INTF_TKFIFO_FDEP,
  1492. wed_r32(dev, MTK_WED_TX_BM_INTF));
  1493. else
  1494. val = FIELD_GET(MTK_WED_TX_TKID_INTF_TKFIFO_FDEP,
  1495. wed_r32(dev, MTK_WED_TX_TKID_INTF));
  1496. if (val == 0x40)
  1497. break;
  1498. }
  1499. mtk_wed_reset(dev, MTK_WED_RESET_TX_FREE_AGENT);
  1500. wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_WED_TX_BM_EN);
  1501. mtk_wed_reset(dev, MTK_WED_RESET_TX_BM);
  1502. /* 4. reset WED WPDMA tx */
  1503. busy = mtk_wed_poll_busy(dev, MTK_WED_WPDMA_GLO_CFG,
  1504. MTK_WED_WPDMA_GLO_CFG_TX_DRV_BUSY);
  1505. wed_clr(dev, MTK_WED_WPDMA_GLO_CFG,
  1506. MTK_WED_WPDMA_GLO_CFG_TX_DRV_EN |
  1507. MTK_WED_WPDMA_GLO_CFG_RX_DRV_EN);
  1508. if (!busy)
  1509. busy = mtk_wed_poll_busy(dev, MTK_WED_WPDMA_GLO_CFG,
  1510. MTK_WED_WPDMA_GLO_CFG_RX_DRV_BUSY);
  1511. if (busy) {
  1512. mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_INT_AGENT);
  1513. mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_TX_DRV);
  1514. mtk_wed_reset(dev, MTK_WED_RESET_WPDMA_RX_DRV);
  1515. if (mtk_wed_is_v3_or_greater(dev->hw))
  1516. wed_w32(dev, MTK_WED_RX1_CTRL2, 0);
  1517. } else {
  1518. wed_w32(dev, MTK_WED_WPDMA_RESET_IDX,
  1519. MTK_WED_WPDMA_RESET_IDX_TX |
  1520. MTK_WED_WPDMA_RESET_IDX_RX);
  1521. wed_w32(dev, MTK_WED_WPDMA_RESET_IDX, 0);
  1522. }
  1523. dev->init_done = false;
  1524. if (mtk_wed_is_v1(dev->hw))
  1525. return;
  1526. if (!busy) {
  1527. wed_w32(dev, MTK_WED_RESET_IDX, MTK_WED_RESET_WPDMA_IDX_RX);
  1528. wed_w32(dev, MTK_WED_RESET_IDX, 0);
  1529. }
  1530. if (mtk_wed_is_v3_or_greater(dev->hw)) {
  1531. /* reset amsdu engine */
  1532. wed_clr(dev, MTK_WED_CTRL, MTK_WED_CTRL_TX_AMSDU_EN);
  1533. mtk_wed_reset(dev, MTK_WED_RESET_TX_AMSDU);
  1534. }
  1535. if (mtk_wed_get_rx_capa(dev))
  1536. mtk_wed_rx_reset(dev);
  1537. }
  1538. static int
  1539. mtk_wed_ring_alloc(struct mtk_wed_device *dev, struct mtk_wed_ring *ring,
  1540. int size, u32 desc_size, bool tx)
  1541. {
  1542. ring->desc = dma_alloc_coherent(dev->hw->dev, size * desc_size,
  1543. &ring->desc_phys, GFP_KERNEL);
  1544. if (!ring->desc)
  1545. return -ENOMEM;
  1546. ring->desc_size = desc_size;
  1547. ring->size = size;
  1548. mtk_wed_ring_reset(ring, size, tx);
  1549. return 0;
  1550. }
  1551. static int
  1552. mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size,
  1553. bool reset)
  1554. {
  1555. struct mtk_wed_ring *wdma;
  1556. if (idx >= ARRAY_SIZE(dev->rx_wdma))
  1557. return -EINVAL;
  1558. wdma = &dev->rx_wdma[idx];
  1559. if (!reset && mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE,
  1560. dev->hw->soc->wdma_desc_size, true))
  1561. return -ENOMEM;
  1562. wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_BASE,
  1563. wdma->desc_phys);
  1564. wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_COUNT,
  1565. size);
  1566. wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_CPU_IDX, 0);
  1567. wed_w32(dev, MTK_WED_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_BASE,
  1568. wdma->desc_phys);
  1569. wed_w32(dev, MTK_WED_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_COUNT,
  1570. size);
  1571. return 0;
  1572. }
  1573. static int
  1574. mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size,
  1575. bool reset)
  1576. {
  1577. struct mtk_wed_ring *wdma;
  1578. if (idx >= ARRAY_SIZE(dev->tx_wdma))
  1579. return -EINVAL;
  1580. wdma = &dev->tx_wdma[idx];
  1581. if (!reset && mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE,
  1582. dev->hw->soc->wdma_desc_size, true))
  1583. return -ENOMEM;
  1584. if (mtk_wed_is_v3_or_greater(dev->hw)) {
  1585. struct mtk_wdma_desc *desc = wdma->desc;
  1586. int i;
  1587. for (i = 0; i < MTK_WED_WDMA_RING_SIZE; i++) {
  1588. desc->buf0 = 0;
  1589. desc->ctrl = cpu_to_le32(MTK_WDMA_DESC_CTRL_DMA_DONE);
  1590. desc->buf1 = 0;
  1591. desc->info = cpu_to_le32(MTK_WDMA_TXD0_DESC_INFO_DMA_DONE);
  1592. desc++;
  1593. desc->buf0 = 0;
  1594. desc->ctrl = cpu_to_le32(MTK_WDMA_DESC_CTRL_DMA_DONE);
  1595. desc->buf1 = 0;
  1596. desc->info = cpu_to_le32(MTK_WDMA_TXD1_DESC_INFO_DMA_DONE);
  1597. desc++;
  1598. }
  1599. }
  1600. wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_BASE,
  1601. wdma->desc_phys);
  1602. wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_COUNT,
  1603. size);
  1604. wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_CPU_IDX, 0);
  1605. wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_DMA_IDX, 0);
  1606. if (reset)
  1607. mtk_wed_ring_reset(wdma, MTK_WED_WDMA_RING_SIZE, true);
  1608. if (!idx) {
  1609. wed_w32(dev, MTK_WED_WDMA_RING_TX + MTK_WED_RING_OFS_BASE,
  1610. wdma->desc_phys);
  1611. wed_w32(dev, MTK_WED_WDMA_RING_TX + MTK_WED_RING_OFS_COUNT,
  1612. size);
  1613. wed_w32(dev, MTK_WED_WDMA_RING_TX + MTK_WED_RING_OFS_CPU_IDX,
  1614. 0);
  1615. wed_w32(dev, MTK_WED_WDMA_RING_TX + MTK_WED_RING_OFS_DMA_IDX,
  1616. 0);
  1617. }
  1618. return 0;
  1619. }
  1620. static void
  1621. mtk_wed_ppe_check(struct mtk_wed_device *dev, struct sk_buff *skb,
  1622. u32 reason, u32 hash)
  1623. {
  1624. struct mtk_eth *eth = dev->hw->eth;
  1625. struct ethhdr *eh;
  1626. if (!skb)
  1627. return;
  1628. if (reason != MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED)
  1629. return;
  1630. skb_set_mac_header(skb, 0);
  1631. eh = eth_hdr(skb);
  1632. skb->protocol = eh->h_proto;
  1633. mtk_ppe_check_skb(eth->ppe[dev->hw->index], skb, hash);
  1634. }
  1635. static void
  1636. mtk_wed_configure_irq(struct mtk_wed_device *dev, u32 irq_mask)
  1637. {
  1638. u32 wdma_mask = FIELD_PREP(MTK_WDMA_INT_MASK_RX_DONE, GENMASK(1, 0));
  1639. /* wed control cr set */
  1640. wed_set(dev, MTK_WED_CTRL,
  1641. MTK_WED_CTRL_WDMA_INT_AGENT_EN |
  1642. MTK_WED_CTRL_WPDMA_INT_AGENT_EN |
  1643. MTK_WED_CTRL_WED_TX_BM_EN |
  1644. MTK_WED_CTRL_WED_TX_FREE_AGENT_EN);
  1645. if (mtk_wed_is_v1(dev->hw)) {
  1646. wed_w32(dev, MTK_WED_PCIE_INT_TRIGGER,
  1647. MTK_WED_PCIE_INT_TRIGGER_STATUS);
  1648. wed_w32(dev, MTK_WED_WPDMA_INT_TRIGGER,
  1649. MTK_WED_WPDMA_INT_TRIGGER_RX_DONE |
  1650. MTK_WED_WPDMA_INT_TRIGGER_TX_DONE);
  1651. wed_clr(dev, MTK_WED_WDMA_INT_CTRL, wdma_mask);
  1652. } else {
  1653. if (mtk_wed_is_v3_or_greater(dev->hw))
  1654. wed_set(dev, MTK_WED_CTRL, MTK_WED_CTRL_TX_TKID_ALI_EN);
  1655. /* initail tx interrupt trigger */
  1656. wed_w32(dev, MTK_WED_WPDMA_INT_CTRL_TX,
  1657. MTK_WED_WPDMA_INT_CTRL_TX0_DONE_EN |
  1658. MTK_WED_WPDMA_INT_CTRL_TX0_DONE_CLR |
  1659. MTK_WED_WPDMA_INT_CTRL_TX1_DONE_EN |
  1660. MTK_WED_WPDMA_INT_CTRL_TX1_DONE_CLR |
  1661. FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_TX0_DONE_TRIG,
  1662. dev->wlan.tx_tbit[0]) |
  1663. FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_TX1_DONE_TRIG,
  1664. dev->wlan.tx_tbit[1]));
  1665. /* initail txfree interrupt trigger */
  1666. wed_w32(dev, MTK_WED_WPDMA_INT_CTRL_TX_FREE,
  1667. MTK_WED_WPDMA_INT_CTRL_TX_FREE_DONE_EN |
  1668. MTK_WED_WPDMA_INT_CTRL_TX_FREE_DONE_CLR |
  1669. FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_TX_FREE_DONE_TRIG,
  1670. dev->wlan.txfree_tbit));
  1671. if (mtk_wed_get_rx_capa(dev)) {
  1672. wed_w32(dev, MTK_WED_WPDMA_INT_CTRL_RX,
  1673. MTK_WED_WPDMA_INT_CTRL_RX0_EN |
  1674. MTK_WED_WPDMA_INT_CTRL_RX0_CLR |
  1675. MTK_WED_WPDMA_INT_CTRL_RX1_EN |
  1676. MTK_WED_WPDMA_INT_CTRL_RX1_CLR |
  1677. FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_RX0_DONE_TRIG,
  1678. dev->wlan.rx_tbit[0]) |
  1679. FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_RX1_DONE_TRIG,
  1680. dev->wlan.rx_tbit[1]));
  1681. wdma_mask |= FIELD_PREP(MTK_WDMA_INT_MASK_TX_DONE,
  1682. GENMASK(1, 0));
  1683. }
  1684. wed_w32(dev, MTK_WED_WDMA_INT_CLR, wdma_mask);
  1685. wed_set(dev, MTK_WED_WDMA_INT_CTRL,
  1686. FIELD_PREP(MTK_WED_WDMA_INT_CTRL_POLL_SRC_SEL,
  1687. dev->wdma_idx));
  1688. }
  1689. wed_w32(dev, MTK_WED_WDMA_INT_TRIGGER, wdma_mask);
  1690. wdma_w32(dev, MTK_WDMA_INT_MASK, wdma_mask);
  1691. wdma_w32(dev, MTK_WDMA_INT_GRP2, wdma_mask);
  1692. wed_w32(dev, MTK_WED_WPDMA_INT_MASK, irq_mask);
  1693. wed_w32(dev, MTK_WED_INT_MASK, irq_mask);
  1694. }
  1695. #define MTK_WFMDA_RX_DMA_EN BIT(2)
  1696. static void
  1697. mtk_wed_dma_enable(struct mtk_wed_device *dev)
  1698. {
  1699. int i;
  1700. if (!mtk_wed_is_v3_or_greater(dev->hw)) {
  1701. wed_set(dev, MTK_WED_WPDMA_INT_CTRL,
  1702. MTK_WED_WPDMA_INT_CTRL_SUBRT_ADV);
  1703. wed_set(dev, MTK_WED_WPDMA_GLO_CFG,
  1704. MTK_WED_WPDMA_GLO_CFG_TX_DRV_EN |
  1705. MTK_WED_WPDMA_GLO_CFG_RX_DRV_EN);
  1706. wdma_set(dev, MTK_WDMA_GLO_CFG,
  1707. MTK_WDMA_GLO_CFG_TX_DMA_EN |
  1708. MTK_WDMA_GLO_CFG_RX_INFO1_PRERES |
  1709. MTK_WDMA_GLO_CFG_RX_INFO2_PRERES);
  1710. wed_set(dev, MTK_WED_WPDMA_CTRL, MTK_WED_WPDMA_CTRL_SDL1_FIXED);
  1711. } else {
  1712. wed_set(dev, MTK_WED_WPDMA_GLO_CFG,
  1713. MTK_WED_WPDMA_GLO_CFG_TX_DRV_EN |
  1714. MTK_WED_WPDMA_GLO_CFG_RX_DRV_EN |
  1715. MTK_WED_WPDMA_GLO_CFG_RX_DDONE2_WR);
  1716. wdma_set(dev, MTK_WDMA_GLO_CFG, MTK_WDMA_GLO_CFG_TX_DMA_EN);
  1717. }
  1718. wed_set(dev, MTK_WED_GLO_CFG,
  1719. MTK_WED_GLO_CFG_TX_DMA_EN |
  1720. MTK_WED_GLO_CFG_RX_DMA_EN);
  1721. wed_set(dev, MTK_WED_WDMA_GLO_CFG,
  1722. MTK_WED_WDMA_GLO_CFG_RX_DRV_EN);
  1723. if (mtk_wed_is_v1(dev->hw)) {
  1724. wdma_set(dev, MTK_WDMA_GLO_CFG,
  1725. MTK_WDMA_GLO_CFG_RX_INFO3_PRERES);
  1726. return;
  1727. }
  1728. wed_set(dev, MTK_WED_WPDMA_GLO_CFG,
  1729. MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_PKT_PROC |
  1730. MTK_WED_WPDMA_GLO_CFG_RX_DRV_R0_CRX_SYNC);
  1731. if (mtk_wed_is_v3_or_greater(dev->hw)) {
  1732. wed_set(dev, MTK_WED_WDMA_RX_PREF_CFG,
  1733. FIELD_PREP(MTK_WED_WDMA_RX_PREF_BURST_SIZE, 0x10) |
  1734. FIELD_PREP(MTK_WED_WDMA_RX_PREF_LOW_THRES, 0x8));
  1735. wed_clr(dev, MTK_WED_WDMA_RX_PREF_CFG,
  1736. MTK_WED_WDMA_RX_PREF_DDONE2_EN);
  1737. wed_set(dev, MTK_WED_WDMA_RX_PREF_CFG, MTK_WED_WDMA_RX_PREF_EN);
  1738. wed_clr(dev, MTK_WED_WPDMA_GLO_CFG,
  1739. MTK_WED_WPDMA_GLO_CFG_TX_DDONE_CHK_LAST);
  1740. wed_set(dev, MTK_WED_WPDMA_GLO_CFG,
  1741. MTK_WED_WPDMA_GLO_CFG_TX_DDONE_CHK |
  1742. MTK_WED_WPDMA_GLO_CFG_RX_DRV_EVENT_PKT_FMT_CHK |
  1743. MTK_WED_WPDMA_GLO_CFG_RX_DRV_UNS_VER_FORCE_4);
  1744. wdma_set(dev, MTK_WDMA_PREF_RX_CFG, MTK_WDMA_PREF_RX_CFG_PREF_EN);
  1745. wdma_set(dev, MTK_WDMA_WRBK_RX_CFG, MTK_WDMA_WRBK_RX_CFG_WRBK_EN);
  1746. }
  1747. wed_clr(dev, MTK_WED_WPDMA_GLO_CFG,
  1748. MTK_WED_WPDMA_GLO_CFG_TX_TKID_KEEP |
  1749. MTK_WED_WPDMA_GLO_CFG_TX_DMAD_DW3_PREV);
  1750. if (!mtk_wed_get_rx_capa(dev))
  1751. return;
  1752. wed_set(dev, MTK_WED_WDMA_GLO_CFG,
  1753. MTK_WED_WDMA_GLO_CFG_TX_DRV_EN |
  1754. MTK_WED_WDMA_GLO_CFG_TX_DDONE_CHK);
  1755. wed_clr(dev, MTK_WED_WPDMA_RX_D_GLO_CFG, MTK_WED_WPDMA_RX_D_RXD_READ_LEN);
  1756. wed_set(dev, MTK_WED_WPDMA_RX_D_GLO_CFG,
  1757. MTK_WED_WPDMA_RX_D_RX_DRV_EN |
  1758. FIELD_PREP(MTK_WED_WPDMA_RX_D_RXD_READ_LEN, 0x18) |
  1759. FIELD_PREP(MTK_WED_WPDMA_RX_D_INIT_PHASE_RXEN_SEL, 0x2));
  1760. if (mtk_wed_is_v3_or_greater(dev->hw)) {
  1761. wed_set(dev, MTK_WED_WPDMA_RX_D_PREF_CFG,
  1762. MTK_WED_WPDMA_RX_D_PREF_EN |
  1763. FIELD_PREP(MTK_WED_WPDMA_RX_D_PREF_BURST_SIZE, 0x10) |
  1764. FIELD_PREP(MTK_WED_WPDMA_RX_D_PREF_LOW_THRES, 0x8));
  1765. wed_set(dev, MTK_WED_RRO_RX_D_CFG(2), MTK_WED_RRO_RX_D_DRV_EN);
  1766. wdma_set(dev, MTK_WDMA_PREF_TX_CFG, MTK_WDMA_PREF_TX_CFG_PREF_EN);
  1767. wdma_set(dev, MTK_WDMA_WRBK_TX_CFG, MTK_WDMA_WRBK_TX_CFG_WRBK_EN);
  1768. }
  1769. for (i = 0; i < MTK_WED_RX_QUEUES; i++) {
  1770. struct mtk_wed_ring *ring = &dev->rx_ring[i];
  1771. u32 val;
  1772. if (!(ring->flags & MTK_WED_RING_CONFIGURED))
  1773. continue; /* queue is not configured by mt76 */
  1774. if (mtk_wed_check_wfdma_rx_fill(dev, ring)) {
  1775. dev_err(dev->hw->dev,
  1776. "rx_ring(%d) dma enable failed\n", i);
  1777. continue;
  1778. }
  1779. val = wifi_r32(dev,
  1780. dev->wlan.wpdma_rx_glo -
  1781. dev->wlan.phy_base) | MTK_WFMDA_RX_DMA_EN;
  1782. wifi_w32(dev,
  1783. dev->wlan.wpdma_rx_glo - dev->wlan.phy_base,
  1784. val);
  1785. }
  1786. }
  1787. static void
  1788. mtk_wed_start_hw_rro(struct mtk_wed_device *dev, u32 irq_mask, bool reset)
  1789. {
  1790. int i;
  1791. wed_w32(dev, MTK_WED_WPDMA_INT_MASK, irq_mask);
  1792. wed_w32(dev, MTK_WED_INT_MASK, irq_mask);
  1793. if (!mtk_wed_get_rx_capa(dev) || !dev->wlan.hw_rro)
  1794. return;
  1795. if (reset) {
  1796. wed_set(dev, MTK_WED_RRO_MSDU_PG_RING2_CFG,
  1797. MTK_WED_RRO_MSDU_PG_DRV_EN);
  1798. return;
  1799. }
  1800. wed_set(dev, MTK_WED_RRO_RX_D_CFG(2), MTK_WED_RRO_MSDU_PG_DRV_CLR);
  1801. wed_w32(dev, MTK_WED_RRO_MSDU_PG_RING2_CFG,
  1802. MTK_WED_RRO_MSDU_PG_DRV_CLR);
  1803. wed_w32(dev, MTK_WED_WPDMA_INT_CTRL_RRO_RX,
  1804. MTK_WED_WPDMA_INT_CTRL_RRO_RX0_EN |
  1805. MTK_WED_WPDMA_INT_CTRL_RRO_RX0_CLR |
  1806. MTK_WED_WPDMA_INT_CTRL_RRO_RX1_EN |
  1807. MTK_WED_WPDMA_INT_CTRL_RRO_RX1_CLR |
  1808. FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_RRO_RX0_DONE_TRIG,
  1809. dev->wlan.rro_rx_tbit[0]) |
  1810. FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_RRO_RX1_DONE_TRIG,
  1811. dev->wlan.rro_rx_tbit[1]));
  1812. wed_w32(dev, MTK_WED_WPDMA_INT_CTRL_RRO_MSDU_PG,
  1813. MTK_WED_WPDMA_INT_CTRL_RRO_PG0_EN |
  1814. MTK_WED_WPDMA_INT_CTRL_RRO_PG0_CLR |
  1815. MTK_WED_WPDMA_INT_CTRL_RRO_PG1_EN |
  1816. MTK_WED_WPDMA_INT_CTRL_RRO_PG1_CLR |
  1817. MTK_WED_WPDMA_INT_CTRL_RRO_PG2_EN |
  1818. MTK_WED_WPDMA_INT_CTRL_RRO_PG2_CLR |
  1819. FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_RRO_PG0_DONE_TRIG,
  1820. dev->wlan.rx_pg_tbit[0]) |
  1821. FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_RRO_PG1_DONE_TRIG,
  1822. dev->wlan.rx_pg_tbit[1]) |
  1823. FIELD_PREP(MTK_WED_WPDMA_INT_CTRL_RRO_PG2_DONE_TRIG,
  1824. dev->wlan.rx_pg_tbit[2]));
  1825. /* RRO_MSDU_PG_RING2_CFG1_FLD_DRV_EN should be enabled after
  1826. * WM FWDL completed, otherwise RRO_MSDU_PG ring may broken
  1827. */
  1828. wed_set(dev, MTK_WED_RRO_MSDU_PG_RING2_CFG,
  1829. MTK_WED_RRO_MSDU_PG_DRV_EN);
  1830. for (i = 0; i < MTK_WED_RX_QUEUES; i++) {
  1831. struct mtk_wed_ring *ring = &dev->rx_rro_ring[i];
  1832. if (!(ring->flags & MTK_WED_RING_CONFIGURED))
  1833. continue;
  1834. if (mtk_wed_check_wfdma_rx_fill(dev, ring))
  1835. dev_err(dev->hw->dev,
  1836. "rx_rro_ring(%d) initialization failed\n", i);
  1837. }
  1838. for (i = 0; i < MTK_WED_RX_PAGE_QUEUES; i++) {
  1839. struct mtk_wed_ring *ring = &dev->rx_page_ring[i];
  1840. if (!(ring->flags & MTK_WED_RING_CONFIGURED))
  1841. continue;
  1842. if (mtk_wed_check_wfdma_rx_fill(dev, ring))
  1843. dev_err(dev->hw->dev,
  1844. "rx_page_ring(%d) initialization failed\n", i);
  1845. }
  1846. }
  1847. static void
  1848. mtk_wed_rro_rx_ring_setup(struct mtk_wed_device *dev, int idx,
  1849. void __iomem *regs)
  1850. {
  1851. struct mtk_wed_ring *ring = &dev->rx_rro_ring[idx];
  1852. ring->wpdma = regs;
  1853. wed_w32(dev, MTK_WED_RRO_RX_D_RX(idx) + MTK_WED_RING_OFS_BASE,
  1854. readl(regs));
  1855. wed_w32(dev, MTK_WED_RRO_RX_D_RX(idx) + MTK_WED_RING_OFS_COUNT,
  1856. readl(regs + MTK_WED_RING_OFS_COUNT));
  1857. ring->flags |= MTK_WED_RING_CONFIGURED;
  1858. }
  1859. static void
  1860. mtk_wed_msdu_pg_rx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs)
  1861. {
  1862. struct mtk_wed_ring *ring = &dev->rx_page_ring[idx];
  1863. ring->wpdma = regs;
  1864. wed_w32(dev, MTK_WED_RRO_MSDU_PG_CTRL0(idx) + MTK_WED_RING_OFS_BASE,
  1865. readl(regs));
  1866. wed_w32(dev, MTK_WED_RRO_MSDU_PG_CTRL0(idx) + MTK_WED_RING_OFS_COUNT,
  1867. readl(regs + MTK_WED_RING_OFS_COUNT));
  1868. ring->flags |= MTK_WED_RING_CONFIGURED;
  1869. }
  1870. static int
  1871. mtk_wed_ind_rx_ring_setup(struct mtk_wed_device *dev, void __iomem *regs)
  1872. {
  1873. struct mtk_wed_ring *ring = &dev->ind_cmd_ring;
  1874. u32 val = readl(regs + MTK_WED_RING_OFS_COUNT);
  1875. int i, count = 0;
  1876. ring->wpdma = regs;
  1877. wed_w32(dev, MTK_WED_IND_CMD_RX_CTRL1 + MTK_WED_RING_OFS_BASE,
  1878. readl(regs) & 0xfffffff0);
  1879. wed_w32(dev, MTK_WED_IND_CMD_RX_CTRL1 + MTK_WED_RING_OFS_COUNT,
  1880. readl(regs + MTK_WED_RING_OFS_COUNT));
  1881. /* ack sn cr */
  1882. wed_w32(dev, MTK_WED_RRO_CFG0, dev->wlan.phy_base +
  1883. dev->wlan.ind_cmd.ack_sn_addr);
  1884. wed_w32(dev, MTK_WED_RRO_CFG1,
  1885. FIELD_PREP(MTK_WED_RRO_CFG1_MAX_WIN_SZ,
  1886. dev->wlan.ind_cmd.win_size) |
  1887. FIELD_PREP(MTK_WED_RRO_CFG1_PARTICL_SE_ID,
  1888. dev->wlan.ind_cmd.particular_sid));
  1889. /* particular session addr element */
  1890. wed_w32(dev, MTK_WED_ADDR_ELEM_CFG0,
  1891. dev->wlan.ind_cmd.particular_se_phys);
  1892. for (i = 0; i < dev->wlan.ind_cmd.se_group_nums; i++) {
  1893. wed_w32(dev, MTK_WED_RADDR_ELEM_TBL_WDATA,
  1894. dev->wlan.ind_cmd.addr_elem_phys[i] >> 4);
  1895. wed_w32(dev, MTK_WED_ADDR_ELEM_TBL_CFG,
  1896. MTK_WED_ADDR_ELEM_TBL_WR | (i & 0x7f));
  1897. val = wed_r32(dev, MTK_WED_ADDR_ELEM_TBL_CFG);
  1898. while (!(val & MTK_WED_ADDR_ELEM_TBL_WR_RDY) && count++ < 100)
  1899. val = wed_r32(dev, MTK_WED_ADDR_ELEM_TBL_CFG);
  1900. if (count >= 100)
  1901. dev_err(dev->hw->dev,
  1902. "write ba session base failed\n");
  1903. }
  1904. /* pn check init */
  1905. for (i = 0; i < dev->wlan.ind_cmd.particular_sid; i++) {
  1906. wed_w32(dev, MTK_WED_PN_CHECK_WDATA_M,
  1907. MTK_WED_PN_CHECK_IS_FIRST);
  1908. wed_w32(dev, MTK_WED_PN_CHECK_CFG, MTK_WED_PN_CHECK_WR |
  1909. FIELD_PREP(MTK_WED_PN_CHECK_SE_ID, i));
  1910. count = 0;
  1911. val = wed_r32(dev, MTK_WED_PN_CHECK_CFG);
  1912. while (!(val & MTK_WED_PN_CHECK_WR_RDY) && count++ < 100)
  1913. val = wed_r32(dev, MTK_WED_PN_CHECK_CFG);
  1914. if (count >= 100)
  1915. dev_err(dev->hw->dev,
  1916. "session(%d) initialization failed\n", i);
  1917. }
  1918. wed_w32(dev, MTK_WED_RX_IND_CMD_CNT0, MTK_WED_RX_IND_CMD_DBG_CNT_EN);
  1919. wed_set(dev, MTK_WED_CTRL, MTK_WED_CTRL_WED_RX_IND_CMD_EN);
  1920. return 0;
  1921. }
  1922. static void
  1923. mtk_wed_start(struct mtk_wed_device *dev, u32 irq_mask)
  1924. {
  1925. int i;
  1926. if (mtk_wed_get_rx_capa(dev) && mtk_wed_rx_buffer_alloc(dev))
  1927. return;
  1928. for (i = 0; i < ARRAY_SIZE(dev->rx_wdma); i++)
  1929. if (!dev->rx_wdma[i].desc)
  1930. mtk_wed_wdma_rx_ring_setup(dev, i, 16, false);
  1931. mtk_wed_hw_init(dev);
  1932. mtk_wed_configure_irq(dev, irq_mask);
  1933. mtk_wed_set_ext_int(dev, true);
  1934. if (mtk_wed_is_v1(dev->hw)) {
  1935. u32 val = dev->wlan.wpdma_phys | MTK_PCIE_MIRROR_MAP_EN |
  1936. FIELD_PREP(MTK_PCIE_MIRROR_MAP_WED_ID,
  1937. dev->hw->index);
  1938. val |= BIT(0) | (BIT(1) * !!dev->hw->index);
  1939. regmap_write(dev->hw->mirror, dev->hw->index * 4, val);
  1940. } else if (mtk_wed_get_rx_capa(dev)) {
  1941. /* driver set mid ready and only once */
  1942. wed_w32(dev, MTK_WED_EXT_INT_MASK1,
  1943. MTK_WED_EXT_INT_STATUS_WPDMA_MID_RDY);
  1944. wed_w32(dev, MTK_WED_EXT_INT_MASK2,
  1945. MTK_WED_EXT_INT_STATUS_WPDMA_MID_RDY);
  1946. wed_r32(dev, MTK_WED_EXT_INT_MASK1);
  1947. wed_r32(dev, MTK_WED_EXT_INT_MASK2);
  1948. if (mtk_wed_is_v3_or_greater(dev->hw)) {
  1949. wed_w32(dev, MTK_WED_EXT_INT_MASK3,
  1950. MTK_WED_EXT_INT_STATUS_WPDMA_MID_RDY);
  1951. wed_r32(dev, MTK_WED_EXT_INT_MASK3);
  1952. }
  1953. if (mtk_wed_rro_cfg(dev))
  1954. return;
  1955. }
  1956. mtk_wed_set_512_support(dev, dev->wlan.wcid_512);
  1957. mtk_wed_amsdu_init(dev);
  1958. mtk_wed_dma_enable(dev);
  1959. dev->running = true;
  1960. }
  1961. static int
  1962. mtk_wed_attach(struct mtk_wed_device *dev)
  1963. __releases(RCU)
  1964. {
  1965. struct mtk_wed_hw *hw;
  1966. struct device *device;
  1967. int ret = 0;
  1968. RCU_LOCKDEP_WARN(!rcu_read_lock_held(),
  1969. "mtk_wed_attach without holding the RCU read lock");
  1970. if ((dev->wlan.bus_type == MTK_WED_BUS_PCIE &&
  1971. pci_domain_nr(dev->wlan.pci_dev->bus) > 1) ||
  1972. !try_module_get(THIS_MODULE))
  1973. ret = -ENODEV;
  1974. rcu_read_unlock();
  1975. if (ret)
  1976. return ret;
  1977. mutex_lock(&hw_lock);
  1978. hw = mtk_wed_assign(dev);
  1979. if (!hw) {
  1980. module_put(THIS_MODULE);
  1981. ret = -ENODEV;
  1982. goto unlock;
  1983. }
  1984. device = dev->wlan.bus_type == MTK_WED_BUS_PCIE
  1985. ? &dev->wlan.pci_dev->dev
  1986. : &dev->wlan.platform_dev->dev;
  1987. dev_info(device, "attaching wed device %d version %d\n",
  1988. hw->index, hw->version);
  1989. dev->hw = hw;
  1990. dev->dev = hw->dev;
  1991. dev->irq = hw->irq;
  1992. dev->wdma_idx = hw->index;
  1993. dev->version = hw->version;
  1994. dev->hw->pcie_base = mtk_wed_get_pcie_base(dev);
  1995. if (hw->eth->dma_dev == hw->eth->dev &&
  1996. of_dma_is_coherent(hw->eth->dev->of_node))
  1997. mtk_eth_set_dma_device(hw->eth, hw->dev);
  1998. ret = mtk_wed_tx_buffer_alloc(dev);
  1999. if (ret)
  2000. goto out;
  2001. ret = mtk_wed_amsdu_buffer_alloc(dev);
  2002. if (ret)
  2003. goto out;
  2004. if (mtk_wed_get_rx_capa(dev)) {
  2005. ret = mtk_wed_rro_alloc(dev);
  2006. if (ret)
  2007. goto out;
  2008. }
  2009. mtk_wed_hw_init_early(dev);
  2010. if (mtk_wed_is_v1(hw))
  2011. regmap_update_bits(hw->hifsys, HIFSYS_DMA_AG_MAP,
  2012. BIT(hw->index), 0);
  2013. else
  2014. dev->rev_id = wed_r32(dev, MTK_WED_REV_ID);
  2015. if (mtk_wed_get_rx_capa(dev))
  2016. ret = mtk_wed_wo_init(hw);
  2017. out:
  2018. if (ret) {
  2019. dev_err(dev->hw->dev, "failed to attach wed device\n");
  2020. __mtk_wed_detach(dev);
  2021. }
  2022. unlock:
  2023. mutex_unlock(&hw_lock);
  2024. return ret;
  2025. }
  2026. static int
  2027. mtk_wed_tx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs,
  2028. bool reset)
  2029. {
  2030. struct mtk_wed_ring *ring = &dev->tx_ring[idx];
  2031. /*
  2032. * Tx ring redirection:
  2033. * Instead of configuring the WLAN PDMA TX ring directly, the WLAN
  2034. * driver allocated DMA ring gets configured into WED MTK_WED_RING_TX(n)
  2035. * registers.
  2036. *
  2037. * WED driver posts its own DMA ring as WLAN PDMA TX and configures it
  2038. * into MTK_WED_WPDMA_RING_TX(n) registers.
  2039. * It gets filled with packets picked up from WED TX ring and from
  2040. * WDMA RX.
  2041. */
  2042. if (WARN_ON(idx >= ARRAY_SIZE(dev->tx_ring)))
  2043. return -EINVAL;
  2044. if (!reset && mtk_wed_ring_alloc(dev, ring, MTK_WED_TX_RING_SIZE,
  2045. sizeof(*ring->desc), true))
  2046. return -ENOMEM;
  2047. if (mtk_wed_wdma_rx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE,
  2048. reset))
  2049. return -ENOMEM;
  2050. ring->reg_base = MTK_WED_RING_TX(idx);
  2051. ring->wpdma = regs;
  2052. if (mtk_wed_is_v3_or_greater(dev->hw) && idx == 1) {
  2053. /* reset prefetch index */
  2054. wed_set(dev, MTK_WED_WDMA_RX_PREF_CFG,
  2055. MTK_WED_WDMA_RX_PREF_RX0_SIDX_CLR |
  2056. MTK_WED_WDMA_RX_PREF_RX1_SIDX_CLR);
  2057. wed_clr(dev, MTK_WED_WDMA_RX_PREF_CFG,
  2058. MTK_WED_WDMA_RX_PREF_RX0_SIDX_CLR |
  2059. MTK_WED_WDMA_RX_PREF_RX1_SIDX_CLR);
  2060. /* reset prefetch FIFO */
  2061. wed_w32(dev, MTK_WED_WDMA_RX_PREF_FIFO_CFG,
  2062. MTK_WED_WDMA_RX_PREF_FIFO_RX0_CLR |
  2063. MTK_WED_WDMA_RX_PREF_FIFO_RX1_CLR);
  2064. wed_w32(dev, MTK_WED_WDMA_RX_PREF_FIFO_CFG, 0);
  2065. }
  2066. /* WED -> WPDMA */
  2067. wpdma_tx_w32(dev, idx, MTK_WED_RING_OFS_BASE, ring->desc_phys);
  2068. wpdma_tx_w32(dev, idx, MTK_WED_RING_OFS_COUNT, MTK_WED_TX_RING_SIZE);
  2069. wpdma_tx_w32(dev, idx, MTK_WED_RING_OFS_CPU_IDX, 0);
  2070. wed_w32(dev, MTK_WED_WPDMA_RING_TX(idx) + MTK_WED_RING_OFS_BASE,
  2071. ring->desc_phys);
  2072. wed_w32(dev, MTK_WED_WPDMA_RING_TX(idx) + MTK_WED_RING_OFS_COUNT,
  2073. MTK_WED_TX_RING_SIZE);
  2074. wed_w32(dev, MTK_WED_WPDMA_RING_TX(idx) + MTK_WED_RING_OFS_CPU_IDX, 0);
  2075. return 0;
  2076. }
  2077. static int
  2078. mtk_wed_txfree_ring_setup(struct mtk_wed_device *dev, void __iomem *regs)
  2079. {
  2080. struct mtk_wed_ring *ring = &dev->txfree_ring;
  2081. int i, index = mtk_wed_is_v1(dev->hw);
  2082. /*
  2083. * For txfree event handling, the same DMA ring is shared between WED
  2084. * and WLAN. The WLAN driver accesses the ring index registers through
  2085. * WED
  2086. */
  2087. ring->reg_base = MTK_WED_RING_RX(index);
  2088. ring->wpdma = regs;
  2089. for (i = 0; i < 12; i += 4) {
  2090. u32 val = readl(regs + i);
  2091. wed_w32(dev, MTK_WED_RING_RX(index) + i, val);
  2092. wed_w32(dev, MTK_WED_WPDMA_RING_RX(index) + i, val);
  2093. }
  2094. return 0;
  2095. }
  2096. static int
  2097. mtk_wed_rx_ring_setup(struct mtk_wed_device *dev, int idx, void __iomem *regs,
  2098. bool reset)
  2099. {
  2100. struct mtk_wed_ring *ring = &dev->rx_ring[idx];
  2101. if (WARN_ON(idx >= ARRAY_SIZE(dev->rx_ring)))
  2102. return -EINVAL;
  2103. if (!reset && mtk_wed_ring_alloc(dev, ring, MTK_WED_RX_RING_SIZE,
  2104. sizeof(*ring->desc), false))
  2105. return -ENOMEM;
  2106. if (mtk_wed_wdma_tx_ring_setup(dev, idx, MTK_WED_WDMA_RING_SIZE,
  2107. reset))
  2108. return -ENOMEM;
  2109. ring->reg_base = MTK_WED_RING_RX_DATA(idx);
  2110. ring->wpdma = regs;
  2111. ring->flags |= MTK_WED_RING_CONFIGURED;
  2112. /* WPDMA -> WED */
  2113. wpdma_rx_w32(dev, idx, MTK_WED_RING_OFS_BASE, ring->desc_phys);
  2114. wpdma_rx_w32(dev, idx, MTK_WED_RING_OFS_COUNT, MTK_WED_RX_RING_SIZE);
  2115. wed_w32(dev, MTK_WED_WPDMA_RING_RX_DATA(idx) + MTK_WED_RING_OFS_BASE,
  2116. ring->desc_phys);
  2117. wed_w32(dev, MTK_WED_WPDMA_RING_RX_DATA(idx) + MTK_WED_RING_OFS_COUNT,
  2118. MTK_WED_RX_RING_SIZE);
  2119. return 0;
  2120. }
  2121. static u32
  2122. mtk_wed_irq_get(struct mtk_wed_device *dev, u32 mask)
  2123. {
  2124. u32 val, ext_mask;
  2125. if (mtk_wed_is_v3_or_greater(dev->hw))
  2126. ext_mask = MTK_WED_EXT_INT_STATUS_RX_DRV_COHERENT |
  2127. MTK_WED_EXT_INT_STATUS_TKID_WO_PYLD;
  2128. else
  2129. ext_mask = MTK_WED_EXT_INT_STATUS_ERROR_MASK;
  2130. val = wed_r32(dev, MTK_WED_EXT_INT_STATUS);
  2131. wed_w32(dev, MTK_WED_EXT_INT_STATUS, val);
  2132. val &= ext_mask;
  2133. if (!dev->hw->num_flows)
  2134. val &= ~MTK_WED_EXT_INT_STATUS_TKID_WO_PYLD;
  2135. if (val && net_ratelimit())
  2136. pr_err("mtk_wed%d: error status=%08x\n", dev->hw->index, val);
  2137. val = wed_r32(dev, MTK_WED_INT_STATUS);
  2138. val &= mask;
  2139. wed_w32(dev, MTK_WED_INT_STATUS, val); /* ACK */
  2140. return val;
  2141. }
  2142. static void
  2143. mtk_wed_irq_set_mask(struct mtk_wed_device *dev, u32 mask)
  2144. {
  2145. mtk_wed_set_ext_int(dev, !!mask);
  2146. wed_w32(dev, MTK_WED_INT_MASK, mask);
  2147. }
  2148. int mtk_wed_flow_add(int index)
  2149. {
  2150. struct mtk_wed_hw *hw = hw_list[index];
  2151. int ret = 0;
  2152. mutex_lock(&hw_lock);
  2153. if (!hw || !hw->wed_dev) {
  2154. ret = -ENODEV;
  2155. goto out;
  2156. }
  2157. if (!hw->wed_dev->wlan.offload_enable)
  2158. goto out;
  2159. if (hw->num_flows) {
  2160. hw->num_flows++;
  2161. goto out;
  2162. }
  2163. ret = hw->wed_dev->wlan.offload_enable(hw->wed_dev);
  2164. if (!ret)
  2165. hw->num_flows++;
  2166. mtk_wed_set_ext_int(hw->wed_dev, true);
  2167. out:
  2168. mutex_unlock(&hw_lock);
  2169. return ret;
  2170. }
  2171. void mtk_wed_flow_remove(int index)
  2172. {
  2173. struct mtk_wed_hw *hw = hw_list[index];
  2174. mutex_lock(&hw_lock);
  2175. if (!hw || !hw->wed_dev)
  2176. goto out;
  2177. if (!hw->wed_dev->wlan.offload_disable)
  2178. goto out;
  2179. if (--hw->num_flows)
  2180. goto out;
  2181. hw->wed_dev->wlan.offload_disable(hw->wed_dev);
  2182. mtk_wed_set_ext_int(hw->wed_dev, true);
  2183. out:
  2184. mutex_unlock(&hw_lock);
  2185. }
  2186. static int
  2187. mtk_wed_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv)
  2188. {
  2189. struct mtk_wed_flow_block_priv *priv = cb_priv;
  2190. struct flow_cls_offload *cls = type_data;
  2191. struct mtk_wed_hw *hw = NULL;
  2192. if (!priv || !tc_can_offload(priv->dev))
  2193. return -EOPNOTSUPP;
  2194. if (type != TC_SETUP_CLSFLOWER)
  2195. return -EOPNOTSUPP;
  2196. hw = priv->hw;
  2197. return mtk_flow_offload_cmd(hw->eth, cls, hw->index);
  2198. }
  2199. static int
  2200. mtk_wed_setup_tc_block(struct mtk_wed_hw *hw, struct net_device *dev,
  2201. struct flow_block_offload *f)
  2202. {
  2203. struct mtk_wed_flow_block_priv *priv;
  2204. static LIST_HEAD(block_cb_list);
  2205. struct flow_block_cb *block_cb;
  2206. struct mtk_eth *eth = hw->eth;
  2207. flow_setup_cb_t *cb;
  2208. if (!eth->soc->offload_version)
  2209. return -EOPNOTSUPP;
  2210. if (f->binder_type != FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS)
  2211. return -EOPNOTSUPP;
  2212. cb = mtk_wed_setup_tc_block_cb;
  2213. f->driver_block_list = &block_cb_list;
  2214. switch (f->command) {
  2215. case FLOW_BLOCK_BIND:
  2216. block_cb = flow_block_cb_lookup(f->block, cb, dev);
  2217. if (block_cb) {
  2218. flow_block_cb_incref(block_cb);
  2219. return 0;
  2220. }
  2221. priv = kzalloc(sizeof(*priv), GFP_KERNEL);
  2222. if (!priv)
  2223. return -ENOMEM;
  2224. priv->hw = hw;
  2225. priv->dev = dev;
  2226. block_cb = flow_block_cb_alloc(cb, dev, priv, NULL);
  2227. if (IS_ERR(block_cb)) {
  2228. kfree(priv);
  2229. return PTR_ERR(block_cb);
  2230. }
  2231. flow_block_cb_incref(block_cb);
  2232. flow_block_cb_add(block_cb, f);
  2233. list_add_tail(&block_cb->driver_list, &block_cb_list);
  2234. return 0;
  2235. case FLOW_BLOCK_UNBIND:
  2236. block_cb = flow_block_cb_lookup(f->block, cb, dev);
  2237. if (!block_cb)
  2238. return -ENOENT;
  2239. if (!flow_block_cb_decref(block_cb)) {
  2240. flow_block_cb_remove(block_cb, f);
  2241. list_del(&block_cb->driver_list);
  2242. kfree(block_cb->cb_priv);
  2243. block_cb->cb_priv = NULL;
  2244. }
  2245. return 0;
  2246. default:
  2247. return -EOPNOTSUPP;
  2248. }
  2249. }
  2250. static int
  2251. mtk_wed_setup_tc(struct mtk_wed_device *wed, struct net_device *dev,
  2252. enum tc_setup_type type, void *type_data)
  2253. {
  2254. struct mtk_wed_hw *hw = wed->hw;
  2255. if (mtk_wed_is_v1(hw))
  2256. return -EOPNOTSUPP;
  2257. switch (type) {
  2258. case TC_SETUP_BLOCK:
  2259. case TC_SETUP_FT:
  2260. return mtk_wed_setup_tc_block(hw, dev, type_data);
  2261. default:
  2262. return -EOPNOTSUPP;
  2263. }
  2264. }
  2265. void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
  2266. void __iomem *wdma, phys_addr_t wdma_phy,
  2267. int index)
  2268. {
  2269. static const struct mtk_wed_ops wed_ops = {
  2270. .attach = mtk_wed_attach,
  2271. .tx_ring_setup = mtk_wed_tx_ring_setup,
  2272. .rx_ring_setup = mtk_wed_rx_ring_setup,
  2273. .txfree_ring_setup = mtk_wed_txfree_ring_setup,
  2274. .msg_update = mtk_wed_mcu_msg_update,
  2275. .start = mtk_wed_start,
  2276. .stop = mtk_wed_stop,
  2277. .reset_dma = mtk_wed_reset_dma,
  2278. .reg_read = wed_r32,
  2279. .reg_write = wed_w32,
  2280. .irq_get = mtk_wed_irq_get,
  2281. .irq_set_mask = mtk_wed_irq_set_mask,
  2282. .detach = mtk_wed_detach,
  2283. .ppe_check = mtk_wed_ppe_check,
  2284. .setup_tc = mtk_wed_setup_tc,
  2285. .start_hw_rro = mtk_wed_start_hw_rro,
  2286. .rro_rx_ring_setup = mtk_wed_rro_rx_ring_setup,
  2287. .msdu_pg_rx_ring_setup = mtk_wed_msdu_pg_rx_ring_setup,
  2288. .ind_rx_ring_setup = mtk_wed_ind_rx_ring_setup,
  2289. };
  2290. struct device_node *eth_np = eth->dev->of_node;
  2291. struct platform_device *pdev;
  2292. struct mtk_wed_hw *hw;
  2293. struct regmap *regs;
  2294. int irq;
  2295. if (!np)
  2296. return;
  2297. pdev = of_find_device_by_node(np);
  2298. if (!pdev)
  2299. goto err_of_node_put;
  2300. irq = platform_get_irq(pdev, 0);
  2301. if (irq < 0)
  2302. goto err_put_device;
  2303. regs = syscon_regmap_lookup_by_phandle(np, NULL);
  2304. if (IS_ERR(regs))
  2305. goto err_put_device;
  2306. rcu_assign_pointer(mtk_soc_wed_ops, &wed_ops);
  2307. mutex_lock(&hw_lock);
  2308. if (WARN_ON(hw_list[index]))
  2309. goto unlock;
  2310. hw = kzalloc(sizeof(*hw), GFP_KERNEL);
  2311. if (!hw)
  2312. goto unlock;
  2313. hw->node = np;
  2314. hw->regs = regs;
  2315. hw->eth = eth;
  2316. hw->dev = &pdev->dev;
  2317. hw->wdma_phy = wdma_phy;
  2318. hw->wdma = wdma;
  2319. hw->index = index;
  2320. hw->irq = irq;
  2321. hw->version = eth->soc->version;
  2322. switch (hw->version) {
  2323. case 2:
  2324. hw->soc = &mt7986_data;
  2325. break;
  2326. case 3:
  2327. hw->soc = &mt7988_data;
  2328. break;
  2329. default:
  2330. case 1:
  2331. hw->mirror = syscon_regmap_lookup_by_phandle(eth_np,
  2332. "mediatek,pcie-mirror");
  2333. hw->hifsys = syscon_regmap_lookup_by_phandle(eth_np,
  2334. "mediatek,hifsys");
  2335. if (IS_ERR(hw->mirror) || IS_ERR(hw->hifsys)) {
  2336. kfree(hw);
  2337. goto unlock;
  2338. }
  2339. if (!index) {
  2340. regmap_write(hw->mirror, 0, 0);
  2341. regmap_write(hw->mirror, 4, 0);
  2342. }
  2343. hw->soc = &mt7622_data;
  2344. break;
  2345. }
  2346. mtk_wed_hw_add_debugfs(hw);
  2347. hw_list[index] = hw;
  2348. mutex_unlock(&hw_lock);
  2349. return;
  2350. unlock:
  2351. mutex_unlock(&hw_lock);
  2352. err_put_device:
  2353. put_device(&pdev->dev);
  2354. err_of_node_put:
  2355. of_node_put(np);
  2356. }
  2357. void mtk_wed_exit(void)
  2358. {
  2359. int i;
  2360. rcu_assign_pointer(mtk_soc_wed_ops, NULL);
  2361. synchronize_rcu();
  2362. for (i = 0; i < ARRAY_SIZE(hw_list); i++) {
  2363. struct mtk_wed_hw *hw;
  2364. hw = hw_list[i];
  2365. if (!hw)
  2366. continue;
  2367. hw_list[i] = NULL;
  2368. debugfs_remove(hw->debugfs_dir);
  2369. put_device(hw->dev);
  2370. of_node_put(hw->node);
  2371. kfree(hw);
  2372. }
  2373. }