diff options
author | Joe Hershberger <joe.hershberger@ni.com> | 2015-03-22 17:09:24 -0500 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2015-04-18 11:11:14 -0600 |
commit | 60304592b96414b9d84a919262e4b2daf1a954fb (patch) | |
tree | 9b74a696268d3cc4539523bfa9bb610ee9905886 /net/net.c | |
parent | 22f68524f84c3a0d620e787c51d5f244ef8e0aca (diff) | |
download | u-boot-imx-60304592b96414b9d84a919262e4b2daf1a954fb.zip u-boot-imx-60304592b96414b9d84a919262e4b2daf1a954fb.tar.gz u-boot-imx-60304592b96414b9d84a919262e4b2daf1a954fb.tar.bz2 |
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.c | 26 |
1 files changed, 18 insertions, 8 deletions
@@ -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; } /**********************************************************************/ |