davinci_emac.c 23 KB

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