ar8216.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643
  1. /*
  2. * ar8216.h: AR8216 switch driver
  3. *
  4. * Copyright (C) 2009 Felix Fietkau <nbd@nbd.name>
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version 2
  9. * of the License, or (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. */
  16. #ifndef __AR8216_H
  17. #define __AR8216_H
  18. #define BITS(_s, _n) (((1UL << (_n)) - 1) << _s)
  19. #define AR8XXX_CAP_GIGE BIT(0)
  20. #define AR8XXX_CAP_MIB_COUNTERS BIT(1)
  21. #define AR8XXX_NUM_PHYS 5
  22. #define AR8216_PORT_CPU 0
  23. #define AR8216_NUM_PORTS 6
  24. #define AR8216_NUM_VLANS 16
  25. #define AR8316_NUM_VLANS 4096
  26. /* size of the vlan table */
  27. #define AR8X16_MAX_VLANS 128
  28. #define AR8X16_PROBE_RETRIES 10
  29. #define AR8X16_MAX_PORTS 8
  30. #define AR8XXX_REG_ARL_CTRL_AGE_TIME_SECS 7
  31. #define AR8XXX_DEFAULT_ARL_AGE_TIME 300
  32. /* Atheros specific MII registers */
  33. #define MII_ATH_MMD_ADDR 0x0d
  34. #define MII_ATH_MMD_DATA 0x0e
  35. #define MII_ATH_DBG_ADDR 0x1d
  36. #define MII_ATH_DBG_DATA 0x1e
  37. #define AR8216_REG_CTRL 0x0000
  38. #define AR8216_CTRL_REVISION BITS(0, 8)
  39. #define AR8216_CTRL_REVISION_S 0
  40. #define AR8216_CTRL_VERSION BITS(8, 8)
  41. #define AR8216_CTRL_VERSION_S 8
  42. #define AR8216_CTRL_RESET BIT(31)
  43. #define AR8216_REG_FLOOD_MASK 0x002C
  44. #define AR8216_FM_UNI_DEST_PORTS BITS(0, 6)
  45. #define AR8216_FM_MULTI_DEST_PORTS BITS(16, 6)
  46. #define AR8236_FM_CPU_BROADCAST_EN BIT(26)
  47. #define AR8236_FM_CPU_BCAST_FWD_EN BIT(25)
  48. #define AR8216_REG_GLOBAL_CTRL 0x0030
  49. #define AR8216_GCTRL_MTU BITS(0, 11)
  50. #define AR8236_GCTRL_MTU BITS(0, 14)
  51. #define AR8316_GCTRL_MTU BITS(0, 14)
  52. #define AR8216_REG_VTU 0x0040
  53. #define AR8216_VTU_OP BITS(0, 3)
  54. #define AR8216_VTU_OP_NOOP 0x0
  55. #define AR8216_VTU_OP_FLUSH 0x1
  56. #define AR8216_VTU_OP_LOAD 0x2
  57. #define AR8216_VTU_OP_PURGE 0x3
  58. #define AR8216_VTU_OP_REMOVE_PORT 0x4
  59. #define AR8216_VTU_ACTIVE BIT(3)
  60. #define AR8216_VTU_FULL BIT(4)
  61. #define AR8216_VTU_PORT BITS(8, 4)
  62. #define AR8216_VTU_PORT_S 8
  63. #define AR8216_VTU_VID BITS(16, 12)
  64. #define AR8216_VTU_VID_S 16
  65. #define AR8216_VTU_PRIO BITS(28, 3)
  66. #define AR8216_VTU_PRIO_S 28
  67. #define AR8216_VTU_PRIO_EN BIT(31)
  68. #define AR8216_REG_VTU_DATA 0x0044
  69. #define AR8216_VTUDATA_MEMBER BITS(0, 10)
  70. #define AR8236_VTUDATA_MEMBER BITS(0, 7)
  71. #define AR8216_VTUDATA_VALID BIT(11)
  72. #define AR8216_REG_ATU_FUNC0 0x0050
  73. #define AR8216_ATU_OP BITS(0, 3)
  74. #define AR8216_ATU_OP_NOOP 0x0
  75. #define AR8216_ATU_OP_FLUSH 0x1
  76. #define AR8216_ATU_OP_LOAD 0x2
  77. #define AR8216_ATU_OP_PURGE 0x3
  78. #define AR8216_ATU_OP_FLUSH_UNLOCKED 0x4
  79. #define AR8216_ATU_OP_FLUSH_PORT 0x5
  80. #define AR8216_ATU_OP_GET_NEXT 0x6
  81. #define AR8216_ATU_ACTIVE BIT(3)
  82. #define AR8216_ATU_PORT_NUM BITS(8, 4)
  83. #define AR8216_ATU_PORT_NUM_S 8
  84. #define AR8216_ATU_FULL_VIO BIT(12)
  85. #define AR8216_ATU_ADDR5 BITS(16, 8)
  86. #define AR8216_ATU_ADDR5_S 16
  87. #define AR8216_ATU_ADDR4 BITS(24, 8)
  88. #define AR8216_ATU_ADDR4_S 24
  89. #define AR8216_REG_ATU_FUNC1 0x0054
  90. #define AR8216_ATU_ADDR3 BITS(0, 8)
  91. #define AR8216_ATU_ADDR3_S 0
  92. #define AR8216_ATU_ADDR2 BITS(8, 8)
  93. #define AR8216_ATU_ADDR2_S 8
  94. #define AR8216_ATU_ADDR1 BITS(16, 8)
  95. #define AR8216_ATU_ADDR1_S 16
  96. #define AR8216_ATU_ADDR0 BITS(24, 8)
  97. #define AR8216_ATU_ADDR0_S 24
  98. #define AR8216_REG_ATU_FUNC2 0x0058
  99. #define AR8216_ATU_PORTS BITS(0, 6)
  100. #define AR8216_ATU_PORT0 BIT(0)
  101. #define AR8216_ATU_PORT1 BIT(1)
  102. #define AR8216_ATU_PORT2 BIT(2)
  103. #define AR8216_ATU_PORT3 BIT(3)
  104. #define AR8216_ATU_PORT4 BIT(4)
  105. #define AR8216_ATU_PORT5 BIT(5)
  106. #define AR8216_ATU_STATUS BITS(16, 4)
  107. #define AR8216_ATU_STATUS_S 16
  108. #define AR8216_REG_ATU_CTRL 0x005C
  109. #define AR8216_ATU_CTRL_AGE_EN BIT(17)
  110. #define AR8216_ATU_CTRL_AGE_TIME BITS(0, 16)
  111. #define AR8216_ATU_CTRL_AGE_TIME_S 0
  112. #define AR8236_ATU_CTRL_RES BIT(20)
  113. #define AR8216_REG_MIB_FUNC 0x0080
  114. #define AR8216_MIB_TIMER BITS(0, 16)
  115. #define AR8216_MIB_AT_HALF_EN BIT(16)
  116. #define AR8216_MIB_BUSY BIT(17)
  117. #define AR8216_MIB_FUNC BITS(24, 3)
  118. #define AR8216_MIB_FUNC_S 24
  119. #define AR8216_MIB_FUNC_NO_OP 0x0
  120. #define AR8216_MIB_FUNC_FLUSH 0x1
  121. #define AR8216_MIB_FUNC_CAPTURE 0x3
  122. #define AR8236_MIB_EN BIT(30)
  123. #define AR8216_REG_GLOBAL_CPUPORT 0x0078
  124. #define AR8216_GLOBAL_CPUPORT_MIRROR_PORT BITS(4, 4)
  125. #define AR8216_GLOBAL_CPUPORT_MIRROR_PORT_S 4
  126. #define AR8216_PORT_OFFSET(_i) (0x0100 * (_i + 1))
  127. #define AR8216_REG_PORT_STATUS(_i) (AR8216_PORT_OFFSET(_i) + 0x0000)
  128. #define AR8216_PORT_STATUS_SPEED BITS(0,2)
  129. #define AR8216_PORT_STATUS_SPEED_S 0
  130. #define AR8216_PORT_STATUS_TXMAC BIT(2)
  131. #define AR8216_PORT_STATUS_RXMAC BIT(3)
  132. #define AR8216_PORT_STATUS_TXFLOW BIT(4)
  133. #define AR8216_PORT_STATUS_RXFLOW BIT(5)
  134. #define AR8216_PORT_STATUS_DUPLEX BIT(6)
  135. #define AR8216_PORT_STATUS_LINK_UP BIT(8)
  136. #define AR8216_PORT_STATUS_LINK_AUTO BIT(9)
  137. #define AR8216_PORT_STATUS_LINK_PAUSE BIT(10)
  138. #define AR8216_PORT_STATUS_FLOW_CONTROL BIT(12)
  139. #define AR8216_REG_PORT_CTRL(_i) (AR8216_PORT_OFFSET(_i) + 0x0004)
  140. /* port forwarding state */
  141. #define AR8216_PORT_CTRL_STATE BITS(0, 3)
  142. #define AR8216_PORT_CTRL_STATE_S 0
  143. #define AR8216_PORT_CTRL_LEARN_LOCK BIT(7)
  144. /* egress 802.1q mode */
  145. #define AR8216_PORT_CTRL_VLAN_MODE BITS(8, 2)
  146. #define AR8216_PORT_CTRL_VLAN_MODE_S 8
  147. #define AR8216_PORT_CTRL_IGMP_SNOOP BIT(10)
  148. #define AR8216_PORT_CTRL_HEADER BIT(11)
  149. #define AR8216_PORT_CTRL_MAC_LOOP BIT(12)
  150. #define AR8216_PORT_CTRL_SINGLE_VLAN BIT(13)
  151. #define AR8216_PORT_CTRL_LEARN BIT(14)
  152. #define AR8216_PORT_CTRL_MIRROR_TX BIT(16)
  153. #define AR8216_PORT_CTRL_MIRROR_RX BIT(17)
  154. #define AR8216_REG_PORT_VLAN(_i) (AR8216_PORT_OFFSET(_i) + 0x0008)
  155. #define AR8216_PORT_VLAN_DEFAULT_ID BITS(0, 12)
  156. #define AR8216_PORT_VLAN_DEFAULT_ID_S 0
  157. #define AR8216_PORT_VLAN_DEST_PORTS BITS(16, 9)
  158. #define AR8216_PORT_VLAN_DEST_PORTS_S 16
  159. /* bit0 added to the priority field of egress frames */
  160. #define AR8216_PORT_VLAN_TX_PRIO BIT(27)
  161. /* port default priority */
  162. #define AR8216_PORT_VLAN_PRIORITY BITS(28, 2)
  163. #define AR8216_PORT_VLAN_PRIORITY_S 28
  164. /* ingress 802.1q mode */
  165. #define AR8216_PORT_VLAN_MODE BITS(30, 2)
  166. #define AR8216_PORT_VLAN_MODE_S 30
  167. #define AR8216_REG_PORT_RATE(_i) (AR8216_PORT_OFFSET(_i) + 0x000c)
  168. #define AR8216_REG_PORT_PRIO(_i) (AR8216_PORT_OFFSET(_i) + 0x0010)
  169. #define AR8216_STATS_RXBROAD 0x00
  170. #define AR8216_STATS_RXPAUSE 0x04
  171. #define AR8216_STATS_RXMULTI 0x08
  172. #define AR8216_STATS_RXFCSERR 0x0c
  173. #define AR8216_STATS_RXALIGNERR 0x10
  174. #define AR8216_STATS_RXRUNT 0x14
  175. #define AR8216_STATS_RXFRAGMENT 0x18
  176. #define AR8216_STATS_RX64BYTE 0x1c
  177. #define AR8216_STATS_RX128BYTE 0x20
  178. #define AR8216_STATS_RX256BYTE 0x24
  179. #define AR8216_STATS_RX512BYTE 0x28
  180. #define AR8216_STATS_RX1024BYTE 0x2c
  181. #define AR8216_STATS_RXMAXBYTE 0x30
  182. #define AR8216_STATS_RXTOOLONG 0x34
  183. #define AR8216_STATS_RXGOODBYTE 0x38
  184. #define AR8216_STATS_RXBADBYTE 0x40
  185. #define AR8216_STATS_RXOVERFLOW 0x48
  186. #define AR8216_STATS_FILTERED 0x4c
  187. #define AR8216_STATS_TXBROAD 0x50
  188. #define AR8216_STATS_TXPAUSE 0x54
  189. #define AR8216_STATS_TXMULTI 0x58
  190. #define AR8216_STATS_TXUNDERRUN 0x5c
  191. #define AR8216_STATS_TX64BYTE 0x60
  192. #define AR8216_STATS_TX128BYTE 0x64
  193. #define AR8216_STATS_TX256BYTE 0x68
  194. #define AR8216_STATS_TX512BYTE 0x6c
  195. #define AR8216_STATS_TX1024BYTE 0x70
  196. #define AR8216_STATS_TXMAXBYTE 0x74
  197. #define AR8216_STATS_TXOVERSIZE 0x78
  198. #define AR8216_STATS_TXBYTE 0x7c
  199. #define AR8216_STATS_TXCOLLISION 0x84
  200. #define AR8216_STATS_TXABORTCOL 0x88
  201. #define AR8216_STATS_TXMULTICOL 0x8c
  202. #define AR8216_STATS_TXSINGLECOL 0x90
  203. #define AR8216_STATS_TXEXCDEFER 0x94
  204. #define AR8216_STATS_TXDEFER 0x98
  205. #define AR8216_STATS_TXLATECOL 0x9c
  206. #define AR8236_REG_PORT_VLAN(_i) (AR8216_PORT_OFFSET((_i)) + 0x0008)
  207. #define AR8236_PORT_VLAN_DEFAULT_ID BITS(16, 12)
  208. #define AR8236_PORT_VLAN_DEFAULT_ID_S 16
  209. #define AR8236_PORT_VLAN_PRIORITY BITS(29, 3)
  210. #define AR8236_PORT_VLAN_PRIORITY_S 28
  211. #define AR8236_REG_PORT_VLAN2(_i) (AR8216_PORT_OFFSET((_i)) + 0x000c)
  212. #define AR8236_PORT_VLAN2_MEMBER BITS(16, 7)
  213. #define AR8236_PORT_VLAN2_MEMBER_S 16
  214. #define AR8236_PORT_VLAN2_TX_PRIO BIT(23)
  215. #define AR8236_PORT_VLAN2_VLAN_MODE BITS(30, 2)
  216. #define AR8236_PORT_VLAN2_VLAN_MODE_S 30
  217. #define AR8236_STATS_RXBROAD 0x00
  218. #define AR8236_STATS_RXPAUSE 0x04
  219. #define AR8236_STATS_RXMULTI 0x08
  220. #define AR8236_STATS_RXFCSERR 0x0c
  221. #define AR8236_STATS_RXALIGNERR 0x10
  222. #define AR8236_STATS_RXRUNT 0x14
  223. #define AR8236_STATS_RXFRAGMENT 0x18
  224. #define AR8236_STATS_RX64BYTE 0x1c
  225. #define AR8236_STATS_RX128BYTE 0x20
  226. #define AR8236_STATS_RX256BYTE 0x24
  227. #define AR8236_STATS_RX512BYTE 0x28
  228. #define AR8236_STATS_RX1024BYTE 0x2c
  229. #define AR8236_STATS_RX1518BYTE 0x30
  230. #define AR8236_STATS_RXMAXBYTE 0x34
  231. #define AR8236_STATS_RXTOOLONG 0x38
  232. #define AR8236_STATS_RXGOODBYTE 0x3c
  233. #define AR8236_STATS_RXBADBYTE 0x44
  234. #define AR8236_STATS_RXOVERFLOW 0x4c
  235. #define AR8236_STATS_FILTERED 0x50
  236. #define AR8236_STATS_TXBROAD 0x54
  237. #define AR8236_STATS_TXPAUSE 0x58
  238. #define AR8236_STATS_TXMULTI 0x5c
  239. #define AR8236_STATS_TXUNDERRUN 0x60
  240. #define AR8236_STATS_TX64BYTE 0x64
  241. #define AR8236_STATS_TX128BYTE 0x68
  242. #define AR8236_STATS_TX256BYTE 0x6c
  243. #define AR8236_STATS_TX512BYTE 0x70
  244. #define AR8236_STATS_TX1024BYTE 0x74
  245. #define AR8236_STATS_TX1518BYTE 0x78
  246. #define AR8236_STATS_TXMAXBYTE 0x7c
  247. #define AR8236_STATS_TXOVERSIZE 0x80
  248. #define AR8236_STATS_TXBYTE 0x84
  249. #define AR8236_STATS_TXCOLLISION 0x8c
  250. #define AR8236_STATS_TXABORTCOL 0x90
  251. #define AR8236_STATS_TXMULTICOL 0x94
  252. #define AR8236_STATS_TXSINGLECOL 0x98
  253. #define AR8236_STATS_TXEXCDEFER 0x9c
  254. #define AR8236_STATS_TXDEFER 0xa0
  255. #define AR8236_STATS_TXLATECOL 0xa4
  256. #define AR8316_REG_POSTRIP 0x0008
  257. #define AR8316_POSTRIP_MAC0_GMII_EN BIT(0)
  258. #define AR8316_POSTRIP_MAC0_RGMII_EN BIT(1)
  259. #define AR8316_POSTRIP_PHY4_GMII_EN BIT(2)
  260. #define AR8316_POSTRIP_PHY4_RGMII_EN BIT(3)
  261. #define AR8316_POSTRIP_MAC0_MAC_MODE BIT(4)
  262. #define AR8316_POSTRIP_RTL_MODE BIT(5)
  263. #define AR8316_POSTRIP_RGMII_RXCLK_DELAY_EN BIT(6)
  264. #define AR8316_POSTRIP_RGMII_TXCLK_DELAY_EN BIT(7)
  265. #define AR8316_POSTRIP_SERDES_EN BIT(8)
  266. #define AR8316_POSTRIP_SEL_ANA_RST BIT(9)
  267. #define AR8316_POSTRIP_GATE_25M_EN BIT(10)
  268. #define AR8316_POSTRIP_SEL_CLK25M BIT(11)
  269. #define AR8316_POSTRIP_HIB_PULSE_HW BIT(12)
  270. #define AR8316_POSTRIP_DBG_MODE_I BIT(13)
  271. #define AR8316_POSTRIP_MAC5_MAC_MODE BIT(14)
  272. #define AR8316_POSTRIP_MAC5_PHY_MODE BIT(15)
  273. #define AR8316_POSTRIP_POWER_DOWN_HW BIT(16)
  274. #define AR8316_POSTRIP_LPW_STATE_EN BIT(17)
  275. #define AR8316_POSTRIP_MAN_EN BIT(18)
  276. #define AR8316_POSTRIP_PHY_PLL_ON BIT(19)
  277. #define AR8316_POSTRIP_LPW_EXIT BIT(20)
  278. #define AR8316_POSTRIP_TXDELAY_S0 BIT(21)
  279. #define AR8316_POSTRIP_TXDELAY_S1 BIT(22)
  280. #define AR8316_POSTRIP_RXDELAY_S0 BIT(23)
  281. #define AR8316_POSTRIP_LED_OPEN_EN BIT(24)
  282. #define AR8316_POSTRIP_SPI_EN BIT(25)
  283. #define AR8316_POSTRIP_RXDELAY_S1 BIT(26)
  284. #define AR8316_POSTRIP_POWER_ON_SEL BIT(31)
  285. /* port speed */
  286. enum {
  287. AR8216_PORT_SPEED_10M = 0,
  288. AR8216_PORT_SPEED_100M = 1,
  289. AR8216_PORT_SPEED_1000M = 2,
  290. AR8216_PORT_SPEED_ERR = 3,
  291. };
  292. /* ingress 802.1q mode */
  293. enum {
  294. AR8216_IN_PORT_ONLY = 0,
  295. AR8216_IN_PORT_FALLBACK = 1,
  296. AR8216_IN_VLAN_ONLY = 2,
  297. AR8216_IN_SECURE = 3
  298. };
  299. /* egress 802.1q mode */
  300. enum {
  301. AR8216_OUT_KEEP = 0,
  302. AR8216_OUT_STRIP_VLAN = 1,
  303. AR8216_OUT_ADD_VLAN = 2
  304. };
  305. /* port forwarding state */
  306. enum {
  307. AR8216_PORT_STATE_DISABLED = 0,
  308. AR8216_PORT_STATE_BLOCK = 1,
  309. AR8216_PORT_STATE_LISTEN = 2,
  310. AR8216_PORT_STATE_LEARN = 3,
  311. AR8216_PORT_STATE_FORWARD = 4
  312. };
  313. enum {
  314. AR8XXX_VER_AR8216 = 0x01,
  315. AR8XXX_VER_AR8236 = 0x03,
  316. AR8XXX_VER_AR8316 = 0x10,
  317. AR8XXX_VER_AR8327 = 0x12,
  318. AR8XXX_VER_AR8337 = 0x13,
  319. };
  320. #define AR8XXX_NUM_ARL_RECORDS 100
  321. enum arl_op {
  322. AR8XXX_ARL_INITIALIZE,
  323. AR8XXX_ARL_GET_NEXT
  324. };
  325. struct arl_entry {
  326. u8 port;
  327. u8 mac[6];
  328. };
  329. struct ar8xxx_priv;
  330. struct ar8xxx_mib_desc {
  331. unsigned int size;
  332. unsigned int offset;
  333. const char *name;
  334. };
  335. struct ar8xxx_chip {
  336. unsigned long caps;
  337. bool config_at_probe;
  338. bool mii_lo_first;
  339. /* parameters to calculate REG_PORT_STATS_BASE */
  340. unsigned reg_port_stats_start;
  341. unsigned reg_port_stats_length;
  342. unsigned reg_arl_ctrl;
  343. int (*hw_init)(struct ar8xxx_priv *priv);
  344. void (*cleanup)(struct ar8xxx_priv *priv);
  345. const char *name;
  346. int vlans;
  347. int ports;
  348. const struct switch_dev_ops *swops;
  349. void (*init_globals)(struct ar8xxx_priv *priv);
  350. void (*init_port)(struct ar8xxx_priv *priv, int port);
  351. void (*setup_port)(struct ar8xxx_priv *priv, int port, u32 members);
  352. u32 (*read_port_status)(struct ar8xxx_priv *priv, int port);
  353. u32 (*read_port_eee_status)(struct ar8xxx_priv *priv, int port);
  354. int (*atu_flush)(struct ar8xxx_priv *priv);
  355. int (*atu_flush_port)(struct ar8xxx_priv *priv, int port);
  356. void (*vtu_flush)(struct ar8xxx_priv *priv);
  357. void (*vtu_load_vlan)(struct ar8xxx_priv *priv, u32 vid, u32 port_mask);
  358. void (*phy_fixup)(struct ar8xxx_priv *priv, int phy);
  359. void (*set_mirror_regs)(struct ar8xxx_priv *priv);
  360. void (*get_arl_entry)(struct ar8xxx_priv *priv, struct arl_entry *a,
  361. u32 *status, enum arl_op op);
  362. int (*sw_hw_apply)(struct switch_dev *dev);
  363. const struct ar8xxx_mib_desc *mib_decs;
  364. unsigned num_mibs;
  365. unsigned mib_func;
  366. };
  367. struct ar8xxx_priv {
  368. struct switch_dev dev;
  369. struct mii_bus *mii_bus;
  370. struct phy_device *phy;
  371. int (*get_port_link)(unsigned port);
  372. const struct net_device_ops *ndo_old;
  373. struct net_device_ops ndo;
  374. struct mutex reg_mutex;
  375. u8 chip_ver;
  376. u8 chip_rev;
  377. const struct ar8xxx_chip *chip;
  378. void *chip_data;
  379. bool initialized;
  380. bool port4_phy;
  381. char buf[2048];
  382. struct arl_entry arl_table[AR8XXX_NUM_ARL_RECORDS];
  383. char arl_buf[AR8XXX_NUM_ARL_RECORDS * 32 + 256];
  384. bool link_up[AR8X16_MAX_PORTS];
  385. bool init;
  386. struct mutex mib_lock;
  387. struct delayed_work mib_work;
  388. int mib_next_port;
  389. u64 *mib_stats;
  390. struct list_head list;
  391. unsigned int use_count;
  392. /* all fields below are cleared on reset */
  393. bool vlan;
  394. u16 vlan_id[AR8X16_MAX_VLANS];
  395. u8 vlan_table[AR8X16_MAX_VLANS];
  396. u8 vlan_tagged;
  397. u16 pvid[AR8X16_MAX_PORTS];
  398. int arl_age_time;
  399. /* mirroring */
  400. bool mirror_rx;
  401. bool mirror_tx;
  402. int source_port;
  403. int monitor_port;
  404. };
  405. u32
  406. ar8xxx_mii_read32(struct ar8xxx_priv *priv, int phy_id, int regnum);
  407. void
  408. ar8xxx_mii_write32(struct ar8xxx_priv *priv, int phy_id, int regnum, u32 val);
  409. u32
  410. ar8xxx_read(struct ar8xxx_priv *priv, int reg);
  411. void
  412. ar8xxx_write(struct ar8xxx_priv *priv, int reg, u32 val);
  413. u32
  414. ar8xxx_rmw(struct ar8xxx_priv *priv, int reg, u32 mask, u32 val);
  415. void
  416. ar8xxx_phy_dbg_write(struct ar8xxx_priv *priv, int phy_addr,
  417. u16 dbg_addr, u16 dbg_data);
  418. void
  419. ar8xxx_phy_mmd_write(struct ar8xxx_priv *priv, int phy_addr, u16 addr, u16 reg, u16 data);
  420. u16
  421. ar8xxx_phy_mmd_read(struct ar8xxx_priv *priv, int phy_addr, u16 addr, u16 reg);
  422. void
  423. ar8xxx_phy_init(struct ar8xxx_priv *priv);
  424. int
  425. ar8xxx_sw_set_vlan(struct switch_dev *dev, const struct switch_attr *attr,
  426. struct switch_val *val);
  427. int
  428. ar8xxx_sw_get_vlan(struct switch_dev *dev, const struct switch_attr *attr,
  429. struct switch_val *val);
  430. int
  431. ar8xxx_sw_set_reset_mibs(struct switch_dev *dev,
  432. const struct switch_attr *attr,
  433. struct switch_val *val);
  434. int
  435. ar8xxx_sw_set_mirror_rx_enable(struct switch_dev *dev,
  436. const struct switch_attr *attr,
  437. struct switch_val *val);
  438. int
  439. ar8xxx_sw_get_mirror_rx_enable(struct switch_dev *dev,
  440. const struct switch_attr *attr,
  441. struct switch_val *val);
  442. int
  443. ar8xxx_sw_set_mirror_tx_enable(struct switch_dev *dev,
  444. const struct switch_attr *attr,
  445. struct switch_val *val);
  446. int
  447. ar8xxx_sw_get_mirror_tx_enable(struct switch_dev *dev,
  448. const struct switch_attr *attr,
  449. struct switch_val *val);
  450. int
  451. ar8xxx_sw_set_mirror_monitor_port(struct switch_dev *dev,
  452. const struct switch_attr *attr,
  453. struct switch_val *val);
  454. int
  455. ar8xxx_sw_get_mirror_monitor_port(struct switch_dev *dev,
  456. const struct switch_attr *attr,
  457. struct switch_val *val);
  458. int
  459. ar8xxx_sw_set_mirror_source_port(struct switch_dev *dev,
  460. const struct switch_attr *attr,
  461. struct switch_val *val);
  462. int
  463. ar8xxx_sw_get_mirror_source_port(struct switch_dev *dev,
  464. const struct switch_attr *attr,
  465. struct switch_val *val);
  466. int
  467. ar8xxx_sw_set_pvid(struct switch_dev *dev, int port, int vlan);
  468. int
  469. ar8xxx_sw_get_pvid(struct switch_dev *dev, int port, int *vlan);
  470. int
  471. ar8xxx_sw_hw_apply(struct switch_dev *dev);
  472. int
  473. ar8xxx_sw_reset_switch(struct switch_dev *dev);
  474. int
  475. ar8xxx_sw_get_port_link(struct switch_dev *dev, int port,
  476. struct switch_port_link *link);
  477. int
  478. ar8xxx_sw_set_port_reset_mib(struct switch_dev *dev,
  479. const struct switch_attr *attr,
  480. struct switch_val *val);
  481. int
  482. ar8xxx_sw_get_port_mib(struct switch_dev *dev,
  483. const struct switch_attr *attr,
  484. struct switch_val *val);
  485. int
  486. ar8xxx_sw_get_arl_age_time(struct switch_dev *dev,
  487. const struct switch_attr *attr,
  488. struct switch_val *val);
  489. int
  490. ar8xxx_sw_set_arl_age_time(struct switch_dev *dev,
  491. const struct switch_attr *attr,
  492. struct switch_val *val);
  493. int
  494. ar8xxx_sw_get_arl_table(struct switch_dev *dev,
  495. const struct switch_attr *attr,
  496. struct switch_val *val);
  497. int
  498. ar8xxx_sw_set_flush_arl_table(struct switch_dev *dev,
  499. const struct switch_attr *attr,
  500. struct switch_val *val);
  501. int
  502. ar8xxx_sw_set_flush_port_arl_table(struct switch_dev *dev,
  503. const struct switch_attr *attr,
  504. struct switch_val *val);
  505. int
  506. ar8216_wait_bit(struct ar8xxx_priv *priv, int reg, u32 mask, u32 val);
  507. static inline struct ar8xxx_priv *
  508. swdev_to_ar8xxx(struct switch_dev *swdev)
  509. {
  510. return container_of(swdev, struct ar8xxx_priv, dev);
  511. }
  512. static inline bool ar8xxx_has_gige(struct ar8xxx_priv *priv)
  513. {
  514. return priv->chip->caps & AR8XXX_CAP_GIGE;
  515. }
  516. static inline bool ar8xxx_has_mib_counters(struct ar8xxx_priv *priv)
  517. {
  518. return priv->chip->caps & AR8XXX_CAP_MIB_COUNTERS;
  519. }
  520. static inline bool chip_is_ar8216(struct ar8xxx_priv *priv)
  521. {
  522. return priv->chip_ver == AR8XXX_VER_AR8216;
  523. }
  524. static inline bool chip_is_ar8236(struct ar8xxx_priv *priv)
  525. {
  526. return priv->chip_ver == AR8XXX_VER_AR8236;
  527. }
  528. static inline bool chip_is_ar8316(struct ar8xxx_priv *priv)
  529. {
  530. return priv->chip_ver == AR8XXX_VER_AR8316;
  531. }
  532. static inline bool chip_is_ar8327(struct ar8xxx_priv *priv)
  533. {
  534. return priv->chip_ver == AR8XXX_VER_AR8327;
  535. }
  536. static inline bool chip_is_ar8337(struct ar8xxx_priv *priv)
  537. {
  538. return priv->chip_ver == AR8XXX_VER_AR8337;
  539. }
  540. static inline void
  541. ar8xxx_reg_set(struct ar8xxx_priv *priv, int reg, u32 val)
  542. {
  543. ar8xxx_rmw(priv, reg, 0, val);
  544. }
  545. static inline void
  546. ar8xxx_reg_clear(struct ar8xxx_priv *priv, int reg, u32 val)
  547. {
  548. ar8xxx_rmw(priv, reg, val, 0);
  549. }
  550. static inline void
  551. split_addr(u32 regaddr, u16 *r1, u16 *r2, u16 *page)
  552. {
  553. regaddr >>= 1;
  554. *r1 = regaddr & 0x1e;
  555. regaddr >>= 5;
  556. *r2 = regaddr & 0x7;
  557. regaddr >>= 3;
  558. *page = regaddr & 0x1ff;
  559. }
  560. static inline void
  561. wait_for_page_switch(void)
  562. {
  563. udelay(5);
  564. }
  565. #endif