diff options
Diffstat (limited to 'drivers/net/ethernet/broadcom/bcmsysport.c')
-rw-r--r-- | drivers/net/ethernet/broadcom/bcmsysport.c | 29 |
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 | ||
538 | static int bcm_sysport_set_wol(struct net_device *dev, | 537 | static 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) { |