davinci_emac.c 22 KB

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