326 lines
7.9 KiB
C
326 lines
7.9 KiB
C
|
/****************************************************************************/
|
||
|
|
||
|
/*
|
||
|
* 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 */
|