Received: by 10.213.65.68 with SMTP id h4csp1061326imn; Wed, 14 Mar 2018 08:28:05 -0700 (PDT) X-Google-Smtp-Source: AG47ELvxButN/VVOArkj5xLB3RJGWT8XZGtlw0aNCLuY534NFDUp3Mp3EDj3Y7bV1OObxovvJ5My X-Received: by 2002:a17:902:f64:: with SMTP id 91-v6mr4490398ply.232.1521041284946; Wed, 14 Mar 2018 08:28:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521041284; cv=none; d=google.com; s=arc-20160816; b=btwfV8NCkfo6shBxVpGZ7v2QomRkex+pwbtoYL1YMjTVanACfz6l9i2KcAWAxA5DCp XyDCW6YNMRvo+Cqu5shPMCAQ4ztuqmmxytHUio6dpPFhsik5+bvEQXLcDHopLcmkXDmH DwTFbjJGOz1YX9PBZPt5oZ8ZI9trk+puTjQAMrxB/ajmvLex+FeJRMwdB/AyuGNmeeW/ xJuO4z6BsvGShh3LkvC9taK+g7Bc9SCzzy9H/AndxeCgYNHsi8PwvehNuyjIMssIpRd1 UrGI1IMe/ZpLA4OTIPsGhuHOVDMSkIzpabMMxsycfGnOLhPhywA8LUxRaseXi3BvE9il GmDQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:content-transfer-encoding :content-language:accept-language:in-reply-to:references:message-id :date:thread-index:thread-topic:subject:cc:to:from :arc-authentication-results; bh=gxUavV2TUasifG0ED+5kbJHFG3d8Zxk9aWXpE/GpOPA=; b=mspoQ/665pIGXk5XDjnoO8SqikBOFUgEkxTl7OZzAc9304efGKjjdLLpCKjZB9/PCp 6/ZX7qR90F2mQdVV5i/GHIccDiHyaZGcCjxHkucXlpPxv45q2TQowyFyL4e2Y2FXFvYb k7e/vQNYg+yrx2QLZoCOcHK4+FRGj9C+BVQfG/b/mjBQWtBod6Tog1ePwFrvcZ8Nlv6U SjyQGlYCJwFr9sKW0Crrhq010yB6731ly0OF5tqhDyHvcRvP7FxyF9Pz+Q+W2f6/du1A neMH28+23n+DZ0C0xLiik8qmftnrl698VIgwMi+9AGpvSIWbs/S2OJINEBDn+HuWJd3a RxVA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u10si1991462pgr.247.2018.03.14.08.27.40; Wed, 14 Mar 2018 08:28:04 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751982AbeCNP0T convert rfc822-to-8bit (ORCPT + 99 others); Wed, 14 Mar 2018 11:26:19 -0400 Received: from esa2.microchip.iphmx.com ([68.232.149.84]:56360 "EHLO esa2.microchip.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750779AbeCNP0S (ORCPT ); Wed, 14 Mar 2018 11:26:18 -0400 X-IronPort-AV: E=Sophos;i="5.47,470,1515481200"; d="scan'208";a="12309395" Received: from smtpout.microchip.com (HELO email.microchip.com) ([198.175.253.82]) by esa2.microchip.iphmx.com with ESMTP/TLS/DHE-RSA-AES256-SHA; 14 Mar 2018 08:26:17 -0700 Received: from CHN-SV-EXMX02.mchp-main.com ([fe80::7dfe:3761:863e:3963]) by CHN-SV-EXCH07.mchp-main.com ([fe80::ad3d:8f75:7e60:e60f%15]) with mapi id 14.03.0352.000; Wed, 14 Mar 2018 08:26:17 -0700 From: To: CC: , , , , , Subject: RE: [PATCH] lan78xx: Connect phy early Thread-Topic: [PATCH] lan78xx: Connect phy early Thread-Index: AQHTu6RtZhZ6UcA9+0aQmeuzkFbzWKPP2a1A Date: Wed, 14 Mar 2018 15:26:16 +0000 Message-ID: <9235D6609DB808459E95D78E17F2E43D40CCE531@CHN-SV-EXMX02.mchp-main.com> References: <20180314145456.69029-1-agraf@suse.de> In-Reply-To: <20180314145456.69029-1-agraf@suse.de> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.10.76.4] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Alexander, Thanks for patch. We will look into it if there is any corner case Such as plug in/out while operations. Woojung > -----Original Message----- > From: Alexander Graf [mailto:agraf@suse.de] > Sent: Wednesday, March 14, 2018 10:55 AM > To: Woojung Huh - C21699 > Cc: UNGLinuxDriver ; netdev@vger.kernel.org; linux- > usb@vger.kernel.org; linux-kernel@vger.kernel.org; Thomas Bogendoerfer > ; Phil Elwell > Subject: [PATCH] lan78xx: Connect phy early > > When using wicked with a lan78xx device attached to the system, we > end up with ethtool commands issued on the device before an ifup > got issued. That lead to the following crash: > > Unable to handle kernel NULL pointer dereference at virtual address 0000039c > pgd = ffff800035b30000 > [0000039c] *pgd=0000000000000000 > Internal error: Oops: 96000004 [#1] SMP > Modules linked in: [...] > Supported: Yes > CPU: 3 PID: 638 Comm: wickedd Tainted: G E 4.12.14-0-default #1 > Hardware name: raspberrypi rpi/rpi, BIOS 2018.03-rc2 02/21/2018 > task: ffff800035e74180 task.stack: ffff800036718000 > PC is at phy_ethtool_ksettings_get+0x20/0x98 > LR is at lan78xx_get_link_ksettings+0x44/0x60 [lan78xx] > pc : [] lr : [] pstate: 20000005 > sp : ffff80003671bb20 > x29: ffff80003671bb20 x28: ffff800035e74180 > x27: ffff000008912000 x26: 000000000000001d > x25: 0000000000000124 x24: ffff000008f74d00 > x23: 0000004000114809 x22: 0000000000000000 > x21: ffff80003671bbd0 x20: 0000000000000000 > x19: ffff80003671bbd0 x18: 000000000000040d > x17: 0000000000000001 x16: 0000000000000000 > x15: 0000000000000000 x14: ffffffffffffffff > x13: 0000000000000000 x12: 0000000000000020 > x11: 0101010101010101 x10: fefefefefefefeff > x9 : 7f7f7f7f7f7f7f7f x8 : fefefeff31677364 > x7 : 0000000080808080 x6 : ffff80003671bc9c > x5 : ffff80003671b9f8 x4 : ffff80002c296190 > x3 : 0000000000000000 x2 : 0000000000000000 > x1 : ffff80003671bbd0 x0 : ffff80003671bc00 > Process wickedd (pid: 638, stack limit = 0xffff800036718000) > Call trace: > Exception stack(0xffff80003671b9e0 to 0xffff80003671bb20) > b9e0: ffff80003671bc00 ffff80003671bbd0 0000000000000000 0000000000000000 > ba00: ffff80002c296190 ffff80003671b9f8 ffff80003671bc9c 0000000080808080 > ba20: fefefeff31677364 7f7f7f7f7f7f7f7f fefefefefefefeff 0101010101010101 > ba40: 0000000000000020 0000000000000000 ffffffffffffffff 0000000000000000 > ba60: 0000000000000000 0000000000000001 000000000000040d ffff80003671bbd0 > ba80: 0000000000000000 ffff80003671bbd0 0000000000000000 0000004000114809 > baa0: ffff000008f74d00 0000000000000124 000000000000001d ffff000008912000 > bac0: ffff800035e74180 ffff80003671bb20 ffff000000dcca84 ffff80003671bb20 > bae0: ffff0000086f7f30 0000000020000005 ffff80002c296000 ffff800035223900 > bb00: 0000ffffffffffff 0000000000000000 ffff80003671bb20 ffff0000086f7f30 > [] phy_ethtool_ksettings_get+0x20/0x98 > [] lan78xx_get_link_ksettings+0x44/0x60 [lan78xx] > [] ethtool_get_settings+0x68/0x210 > [] dev_ethtool+0x214/0x2180 > [] dev_ioctl+0x400/0x630 > [] sock_do_ioctl+0x70/0x88 > [] sock_ioctl+0x208/0x368 > [] do_vfs_ioctl+0xb0/0x848 > [] SyS_ioctl+0x8c/0xa8 > Exception stack(0xffff80003671bec0 to 0xffff80003671c000) > bec0: 0000000000000009 0000000000008946 0000fffff4e841d0 0000aa0032687465 > bee0: 0000aaaafa2319d4 0000fffff4e841d4 0000000032687465 0000000032687465 > bf00: 000000000000001d 7f7fff7f7f7f7f7f 72606b622e71ff4c 7f7f7f7f7f7f7f7f > bf20: 0101010101010101 0000000000000020 ffffffffffffffff 0000ffff7f510c68 > bf40: 0000ffff7f6a9d18 0000ffff7f44ce30 000000000000040d 0000ffff7f6f98f0 > bf60: 0000fffff4e842c0 0000000000000001 0000aaaafa2c2e00 0000ffff7f6ab000 > bf80: 0000fffff4e842c0 0000ffff7f62a000 0000aaaafa2b9f20 0000aaaafa2c2e00 > bfa0: 0000fffff4e84818 0000fffff4e841a0 0000ffff7f5ad0cc 0000fffff4e841a0 > bfc0: 0000ffff7f44ce3c 0000000080000000 0000000000000009 000000000000001d > bfe0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 > > The culprit is quite simple: The driver tries to access the phy left and right, > but only actually has a working reference to it when the device is up. > > The fix thus is quite simple too: Get a reference to the phy on probe already > and keep it even when the device is going down. > > With this patch applied, I can successfully run wicked on my system and bring > the interface up and down as many times as I want, without getting NULL pointer > dereferences in between. > > Signed-off-by: Alexander Graf > --- > drivers/net/usb/lan78xx.c | 21 ++++++++++----------- > 1 file changed, 10 insertions(+), 11 deletions(-) > > diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c > index 60a604cc7647..931cc124ab0c 100644 > --- a/drivers/net/usb/lan78xx.c > +++ b/drivers/net/usb/lan78xx.c > @@ -2082,8 +2082,6 @@ static int lan78xx_phy_init(struct lan78xx_net *dev) > > dev->fc_autoneg = phydev->autoneg; > > - phy_start(phydev); > - > netif_dbg(dev, ifup, dev->net, "phy initialised successfully"); > > return 0; > @@ -2512,9 +2510,7 @@ static int lan78xx_open(struct net_device *net) > if (ret < 0) > goto done; > > - ret = lan78xx_phy_init(dev); > - if (ret < 0) > - goto done; > + phy_start(net->phydev); > > /* for Link Check */ > if (dev->urb_intr) { > @@ -2575,13 +2571,7 @@ static int lan78xx_stop(struct net_device *net) > if (timer_pending(&dev->stat_monitor)) > del_timer_sync(&dev->stat_monitor); > > - phy_unregister_fixup_for_uid(PHY_KSZ9031RNX, 0xfffffff0); > - phy_unregister_fixup_for_uid(PHY_LAN8835, 0xfffffff0); > - > phy_stop(net->phydev); > - phy_disconnect(net->phydev); > - > - net->phydev = NULL; > > clear_bit(EVENT_DEV_OPEN, &dev->flags); > netif_stop_queue(net); > @@ -3481,6 +3471,11 @@ static void lan78xx_disconnect(struct usb_interface *intf) > net = dev->net; > unregister_netdev(net); > > + phy_unregister_fixup_for_uid(PHY_KSZ9031RNX, 0xfffffff0); > + phy_unregister_fixup_for_uid(PHY_LAN8835, 0xfffffff0); > + > + phy_disconnect(net->phydev); > + > cancel_delayed_work_sync(&dev->wq); > > usb_scuttle_anchored_urbs(&dev->deferred); > @@ -3634,6 +3629,10 @@ static int lan78xx_probe(struct usb_interface *intf, > pm_runtime_set_autosuspend_delay(&udev->dev, > DEFAULT_AUTOSUSPEND_DELAY); > > + ret = lan78xx_phy_init(dev); > + if (ret < 0) > + return ret; > + > return 0; > > out3: > -- > 2.12.3