davinci_emac.c 23 KB

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