aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/ipq40xx/files/drivers/net/phy/ar40xx.h
blob: 7ba40ccf753fe833e6a01b32cfe1407a317d92ee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
/*
 * Copyright (c) 2016, The Linux Foundation. All rights reserved.
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
 * above copyright notice and this permission notice appear in all copies.
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

 #ifndef __AR40XX_H
#define __AR40XX_H

#define AR40XX_MAX_VLANS	128
#define AR40XX_NUM_PORTS	6
#define AR40XX_NUM_PHYS	5

#define BITS(_s, _n)	(((1UL << (_n)) - 1) << _s)

struct ar40xx_priv {
	struct switch_dev dev;

	u8  __iomem      *hw_addr;
	u8  __iomem      *psgmii_hw_addr;
	u32 mac_mode;
	struct reset_control *ess_rst;
	u32 cpu_bmp;
	u32 lan_bmp;
	u32 wan_bmp;

	struct mii_bus *mii_bus;
	struct phy_device *phy;

	/* mutex for qm task */
	struct mutex qm_lock;
	struct delayed_work qm_dwork;
	u32 port_link_up[AR40XX_NUM_PORTS];
	u32 ar40xx_port_old_link[AR40XX_NUM_PORTS];
	u32 ar40xx_port_qm_buf[AR40XX_NUM_PORTS];

	u32 phy_t_status;

	/* mutex for switch reg access */
	struct mutex reg_mutex;

	/* mutex for mib task */
	struct mutex mib_lock;
	struct delayed_work mib_work;
	int mib_next_port;
	u64 *mib_stats;

	char buf[2048];

	/* all fields below will be cleared on reset */
	bool vlan;
	u16 vlan_id[AR40XX_MAX_VLANS];
	u8 vlan_table[AR40XX_MAX_VLANS];
	u8 vlan_tagged;
	u16 pvid[AR40XX_NUM_PORTS];

	/* mirror */
	bool mirror_rx;
	bool mirror_tx;
	int source_port;
	int monitor_port;
};

#define AR40XX_PORT_LINK_UP 1
#define AR40XX_PORT_LINK_DOWN 0
#define AR40XX_QM_NOT_EMPTY  1
#define AR40XX_QM_EMPTY  0

#define AR40XX_LAN_VLAN	1
#define AR40XX_WAN_VLAN	2

enum ar40xx_port_wrapper_cfg {
	PORT_WRAPPER_PSGMII = 0,
};

struct ar40xx_mib_desc {
	u32 size;
	u32 offset;
	const char *name;
};

#define AR40XX_PORT_CPU	0

#define AR40XX_PSGMII_MODE_CONTROL	0x1b4
#define   AR40XX_PSGMII_ATHR_CSCO_MODE_25M	BIT(0)

#define AR40XX_PSGMIIPHY_TX_CONTROL	 0x288

#define AR40XX_MII_ATH_MMD_ADDR		0x0d
#define AR40XX_MII_ATH_MMD_DATA		0x0e
#define AR40XX_MII_ATH_DBG_ADDR		0x1d
#define AR40XX_MII_ATH_DBG_DATA		0x1e

#define AR40XX_STATS_RXBROAD		0x00
#define AR40XX_STATS_RXPAUSE		0x04
#define AR40XX_STATS_RXMULTI		0x08
#define AR40XX_STATS_RXFCSERR		0x0c
#define AR40XX_STATS_RXALIGNERR		0x10
#define AR40XX_STATS_RXRUNT		0x14
#define AR40XX_STATS_RXFRAGMENT		0x18
#define AR40XX_STATS_RX64BYTE		0x1c
#define AR40XX_STATS_RX128BYTE		0x20
#define AR40XX_STATS_RX256BYTE		0x24
#define AR40XX_STATS_RX512BYTE		0x28
#define AR40XX_STATS_RX1024BYTE		0x2c
#define AR40XX_STATS_RX1518BYTE		0x30
#define AR40XX_STATS_RXMAXBYTE		0x34
#define AR40XX_STATS_RXTOOLONG		0x38
#define AR40XX_STATS_RXGOODBYTE		0x3c
#define AR40XX_STATS_RXBADBYTE		0x44
#define AR40XX_STATS_RXOVERFLOW		0x4c
#define AR40XX_STATS_FILTERED		0x50
#define AR40XX_STATS_TXBROAD		0x54
#define AR40XX_STATS_TXPAUSE		0x58
#define AR40XX_STATS_TXMULTI		0x5c
#define AR40XX_STATS_TXUNDERRUN		0x60
#define AR40XX_STATS_TX64BYTE		0x64
#define AR40XX_STATS_TX128BYTE		0x68
#define AR40XX_STATS_TX256BYTE		0x6c
#define AR40XX_STATS_TX512BYTE		0x70
#define AR40XX_STATS_TX1024BYTE		0x74
#define AR40XX_STATS_TX1518BYTE		0x78
#define AR40XX_STATS_TXMAXBYTE		0x7c
#define AR40XX_STATS_TXOVERSIZE		0x80
#define AR40XX_STATS_TXBYTE		0x84
#define AR40XX_STATS_TXCOLLISION	0x8c
#define AR40XX_STATS_TXABORTCOL		0x90
#define AR40XX_STATS_TXMULTICOL		0x94
#define AR40XX_STATS_TXSINGLECOL	0x98
#define AR40XX_STATS_TXEXCDEFER		0x9c
#define AR40XX_STATS_TXDEFER		0xa0
#define AR40XX_STATS_TXLATECOL		0xa4

#define AR40XX_REG_MODULE_EN			0x030
#define   AR40XX_MODULE_EN_MIB			BIT(0)

#define AR40XX_REG_MIB_FUNC			0x034
#define   AR40XX_MIB_BUSY		BIT(17)
#define   AR40XX_MIB_CPU_KEEP			BIT(20)
#define   AR40XX_MIB_FUNC		BITS(24, 3)
#define   AR40XX_MIB_FUNC_S		24
#define   AR40XX_MIB_FUNC_NO_OP		0x0
#define   AR40XX_MIB_FUNC_FLUSH		0x1

#define AR40XX_ESS_SERVICE_TAG		0x48
#define AR40XX_ESS_SERVICE_TAG_STAG	BIT(17)

#define AR40XX_REG_PORT_STATUS(_i)		(0x07c + (_i) * 4)
#define   AR40XX_PORT_SPEED			BITS(0, 2)
#define   AR40XX_PORT_STATUS_SPEED_S	0
#define   AR40XX_PORT_TX_EN			BIT(2)
#define   AR40XX_PORT_RX_EN			BIT(3)
#define   AR40XX_PORT_STATUS_TXFLOW	BIT(4)
#define   AR40XX_PORT_STATUS_RXFLOW	BIT(5)
#define   AR40XX_PORT_DUPLEX			BIT(6)
#define   AR40XX_PORT_TXHALF_FLOW		BIT(7)
#define   AR40XX_PORT_STATUS_LINK_UP	BIT(8)
#define   AR40XX_PORT_AUTO_LINK_EN		BIT(9)
#define   AR40XX_PORT_STATUS_FLOW_CONTROL  BIT(12)

#define AR40XX_REG_MAX_FRAME_SIZE		0x078
#define   AR40XX_MAX_FRAME_SIZE_MTU		BITS(0, 14)

#define AR40XX_REG_PORT_HEADER(_i)		(0x09c + (_i) * 4)

#define AR40XX_REG_EEE_CTRL			0x100
#define   AR40XX_EEE_CTRL_DISABLE_PHY(_i)	BIT(4 + (_i) * 2)

#define AR40XX_REG_PORT_VLAN0(_i)		(0x420 + (_i) * 0x8)
#define   AR40XX_PORT_VLAN0_DEF_SVID		BITS(0, 12)
#define   AR40XX_PORT_VLAN0_DEF_SVID_S		0
#define   AR40XX_PORT_VLAN0_DEF_CVID		BITS(16, 12)
#define   AR40XX_PORT_VLAN0_DEF_CVID_S		16

#define AR40XX_REG_PORT_VLAN1(_i)		(0x424 + (_i) * 0x8)
#define   AR40XX_PORT_VLAN1_CORE_PORT		BIT(9)
#define   AR40XX_PORT_VLAN1_PORT_TLS_MODE	BIT(7)
#define   AR40XX_PORT_VLAN1_PORT_VLAN_PROP	BIT(6)
#define   AR40XX_PORT_VLAN1_OUT_MODE		BITS(12, 2)
#define   AR40XX_PORT_VLAN1_OUT_MODE_S		12
#define   AR40XX_PORT_VLAN1_OUT_MODE_UNMOD	0
#define   AR40XX_PORT_VLAN1_OUT_MODE_UNTAG	1
#define   AR40XX_PORT_VLAN1_OUT_MODE_TAG		2
#define   AR40XX_PORT_VLAN1_OUT_MODE_UNTOUCH	3

#define AR40XX_REG_VTU_FUNC0			0x0610
#define   AR40XX_VTU_FUNC0_EG_MODE		BITS(4, 14)
#define   AR40XX_VTU_FUNC0_EG_MODE_S(_i)	(4 + (_i) * 2)
#define   AR40XX_VTU_FUNC0_EG_MODE_KEEP		0
#define   AR40XX_VTU_FUNC0_EG_MODE_UNTAG	1
#define   AR40XX_VTU_FUNC0_EG_MODE_TAG		2
#define   AR40XX_VTU_FUNC0_EG_MODE_NOT		3
#define   AR40XX_VTU_FUNC0_IVL			BIT(19)
#define   AR40XX_VTU_FUNC0_VALID		BIT(20)

#define AR40XX_REG_VTU_FUNC1			0x0614
#define   AR40XX_VTU_FUNC1_OP			BITS(0, 3)
#define   AR40XX_VTU_FUNC1_OP_NOOP		0
#define   AR40XX_VTU_FUNC1_OP_FLUSH		1
#define   AR40XX_VTU_FUNC1_OP_LOAD		2
#define   AR40XX_VTU_FUNC1_OP_PURGE		3
#define   AR40XX_VTU_FUNC1_OP_REMOVE_PORT	4
#define   AR40XX_VTU_FUNC1_OP_GET_NEXT		5
#define   AR40XX7_VTU_FUNC1_OP_GET_ONE		6
#define   AR40XX_VTU_FUNC1_FULL			BIT(4)
#define   AR40XX_VTU_FUNC1_PORT			BIT(8, 4)
#define   AR40XX_VTU_FUNC1_PORT_S		8
#define   AR40XX_VTU_FUNC1_VID			BIT(16, 12)
#define   AR40XX_VTU_FUNC1_VID_S		16
#define   AR40XX_VTU_FUNC1_BUSY			BIT(31)

#define AR40XX_REG_FWD_CTRL0			0x620
#define   AR40XX_FWD_CTRL0_CPU_PORT_EN		BIT(10)
#define   AR40XX_FWD_CTRL0_MIRROR_PORT		BITS(4, 4)
#define   AR40XX_FWD_CTRL0_MIRROR_PORT_S	4

#define AR40XX_REG_FWD_CTRL1			0x624
#define   AR40XX_FWD_CTRL1_UC_FLOOD		BITS(0, 7)
#define   AR40XX_FWD_CTRL1_UC_FLOOD_S		0
#define   AR40XX_FWD_CTRL1_MC_FLOOD		BITS(8, 7)
#define   AR40XX_FWD_CTRL1_MC_FLOOD_S		8
#define   AR40XX_FWD_CTRL1_BC_FLOOD		BITS(16, 7)
#define   AR40XX_FWD_CTRL1_BC_FLOOD_S		16
#define   AR40XX_FWD_CTRL1_IGMP			BITS(24, 7)
#define   AR40XX_FWD_CTRL1_IGMP_S		24

#define AR40XX_REG_PORT_LOOKUP(_i)		(0x660 + (_i) * 0xc)
#define   AR40XX_PORT_LOOKUP_MEMBER		BITS(0, 7)
#define   AR40XX_PORT_LOOKUP_IN_MODE		BITS(8, 2)
#define   AR40XX_PORT_LOOKUP_IN_MODE_S		8
#define   AR40XX_PORT_LOOKUP_STATE		BITS(16, 3)
#define   AR40XX_PORT_LOOKUP_STATE_S		16
#define   AR40XX_PORT_LOOKUP_LEARN		BIT(20)
#define   AR40XX_PORT_LOOKUP_LOOPBACK		BIT(21)
#define   AR40XX_PORT_LOOKUP_ING_MIRROR_EN	BIT(25)

#define AR40XX_REG_ATU_FUNC			0x60c
#define   AR40XX_ATU_FUNC_OP			BITS(0, 4)
#define   AR40XX_ATU_FUNC_OP_NOOP		0x0
#define   AR40XX_ATU_FUNC_OP_FLUSH		0x1
#define   AR40XX_ATU_FUNC_OP_LOAD		0x2
#define   AR40XX_ATU_FUNC_OP_PURGE		0x3
#define   AR40XX_ATU_FUNC_OP_FLUSH_LOCKED	0x4
#define   AR40XX_ATU_FUNC_OP_FLUSH_UNICAST	0x5
#define   AR40XX_ATU_FUNC_OP_GET_NEXT		0x6
#define   AR40XX_ATU_FUNC_OP_SEARCH_MAC		0x7
#define   AR40XX_ATU_FUNC_OP_CHANGE_TRUNK	0x8
#define   AR40XX_ATU_FUNC_BUSY			BIT(31)

#define AR40XX_REG_QM_DEBUG_ADDR		0x820
#define AR40XX_REG_QM_DEBUG_VALUE		0x824
#define   AR40XX_REG_QM_PORT0_3_QNUM		0x1d
#define   AR40XX_REG_QM_PORT4_6_QNUM		0x1e

#define AR40XX_REG_PORT_HOL_CTRL1(_i)		(0x974 + (_i) * 0x8)
#define   AR40XX_PORT_HOL_CTRL1_EG_MIRROR_EN	BIT(16)

#define AR40XX_REG_PORT_FLOWCTRL_THRESH(_i)	(0x9b0 + (_i) * 0x4)
#define   AR40XX_PORT0_FC_THRESH_ON_DFLT	0x60
#define   AR40XX_PORT0_FC_THRESH_OFF_DFLT	0x90

#define AR40XX_PHY_DEBUG_0   0
#define AR40XX_PHY_MANU_CTRL_EN  BIT(12)

#define AR40XX_PHY_DEBUG_2   2

#define AR40XX_PHY_SPEC_STATUS 0x11
#define   AR40XX_PHY_SPEC_STATUS_LINK		BIT(10)
#define   AR40XX_PHY_SPEC_STATUS_DUPLEX		BIT(13)
#define   AR40XX_PHY_SPEC_STATUS_SPEED		BITS(14, 2)

/* port forwarding state */
enum {
	AR40XX_PORT_STATE_DISABLED = 0,
	AR40XX_PORT_STATE_BLOCK = 1,
	AR40XX_PORT_STATE_LISTEN = 2,
	AR40XX_PORT_STATE_LEARN = 3,
	AR40XX_PORT_STATE_FORWARD = 4
};

/* ingress 802.1q mode */
enum {
	AR40XX_IN_PORT_ONLY = 0,
	AR40XX_IN_PORT_FALLBACK = 1,
	AR40XX_IN_VLAN_ONLY = 2,
	AR40XX_IN_SECURE = 3
};

/* egress 802.1q mode */
enum {
	AR40XX_OUT_KEEP = 0,
	AR40XX_OUT_STRIP_VLAN = 1,
	AR40XX_OUT_ADD_VLAN = 2
};

/* port speed */
enum {
	AR40XX_PORT_SPEED_10M = 0,
	AR40XX_PORT_SPEED_100M = 1,
	AR40XX_PORT_SPEED_1000M = 2,
	AR40XX_PORT_SPEED_ERR = 3,
};

#define AR40XX_MIB_WORK_DELAY	2000 /* msecs */

#define AR40XX_QM_WORK_DELAY    100

#define   AR40XX_MIB_FUNC_CAPTURE	0x3

#define AR40XX_REG_PORT_STATS_START	0x1000
#define AR40XX_REG_PORT_STATS_LEN		0x100

#define AR40XX_PORTS_ALL	0x3f

#define AR40XX_PSGMII_ID	5
#define AR40XX_PSGMII_CALB_NUM	100
#define AR40XX_MALIBU_PSGMII_MODE_CTRL	0x6d
#define AR40XX_MALIBU_PHY_PSGMII_MODE_CTRL_ADJUST_VAL	0x220c
#define AR40XX_MALIBU_PHY_MMD7_DAC_CTRL	0x801a
#define AR40XX_MALIBU_DAC_CTRL_MASK	0x380
#define AR40XX_MALIBU_DAC_CTRL_VALUE	0x280
#define AR40XX_MALIBU_PHY_RLP_CTRL       0x805a
#define AR40XX_PSGMII_TX_DRIVER_1_CTRL	0xb
#define AR40XX_MALIBU_PHY_PSGMII_REDUCE_SERDES_TX_AMP	0x8a
#define AR40XX_MALIBU_PHY_LAST_ADDR	4

static inline struct ar40xx_priv *
swdev_to_ar40xx(struct switch_dev *swdev)
{
	return container_of(swdev, struct ar40xx_priv, dev);
}

#endif