mvgbe.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * (C) Copyright 2009
  4. * Marvell Semiconductor <www.marvell.com>
  5. * Written-by: Prafulla Wadaskar <prafulla@marvell.com>
  6. *
  7. * (C) Copyright 2003
  8. * Ingo Assmus <ingo.assmus@keymile.com>
  9. *
  10. * based on - Driver for MV64360X ethernet ports
  11. * Copyright (C) 2002 rabeeh@galileo.co.il
  12. */
  13. #include <common.h>
  14. #include <dm.h>
  15. #include <log.h>
  16. #include <net.h>
  17. #include <malloc.h>
  18. #include <miiphy.h>
  19. #include <wait_bit.h>
  20. #include <asm/global_data.h>
  21. #include <asm/io.h>
  22. #include <linux/delay.h>
  23. #include <linux/errno.h>
  24. #include <asm/types.h>
  25. #include <asm/system.h>
  26. #include <asm/byteorder.h>
  27. #include <asm/arch/cpu.h>
  28. #if defined(CONFIG_ARCH_KIRKWOOD)
  29. #include <asm/arch/soc.h>
  30. #elif defined(CONFIG_ARCH_ORION5X)
  31. #include <asm/arch/orion5x.h>
  32. #endif
  33. #include "mvgbe.h"
  34. DECLARE_GLOBAL_DATA_PTR;
  35. #define MV_PHY_ADR_REQUEST 0xee
  36. #define MVGBE_SMI_REG (((struct mvgbe_registers *)MVGBE0_BASE)->smi)
  37. #define MVGBE_PGADR_REG 22
  38. #if defined(CONFIG_PHYLIB) || defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
  39. static int smi_wait_ready(struct mvgbe_device *dmvgbe)
  40. {
  41. int ret;
  42. ret = wait_for_bit_le32(&MVGBE_SMI_REG, MVGBE_PHY_SMI_BUSY_MASK, false,
  43. MVGBE_PHY_SMI_TIMEOUT_MS, false);
  44. if (ret) {
  45. printf("Error: SMI busy timeout\n");
  46. return ret;
  47. }
  48. return 0;
  49. }
  50. static int __mvgbe_mdio_read(struct mvgbe_device *dmvgbe, int phy_adr,
  51. int devad, int reg_ofs)
  52. {
  53. struct mvgbe_registers *regs = dmvgbe->regs;
  54. u32 smi_reg;
  55. u32 timeout;
  56. u16 data = 0;
  57. /* Phyadr read request */
  58. if (phy_adr == MV_PHY_ADR_REQUEST &&
  59. reg_ofs == MV_PHY_ADR_REQUEST) {
  60. /* */
  61. data = (u16) (MVGBE_REG_RD(regs->phyadr) & PHYADR_MASK);
  62. return data;
  63. }
  64. /* check parameters */
  65. if (phy_adr > PHYADR_MASK) {
  66. printf("Err..(%s) Invalid PHY address %d\n",
  67. __func__, phy_adr);
  68. return -EFAULT;
  69. }
  70. if (reg_ofs > PHYREG_MASK) {
  71. printf("Err..(%s) Invalid register offset %d\n",
  72. __func__, reg_ofs);
  73. return -EFAULT;
  74. }
  75. /* wait till the SMI is not busy */
  76. if (smi_wait_ready(dmvgbe) < 0)
  77. return -EFAULT;
  78. /* fill the phy address and regiser offset and read opcode */
  79. smi_reg = (phy_adr << MVGBE_PHY_SMI_DEV_ADDR_OFFS)
  80. | (reg_ofs << MVGBE_SMI_REG_ADDR_OFFS)
  81. | MVGBE_PHY_SMI_OPCODE_READ;
  82. /* write the smi register */
  83. MVGBE_REG_WR(MVGBE_SMI_REG, smi_reg);
  84. /*wait till read value is ready */
  85. timeout = MVGBE_PHY_SMI_TIMEOUT;
  86. do {
  87. /* read smi register */
  88. smi_reg = MVGBE_REG_RD(MVGBE_SMI_REG);
  89. if (timeout-- == 0) {
  90. printf("Err..(%s) SMI read ready timeout\n",
  91. __func__);
  92. return -EFAULT;
  93. }
  94. } while (!(smi_reg & MVGBE_PHY_SMI_READ_VALID_MASK));
  95. /* Wait for the data to update in the SMI register */
  96. for (timeout = 0; timeout < MVGBE_PHY_SMI_TIMEOUT; timeout++)
  97. ;
  98. data = (u16) (MVGBE_REG_RD(MVGBE_SMI_REG) & MVGBE_PHY_SMI_DATA_MASK);
  99. debug("%s:(adr %d, off %d) value= %04x\n", __func__, phy_adr, reg_ofs,
  100. data);
  101. return data;
  102. }
  103. /*
  104. * smi_reg_read - miiphy_read callback function.
  105. *
  106. * Returns 16bit phy register value, or -EFAULT on error
  107. */
  108. static int smi_reg_read(struct mii_dev *bus, int phy_adr, int devad,
  109. int reg_ofs)
  110. {
  111. struct mvgbe_device *dmvgbe = bus->priv;
  112. return __mvgbe_mdio_read(dmvgbe, phy_adr, devad, reg_ofs);
  113. }
  114. static int __mvgbe_mdio_write(struct mvgbe_device *dmvgbe, int phy_adr,
  115. int devad, int reg_ofs, u16 data)
  116. {
  117. struct mvgbe_registers *regs = dmvgbe->regs;
  118. u32 smi_reg;
  119. /* Phyadr write request*/
  120. if (phy_adr == MV_PHY_ADR_REQUEST &&
  121. reg_ofs == MV_PHY_ADR_REQUEST) {
  122. MVGBE_REG_WR(regs->phyadr, data);
  123. return 0;
  124. }
  125. /* check parameters */
  126. if (phy_adr > PHYADR_MASK) {
  127. printf("Err..(%s) Invalid phy address\n", __func__);
  128. return -EINVAL;
  129. }
  130. if (reg_ofs > PHYREG_MASK) {
  131. printf("Err..(%s) Invalid register offset\n", __func__);
  132. return -EFAULT;
  133. }
  134. /* wait till the SMI is not busy */
  135. if (smi_wait_ready(dmvgbe) < 0)
  136. return -EFAULT;
  137. /* fill the phy addr and reg offset and write opcode and data */
  138. smi_reg = (data << MVGBE_PHY_SMI_DATA_OFFS);
  139. smi_reg |= (phy_adr << MVGBE_PHY_SMI_DEV_ADDR_OFFS)
  140. | (reg_ofs << MVGBE_SMI_REG_ADDR_OFFS);
  141. smi_reg &= ~MVGBE_PHY_SMI_OPCODE_READ;
  142. /* write the smi register */
  143. MVGBE_REG_WR(MVGBE_SMI_REG, smi_reg);
  144. return 0;
  145. }
  146. /*
  147. * smi_reg_write - miiphy_write callback function.
  148. *
  149. * Returns 0 if write succeed, -EFAULT on error
  150. */
  151. static int smi_reg_write(struct mii_dev *bus, int phy_adr, int devad,
  152. int reg_ofs, u16 data)
  153. {
  154. struct mvgbe_device *dmvgbe = bus->priv;
  155. return __mvgbe_mdio_write(dmvgbe, phy_adr, devad, reg_ofs, data);
  156. }
  157. #endif
  158. /* Stop and checks all queues */
  159. static void stop_queue(u32 * qreg)
  160. {
  161. u32 reg_data;
  162. reg_data = readl(qreg);
  163. if (reg_data & 0xFF) {
  164. /* Issue stop command for active channels only */
  165. writel((reg_data << 8), qreg);
  166. /* Wait for all queue activity to terminate. */
  167. do {
  168. /*
  169. * Check port cause register that all queues
  170. * are stopped
  171. */
  172. reg_data = readl(qreg);
  173. }
  174. while (reg_data & 0xFF);
  175. }
  176. }
  177. /*
  178. * set_access_control - Config address decode parameters for Ethernet unit
  179. *
  180. * This function configures the address decode parameters for the Gigabit
  181. * Ethernet Controller according the given parameters struct.
  182. *
  183. * @regs Register struct pointer.
  184. * @param Address decode parameter struct.
  185. */
  186. static void set_access_control(struct mvgbe_registers *regs,
  187. struct mvgbe_winparam *param)
  188. {
  189. u32 access_prot_reg;
  190. /* Set access control register */
  191. access_prot_reg = MVGBE_REG_RD(regs->epap);
  192. /* clear window permission */
  193. access_prot_reg &= (~(3 << (param->win * 2)));
  194. access_prot_reg |= (param->access_ctrl << (param->win * 2));
  195. MVGBE_REG_WR(regs->epap, access_prot_reg);
  196. /* Set window Size reg (SR) */
  197. MVGBE_REG_WR(regs->barsz[param->win].size,
  198. (((param->size / 0x10000) - 1) << 16));
  199. /* Set window Base address reg (BA) */
  200. MVGBE_REG_WR(regs->barsz[param->win].bar,
  201. (param->target | param->attrib | param->base_addr));
  202. /* High address remap reg (HARR) */
  203. if (param->win < 4)
  204. MVGBE_REG_WR(regs->ha_remap[param->win], param->high_addr);
  205. /* Base address enable reg (BARER) */
  206. if (param->enable == 1)
  207. MVGBE_REG_BITS_RESET(regs->bare, (1 << param->win));
  208. else
  209. MVGBE_REG_BITS_SET(regs->bare, (1 << param->win));
  210. }
  211. static void set_dram_access(struct mvgbe_registers *regs)
  212. {
  213. struct mvgbe_winparam win_param;
  214. int i;
  215. for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
  216. /* Set access parameters for DRAM bank i */
  217. win_param.win = i; /* Use Ethernet window i */
  218. /* Window target - DDR */
  219. win_param.target = MVGBE_TARGET_DRAM;
  220. /* Enable full access */
  221. win_param.access_ctrl = EWIN_ACCESS_FULL;
  222. win_param.high_addr = 0;
  223. /* Get bank base and size */
  224. win_param.base_addr = gd->bd->bi_dram[i].start;
  225. win_param.size = gd->bd->bi_dram[i].size;
  226. if (win_param.size == 0)
  227. win_param.enable = 0;
  228. else
  229. win_param.enable = 1; /* Enable the access */
  230. /* Enable DRAM bank */
  231. switch (i) {
  232. case 0:
  233. win_param.attrib = EBAR_DRAM_CS0;
  234. break;
  235. case 1:
  236. win_param.attrib = EBAR_DRAM_CS1;
  237. break;
  238. case 2:
  239. win_param.attrib = EBAR_DRAM_CS2;
  240. break;
  241. case 3:
  242. win_param.attrib = EBAR_DRAM_CS3;
  243. break;
  244. default:
  245. /* invalid bank, disable access */
  246. win_param.enable = 0;
  247. win_param.attrib = 0;
  248. break;
  249. }
  250. /* Set the access control for address window(EPAPR) RD/WR */
  251. set_access_control(regs, &win_param);
  252. }
  253. }
  254. /*
  255. * port_init_mac_tables - Clear all entrance in the UC, SMC and OMC tables
  256. *
  257. * Go through all the DA filter tables (Unicast, Special Multicast & Other
  258. * Multicast) and set each entry to 0.
  259. */
  260. static void port_init_mac_tables(struct mvgbe_registers *regs)
  261. {
  262. int table_index;
  263. /* Clear DA filter unicast table (Ex_dFUT) */
  264. for (table_index = 0; table_index < 4; ++table_index)
  265. MVGBE_REG_WR(regs->dfut[table_index], 0);
  266. for (table_index = 0; table_index < 64; ++table_index) {
  267. /* Clear DA filter special multicast table (Ex_dFSMT) */
  268. MVGBE_REG_WR(regs->dfsmt[table_index], 0);
  269. /* Clear DA filter other multicast table (Ex_dFOMT) */
  270. MVGBE_REG_WR(regs->dfomt[table_index], 0);
  271. }
  272. }
  273. /*
  274. * port_uc_addr - This function Set the port unicast address table
  275. *
  276. * This function locates the proper entry in the Unicast table for the
  277. * specified MAC nibble and sets its properties according to function
  278. * parameters.
  279. * This function add/removes MAC addresses from the port unicast address
  280. * table.
  281. *
  282. * @uc_nibble Unicast MAC Address last nibble.
  283. * @option 0 = Add, 1 = remove address.
  284. *
  285. * RETURN: 1 if output succeeded. 0 if option parameter is invalid.
  286. */
  287. static int port_uc_addr(struct mvgbe_registers *regs, u8 uc_nibble,
  288. int option)
  289. {
  290. u32 unicast_reg;
  291. u32 tbl_offset;
  292. u32 reg_offset;
  293. /* Locate the Unicast table entry */
  294. uc_nibble = (0xf & uc_nibble);
  295. /* Register offset from unicast table base */
  296. tbl_offset = (uc_nibble / 4);
  297. /* Entry offset within the above register */
  298. reg_offset = uc_nibble % 4;
  299. switch (option) {
  300. case REJECT_MAC_ADDR:
  301. /*
  302. * Clear accepts frame bit at specified unicast
  303. * DA table entry
  304. */
  305. unicast_reg = MVGBE_REG_RD(regs->dfut[tbl_offset]);
  306. unicast_reg &= (0xFF << (8 * reg_offset));
  307. MVGBE_REG_WR(regs->dfut[tbl_offset], unicast_reg);
  308. break;
  309. case ACCEPT_MAC_ADDR:
  310. /* Set accepts frame bit at unicast DA filter table entry */
  311. unicast_reg = MVGBE_REG_RD(regs->dfut[tbl_offset]);
  312. unicast_reg &= (0xFF << (8 * reg_offset));
  313. unicast_reg |= ((0x01 | (RXUQ << 1)) << (8 * reg_offset));
  314. MVGBE_REG_WR(regs->dfut[tbl_offset], unicast_reg);
  315. break;
  316. default:
  317. return 0;
  318. }
  319. return 1;
  320. }
  321. /*
  322. * port_uc_addr_set - This function Set the port Unicast address.
  323. */
  324. static void port_uc_addr_set(struct mvgbe_device *dmvgbe, u8 *p_addr)
  325. {
  326. struct mvgbe_registers *regs = dmvgbe->regs;
  327. u32 mac_h;
  328. u32 mac_l;
  329. mac_l = (p_addr[4] << 8) | (p_addr[5]);
  330. mac_h = (p_addr[0] << 24) | (p_addr[1] << 16) | (p_addr[2] << 8) |
  331. (p_addr[3] << 0);
  332. MVGBE_REG_WR(regs->macal, mac_l);
  333. MVGBE_REG_WR(regs->macah, mac_h);
  334. /* Accept frames of this address */
  335. port_uc_addr(regs, p_addr[5], ACCEPT_MAC_ADDR);
  336. }
  337. /*
  338. * mvgbe_init_rx_desc_ring - Curve a Rx chain desc list and buffer in memory.
  339. */
  340. static void mvgbe_init_rx_desc_ring(struct mvgbe_device *dmvgbe)
  341. {
  342. struct mvgbe_rxdesc *p_rx_desc;
  343. int i;
  344. /* initialize the Rx descriptors ring */
  345. p_rx_desc = dmvgbe->p_rxdesc;
  346. for (i = 0; i < RINGSZ; i++) {
  347. p_rx_desc->cmd_sts =
  348. MVGBE_BUFFER_OWNED_BY_DMA | MVGBE_RX_EN_INTERRUPT;
  349. p_rx_desc->buf_size = PKTSIZE_ALIGN;
  350. p_rx_desc->byte_cnt = 0;
  351. p_rx_desc->buf_ptr = dmvgbe->p_rxbuf + i * PKTSIZE_ALIGN;
  352. if (i == (RINGSZ - 1))
  353. p_rx_desc->nxtdesc_p = dmvgbe->p_rxdesc;
  354. else {
  355. p_rx_desc->nxtdesc_p = (struct mvgbe_rxdesc *)
  356. ((u32) p_rx_desc + MV_RXQ_DESC_ALIGNED_SIZE);
  357. p_rx_desc = p_rx_desc->nxtdesc_p;
  358. }
  359. }
  360. dmvgbe->p_rxdesc_curr = dmvgbe->p_rxdesc;
  361. }
  362. static int __mvgbe_init(struct mvgbe_device *dmvgbe, u8 *enetaddr,
  363. const char *name)
  364. {
  365. struct mvgbe_registers *regs = dmvgbe->regs;
  366. /* setup RX rings */
  367. mvgbe_init_rx_desc_ring(dmvgbe);
  368. /* Clear the ethernet port interrupts */
  369. MVGBE_REG_WR(regs->ic, 0);
  370. MVGBE_REG_WR(regs->ice, 0);
  371. /* Unmask RX buffer and TX end interrupt */
  372. MVGBE_REG_WR(regs->pim, INT_CAUSE_UNMASK_ALL);
  373. /* Unmask phy and link status changes interrupts */
  374. MVGBE_REG_WR(regs->peim, INT_CAUSE_UNMASK_ALL_EXT);
  375. set_dram_access(regs);
  376. port_init_mac_tables(regs);
  377. port_uc_addr_set(dmvgbe, enetaddr);
  378. /* Assign port configuration and command. */
  379. MVGBE_REG_WR(regs->pxc, PRT_CFG_VAL);
  380. MVGBE_REG_WR(regs->pxcx, PORT_CFG_EXTEND_VALUE);
  381. MVGBE_REG_WR(regs->psc0, PORT_SERIAL_CONTROL_VALUE);
  382. /* Assign port SDMA configuration */
  383. MVGBE_REG_WR(regs->sdc, PORT_SDMA_CFG_VALUE);
  384. MVGBE_REG_WR(regs->tqx[0].qxttbc, QTKNBKT_DEF_VAL);
  385. MVGBE_REG_WR(regs->tqx[0].tqxtbc,
  386. (QMTBS_DEF_VAL << 16) | QTKNRT_DEF_VAL);
  387. /* Turn off the port/RXUQ bandwidth limitation */
  388. MVGBE_REG_WR(regs->pmtu, 0);
  389. /* Set maximum receive buffer to 9700 bytes */
  390. MVGBE_REG_WR(regs->psc0, MVGBE_MAX_RX_PACKET_9700BYTE
  391. | (MVGBE_REG_RD(regs->psc0) & MRU_MASK));
  392. /* Enable port initially */
  393. MVGBE_REG_BITS_SET(regs->psc0, MVGBE_SERIAL_PORT_EN);
  394. /*
  395. * Set ethernet MTU for leaky bucket mechanism to 0 - this will
  396. * disable the leaky bucket mechanism .
  397. */
  398. MVGBE_REG_WR(regs->pmtu, 0);
  399. /* Assignment of Rx CRDB of given RXUQ */
  400. MVGBE_REG_WR(regs->rxcdp[RXUQ], (u32) dmvgbe->p_rxdesc_curr);
  401. /* ensure previous write is done before enabling Rx DMA */
  402. isb();
  403. /* Enable port Rx. */
  404. MVGBE_REG_WR(regs->rqc, (1 << RXUQ));
  405. return 0;
  406. }
  407. static void __mvgbe_halt(struct mvgbe_device *dmvgbe)
  408. {
  409. struct mvgbe_registers *regs = dmvgbe->regs;
  410. /* Disable all gigE address decoder */
  411. MVGBE_REG_WR(regs->bare, 0x3f);
  412. stop_queue(&regs->tqc);
  413. stop_queue(&regs->rqc);
  414. /* Disable port */
  415. MVGBE_REG_BITS_RESET(regs->psc0, MVGBE_SERIAL_PORT_EN);
  416. /* Set port is not reset */
  417. MVGBE_REG_BITS_RESET(regs->psc1, 1 << 4);
  418. #ifdef CONFIG_SYS_MII_MODE
  419. /* Set MMI interface up */
  420. MVGBE_REG_BITS_RESET(regs->psc1, 1 << 3);
  421. #endif
  422. /* Disable & mask ethernet port interrupts */
  423. MVGBE_REG_WR(regs->ic, 0);
  424. MVGBE_REG_WR(regs->ice, 0);
  425. MVGBE_REG_WR(regs->pim, 0);
  426. MVGBE_REG_WR(regs->peim, 0);
  427. }
  428. static int mvgbe_write_hwaddr(struct udevice *dev)
  429. {
  430. struct eth_pdata *pdata = dev_get_plat(dev);
  431. port_uc_addr_set(dev_get_priv(dev), pdata->enetaddr);
  432. return 0;
  433. }
  434. static int __mvgbe_send(struct mvgbe_device *dmvgbe, void *dataptr,
  435. int datasize)
  436. {
  437. struct mvgbe_registers *regs = dmvgbe->regs;
  438. struct mvgbe_txdesc *p_txdesc = dmvgbe->p_txdesc;
  439. void *p = (void *)dataptr;
  440. u32 cmd_sts;
  441. u32 txuq0_reg_addr;
  442. /* Copy buffer if it's misaligned */
  443. if ((u32) dataptr & 0x07) {
  444. if (datasize > PKTSIZE_ALIGN) {
  445. printf("Non-aligned data too large (%d)\n",
  446. datasize);
  447. return -1;
  448. }
  449. memcpy(dmvgbe->p_aligned_txbuf, p, datasize);
  450. p = dmvgbe->p_aligned_txbuf;
  451. }
  452. p_txdesc->cmd_sts = MVGBE_ZERO_PADDING | MVGBE_GEN_CRC;
  453. p_txdesc->cmd_sts |= MVGBE_TX_FIRST_DESC | MVGBE_TX_LAST_DESC;
  454. p_txdesc->cmd_sts |= MVGBE_BUFFER_OWNED_BY_DMA;
  455. p_txdesc->cmd_sts |= MVGBE_TX_EN_INTERRUPT;
  456. p_txdesc->buf_ptr = (u8 *) p;
  457. p_txdesc->byte_cnt = datasize;
  458. /* Set this tc desc as zeroth TXUQ */
  459. txuq0_reg_addr = (u32)&regs->tcqdp[TXUQ];
  460. writel((u32) p_txdesc, txuq0_reg_addr);
  461. /* ensure tx desc writes above are performed before we start Tx DMA */
  462. isb();
  463. /* Apply send command using zeroth TXUQ */
  464. MVGBE_REG_WR(regs->tqc, (1 << TXUQ));
  465. /*
  466. * wait for packet xmit completion
  467. */
  468. cmd_sts = readl(&p_txdesc->cmd_sts);
  469. while (cmd_sts & MVGBE_BUFFER_OWNED_BY_DMA) {
  470. /* return fail if error is detected */
  471. if ((cmd_sts & (MVGBE_ERROR_SUMMARY | MVGBE_TX_LAST_FRAME)) ==
  472. (MVGBE_ERROR_SUMMARY | MVGBE_TX_LAST_FRAME) &&
  473. cmd_sts & (MVGBE_UR_ERROR | MVGBE_RL_ERROR)) {
  474. printf("Err..(%s) in xmit packet\n", __func__);
  475. return -1;
  476. }
  477. cmd_sts = readl(&p_txdesc->cmd_sts);
  478. };
  479. return 0;
  480. }
  481. static int __mvgbe_recv(struct mvgbe_device *dmvgbe, uchar **packetp)
  482. {
  483. struct mvgbe_rxdesc *p_rxdesc_curr = dmvgbe->p_rxdesc_curr;
  484. u32 cmd_sts;
  485. u32 timeout = 0;
  486. u32 rxdesc_curr_addr;
  487. unsigned char *data;
  488. int rx_bytes = 0;
  489. *packetp = NULL;
  490. /* wait untill rx packet available or timeout */
  491. do {
  492. if (timeout < MVGBE_PHY_SMI_TIMEOUT)
  493. timeout++;
  494. else {
  495. debug("%s time out...\n", __func__);
  496. return -1;
  497. }
  498. } while (readl(&p_rxdesc_curr->cmd_sts) & MVGBE_BUFFER_OWNED_BY_DMA);
  499. if (p_rxdesc_curr->byte_cnt != 0) {
  500. debug("%s: Received %d byte Packet @ 0x%x (cmd_sts= %08x)\n",
  501. __func__, (u32) p_rxdesc_curr->byte_cnt,
  502. (u32) p_rxdesc_curr->buf_ptr,
  503. (u32) p_rxdesc_curr->cmd_sts);
  504. }
  505. /*
  506. * In case received a packet without first/last bits on
  507. * OR the error summary bit is on,
  508. * the packets needs to be dropeed.
  509. */
  510. cmd_sts = readl(&p_rxdesc_curr->cmd_sts);
  511. if ((cmd_sts &
  512. (MVGBE_RX_FIRST_DESC | MVGBE_RX_LAST_DESC))
  513. != (MVGBE_RX_FIRST_DESC | MVGBE_RX_LAST_DESC)) {
  514. printf("Err..(%s) Dropping packet spread on"
  515. " multiple descriptors\n", __func__);
  516. } else if (cmd_sts & MVGBE_ERROR_SUMMARY) {
  517. printf("Err..(%s) Dropping packet with errors\n",
  518. __func__);
  519. } else {
  520. /* !!! call higher layer processing */
  521. debug("%s: Sending Received packet to"
  522. " upper layer (net_process_received_packet)\n",
  523. __func__);
  524. data = (p_rxdesc_curr->buf_ptr + RX_BUF_OFFSET);
  525. rx_bytes = (int)(p_rxdesc_curr->byte_cnt -
  526. RX_BUF_OFFSET);
  527. *packetp = data;
  528. }
  529. /*
  530. * free these descriptors and point next in the ring
  531. */
  532. p_rxdesc_curr->cmd_sts =
  533. MVGBE_BUFFER_OWNED_BY_DMA | MVGBE_RX_EN_INTERRUPT;
  534. p_rxdesc_curr->buf_size = PKTSIZE_ALIGN;
  535. p_rxdesc_curr->byte_cnt = 0;
  536. rxdesc_curr_addr = (u32)&dmvgbe->p_rxdesc_curr;
  537. writel((unsigned)p_rxdesc_curr->nxtdesc_p, rxdesc_curr_addr);
  538. return rx_bytes;
  539. }
  540. #if defined(CONFIG_PHYLIB)
  541. static struct phy_device *__mvgbe_phy_init(struct udevice *dev,
  542. struct mii_dev *bus,
  543. phy_interface_t phy_interface,
  544. int phyid)
  545. {
  546. struct phy_device *phydev;
  547. /* Set phy address of the port */
  548. miiphy_write(dev->name, MV_PHY_ADR_REQUEST, MV_PHY_ADR_REQUEST,
  549. phyid);
  550. /* Make sure the selected PHY page is 0 before connecting */
  551. miiphy_write(dev->name, phyid, MVGBE_PGADR_REG, 0);
  552. phydev = phy_connect(bus, phyid, dev, phy_interface);
  553. if (!phydev) {
  554. printf("phy_connect failed\n");
  555. return NULL;
  556. }
  557. phy_config(phydev);
  558. phy_startup(phydev);
  559. return phydev;
  560. }
  561. #endif /* CONFIG_PHYLIB */
  562. static int mvgbe_alloc_buffers(struct mvgbe_device *dmvgbe)
  563. {
  564. dmvgbe->p_rxdesc = memalign(PKTALIGN,
  565. MV_RXQ_DESC_ALIGNED_SIZE * RINGSZ + 1);
  566. if (!dmvgbe->p_rxdesc)
  567. goto error1;
  568. dmvgbe->p_rxbuf = memalign(PKTALIGN,
  569. RINGSZ * PKTSIZE_ALIGN + 1);
  570. if (!dmvgbe->p_rxbuf)
  571. goto error2;
  572. dmvgbe->p_aligned_txbuf = memalign(8, PKTSIZE_ALIGN);
  573. if (!dmvgbe->p_aligned_txbuf)
  574. goto error3;
  575. dmvgbe->p_txdesc = memalign(PKTALIGN, sizeof(struct mvgbe_txdesc) + 1);
  576. if (!dmvgbe->p_txdesc)
  577. goto error4;
  578. return 0;
  579. error4:
  580. free(dmvgbe->p_aligned_txbuf);
  581. error3:
  582. free(dmvgbe->p_rxbuf);
  583. error2:
  584. free(dmvgbe->p_rxdesc);
  585. error1:
  586. return -ENOMEM;
  587. }
  588. static int mvgbe_port_is_fixed_link(struct mvgbe_device *dmvgbe)
  589. {
  590. return dmvgbe->phyaddr > PHY_MAX_ADDR;
  591. }
  592. static int mvgbe_start(struct udevice *dev)
  593. {
  594. struct eth_pdata *pdata = dev_get_plat(dev);
  595. struct mvgbe_device *dmvgbe = dev_get_priv(dev);
  596. int ret;
  597. ret = __mvgbe_init(dmvgbe, pdata->enetaddr, dev->name);
  598. if (ret)
  599. return ret;
  600. if (!mvgbe_port_is_fixed_link(dmvgbe)) {
  601. dmvgbe->phydev = __mvgbe_phy_init(dev, dmvgbe->bus,
  602. dmvgbe->phy_interface,
  603. dmvgbe->phyaddr);
  604. if (!dmvgbe->phydev)
  605. return -ENODEV;
  606. }
  607. return 0;
  608. }
  609. static int mvgbe_send(struct udevice *dev, void *packet, int length)
  610. {
  611. struct mvgbe_device *dmvgbe = dev_get_priv(dev);
  612. return __mvgbe_send(dmvgbe, packet, length);
  613. }
  614. static int mvgbe_recv(struct udevice *dev, int flags, uchar **packetp)
  615. {
  616. struct mvgbe_device *dmvgbe = dev_get_priv(dev);
  617. return __mvgbe_recv(dmvgbe, packetp);
  618. }
  619. static void mvgbe_stop(struct udevice *dev)
  620. {
  621. struct mvgbe_device *dmvgbe = dev_get_priv(dev);
  622. __mvgbe_halt(dmvgbe);
  623. }
  624. static int mvgbe_probe(struct udevice *dev)
  625. {
  626. struct eth_pdata *pdata = dev_get_plat(dev);
  627. struct mvgbe_device *dmvgbe = dev_get_priv(dev);
  628. struct mii_dev *bus;
  629. int ret;
  630. ret = mvgbe_alloc_buffers(dmvgbe);
  631. if (ret)
  632. return ret;
  633. dmvgbe->regs = (void __iomem *)pdata->iobase;
  634. bus = mdio_alloc();
  635. if (!bus) {
  636. printf("Failed to allocate MDIO bus\n");
  637. return -ENOMEM;
  638. }
  639. bus->read = smi_reg_read;
  640. bus->write = smi_reg_write;
  641. snprintf(bus->name, sizeof(bus->name), dev->name);
  642. bus->priv = dmvgbe;
  643. dmvgbe->bus = bus;
  644. ret = mdio_register(bus);
  645. if (ret < 0)
  646. return ret;
  647. return 0;
  648. }
  649. static const struct eth_ops mvgbe_ops = {
  650. .start = mvgbe_start,
  651. .send = mvgbe_send,
  652. .recv = mvgbe_recv,
  653. .stop = mvgbe_stop,
  654. .write_hwaddr = mvgbe_write_hwaddr,
  655. };
  656. static int mvgbe_of_to_plat(struct udevice *dev)
  657. {
  658. struct eth_pdata *pdata = dev_get_plat(dev);
  659. struct mvgbe_device *dmvgbe = dev_get_priv(dev);
  660. void *blob = (void *)gd->fdt_blob;
  661. int node = dev_of_offset(dev);
  662. int fl_node;
  663. int pnode;
  664. unsigned long addr;
  665. pdata->iobase = dev_read_addr(dev);
  666. pdata->phy_interface = -1;
  667. pnode = fdt_node_offset_by_compatible(blob, node,
  668. "marvell,kirkwood-eth-port");
  669. /* Get phy-mode / phy_interface from DT */
  670. pdata->phy_interface = dev_read_phy_mode(dev);
  671. if (pdata->phy_interface == PHY_INTERFACE_MODE_NA)
  672. pdata->phy_interface = PHY_INTERFACE_MODE_GMII;
  673. dmvgbe->phy_interface = pdata->phy_interface;
  674. /* fetch 'fixed-link' property */
  675. fl_node = fdt_subnode_offset(blob, pnode, "fixed-link");
  676. if (fl_node != -FDT_ERR_NOTFOUND) {
  677. /* set phy_addr to invalid value for fixed link */
  678. dmvgbe->phyaddr = PHY_MAX_ADDR + 1;
  679. dmvgbe->duplex = fdtdec_get_bool(blob, fl_node, "full-duplex");
  680. dmvgbe->speed = fdtdec_get_int(blob, fl_node, "speed", 0);
  681. } else {
  682. /* Now read phyaddr from DT */
  683. addr = fdtdec_lookup_phandle(blob, pnode, "phy-handle");
  684. if (addr > 0)
  685. dmvgbe->phyaddr = fdtdec_get_int(blob, addr, "reg", 0);
  686. }
  687. return 0;
  688. }
  689. static const struct udevice_id mvgbe_ids[] = {
  690. { .compatible = "marvell,kirkwood-eth" },
  691. { }
  692. };
  693. U_BOOT_DRIVER(mvgbe) = {
  694. .name = "mvgbe",
  695. .id = UCLASS_ETH,
  696. .of_match = mvgbe_ids,
  697. .of_to_plat = mvgbe_of_to_plat,
  698. .probe = mvgbe_probe,
  699. .ops = &mvgbe_ops,
  700. .priv_auto = sizeof(struct mvgbe_device),
  701. .plat_auto = sizeof(struct eth_pdata),
  702. };