mt7628-eth.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * MediaTek ethernet IP driver for U-Boot
  4. *
  5. * Copyright (C) 2018 Stefan Roese <sr@denx.de>
  6. *
  7. * This code is mostly based on the code extracted from this MediaTek
  8. * github repository:
  9. *
  10. * https://github.com/MediaTek-Labs/linkit-smart-uboot.git
  11. *
  12. * I was not able to find a specific license or other developers
  13. * copyrights here, so I can't add them here.
  14. */
  15. #include <common.h>
  16. #include <dm.h>
  17. #include <malloc.h>
  18. #include <miiphy.h>
  19. #include <net.h>
  20. #include <regmap.h>
  21. #include <syscon.h>
  22. #include <wait_bit.h>
  23. #include <asm/io.h>
  24. #include <linux/bitfield.h>
  25. #include <linux/err.h>
  26. /* System controller register */
  27. #define MT7628_RSTCTRL_REG 0x34
  28. #define RSTCTRL_EPHY_RST BIT(24)
  29. #define MT7628_AGPIO_CFG_REG 0x3c
  30. #define MT7628_EPHY_GPIO_AIO_EN GENMASK(20, 17)
  31. #define MT7628_EPHY_P0_DIS BIT(16)
  32. #define MT7628_GPIO2_MODE_REG 0x64
  33. /* Ethernet frame engine register */
  34. #define PDMA_RELATED 0x0800
  35. #define TX_BASE_PTR0 (PDMA_RELATED + 0x000)
  36. #define TX_MAX_CNT0 (PDMA_RELATED + 0x004)
  37. #define TX_CTX_IDX0 (PDMA_RELATED + 0x008)
  38. #define TX_DTX_IDX0 (PDMA_RELATED + 0x00c)
  39. #define RX_BASE_PTR0 (PDMA_RELATED + 0x100)
  40. #define RX_MAX_CNT0 (PDMA_RELATED + 0x104)
  41. #define RX_CALC_IDX0 (PDMA_RELATED + 0x108)
  42. #define PDMA_GLO_CFG (PDMA_RELATED + 0x204)
  43. #define PDMA_RST_IDX (PDMA_RELATED + 0x208)
  44. #define DLY_INT_CFG (PDMA_RELATED + 0x20c)
  45. #define SDM_RELATED 0x0c00
  46. #define SDM_MAC_ADRL (SDM_RELATED + 0x0c) /* MAC address LSB */
  47. #define SDM_MAC_ADRH (SDM_RELATED + 0x10) /* MAC Address MSB */
  48. #define RST_DTX_IDX0 BIT(0)
  49. #define RST_DRX_IDX0 BIT(16)
  50. #define TX_DMA_EN BIT(0)
  51. #define TX_DMA_BUSY BIT(1)
  52. #define RX_DMA_EN BIT(2)
  53. #define RX_DMA_BUSY BIT(3)
  54. #define TX_WB_DDONE BIT(6)
  55. /* Ethernet switch register */
  56. #define MT7628_SWITCH_FCT0 0x0008
  57. #define MT7628_SWITCH_PFC1 0x0014
  58. #define MT7628_SWITCH_FPA 0x0084
  59. #define MT7628_SWITCH_SOCPC 0x008c
  60. #define MT7628_SWITCH_POC0 0x0090
  61. #define MT7628_SWITCH_POC2 0x0098
  62. #define MT7628_SWITCH_SGC 0x009c
  63. #define MT7628_SWITCH_PCR0 0x00c0
  64. #define PCR0_PHY_ADDR GENMASK(4, 0)
  65. #define PCR0_PHY_REG GENMASK(12, 8)
  66. #define PCR0_WT_PHY_CMD BIT(13)
  67. #define PCR0_RD_PHY_CMD BIT(14)
  68. #define PCR0_WT_DATA GENMASK(31, 16)
  69. #define MT7628_SWITCH_PCR1 0x00c4
  70. #define PCR1_WT_DONE BIT(0)
  71. #define PCR1_RD_RDY BIT(1)
  72. #define PCR1_RD_DATA GENMASK(31, 16)
  73. #define MT7628_SWITCH_FPA1 0x00c8
  74. #define MT7628_SWITCH_FCT2 0x00cc
  75. #define MT7628_SWITCH_SGC2 0x00e4
  76. #define MT7628_SWITCH_BMU_CTRL 0x0110
  77. /* rxd2 */
  78. #define RX_DMA_DONE BIT(31)
  79. #define RX_DMA_LSO BIT(30)
  80. #define RX_DMA_PLEN0 GENMASK(29, 16)
  81. #define RX_DMA_TAG BIT(15)
  82. struct fe_rx_dma {
  83. unsigned int rxd1;
  84. unsigned int rxd2;
  85. unsigned int rxd3;
  86. unsigned int rxd4;
  87. } __packed __aligned(4);
  88. #define TX_DMA_PLEN0 GENMASK(29, 16)
  89. #define TX_DMA_LS1 BIT(14)
  90. #define TX_DMA_LS0 BIT(30)
  91. #define TX_DMA_DONE BIT(31)
  92. #define TX_DMA_INS_VLAN_MT7621 BIT(16)
  93. #define TX_DMA_INS_VLAN BIT(7)
  94. #define TX_DMA_INS_PPPOE BIT(12)
  95. #define TX_DMA_PN GENMASK(26, 24)
  96. struct fe_tx_dma {
  97. unsigned int txd1;
  98. unsigned int txd2;
  99. unsigned int txd3;
  100. unsigned int txd4;
  101. } __packed __aligned(4);
  102. #define NUM_RX_DESC 256
  103. #define NUM_TX_DESC 4
  104. #define PADDING_LENGTH 60
  105. #define MTK_QDMA_PAGE_SIZE 2048
  106. #define CONFIG_MDIO_TIMEOUT 100
  107. #define CONFIG_DMA_STOP_TIMEOUT 100
  108. #define CONFIG_TX_DMA_TIMEOUT 100
  109. #define LINK_DELAY_TIME 500 /* 500 ms */
  110. #define LINK_TIMEOUT 10000 /* 10 seconds */
  111. struct mt7628_eth_dev {
  112. void __iomem *base; /* frame engine base address */
  113. void __iomem *eth_sw_base; /* switch base address */
  114. struct regmap *sysctrl_regmap; /* system-controller reg-map */
  115. struct mii_dev *bus;
  116. struct fe_tx_dma *tx_ring;
  117. struct fe_rx_dma *rx_ring;
  118. u8 *rx_buf[NUM_RX_DESC];
  119. /* Point to the next RXD DMA wants to use in RXD Ring0 */
  120. int rx_dma_idx;
  121. /* Point to the next TXD in TXD Ring0 CPU wants to use */
  122. int tx_dma_idx;
  123. };
  124. static int mdio_wait_read(struct mt7628_eth_dev *priv, u32 mask, bool mask_set)
  125. {
  126. void __iomem *base = priv->eth_sw_base;
  127. int ret;
  128. ret = wait_for_bit_le32(base + MT7628_SWITCH_PCR1, mask, mask_set,
  129. CONFIG_MDIO_TIMEOUT, false);
  130. if (ret) {
  131. printf("MDIO operation timeout!\n");
  132. return -ETIMEDOUT;
  133. }
  134. return 0;
  135. }
  136. static int mii_mgr_read(struct mt7628_eth_dev *priv,
  137. u32 phy_addr, u32 phy_register, u32 *read_data)
  138. {
  139. void __iomem *base = priv->eth_sw_base;
  140. u32 status = 0;
  141. u32 ret;
  142. *read_data = 0xffff;
  143. /* Make sure previous read operation is complete */
  144. ret = mdio_wait_read(priv, PCR1_RD_RDY, false);
  145. if (ret)
  146. return ret;
  147. writel(PCR0_RD_PHY_CMD |
  148. FIELD_PREP(PCR0_PHY_REG, phy_register) |
  149. FIELD_PREP(PCR0_PHY_ADDR, phy_addr),
  150. base + MT7628_SWITCH_PCR0);
  151. /* Make sure previous read operation is complete */
  152. ret = mdio_wait_read(priv, PCR1_RD_RDY, true);
  153. if (ret)
  154. return ret;
  155. status = readl(base + MT7628_SWITCH_PCR1);
  156. *read_data = FIELD_GET(PCR1_RD_DATA, status);
  157. return 0;
  158. }
  159. static int mii_mgr_write(struct mt7628_eth_dev *priv,
  160. u32 phy_addr, u32 phy_register, u32 write_data)
  161. {
  162. void __iomem *base = priv->eth_sw_base;
  163. u32 data;
  164. int ret;
  165. /* Make sure previous write operation is complete */
  166. ret = mdio_wait_read(priv, PCR1_WT_DONE, false);
  167. if (ret)
  168. return ret;
  169. data = FIELD_PREP(PCR0_WT_DATA, write_data) |
  170. FIELD_PREP(PCR0_PHY_REG, phy_register) |
  171. FIELD_PREP(PCR0_PHY_ADDR, phy_addr) |
  172. PCR0_WT_PHY_CMD;
  173. writel(data, base + MT7628_SWITCH_PCR0);
  174. return mdio_wait_read(priv, PCR1_WT_DONE, true);
  175. }
  176. static int mt7628_mdio_read(struct mii_dev *bus, int addr, int devad, int reg)
  177. {
  178. u32 val;
  179. int ret;
  180. ret = mii_mgr_read(bus->priv, addr, reg, &val);
  181. if (ret)
  182. return ret;
  183. return val;
  184. }
  185. static int mt7628_mdio_write(struct mii_dev *bus, int addr, int devad, int reg,
  186. u16 value)
  187. {
  188. return mii_mgr_write(bus->priv, addr, reg, value);
  189. }
  190. static void mt7628_ephy_init(struct mt7628_eth_dev *priv)
  191. {
  192. int i;
  193. mii_mgr_write(priv, 0, 31, 0x2000); /* change G2 page */
  194. mii_mgr_write(priv, 0, 26, 0x0000);
  195. for (i = 0; i < 5; i++) {
  196. mii_mgr_write(priv, i, 31, 0x8000); /* change L0 page */
  197. mii_mgr_write(priv, i, 0, 0x3100);
  198. /* EEE disable */
  199. mii_mgr_write(priv, i, 30, 0xa000);
  200. mii_mgr_write(priv, i, 31, 0xa000); /* change L2 page */
  201. mii_mgr_write(priv, i, 16, 0x0606);
  202. mii_mgr_write(priv, i, 23, 0x0f0e);
  203. mii_mgr_write(priv, i, 24, 0x1610);
  204. mii_mgr_write(priv, i, 30, 0x1f15);
  205. mii_mgr_write(priv, i, 28, 0x6111);
  206. }
  207. /* 100Base AOI setting */
  208. mii_mgr_write(priv, 0, 31, 0x5000); /* change G5 page */
  209. mii_mgr_write(priv, 0, 19, 0x004a);
  210. mii_mgr_write(priv, 0, 20, 0x015a);
  211. mii_mgr_write(priv, 0, 21, 0x00ee);
  212. mii_mgr_write(priv, 0, 22, 0x0033);
  213. mii_mgr_write(priv, 0, 23, 0x020a);
  214. mii_mgr_write(priv, 0, 24, 0x0000);
  215. mii_mgr_write(priv, 0, 25, 0x024a);
  216. mii_mgr_write(priv, 0, 26, 0x035a);
  217. mii_mgr_write(priv, 0, 27, 0x02ee);
  218. mii_mgr_write(priv, 0, 28, 0x0233);
  219. mii_mgr_write(priv, 0, 29, 0x000a);
  220. mii_mgr_write(priv, 0, 30, 0x0000);
  221. /* Fix EPHY idle state abnormal behavior */
  222. mii_mgr_write(priv, 0, 31, 0x4000); /* change G4 page */
  223. mii_mgr_write(priv, 0, 29, 0x000d);
  224. mii_mgr_write(priv, 0, 30, 0x0500);
  225. }
  226. static void rt305x_esw_init(struct mt7628_eth_dev *priv)
  227. {
  228. void __iomem *base = priv->eth_sw_base;
  229. /*
  230. * FC_RLS_TH=200, FC_SET_TH=160
  231. * DROP_RLS=120, DROP_SET_TH=80
  232. */
  233. writel(0xc8a07850, base + MT7628_SWITCH_FCT0);
  234. writel(0x00000000, base + MT7628_SWITCH_SGC2);
  235. writel(0x00405555, base + MT7628_SWITCH_PFC1);
  236. writel(0x00007f7f, base + MT7628_SWITCH_POC0);
  237. writel(0x00007f7f, base + MT7628_SWITCH_POC2); /* disable VLAN */
  238. writel(0x0002500c, base + MT7628_SWITCH_FCT2);
  239. /* hashing algorithm=XOR48, aging interval=300sec */
  240. writel(0x0008a301, base + MT7628_SWITCH_SGC);
  241. writel(0x02404040, base + MT7628_SWITCH_SOCPC);
  242. /* Ext PHY Addr=0x1f */
  243. writel(0x3f502b28, base + MT7628_SWITCH_FPA1);
  244. writel(0x00000000, base + MT7628_SWITCH_FPA);
  245. /* 1us cycle number=125 (FE's clock=125Mhz) */
  246. writel(0x7d000000, base + MT7628_SWITCH_BMU_CTRL);
  247. /* Configure analog GPIO setup */
  248. regmap_update_bits(priv->sysctrl_regmap, MT7628_AGPIO_CFG_REG,
  249. MT7628_EPHY_P0_DIS, MT7628_EPHY_GPIO_AIO_EN);
  250. /* Reset PHY */
  251. regmap_update_bits(priv->sysctrl_regmap, MT7628_RSTCTRL_REG,
  252. 0, RSTCTRL_EPHY_RST);
  253. regmap_update_bits(priv->sysctrl_regmap, MT7628_RSTCTRL_REG,
  254. RSTCTRL_EPHY_RST, 0);
  255. mdelay(10);
  256. /* Set P0 EPHY LED mode */
  257. regmap_update_bits(priv->sysctrl_regmap, MT7628_GPIO2_MODE_REG,
  258. 0x0ffc0ffc, 0x05540554);
  259. mdelay(10);
  260. mt7628_ephy_init(priv);
  261. }
  262. static void eth_dma_start(struct mt7628_eth_dev *priv)
  263. {
  264. void __iomem *base = priv->base;
  265. setbits_le32(base + PDMA_GLO_CFG, TX_WB_DDONE | RX_DMA_EN | TX_DMA_EN);
  266. }
  267. static void eth_dma_stop(struct mt7628_eth_dev *priv)
  268. {
  269. void __iomem *base = priv->base;
  270. int ret;
  271. clrbits_le32(base + PDMA_GLO_CFG, TX_WB_DDONE | RX_DMA_EN | TX_DMA_EN);
  272. /* Wait for DMA to stop */
  273. ret = wait_for_bit_le32(base + PDMA_GLO_CFG,
  274. RX_DMA_BUSY | TX_DMA_BUSY, false,
  275. CONFIG_DMA_STOP_TIMEOUT, false);
  276. if (ret)
  277. printf("DMA stop timeout error!\n");
  278. }
  279. static int mt7628_eth_write_hwaddr(struct udevice *dev)
  280. {
  281. struct mt7628_eth_dev *priv = dev_get_priv(dev);
  282. void __iomem *base = priv->base;
  283. u8 *addr = ((struct eth_pdata *)dev_get_platdata(dev))->enetaddr;
  284. u32 val;
  285. /* Set MAC address. */
  286. val = addr[0];
  287. val = (val << 8) | addr[1];
  288. writel(val, base + SDM_MAC_ADRH);
  289. val = addr[2];
  290. val = (val << 8) | addr[3];
  291. val = (val << 8) | addr[4];
  292. val = (val << 8) | addr[5];
  293. writel(val, base + SDM_MAC_ADRL);
  294. return 0;
  295. }
  296. static int mt7628_eth_send(struct udevice *dev, void *packet, int length)
  297. {
  298. struct mt7628_eth_dev *priv = dev_get_priv(dev);
  299. void __iomem *base = priv->base;
  300. int ret;
  301. int idx;
  302. int i;
  303. idx = priv->tx_dma_idx;
  304. /* Pad message to a minimum length */
  305. if (length < PADDING_LENGTH) {
  306. char *p = (char *)packet;
  307. for (i = 0; i < PADDING_LENGTH - length; i++)
  308. p[length + i] = 0;
  309. length = PADDING_LENGTH;
  310. }
  311. /* Check if buffer is ready for next TX DMA */
  312. ret = wait_for_bit_le32(&priv->tx_ring[idx].txd2, TX_DMA_DONE, true,
  313. CONFIG_TX_DMA_TIMEOUT, false);
  314. if (ret) {
  315. printf("TX: DMA still busy on buffer %d\n", idx);
  316. return ret;
  317. }
  318. flush_dcache_range((u32)packet, (u32)packet + length);
  319. priv->tx_ring[idx].txd1 = CPHYSADDR(packet);
  320. priv->tx_ring[idx].txd2 &= ~TX_DMA_PLEN0;
  321. priv->tx_ring[idx].txd2 |= FIELD_PREP(TX_DMA_PLEN0, length);
  322. priv->tx_ring[idx].txd2 &= ~TX_DMA_DONE;
  323. idx = (idx + 1) % NUM_TX_DESC;
  324. /* Make sure the writes executed at this place */
  325. wmb();
  326. writel(idx, base + TX_CTX_IDX0);
  327. priv->tx_dma_idx = idx;
  328. return 0;
  329. }
  330. static int mt7628_eth_recv(struct udevice *dev, int flags, uchar **packetp)
  331. {
  332. struct mt7628_eth_dev *priv = dev_get_priv(dev);
  333. u32 rxd_info;
  334. int length;
  335. int idx;
  336. idx = priv->rx_dma_idx;
  337. rxd_info = priv->rx_ring[idx].rxd2;
  338. if ((rxd_info & RX_DMA_DONE) == 0)
  339. return -EAGAIN;
  340. length = FIELD_GET(RX_DMA_PLEN0, priv->rx_ring[idx].rxd2);
  341. if (length == 0 || length > MTK_QDMA_PAGE_SIZE) {
  342. printf("%s: invalid length (%d bytes)\n", __func__, length);
  343. return -EIO;
  344. }
  345. *packetp = priv->rx_buf[idx];
  346. invalidate_dcache_range((u32)*packetp, (u32)*packetp + length);
  347. priv->rx_ring[idx].rxd4 = 0;
  348. priv->rx_ring[idx].rxd2 = RX_DMA_LSO;
  349. /* Make sure the writes executed at this place */
  350. wmb();
  351. return length;
  352. }
  353. static int mt7628_eth_free_pkt(struct udevice *dev, uchar *packet, int length)
  354. {
  355. struct mt7628_eth_dev *priv = dev_get_priv(dev);
  356. void __iomem *base = priv->base;
  357. int idx;
  358. idx = priv->rx_dma_idx;
  359. /* Move point to next RXD which wants to alloc */
  360. writel(idx, base + RX_CALC_IDX0);
  361. /* Update to Next packet point that was received */
  362. idx = (idx + 1) % NUM_RX_DESC;
  363. priv->rx_dma_idx = idx;
  364. return 0;
  365. }
  366. static int phy_link_up(struct mt7628_eth_dev *priv)
  367. {
  368. u32 val;
  369. mii_mgr_read(priv, 0x00, MII_BMSR, &val);
  370. return !!(val & BMSR_LSTATUS);
  371. }
  372. static int mt7628_eth_start(struct udevice *dev)
  373. {
  374. struct mt7628_eth_dev *priv = dev_get_priv(dev);
  375. void __iomem *base = priv->base;
  376. uchar packet[MTK_QDMA_PAGE_SIZE];
  377. uchar *packetp;
  378. int i;
  379. for (i = 0; i < NUM_RX_DESC; i++) {
  380. memset((void *)&priv->rx_ring[i], 0, sizeof(priv->rx_ring[0]));
  381. priv->rx_ring[i].rxd2 |= RX_DMA_LSO;
  382. priv->rx_ring[i].rxd1 = CPHYSADDR(priv->rx_buf[i]);
  383. }
  384. for (i = 0; i < NUM_TX_DESC; i++) {
  385. memset((void *)&priv->tx_ring[i], 0, sizeof(priv->tx_ring[0]));
  386. priv->tx_ring[i].txd2 = TX_DMA_LS0 | TX_DMA_DONE;
  387. priv->tx_ring[i].txd4 = FIELD_PREP(TX_DMA_PN, 1);
  388. }
  389. priv->rx_dma_idx = 0;
  390. priv->tx_dma_idx = 0;
  391. /* Make sure the writes executed at this place */
  392. wmb();
  393. /* disable delay interrupt */
  394. writel(0, base + DLY_INT_CFG);
  395. clrbits_le32(base + PDMA_GLO_CFG, 0xffff0000);
  396. /* Tell the adapter where the TX/RX rings are located. */
  397. writel(CPHYSADDR(&priv->rx_ring[0]), base + RX_BASE_PTR0);
  398. writel(CPHYSADDR((u32)&priv->tx_ring[0]), base + TX_BASE_PTR0);
  399. writel(NUM_RX_DESC, base + RX_MAX_CNT0);
  400. writel(NUM_TX_DESC, base + TX_MAX_CNT0);
  401. writel(priv->tx_dma_idx, base + TX_CTX_IDX0);
  402. writel(RST_DTX_IDX0, base + PDMA_RST_IDX);
  403. writel(NUM_RX_DESC - 1, base + RX_CALC_IDX0);
  404. writel(RST_DRX_IDX0, base + PDMA_RST_IDX);
  405. /* Make sure the writes executed at this place */
  406. wmb();
  407. eth_dma_start(priv);
  408. /* Check if link is not up yet */
  409. if (!phy_link_up(priv)) {
  410. /* Wait for link to come up */
  411. printf("Waiting for link to come up .");
  412. for (i = 0; i < (LINK_TIMEOUT / LINK_DELAY_TIME); i++) {
  413. mdelay(LINK_DELAY_TIME);
  414. if (phy_link_up(priv)) {
  415. mdelay(100); /* Ensure all is ready */
  416. break;
  417. }
  418. printf(".");
  419. }
  420. if (phy_link_up(priv))
  421. printf(" done\n");
  422. else
  423. printf(" timeout! Trying anyways\n");
  424. }
  425. /*
  426. * The integrated switch seems to queue some received ethernet
  427. * packets in some FIFO. Lets read the already queued packets
  428. * out by using the receive routine, so that these old messages
  429. * are dropped before the new xfer starts.
  430. */
  431. packetp = &packet[0];
  432. while (mt7628_eth_recv(dev, 0, &packetp) != -EAGAIN)
  433. mt7628_eth_free_pkt(dev, packetp, 0);
  434. return 0;
  435. }
  436. static void mt7628_eth_stop(struct udevice *dev)
  437. {
  438. struct mt7628_eth_dev *priv = dev_get_priv(dev);
  439. eth_dma_stop(priv);
  440. }
  441. static int mt7628_eth_probe(struct udevice *dev)
  442. {
  443. struct mt7628_eth_dev *priv = dev_get_priv(dev);
  444. struct udevice *syscon;
  445. struct mii_dev *bus;
  446. int ret;
  447. int i;
  448. /* Save frame-engine base address for later use */
  449. priv->base = dev_remap_addr_index(dev, 0);
  450. if (IS_ERR(priv->base))
  451. return PTR_ERR(priv->base);
  452. /* Save switch base address for later use */
  453. priv->eth_sw_base = dev_remap_addr_index(dev, 1);
  454. if (IS_ERR(priv->eth_sw_base))
  455. return PTR_ERR(priv->eth_sw_base);
  456. /* Get system controller regmap */
  457. ret = uclass_get_device_by_phandle(UCLASS_SYSCON, dev,
  458. "syscon", &syscon);
  459. if (ret) {
  460. pr_err("unable to find syscon device\n");
  461. return ret;
  462. }
  463. priv->sysctrl_regmap = syscon_get_regmap(syscon);
  464. if (!priv->sysctrl_regmap) {
  465. pr_err("unable to find regmap\n");
  466. return -ENODEV;
  467. }
  468. /* Put rx and tx rings into KSEG1 area (uncached) */
  469. priv->tx_ring = (struct fe_tx_dma *)
  470. KSEG1ADDR(memalign(ARCH_DMA_MINALIGN,
  471. sizeof(*priv->tx_ring) * NUM_TX_DESC));
  472. priv->rx_ring = (struct fe_rx_dma *)
  473. KSEG1ADDR(memalign(ARCH_DMA_MINALIGN,
  474. sizeof(*priv->rx_ring) * NUM_RX_DESC));
  475. for (i = 0; i < NUM_RX_DESC; i++)
  476. priv->rx_buf[i] = memalign(PKTALIGN, MTK_QDMA_PAGE_SIZE);
  477. bus = mdio_alloc();
  478. if (!bus) {
  479. printf("Failed to allocate MDIO bus\n");
  480. return -ENOMEM;
  481. }
  482. bus->read = mt7628_mdio_read;
  483. bus->write = mt7628_mdio_write;
  484. snprintf(bus->name, sizeof(bus->name), dev->name);
  485. bus->priv = (void *)priv;
  486. ret = mdio_register(bus);
  487. if (ret)
  488. return ret;
  489. /* Switch configuration */
  490. rt305x_esw_init(priv);
  491. return 0;
  492. }
  493. static const struct eth_ops mt7628_eth_ops = {
  494. .start = mt7628_eth_start,
  495. .send = mt7628_eth_send,
  496. .recv = mt7628_eth_recv,
  497. .free_pkt = mt7628_eth_free_pkt,
  498. .stop = mt7628_eth_stop,
  499. .write_hwaddr = mt7628_eth_write_hwaddr,
  500. };
  501. static const struct udevice_id mt7628_eth_ids[] = {
  502. { .compatible = "mediatek,mt7628-eth" },
  503. { }
  504. };
  505. U_BOOT_DRIVER(mt7628_eth) = {
  506. .name = "mt7628_eth",
  507. .id = UCLASS_ETH,
  508. .of_match = mt7628_eth_ids,
  509. .probe = mt7628_eth_probe,
  510. .ops = &mt7628_eth_ops,
  511. .priv_auto_alloc_size = sizeof(struct mt7628_eth_dev),
  512. .platdata_auto_alloc_size = sizeof(struct eth_pdata),
  513. };