tsi108_eth.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. /*
  2. * (C) Copyright 2005 Tundra Semiconductor Corp.
  3. * Kong Lai, <kong.lai@tundra.com).
  4. *
  5. * See file CREDITS for list of people who contributed to this
  6. * project.
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU General Public License as
  10. * published by the Free Software Foundation; either version 2 of
  11. * the License, or (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, see <http://www.gnu.org/licenses/>.
  20. */
  21. /*
  22. * net/tsi108_eth.h - definitions for Tsi108 GIGE network controller.
  23. */
  24. #ifndef __TSI108_ETH_H
  25. #define __TSI108_ETH_H
  26. #include <linux/types.h>
  27. #define TSI_WRITE(offset, val) \
  28. out_be32((data->regs + (offset)), val)
  29. #define TSI_READ(offset) \
  30. in_be32((data->regs + (offset)))
  31. #define TSI_WRITE_PHY(offset, val) \
  32. out_be32((data->phyregs + (offset)), val)
  33. #define TSI_READ_PHY(offset) \
  34. in_be32((data->phyregs + (offset)))
  35. /*
  36. * TSI108 GIGE port registers
  37. */
  38. #define TSI108_ETH_PORT_NUM 2
  39. #define TSI108_PBM_PORT 2
  40. #define TSI108_SDRAM_PORT 4
  41. #define TSI108_MAC_CFG1 (0x000)
  42. #define TSI108_MAC_CFG1_SOFTRST (1 << 31)
  43. #define TSI108_MAC_CFG1_LOOPBACK (1 << 8)
  44. #define TSI108_MAC_CFG1_RXEN (1 << 2)
  45. #define TSI108_MAC_CFG1_TXEN (1 << 0)
  46. #define TSI108_MAC_CFG2 (0x004)
  47. #define TSI108_MAC_CFG2_DFLT_PREAMBLE (7 << 12)
  48. #define TSI108_MAC_CFG2_IFACE_MASK (3 << 8)
  49. #define TSI108_MAC_CFG2_NOGIG (1 << 8)
  50. #define TSI108_MAC_CFG2_GIG (2 << 8)
  51. #define TSI108_MAC_CFG2_PADCRC (1 << 2)
  52. #define TSI108_MAC_CFG2_FULLDUPLEX (1 << 0)
  53. #define TSI108_MAC_MII_MGMT_CFG (0x020)
  54. #define TSI108_MAC_MII_MGMT_CLK (7 << 0)
  55. #define TSI108_MAC_MII_MGMT_RST (1 << 31)
  56. #define TSI108_MAC_MII_CMD (0x024)
  57. #define TSI108_MAC_MII_CMD_READ (1 << 0)
  58. #define TSI108_MAC_MII_ADDR (0x028)
  59. #define TSI108_MAC_MII_ADDR_REG 0
  60. #define TSI108_MAC_MII_ADDR_PHY 8
  61. #define TSI108_MAC_MII_DATAOUT (0x02c)
  62. #define TSI108_MAC_MII_DATAIN (0x030)
  63. #define TSI108_MAC_MII_IND (0x034)
  64. #define TSI108_MAC_MII_IND_NOTVALID (1 << 2)
  65. #define TSI108_MAC_MII_IND_SCANNING (1 << 1)
  66. #define TSI108_MAC_MII_IND_BUSY (1 << 0)
  67. #define TSI108_MAC_IFCTRL (0x038)
  68. #define TSI108_MAC_IFCTRL_PHYMODE (1 << 24)
  69. #define TSI108_MAC_ADDR1 (0x040)
  70. #define TSI108_MAC_ADDR2 (0x044)
  71. #define TSI108_STAT_RXBYTES (0x06c)
  72. #define TSI108_STAT_RXBYTES_CARRY (1 << 24)
  73. #define TSI108_STAT_RXPKTS (0x070)
  74. #define TSI108_STAT_RXPKTS_CARRY (1 << 18)
  75. #define TSI108_STAT_RXFCS (0x074)
  76. #define TSI108_STAT_RXFCS_CARRY (1 << 12)
  77. #define TSI108_STAT_RXMCAST (0x078)
  78. #define TSI108_STAT_RXMCAST_CARRY (1 << 18)
  79. #define TSI108_STAT_RXALIGN (0x08c)
  80. #define TSI108_STAT_RXALIGN_CARRY (1 << 12)
  81. #define TSI108_STAT_RXLENGTH (0x090)
  82. #define TSI108_STAT_RXLENGTH_CARRY (1 << 12)
  83. #define TSI108_STAT_RXRUNT (0x09c)
  84. #define TSI108_STAT_RXRUNT_CARRY (1 << 12)
  85. #define TSI108_STAT_RXJUMBO (0x0a0)
  86. #define TSI108_STAT_RXJUMBO_CARRY (1 << 12)
  87. #define TSI108_STAT_RXFRAG (0x0a4)
  88. #define TSI108_STAT_RXFRAG_CARRY (1 << 12)
  89. #define TSI108_STAT_RXJABBER (0x0a8)
  90. #define TSI108_STAT_RXJABBER_CARRY (1 << 12)
  91. #define TSI108_STAT_RXDROP (0x0ac)
  92. #define TSI108_STAT_RXDROP_CARRY (1 << 12)
  93. #define TSI108_STAT_TXBYTES (0x0b0)
  94. #define TSI108_STAT_TXBYTES_CARRY (1 << 24)
  95. #define TSI108_STAT_TXPKTS (0x0b4)
  96. #define TSI108_STAT_TXPKTS_CARRY (1 << 18)
  97. #define TSI108_STAT_TXEXDEF (0x0c8)
  98. #define TSI108_STAT_TXEXDEF_CARRY (1 << 12)
  99. #define TSI108_STAT_TXEXCOL (0x0d8)
  100. #define TSI108_STAT_TXEXCOL_CARRY (1 << 12)
  101. #define TSI108_STAT_TXTCOL (0x0dc)
  102. #define TSI108_STAT_TXTCOL_CARRY (1 << 13)
  103. #define TSI108_STAT_TXPAUSEDROP (0x0e4)
  104. #define TSI108_STAT_TXPAUSEDROP_CARRY (1 << 12)
  105. #define TSI108_STAT_CARRY1 (0x100)
  106. #define TSI108_STAT_CARRY1_RXBYTES (1 << 16)
  107. #define TSI108_STAT_CARRY1_RXPKTS (1 << 15)
  108. #define TSI108_STAT_CARRY1_RXFCS (1 << 14)
  109. #define TSI108_STAT_CARRY1_RXMCAST (1 << 13)
  110. #define TSI108_STAT_CARRY1_RXALIGN (1 << 8)
  111. #define TSI108_STAT_CARRY1_RXLENGTH (1 << 7)
  112. #define TSI108_STAT_CARRY1_RXRUNT (1 << 4)
  113. #define TSI108_STAT_CARRY1_RXJUMBO (1 << 3)
  114. #define TSI108_STAT_CARRY1_RXFRAG (1 << 2)
  115. #define TSI108_STAT_CARRY1_RXJABBER (1 << 1)
  116. #define TSI108_STAT_CARRY1_RXDROP (1 << 0)
  117. #define TSI108_STAT_CARRY2 (0x104)
  118. #define TSI108_STAT_CARRY2_TXBYTES (1 << 13)
  119. #define TSI108_STAT_CARRY2_TXPKTS (1 << 12)
  120. #define TSI108_STAT_CARRY2_TXEXDEF (1 << 7)
  121. #define TSI108_STAT_CARRY2_TXEXCOL (1 << 3)
  122. #define TSI108_STAT_CARRY2_TXTCOL (1 << 2)
  123. #define TSI108_STAT_CARRY2_TXPAUSE (1 << 0)
  124. #define TSI108_STAT_CARRYMASK1 (0x108)
  125. #define TSI108_STAT_CARRYMASK2 (0x10c)
  126. #define TSI108_EC_PORTCTRL (0x200)
  127. #define TSI108_EC_PORTCTRL_STATRST (1 << 31)
  128. #define TSI108_EC_PORTCTRL_STATEN (1 << 28)
  129. #define TSI108_EC_PORTCTRL_NOGIG (1 << 18)
  130. #define TSI108_EC_PORTCTRL_HALFDUPLEX (1 << 16)
  131. #define TSI108_EC_INTSTAT (0x204)
  132. #define TSI108_EC_INTMASK (0x208)
  133. #define TSI108_INT_ANY (1 << 31)
  134. #define TSI108_INT_SFN (1 << 30)
  135. #define TSI108_INT_RXIDLE (1 << 29)
  136. #define TSI108_INT_RXABORT (1 << 28)
  137. #define TSI108_INT_RXERROR (1 << 27)
  138. #define TSI108_INT_RXOVERRUN (1 << 26)
  139. #define TSI108_INT_RXTHRESH (1 << 25)
  140. #define TSI108_INT_RXWAIT (1 << 24)
  141. #define TSI108_INT_RXQUEUE0 (1 << 16)
  142. #define TSI108_INT_STATCARRY (1 << 15)
  143. #define TSI108_INT_TXIDLE (1 << 13)
  144. #define TSI108_INT_TXABORT (1 << 12)
  145. #define TSI108_INT_TXERROR (1 << 11)
  146. #define TSI108_INT_TXUNDERRUN (1 << 10)
  147. #define TSI108_INT_TXTHRESH (1 << 9)
  148. #define TSI108_INT_TXWAIT (1 << 8)
  149. #define TSI108_INT_TXQUEUE0 (1 << 0)
  150. #define TSI108_EC_TXCFG (0x220)
  151. #define TSI108_EC_TXCFG_RST (1 << 31)
  152. #define TSI108_EC_TXCTRL (0x224)
  153. #define TSI108_EC_TXCTRL_IDLEINT (1 << 31)
  154. #define TSI108_EC_TXCTRL_ABORT (1 << 30)
  155. #define TSI108_EC_TXCTRL_GO (1 << 15)
  156. #define TSI108_EC_TXCTRL_QUEUE0 (1 << 0)
  157. #define TSI108_EC_TXSTAT (0x228)
  158. #define TSI108_EC_TXSTAT_ACTIVE (1 << 15)
  159. #define TSI108_EC_TXSTAT_QUEUE0 (1 << 0)
  160. #define TSI108_EC_TXESTAT (0x22c)
  161. #define TSI108_EC_TXESTAT_Q0_ERR (1 << 24)
  162. #define TSI108_EC_TXESTAT_Q0_DESCINT (1 << 16)
  163. #define TSI108_EC_TXESTAT_Q0_EOF (1 << 8)
  164. #define TSI108_EC_TXESTAT_Q0_EOQ (1 << 0)
  165. #define TSI108_EC_TXERR (0x278)
  166. #define TSI108_EC_TXQ_CFG (0x280)
  167. #define TSI108_EC_TXQ_CFG_DESC_INT (1 << 20)
  168. #define TSI108_EC_TXQ_CFG_EOQ_OWN_INT (1 << 19)
  169. #define TSI108_EC_TXQ_CFG_WSWP (1 << 11)
  170. #define TSI108_EC_TXQ_CFG_BSWP (1 << 10)
  171. #define TSI108_EC_TXQ_CFG_SFNPORT 0
  172. #define TSI108_EC_TXQ_BUFCFG (0x284)
  173. #define TSI108_EC_TXQ_BUFCFG_BURST8 (0 << 8)
  174. #define TSI108_EC_TXQ_BUFCFG_BURST32 (1 << 8)
  175. #define TSI108_EC_TXQ_BUFCFG_BURST128 (2 << 8)
  176. #define TSI108_EC_TXQ_BUFCFG_BURST256 (3 << 8)
  177. #define TSI108_EC_TXQ_BUFCFG_WSWP (1 << 11)
  178. #define TSI108_EC_TXQ_BUFCFG_BSWP (1 << 10)
  179. #define TSI108_EC_TXQ_BUFCFG_SFNPORT 0
  180. #define TSI108_EC_TXQ_PTRLOW (0x288)
  181. #define TSI108_EC_TXQ_PTRHIGH (0x28c)
  182. #define TSI108_EC_TXQ_PTRHIGH_VALID (1 << 31)
  183. #define TSI108_EC_TXTHRESH (0x230)
  184. #define TSI108_EC_TXTHRESH_STARTFILL 0
  185. #define TSI108_EC_TXTHRESH_STOPFILL 16
  186. #define TSI108_EC_RXCFG (0x320)
  187. #define TSI108_EC_RXCFG_RST (1 << 31)
  188. #define TSI108_EC_RXSTAT (0x328)
  189. #define TSI108_EC_RXSTAT_ACTIVE (1 << 15)
  190. #define TSI108_EC_RXSTAT_QUEUE0 (1 << 0)
  191. #define TSI108_EC_RXESTAT (0x32c)
  192. #define TSI108_EC_RXESTAT_Q0_ERR (1 << 24)
  193. #define TSI108_EC_RXESTAT_Q0_DESCINT (1 << 16)
  194. #define TSI108_EC_RXESTAT_Q0_EOF (1 << 8)
  195. #define TSI108_EC_RXESTAT_Q0_EOQ (1 << 0)
  196. #define TSI108_EC_HASHADDR (0x360)
  197. #define TSI108_EC_HASHADDR_AUTOINC (1 << 31)
  198. #define TSI108_EC_HASHADDR_DO1STREAD (1 << 30)
  199. #define TSI108_EC_HASHADDR_UNICAST (0 << 4)
  200. #define TSI108_EC_HASHADDR_MCAST (1 << 4)
  201. #define TSI108_EC_HASHDATA (0x364)
  202. #define TSI108_EC_RXQ_PTRLOW (0x388)
  203. #define TSI108_EC_RXQ_PTRHIGH (0x38c)
  204. #define TSI108_EC_RXQ_PTRHIGH_VALID (1 << 31)
  205. /* Station Enable -- accept packets destined for us */
  206. #define TSI108_EC_RXCFG_SE (1 << 13)
  207. /* Unicast Frame Enable -- for packets not destined for us */
  208. #define TSI108_EC_RXCFG_UFE (1 << 12)
  209. /* Multicast Frame Enable */
  210. #define TSI108_EC_RXCFG_MFE (1 << 11)
  211. /* Broadcast Frame Enable */
  212. #define TSI108_EC_RXCFG_BFE (1 << 10)
  213. #define TSI108_EC_RXCFG_UC_HASH (1 << 9)
  214. #define TSI108_EC_RXCFG_MC_HASH (1 << 8)
  215. #define TSI108_EC_RXQ_CFG (0x380)
  216. #define TSI108_EC_RXQ_CFG_DESC_INT (1 << 20)
  217. #define TSI108_EC_RXQ_CFG_EOQ_OWN_INT (1 << 19)
  218. #define TSI108_EC_RXQ_CFG_WSWP (1 << 11)
  219. #define TSI108_EC_RXQ_CFG_BSWP (1 << 10)
  220. #define TSI108_EC_RXQ_CFG_SFNPORT 0
  221. #define TSI108_EC_RXQ_BUFCFG (0x384)
  222. #define TSI108_EC_RXQ_BUFCFG_BURST8 (0 << 8)
  223. #define TSI108_EC_RXQ_BUFCFG_BURST32 (1 << 8)
  224. #define TSI108_EC_RXQ_BUFCFG_BURST128 (2 << 8)
  225. #define TSI108_EC_RXQ_BUFCFG_BURST256 (3 << 8)
  226. #define TSI108_EC_RXQ_BUFCFG_WSWP (1 << 11)
  227. #define TSI108_EC_RXQ_BUFCFG_BSWP (1 << 10)
  228. #define TSI108_EC_RXQ_BUFCFG_SFNPORT 0
  229. #define TSI108_EC_RXCTRL (0x324)
  230. #define TSI108_EC_RXCTRL_ABORT (1 << 30)
  231. #define TSI108_EC_RXCTRL_GO (1 << 15)
  232. #define TSI108_EC_RXCTRL_QUEUE0 (1 << 0)
  233. #define TSI108_EC_RXERR (0x378)
  234. #define TSI108_TX_EOF (1 << 0) /* End of frame; last fragment of packet */
  235. #define TSI108_TX_SOF (1 << 1) /* Start of frame; first frag. of packet */
  236. #define TSI108_TX_VLAN (1 << 2) /* Per-frame VLAN: enables VLAN override */
  237. #define TSI108_TX_HUGE (1 << 3) /* Huge frame enable */
  238. #define TSI108_TX_PAD (1 << 4) /* Pad the packet if too short */
  239. #define TSI108_TX_CRC (1 << 5) /* Generate CRC for this packet */
  240. #define TSI108_TX_INT (1 << 14) /* Generate an IRQ after frag. processed */
  241. #define TSI108_TX_RETRY (0xf << 16) /* 4 bit field indicating num. of retries */
  242. #define TSI108_TX_COL (1 << 20) /* Set if a collision occurred */
  243. #define TSI108_TX_LCOL (1 << 24) /* Set if a late collision occurred */
  244. #define TSI108_TX_UNDER (1 << 25) /* Set if a FIFO underrun occurred */
  245. #define TSI108_TX_RLIM (1 << 26) /* Set if the retry limit was reached */
  246. #define TSI108_TX_OK (1 << 30) /* Set if the frame TX was successful */
  247. #define TSI108_TX_OWN (1 << 31) /* Set if the device owns the descriptor */
  248. /* Note: the descriptor layouts assume big-endian byte order. */
  249. typedef struct {
  250. u32 buf0;
  251. u32 buf1; /* Base address of buffer */
  252. u32 next0; /* Address of next descriptor, if any */
  253. u32 next1;
  254. u16 vlan; /* VLAN, if override enabled for this packet */
  255. u16 len; /* Length of buffer in bytes */
  256. u32 misc; /* See TSI108_TX_* above */
  257. u32 reserved0; /*reserved0 and reserved1 are added to make the desc */
  258. u32 reserved1; /* 32-byte aligned */
  259. } __attribute__ ((aligned(32))) tx_desc;
  260. #define TSI108_RX_EOF (1 << 0) /* End of frame; last fragment of packet */
  261. #define TSI108_RX_SOF (1 << 1) /* Start of frame; first frag. of packet */
  262. #define TSI108_RX_VLAN (1 << 2) /* Set on SOF if packet has a VLAN */
  263. #define TSI108_RX_FTYPE (1 << 3) /* Length/Type field is type, not length */
  264. #define TSI108_RX_RUNT (1 << 4)/* Packet is less than minimum size */
  265. #define TSI108_RX_HASH (1 << 7)/* Hash table match */
  266. #define TSI108_RX_BAD (1 << 8) /* Bad frame */
  267. #define TSI108_RX_OVER (1 << 9) /* FIFO overrun occurred */
  268. #define TSI108_RX_TRUNC (1 << 11) /* Packet truncated due to excess length */
  269. #define TSI108_RX_CRC (1 << 12) /* Packet had a CRC error */
  270. #define TSI108_RX_INT (1 << 13) /* Generate an IRQ after frag. processed */
  271. #define TSI108_RX_OWN (1 << 15) /* Set if the device owns the descriptor */
  272. #define TSI108_RX_SKB_SIZE 1536 /* The RX skb length */
  273. typedef struct {
  274. u32 buf0; /* Base address of buffer */
  275. u32 buf1; /* Base address of buffer */
  276. u32 next0; /* Address of next descriptor, if any */
  277. u32 next1; /* Address of next descriptor, if any */
  278. u16 vlan; /* VLAN of received packet, first frag only */
  279. u16 len; /* Length of received fragment in bytes */
  280. u16 blen; /* Length of buffer in bytes */
  281. u16 misc; /* See TSI108_RX_* above */
  282. u32 reserved0; /* reserved0 and reserved1 are added to make the desc */
  283. u32 reserved1; /* 32-byte aligned */
  284. } __attribute__ ((aligned(32))) rx_desc;
  285. #endif /* __TSI108_ETH_H */