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_CFV240) 64#define NE2000_ADDR 0x40010000 65#define NE2000_ADDR1 0x40010001 66#define NE2000_ODDOFFSET 0x00000000 67#define NE2000_IRQ 1 68#define NE2000_IRQ_VECTOR 0x19 69#define NE2000_IRQ_PRIORITY 2 70#define NE2000_IRQ_LEVEL 1 71#define NE2000_BYTE volatile unsigned char 72#endif 73 74#if defined(CONFIG_M5307C3) 75#define NE2000_ADDR 0x40000300 76#define NE2000_ODDOFFSET 0x00010000 77#define NE2000_IRQ_VECTOR 0x1b 78#define NE2000_BYTE volatile unsigned short 79#endif 80 81#if defined(CONFIG_M5272) && defined(CONFIG_NETtel) 82#define NE2000_ADDR 0x30600300 83#define NE2000_ODDOFFSET 0x00008000 84#define NE2000_IRQ_VECTOR 67 85#undef BSWAP 86#define BSWAP(w) (w) 87#define NE2000_BYTE volatile unsigned short 88#undef RSWAP 89#define RSWAP(w) (((w) << 8) | ((w) >> 8)) 90#endif 91 92#if defined(CONFIG_M5307) && defined(CONFIG_NETtel) 93#define NE2000_ADDR0 0x30600300 94#define NE2000_ADDR1 0x30800300 95#define NE2000_ODDOFFSET 0x00008000 96#define NE2000_IRQ_VECTOR0 27 97#define NE2000_IRQ_VECTOR1 29 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_M5307) && defined(CONFIG_SECUREEDGEMP3) 106#define NE2000_ADDR 0x30600300 107#define NE2000_ODDOFFSET 0x00008000 108#define NE2000_IRQ_VECTOR 27 109#undef BSWAP 110#define BSWAP(w) (w) 111#define NE2000_BYTE volatile unsigned short 112#undef RSWAP 113#define RSWAP(w) (((w) << 8) | ((w) >> 8)) 114#endif 115 116#if defined(CONFIG_ARN5307) 117#define NE2000_ADDR 0xfe600300 118#define NE2000_ODDOFFSET 0x00010000 119#define NE2000_IRQ_VECTOR 0x1b 120#define NE2000_IRQ_PRIORITY 2 121#define NE2000_IRQ_LEVEL 3 122#define NE2000_BYTE volatile unsigned short 123#endif 124 125#if defined(CONFIG_M5407C3) 126#define NE2000_ADDR 0x40000300 127#define NE2000_ODDOFFSET 0x00010000 128#define NE2000_IRQ_VECTOR 0x1b 129#define NE2000_BYTE volatile unsigned short 130#endif 131 132/****************************************************************************/ 133 134/* 135 * Side-band address space for odd address requires re-mapping 136 * many of the standard ISA access functions. 137 */ 138#ifdef NE2000_ODDOFFSET 139 140#undef outb 141#undef outb_p 142#undef inb 143#undef inb_p 144#undef outsb 145#undef outsw 146#undef insb 147#undef insw 148 149#define outb ne2000_outb 150#define inb ne2000_inb 151#define outb_p ne2000_outb 152#define inb_p ne2000_inb 153#define outsb ne2000_outsb 154#define outsw ne2000_outsw 155#define insb ne2000_insb 156#define insw ne2000_insw 157 158 159#ifndef COLDFIRE_NE2000_FUNCS 160 161void ne2000_outb(unsigned int val, unsigned int addr); 162int ne2000_inb(unsigned int addr); 163void ne2000_insb(unsigned int addr, void *vbuf, int unsigned long len); 164void ne2000_insw(unsigned int addr, void *vbuf, unsigned long len); 165void ne2000_outsb(unsigned int addr, void *vbuf, unsigned long len); 166void ne2000_outsw(unsigned int addr, void *vbuf, unsigned long len); 167 168#else 169 170/* 171 * This macro converts a conventional register address into the 172 * real memory pointer of the mapped NE2000 device. 173 * On most NE2000 implementations on ColdFire boards the chip is 174 * mapped in kinda funny, due to its ISA heritage. 175 */ 176#ifdef CONFIG_CFV240 177#define NE2000_PTR(addr) (NE2000_ADDR + ((addr & 0x3f) << 1) + 1) 178#define NE2000_DATA_PTR(addr) (NE2000_ADDR + ((addr & 0x3f) << 1)) 179#else 180#define NE2000_PTR(addr) ((addr&0x1)?(NE2000_ODDOFFSET+addr-1):(addr)) 181#define NE2000_DATA_PTR(addr) (addr) 182#endif 183 184 185void ne2000_outb(unsigned int val, unsigned int addr) 186{ 187 NE2000_BYTE *rp; 188 189 rp = (NE2000_BYTE *) NE2000_PTR(addr); 190 *rp = RSWAP(val); 191} 192 193int ne2000_inb(unsigned int addr) 194{ 195 NE2000_BYTE *rp, val; 196 197 rp = (NE2000_BYTE *) NE2000_PTR(addr); 198 val = *rp; 199 return((int) ((NE2000_BYTE) RSWAP(val))); 200} 201 202void ne2000_insb(unsigned int addr, void *vbuf, int unsigned long len) 203{ 204 NE2000_BYTE *rp, val; 205 unsigned char *buf; 206 207 buf = (unsigned char *) vbuf; 208 rp = (NE2000_BYTE *) NE2000_DATA_PTR(addr); 209 for (; (len > 0); len--) { 210 val = *rp; 211 *buf++ = RSWAP(val); 212 } 213} 214 215void ne2000_insw(unsigned int addr, void *vbuf, unsigned long len) 216{ 217 volatile unsigned short *rp; 218 unsigned short w, *buf; 219 220 buf = (unsigned short *) vbuf; 221 rp = (volatile unsigned short *) NE2000_DATA_PTR(addr); 222 for (; (len > 0); len--) { 223 w = *rp; 224 *buf++ = BSWAP(w); 225 } 226} 227 228void ne2000_outsb(unsigned int addr, const void *vbuf, unsigned long len) 229{ 230 NE2000_BYTE *rp, val; 231 unsigned char *buf; 232 233 buf = (unsigned char *) vbuf; 234 rp = (NE2000_BYTE *) NE2000_DATA_PTR(addr); 235 for (; (len > 0); len--) { 236 val = *buf++; 237 *rp = RSWAP(val); 238 } 239} 240 241void ne2000_outsw(unsigned int addr, const void *vbuf, unsigned long len) 242{ 243 volatile unsigned short *rp; 244 unsigned short w, *buf; 245 246 buf = (unsigned short *) vbuf; 247 rp = (volatile unsigned short *) NE2000_DATA_PTR(addr); 248 for (; (len > 0); len--) { 249 w = *buf++; 250 *rp = BSWAP(w); 251 } 252} 253 254#endif /* COLDFIRE_NE2000_FUNCS */ 255#endif /* NE2000_OFFOFFSET */ 256 257/****************************************************************************/ 258 259#ifdef COLDFIRE_NE2000_FUNCS 260 261/* 262 * Lastly the interrupt set up code... 263 * Minor differences between the different board types. 264 */ 265 266#if defined(CONFIG_ARN5206) 267void ne2000_irqsetup(int irq) 268{ 269 volatile unsigned char *icrp; 270 271 icrp = (volatile unsigned char *) (MCF_MBAR + MCFSIM_ICR4); 272 *icrp = MCFSIM_ICR_LEVEL4 | MCFSIM_ICR_PRI2; 273 mcf_setimr(mcf_getimr() & ~MCFSIM_IMR_EINT4); 274} 275#endif 276 277#if defined(CONFIG_M5206eC3) 278void ne2000_irqsetup(int irq) 279{ 280 volatile unsigned char *icrp; 281 282 icrp = (volatile unsigned char *) (MCF_MBAR + MCFSIM_ICR4); 283 *icrp = MCFSIM_ICR_LEVEL4 | MCFSIM_ICR_PRI2 | MCFSIM_ICR_AUTOVEC; 284 mcf_setimr(mcf_getimr() & ~MCFSIM_IMR_EINT4); 285} 286#endif 287 288#if defined(CONFIG_CFV240) 289void ne2000_irqsetup(int irq) 290{ 291 volatile unsigned char *icrp; 292 293 icrp = (volatile unsigned char *) (MCF_MBAR + MCFSIM_ICR1); 294 *icrp = MCFSIM_ICR_LEVEL1 | MCFSIM_ICR_PRI2 | MCFSIM_ICR_AUTOVEC; 295 mcf_setimr(mcf_getimr() & ~MCFSIM_IMR_EINT1); 296} 297#endif 298 299#if defined(CONFIG_M5206e) && defined(CONFIG_NETtel) 300void ne2000_irqsetup(int irq) 301{ 302 mcf_autovector(irq); 303} 304#endif 305 306#if defined(CONFIG_M5272) && defined(CONFIG_NETtel) 307void ne2000_irqsetup(int irq) 308{ 309 volatile unsigned long *icrp; 310 volatile unsigned long *pitr; 311 312 /* The NE2000 device uses external IRQ3 */ 313 icrp = (volatile unsigned long *) (MCF_MBAR + MCFSIM_ICR1); 314 *icrp = (*icrp & 0x77077777) | 0x00d00000; 315 316 pitr = (volatile unsigned long *) (MCF_MBAR + MCFSIM_PITR); 317 *pitr = *pitr | 0x20000000; 318} 319 320void ne2000_irqack(int irq) 321{ 322 volatile unsigned long *icrp; 323 324 /* The NE2000 device uses external IRQ3 */ 325 icrp = (volatile unsigned long *) (MCF_MBAR + MCFSIM_ICR1); 326 *icrp = (*icrp & 0x77777777) | 0x00800000; 327} 328#endif 329 330#if defined(CONFIG_M5307) || defined(CONFIG_M5407) 331#if defined(CONFIG_NETtel) || defined(CONFIG_SECUREEDGEMP3) 332 333void ne2000_irqsetup(int irq) 334{ 335 mcf_setimr(mcf_getimr() & ~MCFSIM_IMR_EINT3); 336 mcf_autovector(irq); 337} 338 339#else 340 341void ne2000_irqsetup(int irq) 342{ 343 mcf_setimr(mcf_getimr() & ~MCFSIM_IMR_EINT3); 344} 345 346#endif /* ! CONFIG_NETtel || CONFIG_SECUREEDGEMP3 */ 347#endif /* CONFIG_M5307 || CONFIG_M5407 */ 348 349#endif /* COLDFIRE_NE2000_FUNCS */ 350 351/****************************************************************************/ 352#endif /* mcfne_h */ 353