|  | /****************************************************************************/ | 
|  |  | 
|  | /* | 
|  | *	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 */ |