* [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 an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.