From 3f8c5b95adbaa43fd5fcfa94a713971e8331fc58 Mon Sep 17 00:00:00 2001
From: florian <florian@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Date: Mon, 26 Mar 2007 07:37:31 +0000
Subject: Rewrite of the bootloader runtime detection (Gabor Juhos)

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@6713 3c298f89-4303-0410-b956-a3cf2f4a3e73
---
 .../adm5120-2.6/files/arch/mips/adm5120/Makefile   |  2 +-
 .../adm5120-2.6/files/arch/mips/adm5120/prom.c     | 38 +++-------------------
 .../adm5120-2.6/files/drivers/net/adm5120sw.c      |  6 ++--
 .../adm5120-2.6/files/drivers/net/adm5120sw.h      | 10 +-----
 4 files changed, 10 insertions(+), 46 deletions(-)

(limited to 'target')

diff --git a/target/linux/adm5120-2.6/files/arch/mips/adm5120/Makefile b/target/linux/adm5120-2.6/files/arch/mips/adm5120/Makefile
index 63024e36d..a68b4a145 100644
--- a/target/linux/adm5120-2.6/files/arch/mips/adm5120/Makefile
+++ b/target/linux/adm5120-2.6/files/arch/mips/adm5120/Makefile
@@ -2,6 +2,6 @@
 # Makefile for the ADMtek ADM5120 SoC specific parts of the kernel
 #
 
-obj-y  := setup.o prom.o irq.o memory.o mipsIRQ.o
+obj-y  := setup.o prom.o irq.o memory.o mipsIRQ.o adm5120_info.o
 
 EXTRA_AFLAGS := $(CFLAGS)
diff --git a/target/linux/adm5120-2.6/files/arch/mips/adm5120/prom.c b/target/linux/adm5120-2.6/files/arch/mips/adm5120/prom.c
index 4c2076559..e644fc37c 100644
--- a/target/linux/adm5120-2.6/files/arch/mips/adm5120/prom.c
+++ b/target/linux/adm5120-2.6/files/arch/mips/adm5120/prom.c
@@ -29,20 +29,12 @@
 #include <asm/bootinfo.h>
 #include <asm/addrspace.h>
 
-/* boot loaders specific definitions */
-#define CFE_EPTSEAL 0x43464531 /* CFE1 is the magic number to recognize CFE from other bootloaders */
-#define CFE 1
-#define UBOOT 2
-#define MYLOADER 3
-#define UNKNOWN 0
+#include <adm5120_info.h>
 
 void setup_prom_printf(int);
 void prom_printf(char *, ...);
 void prom_meminit(void);
 
-/* we assume we don't know the boot loader by default */
-int boot_loader_type = UNKNOWN;
-
 #define ADM5120_ENVC           1
 
 char *adm5120_envp[2*ADM5120_ENVC] = {"memsize","0x001000000"};
@@ -105,6 +97,7 @@ char *prom_getenv(char *envname)
 	printk(KERN_INFO "GETENV: not found.\n");
 	return(NULL);
 }
+
 	
 /*
  * initialize the prom module.
@@ -114,35 +107,12 @@ void __init prom_init(void)
 	/* you should these macros defined in include/asm/bootinfo.h */
 	mips_machgroup = MACH_GROUP_ADM_GW;
 	mips_machtype = MACH_ADM_GW_5120;
+	
+	adm5120_info_init();
 
 	/* init command line, register a default kernel command line */
 	strcpy(&(arcs_cmdline[0]), "console=ttyS0,115200 rootfstype=squashfs,jffs2 init=/etc/preinit");
 
-	/* check for CFE by finding the CFE magic number */
-	int *prom_vec = (int *) fw_arg3;
-	int argc = fw_arg0;
-	unsigned int cfe_eptseal;
-
-	if (argc < 0)
-		cfe_eptseal = (uint32_t)(unsigned long)prom_vec;
-	else {
-		if ((int32_t)(long)prom_vec < 0)
-			 /*
-			  * Old loaders all it gives us is the handle,
-			  * so assume the seal.
-			  */
-			cfe_eptseal = CFE_EPTSEAL;
-		else
-			/*
-			 * Newer loaders bundle the handle/ept/eptseal
-			 */
-			cfe_eptseal = (unsigned int)((uint32_t *)prom_vec)[3];
-	}
-	if (cfe_eptseal == CFE_EPTSEAL) {
-		boot_loader_type = CFE;
-		printk("adm5120 : CFE boot loader\n");
-	}
-
 	/* init memory map */
 	prom_meminit();
 }
diff --git a/target/linux/adm5120-2.6/files/drivers/net/adm5120sw.c b/target/linux/adm5120-2.6/files/drivers/net/adm5120sw.c
index ddb54d4d7..c75ad4abb 100644
--- a/target/linux/adm5120-2.6/files/drivers/net/adm5120sw.c
+++ b/target/linux/adm5120-2.6/files/drivers/net/adm5120sw.c
@@ -20,6 +20,8 @@
 #include <asm/io.h>
 #include "adm5120sw.h"
 
+#include "adm5120_info.h"
+
 MODULE_AUTHOR("Jeroen Vreeken (pe1rxq@amsat.org)");
 MODULE_DESCRIPTION("ADM5120 ethernet switch driver");
 MODULE_LICENSE("GPL");
@@ -316,7 +318,7 @@ static int adm5120_sw_set_mac_address(struct net_device *dev, void *p)
 static int adm5120_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
 {
 	int err;
-	struct adm5120_info info;
+	struct adm5120_sw_info info;
 	struct adm5120_sw *priv = netdev_priv(dev);
 
 	switch(cmd) {
@@ -391,7 +393,7 @@ static int __init adm5120_sw_init(void)
 	if (adm5120_get_reg(ADM5120_CODE) & ADM5120_CODE_PQFP)
 		adm5120_nrdevs = 5;
 	/* CFE based devices only have two enet ports */
-	else if (boot_loader_type == CFE)
+	else if (adm5120_info.boot_loader == BOOT_LOADER_CFE)
 		adm5120_nrdevs = 2;
 	else
 		adm5120_nrdevs = 6;
diff --git a/target/linux/adm5120-2.6/files/drivers/net/adm5120sw.h b/target/linux/adm5120-2.6/files/drivers/net/adm5120sw.h
index 4ea7a2012..09ef9fe39 100644
--- a/target/linux/adm5120-2.6/files/drivers/net/adm5120sw.h
+++ b/target/linux/adm5120-2.6/files/drivers/net/adm5120sw.h
@@ -97,18 +97,10 @@ struct adm5120_sw {
 #define SIOCGMATRIX	SIOCDEVPRIVATE+1
 #define SIOCGADMINFO	SIOCDEVPRIVATE+2
 
-struct adm5120_info {
+struct adm5120_sw_info {
 	u16	magic;
 	u16	ports;
 	u16	vlan;
 };
-#define UNKNOWN 0
-
-#define CFE 1
-#define UBOOT 2
-#define MYLOADER 3
-
-/* Type of boot loader, detected by the prom */
-extern boot_loader_type;
 
 #endif /* _INCLUDE_ADM5120SW_H_ */
-- 
cgit v1.2.3