macb.c 25 KB

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