| /****************************************************************************/ |
| |
| /* |
| * mcfne.h -- NE2000 in ColdFire eval boards. |
| * |
| * (C) Copyright 1999-2000, Greg Ungerer (gerg@snapgear.com) |
| * (C) Copyright 2000, Lineo (www.lineo.com) |
| * (C) Copyright 2001, SnapGear (www.snapgear.com) |
| * |
| * 19990409 David W. Miller Converted from m5206ne.h for 5307 eval board |
| * |
| * Hacked support for m5206e Cadre III evaluation board |
| * Fred Stevens (fred.stevens@pemstar.com) 13 April 1999 |
| */ |
| |
| /****************************************************************************/ |
| #ifndef mcfne_h |
| #define mcfne_h |
| /****************************************************************************/ |
| |
| |
| /* |
| * Support for NE2000 clones devices in ColdFire based boards. |
| * Not all boards address these parts the same way, some use a |
| * direct addressing method, others use a side-band address space |
| * to access odd address registers, some require byte swapping |
| * others do not. |
| */ |
| #define BSWAP(w) (((w) << 8) | ((w) >> 8)) |
| #define RSWAP(w) (w) |
| |
| |
| /* |
| * Define the basic hardware resources of NE2000 boards. |
| */ |
| |
| #if defined(CONFIG_ARN5206) |
| #define NE2000_ADDR 0x40000300 |
| #define NE2000_ODDOFFSET 0x00010000 |
| #define NE2000_IRQ_VECTOR 0xf0 |
| #define NE2000_IRQ_PRIORITY 2 |
| #define NE2000_IRQ_LEVEL 4 |
| #define NE2000_BYTE volatile unsigned short |
| #endif |
| |
| #if defined(CONFIG_M5206eC3) |
| #define NE2000_ADDR 0x40000300 |
| #define NE2000_ODDOFFSET 0x00010000 |
| #define NE2000_IRQ_VECTOR 0x1c |
| #define NE2000_IRQ_PRIORITY 2 |
| #define NE2000_IRQ_LEVEL 4 |
| #define NE2000_BYTE volatile unsigned short |
| #endif |
| |
| #if defined(CONFIG_M5206e) && defined(CONFIG_NETtel) |
| #define NE2000_ADDR 0x30000300 |
| #define NE2000_IRQ_VECTOR 25 |
| #define NE2000_IRQ_PRIORITY 1 |
| #define NE2000_IRQ_LEVEL 3 |
| #define NE2000_BYTE volatile unsigned char |
| #endif |
| |
| #if defined(CONFIG_M5307C3) |
| #define NE2000_ADDR 0x40000300 |
| #define NE2000_ODDOFFSET 0x00010000 |
| #define NE2000_IRQ_VECTOR 0x1b |
| #define NE2000_BYTE volatile unsigned short |
| #endif |
| |
| #if defined(CONFIG_M5272) && defined(CONFIG_NETtel) |
| #define NE2000_ADDR 0x30600300 |
| #define NE2000_ODDOFFSET 0x00008000 |
| #define NE2000_IRQ_VECTOR 67 |
| #undef BSWAP |
| #define BSWAP(w) (w) |
| #define NE2000_BYTE volatile unsigned short |
| #undef RSWAP |
| #define RSWAP(w) (((w) << 8) | ((w) >> 8)) |
| #endif |
| |
| #if defined(CONFIG_M5307) && defined(CONFIG_NETtel) |
| #define NE2000_ADDR0 0x30600300 |
| #define NE2000_ADDR1 0x30800300 |
| #define NE2000_ODDOFFSET 0x00008000 |
| #define NE2000_IRQ_VECTOR0 27 |
| #define NE2000_IRQ_VECTOR1 29 |
| #undef BSWAP |
| #define BSWAP(w) (w) |
| #define NE2000_BYTE volatile unsigned short |
| #undef RSWAP |
| #define RSWAP(w) (((w) << 8) | ((w) >> 8)) |
| #endif |
| |
| #if defined(CONFIG_M5307) && defined(CONFIG_SECUREEDGEMP3) |
| #define NE2000_ADDR 0x30600300 |
| #define NE2000_ODDOFFSET 0x00008000 |
| #define NE2000_IRQ_VECTOR 27 |
| #undef BSWAP |
| #define BSWAP(w) (w) |
| #define NE2000_BYTE volatile unsigned short |
| #undef RSWAP |
| #define RSWAP(w) (((w) << 8) | ((w) >> 8)) |
| #endif |
| |
| #if defined(CONFIG_ARN5307) |
| #define NE2000_ADDR 0xfe600300 |
| #define NE2000_ODDOFFSET 0x00010000 |
| #define NE2000_IRQ_VECTOR 0x1b |
| #define NE2000_IRQ_PRIORITY 2 |
| #define NE2000_IRQ_LEVEL 3 |
| #define NE2000_BYTE volatile unsigned short |
| #endif |
| |
| #if defined(CONFIG_M5407C3) |
| #define NE2000_ADDR 0x40000300 |
| #define NE2000_ODDOFFSET 0x00010000 |
| #define NE2000_IRQ_VECTOR 0x1b |
| #define NE2000_BYTE volatile unsigned short |
| #endif |
| |
| /****************************************************************************/ |
| |
| /* |
| * Side-band address space for odd address requires re-mapping |
| * many of the standard ISA access functions. |
| */ |
| #ifdef NE2000_ODDOFFSET |
| |
| #undef outb |
| #undef outb_p |
| #undef inb |
| #undef inb_p |
| #undef outsb |
| #undef outsw |
| #undef insb |
| #undef insw |
| |
| #define outb ne2000_outb |
| #define inb ne2000_inb |
| #define outb_p ne2000_outb |
| #define inb_p ne2000_inb |
| #define outsb ne2000_outsb |
| #define outsw ne2000_outsw |
| #define insb ne2000_insb |
| #define insw ne2000_insw |
| |
| |
| #ifndef COLDFIRE_NE2000_FUNCS |
| |
| void ne2000_outb(unsigned int val, unsigned int addr); |
| int ne2000_inb(unsigned int addr); |
| void ne2000_insb(unsigned int addr, void *vbuf, int unsigned long len); |
| void ne2000_insw(unsigned int addr, void *vbuf, unsigned long len); |
| void ne2000_outsb(unsigned int addr, void *vbuf, unsigned long len); |
| void ne2000_outsw(unsigned int addr, void *vbuf, unsigned long len); |
| |
| #else |
| |
| /* |
| * This macro converts a conventional register address into the |
| * real memory pointer of the mapped NE2000 device. |
| * On most NE2000 implementations on ColdFire boards the chip is |
| * mapped in kinda funny, due to its ISA heritage. |
| */ |
| #define NE2000_PTR(addr) ((addr&0x1)?(NE2000_ODDOFFSET+addr-1):(addr)) |
| #define NE2000_DATA_PTR(addr) (addr) |
| |
| |
| void ne2000_outb(unsigned int val, unsigned int addr) |
| { |
| NE2000_BYTE *rp; |
| |
| rp = (NE2000_BYTE *) NE2000_PTR(addr); |
| *rp = RSWAP(val); |
| } |
| |
| int ne2000_inb(unsigned int addr) |
| { |
| NE2000_BYTE *rp, val; |
| |
| rp = (NE2000_BYTE *) NE2000_PTR(addr); |
| val = *rp; |
| return((int) ((NE2000_BYTE) RSWAP(val))); |
| } |
| |
| void ne2000_insb(unsigned int addr, void *vbuf, int unsigned long len) |
| { |
| NE2000_BYTE *rp, val; |
| unsigned char *buf; |
| |
| buf = (unsigned char *) vbuf; |
| rp = (NE2000_BYTE *) NE2000_DATA_PTR(addr); |
| for (; (len > 0); len--) { |
| val = *rp; |
| *buf++ = RSWAP(val); |
| } |
| } |
| |
| void ne2000_insw(unsigned int addr, void *vbuf, unsigned long len) |
| { |
| volatile unsigned short *rp; |
| unsigned short w, *buf; |
| |
| buf = (unsigned short *) vbuf; |
| rp = (volatile unsigned short *) NE2000_DATA_PTR(addr); |
| for (; (len > 0); len--) { |
| w = *rp; |
| *buf++ = BSWAP(w); |
| } |
| } |
| |
| void ne2000_outsb(unsigned int addr, const void *vbuf, unsigned long len) |
| { |
| NE2000_BYTE *rp, val; |
| unsigned char *buf; |
| |
| buf = (unsigned char *) vbuf; |
| rp = (NE2000_BYTE *) NE2000_DATA_PTR(addr); |
| for (; (len > 0); len--) { |
| val = *buf++; |
| *rp = RSWAP(val); |
| } |
| } |
| |
| void ne2000_outsw(unsigned int addr, const void *vbuf, unsigned long len) |
| { |
| volatile unsigned short *rp; |
| unsigned short w, *buf; |
| |
| buf = (unsigned short *) vbuf; |
| rp = (volatile unsigned short *) NE2000_DATA_PTR(addr); |
| for (; (len > 0); len--) { |
| w = *buf++; |
| *rp = BSWAP(w); |
| } |
| } |
| |
| #endif /* COLDFIRE_NE2000_FUNCS */ |
| #endif /* NE2000_OFFOFFSET */ |
| |
| /****************************************************************************/ |
| |
| #ifdef COLDFIRE_NE2000_FUNCS |
| |
| /* |
| * Lastly the interrupt set up code... |
| * Minor differences between the different board types. |
| */ |
| |
| #if defined(CONFIG_ARN5206) |
| void ne2000_irqsetup(int irq) |
| { |
| volatile unsigned char *icrp; |
| |
| icrp = (volatile unsigned char *) (MCF_MBAR + MCFSIM_ICR4); |
| *icrp = MCFSIM_ICR_LEVEL4 | MCFSIM_ICR_PRI2; |
| mcf_setimr(mcf_getimr() & ~MCFSIM_IMR_EINT4); |
| } |
| #endif |
| |
| #if defined(CONFIG_M5206eC3) |
| void ne2000_irqsetup(int irq) |
| { |
| volatile unsigned char *icrp; |
| |
| icrp = (volatile unsigned char *) (MCF_MBAR + MCFSIM_ICR4); |
| *icrp = MCFSIM_ICR_LEVEL4 | MCFSIM_ICR_PRI2 | MCFSIM_ICR_AUTOVEC; |
| mcf_setimr(mcf_getimr() & ~MCFSIM_IMR_EINT4); |
| } |
| #endif |
| |
| #if defined(CONFIG_M5206e) && defined(CONFIG_NETtel) |
| void ne2000_irqsetup(int irq) |
| { |
| mcf_autovector(irq); |
| } |
| #endif |
| |
| #if defined(CONFIG_M5272) && defined(CONFIG_NETtel) |
| void ne2000_irqsetup(int irq) |
| { |
| volatile unsigned long *icrp; |
| volatile unsigned long *pitr; |
| |
| /* The NE2000 device uses external IRQ3 */ |
| icrp = (volatile unsigned long *) (MCF_MBAR + MCFSIM_ICR1); |
| *icrp = (*icrp & 0x77077777) | 0x00d00000; |
| |
| pitr = (volatile unsigned long *) (MCF_MBAR + MCFSIM_PITR); |
| *pitr = *pitr | 0x20000000; |
| } |
| |
| void ne2000_irqack(int irq) |
| { |
| volatile unsigned long *icrp; |
| |
| /* The NE2000 device uses external IRQ3 */ |
| icrp = (volatile unsigned long *) (MCF_MBAR + MCFSIM_ICR1); |
| *icrp = (*icrp & 0x77777777) | 0x00800000; |
| } |
| #endif |
| |
| #if defined(CONFIG_M5307) || defined(CONFIG_M5407) |
| #if defined(CONFIG_NETtel) || defined(CONFIG_SECUREEDGEMP3) |
| |
| void ne2000_irqsetup(int irq) |
| { |
| mcf_setimr(mcf_getimr() & ~MCFSIM_IMR_EINT3); |
| mcf_autovector(irq); |
| } |
| |
| #else |
| |
| void ne2000_irqsetup(int irq) |
| { |
| mcf_setimr(mcf_getimr() & ~MCFSIM_IMR_EINT3); |
| } |
| |
| #endif /* ! CONFIG_NETtel || CONFIG_SECUREEDGEMP3 */ |
| #endif /* CONFIG_M5307 || CONFIG_M5407 */ |
| |
| #endif /* COLDFIRE_NE2000_FUNCS */ |
| |
| /****************************************************************************/ |
| #endif /* mcfne_h */ |