mtk_wed.c 75 KB

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