ne2000 compile error
Shinya Kuribayashi
Acked-by Nobuhiro IwamatsuI'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 effectne2000.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 <[email protected]> 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.
----------------------------------------------------------------
I tried to fix the problem, but tha patch is a little complicated.
Thanks,
Shinya
Shinya Kuribayashi wrote:
[BIG SNIP]
Quoted 13 lines
Git bisect has picked up the following commit:
----------------------------------------------------------------
commite710185aae90c64d39c2d453e40e58ceefe4f250Author: goda.yusuke <[email protected]> Date: Wed Mar 5 17:08:20 2008 +0900net: 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.
Quoted 7 lines
Signed-off-by Yusuke Goda <[email protected]>----------------------------------------------------------------
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
--- 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(-)
drivers/net/ax88796.h +2 -2
@@ -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__ */
drivers/net/ne2000.c +3 -0
@@ -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 */
drivers/net/ne2000.h +1 -8
@@ -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__ */
drivers/net/ne2000_base.h +1 -1
@@ -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 );/*
------------------------------------------------------------------------ */
Signature · 1 line
1.5.4
PATCH 1/1 NE2000: Fix regresssion introduced by e710185aae90 on non AX88796
Move non-inlied functions into specific drivers file Set get_prom as weak
drivers/net/Makefile +4 -1
@@ -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
drivers/net/ax88796.c new file +155 -0
155 lines not on this page · raw message
drivers/net/ax88796.h +0 -134
139 lines not on this page · raw message
drivers/net/ne2000.c +91 -3
118 lines not on this page · raw message
drivers/net/ne2000.h +1 -86
97 lines not on this page · raw message
drivers/net/ne2000_base.h +0 -1
@@ -120,7 +120,6 @@ typedef struct dp83902a_priv_data {------------------------------------------------------------------------ Some forward declarations */ -int get_prom (u8 * mac_addr);static void dp83902a_poll (void );/* ------------------------------------------------------------------------ */
Signature · 1 line
1.5.4.5
PATCH 1/1 NE2000: Fix regresssion introduced by e710185aae90 on non AX88796
Quoted 24 lines · Jean-Christophe PLAGNIOL-VILLARD
Move non-inlied functions into specific drivers file
Setget_promas weakSigned-off-by Jean-Christophe PLAGNIOL-VILLARD <[email protected]>Signed-off-by Vlad Lungu <[email protected]>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 --gita/drivers/net/ax88796.cb/drivers/net/ax88796.cnew file mode 100644
Quoted 8 lines
index 0000000..7e3e3bb
---/dev/null
+++b/drivers/net/ax88796.c
@@ -0,0 +1,155 @@
+/*
+ * (c) 2008 Jean-Christophe PLAGNIOL-VILLARD <[email protected]>
+ * (c) 2007 Nobuhiro Iwamatsu <[email protected]>
+ *
Your work is appreciated, but moving code to a different file doesn't entitle you to copyright.
regards,
Ben
Quoted 8 lines · In message <[email protected]> you wrote:
Fixed it for now. #ifndef
CONFIG_DRIVER_AX88796could be replaced with something a little more generic
like aCFG_CUSTOM_GET_PROM_NE2000or something. Or the code could be implemented in a .c file and the
genericget_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.
Quoted 14 lines
drivers/net/ne2000.c +3
-0@@ -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
Quoted 1 line
clear. */
^^^^^^^^^^^^^^^^^^^^ Here
Quoted 11 lines
#define
PCNET_MISC0x18/* For IBM CCAE and Socket EA cards */drivers/net/ne2000.c +9
-0+#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,
Quoted 1 line
n2k_inb(E8390_CMD));
^^^^^^^^^^^^^^^^^^^^ Here
Quoted 3 lines
drivers/net/ne2000.c +2
-0+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
Quoted 3 lines
drivers/net/ne2000.c +2
-0+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
Signature · 6 lines
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
PATCH 1/1 NE2000: Fix regresssion introduced by e710185aae90 on non AX88796
In reply to Jean-Christophe PLAGNIOL-VILLARDQuoted 5 lines · In message <[email protected]> you wrote:
Move non-inlied functions into specific drivers file Set
get_promas weakSigned-off-by Jean-Christophe PLAGNIOL-VILLARD <[email protected]>Signed-off-by Vlad Lungu <[email protected]>
Are you planning to fix and resubmit the patch according to Ben's comment?
Best regards,
Wolfgang Denk
Signature · 5 lines
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