[U-Boot] [PATCH] ne2000: Fix broken build of three boards after CONFIG_NET_MULTI drop
Bernhard Kaindl
bernhard.kaindl at gmx.net
Sun Oct 16 20:12:57 CEST 2011
ne2000 wasn't converted to CONFIG_NET_MULTI when the non-multi support was
dropped, so boards using it (qemu-mips, shmin, r7780mp) failed to compile
for multiple definition of eth_rx() and friends due to old ne2000_base.c.
Changes:
In drivers/net/ne2000_base.c:
- Convert the driver to use a new probe function which calls eth_register():
- move probing / MAC addr code from eth_init to new ne2000_initialize()
- cleanup the moved code to use eth_setenv_enetaddr()
- Rename eth_init, eth_rx, eth_send and eth_halt to ne2k_* and use new calls
qemu-mips, shmin, r7780mp:
- Call the new ne2000_initialize() from board_eth_init() of the boards.
Cleanups in drivers/net/ne2000_base.c:
- Use NE2000_RX_BUFFER_SIZE, defined to 2000 instead of a 2000 size constant.
- dp83902a_init():
- Remove check for dp->base (nic.base): It is always assinged in probe func
- Extend #ifdef NE2000_BASIC_INIT to whole function: The function does not
have any useful code if NE2000_BASIC_INIT is not defined anymore.
- Change printf of ESA MAC to debug PRINTK: Was always overridden(= not used)
- In case somebody wants to use the ESA mac, add ifdef'ed memcpy to use it.
- Fix gcc warnings in two debug printf calls
- Tested using qemu-mips board,
- Tested the two renesas / sh boards r7780mp and shmin to compile again,
and should work.
Signed-off-by: Bernhard Kaindl <bernhard.kaindl at gmx.net>
---
board/qemu-mips/qemu-mips.c | 6 ++
board/renesas/r7780mp/r7780mp.c | 3 +-
board/shmin/shmin.c | 5 ++
drivers/net/ne2000_base.c | 135 +++++++++++++++++++--------------------
include/netdev.h | 1 +
5 files changed, 81 insertions(+), 69 deletions(-)
diff --git a/board/qemu-mips/qemu-mips.c b/board/qemu-mips/qemu-mips.c
index 7a69a00..e0372a6 100644
--- a/board/qemu-mips/qemu-mips.c
+++ b/board/qemu-mips/qemu-mips.c
@@ -87,3 +87,8 @@ int misc_init_r(void)
set_io_port_base(0);
return 0;
}
+
+int board_eth_init(bd_t *bis)
+{
+ return ne2000_initialize();
+}
diff --git a/board/renesas/r7780mp/r7780mp.c b/board/renesas/r7780mp/r7780mp.c
index 0b80099..004c67e 100644
--- a/board/renesas/r7780mp/r7780mp.c
+++ b/board/renesas/r7780mp/r7780mp.c
@@ -81,5 +81,6 @@ void pci_init_board(void)
int board_eth_init(bd_t *bis)
{
- return pci_eth_init(bis);
+ /* return >= 0 if a chip is found, the board's AX88796L is n2k-based */
+ return ne2000_initialize() + pci_eth_init(bis);
}
diff --git a/board/shmin/shmin.c b/board/shmin/shmin.c
index 8742f10..9292af4 100644
--- a/board/shmin/shmin.c
+++ b/board/shmin/shmin.c
@@ -55,6 +55,11 @@ int dram_init(void)
return 0;
}
+int board_eth_init(bd_t *bis)
+{
+ return ne2000_initialize();
+}
+
void led_set_state(unsigned short value)
{
diff --git a/drivers/net/ne2000_base.c b/drivers/net/ne2000_base.c
index f93f932..eeda1c4 100644
--- a/drivers/net/ne2000_base.c
+++ b/drivers/net/ne2000_base.c
@@ -85,6 +85,8 @@ void uboot_push_tx_done(int key, int val);
/* NE2000 base header file */
#include "ne2000_base.h"
+#define NE2000_RX_BUFFER_SIZE 2000
+
#if defined(CONFIG_DRIVER_AX88796L)
/* AX88796L support */
#include "ax88796.h"
@@ -96,23 +98,15 @@ void uboot_push_tx_done(int key, int val);
static dp83902a_priv_data_t nic; /* just one instance of the card supported */
static bool
-dp83902a_init(void)
+dp83902a_init(struct eth_device *dev)
{
+#if defined(NE2000_BASIC_INIT)
dp83902a_priv_data_t *dp = &nic;
u8* base;
-#if defined(NE2000_BASIC_INIT)
int i;
-#endif
-
- DEBUG_FUNCTION();
base = dp->base;
- if (!base)
- return false; /* No device found */
-
- DEBUG_LINE();
-#if defined(NE2000_BASIC_INIT)
/* AX88796L doesn't need */
/* Prepare ESA */
DP_OUT(base, DP_CR, DP_CR_NODMA | DP_CR_PAGE1); /* Select page 1 */
@@ -121,7 +115,7 @@ dp83902a_init(void)
DP_IN(base, DP_P1_PAR0+i, dp->esa[i]);
DP_OUT(base, DP_CR, DP_CR_NODMA | DP_CR_PAGE0); /* Select page 0 */
- printf("NE2000 - %s ESA: %02x:%02x:%02x:%02x:%02x:%02x\n",
+ PRINTK("NE2000 - %s ESA: %02x:%02x:%02x:%02x:%02x:%02x\n",
"eeprom",
dp->esa[0],
dp->esa[1],
@@ -129,6 +123,9 @@ dp83902a_init(void)
dp->esa[3],
dp->esa[4],
dp->esa[5] );
+#ifdef NE2000_USE_MAC_FROM_SERIAL_EEPROM /* Define this to use it actually */
+ memcpy(dev->enetaddr, dp->esa, 6);
+#endif
#endif /* NE2000_BASIC_INIT */
return true;
@@ -301,7 +298,7 @@ dp83902a_send(u8 *data, int total_len, u32 key)
/* Put data into buffer */
#if DEBUG & 4
- printf(" sg buf %08lx len %08x\n ", (u32)data, len);
+ printf(" sg buf %08x len %08x\n ", (u32)data, len);
dx = 0;
#endif
while (len > 0) {
@@ -469,7 +466,7 @@ dp83902a_recv(u8 *data, int len)
if (data) {
mlen = len;
#if DEBUG & 4
- printf(" sg buf %08lx len %08x \n", (u32) data, mlen);
+ printf(" sg buf %08x len %08x\n", (u32) data, mlen);
dx = 0;
#endif
while (0 < mlen) {
@@ -651,7 +648,7 @@ static int initialized = 0;
void uboot_push_packet_len(int len) {
PRINTK("pushed len = %d\n", len);
- if (len >= 2000) {
+ if (len >= NE2000_RX_BUFFER_SIZE) {
printf("NE2000: packet too big\n");
return;
}
@@ -666,76 +663,33 @@ void uboot_push_tx_done(int key, int val) {
pkey = key;
}
-int eth_init(bd_t *bd) {
- int r;
- u8 dev_addr[6];
- char ethaddr[20];
-
- PRINTK("### eth_init\n");
-
- if (!pbuf) {
- pbuf = malloc(2000);
- if (!pbuf) {
- printf("Cannot allocate rx buffer\n");
- return -1;
- }
- }
-
-#ifdef CONFIG_DRIVER_NE2000_CCR
- {
- vu_char *p = (vu_char *) CONFIG_DRIVER_NE2000_CCR;
-
- PRINTK("CCR before is %x\n", *p);
- *p = CONFIG_DRIVER_NE2000_VAL;
- PRINTK("CCR after is %x\n", *p);
- }
-#endif
-
- nic.base = (u8 *) CONFIG_DRIVER_NE2000_BASE;
-
- r = get_prom(dev_addr, nic.base);
- if (!r)
- return -1;
-
- sprintf (ethaddr, "%02X:%02X:%02X:%02X:%02X:%02X",
- dev_addr[0], dev_addr[1],
- dev_addr[2], dev_addr[3],
- dev_addr[4], dev_addr[5]) ;
- PRINTK("Set environment from HW MAC addr = \"%s\"\n", ethaddr);
- setenv ("ethaddr", ethaddr);
-
- nic.data = nic.base + DP_DATA;
- nic.tx_buf1 = START_PG;
- nic.tx_buf2 = START_PG2;
- nic.rx_buf_start = RX_START;
- nic.rx_buf_end = RX_END;
-
- if (dp83902a_init() == false)
- return -1;
-
- dp83902a_start(dev_addr);
+static int ne2k_init(struct eth_device *dev, bd_t *bd)
+{
+ dp83902a_start(dev->enetaddr);
initialized = 1;
return 0;
}
-void eth_halt() {
-
- PRINTK("### eth_halt\n");
+static void ne2k_halt(struct eth_device *dev)
+{
+ debug("### ne2k_halt\n");
if(initialized)
dp83902a_stop();
initialized = 0;
}
-int eth_rx() {
+static int ne2k_recv(struct eth_device *dev)
+{
dp83902a_poll();
return 1;
}
-int eth_send(volatile void *packet, int length) {
+static int ne2k_send(struct eth_device *dev, volatile void *packet, int length)
+{
int tmo;
- PRINTK("### eth_send\n");
+ debug("### ne2k_send\n");
pkey = -1;
@@ -755,3 +709,48 @@ int eth_send(volatile void *packet, int length) {
}
return 0;
}
+
+int ne2000_initialize(void)
+{
+ struct eth_device *dev;
+
+ nic.base = (u8 *) CONFIG_DRIVER_NE2000_BASE;
+ nic.data = nic.base + DP_DATA;
+ nic.tx_buf1 = START_PG;
+ nic.tx_buf2 = START_PG2;
+ nic.rx_buf_start = RX_START;
+ nic.rx_buf_end = RX_END;
+
+ dev = calloc(sizeof(*dev), 1);
+ pbuf = malloc(NE2000_RX_BUFFER_SIZE);
+
+ if (dev == NULL || pbuf == NULL)
+ return -1;
+
+ if (!get_prom(dev->enetaddr, nic.base))
+ return -1;
+
+ dp83902a_init(dev);
+
+ eth_setenv_enetaddr("ethaddr", dev->enetaddr);
+
+ /* For PCMCIA support: See doc/README.ne2000 on how to enable */
+#ifdef CONFIG_DRIVER_NE2000_CCR
+ {
+ vu_char *p = (vu_char *) CONFIG_DRIVER_NE2000_CCR;
+
+ PRINTK("CCR before is %x\n", *p);
+ *p = CONFIG_DRIVER_NE2000_VAL;
+ PRINTK("CCR after is %x\n", *p);
+ }
+#endif
+
+ dev->init = ne2k_init;
+ dev->halt = ne2k_halt;
+ dev->send = ne2k_send;
+ dev->recv = ne2k_recv;
+
+ sprintf(dev->name, "NE2000");
+
+ return eth_register(dev);
+}
diff --git a/include/netdev.h b/include/netdev.h
index 480453e..d13a5e2 100644
--- a/include/netdev.h
+++ b/include/netdev.h
@@ -79,6 +79,7 @@ int mpc8220_fec_initialize(bd_t *bis);
int mpc82xx_scc_enet_initialize(bd_t *bis);
int mvgbe_initialize(bd_t *bis);
int natsemi_initialize(bd_t *bis);
+int ne2000_initialize();
int npe_initialize(bd_t *bis);
int ns8382x_initialize(bd_t *bis);
int pcnet_initialize(bd_t *bis);
--
1.7.3.4
More information about the U-Boot
mailing list