From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 548F8C282D9 for ; Thu, 31 Jan 2019 18:57:35 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1C371218AF for ; Thu, 31 Jan 2019 18:57:35 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="u6L6mHA1" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728584AbfAaS5e (ORCPT ); Thu, 31 Jan 2019 13:57:34 -0500 Received: from mail-wr1-f67.google.com ([209.85.221.67]:42143 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728482AbfAaS5d (ORCPT ); Thu, 31 Jan 2019 13:57:33 -0500 Received: by mail-wr1-f67.google.com with SMTP id q18so4482253wrx.9 for ; Thu, 31 Jan 2019 10:57:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:subject:to:cc:message-id:date:user-agent:mime-version :content-language:content-transfer-encoding; bh=4ZRbJUFFMeOPfN6ncA0aY/n3D1gnwLWQ/dXKVUthUqI=; b=u6L6mHA15WSDEel0Qo5Enqg025UgWzuFhZeKINhkwZumGpPFwAzwmDawBEhQAPdriR tlzA2ls8Ty9cy8K9ExApj6MTLDPAjrXUtquuNPScW+7x9IHqRWmzZueUjdEfYIOpFmUE q5ExEsRrIS6ZUwHLM62Y4s5TsSsYEkXyW+fS4fb+LQ4NliYBXMLN/v6BZ+/ECnfsjgoa hy62sEvnb5fyAqPKsm2w2woZ+ljUmKYzTZvxFKjB5erSf3S+oK47VTp+qWG0mvr5/SaK FvvmfmEe7AKhNwnbXbhZreieVcIQrBaVwvyXHbkmqLiukKbAvXuYuogjdiB1m99M2JGZ qang== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:subject:to:cc:message-id:date:user-agent :mime-version:content-language:content-transfer-encoding; bh=4ZRbJUFFMeOPfN6ncA0aY/n3D1gnwLWQ/dXKVUthUqI=; b=s14t79zBGE/V+2kVUIcYseQ15ErGQ2gGBvZw2IGXjBrUK88TXXcJXF00p+bmVXKtnr nVTotFbzSqFFKkWHinp4HEUL47+QlpPP68tHifi6Vc3yifnXw4mUWyhVSjJb8xYE2lv2 JnRnzBHImLQufs9nq3PDXy7ajb49Ks0RJs5kPCGLeBzczvMLtjEhg7xk90eTal+HY4JG 0Bd5uhAwnfq98y+XgK+TRYAU0MTRDlySak+EI6bEZizDZVl9LstCaCFt+rdZRJOPszcI 06wlC3vNwyumlrOm/Vf7K3LqGjf8L6yQv4ziXKYx4hDCasQrNgBiF3oPgIrbP+kJZDbe NysA== X-Gm-Message-State: AJcUukdXtGcBkffo3w/Z+GG7f+G0ef6iKT9eQIMnTrs/TWBjKoY48XmQ lj3yQ7bXy9LW2QYj3DMyOkHpAIkX X-Google-Smtp-Source: ALg8bN5p0SmBXiD3SgsxusYMsO15m30t3iHSa1bak1v25TohuDi7oI58sHISH0H/n+OLkV9ftcahqA== X-Received: by 2002:adf:fdc2:: with SMTP id i2mr36797262wrs.117.1548961051580; Thu, 31 Jan 2019 10:57:31 -0800 (PST) Received: from ?IPv6:2003:ea:8bf1:e200:456f:ee03:474f:a529? (p200300EA8BF1E200456FEE03474FA529.dip0.t-ipconnect.de. [2003:ea:8bf1:e200:456f:ee03:474f:a529]) by smtp.googlemail.com with ESMTPSA id b12sm116290wmj.3.2019.01.31.10.57.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 31 Jan 2019 10:57:30 -0800 (PST) From: Heiner Kallweit Subject: [PATCH v3 net-next] r8169: improve WoL handling To: Realtek linux nic maintainers , David Miller Cc: "netdev@vger.kernel.org" Message-ID: <4035d591-c898-d5f1-5fb3-703fbe1c709e@gmail.com> Date: Thu, 31 Jan 2019 19:57:26 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.4.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org WoL handling for the RTL8168 family is a little bit tricky because of different types of broken BIOS and/or chip quirks. Two known issues: 1. Network properly resumes from suspend only if WoL is enabled in the chip. 2. Some notebooks wake up immediately if system is suspended and network device is wakeup-enabled. Few patches tried to deal with this: 7edf6d314cd0 ("r8169: disable WOL per default") 18041b523692 ("r8169: restore previous behavior to accept BIOS WoL settings") Currently we have the situation that the chip WoL settings as set by the BIOS are respected (to prevent issue 1), but the device doesn't get wakeup-enabled (to prevent issue 2). This leads to another issue: If systemd is told to set WoL it first checks whether the requested settings are active already (and does nothing if yes). Due to the chip WoL flags being set properly systemd assumes that WoL is configured properly in our case. Result is that device doesn't get wakeup-enabled and WoL doesn't work (until it's set e.g. by ethtool). This patch now: - leaves the chip WoL settings as is (to prevent issue 1) - keeps the behavior to not wakeup-enable the device initially (to prevent issue 2) - In addition we report WoL as being disabled in get_wol, matching that device isn't wakeup-enabled. If systemd is told to enable WoL, it will therefore detect that it has to do something and will call set_wol. Of course the user still has the option to override this with e.g. ethtool. v2: - Don't just exclude __rtl8169_get_wol() from compiling, remove it. v3: - adjust commit message Signed-off-by: Heiner Kallweit --- drivers/net/ethernet/realtek/r8169.c | 39 +--------------------------- 1 file changed, 1 insertion(+), 38 deletions(-) diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 3e650bd9e..9dc689817 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c @@ -1371,41 +1371,6 @@ static void rtl_link_chg_patch(struct rtl8169_private *tp) #define WAKE_ANY (WAKE_PHY | WAKE_MAGIC | WAKE_UCAST | WAKE_BCAST | WAKE_MCAST) -static u32 __rtl8169_get_wol(struct rtl8169_private *tp) -{ - u8 options; - u32 wolopts = 0; - - options = RTL_R8(tp, Config1); - if (!(options & PMEnable)) - return 0; - - options = RTL_R8(tp, Config3); - if (options & LinkUp) - wolopts |= WAKE_PHY; - switch (tp->mac_version) { - case RTL_GIGA_MAC_VER_34 ... RTL_GIGA_MAC_VER_38: - case RTL_GIGA_MAC_VER_40 ... RTL_GIGA_MAC_VER_51: - if (rtl_eri_read(tp, 0xdc, ERIAR_EXGMAC) & MagicPacket_v2) - wolopts |= WAKE_MAGIC; - break; - default: - if (options & MagicPacket) - wolopts |= WAKE_MAGIC; - break; - } - - options = RTL_R8(tp, Config5); - if (options & UWF) - wolopts |= WAKE_UCAST; - if (options & BWF) - wolopts |= WAKE_BCAST; - if (options & MWF) - wolopts |= WAKE_MCAST; - - return wolopts; -} - static void rtl8169_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) { struct rtl8169_private *tp = netdev_priv(dev); @@ -4284,7 +4249,7 @@ static void rtl_wol_suspend_quirk(struct rtl8169_private *tp) static bool rtl_wol_pll_power_down(struct rtl8169_private *tp) { - if (!__rtl8169_get_wol(tp)) + if (!device_may_wakeup(tp_to_dev(tp))) return false; phy_speed_down(tp->phydev, false); @@ -7441,8 +7406,6 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) return rc; } - tp->saved_wolopts = __rtl8169_get_wol(tp); - mutex_init(&tp->wk.mutex); INIT_WORK(&tp->wk.work, rtl_task); u64_stats_init(&tp->rx_stats.syncp); -- 2.20.1