]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/net/dsa/mv88e6xxx/mv88e6xxx.h
net: dsa: mv88e6xxx: Refactor egress rate limiting
[karo-tx-linux.git] / drivers / net / dsa / mv88e6xxx / mv88e6xxx.h
1 /*
2  * Marvell 88e6xxx common definitions
3  *
4  * Copyright (c) 2008 Marvell Semiconductor
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  */
11
12 #ifndef __MV88E6XXX_H
13 #define __MV88E6XXX_H
14
15 #include <linux/if_vlan.h>
16 #include <linux/irq.h>
17 #include <linux/gpio/consumer.h>
18
19 #ifndef UINT64_MAX
20 #define UINT64_MAX              (u64)(~((u64)0))
21 #endif
22
23 #define SMI_CMD                 0x00
24 #define SMI_CMD_BUSY            BIT(15)
25 #define SMI_CMD_CLAUSE_22       BIT(12)
26 #define SMI_CMD_OP_22_WRITE     ((1 << 10) | SMI_CMD_BUSY | SMI_CMD_CLAUSE_22)
27 #define SMI_CMD_OP_22_READ      ((2 << 10) | SMI_CMD_BUSY | SMI_CMD_CLAUSE_22)
28 #define SMI_CMD_OP_45_WRITE_ADDR        ((0 << 10) | SMI_CMD_BUSY)
29 #define SMI_CMD_OP_45_WRITE_DATA        ((1 << 10) | SMI_CMD_BUSY)
30 #define SMI_CMD_OP_45_READ_DATA         ((2 << 10) | SMI_CMD_BUSY)
31 #define SMI_CMD_OP_45_READ_DATA_INC     ((3 << 10) | SMI_CMD_BUSY)
32 #define SMI_DATA                0x01
33
34 /* PHY Registers */
35 #define PHY_PAGE                0x16
36 #define PHY_PAGE_COPPER         0x00
37
38 #define ADDR_SERDES             0x0f
39 #define SERDES_PAGE_FIBER       0x01
40
41 #define PORT_STATUS             0x00
42 #define PORT_STATUS_PAUSE_EN    BIT(15)
43 #define PORT_STATUS_MY_PAUSE    BIT(14)
44 #define PORT_STATUS_HD_FLOW     BIT(13)
45 #define PORT_STATUS_PHY_DETECT  BIT(12)
46 #define PORT_STATUS_LINK        BIT(11)
47 #define PORT_STATUS_DUPLEX      BIT(10)
48 #define PORT_STATUS_SPEED_MASK  0x0300
49 #define PORT_STATUS_SPEED_10    0x0000
50 #define PORT_STATUS_SPEED_100   0x0100
51 #define PORT_STATUS_SPEED_1000  0x0200
52 #define PORT_STATUS_EEE         BIT(6) /* 6352 */
53 #define PORT_STATUS_AM_DIS      BIT(6) /* 6165 */
54 #define PORT_STATUS_MGMII       BIT(6) /* 6185 */
55 #define PORT_STATUS_TX_PAUSED   BIT(5)
56 #define PORT_STATUS_FLOW_CTRL   BIT(4)
57 #define PORT_STATUS_CMODE_MASK  0x0f
58 #define PORT_STATUS_CMODE_100BASE_X     0x8
59 #define PORT_STATUS_CMODE_1000BASE_X    0x9
60 #define PORT_STATUS_CMODE_SGMII         0xa
61 #define PORT_PCS_CTRL           0x01
62 #define PORT_PCS_CTRL_RGMII_DELAY_RXCLK BIT(15)
63 #define PORT_PCS_CTRL_RGMII_DELAY_TXCLK BIT(14)
64 #define PORT_PCS_CTRL_FORCE_SPEED       BIT(13) /* 6390 */
65 #define PORT_PCS_CTRL_ALTSPEED          BIT(12) /* 6390 */
66 #define PORT_PCS_CTRL_200BASE           BIT(12) /* 6352 */
67 #define PORT_PCS_CTRL_FC                BIT(7)
68 #define PORT_PCS_CTRL_FORCE_FC          BIT(6)
69 #define PORT_PCS_CTRL_LINK_UP           BIT(5)
70 #define PORT_PCS_CTRL_FORCE_LINK        BIT(4)
71 #define PORT_PCS_CTRL_DUPLEX_FULL       BIT(3)
72 #define PORT_PCS_CTRL_FORCE_DUPLEX      BIT(2)
73 #define PORT_PCS_CTRL_SPEED_MASK        (0x03)
74 #define PORT_PCS_CTRL_SPEED_10          (0x00)
75 #define PORT_PCS_CTRL_SPEED_100         (0x01)
76 #define PORT_PCS_CTRL_SPEED_200         (0x02) /* 6065 and non Gb chips */
77 #define PORT_PCS_CTRL_SPEED_1000        (0x02)
78 #define PORT_PCS_CTRL_SPEED_10000       (0x03) /* 6390X */
79 #define PORT_PCS_CTRL_SPEED_UNFORCED    (0x03)
80 #define PORT_PAUSE_CTRL         0x02
81 #define PORT_SWITCH_ID          0x03
82 #define PORT_SWITCH_ID_PROD_NUM_6085    0x04a
83 #define PORT_SWITCH_ID_PROD_NUM_6095    0x095
84 #define PORT_SWITCH_ID_PROD_NUM_6097    0x099
85 #define PORT_SWITCH_ID_PROD_NUM_6131    0x106
86 #define PORT_SWITCH_ID_PROD_NUM_6320    0x115
87 #define PORT_SWITCH_ID_PROD_NUM_6123    0x121
88 #define PORT_SWITCH_ID_PROD_NUM_6161    0x161
89 #define PORT_SWITCH_ID_PROD_NUM_6165    0x165
90 #define PORT_SWITCH_ID_PROD_NUM_6171    0x171
91 #define PORT_SWITCH_ID_PROD_NUM_6172    0x172
92 #define PORT_SWITCH_ID_PROD_NUM_6175    0x175
93 #define PORT_SWITCH_ID_PROD_NUM_6176    0x176
94 #define PORT_SWITCH_ID_PROD_NUM_6185    0x1a7
95 #define PORT_SWITCH_ID_PROD_NUM_6190    0x190
96 #define PORT_SWITCH_ID_PROD_NUM_6190X   0x0a0
97 #define PORT_SWITCH_ID_PROD_NUM_6191    0x191
98 #define PORT_SWITCH_ID_PROD_NUM_6240    0x240
99 #define PORT_SWITCH_ID_PROD_NUM_6290    0x290
100 #define PORT_SWITCH_ID_PROD_NUM_6321    0x310
101 #define PORT_SWITCH_ID_PROD_NUM_6352    0x352
102 #define PORT_SWITCH_ID_PROD_NUM_6350    0x371
103 #define PORT_SWITCH_ID_PROD_NUM_6351    0x375
104 #define PORT_SWITCH_ID_PROD_NUM_6390    0x390
105 #define PORT_SWITCH_ID_PROD_NUM_6390X   0x0a1
106 #define PORT_CONTROL            0x04
107 #define PORT_CONTROL_USE_CORE_TAG       BIT(15)
108 #define PORT_CONTROL_DROP_ON_LOCK       BIT(14)
109 #define PORT_CONTROL_EGRESS_UNMODIFIED  (0x0 << 12)
110 #define PORT_CONTROL_EGRESS_UNTAGGED    (0x1 << 12)
111 #define PORT_CONTROL_EGRESS_TAGGED      (0x2 << 12)
112 #define PORT_CONTROL_EGRESS_ADD_TAG     (0x3 << 12)
113 #define PORT_CONTROL_EGRESS_MASK        (0x3 << 12)
114 #define PORT_CONTROL_HEADER             BIT(11)
115 #define PORT_CONTROL_IGMP_MLD_SNOOP     BIT(10)
116 #define PORT_CONTROL_DOUBLE_TAG         BIT(9)
117 #define PORT_CONTROL_FRAME_MODE_NORMAL          (0x0 << 8)
118 #define PORT_CONTROL_FRAME_MODE_DSA             (0x1 << 8)
119 #define PORT_CONTROL_FRAME_MODE_PROVIDER        (0x2 << 8)
120 #define PORT_CONTROL_FRAME_ETHER_TYPE_DSA       (0x3 << 8)
121 #define PORT_CONTROL_FRAME_MASK                 (0x3 << 8)
122 #define PORT_CONTROL_DSA_TAG            BIT(8)
123 #define PORT_CONTROL_VLAN_TUNNEL        BIT(7)
124 #define PORT_CONTROL_TAG_IF_BOTH        BIT(6)
125 #define PORT_CONTROL_USE_IP             BIT(5)
126 #define PORT_CONTROL_USE_TAG            BIT(4)
127 #define PORT_CONTROL_FORWARD_UNKNOWN_MC BIT(3)
128 #define PORT_CONTROL_FORWARD_UNKNOWN    BIT(2)
129 #define PORT_CONTROL_NOT_EGRESS_UNKNOWN_DA              (0x0 << 2)
130 #define PORT_CONTROL_NOT_EGRESS_UNKNOWN_MULTICAST_DA    (0x1 << 2)
131 #define PORT_CONTROL_NOT_EGRESS_UNKNOWN_UNITCAST_DA     (0x2 << 2)
132 #define PORT_CONTROL_EGRESS_ALL_UNKNOWN_DA              (0x3 << 2)
133 #define PORT_CONTROL_STATE_MASK         0x03
134 #define PORT_CONTROL_STATE_DISABLED     0x00
135 #define PORT_CONTROL_STATE_BLOCKING     0x01
136 #define PORT_CONTROL_STATE_LEARNING     0x02
137 #define PORT_CONTROL_STATE_FORWARDING   0x03
138 #define PORT_CONTROL_1          0x05
139 #define PORT_CONTROL_1_FID_11_4_MASK    (0xff << 0)
140 #define PORT_BASE_VLAN          0x06
141 #define PORT_BASE_VLAN_FID_3_0_MASK     (0xf << 12)
142 #define PORT_DEFAULT_VLAN       0x07
143 #define PORT_DEFAULT_VLAN_MASK  0xfff
144 #define PORT_CONTROL_2          0x08
145 #define PORT_CONTROL_2_IGNORE_FCS       BIT(15)
146 #define PORT_CONTROL_2_VTU_PRI_OVERRIDE BIT(14)
147 #define PORT_CONTROL_2_SA_PRIO_OVERRIDE BIT(13)
148 #define PORT_CONTROL_2_DA_PRIO_OVERRIDE BIT(12)
149 #define PORT_CONTROL_2_JUMBO_1522       (0x00 << 12)
150 #define PORT_CONTROL_2_JUMBO_2048       (0x01 << 12)
151 #define PORT_CONTROL_2_JUMBO_10240      (0x02 << 12)
152 #define PORT_CONTROL_2_8021Q_MASK       (0x03 << 10)
153 #define PORT_CONTROL_2_8021Q_DISABLED   (0x00 << 10)
154 #define PORT_CONTROL_2_8021Q_FALLBACK   (0x01 << 10)
155 #define PORT_CONTROL_2_8021Q_CHECK      (0x02 << 10)
156 #define PORT_CONTROL_2_8021Q_SECURE     (0x03 << 10)
157 #define PORT_CONTROL_2_DISCARD_TAGGED   BIT(9)
158 #define PORT_CONTROL_2_DISCARD_UNTAGGED BIT(8)
159 #define PORT_CONTROL_2_MAP_DA           BIT(7)
160 #define PORT_CONTROL_2_DEFAULT_FORWARD  BIT(6)
161 #define PORT_CONTROL_2_FORWARD_UNKNOWN  BIT(6)
162 #define PORT_CONTROL_2_EGRESS_MONITOR   BIT(5)
163 #define PORT_CONTROL_2_INGRESS_MONITOR  BIT(4)
164 #define PORT_RATE_CONTROL       0x09
165 #define PORT_RATE_CONTROL_2     0x0a
166 #define PORT_ASSOC_VECTOR       0x0b
167 #define PORT_ASSOC_VECTOR_HOLD_AT_1             BIT(15)
168 #define PORT_ASSOC_VECTOR_INT_AGE_OUT           BIT(14)
169 #define PORT_ASSOC_VECTOR_LOCKED_PORT           BIT(13)
170 #define PORT_ASSOC_VECTOR_IGNORE_WRONG          BIT(12)
171 #define PORT_ASSOC_VECTOR_REFRESH_LOCKED        BIT(11)
172 #define PORT_ATU_CONTROL        0x0c
173 #define PORT_PRI_OVERRIDE       0x0d
174 #define PORT_ETH_TYPE           0x0f
175 #define PORT_IN_DISCARD_LO      0x10
176 #define PORT_IN_DISCARD_HI      0x11
177 #define PORT_IN_FILTERED        0x12
178 #define PORT_OUT_FILTERED       0x13
179 #define PORT_TAG_REGMAP_0123    0x18
180 #define PORT_TAG_REGMAP_4567    0x19
181 #define PORT_IEEE_PRIO_MAP_TABLE        0x18    /* 6390 */
182 #define PORT_IEEE_PRIO_MAP_TABLE_UPDATE         BIT(15)
183 #define PORT_IEEE_PRIO_MAP_TABLE_INGRESS_PCP            (0x0 << 12)
184 #define PORT_IEEE_PRIO_MAP_TABLE_EGRESS_GREEN_PCP       (0x1 << 12)
185 #define PORT_IEEE_PRIO_MAP_TABLE_EGRESS_YELLOW_PCP      (0x2 << 12)
186 #define PORT_IEEE_PRIO_MAP_TABLE_EGRESS_AVB_PCP         (0x3 << 12)
187 #define PORT_IEEE_PRIO_MAP_TABLE_EGRESS_GREEN_DSCP      (0x5 << 12)
188 #define PORT_IEEE_PRIO_MAP_TABLE_EGRESS_YELLOW_DSCP     (0x6 << 12)
189 #define PORT_IEEE_PRIO_MAP_TABLE_EGRESS_AVB_DSCP        (0x7 << 12)
190 #define PORT_IEEE_PRIO_MAP_TABLE_POINTER_SHIFT          9
191
192 #define GLOBAL_STATUS           0x00
193 #define GLOBAL_STATUS_PPU_STATE BIT(15) /* 6351 and 6171 */
194 /* Two bits for 6165, 6185 etc */
195 #define GLOBAL_STATUS_PPU_MASK          (0x3 << 14)
196 #define GLOBAL_STATUS_PPU_DISABLED_RST  (0x0 << 14)
197 #define GLOBAL_STATUS_PPU_INITIALIZING  (0x1 << 14)
198 #define GLOBAL_STATUS_PPU_DISABLED      (0x2 << 14)
199 #define GLOBAL_STATUS_PPU_POLLING       (0x3 << 14)
200 #define GLOBAL_STATUS_IRQ_AVB           8
201 #define GLOBAL_STATUS_IRQ_DEVICE        7
202 #define GLOBAL_STATUS_IRQ_STATS         6
203 #define GLOBAL_STATUS_IRQ_VTU_PROBLEM   5
204 #define GLOBAL_STATUS_IRQ_VTU_DONE      4
205 #define GLOBAL_STATUS_IRQ_ATU_PROBLEM   3
206 #define GLOBAL_STATUS_IRQ_ATU_DONE      2
207 #define GLOBAL_STATUS_IRQ_TCAM_DONE     1
208 #define GLOBAL_STATUS_IRQ_EEPROM_DONE   0
209 #define GLOBAL_MAC_01           0x01
210 #define GLOBAL_MAC_23           0x02
211 #define GLOBAL_MAC_45           0x03
212 #define GLOBAL_ATU_FID          0x01
213 #define GLOBAL_VTU_FID          0x02
214 #define GLOBAL_VTU_FID_MASK     0xfff
215 #define GLOBAL_VTU_SID          0x03    /* 6097 6165 6351 6352 */
216 #define GLOBAL_VTU_SID_MASK     0x3f
217 #define GLOBAL_CONTROL          0x04
218 #define GLOBAL_CONTROL_SW_RESET         BIT(15)
219 #define GLOBAL_CONTROL_PPU_ENABLE       BIT(14)
220 #define GLOBAL_CONTROL_DISCARD_EXCESS   BIT(13) /* 6352 */
221 #define GLOBAL_CONTROL_SCHED_PRIO       BIT(11) /* 6152 */
222 #define GLOBAL_CONTROL_MAX_FRAME_1632   BIT(10) /* 6152 */
223 #define GLOBAL_CONTROL_RELOAD_EEPROM    BIT(9)  /* 6152 */
224 #define GLOBAL_CONTROL_DEVICE_EN        BIT(7)
225 #define GLOBAL_CONTROL_STATS_DONE_EN    BIT(6)
226 #define GLOBAL_CONTROL_VTU_PROBLEM_EN   BIT(5)
227 #define GLOBAL_CONTROL_VTU_DONE_EN      BIT(4)
228 #define GLOBAL_CONTROL_ATU_PROBLEM_EN   BIT(3)
229 #define GLOBAL_CONTROL_ATU_DONE_EN      BIT(2)
230 #define GLOBAL_CONTROL_TCAM_EN          BIT(1)
231 #define GLOBAL_CONTROL_EEPROM_DONE_EN   BIT(0)
232 #define GLOBAL_VTU_OP           0x05
233 #define GLOBAL_VTU_OP_BUSY      BIT(15)
234 #define GLOBAL_VTU_OP_FLUSH_ALL         ((0x01 << 12) | GLOBAL_VTU_OP_BUSY)
235 #define GLOBAL_VTU_OP_VTU_LOAD_PURGE    ((0x03 << 12) | GLOBAL_VTU_OP_BUSY)
236 #define GLOBAL_VTU_OP_VTU_GET_NEXT      ((0x04 << 12) | GLOBAL_VTU_OP_BUSY)
237 #define GLOBAL_VTU_OP_STU_LOAD_PURGE    ((0x05 << 12) | GLOBAL_VTU_OP_BUSY)
238 #define GLOBAL_VTU_OP_STU_GET_NEXT      ((0x06 << 12) | GLOBAL_VTU_OP_BUSY)
239 #define GLOBAL_VTU_VID          0x06
240 #define GLOBAL_VTU_VID_MASK     0xfff
241 #define GLOBAL_VTU_VID_VALID    BIT(12)
242 #define GLOBAL_VTU_DATA_0_3     0x07
243 #define GLOBAL_VTU_DATA_4_7     0x08
244 #define GLOBAL_VTU_DATA_8_11    0x09
245 #define GLOBAL_VTU_STU_DATA_MASK                0x03
246 #define GLOBAL_VTU_DATA_MEMBER_TAG_UNMODIFIED   0x00
247 #define GLOBAL_VTU_DATA_MEMBER_TAG_UNTAGGED     0x01
248 #define GLOBAL_VTU_DATA_MEMBER_TAG_TAGGED       0x02
249 #define GLOBAL_VTU_DATA_MEMBER_TAG_NON_MEMBER   0x03
250 #define GLOBAL_STU_DATA_PORT_STATE_DISABLED     0x00
251 #define GLOBAL_STU_DATA_PORT_STATE_BLOCKING     0x01
252 #define GLOBAL_STU_DATA_PORT_STATE_LEARNING     0x02
253 #define GLOBAL_STU_DATA_PORT_STATE_FORWARDING   0x03
254 #define GLOBAL_ATU_CONTROL      0x0a
255 #define GLOBAL_ATU_CONTROL_LEARN2ALL    BIT(3)
256 #define GLOBAL_ATU_OP           0x0b
257 #define GLOBAL_ATU_OP_BUSY      BIT(15)
258 #define GLOBAL_ATU_OP_NOP               (0 << 12)
259 #define GLOBAL_ATU_OP_FLUSH_MOVE_ALL            ((1 << 12) | GLOBAL_ATU_OP_BUSY)
260 #define GLOBAL_ATU_OP_FLUSH_MOVE_NON_STATIC     ((2 << 12) | GLOBAL_ATU_OP_BUSY)
261 #define GLOBAL_ATU_OP_LOAD_DB           ((3 << 12) | GLOBAL_ATU_OP_BUSY)
262 #define GLOBAL_ATU_OP_GET_NEXT_DB       ((4 << 12) | GLOBAL_ATU_OP_BUSY)
263 #define GLOBAL_ATU_OP_FLUSH_MOVE_ALL_DB         ((5 << 12) | GLOBAL_ATU_OP_BUSY)
264 #define GLOBAL_ATU_OP_FLUSH_MOVE_NON_STATIC_DB ((6 << 12) | GLOBAL_ATU_OP_BUSY)
265 #define GLOBAL_ATU_OP_GET_CLR_VIOLATION   ((7 << 12) | GLOBAL_ATU_OP_BUSY)
266 #define GLOBAL_ATU_DATA         0x0c
267 #define GLOBAL_ATU_DATA_TRUNK                   BIT(15)
268 #define GLOBAL_ATU_DATA_TRUNK_ID_MASK           0x00f0
269 #define GLOBAL_ATU_DATA_TRUNK_ID_SHIFT          4
270 #define GLOBAL_ATU_DATA_PORT_VECTOR_MASK        0x3ff0
271 #define GLOBAL_ATU_DATA_PORT_VECTOR_SHIFT       4
272 #define GLOBAL_ATU_DATA_STATE_MASK              0x0f
273 #define GLOBAL_ATU_DATA_STATE_UNUSED            0x00
274 #define GLOBAL_ATU_DATA_STATE_UC_MGMT           0x0d
275 #define GLOBAL_ATU_DATA_STATE_UC_STATIC         0x0e
276 #define GLOBAL_ATU_DATA_STATE_UC_PRIO_OVER      0x0f
277 #define GLOBAL_ATU_DATA_STATE_MC_NONE_RATE      0x05
278 #define GLOBAL_ATU_DATA_STATE_MC_STATIC         0x07
279 #define GLOBAL_ATU_DATA_STATE_MC_MGMT           0x0e
280 #define GLOBAL_ATU_DATA_STATE_MC_PRIO_OVER      0x0f
281 #define GLOBAL_ATU_MAC_01       0x0d
282 #define GLOBAL_ATU_MAC_23       0x0e
283 #define GLOBAL_ATU_MAC_45       0x0f
284 #define GLOBAL_IP_PRI_0         0x10
285 #define GLOBAL_IP_PRI_1         0x11
286 #define GLOBAL_IP_PRI_2         0x12
287 #define GLOBAL_IP_PRI_3         0x13
288 #define GLOBAL_IP_PRI_4         0x14
289 #define GLOBAL_IP_PRI_5         0x15
290 #define GLOBAL_IP_PRI_6         0x16
291 #define GLOBAL_IP_PRI_7         0x17
292 #define GLOBAL_IEEE_PRI         0x18
293 #define GLOBAL_CORE_TAG_TYPE    0x19
294 #define GLOBAL_MONITOR_CONTROL  0x1a
295 #define GLOBAL_MONITOR_CONTROL_INGRESS_SHIFT    12
296 #define GLOBAL_MONITOR_CONTROL_INGRESS_MASK     (0xf << 12)
297 #define GLOBAL_MONITOR_CONTROL_EGRESS_SHIFT     8
298 #define GLOBAL_MONITOR_CONTROL_EGRESS_MASK      (0xf << 8)
299 #define GLOBAL_MONITOR_CONTROL_ARP_SHIFT        4
300 #define GLOBAL_MONITOR_CONTROL_ARP_MASK         (0xf << 4)
301 #define GLOBAL_MONITOR_CONTROL_MIRROR_SHIFT     0
302 #define GLOBAL_MONITOR_CONTROL_ARP_DISABLED     (0xf0)
303 #define GLOBAL_MONITOR_CONTROL_UPDATE                   BIT(15)
304 #define GLOBAL_MONITOR_CONTROL_0180C280000000XLO        (0x00 << 8)
305 #define GLOBAL_MONITOR_CONTROL_0180C280000000XHI        (0x01 << 8)
306 #define GLOBAL_MONITOR_CONTROL_0180C280000002XLO        (0x02 << 8)
307 #define GLOBAL_MONITOR_CONTROL_0180C280000002XHI        (0x03 << 8)
308 #define GLOBAL_MONITOR_CONTROL_INGRESS                  (0x20 << 8)
309 #define GLOBAL_MONITOR_CONTROL_EGRESS                   (0x21 << 8)
310 #define GLOBAL_MONITOR_CONTROL_CPU_DEST                 (0x30 << 8)
311 #define GLOBAL_CONTROL_2        0x1c
312 #define GLOBAL_CONTROL_2_NO_CASCADE             0xe000
313 #define GLOBAL_CONTROL_2_MULTIPLE_CASCADE       0xf000
314 #define GLOBAL_CONTROL_2_HIST_RX               (0x1 << 6)
315 #define GLOBAL_CONTROL_2_HIST_TX               (0x2 << 6)
316 #define GLOBAL_CONTROL_2_HIST_RX_TX            (0x3 << 6)
317 #define GLOBAL_STATS_OP         0x1d
318 #define GLOBAL_STATS_OP_BUSY    BIT(15)
319 #define GLOBAL_STATS_OP_NOP             (0 << 12)
320 #define GLOBAL_STATS_OP_FLUSH_ALL       ((1 << 12) | GLOBAL_STATS_OP_BUSY)
321 #define GLOBAL_STATS_OP_FLUSH_PORT      ((2 << 12) | GLOBAL_STATS_OP_BUSY)
322 #define GLOBAL_STATS_OP_READ_CAPTURED   ((4 << 12) | GLOBAL_STATS_OP_BUSY)
323 #define GLOBAL_STATS_OP_CAPTURE_PORT    ((5 << 12) | GLOBAL_STATS_OP_BUSY)
324 #define GLOBAL_STATS_OP_HIST_RX         ((1 << 10) | GLOBAL_STATS_OP_BUSY)
325 #define GLOBAL_STATS_OP_HIST_TX         ((2 << 10) | GLOBAL_STATS_OP_BUSY)
326 #define GLOBAL_STATS_OP_HIST_RX_TX      ((3 << 10) | GLOBAL_STATS_OP_BUSY)
327 #define GLOBAL_STATS_OP_BANK_1_BIT_9    BIT(9)
328 #define GLOBAL_STATS_OP_BANK_1_BIT_10   BIT(10)
329 #define GLOBAL_STATS_COUNTER_32 0x1e
330 #define GLOBAL_STATS_COUNTER_01 0x1f
331
332 #define GLOBAL2_INT_SOURCE      0x00
333 #define GLOBAL2_INT_MASK        0x01
334 #define GLOBAL2_MGMT_EN_2X      0x02
335 #define GLOBAL2_MGMT_EN_0X      0x03
336 #define GLOBAL2_FLOW_CONTROL    0x04
337 #define GLOBAL2_SWITCH_MGMT     0x05
338 #define GLOBAL2_SWITCH_MGMT_USE_DOUBLE_TAG_DATA BIT(15)
339 #define GLOBAL2_SWITCH_MGMT_PREVENT_LOOPS       BIT(14)
340 #define GLOBAL2_SWITCH_MGMT_FLOW_CONTROL_MSG    BIT(13)
341 #define GLOBAL2_SWITCH_MGMT_FORCE_FLOW_CTRL_PRI BIT(7)
342 #define GLOBAL2_SWITCH_MGMT_RSVD2CPU            BIT(3)
343 #define GLOBAL2_DEVICE_MAPPING  0x06
344 #define GLOBAL2_DEVICE_MAPPING_UPDATE           BIT(15)
345 #define GLOBAL2_DEVICE_MAPPING_TARGET_SHIFT     8
346 #define GLOBAL2_DEVICE_MAPPING_PORT_MASK        0x0f
347 #define GLOBAL2_TRUNK_MASK      0x07
348 #define GLOBAL2_TRUNK_MASK_UPDATE               BIT(15)
349 #define GLOBAL2_TRUNK_MASK_NUM_SHIFT            12
350 #define GLOBAL2_TRUNK_MASK_HASK                 BIT(11)
351 #define GLOBAL2_TRUNK_MAPPING   0x08
352 #define GLOBAL2_TRUNK_MAPPING_UPDATE            BIT(15)
353 #define GLOBAL2_TRUNK_MAPPING_ID_SHIFT          11
354 #define GLOBAL2_IRL_CMD         0x09
355 #define GLOBAL2_IRL_CMD_BUSY    BIT(15)
356 #define GLOBAL2_IRL_CMD_OP_INIT_ALL     ((0x001 << 12) | GLOBAL2_IRL_CMD_BUSY)
357 #define GLOBAL2_IRL_CMD_OP_INIT_SEL     ((0x010 << 12) | GLOBAL2_IRL_CMD_BUSY)
358 #define GLOBAL2_IRL_CMD_OP_WRITE_SEL    ((0x011 << 12) | GLOBAL2_IRL_CMD_BUSY)
359 #define GLOBAL2_IRL_CMD_OP_READ_SEL     ((0x100 << 12) | GLOBAL2_IRL_CMD_BUSY)
360 #define GLOBAL2_IRL_DATA        0x0a
361 #define GLOBAL2_PVT_ADDR        0x0b
362 #define GLOBAL2_PVT_ADDR_BUSY   BIT(15)
363 #define GLOBAL2_PVT_ADDR_OP_INIT_ONES   ((0x01 << 12) | GLOBAL2_PVT_ADDR_BUSY)
364 #define GLOBAL2_PVT_ADDR_OP_WRITE_PVLAN ((0x03 << 12) | GLOBAL2_PVT_ADDR_BUSY)
365 #define GLOBAL2_PVT_ADDR_OP_READ        ((0x04 << 12) | GLOBAL2_PVT_ADDR_BUSY)
366 #define GLOBAL2_PVT_DATA        0x0c
367 #define GLOBAL2_SWITCH_MAC      0x0d
368 #define GLOBAL2_ATU_STATS       0x0e
369 #define GLOBAL2_PRIO_OVERRIDE   0x0f
370 #define GLOBAL2_PRIO_OVERRIDE_FORCE_SNOOP       BIT(7)
371 #define GLOBAL2_PRIO_OVERRIDE_SNOOP_SHIFT       4
372 #define GLOBAL2_PRIO_OVERRIDE_FORCE_ARP         BIT(3)
373 #define GLOBAL2_PRIO_OVERRIDE_ARP_SHIFT         0
374 #define GLOBAL2_EEPROM_CMD              0x14
375 #define GLOBAL2_EEPROM_CMD_BUSY         BIT(15)
376 #define GLOBAL2_EEPROM_CMD_OP_WRITE     ((0x3 << 12) | GLOBAL2_EEPROM_CMD_BUSY)
377 #define GLOBAL2_EEPROM_CMD_OP_READ      ((0x4 << 12) | GLOBAL2_EEPROM_CMD_BUSY)
378 #define GLOBAL2_EEPROM_CMD_OP_LOAD      ((0x6 << 12) | GLOBAL2_EEPROM_CMD_BUSY)
379 #define GLOBAL2_EEPROM_CMD_RUNNING      BIT(11)
380 #define GLOBAL2_EEPROM_CMD_WRITE_EN     BIT(10)
381 #define GLOBAL2_EEPROM_CMD_ADDR_MASK    0xff
382 #define GLOBAL2_EEPROM_DATA     0x15
383 #define GLOBAL2_PTP_AVB_OP      0x16
384 #define GLOBAL2_PTP_AVB_DATA    0x17
385 #define GLOBAL2_SMI_PHY_CMD                     0x18
386 #define GLOBAL2_SMI_PHY_CMD_BUSY                BIT(15)
387 #define GLOBAL2_SMI_PHY_CMD_MODE_22             BIT(12)
388 #define GLOBAL2_SMI_PHY_CMD_OP_22_WRITE_DATA    ((0x1 << 10) | \
389                                                  GLOBAL2_SMI_PHY_CMD_MODE_22 | \
390                                                  GLOBAL2_SMI_PHY_CMD_BUSY)
391 #define GLOBAL2_SMI_PHY_CMD_OP_22_READ_DATA     ((0x2 << 10) | \
392                                                  GLOBAL2_SMI_PHY_CMD_MODE_22 | \
393                                                  GLOBAL2_SMI_PHY_CMD_BUSY)
394 #define GLOBAL2_SMI_PHY_DATA                    0x19
395 #define GLOBAL2_SCRATCH_MISC    0x1a
396 #define GLOBAL2_SCRATCH_BUSY            BIT(15)
397 #define GLOBAL2_SCRATCH_REGISTER_SHIFT  8
398 #define GLOBAL2_SCRATCH_VALUE_MASK      0xff
399 #define GLOBAL2_WDOG_CONTROL    0x1b
400 #define GLOBAL2_QOS_WEIGHT      0x1c
401 #define GLOBAL2_MISC            0x1d
402
403 #define MV88E6XXX_N_FID         4096
404
405 enum mv88e6xxx_frame_mode {
406         MV88E6XXX_FRAME_MODE_NORMAL,
407         MV88E6XXX_FRAME_MODE_DSA,
408         MV88E6XXX_FRAME_MODE_PROVIDER,
409         MV88E6XXX_FRAME_MODE_ETHERTYPE,
410 };
411
412 /* List of supported models */
413 enum mv88e6xxx_model {
414         MV88E6085,
415         MV88E6095,
416         MV88E6097,
417         MV88E6123,
418         MV88E6131,
419         MV88E6161,
420         MV88E6165,
421         MV88E6171,
422         MV88E6172,
423         MV88E6175,
424         MV88E6176,
425         MV88E6185,
426         MV88E6190,
427         MV88E6190X,
428         MV88E6191,
429         MV88E6240,
430         MV88E6290,
431         MV88E6320,
432         MV88E6321,
433         MV88E6350,
434         MV88E6351,
435         MV88E6352,
436         MV88E6390,
437         MV88E6390X,
438 };
439
440 enum mv88e6xxx_family {
441         MV88E6XXX_FAMILY_NONE,
442         MV88E6XXX_FAMILY_6065,  /* 6031 6035 6061 6065 */
443         MV88E6XXX_FAMILY_6095,  /* 6092 6095 */
444         MV88E6XXX_FAMILY_6097,  /* 6046 6085 6096 6097 */
445         MV88E6XXX_FAMILY_6165,  /* 6123 6161 6165 */
446         MV88E6XXX_FAMILY_6185,  /* 6108 6121 6122 6131 6152 6155 6182 6185 */
447         MV88E6XXX_FAMILY_6320,  /* 6320 6321 */
448         MV88E6XXX_FAMILY_6351,  /* 6171 6175 6350 6351 */
449         MV88E6XXX_FAMILY_6352,  /* 6172 6176 6240 6352 */
450         MV88E6XXX_FAMILY_6390,  /* 6190 6190X 6191 6290 6390 6390X */
451 };
452
453 enum mv88e6xxx_cap {
454         /* Energy Efficient Ethernet.
455          */
456         MV88E6XXX_CAP_EEE,
457
458         /* Multi-chip Addressing Mode.
459          * Some chips respond to only 2 registers of its own SMI device address
460          * when it is non-zero, and use indirect access to internal registers.
461          */
462         MV88E6XXX_CAP_SMI_CMD,          /* (0x00) SMI Command */
463         MV88E6XXX_CAP_SMI_DATA,         /* (0x01) SMI Data */
464
465         /* PHY Registers.
466          */
467         MV88E6XXX_CAP_PHY_PAGE,         /* (0x16) Page Register */
468
469         /* Fiber/SERDES Registers (SMI address F).
470          */
471         MV88E6XXX_CAP_SERDES,
472
473         /* Switch Global (1) Registers.
474          */
475         MV88E6XXX_CAP_G1_ATU_FID,       /* (0x01) ATU FID Register */
476         MV88E6XXX_CAP_G1_VTU_FID,       /* (0x02) VTU FID Register */
477
478         /* Switch Global 2 Registers.
479          * The device contains a second set of global 16-bit registers.
480          */
481         MV88E6XXX_CAP_GLOBAL2,
482         MV88E6XXX_CAP_G2_INT,           /* (0x00) Interrupt Status */
483         MV88E6XXX_CAP_G2_MGMT_EN_2X,    /* (0x02) MGMT Enable Register 2x */
484         MV88E6XXX_CAP_G2_MGMT_EN_0X,    /* (0x03) MGMT Enable Register 0x */
485         MV88E6XXX_CAP_G2_IRL_CMD,       /* (0x09) Ingress Rate Command */
486         MV88E6XXX_CAP_G2_IRL_DATA,      /* (0x0a) Ingress Rate Data */
487         MV88E6XXX_CAP_G2_PVT_ADDR,      /* (0x0b) Cross Chip Port VLAN Addr */
488         MV88E6XXX_CAP_G2_PVT_DATA,      /* (0x0c) Cross Chip Port VLAN Data */
489         MV88E6XXX_CAP_G2_POT,           /* (0x0f) Priority Override Table */
490
491         /* PHY Polling Unit.
492          * See GLOBAL_CONTROL_PPU_ENABLE and GLOBAL_STATUS_PPU_POLLING.
493          */
494         MV88E6XXX_CAP_PPU,
495         MV88E6XXX_CAP_PPU_ACTIVE,
496
497         /* Per VLAN Spanning Tree Unit (STU).
498          * The Port State database, if present, is accessed through VTU
499          * operations and dedicated SID registers. See GLOBAL_VTU_SID.
500          */
501         MV88E6XXX_CAP_STU,
502
503         /* Internal temperature sensor.
504          * Available from any enabled port's PHY register 26, page 6.
505          */
506         MV88E6XXX_CAP_TEMP,
507         MV88E6XXX_CAP_TEMP_LIMIT,
508
509         /* VLAN Table Unit.
510          * The VTU is used to program 802.1Q VLANs. See GLOBAL_VTU_OP.
511          */
512         MV88E6XXX_CAP_VTU,
513 };
514
515 /* Bitmask of capabilities */
516 #define MV88E6XXX_FLAG_EEE              BIT_ULL(MV88E6XXX_CAP_EEE)
517
518 #define MV88E6XXX_FLAG_SMI_CMD          BIT_ULL(MV88E6XXX_CAP_SMI_CMD)
519 #define MV88E6XXX_FLAG_SMI_DATA         BIT_ULL(MV88E6XXX_CAP_SMI_DATA)
520
521 #define MV88E6XXX_FLAG_PHY_PAGE         BIT_ULL(MV88E6XXX_CAP_PHY_PAGE)
522
523 #define MV88E6XXX_FLAG_SERDES           BIT_ULL(MV88E6XXX_CAP_SERDES)
524
525 #define MV88E6XXX_FLAG_G1_ATU_FID       BIT_ULL(MV88E6XXX_CAP_G1_ATU_FID)
526 #define MV88E6XXX_FLAG_G1_VTU_FID       BIT_ULL(MV88E6XXX_CAP_G1_VTU_FID)
527
528 #define MV88E6XXX_FLAG_GLOBAL2          BIT_ULL(MV88E6XXX_CAP_GLOBAL2)
529 #define MV88E6XXX_FLAG_G2_INT           BIT_ULL(MV88E6XXX_CAP_G2_INT)
530 #define MV88E6XXX_FLAG_G2_MGMT_EN_2X    BIT_ULL(MV88E6XXX_CAP_G2_MGMT_EN_2X)
531 #define MV88E6XXX_FLAG_G2_MGMT_EN_0X    BIT_ULL(MV88E6XXX_CAP_G2_MGMT_EN_0X)
532 #define MV88E6XXX_FLAG_G2_IRL_CMD       BIT_ULL(MV88E6XXX_CAP_G2_IRL_CMD)
533 #define MV88E6XXX_FLAG_G2_IRL_DATA      BIT_ULL(MV88E6XXX_CAP_G2_IRL_DATA)
534 #define MV88E6XXX_FLAG_G2_PVT_ADDR      BIT_ULL(MV88E6XXX_CAP_G2_PVT_ADDR)
535 #define MV88E6XXX_FLAG_G2_PVT_DATA      BIT_ULL(MV88E6XXX_CAP_G2_PVT_DATA)
536 #define MV88E6XXX_FLAG_G2_POT           BIT_ULL(MV88E6XXX_CAP_G2_POT)
537
538 #define MV88E6XXX_FLAG_PPU              BIT_ULL(MV88E6XXX_CAP_PPU)
539 #define MV88E6XXX_FLAG_PPU_ACTIVE       BIT_ULL(MV88E6XXX_CAP_PPU_ACTIVE)
540 #define MV88E6XXX_FLAG_STU              BIT_ULL(MV88E6XXX_CAP_STU)
541 #define MV88E6XXX_FLAG_TEMP             BIT_ULL(MV88E6XXX_CAP_TEMP)
542 #define MV88E6XXX_FLAG_TEMP_LIMIT       BIT_ULL(MV88E6XXX_CAP_TEMP_LIMIT)
543 #define MV88E6XXX_FLAG_VTU              BIT_ULL(MV88E6XXX_CAP_VTU)
544
545 /* Ingress Rate Limit unit */
546 #define MV88E6XXX_FLAGS_IRL             \
547         (MV88E6XXX_FLAG_G2_IRL_CMD |    \
548          MV88E6XXX_FLAG_G2_IRL_DATA)
549
550 /* Multi-chip Addressing Mode */
551 #define MV88E6XXX_FLAGS_MULTI_CHIP      \
552         (MV88E6XXX_FLAG_SMI_CMD |       \
553          MV88E6XXX_FLAG_SMI_DATA)
554
555 /* Cross-chip Port VLAN Table */
556 #define MV88E6XXX_FLAGS_PVT             \
557         (MV88E6XXX_FLAG_G2_PVT_ADDR |   \
558          MV88E6XXX_FLAG_G2_PVT_DATA)
559
560 /* Fiber/SERDES Registers at SMI address F, page 1 */
561 #define MV88E6XXX_FLAGS_SERDES          \
562         (MV88E6XXX_FLAG_PHY_PAGE |      \
563          MV88E6XXX_FLAG_SERDES)
564
565 #define MV88E6XXX_FLAGS_FAMILY_6095     \
566         (MV88E6XXX_FLAG_GLOBAL2 |       \
567          MV88E6XXX_FLAG_G2_MGMT_EN_0X | \
568          MV88E6XXX_FLAG_PPU |           \
569          MV88E6XXX_FLAG_VTU |           \
570          MV88E6XXX_FLAGS_MULTI_CHIP)
571
572 #define MV88E6XXX_FLAGS_FAMILY_6097     \
573         (MV88E6XXX_FLAG_G1_ATU_FID |    \
574          MV88E6XXX_FLAG_G1_VTU_FID |    \
575          MV88E6XXX_FLAG_GLOBAL2 |       \
576          MV88E6XXX_FLAG_G2_MGMT_EN_2X | \
577          MV88E6XXX_FLAG_G2_MGMT_EN_0X | \
578          MV88E6XXX_FLAG_G2_POT |        \
579          MV88E6XXX_FLAG_PPU |           \
580          MV88E6XXX_FLAG_STU |           \
581          MV88E6XXX_FLAG_VTU |           \
582          MV88E6XXX_FLAGS_IRL |          \
583          MV88E6XXX_FLAGS_MULTI_CHIP |   \
584          MV88E6XXX_FLAGS_PVT)
585
586 #define MV88E6XXX_FLAGS_FAMILY_6165     \
587         (MV88E6XXX_FLAG_G1_ATU_FID |    \
588          MV88E6XXX_FLAG_G1_VTU_FID |    \
589          MV88E6XXX_FLAG_GLOBAL2 |       \
590          MV88E6XXX_FLAG_G2_INT |        \
591          MV88E6XXX_FLAG_G2_MGMT_EN_2X | \
592          MV88E6XXX_FLAG_G2_MGMT_EN_0X | \
593          MV88E6XXX_FLAG_G2_POT |        \
594          MV88E6XXX_FLAG_STU |           \
595          MV88E6XXX_FLAG_TEMP |          \
596          MV88E6XXX_FLAG_VTU |           \
597          MV88E6XXX_FLAGS_IRL |          \
598          MV88E6XXX_FLAGS_MULTI_CHIP |   \
599          MV88E6XXX_FLAGS_PVT)
600
601 #define MV88E6XXX_FLAGS_FAMILY_6185     \
602         (MV88E6XXX_FLAG_GLOBAL2 |       \
603          MV88E6XXX_FLAG_G2_INT |        \
604          MV88E6XXX_FLAG_G2_MGMT_EN_0X | \
605          MV88E6XXX_FLAGS_MULTI_CHIP |   \
606          MV88E6XXX_FLAG_PPU |           \
607          MV88E6XXX_FLAG_VTU)
608
609 #define MV88E6XXX_FLAGS_FAMILY_6320     \
610         (MV88E6XXX_FLAG_EEE |           \
611          MV88E6XXX_FLAG_GLOBAL2 |       \
612          MV88E6XXX_FLAG_G2_MGMT_EN_2X | \
613          MV88E6XXX_FLAG_G2_MGMT_EN_0X | \
614          MV88E6XXX_FLAG_G2_POT |        \
615          MV88E6XXX_FLAG_PPU_ACTIVE |    \
616          MV88E6XXX_FLAG_TEMP |          \
617          MV88E6XXX_FLAG_TEMP_LIMIT |    \
618          MV88E6XXX_FLAG_VTU |           \
619          MV88E6XXX_FLAGS_IRL |          \
620          MV88E6XXX_FLAGS_MULTI_CHIP |   \
621          MV88E6XXX_FLAGS_PVT)
622
623 #define MV88E6XXX_FLAGS_FAMILY_6351     \
624         (MV88E6XXX_FLAG_G1_ATU_FID |    \
625          MV88E6XXX_FLAG_G1_VTU_FID |    \
626          MV88E6XXX_FLAG_GLOBAL2 |       \
627          MV88E6XXX_FLAG_G2_INT |        \
628          MV88E6XXX_FLAG_G2_MGMT_EN_2X | \
629          MV88E6XXX_FLAG_G2_MGMT_EN_0X | \
630          MV88E6XXX_FLAG_G2_POT |        \
631          MV88E6XXX_FLAG_PPU_ACTIVE |    \
632          MV88E6XXX_FLAG_STU |           \
633          MV88E6XXX_FLAG_TEMP |          \
634          MV88E6XXX_FLAG_VTU |           \
635          MV88E6XXX_FLAGS_IRL |          \
636          MV88E6XXX_FLAGS_MULTI_CHIP |   \
637          MV88E6XXX_FLAGS_PVT)
638
639 #define MV88E6XXX_FLAGS_FAMILY_6352     \
640         (MV88E6XXX_FLAG_EEE |           \
641          MV88E6XXX_FLAG_G1_ATU_FID |    \
642          MV88E6XXX_FLAG_G1_VTU_FID |    \
643          MV88E6XXX_FLAG_GLOBAL2 |       \
644          MV88E6XXX_FLAG_G2_INT |        \
645          MV88E6XXX_FLAG_G2_MGMT_EN_2X | \
646          MV88E6XXX_FLAG_G2_MGMT_EN_0X | \
647          MV88E6XXX_FLAG_G2_POT |        \
648          MV88E6XXX_FLAG_PPU_ACTIVE |    \
649          MV88E6XXX_FLAG_STU |           \
650          MV88E6XXX_FLAG_TEMP |          \
651          MV88E6XXX_FLAG_TEMP_LIMIT |    \
652          MV88E6XXX_FLAG_VTU |           \
653          MV88E6XXX_FLAGS_IRL |          \
654          MV88E6XXX_FLAGS_MULTI_CHIP |   \
655          MV88E6XXX_FLAGS_PVT |          \
656          MV88E6XXX_FLAGS_SERDES)
657
658 struct mv88e6xxx_ops;
659
660 #define MV88E6XXX_FLAGS_FAMILY_6390     \
661         (MV88E6XXX_FLAG_EEE |           \
662          MV88E6XXX_FLAG_GLOBAL2 |       \
663          MV88E6XXX_FLAG_PPU_ACTIVE |    \
664          MV88E6XXX_FLAG_STU |           \
665          MV88E6XXX_FLAG_TEMP |          \
666          MV88E6XXX_FLAG_TEMP_LIMIT |    \
667          MV88E6XXX_FLAG_VTU |           \
668          MV88E6XXX_FLAGS_IRL |          \
669          MV88E6XXX_FLAGS_MULTI_CHIP |   \
670          MV88E6XXX_FLAGS_PVT)
671
672 struct mv88e6xxx_info {
673         enum mv88e6xxx_family family;
674         u16 prod_num;
675         const char *name;
676         unsigned int num_databases;
677         unsigned int num_ports;
678         unsigned int port_base_addr;
679         unsigned int global1_addr;
680         unsigned int age_time_coeff;
681         unsigned int g1_irqs;
682         enum dsa_tag_protocol tag_protocol;
683         unsigned long long flags;
684         const struct mv88e6xxx_ops *ops;
685 };
686
687 struct mv88e6xxx_atu_entry {
688         u16     fid;
689         u8      state;
690         bool    trunk;
691         u16     portv_trunkid;
692         u8      mac[ETH_ALEN];
693 };
694
695 struct mv88e6xxx_vtu_entry {
696         u16     vid;
697         u16     fid;
698         u8      sid;
699         bool    valid;
700         u8      data[DSA_MAX_PORTS];
701 };
702
703 struct mv88e6xxx_bus_ops;
704
705 struct mv88e6xxx_priv_port {
706         struct net_device *bridge_dev;
707 };
708
709 struct mv88e6xxx_irq {
710         u16 masked;
711         struct irq_chip chip;
712         struct irq_domain *domain;
713         unsigned int nirqs;
714 };
715
716 struct mv88e6xxx_chip {
717         const struct mv88e6xxx_info *info;
718
719         /* The dsa_switch this private structure is related to */
720         struct dsa_switch *ds;
721
722         /* The device this structure is associated to */
723         struct device *dev;
724
725         /* This mutex protects the access to the switch registers */
726         struct mutex reg_lock;
727
728         /* The MII bus and the address on the bus that is used to
729          * communication with the switch
730          */
731         const struct mv88e6xxx_bus_ops *smi_ops;
732         struct mii_bus *bus;
733         int sw_addr;
734
735         /* Handles automatic disabling and re-enabling of the PHY
736          * polling unit.
737          */
738         const struct mv88e6xxx_bus_ops *phy_ops;
739         struct mutex            ppu_mutex;
740         int                     ppu_disabled;
741         struct work_struct      ppu_work;
742         struct timer_list       ppu_timer;
743
744         /* This mutex serialises access to the statistics unit.
745          * Hold this mutex over snapshot + dump sequences.
746          */
747         struct mutex    stats_mutex;
748
749         struct mv88e6xxx_priv_port      ports[DSA_MAX_PORTS];
750
751         /* A switch may have a GPIO line tied to its reset pin. Parse
752          * this from the device tree, and use it before performing
753          * switch soft reset.
754          */
755         struct gpio_desc *reset;
756
757         /* set to size of eeprom if supported by the switch */
758         int             eeprom_len;
759
760         /* Device node for the MDIO bus */
761         struct device_node *mdio_np;
762
763         /* And the MDIO bus itself */
764         struct mii_bus *mdio_bus;
765
766         /* There can be two interrupt controllers, which are chained
767          * off a GPIO as interrupt source
768          */
769         struct mv88e6xxx_irq g1_irq;
770         struct mv88e6xxx_irq g2_irq;
771         int irq;
772         int device_irq;
773 };
774
775 struct mv88e6xxx_bus_ops {
776         int (*read)(struct mv88e6xxx_chip *chip, int addr, int reg, u16 *val);
777         int (*write)(struct mv88e6xxx_chip *chip, int addr, int reg, u16 val);
778 };
779
780 struct mv88e6xxx_ops {
781         int (*get_eeprom)(struct mv88e6xxx_chip *chip,
782                           struct ethtool_eeprom *eeprom, u8 *data);
783         int (*set_eeprom)(struct mv88e6xxx_chip *chip,
784                           struct ethtool_eeprom *eeprom, u8 *data);
785
786         int (*set_switch_mac)(struct mv88e6xxx_chip *chip, u8 *addr);
787
788         int (*phy_read)(struct mv88e6xxx_chip *chip, int addr, int reg,
789                         u16 *val);
790         int (*phy_write)(struct mv88e6xxx_chip *chip, int addr, int reg,
791                          u16 val);
792
793         /* RGMII Receive/Transmit Timing Control
794          * Add delay on PHY_INTERFACE_MODE_RGMII_*ID, no delay otherwise.
795          */
796         int (*port_set_rgmii_delay)(struct mv88e6xxx_chip *chip, int port,
797                                     phy_interface_t mode);
798
799 #define LINK_FORCED_DOWN        0
800 #define LINK_FORCED_UP          1
801 #define LINK_UNFORCED           -2
802
803         /* Port's MAC link state
804          * Use LINK_FORCED_UP or LINK_FORCED_DOWN to force link up or down,
805          * or LINK_UNFORCED for normal link detection.
806          */
807         int (*port_set_link)(struct mv88e6xxx_chip *chip, int port, int link);
808
809 #define DUPLEX_UNFORCED         -2
810
811         /* Port's MAC duplex mode
812          *
813          * Use DUPLEX_HALF or DUPLEX_FULL to force half or full duplex,
814          * or DUPLEX_UNFORCED for normal duplex detection.
815          */
816         int (*port_set_duplex)(struct mv88e6xxx_chip *chip, int port, int dup);
817
818 #define SPEED_MAX               INT_MAX
819 #define SPEED_UNFORCED          -2
820
821         /* Port's MAC speed (in Mbps)
822          *
823          * Depending on the chip, 10, 100, 200, 1000, 2500, 10000 are valid.
824          * Use SPEED_UNFORCED for normal detection, SPEED_MAX for max value.
825          */
826         int (*port_set_speed)(struct mv88e6xxx_chip *chip, int port, int speed);
827
828         int (*port_tag_remap)(struct mv88e6xxx_chip *chip, int port);
829
830         int (*port_set_frame_mode)(struct mv88e6xxx_chip *chip, int port,
831                                    enum mv88e6xxx_frame_mode mode);
832         int (*port_set_egress_unknowns)(struct mv88e6xxx_chip *chip, int port,
833                                         bool on);
834         int (*port_set_ether_type)(struct mv88e6xxx_chip *chip, int port,
835                                    u16 etype);
836         int (*port_jumbo_config)(struct mv88e6xxx_chip *chip, int port);
837
838         int (*port_egress_rate_limiting)(struct mv88e6xxx_chip *chip, int port);
839
840         /* Snapshot the statistics for a port. The statistics can then
841          * be read back a leisure but still with a consistent view.
842          */
843         int (*stats_snapshot)(struct mv88e6xxx_chip *chip, int port);
844
845         /* Set the histogram mode for statistics, when the control registers
846          * are separated out of the STATS_OP register.
847          */
848         int (*stats_set_histogram)(struct mv88e6xxx_chip *chip);
849
850         /* Return the number of strings describing statistics */
851         int (*stats_get_sset_count)(struct mv88e6xxx_chip *chip);
852         void (*stats_get_strings)(struct mv88e6xxx_chip *chip,  uint8_t *data);
853         void (*stats_get_stats)(struct mv88e6xxx_chip *chip,  int port,
854                                 uint64_t *data);
855         int (*g1_set_cpu_port)(struct mv88e6xxx_chip *chip, int port);
856         int (*g1_set_egress_port)(struct mv88e6xxx_chip *chip, int port);
857
858         /* Can be either in g1 or g2, so don't use a prefix */
859         int (*mgmt_rsvd2cpu)(struct mv88e6xxx_chip *chip);
860 };
861
862 #define STATS_TYPE_PORT         BIT(0)
863 #define STATS_TYPE_BANK0        BIT(1)
864 #define STATS_TYPE_BANK1        BIT(2)
865
866 struct mv88e6xxx_hw_stat {
867         char string[ETH_GSTRING_LEN];
868         int sizeof_stat;
869         int reg;
870         int type;
871 };
872
873 static inline bool mv88e6xxx_has(struct mv88e6xxx_chip *chip,
874                                  unsigned long flags)
875 {
876         return (chip->info->flags & flags) == flags;
877 }
878
879 static inline unsigned int mv88e6xxx_num_databases(struct mv88e6xxx_chip *chip)
880 {
881         return chip->info->num_databases;
882 }
883
884 static inline unsigned int mv88e6xxx_num_ports(struct mv88e6xxx_chip *chip)
885 {
886         return chip->info->num_ports;
887 }
888
889 int mv88e6xxx_read(struct mv88e6xxx_chip *chip, int addr, int reg, u16 *val);
890 int mv88e6xxx_write(struct mv88e6xxx_chip *chip, int addr, int reg, u16 val);
891 int mv88e6xxx_update(struct mv88e6xxx_chip *chip, int addr, int reg,
892                      u16 update);
893 int mv88e6xxx_wait(struct mv88e6xxx_chip *chip, int addr, int reg, u16 mask);
894
895 #endif