ag7xxx.c 24 KB

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