ag7xxx.c 24 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015
  1. /*
  2. * Atheros AR71xx / AR9xxx GMAC driver
  3. *
  4. * Copyright (C) 2016 Marek Vasut <marex@denx.de>
  5. *
  6. * SPDX-License-Identifier: GPL-2.0+
  7. */
  8. #include <common.h>
  9. #include <dm.h>
  10. #include <errno.h>
  11. #include <miiphy.h>
  12. #include <malloc.h>
  13. #include <linux/compiler.h>
  14. #include <linux/err.h>
  15. #include <linux/mii.h>
  16. #include <wait_bit.h>
  17. #include <asm/io.h>
  18. #include <mach/ath79.h>
  19. DECLARE_GLOBAL_DATA_PTR;
  20. enum ag7xxx_model {
  21. AG7XXX_MODEL_AG933X,
  22. AG7XXX_MODEL_AG934X,
  23. };
  24. /* MAC Configuration 1 */
  25. #define AG7XXX_ETH_CFG1 0x00
  26. #define AG7XXX_ETH_CFG1_SOFT_RST BIT(31)
  27. #define AG7XXX_ETH_CFG1_RX_RST BIT(19)
  28. #define AG7XXX_ETH_CFG1_TX_RST BIT(18)
  29. #define AG7XXX_ETH_CFG1_LOOPBACK BIT(8)
  30. #define AG7XXX_ETH_CFG1_RX_EN BIT(2)
  31. #define AG7XXX_ETH_CFG1_TX_EN BIT(0)
  32. /* MAC Configuration 2 */
  33. #define AG7XXX_ETH_CFG2 0x04
  34. #define AG7XXX_ETH_CFG2_IF_1000 BIT(9)
  35. #define AG7XXX_ETH_CFG2_IF_10_100 BIT(8)
  36. #define AG7XXX_ETH_CFG2_IF_SPEED_MASK (3 << 8)
  37. #define AG7XXX_ETH_CFG2_HUGE_FRAME_EN BIT(5)
  38. #define AG7XXX_ETH_CFG2_LEN_CHECK BIT(4)
  39. #define AG7XXX_ETH_CFG2_PAD_CRC_EN BIT(2)
  40. #define AG7XXX_ETH_CFG2_FDX BIT(0)
  41. /* MII Configuration */
  42. #define AG7XXX_ETH_MII_MGMT_CFG 0x20
  43. #define AG7XXX_ETH_MII_MGMT_CFG_RESET BIT(31)
  44. /* MII Command */
  45. #define AG7XXX_ETH_MII_MGMT_CMD 0x24
  46. #define AG7XXX_ETH_MII_MGMT_CMD_READ 0x1
  47. /* MII Address */
  48. #define AG7XXX_ETH_MII_MGMT_ADDRESS 0x28
  49. #define AG7XXX_ETH_MII_MGMT_ADDRESS_SHIFT 8
  50. /* MII Control */
  51. #define AG7XXX_ETH_MII_MGMT_CTRL 0x2c
  52. /* MII Status */
  53. #define AG7XXX_ETH_MII_MGMT_STATUS 0x30
  54. /* MII Indicators */
  55. #define AG7XXX_ETH_MII_MGMT_IND 0x34
  56. #define AG7XXX_ETH_MII_MGMT_IND_INVALID BIT(2)
  57. #define AG7XXX_ETH_MII_MGMT_IND_BUSY BIT(0)
  58. /* STA Address 1 & 2 */
  59. #define AG7XXX_ETH_ADDR1 0x40
  60. #define AG7XXX_ETH_ADDR2 0x44
  61. /* ETH Configuration 0 - 5 */
  62. #define AG7XXX_ETH_FIFO_CFG_0 0x48
  63. #define AG7XXX_ETH_FIFO_CFG_1 0x4c
  64. #define AG7XXX_ETH_FIFO_CFG_2 0x50
  65. #define AG7XXX_ETH_FIFO_CFG_3 0x54
  66. #define AG7XXX_ETH_FIFO_CFG_4 0x58
  67. #define AG7XXX_ETH_FIFO_CFG_5 0x5c
  68. /* DMA Transfer Control for Queue 0 */
  69. #define AG7XXX_ETH_DMA_TX_CTRL 0x180
  70. #define AG7XXX_ETH_DMA_TX_CTRL_TXE BIT(0)
  71. /* Descriptor Address for Queue 0 Tx */
  72. #define AG7XXX_ETH_DMA_TX_DESC 0x184
  73. /* DMA Tx Status */
  74. #define AG7XXX_ETH_DMA_TX_STATUS 0x188
  75. /* Rx Control */
  76. #define AG7XXX_ETH_DMA_RX_CTRL 0x18c
  77. #define AG7XXX_ETH_DMA_RX_CTRL_RXE BIT(0)
  78. /* Pointer to Rx Descriptor */
  79. #define AG7XXX_ETH_DMA_RX_DESC 0x190
  80. /* Rx Status */
  81. #define AG7XXX_ETH_DMA_RX_STATUS 0x194
  82. /* Custom register at 0x18070000 */
  83. #define AG7XXX_GMAC_ETH_CFG 0x00
  84. #define AG7XXX_ETH_CFG_SW_PHY_ADDR_SWAP BIT(8)
  85. #define AG7XXX_ETH_CFG_SW_PHY_SWAP BIT(7)
  86. #define AG7XXX_ETH_CFG_SW_ONLY_MODE BIT(6)
  87. #define AG7XXX_ETH_CFG_GE0_ERR_EN BIT(5)
  88. #define AG7XXX_ETH_CFG_MII_GE0_SLAVE BIT(4)
  89. #define AG7XXX_ETH_CFG_MII_GE0_MASTER BIT(3)
  90. #define AG7XXX_ETH_CFG_GMII_GE0 BIT(2)
  91. #define AG7XXX_ETH_CFG_MII_GE0 BIT(1)
  92. #define AG7XXX_ETH_CFG_RGMII_GE0 BIT(0)
  93. #define CONFIG_TX_DESCR_NUM 8
  94. #define CONFIG_RX_DESCR_NUM 8
  95. #define CONFIG_ETH_BUFSIZE 2048
  96. #define TX_TOTAL_BUFSIZE (CONFIG_ETH_BUFSIZE * CONFIG_TX_DESCR_NUM)
  97. #define RX_TOTAL_BUFSIZE (CONFIG_ETH_BUFSIZE * CONFIG_RX_DESCR_NUM)
  98. /* DMA descriptor. */
  99. struct ag7xxx_dma_desc {
  100. u32 data_addr;
  101. #define AG7XXX_DMADESC_IS_EMPTY BIT(31)
  102. #define AG7XXX_DMADESC_FTPP_OVERRIDE_OFFSET 16
  103. #define AG7XXX_DMADESC_PKT_SIZE_OFFSET 0
  104. #define AG7XXX_DMADESC_PKT_SIZE_MASK 0xfff
  105. u32 config;
  106. u32 next_desc;
  107. u32 _pad[5];
  108. };
  109. struct ar7xxx_eth_priv {
  110. struct ag7xxx_dma_desc tx_mac_descrtable[CONFIG_TX_DESCR_NUM];
  111. struct ag7xxx_dma_desc rx_mac_descrtable[CONFIG_RX_DESCR_NUM];
  112. char txbuffs[TX_TOTAL_BUFSIZE] __aligned(ARCH_DMA_MINALIGN);
  113. char rxbuffs[RX_TOTAL_BUFSIZE] __aligned(ARCH_DMA_MINALIGN);
  114. void __iomem *regs;
  115. void __iomem *phyregs;
  116. struct eth_device *dev;
  117. struct phy_device *phydev;
  118. struct mii_dev *bus;
  119. u32 interface;
  120. u32 tx_currdescnum;
  121. u32 rx_currdescnum;
  122. enum ag7xxx_model model;
  123. };
  124. /*
  125. * Switch and MDIO access
  126. */
  127. static int ag7xxx_switch_read(struct mii_dev *bus, int addr, int reg, u16 *val)
  128. {
  129. struct ar7xxx_eth_priv *priv = bus->priv;
  130. void __iomem *regs = priv->phyregs;
  131. int ret;
  132. writel(0x0, regs + AG7XXX_ETH_MII_MGMT_CMD);
  133. writel((addr << AG7XXX_ETH_MII_MGMT_ADDRESS_SHIFT) | reg,
  134. regs + AG7XXX_ETH_MII_MGMT_ADDRESS);
  135. writel(AG7XXX_ETH_MII_MGMT_CMD_READ,
  136. regs + AG7XXX_ETH_MII_MGMT_CMD);
  137. ret = wait_for_bit("ag7xxx", regs + AG7XXX_ETH_MII_MGMT_IND,
  138. AG7XXX_ETH_MII_MGMT_IND_BUSY, 0, 1000, 0);
  139. if (ret)
  140. return ret;
  141. *val = readl(regs + AG7XXX_ETH_MII_MGMT_STATUS) & 0xffff;
  142. writel(0x0, regs + AG7XXX_ETH_MII_MGMT_CMD);
  143. return 0;
  144. }
  145. static int ag7xxx_switch_write(struct mii_dev *bus, int addr, int reg, u16 val)
  146. {
  147. struct ar7xxx_eth_priv *priv = bus->priv;
  148. void __iomem *regs = priv->phyregs;
  149. int ret;
  150. writel((addr << AG7XXX_ETH_MII_MGMT_ADDRESS_SHIFT) | reg,
  151. regs + AG7XXX_ETH_MII_MGMT_ADDRESS);
  152. writel(val, regs + AG7XXX_ETH_MII_MGMT_CTRL);
  153. ret = wait_for_bit("ag7xxx", regs + AG7XXX_ETH_MII_MGMT_IND,
  154. AG7XXX_ETH_MII_MGMT_IND_BUSY, 0, 1000, 0);
  155. return ret;
  156. }
  157. static int ag7xxx_switch_reg_read(struct mii_dev *bus, int reg, u32 *val)
  158. {
  159. struct ar7xxx_eth_priv *priv = bus->priv;
  160. u32 phy_addr;
  161. u32 reg_addr;
  162. u32 phy_temp;
  163. u32 reg_temp;
  164. u16 rv = 0;
  165. int ret;
  166. if (priv->model == AG7XXX_MODEL_AG933X) {
  167. phy_addr = 0x1f;
  168. reg_addr = 0x10;
  169. } else if (priv->model == AG7XXX_MODEL_AG934X) {
  170. phy_addr = 0x18;
  171. reg_addr = 0x00;
  172. } else
  173. return -EINVAL;
  174. ret = ag7xxx_switch_write(bus, phy_addr, reg_addr, reg >> 9);
  175. if (ret)
  176. return ret;
  177. phy_temp = ((reg >> 6) & 0x7) | 0x10;
  178. reg_temp = (reg >> 1) & 0x1e;
  179. *val = 0;
  180. ret = ag7xxx_switch_read(bus, phy_temp, reg_temp | 0, &rv);
  181. if (ret < 0)
  182. return ret;
  183. *val |= rv;
  184. ret = ag7xxx_switch_read(bus, phy_temp, reg_temp | 1, &rv);
  185. if (ret < 0)
  186. return ret;
  187. *val |= (rv << 16);
  188. return 0;
  189. }
  190. static int ag7xxx_switch_reg_write(struct mii_dev *bus, int reg, u32 val)
  191. {
  192. struct ar7xxx_eth_priv *priv = bus->priv;
  193. u32 phy_addr;
  194. u32 reg_addr;
  195. u32 phy_temp;
  196. u32 reg_temp;
  197. int ret;
  198. if (priv->model == AG7XXX_MODEL_AG933X) {
  199. phy_addr = 0x1f;
  200. reg_addr = 0x10;
  201. } else if (priv->model == AG7XXX_MODEL_AG934X) {
  202. phy_addr = 0x18;
  203. reg_addr = 0x00;
  204. } else
  205. return -EINVAL;
  206. ret = ag7xxx_switch_write(bus, phy_addr, reg_addr, reg >> 9);
  207. if (ret)
  208. return ret;
  209. phy_temp = ((reg >> 6) & 0x7) | 0x10;
  210. reg_temp = (reg >> 1) & 0x1e;
  211. /*
  212. * The switch on AR933x has some special register behavior, which
  213. * expects particular write order of their nibbles:
  214. * 0x40 ..... MSB first, LSB second
  215. * 0x50 ..... MSB first, LSB second
  216. * 0x98 ..... LSB first, MSB second
  217. * others ... don't care
  218. */
  219. if ((priv->model == AG7XXX_MODEL_AG933X) && (reg == 0x98)) {
  220. ret = ag7xxx_switch_write(bus, phy_temp, reg_temp | 0, val & 0xffff);
  221. if (ret < 0)
  222. return ret;
  223. ret = ag7xxx_switch_write(bus, phy_temp, reg_temp | 1, val >> 16);
  224. if (ret < 0)
  225. return ret;
  226. } else {
  227. ret = ag7xxx_switch_write(bus, phy_temp, reg_temp | 1, val >> 16);
  228. if (ret < 0)
  229. return ret;
  230. ret = ag7xxx_switch_write(bus, phy_temp, reg_temp | 0, val & 0xffff);
  231. if (ret < 0)
  232. return ret;
  233. }
  234. return 0;
  235. }
  236. static int ag7xxx_mdio_rw(struct mii_dev *bus, int addr, int reg, u32 val)
  237. {
  238. u32 data;
  239. unsigned long start;
  240. int ret;
  241. /* No idea if this is long enough or too long */
  242. int timeout_ms = 1000;
  243. /* Dummy read followed by PHY read/write command. */
  244. ret = ag7xxx_switch_reg_read(bus, 0x98, &data);
  245. if (ret < 0)
  246. return ret;
  247. data = val | (reg << 16) | (addr << 21) | BIT(30) | BIT(31);
  248. ret = ag7xxx_switch_reg_write(bus, 0x98, data);
  249. if (ret < 0)
  250. return ret;
  251. start = get_timer(0);
  252. /* Wait for operation to finish */
  253. do {
  254. ret = ag7xxx_switch_reg_read(bus, 0x98, &data);
  255. if (ret < 0)
  256. return ret;
  257. if (get_timer(start) > timeout_ms)
  258. return -ETIMEDOUT;
  259. } while (data & BIT(31));
  260. return data & 0xffff;
  261. }
  262. static int ag7xxx_mdio_read(struct mii_dev *bus, int addr, int devad, int reg)
  263. {
  264. return ag7xxx_mdio_rw(bus, addr, reg, BIT(27));
  265. }
  266. static int ag7xxx_mdio_write(struct mii_dev *bus, int addr, int devad, int reg,
  267. u16 val)
  268. {
  269. int ret;
  270. ret = ag7xxx_mdio_rw(bus, addr, reg, val);
  271. if (ret < 0)
  272. return ret;
  273. return 0;
  274. }
  275. /*
  276. * DMA ring handlers
  277. */
  278. static void ag7xxx_dma_clean_tx(struct udevice *dev)
  279. {
  280. struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
  281. struct ag7xxx_dma_desc *curr, *next;
  282. u32 start, end;
  283. int i;
  284. for (i = 0; i < CONFIG_TX_DESCR_NUM; i++) {
  285. curr = &priv->tx_mac_descrtable[i];
  286. next = &priv->tx_mac_descrtable[(i + 1) % CONFIG_TX_DESCR_NUM];
  287. curr->data_addr = virt_to_phys(&priv->txbuffs[i * CONFIG_ETH_BUFSIZE]);
  288. curr->config = AG7XXX_DMADESC_IS_EMPTY;
  289. curr->next_desc = virt_to_phys(next);
  290. }
  291. priv->tx_currdescnum = 0;
  292. /* Cache: Flush descriptors, don't care about buffers. */
  293. start = (u32)(&priv->tx_mac_descrtable[0]);
  294. end = start + sizeof(priv->tx_mac_descrtable);
  295. flush_dcache_range(start, end);
  296. }
  297. static void ag7xxx_dma_clean_rx(struct udevice *dev)
  298. {
  299. struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
  300. struct ag7xxx_dma_desc *curr, *next;
  301. u32 start, end;
  302. int i;
  303. for (i = 0; i < CONFIG_RX_DESCR_NUM; i++) {
  304. curr = &priv->rx_mac_descrtable[i];
  305. next = &priv->rx_mac_descrtable[(i + 1) % CONFIG_RX_DESCR_NUM];
  306. curr->data_addr = virt_to_phys(&priv->rxbuffs[i * CONFIG_ETH_BUFSIZE]);
  307. curr->config = AG7XXX_DMADESC_IS_EMPTY;
  308. curr->next_desc = virt_to_phys(next);
  309. }
  310. priv->rx_currdescnum = 0;
  311. /* Cache: Flush+Invalidate descriptors, Invalidate buffers. */
  312. start = (u32)(&priv->rx_mac_descrtable[0]);
  313. end = start + sizeof(priv->rx_mac_descrtable);
  314. flush_dcache_range(start, end);
  315. invalidate_dcache_range(start, end);
  316. start = (u32)&priv->rxbuffs;
  317. end = start + sizeof(priv->rxbuffs);
  318. invalidate_dcache_range(start, end);
  319. }
  320. /*
  321. * Ethernet I/O
  322. */
  323. static int ag7xxx_eth_send(struct udevice *dev, void *packet, int length)
  324. {
  325. struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
  326. struct ag7xxx_dma_desc *curr;
  327. u32 start, end;
  328. curr = &priv->tx_mac_descrtable[priv->tx_currdescnum];
  329. /* Cache: Invalidate descriptor. */
  330. start = (u32)curr;
  331. end = start + sizeof(*curr);
  332. invalidate_dcache_range(start, end);
  333. if (!(curr->config & AG7XXX_DMADESC_IS_EMPTY)) {
  334. printf("ag7xxx: Out of TX DMA descriptors!\n");
  335. return -EPERM;
  336. }
  337. /* Copy the packet into the data buffer. */
  338. memcpy(phys_to_virt(curr->data_addr), packet, length);
  339. curr->config = length & AG7XXX_DMADESC_PKT_SIZE_MASK;
  340. /* Cache: Flush descriptor, Flush buffer. */
  341. start = (u32)curr;
  342. end = start + sizeof(*curr);
  343. flush_dcache_range(start, end);
  344. start = (u32)phys_to_virt(curr->data_addr);
  345. end = start + length;
  346. flush_dcache_range(start, end);
  347. /* Load the DMA descriptor and start TX DMA. */
  348. writel(AG7XXX_ETH_DMA_TX_CTRL_TXE,
  349. priv->regs + AG7XXX_ETH_DMA_TX_CTRL);
  350. /* Switch to next TX descriptor. */
  351. priv->tx_currdescnum = (priv->tx_currdescnum + 1) % CONFIG_TX_DESCR_NUM;
  352. return 0;
  353. }
  354. static int ag7xxx_eth_recv(struct udevice *dev, int flags, uchar **packetp)
  355. {
  356. struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
  357. struct ag7xxx_dma_desc *curr;
  358. u32 start, end, length;
  359. curr = &priv->rx_mac_descrtable[priv->rx_currdescnum];
  360. /* Cache: Invalidate descriptor. */
  361. start = (u32)curr;
  362. end = start + sizeof(*curr);
  363. invalidate_dcache_range(start, end);
  364. /* No packets received. */
  365. if (curr->config & AG7XXX_DMADESC_IS_EMPTY)
  366. return -EAGAIN;
  367. length = curr->config & AG7XXX_DMADESC_PKT_SIZE_MASK;
  368. /* Cache: Invalidate buffer. */
  369. start = (u32)phys_to_virt(curr->data_addr);
  370. end = start + length;
  371. invalidate_dcache_range(start, end);
  372. /* Receive one packet and return length. */
  373. *packetp = phys_to_virt(curr->data_addr);
  374. return length;
  375. }
  376. static int ag7xxx_eth_free_pkt(struct udevice *dev, uchar *packet,
  377. int length)
  378. {
  379. struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
  380. struct ag7xxx_dma_desc *curr;
  381. u32 start, end;
  382. curr = &priv->rx_mac_descrtable[priv->rx_currdescnum];
  383. curr->config = AG7XXX_DMADESC_IS_EMPTY;
  384. /* Cache: Flush descriptor. */
  385. start = (u32)curr;
  386. end = start + sizeof(*curr);
  387. flush_dcache_range(start, end);
  388. /* Switch to next RX descriptor. */
  389. priv->rx_currdescnum = (priv->rx_currdescnum + 1) % CONFIG_RX_DESCR_NUM;
  390. return 0;
  391. }
  392. static int ag7xxx_eth_start(struct udevice *dev)
  393. {
  394. struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
  395. /* FIXME: Check if link up */
  396. /* Clear the DMA rings. */
  397. ag7xxx_dma_clean_tx(dev);
  398. ag7xxx_dma_clean_rx(dev);
  399. /* Load DMA descriptors and start the RX DMA. */
  400. writel(virt_to_phys(&priv->tx_mac_descrtable[priv->tx_currdescnum]),
  401. priv->regs + AG7XXX_ETH_DMA_TX_DESC);
  402. writel(virt_to_phys(&priv->rx_mac_descrtable[priv->rx_currdescnum]),
  403. priv->regs + AG7XXX_ETH_DMA_RX_DESC);
  404. writel(AG7XXX_ETH_DMA_RX_CTRL_RXE,
  405. priv->regs + AG7XXX_ETH_DMA_RX_CTRL);
  406. return 0;
  407. }
  408. static void ag7xxx_eth_stop(struct udevice *dev)
  409. {
  410. struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
  411. /* Stop the TX DMA. */
  412. writel(0, priv->regs + AG7XXX_ETH_DMA_TX_CTRL);
  413. wait_for_bit("ag7xxx", priv->regs + AG7XXX_ETH_DMA_TX_CTRL, ~0, 0,
  414. 1000, 0);
  415. /* Stop the RX DMA. */
  416. writel(0, priv->regs + AG7XXX_ETH_DMA_RX_CTRL);
  417. wait_for_bit("ag7xxx", priv->regs + AG7XXX_ETH_DMA_RX_CTRL, ~0, 0,
  418. 1000, 0);
  419. }
  420. /*
  421. * Hardware setup
  422. */
  423. static int ag7xxx_eth_write_hwaddr(struct udevice *dev)
  424. {
  425. struct eth_pdata *pdata = dev_get_platdata(dev);
  426. struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
  427. unsigned char *mac = pdata->enetaddr;
  428. u32 macid_lo, macid_hi;
  429. macid_hi = mac[3] | (mac[2] << 8) | (mac[1] << 16) | (mac[0] << 24);
  430. macid_lo = (mac[5] << 16) | (mac[4] << 24);
  431. writel(macid_lo, priv->regs + AG7XXX_ETH_ADDR1);
  432. writel(macid_hi, priv->regs + AG7XXX_ETH_ADDR2);
  433. return 0;
  434. }
  435. static void ag7xxx_hw_setup(struct udevice *dev)
  436. {
  437. struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
  438. u32 speed;
  439. setbits_be32(priv->regs + AG7XXX_ETH_CFG1,
  440. AG7XXX_ETH_CFG1_RX_RST | AG7XXX_ETH_CFG1_TX_RST |
  441. AG7XXX_ETH_CFG1_SOFT_RST);
  442. mdelay(10);
  443. writel(AG7XXX_ETH_CFG1_RX_EN | AG7XXX_ETH_CFG1_TX_EN,
  444. priv->regs + AG7XXX_ETH_CFG1);
  445. if (priv->interface == PHY_INTERFACE_MODE_RMII)
  446. speed = AG7XXX_ETH_CFG2_IF_10_100;
  447. else
  448. speed = AG7XXX_ETH_CFG2_IF_1000;
  449. clrsetbits_be32(priv->regs + AG7XXX_ETH_CFG2,
  450. AG7XXX_ETH_CFG2_IF_SPEED_MASK,
  451. speed | AG7XXX_ETH_CFG2_PAD_CRC_EN |
  452. AG7XXX_ETH_CFG2_LEN_CHECK);
  453. writel(0xfff0000, priv->regs + AG7XXX_ETH_FIFO_CFG_1);
  454. writel(0x1fff, priv->regs + AG7XXX_ETH_FIFO_CFG_2);
  455. writel(0x1f00, priv->regs + AG7XXX_ETH_FIFO_CFG_0);
  456. setbits_be32(priv->regs + AG7XXX_ETH_FIFO_CFG_4, 0x3ffff);
  457. writel(0x10ffff, priv->regs + AG7XXX_ETH_FIFO_CFG_1);
  458. writel(0xaaa0555, priv->regs + AG7XXX_ETH_FIFO_CFG_2);
  459. writel(0x7eccf, priv->regs + AG7XXX_ETH_FIFO_CFG_5);
  460. writel(0x1f00140, priv->regs + AG7XXX_ETH_FIFO_CFG_3);
  461. }
  462. static int ag7xxx_mii_get_div(void)
  463. {
  464. ulong freq = get_bus_freq(0);
  465. switch (freq / 1000000) {
  466. case 150: return 0x7;
  467. case 175: return 0x5;
  468. case 200: return 0x4;
  469. case 210: return 0x9;
  470. case 220: return 0x9;
  471. default: return 0x7;
  472. }
  473. }
  474. static int ag7xxx_mii_setup(struct udevice *dev)
  475. {
  476. struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
  477. int i, ret, div = ag7xxx_mii_get_div();
  478. u32 reg;
  479. if (priv->model == AG7XXX_MODEL_AG933X) {
  480. /* Unit 0 is PHY-less on AR9331, see datasheet Figure 2-3 */
  481. if (priv->interface == PHY_INTERFACE_MODE_RMII)
  482. return 0;
  483. }
  484. if (priv->model == AG7XXX_MODEL_AG934X) {
  485. writel(AG7XXX_ETH_MII_MGMT_CFG_RESET | 0x4,
  486. priv->regs + AG7XXX_ETH_MII_MGMT_CFG);
  487. writel(0x4, priv->regs + AG7XXX_ETH_MII_MGMT_CFG);
  488. return 0;
  489. }
  490. for (i = 0; i < 10; i++) {
  491. writel(AG7XXX_ETH_MII_MGMT_CFG_RESET | div,
  492. priv->regs + AG7XXX_ETH_MII_MGMT_CFG);
  493. writel(div, priv->regs + AG7XXX_ETH_MII_MGMT_CFG);
  494. /* Check the switch */
  495. ret = ag7xxx_switch_reg_read(priv->bus, 0x10c, &reg);
  496. if (ret)
  497. continue;
  498. if (reg != 0x18007fff)
  499. continue;
  500. return 0;
  501. }
  502. return -EINVAL;
  503. }
  504. static int ag933x_phy_setup_wan(struct udevice *dev)
  505. {
  506. struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
  507. /* Configure switch port 4 (GMAC0) */
  508. return ag7xxx_mdio_write(priv->bus, 4, 0, MII_BMCR, 0x9000);
  509. }
  510. static int ag933x_phy_setup_lan(struct udevice *dev)
  511. {
  512. struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
  513. int i, ret;
  514. u32 reg;
  515. /* Reset the switch */
  516. ret = ag7xxx_switch_reg_read(priv->bus, 0, &reg);
  517. if (ret)
  518. return ret;
  519. reg |= BIT(31);
  520. ret = ag7xxx_switch_reg_write(priv->bus, 0, reg);
  521. if (ret)
  522. return ret;
  523. do {
  524. ret = ag7xxx_switch_reg_read(priv->bus, 0, &reg);
  525. if (ret)
  526. return ret;
  527. } while (reg & BIT(31));
  528. /* Configure switch ports 0...3 (GMAC1) */
  529. for (i = 0; i < 4; i++) {
  530. ret = ag7xxx_mdio_write(priv->bus, 0x4, 0, MII_BMCR, 0x9000);
  531. if (ret)
  532. return ret;
  533. }
  534. /* Enable CPU port */
  535. ret = ag7xxx_switch_reg_write(priv->bus, 0x78, BIT(8));
  536. if (ret)
  537. return ret;
  538. for (i = 0; i < 4; i++) {
  539. ret = ag7xxx_switch_reg_write(priv->bus, i * 0x100, BIT(9));
  540. if (ret)
  541. return ret;
  542. }
  543. /* QM Control */
  544. ret = ag7xxx_switch_reg_write(priv->bus, 0x38, 0xc000050e);
  545. if (ret)
  546. return ret;
  547. /* Disable Atheros header */
  548. ret = ag7xxx_switch_reg_write(priv->bus, 0x104, 0x4004);
  549. if (ret)
  550. return ret;
  551. /* Tag priority mapping */
  552. ret = ag7xxx_switch_reg_write(priv->bus, 0x70, 0xfa50);
  553. if (ret)
  554. return ret;
  555. /* Enable ARP packets to the CPU */
  556. ret = ag7xxx_switch_reg_read(priv->bus, 0x5c, &reg);
  557. if (ret)
  558. return ret;
  559. reg |= 0x100000;
  560. ret = ag7xxx_switch_reg_write(priv->bus, 0x5c, reg);
  561. if (ret)
  562. return ret;
  563. return 0;
  564. }
  565. static int ag933x_phy_setup_reset_set(struct udevice *dev, int port)
  566. {
  567. struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
  568. int ret;
  569. ret = ag7xxx_mdio_write(priv->bus, port, 0, MII_ADVERTISE,
  570. ADVERTISE_ALL | ADVERTISE_PAUSE_CAP |
  571. ADVERTISE_PAUSE_ASYM);
  572. if (ret)
  573. return ret;
  574. if (priv->model == AG7XXX_MODEL_AG934X) {
  575. ret = ag7xxx_mdio_write(priv->bus, port, 0, MII_CTRL1000,
  576. ADVERTISE_1000FULL);
  577. if (ret)
  578. return ret;
  579. }
  580. return ag7xxx_mdio_write(priv->bus, port, 0, MII_BMCR,
  581. BMCR_ANENABLE | BMCR_RESET);
  582. }
  583. static int ag933x_phy_setup_reset_fin(struct udevice *dev, int port)
  584. {
  585. struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
  586. int ret;
  587. do {
  588. ret = ag7xxx_mdio_read(priv->bus, port, 0, MII_BMCR);
  589. if (ret < 0)
  590. return ret;
  591. mdelay(10);
  592. } while (ret & BMCR_RESET);
  593. return 0;
  594. }
  595. static int ag933x_phy_setup_common(struct udevice *dev)
  596. {
  597. struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
  598. int i, ret, phymax;
  599. if (priv->model == AG7XXX_MODEL_AG933X)
  600. phymax = 4;
  601. else if (priv->model == AG7XXX_MODEL_AG934X)
  602. phymax = 5;
  603. else
  604. return -EINVAL;
  605. if (priv->interface == PHY_INTERFACE_MODE_RMII) {
  606. ret = ag933x_phy_setup_reset_set(dev, phymax);
  607. if (ret)
  608. return ret;
  609. ret = ag933x_phy_setup_reset_fin(dev, phymax);
  610. if (ret)
  611. return ret;
  612. /* Read out link status */
  613. ret = ag7xxx_mdio_read(priv->bus, phymax, 0, MII_MIPSCR);
  614. if (ret < 0)
  615. return ret;
  616. return 0;
  617. }
  618. /* Switch ports */
  619. for (i = 0; i < phymax; i++) {
  620. ret = ag933x_phy_setup_reset_set(dev, i);
  621. if (ret)
  622. return ret;
  623. }
  624. for (i = 0; i < phymax; i++) {
  625. ret = ag933x_phy_setup_reset_fin(dev, i);
  626. if (ret)
  627. return ret;
  628. }
  629. for (i = 0; i < phymax; i++) {
  630. /* Read out link status */
  631. ret = ag7xxx_mdio_read(priv->bus, i, 0, MII_MIPSCR);
  632. if (ret < 0)
  633. return ret;
  634. }
  635. return 0;
  636. }
  637. static int ag934x_phy_setup(struct udevice *dev)
  638. {
  639. struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
  640. int i, ret;
  641. u32 reg;
  642. ret = ag7xxx_switch_reg_write(priv->bus, 0x624, 0x7f7f7f7f);
  643. if (ret)
  644. return ret;
  645. ret = ag7xxx_switch_reg_write(priv->bus, 0x10, 0x40000000);
  646. if (ret)
  647. return ret;
  648. ret = ag7xxx_switch_reg_write(priv->bus, 0x4, 0x07600000);
  649. if (ret)
  650. return ret;
  651. ret = ag7xxx_switch_reg_write(priv->bus, 0xc, 0x01000000);
  652. if (ret)
  653. return ret;
  654. ret = ag7xxx_switch_reg_write(priv->bus, 0x7c, 0x0000007e);
  655. if (ret)
  656. return ret;
  657. /* AR8327/AR8328 v1.0 fixup */
  658. ret = ag7xxx_switch_reg_read(priv->bus, 0, &reg);
  659. if (ret)
  660. return ret;
  661. if ((reg & 0xffff) == 0x1201) {
  662. for (i = 0; i < 5; i++) {
  663. ret = ag7xxx_mdio_write(priv->bus, i, 0, 0x1d, 0x0);
  664. if (ret)
  665. return ret;
  666. ret = ag7xxx_mdio_write(priv->bus, i, 0, 0x1e, 0x02ea);
  667. if (ret)
  668. return ret;
  669. ret = ag7xxx_mdio_write(priv->bus, i, 0, 0x1d, 0x3d);
  670. if (ret)
  671. return ret;
  672. ret = ag7xxx_mdio_write(priv->bus, i, 0, 0x1e, 0x68a0);
  673. if (ret)
  674. return ret;
  675. }
  676. }
  677. ret = ag7xxx_switch_reg_read(priv->bus, 0x66c, &reg);
  678. if (ret)
  679. return ret;
  680. reg &= ~0x70000;
  681. ret = ag7xxx_switch_reg_write(priv->bus, 0x66c, reg);
  682. if (ret)
  683. return ret;
  684. return 0;
  685. }
  686. static int ag7xxx_mac_probe(struct udevice *dev)
  687. {
  688. struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
  689. int ret;
  690. ag7xxx_hw_setup(dev);
  691. ret = ag7xxx_mii_setup(dev);
  692. if (ret)
  693. return ret;
  694. ag7xxx_eth_write_hwaddr(dev);
  695. if (priv->model == AG7XXX_MODEL_AG933X) {
  696. if (priv->interface == PHY_INTERFACE_MODE_RMII)
  697. ret = ag933x_phy_setup_wan(dev);
  698. else
  699. ret = ag933x_phy_setup_lan(dev);
  700. } else if (priv->model == AG7XXX_MODEL_AG934X) {
  701. ret = ag934x_phy_setup(dev);
  702. } else {
  703. return -EINVAL;
  704. }
  705. if (ret)
  706. return ret;
  707. return ag933x_phy_setup_common(dev);
  708. }
  709. static int ag7xxx_mdio_probe(struct udevice *dev)
  710. {
  711. struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
  712. struct mii_dev *bus = mdio_alloc();
  713. if (!bus)
  714. return -ENOMEM;
  715. bus->read = ag7xxx_mdio_read;
  716. bus->write = ag7xxx_mdio_write;
  717. snprintf(bus->name, sizeof(bus->name), dev->name);
  718. bus->priv = (void *)priv;
  719. return mdio_register(bus);
  720. }
  721. static int ag7xxx_get_phy_iface_offset(struct udevice *dev)
  722. {
  723. int offset;
  724. offset = fdtdec_lookup_phandle(gd->fdt_blob, dev_of_offset(dev), "phy");
  725. if (offset <= 0) {
  726. debug("%s: PHY OF node not found (ret=%i)\n", __func__, offset);
  727. return -EINVAL;
  728. }
  729. offset = fdt_parent_offset(gd->fdt_blob, offset);
  730. if (offset <= 0) {
  731. debug("%s: PHY OF node parent MDIO bus not found (ret=%i)\n",
  732. __func__, offset);
  733. return -EINVAL;
  734. }
  735. offset = fdt_parent_offset(gd->fdt_blob, offset);
  736. if (offset <= 0) {
  737. debug("%s: PHY MDIO OF node parent MAC not found (ret=%i)\n",
  738. __func__, offset);
  739. return -EINVAL;
  740. }
  741. return offset;
  742. }
  743. static int ag7xxx_eth_probe(struct udevice *dev)
  744. {
  745. struct eth_pdata *pdata = dev_get_platdata(dev);
  746. struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
  747. void __iomem *iobase, *phyiobase;
  748. int ret, phyreg;
  749. /* Decoding of convoluted PHY wiring on Atheros MIPS. */
  750. ret = ag7xxx_get_phy_iface_offset(dev);
  751. if (ret <= 0)
  752. return ret;
  753. phyreg = fdtdec_get_int(gd->fdt_blob, ret, "reg", -1);
  754. iobase = map_physmem(pdata->iobase, 0x200, MAP_NOCACHE);
  755. phyiobase = map_physmem(phyreg, 0x200, MAP_NOCACHE);
  756. debug("%s, iobase=%p, phyiobase=%p, priv=%p\n",
  757. __func__, iobase, phyiobase, priv);
  758. priv->regs = iobase;
  759. priv->phyregs = phyiobase;
  760. priv->interface = pdata->phy_interface;
  761. priv->model = dev_get_driver_data(dev);
  762. ret = ag7xxx_mdio_probe(dev);
  763. if (ret)
  764. return ret;
  765. priv->bus = miiphy_get_dev_by_name(dev->name);
  766. ret = ag7xxx_mac_probe(dev);
  767. debug("%s, ret=%d\n", __func__, ret);
  768. return ret;
  769. }
  770. static int ag7xxx_eth_remove(struct udevice *dev)
  771. {
  772. struct ar7xxx_eth_priv *priv = dev_get_priv(dev);
  773. free(priv->phydev);
  774. mdio_unregister(priv->bus);
  775. mdio_free(priv->bus);
  776. return 0;
  777. }
  778. static const struct eth_ops ag7xxx_eth_ops = {
  779. .start = ag7xxx_eth_start,
  780. .send = ag7xxx_eth_send,
  781. .recv = ag7xxx_eth_recv,
  782. .free_pkt = ag7xxx_eth_free_pkt,
  783. .stop = ag7xxx_eth_stop,
  784. .write_hwaddr = ag7xxx_eth_write_hwaddr,
  785. };
  786. static int ag7xxx_eth_ofdata_to_platdata(struct udevice *dev)
  787. {
  788. struct eth_pdata *pdata = dev_get_platdata(dev);
  789. const char *phy_mode;
  790. int ret;
  791. pdata->iobase = devfdt_get_addr(dev);
  792. pdata->phy_interface = -1;
  793. /* Decoding of convoluted PHY wiring on Atheros MIPS. */
  794. ret = ag7xxx_get_phy_iface_offset(dev);
  795. if (ret <= 0)
  796. return ret;
  797. phy_mode = fdt_getprop(gd->fdt_blob, ret, "phy-mode", NULL);
  798. if (phy_mode)
  799. pdata->phy_interface = phy_get_interface_by_name(phy_mode);
  800. if (pdata->phy_interface == -1) {
  801. debug("%s: Invalid PHY interface '%s'\n", __func__, phy_mode);
  802. return -EINVAL;
  803. }
  804. return 0;
  805. }
  806. static const struct udevice_id ag7xxx_eth_ids[] = {
  807. { .compatible = "qca,ag933x-mac", .data = AG7XXX_MODEL_AG933X },
  808. { .compatible = "qca,ag934x-mac", .data = AG7XXX_MODEL_AG934X },
  809. { }
  810. };
  811. U_BOOT_DRIVER(eth_ag7xxx) = {
  812. .name = "eth_ag7xxx",
  813. .id = UCLASS_ETH,
  814. .of_match = ag7xxx_eth_ids,
  815. .ofdata_to_platdata = ag7xxx_eth_ofdata_to_platdata,
  816. .probe = ag7xxx_eth_probe,
  817. .remove = ag7xxx_eth_remove,
  818. .ops = &ag7xxx_eth_ops,
  819. .priv_auto_alloc_size = sizeof(struct ar7xxx_eth_priv),
  820. .platdata_auto_alloc_size = sizeof(struct eth_pdata),
  821. .flags = DM_FLAG_ALLOC_PRIV_DMA,
  822. };