lkml.org 
[lkml]   [2019]   [Feb]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 081/143] net: systemport: Fix WoL with password after deep sleep
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Florian Fainelli <f.fainelli@gmail.com>

    [ Upstream commit 8dfb8d2cceb76b74ad5b58cc65c75994329b4d5e ]

    Broadcom STB chips support a deep sleep mode where all register
    contents are lost. Because we were stashing the MagicPacket password
    into some of these registers a suspend into that deep sleep then a
    resumption would not lead to being able to wake-up from MagicPacket with
    password again.

    Fix this by keeping a software copy of the password and program it
    during suspend.

    Fixes: 83e82f4c706b ("net: systemport: add Wake-on-LAN support")
    Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/net/ethernet/broadcom/bcmsysport.c | 25 ++++++++++---------------
    drivers/net/ethernet/broadcom/bcmsysport.h | 2 ++
    2 files changed, 12 insertions(+), 15 deletions(-)

    --- a/drivers/net/ethernet/broadcom/bcmsysport.c
    +++ b/drivers/net/ethernet/broadcom/bcmsysport.c
    @@ -400,7 +400,6 @@ static void bcm_sysport_get_wol(struct n
    struct ethtool_wolinfo *wol)
    {
    struct bcm_sysport_priv *priv = netdev_priv(dev);
    - u32 reg;

    wol->supported = WAKE_MAGIC | WAKE_MAGICSECURE;
    wol->wolopts = priv->wolopts;
    @@ -408,11 +407,7 @@ static void bcm_sysport_get_wol(struct n
    if (!(priv->wolopts & WAKE_MAGICSECURE))
    return;

    - /* Return the programmed SecureOn password */
    - reg = umac_readl(priv, UMAC_PSW_MS);
    - put_unaligned_be16(reg, &wol->sopass[0]);
    - reg = umac_readl(priv, UMAC_PSW_LS);
    - put_unaligned_be32(reg, &wol->sopass[2]);
    + memcpy(wol->sopass, priv->sopass, sizeof(priv->sopass));
    }

    static int bcm_sysport_set_wol(struct net_device *dev,
    @@ -428,13 +423,8 @@ static int bcm_sysport_set_wol(struct ne
    if (wol->wolopts & ~supported)
    return -EINVAL;

    - /* Program the SecureOn password */
    - if (wol->wolopts & WAKE_MAGICSECURE) {
    - umac_writel(priv, get_unaligned_be16(&wol->sopass[0]),
    - UMAC_PSW_MS);
    - umac_writel(priv, get_unaligned_be32(&wol->sopass[2]),
    - UMAC_PSW_LS);
    - }
    + if (wol->wolopts & WAKE_MAGICSECURE)
    + memcpy(priv->sopass, wol->sopass, sizeof(priv->sopass));

    /* Flag the device and relevant IRQ as wakeup capable */
    if (wol->wolopts) {
    @@ -1889,12 +1879,17 @@ static int bcm_sysport_suspend_to_wol(st
    unsigned int timeout = 1000;
    u32 reg;

    - /* Password has already been programmed */
    reg = umac_readl(priv, UMAC_MPD_CTRL);
    reg |= MPD_EN;
    reg &= ~PSW_EN;
    - if (priv->wolopts & WAKE_MAGICSECURE)
    + if (priv->wolopts & WAKE_MAGICSECURE) {
    + /* Program the SecureOn password */
    + umac_writel(priv, get_unaligned_be16(&priv->sopass[0]),
    + UMAC_PSW_MS);
    + umac_writel(priv, get_unaligned_be32(&priv->sopass[2]),
    + UMAC_PSW_LS);
    reg |= PSW_EN;
    + }
    umac_writel(priv, reg, UMAC_MPD_CTRL);

    /* Make sure RBUF entered WoL mode as result */
    --- a/drivers/net/ethernet/broadcom/bcmsysport.h
    +++ b/drivers/net/ethernet/broadcom/bcmsysport.h
    @@ -11,6 +11,7 @@
    #ifndef __BCM_SYSPORT_H
    #define __BCM_SYSPORT_H

    +#include <linux/ethtool.h>
    #include <linux/if_vlan.h>

    /* Receive/transmit descriptor format */
    @@ -682,6 +683,7 @@ struct bcm_sysport_priv {
    unsigned int crc_fwd:1;
    u16 rev;
    u32 wolopts;
    + u8 sopass[SOPASS_MAX];
    unsigned int wol_irq_disabled:1;

    /* MIB related fields */

    \
     
     \ /
      Last update: 2019-02-18 15:04    [W:4.039 / U:0.312 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site