bootstage: Use show_boot_error() for -ve progress numbers
[oweals/u-boot.git] / net / eth.c
index dbd1e2dbae6dc264455ee3683abce39f78ec9e58..5cefe4c8be04ab91249964f055358d7ceb457fb4 100644 (file)
--- a/net/eth.c
+++ b/net/eth.c
@@ -62,8 +62,6 @@ int eth_getenv_enetaddr_by_index(const char *base_name, int index,
        return eth_getenv_enetaddr(enetvar, enetaddr);
 }
 
-#ifdef CONFIG_NET_MULTI
-
 static int eth_mac_skip(int index)
 {
        char enetvar[15];
@@ -83,9 +81,6 @@ static int __def_eth_init(bd_t *bis)
 int cpu_eth_init(bd_t *bis) __attribute__((weak, alias("__def_eth_init")));
 int board_eth_init(bd_t *bis) __attribute__((weak, alias("__def_eth_init")));
 
-extern int mv6436x_eth_initialize(bd_t *);
-extern int mv6446x_eth_initialize(bd_t *);
-
 #ifdef CONFIG_API
 extern void (*push_packet)(volatile void *, int);
 
@@ -108,6 +103,8 @@ struct eth_device *eth_get_dev_by_name(const char *devname)
 {
        struct eth_device *dev, *target_dev;
 
+       BUG_ON(devname == NULL);
+
        if (!eth_devices)
                return NULL;
 
@@ -127,7 +124,6 @@ struct eth_device *eth_get_dev_by_name(const char *devname)
 struct eth_device *eth_get_dev_by_index(int index)
 {
        struct eth_device *dev, *target_dev;
-       int idx = 0;
 
        if (!eth_devices)
                return NULL;
@@ -135,12 +131,11 @@ struct eth_device *eth_get_dev_by_index(int index)
        dev = eth_devices;
        target_dev = NULL;
        do {
-               if (idx == index) {
+               if (dev->index == index) {
                        target_dev = dev;
                        break;
                }
                dev = dev->next;
-               idx++;
        } while (dev != eth_devices);
 
        return target_dev;
@@ -148,45 +143,27 @@ struct eth_device *eth_get_dev_by_index(int index)
 
 int eth_get_dev_index (void)
 {
-       struct eth_device *dev;
-       int num = 0;
-
-       if (!eth_devices) {
-               return (-1);
-       }
-
-       for (dev = eth_devices; dev; dev = dev->next) {
-               if (dev == eth_current)
-                       break;
-               ++num;
-       }
-
-       if (dev) {
-               return (num);
+       if (!eth_current) {
+               return -1;
        }
 
-       return (0);
+       return eth_current->index;
 }
 
 static void eth_current_changed(void)
 {
-#ifdef CONFIG_NET_MULTI
-       {
-               char *act = getenv("ethact");
-               /* update current ethernet name */
-               if (eth_current)
-               {
-                       if (act == NULL || strcmp(act, eth_current->name) != 0)
-                               setenv("ethact", eth_current->name);
-               }
-               /*
-                * remove the variable completely if there is no active
-                * interface
-                */
-               else if (act != NULL)
-                       setenv("ethact", NULL);
+       char *act = getenv("ethact");
+       /* update current ethernet name */
+       if (eth_current) {
+               if (act == NULL || strcmp(act, eth_current->name) != 0)
+                       setenv("ethact", eth_current->name);
        }
-#endif
+       /*
+        * remove the variable completely if there is no active
+        * interface
+        */
+       else if (act != NULL)
+               setenv("ethact", NULL);
 }
 
 int eth_write_hwaddr(struct eth_device *dev, const char *base_name,
@@ -224,13 +201,9 @@ int eth_write_hwaddr(struct eth_device *dev, const char *base_name,
 int eth_register(struct eth_device *dev)
 {
        struct eth_device *d;
+       static int index = 0;
 
-       size_t len = strlen(dev->name);
-       if (len >= NAMESIZE) {
-               printf("Network driver name is too long (%zu >= %zu): %s\n",
-                                               len, NAMESIZE, dev->name);
-               return -1;
-       }
+       assert(strlen(dev->name) < sizeof(dev->name));
 
        if (!eth_devices) {
                eth_current = eth_devices = dev;
@@ -243,14 +216,43 @@ int eth_register(struct eth_device *dev)
 
        dev->state = ETH_STATE_INIT;
        dev->next  = eth_devices;
+       dev->index = index++;
 
        return 0;
 }
 
-int eth_initialize(bd_t *bis)
+int eth_unregister(struct eth_device *dev)
 {
-       int eth_number = 0;
+       struct eth_device *cur;
+
+       /* No device */
+       if (!eth_devices)
+               return -1;
+
+       for (cur = eth_devices; cur->next != eth_devices && cur->next != dev;
+            cur = cur->next)
+               ;
+
+       /* Device not found */
+       if (cur->next != dev)
+               return -1;
+
+       cur->next = dev->next;
+
+       if (eth_devices == dev)
+               eth_devices = dev->next == eth_devices ? NULL : dev->next;
 
+       if (eth_current == dev) {
+               eth_current = eth_devices;
+               eth_current_changed();
+       }
+
+       return 0;
+}
+
+int eth_initialize(bd_t *bis)
+{
+       int num_devices = 0;
        eth_devices = NULL;
        eth_current = NULL;
 
@@ -276,22 +278,16 @@ int eth_initialize(bd_t *bis)
        } else
                printf("Net Initialization Skipped\n");
 
-#if defined(CONFIG_DB64360) || defined(CONFIG_CPCI750)
-       mv6436x_eth_initialize(bis);
-#endif
-#if defined(CONFIG_DB64460) || defined(CONFIG_P3Mx)
-       mv6446x_eth_initialize(bis);
-#endif
        if (!eth_devices) {
                puts ("No ethernet found.\n");
-               show_boot_progress (-64);
+               show_boot_error(64);
        } else {
                struct eth_device *dev = eth_devices;
                char *ethprime = getenv ("ethprime");
 
                show_boot_progress (65);
                do {
-                       if (eth_number)
+                       if (dev->index)
                                puts (", ");
 
                        printf("%s", dev->name);
@@ -304,18 +300,18 @@ int eth_initialize(bd_t *bis)
                        if (strchr(dev->name, ' '))
                                puts("\nWarning: eth device name has a space!\n");
 
-                       if (eth_write_hwaddr(dev, "eth", eth_number))
-                               puts("Warning: failed to set MAC address\n");
+                       if (eth_write_hwaddr(dev, "eth", dev->index))
+                               puts("\nWarning: failed to set MAC address\n");
 
-                       eth_number++;
                        dev = dev->next;
+                       num_devices++;
                } while(dev != eth_devices);
 
                eth_current_changed();
                putc ('\n');
        }
 
-       return eth_number;
+       return num_devices;
 }
 
 #ifdef CONFIG_MCAST_TFTP
@@ -366,7 +362,6 @@ u32 ether_crc (size_t len, unsigned char const *p)
 
 int eth_init(bd_t *bis)
 {
-       int eth_number;
        struct eth_device *old_current, *dev;
 
        if (!eth_current) {
@@ -375,16 +370,14 @@ int eth_init(bd_t *bis)
        }
 
        /* Sync environment with network devices */
-       eth_number = 0;
        dev = eth_devices;
        do {
                uchar env_enetaddr[6];
 
-               if (eth_getenv_enetaddr_by_index("eth", eth_number,
+               if (eth_getenv_enetaddr_by_index("eth", dev->index,
                                                 env_enetaddr))
                        memcpy(dev->enetaddr, env_enetaddr, 6);
 
-               ++eth_number;
                dev = dev->next;
        } while (dev != eth_devices);
 
@@ -538,27 +531,3 @@ char *eth_get_name (void)
 {
        return (eth_current ? eth_current->name : "unknown");
 }
-
-#else /* !CONFIG_NET_MULTI */
-
-#warning Ethernet driver is deprecated.  Please update to use CONFIG_NET_MULTI
-
-extern int mcf52x2_miiphy_initialize(bd_t *bis);
-extern int ns7520_miiphy_initialize(bd_t *bis);
-
-
-int eth_initialize(bd_t *bis)
-{
-#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
-       miiphy_init();
-#endif
-
-#if defined(CONFIG_MCF52x2)
-       mcf52x2_miiphy_initialize(bis);
-#endif
-#if defined(CONFIG_DRIVER_NS7520_ETHERNET)
-       ns7520_miiphy_initialize(bis);
-#endif
-       return 0;
-}
-#endif