update AU1000 get_ethernet_addr()
[linux-2.6.git] / arch / mips / au1000 / common / prom.c
index 9c171af..5d6ddf1 100644 (file)
@@ -1,10 +1,9 @@
 /*
  *
  * BRIEF MODULE DESCRIPTION
- *    PROM library initialisation code, assuming a version of
- *    pmon is the boot code.
+ *    PROM library initialisation code, supports YAMON and U-Boot.
  *
- * Copyright 2000,2001 MontaVista Software Inc.
+ * Copyright 2000, 2001, 2006 MontaVista Software Inc.
  * Author: MontaVista Software, Inc.
  *             ppopov@mvista.com or source@mvista.com
  *
 extern int prom_argc;
 extern char **prom_argv, **prom_envp;
 
-typedef struct
-{
-    char *name;
-/*    char *val; */
-}t_env_var;
-
 
-char * prom_getcmdline(void)
+char * __init_or_module prom_getcmdline(void)
 {
        return &(arcs_cmdline[0]);
 }
@@ -85,24 +78,27 @@ char *prom_getenv(char *envname)
 {
        /*
         * Return a pointer to the given environment variable.
-        * Environment variables are stored in the form of "memsize=64".
+        * YAMON uses "name", "value" pairs, while U-Boot uses "name=value".
         */
 
-       t_env_var *env = (t_env_var *)prom_envp;
-       int i;
-
-       i = strlen(envname);
-
-       while(env->name) {
-               if(strncmp(envname, env->name, i) == 0) {
-                       return(env->name + strlen(envname) + 1);
+       char **env = prom_envp;
+       int i = strlen(envname);
+       int yamon = (*env && strchr(*env, '=') == NULL);
+
+       while (*env) {
+               if (yamon) {
+                       if (strcmp(envname, *env++) == 0)
+                               return *env;
+               } else {
+                       if (strncmp(envname, *env, i) == 0 && (*env)[i] == '=')
+                               return *env + i + 1;
                }
                env++;
        }
-       return(NULL);
+       return NULL;
 }
 
-inline unsigned char str2hexnum(unsigned char c)
+static inline unsigned char str2hexnum(unsigned char c)
 {
        if(c >= '0' && c <= '9')
                return c - '0';
@@ -113,7 +109,7 @@ inline unsigned char str2hexnum(unsigned char c)
        return 0; /* foo */
 }
 
-inline void str2eaddr(unsigned char *ea, unsigned char *str)
+static inline void str2eaddr(unsigned char *ea, unsigned char *str)
 {
        int i;
 
@@ -128,36 +124,29 @@ inline void str2eaddr(unsigned char *ea, unsigned char *str)
        }
 }
 
-int get_ethernet_addr(char *ethernet_addr)
+int prom_get_ethernet_addr(char *ethernet_addr)
 {
-        char *ethaddr_str;
+       char *ethaddr_str;
+       char *argptr;
 
-        ethaddr_str = prom_getenv("ethaddr");
+       /* Check the environment variables first */
+       ethaddr_str = prom_getenv("ethaddr");
        if (!ethaddr_str) {
-               printk("ethaddr not set in boot prom\n");
-               return -1;
-       }
-       str2eaddr(ethernet_addr, ethaddr_str);
-
-#if 0
-       {
-               int i;
+               /* Check command line */
+               argptr = prom_getcmdline();
+               ethaddr_str = strstr(argptr, "ethaddr=");
+               if (!ethaddr_str)
+                       return -1;
 
-       printk("get_ethernet_addr: ");
-       for (i=0; i<5; i++)
-               printk("%02x:", (unsigned char)*(ethernet_addr+i));
-       printk("%02x\n", *(ethernet_addr+i));
+               ethaddr_str += strlen("ethaddr=");
        }
-#endif
+
+       str2eaddr(ethernet_addr, ethaddr_str);
 
        return 0;
 }
+EXPORT_SYMBOL(prom_get_ethernet_addr);
 
-unsigned long __init prom_free_prom_memory(void)
+void __init prom_free_prom_memory(void)
 {
-       return 0;
 }
-
-EXPORT_SYMBOL(prom_getcmdline);
-EXPORT_SYMBOL(get_ethernet_addr);
-EXPORT_SYMBOL(str2eaddr);