Message ID | 1685566429-2869-1-git-send-email-justin.chen@broadcom.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:994d:0:b0:3d9:f83d:47d9 with SMTP id k13csp3188056vqr; Wed, 31 May 2023 14:29:31 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4vZf0wDpzQP9R/VHKYnpZCvQho/N9Le3Sax8tp+l8w7o23lcgmNy0AA9NiYuxeIqjiTopp X-Received: by 2002:a17:902:c40e:b0:1b0:3c1a:1238 with SMTP id k14-20020a170902c40e00b001b03c1a1238mr7870299plk.59.1685568570702; Wed, 31 May 2023 14:29:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1685568570; cv=none; d=google.com; s=arc-20160816; b=sCX+GS4Rq4i+xS2xhdUOoqr9nXUoJPdpVe/FgJMuHkAf6xF/N962oIhPaByNImUjM4 8yAGzqQQsKj9SCzU3g8LmhuMtU7QBM83NDdjLeThDcX4/9CMSQXKVpZ6j6ZObq4wQAf8 jnnXNjE+OR1xsE+MuK2KwlLxlsmYzQjMjuWFOjYqZVzPGwhxrMtEz+3VjffBEgBMGEdy yfLbRSIpdJvcTAd8NKpxxbJDQXzrsZTqhtalB+P4+LQ8MuQv8n8juETaQXN2fbytDR3+ LmVdfCF+M3YB8A6Fwh+NJ4cY9dfWcALYj7zf87Cfqyj8LFtSiPgQ14476xkEdE34xDRi j3yg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:message-id:date:subject:cc:to:from :dkim-signature; bh=S/tIbjMOzrV0tes0SpPx2z1WCchqgtLOTCZJxfWjgkI=; b=k2hA+jimrZb25g7C6Zr4OxeOHtcqyPOUAEuM8HCvl0a3/c+MsrFfdkw+snevCVNFrZ A1xN3/Z6R694Uq7T7ay/xforYCIhKD8efFst4pkH/VyDQKiMvd5brpD48/nshQFHKVT6 eqyfvbiIp1Idm6y4WPUt7pL2+n9aibJ/pkLOGONhXJD5vpjqELF0Q/3iYe1fYdjsY4z7 tNyKN9/luTh7mDrKzVmAIZPz6hD5tMzcALx46Z4JUHr3/eD9M6UCMlwC7aR4ISuT6kpw pkSzY+zfRqyz3IBBl68nZzTROaMUOfP8rUHecxx6FtYCHYfb6BSROCd/9i72HY+t24gm pGAg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@broadcom.com header.s=google header.b=HLFIINpl; 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=broadcom.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id m15-20020a170902db0f00b001a1f70cc7dbsi1449041plx.562.2023.05.31.14.29.10; Wed, 31 May 2023 14:29:30 -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=@broadcom.com header.s=google header.b=HLFIINpl; 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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=broadcom.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229799AbjEaUyC (ORCPT <rfc822;andrewvogler123@gmail.com> + 99 others); Wed, 31 May 2023 16:54:02 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57322 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229476AbjEaUyA (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Wed, 31 May 2023 16:54:00 -0400 Received: from mail-pf1-x435.google.com (mail-pf1-x435.google.com [IPv6:2607:f8b0:4864:20::435]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 04C63129 for <linux-kernel@vger.kernel.org>; Wed, 31 May 2023 13:54:00 -0700 (PDT) Received: by mail-pf1-x435.google.com with SMTP id d2e1a72fcca58-64d5b4c400fso224660b3a.1 for <linux-kernel@vger.kernel.org>; Wed, 31 May 2023 13:53:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1685566439; x=1688158439; h=message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=S/tIbjMOzrV0tes0SpPx2z1WCchqgtLOTCZJxfWjgkI=; b=HLFIINplwvQnozoURe7fFqoDE3MPANX+abzHwYbUVEUViyUsjLpAed39ov4QamNmnI BIEsIwrhTtAwlS5OrNGhh8yIX+6uCcaGeGvusV6Wg1cftiQXl03IwM/ViNTy0PnaUaPr WECj5CBD5QvnYS0b6tk2MrVCQoXja+EEsE1cw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685566439; x=1688158439; h=message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=S/tIbjMOzrV0tes0SpPx2z1WCchqgtLOTCZJxfWjgkI=; b=cs2Aiqvh9b6bA0I4ludLkP2unwSFM0AAVu6jWpp7zcvF+f1mkq469tleHO+11Uizhb mYc8ZVhIWuVK1miwrQMK+CBfo04C10jPkKSiqPNqN9RMUbqwM01DsCc0zlKqzM1+D1yV rrPjBaFpFJv88UbOvL4BM+XfdQu8bjKhbdskaaFq2NwtWWLfTj7jeDjqUePkYW/f3RuW vXJkyzDplV69qba7mW0Mj23ez+rYKMVgWshO8RJxNs5MFHmYtvVOfea8CLmBoYn4lLGM jtDgbbzW72uVk8ANkW+jvGGhK8BjGaxoLpHjGJsGijRq81Rk1SR1P6o6nDBVPKIYXg9D y2cA== X-Gm-Message-State: AC+VfDz0jOMzKwuqEYWYfZ1qScq6qurXEPlb/BngdBdxr+3P9M7EdUcd ZISbm4HmFXpKhkO+trtYOvRENMFGIzjwFe5JaCU= X-Received: by 2002:a05:6a20:5494:b0:10c:8f0c:f81c with SMTP id i20-20020a056a20549400b0010c8f0cf81cmr8751822pzk.53.1685566439336; Wed, 31 May 2023 13:53:59 -0700 (PDT) Received: from stbirv-lnx-2.igp.broadcom.net ([192.19.223.252]) by smtp.gmail.com with ESMTPSA id j8-20020a62e908000000b0064f97ff4506sm3155556pfh.68.2023.05.31.13.53.55 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 31 May 2023 13:53:56 -0700 (PDT) From: Justin Chen <justin.chen@broadcom.com> To: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com Cc: bcm-kernel-feedback-list@broadcom.com, florian.fainelli@broadcom.com, Justin Chen <justin.chen@broadcom.com> Subject: [PATCH net-next] ethtool: ioctl: improve error checking for set_wol Date: Wed, 31 May 2023 13:53:49 -0700 Message-Id: <1685566429-2869-1-git-send-email-justin.chen@broadcom.com> X-Mailer: git-send-email 2.7.4 Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="000000000000e2e21905fd038498" X-Spam-Status: No, score=-0.2 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF, MIME_HEADER_CTYPE_ONLY,MIME_NO_TEXT,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE, SPF_NONE,T_SCC_BODY_TEXT_LINE,T_TVD_MIME_NO_HEADERS,URIBL_BLOCKED autolearn=no 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: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1767446749750417386?= X-GMAIL-MSGID: =?utf-8?q?1767446749750417386?= |
Series |
[net-next] ethtool: ioctl: improve error checking for set_wol
|
|
Commit Message
Justin Chen
May 31, 2023, 8:53 p.m. UTC
The netlink version of set_wol checks for not supported wolopts and avoids
setting wol when the correct wolopt is already set. If we do the same with
the ioctl version then we can remove these checks from the driver layer.
Signed-off-by: Justin Chen <justin.chen@broadcom.com>
---
net/ethtool/ioctl.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
Comments
+ Daniil Tatianin <d-tatianin@yandex-team.ru>, Andrew Lunn <andrew@lunn.ch> as per ./scripts/get_maintainer.pl --git-min-percent 25 net/ethtool/ioctl.c On Wed, May 31, 2023 at 01:53:49PM -0700, Justin Chen wrote: > The netlink version of set_wol checks for not supported wolopts and avoids > setting wol when the correct wolopt is already set. If we do the same with > the ioctl version then we can remove these checks from the driver layer. Hi Justin, Are you planning follow-up patches for the driver layer? > Signed-off-by: Justin Chen <justin.chen@broadcom.com> > --- > net/ethtool/ioctl.c | 14 ++++++++++++-- > 1 file changed, 12 insertions(+), 2 deletions(-) > > diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c > index 6bb778e10461..80f456f83db0 100644 > --- a/net/ethtool/ioctl.c > +++ b/net/ethtool/ioctl.c > @@ -1436,15 +1436,25 @@ static int ethtool_get_wol(struct net_device *dev, char __user *useraddr) > > static int ethtool_set_wol(struct net_device *dev, char __user *useraddr) > { > - struct ethtool_wolinfo wol; > + struct ethtool_wolinfo wol, cur_wol; > int ret; > > - if (!dev->ethtool_ops->set_wol) > + if (!dev->ethtool_ops->get_wol || !dev->ethtool_ops->set_wol) > return -EOPNOTSUPP; Are there cases where (in-tree) drivers provide set_wol byt not get_wol? If so, does this break their set_wol support? > > + memset(&cur_wol, 0, sizeof(struct ethtool_wolinfo)); > + cur_wol.cmd = ETHTOOL_GWOL; > + dev->ethtool_ops->get_wol(dev, &cur_wol); > + > if (copy_from_user(&wol, useraddr, sizeof(wol))) > return -EFAULT; > > + if (wol.wolopts & ~cur_wol.supported) > + return -EOPNOTSUPP; > + > + if (wol.wolopts == cur_wol.wolopts) > + return 0; > + > ret = dev->ethtool_ops->set_wol(dev, &wol); > if (ret) > return ret;
On Thu, 1 Jun 2023 17:55:21 +0200 Simon Horman wrote: > + Daniil Tatianin <d-tatianin@yandex-team.ru>, Andrew Lunn <andrew@lunn.ch> > as per ./scripts/get_maintainer.pl --git-min-percent 25 net/ethtool/ioctl.c Sorry to chime in but always prefer running get_maintainer on the patch rather than a file path. File path misses stuff like Fixes tags. If it was up to me that option would have been removed :(
On 6/1/2023 8:55 AM, Simon Horman wrote: > + Daniil Tatianin <d-tatianin@yandex-team.ru>, Andrew Lunn <andrew@lunn.ch> > as per ./scripts/get_maintainer.pl --git-min-percent 25 net/ethtool/ioctl.c > > On Wed, May 31, 2023 at 01:53:49PM -0700, Justin Chen wrote: >> The netlink version of set_wol checks for not supported wolopts and avoids >> setting wol when the correct wolopt is already set. If we do the same with >> the ioctl version then we can remove these checks from the driver layer. > > Hi Justin, > > Are you planning follow-up patches for the driver layer? > I was planning to for the Broadcom drivers since those I can test. But I could do it across the board if that is preferred. >> Signed-off-by: Justin Chen <justin.chen@broadcom.com> >> --- >> net/ethtool/ioctl.c | 14 ++++++++++++-- >> 1 file changed, 12 insertions(+), 2 deletions(-) >> >> diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c >> index 6bb778e10461..80f456f83db0 100644 >> --- a/net/ethtool/ioctl.c >> +++ b/net/ethtool/ioctl.c >> @@ -1436,15 +1436,25 @@ static int ethtool_get_wol(struct net_device *dev, char __user *useraddr) >> >> static int ethtool_set_wol(struct net_device *dev, char __user *useraddr) >> { >> - struct ethtool_wolinfo wol; >> + struct ethtool_wolinfo wol, cur_wol; >> int ret; >> >> - if (!dev->ethtool_ops->set_wol) >> + if (!dev->ethtool_ops->get_wol || !dev->ethtool_ops->set_wol) >> return -EOPNOTSUPP; > > Are there cases where (in-tree) drivers provide set_wol byt not get_wol? > If so, does this break their set_wol support? > My original thought was to match netlink set wol behavior. So drivers that do that won't work with netlink set_wol right now. I'll skim around to see if any drivers do this. But I would reckon this should be a driver fix. Thanks, Justin >> >> + memset(&cur_wol, 0, sizeof(struct ethtool_wolinfo)); >> + cur_wol.cmd = ETHTOOL_GWOL; >> + dev->ethtool_ops->get_wol(dev, &cur_wol); >> + >> if (copy_from_user(&wol, useraddr, sizeof(wol))) >> return -EFAULT; >> >> + if (wol.wolopts & ~cur_wol.supported) >> + return -EOPNOTSUPP; >> + >> + if (wol.wolopts == cur_wol.wolopts) >> + return 0; >> + >> ret = dev->ethtool_ops->set_wol(dev, &wol); >> if (ret) >> return ret;
On Thu, Jun 01, 2023 at 09:03:10AM -0700, Jakub Kicinski wrote: > On Thu, 1 Jun 2023 17:55:21 +0200 Simon Horman wrote: > > + Daniil Tatianin <d-tatianin@yandex-team.ru>, Andrew Lunn <andrew@lunn.ch> > > as per ./scripts/get_maintainer.pl --git-min-percent 25 net/ethtool/ioctl.c > Sorry to chime in but always prefer running get_maintainer on the patch > rather than a file path. File path misses stuff like Fixes tags. > If it was up to me that option would have been removed :( Yes, sorry about that.
On 6/1/2023 9:03 AM, Jakub Kicinski wrote: > On Thu, 1 Jun 2023 17:55:21 +0200 Simon Horman wrote: >> + Daniil Tatianin <d-tatianin@yandex-team.ru>, Andrew Lunn <andrew@lunn.ch> >> as per ./scripts/get_maintainer.pl --git-min-percent 25 net/ethtool/ioctl.c > > Sorry to chime in but always prefer running get_maintainer on the patch > rather than a file path. File path misses stuff like Fixes tags. > If it was up to me that option would have been removed :( Apologies, Will do next time. Justin
On 6/1/23 9:22 AM, Justin Chen wrote: > > > On 6/1/2023 8:55 AM, Simon Horman wrote: >> + Daniil Tatianin <d-tatianin@yandex-team.ru>, Andrew Lunn >> <andrew@lunn.ch> >> as per ./scripts/get_maintainer.pl --git-min-percent 25 >> net/ethtool/ioctl.c >> >> On Wed, May 31, 2023 at 01:53:49PM -0700, Justin Chen wrote: >>> The netlink version of set_wol checks for not supported wolopts and >>> avoids >>> setting wol when the correct wolopt is already set. If we do the same >>> with >>> the ioctl version then we can remove these checks from the driver layer. >> >> Hi Justin, >> >> Are you planning follow-up patches for the driver layer? >> > > I was planning to for the Broadcom drivers since those I can test. But I > could do it across the board if that is preferred. > >>> Signed-off-by: Justin Chen <justin.chen@broadcom.com> >>> --- >>> net/ethtool/ioctl.c | 14 ++++++++++++-- >>> 1 file changed, 12 insertions(+), 2 deletions(-) >>> >>> diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c >>> index 6bb778e10461..80f456f83db0 100644 >>> --- a/net/ethtool/ioctl.c >>> +++ b/net/ethtool/ioctl.c >>> @@ -1436,15 +1436,25 @@ static int ethtool_get_wol(struct net_device >>> *dev, char __user *useraddr) >>> static int ethtool_set_wol(struct net_device *dev, char __user >>> *useraddr) >>> { >>> - struct ethtool_wolinfo wol; >>> + struct ethtool_wolinfo wol, cur_wol; >>> int ret; >>> - if (!dev->ethtool_ops->set_wol) >>> + if (!dev->ethtool_ops->get_wol || !dev->ethtool_ops->set_wol) >>> return -EOPNOTSUPP; >> >> Are there cases where (in-tree) drivers provide set_wol byt not get_wol? >> If so, does this break their set_wol support? >> > > My original thought was to match netlink set wol behavior. So drivers > that do that won't work with netlink set_wol right now. I'll skim around > to see if any drivers do this. But I would reckon this should be a > driver fix. > > Thanks, > Justin > I see a driver at drivers/net/phy/microchip.c. But this is a phy driver set_wol hook. Justin >>> + memset(&cur_wol, 0, sizeof(struct ethtool_wolinfo)); >>> + cur_wol.cmd = ETHTOOL_GWOL; >>> + dev->ethtool_ops->get_wol(dev, &cur_wol); >>> + >>> if (copy_from_user(&wol, useraddr, sizeof(wol))) >>> return -EFAULT; >>> + if (wol.wolopts & ~cur_wol.supported) >>> + return -EOPNOTSUPP; >>> + >>> + if (wol.wolopts == cur_wol.wolopts) >>> + return 0; >>> + >>> ret = dev->ethtool_ops->set_wol(dev, &wol); >>> if (ret) >>> return ret;
On 6/1/23 11:27, Justin Chen wrote: > > > On 6/1/23 9:22 AM, Justin Chen wrote: >> >> >> On 6/1/2023 8:55 AM, Simon Horman wrote: >>> + Daniil Tatianin <d-tatianin@yandex-team.ru>, Andrew Lunn >>> <andrew@lunn.ch> >>> as per ./scripts/get_maintainer.pl --git-min-percent 25 >>> net/ethtool/ioctl.c >>> >>> On Wed, May 31, 2023 at 01:53:49PM -0700, Justin Chen wrote: >>>> The netlink version of set_wol checks for not supported wolopts and >>>> avoids >>>> setting wol when the correct wolopt is already set. If we do the >>>> same with >>>> the ioctl version then we can remove these checks from the driver >>>> layer. >>> >>> Hi Justin, >>> >>> Are you planning follow-up patches for the driver layer? >>> >> >> I was planning to for the Broadcom drivers since those I can test. But >> I could do it across the board if that is preferred. >> >>>> Signed-off-by: Justin Chen <justin.chen@broadcom.com> >>>> --- >>>> net/ethtool/ioctl.c | 14 ++++++++++++-- >>>> 1 file changed, 12 insertions(+), 2 deletions(-) >>>> >>>> diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c >>>> index 6bb778e10461..80f456f83db0 100644 >>>> --- a/net/ethtool/ioctl.c >>>> +++ b/net/ethtool/ioctl.c >>>> @@ -1436,15 +1436,25 @@ static int ethtool_get_wol(struct net_device >>>> *dev, char __user *useraddr) >>>> static int ethtool_set_wol(struct net_device *dev, char __user >>>> *useraddr) >>>> { >>>> - struct ethtool_wolinfo wol; >>>> + struct ethtool_wolinfo wol, cur_wol; >>>> int ret; >>>> - if (!dev->ethtool_ops->set_wol) >>>> + if (!dev->ethtool_ops->get_wol || !dev->ethtool_ops->set_wol) >>>> return -EOPNOTSUPP; >>> >>> Are there cases where (in-tree) drivers provide set_wol byt not get_wol? >>> If so, does this break their set_wol support? >>> >> >> My original thought was to match netlink set wol behavior. So drivers >> that do that won't work with netlink set_wol right now. I'll skim >> around to see if any drivers do this. But I would reckon this should >> be a driver fix. >> >> Thanks, >> Justin >> > > I see a driver at drivers/net/phy/microchip.c. But this is a phy driver > set_wol hook. That part of the driver appears to be dead code. It attempts to pretend to support Wake-on-LAN, but it does not do any specific programming of wake-up filters, nor does it implement get_wol. It also does not make use of the recently introduced PHY_ALWAYS_CALL_SUSPEND flag. When it is time to determine whether to suspend the PHY or not, eventually phy_suspend() will call phy_ethtool_get_wol(). Since no get_wol is implemented, the wol.wolopts will remain zero, therefore we will just suspend the PHY. I suspect this was added to work around MAC drivers that may forcefully try to suspend the PHY, but that should not even be possible these days. I would just remove that logic from microchip.c entirely.
> > > I was planning to for the Broadcom drivers since those I can test. > > > But I could do it across the board if that is preferred. > > > > > > > > Signed-off-by: Justin Chen <justin.chen@broadcom.com> > > > > > --- > > > > > net/ethtool/ioctl.c | 14 ++++++++++++-- > > > > > 1 file changed, 12 insertions(+), 2 deletions(-) > > > > > > > > > > diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c > > > > > index 6bb778e10461..80f456f83db0 100644 > > > > > --- a/net/ethtool/ioctl.c > > > > > +++ b/net/ethtool/ioctl.c > > > > > @@ -1436,15 +1436,25 @@ static int ethtool_get_wol(struct > > > > > net_device *dev, char __user *useraddr) > > > > > static int ethtool_set_wol(struct net_device *dev, char > > > > > __user *useraddr) > > > > > { > > > > > - struct ethtool_wolinfo wol; > > > > > + struct ethtool_wolinfo wol, cur_wol; > > > > > int ret; > > > > > - if (!dev->ethtool_ops->set_wol) > > > > > + if (!dev->ethtool_ops->get_wol || !dev->ethtool_ops->set_wol) > > > > > return -EOPNOTSUPP; > > > > > > > > Are there cases where (in-tree) drivers provide set_wol byt not get_wol? > > > > If so, does this break their set_wol support? > > > > > > > > > > My original thought was to match netlink set wol behavior. So > > > drivers that do that won't work with netlink set_wol right now. I'll > > > skim around to see if any drivers do this. But I would reckon this > > > should be a driver fix. > > > > > > Thanks, > > > Justin > > > > > > > I see a driver at drivers/net/phy/microchip.c. But this is a phy driver > > set_wol hook. > > That part of the driver appears to be dead code. It attempts to pretend to > support Wake-on-LAN, but it does not do any specific programming of wake-up > filters, nor does it implement get_wol. It also does not make use of the > recently introduced PHY_ALWAYS_CALL_SUSPEND flag. > > When it is time to determine whether to suspend the PHY or not, eventually > phy_suspend() will call phy_ethtool_get_wol(). Since no get_wol is > implemented, the wol.wolopts will remain zero, therefore we will just > suspend the PHY. > > I suspect this was added to work around MAC drivers that may forcefully try > to suspend the PHY, but that should not even be possible these days. > > I would just remove that logic from microchip.c entirely. The Microchip developers are reasonably responsive. So we should Cc: them. Andrew
+ Woojung, UNGLinuxDriver On 6/1/23 11:48 AM, Andrew Lunn wrote: >>>> I was planning to for the Broadcom drivers since those I can test. >>>> But I could do it across the board if that is preferred. >>>> >>>>>> Signed-off-by: Justin Chen <justin.chen@broadcom.com> >>>>>> --- >>>>>> net/ethtool/ioctl.c | 14 ++++++++++++-- >>>>>> 1 file changed, 12 insertions(+), 2 deletions(-) >>>>>> >>>>>> diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c >>>>>> index 6bb778e10461..80f456f83db0 100644 >>>>>> --- a/net/ethtool/ioctl.c >>>>>> +++ b/net/ethtool/ioctl.c >>>>>> @@ -1436,15 +1436,25 @@ static int ethtool_get_wol(struct >>>>>> net_device *dev, char __user *useraddr) >>>>>> static int ethtool_set_wol(struct net_device *dev, char >>>>>> __user *useraddr) >>>>>> { >>>>>> - struct ethtool_wolinfo wol; >>>>>> + struct ethtool_wolinfo wol, cur_wol; >>>>>> int ret; >>>>>> - if (!dev->ethtool_ops->set_wol) >>>>>> + if (!dev->ethtool_ops->get_wol || !dev->ethtool_ops->set_wol) >>>>>> return -EOPNOTSUPP; >>>>> >>>>> Are there cases where (in-tree) drivers provide set_wol byt not get_wol? >>>>> If so, does this break their set_wol support? >>>>> >>>> >>>> My original thought was to match netlink set wol behavior. So >>>> drivers that do that won't work with netlink set_wol right now. I'll >>>> skim around to see if any drivers do this. But I would reckon this >>>> should be a driver fix. >>>> >>>> Thanks, >>>> Justin >>>> >>> >>> I see a driver at drivers/net/phy/microchip.c. But this is a phy driver >>> set_wol hook. >> >> That part of the driver appears to be dead code. It attempts to pretend to >> support Wake-on-LAN, but it does not do any specific programming of wake-up >> filters, nor does it implement get_wol. It also does not make use of the >> recently introduced PHY_ALWAYS_CALL_SUSPEND flag. >> >> When it is time to determine whether to suspend the PHY or not, eventually >> phy_suspend() will call phy_ethtool_get_wol(). Since no get_wol is >> implemented, the wol.wolopts will remain zero, therefore we will just >> suspend the PHY. >> >> I suspect this was added to work around MAC drivers that may forcefully try >> to suspend the PHY, but that should not even be possible these days. >> >> I would just remove that logic from microchip.c entirely. > > The Microchip developers are reasonably responsive. So we should Cc: > them. > > Andrew
> On 6/1/23 11:48 AM, Andrew Lunn wrote: > >>>> I was planning to for the Broadcom drivers since those I can test. > >>>> But I could do it across the board if that is preferred. > >>>> > >>>>>> Signed-off-by: Justin Chen <justin.chen@broadcom.com> > >>>>>> --- > >>>>>> net/ethtool/ioctl.c | 14 ++++++++++++-- > >>>>>> 1 file changed, 12 insertions(+), 2 deletions(-) > >>>>>> > >>>>>> diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c > >>>>>> index 6bb778e10461..80f456f83db0 100644 > >>>>>> --- a/net/ethtool/ioctl.c > >>>>>> +++ b/net/ethtool/ioctl.c > >>>>>> @@ -1436,15 +1436,25 @@ static int ethtool_get_wol(struct > >>>>>> net_device *dev, char __user *useraddr) > >>>>>> static int ethtool_set_wol(struct net_device *dev, char > >>>>>> __user *useraddr) > >>>>>> { > >>>>>> - struct ethtool_wolinfo wol; > >>>>>> + struct ethtool_wolinfo wol, cur_wol; > >>>>>> int ret; > >>>>>> - if (!dev->ethtool_ops->set_wol) > >>>>>> + if (!dev->ethtool_ops->get_wol || !dev->ethtool_ops->set_wol) > >>>>>> return -EOPNOTSUPP; > >>>>> > >>>>> Are there cases where (in-tree) drivers provide set_wol byt not > get_wol? > >>>>> If so, does this break their set_wol support? > >>>>> > >>>> > >>>> My original thought was to match netlink set wol behavior. So > >>>> drivers that do that won't work with netlink set_wol right now. I'll > >>>> skim around to see if any drivers do this. But I would reckon this > >>>> should be a driver fix. > >>>> > >>>> Thanks, > >>>> Justin > >>>> > >>> > >>> I see a driver at drivers/net/phy/microchip.c. But this is a phy driver > >>> set_wol hook. > >> > >> That part of the driver appears to be dead code. It attempts to pretend to > >> support Wake-on-LAN, but it does not do any specific programming of > wake-up > >> filters, nor does it implement get_wol. It also does not make use of the > >> recently introduced PHY_ALWAYS_CALL_SUSPEND flag. > >> > >> When it is time to determine whether to suspend the PHY or not, > eventually > >> phy_suspend() will call phy_ethtool_get_wol(). Since no get_wol is > >> implemented, the wol.wolopts will remain zero, therefore we will just > >> suspend the PHY. > >> > >> I suspect this was added to work around MAC drivers that may forcefully > try > >> to suspend the PHY, but that should not even be possible these days. > >> > >> I would just remove that logic from microchip.c entirely. > > > > The Microchip developers are reasonably responsive. So we should Cc: > > them. set_wol in drivers/net/phy/microchip.c is used to set the flag to avoid PHY power down at suspend time. Looks it is old-fashioned now because frame work is not calling suspend after calling get_wol. We will make a patch for it. BTW, this patch is checking MAC driver set_wol and get_wol. So I don't think it breaks drivers/net/phy/microchip.c suspend operation anyway. Thanks. Woojung
On Thu, Jun 01, 2023 at 09:22:50AM -0700, Justin Chen wrote: > > > On 6/1/2023 8:55 AM, Simon Horman wrote: > > + Daniil Tatianin <d-tatianin@yandex-team.ru>, Andrew Lunn <andrew@lunn.ch> > > as per ./scripts/get_maintainer.pl --git-min-percent 25 net/ethtool/ioctl.c > > > > On Wed, May 31, 2023 at 01:53:49PM -0700, Justin Chen wrote: > > > The netlink version of set_wol checks for not supported wolopts and avoids > > > setting wol when the correct wolopt is already set. If we do the same with > > > the ioctl version then we can remove these checks from the driver layer. > > > > Hi Justin, > > > > Are you planning follow-up patches for the driver layer? > > > > I was planning to for the Broadcom drivers since those I can test. But I > could do it across the board if that is preferred. I think that would be my suggestion. But I'm unsure of the magnitude of change involved. Or how risky it is in terms of introducing regressions. In any case, perhaps it's best to start small. > > > Signed-off-by: Justin Chen <justin.chen@broadcom.com> > > > --- > > > net/ethtool/ioctl.c | 14 ++++++++++++-- > > > 1 file changed, 12 insertions(+), 2 deletions(-) > > > > > > diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c > > > index 6bb778e10461..80f456f83db0 100644 > > > --- a/net/ethtool/ioctl.c > > > +++ b/net/ethtool/ioctl.c > > > @@ -1436,15 +1436,25 @@ static int ethtool_get_wol(struct net_device *dev, char __user *useraddr) > > > static int ethtool_set_wol(struct net_device *dev, char __user *useraddr) > > > { > > > - struct ethtool_wolinfo wol; > > > + struct ethtool_wolinfo wol, cur_wol; > > > int ret; > > > - if (!dev->ethtool_ops->set_wol) > > > + if (!dev->ethtool_ops->get_wol || !dev->ethtool_ops->set_wol) > > > return -EOPNOTSUPP; > > > > Are there cases where (in-tree) drivers provide set_wol byt not get_wol? > > If so, does this break their set_wol support? > > > > My original thought was to match netlink set wol behavior. So drivers that > do that won't work with netlink set_wol right now. I'll skim around to see > if any drivers do this. But I would reckon this should be a driver fix. It seems, from other discussion in a different sub-thread, that we are likely clear there :) As that was my only real reservation wrt this patch: Reviewed-by: Simon Horman <simon.horman@corigine.com>
On Wed, 31 May 2023 13:53:49 -0700 Justin Chen wrote: > The netlink version of set_wol checks for not supported wolopts and avoids > setting wol when the correct wolopt is already set. If we do the same with > the ioctl version then we can remove these checks from the driver layer. > > Signed-off-by: Justin Chen <justin.chen@broadcom.com> If I understand the discussion correctly the patch is ready to be applied. Could you repost it? It has been marked as "changes requested" in patchwork, I'm not 100% sure about the reason.
diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c index 6bb778e10461..80f456f83db0 100644 --- a/net/ethtool/ioctl.c +++ b/net/ethtool/ioctl.c @@ -1436,15 +1436,25 @@ static int ethtool_get_wol(struct net_device *dev, char __user *useraddr) static int ethtool_set_wol(struct net_device *dev, char __user *useraddr) { - struct ethtool_wolinfo wol; + struct ethtool_wolinfo wol, cur_wol; int ret; - if (!dev->ethtool_ops->set_wol) + if (!dev->ethtool_ops->get_wol || !dev->ethtool_ops->set_wol) return -EOPNOTSUPP; + memset(&cur_wol, 0, sizeof(struct ethtool_wolinfo)); + cur_wol.cmd = ETHTOOL_GWOL; + dev->ethtool_ops->get_wol(dev, &cur_wol); + if (copy_from_user(&wol, useraddr, sizeof(wol))) return -EFAULT; + if (wol.wolopts & ~cur_wol.supported) + return -EOPNOTSUPP; + + if (wol.wolopts == cur_wol.wolopts) + return 0; + ret = dev->ethtool_ops->set_wol(dev, &wol); if (ret) return ret;