diff options
| -rw-r--r-- | drivers/net/ethernet/broadcom/bcmsysport.c | 25 | ||||
| -rw-r--r-- | drivers/net/ethernet/broadcom/bcmsysport.h | 2 | 
2 files changed, 12 insertions, 15 deletions
| diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c index f9521d0274b7..28c9b0bdf2f6 100644 --- a/drivers/net/ethernet/broadcom/bcmsysport.c +++ b/drivers/net/ethernet/broadcom/bcmsysport.c @@ -520,7 +520,6 @@ static void bcm_sysport_get_wol(struct net_device *dev,  				struct ethtool_wolinfo *wol)  {  	struct bcm_sysport_priv *priv = netdev_priv(dev); -	u32 reg;  	wol->supported = WAKE_MAGIC | WAKE_MAGICSECURE | WAKE_FILTER;  	wol->wolopts = priv->wolopts; @@ -528,11 +527,7 @@ static void bcm_sysport_get_wol(struct net_device *dev,  	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, @@ -548,13 +543,8 @@ static int bcm_sysport_set_wol(struct net_device *dev,  	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) { @@ -2649,13 +2639,18 @@ static int bcm_sysport_suspend_to_wol(struct bcm_sysport_priv *priv)  	unsigned int index, i = 0;  	u32 reg; -	/* Password has already been programmed */  	reg = umac_readl(priv, UMAC_MPD_CTRL);  	if (priv->wolopts & (WAKE_MAGIC | WAKE_MAGICSECURE))  		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);  	if (priv->wolopts & WAKE_FILTER) { diff --git a/drivers/net/ethernet/broadcom/bcmsysport.h b/drivers/net/ethernet/broadcom/bcmsysport.h index 0887e6356649..0b192fea9c5d 100644 --- a/drivers/net/ethernet/broadcom/bcmsysport.h +++ b/drivers/net/ethernet/broadcom/bcmsysport.h @@ -12,6 +12,7 @@  #define __BCM_SYSPORT_H  #include <linux/bitmap.h> +#include <linux/ethtool.h>  #include <linux/if_vlan.h>  #include <linux/net_dim.h> @@ -778,6 +779,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 */ | 
