summaryrefslogtreecommitdiff
path: root/net/net.c
diff options
context:
space:
mode:
authorJoe Hershberger <joe.hershberger@ni.com>2015-03-22 22:09:24 (GMT)
committerSimon Glass <sjg@chromium.org>2015-04-18 17:11:14 (GMT)
commit60304592b96414b9d84a919262e4b2daf1a954fb (patch)
tree9b74a696268d3cc4539523bfa9bb610ee9905886 /net/net.c
parent22f68524f84c3a0d620e787c51d5f244ef8e0aca (diff)
downloadu-boot-fsl-qoriq-60304592b96414b9d84a919262e4b2daf1a954fb.tar.xz
net: Improve error handling
Take a pass at plumbing errors through to the users of the network stack Currently only the start() function errors will be returned from NetLoop(). recv() tends not to have errors, so that is likely not worth adding. send() certainly can return errors, but this patch does not attempt to plumb them yet. halt() is not expected to error. Signed-off-by: Joe Hershberger <joe.hershberger@ni.com> Reviewed-by: Simon Glass <sjg@chromium.org>
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 afec443..69f38f7 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;
}
/**********************************************************************/