drv_rtl8139.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889
  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. * 2021-08-16 JasonHu first version
  9. */
  10. #include <board.h>
  11. #include <rtthread.h>
  12. #include <rtdevice.h>
  13. #include <rthw.h>
  14. #include <netif/ethernetif.h>
  15. #include <pci.h>
  16. #include <mmu.h>
  17. #define DBG_LVL DBG_INFO
  18. #define DBG_TAG "RTL8139"
  19. #include <rtdbg.h>
  20. #include "drv_rtl8139.h"
  21. #define DEV_NAME "e0"
  22. #define GET_RTL8139(eth) (struct eth_device_rtl8139 *)(eth)
  23. struct eth_device_rtl8139
  24. {
  25. /* inherit from Ethernet device */
  26. struct eth_device parent;
  27. /* interface address info. */
  28. rt_uint8_t dev_addr[ETH_ALEN]; /* MAC address */
  29. rt_pci_device_t *pci_dev; /* pci device info */
  30. rt_uint32_t iobase; /* io port base */
  31. rt_uint32_t irqno; /* irq number */
  32. card_chip_t chipset;
  33. rt_spinlock_t lock; /* lock for rx packet */
  34. rt_uint8_t *rx_buffer;
  35. rt_uint8_t *rx_ring;
  36. rt_uint8_t current_rx; /* CAPR, Current Address of Packet Read */
  37. rt_uint32_t rx_flags;
  38. rt_ubase_t rx_ring_dma; /* dma phy addr */
  39. rt_uint32_t rx_config; /* receive config */
  40. struct rtl8139_status rx_status;
  41. rt_uint8_t *tx_buffers;
  42. rt_uint8_t *tx_buffer[NUM_TX_DESC]; /* tx buffer pointer array */
  43. rt_uint32_t current_tx;
  44. rt_uint32_t dirty_tx;
  45. rt_size_t tx_free_counts;
  46. rt_uint32_t tx_flags;
  47. rt_ubase_t tx_buffer_dma; /* dma phy addr */
  48. struct rtl8139_status tx_status;
  49. struct net_device_status stats; /* device stats */
  50. struct rtl_extra_status xstats; /* extra status */
  51. rt_uint32_t dev_flags; /* flags of net device */
  52. rt_mq_t rx_mqueue; /* msg queue for rx */
  53. rt_uint8_t linked; /* eth device linked */
  54. };
  55. static struct eth_device_rtl8139 eth_dev;
  56. static rt_uint8_t rx_cache_send_buf[RX_MSG_SIZE] = {0}; /* buf for rx packet, put size and data into mq */
  57. static rt_uint8_t rx_cache_recv_buf[RX_MSG_SIZE] = {0}; /* buf for rx packet, get size and data from mq */
  58. static rt_uint8_t tx_cache_pbuf[TX_CACHE_BUF_SIZE] = {0}; /* buf for tx packet, get data from pbuf payload */
  59. static int rtl8139_next_desc(int current_desc)
  60. {
  61. return (current_desc == NUM_TX_DESC - 1) ? 0 : (current_desc + 1);
  62. }
  63. int rtl8139_transmit(struct eth_device_rtl8139 *dev, rt_uint8_t *buf, rt_size_t len)
  64. {
  65. rt_uint32_t entry;
  66. rt_uint32_t length = len;
  67. entry = dev->current_tx;
  68. rt_base_t level = rt_hw_interrupt_disable();
  69. if (dev->tx_free_counts > 0)
  70. {
  71. if (length < TX_BUF_SIZE)
  72. {
  73. if (length < ETH_ZLEN)
  74. {
  75. rt_memset(dev->tx_buffer[entry], 0, ETH_ZLEN); /* pad zero */
  76. }
  77. rt_memcpy(dev->tx_buffer[entry], buf, length);
  78. }
  79. else
  80. {
  81. /* drop packet */
  82. dev->stats.tx_dropped++;
  83. dbg_log(DBG_WARNING, "dropped a packed!\n");
  84. rt_hw_interrupt_enable(level);
  85. return 0;
  86. }
  87. /*
  88. * Writing to tx_status triggers a DMA transfer of the data
  89. * copied to dev->tx_buffer[entry] above. Use a memory barrier
  90. * to make sure that the device sees the updated data.
  91. */
  92. rt_hw_dsb();
  93. outl(dev->iobase + TX_STATUS0 + (entry * 4), dev->tx_flags | ETH_MAX(length, (rt_uint32_t )ETH_ZLEN));
  94. inl(dev->iobase + TX_STATUS0 + (entry * 4)); // flush
  95. dev->current_tx = rtl8139_next_desc(dev->current_tx);
  96. --dev->tx_free_counts;
  97. } else {
  98. LOG_E("Stop Tx packet!\n");
  99. rt_hw_interrupt_enable(level);
  100. return -1;
  101. }
  102. rt_hw_interrupt_enable(level);
  103. return 0;
  104. }
  105. /* Initialize the Rx and Tx rings, along with various 'dev' bits. */
  106. static void rtl8139_init_ring(struct eth_device_rtl8139 *dev)
  107. {
  108. int i;
  109. dev->current_rx = 0;
  110. dev->current_tx = 0;
  111. dev->dirty_tx = 0;
  112. /* set free counts */
  113. dev->tx_free_counts = NUM_TX_DESC;
  114. for (i = 0; i < NUM_TX_DESC; i++)
  115. {
  116. dev->tx_buffer[i] = (unsigned char *)&dev->tx_buffers[i * TX_BUF_SIZE];
  117. }
  118. }
  119. static void rtl8139_chip_reset(struct eth_device_rtl8139 *dev)
  120. {
  121. /* software reset, to clear the RX and TX buffers and set everything back to defaults. */
  122. outb(dev->iobase + CHIP_CMD, CMD_RESET);
  123. /* wait reset done */
  124. for (;;)
  125. {
  126. rt_hw_dmb();
  127. if ((inb(dev->iobase + CHIP_CMD) & CMD_RESET) == 0)
  128. {
  129. break;
  130. }
  131. rt_hw_cpu_pause();
  132. }
  133. }
  134. static void rtl8139_set_rx_mode(struct eth_device_rtl8139 *dev)
  135. {
  136. rt_base_t level = rt_hw_interrupt_disable();
  137. int rx_mode = ACCEPT_BROADCAST | ACCEPT_MY_PHYS | ACCEPT_MULTICAST;
  138. rx_mode |= (ACCEPT_ERR | ACCEPT_RUNT);
  139. rt_uint32_t tmp;
  140. tmp = rtl8139_rx_config | rx_mode;
  141. if (dev->rx_config != tmp)
  142. {
  143. outl(dev->iobase + RX_CONFIG, tmp);
  144. /* flush */
  145. inl(dev->iobase + RX_CONFIG);
  146. dev->rx_config = tmp;
  147. }
  148. /* filter packet */
  149. rt_uint32_t mac_filter[2];
  150. mac_filter[0] = mac_filter[1] = 0;
  151. outl(dev->iobase + MAR0 + 0, mac_filter[0]);
  152. inl(dev->iobase + MAR0 + 0);
  153. outl(dev->iobase + MAR0 + 4, mac_filter[1]);
  154. inl(dev->iobase + MAR0 + 4);
  155. rt_hw_interrupt_enable(level);
  156. }
  157. static void rtl8139_hardware_start(struct eth_device_rtl8139 *dev)
  158. {
  159. /* Bring old chips out of low-power mode. */
  160. if (rtl_chip_info[dev->chipset].flags & HAS_HLT_CLK)
  161. {
  162. outb(dev->iobase + HLT_CTL, 'R');
  163. }
  164. rtl8139_chip_reset(dev);
  165. /* unlock Config[01234] and BMCR register writes */
  166. outb(dev->iobase + CFG9346, CFG9346_UNLOCK);
  167. inb(dev->iobase + CFG9346); // flush
  168. /* Restore our rtl8139a of the MAC address. */
  169. outl(dev->iobase + MAC0, *(rt_uint32_t *)(dev->dev_addr + 0));
  170. inl(dev->iobase + MAC0);
  171. outw(dev->iobase + MAC0 + 4, *(uint16_t *)(dev->dev_addr + 4));
  172. inw(dev->iobase + MAC0 + 4);
  173. dev->current_rx = 0;
  174. /* init Rx ring buffer DMA address */
  175. outl(dev->iobase + RX_BUF, dev->rx_ring_dma);
  176. inl(dev->iobase + RX_BUF);
  177. /* Must enable Tx/Rx before setting transfer thresholds! */
  178. outb(dev->iobase + CHIP_CMD, CMD_RX_ENABLE | CMD_TX_ENABLE);
  179. /* set receive config */
  180. dev->rx_config = rtl8139_rx_config | ACCEPT_BROADCAST | ACCEPT_MY_PHYS;
  181. outl(dev->iobase + RX_CONFIG, dev->rx_config);
  182. outl(dev->iobase + TX_CONFIG, rtl8139_tx_config);
  183. if (dev->chipset >= CH_8139B)
  184. {
  185. /* Disable magic packet scanning, which is enabled
  186. * when PM is enabled in Config1. It can be reenabled
  187. * via ETHTOOL_SWOL if desired.
  188. * clear MAGIC bit
  189. */
  190. outb(dev->iobase + CONFIG3, inb(dev->iobase + CONFIG3) & ~CFG3_MAGIC);
  191. }
  192. /* Lock Config[01234] and BMCR register writes */
  193. outb(dev->iobase + CFG9346, CFG9346_LOCK);
  194. /* init Tx buffer DMA addresses */
  195. int i;
  196. for (i = 0; i < NUM_TX_DESC; i++)
  197. {
  198. outl(dev->iobase + TX_ADDR0 + (i * 4), dev->tx_buffer_dma + (dev->tx_buffer[i] - dev->tx_buffers));
  199. /* flush */
  200. inl(dev->iobase + TX_ADDR0 + (i * 4));
  201. }
  202. outl(dev->iobase + RX_MISSED, 0);
  203. rtl8139_set_rx_mode(dev);
  204. /* no early-rx intr */
  205. outw(dev->iobase + MULTI_INTR, inw(dev->iobase + MULTI_INTR) & MULTI_INTR_CLEAR);
  206. /* make sure tx & rx enabled */
  207. uint8_t tmp = inb(dev->iobase + CHIP_CMD);
  208. if (!(tmp & CMD_RX_ENABLE) || !(tmp & CMD_TX_ENABLE))
  209. {
  210. outb(dev->iobase + CHIP_CMD, CMD_RX_ENABLE | CMD_TX_ENABLE);
  211. }
  212. /* enable 8139 intr mask */
  213. outw(dev->iobase + INTR_MASK, rtl8139_intr_mask);
  214. }
  215. static int rtl8139_tx_interrupt(struct eth_device_rtl8139 *dev)
  216. {
  217. while (dev->tx_free_counts < NUM_TX_DESC)
  218. {
  219. int entry = dev->dirty_tx;
  220. int tx_status;
  221. /* read tx status */
  222. tx_status = inl(dev->iobase + TX_STATUS0 + (entry * 4));
  223. /* no tx intr, exit */
  224. if (!(tx_status & (TX_STAT_OK | TX_UNDERRUN | TX_ABORTED)))
  225. {
  226. dbg_log(DBG_ERROR, "tx status not we want!\n");
  227. break;
  228. }
  229. /* NOTE: TxCarrierLost is always asserted at 100mbps. */
  230. if (tx_status & (TX_OUT_OF_WINDOW | TX_ABORTED))
  231. {
  232. dbg_log(DBG_ERROR, "Transmit error, Tx status %x\n", tx_status);
  233. dev->stats.tx_errors++;
  234. if (tx_status & TX_ABORTED)
  235. {
  236. dev->stats.tx_aborted_errors++;
  237. /* clear abort bit */
  238. outl(dev->iobase + TX_CONFIG, TX_CLEAR_ABT);
  239. /* set intr tx error */
  240. outw(dev->iobase + INTR_STATUS, TX_ERR);
  241. rt_hw_dsb();
  242. }
  243. if (tx_status & TX_CARRIER_LOST)
  244. {
  245. dev->stats.tx_carrier_errors++;
  246. }
  247. if (tx_status & TX_OUT_OF_WINDOW)
  248. {
  249. dev->stats.tx_window_errors++;
  250. }
  251. }
  252. else
  253. {
  254. if (tx_status & TX_UNDERRUN)
  255. {
  256. /* Add 64 to the Tx FIFO threshold. */
  257. if (dev->tx_flags < 0x00300000) {
  258. dev->tx_flags += 0x00020000;
  259. }
  260. dev->stats.tx_fifo_errors++;
  261. }
  262. dev->stats.collisions += (tx_status >> 24) & 15;
  263. dev->tx_status.packets++;
  264. dev->tx_status.bytes += tx_status & 0x7ff;
  265. }
  266. dev->dirty_tx = rtl8139_next_desc(dev->dirty_tx);
  267. if (dev->tx_free_counts == 0)
  268. {
  269. rt_hw_dmb();
  270. }
  271. dev->tx_free_counts++;
  272. }
  273. return 0;
  274. }
  275. static void rtl8139_other_interrupt(struct eth_device_rtl8139 *dev, int status, int link_changed)
  276. {
  277. /* Update the error count. */
  278. dev->stats.rx_missed_errors += inl(dev->iobase + RX_MISSED);
  279. outl(dev->iobase + RX_MISSED, 0);
  280. if ((status & RX_UNDERRUN) && link_changed && (dev->dev_flags & HAS_LNK_CHNG))
  281. {
  282. dev->linked = RT_FALSE; /* dev not linked */
  283. status &= ~RX_UNDERRUN;
  284. }
  285. if (status & (RX_UNDERRUN | RX_ERR))
  286. {
  287. dev->stats.rx_errors++;
  288. }
  289. if (status & PCS_TIMEOUT)
  290. {
  291. dev->stats.rx_length_errors++;
  292. }
  293. if (status & RX_UNDERRUN)
  294. {
  295. dev->stats.rx_fifo_errors++;
  296. }
  297. if (status & PCI_ERR) /* error on pci */
  298. {
  299. rt_uint32_t pci_cmd_status;
  300. pci_cmd_status = rt_pci_device_read(dev->pci_dev, PCI_STATUS_COMMAND);
  301. rt_pci_device_write(dev->pci_dev, PCI_STATUS_COMMAND, pci_cmd_status);
  302. dbg_log(DBG_ERROR, "PCI Bus error %x\n", pci_cmd_status >> 16);
  303. }
  304. }
  305. static void rtl8139_rx_error(rt_uint32_t rx_status, struct eth_device_rtl8139 *dev)
  306. {
  307. rt_uint8_t tmp;
  308. dev->stats.rx_errors++;
  309. /* rx error */
  310. if (!(rx_status & RX_STATUS_OK))
  311. {
  312. /* frame error */
  313. if (rx_status & (RX_BAD_SYMBOL | RX_BAD_Align))
  314. {
  315. dev->stats.rx_frame_errors++;
  316. }
  317. /* long */
  318. if (rx_status & (RX_RUNT | RX_TOO_LONG))
  319. {
  320. dev->stats.rx_length_errors++;
  321. }
  322. /* CRC check */
  323. if (rx_status & RX_CRC_ERR)
  324. {
  325. dev->stats.rx_crc_errors++;
  326. }
  327. }
  328. else
  329. {
  330. /* receive ok, but lost */
  331. dev->xstats.rx_lost_in_ring++;
  332. }
  333. /* reset receive */
  334. tmp = inb(dev->iobase + CHIP_CMD);
  335. outb(dev->iobase + CHIP_CMD, tmp & ~CMD_RX_ENABLE);
  336. outb(dev->iobase + CHIP_CMD, tmp);
  337. outl(dev->iobase + RX_CONFIG, dev->rx_config);
  338. dev->current_rx = 0;
  339. }
  340. static void rtl8139_isr_ack(struct eth_device_rtl8139 *dev)
  341. {
  342. rt_uint16_t status;
  343. status = inw(dev->iobase + INTR_STATUS) & RX_ACK_BITS;
  344. /* Clear out errors and receive interrupts */
  345. if (status != 0)
  346. {
  347. if (status & (RX_FIFO_OVER | RX_OVERFLOW))
  348. {
  349. dev->stats.rx_errors++;
  350. if (status & RX_FIFO_OVER)
  351. {
  352. dev->stats.rx_fifo_errors++;
  353. }
  354. }
  355. /* write rx ack */
  356. outw(dev->iobase + INTR_STATUS, RX_ACK_BITS);
  357. inw(dev->iobase + INTR_STATUS); // for flush
  358. }
  359. }
  360. static int rtl8139_rx_interrupt(struct eth_device_rtl8139 *dev)
  361. {
  362. int received = 0;
  363. rt_uint8_t *rx_ring = dev->rx_ring;
  364. rt_uint32_t current_rx = dev->current_rx;
  365. rt_uint32_t rx_size = 0;
  366. while (!(inb(dev->iobase + CHIP_CMD) & RX_BUFFER_EMPTY))
  367. {
  368. rt_uint32_t ring_offset = current_rx % RX_BUF_LEN;
  369. rt_uint32_t rx_status;
  370. rt_size_t pkt_size;
  371. rt_hw_dmb();
  372. /* read size+status of next frame from DMA ring buffer */
  373. rx_status = *(rt_uint32_t *)(rx_ring + ring_offset);
  374. /* size on high 16 bit */
  375. rx_size = rx_status >> 16;
  376. if (!(dev->dev_flags & DEV_FLAGS_RXFCS)) {
  377. pkt_size = rx_size - 4;
  378. } else {
  379. pkt_size = rx_size;
  380. }
  381. /* Packet copy from FIFO still in progress.
  382. * Theoretically, this should never happen
  383. * since early_rx is disabled.
  384. */
  385. if (rx_size == 0xfff0)
  386. {
  387. dbg_log(DBG_WARNING, "rx fifo copy in progress\n");
  388. dev->xstats.early_rx++;
  389. break;
  390. }
  391. /* If Rx err or invalid rx_size/rx_status received
  392. * (which happens if we get lost in the ring),
  393. * Rx process gets reset, so we abort any further
  394. * Rx processing.
  395. */
  396. if ((rx_size > (MAX_ETH_FRAME_SIZE + 4) || (rx_size < 8) || (!(rx_status & RX_STATUS_OK))))
  397. {
  398. if ((dev->dev_flags & DEV_FLAGS_RXALL) && (rx_size <= (MAX_ETH_FRAME_SIZE + 4)) &&
  399. (rx_size >= 8) && (!(rx_status & RX_STATUS_OK)))
  400. {
  401. dev->stats.rx_errors++;
  402. if (rx_status & RX_CRC_ERR)
  403. {
  404. dev->stats.rx_crc_errors++;
  405. goto keep_pkt;
  406. }
  407. if (rx_status & RX_RUNT)
  408. {
  409. dev->stats.rx_length_errors++;
  410. goto keep_pkt;
  411. }
  412. }
  413. /* rx error handle */
  414. rtl8139_rx_error(rx_status, dev);
  415. received = -1;
  416. goto out;
  417. }
  418. keep_pkt:
  419. /* merge size and data into receive pkg */
  420. rt_memcpy(rx_cache_send_buf, &pkt_size, 4);
  421. rt_memcpy(&rx_cache_send_buf[4], &rx_ring[ring_offset + 4], pkt_size);
  422. rt_mq_send_interrupt(dev->rx_mqueue, rx_cache_send_buf, pkt_size + 4);
  423. eth_device_ready(&dev->parent); /* notify eth thread to read packet */
  424. dev->rx_status.packets++;
  425. dev->rx_status.bytes += pkt_size;
  426. received++;
  427. /* 4:for header length(length include 4 bytes CRC)
  428. * 3:for dword alignment
  429. */
  430. current_rx = (current_rx + rx_size + 4 + 3) & ~3;
  431. outw(dev->iobase + RX_BUF_PTR, (rt_uint16_t)(current_rx - 16));
  432. rtl8139_isr_ack(dev);
  433. }
  434. if (!received || rx_size == 0xfff0)
  435. {
  436. rtl8139_isr_ack(dev);
  437. }
  438. dev->current_rx = current_rx;
  439. out:
  440. return received;
  441. }
  442. static void rt_hw_rtl8139_isr(int vector, void *param)
  443. {
  444. struct eth_device_rtl8139 *dev = GET_RTL8139(param);
  445. rt_uint16_t status, ackstat;
  446. int link_changed = 0; /* avoid bogus "uninit" warning */
  447. rt_spin_lock(&dev->lock);
  448. status = inw(dev->iobase + INTR_STATUS);
  449. outw(dev->iobase + INTR_STATUS, status);
  450. if ((status & rtl8139_intr_mask) == 0)
  451. {
  452. dbg_log(DBG_LOG, "no interrupt occured on me!\n");
  453. rt_spin_unlock(&dev->lock);
  454. return;
  455. }
  456. /* check netif state whether running. */
  457. if (!dev->linked)
  458. {
  459. /* clear intr mask, don't receive intr forever */
  460. outw(dev->iobase + INTR_MASK, 0);
  461. goto out;
  462. }
  463. /* Acknowledge all of the current interrupt sources ASAP, but
  464. an first get an additional status bit from CSCR. */
  465. if (status & RX_UNDERRUN)
  466. {
  467. link_changed = inw(dev->iobase + CSCR) & CSCR_LINK_CHANGE;
  468. }
  469. ackstat = status & ~(RX_ACK_BITS | TX_ERR);
  470. if (ackstat)
  471. {
  472. outw(dev->iobase + INTR_STATUS, ackstat);
  473. }
  474. if (status & RX_ACK_BITS)
  475. {
  476. rtl8139_rx_interrupt(dev);
  477. }
  478. /* Check uncommon events with one test. */
  479. if (status & (PCI_ERR | PCS_TIMEOUT | RX_UNDERRUN | RX_ERR))
  480. {
  481. rtl8139_other_interrupt(dev, status, link_changed);
  482. }
  483. /* handle receive */
  484. if (status & (TX_OK | TX_ERR))
  485. {
  486. rtl8139_tx_interrupt(dev);
  487. if (status & TX_ERR)
  488. outw(dev->iobase + INTR_STATUS, TX_ERR);
  489. }
  490. out:
  491. rt_spin_unlock(&dev->lock);
  492. }
  493. static rt_err_t rtl8139_init(rt_device_t device)
  494. {
  495. struct eth_device_rtl8139 *dev = GET_RTL8139(device);
  496. /* alloc transmit buffer */
  497. dev->tx_buffers = (rt_uint8_t *) rt_malloc(TX_BUF_TOTAL_LEN);
  498. if (dev->tx_buffers == RT_NULL)
  499. {
  500. LOG_E("alloc memory for rtl8139 tx buffer failed!\n");
  501. return -1;
  502. }
  503. /* alloc receive buffer */
  504. dev->rx_ring = (rt_uint8_t *) rt_malloc(RX_BUF_TOTAL_LEN);
  505. if (dev->rx_ring == RT_NULL) {
  506. LOG_E("alloc memory for rtl8139 rx buffer failed!\n");
  507. rt_free(dev->tx_buffers);
  508. return -1;
  509. }
  510. /* create msg queue for eth rx */
  511. dev->rx_mqueue = rt_mq_create("rx_mqueue", RX_MSG_SIZE, RX_MSG_CNT, 0);
  512. if (dev->rx_mqueue == RT_NULL)
  513. {
  514. LOG_E("crete msg queue for rx buffer failed!\n");
  515. rt_free(dev->tx_buffers);
  516. rt_free(dev->rx_ring);
  517. return -1;
  518. }
  519. dev->tx_buffer_dma = (rt_ubase_t)rt_hw_vir2phy(dev->tx_buffers);
  520. dev->rx_ring_dma = (rt_ubase_t)rt_hw_vir2phy(dev->rx_ring);
  521. dev->tx_flags = (TX_FIFO_THRESH << 11) & 0x003f0000;
  522. /* init tx and rx ring */
  523. rtl8139_init_ring(dev);
  524. rtl8139_hardware_start(dev);
  525. dev->dev_flags = DEV_FLAGS_RXALL;
  526. dev->linked = RT_TRUE;
  527. eth_device_linkchange(&dev->parent, RT_TRUE);
  528. if (rt_hw_interrupt_install(dev->irqno, rt_hw_rtl8139_isr, (void *) dev, "rtl8139") < 0)
  529. {
  530. LOG_E("install IRQ failed!\n");
  531. rt_free(dev->tx_buffers);
  532. rt_free(dev->rx_ring);
  533. rt_mq_delete(dev->rx_mqueue);
  534. return RT_ERROR;
  535. }
  536. rt_hw_interrupt_umask(dev->irqno);
  537. dbg_log(DBG_INFO, "ethernet card init done.\n");
  538. return RT_EOK;
  539. }
  540. #ifdef RT_USING_DEVICE_OPS
  541. const static struct rt_device_ops rtl8139_ops =
  542. {
  543. rtl8139_init,
  544. RT_NULL,
  545. RT_NULL,
  546. RT_NULL,
  547. RT_NULL,
  548. rtl8139_control
  549. };
  550. #endif
  551. static int rtl8139_get_pci(struct eth_device_rtl8139 *dev)
  552. {
  553. /* get pci device */
  554. rt_pci_device_t *pci_dev = rt_pci_device_get(RTL8139_VENDOR_ID, RTL8139_DEVICE_ID);
  555. if (pci_dev == RT_NULL)
  556. {
  557. LOG_E("device not find on pci device.\n");
  558. return -1;
  559. }
  560. dev->pci_dev = pci_dev;
  561. dbg_log(DBG_LOG, "find device, vendor id: 0x%x, device id: 0x%x\n",
  562. pci_dev->vendor_id, pci_dev->device_id);
  563. /* enable bus mastering */
  564. rt_pci_enable_bus_mastering(pci_dev);
  565. /* get io port address */
  566. dev->iobase = rt_pci_device_get_io_addr(pci_dev);
  567. if (dev->iobase == 0)
  568. {
  569. LOG_E("invalid pci device io address.\n");
  570. return -1;
  571. }
  572. dbg_log(DBG_LOG, "io base address: 0x%x\n", dev->iobase);
  573. /* get irq */
  574. dev->irqno = rt_pci_device_get_irq_line(pci_dev);
  575. if (dev->irqno == 0xff)
  576. {
  577. LOG_E("invalid irqno.\n");
  578. return -1;
  579. }
  580. dbg_log(DBG_LOG, "irqno %d\n", dev->irqno);
  581. return 0;
  582. }
  583. static int rtl8139_init_board(struct eth_device_rtl8139 *dev)
  584. {
  585. /* check for missing/broken hardware */
  586. if (inl(dev->iobase + TX_CONFIG) == 0xFFFFFFFF)
  587. {
  588. dbg_log(DBG_ERROR, "chip not responding, ignoring board.\n");
  589. return -1;
  590. }
  591. rt_uint32_t version = inl(dev->iobase + TX_CONFIG) & HW_REVID_MASK;
  592. int i;
  593. for (i = 0; i < CHIP_INFO_NR; i++)
  594. {
  595. if (version == rtl_chip_info[i].version) {
  596. dev->chipset = i;
  597. goto chip_match;
  598. }
  599. }
  600. /* if unknown chip, assume array element #0, original RTL-8139 in this case */
  601. i = 0;
  602. dbg_log(DBG_LOG, "unknown chip version, assuming RTL-8139\n");
  603. dbg_log(DBG_LOG, "TxConfig = 0x%x\n", inl(dev->iobase + TX_CONFIG));
  604. dev->chipset = 0;
  605. chip_match:
  606. dbg_log(DBG_LOG, "chipset id (%x) == index %d, '%s'\n",
  607. version, i, rtl_chip_info[i].name);
  608. /* start netcard */
  609. if (dev->chipset >= CH_8139B)
  610. {
  611. dbg_log(DBG_WARNING, "PCI PM wakeup, not support now!\n");
  612. }
  613. else
  614. {
  615. rt_uint8_t tmp = inb(dev->iobase + CONFIG1);
  616. tmp &= ~(CFG1_SLEEP | CFG1_PWRDN);
  617. outb(dev->iobase + CONFIG1, tmp);
  618. }
  619. /* reset chip */
  620. rtl8139_chip_reset(dev);
  621. return 0;
  622. }
  623. static int rtl8139_init_hw(struct eth_device_rtl8139 *dev)
  624. {
  625. rt_pci_device_t *pci_dev = dev->pci_dev;
  626. /* check version */
  627. if (pci_dev->vendor_id == RTL8139_VENDOR_ID && pci_dev->device_id == RTL8139_DEVICE_ID &&
  628. pci_dev->revision_id >= 0x20)
  629. {
  630. dbg_log(DBG_LOG, "This (id %04x:%04x rev %02x) is an enhanced 8139C+ chip, use 8139cp\n",
  631. pci_dev->vendor_id, pci_dev->device_id, pci_dev->revision_id);
  632. }
  633. if (rtl8139_init_board(dev) < 0)
  634. {
  635. return -1;
  636. }
  637. /* get MAC from pci config */
  638. int i;
  639. for (i = 0; i < ETH_ALEN; i++) {
  640. dev->dev_addr[i] = inb(dev->iobase + MAC0 + i);
  641. }
  642. dbg_log(DBG_INFO, "MAC addr: %x:%x:%x:%x:%x:%x\n", dev->dev_addr[0], dev->dev_addr[1],
  643. dev->dev_addr[2], dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
  644. rt_spin_lock_init(&dev->lock);
  645. /* Put the chip into low-power mode. */
  646. if (rtl_chip_info[dev->chipset].flags & HAS_HLT_CLK)
  647. {
  648. outb(dev->iobase + HLT_CTL, 'H'); /* 'R' would leave the clock running. */
  649. }
  650. return 0;
  651. }
  652. static rt_err_t rtl8139_tx(rt_device_t device, struct pbuf *p)
  653. {
  654. rt_err_t err = RT_EOK;
  655. /* copy data from pbuf to tx cache */
  656. pbuf_copy_partial(p, (void *)&tx_cache_pbuf[0], p->tot_len, 0);
  657. if (rtl8139_transmit(GET_RTL8139(device), tx_cache_pbuf, p->tot_len) < 0)
  658. {
  659. err = RT_ERROR;
  660. }
  661. return err;
  662. }
  663. static struct pbuf *rtl8139_rx(rt_device_t device)
  664. {
  665. struct eth_device_rtl8139 *dev = GET_RTL8139(device);
  666. int recv_len = 0;
  667. struct pbuf *pbuf = RT_NULL;
  668. rt_err_t err;
  669. /* get data from rx queue. */
  670. err = rt_mq_recv_interruptible(dev->rx_mqueue, rx_cache_recv_buf, RX_MSG_SIZE, 0);
  671. if (err != RT_EOK)
  672. {
  673. goto end;
  674. }
  675. /* get recv len from rx cache, 0~3: recv len, 3-n: frame data */
  676. recv_len = *(int *)rx_cache_recv_buf;
  677. if (recv_len > 0)
  678. {
  679. pbuf = pbuf_alloc(PBUF_LINK, recv_len, PBUF_RAM);
  680. rt_memcpy(pbuf->payload, (char *)rx_cache_recv_buf + 4, recv_len);
  681. }
  682. end:
  683. return pbuf;
  684. }
  685. static rt_err_t rtl8139_control(rt_device_t device, int cmd, void *args)
  686. {
  687. struct eth_device_rtl8139 *dev = GET_RTL8139(device);
  688. switch(cmd)
  689. {
  690. case NIOCTL_GADDR:
  691. /* get MAC address */
  692. if(args)
  693. {
  694. rt_memcpy(args, dev->dev_addr, ETH_ALEN);
  695. }
  696. else
  697. {
  698. return -RT_ERROR;
  699. }
  700. break;
  701. default :
  702. break;
  703. }
  704. return RT_EOK;
  705. }
  706. static int rt_hw_rtl8139_init(void)
  707. {
  708. rt_memset(&eth_dev, 0x0, sizeof(eth_dev));
  709. if (rtl8139_get_pci(&eth_dev) < 0)
  710. {
  711. return -1;
  712. }
  713. if (rtl8139_init_hw(&eth_dev) < 0)
  714. {
  715. return -1;
  716. }
  717. /* set device opts */
  718. #ifdef RT_USING_DEVICE_OPS
  719. eth_dev.parent.parent.ops = &rtl8139_ops;
  720. #else
  721. eth_dev.parent.parent.init = rtl8139_init;
  722. eth_dev.parent.parent.open = RT_NULL;
  723. eth_dev.parent.parent.close = RT_NULL;
  724. eth_dev.parent.parent.read = RT_NULL;
  725. eth_dev.parent.parent.write = RT_NULL;
  726. eth_dev.parent.parent.control = rtl8139_control;
  727. #endif
  728. eth_dev.parent.parent.user_data = RT_NULL;
  729. eth_dev.parent.eth_rx = rtl8139_rx;
  730. eth_dev.parent.eth_tx = rtl8139_tx;
  731. /* register ETH device */
  732. if (eth_device_init(&(eth_dev.parent), DEV_NAME) != RT_EOK)
  733. {
  734. return -1;
  735. }
  736. return 0;
  737. }
  738. INIT_DEVICE_EXPORT(rt_hw_rtl8139_init);