Message ID | 4B55BD8E.2040705@ring3k.org |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
From: Mike McCormack <mikem@ring3k.org> Date: Tue, 19 Jan 2010 23:11:26 +0900 > Y2_HW_WOL_ON/Y2_HW_WOL_OFF should be set and cleared per chip, > not per port. On dual port cards, Y2_HW_WOL_ON should be > enabled if either sky2 port has WOL enabled. > > Found while reviewing code for a WOL regression, though this is > probably not the cause of the regression. > > Signed-off-by: Mike McCormack <mikem@ring3k.org> Stephen? ACK? -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Mike McCormack <mikem@ring3k.org> Date: Tue, 19 Jan 2010 23:11:26 +0900 > Y2_HW_WOL_ON/Y2_HW_WOL_OFF should be set and cleared per chip, > not per port. On dual port cards, Y2_HW_WOL_ON should be > enabled if either sky2 port has WOL enabled. > > Found while reviewing code for a WOL regression, though this is > probably not the cause of the regression. > > Signed-off-by: Mike McCormack <mikem@ring3k.org> Applied, thanks Mike. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c index 4c06020..d86b7e8 100644 --- a/drivers/net/sky2.c +++ b/drivers/net/sky2.c @@ -3238,6 +3238,27 @@ static inline u8 sky2_wol_supported(const struct sky2_hw *hw) return sky2_is_copper(hw) ? (WAKE_PHY | WAKE_MAGIC) : 0; } +static void sky2_hw_set_wol(struct sky2_hw *hw) +{ + int wol = 0; + int i; + + for (i = 0; i < hw->ports; i++) { + struct net_device *dev = hw->dev[i]; + struct sky2_port *sky2 = netdev_priv(dev); + + if (sky2->wol) + wol = 1; + } + + if (hw->chip_id == CHIP_ID_YUKON_EC_U || + hw->chip_id == CHIP_ID_YUKON_EX || + hw->chip_id == CHIP_ID_YUKON_FE_P) + sky2_write32(hw, B0_CTST, wol ? Y2_HW_WOL_ON : Y2_HW_WOL_OFF); + + device_set_wakeup_enable(&hw->pdev->dev, wol); +} + static void sky2_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) { const struct sky2_port *sky2 = netdev_priv(dev); @@ -3257,13 +3278,7 @@ static int sky2_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) sky2->wol = wol->wolopts; - if (hw->chip_id == CHIP_ID_YUKON_EC_U || - hw->chip_id == CHIP_ID_YUKON_EX || - hw->chip_id == CHIP_ID_YUKON_FE_P) - sky2_write32(hw, B0_CTST, sky2->wol - ? Y2_HW_WOL_ON : Y2_HW_WOL_OFF); - - device_set_wakeup_enable(&hw->pdev->dev, sky2->wol); + sky2_hw_set_wol(hw); if (!netif_running(dev)) sky2_wol_init(sky2);
Y2_HW_WOL_ON/Y2_HW_WOL_OFF should be set and cleared per chip, not per port. On dual port cards, Y2_HW_WOL_ON should be enabled if either sky2 port has WOL enabled. Found while reviewing code for a WOL regression, though this is probably not the cause of the regression. Signed-off-by: Mike McCormack <mikem@ring3k.org> --- drivers/net/sky2.c | 29 ++++++++++++++++++++++------- 1 files changed, 22 insertions(+), 7 deletions(-)