From patchwork Tue Feb 10 16:35:58 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Detsch X-Patchwork-Id: 22879 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by ozlabs.org (Postfix) with ESMTP id A52B3DDDA0 for ; Wed, 11 Feb 2009 03:36:09 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754216AbZBJQgH (ORCPT ); Tue, 10 Feb 2009 11:36:07 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1753942AbZBJQgG (ORCPT ); Tue, 10 Feb 2009 11:36:06 -0500 Received: from e24smtp04.br.ibm.com ([32.104.18.25]:52257 "EHLO e24smtp04.br.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753437AbZBJQgF (ORCPT ); Tue, 10 Feb 2009 11:36:05 -0500 Received: from d24relay01.br.ibm.com (d24relay01.br.ibm.com [9.8.31.16]) by e24smtp04.br.ibm.com (8.13.1/8.13.1) with ESMTP id n1AGYUiv027922 for ; Tue, 10 Feb 2009 14:34:30 -0200 Received: from d24av01.br.ibm.com (d24av01.br.ibm.com [9.18.232.46]) by d24relay01.br.ibm.com (8.13.8/8.13.8/NCO v9.1) with ESMTP id n1AHZTcQ3571758 for ; Tue, 10 Feb 2009 14:35:30 -0300 Received: from d24av01.br.ibm.com (loopback [127.0.0.1]) by d24av01.br.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id n1AGa1QB031225 for ; Tue, 10 Feb 2009 14:36:01 -0200 Received: from [9.8.11.92] ([9.8.11.92]) by d24av01.br.ibm.com (8.12.11.20060308/8.12.11) with ESMTP id n1AGZxu3031133; Tue, 10 Feb 2009 14:36:01 -0200 From: Andre Detsch To: netdev@vger.kernel.org, e1000-devel@lists.sourceforge.net Subject: [PATCH] Fix link test for e1000 and e1000e when iface is down Date: Tue, 10 Feb 2009 14:35:58 -0200 User-Agent: KMail/1.9.6 MIME-Version: 1.0 Content-Disposition: inline Message-Id: <200902101435.58331.adetsch@br.ibm.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org When running ethtool -t on an interface that was just brought down, the link test was failing. That's because we need to perform a reset on the interface to be able to check the link status correctly. There is no problem on doing such reset right before the test, as the link test routine is prepared to wait for autoneg to complete if that is the case. Signed-off-by: Andre Detsch --- The bug can be produced with the following commands (assuming eth0 is an e1000 or e1000e iface): ifconfig eth0 up; ifconfig eth0 down; ethtool -t eth0; drivers/net/e1000/e1000_ethtool.c | 10 ++++++---- drivers/net/e1000e/ethtool.c | 10 +++++----- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/drivers/net/e1000/e1000_ethtool.c b/drivers/net/e1000/e1000_ethtool.c index c854c96..bed7c88 100644 --- a/drivers/net/e1000/e1000_ethtool.c +++ b/drivers/net/e1000/e1000_ethtool.c @@ -1646,16 +1646,18 @@ static void e1000_diag_test(struct net_device *netdev, DPRINTK(HW, INFO, "offline testing starting\n"); - /* Link test performed before hardware reset so autoneg doesn't - * interfere with test result */ + if (!if_running) + e1000_reset(adapter); + + /* Due to the reset above, autoneg may be undergoing. + * But link test is prepared to handle such situation. + */ if (e1000_link_test(adapter, &data[4])) eth_test->flags |= ETH_TEST_FL_FAILED; if (if_running) /* indicate we're in test mode */ dev_close(netdev); - else - e1000_reset(adapter); if (e1000_reg_test(adapter, &data[0])) eth_test->flags |= ETH_TEST_FL_FAILED; diff --git a/drivers/net/e1000e/ethtool.c b/drivers/net/e1000e/ethtool.c index e48956d..d14a5be 100644 --- a/drivers/net/e1000e/ethtool.c +++ b/drivers/net/e1000e/ethtool.c @@ -1647,9 +1647,11 @@ static void e1000_diag_test(struct net_device *netdev, e_info("offline testing starting\n"); - /* - * Link test performed before hardware reset so autoneg doesn't - * interfere with test result + if (!if_running) + e1000e_reset(adapter); + + /* Due to the reset above, autoneg may be undergoing. + * But link test is prepared to handle such situation. */ if (e1000_link_test(adapter, &data[4])) eth_test->flags |= ETH_TEST_FL_FAILED; @@ -1657,8 +1659,6 @@ static void e1000_diag_test(struct net_device *netdev, if (if_running) /* indicate we're in test mode */ dev_close(netdev); - else - e1000e_reset(adapter); if (e1000_reg_test(adapter, &data[0])) eth_test->flags |= ETH_TEST_FL_FAILED;