davinci_emac.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894
  1. /*
  2. * Ethernet driver for TI TMS320DM644x (DaVinci) chips.
  3. *
  4. * Copyright (C) 2007 Sergey Kubushyn <ksi@koi8.net>
  5. *
  6. * Parts shamelessly stolen from TI's dm644x_emac.c. Original copyright
  7. * follows:
  8. *
  9. * ----------------------------------------------------------------------------
  10. *
  11. * dm644x_emac.c
  12. *
  13. * TI DaVinci (DM644X) EMAC peripheral driver source for DV-EVM
  14. *
  15. * Copyright (C) 2005 Texas Instruments.
  16. *
  17. * ----------------------------------------------------------------------------
  18. *
  19. * SPDX-License-Identifier: GPL-2.0+
  20. *
  21. * Modifications:
  22. * ver. 1.0: Sep 2005, Anant Gole - Created EMAC version for uBoot.
  23. * ver 1.1: Nov 2005, Anant Gole - Extended the RX logic for multiple descriptors
  24. */
  25. #include <common.h>
  26. #include <command.h>
  27. #include <net.h>
  28. #include <miiphy.h>
  29. #include <malloc.h>
  30. #include <linux/compiler.h>
  31. #include <asm/arch/emac_defs.h>
  32. #include <asm/io.h>
  33. #include "davinci_emac.h"
  34. unsigned int emac_dbg = 0;
  35. #define debug_emac(fmt,args...) if (emac_dbg) printf(fmt,##args)
  36. #ifdef EMAC_HW_RAM_ADDR
  37. static inline unsigned long BD_TO_HW(unsigned long x)
  38. {
  39. if (x == 0)
  40. return 0;
  41. return x - EMAC_WRAPPER_RAM_ADDR + EMAC_HW_RAM_ADDR;
  42. }
  43. static inline unsigned long HW_TO_BD(unsigned long x)
  44. {
  45. if (x == 0)
  46. return 0;
  47. return x - EMAC_HW_RAM_ADDR + EMAC_WRAPPER_RAM_ADDR;
  48. }
  49. #else
  50. #define BD_TO_HW(x) (x)
  51. #define HW_TO_BD(x) (x)
  52. #endif
  53. #ifdef DAVINCI_EMAC_GIG_ENABLE
  54. #define emac_gigabit_enable(phy_addr) davinci_eth_gigabit_enable(phy_addr)
  55. #else
  56. #define emac_gigabit_enable(phy_addr) /* no gigabit to enable */
  57. #endif
  58. #if !defined(CONFIG_SYS_EMAC_TI_CLKDIV)
  59. #define CONFIG_SYS_EMAC_TI_CLKDIV ((EMAC_MDIO_BUS_FREQ / \
  60. EMAC_MDIO_CLOCK_FREQ) - 1)
  61. #endif
  62. static void davinci_eth_mdio_enable(void);
  63. static int gen_init_phy(int phy_addr);
  64. static int gen_is_phy_connected(int phy_addr);
  65. static int gen_get_link_speed(int phy_addr);
  66. static int gen_auto_negotiate(int phy_addr);
  67. void eth_mdio_enable(void)
  68. {
  69. davinci_eth_mdio_enable();
  70. }
  71. /* EMAC Addresses */
  72. static volatile emac_regs *adap_emac = (emac_regs *)EMAC_BASE_ADDR;
  73. static volatile ewrap_regs *adap_ewrap = (ewrap_regs *)EMAC_WRAPPER_BASE_ADDR;
  74. static volatile mdio_regs *adap_mdio = (mdio_regs *)EMAC_MDIO_BASE_ADDR;
  75. /* EMAC descriptors */
  76. static volatile emac_desc *emac_rx_desc = (emac_desc *)(EMAC_WRAPPER_RAM_ADDR + EMAC_RX_DESC_BASE);
  77. static volatile emac_desc *emac_tx_desc = (emac_desc *)(EMAC_WRAPPER_RAM_ADDR + EMAC_TX_DESC_BASE);
  78. static volatile emac_desc *emac_rx_active_head = 0;
  79. static volatile emac_desc *emac_rx_active_tail = 0;
  80. static int emac_rx_queue_active = 0;
  81. /* Receive packet buffers */
  82. static unsigned char emac_rx_buffers[EMAC_MAX_RX_BUFFERS * EMAC_RXBUF_SIZE]
  83. __aligned(ARCH_DMA_MINALIGN);
  84. #ifndef CONFIG_SYS_DAVINCI_EMAC_PHY_COUNT
  85. #define CONFIG_SYS_DAVINCI_EMAC_PHY_COUNT 3
  86. #endif
  87. /* PHY address for a discovered PHY (0xff - not found) */
  88. static u_int8_t active_phy_addr[CONFIG_SYS_DAVINCI_EMAC_PHY_COUNT];
  89. /* number of PHY found active */
  90. static u_int8_t num_phy;
  91. phy_t phy[CONFIG_SYS_DAVINCI_EMAC_PHY_COUNT];
  92. static inline void davinci_flush_rx_descs(void)
  93. {
  94. /* flush the whole RX descs area */
  95. flush_dcache_range(EMAC_WRAPPER_RAM_ADDR + EMAC_RX_DESC_BASE,
  96. EMAC_WRAPPER_RAM_ADDR + EMAC_TX_DESC_BASE);
  97. }
  98. static inline void davinci_invalidate_rx_descs(void)
  99. {
  100. /* invalidate the whole RX descs area */
  101. invalidate_dcache_range(EMAC_WRAPPER_RAM_ADDR + EMAC_RX_DESC_BASE,
  102. EMAC_WRAPPER_RAM_ADDR + EMAC_TX_DESC_BASE);
  103. }
  104. static inline void davinci_flush_desc(emac_desc *desc)
  105. {
  106. flush_dcache_range((unsigned long)desc,
  107. (unsigned long)desc + sizeof(*desc));
  108. }
  109. static int davinci_eth_set_mac_addr(struct eth_device *dev)
  110. {
  111. unsigned long mac_hi;
  112. unsigned long mac_lo;
  113. /*
  114. * Set MAC Addresses & Init multicast Hash to 0 (disable any multicast
  115. * receive)
  116. * Using channel 0 only - other channels are disabled
  117. * */
  118. writel(0, &adap_emac->MACINDEX);
  119. mac_hi = (dev->enetaddr[3] << 24) |
  120. (dev->enetaddr[2] << 16) |
  121. (dev->enetaddr[1] << 8) |
  122. (dev->enetaddr[0]);
  123. mac_lo = (dev->enetaddr[5] << 8) |
  124. (dev->enetaddr[4]);
  125. writel(mac_hi, &adap_emac->MACADDRHI);
  126. #if defined(DAVINCI_EMAC_VERSION2)
  127. writel(mac_lo | EMAC_MAC_ADDR_IS_VALID | EMAC_MAC_ADDR_MATCH,
  128. &adap_emac->MACADDRLO);
  129. #else
  130. writel(mac_lo, &adap_emac->MACADDRLO);
  131. #endif
  132. writel(0, &adap_emac->MACHASH1);
  133. writel(0, &adap_emac->MACHASH2);
  134. /* Set source MAC address - REQUIRED */
  135. writel(mac_hi, &adap_emac->MACSRCADDRHI);
  136. writel(mac_lo, &adap_emac->MACSRCADDRLO);
  137. return 0;
  138. }
  139. static void davinci_eth_mdio_enable(void)
  140. {
  141. u_int32_t clkdiv;
  142. clkdiv = CONFIG_SYS_EMAC_TI_CLKDIV;
  143. writel((clkdiv & 0xff) |
  144. MDIO_CONTROL_ENABLE |
  145. MDIO_CONTROL_FAULT |
  146. MDIO_CONTROL_FAULT_ENABLE,
  147. &adap_mdio->CONTROL);
  148. while (readl(&adap_mdio->CONTROL) & MDIO_CONTROL_IDLE)
  149. ;
  150. }
  151. /*
  152. * Tries to find an active connected PHY. Returns 1 if address if found.
  153. * If no active PHY (or more than one PHY) found returns 0.
  154. * Sets active_phy_addr variable.
  155. */
  156. static int davinci_eth_phy_detect(void)
  157. {
  158. u_int32_t phy_act_state;
  159. int i;
  160. int j;
  161. unsigned int count = 0;
  162. for (i = 0; i < CONFIG_SYS_DAVINCI_EMAC_PHY_COUNT; i++)
  163. active_phy_addr[i] = 0xff;
  164. udelay(1000);
  165. phy_act_state = readl(&adap_mdio->ALIVE);
  166. if (phy_act_state == 0)
  167. return 0; /* No active PHYs */
  168. debug_emac("davinci_eth_phy_detect(), ALIVE = 0x%08x\n", phy_act_state);
  169. for (i = 0, j = 0; i < 32; i++)
  170. if (phy_act_state & (1 << i)) {
  171. count++;
  172. if (count <= CONFIG_SYS_DAVINCI_EMAC_PHY_COUNT) {
  173. active_phy_addr[j++] = i;
  174. } else {
  175. printf("%s: to many PHYs detected.\n",
  176. __func__);
  177. count = 0;
  178. break;
  179. }
  180. }
  181. num_phy = count;
  182. return count;
  183. }
  184. /* Read a PHY register via MDIO inteface. Returns 1 on success, 0 otherwise */
  185. int davinci_eth_phy_read(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t *data)
  186. {
  187. int tmp;
  188. while (readl(&adap_mdio->USERACCESS0) & MDIO_USERACCESS0_GO)
  189. ;
  190. writel(MDIO_USERACCESS0_GO |
  191. MDIO_USERACCESS0_WRITE_READ |
  192. ((reg_num & 0x1f) << 21) |
  193. ((phy_addr & 0x1f) << 16),
  194. &adap_mdio->USERACCESS0);
  195. /* Wait for command to complete */
  196. while ((tmp = readl(&adap_mdio->USERACCESS0)) & MDIO_USERACCESS0_GO)
  197. ;
  198. if (tmp & MDIO_USERACCESS0_ACK) {
  199. *data = tmp & 0xffff;
  200. return(1);
  201. }
  202. *data = -1;
  203. return(0);
  204. }
  205. /* Write to a PHY register via MDIO inteface. Blocks until operation is complete. */
  206. int davinci_eth_phy_write(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t data)
  207. {
  208. while (readl(&adap_mdio->USERACCESS0) & MDIO_USERACCESS0_GO)
  209. ;
  210. writel(MDIO_USERACCESS0_GO |
  211. MDIO_USERACCESS0_WRITE_WRITE |
  212. ((reg_num & 0x1f) << 21) |
  213. ((phy_addr & 0x1f) << 16) |
  214. (data & 0xffff),
  215. &adap_mdio->USERACCESS0);
  216. /* Wait for command to complete */
  217. while (readl(&adap_mdio->USERACCESS0) & MDIO_USERACCESS0_GO)
  218. ;
  219. return(1);
  220. }
  221. /* PHY functions for a generic PHY */
  222. static int gen_init_phy(int phy_addr)
  223. {
  224. int ret = 1;
  225. if (gen_get_link_speed(phy_addr)) {
  226. /* Try another time */
  227. ret = gen_get_link_speed(phy_addr);
  228. }
  229. return(ret);
  230. }
  231. static int gen_is_phy_connected(int phy_addr)
  232. {
  233. u_int16_t dummy;
  234. return davinci_eth_phy_read(phy_addr, MII_PHYSID1, &dummy);
  235. }
  236. static int get_active_phy(void)
  237. {
  238. int i;
  239. for (i = 0; i < num_phy; i++)
  240. if (phy[i].get_link_speed(active_phy_addr[i]))
  241. return i;
  242. return -1; /* Return error if no link */
  243. }
  244. static int gen_get_link_speed(int phy_addr)
  245. {
  246. u_int16_t tmp;
  247. if (davinci_eth_phy_read(phy_addr, MII_STATUS_REG, &tmp) &&
  248. (tmp & 0x04)) {
  249. #if defined(CONFIG_DRIVER_TI_EMAC_USE_RMII) && \
  250. defined(CONFIG_MACH_DAVINCI_DA850_EVM)
  251. davinci_eth_phy_read(phy_addr, MII_LPA, &tmp);
  252. /* Speed doesn't matter, there is no setting for it in EMAC. */
  253. if (tmp & (LPA_100FULL | LPA_10FULL)) {
  254. /* set EMAC for Full Duplex */
  255. writel(EMAC_MACCONTROL_MIIEN_ENABLE |
  256. EMAC_MACCONTROL_FULLDUPLEX_ENABLE,
  257. &adap_emac->MACCONTROL);
  258. } else {
  259. /*set EMAC for Half Duplex */
  260. writel(EMAC_MACCONTROL_MIIEN_ENABLE,
  261. &adap_emac->MACCONTROL);
  262. }
  263. if (tmp & (LPA_100FULL | LPA_100HALF))
  264. writel(readl(&adap_emac->MACCONTROL) |
  265. EMAC_MACCONTROL_RMIISPEED_100,
  266. &adap_emac->MACCONTROL);
  267. else
  268. writel(readl(&adap_emac->MACCONTROL) &
  269. ~EMAC_MACCONTROL_RMIISPEED_100,
  270. &adap_emac->MACCONTROL);
  271. #endif
  272. return(1);
  273. }
  274. return(0);
  275. }
  276. static int gen_auto_negotiate(int phy_addr)
  277. {
  278. u_int16_t tmp;
  279. u_int16_t val;
  280. unsigned long cntr = 0;
  281. if (!davinci_eth_phy_read(phy_addr, MII_BMCR, &tmp))
  282. return 0;
  283. val = tmp | BMCR_FULLDPLX | BMCR_ANENABLE |
  284. BMCR_SPEED100;
  285. davinci_eth_phy_write(phy_addr, MII_BMCR, val);
  286. if (!davinci_eth_phy_read(phy_addr, MII_ADVERTISE, &val))
  287. return 0;
  288. val |= (ADVERTISE_100FULL | ADVERTISE_100HALF | ADVERTISE_10FULL |
  289. ADVERTISE_10HALF);
  290. davinci_eth_phy_write(phy_addr, MII_ADVERTISE, val);
  291. if (!davinci_eth_phy_read(phy_addr, MII_BMCR, &tmp))
  292. return(0);
  293. /* Restart Auto_negotiation */
  294. tmp |= BMCR_ANRESTART;
  295. davinci_eth_phy_write(phy_addr, MII_BMCR, tmp);
  296. /*check AutoNegotiate complete */
  297. do {
  298. udelay(40000);
  299. if (!davinci_eth_phy_read(phy_addr, MII_BMSR, &tmp))
  300. return 0;
  301. if (tmp & BMSR_ANEGCOMPLETE)
  302. break;
  303. cntr++;
  304. } while (cntr < 200);
  305. if (!davinci_eth_phy_read(phy_addr, MII_BMSR, &tmp))
  306. return(0);
  307. if (!(tmp & BMSR_ANEGCOMPLETE))
  308. return(0);
  309. return(gen_get_link_speed(phy_addr));
  310. }
  311. /* End of generic PHY functions */
  312. #if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
  313. static int davinci_mii_phy_read(const char *devname, unsigned char addr, unsigned char reg, unsigned short *value)
  314. {
  315. return(davinci_eth_phy_read(addr, reg, value) ? 0 : 1);
  316. }
  317. static int davinci_mii_phy_write(const char *devname, unsigned char addr, unsigned char reg, unsigned short value)
  318. {
  319. return(davinci_eth_phy_write(addr, reg, value) ? 0 : 1);
  320. }
  321. #endif
  322. static void __attribute__((unused)) davinci_eth_gigabit_enable(int phy_addr)
  323. {
  324. u_int16_t data;
  325. if (davinci_eth_phy_read(phy_addr, 0, &data)) {
  326. if (data & (1 << 6)) { /* speed selection MSB */
  327. /*
  328. * Check if link detected is giga-bit
  329. * If Gigabit mode detected, enable gigbit in MAC
  330. */
  331. writel(readl(&adap_emac->MACCONTROL) |
  332. EMAC_MACCONTROL_GIGFORCE |
  333. EMAC_MACCONTROL_GIGABIT_ENABLE,
  334. &adap_emac->MACCONTROL);
  335. }
  336. }
  337. }
  338. /* Eth device open */
  339. static int davinci_eth_open(struct eth_device *dev, bd_t *bis)
  340. {
  341. dv_reg_p addr;
  342. u_int32_t clkdiv, cnt;
  343. volatile emac_desc *rx_desc;
  344. int index;
  345. debug_emac("+ emac_open\n");
  346. /* Reset EMAC module and disable interrupts in wrapper */
  347. writel(1, &adap_emac->SOFTRESET);
  348. while (readl(&adap_emac->SOFTRESET) != 0)
  349. ;
  350. #if defined(DAVINCI_EMAC_VERSION2)
  351. writel(1, &adap_ewrap->softrst);
  352. while (readl(&adap_ewrap->softrst) != 0)
  353. ;
  354. #else
  355. writel(0, &adap_ewrap->EWCTL);
  356. for (cnt = 0; cnt < 5; cnt++) {
  357. clkdiv = readl(&adap_ewrap->EWCTL);
  358. }
  359. #endif
  360. #if defined(CONFIG_DRIVER_TI_EMAC_USE_RMII) && \
  361. defined(CONFIG_MACH_DAVINCI_DA850_EVM)
  362. adap_ewrap->c0rxen = adap_ewrap->c1rxen = adap_ewrap->c2rxen = 0;
  363. adap_ewrap->c0txen = adap_ewrap->c1txen = adap_ewrap->c2txen = 0;
  364. adap_ewrap->c0miscen = adap_ewrap->c1miscen = adap_ewrap->c2miscen = 0;
  365. #endif
  366. rx_desc = emac_rx_desc;
  367. writel(1, &adap_emac->TXCONTROL);
  368. writel(1, &adap_emac->RXCONTROL);
  369. davinci_eth_set_mac_addr(dev);
  370. /* Set DMA 8 TX / 8 RX Head pointers to 0 */
  371. addr = &adap_emac->TX0HDP;
  372. for(cnt = 0; cnt < 16; cnt++)
  373. writel(0, addr++);
  374. addr = &adap_emac->RX0HDP;
  375. for(cnt = 0; cnt < 16; cnt++)
  376. writel(0, addr++);
  377. /* Clear Statistics (do this before setting MacControl register) */
  378. addr = &adap_emac->RXGOODFRAMES;
  379. for(cnt = 0; cnt < EMAC_NUM_STATS; cnt++)
  380. writel(0, addr++);
  381. /* No multicast addressing */
  382. writel(0, &adap_emac->MACHASH1);
  383. writel(0, &adap_emac->MACHASH2);
  384. /* Create RX queue and set receive process in place */
  385. emac_rx_active_head = emac_rx_desc;
  386. for (cnt = 0; cnt < EMAC_MAX_RX_BUFFERS; cnt++) {
  387. rx_desc->next = BD_TO_HW((u_int32_t)(rx_desc + 1));
  388. rx_desc->buffer = &emac_rx_buffers[cnt * EMAC_RXBUF_SIZE];
  389. rx_desc->buff_off_len = EMAC_MAX_ETHERNET_PKT_SIZE;
  390. rx_desc->pkt_flag_len = EMAC_CPPI_OWNERSHIP_BIT;
  391. rx_desc++;
  392. }
  393. /* Finalize the rx desc list */
  394. rx_desc--;
  395. rx_desc->next = 0;
  396. emac_rx_active_tail = rx_desc;
  397. emac_rx_queue_active = 1;
  398. davinci_flush_rx_descs();
  399. /* Enable TX/RX */
  400. writel(EMAC_MAX_ETHERNET_PKT_SIZE, &adap_emac->RXMAXLEN);
  401. writel(0, &adap_emac->RXBUFFEROFFSET);
  402. /*
  403. * No fancy configs - Use this for promiscous debug
  404. * - EMAC_RXMBPENABLE_RXCAFEN_ENABLE
  405. */
  406. writel(EMAC_RXMBPENABLE_RXBROADEN, &adap_emac->RXMBPENABLE);
  407. /* Enable ch 0 only */
  408. writel(1, &adap_emac->RXUNICASTSET);
  409. /* Enable MII interface and Full duplex mode */
  410. #if defined(CONFIG_SOC_DA8XX) || \
  411. (defined(CONFIG_OMAP34XX) && defined(CONFIG_DRIVER_TI_EMAC_USE_RMII))
  412. writel((EMAC_MACCONTROL_MIIEN_ENABLE |
  413. EMAC_MACCONTROL_FULLDUPLEX_ENABLE |
  414. EMAC_MACCONTROL_RMIISPEED_100),
  415. &adap_emac->MACCONTROL);
  416. #else
  417. writel((EMAC_MACCONTROL_MIIEN_ENABLE |
  418. EMAC_MACCONTROL_FULLDUPLEX_ENABLE),
  419. &adap_emac->MACCONTROL);
  420. #endif
  421. /* Init MDIO & get link state */
  422. clkdiv = CONFIG_SYS_EMAC_TI_CLKDIV;
  423. writel((clkdiv & 0xff) | MDIO_CONTROL_ENABLE | MDIO_CONTROL_FAULT,
  424. &adap_mdio->CONTROL);
  425. /* We need to wait for MDIO to start */
  426. udelay(1000);
  427. index = get_active_phy();
  428. if (index == -1)
  429. return(0);
  430. emac_gigabit_enable(active_phy_addr[index]);
  431. /* Start receive process */
  432. writel(BD_TO_HW((u_int32_t)emac_rx_desc), &adap_emac->RX0HDP);
  433. debug_emac("- emac_open\n");
  434. return(1);
  435. }
  436. /* EMAC Channel Teardown */
  437. static void davinci_eth_ch_teardown(int ch)
  438. {
  439. dv_reg dly = 0xff;
  440. dv_reg cnt;
  441. debug_emac("+ emac_ch_teardown\n");
  442. if (ch == EMAC_CH_TX) {
  443. /* Init TX channel teardown */
  444. writel(0, &adap_emac->TXTEARDOWN);
  445. do {
  446. /*
  447. * Wait here for Tx teardown completion interrupt to
  448. * occur. Note: A task delay can be called here to pend
  449. * rather than occupying CPU cycles - anyway it has
  450. * been found that teardown takes very few cpu cycles
  451. * and does not affect functionality
  452. */
  453. dly--;
  454. udelay(1);
  455. if (dly == 0)
  456. break;
  457. cnt = readl(&adap_emac->TX0CP);
  458. } while (cnt != 0xfffffffc);
  459. writel(cnt, &adap_emac->TX0CP);
  460. writel(0, &adap_emac->TX0HDP);
  461. } else {
  462. /* Init RX channel teardown */
  463. writel(0, &adap_emac->RXTEARDOWN);
  464. do {
  465. /*
  466. * Wait here for Rx teardown completion interrupt to
  467. * occur. Note: A task delay can be called here to pend
  468. * rather than occupying CPU cycles - anyway it has
  469. * been found that teardown takes very few cpu cycles
  470. * and does not affect functionality
  471. */
  472. dly--;
  473. udelay(1);
  474. if (dly == 0)
  475. break;
  476. cnt = readl(&adap_emac->RX0CP);
  477. } while (cnt != 0xfffffffc);
  478. writel(cnt, &adap_emac->RX0CP);
  479. writel(0, &adap_emac->RX0HDP);
  480. }
  481. debug_emac("- emac_ch_teardown\n");
  482. }
  483. /* Eth device close */
  484. static void davinci_eth_close(struct eth_device *dev)
  485. {
  486. debug_emac("+ emac_close\n");
  487. davinci_eth_ch_teardown(EMAC_CH_TX); /* TX Channel teardown */
  488. davinci_eth_ch_teardown(EMAC_CH_RX); /* RX Channel teardown */
  489. /* Reset EMAC module and disable interrupts in wrapper */
  490. writel(1, &adap_emac->SOFTRESET);
  491. #if defined(DAVINCI_EMAC_VERSION2)
  492. writel(1, &adap_ewrap->softrst);
  493. #else
  494. writel(0, &adap_ewrap->EWCTL);
  495. #endif
  496. #if defined(CONFIG_DRIVER_TI_EMAC_USE_RMII) && \
  497. defined(CONFIG_MACH_DAVINCI_DA850_EVM)
  498. adap_ewrap->c0rxen = adap_ewrap->c1rxen = adap_ewrap->c2rxen = 0;
  499. adap_ewrap->c0txen = adap_ewrap->c1txen = adap_ewrap->c2txen = 0;
  500. adap_ewrap->c0miscen = adap_ewrap->c1miscen = adap_ewrap->c2miscen = 0;
  501. #endif
  502. debug_emac("- emac_close\n");
  503. }
  504. static int tx_send_loop = 0;
  505. /*
  506. * This function sends a single packet on the network and returns
  507. * positive number (number of bytes transmitted) or negative for error
  508. */
  509. static int davinci_eth_send_packet (struct eth_device *dev,
  510. void *packet, int length)
  511. {
  512. int ret_status = -1;
  513. int index;
  514. tx_send_loop = 0;
  515. index = get_active_phy();
  516. if (index == -1) {
  517. printf(" WARN: emac_send_packet: No link\n");
  518. return (ret_status);
  519. }
  520. emac_gigabit_enable(active_phy_addr[index]);
  521. /* Check packet size and if < EMAC_MIN_ETHERNET_PKT_SIZE, pad it up */
  522. if (length < EMAC_MIN_ETHERNET_PKT_SIZE) {
  523. length = EMAC_MIN_ETHERNET_PKT_SIZE;
  524. }
  525. /* Populate the TX descriptor */
  526. emac_tx_desc->next = 0;
  527. emac_tx_desc->buffer = (u_int8_t *) packet;
  528. emac_tx_desc->buff_off_len = (length & 0xffff);
  529. emac_tx_desc->pkt_flag_len = ((length & 0xffff) |
  530. EMAC_CPPI_SOP_BIT |
  531. EMAC_CPPI_OWNERSHIP_BIT |
  532. EMAC_CPPI_EOP_BIT);
  533. flush_dcache_range((unsigned long)packet,
  534. (unsigned long)packet + length);
  535. davinci_flush_desc(emac_tx_desc);
  536. /* Send the packet */
  537. writel(BD_TO_HW((unsigned long)emac_tx_desc), &adap_emac->TX0HDP);
  538. /* Wait for packet to complete or link down */
  539. while (1) {
  540. if (!phy[index].get_link_speed(active_phy_addr[index])) {
  541. davinci_eth_ch_teardown (EMAC_CH_TX);
  542. return (ret_status);
  543. }
  544. emac_gigabit_enable(active_phy_addr[index]);
  545. if (readl(&adap_emac->TXINTSTATRAW) & 0x01) {
  546. ret_status = length;
  547. break;
  548. }
  549. tx_send_loop++;
  550. }
  551. return (ret_status);
  552. }
  553. /*
  554. * This function handles receipt of a packet from the network
  555. */
  556. static int davinci_eth_rcv_packet (struct eth_device *dev)
  557. {
  558. volatile emac_desc *rx_curr_desc;
  559. volatile emac_desc *curr_desc;
  560. volatile emac_desc *tail_desc;
  561. int status, ret = -1;
  562. davinci_invalidate_rx_descs();
  563. rx_curr_desc = emac_rx_active_head;
  564. status = rx_curr_desc->pkt_flag_len;
  565. if ((rx_curr_desc) && ((status & EMAC_CPPI_OWNERSHIP_BIT) == 0)) {
  566. if (status & EMAC_CPPI_RX_ERROR_FRAME) {
  567. /* Error in packet - discard it and requeue desc */
  568. printf ("WARN: emac_rcv_pkt: Error in packet\n");
  569. } else {
  570. unsigned long tmp = (unsigned long)rx_curr_desc->buffer;
  571. invalidate_dcache_range(tmp, tmp + EMAC_RXBUF_SIZE);
  572. NetReceive (rx_curr_desc->buffer,
  573. (rx_curr_desc->buff_off_len & 0xffff));
  574. ret = rx_curr_desc->buff_off_len & 0xffff;
  575. }
  576. /* Ack received packet descriptor */
  577. writel(BD_TO_HW((ulong)rx_curr_desc), &adap_emac->RX0CP);
  578. curr_desc = rx_curr_desc;
  579. emac_rx_active_head =
  580. (volatile emac_desc *) (HW_TO_BD(rx_curr_desc->next));
  581. if (status & EMAC_CPPI_EOQ_BIT) {
  582. if (emac_rx_active_head) {
  583. writel(BD_TO_HW((ulong)emac_rx_active_head),
  584. &adap_emac->RX0HDP);
  585. } else {
  586. emac_rx_queue_active = 0;
  587. printf ("INFO:emac_rcv_packet: RX Queue not active\n");
  588. }
  589. }
  590. /* Recycle RX descriptor */
  591. rx_curr_desc->buff_off_len = EMAC_MAX_ETHERNET_PKT_SIZE;
  592. rx_curr_desc->pkt_flag_len = EMAC_CPPI_OWNERSHIP_BIT;
  593. rx_curr_desc->next = 0;
  594. davinci_flush_desc(rx_curr_desc);
  595. if (emac_rx_active_head == 0) {
  596. printf ("INFO: emac_rcv_pkt: active queue head = 0\n");
  597. emac_rx_active_head = curr_desc;
  598. emac_rx_active_tail = curr_desc;
  599. if (emac_rx_queue_active != 0) {
  600. writel(BD_TO_HW((ulong)emac_rx_active_head),
  601. &adap_emac->RX0HDP);
  602. printf ("INFO: emac_rcv_pkt: active queue head = 0, HDP fired\n");
  603. emac_rx_queue_active = 1;
  604. }
  605. } else {
  606. tail_desc = emac_rx_active_tail;
  607. emac_rx_active_tail = curr_desc;
  608. tail_desc->next = BD_TO_HW((ulong) curr_desc);
  609. status = tail_desc->pkt_flag_len;
  610. if (status & EMAC_CPPI_EOQ_BIT) {
  611. davinci_flush_desc(tail_desc);
  612. writel(BD_TO_HW((ulong)curr_desc),
  613. &adap_emac->RX0HDP);
  614. status &= ~EMAC_CPPI_EOQ_BIT;
  615. tail_desc->pkt_flag_len = status;
  616. }
  617. davinci_flush_desc(tail_desc);
  618. }
  619. return (ret);
  620. }
  621. return (0);
  622. }
  623. /*
  624. * This function initializes the emac hardware. It does NOT initialize
  625. * EMAC modules power or pin multiplexors, that is done by board_init()
  626. * much earlier in bootup process. Returns 1 on success, 0 otherwise.
  627. */
  628. int davinci_emac_initialize(void)
  629. {
  630. u_int32_t phy_id;
  631. u_int16_t tmp;
  632. int i;
  633. int ret;
  634. struct eth_device *dev;
  635. dev = malloc(sizeof *dev);
  636. if (dev == NULL)
  637. return -1;
  638. memset(dev, 0, sizeof *dev);
  639. sprintf(dev->name, "DaVinci-EMAC");
  640. dev->iobase = 0;
  641. dev->init = davinci_eth_open;
  642. dev->halt = davinci_eth_close;
  643. dev->send = davinci_eth_send_packet;
  644. dev->recv = davinci_eth_rcv_packet;
  645. dev->write_hwaddr = davinci_eth_set_mac_addr;
  646. eth_register(dev);
  647. davinci_eth_mdio_enable();
  648. /* let the EMAC detect the PHYs */
  649. udelay(5000);
  650. for (i = 0; i < 256; i++) {
  651. if (readl(&adap_mdio->ALIVE))
  652. break;
  653. udelay(1000);
  654. }
  655. if (i >= 256) {
  656. printf("No ETH PHY detected!!!\n");
  657. return(0);
  658. }
  659. /* Find if PHY(s) is/are connected */
  660. ret = davinci_eth_phy_detect();
  661. if (!ret)
  662. return(0);
  663. else
  664. debug_emac(" %d ETH PHY detected\n", ret);
  665. /* Get PHY ID and initialize phy_ops for a detected PHY */
  666. for (i = 0; i < num_phy; i++) {
  667. if (!davinci_eth_phy_read(active_phy_addr[i], MII_PHYSID1,
  668. &tmp)) {
  669. active_phy_addr[i] = 0xff;
  670. continue;
  671. }
  672. phy_id = (tmp << 16) & 0xffff0000;
  673. if (!davinci_eth_phy_read(active_phy_addr[i], MII_PHYSID2,
  674. &tmp)) {
  675. active_phy_addr[i] = 0xff;
  676. continue;
  677. }
  678. phy_id |= tmp & 0x0000ffff;
  679. switch (phy_id) {
  680. #ifdef PHY_KSZ8873
  681. case PHY_KSZ8873:
  682. sprintf(phy[i].name, "KSZ8873 @ 0x%02x",
  683. active_phy_addr[i]);
  684. phy[i].init = ksz8873_init_phy;
  685. phy[i].is_phy_connected = ksz8873_is_phy_connected;
  686. phy[i].get_link_speed = ksz8873_get_link_speed;
  687. phy[i].auto_negotiate = ksz8873_auto_negotiate;
  688. break;
  689. #endif
  690. #ifdef PHY_LXT972
  691. case PHY_LXT972:
  692. sprintf(phy[i].name, "LXT972 @ 0x%02x",
  693. active_phy_addr[i]);
  694. phy[i].init = lxt972_init_phy;
  695. phy[i].is_phy_connected = lxt972_is_phy_connected;
  696. phy[i].get_link_speed = lxt972_get_link_speed;
  697. phy[i].auto_negotiate = lxt972_auto_negotiate;
  698. break;
  699. #endif
  700. #ifdef PHY_DP83848
  701. case PHY_DP83848:
  702. sprintf(phy[i].name, "DP83848 @ 0x%02x",
  703. active_phy_addr[i]);
  704. phy[i].init = dp83848_init_phy;
  705. phy[i].is_phy_connected = dp83848_is_phy_connected;
  706. phy[i].get_link_speed = dp83848_get_link_speed;
  707. phy[i].auto_negotiate = dp83848_auto_negotiate;
  708. break;
  709. #endif
  710. #ifdef PHY_ET1011C
  711. case PHY_ET1011C:
  712. sprintf(phy[i].name, "ET1011C @ 0x%02x",
  713. active_phy_addr[i]);
  714. phy[i].init = gen_init_phy;
  715. phy[i].is_phy_connected = gen_is_phy_connected;
  716. phy[i].get_link_speed = et1011c_get_link_speed;
  717. phy[i].auto_negotiate = gen_auto_negotiate;
  718. break;
  719. #endif
  720. default:
  721. sprintf(phy[i].name, "GENERIC @ 0x%02x",
  722. active_phy_addr[i]);
  723. phy[i].init = gen_init_phy;
  724. phy[i].is_phy_connected = gen_is_phy_connected;
  725. phy[i].get_link_speed = gen_get_link_speed;
  726. phy[i].auto_negotiate = gen_auto_negotiate;
  727. }
  728. debug("Ethernet PHY: %s\n", phy[i].name);
  729. miiphy_register(phy[i].name, davinci_mii_phy_read,
  730. davinci_mii_phy_write);
  731. }
  732. #if defined(CONFIG_DRIVER_TI_EMAC_USE_RMII) && \
  733. defined(CONFIG_MACH_DAVINCI_DA850_EVM) && \
  734. !defined(CONFIG_DRIVER_TI_EMAC_RMII_NO_NEGOTIATE)
  735. for (i = 0; i < num_phy; i++) {
  736. if (phy[i].is_phy_connected(i))
  737. phy[i].auto_negotiate(i);
  738. }
  739. #endif
  740. return(1);
  741. }