summaryrefslogtreecommitdiff
path: root/arch/m68k/include/asm/fec.h
blob: cdb8119d3ea986e5e4f7f97bbc281f99180ed8f2 (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
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * fec.h -- Fast Ethernet Controller definitions
 *
 * Some definitions copied from commproc.h for MPC8xx:
 * MPC8xx Communication Processor Module.
 * Copyright (c) 1997 Dan Malek (dmalek@jlc.net)
 *
 * Add FEC Structure and definitions
 * Copyright (C) 2004-2007 Freescale Semiconductor, Inc.
 * TsiChung Liew (Tsi-Chung.Liew@freescale.com)
 */

#ifndef	fec_h
#define	fec_h

#include <phy.h>

/* Buffer descriptors used FEC.
*/
typedef struct cpm_buf_desc {
	ushort cbd_sc;		/* Status and Control */
	ushort cbd_datlen;	/* Data length in buffer */
	uint cbd_bufaddr;	/* Buffer address in host memory */
} cbd_t;

#define BD_SC_EMPTY		((ushort)0x8000)	/* Receive is empty */
#define BD_SC_READY		((ushort)0x8000)	/* Transmit is ready */
#define BD_SC_WRAP		((ushort)0x2000)	/* Last buffer descriptor */
#define BD_SC_INTRPT		((ushort)0x1000)	/* Interrupt on change */
#define BD_SC_LAST		((ushort)0x0800)	/* Last buffer in frame */
#define BD_SC_TC		((ushort)0x0400)	/* Transmit CRC */
#define BD_SC_CM		((ushort)0x0200)	/* Continous mode */
#define BD_SC_ID		((ushort)0x0100)	/* Rec'd too many idles */
#define BD_SC_P			((ushort)0x0100)	/* xmt preamble */
#define BD_SC_BR		((ushort)0x0020)	/* Break received */
#define BD_SC_FR		((ushort)0x0010)	/* Framing error */
#define BD_SC_PR		((ushort)0x0008)	/* Parity error */
#define BD_SC_OV		((ushort)0x0002)	/* Overrun */
#define BD_SC_CD		((ushort)0x0001)	/* Carrier Detect lost */

/* Buffer descriptor control/status used by Ethernet receive.
*/
#define BD_ENET_RX_EMPTY	((ushort)0x8000)
#define BD_ENET_RX_RO1		((ushort)0x4000)
#define BD_ENET_RX_WRAP		((ushort)0x2000)
#define BD_ENET_RX_INTR		((ushort)0x1000)
#define BD_ENET_RX_RO2		BD_ENET_RX_INTR
#define BD_ENET_RX_LAST		((ushort)0x0800)
#define BD_ENET_RX_FIRST	((ushort)0x0400)
#define BD_ENET_RX_MISS		((ushort)0x0100)
#define BD_ENET_RX_BC		((ushort)0x0080)
#define BD_ENET_RX_MC		((ushort)0x0040)
#define BD_ENET_RX_LG		((ushort)0x0020)
#define BD_ENET_RX_NO		((ushort)0x0010)
#define BD_ENET_RX_SH		((ushort)0x0008)
#define BD_ENET_RX_CR		((ushort)0x0004)
#define BD_ENET_RX_OV		((ushort)0x0002)
#define BD_ENET_RX_CL		((ushort)0x0001)
#define BD_ENET_RX_TR		BD_ENET_RX_CL
#define BD_ENET_RX_STATS	((ushort)0x013f)	/* All status bits */

/* Buffer descriptor control/status used by Ethernet transmit.
*/
#define BD_ENET_TX_READY	((ushort)0x8000)
#define BD_ENET_TX_PAD		((ushort)0x4000)
#define BD_ENET_TX_TO1		BD_ENET_TX_PAD
#define BD_ENET_TX_WRAP		((ushort)0x2000)
#define BD_ENET_TX_INTR		((ushort)0x1000)
#define BD_ENET_TX_TO2		BD_ENET_TX_INTR_
#define BD_ENET_TX_LAST		((ushort)0x0800)
#define BD_ENET_TX_TC		((ushort)0x0400)
#define BD_ENET_TX_DEF		((ushort)0x0200)
#define BD_ENET_TX_ABC		BD_ENET_TX_DEF
#define BD_ENET_TX_HB		((ushort)0x0100)
#define BD_ENET_TX_LC		((ushort)0x0080)
#define BD_ENET_TX_RL		((ushort)0x0040)
#define BD_ENET_TX_RCMASK	((ushort)0x003c)
#define BD_ENET_TX_UN		((ushort)0x0002)
#define BD_ENET_TX_CSL		((ushort)0x0001)
#define BD_ENET_TX_STATS	((ushort)0x03ff)	/* All status bits */

/*********************************************************************
* Fast Ethernet Controller (FEC)
*********************************************************************/
/* FEC private information */
struct fec_info_s {
	int index;
	u32 iobase;
	u32 pinmux;
	u32 miibase;
	int phy_addr;
	int dup_spd;
	char *phy_name;
	int phyname_init;
	cbd_t *rxbd;		/* Rx BD */
	cbd_t *txbd;		/* Tx BD */
	uint rx_idx;
	uint tx_idx;
	char *txbuf;
	int initialized;
	int to_loop;
	struct mii_dev *bus;
};

#ifdef CONFIG_MCFFEC
/* Register read/write struct */
typedef struct fec {
#ifdef CONFIG_M5272
	u32 ecr;		/* 0x00 */
	u32 eir;		/* 0x04 */
	u32 eimr;		/* 0x08 */
	u32 ivsr;		/* 0x0C */
	u32 rdar;		/* 0x10 */
	u32 tdar;		/* 0x14 */
	u8 resv1[0x28];		/* 0x18 */
	u32 mmfr;		/* 0x40 */
	u32 mscr;		/* 0x44 */
	u8 resv2[0x44];		/* 0x48 */
	u32 frbr;		/* 0x8C */
	u32 frsr;		/* 0x90 */
	u8 resv3[0x10];		/* 0x94 */
	u32 tfwr;		/* 0xA4 */
	u32 res4;		/* 0xA8 */
	u32 tfsr;		/* 0xAC */
	u8 resv4[0x50];		/* 0xB0 */
	u32 opd;		/* 0x100 - dummy  */
	u32 rcr;		/* 0x104 */
	u32 mibc;		/* 0x108 */
	u8 resv5[0x38];		/* 0x10C */
	u32 tcr;		/* 0x144 */
	u8 resv6[0x270];	/* 0x148 */
	u32 iaur;		/* 0x3B8 - dummy */
	u32 ialr;		/* 0x3BC - dummy  */
	u32 palr;		/* 0x3C0 */
	u32 paur;		/* 0x3C4 */
	u32 gaur;		/* 0x3C8 */
	u32 galr;		/* 0x3CC */
	u32 erdsr;		/* 0x3D0 */
	u32 etdsr;		/* 0x3D4 */
	u32 emrbr;		/* 0x3D8 */
	u8 resv12[0x74];	/* 0x18C */
#else
	u8 resv0[0x4];
	u32 eir;
	u32 eimr;
	u8 resv1[0x4];
	u32 rdar;
	u32 tdar;
	u8 resv2[0xC];
	u32 ecr;
	u8 resv3[0x18];
	u32 mmfr;
	u32 mscr;
	u8 resv4[0x1C];
	u32 mibc;
	u8 resv5[0x1C];
	u32 rcr;
	u8 resv6[0x3C];
	u32 tcr;
	u8 resv7[0x1C];
	u32 palr;
	u32 paur;
	u32 opd;
	u8 resv8[0x28];
	u32 iaur;
	u32 ialr;
	u32 gaur;
	u32 galr;
	u8 resv9[0x1C];
	u32 tfwr;
	u8 resv10[0x4];
	u32 frbr;
	u32 frsr;
	u8 resv11[0x2C];
	u32 erdsr;
	u32 etdsr;
	u32 emrbr;
	u8 resv12[0x74];
#endif

	u32 rmon_t_drop;
	u32 rmon_t_packets;
	u32 rmon_t_bc_pkt;
	u32 rmon_t_mc_pkt;
	u32 rmon_t_crc_align;
	u32 rmon_t_undersize;
	u32 rmon_t_oversize;
	u32 rmon_t_frag;
	u32 rmon_t_jab;
	u32 rmon_t_col;
	u32 rmon_t_p64;
	u32 rmon_t_p65to127;
	u32 rmon_t_p128to255;
	u32 rmon_t_p256to511;
	u32 rmon_t_p512to1023;
	u32 rmon_t_p1024to2047;
	u32 rmon_t_p_gte2048;
	u32 rmon_t_octets;

	u32 ieee_t_drop;
	u32 ieee_t_frame_ok;
	u32 ieee_t_1col;
	u32 ieee_t_mcol;
	u32 ieee_t_def;
	u32 ieee_t_lcol;
	u32 ieee_t_excol;
	u32 ieee_t_macerr;
	u32 ieee_t_cserr;
	u32 ieee_t_sqe;
	u32 ieee_t_fdxfc;
	u32 ieee_t_octets_ok;
	u8 resv13[0x8];

	u32 rmon_r_drop;
	u32 rmon_r_packets;
	u32 rmon_r_bc_pkt;
	u32 rmon_r_mc_pkt;
	u32 rmon_r_crc_align;
	u32 rmon_r_undersize;
	u32 rmon_r_oversize;
	u32 rmon_r_frag;
	u32 rmon_r_jab;
	u32 rmon_r_resvd_0;
	u32 rmon_r_p64;
	u32 rmon_r_p65to127;
	u32 rmon_r_p128to255;
	u32 rmon_r_p256to511;
	u32 rmon_r_p512to1023;
	u32 rmon_r_p1024to2047;
	u32 rmon_r_p_gte2048;
	u32 rmon_r_octets;

	u32 ieee_r_drop;
	u32 ieee_r_frame_ok;
	u32 ieee_r_crc;
	u32 ieee_r_align;
	u32 ieee_r_macerr;
	u32 ieee_r_fdxfc;
	u32 ieee_r_octets_ok;
} fec_t;
#endif				/* CONFIG_MCFFEC */

/*********************************************************************
* Fast Ethernet Controller (FEC)
*********************************************************************/
/* Bit definitions and macros for FEC_EIR */
#define FEC_EIR_CLEAR_ALL		(0xFFF80000)
#define FEC_EIR_HBERR			(0x80000000)
#define FEC_EIR_BABR			(0x40000000)
#define FEC_EIR_BABT			(0x20000000)
#define FEC_EIR_GRA			(0x10000000)
#define FEC_EIR_TXF			(0x08000000)
#define FEC_EIR_TXB			(0x04000000)
#define FEC_EIR_RXF			(0x02000000)
#define FEC_EIR_RXB			(0x01000000)
#define FEC_EIR_MII			(0x00800000)
#define FEC_EIR_EBERR			(0x00400000)
#define FEC_EIR_LC			(0x00200000)
#define FEC_EIR_RL			(0x00100000)
#define FEC_EIR_UN			(0x00080000)

/* Bit definitions and macros for FEC_RDAR */
#define FEC_RDAR_R_DES_ACTIVE		(0x01000000)

/* Bit definitions and macros for FEC_TDAR */
#define FEC_TDAR_X_DES_ACTIVE		(0x01000000)

/* Bit definitions and macros for FEC_ECR */
#define FEC_ECR_ETHER_EN		(0x00000002)
#define FEC_ECR_RESET			(0x00000001)

/* Bit definitions and macros for FEC_MMFR */
#define FEC_MMFR_DATA(x)		(((x)&0xFFFF))
#define FEC_MMFR_ST(x)			(((x)&0x03)<<30)
#define FEC_MMFR_ST_01			(0x40000000)
#define FEC_MMFR_OP_RD			(0x20000000)
#define FEC_MMFR_OP_WR			(0x10000000)
#define FEC_MMFR_PA(x)			(((x)&0x1F)<<23)
#define FEC_MMFR_RA(x)			(((x)&0x1F)<<18)
#define FEC_MMFR_TA(x)			(((x)&0x03)<<16)
#define FEC_MMFR_TA_10			(0x00020000)

/* Bit definitions and macros for FEC_MSCR */
#define FEC_MSCR_DIS_PREAMBLE		(0x00000080)
#define FEC_MSCR_MII_SPEED(x)		(((x)&0x3F)<<1)

/* Bit definitions and macros for FEC_MIBC */
#define FEC_MIBC_MIB_DISABLE		(0x80000000)
#define FEC_MIBC_MIB_IDLE		(0x40000000)

/* Bit definitions and macros for FEC_RCR */
#define FEC_RCR_MAX_FL(x)		(((x)&0x7FF)<<16)
#define FEC_RCR_FCE			(0x00000020)
#define FEC_RCR_BC_REJ			(0x00000010)
#define FEC_RCR_PROM			(0x00000008)
#define FEC_RCR_MII_MODE		(0x00000004)
#define FEC_RCR_DRT			(0x00000002)
#define FEC_RCR_LOOP			(0x00000001)

/* Bit definitions and macros for FEC_TCR */
#define FEC_TCR_RFC_PAUSE		(0x00000010)
#define FEC_TCR_TFC_PAUSE		(0x00000008)
#define FEC_TCR_FDEN			(0x00000004)
#define FEC_TCR_HBC			(0x00000002)
#define FEC_TCR_GTS			(0x00000001)

/* Bit definitions and macros for FEC_PAUR */
#define FEC_PAUR_PADDR2(x)		(((x)&0xFFFF)<<16)
#define FEC_PAUR_TYPE(x)		((x)&0xFFFF)

/* Bit definitions and macros for FEC_OPD */
#define FEC_OPD_PAUSE_DUR(x)		(((x)&0x0000FFFF)<<0)
#define FEC_OPD_OPCODE(x)		(((x)&0x0000FFFF)<<16)

/* Bit definitions and macros for FEC_TFWR */
#define FEC_TFWR_X_WMRK(x)		((x)&0x03)
#define FEC_TFWR_X_WMRK_64		(0x01)
#define FEC_TFWR_X_WMRK_128		(0x02)
#define FEC_TFWR_X_WMRK_192		(0x03)

/* Bit definitions and macros for FEC_FRBR */
#define FEC_FRBR_R_BOUND(x)		(((x)&0xFF)<<2)

/* Bit definitions and macros for FEC_FRSR */
#define FEC_FRSR_R_FSTART(x)		(((x)&0xFF)<<2)

/* Bit definitions and macros for FEC_ERDSR */
#define FEC_ERDSR_R_DES_START(x)	(((x)&0x3FFFFFFF)<<2)

/* Bit definitions and macros for FEC_ETDSR */
#define FEC_ETDSR_X_DES_START(x)	(((x)&0x3FFFFFFF)<<2)

/* Bit definitions and macros for FEC_EMRBR */
#define FEC_EMRBR_R_BUF_SIZE(x)		(((x)&0x7F)<<4)

#define	FEC_RESET_DELAY			100
#define FEC_RX_TOUT			100

#ifdef CONFIG_MCF547x_8x
typedef struct fec_info_dma fec_info_t;
#define FEC_T fecdma_t
#else
typedef struct fec_info_s fec_info_t;
#define FEC_T fec_t
#endif

int fecpin_setclear(fec_info_t *info, int setclear);
int mii_discover_phy(fec_info_t *info);
int fec_get_base_addr(int fec_idx, u32 *fec_iobase);
int fec_get_mii_base(int fec_idx, u32 *mii_base);

#ifdef CONFIG_SYS_DISCOVER_PHY
void __mii_init(void);
uint mii_send(uint mii_cmd);
int mcffec_miiphy_read(struct mii_dev *bus, int addr, int devad, int reg);
int mcffec_miiphy_write(struct mii_dev *bus, int addr, int devad, int reg,
			u16 value);
#endif

#endif				/* fec_h */