1 /****************************************************************************/
2 
3 /*
4  *	mcfne.h -- NE2000 in ColdFire eval boards.
5  *
6  *	(C) Copyright 1999-2000, Greg Ungerer (gerg@snapgear.com)
7  *	(C) Copyright 2000,      Lineo (www.lineo.com)
8  *	(C) Copyright 2001,      SnapGear (www.snapgear.com)
9  *
10  *      19990409 David W. Miller  Converted from m5206ne.h for 5307 eval board
11  *
12  *      Hacked support for m5206e Cadre III evaluation board
13  *      Fred Stevens (fred.stevens@pemstar.com) 13 April 1999
14  */
15 
16 /****************************************************************************/
17 #ifndef	mcfne_h
18 #define	mcfne_h
19 /****************************************************************************/
20 
21 
22 /*
23  *	Support for NE2000 clones devices in ColdFire based boards.
24  *	Not all boards address these parts the same way, some use a
25  *	direct addressing method, others use a side-band address space
26  *	to access odd address registers, some require byte swapping
27  *	others do not.
28  */
29 #define	BSWAP(w)	(((w) << 8) | ((w) >> 8))
30 #define	RSWAP(w)	(w)
31 
32 
33 /*
34  *	Define the basic hardware resources of NE2000 boards.
35  */
36 
37 #if defined(CONFIG_ARN5206)
38 #define NE2000_ADDR		0x40000300
39 #define NE2000_ODDOFFSET	0x00010000
40 #define	NE2000_IRQ_VECTOR	0xf0
41 #define	NE2000_IRQ_PRIORITY	2
42 #define	NE2000_IRQ_LEVEL	4
43 #define	NE2000_BYTE		volatile unsigned short
44 #endif
45 
46 #if defined(CONFIG_M5206eC3)
47 #define	NE2000_ADDR		0x40000300
48 #define	NE2000_ODDOFFSET	0x00010000
49 #define	NE2000_IRQ_VECTOR	0x1c
50 #define	NE2000_IRQ_PRIORITY	2
51 #define	NE2000_IRQ_LEVEL	4
52 #define	NE2000_BYTE		volatile unsigned short
53 #endif
54 
55 #if defined(CONFIG_M5206e) && defined(CONFIG_NETtel)
56 #define NE2000_ADDR		0x30000300
57 #define NE2000_IRQ_VECTOR	25
58 #define NE2000_IRQ_PRIORITY	1
59 #define NE2000_IRQ_LEVEL	3
60 #define	NE2000_BYTE		volatile unsigned char
61 #endif
62 
63 #if defined(CONFIG_M5307C3)
64 #define NE2000_ADDR		0x40000300
65 #define NE2000_ODDOFFSET	0x00010000
66 #define NE2000_IRQ_VECTOR	0x1b
67 #define	NE2000_BYTE		volatile unsigned short
68 #endif
69 
70 #if defined(CONFIG_M5272) && defined(CONFIG_NETtel)
71 #define NE2000_ADDR		0x30600300
72 #define NE2000_ODDOFFSET	0x00008000
73 #define NE2000_IRQ_VECTOR	67
74 #undef	BSWAP
75 #define	BSWAP(w)		(w)
76 #define	NE2000_BYTE		volatile unsigned short
77 #undef	RSWAP
78 #define	RSWAP(w)		(((w) << 8) | ((w) >> 8))
79 #endif
80 
81 #if defined(CONFIG_M5307) && defined(CONFIG_NETtel)
82 #define NE2000_ADDR0		0x30600300
83 #define NE2000_ADDR1		0x30800300
84 #define NE2000_ODDOFFSET	0x00008000
85 #define NE2000_IRQ_VECTOR0	27
86 #define NE2000_IRQ_VECTOR1	29
87 #undef	BSWAP
88 #define	BSWAP(w)		(w)
89 #define	NE2000_BYTE		volatile unsigned short
90 #undef	RSWAP
91 #define	RSWAP(w)		(((w) << 8) | ((w) >> 8))
92 #endif
93 
94 #if defined(CONFIG_M5307) && defined(CONFIG_SECUREEDGEMP3)
95 #define NE2000_ADDR		0x30600300
96 #define NE2000_ODDOFFSET	0x00008000
97 #define NE2000_IRQ_VECTOR	27
98 #undef	BSWAP
99 #define	BSWAP(w)		(w)
100 #define	NE2000_BYTE		volatile unsigned short
101 #undef	RSWAP
102 #define	RSWAP(w)		(((w) << 8) | ((w) >> 8))
103 #endif
104 
105 #if defined(CONFIG_ARN5307)
106 #define NE2000_ADDR		0xfe600300
107 #define NE2000_ODDOFFSET	0x00010000
108 #define NE2000_IRQ_VECTOR	0x1b
109 #define NE2000_IRQ_PRIORITY	2
110 #define NE2000_IRQ_LEVEL	3
111 #define	NE2000_BYTE		volatile unsigned short
112 #endif
113 
114 #if defined(CONFIG_M5407C3)
115 #define NE2000_ADDR		0x40000300
116 #define NE2000_ODDOFFSET	0x00010000
117 #define NE2000_IRQ_VECTOR	0x1b
118 #define	NE2000_BYTE		volatile unsigned short
119 #endif
120 
121 /****************************************************************************/
122 
123 /*
124  *	Side-band address space for odd address requires re-mapping
125  *	many of the standard ISA access functions.
126  */
127 #ifdef NE2000_ODDOFFSET
128 
129 #undef outb
130 #undef outb_p
131 #undef inb
132 #undef inb_p
133 #undef outsb
134 #undef outsw
135 #undef insb
136 #undef insw
137 
138 #define	outb	ne2000_outb
139 #define	inb	ne2000_inb
140 #define	outb_p	ne2000_outb
141 #define	inb_p	ne2000_inb
142 #define	outsb	ne2000_outsb
143 #define	outsw	ne2000_outsw
144 #define	insb	ne2000_insb
145 #define	insw	ne2000_insw
146 
147 
148 #ifndef COLDFIRE_NE2000_FUNCS
149 
150 void ne2000_outb(unsigned int val, unsigned int addr);
151 int  ne2000_inb(unsigned int addr);
152 void ne2000_insb(unsigned int addr, void *vbuf, int unsigned long len);
153 void ne2000_insw(unsigned int addr, void *vbuf, unsigned long len);
154 void ne2000_outsb(unsigned int addr, void *vbuf, unsigned long len);
155 void ne2000_outsw(unsigned int addr, void *vbuf, unsigned long len);
156 
157 #else
158 
159 /*
160  *	This macro converts a conventional register address into the
161  *	real memory pointer of the mapped NE2000 device.
162  *	On most NE2000 implementations on ColdFire boards the chip is
163  *	mapped in kinda funny, due to its ISA heritage.
164  */
165 #define	NE2000_PTR(addr)	((addr&0x1)?(NE2000_ODDOFFSET+addr-1):(addr))
166 #define	NE2000_DATA_PTR(addr)	(addr)
167 
168 
ne2000_outb(unsigned int val,unsigned int addr)169 void ne2000_outb(unsigned int val, unsigned int addr)
170 {
171 	NE2000_BYTE	*rp;
172 
173 	rp = (NE2000_BYTE *) NE2000_PTR(addr);
174 	*rp = RSWAP(val);
175 }
176 
ne2000_inb(unsigned int addr)177 int ne2000_inb(unsigned int addr)
178 {
179 	NE2000_BYTE	*rp, val;
180 
181 	rp = (NE2000_BYTE *) NE2000_PTR(addr);
182 	val = *rp;
183 	return((int) ((NE2000_BYTE) RSWAP(val)));
184 }
185 
ne2000_insb(unsigned int addr,void * vbuf,int unsigned long len)186 void ne2000_insb(unsigned int addr, void *vbuf, int unsigned long len)
187 {
188 	NE2000_BYTE	*rp, val;
189 	unsigned char	*buf;
190 
191 	buf = (unsigned char *) vbuf;
192 	rp = (NE2000_BYTE *) NE2000_DATA_PTR(addr);
193 	for (; (len > 0); len--) {
194 		val = *rp;
195 		*buf++ = RSWAP(val);
196 	}
197 }
198 
ne2000_insw(unsigned int addr,void * vbuf,unsigned long len)199 void ne2000_insw(unsigned int addr, void *vbuf, unsigned long len)
200 {
201 	volatile unsigned short	*rp;
202 	unsigned short		w, *buf;
203 
204 	buf = (unsigned short *) vbuf;
205 	rp = (volatile unsigned short *) NE2000_DATA_PTR(addr);
206 	for (; (len > 0); len--) {
207 		w = *rp;
208 		*buf++ = BSWAP(w);
209 	}
210 }
211 
ne2000_outsb(unsigned int addr,const void * vbuf,unsigned long len)212 void ne2000_outsb(unsigned int addr, const void *vbuf, unsigned long len)
213 {
214 	NE2000_BYTE	*rp, val;
215 	unsigned char	*buf;
216 
217 	buf = (unsigned char *) vbuf;
218 	rp = (NE2000_BYTE *) NE2000_DATA_PTR(addr);
219 	for (; (len > 0); len--) {
220 		val = *buf++;
221 		*rp = RSWAP(val);
222 	}
223 }
224 
ne2000_outsw(unsigned int addr,const void * vbuf,unsigned long len)225 void ne2000_outsw(unsigned int addr, const void *vbuf, unsigned long len)
226 {
227 	volatile unsigned short	*rp;
228 	unsigned short		w, *buf;
229 
230 	buf = (unsigned short *) vbuf;
231 	rp = (volatile unsigned short *) NE2000_DATA_PTR(addr);
232 	for (; (len > 0); len--) {
233 		w = *buf++;
234 		*rp = BSWAP(w);
235 	}
236 }
237 
238 #endif /* COLDFIRE_NE2000_FUNCS */
239 #endif /* NE2000_OFFOFFSET */
240 
241 /****************************************************************************/
242 #endif	/* mcfne_h */
243