|
@@ -55,6 +55,14 @@ static inline int eth_setenv_enetaddr_by_index(const char *base_name, int index,
|
|
|
return eth_setenv_enetaddr(enetvar, enetaddr);
|
|
|
}
|
|
|
|
|
|
+static void eth_env_init(void)
|
|
|
+{
|
|
|
+ const char *s;
|
|
|
+
|
|
|
+ s = getenv("bootfile");
|
|
|
+ if (s != NULL)
|
|
|
+ copy_filename(BootFile, s, sizeof(BootFile));
|
|
|
+}
|
|
|
|
|
|
static int eth_mac_skip(int index)
|
|
|
{
|
|
@@ -64,6 +72,8 @@ static int eth_mac_skip(int index)
|
|
|
return ((skip_state = getenv(enetvar)) != NULL);
|
|
|
}
|
|
|
|
|
|
+static void eth_current_changed(void);
|
|
|
+
|
|
|
/*
|
|
|
* CPU and board-specific Ethernet initializations. Aliased function
|
|
|
* signals caller to move on
|
|
@@ -87,6 +97,11 @@ static unsigned int eth_rcv_current, eth_rcv_last;
|
|
|
static struct eth_device *eth_devices;
|
|
|
struct eth_device *eth_current;
|
|
|
|
|
|
+static void eth_set_current_to_next(void)
|
|
|
+{
|
|
|
+ eth_current = eth_current->next;
|
|
|
+}
|
|
|
+
|
|
|
struct eth_device *eth_get_dev_by_name(const char *devname)
|
|
|
{
|
|
|
struct eth_device *dev, *target_dev;
|
|
@@ -137,22 +152,6 @@ int eth_get_dev_index(void)
|
|
|
return eth_current->index;
|
|
|
}
|
|
|
|
|
|
-static void eth_current_changed(void)
|
|
|
-{
|
|
|
- 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);
|
|
|
-}
|
|
|
-
|
|
|
int eth_write_hwaddr(struct eth_device *dev, const char *base_name,
|
|
|
int eth_number)
|
|
|
{
|
|
@@ -251,14 +250,6 @@ int eth_unregister(struct eth_device *dev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static void eth_env_init(bd_t *bis)
|
|
|
-{
|
|
|
- const char *s;
|
|
|
-
|
|
|
- if ((s = getenv("bootfile")) != NULL)
|
|
|
- copy_filename(BootFile, s, sizeof(BootFile));
|
|
|
-}
|
|
|
-
|
|
|
int eth_initialize(bd_t *bis)
|
|
|
{
|
|
|
int num_devices = 0;
|
|
@@ -274,7 +265,7 @@ int eth_initialize(bd_t *bis)
|
|
|
phy_init();
|
|
|
#endif
|
|
|
|
|
|
- eth_env_init(bis);
|
|
|
+ eth_env_init();
|
|
|
|
|
|
/*
|
|
|
* If board-specific initialization exists, call it.
|
|
@@ -479,6 +470,22 @@ int eth_receive(void *packet, int length)
|
|
|
}
|
|
|
#endif /* CONFIG_API */
|
|
|
|
|
|
+static void eth_current_changed(void)
|
|
|
+{
|
|
|
+ char *act = getenv("ethact");
|
|
|
+ /* update current ethernet name */
|
|
|
+ if (eth_get_dev()) {
|
|
|
+ if (act == NULL || strcmp(act, eth_get_name()) != 0)
|
|
|
+ setenv("ethact", eth_get_name());
|
|
|
+ }
|
|
|
+ /*
|
|
|
+ * remove the variable completely if there is no active
|
|
|
+ * interface
|
|
|
+ */
|
|
|
+ else if (act != NULL)
|
|
|
+ setenv("ethact", NULL);
|
|
|
+}
|
|
|
+
|
|
|
void eth_try_another(int first_restart)
|
|
|
{
|
|
|
static struct eth_device *first_failed;
|
|
@@ -492,17 +499,17 @@ void eth_try_another(int first_restart)
|
|
|
if ((ethrotate != NULL) && (strcmp(ethrotate, "no") == 0))
|
|
|
return;
|
|
|
|
|
|
- if (!eth_current)
|
|
|
+ if (!eth_get_dev())
|
|
|
return;
|
|
|
|
|
|
if (first_restart)
|
|
|
- first_failed = eth_current;
|
|
|
+ first_failed = eth_get_dev();
|
|
|
|
|
|
- eth_current = eth_current->next;
|
|
|
+ eth_set_current_to_next();
|
|
|
|
|
|
eth_current_changed();
|
|
|
|
|
|
- if (first_failed == eth_current)
|
|
|
+ if (first_failed == eth_get_dev())
|
|
|
NetRestartWrap = 1;
|
|
|
}
|
|
|
|
|
@@ -513,7 +520,7 @@ void eth_set_current(void)
|
|
|
struct eth_device *old_current;
|
|
|
int env_id;
|
|
|
|
|
|
- if (!eth_current) /* XXX no current */
|
|
|
+ if (!eth_get_dev()) /* XXX no current */
|
|
|
return;
|
|
|
|
|
|
env_id = get_env_id();
|
|
@@ -522,18 +529,18 @@ void eth_set_current(void)
|
|
|
env_changed_id = env_id;
|
|
|
}
|
|
|
if (act != NULL) {
|
|
|
- old_current = eth_current;
|
|
|
+ old_current = eth_get_dev();
|
|
|
do {
|
|
|
- if (strcmp(eth_current->name, act) == 0)
|
|
|
+ if (strcmp(eth_get_name(), act) == 0)
|
|
|
return;
|
|
|
- eth_current = eth_current->next;
|
|
|
- } while (old_current != eth_current);
|
|
|
+ eth_set_current_to_next();
|
|
|
+ } while (old_current != eth_get_dev());
|
|
|
}
|
|
|
|
|
|
eth_current_changed();
|
|
|
}
|
|
|
|
|
|
-char *eth_get_name(void)
|
|
|
+const char *eth_get_name(void)
|
|
|
{
|
|
|
- return eth_current ? eth_current->name : "unknown";
|
|
|
+ return eth_get_dev() ? eth_get_dev()->name : "unknown";
|
|
|
}
|