[U-Boot] [PATCH 1/2] dm: eth: Test 'ethrotate' before changing current ethernet device

In eth_current_changed(), the call to eth_get_dev() below has a side effect of rotating ethernet device if uc_priv->current == NULL. This is not what we want when 'ethrotate' variable is 'no'.
Signed-off-by: Bin Meng bmeng.cn@gmail.com ---
net/eth.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
diff --git a/net/eth.c b/net/eth.c index 6cf3a35..6c490a6 100644 --- a/net/eth.c +++ b/net/eth.c @@ -1039,6 +1039,17 @@ int eth_receive(void *packet, int length) static void eth_current_changed(void) { char *act = getenv("ethact"); + char *ethrotate; + + /* + * The call to eth_get_dev() below has a side effect of rotating + * ethernet device if uc_priv->current == NULL. This is not what + * we want when 'ethrotate' variable is 'no'. + */ + ethrotate = getenv("ethrotate"); + if ((ethrotate != NULL) && (strcmp(ethrotate, "no") == 0)) + return; + /* update current ethernet name */ if (eth_get_dev()) { if (act == NULL || strcmp(act, eth_get_name()) != 0)

When 'ethrotate' variable is set to 'no' and 'ethact' variable is already set to an ethernet device, we should stick to 'ethact'.
Signed-off-by: Bin Meng bmeng.cn@gmail.com ---
net/eth.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-)
diff --git a/net/eth.c b/net/eth.c index 6c490a6..18c53bf 100644 --- a/net/eth.c +++ b/net/eth.c @@ -337,14 +337,30 @@ U_BOOT_ENV_CALLBACK(ethaddr, on_ethaddr);
int eth_init(void) { - struct udevice *current; + char *ethact = getenv("ethact"); + char *ethrotate = getenv("ethrotate"); + struct udevice *current = NULL; struct udevice *old_current; int ret = -ENODEV;
- current = eth_get_dev(); + /* + * When 'ethrotate' variable is set to 'no' and 'ethact' variable + * is already set to an ethernet device, we should stick to 'ethact'. + */ + if ((ethrotate != NULL) && (strcmp(ethrotate, "no") == 0)) { + if (ethact) { + current = eth_get_dev_by_name(ethact); + if (!current) + return -EINVAL; + } + } + if (!current) { - printf("No ethernet found.\n"); - return -ENODEV; + current = eth_get_dev(); + if (!current) { + printf("No ethernet found.\n"); + return -ENODEV; + } }
old_current = current;

On Tue, Dec 22, 2015 at 12:43 AM, Bin Meng bmeng.cn@gmail.com wrote:
When 'ethrotate' variable is set to 'no' and 'ethact' variable is already set to an ethernet device, we should stick to 'ethact'.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
Acked-by: Joe Hershberger joe.hershberger@ni.com

On 22 December 2015 at 12:05, Joe Hershberger joe.hershberger@gmail.com wrote:
On Tue, Dec 22, 2015 at 12:43 AM, Bin Meng bmeng.cn@gmail.com wrote:
When 'ethrotate' variable is set to 'no' and 'ethact' variable is already set to an ethernet device, we should stick to 'ethact'.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
Acked-by: Joe Hershberger joe.hershberger@ni.com
Acked-by: Simon Glass sjg@chromium.org Tested on sandbox: Tested-by: Simon Glass sjg@chromium.org

On 3 January 2016 at 13:52, Simon Glass sjg@chromium.org wrote:
On 22 December 2015 at 12:05, Joe Hershberger joe.hershberger@gmail.com wrote:
On Tue, Dec 22, 2015 at 12:43 AM, Bin Meng bmeng.cn@gmail.com wrote:
When 'ethrotate' variable is set to 'no' and 'ethact' variable is already set to an ethernet device, we should stick to 'ethact'.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
Acked-by: Joe Hershberger joe.hershberger@ni.com
Acked-by: Simon Glass sjg@chromium.org Tested on sandbox: Tested-by: Simon Glass sjg@chromium.org
Applied to u-boot-dm/master, thanks!

On Tue, Dec 22, 2015 at 12:43 AM, Bin Meng bmeng.cn@gmail.com wrote:
In eth_current_changed(), the call to eth_get_dev() below has a side effect of rotating ethernet device if uc_priv->current == NULL. This is not what we want when 'ethrotate' variable is 'no'.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
Acked-by: Joe Hershberger joe.hershberger@ni.com

On 22 December 2015 at 12:04, Joe Hershberger joe.hershberger@gmail.com wrote:
On Tue, Dec 22, 2015 at 12:43 AM, Bin Meng bmeng.cn@gmail.com wrote:
In eth_current_changed(), the call to eth_get_dev() below has a side effect of rotating ethernet device if uc_priv->current == NULL. This is not what we want when 'ethrotate' variable is 'no'.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
Acked-by: Joe Hershberger joe.hershberger@ni.com
Acked-by: Simon Glass sjg@chromium.org Tested on sandbox: Tested-by: Simon Glass sjg@chromium.org

On 3 January 2016 at 13:52, Simon Glass sjg@chromium.org wrote:
On 22 December 2015 at 12:04, Joe Hershberger joe.hershberger@gmail.com wrote:
On Tue, Dec 22, 2015 at 12:43 AM, Bin Meng bmeng.cn@gmail.com wrote:
In eth_current_changed(), the call to eth_get_dev() below has a side effect of rotating ethernet device if uc_priv->current == NULL. This is not what we want when 'ethrotate' variable is 'no'.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
Acked-by: Joe Hershberger joe.hershberger@ni.com
Acked-by: Simon Glass sjg@chromium.org Tested on sandbox: Tested-by: Simon Glass sjg@chromium.org
Applied to u-boot-dm/master, thanks!
participants (3)
-
Bin Meng
-
Joe Hershberger
-
Simon Glass