* Patch by Richard Woodruff, 19 June 03:
authorwdenk <wdenk>
Thu, 19 Jun 2003 23:58:30 +0000 (23:58 +0000)
committerwdenk <wdenk>
Thu, 19 Jun 2003 23:58:30 +0000 (23:58 +0000)
- Fixed smc91c111 driver to sync with the u-boot environment (driver/smc91c111.c).
- Added eth_init error return check in NetLoop (net/net.c).

CHANGELOG
CREDITS
drivers/smc91111.c
net/net.c

index a0fc00f61c553b7fa906274963c20b36d1918626..900c2f10a62e2067e07cae8da368c9a14f41c4ea 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,6 +2,13 @@
 Changes since U-Boot 0.3.1:
 ======================================================================
 
+* * Patch by Richard Woodruff, 19 June 03:
+  - Fixed smc91c111 driver to sync with the u-boot environment (driver/smc91c111.c).
+  - Added eth_init error return check in NetLoop (net/net.c).
+
+* Patch by Ken Chou, 17 June 2003:
+  Added support for A3000 SBC board (Artis Microsystems Inc.)
+
 * Patches by Murray Jensen, 17 Jun 2003:
   - Hymod board database mods: add "who" field and new xilinx chip types
   - provide new "init_cmd_timeout()" function so code external to
diff --git a/CREDITS b/CREDITS
index 21e4b76ad3dec8bfa029878aabcd483f1d80f034..756acca762301852b2ed1d958ee1d1f1bb1c41f9 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -66,6 +66,10 @@ N: Jonathan De Bruyne
 E: jonathan.debruyne@siemens.atea.be
 D: Port to Siemens IAD210 board
 
+N: Ken Chou
+E: kchou@ieee.org      
+D: Support for A3000 SBC board
+
 N: Conn Clark
 E: clark@esteem.com
 D: ESTEEM192E support
index 748830e01c27eb269395268af639428549cb367e..f29a8a44f411bae1afa2e74ca3fd2364d1a47a2b 100644 (file)
@@ -52,6 +52,7 @@
  .    o   skeleton.c by Donald Becker ( becker@cesdis.gsfc.nasa.gov )
  .
  . History:
+ .      06/19/03  Richard Woodruff Made u-boot environment aware and added mac addr checks. 
  .     10/17/01  Marco Hasewinkel Modify for DNP/1110
  .     07/25/01  Woojung Huh      Modify for ADS Bitsy
  .     04/25/01  Daris A Nevil    Initial public release through SMSC
@@ -176,7 +177,7 @@ void smc_destructor(void);
  . The kernel calls this function when someone wants to use the device,
  . typically 'ifconfig ethX up'.
 */
-static int smc_open(void);
+static int smc_open(bd_t *bd);
 
 
 /*
@@ -199,7 +200,12 @@ static void smc_phy_configure(void);
 */
 static int smc_rcv(void);
 
-
+/* See if a MAC address is defined in the current environment. If so use it. If not
+ . print a warning and set the environment and other globals with the default.  
+ . If an EEPROM is present it really should be consulted.
+*/
+int smc_get_ethaddr(bd_t *bd);
+int get_rom_mac(char *v_rom_mac);
 
 /*
  ------------------------------------------------------------
@@ -226,7 +232,7 @@ void smc_set_mac_addr(const char *addr) {
 
 /*
  * smc_get_macaddr is no longer used. If you want to override the default
- * mac address, call smc_get_mac_addr as a part of the board initialisation.
+ * mac address, call smc_get_mac_addr as a part of the board initialization.
  */
 
 #if 0
@@ -665,14 +671,13 @@ void smc_destructor()
  * Set up everything, reset the card, etc ..
  *
  */
-static int smc_open()
+static int smc_open(bd_t *bd)
 {
-       int     i;      /* used to set hw ethernet address */
+       int     i, err;
 
        PRINTK2("%s:smc_open\n", SMC_DEV_NAME);
 
        /* reset the hardware */
-
        smc_reset();
        smc_enable();
 
@@ -681,12 +686,16 @@ static int smc_open()
        smc_phy_configure();
 #endif
 
-
        /* conservative setting (10Mbps, HalfDuplex, no AutoNeg.) */
 /*     SMC_SELECT_BANK(0); */
 /*     SMC_outw(0, RPC_REG); */
-
        SMC_SELECT_BANK(1);
+  
+    err = smc_get_ethaddr(bd); /* set smc_mac_addr, and sync it with u-boot globals */
+    if(err < 0){   
+        memset(bd->bi_enetaddr, 0, 6);  /* hack to make error stick! upper code will abort if not set*/
+        return(-1);                     /* upper code ignores this, but NOT bi_enetaddr */
+    }
 
 #ifdef USE_32_BIT
        for ( i = 0; i < 6; i += 2 ) {
@@ -1385,8 +1394,7 @@ static void print_packet( byte * buf, int length )
 #endif
 
 int eth_init(bd_t *bd) {
-       smc_open();
-       return 0;
+       return (smc_open(bd));
 }
 
 void eth_halt() {
@@ -1401,4 +1409,74 @@ int eth_send(volatile void *packet, int length) {
        return smc_send_packet(packet, length);
 }
 
+int smc_get_ethaddr(bd_t *bd)
+{
+    int env_size, rom_valid, env_present = 0, reg;
+    char *s = NULL, *e, *v_mac, es[] = "11:22:33:44:55:66";
+    uchar s_env_mac[64], v_env_mac[6], v_rom_mac[6]; 
+
+    env_size = getenv_r ("ethaddr", s_env_mac, sizeof (s_env_mac)); 
+    if ((env_size > 0) && (env_size < sizeof(es))) {  /* exit if env is bad */
+        printf("\n*** ERROR: ethaddr is not set properly!!\n");
+        return(-1);
+    }
+    
+    if(env_size > 0){
+        env_present = 1;
+        s = s_env_mac;
+    }
+        
+    for (reg = 0; reg < 6; ++reg) {     /* turn string into mac value */
+        v_env_mac[reg] = s ? simple_strtoul (s, &e, 16) : 0; 
+        if (s)                                                  
+            s = (*e) ? e + 1 : e;                               
+    }
+                                                                    
+    rom_valid = get_rom_mac(v_rom_mac); /* get ROM mac value if any */   
+    
+    if(!env_present){                   /* if NO env */
+        if(rom_valid){                  /* but ROM is valid */
+            v_mac = v_rom_mac;
+            sprintf (s_env_mac, "%02X:%02X:%02X:%02X:%02X:%02X", v_mac[0], 
+                     v_mac[1] ,v_mac[2], v_mac[3],v_mac[4], v_mac[5]) ;
+            setenv ("ethaddr", s_env_mac); 
+        }else{                          /* no env, bad ROM */
+            printf("\n*** ERROR: ethaddr is NOT set !!\n");
+            return(-1);
+        }
+    }else                               /* good env, don't care ROM */
+      v_mac = v_env_mac;                /* always use a good env over a ROM */
+   
+    if(env_present && rom_valid)        /* if both env and ROM are good */
+        if(memcmp(v_env_mac, v_rom_mac, 6) != 0){
+            printf("\n*** Warning: Environment and ROM MAC addresses don't match\n");
+            printf("***          Using Environment MAC\n");
+        }
+    memcpy (bd->bi_enetaddr, v_mac, 6); /* update global address to match env (allows env changing) */
+    smc_set_mac_addr(v_mac);            /* use old function to update smc default */
+    return(0);
+}
+
+int get_rom_mac(char *v_rom_mac)
+{
+    int is_rom_present = 0;
+#ifdef HARDCODE_MAC  /* used for testing or to supress run time warnings */    
+    char hw_mac_addr[] = {0x02, 0x80, 0xad, 0x20, 0x31, 0xb8};
+
+    memcpy (v_rom_mac, hw_mac_addr, 6);
+    return(1);
+#else
+    if(is_rom_present)
+    {
+        /* if eeprom contents are valid
+         *   extract mac address into hw_mac_addr, 8 or 16 bit accesses
+         *   memcpy (v_rom_mac, hc_mac_addr, 6); 
+         *   return(1);
+         */  
+    }        
+    memset(v_rom_mac, 0, 6);
+    return(0);
+#endif
+}
+
 #endif /* CONFIG_DRIVER_SMC91111 */
index 4758595d1c878a759b4c9e410632b1abb6862e77..3081829010ae4d5407870ae98ea838e0bf0d4ea6 100644 (file)
--- a/net/net.c
+++ b/net/net.c
@@ -251,7 +251,8 @@ NetLoop(proto_t protocol)
        }
 
        eth_halt();
-       eth_init(bd);
+       if(eth_init(bd) < 0)
+           return(-1);
 
 restart:
 #ifdef CONFIG_NET_MULTI