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