drv_rtl8139.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  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. #ifndef __DRV_RTL8139_H__
  11. #define __DRV_RTL8139_H__
  12. #include <rtdef.h>
  13. #define ETH_ALEN 6 /* MAC addr */
  14. #define ETH_ZLEN 60 /* Minimum length of data without CRC check */
  15. #define ETH_DATA_LEN 1500 /* Maximum length of data in a frame */
  16. #define ETH_FRAME_LEN 1514 /* Maximum Ethernet data length without CRC checksum */
  17. #define ETH_MAX(a, b) ((a) > (b) ? (a) : (b))
  18. #define RX_MSG_CNT 8 /* 4 msg queue */
  19. #define RX_MSG_SIZE (ETH_FRAME_LEN + 4) /* 4 save real msg size */
  20. #define TX_CACHE_BUF_SIZE (2048)
  21. #define DEV_FLAGS_RXALL (1 << 0) /* receive all pkgs */
  22. #define DEV_FLAGS_RXFCS (1 << 1) /* receive no crc check */
  23. /* pci device info */
  24. #define RTL8139_VENDOR_ID 0x10ec
  25. #define RTL8139_DEVICE_ID 0x8139
  26. #define RX_BUF_IDX 2 /* 32K ring */
  27. #define RX_BUF_LEN (8192 << RX_BUF_IDX)
  28. #define RX_BUF_PAD 16 /* pad 16 bytes */
  29. #define RX_BUF_WRAP_PAD 2048 /* spare padding to handle lack of packet wrap */
  30. /* The total length of the receive buffer */
  31. #define RX_BUF_TOTAL_LEN (RX_BUF_LEN + RX_BUF_PAD + RX_BUF_WRAP_PAD)
  32. /* Number of Tx descriptor registers. */
  33. #define NUM_TX_DESC 4
  34. /* max supported ethernet frame size -- must be at least (dev->mtu+14+4).*/
  35. #define MAX_ETH_FRAME_SIZE 1536
  36. /* Size of the Tx bounce buffers -- must be at least (dev->mtu+14+4). */
  37. #define TX_BUF_SIZE MAX_ETH_FRAME_SIZE
  38. #define TX_BUF_TOTAL_LEN (TX_BUF_SIZE * NUM_TX_DESC)
  39. /* PCI Tuning Parameters
  40. Threshold is bytes transferred to chip before transmission starts. */
  41. #define TX_FIFO_THRESH 256 /* In bytes, rounded down to 32 byte units. */
  42. /* The following settings are log_2(bytes)-4: 0 == 16 bytes .. 6==1024, 7==end of packet. */
  43. #define RX_FIFO_THRESH 7 /* Rx buffer level before first PCI xfer. */
  44. #define RX_DMA_BURST 7 /* Maximum PCI burst, '7' is unlimited */
  45. #define TX_DMA_BURST 6 /* Maximum PCI burst, '6' is 1024 */
  46. #define TX_RETRY 8 /* 0-15. retries = 16 + (TX_RETRY * 16) */
  47. #define JUMP_TO(label) goto label
  48. enum
  49. {
  50. HAS_MII_XCVR = 0x010000,
  51. HAS_CHIP_XCVR = 0x020000,
  52. HAS_LNK_CHNG = 0x040000,
  53. };
  54. #define RTL_NUM_STATS 4 /* number of ETHTOOL_GSTATS u64's */
  55. #define RTL_REGS_VER 1 /* version of reg. data in ETHTOOL_GREGS */
  56. #define RTL_MIN_IO_SIZE 0x80
  57. #define RTL8139B_IO_SIZE 256
  58. #define RTL8129_CAPS HAS_MII_XCVR
  59. #define RTL8139_CAPS (HAS_CHIP_XCVR | HAS_LNK_CHNG)
  60. /* Symbolic offsets to registers. */
  61. enum rtl8139_registers
  62. {
  63. MAC0 = 0, /* Ethernet hardware address. */
  64. MAR0 = 8, /* Multicast filter. */
  65. TX_STATUS0 = 0x10, /* Transmit status (Four 32bit registers). */
  66. TX_ADDR0 = 0x20, /* Tx descriptors (also four 32bit). */
  67. RX_BUF = 0x30,
  68. CHIP_CMD = 0x37,
  69. RX_BUF_PTR = 0x38,
  70. RX_BUF_ADDR = 0x3A,
  71. INTR_MASK = 0x3C,
  72. INTR_STATUS = 0x3E,
  73. TX_CONFIG = 0x40,
  74. RX_CONFIG = 0x44,
  75. TIMER = 0x48, /* A general-purpose counter. */
  76. RX_MISSED = 0x4C, /* 24 bits valid, write clears. */
  77. CFG9346 = 0x50,
  78. CONFIG0 = 0x51,
  79. CONFIG1 = 0x52,
  80. TIMER_INT = 0x54,
  81. MEDIA_STATUS = 0x58,
  82. CONFIG3 = 0x59,
  83. CONFIG4 = 0x5A, /* absent on RTL-8139A */
  84. HLT_CTL = 0x5B,
  85. MULTI_INTR = 0x5C,
  86. TX_SUMMARY = 0x60,
  87. BASIC_MODE_CTRL = 0x62,
  88. BASIC_MODE_STATUS = 0x64,
  89. NWAY_ADVERT = 0x66,
  90. NWAY_LPAR = 0x68,
  91. NWAY_EXPANSION = 0x6A,
  92. /* Undocumented registers, but required for proper operation. */
  93. FIFOTMS = 0x70, /* FIFO Control and test. */
  94. CSCR = 0x74, /* Chip Status and Configuration Register. */
  95. PARA78 = 0x78,
  96. FLASH_REG = 0xD4, /* Communication with Flash ROM, four bytes. */
  97. PARA7C = 0x7c, /* Magic transceiver parameter register. */
  98. CONFIG5 = 0xD8, /* absent on RTL-8139A */
  99. };
  100. enum clear_bit_masks
  101. {
  102. MULTI_INTR_CLEAR = 0xF000,
  103. CHIP_CMD_CLEAR = 0xE2,
  104. CONFIG1_CLEAR = (1 << 7) | (1 << 6) | (1 << 3) | (1 << 2) | (1 << 1),
  105. };
  106. enum chip_cmd_bits
  107. {
  108. CMD_RESET = 0x10,
  109. CMD_RX_ENABLE = 0x08,
  110. CMD_TX_ENABLE = 0x04,
  111. RX_BUFFER_EMPTY = 0x01,
  112. };
  113. /* Interrupt register bits, using my own meaningful names. */
  114. enum intr_status_bits
  115. {
  116. PCI_ERR = 0x8000,
  117. PCS_TIMEOUT = 0x4000,
  118. RX_FIFO_OVER = 0x40,
  119. RX_UNDERRUN = 0x20,
  120. RX_OVERFLOW = 0x10,
  121. TX_ERR = 0x08,
  122. TX_OK = 0x04,
  123. RX_ERR = 0x02,
  124. RX_OK = 0x01,
  125. RX_ACK_BITS = RX_FIFO_OVER | RX_OVERFLOW | RX_OK,
  126. };
  127. enum tx_status_bits
  128. {
  129. TX_HOST_OWNS = 0x2000,
  130. TX_UNDERRUN = 0x4000,
  131. TX_STAT_OK = 0x8000,
  132. TX_OUT_OF_WINDOW = 0x20000000,
  133. TX_ABORTED = 0x40000000,
  134. TX_CARRIER_LOST = 0x80000000,
  135. };
  136. enum rx_status_bits
  137. {
  138. RX_MULTICAST = 0x8000,
  139. RX_PHYSICAL = 0x4000,
  140. RX_BROADCAST = 0x2000,
  141. RX_BAD_SYMBOL = 0x0020,
  142. RX_RUNT = 0x0010,
  143. RX_TOO_LONG = 0x0008,
  144. RX_CRC_ERR = 0x0004,
  145. RX_BAD_ALIGN = 0x0002,
  146. RX_STATUS_OK = 0x0001,
  147. };
  148. /* Bits in rx_config. */
  149. enum rx_mode_bits
  150. {
  151. ACCEPT_ERR = 0x20,
  152. ACCEPT_RUNT = 0x10,
  153. ACCEPT_BROADCAST = 0x08,
  154. ACCEPT_MULTICAST = 0x04,
  155. ACCEPT_MY_PHYS = 0x02,
  156. ACCEPT_ALL_PHYS = 0x01,
  157. };
  158. /* Bits in TxConfig. */
  159. enum tx_config_bits
  160. {
  161. /* Interframe Gap Time. Only TxIFG96 doesn't violate IEEE 802.3 */
  162. TX_IFG_SHIFT = 24,
  163. TX_IFG84 = (0 << TX_IFG_SHIFT), /* 8.4us / 840ns (10 / 100Mbps) */
  164. TX_IFG88 = (1 << TX_IFG_SHIFT), /* 8.8us / 880ns (10 / 100Mbps) */
  165. TX_IFG92 = (2 << TX_IFG_SHIFT), /* 9.2us / 920ns (10 / 100Mbps) */
  166. TX_IFG96 = (3 << TX_IFG_SHIFT), /* 9.6us / 960ns (10 / 100Mbps) */
  167. TX_LOOP_BACK = (1 << 18) | (1 << 17), /* enable loopback test mode */
  168. TX_CRC = (1 << 16), /* DISABLE Tx pkt CRC append */
  169. TX_CLEAR_ABT = (1 << 0), /* Clear abort (WO) */
  170. TX_DMA_SHIFT = 8, /* DMA burst value (0-7) is shifted X many bits */
  171. TX_RETRY_SHIFT = 4, /* TXRR value (0-15) is shifted X many bits */
  172. TX_VERSION_MASK = 0x7C800000, /* mask out version bits 30-26, 23 */
  173. };
  174. /* Bits in Config1 */
  175. enum config1_bits
  176. {
  177. CFG1_PM_ENABLE = 0x01,
  178. CFG1_VPD_ENABLE = 0x02,
  179. CFG1_PIO = 0x04,
  180. CFG1_MMIO = 0x08,
  181. CFG1_LWAKE = 0x10, /* not on 8139, 8139A */
  182. CFG1_DRIVER_LOAD = 0x20,
  183. CFG1_LED0 = 0x40,
  184. CFG1_LED1 = 0x80,
  185. CFG1_SLEEP = (1 << 1), /* only on 8139, 8139A */
  186. CFG1_PWRDN = (1 << 0), /* only on 8139, 8139A */
  187. };
  188. /* Bits in Config3 */
  189. enum config3_bits
  190. {
  191. CFG3_FAST_ENABLE = (1 << 0), /* 1 = Fast Back to Back */
  192. CFG3_FUNCTION_ENABLE = (1 << 1), /* 1 = enable CardBus Function registers */
  193. CFG3_CLKRUN_ENABLE = (1 << 2), /* 1 = enable CLKRUN */
  194. CFG3_CARD_BUS_ENABLE = (1 << 3), /* 1 = enable CardBus registers */
  195. CFG3_LINK_UP = (1 << 4), /* 1 = wake up on link up */
  196. CFG3_MAGIC = (1 << 5), /* 1 = wake up on Magic Packet (tm) */
  197. CFG3_PARM_ENABLE = (1 << 6), /* 0 = software can set twister parameters */
  198. CFG3_GNT = (1 << 7), /* 1 = delay 1 clock from PCI GNT signal */
  199. };
  200. /* Bits in Config4 */
  201. enum config4_bits
  202. {
  203. CFG4_LWPTN = (1 << 2), /* not on 8139, 8139A */
  204. };
  205. /* Bits in Config5 */
  206. enum config5_bits
  207. {
  208. CFG5_PME_STS = (1 << 0), /* 1 = PCI reset resets PME_Status */
  209. CFG5_LAN_WAKE = (1 << 1), /* 1 = enable LANWake signal */
  210. CFG5_LDPS = (1 << 2), /* 0 = save power when link is down */
  211. CFG5_FIFO_ADDR_PTR = (1 << 3), /* Realtek internal SRAM testing */
  212. CFG5_UWF = (1 << 4), /* 1 = accept unicast wakeup frame */
  213. CFG5_MWF = (1 << 5), /* 1 = accept multicast wakeup frame */
  214. CFG5_BWF = (1 << 6), /* 1 = accept broadcast wakeup frame */
  215. };
  216. enum rx_config_bits
  217. {
  218. /* rx fifo threshold */
  219. RX_CFG_FIFO_SHIFT = 13,
  220. RX_CFG_FIFO_NONE = (7 << RX_CFG_FIFO_SHIFT),
  221. /* Max DMA burst */
  222. RX_CFG_DMA_SHIFT = 8,
  223. RX_CFG_DMA_UNLIMITED = (7 << RX_CFG_DMA_SHIFT),
  224. /* rx ring buffer length */
  225. RX_CFG_RCV_8K = 0,
  226. RX_CFG_RCV_16K = (1 << 11),
  227. RX_CFG_RCV_32K = (1 << 12),
  228. RX_CFG_RCV_64K = (1 << 11) | (1 << 12),
  229. /* Disable packet wrap at end of Rx buffer. (not possible with 64k) */
  230. RX_NO_WRAP = (1 << 7),
  231. };
  232. /* Twister tuning parameters from RealTek.
  233. Completely undocumented, but required to tune bad links on some boards. */
  234. enum cscr_bits
  235. {
  236. CSCR_LINK_OK = 0x0400,
  237. CSCR_LINK_CHANGE = 0x0800,
  238. CSCR_LINK_STATUS = 0x0f000,
  239. CSCR_LINK_DOWN_OFF_CMD = 0x003c0,
  240. CSCR_LINK_DOWN_CMD = 0x0f3c0,
  241. };
  242. enum config9346_bits
  243. {
  244. CFG9346_LOCK = 0x00,
  245. CFG9346_UNLOCK = 0xC0,
  246. };
  247. typedef enum {
  248. CH_8139 = 0,
  249. CH_8139_K,
  250. CH_8139A,
  251. CH_8139A_G,
  252. CH_8139B,
  253. CH_8130,
  254. CH_8139C,
  255. CH_8100,
  256. CH_8100B_8139D,
  257. CH_8101,
  258. } card_chip_t;
  259. enum chip_flags {
  260. HAS_HLT_CLK = (1 << 0),
  261. HAS_LWAKE = (1 << 1),
  262. };
  263. #define HW_REVID(b30, b29, b28, b27, b26, b23, b22) \
  264. ((b30) << 30 | (b29) << 29 | (b28) << 28 | (b27) << 27 | (b26) << 26 | (b23) << 23 | (b22) << 22)
  265. #define HW_REVID_MASK HW_REVID(1, 1, 1, 1, 1, 1, 1)
  266. #define CHIP_INFO_NR 10
  267. /* directly indexed by chip_t, above */
  268. static const struct
  269. {
  270. const char *name;
  271. rt_uint32_t version; /* from RTL8139C/RTL8139D docs */
  272. rt_uint32_t flags;
  273. } rtl_chip_info[CHIP_INFO_NR] = {
  274. { "RTL-8139",
  275. HW_REVID(1, 0, 0, 0, 0, 0, 0),
  276. HAS_HLT_CLK,
  277. },
  278. { "RTL-8139 rev K",
  279. HW_REVID(1, 1, 0, 0, 0, 0, 0),
  280. HAS_HLT_CLK,
  281. },
  282. { "RTL-8139A",
  283. HW_REVID(1, 1, 1, 0, 0, 0, 0),
  284. HAS_HLT_CLK, /* XXX undocumented? */
  285. },
  286. { "RTL-8139A rev G",
  287. HW_REVID(1, 1, 1, 0, 0, 1, 0),
  288. HAS_HLT_CLK, /* XXX undocumented? */
  289. },
  290. { "RTL-8139B",
  291. HW_REVID(1, 1, 1, 1, 0, 0, 0),
  292. HAS_LWAKE,
  293. },
  294. { "RTL-8130",
  295. HW_REVID(1, 1, 1, 1, 1, 0, 0),
  296. HAS_LWAKE,
  297. },
  298. { "RTL-8139C",
  299. HW_REVID(1, 1, 1, 0, 1, 0, 0),
  300. HAS_LWAKE,
  301. },
  302. { "RTL-8100",
  303. HW_REVID(1, 1, 1, 1, 0, 1, 0),
  304. HAS_LWAKE,
  305. },
  306. { "RTL-8100B/8139D",
  307. HW_REVID(1, 1, 1, 0, 1, 0, 1),
  308. HAS_HLT_CLK /* XXX undocumented? */ | HAS_LWAKE,
  309. },
  310. { "RTL-8101",
  311. HW_REVID(1, 1, 1, 0, 1, 1, 1),
  312. HAS_LWAKE,
  313. }
  314. };
  315. struct rtl8139_status
  316. {
  317. rt_ubase_t packets;
  318. rt_ubase_t bytes;
  319. };
  320. struct net_device_status
  321. {
  322. rt_ubase_t tx_errors;
  323. rt_ubase_t tx_aborted_errors;
  324. rt_ubase_t tx_carrier_errors;
  325. rt_ubase_t tx_window_errors;
  326. rt_ubase_t tx_fifo_errors;
  327. rt_ubase_t tx_dropped;
  328. rt_ubase_t rx_errors;
  329. rt_ubase_t rx_length_errors;
  330. rt_ubase_t rx_missed_errors;
  331. rt_ubase_t rx_fifo_errors;
  332. rt_ubase_t rx_crc_errors;
  333. rt_ubase_t rx_frame_errors;
  334. rt_ubase_t rx_dropped;
  335. rt_ubase_t tx_packets;
  336. rt_ubase_t tx_bytes;
  337. rt_ubase_t collisions;
  338. };
  339. struct rtl_extra_status
  340. {
  341. rt_ubase_t early_rx;
  342. rt_ubase_t tx_buf_mapped;
  343. rt_ubase_t tx_timeouts;
  344. rt_ubase_t rx_lost_in_ring;
  345. };
  346. #endif /* __DRV_RTL8139_H__ */