diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/net/Makefile | 5 | ||||
| -rw-r--r-- | drivers/net/ax88796.c | 156 | ||||
| -rw-r--r-- | drivers/net/ax88796.h | 136 | ||||
| -rw-r--r-- | drivers/net/ne2000.c | 94 | ||||
| -rw-r--r-- | drivers/net/ne2000.h | 87 | ||||
| -rw-r--r-- | drivers/net/ne2000_base.h | 1 | 
6 files changed, 252 insertions, 227 deletions
| diff --git a/drivers/net/Makefile b/drivers/net/Makefile index d5e413b79..4131aad98 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile @@ -42,7 +42,10 @@ COBJS-y += lan91c96.o  COBJS-y += macb.o  COBJS-y += mcffec.o  COBJS-y += natsemi.o -COBJS-$(CONFIG_DRIVER_NE2000) += ne2000.o +ifeq ($(CONFIG_DRIVER_NE2000),y) +COBJS-y += ne2000.o +COBJS-$(CONFIG_DRIVER_AX88796L) += ax88796.o +endif  COBJS-y += netarm_eth.o  COBJS-y += netconsole.o  COBJS-y += ns7520_eth.o diff --git a/drivers/net/ax88796.c b/drivers/net/ax88796.c new file mode 100644 index 000000000..39cd101f0 --- /dev/null +++ b/drivers/net/ax88796.c @@ -0,0 +1,156 @@ +/* + * (c) 2007 Nobuhiro Iwamatsu <iwamatsu@nigauri.org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#include <common.h> +#include "ax88796.h" + +/* + * Set 1 bit data + */ +static void ax88796_bitset(u32 bit) +{ +	/* DATA1 */ +	if( bit ) +		EEDI_HIGH; +	else +		EEDI_LOW; + +	EECLK_LOW; +	udelay(1000); +	EECLK_HIGH; +	udelay(1000); +	EEDI_LOW; +} + +/* + * Get 1 bit data + */ +static u8 ax88796_bitget(void) +{ +	u8 bit; + +	EECLK_LOW; +	udelay(1000); +	/* DATA */ +	bit = EEDO; +	EECLK_HIGH; +	udelay(1000); + +	return bit; +} + +/* + * Send COMMAND to EEPROM + */ +static void ax88796_eep_cmd(u8 cmd) +{ +	ax88796_bitset(BIT_DUMMY); +	switch(cmd){ +		case MAC_EEP_READ: +			ax88796_bitset(1); +			ax88796_bitset(1); +			ax88796_bitset(0); +			break; + +		case MAC_EEP_WRITE: +			ax88796_bitset(1); +			ax88796_bitset(0); +			ax88796_bitset(1); +			break; + +		case MAC_EEP_ERACE: +			ax88796_bitset(1); +			ax88796_bitset(1); +			ax88796_bitset(1); +			break; + +		case MAC_EEP_EWEN: +			ax88796_bitset(1); +			ax88796_bitset(0); +			ax88796_bitset(0); +			break; + +		case MAC_EEP_EWDS: +			ax88796_bitset(1); +			ax88796_bitset(0); +			ax88796_bitset(0); +			break; +		default: +			break; +	} +} + +static void ax88796_eep_setaddr(u16 addr) +{ +	int i ; + +	for( i = 7 ; i >= 0 ; i-- ) +		ax88796_bitset(addr & (1 << i)); +} + +/* + * Get data from EEPROM + */ +static u16 ax88796_eep_getdata(void) +{ +	ushort data = 0; +	int i; + +	ax88796_bitget();	/* DUMMY */ +	for( i = 0 ; i < 16 ; i++ ){ +		data <<= 1; +		data |= ax88796_bitget(); +	} +	return data; +} + +static void ax88796_mac_read(u8 *buff) +{ +	int i ; +	u16 data; +	u16 addr = 0; + +	for( i = 0 ; i < 3; i++ ) +	{ +		EECS_HIGH; +		EEDI_LOW; +		udelay(1000); +		/* READ COMMAND */ +		ax88796_eep_cmd(MAC_EEP_READ); +		/* ADDRESS */ +		ax88796_eep_setaddr(addr++); +		/* GET DATA */ +		data = ax88796_eep_getdata(); +		*buff++ = (uchar)(data & 0xff); +		*buff++ = (uchar)((data >> 8) & 0xff); +		EECLK_LOW; +		EEDI_LOW; +		EECS_LOW; +	} +} + +int get_prom(u8* mac_addr) +{ +	u8 prom[32]; +	int i; + +	ax88796_mac_read(prom); +	for (i = 0; i < 6; i++){ +		mac_addr[i] = prom[i]; +	} +	return 1; +} diff --git a/drivers/net/ax88796.h b/drivers/net/ax88796.h index 0e6f8a201..43a16393b 100644 --- a/drivers/net/ax88796.h +++ b/drivers/net/ax88796.h @@ -78,140 +78,4 @@  #define DP_OUT_DATA(_b_, _d_)	*( (vu_short *) ((_b_)+ISA_OFFSET)) = (_d_)  #endif - -/* - * Set 1 bit data - */ -static void ax88796_bitset(u32 bit) -{ -	/* DATA1 */ -	if( bit ) -		EEDI_HIGH; -	else -		EEDI_LOW; - -	EECLK_LOW; -	udelay(1000); -	EECLK_HIGH; -	udelay(1000); -	EEDI_LOW; -} - -/* - * Get 1 bit data - */ -static u8 ax88796_bitget(void) -{ -	u8 bit; - -	EECLK_LOW; -	udelay(1000); -	/* DATA */ -	bit = EEDO; -	EECLK_HIGH; -	udelay(1000); - -	return bit; -} - -/* - * Send COMMAND to EEPROM - */ -static void ax88796_eep_cmd(u8 cmd) -{ -	ax88796_bitset(BIT_DUMMY); -	switch(cmd){ -		case MAC_EEP_READ: -			ax88796_bitset(1); -			ax88796_bitset(1); -			ax88796_bitset(0); -			break; - -		case MAC_EEP_WRITE: -			ax88796_bitset(1); -			ax88796_bitset(0); -			ax88796_bitset(1); -			break; - -		case MAC_EEP_ERACE: -			ax88796_bitset(1); -			ax88796_bitset(1); -			ax88796_bitset(1); -			break; - -		case MAC_EEP_EWEN: -			ax88796_bitset(1); -			ax88796_bitset(0); -			ax88796_bitset(0); -			break; - -		case MAC_EEP_EWDS: -			ax88796_bitset(1); -			ax88796_bitset(0); -			ax88796_bitset(0); -			break; -		default: -			break; -	} -} - -static void ax88796_eep_setaddr(u16 addr) -{ -	int i ; -	for( i = 7 ; i >= 0 ; i-- ) -		ax88796_bitset(addr & (1 << i)); -} - -/* - * Get data from EEPROM - */ -static u16 ax88796_eep_getdata(void) -{ -	ushort data = 0; -	int i; - -	ax88796_bitget();	/* DUMMY */ -	for( i = 0 ; i < 16 ; i++ ){ -		data <<= 1; -		data |= ax88796_bitget(); -	} -	return data; -} - -static void ax88796_mac_read(u8 *buff) -{ -	int i ; -	u16 data, addr = 0; - -	for( i = 0 ; i < 3; i++ ) -	{ -		EECS_HIGH; -		EEDI_LOW; -		udelay(1000); -		/* READ COMMAND */ -		ax88796_eep_cmd(MAC_EEP_READ); -		/* ADDRESS */ -		ax88796_eep_setaddr(addr++); -		/* GET DATA */ -		data = ax88796_eep_getdata(); -		*buff++ = (uchar)(data & 0xff); -		*buff++ = (uchar)((data >> 8) & 0xff); -		EECLK_LOW; -		EEDI_LOW; -		EECS_LOW; -	} -} - -int get_prom(u8* mac_addr) -{ -	u8 prom[32]; -	int i; - -	ax88796_mac_read(prom); -	for (i = 0; i < 6; i++){ -		mac_addr[i] = prom[i]; -	} -	return 1; -} -  #endif /* __DRIVERS_AX88796L_H__ */ diff --git a/drivers/net/ne2000.c b/drivers/net/ne2000.c index d09da7829..2da57b68b 100644 --- a/drivers/net/ne2000.c +++ b/drivers/net/ne2000.c @@ -126,6 +126,9 @@ dp83902a_init(void)  {  	dp83902a_priv_data_t *dp = &nic;  	u8* base; +#if defined(NE2000_BASIC_INIT) +	int i; +#endif  	DEBUG_FUNCTION(); @@ -755,8 +758,6 @@ static hw_info_t hw_info[] = {  #define NR_INFO		(sizeof(hw_info)/sizeof(hw_info_t)) -static hw_info_t default_info = { 0, 0, 0, 0, 0 }; -  u8 dev_addr[6];  #define PCNET_CMD	0x00 @@ -764,6 +765,93 @@ u8 dev_addr[6];  #define PCNET_RESET	0x1f	/* Issue a read to reset, a write to clear. */  #define PCNET_MISC	0x18	/* For IBM CCAE and Socket EA cards */ +static void pcnet_reset_8390(void) +{ +	int i, r; + +	PRINTK("nic base is %lx\n", nic_base); + +	n2k_outb(E8390_NODMA + E8390_PAGE0+E8390_STOP, E8390_CMD); +	PRINTK("cmd (at %lx) is %x\n", nic_base + E8390_CMD, n2k_inb(E8390_CMD)); +	n2k_outb(E8390_NODMA+E8390_PAGE1+E8390_STOP, E8390_CMD); +	PRINTK("cmd (at %lx) is %x\n", nic_base + E8390_CMD, n2k_inb(E8390_CMD)); +	n2k_outb(E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD); +	PRINTK("cmd (at %lx) is %x\n", nic_base + E8390_CMD, n2k_inb(E8390_CMD)); +	n2k_outb(E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD); + +	n2k_outb(n2k_inb(PCNET_RESET), PCNET_RESET); + +	for (i = 0; i < 100; i++) { +		if ((r = (n2k_inb(EN0_ISR) & ENISR_RESET)) != 0) +			break; +		PRINTK("got %x in reset\n", r); +		udelay(100); +	} +	n2k_outb(ENISR_RESET, EN0_ISR); /* Ack intr. */ + +	if (i == 100) +		printf("pcnet_reset_8390() did not complete.\n"); +} /* pcnet_reset_8390 */ + +int get_prom(u8* mac_addr) __attribute__ ((weak, alias ("__get_prom"))); +int __get_prom(u8* mac_addr) +{ +	u8 prom[32]; +	int i, j; +	struct { +		u_char value, offset; +	} program_seq[] = { +		{E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD}, /* Select page 0*/ +		{0x48, EN0_DCFG},		/* Set byte-wide (0x48) access. */ +		{0x00, EN0_RCNTLO},		/* Clear the count regs. */ +		{0x00, EN0_RCNTHI}, +		{0x00, EN0_IMR},		/* Mask completion irq. */ +		{0xFF, EN0_ISR}, +		{E8390_RXOFF, EN0_RXCR},	/* 0x20 Set to monitor */ +		{E8390_TXOFF, EN0_TXCR},	/* 0x02 and loopback mode. */ +		{32, EN0_RCNTLO}, +		{0x00, EN0_RCNTHI}, +		{0x00, EN0_RSARLO},		/* DMA starting at 0x0000. */ +		{0x00, EN0_RSARHI}, +		{E8390_RREAD+E8390_START, E8390_CMD}, +	}; + +	PRINTK ("trying to get MAC via prom reading\n"); + +	pcnet_reset_8390 (); + +	mdelay (10); + +	for (i = 0; i < sizeof (program_seq) / sizeof (program_seq[0]); i++) +		n2k_outb (program_seq[i].value, program_seq[i].offset); + +	PRINTK ("PROM:"); +	for (i = 0; i < 32; i++) { +		prom[i] = n2k_inb (PCNET_DATAPORT); +		PRINTK (" %02x", prom[i]); +	} +	PRINTK ("\n"); +	for (i = 0; i < NR_INFO; i++) { +		if ((prom[0] == hw_info[i].a0) && +			(prom[2] == hw_info[i].a1) && +			(prom[4] == hw_info[i].a2)) { +			PRINTK ("matched board %d\n", i); +			break; +		} +	} +	if ((i < NR_INFO) || ((prom[28] == 0x57) && (prom[30] == 0x57))) { +		PRINTK ("on exit i is %d/%ld\n", i, NR_INFO); +		PRINTK ("MAC address is "); +		for (j = 0; j < 6; j++) { +			mac_addr[j] = prom[j << 1]; +			PRINTK ("%02x:", mac_addr[i]); +		} +		PRINTK ("\n"); +		return (i < NR_INFO) ? i : 0; +	} +	return 0; +} +  u32 nic_base;  /* U-boot specific routines */ @@ -790,7 +878,7 @@ void uboot_push_tx_done(int key, int val) {  }  int eth_init(bd_t *bd) { -	static hw_info_t * r; +	int r;  	char ethaddr[20];  	PRINTK("### eth_init\n"); diff --git a/drivers/net/ne2000.h b/drivers/net/ne2000.h index 604948286..2cde6be43 100644 --- a/drivers/net/ne2000.h +++ b/drivers/net/ne2000.h @@ -81,6 +81,7 @@ are GPL, so this is, of course, GPL.  #define DP_DATA		0x10  #define START_PG	0x50	/* First page of TX buffer */ +#define START_PG2	0x48  #define STOP_PG		0x80	/* Last page +1 of RX ring */  #define RX_START	0x50 @@ -90,90 +91,4 @@ are GPL, so this is, of course, GPL.  #define DP_OUT(_b_, _o_, _d_)	*( (vu_char *) ((_b_)+(_o_))) = (_d_)  #define DP_IN_DATA(_b_, _d_)	(_d_) = *( (vu_char *) ((_b_)))  #define DP_OUT_DATA(_b_, _d_)	*( (vu_char *) ((_b_))) = (_d_) - -static void pcnet_reset_8390(void) -{ -	int i, r; - -	PRINTK("nic base is %lx\n", nic_base); - -	n2k_outb(E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD); -	PRINTK("cmd (at %lx) is %x\n", nic_base+ E8390_CMD, n2k_inb(E8390_CMD)); -	n2k_outb(E8390_NODMA+E8390_PAGE1+E8390_STOP, E8390_CMD); -	PRINTK("cmd (at %lx) is %x\n", nic_base+ E8390_CMD, n2k_inb(E8390_CMD)); -	n2k_outb(E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD); -	PRINTK("cmd (at %lx) is %x\n", nic_base+ E8390_CMD, n2k_inb(E8390_CMD)); -	n2k_outb(E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD); - -	n2k_outb(n2k_inb(PCNET_RESET), PCNET_RESET); - -	for (i = 0; i < 100; i++) { -		if ((r = (n2k_inb(EN0_ISR) & ENISR_RESET)) != 0) -			break; -		PRINTK("got %x in reset\n", r); -		udelay(100); -	} -	n2k_outb(ENISR_RESET, EN0_ISR); /* Ack intr. */ - -	if (i == 100) -		printf("pcnet_reset_8390() did not complete.\n"); -} /* pcnet_reset_8390 */ - -int get_prom(u8* mac_addr) -{ -	u8 prom[32]; -	int i, j; -	struct { -		u_char value, offset; -	} program_seq[] = { -		{E8390_NODMA+E8390_PAGE0+E8390_STOP, E8390_CMD}, /* Select page 0*/ -		{0x48,  EN0_DCFG},		/* Set byte-wide (0x48) access. */ -		{0x00,  EN0_RCNTLO},		/* Clear the count regs. */ -		{0x00,  EN0_RCNTHI}, -		{0x00,  EN0_IMR},		/* Mask completion irq. */ -		{0xFF,  EN0_ISR}, -		{E8390_RXOFF, EN0_RXCR},	/* 0x20  Set to monitor */ -		{E8390_TXOFF, EN0_TXCR},	/* 0x02  and loopback mode. */ -		{32,    EN0_RCNTLO}, -		{0x00,  EN0_RCNTHI}, -		{0x00,  EN0_RSARLO},		/* DMA starting at 0x0000. */ -		{0x00,  EN0_RSARHI}, -		{E8390_RREAD+E8390_START, E8390_CMD}, -	}; - -	PRINTK ("trying to get MAC via prom reading\n"); - -	pcnet_reset_8390 (); - -	mdelay (10); - -	for (i = 0; i < sizeof (program_seq) / sizeof (program_seq[0]); i++) -		n2k_outb (program_seq[i].value, program_seq[i].offset); - -	PRINTK ("PROM:"); -	for (i = 0; i < 32; i++) { -		prom[i] = n2k_inb (PCNET_DATAPORT); -		PRINTK (" %02x", prom[i]); -	} -	PRINTK ("\n"); -	for (i = 0; i < NR_INFO; i++) { -		if ((prom[0] == hw_info[i].a0) && -		    (prom[2] == hw_info[i].a1) && -		    (prom[4] == hw_info[i].a2)) { -			PRINTK ("matched board %d\n", i); -			break; -		} -	} -	if ((i < NR_INFO) || ((prom[28] == 0x57) && (prom[30] == 0x57))) { -		PRINTK ("on exit i is %d/%ld\n", i, NR_INFO); -		PRINTK ("MAC address is "); -		for (j = 0; j < 6; j++) { -			mac_addr[j] = prom[j << 1]; -			PRINTK ("%02x:", mac_addr[i]); -		} -		PRINTK ("\n"); -		return (i < NR_INFO) ? i : 0; -	} -	return NULL; -}  #endif /* __DRIVERS_NE2000_H__ */ diff --git a/drivers/net/ne2000_base.h b/drivers/net/ne2000_base.h index 990d7488c..948b2906c 100644 --- a/drivers/net/ne2000_base.h +++ b/drivers/net/ne2000_base.h @@ -122,7 +122,6 @@ typedef struct dp83902a_priv_data {  /*   * Some forward declarations   */ -int get_prom( u8* mac_addr);  static void dp83902a_poll(void);  /* ------------------------------------------------------------------------ */ |