Skip to contentSkip to conversation

ne2000 compile error

U-Boot-Users New Shinya Kuribayashi 5 participants 6 messages Apr 9, 2008 – Apr 20, 2008 Network drivers

lore
Share & tools
lore

Shinya Kuribayashi

author Acked-by Nobuhiro Iwamatsu
#0 lore raw

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 <[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

#1 lore raw

Shinya Kuribayashi wrote:
[BIG SNIP]

Quoted 13 lines

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.

Quoted 7 lines

----------------------------------------------------------------

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
index 069ae80..4262648 100644
@@ -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
index 99baeea..aad27dc 100644
@@ -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
index d324a00..4a540c7 100644
@@ -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
index 1badf62..18dc5fe 100644
@@ -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
#2 lore raw

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
index eafd267..99e068b 100644
@@ -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
index 1badf62..d8768e8 100644
@@ -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
#3 lore raw

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
Set get_prom as weak

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

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

#4 lore raw

PATCH 1/1 NE2000: Fix regresssion introduced by e710185aae90 on non AX88796

In reply to Jean-Christophe PLAGNIOL-VILLARD
Quoted 5 lines · In message <[email protected]> you wrote:

Move non-inlied functions into specific drivers file Set get_prom as weak

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
#5 lore raw
In reply to Vlad Lungu
Quoted 8 lines · In message <[email protected]> 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.

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_MISC 0x18 /* 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