Skip to contentSkip to conversation

Convert CS8900 Ethernet driver to CONFIG_NET_MULTI API

PATCH Superseded Ben Warren 2 participants 6 messages Aug 13, 2009 – Aug 20, 2009 Network drivers

v2 of 4 Superseded Latest is v4 →

lore
Share & tools
lore

Ben Warren

author
#0 lore raw

PATCH v2 1/1 Convert CS8900 Ethernet driver to CONFIG_NET_MULTI API

All in-tree boards that use this controller have CONFIG_NET_MULTI added Also:
- changed CONFIG_DRIVER_CS8900 to CONFIG_CS8900
- changed CS8900_BASE to CONFIG_CS8900_BASE
- changed CS8900_BUS?? to CONFIG_CS8900_BUS??
- cleaned up line lengths
- modified VCMA9 command function that accesses the device
- removed MAC address initialization from lib_arm/board.c

---

v2: Fixed typo: CS8900_BUS32 -> CONFIG_CS8900_BUS32
Added more descriptive printf in cs8900_init as suggested by Wolfgang Initialize 'priv' data structure in cs8900_initialize()

 board/altera/dk1c20/dk1c20.c      |   12 ++
 board/altera/dk1s10/dk1s10.c      |   12 ++
 board/armadillo/armadillo.c       |   12 ++
 board/csb226/csb226.c             |   12 ++
 board/ep7312/ep7312.c             |   12 ++
 board/freescale/mx31ads/mx31ads.c |   12 ++
 board/impa7/impa7.c               |   12 ++
 board/lart/lart.c                 |   12 ++
 board/mpl/vcma9/cmd_vcma9.c       |   28 +++--
 board/mpl/vcma9/vcma9.c           |   12 ++
 board/mx1ads/mx1ads.c             |   12 ++
 board/samsung/smdk2400/smdk2400.c |   12 ++
 board/samsung/smdk2410/smdk2410.c |   12 ++
 board/samsung/smdk6400/smdk6400.c |   12 ++
 board/sbc2410x/sbc2410x.c         |   12 ++
 board/ssv/adnpesc1/adnpesc1.c     |   12 ++
 board/trab/trab.c                 |   12 ++
 drivers/net/Makefile              |    2 +-
 drivers/net/cs8900.c              |  262 +++++++++++++++++++++----------------
 drivers/net/cs8900.h              |   41 ++++---
 include/configs/ADNPESC1.h        |   14 +-
 include/configs/DK1C20.h          |   14 +-
 include/configs/DK1S10.h          |   14 +-
 include/configs/VCMA9.h           |    7 +-
 include/configs/armadillo.h       |    9 +-
 include/configs/csb226.h          |    7 +-
 include/configs/ep7312.h          |    9 +-
 include/configs/impa7.h           |    7 +-
 include/configs/lart.h            |    7 +-
 include/configs/mx1ads.h          |    7 +-
 include/configs/mx31ads.h         |    7 +-
 include/configs/sbc2410x.h        |    7 +-
 include/configs/smdk2400.h        |    7 +-
 include/configs/smdk2410.h        |    7 +-
 include/configs/smdk6400.h        |    7 +-
 include/configs/trab.h            |    7 +-
 include/netdev.h                  |    1 +
 lib_arm/board.c                   |    9 --
 38 files changed, 464 insertions(+), 208 deletions(-)
board/altera/dk1c20/dk1c20.c +12 -0
index 11c19b7..0bcaa4f 100644
@@ -25,6 +25,7 @@
  */
 
 #include <common.h>
+#include <netdev.h>
 #include <nios-io.h>
 #if	defined(CONFIG_SEVENSEG)
 #include "../common/sevenseg.h"
@@ -79,3 +80,14 @@ int ide_preinit (void)
 	return 0;
 }
 #endif
+
+#ifdef CONFIG_CMD_NET
+int board_eth_init(bd_t *bis)
+{
+	int rc = 0;
+#ifdef CONFIG_CS8900
+	rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
+#endif
+	return rc;
+}
+#endif
board/altera/dk1s10/dk1s10.c +12 -0
index 64d591e..fb96501 100644
@@ -22,6 +22,7 @@
  */
 
 #include <common.h>
+#include <netdev.h>
 #if	defined(CONFIG_SEVENSEG)
 #include "../common/sevenseg.h"
 #endif
@@ -58,3 +59,14 @@ phys_size_t initdram (int board_type)
 {
 	return (0);
 }
+
+#ifdef CONFIG_CMD_NET
+int board_eth_init(bd_t *bis)
+{
+	int rc = 0;
+#ifdef CONFIG_CS8900
+	rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
+#endif
+	return rc;
+}
+#endif
board/armadillo/armadillo.c +12 -0
index ca5bd1d..a825144 100644
@@ -26,6 +26,7 @@
  */
 
 #include <common.h>
+#include <netdev.h>
 #include <clps7111.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -58,3 +59,14 @@ int dram_init (void)
 
 	return (0);
 }
+
+#ifdef CONFIG_CMD_NET
+int board_eth_init(bd_t *bis)
+{
+	int rc = 0;
+#ifdef CONFIG_CS8900
+	rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
+#endif
+	return rc;
+}
+#endif
board/csb226/csb226.c +12 -0
index 80caf8b..0a6c13d 100644
@@ -24,6 +24,7 @@
  */
 
 #include <common.h>
+#include <netdev.h>
 #include <asm/arch/pxa-regs.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -151,3 +152,14 @@ void show_boot_progress (int status)
 
 	return;
 }
+
+#ifdef CONFIG_CMD_NET
+int board_eth_init(bd_t *bis)
+{
+	int rc = 0;
+#ifdef CONFIG_CS8900
+	rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
+#endif
+	return rc;
+}
+#endif
board/ep7312/ep7312.c +12 -0
index 6968a5d..8ed14ad 100644
@@ -23,6 +23,7 @@
  */
 
 #include <common.h>
+#include <netdev.h>
 #include <clps7111.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -52,3 +53,14 @@ int dram_init (void)
 
 	return (0);
 }
+
+#ifdef CONFIG_CMD_NET
+int board_eth_init(bd_t *bis)
+{
+	int rc = 0;
+#ifdef CONFIG_CS8900
+	rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
+#endif
+	return rc;
+}
+#endif
board/freescale/mx31ads/mx31ads.c +12 -0
index c24c47c..bc25c6d 100644
@@ -21,6 +21,7 @@
  */
 
 #include <common.h>
+#include <netdev.h>
 #include <asm/io.h>
 #include <asm/arch/mx31.h>
 #include <asm/arch/mx31-regs.h>
@@ -104,3 +105,14 @@ int checkboard (void)
 	printf("Board: MX31ADS\n");
 	return 0;
 }
+
+#ifdef CONFIG_CMD_NET
+int board_eth_init(bd_t *bis)
+{
+	int rc = 0;
+#ifdef CONFIG_CS8900
+	rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
+#endif
+	return rc;
+}
+#endif
board/impa7/impa7.c +12 -0
index 3230dd4..205b1b3 100644
@@ -23,6 +23,7 @@
  */
 
 #include <common.h>
+#include <netdev.h>
 #include <clps7111.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -57,3 +58,14 @@ int dram_init (void)
 
 	return (0);
 }
+
+#ifdef CONFIG_CMD_NET
+int board_eth_init(bd_t *bis)
+{
+	int rc = 0;
+#ifdef CONFIG_CS8900
+	rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
+#endif
+	return rc;
+}
+#endif
board/lart/lart.c +12 -0
index 8d534c8..a0b459f 100644
@@ -23,6 +23,7 @@
  */
 
 #include <common.h>
+#include <netdev.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -62,3 +63,14 @@ int dram_init (void)
 
 	return (0);
 }
+
+#ifdef CONFIG_CMD_NET
+int board_eth_init(bd_t *bis)
+{
+	int rc = 0;
+#ifdef CONFIG_CS8900
+	rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
+#endif
+	return rc;
+}
+#endif
board/mpl/vcma9/cmd_vcma9.c +18 -10
index 0160774..0ee9595 100644
@@ -31,7 +31,7 @@
 #include "vcma9.h"
 #include "../common/common_util.h"
 
-#if defined(CONFIG_DRIVER_CS8900)
+#if defined(CONFIG_CS8900)
 #include <../drivers/net/cs8900.h>
 
 static uchar cs8900_chksum(ushort data)
@@ -56,25 +56,33 @@ extern int do_mplcommon(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
 
 int do_vcma9(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 {
+	struct eth_device *dev;
+	char cs8900_name[10];
 	if (strcmp(argv[1], "info") == 0)
 	{
 		print_vcma9_info();
 		return 0;
 	}
-#if defined(CONFIG_DRIVER_CS8900)
+#if defined(CONFIG_CS8900)
 	if (strcmp(argv[1], "cs8900") == 0) {
+		sprintf(cs8900_name, "%s-0", CS8900_DRIVERNAME);
+		dev = eth_get_dev_by_name(cs8900_name);
+		if (!dev) {
+			printf("Couldn't find CS8900 driver");
+			return 0;
+		}
 		if (strcmp(argv[2], "read") == 0) {
 			uchar addr; ushort data;
 
 			addr = simple_strtoul(argv[3], NULL, 16);
-			cs8900_e2prom_read(addr, &data);
+			cs8900_e2prom_read(dev, addr, &data);
 			printf("0x%2.2X: 0x%4.4X\n", addr, data);
 		} else if (strcmp(argv[2], "write") == 0) {
 			uchar addr; ushort data;
 
 			addr = simple_strtoul(argv[3], NULL, 16);
 			data = simple_strtoul(argv[4], NULL, 16);
-			cs8900_e2prom_write(addr, data);
+			cs8900_e2prom_write(dev, addr, data);
 		} else if (strcmp(argv[2], "setaddr") == 0) {
 			uchar addr, i, csum; ushort data;
 			uchar ethaddr[6];
@@ -83,22 +91,22 @@ int do_vcma9(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 			if (eth_getenv_enetaddr("ethaddr", ethaddr)) {
 				addr = 1;
 				data = 0x2158;
-				cs8900_e2prom_write(addr, data);
+				cs8900_e2prom_write(dev, addr, data);
 				csum = cs8900_chksum(data);
 				addr++;
 				for (i = 0; i < 6; i+=2) {
 					data = ethaddr[i+1] << 8 |
 					       ethaddr[i];
-					cs8900_e2prom_write(addr, data);
+					cs8900_e2prom_write(dev, addr, data);
 					csum += cs8900_chksum(data);
 					addr++;
 				}
 				/* calculate header link byte */
 				data = 0xA100 | (addr * 2);
-				cs8900_e2prom_write(0, data);
+				cs8900_e2prom_write(dev, 0, data);
 				csum += cs8900_chksum(data);
 				/* write checksum word */
-				cs8900_e2prom_write(addr, (0 - csum) << 8);
+				cs8900_e2prom_write(dev, addr, (0 - csum) << 8);
 			} else {
 				puts("\nplease defined 'ethaddr'\n");
 			}
@@ -106,12 +114,12 @@ int do_vcma9(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 			uchar addr = 0, endaddr, csum; ushort data;
 
 			puts("Dump of CS8900 config device: ");
-			cs8900_e2prom_read(addr, &data);
+			cs8900_e2prom_read(dev, addr, &data);
 			if ((data & 0xE000) == 0xA000) {
 				endaddr = (data & 0x00FF) / 2;
 				csum = cs8900_chksum(data);
 				for (addr = 1; addr <= endaddr; addr++) {
-					cs8900_e2prom_read(addr, &data);
+					cs8900_e2prom_read(dev, addr, &data);
 					printf("\n0x%2.2X: 0x%4.4X", addr, data);
 					csum += cs8900_chksum(data);
 				}
board/mpl/vcma9/vcma9.c +12 -0
index 2b3fad2..3216d63 100644
@@ -26,6 +26,7 @@
  */
 
 #include <common.h>
+#include <netdev.h>
 #include <s3c2410.h>
 #include <stdio_dev.h>
 #include <i2c.h>
@@ -349,3 +350,14 @@ void print_vcma9_info(void)
 		Show_VCMA9_Info(s, &s[6]);
 	}
 }
+
+#ifdef CONFIG_CMD_NET
+int board_eth_init(bd_t *bis)
+{
+	int rc = 0;
+#ifdef CONFIG_CS8900
+	rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
+#endif
+	return rc;
+}
+#endif
board/mx1ads/mx1ads.c +12 -0
index ba152e2..f8ce210 100644
@@ -24,6 +24,7 @@
  */
 
 #include <common.h>
+#include <netdev.h>
 /*#include <mc9328.h>*/
 #include <asm/arch/imx-regs.h>
 
@@ -167,3 +168,14 @@ int dram_init (void)
 
 	return 0;
 }
+
+#ifdef CONFIG_CMD_NET
+int board_eth_init(bd_t *bis)
+{
+	int rc = 0;
+#ifdef CONFIG_CS8900
+	rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
+#endif
+	return rc;
+}
+#endif
board/samsung/smdk2400/smdk2400.c +12 -0
index 0b82070..2c47063 100644
@@ -26,6 +26,7 @@
  */
 
 #include <common.h>
+#include <netdev.h>
 #include <s3c2400.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -110,3 +111,14 @@ static int key_pressed(void)
 	return rc;
 }
 #endif	/* CONFIG_MODEM_SUPPORT */
+
+#ifdef CONFIG_CMD_NET
+int board_eth_init(bd_t *bis)
+{
+	int rc = 0;
+#ifdef CONFIG_CS8900
+	rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
+#endif
+	return rc;
+}
+#endif
board/samsung/smdk2410/smdk2410.c +12 -0
index 802348d..25c38e6 100644
@@ -26,6 +26,7 @@
  */
 
 #include <common.h>
+#include <netdev.h>
 #include <s3c2410.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -121,3 +122,14 @@ int dram_init (void)
 
 	return 0;
 }
+
+#ifdef CONFIG_CMD_NET
+int board_eth_init(bd_t *bis)
+{
+	int rc = 0;
+#ifdef CONFIG_CS8900
+	rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
+#endif
+	return rc;
+}
+#endif
board/samsung/smdk6400/smdk6400.c +12 -0
index 52cd174..561c0c8 100644
@@ -29,6 +29,7 @@
  */
 
 #include <common.h>
+#include <netdev.h>
 #include <s3c6400.h>
 
 /* ------------------------------------------------------------------------- */
@@ -117,3 +118,14 @@ ulong board_flash_get_legacy (ulong base, int banknum, flash_info_t *info)
 	} else
 		return 0;
 }
+
+#ifdef CONFIG_CMD_NET
+int board_eth_init(bd_t *bis)
+{
+	int rc = 0;
+#ifdef CONFIG_CS8900
+	rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
+#endif
+	return rc;
+}
+#endif
board/sbc2410x/sbc2410x.c +12 -0
index 6c894a3..6276850 100644
@@ -29,6 +29,7 @@
  */
 
 #include <common.h>
+#include <netdev.h>
 #include <s3c2410.h>
 
 #if defined(CONFIG_CMD_NAND)
@@ -178,3 +179,14 @@ void nand_init(void)
 	printf ("%4lu MB\n", nand_probe((ulong)nand) >> 20);
 }
 #endif
+
+#ifdef CONFIG_CMD_NET
+int board_eth_init(bd_t *bis)
+{
+	int rc = 0;
+#ifdef CONFIG_CS8900
+	rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
+#endif
+	return rc;
+}
+#endif
board/ssv/adnpesc1/adnpesc1.c +12 -0
index 9d32741..72810d0 100644
@@ -22,6 +22,7 @@
  */
 
 #include <common.h>
+#include <netdev.h>
 #include <nios-io.h>
 #include <spi.h>
 
@@ -100,3 +101,14 @@ int post_hotkeys_pressed(void)
 	return 0;       /* No hotkeys supported */
 }
 #endif /* CONFIG_POST */
+
+#ifdef CONFIG_CMD_NET
+int board_eth_init(bd_t *bis)
+{
+	int rc = 0;
+#ifdef CONFIG_CS8900
+	rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
+#endif
+	return rc;
+}
+#endif
board/trab/trab.c +12 -0
index ddf6abf..2dccd87 100644
@@ -24,6 +24,7 @@
 /* #define DEBUG */
 
 #include <common.h>
+#include <netdev.h>
 #include <malloc.h>
 #include <s3c2400.h>
 #include <command.h>
@@ -420,3 +421,14 @@ static void tsc2000_set_brightness(void)
 	tsc2000_write(0, 0xb, br & 0xff);
 }
 #endif
+
+#ifdef CONFIG_CMD_NET
+int board_eth_init(bd_t *bis)
+{
+	int rc = 0;
+#ifdef CONFIG_CS8900
+	rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
+#endif
+	return rc;
+}
+#endif
drivers/net/Makefile +1 -1
index 2df075c..f6d6c6c 100644
@@ -30,7 +30,7 @@ COBJS-$(CONFIG_PPC4xx_EMAC) += 4xx_enet.o
 COBJS-$(CONFIG_DRIVER_AX88180) += ax88180.o
 COBJS-$(CONFIG_BCM570x) += bcm570x.o bcm570x_autoneg.o 5701rls.o
 COBJS-$(CONFIG_BFIN_MAC) += bfin_mac.o
-COBJS-$(CONFIG_DRIVER_CS8900) += cs8900.o
+COBJS-$(CONFIG_CS8900) += cs8900.o
 COBJS-$(CONFIG_TULIP) += dc2114x.o
 COBJS-$(CONFIG_DRIVER_DM9000) += dm9000x.o
 COBJS-$(CONFIG_DNET) += dnet.o
drivers/net/cs8900.c +150 -112

404 lines not on this page · raw message

drivers/net/cs8900.h +24 -17

70 lines not on this page · raw message

include/configs/ADNPESC1.h +8 -6
index b8afc17..2d4fc77 100644
@@ -426,15 +426,17 @@
 	/********************************************/
 	/* !!! CS8900 is __not__ tested on NIOS !!! */
 	/********************************************/
-#define	CONFIG_DRIVER_CS8900			/* Using CS8900		*/
-#define	CS8900_BASE		(CONFIG_SYS_NIOS_CPU_LAN0_BASE + CONFIG_SYS_NIOS_CPU_LAN0_OFFS)
+#define CONFIG_NET_MULTI
+#define	CONFIG_CS8900		/* Using CS8900		*/
+#define	CONFIG_CS8900_BASE	(CONFIG_SYS_NIOS_CPU_LAN0_BASE + \
+				CONFIG_SYS_NIOS_CPU_LAN0_OFFS)
 
 #if	(CONFIG_SYS_NIOS_CPU_LAN0_BUSW == 32)
-#undef	CS8900_BUS16
-#define	CS8900_BUS32		1
+#undef	CONFIG_CS8900_BUS16
+#define	CONFIG_CS8900_BUS32
 #else	/* no */
-#define	CS8900_BUS16		1
-#undef	CS8900_BUS32
+#define	CONFIG_CS8900_BUS16
+#undef	CONFIG_CS8900_BUS32
 #endif
 
 #else
include/configs/DK1C20.h +8 -6
index 45ff2f7..cdc488b 100644
@@ -232,15 +232,17 @@
 	/********************************************/
 	/* !!! CS8900 is __not__ tested on NIOS !!! */
 	/********************************************/
-#define	CONFIG_DRIVER_CS8900			/* Using CS8900		*/
-#define	CS8900_BASE		(CONFIG_SYS_NIOS_CPU_LAN0_BASE + CONFIG_SYS_NIOS_CPU_LAN0_OFFS)
+#define CONFIG_NET_MULTI
+#define	CONFIG_CS8900		/* Using CS8900		*/
+#define	CONFIG_CS8900_BASE	(CONFIG_SYS_NIOS_CPU_LAN0_BASE + \
+				CONFIG_SYS_NIOS_CPU_LAN0_OFFS)
 
 #if	(CONFIG_SYS_NIOS_CPU_LAN0_BUSW == 32)
-#undef	CS8900_BUS16
-#define	CS8900_BUS32		1
+#undef	CONFIG_CS8900_BUS16
+#define	CONFIG_CS8900_BUS32
 #else	/* no */
-#define	CS8900_BUS16		1
-#undef	CS8900_BUS32
+#define	CONFIG_CS8900_BUS16
+#undef	CONFIG_CS8900_BUS32
 #endif
 
 #else
include/configs/DK1S10.h +8 -6
index ae567a3..6e78861 100644
@@ -249,15 +249,17 @@
 	/********************************************/
 	/* !!! CS8900 is __not__ tested on NIOS !!! */
 	/********************************************/
-#define	CONFIG_DRIVER_CS8900			/* Using CS8900		*/
-#define	CS8900_BASE		(CONFIG_SYS_NIOS_CPU_LAN0_BASE + CONFIG_SYS_NIOS_CPU_LAN0_OFFS)
+#define CONFIG_NET_MULTI
+#define	CONFIG_CS8900		/* Using CS8900		*/
+#define	CONFIG_CS8900_BASE	(CONFIG_SYS_NIOS_CPU_LAN0_BASE + \
+				CONFIG_SYS_NIOS_CPU_LAN0_OFFS)
 
 #if	(CONFIG_SYS_NIOS_CPU_LAN0_BUSW == 32)
-#undef	CS8900_BUS16
-#define	CS8900_BUS32		1
+#undef	CONFIG_CS8900_BUS16
+#define	CONFIG_CS8900_BUS32
 #else	/* no */
-#define	CS8900_BUS16		1
-#undef	CS8900_BUS32
+#define	CONFIG_CS8900_BUS16
+#undef	CONFIG_CS8900_BUS32
 #endif
 
 #else
include/configs/VCMA9.h +4 -3
index 6051480..618b7f0 100644
@@ -108,9 +108,10 @@
 /*
  * Hardware drivers
  */
-#define CONFIG_DRIVER_CS8900	1		/* we have a CS8900 on-board */
-#define CS8900_BASE		0x20000300
-#define CS8900_BUS16		1		/* the Linux driver does accesses as shorts */
+#define CONFIG_NET_MULTI
+#define CONFIG_CS8900		/* we have a CS8900 on-board */
+#define CONFIG_CS8900_BASE	0x20000300
+#define CONFIG_CS8900_BUS16	/* the Linux driver does accesses as shorts */
 
 #define CONFIG_DRIVER_S3C24X0_I2C	1	/* we use the buildin I2C controller */
 
include/configs/armadillo.h +5 -4
index f7eec27..49ea3a1 100644
@@ -56,10 +56,11 @@
 /*
  * Hardware drivers
  */
-#define CONFIG_DRIVER_CS8900	1	/* we have a CS8900 on-board */
-#define CS8900_BASE		0x20000300 /* armadillo board */
-#define CS8900_BUS16		1
-#undef  CS8900_BUS32
+#define CONFIG_NET_MULTI
+#define CONFIG_CS8900		/* we have a CS8900 on-board */
+#define CONFIG_CS8900_BASE	0x20000300 /* armadillo board */
+#define CONFIG_CS8900_BUS16
+#undef  CONFIG_CS8900_BUS32
 
 /*
  * select serial console configuration
include/configs/csb226.h +4 -3
index 12bab47..0661d65 100644
@@ -150,9 +150,10 @@
 /*
  * Network chip
  */
-#define CONFIG_DRIVER_CS8900	1
-#define CS8900_BUS32		1
-#define CS8900_BASE		0x08000000
+#define CONFIG_NET_MULTI
+#define CONFIG_CS8900
+#define CONFIG_CS8900_BUS32
+#define CONFIG_CS8900_BASE	0x08000000
 
 /*
  * Stack sizes
include/configs/ep7312.h +5 -4
index 630fff3..e151faa 100644
@@ -47,10 +47,11 @@
 /*
  * Hardware drivers
  */
-#define CONFIG_DRIVER_CS8900	1	/* we have a CS8900 on-board */
-#define CS8900_BASE		0x20000000
-#define CS8900_BUS16		1
-#undef  CS8900_BUS32
+#define CONFIG_NET_MULTI
+#define CONFIG_CS8900		/* we have a CS8900 on-board */
+#define CONFIG_CS8900_BASE	0x20000000
+#define CONFIG_CS8900_BUS16
+#undef  CONFIG_CS8900_BUS32
 
 /*
  * select serial console configuration
include/configs/impa7.h +4 -3
index c7001cc..fdfa022 100644
@@ -47,9 +47,10 @@
 /*
  * Hardware drivers
  */
-#define CONFIG_DRIVER_CS8900	1	/* we have a CS8900 on-board */
-#define CS8900_BASE		0x20000000
-#define CS8900_BUS32		1
+#define CONFIG_NET_MULTI
+#define CONFIG_CS8900		/* we have a CS8900 on-board */
+#define CONFIG_CS8900_BASE	0x20000000
+#define CONFIG_CS8900_BUS32
 
 /*
  * select serial console configuration
include/configs/lart.h +4 -3
index 5d6d460..2d3b369 100644
@@ -47,9 +47,10 @@
 /*
  * Hardware drivers
  */
-#define CONFIG_DRIVER_CS8900	1	/* we have a CS8900 on-board */
-#define CS8900_BASE		0x20008300
-#define CS8900_BUS16		1
+#define CONFIG_NET_MULTI
+#define CONFIG_CS8900		/* we have a CS8900 on-board */
+#define CONFIG_CS8900_BASE	0x20008300
+#define CONFIG_CS8900_BUS16
 
 /*
  * select serial console configuration
include/configs/mx1ads.h +4 -3
index 12e567b..b2ffd3e 100644
@@ -66,9 +66,10 @@
 /*
  *  CS8900 Ethernet drivers
  */
-#define CONFIG_DRIVER_CS8900	1	/* we have a CS8900 on-board */
-#define CS8900_BASE		0x15000300
-#define CS8900_BUS16		1	/* the Linux driver does accesses as shorts */
+#define CONFIG_NET_MULTI
+#define CONFIG_CS8900		/* we have a CS8900 on-board */
+#define CONFIG_CS8900_BASE	0x15000300
+#define CONFIG_CS8900_BUS16	/* the Linux driver does accesses as shorts */
 
 /*
  * select serial console configuration
include/configs/mx31ads.h +4 -3
index 363ea1b..ec1c905 100644
@@ -109,9 +109,10 @@
 		"cp.b ${loadaddr} ${uboot_addr} ${filesize}; "		\
 		"setenv filesize; saveenv\0"
 
-#define CONFIG_DRIVER_CS8900	1
-#define CS8900_BASE		0xb4020300
-#define CS8900_BUS16		1	/* follow the Linux driver */
+#define CONFIG_NET_MULTI
+#define CONFIG_CS8900
+#define CONFIG_CS8900_BASE	0xb4020300
+#define CONFIG_CS8900_BUS16		1	/* follow the Linux driver */
 
 /*
  * The MX31ADS board seems to have a hardware "peculiarity" confirmed under
include/configs/sbc2410x.h +4 -3
index f3dc7fe..f2ea926 100644
@@ -63,9 +63,10 @@
 /*
  * Hardware drivers
  */
-#define CONFIG_DRIVER_CS8900	1	/* we have a CS8900 on-board */
-#define CS8900_BASE		0x19000300
-#define CS8900_BUS16		1 /* the Linux driver does accesses as shorts */
+#define CONFIG_NET_MULTI
+#define CONFIG_CS8900		/* we have a CS8900 on-board */
+#define CONFIG_CS8900_BASE	0x19000300
+#define CONFIG_CS8900_BUS16	/* the Linux driver does accesses as shorts */
 
 /*
  * select serial console configuration
include/configs/smdk2400.h +4 -3
index b712db4..c234177 100644
@@ -56,9 +56,10 @@
 /*
  * Hardware drivers
  */
-#define CONFIG_DRIVER_CS8900	1	/* we have a CS8900 on-board */
-#define CS8900_BASE		0x07000300 /* agrees with WIN CE PA */
-#define CS8900_BUS16		1 /* the Linux driver does accesses as shorts */
+#define CONFIG_NET_MULTI
+#define CONFIG_CS8900		/* we have a CS8900 on-board */
+#define CONFIG_CS8900_BASE	0x07000300 /* agrees with WIN CE PA */
+#define CONFIG_CS8900_BUS16	/* the Linux driver does accesses as shorts */
 
 /*
  * select serial console configuration
include/configs/smdk2410.h +4 -3
index a473278..d340098 100644
@@ -53,9 +53,10 @@
 /*
  * Hardware drivers
  */
-#define CONFIG_DRIVER_CS8900	1	/* we have a CS8900 on-board */
-#define CS8900_BASE		0x19000300
-#define CS8900_BUS16		1 /* the Linux driver does accesses as shorts */
+#define CONFIG_NET_MULTI
+#define CONFIG_CS8900		/* we have a CS8900 on-board */
+#define CONFIG_CS8900_BASE	0x19000300
+#define CONFIG_CS8900_BUS16	/* the Linux driver does accesses as shorts */
 
 /*
  * select serial console configuration
include/configs/smdk6400.h +4 -3
index ddc8e71..f6e1221 100644
@@ -74,9 +74,10 @@
 /*
  * Hardware drivers
  */
-#define CONFIG_DRIVER_CS8900	1	/* we have a CS8900 on-board	*/
-#define CS8900_BASE	  	0x18800300
-#define CS8900_BUS16		1 	/* follow the Linux driver	*/
+#define CONFIG_NET_MULTI
+#define CONFIG_CS8900			/* we have a CS8900 on-board	*/
+#define CONFIG_CS8900_BASE	  	0x18800300
+#define CONFIG_CS8900_BUS16		/* follow the Linux driver	*/
 
 /*
  * select serial console configuration
include/configs/trab.h +4 -3
index 7687ee6..43c191b 100644
@@ -99,9 +99,10 @@
 /*
  * Hardware drivers
  */
-#define CONFIG_DRIVER_CS8900	1	/* we have a CS8900 on-board */
-#define CS8900_BASE		0x07000300 /* agrees with WIN CE PA */
-#define CS8900_BUS16		1 /* the Linux driver does accesses as shorts */
+#define CONFIG_NET_MULTI
+#define CONFIG_CS8900		/* we have a CS8900 on-board */
+#define CONFIG_CS8900_BASE	0x07000300 /* agrees with WIN CE PA */
+#define CONFIG_CS8900_BUS16	/* the Linux driver does accesses as shorts */
 
 #define CONFIG_DRIVER_S3C24X0_I2C 1	/* we use the buildin I2C controller */
 
include/netdev.h +1 -0
index 4636b57..f8f824f 100644
@@ -43,6 +43,7 @@ int cpu_eth_init(bd_t *bis);
 /* Driver initialization prototypes */
 int au1x00_enet_initialize(bd_t*);
 int bfin_EMAC_initialize(bd_t *bis);
+int cs8900_initialize(u8 dev_num, int base_addr);
 int dc21x4x_initialize(bd_t *bis);
 int davinci_emac_initialize(void);
 int dnet_eth_initialize(int id, void *regs, unsigned int phy_addr);
lib_arm/board.c +0 -9
index a44d308..fa87d51 100644
@@ -73,10 +73,6 @@ extern void dataflash_print_info(void);
 const char version_string[] =
 	U_BOOT_VERSION" (" U_BOOT_DATE " - " U_BOOT_TIME ")"CONFIG_IDENT_STRING;
 
-#ifdef CONFIG_DRIVER_CS8900
-extern void cs8900_get_enetaddr (void);
-#endif
-
 #ifdef CONFIG_DRIVER_RTL8019
 extern void rtl8019_get_enetaddr (uchar * addr);
 #endif
@@ -423,11 +419,6 @@ extern void davinci_eth_set_mac_addr (const u_int8_t *addr);
 	}
 #endif
 
-#ifdef CONFIG_DRIVER_CS8900
-	/* XXX: this needs to be moved to board init */
-	cs8900_get_enetaddr ();
-#endif
-
 #if defined(CONFIG_DRIVER_SMC91111) || defined (CONFIG_DRIVER_LAN91C96)
 	/* XXX: this needs to be moved to board init */
 	if (getenv ("ethaddr")) {
Signature · 1 line
1.5.6.3
#1 lore raw

PATCH v2 1/1 Convert CS8900 Ethernet driver to CONFIG_NET_MULTI API

Dear Ben Warren,

Quoted 9 lines · In message <[email protected]> you…

All in-tree boards that use this controller have CONFIG_NET_MULTI added Also:
- changed CONFIG_DRIVER_CS8900 to CONFIG_CS8900
- changed CS8900_BASE to CONFIG_CS8900_BASE
- changed CS8900_BUS?? to CONFIG_CS8900_BUS??
- cleaned up line lengths
- modified VCMA9 command function that accesses the device
- removed MAC address initialization from lib_arm/board.c

Quoted 6 lines

---

v2: Fixed typo: CS8900_BUS32 -> CONFIG_CS8900_BUS32
Added more descriptive printf in cs8900_init as suggested by Wolfgang Initialize 'priv' data structure in cs8900_initialize()

Thanks. That's better, but no cigar yet.

I now get this:

TRAB # run load
Using CS8900-0 device
TFTP from server 192.168.1.1; our IP address is 192.168.3.68 Filename 'trab/u-boot.bin-wd'.
Load address: 0xc100000
Loading: data abort

pc : [<0df6b254>]          lr : [<0df4c694>]

sp : 0df1bb74 ip : 00000004 fp : 0000083c
r10: 0df79ca0 r9 : 000000c0 r8 : 0df1bfd8
r7 : 0df1c100 r6 : 0df1c140 r5 : 0000002a r4 : 0000005c
r3 : 07000300 r2 : 0000002a r1 : 0df79ca0 r0 : 0df1c100
Flags: nzCv IRQs off FIQs off Mode SVC_32
Resetting CPU ...

Decoding PC and LR gives:

PC: 0x0df6b254 -- 0x0df6b228 + 0x002c cs8900_send
LR: 0x0df4c694 -- 0x0df4c668 + 0x002c eth_send

Placing a few printf()s indicates that it crashes in the writel() following the rety: label. Looking at the code, the "&priv->regs->txcmd" looks a bit fishy to me. I played around a bit (guessing for "priv->regs->txcmd" and "&(priv->regs->txcmd)" but this doesn't change behaviour.

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
"We have the right to survive!"
"Not be killing others."
	-- Deela and Kirk, "Wink of An Eye", stardate 5710.5
author
#2 lore raw

PATCH v2 1/1 Convert CS8900 Ethernet driver to CONFIG_NET_MULTI API

Quoted 13 lines · Wolfgang Denk

Dear Ben Warren,

In message <[email protected]>

Quoted 9 lines · you

All in-tree boards that use this controller have CONFIG_NET_MULTI added Also:
- changed CONFIG_DRIVER_CS8900 to CONFIG_CS8900
- changed CS8900_BASE to CONFIG_CS8900_BASE
- changed CS8900_BUS?? to CONFIG_CS8900_BUS??
- cleaned up line lengths
- modified VCMA9 command function that accesses the device
- removed MAC address initialization from lib_arm/board.c

Quoted 9 lines
Quoted 6 lines

---

v2: Fixed typo: CS8900_BUS32 -> CONFIG_CS8900_BUS32
Added more descriptive printf in cs8900_init as suggested by Wolfgang Initialize 'priv' data structure in cs8900_initialize()

Thanks. That's better, but no cigar yet.

:(

Quoted 19 lines

I now get this:

TRAB # run load
Using CS8900-0 device
TFTP from server 192.168.1.1; our IP address is 192.168.3.68 Filename 'trab/u-boot.bin-wd'.
Load address: 0xc100000
Loading: data abort

pc : [<0df6b254>]          lr : [<0df4c694>]

sp : 0df1bb74 ip : 00000004 fp : 0000083c
r10: 0df79ca0 r9 : 000000c0 r8 : 0df1bfd8
r7 : 0df1c100 r6 : 0df1c140 r5 : 0000002a r4 : 0000005c
r3 : 07000300 r2 : 0000002a r1 : 0df79ca0 r0 : 0df1c100
Flags: nzCv IRQs off FIQs off Mode SVC_32
Resetting CPU ...

Decoding PC and LR gives:

Quoted 9 lines

PC: 0x0df6b254 -- 0x0df6b228 + 0x002c cs8900_send
LR: 0x0df4c694 -- 0x0df4c668 + 0x002c eth_send

Placing a few printf()s indicates that it crashes in the writel() following the rety: label. Looking at the code, the "&priv->regs->txcmd" looks a bit fishy to me. I played around a bit (guessing for "priv->regs->txcmd" and "&(priv->regs->txcmd)" but this doesn't change behaviour.

Yeah, this should be fine. I think there'd be a compile error if the compiler interpreted the '&' as belonging to something other than 'txcmd'.

I looked at a disassembly of this code and it looked like it should work.
In this case, the base offset of the device is in r2 (0x07000300) and the
code does store operations on this +#4 and +#6, which were the offsets in the original. I guess it would be useful to printf something like:

printf("addr = %#08x\n", &priv->regs->txcmd) just to make sure it's 0x07000304.

Other than that, I'm stumped. I'll review the code again to see if anything jumps out.

thanks again,
Ben

#3 lore raw

PATCH v2 1/1 Convert CS8900 Ethernet driver to CONFIG_NET_MULTI API

Dear Ben Warren,

Quoted 11 lines · In message <[email protected]> you…

I looked at a disassembly of this code and it looked like it should work.
In this case, the base offset of the device is in r2 (0x07000300) and the
code does store operations on this +#4 and +#6, which were the offsets in the original. I guess it would be useful to printf something like:

printf("addr = %#08x\n", &priv->regs->txcmd) just to make sure it's 0x07000304.

Other than that, I'm stumped. I'll review the code again to see if anything jumps out.

Hm... adding this patch:

drivers/net/cs8900.c +5 -0
index 5b9c4cb..0f86c39 100644
@@ -215,6 +215,11 @@ static int cs8900_send(struct eth_device *dev,
 	struct cs8900_priv *priv = (struct cs8900_priv *)(dev->priv);
 
 retry:
+	printf("priv=%#08x  regs=%#08x  txcmd=%#08x\n",
+		(unsigned int)priv,
+		(unsigned int)(priv->regs),
+		(unsigned int)(&priv->regs->txcmd));
+		
 	/* initiate a transmit sequence */
 	writel(PP_TxCmd_TxStart_Full, &priv->regs->txcmd);
 	writel(length, &priv->regs->txlen);

And testing on the mx31ads board I get this:

=> run load
Using CS8900-0 device
TFTP from server 192.168.1.1; our IP address is 192.168.20.9 Filename 'mx31ads/u-boot.bin'.
Load address: 0x80800000
Loading: priv=0x87ed8100 regs=0xb4020300 txcmd=0xb4020304 <hangs>

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
On the subject of C program indentation: "In My Egotistical  Opinion,
most  people's  C  programs  should be indented six feet downward and
covered with dirt."                               - Blair P. Houghton
author
#4 lore raw

PATCH v2 1/1 Convert CS8900 Ethernet driver to CONFIG_NET_MULTI API

Quoted 37 lines · Wolfgang Denk

Dear Ben Warren,

Quoted 11 lines · In message <[email protected]> you…

I looked at a disassembly of this code and it looked like it should work.
In this case, the base offset of the device is in r2 (0x07000300) and the
code does store operations on this +#4 and +#6, which were the offsets in the original. I guess it would be useful to printf something like:

printf("addr = %#08x\n", &priv->regs->txcmd) just to make sure it's 0x07000304.

Other than that, I'm stumped. I'll review the code again to see if anything jumps out.

Hm... adding this patch:

drivers/net/cs8900.c +5 -0
index 5b9c4cb..0f86c39 100644
@@ -215,6 +215,11 @@ static int cs8900_send(struct eth_device *dev,
 	struct cs8900_priv *priv = (struct cs8900_priv *)(dev->priv);
 
 retry:
+	printf("priv=%#08x  regs=%#08x  txcmd=%#08x\n",
+		(unsigned int)priv,
+		(unsigned int)(priv->regs),
+		(unsigned int)(&priv->regs->txcmd));
+		
 	/* initiate a transmit sequence */
 	writel(PP_TxCmd_TxStart_Full, &priv->regs->txcmd);
 	writel(length, &priv->regs->txlen);

And testing on the mx31ads board I get this:

Quoted 9 lines

=> run load
Using CS8900-0 device
TFTP from server 192.168.1.1; our IP address is 192.168.20.9 Filename 'mx31ads/u-boot.bin'.
Load address: 0x80800000
Loading: priv=0x87ed8100 regs=0xb4020300 txcmd=0xb4020304 <hangs>

Well, the addresses look correct to me:

Definitions for this board prior to my patch:

#define CS8900_REG u16
#define CS8900_BASE 0xb4020300
#define CS8900_OFF 0x02
...

#define CS8900_TxCMD *(volatile CS8900_REG *)(CS8900_BASE+0x02*CS8900_OFF) #define CS8900_TxLEN *(volatile CS8900_REG *)(CS8900_BASE+0x03*CS8900_OFF)

Shit! The accessor should be writew(), not writel().
That could very well be why this isn't working. I'll put together another patch.

Quoted 5 lines

Best regards,

Wolfgang Denk

Thanks a lot for your help.

Ben

#5 lore raw

PATCH v2 1/1 Convert CS8900 Ethernet driver to CONFIG_NET_MULTI API

In reply to Ben Warren

Dear Ben Warren,

Quoted 10 lines · In message <[email protected]> you…

All in-tree boards that use this controller have CONFIG_NET_MULTI added Also:
- changed CONFIG_DRIVER_CS8900 to CONFIG_CS8900
- changed CS8900_BASE to CONFIG_CS8900_BASE
- changed CS8900_BUS?? to CONFIG_CS8900_BUS??
- cleaned up line lengths
- modified VCMA9 command function that accesses the device
- removed MAC address initialization from lib_arm/board.c

Also tested on mx31ads board - similar behavior as on trab: no crash, but board hangs hard on first packet.

Best regards,

Wolfgang Denk

Signature · 7 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
Niklaus Wirth has lamented that, whereas Europeans pronounce his name
correctly  (Ni-klows  Virt),  Americans  invariably  mangle  it  into
(Nick-les  Worth).  Which  is to say that Europeans call him by name,
but Americans call him by value.