mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-03 22:44:27 -05:00 
			
		
		
		
	There is an error in the unlzma system in the kernel. A lzma compressed squashfs filesystem does not work for me. This should compile and works for me on my Asus WL-500GP, please test it on more systems. SVN-Revision: 16441
		
			
				
	
	
		
			109 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
--- a/arch/mips/bcm47xx/prom.c
 | 
						|
+++ b/arch/mips/bcm47xx/prom.c
 | 
						|
@@ -32,6 +32,7 @@
 | 
						|
 #include <asm/fw/cfe/cfe_error.h>
 | 
						|
 
 | 
						|
 static int cfe_cons_handle;
 | 
						|
+static void (* __prom_putchar)(char c);
 | 
						|
 
 | 
						|
 const char *get_system_type(void)
 | 
						|
 {
 | 
						|
@@ -40,65 +41,40 @@ const char *get_system_type(void)
 | 
						|
 
 | 
						|
 void prom_putchar(char c)
 | 
						|
 {
 | 
						|
+	if (__prom_putchar)
 | 
						|
+		__prom_putchar(c);
 | 
						|
+}
 | 
						|
+
 | 
						|
+void prom_putchar_cfe(char c)
 | 
						|
+{
 | 
						|
 	while (cfe_write(cfe_cons_handle, &c, 1) == 0)
 | 
						|
 		;
 | 
						|
 }
 | 
						|
 
 | 
						|
-static __init void prom_init_cfe(void)
 | 
						|
+static __init int prom_init_cfe(void)
 | 
						|
 {
 | 
						|
 	uint32_t cfe_ept;
 | 
						|
 	uint32_t cfe_handle;
 | 
						|
 	uint32_t cfe_eptseal;
 | 
						|
-	int argc = fw_arg0;
 | 
						|
-	char **envp = (char **) fw_arg2;
 | 
						|
-	int *prom_vec = (int *) fw_arg3;
 | 
						|
-
 | 
						|
-	/*
 | 
						|
-	 * Check if a loader was used; if NOT, the 4 arguments are
 | 
						|
-	 * what CFE gives us (handle, 0, EPT and EPTSEAL)
 | 
						|
-	 */
 | 
						|
-	if (argc < 0) {
 | 
						|
-		cfe_handle = (uint32_t)argc;
 | 
						|
-		cfe_ept = (uint32_t)envp;
 | 
						|
-		cfe_eptseal = (uint32_t)prom_vec;
 | 
						|
-	} else {
 | 
						|
-		if ((int)prom_vec < 0) {
 | 
						|
-			/*
 | 
						|
-			 * Old loader; all it gives us is the handle,
 | 
						|
-			 * so use the "known" entrypoint and assume
 | 
						|
-			 * the seal.
 | 
						|
-			 */
 | 
						|
-			cfe_handle = (uint32_t)prom_vec;
 | 
						|
-			cfe_ept = 0xBFC00500;
 | 
						|
-			cfe_eptseal = CFE_EPTSEAL;
 | 
						|
-		} else {
 | 
						|
-			/*
 | 
						|
-			 * Newer loaders bundle the handle/ept/eptseal
 | 
						|
-			 * Note: prom_vec is in the loader's useg
 | 
						|
-			 * which is still alive in the TLB.
 | 
						|
-			 */
 | 
						|
-			cfe_handle = prom_vec[0];
 | 
						|
-			cfe_ept = prom_vec[2];
 | 
						|
-			cfe_eptseal = prom_vec[3];
 | 
						|
-		}
 | 
						|
-	}
 | 
						|
 
 | 
						|
-	if (cfe_eptseal != CFE_EPTSEAL) {
 | 
						|
-		/* too early for panic to do any good */
 | 
						|
-		printk(KERN_ERR "CFE's entrypoint seal doesn't match.");
 | 
						|
-		while (1) ;
 | 
						|
-	}
 | 
						|
+	cfe_eptseal = (uint32_t) fw_arg3;
 | 
						|
+	cfe_handle = (uint32_t) fw_arg0;
 | 
						|
+	cfe_ept = (uint32_t) fw_arg2;
 | 
						|
+
 | 
						|
+	if (cfe_eptseal != CFE_EPTSEAL)
 | 
						|
+		return -1;
 | 
						|
 
 | 
						|
 	cfe_init(cfe_handle, cfe_ept);
 | 
						|
+	return 0;
 | 
						|
 }
 | 
						|
 
 | 
						|
-static __init void prom_init_console(void)
 | 
						|
+static __init void prom_init_console_cfe(void)
 | 
						|
 {
 | 
						|
 	/* Initialize CFE console */
 | 
						|
 	cfe_cons_handle = cfe_getstdhandle(CFE_STDHANDLE_CONSOLE);
 | 
						|
 }
 | 
						|
 
 | 
						|
-static __init void prom_init_cmdline(void)
 | 
						|
+static __init void prom_init_cmdline_cfe(void)
 | 
						|
 {
 | 
						|
 	char buf[CL_SIZE];
 | 
						|
 
 | 
						|
@@ -146,9 +122,12 @@ static __init void prom_init_mem(void)
 | 
						|
 
 | 
						|
 void __init prom_init(void)
 | 
						|
 {
 | 
						|
-	prom_init_cfe();
 | 
						|
-	prom_init_console();
 | 
						|
-	prom_init_cmdline();
 | 
						|
+	if (prom_init_cfe() == 0) {
 | 
						|
+		//prom_init_console_cfe();
 | 
						|
+		//prom_init_cmdline_cfe();
 | 
						|
+		__prom_putchar = prom_putchar_cfe;
 | 
						|
+	}
 | 
						|
+
 | 
						|
 	prom_init_mem();
 | 
						|
 }
 | 
						|
 
 |