aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom/bcmsysport.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/broadcom/bcmsysport.c')
-rw-r--r--drivers/net/ethernet/broadcom/bcmsysport.c29
1 files changed, 14 insertions, 15 deletions
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c
index f9521d0274b7..bc3ac369cbe3 100644
--- a/drivers/net/ethernet/broadcom/bcmsysport.c
+++ b/drivers/net/ethernet/broadcom/bcmsysport.c
@@ -134,6 +134,10 @@ static void bcm_sysport_set_rx_csum(struct net_device *dev,
134 134
135 priv->rx_chk_en = !!(wanted & NETIF_F_RXCSUM); 135 priv->rx_chk_en = !!(wanted & NETIF_F_RXCSUM);
136 reg = rxchk_readl(priv, RXCHK_CONTROL); 136 reg = rxchk_readl(priv, RXCHK_CONTROL);
137 /* Clear L2 header checks, which would prevent BPDUs
138 * from being received.
139 */
140 reg &= ~RXCHK_L2_HDR_DIS;
137 if (priv->rx_chk_en) 141 if (priv->rx_chk_en)
138 reg |= RXCHK_EN; 142 reg |= RXCHK_EN;
139 else 143 else
@@ -520,7 +524,6 @@ static void bcm_sysport_get_wol(struct net_device *dev,
520 struct ethtool_wolinfo *wol) 524 struct ethtool_wolinfo *wol)
521{ 525{
522 struct bcm_sysport_priv *priv = netdev_priv(dev); 526 struct bcm_sysport_priv *priv = netdev_priv(dev);
523 u32 reg;
524 527
525 wol->supported = WAKE_MAGIC | WAKE_MAGICSECURE | WAKE_FILTER; 528 wol->supported = WAKE_MAGIC | WAKE_MAGICSECURE | WAKE_FILTER;
526 wol->wolopts = priv->wolopts; 529 wol->wolopts = priv->wolopts;
@@ -528,11 +531,7 @@ static void bcm_sysport_get_wol(struct net_device *dev,
528 if (!(priv->wolopts & WAKE_MAGICSECURE)) 531 if (!(priv->wolopts & WAKE_MAGICSECURE))
529 return; 532 return;
530 533
531 /* Return the programmed SecureOn password */ 534 memcpy(wol->sopass, priv->sopass, sizeof(priv->sopass));
532 reg = umac_readl(priv, UMAC_PSW_MS);
533 put_unaligned_be16(reg, &wol->sopass[0]);
534 reg = umac_readl(priv, UMAC_PSW_LS);
535 put_unaligned_be32(reg, &wol->sopass[2]);
536} 535}
537 536
538static int bcm_sysport_set_wol(struct net_device *dev, 537static int bcm_sysport_set_wol(struct net_device *dev,
@@ -548,13 +547,8 @@ static int bcm_sysport_set_wol(struct net_device *dev,
548 if (wol->wolopts & ~supported) 547 if (wol->wolopts & ~supported)
549 return -EINVAL; 548 return -EINVAL;
550 549
551 /* Program the SecureOn password */ 550 if (wol->wolopts & WAKE_MAGICSECURE)
552 if (wol->wolopts & WAKE_MAGICSECURE) { 551 memcpy(priv->sopass, wol->sopass, sizeof(priv->sopass));
553 umac_writel(priv, get_unaligned_be16(&wol->sopass[0]),
554 UMAC_PSW_MS);
555 umac_writel(priv, get_unaligned_be32(&wol->sopass[2]),
556 UMAC_PSW_LS);
557 }
558 552
559 /* Flag the device and relevant IRQ as wakeup capable */ 553 /* Flag the device and relevant IRQ as wakeup capable */
560 if (wol->wolopts) { 554 if (wol->wolopts) {
@@ -2649,13 +2643,18 @@ static int bcm_sysport_suspend_to_wol(struct bcm_sysport_priv *priv)
2649 unsigned int index, i = 0; 2643 unsigned int index, i = 0;
2650 u32 reg; 2644 u32 reg;
2651 2645
2652 /* Password has already been programmed */
2653 reg = umac_readl(priv, UMAC_MPD_CTRL); 2646 reg = umac_readl(priv, UMAC_MPD_CTRL);
2654 if (priv->wolopts & (WAKE_MAGIC | WAKE_MAGICSECURE)) 2647 if (priv->wolopts & (WAKE_MAGIC | WAKE_MAGICSECURE))
2655 reg |= MPD_EN; 2648 reg |= MPD_EN;
2656 reg &= ~PSW_EN; 2649 reg &= ~PSW_EN;
2657 if (priv->wolopts & WAKE_MAGICSECURE) 2650 if (priv->wolopts & WAKE_MAGICSECURE) {
2651 /* Program the SecureOn password */
2652 umac_writel(priv, get_unaligned_be16(&priv->sopass[0]),
2653 UMAC_PSW_MS);
2654 umac_writel(priv, get_unaligned_be32(&priv->sopass[2]),
2655 UMAC_PSW_LS);
2658 reg |= PSW_EN; 2656 reg |= PSW_EN;
2657 }
2659 umac_writel(priv, reg, UMAC_MPD_CTRL); 2658 umac_writel(priv, reg, UMAC_MPD_CTRL);
2660 2659
2661 if (priv->wolopts & WAKE_FILTER) { 2660 if (priv->wolopts & WAKE_FILTER) {