summaryrefslogtreecommitdiffstats
path: root/net/net.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/net.c')
-rw-r--r--net/net.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/net/net.c b/net/net.c
index afec4433f0..69f38f7483 100644
--- a/net/net.c
+++ b/net/net.c
@@ -84,6 +84,7 @@
#include <common.h>
#include <command.h>
#include <environment.h>
+#include <errno.h>
#include <net.h>
#if defined(CONFIG_STATUS_LED)
#include <miiphy.h>
@@ -333,7 +334,7 @@ void net_init(void)
int NetLoop(enum proto_t protocol)
{
- int ret = -1;
+ int ret = -EINVAL;
NetRestarted = 0;
NetDevExists = 0;
@@ -345,9 +346,10 @@ int NetLoop(enum proto_t protocol)
if (eth_is_on_demand_init() || protocol != NETCONS) {
eth_halt();
eth_set_current();
- if (eth_init() < 0) {
+ ret = eth_init();
+ if (ret < 0) {
eth_halt();
- return -1;
+ return ret;
}
} else
eth_init_state_only();
@@ -370,7 +372,7 @@ restart:
case 1:
/* network not configured */
eth_halt();
- return -1;
+ return -ENODEV;
case 2:
/* network device not configured */
@@ -484,6 +486,8 @@ restart:
/*
* Check the ethernet for a new packet. The ethernet
* receive routine will process it.
+ * Most drivers return the most recent packet size, but not
+ * errors that may have happened.
*/
eth_rx();
@@ -537,7 +541,7 @@ restart:
}
if (net_state == NETLOOP_FAIL)
- NetStartAgain();
+ ret = NetStartAgain();
switch (net_state) {
@@ -597,11 +601,12 @@ startAgainTimeout(void)
net_set_state(NETLOOP_RESTART);
}
-void NetStartAgain(void)
+int NetStartAgain(void)
{
char *nretry;
int retry_forever = 0;
unsigned long retrycnt = 0;
+ int ret;
nretry = getenv("netretry");
if (nretry) {
@@ -621,7 +626,11 @@ void NetStartAgain(void)
if ((!retry_forever) && (NetTryCount >= retrycnt)) {
eth_halt();
net_set_state(NETLOOP_FAIL);
- return;
+ /*
+ * We don't provide a way for the protocol to return an error,
+ * but this is almost always the reason.
+ */
+ return -ETIMEDOUT;
}
NetTryCount++;
@@ -630,7 +639,7 @@ void NetStartAgain(void)
#if !defined(CONFIG_NET_DO_NOT_TRY_ANOTHER)
eth_try_another(!NetRestarted);
#endif
- eth_init();
+ ret = eth_init();
if (NetRestartWrap) {
NetRestartWrap = 0;
if (NetDevExists) {
@@ -642,6 +651,7 @@ void NetStartAgain(void)
} else {
net_set_state(NETLOOP_RESTART);
}
+ return ret;
}
/**********************************************************************/
OpenPOWER on IntegriCloud