[U-Boot-Users] ne2000 compile error

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

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

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

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

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

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
participants (5)
-
Ben Warren
-
Jean-Christophe PLAGNIOL-VILLARD
-
Shinya Kuribayashi
-
Vlad Lungu
-
Wolfgang Denk