* [U-Boot-Users] ne2000 compile error
@ 2008-04-09 14:29 Shinya Kuribayashi
2008-04-11 14:57 ` Vlad Lungu
0 siblings, 1 reply; 6+ messages in thread
From: Shinya Kuribayashi @ 2008-04-09 14:29 UTC (permalink / raw)
To: u-boot
I'm getting the following compile error in trunk git with
qemu_mips_config.
<-- snip -->
mips-linux-gcc -g -Os -D__KERNEL__ -DTEXT_BASE=0xbfc00000 -I/home/skuribay/devel/u-boot.git/include -fno-builtin -ffreestanding -nostdinc -isystem /home/skuribay/devel/buildroot/build_mips/staging_dir/usr/bin-ccache/../lib/gcc/mips-linux-uclibc/4.2.3/include -pipe -DCONFIG_MIPS -D__MIPS__ -G 0 -mabicalls -fpic -pipe -msoft-float -march=4kc -mtune=4kc -EB -Wall -Wstrict-prototypes -c -o ne2000.o ne2000.c
In file included from ne2000.c:118:
ne2000.h: In function 'pcnet_reset_8390':
ne2000.h:100: warning: implicit declaration of function 'n2k_outb'
ne2000.h:100: error: 'E8390_NODMA' undeclared (first use in this function)
ne2000.h:100: error: (Each undeclared identifier is reported only once
ne2000.h:100: error: for each function it appears in.)
ne2000.h:100: error: 'E8390_PAGE0' undeclared (first use in this function)
ne2000.h:100: error: 'E8390_STOP' undeclared (first use in this function)
ne2000.h:100: error: 'E8390_CMD' undeclared (first use in this function)
ne2000.h:102: error: 'E8390_PAGE1' undeclared (first use in this function)
ne2000.h:108: warning: implicit declaration of function 'n2k_inb'
ne2000.h:108: error: 'PCNET_RESET' undeclared (first use in this function)
ne2000.h:111: error: 'EN0_ISR' undeclared (first use in this function)
ne2000.h:111: error: 'ENISR_RESET' undeclared (first use in this function)
ne2000.h: In function 'get_prom':
ne2000.h:129: error: 'E8390_NODMA' undeclared (first use in this function)
ne2000.h:129: error: 'E8390_PAGE0' undeclared (first use in this function)
ne2000.h:129: error: 'E8390_STOP' undeclared (first use in this function)
ne2000.h:129: error: 'E8390_CMD' undeclared (first use in this function)
ne2000.h:130: error: 'EN0_DCFG' undeclared (first use in this function)
ne2000.h:131: error: 'EN0_RCNTLO' undeclared (first use in this function)
ne2000.h:132: error: 'EN0_RCNTHI' undeclared (first use in this function)
ne2000.h:133: error: 'EN0_IMR' undeclared (first use in this function)
ne2000.h:134: error: 'EN0_ISR' undeclared (first use in this function)
ne2000.h:135: error: 'E8390_RXOFF' undeclared (first use in this function)
ne2000.h:135: error: 'EN0_RXCR' undeclared (first use in this function)
ne2000.h:136: error: 'E8390_TXOFF' undeclared (first use in this function)
ne2000.h:136: error: 'EN0_TXCR' undeclared (first use in this function)
ne2000.h:139: error: 'EN0_RSARLO' undeclared (first use in this function)
ne2000.h:140: error: 'EN0_RSARHI' undeclared (first use in this function)
ne2000.h:141: error: 'E8390_RREAD' undeclared (first use in this function)
ne2000.h:141: error: 'E8390_START' undeclared (first use in this function)
ne2000.h:155: error: 'PCNET_DATAPORT' undeclared (first use in this function)
ne2000.h:159: error: 'NR_INFO' undeclared (first use in this function)
ne2000.h:159: warning: comparison between pointer and integer
ne2000.h:160: error: 'hw_info' undeclared (first use in this function)
ne2000.h:160: error: 'struct <anonymous>' has no member named '$4'
ne2000.h:160: warning: comparison between pointer and integer
ne2000.h:161: error: 'struct <anonymous>' has no member named '$5'
ne2000.h:161: warning: comparison between pointer and integer
ne2000.h:162: error: 'struct <anonymous>' has no member named '$6'
ne2000.h:162: warning: comparison between pointer and integer
ne2000.h:167: warning: comparison between pointer and integer
ne2000.h:175: warning: comparison between pointer and integer
ne2000.h:177: warning: return makes integer from pointer without a cast
ne2000.c: In function 'dp83902a_init':
ne2000.c:140: error: 'i' undeclared (first use in this function)
ne2000.c:140: warning: comparison between pointer and integer
ne2000.c:140: error: lvalue required as increment operand
ne2000.c:141: error: array subscript is not an integer
ne2000.c:141: error: invalid operands to binary +
ne2000.c:141: warning: statement with no effect
ne2000.c: In function 'eth_init':
ne2000.c:793: warning: assignment makes pointer from integer without a cast
ne2000.c:806: error: 'START_PG2' undeclared (first use in this function)
ne2000.c:806: warning: assignment makes integer from pointer without a cast
make[1]: *** [ne2000.o] Error 1
<-- snip -->
Git bisect has picked up the following commit:
----------------------------------------------------------------
commit e710185aae90c64d39c2d453e40e58ceefe4f250
Author: goda.yusuke <goda.yusuke@renesas.com>
Date: Wed Mar 5 17:08:20 2008 +0900
net: Divided code of NE2000 ethernet driver
There are more devices of the NE2000 base.
A present code is difficult for us to support more devices.
To support more NE2000 clone devices, separated the function.
Signed-off-by: Yusuke Goda <goda.yusuke@renesas.com>
Acked-by: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
----------------------------------------------------------------
I tried to fix the problem, but tha patch is a little complicated.
Thanks,
Shinya
^ permalink raw reply [flat|nested] 6+ messages in thread* [U-Boot-Users] ne2000 compile error 2008-04-09 14:29 [U-Boot-Users] ne2000 compile error Shinya Kuribayashi @ 2008-04-11 14:57 ` Vlad Lungu 2008-04-12 5:00 ` [U-Boot-Users] [PATCH] NE2000: Fix regresssion introduced by e710185aae90 on non AX88796 Jean-Christophe PLAGNIOL-VILLARD 2008-04-20 6:36 ` [U-Boot-Users] ne2000 compile error Wolfgang Denk 0 siblings, 2 replies; 6+ messages in thread From: Vlad Lungu @ 2008-04-11 14:57 UTC (permalink / raw) To: u-boot Shinya Kuribayashi wrote: [BIG SNIP] > Git bisect has picked up the following commit: > > ---------------------------------------------------------------- > commit e710185aae90c64d39c2d453e40e58ceefe4f250 > Author: goda.yusuke <goda.yusuke@renesas.com> > Date: Wed Mar 5 17:08:20 2008 +0900 > > net: Divided code of NE2000 ethernet driver > > There are more devices of the NE2000 base. > A present code is difficult for us to support more devices. > To support more NE2000 clone devices, separated the function. > > Signed-off-by: Yusuke Goda <goda.yusuke@renesas.com> > Acked-by: Nobuhiro Iwamatsu <iwamatsu@nigauri.org> > > ---------------------------------------------------------------- > > I tried to fix the problem, but tha patch is a little complicated. > Fixed it for now. #ifndef CONFIG_DRIVER_AX88796 could be replaced with something a little more generic like a CFG_CUSTOM_GET_PROM_NE2000 or something. Or the code could be implemented in a .c file and the generic get_prom() could be made weak. I think that implementing non-static, non-inlined functions in header files is bad style. Breaking existing code in the process is even worse. Vlad Signed-off-by: Vlad Lungu <vlad@comsys.ro> --- drivers/net/ax88796.h | 4 +- drivers/net/ne2000.c | 91 +++++++++++++++++++++++++++++++++++++++++++++ drivers/net/ne2000.h | 86 +------------------------------------------ drivers/net/ne2000_base.h | 2 +- 4 files changed, 95 insertions(+), 88 deletions(-) diff --git a/drivers/net/ax88796.h b/drivers/net/ax88796.h index 069ae80..4262648 100644 --- a/drivers/net/ax88796.h +++ b/drivers/net/ax88796.h @@ -202,7 +202,7 @@ static void ax88796_mac_read(u8 *buff) } } -int get_prom(u8* mac_addr) +hw_info_t * get_prom(u8* mac_addr) { u8 prom[32]; int i; @@ -211,7 +211,7 @@ int get_prom(u8* mac_addr) for (i = 0; i < 6; i++){ mac_addr[i] = prom[i]; } - return 1; + return (void *)1; } #endif /* __DRIVERS_AX88796L_H__ */ diff --git a/drivers/net/ne2000.c b/drivers/net/ne2000.c index 99baeea..aad27dc 100644 --- a/drivers/net/ne2000.c +++ b/drivers/net/ne2000.c @@ -125,6 +125,9 @@ dp83902a_init(void) dp83902a_priv_data_t *dp = &nic; u8* base; +#if defined(NE2000_BASIC_INIT) + int i; +#endif DEBUG_FUNCTION(); base = dp->base; @@ -738,6 +741,94 @@ 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 */ +#ifndef CONFIG_DRIVER_AX88796L +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 */ + +hw_info_t * 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) ? hw_info+i : &default_info; + } + return NULL; +} +#endif + u32 nic_base; /* U-boot specific routines */ diff --git a/drivers/net/ne2000.h b/drivers/net/ne2000.h index d324a00..4a540c7 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 @@ -91,89 +92,4 @@ are GPL, so this is, of course, GPL. #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@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 1badf62..18dc5fe 100644 --- a/drivers/net/ne2000_base.h +++ b/drivers/net/ne2000_base.h @@ -120,7 +120,7 @@ typedef struct dp83902a_priv_data { ------------------------------------------------------------------------ Some forward declarations */ -int get_prom( u8* mac_addr); +hw_info_t * get_prom( u8* mac_addr); static void dp83902a_poll(void); /* ------------------------------------------------------------------------ */ -- 1.5.4 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [U-Boot-Users] [PATCH] NE2000: Fix regresssion introduced by e710185aae90 on non AX88796 2008-04-11 14:57 ` Vlad Lungu @ 2008-04-12 5:00 ` Jean-Christophe PLAGNIOL-VILLARD 2008-04-15 3:47 ` Ben Warren 2008-04-20 6:36 ` Wolfgang Denk 2008-04-20 6:36 ` [U-Boot-Users] ne2000 compile error Wolfgang Denk 1 sibling, 2 replies; 6+ messages in thread From: Jean-Christophe PLAGNIOL-VILLARD @ 2008-04-12 5:00 UTC (permalink / raw) To: u-boot Move non-inlied functions into specific drivers file Set get_prom as weak Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> Signed-off-by: Vlad Lungu <vlad@comsys.ro> diff --git a/drivers/net/Makefile b/drivers/net/Makefile index eafd267..99e068b 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 0000000..7e3e3bb --- /dev/null +++ b/drivers/net/ax88796.c @@ -0,0 +1,155 @@ +/* + * (c) 2008 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> + * (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, 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 069ae80..aa342cb 100644 --- a/drivers/net/ax88796.h +++ b/drivers/net/ax88796.h @@ -79,139 +79,5 @@ #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 99baeea..fc2ae5c 100644 --- a/drivers/net/ne2000.c +++ b/drivers/net/ne2000.c @@ -124,6 +124,9 @@ dp83902a_init(void) { dp83902a_priv_data_t *dp = &nic; u8* base; +#if defined(NE2000_BASIC_INIT) + int i; +#endif DEBUG_FUNCTION(); @@ -729,8 +732,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 @@ -738,6 +739,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 */ @@ -764,7 +852,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 d324a00..0b21612 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@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 1badf62..d8768e8 100644 --- a/drivers/net/ne2000_base.h +++ b/drivers/net/ne2000_base.h @@ -120,7 +120,6 @@ typedef struct dp83902a_priv_data { ------------------------------------------------------------------------ Some forward declarations */ -int get_prom( u8* mac_addr); static void dp83902a_poll(void); /* ------------------------------------------------------------------------ */ -- 1.5.4.5 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [U-Boot-Users] [PATCH] NE2000: Fix regresssion introduced by e710185aae90 on non AX88796 2008-04-12 5:00 ` [U-Boot-Users] [PATCH] NE2000: Fix regresssion introduced by e710185aae90 on non AX88796 Jean-Christophe PLAGNIOL-VILLARD @ 2008-04-15 3:47 ` Ben Warren 2008-04-20 6:36 ` Wolfgang Denk 1 sibling, 0 replies; 6+ messages in thread From: Ben Warren @ 2008-04-15 3:47 UTC (permalink / raw) To: u-boot On Sat, Apr 12, 2008 at 1:00 AM, Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> wrote: > Move non-inlied functions into specific drivers file > Set get_prom as weak > > Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> > Signed-off-by: Vlad Lungu <vlad@comsys.ro> > > diff --git a/drivers/net/Makefile b/drivers/net/Makefile > index eafd267..99e068b 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 0000000..7e3e3bb > --- /dev/null > +++ b/drivers/net/ax88796.c > @@ -0,0 +1,155 @@ > +/* > + * (c) 2008 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> > + * (c) 2007 Nobuhiro Iwamatsu <iwamatsu@nigauri.org> > + * Your work is appreciated, but moving code to a different file doesn't entitle you to copyright. regards, Ben ^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot-Users] [PATCH] NE2000: Fix regresssion introduced by e710185aae90 on non AX88796 2008-04-12 5:00 ` [U-Boot-Users] [PATCH] NE2000: Fix regresssion introduced by e710185aae90 on non AX88796 Jean-Christophe PLAGNIOL-VILLARD 2008-04-15 3:47 ` Ben Warren @ 2008-04-20 6:36 ` Wolfgang Denk 1 sibling, 0 replies; 6+ messages in thread From: Wolfgang Denk @ 2008-04-20 6:36 UTC (permalink / raw) To: u-boot In message <1207976419-6571-1-git-send-email-plagnioj@jcrosoft.com> you wrote: > Move non-inlied functions into specific drivers file > Set get_prom as weak > > Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> > Signed-off-by: Vlad Lungu <vlad@comsys.ro> Are you planning to fix and resubmit the patch according to Ben's comment? Best regards, Wolfgang Denk -- DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de "Here's a fish hangs in the net like a poor man's right in the law. 'Twill hardly come out." - Shakespeare, Pericles, Act II, Scene 1 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot-Users] ne2000 compile error 2008-04-11 14:57 ` Vlad Lungu 2008-04-12 5:00 ` [U-Boot-Users] [PATCH] NE2000: Fix regresssion introduced by e710185aae90 on non AX88796 Jean-Christophe PLAGNIOL-VILLARD @ 2008-04-20 6:36 ` Wolfgang Denk 1 sibling, 0 replies; 6+ messages in thread From: Wolfgang Denk @ 2008-04-20 6:36 UTC (permalink / raw) To: u-boot In message <47FF7C44.6040600@comsys.ro> you wrote: > > Fixed it for now. #ifndef CONFIG_DRIVER_AX88796 could be replaced with > something a little more generic > like a CFG_CUSTOM_GET_PROM_NE2000 or something. Or the code could be > implemented in a .c file and the > generic get_prom() could be made weak. I think that implementing > non-static, non-inlined functions in header files > is bad style. Breaking existing code in the process is even worse. Unfortunately your patch is line wrapped and thus unusable. Please fix your mailer setup and resubmit. I really recommend to use git tools to send the messages. > --- a/drivers/net/ne2000.c > +++ b/drivers/net/ne2000.c > @@ -125,6 +125,9 @@ dp83902a_init(void) > dp83902a_priv_data_t *dp = &nic; > u8* base; > > +#if defined(NE2000_BASIC_INIT) > + int i; > +#endif > DEBUG_FUNCTION(); > > base = dp->base; > @@ -738,6 +741,94 @@ u8 dev_addr[6]; > #define PCNET_RESET 0x1f /* Issue a read to reset, a write to > clear. */ ^^^^^^^^^^^^^^^^^^^^ Here > #define PCNET_MISC 0x18 /* For IBM CCAE and Socket EA cards */ > > +#ifndef CONFIG_DRIVER_AX88796L > +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)); ^^^^^^^^^^^^^^^^^^^^ Here > + 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)); ^^^^^^^^^^^^^^^^^^^^ Here > + 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)); ^^^^^^^^^^^^^^^^^^^^ Here And so on... Best regards, Wolfgang Denk -- DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de "The combination of a number of things to make existence worthwhile." "Yes, the philosophy of 'none,' meaning 'all.'" -- Spock and Lincoln, "The Savage Curtain", stardate 5906.4 ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2008-04-20 6:36 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-04-09 14:29 [U-Boot-Users] ne2000 compile error Shinya Kuribayashi 2008-04-11 14:57 ` Vlad Lungu 2008-04-12 5:00 ` [U-Boot-Users] [PATCH] NE2000: Fix regresssion introduced by e710185aae90 on non AX88796 Jean-Christophe PLAGNIOL-VILLARD 2008-04-15 3:47 ` Ben Warren 2008-04-20 6:36 ` Wolfgang Denk 2008-04-20 6:36 ` [U-Boot-Users] ne2000 compile error Wolfgang Denk
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox