From: Vlad Lungu <vlad@comsys.ro>
To: u-boot@lists.denx.de
Subject: [U-Boot-Users] ne2000 compile error
Date: Fri, 11 Apr 2008 17:57:08 +0300 [thread overview]
Message-ID: <47FF7C44.6040600@comsys.ro> (raw)
In-Reply-To: <47FCD2C1.6020101@ruby.dti.ne.jp>
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
next prev parent reply other threads:[~2008-04-11 14:57 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-09 14:29 [U-Boot-Users] ne2000 compile error Shinya Kuribayashi
2008-04-11 14:57 ` Vlad Lungu [this message]
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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=47FF7C44.6040600@comsys.ro \
--to=vlad@comsys.ro \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.