macb.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911
  1. /*
  2. * File : macb.c
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2006, RT-Thread Develop Team
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License along
  17. * with this program; if not, write to the Free Software Foundation, Inc.,
  18. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  19. *
  20. * Change Logs:
  21. * Date Author Notes
  22. * 2011-03-18 weety first version
  23. */
  24. #include <rtthread.h>
  25. #include <netif/ethernetif.h>
  26. #include "lwipopts.h"
  27. #include <at91sam926x.h>
  28. #include "macb.h"
  29. #define MMU_NOCACHE_ADDR(a) ((rt_uint32_t)a | (1UL<<31))
  30. extern void mmu_clean_dcache(rt_uint32_t buffer, rt_uint32_t size);
  31. extern void mmu_invalidate_dcache(rt_uint32_t buffer, rt_uint32_t size);
  32. /* Cache macros - Packet buffers would be from pbuf pool which is cached */
  33. #define EMAC_VIRT_NOCACHE(addr) (addr)
  34. #define EMAC_CACHE_INVALIDATE(addr, size) \
  35. mmu_invalidate_dcache((rt_uint32_t)addr, size)
  36. #define EMAC_CACHE_WRITEBACK(addr, size) \
  37. mmu_clean_dcache((rt_uint32_t)addr, size)
  38. #define EMAC_CACHE_WRITEBACK_INVALIDATE(addr, size) \
  39. mmu_clean_invalidated_dcache((rt_uint32_t)addr, size)
  40. /* EMAC has BD's in cached memory - so need cache functions */
  41. #define BD_CACHE_INVALIDATE(addr, size)
  42. #define BD_CACHE_WRITEBACK(addr, size)
  43. #define BD_CACHE_WRITEBACK_INVALIDATE(addr, size)
  44. /* EMAC internal utility function */
  45. rt_inline unsigned long emac_virt_to_phys(unsigned long addr)
  46. {
  47. return addr;
  48. }
  49. #define AT91SAM9260_SRAM0_VIRT_BASE (0x90000000)
  50. #define MACB_TX_SRAM
  51. #if defined(MACB_TX_SRAM)
  52. #define MACB_TX_RING_SIZE 2
  53. #define MACB_TX_BUFFER_SIZE (1536 * MACB_TX_RING_SIZE)
  54. #define TX_RING_BYTES (sizeof(struct macb_dma_desc) * MACB_TX_RING_SIZE)
  55. #else
  56. #define MACB_TX_RING_SIZE 16
  57. #define MACB_TX_BUFFER_SIZE (1536 * MACB_TX_RING_SIZE)
  58. #endif
  59. #define MACB_RX_BUFFER_SIZE (4096*4)
  60. #define MACB_RX_RING_SIZE (MACB_RX_BUFFER_SIZE / 128)
  61. #define DEF_TX_RING_PENDING (MACB_TX_RING_SIZE)
  62. #define TX_RING_GAP(macb) \
  63. (MACB_TX_RING_SIZE - (macb)->tx_pending)
  64. #define TX_BUFFS_AVAIL(macb) \
  65. (((macb)->tx_tail <= (macb)->tx_head) ? \
  66. (macb)->tx_tail + (macb)->tx_pending - (macb)->tx_head : \
  67. (macb)->tx_tail - (macb)->tx_head - TX_RING_GAP(macb))
  68. #define NEXT_TX(n) (((n) + 1) & (MACB_TX_RING_SIZE - 1))
  69. #define NEXT_RX(n) (((n) + 1) & (MACB_RX_RING_SIZE - 1))
  70. /* minimum number of free TX descriptors before waking up TX process */
  71. #define MACB_TX_WAKEUP_THRESH (MACB_TX_RING_SIZE / 4)
  72. #define MACB_RX_INT_FLAGS (MACB_BIT(RCOMP) | MACB_BIT(RXUBR) \
  73. | MACB_BIT(ISR_ROVR))
  74. #define MACB_TX_TIMEOUT 1000
  75. #define MACB_AUTONEG_TIMEOUT 5000000
  76. #define MACB_LINK_TIMEOUT 500000
  77. #define CONFIG_RMII
  78. struct macb_dma_desc {
  79. rt_uint32_t addr;
  80. rt_uint32_t ctrl;
  81. };
  82. #define RXADDR_USED 0x00000001
  83. #define RXADDR_WRAP 0x00000002
  84. #define RXBUF_FRMLEN_MASK 0x00000fff
  85. #define RXBUF_FRAME_START 0x00004000
  86. #define RXBUF_FRAME_END 0x00008000
  87. #define RXBUF_TYPEID_MATCH 0x00400000
  88. #define RXBUF_ADDR4_MATCH 0x00800000
  89. #define RXBUF_ADDR3_MATCH 0x01000000
  90. #define RXBUF_ADDR2_MATCH 0x02000000
  91. #define RXBUF_ADDR1_MATCH 0x04000000
  92. #define RXBUF_BROADCAST 0x80000000
  93. #define TXBUF_FRMLEN_MASK 0x000007ff
  94. #define TXBUF_FRAME_END 0x00008000
  95. #define TXBUF_NOCRC 0x00010000
  96. #define TXBUF_EXHAUSTED 0x08000000
  97. #define TXBUF_UNDERRUN 0x10000000
  98. #define TXBUF_MAXRETRY 0x20000000
  99. #define TXBUF_WRAP 0x40000000
  100. #define TXBUF_USED 0x80000000
  101. /* Duplex, half or full. */
  102. #define DUPLEX_HALF 0x00
  103. #define DUPLEX_FULL 0x01
  104. #define MAX_ADDR_LEN 6
  105. struct rt_macb_eth
  106. {
  107. /* inherit from ethernet device */
  108. struct eth_device parent;
  109. unsigned int regs;
  110. unsigned int rx_tail;
  111. unsigned int tx_head;
  112. unsigned int tx_tail;
  113. unsigned int rx_pending;
  114. unsigned int tx_pending;
  115. void *rx_buffer;
  116. void *tx_buffer;
  117. struct macb_dma_desc *rx_ring;
  118. struct macb_dma_desc *tx_ring;
  119. unsigned long rx_buffer_dma;
  120. unsigned long tx_buffer_dma;
  121. unsigned long rx_ring_dma;
  122. unsigned long tx_ring_dma;
  123. unsigned int tx_stop;
  124. /* interface address info. */
  125. rt_uint8_t dev_addr[MAX_ADDR_LEN]; /* hw address */
  126. unsigned short phy_addr;
  127. struct rt_semaphore mdio_bus_lock;
  128. struct rt_semaphore tx_lock;
  129. struct rt_semaphore rx_lock;
  130. struct rt_semaphore tx_ack;
  131. rt_uint32_t speed;
  132. rt_uint32_t duplex;
  133. rt_uint32_t link;
  134. struct rt_timer timer;
  135. };
  136. static struct rt_macb_eth macb_device;
  137. static void macb_tx(struct rt_macb_eth *macb);
  138. static void udelay(rt_uint32_t us)
  139. {
  140. rt_uint32_t len;
  141. for (;us > 0; us --)
  142. for (len = 0; len < 10; len++ );
  143. }
  144. static void rt_macb_isr(int irq, void *param)
  145. {
  146. struct rt_macb_eth *macb = (struct rt_macb_eth *)param;
  147. rt_device_t dev = &(macb->parent.parent);
  148. rt_uint32_t status, rsr, tsr;
  149. status = macb_readl(macb, ISR);
  150. while (status) {
  151. if (status & MACB_RX_INT_FLAGS)
  152. {
  153. rsr = macb_readl(macb, RSR);
  154. macb_writel(macb, RSR, rsr);
  155. /* a frame has been received */
  156. eth_device_ready(&(macb_device.parent));
  157. }
  158. if (status & (MACB_BIT(TCOMP) | MACB_BIT(ISR_TUND) |
  159. MACB_BIT(ISR_RLE)))
  160. {
  161. macb_tx(macb);
  162. }
  163. /*
  164. * Link change detection isn't possible with RMII, so we'll
  165. * add that if/when we get our hands on a full-blown MII PHY.
  166. */
  167. if (status & MACB_BIT(HRESP))
  168. {
  169. /*
  170. * TODO: Reset the hardware, and maybe move the printk
  171. * to a lower-priority context as well (work queue?)
  172. */
  173. rt_kprintf("%s: DMA bus error: HRESP not OK\n",
  174. dev->parent.name);
  175. }
  176. status = macb_readl(macb, ISR);
  177. }
  178. }
  179. static int macb_mdio_write(struct rt_macb_eth *macb, rt_uint8_t reg, rt_uint16_t value)
  180. {
  181. unsigned long netctl;
  182. unsigned long netstat;
  183. unsigned long frame;
  184. rt_sem_take(&macb->mdio_bus_lock, RT_WAITING_FOREVER);
  185. netctl = macb_readl(macb, NCR);
  186. netctl |= MACB_BIT(MPE);
  187. macb_writel(macb, NCR, netctl);
  188. frame = (MACB_BF(SOF, 1)
  189. | MACB_BF(RW, 1)
  190. | MACB_BF(PHYA, macb->phy_addr)
  191. | MACB_BF(REGA, reg)
  192. | MACB_BF(CODE, 2)
  193. | MACB_BF(DATA, value));
  194. macb_writel(macb, MAN, frame);
  195. do {
  196. netstat = macb_readl(macb, NSR);
  197. } while (!(netstat & MACB_BIT(IDLE)));
  198. netctl = macb_readl(macb, NCR);
  199. netctl &= ~MACB_BIT(MPE);
  200. macb_writel(macb, NCR, netctl);
  201. rt_sem_release(&macb->mdio_bus_lock);
  202. }
  203. static int macb_mdio_read(struct rt_macb_eth *macb, rt_uint8_t reg)
  204. {
  205. unsigned long netctl;
  206. unsigned long netstat;
  207. unsigned long frame;
  208. rt_sem_take(&macb->mdio_bus_lock, RT_WAITING_FOREVER);
  209. netctl = macb_readl(macb, NCR);
  210. netctl |= MACB_BIT(MPE);
  211. macb_writel(macb, NCR, netctl);
  212. frame = (MACB_BF(SOF, 1)
  213. | MACB_BF(RW, 2)
  214. | MACB_BF(PHYA, macb->phy_addr)
  215. | MACB_BF(REGA, reg)
  216. | MACB_BF(CODE, 2));
  217. macb_writel(macb, MAN, frame);
  218. do {
  219. netstat = macb_readl(macb, NSR);
  220. } while (!(netstat & MACB_BIT(IDLE)));
  221. frame = macb_readl(macb, MAN);
  222. netctl = macb_readl(macb, NCR);
  223. netctl &= ~MACB_BIT(MPE);
  224. macb_writel(macb, NCR, netctl);
  225. rt_sem_release(&macb->mdio_bus_lock);
  226. return MACB_BFEXT(DATA, frame);
  227. }
  228. static void macb_phy_reset(rt_device_t dev)
  229. {
  230. int i;
  231. rt_uint16_t status, adv;
  232. struct rt_macb_eth *macb = dev->user_data;;
  233. adv = ADVERTISE_CSMA | ADVERTISE_ALL;
  234. macb_mdio_write(macb, MII_ADVERTISE, adv);
  235. rt_kprintf("%s: Starting autonegotiation...\n", dev->parent.name);
  236. macb_mdio_write(macb, MII_BMCR, (BMCR_ANENABLE
  237. | BMCR_ANRESTART));
  238. for (i = 0; i < MACB_AUTONEG_TIMEOUT / 100; i++)
  239. {
  240. status = macb_mdio_read(macb, MII_BMSR);
  241. if (status & BMSR_ANEGCOMPLETE)
  242. break;
  243. udelay(100);
  244. }
  245. if (status & BMSR_ANEGCOMPLETE)
  246. rt_kprintf("%s: Autonegotiation complete\n", dev->parent.name);
  247. else
  248. rt_kprintf("%s: Autonegotiation timed out (status=0x%04x)\n",
  249. dev->parent.name, status);
  250. }
  251. static int macb_phy_init(rt_device_t dev)
  252. {
  253. struct rt_macb_eth *macb = dev->user_data;
  254. rt_uint32_t ncfgr;
  255. rt_uint16_t phy_id, status, adv, lpa;
  256. int media, speed, duplex;
  257. int i;
  258. /* Check if the PHY is up to snuff... */
  259. phy_id = macb_mdio_read(macb, MII_PHYSID1);
  260. if (phy_id == 0xffff)
  261. {
  262. rt_kprintf("%s: No PHY present\n", dev->parent.name);
  263. return 0;
  264. }
  265. status = macb_mdio_read(macb, MII_BMSR);
  266. if (!(status & BMSR_LSTATUS))
  267. {
  268. /* Try to re-negotiate if we don't have link already. */
  269. macb_phy_reset(dev);
  270. for (i = 0; i < MACB_LINK_TIMEOUT / 100; i++)
  271. {
  272. status = macb_mdio_read(macb, MII_BMSR);
  273. if (status & BMSR_LSTATUS)
  274. break;
  275. udelay(100);
  276. }
  277. }
  278. if (!(status & BMSR_LSTATUS))
  279. {
  280. rt_kprintf("%s: link down (status: 0x%04x)\n",
  281. dev->parent.name, status);
  282. return 0;
  283. }
  284. else
  285. {
  286. adv = macb_mdio_read(macb, MII_ADVERTISE);
  287. lpa = macb_mdio_read(macb, MII_LPA);
  288. media = mii_nway_result(lpa & adv);
  289. speed = (media & (ADVERTISE_100FULL | ADVERTISE_100HALF)
  290. ? 1 : 0);
  291. duplex = (media & ADVERTISE_FULL) ? 1 : 0;
  292. rt_kprintf("%s: link up, %sMbps %s-duplex (lpa: 0x%04x)\n",
  293. dev->parent.name,
  294. speed ? "100" : "10",
  295. duplex ? "full" : "half",
  296. lpa);
  297. ncfgr = macb_readl(macb, NCFGR);
  298. ncfgr &= ~(MACB_BIT(SPD) | MACB_BIT(FD));
  299. if (speed)
  300. ncfgr |= MACB_BIT(SPD);
  301. if (duplex)
  302. ncfgr |= MACB_BIT(FD);
  303. macb_writel(macb, NCFGR, ncfgr);
  304. return 1;
  305. }
  306. }
  307. void macb_update_link(void *param)
  308. {
  309. struct rt_macb_eth *macb = (struct rt_macb_eth *)param;
  310. rt_device_t dev = &macb->parent.parent;
  311. int status, status_change = 0;
  312. rt_uint32_t link;
  313. rt_uint32_t media;
  314. rt_uint16_t adv, lpa;
  315. /* Do a fake read */
  316. status = macb_mdio_read(macb, MII_BMSR);
  317. if (status < 0)
  318. return;
  319. /* Read link and autonegotiation status */
  320. status = macb_mdio_read(macb, MII_BMSR);
  321. if (status < 0)
  322. return;
  323. if ((status & BMSR_LSTATUS) == 0)
  324. link = 0;
  325. else
  326. link = 1;
  327. if (link != macb->link)
  328. {
  329. macb->link = link;
  330. status_change = 1;
  331. }
  332. if (status_change)
  333. {
  334. if (macb->link)
  335. {
  336. adv = macb_mdio_read(macb, MII_ADVERTISE);
  337. lpa = macb_mdio_read(macb, MII_LPA);
  338. media = mii_nway_result(lpa & adv);
  339. macb->speed = (media & (ADVERTISE_100FULL | ADVERTISE_100HALF)
  340. ? 100 : 10);
  341. macb->duplex = (media & ADVERTISE_FULL) ? 1 : 0;
  342. rt_kprintf("%s: link up (%dMbps/%s-duplex)\n",
  343. dev->parent.name, macb->speed,
  344. DUPLEX_FULL == macb->duplex ? "Full":"Half");
  345. eth_device_linkchange(&macb->parent, RT_TRUE);
  346. }
  347. else
  348. {
  349. rt_kprintf("%s: link down\n", dev->parent.name);
  350. eth_device_linkchange(&macb->parent, RT_FALSE);
  351. }
  352. }
  353. }
  354. /* RT-Thread Device Interface */
  355. /* initialize the interface */
  356. static rt_err_t rt_macb_init(rt_device_t dev)
  357. {
  358. struct rt_macb_eth *macb = dev->user_data;
  359. unsigned long paddr;
  360. rt_uint32_t hwaddr_bottom;
  361. rt_uint16_t hwaddr_top;
  362. int i;
  363. /*
  364. * macb_halt should have been called at some point before now,
  365. * so we'll assume the controller is idle.
  366. */
  367. /* initialize DMA descriptors */
  368. paddr = macb->rx_buffer_dma;
  369. for (i = 0; i < MACB_RX_RING_SIZE; i++)
  370. {
  371. if (i == (MACB_RX_RING_SIZE - 1))
  372. paddr |= RXADDR_WRAP;
  373. macb->rx_ring[i].addr = paddr;
  374. macb->rx_ring[i].ctrl = 0;
  375. paddr += 128;
  376. }
  377. paddr = macb->tx_buffer_dma;
  378. for (i = 0; i < MACB_TX_RING_SIZE; i++)
  379. {
  380. macb->tx_ring[i].addr = paddr;
  381. if (i == (MACB_TX_RING_SIZE - 1))
  382. macb->tx_ring[i].ctrl = TXBUF_USED | TXBUF_WRAP;
  383. else
  384. macb->tx_ring[i].ctrl = TXBUF_USED;
  385. paddr += 1536;
  386. }
  387. macb->rx_tail = macb->tx_head = macb->tx_tail = 0;
  388. BD_CACHE_WRITEBACK_INVALIDATE(macb->rx_ring, MACB_RX_RING_SIZE * sizeof(struct macb_dma_desc));
  389. BD_CACHE_WRITEBACK_INVALIDATE(macb->tx_ring, MACB_TX_RING_SIZE * sizeof(struct macb_dma_desc));
  390. macb_writel(macb, RBQP, macb->rx_ring_dma);
  391. macb_writel(macb, TBQP, macb->tx_ring_dma);
  392. /* set hardware address */
  393. hwaddr_bottom = (*((rt_uint32_t *)macb->dev_addr));
  394. macb_writel(macb, SA1B, hwaddr_bottom);
  395. hwaddr_top = (*((rt_uint16_t *)(macb->dev_addr + 4)));
  396. macb_writel(macb, SA1T, hwaddr_top);
  397. /* choose RMII or MII mode. This depends on the board */
  398. #ifdef CONFIG_RMII
  399. macb_writel(macb, USRIO, MACB_BIT(RMII) | MACB_BIT(CLKEN));
  400. #else
  401. macb_writel(macb, USRIO, MACB_BIT(CLKEN));
  402. #endif /* CONFIG_RMII */
  403. if (!macb_phy_init(dev))
  404. return -RT_ERROR;
  405. /* Enable TX and RX */
  406. macb_writel(macb, NCR, MACB_BIT(TE) | MACB_BIT(RE) | MACB_BIT(MPE));
  407. /* Enable interrupts */
  408. macb_writel(macb, IER, (MACB_BIT(RCOMP)
  409. | MACB_BIT(RXUBR)
  410. | MACB_BIT(ISR_TUND)
  411. | MACB_BIT(ISR_RLE)
  412. | MACB_BIT(TXERR)
  413. | MACB_BIT(TCOMP)
  414. | MACB_BIT(ISR_ROVR)
  415. | MACB_BIT(HRESP)));
  416. /* instal interrupt */
  417. rt_hw_interrupt_install(AT91SAM9260_ID_EMAC, rt_macb_isr,
  418. (void *)macb, "emac");
  419. rt_hw_interrupt_umask(AT91SAM9260_ID_EMAC);
  420. rt_timer_init(&macb->timer, "link_timer",
  421. macb_update_link,
  422. (void *)macb,
  423. RT_TICK_PER_SECOND,
  424. RT_TIMER_FLAG_PERIODIC);
  425. rt_timer_start(&macb->timer);
  426. return RT_EOK;
  427. }
  428. static rt_err_t rt_macb_open(rt_device_t dev, rt_uint16_t oflag)
  429. {
  430. return RT_EOK;
  431. }
  432. static rt_err_t rt_macb_close(rt_device_t dev)
  433. {
  434. return RT_EOK;
  435. }
  436. static rt_size_t rt_macb_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
  437. {
  438. rt_set_errno(-RT_ENOSYS);
  439. return 0;
  440. }
  441. static rt_size_t rt_macb_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
  442. {
  443. rt_set_errno(-RT_ENOSYS);
  444. return 0;
  445. }
  446. static rt_err_t rt_macb_control(rt_device_t dev, int cmd, void *args)
  447. {
  448. switch(cmd)
  449. {
  450. case NIOCTL_GADDR:
  451. /* get mac address */
  452. if(args) rt_memcpy(args, macb_device.dev_addr, 6);
  453. else return -RT_ERROR;
  454. break;
  455. default :
  456. break;
  457. }
  458. return RT_EOK;
  459. }
  460. static void macb_tx(struct rt_macb_eth *macb)
  461. {
  462. unsigned int tail;
  463. unsigned int head;
  464. rt_uint32_t status;
  465. status = macb_readl(macb, TSR);
  466. macb_writel(macb, TSR, status);
  467. /*rt_kprintf("macb_tx status = %02lx\n",
  468. (unsigned long)status);*/
  469. if (status & (MACB_BIT(UND) | MACB_BIT(TSR_RLE)))
  470. {
  471. int i;
  472. rt_kprintf("%s: TX %s, resetting buffers\n",
  473. macb->parent.parent.parent.name, status & MACB_BIT(UND) ?
  474. "underrun" : "retry limit exceeded");
  475. /* Transfer ongoing, disable transmitter, to avoid confusion */
  476. if (status & MACB_BIT(TGO))
  477. macb_writel(macb, NCR, macb_readl(macb, NCR) & ~MACB_BIT(TE));
  478. head = macb->tx_head;
  479. /*Mark all the buffer as used to avoid sending a lost buffer*/
  480. for (i = 0; i < MACB_TX_RING_SIZE; i++)
  481. macb->tx_ring[i].ctrl = MACB_BIT(TX_USED);
  482. /* free transmit buffer in upper layer*/
  483. macb->tx_head = macb->tx_tail = 0;
  484. /* Enable the transmitter again */
  485. if (status & MACB_BIT(TGO))
  486. macb_writel(macb, NCR, macb_readl(macb, NCR) | MACB_BIT(TE));
  487. }
  488. if (!(status & MACB_BIT(COMP)))
  489. /*
  490. * This may happen when a buffer becomes complete
  491. * between reading the ISR and scanning the
  492. * descriptors. Nothing to worry about.
  493. */
  494. return;
  495. head = macb->tx_head;
  496. for (tail = macb->tx_tail; tail != head; tail = NEXT_TX(tail))
  497. {
  498. rt_uint32_t bufstat;
  499. bufstat = macb->tx_ring[tail].ctrl;
  500. if (!(bufstat & MACB_BIT(TX_USED)))
  501. break;
  502. }
  503. macb->tx_tail = tail;
  504. if ((macb->tx_stop == 1) &&
  505. TX_BUFFS_AVAIL(macb) > MACB_TX_WAKEUP_THRESH)
  506. rt_sem_release(&macb->tx_ack);
  507. }
  508. /* ethernet device interface */
  509. /* transmit packet. */
  510. rt_err_t rt_macb_tx( rt_device_t dev, struct pbuf* p)
  511. {
  512. unsigned long ctrl;
  513. struct pbuf* q;
  514. rt_uint8_t* bufptr;
  515. rt_uint32_t mapping;
  516. struct rt_macb_eth *macb = dev->user_data;
  517. unsigned int tx_head = macb->tx_head;
  518. rt_sem_take(&macb->tx_lock, RT_WAITING_FOREVER);
  519. if (TX_BUFFS_AVAIL(macb) < 1)
  520. {
  521. rt_sem_release(&macb->tx_lock);
  522. rt_kprintf("Tx Ring full!\n");
  523. rt_kprintf("tx_head = %u, tx_tail = %u\n",
  524. macb->tx_head, macb->tx_tail);
  525. return -RT_ERROR;
  526. }
  527. macb->tx_stop = 0;
  528. ctrl = p->tot_len & TXBUF_FRMLEN_MASK;
  529. ctrl |= TXBUF_FRAME_END;
  530. if (tx_head == (MACB_TX_RING_SIZE - 1))
  531. {
  532. ctrl |= TXBUF_WRAP;
  533. }
  534. #if defined(MACB_TX_SRAM)
  535. bufptr = macb->tx_buffer + tx_head * 1536;
  536. #else
  537. mapping = (unsigned long)macb->tx_buffer + tx_head * 1536;
  538. bufptr = (rt_uint8_t *)mapping;
  539. #endif
  540. for (q = p; q != NULL; q = q->next)
  541. {
  542. memcpy(bufptr, q->payload, q->len);
  543. bufptr += q->len;
  544. }
  545. #if !defined(MACB_TX_SRAM)
  546. EMAC_CACHE_WRITEBACK(mapping, p->tot_len);
  547. #endif
  548. macb->tx_ring[tx_head].ctrl = ctrl;
  549. BD_CACHE_WRITEBACK_INVALIDATE(&macb->tx_ring[tx_head], sizeof(struct macb_dma_desc));
  550. tx_head = NEXT_TX(tx_head);
  551. macb->tx_head = tx_head;
  552. macb_writel(macb, NCR, macb_readl(macb, NCR) | MACB_BIT(TSTART));
  553. macb_writel(macb, NCR, macb_readl(macb, NCR) | MACB_BIT(TSTART));
  554. if (TX_BUFFS_AVAIL(macb) < 1)
  555. {
  556. macb->tx_stop = 1;
  557. rt_sem_take(&macb->tx_ack, RT_WAITING_FOREVER);
  558. }
  559. rt_sem_release(&macb->tx_lock);
  560. return RT_EOK;
  561. }
  562. static void reclaim_rx_buffers(struct rt_macb_eth *macb,
  563. unsigned int new_tail)
  564. {
  565. unsigned int i;
  566. i = macb->rx_tail;
  567. while (i > new_tail)
  568. {
  569. macb->rx_ring[i].addr &= ~RXADDR_USED;
  570. i++;
  571. if (i > MACB_RX_RING_SIZE)
  572. i = 0;
  573. }
  574. while (i < new_tail)
  575. {
  576. macb->rx_ring[i].addr &= ~RXADDR_USED;
  577. i++;
  578. }
  579. macb->rx_tail = new_tail;
  580. }
  581. /* reception packet. */
  582. struct pbuf *rt_macb_rx(rt_device_t dev)
  583. {
  584. struct rt_macb_eth *macb = dev->user_data;
  585. struct pbuf* p = RT_NULL;
  586. rt_uint32_t len;
  587. unsigned int rx_tail = macb->rx_tail;
  588. void *buffer;
  589. int wrapped = 0;
  590. rt_uint32_t status;
  591. rt_sem_take(&macb->rx_lock, RT_WAITING_FOREVER);
  592. for (;;)
  593. {
  594. if (!(macb->rx_ring[rx_tail].addr & RXADDR_USED))
  595. break;
  596. status = macb->rx_ring[rx_tail].ctrl;
  597. if (status & RXBUF_FRAME_START)
  598. {
  599. if (rx_tail != macb->rx_tail)
  600. reclaim_rx_buffers(macb, rx_tail);
  601. wrapped = 0;
  602. }
  603. if (status & RXBUF_FRAME_END)
  604. {
  605. buffer = (void *)((unsigned int)macb->rx_buffer + 128 * macb->rx_tail);
  606. len = status & RXBUF_FRMLEN_MASK;
  607. p = pbuf_alloc(PBUF_LINK, len, PBUF_RAM);
  608. if (!p)
  609. {
  610. rt_kprintf("alloc pbuf failed\n");
  611. break;
  612. }
  613. if (wrapped)
  614. {
  615. unsigned int headlen, taillen;
  616. headlen = 128 * (MACB_RX_RING_SIZE
  617. - macb->rx_tail);
  618. taillen = len - headlen;
  619. EMAC_CACHE_INVALIDATE(buffer, headlen);
  620. EMAC_CACHE_INVALIDATE(macb->rx_buffer, taillen);
  621. memcpy((void *)p->payload, buffer, headlen);
  622. memcpy((void *)((unsigned int)p->payload + headlen),
  623. macb->rx_buffer, taillen);
  624. }
  625. else
  626. {
  627. EMAC_CACHE_INVALIDATE(buffer, len);
  628. memcpy((void *)p->payload, buffer, p->len);
  629. }
  630. if (++rx_tail >= MACB_RX_RING_SIZE)
  631. rx_tail = 0;
  632. reclaim_rx_buffers(macb, rx_tail);
  633. break;
  634. }
  635. else
  636. {
  637. if (++rx_tail >= MACB_RX_RING_SIZE)
  638. {
  639. wrapped = 1;
  640. rx_tail = 0;
  641. }
  642. }
  643. }
  644. rt_sem_release(&macb->rx_lock);
  645. return p;
  646. }
  647. void macb_gpio_init()
  648. {
  649. /* Pins used for MII and RMII */
  650. at91_sys_write(AT91_PIOA + PIO_PDR, (1 << 19)|(1 << 17)|(1 << 14)|(1 << 15)|(1 << 18)|(1 << 16)|(1 << 12)|(1 << 13)|(1 << 21)|(1 << 20));
  651. at91_sys_write(AT91_PIOA + PIO_ASR, (1 << 19)|(1 << 17)|(1 << 14)|(1 << 15)|(1 << 18)|(1 << 16)|(1 << 12)|(1 << 13)|(1 << 21)|(1 << 20));
  652. #ifndef GONFIG_RMII
  653. at91_sys_write(AT91_PIOA + PIO_PDR, (1 << 22)|(1 << 23)|(1 << 24)|(1 << 25)|(1 << 26)|(1 << 27)|(1 << 28)|(1 << 29));
  654. at91_sys_write(AT91_PIOA + PIO_ASR, (1 << 22)|(1 << 23)|(1 << 24)|(1 << 25)|(1 << 26)|(1 << 27)|(1 << 28)|(1 << 29));
  655. #endif
  656. }
  657. rt_err_t macb_initialize()
  658. {
  659. struct rt_macb_eth *macb = &macb_device;
  660. unsigned long macb_hz;
  661. rt_uint32_t ncfgr;
  662. #if defined(MACB_TX_SRAM)
  663. macb->tx_ring_dma = AT91SAM9260_SRAM0_BASE;
  664. macb->tx_ring = (struct macb_dma_desc *)AT91SAM9260_SRAM0_VIRT_BASE;
  665. macb->tx_buffer = (char *) macb->tx_ring + TX_RING_BYTES;
  666. macb->tx_buffer_dma = macb->tx_ring_dma + TX_RING_BYTES;
  667. #else
  668. macb->tx_ring = rt_malloc(MACB_RX_RING_SIZE * sizeof(struct macb_dma_desc));
  669. if (macb->tx_ring == RT_NULL)
  670. goto err1;
  671. EMAC_CACHE_INVALIDATE(macb->tx_ring, MACB_TX_RING_SIZE * sizeof(struct macb_dma_desc));
  672. macb->tx_ring_dma = emac_virt_to_phys((unsigned long)macb->tx_ring);
  673. macb->tx_ring = (struct macb_dma_desc *)MMU_NOCACHE_ADDR((unsigned long)macb->tx_ring);
  674. macb->tx_buffer = rt_malloc(MACB_TX_BUFFER_SIZE);
  675. if (macb->tx_buffer == RT_NULL)
  676. goto err2;
  677. macb->tx_buffer_dma = emac_virt_to_phys((unsigned long)macb->tx_buffer);
  678. #endif
  679. macb->rx_ring = rt_malloc(MACB_RX_RING_SIZE * sizeof(struct macb_dma_desc));
  680. if (macb->rx_ring == RT_NULL)
  681. goto err3;
  682. EMAC_CACHE_INVALIDATE(macb->rx_ring, MACB_RX_RING_SIZE * sizeof(struct macb_dma_desc));
  683. macb->rx_ring_dma = emac_virt_to_phys((unsigned long)macb->rx_ring);
  684. macb->rx_ring = (struct macb_dma_desc *)MMU_NOCACHE_ADDR((unsigned long)macb->rx_ring);
  685. macb->rx_buffer = rt_malloc(MACB_RX_BUFFER_SIZE);
  686. if (macb->rx_buffer == RT_NULL)
  687. goto err4;
  688. macb->rx_buffer_dma = emac_virt_to_phys((unsigned long)macb->rx_buffer);
  689. macb->tx_pending = DEF_TX_RING_PENDING;
  690. macb->regs = AT91SAM9260_BASE_EMAC;
  691. macb->phy_addr = 0x00;
  692. /*
  693. * Do some basic initialization so that we at least can talk
  694. * to the PHY
  695. */
  696. macb_hz = clk_get_rate(clk_get("mck"));
  697. if (macb_hz < 20000000)
  698. ncfgr = MACB_BF(CLK, MACB_CLK_DIV8);
  699. else if (macb_hz < 40000000)
  700. ncfgr = MACB_BF(CLK, MACB_CLK_DIV16);
  701. else if (macb_hz < 80000000)
  702. ncfgr = MACB_BF(CLK, MACB_CLK_DIV32);
  703. else
  704. ncfgr = MACB_BF(CLK, MACB_CLK_DIV64);
  705. macb_writel(macb, NCFGR, ncfgr);
  706. macb->link = 0;
  707. return RT_EOK;
  708. err4:
  709. rt_free(macb->rx_ring);
  710. macb->rx_ring = RT_NULL;
  711. err3:
  712. #if !defined(MACB_TX_SRAM)
  713. rt_free(macb->tx_buffer);
  714. macb->tx_buffer = RT_NULL;
  715. err2:
  716. rt_free(macb->tx_ring);
  717. macb->tx_ring = RT_NULL;
  718. err1:
  719. #endif
  720. return -RT_ENOMEM;
  721. }
  722. int rt_hw_macb_init(void)
  723. {
  724. rt_err_t ret;
  725. at91_sys_write(AT91_PMC + AT91_PMC_PCER, 1 << AT91SAM9260_ID_EMAC); //enable macb clock
  726. macb_gpio_init();
  727. rt_memset(&macb_device, 0, sizeof(macb_device));
  728. ret = macb_initialize();
  729. if (ret != RT_EOK)
  730. {
  731. rt_kprintf("AT91 EMAC initialized failed\n");
  732. return -1;
  733. }
  734. rt_sem_init(&macb_device.tx_ack, "tx_ack", 0, RT_IPC_FLAG_FIFO);
  735. rt_sem_init(&macb_device.tx_lock, "tx_lock", 1, RT_IPC_FLAG_FIFO);
  736. rt_sem_init(&macb_device.rx_lock, "rx_lock", 1, RT_IPC_FLAG_FIFO);
  737. macb_device.dev_addr[0] = 0x00;
  738. macb_device.dev_addr[1] = 0x60;
  739. macb_device.dev_addr[2] = 0x6E;
  740. macb_device.dev_addr[3] = 0x11;
  741. macb_device.dev_addr[4] = 0x22;
  742. macb_device.dev_addr[5] = 0x33;
  743. macb_device.parent.parent.init = rt_macb_init;
  744. macb_device.parent.parent.open = rt_macb_open;
  745. macb_device.parent.parent.close = rt_macb_close;
  746. macb_device.parent.parent.read = rt_macb_read;
  747. macb_device.parent.parent.write = rt_macb_write;
  748. macb_device.parent.parent.control = rt_macb_control;
  749. macb_device.parent.parent.user_data = &macb_device;
  750. macb_device.parent.eth_rx = rt_macb_rx;
  751. macb_device.parent.eth_tx = rt_macb_tx;
  752. rt_sem_init(&macb_device.mdio_bus_lock, "mdio_bus_lock", 1, RT_IPC_FLAG_FIFO);
  753. eth_device_init(&(macb_device.parent), "e0");
  754. return 0;
  755. }
  756. INIT_DEVICE_EXPORT(rt_hw_macb_init);