From: Andrew Lunn <andrew@lunn.ch>
To: Florian Fainelli <f.fainelli@gmail.com>
Cc: netdev@vger.kernel.org, linville@tuxdriver.com,
davem@davemloft.net, vivien.didelot@savoirfairelinux.com
Subject: Re: [PATCH net-next 6/7] net: systemport: Add support for WAKE_FILTER
Date: Tue, 17 Jul 2018 18:49:08 +0200 [thread overview]
Message-ID: <20180717164908.GI968@lunn.ch> (raw)
In-Reply-To: <87910e9c-0783-98e9-eb44-ce85656912d8@gmail.com>
> >> struct ethtool_wolinfo *wol)
> >> {
> >> struct bcm_sysport_priv *priv = netdev_priv(dev);
> >> struct device *kdev = &priv->pdev->dev;
> >> - u32 supported = WAKE_MAGIC | WAKE_MAGICSECURE;
> >> + u32 supported = WAKE_MAGIC | WAKE_MAGICSECURE | WAKE_FILTER;
> >> + unsigned int index, i = 0;
> >> + u32 reg;
> >>
> >> if (!device_can_wakeup(kdev))
> >> return -ENOTSUPP;
> >> @@ -555,6 +561,32 @@ static int bcm_sysport_set_wol(struct net_device *dev,
> >> UMAC_PSW_LS);
> >> }
> >>
> >> + /* We support matching up to 8 filters only */
> >> + if (wol->wolopts & WAKE_FILTER) {
> >> + bitmap_copy(priv->filters, (unsigned long *)wol->sopass,
> >> + WAKE_FILTER_BITS);
> >
> > Shouldn't this be done after to the two checks for errors? Otherwise
> > you have unexpected side effects.
>
> How would you use the bitmap_* routines if you don't copy the bitmap
> first? Besides, if the bitmap is too wide (next check), we zero it out,
> so nothing will get programmed if we attempt a Wake-on-LAN suspend (and
> priv->wolopts is not copied anyway) and the second check would reject a
> zero bitmap as well.
Zero'ing it is a side effect. get_wol() will now return that no
filtered are programmed. However, it appears the hardware is still
programmed with the old filters. Maybe there is a
rxchk_writel(priv, 0, RXCHK_BRCM_TAG(i)
hiding in this code somewhere, clearing out the old bits, but i don't
see it.
>
> >
> >> +
> >> + if (bitmap_weight(priv->filters, WAKE_FILTER_BITS) >
> >> + RXCHK_BRCM_TAG_MAX) {
> >> + bitmap_zero(priv->filters, WAKE_FILTER_BITS);
> >> + return -ENOSPC;
> >> + }
> >> +
> >> + if (bitmap_weight(priv->filters, WAKE_FILTER_BITS) == 0)
> >> + return -EINVAL;
> >> +
> >> + for_each_set_bit(index, priv->filters, WAKE_FILTER_BITS) {
> >> + /* Write the index we want to match within the CID field */
> >> + reg = rxchk_readl(priv, RXCHK_BRCM_TAG(i));
> >> + reg &= ~(RXCHK_BRCM_TAG_CID_MASK <<
> >> + RXCHK_BRCM_TAG_CID_SHIFT);
> >> + reg |= index << RXCHK_BRCM_TAG_CID_SHIFT;
> >> + rxchk_writel(priv, reg, RXCHK_BRCM_TAG(i));
> >> + rxchk_writel(priv, 0xff00ffff, RXCHK_BRCM_TAG_MASK(i));
> >> + i++;
> >> + }
> >> + }
> >
> > How do you disable filters? It looks like you cannot pass all bits set
> > to 0. Also, how do you disable a specific filter? The code above seems
> > to be additive only. There does not appear to be a first write which
> > disables all existing filters before writing the new set of filters.
>
> Either you disable WoL entirely (ethtool -s gphy wol d) and then we
> don't put the hardware in a state that allows it to wake-up the system,
> or you re-program a different set of filters by re-sending a new bitmask
> of desired filters.
This appears to be read-modify-write:
> >> + reg = rxchk_readl(priv, RXCHK_BRCM_TAG(i));
> >> + reg &= ~(RXCHK_BRCM_TAG_CID_MASK <<
> >> + RXCHK_BRCM_TAG_CID_SHIFT);
> >> + reg |= index << RXCHK_BRCM_TAG_CID_SHIFT;
> >> + rxchk_writel(priv, reg, RXCHK_BRCM_TAG(i));
It looks like you can add more bits, but i don't see any way to clear
bits. As i said above, there might be an initial write of 0, but i
cannot see it. The obvious place for it would be just before the
for_each_set_bit(), or at the beginning of the function.
Andrew
next prev parent reply other threads:[~2018-07-17 17:22 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-17 15:36 [PATCH net-next 0/7] net: Support Wake-on-LAN using filters Florian Fainelli
2018-07-17 15:36 ` [PATCH ethtool] ethtool: Add support for WAKE_FILTER Florian Fainelli
2018-07-30 22:26 ` Florian Fainelli
2018-07-30 22:30 ` Andrew Lunn
2018-07-30 22:39 ` Florian Fainelli
2018-07-30 22:55 ` Andrew Lunn
2018-07-30 23:01 ` Andrew Lunn
2018-08-01 16:32 ` David Miller
2018-08-03 17:57 ` Florian Fainelli
2018-08-03 19:07 ` David Miller
2018-08-03 19:58 ` Florian Fainelli
2018-08-03 20:18 ` David Miller
2018-07-17 15:36 ` [PATCH net-next 1/7] net: dsa: bcm_sf2: Allow targeting CPU ports for CFP rules Florian Fainelli
2018-07-18 0:56 ` David Miller
2018-07-17 15:36 ` [PATCH net-next 2/7] net: dsa: bcm_sf2: Disable learning while in WoL Florian Fainelli
2018-07-17 15:54 ` Andrew Lunn
2018-07-17 16:06 ` Florian Fainelli
2018-07-17 15:36 ` [PATCH net-next 3/7] net: systemport: Do not re-configure upon WoL interrupt Florian Fainelli
2018-07-17 15:36 ` [PATCH net-next 4/7] net: systemport: Create helper to set MPD Florian Fainelli
2018-07-17 15:36 ` [PATCH net-next 5/7] ethtool: Add WAKE_FILTER bitmask Florian Fainelli
2018-07-17 15:36 ` [PATCH net-next 6/7] net: systemport: Add support for WAKE_FILTER Florian Fainelli
2018-07-17 16:14 ` Andrew Lunn
2018-07-17 16:26 ` Florian Fainelli
2018-07-17 16:49 ` Andrew Lunn [this message]
2018-07-17 16:57 ` Florian Fainelli
2018-07-17 17:06 ` Andrew Lunn
2018-07-18 9:15 ` Florian Fainelli
2018-07-19 22:25 ` Andrew Lunn
2018-07-20 9:34 ` Florian Fainelli
2018-07-17 15:36 ` [PATCH net-next 7/7] net: dsa: bcm_sf2: Support WAKE_FILTER Florian Fainelli
2018-07-17 15:47 ` [PATCH net-next 0/7] net: Support Wake-on-LAN using filters Andrew Lunn
2018-07-17 16:06 ` Florian Fainelli
2018-07-17 16:21 ` Andrew Lunn
2018-07-17 16:28 ` Florian Fainelli
2018-07-17 16:51 ` Andrew Lunn
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180717164908.GI968@lunn.ch \
--to=andrew@lunn.ch \
--cc=davem@davemloft.net \
--cc=f.fainelli@gmail.com \
--cc=linville@tuxdriver.com \
--cc=netdev@vger.kernel.org \
--cc=vivien.didelot@savoirfairelinux.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.