mtk_eth.c 55 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2018 MediaTek Inc.
  4. *
  5. * Author: Weijie Gao <weijie.gao@mediatek.com>
  6. * Author: Mark Lee <mark-mc.lee@mediatek.com>
  7. */
  8. #include <common.h>
  9. #include <cpu_func.h>
  10. #include <dm.h>
  11. #include <log.h>
  12. #include <malloc.h>
  13. #include <miiphy.h>
  14. #include <net.h>
  15. #include <regmap.h>
  16. #include <reset.h>
  17. #include <syscon.h>
  18. #include <wait_bit.h>
  19. #include <asm/cache.h>
  20. #include <asm/gpio.h>
  21. #include <asm/io.h>
  22. #include <dm/device_compat.h>
  23. #include <linux/delay.h>
  24. #include <linux/err.h>
  25. #include <linux/ioport.h>
  26. #include <linux/mdio.h>
  27. #include <linux/mii.h>
  28. #include "mtk_eth.h"
  29. #define NUM_TX_DESC 24
  30. #define NUM_RX_DESC 24
  31. #define TX_TOTAL_BUF_SIZE (NUM_TX_DESC * PKTSIZE_ALIGN)
  32. #define RX_TOTAL_BUF_SIZE (NUM_RX_DESC * PKTSIZE_ALIGN)
  33. #define TOTAL_PKT_BUF_SIZE (TX_TOTAL_BUF_SIZE + RX_TOTAL_BUF_SIZE)
  34. #define MT753X_NUM_PHYS 5
  35. #define MT753X_NUM_PORTS 7
  36. #define MT753X_DFL_SMI_ADDR 31
  37. #define MT753X_SMI_ADDR_MASK 0x1f
  38. #define MT753X_PHY_ADDR(base, addr) \
  39. (((base) + (addr)) & 0x1f)
  40. #define GDMA_FWD_TO_CPU \
  41. (0x20000000 | \
  42. GDM_ICS_EN | \
  43. GDM_TCS_EN | \
  44. GDM_UCS_EN | \
  45. STRP_CRC | \
  46. (DP_PDMA << MYMAC_DP_S) | \
  47. (DP_PDMA << BC_DP_S) | \
  48. (DP_PDMA << MC_DP_S) | \
  49. (DP_PDMA << UN_DP_S))
  50. #define GDMA_BRIDGE_TO_CPU \
  51. (0xC0000000 | \
  52. GDM_ICS_EN | \
  53. GDM_TCS_EN | \
  54. GDM_UCS_EN | \
  55. (DP_PDMA << MYMAC_DP_S) | \
  56. (DP_PDMA << BC_DP_S) | \
  57. (DP_PDMA << MC_DP_S) | \
  58. (DP_PDMA << UN_DP_S))
  59. #define GDMA_FWD_DISCARD \
  60. (0x20000000 | \
  61. GDM_ICS_EN | \
  62. GDM_TCS_EN | \
  63. GDM_UCS_EN | \
  64. STRP_CRC | \
  65. (DP_DISCARD << MYMAC_DP_S) | \
  66. (DP_DISCARD << BC_DP_S) | \
  67. (DP_DISCARD << MC_DP_S) | \
  68. (DP_DISCARD << UN_DP_S))
  69. enum mtk_switch {
  70. SW_NONE,
  71. SW_MT7530,
  72. SW_MT7531,
  73. SW_MT7988,
  74. };
  75. /* struct mtk_soc_data - This is the structure holding all differences
  76. * among various plaforms
  77. * @caps Flags shown the extra capability for the SoC
  78. * @ana_rgc3: The offset for register ANA_RGC3 related to
  79. * sgmiisys syscon
  80. * @gdma_count: Number of GDMAs
  81. * @pdma_base: Register base of PDMA block
  82. * @txd_size: Tx DMA descriptor size.
  83. * @rxd_size: Rx DMA descriptor size.
  84. */
  85. struct mtk_soc_data {
  86. u32 caps;
  87. u32 ana_rgc3;
  88. u32 gdma_count;
  89. u32 pdma_base;
  90. u32 txd_size;
  91. u32 rxd_size;
  92. };
  93. struct mtk_eth_priv {
  94. char pkt_pool[TOTAL_PKT_BUF_SIZE] __aligned(ARCH_DMA_MINALIGN);
  95. void *tx_ring_noc;
  96. void *rx_ring_noc;
  97. int rx_dma_owner_idx0;
  98. int tx_cpu_owner_idx0;
  99. void __iomem *fe_base;
  100. void __iomem *gmac_base;
  101. void __iomem *sgmii_base;
  102. void __iomem *gsw_base;
  103. struct regmap *ethsys_regmap;
  104. struct regmap *infra_regmap;
  105. struct regmap *usxgmii_regmap;
  106. struct regmap *xfi_pextp_regmap;
  107. struct regmap *xfi_pll_regmap;
  108. struct regmap *toprgu_regmap;
  109. struct mii_dev *mdio_bus;
  110. int (*mii_read)(struct mtk_eth_priv *priv, u8 phy, u8 reg);
  111. int (*mii_write)(struct mtk_eth_priv *priv, u8 phy, u8 reg, u16 val);
  112. int (*mmd_read)(struct mtk_eth_priv *priv, u8 addr, u8 devad, u16 reg);
  113. int (*mmd_write)(struct mtk_eth_priv *priv, u8 addr, u8 devad, u16 reg,
  114. u16 val);
  115. const struct mtk_soc_data *soc;
  116. int gmac_id;
  117. int force_mode;
  118. int speed;
  119. int duplex;
  120. bool pn_swap;
  121. struct phy_device *phydev;
  122. int phy_interface;
  123. int phy_addr;
  124. enum mtk_switch sw;
  125. int (*switch_init)(struct mtk_eth_priv *priv);
  126. void (*switch_mac_control)(struct mtk_eth_priv *priv, bool enable);
  127. u32 mt753x_smi_addr;
  128. u32 mt753x_phy_base;
  129. u32 mt753x_pmcr;
  130. u32 mt753x_reset_wait_time;
  131. struct gpio_desc rst_gpio;
  132. int mcm;
  133. struct reset_ctl rst_fe;
  134. struct reset_ctl rst_mcm;
  135. };
  136. static void mtk_pdma_write(struct mtk_eth_priv *priv, u32 reg, u32 val)
  137. {
  138. writel(val, priv->fe_base + priv->soc->pdma_base + reg);
  139. }
  140. static void mtk_pdma_rmw(struct mtk_eth_priv *priv, u32 reg, u32 clr,
  141. u32 set)
  142. {
  143. clrsetbits_le32(priv->fe_base + priv->soc->pdma_base + reg, clr, set);
  144. }
  145. static void mtk_gdma_write(struct mtk_eth_priv *priv, int no, u32 reg,
  146. u32 val)
  147. {
  148. u32 gdma_base;
  149. if (no == 2)
  150. gdma_base = GDMA3_BASE;
  151. else if (no == 1)
  152. gdma_base = GDMA2_BASE;
  153. else
  154. gdma_base = GDMA1_BASE;
  155. writel(val, priv->fe_base + gdma_base + reg);
  156. }
  157. static void mtk_fe_rmw(struct mtk_eth_priv *priv, u32 reg, u32 clr, u32 set)
  158. {
  159. clrsetbits_le32(priv->fe_base + reg, clr, set);
  160. }
  161. static u32 mtk_gmac_read(struct mtk_eth_priv *priv, u32 reg)
  162. {
  163. return readl(priv->gmac_base + reg);
  164. }
  165. static void mtk_gmac_write(struct mtk_eth_priv *priv, u32 reg, u32 val)
  166. {
  167. writel(val, priv->gmac_base + reg);
  168. }
  169. static void mtk_gmac_rmw(struct mtk_eth_priv *priv, u32 reg, u32 clr, u32 set)
  170. {
  171. clrsetbits_le32(priv->gmac_base + reg, clr, set);
  172. }
  173. static void mtk_ethsys_rmw(struct mtk_eth_priv *priv, u32 reg, u32 clr,
  174. u32 set)
  175. {
  176. uint val;
  177. regmap_read(priv->ethsys_regmap, reg, &val);
  178. val &= ~clr;
  179. val |= set;
  180. regmap_write(priv->ethsys_regmap, reg, val);
  181. }
  182. static void mtk_infra_rmw(struct mtk_eth_priv *priv, u32 reg, u32 clr,
  183. u32 set)
  184. {
  185. uint val;
  186. regmap_read(priv->infra_regmap, reg, &val);
  187. val &= ~clr;
  188. val |= set;
  189. regmap_write(priv->infra_regmap, reg, val);
  190. }
  191. static u32 mtk_gsw_read(struct mtk_eth_priv *priv, u32 reg)
  192. {
  193. return readl(priv->gsw_base + reg);
  194. }
  195. static void mtk_gsw_write(struct mtk_eth_priv *priv, u32 reg, u32 val)
  196. {
  197. writel(val, priv->gsw_base + reg);
  198. }
  199. /* Direct MDIO clause 22/45 access via SoC */
  200. static int mtk_mii_rw(struct mtk_eth_priv *priv, u8 phy, u8 reg, u16 data,
  201. u32 cmd, u32 st)
  202. {
  203. int ret;
  204. u32 val;
  205. val = (st << MDIO_ST_S) |
  206. ((cmd << MDIO_CMD_S) & MDIO_CMD_M) |
  207. (((u32)phy << MDIO_PHY_ADDR_S) & MDIO_PHY_ADDR_M) |
  208. (((u32)reg << MDIO_REG_ADDR_S) & MDIO_REG_ADDR_M);
  209. if (cmd == MDIO_CMD_WRITE || cmd == MDIO_CMD_ADDR)
  210. val |= data & MDIO_RW_DATA_M;
  211. mtk_gmac_write(priv, GMAC_PIAC_REG, val | PHY_ACS_ST);
  212. ret = wait_for_bit_le32(priv->gmac_base + GMAC_PIAC_REG,
  213. PHY_ACS_ST, 0, 5000, 0);
  214. if (ret) {
  215. pr_warn("MDIO access timeout\n");
  216. return ret;
  217. }
  218. if (cmd == MDIO_CMD_READ || cmd == MDIO_CMD_READ_C45) {
  219. val = mtk_gmac_read(priv, GMAC_PIAC_REG);
  220. return val & MDIO_RW_DATA_M;
  221. }
  222. return 0;
  223. }
  224. /* Direct MDIO clause 22 read via SoC */
  225. static int mtk_mii_read(struct mtk_eth_priv *priv, u8 phy, u8 reg)
  226. {
  227. return mtk_mii_rw(priv, phy, reg, 0, MDIO_CMD_READ, MDIO_ST_C22);
  228. }
  229. /* Direct MDIO clause 22 write via SoC */
  230. static int mtk_mii_write(struct mtk_eth_priv *priv, u8 phy, u8 reg, u16 data)
  231. {
  232. return mtk_mii_rw(priv, phy, reg, data, MDIO_CMD_WRITE, MDIO_ST_C22);
  233. }
  234. /* Direct MDIO clause 45 read via SoC */
  235. static int mtk_mmd_read(struct mtk_eth_priv *priv, u8 addr, u8 devad, u16 reg)
  236. {
  237. int ret;
  238. ret = mtk_mii_rw(priv, addr, devad, reg, MDIO_CMD_ADDR, MDIO_ST_C45);
  239. if (ret)
  240. return ret;
  241. return mtk_mii_rw(priv, addr, devad, 0, MDIO_CMD_READ_C45,
  242. MDIO_ST_C45);
  243. }
  244. /* Direct MDIO clause 45 write via SoC */
  245. static int mtk_mmd_write(struct mtk_eth_priv *priv, u8 addr, u8 devad,
  246. u16 reg, u16 val)
  247. {
  248. int ret;
  249. ret = mtk_mii_rw(priv, addr, devad, reg, MDIO_CMD_ADDR, MDIO_ST_C45);
  250. if (ret)
  251. return ret;
  252. return mtk_mii_rw(priv, addr, devad, val, MDIO_CMD_WRITE,
  253. MDIO_ST_C45);
  254. }
  255. /* Indirect MDIO clause 45 read via MII registers */
  256. static int mtk_mmd_ind_read(struct mtk_eth_priv *priv, u8 addr, u8 devad,
  257. u16 reg)
  258. {
  259. int ret;
  260. ret = priv->mii_write(priv, addr, MII_MMD_ACC_CTL_REG,
  261. (MMD_ADDR << MMD_CMD_S) |
  262. ((devad << MMD_DEVAD_S) & MMD_DEVAD_M));
  263. if (ret)
  264. return ret;
  265. ret = priv->mii_write(priv, addr, MII_MMD_ADDR_DATA_REG, reg);
  266. if (ret)
  267. return ret;
  268. ret = priv->mii_write(priv, addr, MII_MMD_ACC_CTL_REG,
  269. (MMD_DATA << MMD_CMD_S) |
  270. ((devad << MMD_DEVAD_S) & MMD_DEVAD_M));
  271. if (ret)
  272. return ret;
  273. return priv->mii_read(priv, addr, MII_MMD_ADDR_DATA_REG);
  274. }
  275. /* Indirect MDIO clause 45 write via MII registers */
  276. static int mtk_mmd_ind_write(struct mtk_eth_priv *priv, u8 addr, u8 devad,
  277. u16 reg, u16 val)
  278. {
  279. int ret;
  280. ret = priv->mii_write(priv, addr, MII_MMD_ACC_CTL_REG,
  281. (MMD_ADDR << MMD_CMD_S) |
  282. ((devad << MMD_DEVAD_S) & MMD_DEVAD_M));
  283. if (ret)
  284. return ret;
  285. ret = priv->mii_write(priv, addr, MII_MMD_ADDR_DATA_REG, reg);
  286. if (ret)
  287. return ret;
  288. ret = priv->mii_write(priv, addr, MII_MMD_ACC_CTL_REG,
  289. (MMD_DATA << MMD_CMD_S) |
  290. ((devad << MMD_DEVAD_S) & MMD_DEVAD_M));
  291. if (ret)
  292. return ret;
  293. return priv->mii_write(priv, addr, MII_MMD_ADDR_DATA_REG, val);
  294. }
  295. /*
  296. * MT7530 Internal Register Address Bits
  297. * -------------------------------------------------------------------
  298. * | 15 14 13 12 11 10 9 8 7 6 | 5 4 3 2 | 1 0 |
  299. * |----------------------------------------|---------------|--------|
  300. * | Page Address | Reg Address | Unused |
  301. * -------------------------------------------------------------------
  302. */
  303. static int mt753x_reg_read(struct mtk_eth_priv *priv, u32 reg, u32 *data)
  304. {
  305. int ret, low_word, high_word;
  306. if (priv->sw == SW_MT7988) {
  307. *data = mtk_gsw_read(priv, reg);
  308. return 0;
  309. }
  310. /* Write page address */
  311. ret = mtk_mii_write(priv, priv->mt753x_smi_addr, 0x1f, reg >> 6);
  312. if (ret)
  313. return ret;
  314. /* Read low word */
  315. low_word = mtk_mii_read(priv, priv->mt753x_smi_addr, (reg >> 2) & 0xf);
  316. if (low_word < 0)
  317. return low_word;
  318. /* Read high word */
  319. high_word = mtk_mii_read(priv, priv->mt753x_smi_addr, 0x10);
  320. if (high_word < 0)
  321. return high_word;
  322. if (data)
  323. *data = ((u32)high_word << 16) | (low_word & 0xffff);
  324. return 0;
  325. }
  326. static int mt753x_reg_write(struct mtk_eth_priv *priv, u32 reg, u32 data)
  327. {
  328. int ret;
  329. if (priv->sw == SW_MT7988) {
  330. mtk_gsw_write(priv, reg, data);
  331. return 0;
  332. }
  333. /* Write page address */
  334. ret = mtk_mii_write(priv, priv->mt753x_smi_addr, 0x1f, reg >> 6);
  335. if (ret)
  336. return ret;
  337. /* Write low word */
  338. ret = mtk_mii_write(priv, priv->mt753x_smi_addr, (reg >> 2) & 0xf,
  339. data & 0xffff);
  340. if (ret)
  341. return ret;
  342. /* Write high word */
  343. return mtk_mii_write(priv, priv->mt753x_smi_addr, 0x10, data >> 16);
  344. }
  345. static void mt753x_reg_rmw(struct mtk_eth_priv *priv, u32 reg, u32 clr,
  346. u32 set)
  347. {
  348. u32 val;
  349. mt753x_reg_read(priv, reg, &val);
  350. val &= ~clr;
  351. val |= set;
  352. mt753x_reg_write(priv, reg, val);
  353. }
  354. /* Indirect MDIO clause 22/45 access */
  355. static int mt7531_mii_rw(struct mtk_eth_priv *priv, int phy, int reg, u16 data,
  356. u32 cmd, u32 st)
  357. {
  358. ulong timeout;
  359. u32 val, timeout_ms;
  360. int ret = 0;
  361. val = (st << MDIO_ST_S) |
  362. ((cmd << MDIO_CMD_S) & MDIO_CMD_M) |
  363. ((phy << MDIO_PHY_ADDR_S) & MDIO_PHY_ADDR_M) |
  364. ((reg << MDIO_REG_ADDR_S) & MDIO_REG_ADDR_M);
  365. if (cmd == MDIO_CMD_WRITE || cmd == MDIO_CMD_ADDR)
  366. val |= data & MDIO_RW_DATA_M;
  367. mt753x_reg_write(priv, MT7531_PHY_IAC, val | PHY_ACS_ST);
  368. timeout_ms = 100;
  369. timeout = get_timer(0);
  370. while (1) {
  371. mt753x_reg_read(priv, MT7531_PHY_IAC, &val);
  372. if ((val & PHY_ACS_ST) == 0)
  373. break;
  374. if (get_timer(timeout) > timeout_ms)
  375. return -ETIMEDOUT;
  376. }
  377. if (cmd == MDIO_CMD_READ || cmd == MDIO_CMD_READ_C45) {
  378. mt753x_reg_read(priv, MT7531_PHY_IAC, &val);
  379. ret = val & MDIO_RW_DATA_M;
  380. }
  381. return ret;
  382. }
  383. static int mt7531_mii_ind_read(struct mtk_eth_priv *priv, u8 phy, u8 reg)
  384. {
  385. u8 phy_addr;
  386. if (phy >= MT753X_NUM_PHYS)
  387. return -EINVAL;
  388. phy_addr = MT753X_PHY_ADDR(priv->mt753x_phy_base, phy);
  389. return mt7531_mii_rw(priv, phy_addr, reg, 0, MDIO_CMD_READ,
  390. MDIO_ST_C22);
  391. }
  392. static int mt7531_mii_ind_write(struct mtk_eth_priv *priv, u8 phy, u8 reg,
  393. u16 val)
  394. {
  395. u8 phy_addr;
  396. if (phy >= MT753X_NUM_PHYS)
  397. return -EINVAL;
  398. phy_addr = MT753X_PHY_ADDR(priv->mt753x_phy_base, phy);
  399. return mt7531_mii_rw(priv, phy_addr, reg, val, MDIO_CMD_WRITE,
  400. MDIO_ST_C22);
  401. }
  402. static int mt7531_mmd_ind_read(struct mtk_eth_priv *priv, u8 addr, u8 devad,
  403. u16 reg)
  404. {
  405. u8 phy_addr;
  406. int ret;
  407. if (addr >= MT753X_NUM_PHYS)
  408. return -EINVAL;
  409. phy_addr = MT753X_PHY_ADDR(priv->mt753x_phy_base, addr);
  410. ret = mt7531_mii_rw(priv, phy_addr, devad, reg, MDIO_CMD_ADDR,
  411. MDIO_ST_C45);
  412. if (ret)
  413. return ret;
  414. return mt7531_mii_rw(priv, phy_addr, devad, 0, MDIO_CMD_READ_C45,
  415. MDIO_ST_C45);
  416. }
  417. static int mt7531_mmd_ind_write(struct mtk_eth_priv *priv, u8 addr, u8 devad,
  418. u16 reg, u16 val)
  419. {
  420. u8 phy_addr;
  421. int ret;
  422. if (addr >= MT753X_NUM_PHYS)
  423. return 0;
  424. phy_addr = MT753X_PHY_ADDR(priv->mt753x_phy_base, addr);
  425. ret = mt7531_mii_rw(priv, phy_addr, devad, reg, MDIO_CMD_ADDR,
  426. MDIO_ST_C45);
  427. if (ret)
  428. return ret;
  429. return mt7531_mii_rw(priv, phy_addr, devad, val, MDIO_CMD_WRITE,
  430. MDIO_ST_C45);
  431. }
  432. static int mtk_mdio_read(struct mii_dev *bus, int addr, int devad, int reg)
  433. {
  434. struct mtk_eth_priv *priv = bus->priv;
  435. if (devad < 0)
  436. return priv->mii_read(priv, addr, reg);
  437. else
  438. return priv->mmd_read(priv, addr, devad, reg);
  439. }
  440. static int mtk_mdio_write(struct mii_dev *bus, int addr, int devad, int reg,
  441. u16 val)
  442. {
  443. struct mtk_eth_priv *priv = bus->priv;
  444. if (devad < 0)
  445. return priv->mii_write(priv, addr, reg, val);
  446. else
  447. return priv->mmd_write(priv, addr, devad, reg, val);
  448. }
  449. static int mtk_mdio_register(struct udevice *dev)
  450. {
  451. struct mtk_eth_priv *priv = dev_get_priv(dev);
  452. struct mii_dev *mdio_bus = mdio_alloc();
  453. int ret;
  454. if (!mdio_bus)
  455. return -ENOMEM;
  456. /* Assign MDIO access APIs according to the switch/phy */
  457. switch (priv->sw) {
  458. case SW_MT7530:
  459. priv->mii_read = mtk_mii_read;
  460. priv->mii_write = mtk_mii_write;
  461. priv->mmd_read = mtk_mmd_ind_read;
  462. priv->mmd_write = mtk_mmd_ind_write;
  463. break;
  464. case SW_MT7531:
  465. case SW_MT7988:
  466. priv->mii_read = mt7531_mii_ind_read;
  467. priv->mii_write = mt7531_mii_ind_write;
  468. priv->mmd_read = mt7531_mmd_ind_read;
  469. priv->mmd_write = mt7531_mmd_ind_write;
  470. break;
  471. default:
  472. priv->mii_read = mtk_mii_read;
  473. priv->mii_write = mtk_mii_write;
  474. priv->mmd_read = mtk_mmd_read;
  475. priv->mmd_write = mtk_mmd_write;
  476. }
  477. mdio_bus->read = mtk_mdio_read;
  478. mdio_bus->write = mtk_mdio_write;
  479. snprintf(mdio_bus->name, sizeof(mdio_bus->name), dev->name);
  480. mdio_bus->priv = (void *)priv;
  481. ret = mdio_register(mdio_bus);
  482. if (ret)
  483. return ret;
  484. priv->mdio_bus = mdio_bus;
  485. return 0;
  486. }
  487. static int mt753x_core_reg_read(struct mtk_eth_priv *priv, u32 reg)
  488. {
  489. u8 phy_addr = MT753X_PHY_ADDR(priv->mt753x_phy_base, 0);
  490. return priv->mmd_read(priv, phy_addr, 0x1f, reg);
  491. }
  492. static void mt753x_core_reg_write(struct mtk_eth_priv *priv, u32 reg, u32 val)
  493. {
  494. u8 phy_addr = MT753X_PHY_ADDR(priv->mt753x_phy_base, 0);
  495. priv->mmd_write(priv, phy_addr, 0x1f, reg, val);
  496. }
  497. static int mt7530_pad_clk_setup(struct mtk_eth_priv *priv, int mode)
  498. {
  499. u32 ncpo1, ssc_delta;
  500. switch (mode) {
  501. case PHY_INTERFACE_MODE_RGMII:
  502. ncpo1 = 0x0c80;
  503. ssc_delta = 0x87;
  504. break;
  505. default:
  506. printf("error: xMII mode %d not supported\n", mode);
  507. return -EINVAL;
  508. }
  509. /* Disable MT7530 core clock */
  510. mt753x_core_reg_write(priv, CORE_TRGMII_GSW_CLK_CG, 0);
  511. /* Disable MT7530 PLL */
  512. mt753x_core_reg_write(priv, CORE_GSWPLL_GRP1,
  513. (2 << RG_GSWPLL_POSDIV_200M_S) |
  514. (32 << RG_GSWPLL_FBKDIV_200M_S));
  515. /* For MT7530 core clock = 500Mhz */
  516. mt753x_core_reg_write(priv, CORE_GSWPLL_GRP2,
  517. (1 << RG_GSWPLL_POSDIV_500M_S) |
  518. (25 << RG_GSWPLL_FBKDIV_500M_S));
  519. /* Enable MT7530 PLL */
  520. mt753x_core_reg_write(priv, CORE_GSWPLL_GRP1,
  521. (2 << RG_GSWPLL_POSDIV_200M_S) |
  522. (32 << RG_GSWPLL_FBKDIV_200M_S) |
  523. RG_GSWPLL_EN_PRE);
  524. udelay(20);
  525. mt753x_core_reg_write(priv, CORE_TRGMII_GSW_CLK_CG, REG_GSWCK_EN);
  526. /* Setup the MT7530 TRGMII Tx Clock */
  527. mt753x_core_reg_write(priv, CORE_PLL_GROUP5, ncpo1);
  528. mt753x_core_reg_write(priv, CORE_PLL_GROUP6, 0);
  529. mt753x_core_reg_write(priv, CORE_PLL_GROUP10, ssc_delta);
  530. mt753x_core_reg_write(priv, CORE_PLL_GROUP11, ssc_delta);
  531. mt753x_core_reg_write(priv, CORE_PLL_GROUP4, RG_SYSPLL_DDSFBK_EN |
  532. RG_SYSPLL_BIAS_EN | RG_SYSPLL_BIAS_LPF_EN);
  533. mt753x_core_reg_write(priv, CORE_PLL_GROUP2,
  534. RG_SYSPLL_EN_NORMAL | RG_SYSPLL_VODEN |
  535. (1 << RG_SYSPLL_POSDIV_S));
  536. mt753x_core_reg_write(priv, CORE_PLL_GROUP7,
  537. RG_LCDDS_PCW_NCPO_CHG | (3 << RG_LCCDS_C_S) |
  538. RG_LCDDS_PWDB | RG_LCDDS_ISO_EN);
  539. /* Enable MT7530 core clock */
  540. mt753x_core_reg_write(priv, CORE_TRGMII_GSW_CLK_CG,
  541. REG_GSWCK_EN | REG_TRGMIICK_EN);
  542. return 0;
  543. }
  544. static void mt7530_mac_control(struct mtk_eth_priv *priv, bool enable)
  545. {
  546. u32 pmcr = FORCE_MODE;
  547. if (enable)
  548. pmcr = priv->mt753x_pmcr;
  549. mt753x_reg_write(priv, PMCR_REG(6), pmcr);
  550. }
  551. static int mt7530_setup(struct mtk_eth_priv *priv)
  552. {
  553. u16 phy_addr, phy_val;
  554. u32 val, txdrv;
  555. int i;
  556. if (!MTK_HAS_CAPS(priv->soc->caps, MTK_TRGMII_MT7621_CLK)) {
  557. /* Select 250MHz clk for RGMII mode */
  558. mtk_ethsys_rmw(priv, ETHSYS_CLKCFG0_REG,
  559. ETHSYS_TRGMII_CLK_SEL362_5, 0);
  560. txdrv = 8;
  561. } else {
  562. txdrv = 4;
  563. }
  564. /* Modify HWTRAP first to allow direct access to internal PHYs */
  565. mt753x_reg_read(priv, HWTRAP_REG, &val);
  566. val |= CHG_TRAP;
  567. val &= ~C_MDIO_BPS;
  568. mt753x_reg_write(priv, MHWTRAP_REG, val);
  569. /* Calculate the phy base address */
  570. val = ((val & SMI_ADDR_M) >> SMI_ADDR_S) << 3;
  571. priv->mt753x_phy_base = (val | 0x7) + 1;
  572. /* Turn off PHYs */
  573. for (i = 0; i < MT753X_NUM_PHYS; i++) {
  574. phy_addr = MT753X_PHY_ADDR(priv->mt753x_phy_base, i);
  575. phy_val = priv->mii_read(priv, phy_addr, MII_BMCR);
  576. phy_val |= BMCR_PDOWN;
  577. priv->mii_write(priv, phy_addr, MII_BMCR, phy_val);
  578. }
  579. /* Force MAC link down before reset */
  580. mt753x_reg_write(priv, PMCR_REG(5), FORCE_MODE);
  581. mt753x_reg_write(priv, PMCR_REG(6), FORCE_MODE);
  582. /* MT7530 reset */
  583. mt753x_reg_write(priv, SYS_CTRL_REG, SW_SYS_RST | SW_REG_RST);
  584. udelay(100);
  585. val = (IPG_96BIT_WITH_SHORT_IPG << IPG_CFG_S) |
  586. MAC_MODE | FORCE_MODE |
  587. MAC_TX_EN | MAC_RX_EN |
  588. BKOFF_EN | BACKPR_EN |
  589. (SPEED_1000M << FORCE_SPD_S) |
  590. FORCE_DPX | FORCE_LINK;
  591. /* MT7530 Port6: Forced 1000M/FD, FC disabled */
  592. priv->mt753x_pmcr = val;
  593. /* MT7530 Port5: Forced link down */
  594. mt753x_reg_write(priv, PMCR_REG(5), FORCE_MODE);
  595. /* Keep MAC link down before starting eth */
  596. mt753x_reg_write(priv, PMCR_REG(6), FORCE_MODE);
  597. /* MT7530 Port6: Set to RGMII */
  598. mt753x_reg_rmw(priv, MT7530_P6ECR, P6_INTF_MODE_M, P6_INTF_MODE_RGMII);
  599. /* Hardware Trap: Enable Port6, Disable Port5 */
  600. mt753x_reg_read(priv, HWTRAP_REG, &val);
  601. val |= CHG_TRAP | LOOPDET_DIS | P5_INTF_DIS |
  602. (P5_INTF_SEL_GMAC5 << P5_INTF_SEL_S) |
  603. (P5_INTF_MODE_RGMII << P5_INTF_MODE_S);
  604. val &= ~(C_MDIO_BPS | P6_INTF_DIS);
  605. mt753x_reg_write(priv, MHWTRAP_REG, val);
  606. /* Setup switch core pll */
  607. mt7530_pad_clk_setup(priv, priv->phy_interface);
  608. /* Lower Tx Driving for TRGMII path */
  609. for (i = 0 ; i < NUM_TRGMII_CTRL ; i++)
  610. mt753x_reg_write(priv, MT7530_TRGMII_TD_ODT(i),
  611. (txdrv << TD_DM_DRVP_S) |
  612. (txdrv << TD_DM_DRVN_S));
  613. for (i = 0 ; i < NUM_TRGMII_CTRL; i++)
  614. mt753x_reg_rmw(priv, MT7530_TRGMII_RD(i), RD_TAP_M, 16);
  615. /* Turn on PHYs */
  616. for (i = 0; i < MT753X_NUM_PHYS; i++) {
  617. phy_addr = MT753X_PHY_ADDR(priv->mt753x_phy_base, i);
  618. phy_val = priv->mii_read(priv, phy_addr, MII_BMCR);
  619. phy_val &= ~BMCR_PDOWN;
  620. priv->mii_write(priv, phy_addr, MII_BMCR, phy_val);
  621. }
  622. return 0;
  623. }
  624. static void mt7531_core_pll_setup(struct mtk_eth_priv *priv, int mcm)
  625. {
  626. /* Step 1 : Disable MT7531 COREPLL */
  627. mt753x_reg_rmw(priv, MT7531_PLLGP_EN, EN_COREPLL, 0);
  628. /* Step 2: switch to XTAL output */
  629. mt753x_reg_rmw(priv, MT7531_PLLGP_EN, SW_CLKSW, SW_CLKSW);
  630. mt753x_reg_rmw(priv, MT7531_PLLGP_CR0, RG_COREPLL_EN, 0);
  631. /* Step 3: disable PLLGP and enable program PLLGP */
  632. mt753x_reg_rmw(priv, MT7531_PLLGP_EN, SW_PLLGP, SW_PLLGP);
  633. /* Step 4: program COREPLL output frequency to 500MHz */
  634. mt753x_reg_rmw(priv, MT7531_PLLGP_CR0, RG_COREPLL_POSDIV_M,
  635. 2 << RG_COREPLL_POSDIV_S);
  636. udelay(25);
  637. /* Currently, support XTAL 25Mhz only */
  638. mt753x_reg_rmw(priv, MT7531_PLLGP_CR0, RG_COREPLL_SDM_PCW_M,
  639. 0x140000 << RG_COREPLL_SDM_PCW_S);
  640. /* Set feedback divide ratio update signal to high */
  641. mt753x_reg_rmw(priv, MT7531_PLLGP_CR0, RG_COREPLL_SDM_PCW_CHG,
  642. RG_COREPLL_SDM_PCW_CHG);
  643. /* Wait for at least 16 XTAL clocks */
  644. udelay(10);
  645. /* Step 5: set feedback divide ratio update signal to low */
  646. mt753x_reg_rmw(priv, MT7531_PLLGP_CR0, RG_COREPLL_SDM_PCW_CHG, 0);
  647. /* add enable 325M clock for SGMII */
  648. mt753x_reg_write(priv, MT7531_ANA_PLLGP_CR5, 0xad0000);
  649. /* add enable 250SSC clock for RGMII */
  650. mt753x_reg_write(priv, MT7531_ANA_PLLGP_CR2, 0x4f40000);
  651. /*Step 6: Enable MT7531 PLL */
  652. mt753x_reg_rmw(priv, MT7531_PLLGP_CR0, RG_COREPLL_EN, RG_COREPLL_EN);
  653. mt753x_reg_rmw(priv, MT7531_PLLGP_EN, EN_COREPLL, EN_COREPLL);
  654. udelay(25);
  655. }
  656. static int mt7531_port_sgmii_init(struct mtk_eth_priv *priv,
  657. u32 port)
  658. {
  659. if (port != 5 && port != 6) {
  660. printf("mt7531: port %d is not a SGMII port\n", port);
  661. return -EINVAL;
  662. }
  663. /* Set SGMII GEN2 speed(2.5G) */
  664. mt753x_reg_rmw(priv, MT7531_PHYA_CTRL_SIGNAL3(port),
  665. SGMSYS_SPEED_2500, SGMSYS_SPEED_2500);
  666. /* Disable SGMII AN */
  667. mt753x_reg_rmw(priv, MT7531_PCS_CONTROL_1(port),
  668. SGMII_AN_ENABLE, 0);
  669. /* SGMII force mode setting */
  670. mt753x_reg_write(priv, MT7531_SGMII_MODE(port), SGMII_FORCE_MODE);
  671. /* Release PHYA power down state */
  672. mt753x_reg_rmw(priv, MT7531_QPHY_PWR_STATE_CTRL(port),
  673. SGMII_PHYA_PWD, 0);
  674. return 0;
  675. }
  676. static int mt7531_port_rgmii_init(struct mtk_eth_priv *priv, u32 port)
  677. {
  678. u32 val;
  679. if (port != 5) {
  680. printf("error: RGMII mode is not available for port %d\n",
  681. port);
  682. return -EINVAL;
  683. }
  684. mt753x_reg_read(priv, MT7531_CLKGEN_CTRL, &val);
  685. val |= GP_CLK_EN;
  686. val &= ~GP_MODE_M;
  687. val |= GP_MODE_RGMII << GP_MODE_S;
  688. val |= TXCLK_NO_REVERSE;
  689. val |= RXCLK_NO_DELAY;
  690. val &= ~CLK_SKEW_IN_M;
  691. val |= CLK_SKEW_IN_NO_CHANGE << CLK_SKEW_IN_S;
  692. val &= ~CLK_SKEW_OUT_M;
  693. val |= CLK_SKEW_OUT_NO_CHANGE << CLK_SKEW_OUT_S;
  694. mt753x_reg_write(priv, MT7531_CLKGEN_CTRL, val);
  695. return 0;
  696. }
  697. static void mt7531_phy_setting(struct mtk_eth_priv *priv)
  698. {
  699. int i;
  700. u32 val;
  701. for (i = 0; i < MT753X_NUM_PHYS; i++) {
  702. /* Enable HW auto downshift */
  703. priv->mii_write(priv, i, 0x1f, 0x1);
  704. val = priv->mii_read(priv, i, PHY_EXT_REG_14);
  705. val |= PHY_EN_DOWN_SHFIT;
  706. priv->mii_write(priv, i, PHY_EXT_REG_14, val);
  707. /* PHY link down power saving enable */
  708. val = priv->mii_read(priv, i, PHY_EXT_REG_17);
  709. val |= PHY_LINKDOWN_POWER_SAVING_EN;
  710. priv->mii_write(priv, i, PHY_EXT_REG_17, val);
  711. val = priv->mmd_read(priv, i, 0x1e, PHY_DEV1E_REG_0C6);
  712. val &= ~PHY_POWER_SAVING_M;
  713. val |= PHY_POWER_SAVING_TX << PHY_POWER_SAVING_S;
  714. priv->mmd_write(priv, i, 0x1e, PHY_DEV1E_REG_0C6, val);
  715. }
  716. }
  717. static void mt7531_mac_control(struct mtk_eth_priv *priv, bool enable)
  718. {
  719. u32 pmcr = FORCE_MODE_LNK;
  720. if (enable)
  721. pmcr = priv->mt753x_pmcr;
  722. mt753x_reg_write(priv, PMCR_REG(5), pmcr);
  723. mt753x_reg_write(priv, PMCR_REG(6), pmcr);
  724. }
  725. static int mt7531_setup(struct mtk_eth_priv *priv)
  726. {
  727. u16 phy_addr, phy_val;
  728. u32 val;
  729. u32 pmcr;
  730. u32 port5_sgmii;
  731. int i;
  732. priv->mt753x_phy_base = (priv->mt753x_smi_addr + 1) &
  733. MT753X_SMI_ADDR_MASK;
  734. /* Turn off PHYs */
  735. for (i = 0; i < MT753X_NUM_PHYS; i++) {
  736. phy_addr = MT753X_PHY_ADDR(priv->mt753x_phy_base, i);
  737. phy_val = priv->mii_read(priv, phy_addr, MII_BMCR);
  738. phy_val |= BMCR_PDOWN;
  739. priv->mii_write(priv, phy_addr, MII_BMCR, phy_val);
  740. }
  741. /* Force MAC link down before reset */
  742. mt753x_reg_write(priv, PMCR_REG(5), FORCE_MODE_LNK);
  743. mt753x_reg_write(priv, PMCR_REG(6), FORCE_MODE_LNK);
  744. /* Switch soft reset */
  745. mt753x_reg_write(priv, SYS_CTRL_REG, SW_SYS_RST | SW_REG_RST);
  746. udelay(100);
  747. /* Enable MDC input Schmitt Trigger */
  748. mt753x_reg_rmw(priv, MT7531_SMT0_IOLB, SMT_IOLB_5_SMI_MDC_EN,
  749. SMT_IOLB_5_SMI_MDC_EN);
  750. mt7531_core_pll_setup(priv, priv->mcm);
  751. mt753x_reg_read(priv, MT7531_TOP_SIG_SR, &val);
  752. port5_sgmii = !!(val & PAD_DUAL_SGMII_EN);
  753. /* port5 support either RGMII or SGMII, port6 only support SGMII. */
  754. switch (priv->phy_interface) {
  755. case PHY_INTERFACE_MODE_RGMII:
  756. if (!port5_sgmii)
  757. mt7531_port_rgmii_init(priv, 5);
  758. break;
  759. case PHY_INTERFACE_MODE_2500BASEX:
  760. mt7531_port_sgmii_init(priv, 6);
  761. if (port5_sgmii)
  762. mt7531_port_sgmii_init(priv, 5);
  763. break;
  764. default:
  765. break;
  766. }
  767. pmcr = MT7531_FORCE_MODE |
  768. (IPG_96BIT_WITH_SHORT_IPG << IPG_CFG_S) |
  769. MAC_MODE | MAC_TX_EN | MAC_RX_EN |
  770. BKOFF_EN | BACKPR_EN |
  771. FORCE_RX_FC | FORCE_TX_FC |
  772. (SPEED_1000M << FORCE_SPD_S) | FORCE_DPX |
  773. FORCE_LINK;
  774. priv->mt753x_pmcr = pmcr;
  775. /* Keep MAC link down before starting eth */
  776. mt753x_reg_write(priv, PMCR_REG(5), FORCE_MODE_LNK);
  777. mt753x_reg_write(priv, PMCR_REG(6), FORCE_MODE_LNK);
  778. /* Turn on PHYs */
  779. for (i = 0; i < MT753X_NUM_PHYS; i++) {
  780. phy_addr = MT753X_PHY_ADDR(priv->mt753x_phy_base, i);
  781. phy_val = priv->mii_read(priv, phy_addr, MII_BMCR);
  782. phy_val &= ~BMCR_PDOWN;
  783. priv->mii_write(priv, phy_addr, MII_BMCR, phy_val);
  784. }
  785. mt7531_phy_setting(priv);
  786. /* Enable Internal PHYs */
  787. val = mt753x_core_reg_read(priv, CORE_PLL_GROUP4);
  788. val |= MT7531_BYPASS_MODE;
  789. val &= ~MT7531_POWER_ON_OFF;
  790. mt753x_core_reg_write(priv, CORE_PLL_GROUP4, val);
  791. return 0;
  792. }
  793. static void mt7988_phy_setting(struct mtk_eth_priv *priv)
  794. {
  795. u16 val;
  796. u32 i;
  797. for (i = 0; i < MT753X_NUM_PHYS; i++) {
  798. /* Enable HW auto downshift */
  799. priv->mii_write(priv, i, 0x1f, 0x1);
  800. val = priv->mii_read(priv, i, PHY_EXT_REG_14);
  801. val |= PHY_EN_DOWN_SHFIT;
  802. priv->mii_write(priv, i, PHY_EXT_REG_14, val);
  803. /* PHY link down power saving enable */
  804. val = priv->mii_read(priv, i, PHY_EXT_REG_17);
  805. val |= PHY_LINKDOWN_POWER_SAVING_EN;
  806. priv->mii_write(priv, i, PHY_EXT_REG_17, val);
  807. }
  808. }
  809. static void mt7988_mac_control(struct mtk_eth_priv *priv, bool enable)
  810. {
  811. u32 pmcr = FORCE_MODE_LNK;
  812. if (enable)
  813. pmcr = priv->mt753x_pmcr;
  814. mt753x_reg_write(priv, PMCR_REG(6), pmcr);
  815. }
  816. static int mt7988_setup(struct mtk_eth_priv *priv)
  817. {
  818. u16 phy_addr, phy_val;
  819. u32 pmcr;
  820. int i;
  821. priv->gsw_base = regmap_get_range(priv->ethsys_regmap, 0) + GSW_BASE;
  822. priv->mt753x_phy_base = (priv->mt753x_smi_addr + 1) &
  823. MT753X_SMI_ADDR_MASK;
  824. /* Turn off PHYs */
  825. for (i = 0; i < MT753X_NUM_PHYS; i++) {
  826. phy_addr = MT753X_PHY_ADDR(priv->mt753x_phy_base, i);
  827. phy_val = priv->mii_read(priv, phy_addr, MII_BMCR);
  828. phy_val |= BMCR_PDOWN;
  829. priv->mii_write(priv, phy_addr, MII_BMCR, phy_val);
  830. }
  831. switch (priv->phy_interface) {
  832. case PHY_INTERFACE_MODE_USXGMII:
  833. /* Use CPU bridge instead of actual USXGMII path */
  834. /* Set GDM1 no drop */
  835. mtk_fe_rmw(priv, PSE_NO_DROP_CFG_REG, 0, PSE_NO_DROP_GDM1);
  836. /* Enable GDM1 to GSW CPU bridge */
  837. mtk_gmac_rmw(priv, GMAC_MAC_MISC_REG, 0, BIT(0));
  838. /* XGMAC force link up */
  839. mtk_gmac_rmw(priv, GMAC_XGMAC_STS_REG, 0, P1_XGMAC_FORCE_LINK);
  840. /* Setup GSW CPU bridge IPG */
  841. mtk_gmac_rmw(priv, GMAC_GSW_CFG_REG, GSWTX_IPG_M | GSWRX_IPG_M,
  842. (0xB << GSWTX_IPG_S) | (0xB << GSWRX_IPG_S));
  843. break;
  844. default:
  845. printf("Error: MT7988 GSW does not support %s interface\n",
  846. phy_string_for_interface(priv->phy_interface));
  847. break;
  848. }
  849. pmcr = MT7988_FORCE_MODE |
  850. (IPG_96BIT_WITH_SHORT_IPG << IPG_CFG_S) |
  851. MAC_MODE | MAC_TX_EN | MAC_RX_EN |
  852. BKOFF_EN | BACKPR_EN |
  853. FORCE_RX_FC | FORCE_TX_FC |
  854. (SPEED_1000M << FORCE_SPD_S) | FORCE_DPX |
  855. FORCE_LINK;
  856. priv->mt753x_pmcr = pmcr;
  857. /* Keep MAC link down before starting eth */
  858. mt753x_reg_write(priv, PMCR_REG(6), FORCE_MODE_LNK);
  859. /* Turn on PHYs */
  860. for (i = 0; i < MT753X_NUM_PHYS; i++) {
  861. phy_addr = MT753X_PHY_ADDR(priv->mt753x_phy_base, i);
  862. phy_val = priv->mii_read(priv, phy_addr, MII_BMCR);
  863. phy_val &= ~BMCR_PDOWN;
  864. priv->mii_write(priv, phy_addr, MII_BMCR, phy_val);
  865. }
  866. mt7988_phy_setting(priv);
  867. return 0;
  868. }
  869. static int mt753x_switch_init(struct mtk_eth_priv *priv)
  870. {
  871. int ret;
  872. int i;
  873. /* Global reset switch */
  874. if (priv->mcm) {
  875. reset_assert(&priv->rst_mcm);
  876. udelay(1000);
  877. reset_deassert(&priv->rst_mcm);
  878. mdelay(priv->mt753x_reset_wait_time);
  879. } else if (dm_gpio_is_valid(&priv->rst_gpio)) {
  880. dm_gpio_set_value(&priv->rst_gpio, 0);
  881. udelay(1000);
  882. dm_gpio_set_value(&priv->rst_gpio, 1);
  883. mdelay(priv->mt753x_reset_wait_time);
  884. }
  885. ret = priv->switch_init(priv);
  886. if (ret)
  887. return ret;
  888. /* Set port isolation */
  889. for (i = 0; i < MT753X_NUM_PORTS; i++) {
  890. /* Set port matrix mode */
  891. if (i != 6)
  892. mt753x_reg_write(priv, PCR_REG(i),
  893. (0x40 << PORT_MATRIX_S));
  894. else
  895. mt753x_reg_write(priv, PCR_REG(i),
  896. (0x3f << PORT_MATRIX_S));
  897. /* Set port mode to user port */
  898. mt753x_reg_write(priv, PVC_REG(i),
  899. (0x8100 << STAG_VPID_S) |
  900. (VLAN_ATTR_USER << VLAN_ATTR_S));
  901. }
  902. return 0;
  903. }
  904. static void mtk_xphy_link_adjust(struct mtk_eth_priv *priv)
  905. {
  906. u16 lcl_adv = 0, rmt_adv = 0;
  907. u8 flowctrl;
  908. u32 mcr;
  909. mcr = mtk_gmac_read(priv, XGMAC_PORT_MCR(priv->gmac_id));
  910. mcr &= ~(XGMAC_FORCE_TX_FC | XGMAC_FORCE_RX_FC);
  911. if (priv->phydev->duplex) {
  912. if (priv->phydev->pause)
  913. rmt_adv = LPA_PAUSE_CAP;
  914. if (priv->phydev->asym_pause)
  915. rmt_adv |= LPA_PAUSE_ASYM;
  916. if (priv->phydev->advertising & ADVERTISED_Pause)
  917. lcl_adv |= ADVERTISE_PAUSE_CAP;
  918. if (priv->phydev->advertising & ADVERTISED_Asym_Pause)
  919. lcl_adv |= ADVERTISE_PAUSE_ASYM;
  920. flowctrl = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv);
  921. if (flowctrl & FLOW_CTRL_TX)
  922. mcr |= XGMAC_FORCE_TX_FC;
  923. if (flowctrl & FLOW_CTRL_RX)
  924. mcr |= XGMAC_FORCE_RX_FC;
  925. debug("rx pause %s, tx pause %s\n",
  926. flowctrl & FLOW_CTRL_RX ? "enabled" : "disabled",
  927. flowctrl & FLOW_CTRL_TX ? "enabled" : "disabled");
  928. }
  929. mcr &= ~(XGMAC_TRX_DISABLE);
  930. mtk_gmac_write(priv, XGMAC_PORT_MCR(priv->gmac_id), mcr);
  931. }
  932. static void mtk_phy_link_adjust(struct mtk_eth_priv *priv)
  933. {
  934. u16 lcl_adv = 0, rmt_adv = 0;
  935. u8 flowctrl;
  936. u32 mcr;
  937. mcr = (IPG_96BIT_WITH_SHORT_IPG << IPG_CFG_S) |
  938. (MAC_RX_PKT_LEN_1536 << MAC_RX_PKT_LEN_S) |
  939. MAC_MODE | FORCE_MODE |
  940. MAC_TX_EN | MAC_RX_EN |
  941. DEL_RXFIFO_CLR |
  942. BKOFF_EN | BACKPR_EN;
  943. switch (priv->phydev->speed) {
  944. case SPEED_10:
  945. mcr |= (SPEED_10M << FORCE_SPD_S);
  946. break;
  947. case SPEED_100:
  948. mcr |= (SPEED_100M << FORCE_SPD_S);
  949. break;
  950. case SPEED_1000:
  951. case SPEED_2500:
  952. mcr |= (SPEED_1000M << FORCE_SPD_S);
  953. break;
  954. };
  955. if (priv->phydev->link)
  956. mcr |= FORCE_LINK;
  957. if (priv->phydev->duplex) {
  958. mcr |= FORCE_DPX;
  959. if (priv->phydev->pause)
  960. rmt_adv = LPA_PAUSE_CAP;
  961. if (priv->phydev->asym_pause)
  962. rmt_adv |= LPA_PAUSE_ASYM;
  963. if (priv->phydev->advertising & ADVERTISED_Pause)
  964. lcl_adv |= ADVERTISE_PAUSE_CAP;
  965. if (priv->phydev->advertising & ADVERTISED_Asym_Pause)
  966. lcl_adv |= ADVERTISE_PAUSE_ASYM;
  967. flowctrl = mii_resolve_flowctrl_fdx(lcl_adv, rmt_adv);
  968. if (flowctrl & FLOW_CTRL_TX)
  969. mcr |= FORCE_TX_FC;
  970. if (flowctrl & FLOW_CTRL_RX)
  971. mcr |= FORCE_RX_FC;
  972. debug("rx pause %s, tx pause %s\n",
  973. flowctrl & FLOW_CTRL_RX ? "enabled" : "disabled",
  974. flowctrl & FLOW_CTRL_TX ? "enabled" : "disabled");
  975. }
  976. mtk_gmac_write(priv, GMAC_PORT_MCR(priv->gmac_id), mcr);
  977. }
  978. static int mtk_phy_start(struct mtk_eth_priv *priv)
  979. {
  980. struct phy_device *phydev = priv->phydev;
  981. int ret;
  982. ret = phy_startup(phydev);
  983. if (ret) {
  984. debug("Could not initialize PHY %s\n", phydev->dev->name);
  985. return ret;
  986. }
  987. if (!phydev->link) {
  988. debug("%s: link down.\n", phydev->dev->name);
  989. return 0;
  990. }
  991. if (!priv->force_mode) {
  992. if (priv->phy_interface == PHY_INTERFACE_MODE_USXGMII)
  993. mtk_xphy_link_adjust(priv);
  994. else
  995. mtk_phy_link_adjust(priv);
  996. }
  997. debug("Speed: %d, %s duplex%s\n", phydev->speed,
  998. (phydev->duplex) ? "full" : "half",
  999. (phydev->port == PORT_FIBRE) ? ", fiber mode" : "");
  1000. return 0;
  1001. }
  1002. static int mtk_phy_probe(struct udevice *dev)
  1003. {
  1004. struct mtk_eth_priv *priv = dev_get_priv(dev);
  1005. struct phy_device *phydev;
  1006. phydev = phy_connect(priv->mdio_bus, priv->phy_addr, dev,
  1007. priv->phy_interface);
  1008. if (!phydev)
  1009. return -ENODEV;
  1010. phydev->supported &= PHY_GBIT_FEATURES;
  1011. phydev->advertising = phydev->supported;
  1012. priv->phydev = phydev;
  1013. phy_config(phydev);
  1014. return 0;
  1015. }
  1016. static void mtk_sgmii_an_init(struct mtk_eth_priv *priv)
  1017. {
  1018. /* Set SGMII GEN1 speed(1G) */
  1019. clrsetbits_le32(priv->sgmii_base + priv->soc->ana_rgc3,
  1020. SGMSYS_SPEED_2500, 0);
  1021. /* Enable SGMII AN */
  1022. setbits_le32(priv->sgmii_base + SGMSYS_PCS_CONTROL_1,
  1023. SGMII_AN_ENABLE);
  1024. /* SGMII AN mode setting */
  1025. writel(SGMII_AN_MODE, priv->sgmii_base + SGMSYS_SGMII_MODE);
  1026. /* SGMII PN SWAP setting */
  1027. if (priv->pn_swap) {
  1028. setbits_le32(priv->sgmii_base + SGMSYS_QPHY_WRAP_CTRL,
  1029. SGMII_PN_SWAP_TX_RX);
  1030. }
  1031. /* Release PHYA power down state */
  1032. clrsetbits_le32(priv->sgmii_base + SGMSYS_QPHY_PWR_STATE_CTRL,
  1033. SGMII_PHYA_PWD, 0);
  1034. }
  1035. static void mtk_sgmii_force_init(struct mtk_eth_priv *priv)
  1036. {
  1037. /* Set SGMII GEN2 speed(2.5G) */
  1038. setbits_le32(priv->sgmii_base + priv->soc->ana_rgc3,
  1039. SGMSYS_SPEED_2500);
  1040. /* Disable SGMII AN */
  1041. clrsetbits_le32(priv->sgmii_base + SGMSYS_PCS_CONTROL_1,
  1042. SGMII_AN_ENABLE, 0);
  1043. /* SGMII force mode setting */
  1044. writel(SGMII_FORCE_MODE, priv->sgmii_base + SGMSYS_SGMII_MODE);
  1045. /* SGMII PN SWAP setting */
  1046. if (priv->pn_swap) {
  1047. setbits_le32(priv->sgmii_base + SGMSYS_QPHY_WRAP_CTRL,
  1048. SGMII_PN_SWAP_TX_RX);
  1049. }
  1050. /* Release PHYA power down state */
  1051. clrsetbits_le32(priv->sgmii_base + SGMSYS_QPHY_PWR_STATE_CTRL,
  1052. SGMII_PHYA_PWD, 0);
  1053. }
  1054. static void mtk_xfi_pll_enable(struct mtk_eth_priv *priv)
  1055. {
  1056. u32 val = 0;
  1057. /* Add software workaround for USXGMII PLL TCL issue */
  1058. regmap_write(priv->xfi_pll_regmap, XFI_PLL_ANA_GLB8,
  1059. RG_XFI_PLL_ANA_SWWA);
  1060. regmap_read(priv->xfi_pll_regmap, XFI_PLL_DIG_GLB8, &val);
  1061. val |= RG_XFI_PLL_EN;
  1062. regmap_write(priv->xfi_pll_regmap, XFI_PLL_DIG_GLB8, val);
  1063. }
  1064. static void mtk_usxgmii_reset(struct mtk_eth_priv *priv)
  1065. {
  1066. switch (priv->gmac_id) {
  1067. case 1:
  1068. regmap_write(priv->toprgu_regmap, 0xFC, 0x0000A004);
  1069. regmap_write(priv->toprgu_regmap, 0x18, 0x88F0A004);
  1070. regmap_write(priv->toprgu_regmap, 0xFC, 0x00000000);
  1071. regmap_write(priv->toprgu_regmap, 0x18, 0x88F00000);
  1072. regmap_write(priv->toprgu_regmap, 0x18, 0x00F00000);
  1073. break;
  1074. case 2:
  1075. regmap_write(priv->toprgu_regmap, 0xFC, 0x00005002);
  1076. regmap_write(priv->toprgu_regmap, 0x18, 0x88F05002);
  1077. regmap_write(priv->toprgu_regmap, 0xFC, 0x00000000);
  1078. regmap_write(priv->toprgu_regmap, 0x18, 0x88F00000);
  1079. regmap_write(priv->toprgu_regmap, 0x18, 0x00F00000);
  1080. break;
  1081. }
  1082. mdelay(10);
  1083. }
  1084. static void mtk_usxgmii_setup_phya_an_10000(struct mtk_eth_priv *priv)
  1085. {
  1086. regmap_write(priv->usxgmii_regmap, 0x810, 0x000FFE6D);
  1087. regmap_write(priv->usxgmii_regmap, 0x818, 0x07B1EC7B);
  1088. regmap_write(priv->usxgmii_regmap, 0x80C, 0x30000000);
  1089. ndelay(1020);
  1090. regmap_write(priv->usxgmii_regmap, 0x80C, 0x10000000);
  1091. ndelay(1020);
  1092. regmap_write(priv->usxgmii_regmap, 0x80C, 0x00000000);
  1093. regmap_write(priv->xfi_pextp_regmap, 0x9024, 0x00C9071C);
  1094. regmap_write(priv->xfi_pextp_regmap, 0x2020, 0xAA8585AA);
  1095. regmap_write(priv->xfi_pextp_regmap, 0x2030, 0x0C020707);
  1096. regmap_write(priv->xfi_pextp_regmap, 0x2034, 0x0E050F0F);
  1097. regmap_write(priv->xfi_pextp_regmap, 0x2040, 0x00140032);
  1098. regmap_write(priv->xfi_pextp_regmap, 0x50F0, 0x00C014AA);
  1099. regmap_write(priv->xfi_pextp_regmap, 0x50E0, 0x3777C12B);
  1100. regmap_write(priv->xfi_pextp_regmap, 0x506C, 0x005F9CFF);
  1101. regmap_write(priv->xfi_pextp_regmap, 0x5070, 0x9D9DFAFA);
  1102. regmap_write(priv->xfi_pextp_regmap, 0x5074, 0x27273F3F);
  1103. regmap_write(priv->xfi_pextp_regmap, 0x5078, 0xA7883C68);
  1104. regmap_write(priv->xfi_pextp_regmap, 0x507C, 0x11661166);
  1105. regmap_write(priv->xfi_pextp_regmap, 0x5080, 0x0E000AAF);
  1106. regmap_write(priv->xfi_pextp_regmap, 0x5084, 0x08080D0D);
  1107. regmap_write(priv->xfi_pextp_regmap, 0x5088, 0x02030909);
  1108. regmap_write(priv->xfi_pextp_regmap, 0x50E4, 0x0C0C0000);
  1109. regmap_write(priv->xfi_pextp_regmap, 0x50E8, 0x04040000);
  1110. regmap_write(priv->xfi_pextp_regmap, 0x50EC, 0x0F0F0C06);
  1111. regmap_write(priv->xfi_pextp_regmap, 0x50A8, 0x506E8C8C);
  1112. regmap_write(priv->xfi_pextp_regmap, 0x6004, 0x18190000);
  1113. regmap_write(priv->xfi_pextp_regmap, 0x00F8, 0x01423342);
  1114. regmap_write(priv->xfi_pextp_regmap, 0x00F4, 0x80201F20);
  1115. regmap_write(priv->xfi_pextp_regmap, 0x0030, 0x00050C00);
  1116. regmap_write(priv->xfi_pextp_regmap, 0x0070, 0x02002800);
  1117. ndelay(1020);
  1118. regmap_write(priv->xfi_pextp_regmap, 0x30B0, 0x00000020);
  1119. regmap_write(priv->xfi_pextp_regmap, 0x3028, 0x00008A01);
  1120. regmap_write(priv->xfi_pextp_regmap, 0x302C, 0x0000A884);
  1121. regmap_write(priv->xfi_pextp_regmap, 0x3024, 0x00083002);
  1122. regmap_write(priv->xfi_pextp_regmap, 0x3010, 0x00022220);
  1123. regmap_write(priv->xfi_pextp_regmap, 0x5064, 0x0F020A01);
  1124. regmap_write(priv->xfi_pextp_regmap, 0x50B4, 0x06100600);
  1125. regmap_write(priv->xfi_pextp_regmap, 0x3048, 0x40704000);
  1126. regmap_write(priv->xfi_pextp_regmap, 0x3050, 0xA8000000);
  1127. regmap_write(priv->xfi_pextp_regmap, 0x3054, 0x000000AA);
  1128. regmap_write(priv->xfi_pextp_regmap, 0x306C, 0x00000F00);
  1129. regmap_write(priv->xfi_pextp_regmap, 0xA060, 0x00040000);
  1130. regmap_write(priv->xfi_pextp_regmap, 0x90D0, 0x00000001);
  1131. regmap_write(priv->xfi_pextp_regmap, 0x0070, 0x0200E800);
  1132. udelay(150);
  1133. regmap_write(priv->xfi_pextp_regmap, 0x0070, 0x0200C111);
  1134. ndelay(1020);
  1135. regmap_write(priv->xfi_pextp_regmap, 0x0070, 0x0200C101);
  1136. udelay(15);
  1137. regmap_write(priv->xfi_pextp_regmap, 0x0070, 0x0202C111);
  1138. ndelay(1020);
  1139. regmap_write(priv->xfi_pextp_regmap, 0x0070, 0x0202C101);
  1140. udelay(100);
  1141. regmap_write(priv->xfi_pextp_regmap, 0x30B0, 0x00000030);
  1142. regmap_write(priv->xfi_pextp_regmap, 0x00F4, 0x80201F00);
  1143. regmap_write(priv->xfi_pextp_regmap, 0x3040, 0x30000000);
  1144. udelay(400);
  1145. }
  1146. static void mtk_usxgmii_an_init(struct mtk_eth_priv *priv)
  1147. {
  1148. mtk_xfi_pll_enable(priv);
  1149. mtk_usxgmii_reset(priv);
  1150. mtk_usxgmii_setup_phya_an_10000(priv);
  1151. }
  1152. static void mtk_mac_init(struct mtk_eth_priv *priv)
  1153. {
  1154. int i, ge_mode = 0;
  1155. u32 mcr;
  1156. switch (priv->phy_interface) {
  1157. case PHY_INTERFACE_MODE_RGMII_RXID:
  1158. case PHY_INTERFACE_MODE_RGMII:
  1159. ge_mode = GE_MODE_RGMII;
  1160. break;
  1161. case PHY_INTERFACE_MODE_SGMII:
  1162. case PHY_INTERFACE_MODE_2500BASEX:
  1163. if (MTK_HAS_CAPS(priv->soc->caps, MTK_GMAC2_U3_QPHY)) {
  1164. mtk_infra_rmw(priv, USB_PHY_SWITCH_REG, QPHY_SEL_MASK,
  1165. SGMII_QPHY_SEL);
  1166. }
  1167. ge_mode = GE_MODE_RGMII;
  1168. mtk_ethsys_rmw(priv, ETHSYS_SYSCFG0_REG, SYSCFG0_SGMII_SEL_M,
  1169. SYSCFG0_SGMII_SEL(priv->gmac_id));
  1170. if (priv->phy_interface == PHY_INTERFACE_MODE_SGMII)
  1171. mtk_sgmii_an_init(priv);
  1172. else
  1173. mtk_sgmii_force_init(priv);
  1174. break;
  1175. case PHY_INTERFACE_MODE_MII:
  1176. case PHY_INTERFACE_MODE_GMII:
  1177. ge_mode = GE_MODE_MII;
  1178. break;
  1179. case PHY_INTERFACE_MODE_RMII:
  1180. ge_mode = GE_MODE_RMII;
  1181. break;
  1182. default:
  1183. break;
  1184. }
  1185. /* set the gmac to the right mode */
  1186. mtk_ethsys_rmw(priv, ETHSYS_SYSCFG0_REG,
  1187. SYSCFG0_GE_MODE_M << SYSCFG0_GE_MODE_S(priv->gmac_id),
  1188. ge_mode << SYSCFG0_GE_MODE_S(priv->gmac_id));
  1189. if (priv->force_mode) {
  1190. mcr = (IPG_96BIT_WITH_SHORT_IPG << IPG_CFG_S) |
  1191. (MAC_RX_PKT_LEN_1536 << MAC_RX_PKT_LEN_S) |
  1192. MAC_MODE | FORCE_MODE |
  1193. MAC_TX_EN | MAC_RX_EN |
  1194. BKOFF_EN | BACKPR_EN |
  1195. FORCE_LINK;
  1196. switch (priv->speed) {
  1197. case SPEED_10:
  1198. mcr |= SPEED_10M << FORCE_SPD_S;
  1199. break;
  1200. case SPEED_100:
  1201. mcr |= SPEED_100M << FORCE_SPD_S;
  1202. break;
  1203. case SPEED_1000:
  1204. case SPEED_2500:
  1205. mcr |= SPEED_1000M << FORCE_SPD_S;
  1206. break;
  1207. }
  1208. if (priv->duplex)
  1209. mcr |= FORCE_DPX;
  1210. mtk_gmac_write(priv, GMAC_PORT_MCR(priv->gmac_id), mcr);
  1211. }
  1212. if (MTK_HAS_CAPS(priv->soc->caps, MTK_GMAC1_TRGMII) &&
  1213. !MTK_HAS_CAPS(priv->soc->caps, MTK_TRGMII_MT7621_CLK)) {
  1214. /* Lower Tx Driving for TRGMII path */
  1215. for (i = 0 ; i < NUM_TRGMII_CTRL; i++)
  1216. mtk_gmac_write(priv, GMAC_TRGMII_TD_ODT(i),
  1217. (8 << TD_DM_DRVP_S) |
  1218. (8 << TD_DM_DRVN_S));
  1219. mtk_gmac_rmw(priv, GMAC_TRGMII_RCK_CTRL, 0,
  1220. RX_RST | RXC_DQSISEL);
  1221. mtk_gmac_rmw(priv, GMAC_TRGMII_RCK_CTRL, RX_RST, 0);
  1222. }
  1223. }
  1224. static void mtk_xmac_init(struct mtk_eth_priv *priv)
  1225. {
  1226. u32 sts;
  1227. switch (priv->phy_interface) {
  1228. case PHY_INTERFACE_MODE_USXGMII:
  1229. mtk_usxgmii_an_init(priv);
  1230. break;
  1231. default:
  1232. break;
  1233. }
  1234. /* Set GMAC to the correct mode */
  1235. mtk_ethsys_rmw(priv, ETHSYS_SYSCFG0_REG,
  1236. SYSCFG0_GE_MODE_M << SYSCFG0_GE_MODE_S(priv->gmac_id),
  1237. 0);
  1238. if (priv->gmac_id == 1) {
  1239. mtk_infra_rmw(priv, TOPMISC_NETSYS_PCS_MUX,
  1240. NETSYS_PCS_MUX_MASK, MUX_G2_USXGMII_SEL);
  1241. } else if (priv->gmac_id == 2) {
  1242. sts = mtk_gmac_read(priv, XGMAC_STS(priv->gmac_id));
  1243. sts |= XGMAC_FORCE_LINK;
  1244. mtk_gmac_write(priv, XGMAC_STS(priv->gmac_id), sts);
  1245. }
  1246. /* Force GMAC link down */
  1247. mtk_gmac_write(priv, GMAC_PORT_MCR(priv->gmac_id), FORCE_MODE);
  1248. }
  1249. static void mtk_eth_fifo_init(struct mtk_eth_priv *priv)
  1250. {
  1251. char *pkt_base = priv->pkt_pool;
  1252. struct mtk_tx_dma_v2 *txd;
  1253. struct mtk_rx_dma_v2 *rxd;
  1254. int i;
  1255. mtk_pdma_rmw(priv, PDMA_GLO_CFG_REG, 0xffff0000, 0);
  1256. udelay(500);
  1257. memset(priv->tx_ring_noc, 0, NUM_TX_DESC * priv->soc->txd_size);
  1258. memset(priv->rx_ring_noc, 0, NUM_RX_DESC * priv->soc->rxd_size);
  1259. memset(priv->pkt_pool, 0xff, TOTAL_PKT_BUF_SIZE);
  1260. flush_dcache_range((ulong)pkt_base,
  1261. (ulong)(pkt_base + TOTAL_PKT_BUF_SIZE));
  1262. priv->rx_dma_owner_idx0 = 0;
  1263. priv->tx_cpu_owner_idx0 = 0;
  1264. for (i = 0; i < NUM_TX_DESC; i++) {
  1265. txd = priv->tx_ring_noc + i * priv->soc->txd_size;
  1266. txd->txd1 = virt_to_phys(pkt_base);
  1267. txd->txd2 = PDMA_TXD2_DDONE | PDMA_TXD2_LS0;
  1268. if (MTK_HAS_CAPS(priv->soc->caps, MTK_NETSYS_V3))
  1269. txd->txd5 = PDMA_V2_TXD5_FPORT_SET(priv->gmac_id == 2 ?
  1270. 15 : priv->gmac_id + 1);
  1271. else if (MTK_HAS_CAPS(priv->soc->caps, MTK_NETSYS_V2))
  1272. txd->txd5 = PDMA_V2_TXD5_FPORT_SET(priv->gmac_id + 1);
  1273. else
  1274. txd->txd4 = PDMA_V1_TXD4_FPORT_SET(priv->gmac_id + 1);
  1275. pkt_base += PKTSIZE_ALIGN;
  1276. }
  1277. for (i = 0; i < NUM_RX_DESC; i++) {
  1278. rxd = priv->rx_ring_noc + i * priv->soc->rxd_size;
  1279. rxd->rxd1 = virt_to_phys(pkt_base);
  1280. if (MTK_HAS_CAPS(priv->soc->caps, MTK_NETSYS_V2) ||
  1281. MTK_HAS_CAPS(priv->soc->caps, MTK_NETSYS_V3))
  1282. rxd->rxd2 = PDMA_V2_RXD2_PLEN0_SET(PKTSIZE_ALIGN);
  1283. else
  1284. rxd->rxd2 = PDMA_V1_RXD2_PLEN0_SET(PKTSIZE_ALIGN);
  1285. pkt_base += PKTSIZE_ALIGN;
  1286. }
  1287. mtk_pdma_write(priv, TX_BASE_PTR_REG(0),
  1288. virt_to_phys(priv->tx_ring_noc));
  1289. mtk_pdma_write(priv, TX_MAX_CNT_REG(0), NUM_TX_DESC);
  1290. mtk_pdma_write(priv, TX_CTX_IDX_REG(0), priv->tx_cpu_owner_idx0);
  1291. mtk_pdma_write(priv, RX_BASE_PTR_REG(0),
  1292. virt_to_phys(priv->rx_ring_noc));
  1293. mtk_pdma_write(priv, RX_MAX_CNT_REG(0), NUM_RX_DESC);
  1294. mtk_pdma_write(priv, RX_CRX_IDX_REG(0), NUM_RX_DESC - 1);
  1295. mtk_pdma_write(priv, PDMA_RST_IDX_REG, RST_DTX_IDX0 | RST_DRX_IDX0);
  1296. }
  1297. static int mtk_eth_start(struct udevice *dev)
  1298. {
  1299. struct mtk_eth_priv *priv = dev_get_priv(dev);
  1300. int i, ret;
  1301. /* Reset FE */
  1302. reset_assert(&priv->rst_fe);
  1303. udelay(1000);
  1304. reset_deassert(&priv->rst_fe);
  1305. mdelay(10);
  1306. if (MTK_HAS_CAPS(priv->soc->caps, MTK_NETSYS_V2) ||
  1307. MTK_HAS_CAPS(priv->soc->caps, MTK_NETSYS_V3))
  1308. setbits_le32(priv->fe_base + FE_GLO_MISC_REG, PDMA_VER_V2);
  1309. /* Packets forward to PDMA */
  1310. mtk_gdma_write(priv, priv->gmac_id, GDMA_IG_CTRL_REG, GDMA_FWD_TO_CPU);
  1311. for (i = 0; i < priv->soc->gdma_count; i++) {
  1312. if (i == priv->gmac_id)
  1313. continue;
  1314. mtk_gdma_write(priv, i, GDMA_IG_CTRL_REG, GDMA_FWD_DISCARD);
  1315. }
  1316. if (MTK_HAS_CAPS(priv->soc->caps, MTK_NETSYS_V3)) {
  1317. if (priv->sw == SW_MT7988 && priv->gmac_id == 0) {
  1318. mtk_gdma_write(priv, priv->gmac_id, GDMA_IG_CTRL_REG,
  1319. GDMA_BRIDGE_TO_CPU);
  1320. }
  1321. mtk_gdma_write(priv, priv->gmac_id, GDMA_EG_CTRL_REG,
  1322. GDMA_CPU_BRIDGE_EN);
  1323. }
  1324. udelay(500);
  1325. mtk_eth_fifo_init(priv);
  1326. if (priv->switch_mac_control)
  1327. priv->switch_mac_control(priv, true);
  1328. /* Start PHY */
  1329. if (priv->sw == SW_NONE) {
  1330. ret = mtk_phy_start(priv);
  1331. if (ret)
  1332. return ret;
  1333. }
  1334. mtk_pdma_rmw(priv, PDMA_GLO_CFG_REG, 0,
  1335. TX_WB_DDONE | RX_DMA_EN | TX_DMA_EN);
  1336. udelay(500);
  1337. return 0;
  1338. }
  1339. static void mtk_eth_stop(struct udevice *dev)
  1340. {
  1341. struct mtk_eth_priv *priv = dev_get_priv(dev);
  1342. if (priv->switch_mac_control)
  1343. priv->switch_mac_control(priv, false);
  1344. mtk_pdma_rmw(priv, PDMA_GLO_CFG_REG,
  1345. TX_WB_DDONE | RX_DMA_EN | TX_DMA_EN, 0);
  1346. udelay(500);
  1347. wait_for_bit_le32(priv->fe_base + priv->soc->pdma_base + PDMA_GLO_CFG_REG,
  1348. RX_DMA_BUSY | TX_DMA_BUSY, 0, 5000, 0);
  1349. }
  1350. static int mtk_eth_write_hwaddr(struct udevice *dev)
  1351. {
  1352. struct eth_pdata *pdata = dev_get_plat(dev);
  1353. struct mtk_eth_priv *priv = dev_get_priv(dev);
  1354. unsigned char *mac = pdata->enetaddr;
  1355. u32 macaddr_lsb, macaddr_msb;
  1356. macaddr_msb = ((u32)mac[0] << 8) | (u32)mac[1];
  1357. macaddr_lsb = ((u32)mac[2] << 24) | ((u32)mac[3] << 16) |
  1358. ((u32)mac[4] << 8) | (u32)mac[5];
  1359. mtk_gdma_write(priv, priv->gmac_id, GDMA_MAC_MSB_REG, macaddr_msb);
  1360. mtk_gdma_write(priv, priv->gmac_id, GDMA_MAC_LSB_REG, macaddr_lsb);
  1361. return 0;
  1362. }
  1363. static int mtk_eth_send(struct udevice *dev, void *packet, int length)
  1364. {
  1365. struct mtk_eth_priv *priv = dev_get_priv(dev);
  1366. u32 idx = priv->tx_cpu_owner_idx0;
  1367. struct mtk_tx_dma_v2 *txd;
  1368. void *pkt_base;
  1369. txd = priv->tx_ring_noc + idx * priv->soc->txd_size;
  1370. if (!(txd->txd2 & PDMA_TXD2_DDONE)) {
  1371. debug("mtk-eth: TX DMA descriptor ring is full\n");
  1372. return -EPERM;
  1373. }
  1374. pkt_base = (void *)phys_to_virt(txd->txd1);
  1375. memcpy(pkt_base, packet, length);
  1376. flush_dcache_range((ulong)pkt_base, (ulong)pkt_base +
  1377. roundup(length, ARCH_DMA_MINALIGN));
  1378. if (MTK_HAS_CAPS(priv->soc->caps, MTK_NETSYS_V2) ||
  1379. MTK_HAS_CAPS(priv->soc->caps, MTK_NETSYS_V3))
  1380. txd->txd2 = PDMA_TXD2_LS0 | PDMA_V2_TXD2_SDL0_SET(length);
  1381. else
  1382. txd->txd2 = PDMA_TXD2_LS0 | PDMA_V1_TXD2_SDL0_SET(length);
  1383. priv->tx_cpu_owner_idx0 = (priv->tx_cpu_owner_idx0 + 1) % NUM_TX_DESC;
  1384. mtk_pdma_write(priv, TX_CTX_IDX_REG(0), priv->tx_cpu_owner_idx0);
  1385. return 0;
  1386. }
  1387. static int mtk_eth_recv(struct udevice *dev, int flags, uchar **packetp)
  1388. {
  1389. struct mtk_eth_priv *priv = dev_get_priv(dev);
  1390. u32 idx = priv->rx_dma_owner_idx0;
  1391. struct mtk_rx_dma_v2 *rxd;
  1392. uchar *pkt_base;
  1393. u32 length;
  1394. rxd = priv->rx_ring_noc + idx * priv->soc->rxd_size;
  1395. if (!(rxd->rxd2 & PDMA_RXD2_DDONE)) {
  1396. debug("mtk-eth: RX DMA descriptor ring is empty\n");
  1397. return -EAGAIN;
  1398. }
  1399. if (MTK_HAS_CAPS(priv->soc->caps, MTK_NETSYS_V2) ||
  1400. MTK_HAS_CAPS(priv->soc->caps, MTK_NETSYS_V3))
  1401. length = PDMA_V2_RXD2_PLEN0_GET(rxd->rxd2);
  1402. else
  1403. length = PDMA_V1_RXD2_PLEN0_GET(rxd->rxd2);
  1404. pkt_base = (void *)phys_to_virt(rxd->rxd1);
  1405. invalidate_dcache_range((ulong)pkt_base, (ulong)pkt_base +
  1406. roundup(length, ARCH_DMA_MINALIGN));
  1407. if (packetp)
  1408. *packetp = pkt_base;
  1409. return length;
  1410. }
  1411. static int mtk_eth_free_pkt(struct udevice *dev, uchar *packet, int length)
  1412. {
  1413. struct mtk_eth_priv *priv = dev_get_priv(dev);
  1414. u32 idx = priv->rx_dma_owner_idx0;
  1415. struct mtk_rx_dma_v2 *rxd;
  1416. rxd = priv->rx_ring_noc + idx * priv->soc->rxd_size;
  1417. if (MTK_HAS_CAPS(priv->soc->caps, MTK_NETSYS_V2) ||
  1418. MTK_HAS_CAPS(priv->soc->caps, MTK_NETSYS_V3))
  1419. rxd->rxd2 = PDMA_V2_RXD2_PLEN0_SET(PKTSIZE_ALIGN);
  1420. else
  1421. rxd->rxd2 = PDMA_V1_RXD2_PLEN0_SET(PKTSIZE_ALIGN);
  1422. mtk_pdma_write(priv, RX_CRX_IDX_REG(0), idx);
  1423. priv->rx_dma_owner_idx0 = (priv->rx_dma_owner_idx0 + 1) % NUM_RX_DESC;
  1424. return 0;
  1425. }
  1426. static int mtk_eth_probe(struct udevice *dev)
  1427. {
  1428. struct eth_pdata *pdata = dev_get_plat(dev);
  1429. struct mtk_eth_priv *priv = dev_get_priv(dev);
  1430. ulong iobase = pdata->iobase;
  1431. int ret;
  1432. /* Frame Engine Register Base */
  1433. priv->fe_base = (void *)iobase;
  1434. /* GMAC Register Base */
  1435. priv->gmac_base = (void *)(iobase + GMAC_BASE);
  1436. /* MDIO register */
  1437. ret = mtk_mdio_register(dev);
  1438. if (ret)
  1439. return ret;
  1440. /* Prepare for tx/rx rings */
  1441. priv->tx_ring_noc = (void *)
  1442. noncached_alloc(priv->soc->txd_size * NUM_TX_DESC,
  1443. ARCH_DMA_MINALIGN);
  1444. priv->rx_ring_noc = (void *)
  1445. noncached_alloc(priv->soc->rxd_size * NUM_RX_DESC,
  1446. ARCH_DMA_MINALIGN);
  1447. /* Set MAC mode */
  1448. if (priv->phy_interface == PHY_INTERFACE_MODE_USXGMII)
  1449. mtk_xmac_init(priv);
  1450. else
  1451. mtk_mac_init(priv);
  1452. /* Probe phy if switch is not specified */
  1453. if (priv->sw == SW_NONE)
  1454. return mtk_phy_probe(dev);
  1455. /* Initialize switch */
  1456. return mt753x_switch_init(priv);
  1457. }
  1458. static int mtk_eth_remove(struct udevice *dev)
  1459. {
  1460. struct mtk_eth_priv *priv = dev_get_priv(dev);
  1461. /* MDIO unregister */
  1462. mdio_unregister(priv->mdio_bus);
  1463. mdio_free(priv->mdio_bus);
  1464. /* Stop possibly started DMA */
  1465. mtk_eth_stop(dev);
  1466. return 0;
  1467. }
  1468. static int mtk_eth_of_to_plat(struct udevice *dev)
  1469. {
  1470. struct eth_pdata *pdata = dev_get_plat(dev);
  1471. struct mtk_eth_priv *priv = dev_get_priv(dev);
  1472. struct ofnode_phandle_args args;
  1473. struct regmap *regmap;
  1474. const char *str;
  1475. ofnode subnode;
  1476. int ret;
  1477. priv->soc = (const struct mtk_soc_data *)dev_get_driver_data(dev);
  1478. if (!priv->soc) {
  1479. dev_err(dev, "missing soc compatible data\n");
  1480. return -EINVAL;
  1481. }
  1482. pdata->iobase = (phys_addr_t)dev_remap_addr(dev);
  1483. /* get corresponding ethsys phandle */
  1484. ret = dev_read_phandle_with_args(dev, "mediatek,ethsys", NULL, 0, 0,
  1485. &args);
  1486. if (ret)
  1487. return ret;
  1488. priv->ethsys_regmap = syscon_node_to_regmap(args.node);
  1489. if (IS_ERR(priv->ethsys_regmap))
  1490. return PTR_ERR(priv->ethsys_regmap);
  1491. if (MTK_HAS_CAPS(priv->soc->caps, MTK_INFRA)) {
  1492. /* get corresponding infracfg phandle */
  1493. ret = dev_read_phandle_with_args(dev, "mediatek,infracfg",
  1494. NULL, 0, 0, &args);
  1495. if (ret)
  1496. return ret;
  1497. priv->infra_regmap = syscon_node_to_regmap(args.node);
  1498. if (IS_ERR(priv->infra_regmap))
  1499. return PTR_ERR(priv->infra_regmap);
  1500. }
  1501. /* Reset controllers */
  1502. ret = reset_get_by_name(dev, "fe", &priv->rst_fe);
  1503. if (ret) {
  1504. printf("error: Unable to get reset ctrl for frame engine\n");
  1505. return ret;
  1506. }
  1507. priv->gmac_id = dev_read_u32_default(dev, "mediatek,gmac-id", 0);
  1508. /* Interface mode is required */
  1509. pdata->phy_interface = dev_read_phy_mode(dev);
  1510. priv->phy_interface = pdata->phy_interface;
  1511. if (pdata->phy_interface == PHY_INTERFACE_MODE_NA) {
  1512. printf("error: phy-mode is not set\n");
  1513. return -EINVAL;
  1514. }
  1515. /* Force mode or autoneg */
  1516. subnode = ofnode_find_subnode(dev_ofnode(dev), "fixed-link");
  1517. if (ofnode_valid(subnode)) {
  1518. priv->force_mode = 1;
  1519. priv->speed = ofnode_read_u32_default(subnode, "speed", 0);
  1520. priv->duplex = ofnode_read_bool(subnode, "full-duplex");
  1521. if (priv->speed != SPEED_10 && priv->speed != SPEED_100 &&
  1522. priv->speed != SPEED_1000 && priv->speed != SPEED_2500 &&
  1523. priv->speed != SPEED_10000) {
  1524. printf("error: no valid speed set in fixed-link\n");
  1525. return -EINVAL;
  1526. }
  1527. }
  1528. if (priv->phy_interface == PHY_INTERFACE_MODE_SGMII ||
  1529. priv->phy_interface == PHY_INTERFACE_MODE_2500BASEX) {
  1530. /* get corresponding sgmii phandle */
  1531. ret = dev_read_phandle_with_args(dev, "mediatek,sgmiisys",
  1532. NULL, 0, 0, &args);
  1533. if (ret)
  1534. return ret;
  1535. regmap = syscon_node_to_regmap(args.node);
  1536. if (IS_ERR(regmap))
  1537. return PTR_ERR(regmap);
  1538. priv->sgmii_base = regmap_get_range(regmap, 0);
  1539. if (!priv->sgmii_base) {
  1540. dev_err(dev, "Unable to find sgmii\n");
  1541. return -ENODEV;
  1542. }
  1543. priv->pn_swap = ofnode_read_bool(args.node, "pn_swap");
  1544. } else if (priv->phy_interface == PHY_INTERFACE_MODE_USXGMII) {
  1545. /* get corresponding usxgmii phandle */
  1546. ret = dev_read_phandle_with_args(dev, "mediatek,usxgmiisys",
  1547. NULL, 0, 0, &args);
  1548. if (ret)
  1549. return ret;
  1550. priv->usxgmii_regmap = syscon_node_to_regmap(args.node);
  1551. if (IS_ERR(priv->usxgmii_regmap))
  1552. return PTR_ERR(priv->usxgmii_regmap);
  1553. /* get corresponding xfi_pextp phandle */
  1554. ret = dev_read_phandle_with_args(dev, "mediatek,xfi_pextp",
  1555. NULL, 0, 0, &args);
  1556. if (ret)
  1557. return ret;
  1558. priv->xfi_pextp_regmap = syscon_node_to_regmap(args.node);
  1559. if (IS_ERR(priv->xfi_pextp_regmap))
  1560. return PTR_ERR(priv->xfi_pextp_regmap);
  1561. /* get corresponding xfi_pll phandle */
  1562. ret = dev_read_phandle_with_args(dev, "mediatek,xfi_pll",
  1563. NULL, 0, 0, &args);
  1564. if (ret)
  1565. return ret;
  1566. priv->xfi_pll_regmap = syscon_node_to_regmap(args.node);
  1567. if (IS_ERR(priv->xfi_pll_regmap))
  1568. return PTR_ERR(priv->xfi_pll_regmap);
  1569. /* get corresponding toprgu phandle */
  1570. ret = dev_read_phandle_with_args(dev, "mediatek,toprgu",
  1571. NULL, 0, 0, &args);
  1572. if (ret)
  1573. return ret;
  1574. priv->toprgu_regmap = syscon_node_to_regmap(args.node);
  1575. if (IS_ERR(priv->toprgu_regmap))
  1576. return PTR_ERR(priv->toprgu_regmap);
  1577. }
  1578. /* check for switch first, otherwise phy will be used */
  1579. priv->sw = SW_NONE;
  1580. priv->switch_init = NULL;
  1581. priv->switch_mac_control = NULL;
  1582. str = dev_read_string(dev, "mediatek,switch");
  1583. if (str) {
  1584. if (!strcmp(str, "mt7530")) {
  1585. priv->sw = SW_MT7530;
  1586. priv->switch_init = mt7530_setup;
  1587. priv->switch_mac_control = mt7530_mac_control;
  1588. priv->mt753x_smi_addr = MT753X_DFL_SMI_ADDR;
  1589. priv->mt753x_reset_wait_time = 1000;
  1590. } else if (!strcmp(str, "mt7531")) {
  1591. priv->sw = SW_MT7531;
  1592. priv->switch_init = mt7531_setup;
  1593. priv->switch_mac_control = mt7531_mac_control;
  1594. priv->mt753x_smi_addr = MT753X_DFL_SMI_ADDR;
  1595. priv->mt753x_reset_wait_time = 200;
  1596. } else if (!strcmp(str, "mt7988")) {
  1597. priv->sw = SW_MT7988;
  1598. priv->switch_init = mt7988_setup;
  1599. priv->switch_mac_control = mt7988_mac_control;
  1600. priv->mt753x_smi_addr = MT753X_DFL_SMI_ADDR;
  1601. priv->mt753x_reset_wait_time = 50;
  1602. } else {
  1603. printf("error: unsupported switch\n");
  1604. return -EINVAL;
  1605. }
  1606. priv->mcm = dev_read_bool(dev, "mediatek,mcm");
  1607. if (priv->mcm) {
  1608. ret = reset_get_by_name(dev, "mcm", &priv->rst_mcm);
  1609. if (ret) {
  1610. printf("error: no reset ctrl for mcm\n");
  1611. return ret;
  1612. }
  1613. } else {
  1614. gpio_request_by_name(dev, "reset-gpios", 0,
  1615. &priv->rst_gpio, GPIOD_IS_OUT);
  1616. }
  1617. } else {
  1618. ret = dev_read_phandle_with_args(dev, "phy-handle", NULL, 0,
  1619. 0, &args);
  1620. if (ret) {
  1621. printf("error: phy-handle is not specified\n");
  1622. return ret;
  1623. }
  1624. priv->phy_addr = ofnode_read_s32_default(args.node, "reg", -1);
  1625. if (priv->phy_addr < 0) {
  1626. printf("error: phy address is not specified\n");
  1627. return ret;
  1628. }
  1629. }
  1630. return 0;
  1631. }
  1632. static const struct mtk_soc_data mt7988_data = {
  1633. .caps = MT7988_CAPS,
  1634. .ana_rgc3 = 0x128,
  1635. .gdma_count = 3,
  1636. .pdma_base = PDMA_V3_BASE,
  1637. .txd_size = sizeof(struct mtk_tx_dma_v2),
  1638. .rxd_size = sizeof(struct mtk_rx_dma_v2),
  1639. };
  1640. static const struct mtk_soc_data mt7986_data = {
  1641. .caps = MT7986_CAPS,
  1642. .ana_rgc3 = 0x128,
  1643. .gdma_count = 2,
  1644. .pdma_base = PDMA_V2_BASE,
  1645. .txd_size = sizeof(struct mtk_tx_dma_v2),
  1646. .rxd_size = sizeof(struct mtk_rx_dma_v2),
  1647. };
  1648. static const struct mtk_soc_data mt7981_data = {
  1649. .caps = MT7981_CAPS,
  1650. .ana_rgc3 = 0x128,
  1651. .gdma_count = 2,
  1652. .pdma_base = PDMA_V2_BASE,
  1653. .txd_size = sizeof(struct mtk_tx_dma_v2),
  1654. .rxd_size = sizeof(struct mtk_rx_dma_v2),
  1655. };
  1656. static const struct mtk_soc_data mt7629_data = {
  1657. .ana_rgc3 = 0x128,
  1658. .gdma_count = 2,
  1659. .pdma_base = PDMA_V1_BASE,
  1660. .txd_size = sizeof(struct mtk_tx_dma),
  1661. .rxd_size = sizeof(struct mtk_rx_dma),
  1662. };
  1663. static const struct mtk_soc_data mt7623_data = {
  1664. .caps = MT7623_CAPS,
  1665. .gdma_count = 2,
  1666. .pdma_base = PDMA_V1_BASE,
  1667. .txd_size = sizeof(struct mtk_tx_dma),
  1668. .rxd_size = sizeof(struct mtk_rx_dma),
  1669. };
  1670. static const struct mtk_soc_data mt7622_data = {
  1671. .ana_rgc3 = 0x2028,
  1672. .gdma_count = 2,
  1673. .pdma_base = PDMA_V1_BASE,
  1674. .txd_size = sizeof(struct mtk_tx_dma),
  1675. .rxd_size = sizeof(struct mtk_rx_dma),
  1676. };
  1677. static const struct mtk_soc_data mt7621_data = {
  1678. .caps = MT7621_CAPS,
  1679. .gdma_count = 2,
  1680. .pdma_base = PDMA_V1_BASE,
  1681. .txd_size = sizeof(struct mtk_tx_dma),
  1682. .rxd_size = sizeof(struct mtk_rx_dma),
  1683. };
  1684. static const struct udevice_id mtk_eth_ids[] = {
  1685. { .compatible = "mediatek,mt7988-eth", .data = (ulong)&mt7988_data },
  1686. { .compatible = "mediatek,mt7986-eth", .data = (ulong)&mt7986_data },
  1687. { .compatible = "mediatek,mt7981-eth", .data = (ulong)&mt7981_data },
  1688. { .compatible = "mediatek,mt7629-eth", .data = (ulong)&mt7629_data },
  1689. { .compatible = "mediatek,mt7623-eth", .data = (ulong)&mt7623_data },
  1690. { .compatible = "mediatek,mt7622-eth", .data = (ulong)&mt7622_data },
  1691. { .compatible = "mediatek,mt7621-eth", .data = (ulong)&mt7621_data },
  1692. {}
  1693. };
  1694. static const struct eth_ops mtk_eth_ops = {
  1695. .start = mtk_eth_start,
  1696. .stop = mtk_eth_stop,
  1697. .send = mtk_eth_send,
  1698. .recv = mtk_eth_recv,
  1699. .free_pkt = mtk_eth_free_pkt,
  1700. .write_hwaddr = mtk_eth_write_hwaddr,
  1701. };
  1702. U_BOOT_DRIVER(mtk_eth) = {
  1703. .name = "mtk-eth",
  1704. .id = UCLASS_ETH,
  1705. .of_match = mtk_eth_ids,
  1706. .of_to_plat = mtk_eth_of_to_plat,
  1707. .plat_auto = sizeof(struct eth_pdata),
  1708. .probe = mtk_eth_probe,
  1709. .remove = mtk_eth_remove,
  1710. .ops = &mtk_eth_ops,
  1711. .priv_auto = sizeof(struct mtk_eth_priv),
  1712. .flags = DM_FLAG_ALLOC_PRIV_DMA,
  1713. };