Message ID | 20230719173756.380829-1-alexandru.gagniuc@hp.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:c923:0:b0:3e4:2afc:c1 with SMTP id j3csp2604604vqt; Wed, 19 Jul 2023 10:48:34 -0700 (PDT) X-Google-Smtp-Source: APBJJlG1pQUJgxfb19X9SQlKk8WM6ypmjI3Ji9flX1CHYeki/SLPAeJMO6+3/uOZ1P3G+ARKcT5F X-Received: by 2002:a05:6512:3a87:b0:4fb:c881:be5b with SMTP id q7-20020a0565123a8700b004fbc881be5bmr578273lfu.2.1689788914458; Wed, 19 Jul 2023 10:48:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689788914; cv=none; d=google.com; s=arc-20160816; b=urddbW3egdsxavCxrAX6H8w+5dZ15MJBu5OQIKxaEBU3AYDVnRG0HSkulUZLgPLRKR c4RlHaMd4vFfL0+ZkZmK/eZ5Dy6OLWCUQE8T+egcEgv54mXwnDI65m2ZBbWHjiH50LQw qyYOAcBQLBuWhBy3nbCBVIHhyIHj7v4gLYNRMCvWFLABnBdDk9go1yQ0jZpVioSUixc5 5akOPr5W8CoYOhjTzoJXFpFTRMQms4ymS79FYi/IFfrIHD3PTlh6Crd2fXjxgiUKsG4S cp10O+jc+/I5es5HiPFq9Cxq8gBokCpTOUAkb9ol3f4nNwEgWjgh86pUx6Kop9NY5S5g MNOA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=qxAHiS1dMKUPvSOrNPg4ns2JBXqCwmJKuYUyY8qtwHk=; fh=OGVcpkow+bW0eya4lNVJeZuukVDqW1SjwDdUyZmIjkA=; b=KKzw0KpAGg+o+9HX7BCdTFBrphx4mZcIL0IR2sbdcSa+vp3dIpJRfdwlMlwcFwTTf5 D6J9PIIOhkEf6++hB8CrYcIfo6X4/S6N6IhYp5qrlElZSnfSlBX8LBEdqrhAEthn+nwB f2WeHIrvKEK0QLi5IVH1gcU6imfPrcteHQ9eVs9MBWLdrAM3Sn+HLQ0PRMJQVKJnkggM kj93rSV8pucygR8Tu5uQSbYZh77Ibmum0I/pNSO5+qNYlu7VxaE7dI3uLMk4uJLOai/N O2Vp+qJ39uCGYiOKKLqb6W8kLggLNosN6KzvOZ3S6FMoVxhtMtlsRTlFH+McRfFaEUzZ K17w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@hp.com header.s=mimecast20180716 header.b=XN2Z+wVz; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=hp.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id p16-20020a056402075000b0051fee9567c0si3314775edy.312.2023.07.19.10.48.07; Wed, 19 Jul 2023 10:48:34 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@hp.com header.s=mimecast20180716 header.b=XN2Z+wVz; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=hp.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229810AbjGSRi6 (ORCPT <rfc822;daweilics@gmail.com> + 99 others); Wed, 19 Jul 2023 13:38:58 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:60416 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229510AbjGSRi4 (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Wed, 19 Jul 2023 13:38:56 -0400 Received: from us-smtp-delivery-162.mimecast.com (us-smtp-delivery-162.mimecast.com [170.10.129.162]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1DF6519B4 for <linux-kernel@vger.kernel.org>; Wed, 19 Jul 2023 10:38:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hp.com; s=mimecast20180716; t=1689788288; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=qxAHiS1dMKUPvSOrNPg4ns2JBXqCwmJKuYUyY8qtwHk=; b=XN2Z+wVzrI7P8m/UrninbWUyJUqNwVa9n5D2GDAtWCaKBuwselXEWB5mYse5ux1VF8aTRA duwOe6GAJzee0pSVa4Fqm6tmPoj1Iq9own4wLT5bnxS1QSYRSGvsB4cBa7SyxuAt/3Ngct 67Ogi0KLo/d1/tXCh2d5XJ8nrDK6vi8= Received: from g2t4621.austin.hp.com (g2t4621.austin.hp.com [15.73.212.80]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-611-vkySPCFzPUOsuizxogouvw-1; Wed, 19 Jul 2023 13:38:02 -0400 X-MC-Unique: vkySPCFzPUOsuizxogouvw-1 Received: from g1t6217.austin.hpicorp.net (g1t6217.austin.hpicorp.net [15.67.1.144]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by g2t4621.austin.hp.com (Postfix) with ESMTPS id B083426F; Wed, 19 Jul 2023 17:37:59 +0000 (UTC) Received: from jam-buntu.lan (unknown [15.74.50.248]) by g1t6217.austin.hpicorp.net (Postfix) with ESMTP id 174AB65; Wed, 19 Jul 2023 17:37:58 +0000 (UTC) From: Alexandru Gagniuc <alexandru.gagniuc@hp.com> To: linux-usb@vger.kernel.org, netdev@vger.kernel.org Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, hayeswang@realtek.com, jflf_kernel@gmx.com, bjorn@mork.no, svenva@chromium.org, linux-kernel@vger.kernel.org, eniac-xw.zhang@hp.com, Alexandru Gagniuc <alexandru.gagniuc@hp.com>, stable@vger.kernel.org Subject: [PATCH v2] r8152: Suspend USB device before shutdown when WoL is enabled Date: Wed, 19 Jul 2023 17:37:56 +0000 Message-Id: <20230719173756.380829-1-alexandru.gagniuc@hp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <2c12d7a0-3edb-48b3-abf7-135e1a8838ca@rowland.harvard.edu> References: <2c12d7a0-3edb-48b3-abf7-135e1a8838ca@rowland.harvard.edu> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: hp.com Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=WINDOWS-1252; x-default=true X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, RCVD_IN_DNSWL_BLOCKED,RCVD_IN_MSPIKE_H4,RCVD_IN_MSPIKE_WL, SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1770698537518637042 X-GMAIL-MSGID: 1771872100722510383 |
Series |
[v2] r8152: Suspend USB device before shutdown when WoL is enabled
|
|
Commit Message
Alexandru Gagniuc
July 19, 2023, 5:37 p.m. UTC
For Wake-on-LAN to work from S5 (shutdown), the USB link must be put
in U3 state. If it is not, and the host "disappears", the chip will
no longer respond to WoL triggers.
To resolve this, add a notifier block and register it as a reboot
notifier. When WoL is enabled, work through the usb_device struct to
get to the suspend function. Calling this function puts the link in
the correct state for WoL to function.
Fixes: 21ff2e8976b1 ("r8152: support WOL")
Cc: stable@vger.kernel.org
Signed-off-by: Alexandru Gagniuc <alexandru.gagniuc@hp.com>
---
Changes since v1:
* Add "Fixes:" tag to commit message
drivers/net/usb/r8152.c | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
Comments
On Wed, Jul 19, 2023 at 05:37:56PM +0000, Alexandru Gagniuc wrote: > For Wake-on-LAN to work from S5 (shutdown), the USB link must be put > in U3 state. If it is not, and the host "disappears", the chip will > no longer respond to WoL triggers. > > To resolve this, add a notifier block and register it as a reboot > notifier. When WoL is enabled, work through the usb_device struct to > get to the suspend function. Calling this function puts the link in > the correct state for WoL to function. How do you know that the link will _remain_ in the correct state? That is, how do you know that the shutdown processing for the USB host controller won't disable the link entirely, thereby preventing WoL from working? Alan Stern
On 19.07.23 19:37, Alexandru Gagniuc wrote: > For Wake-on-LAN to work from S5 (shutdown), the USB link must be put > in U3 state. If it is not, and the host "disappears", the chip will > no longer respond to WoL triggers. First, a question, does this also apply to S4? > To resolve this, add a notifier block and register it as a reboot > notifier. When WoL is enabled, work through the usb_device struct to > get to the suspend function. Calling this function puts the link in > the correct state for WoL to function. Second, do we really want this to be done for every driver with this issue or do we want a flag for core USB code to suspend devices when the system goes down? UAS at least does something similar. Third, what happens if the device is already suspended when the notifier runs? Regards Oliver
On Wed, Jul 19, 2023 at 02:36:25PM -0400, Alan Stern wrote: > On Wed, Jul 19, 2023 at 05:37:56PM +0000, Alexandru Gagniuc wrote: > > For Wake-on-LAN to work from S5 (shutdown), the USB link must be put > > in U3 state. If it is not, and the host "disappears", the chip will > > no longer respond to WoL triggers. > > > > To resolve this, add a notifier block and register it as a reboot > > notifier. When WoL is enabled, work through the usb_device struct to > > get to the suspend function. Calling this function puts the link in > > the correct state for WoL to function. > > How do you know that the link will _remain_ in the correct state? The objective is to get to xhci_set_link_state() with the USB_SS_PORT_LS_U3 argument. This is achieved through usb_port_suspend() in drivers/usb/host/hub.c, and the function is implemented in drivers/usb/host/xhci-hub.c. This is the only path in the kernel that I am aware of for setting the U3 link state. Given that it is part of the USB subsystem, I am fairly confident it will show consistent behavior across platforms. > That is, how do you know that the shutdown processing for the USB host > controller won't disable the link entirely, thereby preventing WoL from > working? We are talking to the USB hub in order to set the link state. I don't see how specifics of the host controller would influence behavior. I do expect a controller which advertises S4/S5 in /proc/acpi/wakeup to not do anything that would sabotage this capability. Disabling the link entirely would probalby violate that promise. Think of USB-C docks with a power button showing up as a HID class. The scenario herein would disable the power button. I would take that to be a bug in the host controller driver if the S4/S5 capability is advertised. Alex P.S. I sincerely apologize for the delay in my reply. The corporate email servers here have "difficulties" with plaintext and interleaved replies.
On Wed, Aug 02, 2023 at 02:56:43PM +0000, Gagniuc, Alexandru wrote: > On Wed, Jul 19, 2023 at 02:36:25PM -0400, Alan Stern wrote: > > On Wed, Jul 19, 2023 at 05:37:56PM +0000, Alexandru Gagniuc wrote: > > > For Wake-on-LAN to work from S5 (shutdown), the USB link must be put > > > in U3 state. If it is not, and the host "disappears", the chip will > > > no longer respond to WoL triggers. > > > > > > To resolve this, add a notifier block and register it as a reboot > > > notifier. When WoL is enabled, work through the usb_device struct to > > > get to the suspend function. Calling this function puts the link in > > > the correct state for WoL to function. > > > > How do you know that the link will _remain_ in the correct state? > > The objective is to get to xhci_set_link_state() with the USB_SS_PORT_LS_U3 > argument. This is achieved through usb_port_suspend() in drivers/usb/host/hub.c, > and the function is implemented in drivers/usb/host/xhci-hub.c. > > This is the only path in the kernel that I am aware of for setting the U3 link > state. Given that it is part of the USB subsystem, I am fairly confident it will > show consistent behavior across platforms. That does not answer my question. I agree that making this change will put the link into the U3 state. But I don't have any reason to think that some other software won't later put the link into some other state. > > That is, how do you know that the shutdown processing for the USB host > > controller won't disable the link entirely, thereby preventing WoL from > > working? > > We are talking to the USB hub in order to set the link state. I don't see how > specifics of the host controller would influence behavior. Specifics of the host controller probably won't influence behavior. However, specifics of the _software_ can make a big difference. > I do expect a > controller which advertises S4/S5 in /proc/acpi/wakeup to not do anything that > would sabotage this capability. Disabling the link entirely would probalby > violate that promise. Not if the kernel _tells_ the controller to disable the link. > Think of USB-C docks with a power button showing up as a HID class. The scenario > herein would disable the power button. I would take that to be a bug in the host > controller driver if the S4/S5 capability is advertised. Indeed. And I am asking how you can be sure the host controller driver (or some other part of the software stack) doesn't have this bug. Alan Stern
From: Alan Stern <stern@rowland.harvard.edu> On Wed, Aug 02, 2023 at 11:23:46AM -0400, Alan Stern wrote: > On Wed, Aug 02, 2023 at 02:56:43PM +0000, Gagniuc, Alexandru wrote: > > On Wed, Jul 19, 2023 at 02:36:25PM -0400, Alan Stern wrote: > > > How do you know that the link will _remain_ in the correct state? > > > > The objective is to get to xhci_set_link_state() with the USB_SS_PORT_LS_U3 > > argument. This is achieved through usb_port_suspend() in drivers/usb/host/hub.c, > > and the function is implemented in drivers/usb/host/xhci-hub.c. > > > > This is the only path in the kernel that I am aware of for setting the U3 link > > state. Given that it is part of the USB subsystem, I am fairly confident it will > > show consistent behavior across platforms. > > That does not answer my question. I agree that making this change will > put the link into the U3 state. But I don't have any reason to think > that some other software won't later put the link into some other state. I don't have a rigurous proof that the link will remain in the correct state. The only conjecture that I can make is that no other software besides the kernel will be running at this time. Thus, if the kernel manages to not break the link state, things should work as intended. > > > That is, how do you know that the shutdown processing for the USB host > > > controller won't disable the link entirely, thereby preventing WoL from > > > working? > > > > We are talking to the USB hub in order to set the link state. I don't see how > > specifics of the host controller would influence behavior. > > Specifics of the host controller probably won't influence behavior. > However, specifics of the _software_ can make a big difference. > > > I do expect a > > controller which advertises S4/S5 in /proc/acpi/wakeup to not do anything that > > would sabotage this capability. Disabling the link entirely would probalby > > violate that promise. > > Not if the kernel _tells_ the controller to disable the link. > > > Think of USB-C docks with a power button showing up as a HID class. The scenario > > herein would disable the power button. I would take that to be a bug in the host > > controller driver if the S4/S5 capability is advertised. > > Indeed. And I am asking how you can be sure the host controller driver > (or some other part of the software stack) doesn't have this bug. The only way that I have to show that is empirical. I observe that WoL from S5 does not work on a device with an r8153 chip. I apply the change, and verify that WoL from S5 now works in this scenario. What are you thinking of in terms of being sure no current or future bug exists? Alex
On Thu, Aug 10, 2023 at 04:22:16PM +0000, Alexandru Gagniuc wrote: > From: Alan Stern <stern@rowland.harvard.edu> > > On Wed, Aug 02, 2023 at 11:23:46AM -0400, Alan Stern wrote: > > On Wed, Aug 02, 2023 at 02:56:43PM +0000, Gagniuc, Alexandru wrote: > > > On Wed, Jul 19, 2023 at 02:36:25PM -0400, Alan Stern wrote: > > > > How do you know that the link will _remain_ in the correct state? > > > > > > The objective is to get to xhci_set_link_state() with the USB_SS_PORT_LS_U3 > > > argument. This is achieved through usb_port_suspend() in drivers/usb/host/hub.c, > > > and the function is implemented in drivers/usb/host/xhci-hub.c. > > > > > > This is the only path in the kernel that I am aware of for setting the U3 link > > > state. Given that it is part of the USB subsystem, I am fairly confident it will > > > show consistent behavior across platforms. > > > > That does not answer my question. I agree that making this change will > > put the link into the U3 state. But I don't have any reason to think > > that some other software won't later put the link into some other state. > > I don't have a rigurous proof that the link will remain in the correct state. > The only conjecture that I can make is that no other software besides the kernel > will be running at this time. Thus, if the kernel manages to not break the link > state, things should work as intended. > > > > > That is, how do you know that the shutdown processing for the USB host > > > > controller won't disable the link entirely, thereby preventing WoL from > > > > working? > > > > > > We are talking to the USB hub in order to set the link state. I don't see how > > > specifics of the host controller would influence behavior. > > > > Specifics of the host controller probably won't influence behavior. > > However, specifics of the _software_ can make a big difference. > > > > > I do expect a > > > controller which advertises S4/S5 in /proc/acpi/wakeup to not do anything that > > > would sabotage this capability. Disabling the link entirely would probalby > > > violate that promise. > > > > Not if the kernel _tells_ the controller to disable the link. > > > > > Think of USB-C docks with a power button showing up as a HID class. The scenario > > > herein would disable the power button. I would take that to be a bug in the host > > > controller driver if the S4/S5 capability is advertised. > > > > Indeed. And I am asking how you can be sure the host controller driver > > (or some other part of the software stack) doesn't have this bug. > > The only way that I have to show that is empirical. I observe that WoL from S5 > does not work on a device with an r8153 chip. I apply the change, and verify > that WoL from S5 now works in this scenario. What are you thinking of in terms > of being sure no current or future bug exists? I was thinking that the host controller driver's shutdown method might turn off power to all of the ports. For example, in the ehci-hcd driver, ehci_shutdown() calls ehci_silence_controller(), which calls ehci_turn_off_all_ports(). I don't know if xhci-hcd does anything similar. Alan Stern
On Thu, Aug 10, 2023 at 01:34:39PM -0400, Alan Stern wrote: > On Thu, Aug 10, 2023 at 04:22:16PM +0000, Alexandru Gagniuc wrote: > > On Wed, Aug 02, 2023 at 11:23:46AM -0400, Alan Stern wrote: > > > > > > Indeed. And I am asking how you can be sure the host controller driver > > > (or some other part of the software stack) doesn't have this bug. > > > > The only way that I have to show that is empirical. I observe that WoL from S5 > > does not work on a device with an r8153 chip. I apply the change, and verify > > that WoL from S5 now works in this scenario. What are you thinking of in terms > > of being sure no current or future bug exists? > > I was thinking that the host controller driver's shutdown method might > turn off power to all of the ports. > > For example, in the ehci-hcd driver, ehci_shutdown() calls > ehci_silence_controller(), which calls ehci_turn_off_all_ports(). I > don't know if xhci-hcd does anything similar. EHCI is a different beast. I don't think EHCI (USB2.0) has the U3 link state. The equivalent for would be xhci_shutdown(). It makes a call to usb_disable_xhci_ports() for XHCI_SPURIOUS_REBOOT quirk. As I have not encountered it, I don't know how it will affect the link state of other ports. The quirk appears to switch ports to EHCI mode, rather than turn off power. Alex
On Thu, Aug 10, 2023 at 10:51:09PM +0000, Alexandru Gagniuc wrote: > On Thu, Aug 10, 2023 at 01:34:39PM -0400, Alan Stern wrote: > > I was thinking that the host controller driver's shutdown method might > > turn off power to all of the ports. > > > > For example, in the ehci-hcd driver, ehci_shutdown() calls > > ehci_silence_controller(), which calls ehci_turn_off_all_ports(). I > > don't know if xhci-hcd does anything similar. > > EHCI is a different beast. I don't think EHCI (USB2.0) has the U3 link state. USB-2 doesn't have link states, but it does have the notion of a downstream port being suspended, which is effectively the same as U3. > The equivalent for would be xhci_shutdown(). It makes a call to > usb_disable_xhci_ports() for XHCI_SPURIOUS_REBOOT quirk. As I have not > encountered it, I don't know how it will affect the link state of other ports. > The quirk appears to switch ports to EHCI mode, rather than turn off power. All right. The important point is that the patch works for your situation. I was just trying to find out how much thought you had given to the possibilities other people might face, if their systems aren't quite the same as yours. Alan Stern
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 0738baa5b82e..abb82a80d262 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -20,6 +20,7 @@ #include <net/ip6_checksum.h> #include <uapi/linux/mdio.h> #include <linux/mdio.h> +#include <linux/reboot.h> #include <linux/usb/cdc.h> #include <linux/suspend.h> #include <linux/atomic.h> @@ -876,6 +877,7 @@ struct r8152 { struct delayed_work schedule, hw_phy_work; struct mii_if_info mii; struct mutex control; /* use for hw setting */ + struct notifier_block reboot_notifier; #ifdef CONFIG_PM_SLEEP struct notifier_block pm_notifier; #endif @@ -9610,6 +9612,25 @@ static bool rtl8152_supports_lenovo_macpassthru(struct usb_device *udev) return 0; } +/* Suspend realtek chip before system shutdown + * + * For Wake-on-LAN to work from S5, the USB link must be put in U3 state. If + * the host otherwise "disappears", the chip will not respond to WoL triggers. + */ +static int rtl8152_notify(struct notifier_block *nb, unsigned long code, + void *unused) +{ + struct r8152 *tp = container_of(nb, struct r8152, reboot_notifier); + struct device *dev = &tp->udev->dev; + + if (code == SYS_POWER_OFF) { + if (tp->saved_wolopts && dev->type->pm->suspend) + dev->type->pm->suspend(dev); + } + + return NOTIFY_DONE; +} + static int rtl8152_probe(struct usb_interface *intf, const struct usb_device_id *id) { @@ -9792,6 +9813,9 @@ static int rtl8152_probe(struct usb_interface *intf, else device_set_wakeup_enable(&udev->dev, false); + tp->reboot_notifier.notifier_call = rtl8152_notify; + register_reboot_notifier(&tp->reboot_notifier); + netif_info(tp, probe, netdev, "%s\n", DRIVER_VERSION); return 0; @@ -9812,6 +9836,7 @@ static void rtl8152_disconnect(struct usb_interface *intf) if (tp) { rtl_set_unplug(tp); + unregister_reboot_notifier(&tp->reboot_notifier); unregister_netdev(tp->netdev); tasklet_kill(&tp->tx_tl); cancel_delayed_work_sync(&tp->hw_phy_work);