From patchwork Wed Nov 25 16:21:56 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Glendinning X-Patchwork-Id: 39319 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 61C971007D1 for ; Thu, 26 Nov 2009 03:30:34 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756912AbZKYQaW (ORCPT ); Wed, 25 Nov 2009 11:30:22 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1753470AbZKYQaV (ORCPT ); Wed, 25 Nov 2009 11:30:21 -0500 Received: from 77-44-110-64.xdsl.murphx.net ([77.44.110.64]:44049 "EHLO drevil2.shawell.net" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752637AbZKYQaV (ORCPT ); Wed, 25 Nov 2009 11:30:21 -0500 X-Greylist: delayed 499 seconds by postgrey-1.27 at vger.kernel.org; Wed, 25 Nov 2009 11:30:21 EST Received: from localhost.localdomain (unknown [10.0.20.14]) by drevil2.shawell.net (Postfix) with ESMTP id 0A78267B55; Wed, 25 Nov 2009 16:21:57 +0000 (GMT) From: Steve Glendinning To: netdev@vger.kernel.org Cc: Steve Glendinning Subject: [PATCH] smsc9420: prevent BUG() if ethtool is called with interface down Date: Wed, 25 Nov 2009 16:21:56 +0000 Message-Id: <1259166116-5036-1-git-send-email-steve.glendinning@smsc.com> X-Mailer: git-send-email 1.6.2.5 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch fixes a null pointer dereference BUG() if ethtool is used on an smsc9420 interface while it is down, because the phy_dev is only allocated while the interface is up. Please also consider for -stable. Signed-off-by: Steve Glendinning --- drivers/net/smsc9420.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-) diff --git a/drivers/net/smsc9420.c b/drivers/net/smsc9420.c index 92e2bbe..12f0f5d 100644 --- a/drivers/net/smsc9420.c +++ b/drivers/net/smsc9420.c @@ -252,6 +252,9 @@ static int smsc9420_ethtool_get_settings(struct net_device *dev, { struct smsc9420_pdata *pd = netdev_priv(dev); + if (!pd->phy_dev) + return -ENODEV; + cmd->maxtxpkt = 1; cmd->maxrxpkt = 1; return phy_ethtool_gset(pd->phy_dev, cmd); @@ -262,6 +265,9 @@ static int smsc9420_ethtool_set_settings(struct net_device *dev, { struct smsc9420_pdata *pd = netdev_priv(dev); + if (!pd->phy_dev) + return -ENODEV; + return phy_ethtool_sset(pd->phy_dev, cmd); } @@ -290,6 +296,10 @@ static void smsc9420_ethtool_set_msglevel(struct net_device *netdev, u32 data) static int smsc9420_ethtool_nway_reset(struct net_device *netdev) { struct smsc9420_pdata *pd = netdev_priv(netdev); + + if (!pd->phy_dev) + return -ENODEV; + return phy_start_aneg(pd->phy_dev); } @@ -312,6 +322,10 @@ smsc9420_ethtool_getregs(struct net_device *dev, struct ethtool_regs *regs, for (i = 0; i < 0x100; i += (sizeof(u32))) data[j++] = smsc9420_reg_read(pd, i); + // cannot read phy registers if the net device is down + if (!phy_dev) + return; + for (i = 0; i <= 31; i++) data[j++] = smsc9420_mii_read(phy_dev->bus, phy_dev->addr, i); }