rtl838x.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. #ifndef _RTL838X_H
  3. #define _RTL838X_H
  4. #include <net/dsa.h>
  5. /*
  6. * Register definition
  7. */
  8. #define RTL838X_MAC_PORT_CTRL(port) (0xd560 + (((port) << 7)))
  9. #define RTL839X_MAC_PORT_CTRL(port) (0x8004 + (((port) << 7)))
  10. #define RTL930X_MAC_PORT_CTRL(port) (0x3260 + (((port) << 6)))
  11. #define RTL930X_MAC_L2_PORT_CTRL(port) (0x3268 + (((port) << 6)))
  12. #define RTL931X_MAC_PORT_CTRL(port) (0x6004 + (((port) << 7)))
  13. #define RTL838X_RST_GLB_CTRL_0 (0x003c)
  14. #define RTL838X_MAC_FORCE_MODE_CTRL (0xa104)
  15. #define RTL839X_MAC_FORCE_MODE_CTRL (0x02bc)
  16. #define RTL930X_MAC_FORCE_MODE_CTRL (0xCA1C)
  17. #define RTL931X_MAC_FORCE_MODE_CTRL (0x0DCC)
  18. #define RTL838X_DMY_REG31 (0x3b28)
  19. #define RTL838X_SDS_MODE_SEL (0x0028)
  20. #define RTL838X_SDS_CFG_REG (0x0034)
  21. #define RTL838X_INT_MODE_CTRL (0x005c)
  22. #define RTL838X_CHIP_INFO (0x00d8)
  23. #define RTL839X_CHIP_INFO (0x0ff4)
  24. #define RTL838X_PORT_ISO_CTRL(port) (0x4100 + ((port) << 2))
  25. #define RTL839X_PORT_ISO_CTRL(port) (0x1400 + ((port) << 3))
  26. /* Packet statistics */
  27. #define RTL838X_STAT_PORT_STD_MIB (0x1200)
  28. #define RTL839X_STAT_PORT_STD_MIB (0xC000)
  29. #define RTL930X_STAT_PORT_MIB_CNTR (0x0664)
  30. #define RTL838X_STAT_RST (0x3100)
  31. #define RTL839X_STAT_RST (0xF504)
  32. #define RTL930X_STAT_RST (0x3240)
  33. #define RTL931X_STAT_RST (0x7ef4)
  34. #define RTL838X_STAT_PORT_RST (0x3104)
  35. #define RTL839X_STAT_PORT_RST (0xF508)
  36. #define RTL930X_STAT_PORT_RST (0x3244)
  37. #define RTL931X_STAT_PORT_RST (0x7ef8)
  38. #define RTL838X_STAT_CTRL (0x3108)
  39. #define RTL839X_STAT_CTRL (0x04cc)
  40. #define RTL930X_STAT_CTRL (0x3248)
  41. #define RTL931X_STAT_CTRL (0x5720)
  42. /* Registers of the internal Serdes of the 8390 */
  43. #define RTL8390_SDS0_1_XSG0 (0xA000)
  44. #define RTL8390_SDS0_1_XSG1 (0xA100)
  45. #define RTL839X_SDS12_13_XSG0 (0xB800)
  46. #define RTL839X_SDS12_13_XSG1 (0xB900)
  47. #define RTL839X_SDS12_13_PWR0 (0xb880)
  48. #define RTL839X_SDS12_13_PWR1 (0xb980)
  49. /* Registers of the internal Serdes of the 8380 */
  50. #define RTL838X_SDS4_FIB_REG0 (0xF800)
  51. #define RTL838X_SDS4_REG28 (0xef80)
  52. #define RTL838X_SDS4_DUMMY0 (0xef8c)
  53. #define RTL838X_SDS5_EXT_REG6 (0xf18c)
  54. /* VLAN registers */
  55. #define RTL838X_VLAN_CTRL (0x3A74)
  56. #define RTL838X_VLAN_PROFILE(idx) (0x3A88 + ((idx) << 2))
  57. #define RTL838X_VLAN_PORT_EGR_FLTR (0x3A84)
  58. #define RTL838X_VLAN_PORT_PB_VLAN (0x3C00)
  59. #define RTL838X_VLAN_PORT_IGR_FLTR(port) (0x3A7C + (((port >> 4) << 2)))
  60. #define RTL838X_VLAN_PORT_IGR_FLTR_0 (0x3A7C)
  61. #define RTL838X_VLAN_PORT_IGR_FLTR_1 (0x3A7C + 4)
  62. #define RTL838X_VLAN_PORT_TAG_STS_CTRL (0xA530)
  63. #define RTL839X_VLAN_PROFILE(idx) (0x25C0 + (((idx) << 3)))
  64. #define RTL839X_VLAN_CTRL (0x26D4)
  65. #define RTL839X_VLAN_PORT_PB_VLAN (0x26D8)
  66. #define RTL839X_VLAN_PORT_IGR_FLTR(port) (0x27B4 + (((port >> 4) << 2)))
  67. #define RTL839X_VLAN_PORT_EGR_FLTR(port) (0x27C4 + (((port >> 5) << 2)))
  68. #define RTL839X_VLAN_PORT_TAG_STS_CTRL (0x6828)
  69. #define RTL930X_VLAN_PROFILE_SET(idx) (0x9c60 + (((idx) * 20)))
  70. #define RTL930X_VLAN_CTRL (0x82D4)
  71. #define RTL930X_VLAN_PORT_PB_VLAN (0x82D8)
  72. #define RTL930X_VLAN_PORT_IGR_FLTR(port) (0x83C0 + (((port >> 4) << 2)))
  73. #define RTL930X_VLAN_PORT_EGR_FLTR (0x83C8)
  74. #define RTL930X_VLAN_PORT_TAG_STS_CTRL (0xCE24)
  75. #define RTL931X_VLAN_PROFILE_SET(idx) (0x9800 + (((idx) * 28)))
  76. #define RTL931X_VLAN_CTRL (0x94E4)
  77. #define RTL931X_VLAN_PORT_IGR_FLTR(port) (0x96B4 + (((port >> 4) << 2)))
  78. #define RTL931X_VLAN_PORT_EGR_FLTR(port) (0x96C4 + (((port >> 5) << 2)))
  79. #define RTL931X_VLAN_PORT_TAG_CTRL (0x4860)
  80. /* Table access registers */
  81. #define RTL838X_TBL_ACCESS_CTRL_0 (0x6914)
  82. #define RTL838X_TBL_ACCESS_DATA_0(idx) (0x6918 + ((idx) << 2))
  83. #define RTL838X_TBL_ACCESS_CTRL_1 (0xA4C8)
  84. #define RTL838X_TBL_ACCESS_DATA_1(idx) (0xA4CC + ((idx) << 2))
  85. #define RTL839X_TBL_ACCESS_CTRL_0 (0x1190)
  86. #define RTL839X_TBL_ACCESS_DATA_0(idx) (0x1194 + ((idx) << 2))
  87. #define RTL839X_TBL_ACCESS_CTRL_1 (0x6b80)
  88. #define RTL839X_TBL_ACCESS_DATA_1(idx) (0x6b84 + ((idx) << 2))
  89. #define RTL839X_TBL_ACCESS_CTRL_2 (0x611C)
  90. #define RTL839X_TBL_ACCESS_DATA_2(i) (0x6120 + (((i) << 2)))
  91. #define RTL930X_TBL_ACCESS_CTRL_0 (0xB340)
  92. #define RTL930X_TBL_ACCESS_DATA_0(idx) (0xB344 + ((idx) << 2))
  93. #define RTL930X_TBL_ACCESS_CTRL_1 (0xB3A0)
  94. #define RTL930X_TBL_ACCESS_DATA_1(idx) (0xB3A4 + ((idx) << 2))
  95. #define RTL930X_TBL_ACCESS_CTRL_2 (0xCE04)
  96. #define RTL930X_TBL_ACCESS_DATA_2(i) (0xCE08 + (((i) << 2)))
  97. #define RTL931X_TBL_ACCESS_CTRL_0 (0x8500)
  98. #define RTL931X_TBL_ACCESS_DATA_0(idx) (0x8508 + ((idx) << 2))
  99. #define RTL931X_TBL_ACCESS_CTRL_1 (0x40C0)
  100. #define RTL931X_TBL_ACCESS_DATA_1(idx) (0x40C4 + ((idx) << 2))
  101. #define RTL931X_TBL_ACCESS_CTRL_2 (0x8528)
  102. #define RTL931X_TBL_ACCESS_DATA_2(i) (0x852C + (((i) << 2)))
  103. #define RTL931X_TBL_ACCESS_CTRL_3 (0x0200)
  104. #define RTL931X_TBL_ACCESS_DATA_3(i) (0x0204 + (((i) << 2)))
  105. #define RTL931X_TBL_ACCESS_CTRL_4 (0x20DC)
  106. #define RTL931X_TBL_ACCESS_DATA_4(i) (0x20E0 + (((i) << 2)))
  107. #define RTL931X_TBL_ACCESS_CTRL_5 (0x7E1C)
  108. #define RTL931X_TBL_ACCESS_DATA_5(i) (0x7E20 + (((i) << 2)))
  109. /* MAC handling */
  110. #define RTL838X_MAC_LINK_STS (0xa188)
  111. #define RTL839X_MAC_LINK_STS (0x0390)
  112. #define RTL930X_MAC_LINK_STS (0xCB10)
  113. #define RTL931X_MAC_LINK_STS (0x0EC0)
  114. #define RTL838X_MAC_LINK_SPD_STS(p) (0xa190 + (((p >> 4) << 2)))
  115. #define RTL839X_MAC_LINK_SPD_STS(p) (0x03a0 + (((p >> 4) << 2)))
  116. #define RTL930X_MAC_LINK_SPD_STS(p) (0xCB18 + (((p >> 3) << 2)))
  117. #define RTL931X_MAC_LINK_SPD_STS(p) (0x0ED0 + (((p >> 3) << 2)))
  118. #define RTL838X_MAC_LINK_DUP_STS (0xa19c)
  119. #define RTL839X_MAC_LINK_DUP_STS (0x03b0)
  120. #define RTL930X_MAC_LINK_DUP_STS (0xCB28)
  121. #define RTL931X_MAC_LINK_DUP_STS (0x0EF0)
  122. #define RTL838X_MAC_TX_PAUSE_STS (0xa1a0)
  123. #define RTL839X_MAC_TX_PAUSE_STS (0x03b8)
  124. #define RTL930X_MAC_TX_PAUSE_STS (0xCB2C)
  125. #define RTL931X_MAC_TX_PAUSE_STS (0x0EF8)
  126. #define RTL838X_MAC_RX_PAUSE_STS (0xa1a4)
  127. #define RTL839X_MAC_RX_PAUSE_STS (0x03c0)
  128. #define RTL930X_MAC_RX_PAUSE_STS (0xCB30)
  129. #define RTL931X_MAC_RX_PAUSE_STS (0x0F00)
  130. /* MAC link state bits */
  131. #define FORCE_EN (1 << 0)
  132. #define FORCE_LINK_EN (1 << 1)
  133. #define NWAY_EN (1 << 2)
  134. #define DUPLX_MODE (1 << 3)
  135. #define TX_PAUSE_EN (1 << 6)
  136. #define RX_PAUSE_EN (1 << 7)
  137. /* EEE */
  138. #define RTL838X_MAC_EEE_ABLTY (0xa1a8)
  139. #define RTL838X_EEE_PORT_TX_EN (0x014c)
  140. #define RTL838X_EEE_PORT_RX_EN (0x0150)
  141. #define RTL838X_EEE_CLK_STOP_CTRL (0x0148)
  142. #define RTL838X_EEE_TX_TIMER_GIGA_CTRL (0xaa04)
  143. #define RTL838X_EEE_TX_TIMER_GELITE_CTRL (0xaa08)
  144. #define RTL839X_EEE_TX_TIMER_GELITE_CTRL (0x042C)
  145. #define RTL839X_EEE_TX_TIMER_GIGA_CTRL (0x0430)
  146. #define RTL839X_EEE_TX_TIMER_10G_CTRL (0x0434)
  147. #define RTL839X_EEE_CTRL(p) (0x8008 + ((p) << 7))
  148. #define RTL839X_MAC_EEE_ABLTY (0x03C8)
  149. #define RTL930X_MAC_EEE_ABLTY (0xCB34)
  150. #define RTL930X_EEE_CTRL(p) (0x3274 + ((p) << 6))
  151. #define RTL930X_EEEP_PORT_CTRL(p) (0x3278 + ((p) << 6))
  152. /* L2 functionality */
  153. #define RTL838X_L2_CTRL_0 (0x3200)
  154. #define RTL839X_L2_CTRL_0 (0x3800)
  155. #define RTL930X_L2_CTRL (0x8FD8)
  156. #define RTL931X_L2_CTRL (0xC800)
  157. #define RTL838X_L2_CTRL_1 (0x3204)
  158. #define RTL839X_L2_CTRL_1 (0x3804)
  159. #define RTL930X_L2_AGE_CTRL (0x8FDC)
  160. #define RTL931X_L2_AGE_CTRL (0xC804)
  161. #define RTL838X_L2_PORT_AGING_OUT (0x3358)
  162. #define RTL839X_L2_PORT_AGING_OUT (0x3b74)
  163. #define RTL930X_L2_PORT_AGE_CTRL (0x8FE0)
  164. #define RTL931X_L2_PORT_AGE_CTRL (0xc808)
  165. #define RTL838X_TBL_ACCESS_L2_CTRL (0x6900)
  166. #define RTL839X_TBL_ACCESS_L2_CTRL (0x1180)
  167. #define RTL930X_TBL_ACCESS_L2_CTRL (0xB320)
  168. #define RTL930X_TBL_ACCESS_L2_METHOD_CTRL (0xB324)
  169. #define RTL838X_TBL_ACCESS_L2_DATA(idx) (0x6908 + ((idx) << 2))
  170. #define RTL839X_TBL_ACCESS_L2_DATA(idx) (0x1184 + ((idx) << 2))
  171. #define RTL930X_TBL_ACCESS_L2_DATA(idx) (0xab08 + ((idx) << 2))
  172. #define RTL838X_L2_TBL_FLUSH_CTRL (0x3370)
  173. #define RTL839X_L2_TBL_FLUSH_CTRL (0x3ba0)
  174. #define RTL930X_L2_TBL_FLUSH_CTRL (0x9404)
  175. #define RTL931X_L2_TBL_FLUSH_CTRL (0xCD9C)
  176. #define RTL838X_L2_PORT_NEW_SALRN(p) (0x328c + (((p >> 4) << 2)))
  177. #define RTL839X_L2_PORT_NEW_SALRN(p) (0x38F0 + (((p >> 4) << 2)))
  178. #define RTL930X_L2_PORT_SALRN(p) (0x8FEC + (((p >> 4) << 2)))
  179. #define RTL931X_L2_PORT_NEW_SALRN(p) (0xC820 + (((p >> 4) << 2)))
  180. #define RTL838X_L2_PORT_NEW_SA_FWD(p) (0x3294 + (((p >> 4) << 2)))
  181. #define RTL839X_L2_PORT_NEW_SA_FWD(p) (0x3900 + (((p >> 4) << 2)))
  182. #define RTL930X_L2_PORT_NEW_SA_FWD(p) (0x8FF4 + (((p / 10) << 2)))
  183. #define RTL931X_L2_PORT_NEW_SA_FWD(p) (0xC830 + (((p / 10) << 2)))
  184. #define RTL930X_ST_CTRL (0x8798)
  185. #define RTL930X_L2_PORT_SABLK_CTRL (0x905c)
  186. #define RTL930X_L2_PORT_DABLK_CTRL (0x9060)
  187. #define RTL838X_RMA_BPDU_FLD_PMSK (0x4348)
  188. #define RTL930X_RMA_BPDU_FLD_PMSK (0x9F18)
  189. #define RTL931X_RMA_BPDU_FLD_PMSK (0x8950)
  190. #define RTL839X_RMA_BPDU_FLD_PMSK (0x125C)
  191. #define RTL838X_L2_PORT_LM_ACT(p) (0x3208 + ((p) << 2))
  192. #define RTL838X_VLAN_PORT_FWD (0x3A78)
  193. #define RTL839X_VLAN_PORT_FWD (0x27AC)
  194. #define RTL930X_VLAN_PORT_FWD (0x834C)
  195. #define RTL838X_VLAN_FID_CTRL (0x3aa8)
  196. /* Port Mirroring */
  197. #define RTL838X_MIR_CTRL (0x5D00)
  198. #define RTL838X_MIR_DPM_CTRL (0x5D20)
  199. #define RTL838X_MIR_SPM_CTRL (0x5D10)
  200. #define RTL839X_MIR_CTRL (0x2500)
  201. #define RTL839X_MIR_DPM_CTRL (0x2530)
  202. #define RTL839X_MIR_SPM_CTRL (0x2510)
  203. #define RTL930X_MIR_CTRL (0xA2A0)
  204. #define RTL930X_MIR_DPM_CTRL (0xA2C0)
  205. #define RTL930X_MIR_SPM_CTRL (0xA2B0)
  206. #define RTL931X_MIR_CTRL (0xAF00)
  207. #define RTL931X_MIR_DPM_CTRL (0xAF30)
  208. #define RTL931X_MIR_SPM_CTRL (0xAF10)
  209. /* Storm/rate control and scheduling */
  210. #define RTL838X_STORM_CTRL (0x4700)
  211. #define RTL839X_STORM_CTRL (0x1800)
  212. #define RTL838X_STORM_CTRL_LB_CTRL(p) (0x4884 + (((p) << 2)))
  213. #define RTL838X_STORM_CTRL_BURST_PPS_0 (0x4874)
  214. #define RTL838X_STORM_CTRL_BURST_PPS_1 (0x4878)
  215. #define RTL838X_STORM_CTRL_BURST_0 (0x487c)
  216. #define RTL838X_STORM_CTRL_BURST_1 (0x4880)
  217. #define RTL839X_STORM_CTRL_LB_TICK_TKN_CTRL_0 (0x1804)
  218. #define RTL839X_STORM_CTRL_LB_TICK_TKN_CTRL_1 (0x1808)
  219. #define RTL838X_SCHED_CTRL (0xB980)
  220. #define RTL839X_SCHED_CTRL (0x60F4)
  221. #define RTL838X_SCHED_LB_TICK_TKN_CTRL_0 (0xAD58)
  222. #define RTL838X_SCHED_LB_TICK_TKN_CTRL_1 (0xAD5C)
  223. #define RTL839X_SCHED_LB_TICK_TKN_CTRL_0 (0x1804)
  224. #define RTL839X_SCHED_LB_TICK_TKN_CTRL_1 (0x1808)
  225. #define RTL839X_STORM_CTRL_SPCL_LB_TICK_TKN_CTRL (0x2000)
  226. #define RTL839X_IGR_BWCTRL_LB_TICK_TKN_CTRL_0 (0x1604)
  227. #define RTL839X_IGR_BWCTRL_LB_TICK_TKN_CTRL_1 (0x1608)
  228. #define RTL839X_SCHED_LB_TICK_TKN_CTRL (0x60F8)
  229. #define RTL839X_SCHED_LB_TICK_TKN_PPS_CTRL (0x6200)
  230. #define RTL838X_SCHED_LB_THR (0xB984)
  231. #define RTL839X_SCHED_LB_THR (0x60FC)
  232. #define RTL838X_SCHED_P_EGR_RATE_CTRL(p) (0xC008 + (((p) << 7)))
  233. #define RTL838X_SCHED_Q_EGR_RATE_CTRL(p, q) (0xC00C + (p << 7) + (((q) << 2)))
  234. #define RTL838X_STORM_CTRL_PORT_BC_EXCEED (0x470C)
  235. #define RTL838X_STORM_CTRL_PORT_MC_EXCEED (0x4710)
  236. #define RTL838X_STORM_CTRL_PORT_UC_EXCEED (0x4714)
  237. #define RTL839X_STORM_CTRL_PORT_BC_EXCEED(p) (0x180c + (((p >> 5) << 2)))
  238. #define RTL839X_STORM_CTRL_PORT_MC_EXCEED(p) (0x1814 + (((p >> 5) << 2)))
  239. #define RTL839X_STORM_CTRL_PORT_UC_EXCEED(p) (0x181c + (((p >> 5) << 2)))
  240. #define RTL838X_STORM_CTRL_PORT_UC(p) (0x4718 + (((p) << 2)))
  241. #define RTL838X_STORM_CTRL_PORT_MC(p) (0x478c + (((p) << 2)))
  242. #define RTL838X_STORM_CTRL_PORT_BC(p) (0x4800 + (((p) << 2)))
  243. #define RTL839X_STORM_CTRL_PORT_UC_0(p) (0x185C + (((p) << 3)))
  244. #define RTL839X_STORM_CTRL_PORT_UC_1(p) (0x1860 + (((p) << 3)))
  245. #define RTL839X_STORM_CTRL_PORT_MC_0(p) (0x19FC + (((p) << 3)))
  246. #define RTL839X_STORM_CTRL_PORT_MC_1(p) (0x1a00 + (((p) << 3)))
  247. #define RTL839X_STORM_CTRL_PORT_BC_0(p) (0x1B9C + (((p) << 3)))
  248. #define RTL839X_STORM_CTRL_PORT_BC_1(p) (0x1BA0 + (((p) << 3)))
  249. #define RTL839X_TBL_ACCESS_CTRL_2 (0x611C)
  250. #define RTL839X_TBL_ACCESS_DATA_2(i) (0x6120 + (((i) << 2)))
  251. #define RTL839X_IGR_BWCTRL_PORT_CTRL_10G_0(p) (0x1618 + (((p) << 3)))
  252. #define RTL839X_IGR_BWCTRL_PORT_CTRL_10G_1(p) (0x161C + (((p) << 3)))
  253. #define RTL839X_IGR_BWCTRL_PORT_CTRL_0(p) (0x1640 + (((p) << 3)))
  254. #define RTL839X_IGR_BWCTRL_PORT_CTRL_1(p) (0x1644 + (((p) << 3)))
  255. #define RTL839X_IGR_BWCTRL_CTRL_LB_THR (0x1614)
  256. /* Link aggregation (Trunking) */
  257. #define RTL839X_TRK_MBR_CTR (0x2200)
  258. #define RTL838X_TRK_MBR_CTR (0x3E00)
  259. #define RTL930X_TRK_MBR_CTRL (0xA41C)
  260. #define RTL931X_TRK_MBR_CTRL (0xB8D0)
  261. /* Attack prevention */
  262. #define RTL838X_ATK_PRVNT_PORT_EN (0x5B00)
  263. #define RTL838X_ATK_PRVNT_CTRL (0x5B04)
  264. #define RTL838X_ATK_PRVNT_ACT (0x5B08)
  265. #define RTL838X_ATK_PRVNT_STS (0x5B1C)
  266. /* 802.1X */
  267. #define RTL838X_SPCL_TRAP_EAPOL_CTRL (0x6988)
  268. #define RTL839X_SPCL_TRAP_EAPOL_CTRL (0x105C)
  269. /* QoS */
  270. #define RTL838X_QM_INTPRI2QID_CTRL (0x5F00)
  271. #define RTL839X_QM_INTPRI2QID_CTRL(q) (0x1110 + (q << 2))
  272. #define RTL839X_QM_PORT_QNUM(p) (0x1130 + (((p / 10) << 2)))
  273. #define RTL838X_PRI_SEL_PORT_PRI(p) (0x5FB8 + (((p / 10) << 2)))
  274. #define RTL839X_PRI_SEL_PORT_PRI(p) (0x10A8 + (((p / 10) << 2)))
  275. #define RTL838X_QM_PKT2CPU_INTPRI_MAP (0x5F10)
  276. #define RTL839X_QM_PKT2CPU_INTPRI_MAP (0x1154)
  277. #define RTL838X_PRI_SEL_CTRL (0x10E0)
  278. #define RTL839X_PRI_SEL_CTRL (0x10E0)
  279. #define RTL838X_PRI_SEL_TBL_CTRL(i) (0x5FD8 + (((i) << 2)))
  280. #define RTL839X_PRI_SEL_TBL_CTRL(i) (0x10D0 + (((i) << 2)))
  281. #define RTL838X_QM_PKT2CPU_INTPRI_0 (0x5F04)
  282. #define RTL838X_QM_PKT2CPU_INTPRI_1 (0x5F08)
  283. #define RTL838X_QM_PKT2CPU_INTPRI_2 (0x5F0C)
  284. #define RTL839X_OAM_CTRL (0x2100)
  285. #define RTL839X_OAM_PORT_ACT_CTRL(p) (0x2104 + (((p) << 2)))
  286. #define RTL839X_RMK_PORT_DEI_TAG_CTRL(p) (0x6A9C + (((p >> 5) << 2)))
  287. #define RTL839X_PRI_SEL_IPRI_REMAP (0x1080)
  288. #define RTL838X_PRI_SEL_IPRI_REMAP (0x5F8C)
  289. #define RTL839X_PRI_SEL_DEI2DP_REMAP (0x10EC)
  290. #define RTL839X_PRI_SEL_DSCP2DP_REMAP_ADDR(i) (0x10F0 + (((i >> 4) << 2)))
  291. #define RTL839X_RMK_DEI_CTRL (0x6AA4)
  292. #define RTL839X_WRED_PORT_THR_CTRL(i) (0x6084 + ((i) << 2))
  293. #define RTL839X_WRED_QUEUE_THR_CTRL(q, i) (0x6090 + ((q) * 12) + ((i) << 2))
  294. #define RTL838X_PRI_DSCP_INVLD_CTRL0 (0x5FE8)
  295. #define RTL838X_RMK_IPRI_CTRL (0xA460)
  296. #define RTL838X_RMK_OPRI_CTRL (0xA464)
  297. #define RTL838X_SCHED_P_TYPE_CTRL(p) (0xC04C + (((p) << 7)))
  298. #define RTL838X_SCHED_LB_CTRL(p) (0xC004 + (((p) << 7)))
  299. #define RTL838X_FC_P_EGR_DROP_CTRL(p) (0x6B1C + (((p) << 2)))
  300. /* Debug features */
  301. #define RTL930X_STAT_PRVTE_DROP_COUNTER0 (0xB5B8)
  302. #define MAX_VLANS 4096
  303. #define MAX_LAGS 16
  304. #define MAX_PRIOS 8
  305. #define RTL930X_PORT_IGNORE 0x3f
  306. #define MAX_MC_GROUPS 512
  307. #define UNKNOWN_MC_PMASK (MAX_MC_GROUPS - 1)
  308. enum phy_type {
  309. PHY_NONE = 0,
  310. PHY_RTL838X_SDS = 1,
  311. PHY_RTL8218B_INT = 2,
  312. PHY_RTL8218B_EXT = 3,
  313. PHY_RTL8214FC = 4,
  314. PHY_RTL839X_SDS = 5,
  315. };
  316. struct rtl838x_port {
  317. bool enable;
  318. u64 pm;
  319. u16 pvid;
  320. bool eee_enabled;
  321. enum phy_type phy;
  322. bool is10G;
  323. bool is2G5;
  324. u8 sds_num;
  325. const struct dsa_port *dp;
  326. };
  327. struct rtl838x_vlan_info {
  328. u64 untagged_ports;
  329. u64 tagged_ports;
  330. u8 profile_id;
  331. bool hash_mc_fid;
  332. bool hash_uc_fid;
  333. u8 fid;
  334. };
  335. enum l2_entry_type {
  336. L2_INVALID = 0,
  337. L2_UNICAST = 1,
  338. L2_MULTICAST = 2,
  339. IP4_MULTICAST = 3,
  340. IP6_MULTICAST = 4,
  341. };
  342. struct rtl838x_l2_entry {
  343. u8 mac[6];
  344. u16 vid;
  345. u16 rvid;
  346. u8 port;
  347. bool valid;
  348. enum l2_entry_type type;
  349. bool is_static;
  350. bool is_ip_mc;
  351. bool is_ipv6_mc;
  352. bool block_da;
  353. bool block_sa;
  354. bool suspended;
  355. bool next_hop;
  356. int age;
  357. u8 trunk;
  358. bool is_trunk;
  359. u8 stack_dev;
  360. u16 mc_portmask_index;
  361. u32 mc_gip;
  362. u32 mc_sip;
  363. u16 mc_mac_index;
  364. u16 nh_route_id;
  365. bool nh_vlan_target; // Only RTL83xx: VLAN used for next hop
  366. };
  367. struct rtl838x_nexthop {
  368. u16 id; // ID in HW Nexthop table
  369. u32 ip; // IP Addres of nexthop
  370. u32 dev_id;
  371. u16 port;
  372. u16 vid;
  373. u16 fid;
  374. u64 mac;
  375. u16 mac_id;
  376. u16 l2_id; // Index of this next hop forwarding entry in L2 FIB table
  377. u16 if_id;
  378. };
  379. struct rtl838x_switch_priv;
  380. struct rtl838x_reg {
  381. void (*mask_port_reg_be)(u64 clear, u64 set, int reg);
  382. void (*set_port_reg_be)(u64 set, int reg);
  383. u64 (*get_port_reg_be)(int reg);
  384. void (*mask_port_reg_le)(u64 clear, u64 set, int reg);
  385. void (*set_port_reg_le)(u64 set, int reg);
  386. u64 (*get_port_reg_le)(int reg);
  387. int stat_port_rst;
  388. int stat_rst;
  389. int stat_port_std_mib;
  390. int (*port_iso_ctrl)(int p);
  391. void (*traffic_enable)(int source, int dest);
  392. void (*traffic_disable)(int source, int dest);
  393. void (*traffic_set)(int source, u64 dest_matrix);
  394. u64 (*traffic_get)(int source);
  395. int l2_ctrl_0;
  396. int l2_ctrl_1;
  397. int l2_port_aging_out;
  398. int smi_poll_ctrl;
  399. int l2_tbl_flush_ctrl;
  400. void (*exec_tbl0_cmd)(u32 cmd);
  401. void (*exec_tbl1_cmd)(u32 cmd);
  402. int (*tbl_access_data_0)(int i);
  403. int isr_glb_src;
  404. int isr_port_link_sts_chg;
  405. int imr_port_link_sts_chg;
  406. int imr_glb;
  407. void (*vlan_tables_read)(u32 vlan, struct rtl838x_vlan_info *info);
  408. void (*vlan_set_tagged)(u32 vlan, struct rtl838x_vlan_info *info);
  409. void (*vlan_set_untagged)(u32 vlan, u64 portmask);
  410. void (*vlan_profile_dump)(int index);
  411. void (*vlan_profile_setup)(int profile);
  412. void (*stp_get)(struct rtl838x_switch_priv *priv, u16 msti, u32 port_state[]);
  413. void (*stp_set)(struct rtl838x_switch_priv *priv, u16 msti, u32 port_state[]);
  414. int (*mac_force_mode_ctrl)(int port);
  415. int (*mac_port_ctrl)(int port);
  416. int (*l2_port_new_salrn)(int port);
  417. int (*l2_port_new_sa_fwd)(int port);
  418. int mir_ctrl;
  419. int mir_dpm;
  420. int mir_spm;
  421. int mac_link_sts;
  422. int mac_link_dup_sts;
  423. int (*mac_link_spd_sts)(int port);
  424. int mac_rx_pause_sts;
  425. int mac_tx_pause_sts;
  426. u64 (*read_l2_entry_using_hash)(u32 hash, u32 position, struct rtl838x_l2_entry *e);
  427. void (*write_l2_entry_using_hash)(u32 hash, u32 pos, struct rtl838x_l2_entry *e);
  428. u64 (*read_cam)(int idx, struct rtl838x_l2_entry *e);
  429. void (*write_cam)(int idx, struct rtl838x_l2_entry *e);
  430. int vlan_port_egr_filter;
  431. int vlan_port_igr_filter;
  432. int vlan_port_pb;
  433. int vlan_port_tag_sts_ctrl;
  434. int (*rtl838x_vlan_port_tag_sts_ctrl)(int port);
  435. int (*trk_mbr_ctr)(int group);
  436. int rma_bpdu_fld_pmask;
  437. int spcl_trap_eapol_ctrl;
  438. void (*init_eee)(struct rtl838x_switch_priv *priv, bool enable);
  439. void (*port_eee_set)(struct rtl838x_switch_priv *priv, int port, bool enable);
  440. int (*eee_port_ability)(struct rtl838x_switch_priv *priv,
  441. struct ethtool_eee *e, int port);
  442. u64 (*l2_hash_seed)(u64 mac, u32 vid);
  443. u32 (*l2_hash_key)(struct rtl838x_switch_priv *priv, u64 seed);
  444. u64 (*read_mcast_pmask)(int idx);
  445. void (*write_mcast_pmask)(int idx, u64 portmask);
  446. void (*vlan_fwd_on_inner)(int port, bool is_set);
  447. };
  448. struct rtl838x_switch_priv {
  449. /* Switch operation */
  450. struct dsa_switch *ds;
  451. struct device *dev;
  452. u16 id;
  453. u16 family_id;
  454. char version;
  455. struct rtl838x_port ports[57];
  456. struct mutex reg_mutex;
  457. int link_state_irq;
  458. int mirror_group_ports[4];
  459. struct mii_bus *mii_bus;
  460. const struct rtl838x_reg *r;
  461. u8 cpu_port;
  462. u8 port_mask;
  463. u8 port_width;
  464. u64 irq_mask;
  465. u32 fib_entries;
  466. int l2_bucket_size;
  467. struct dentry *dbgfs_dir;
  468. int n_lags;
  469. u64 lags_port_members[MAX_LAGS];
  470. struct net_device *lag_devs[MAX_LAGS];
  471. struct notifier_block nb;
  472. bool eee_enabled;
  473. unsigned long int mc_group_bm[MAX_MC_GROUPS >> 5];
  474. };
  475. void rtl838x_dbgfs_init(struct rtl838x_switch_priv *priv);
  476. #endif /* _RTL838X_H */