sky2: WoL changes
Change Wake On Lan code to be similar to vendor driver. The definition of Y2_HW_WOL_ON is confusing; what it means is transition to firmware SPI setting when doing power change. Since same code is done for both shutdown and suspend, use common code path. Signed-off-by: Stephen Hemminger <shemminger@vyatta.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
8b05543129
commit
5f8ae5c537
|
@ -251,6 +251,8 @@ static void sky2_power_on(struct sky2_hw *hw)
|
||||||
|
|
||||||
sky2_pci_write32(hw, PCI_CFG_REG_1, 0);
|
sky2_pci_write32(hw, PCI_CFG_REG_1, 0);
|
||||||
|
|
||||||
|
sky2_write16(hw, B0_CTST, Y2_HW_WOL_ON);
|
||||||
|
|
||||||
/* Enable workaround for dev 4.107 on Yukon-Ultra & Extreme */
|
/* Enable workaround for dev 4.107 on Yukon-Ultra & Extreme */
|
||||||
reg = sky2_read32(hw, B2_GP_IO);
|
reg = sky2_read32(hw, B2_GP_IO);
|
||||||
reg |= GLB_GPIO_STAT_RACE_DIS;
|
reg |= GLB_GPIO_STAT_RACE_DIS;
|
||||||
|
@ -782,6 +784,9 @@ static void sky2_wol_init(struct sky2_port *sky2)
|
||||||
ctrl |= WOL_CTL_DIS_PME_ON_PATTERN|WOL_CTL_DIS_PATTERN_UNIT;
|
ctrl |= WOL_CTL_DIS_PME_ON_PATTERN|WOL_CTL_DIS_PATTERN_UNIT;
|
||||||
sky2_write16(hw, WOL_REGS(port, WOL_CTRL_STAT), ctrl);
|
sky2_write16(hw, WOL_REGS(port, WOL_CTRL_STAT), ctrl);
|
||||||
|
|
||||||
|
/* Disable PiG firmware */
|
||||||
|
sky2_write16(hw, B0_CTST, Y2_HW_WOL_OFF);
|
||||||
|
|
||||||
/* Turn on legacy PCI-Express PME mode */
|
/* Turn on legacy PCI-Express PME mode */
|
||||||
reg1 = sky2_pci_read32(hw, PCI_DEV_REG1);
|
reg1 = sky2_pci_read32(hw, PCI_DEV_REG1);
|
||||||
reg1 |= PCI_Y2_PME_LEGACY;
|
reg1 |= PCI_Y2_PME_LEGACY;
|
||||||
|
@ -789,7 +794,6 @@ static void sky2_wol_init(struct sky2_port *sky2)
|
||||||
|
|
||||||
/* block receiver */
|
/* block receiver */
|
||||||
sky2_write8(hw, SK_REG(port, RX_GMF_CTRL_T), GMF_RST_SET);
|
sky2_write8(hw, SK_REG(port, RX_GMF_CTRL_T), GMF_RST_SET);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sky2_set_tx_stfwd(struct sky2_hw *hw, unsigned port)
|
static void sky2_set_tx_stfwd(struct sky2_hw *hw, unsigned port)
|
||||||
|
@ -3272,27 +3276,6 @@ static inline u8 sky2_wol_supported(const struct sky2_hw *hw)
|
||||||
return sky2_is_copper(hw) ? (WAKE_PHY | WAKE_MAGIC) : 0;
|
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)
|
static void sky2_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
|
||||||
{
|
{
|
||||||
const struct sky2_port *sky2 = netdev_priv(dev);
|
const struct sky2_port *sky2 = netdev_priv(dev);
|
||||||
|
@ -3311,11 +3294,6 @@ static int sky2_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
sky2->wol = wol->wolopts;
|
sky2->wol = wol->wolopts;
|
||||||
|
|
||||||
sky2_hw_set_wol(hw);
|
|
||||||
|
|
||||||
if (!netif_running(dev))
|
|
||||||
sky2_wol_init(sky2);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4809,7 +4787,6 @@ static void __devexit sky2_remove(struct pci_dev *pdev)
|
||||||
pci_set_drvdata(pdev, NULL);
|
pci_set_drvdata(pdev, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
|
||||||
static int sky2_suspend(struct pci_dev *pdev, pm_message_t state)
|
static int sky2_suspend(struct pci_dev *pdev, pm_message_t state)
|
||||||
{
|
{
|
||||||
struct sky2_hw *hw = pci_get_drvdata(pdev);
|
struct sky2_hw *hw = pci_get_drvdata(pdev);
|
||||||
|
@ -4834,6 +4811,8 @@ static int sky2_suspend(struct pci_dev *pdev, pm_message_t state)
|
||||||
wol |= sky2->wol;
|
wol |= sky2->wol;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
device_set_wakeup_enable(&pdev->dev, wol != 0);
|
||||||
|
|
||||||
sky2_write32(hw, B0_IMSK, 0);
|
sky2_write32(hw, B0_IMSK, 0);
|
||||||
napi_disable(&hw->napi);
|
napi_disable(&hw->napi);
|
||||||
sky2_power_aux(hw);
|
sky2_power_aux(hw);
|
||||||
|
@ -4846,6 +4825,7 @@ static int sky2_suspend(struct pci_dev *pdev, pm_message_t state)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM
|
||||||
static int sky2_resume(struct pci_dev *pdev)
|
static int sky2_resume(struct pci_dev *pdev)
|
||||||
{
|
{
|
||||||
struct sky2_hw *hw = pci_get_drvdata(pdev);
|
struct sky2_hw *hw = pci_get_drvdata(pdev);
|
||||||
|
@ -4895,34 +4875,7 @@ out:
|
||||||
|
|
||||||
static void sky2_shutdown(struct pci_dev *pdev)
|
static void sky2_shutdown(struct pci_dev *pdev)
|
||||||
{
|
{
|
||||||
struct sky2_hw *hw = pci_get_drvdata(pdev);
|
sky2_suspend(pdev, PMSG_SUSPEND);
|
||||||
int i, wol = 0;
|
|
||||||
|
|
||||||
if (!hw)
|
|
||||||
return;
|
|
||||||
|
|
||||||
rtnl_lock();
|
|
||||||
del_timer_sync(&hw->watchdog_timer);
|
|
||||||
|
|
||||||
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;
|
|
||||||
sky2_wol_init(sky2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (wol)
|
|
||||||
sky2_power_aux(hw);
|
|
||||||
rtnl_unlock();
|
|
||||||
|
|
||||||
pci_enable_wake(pdev, PCI_D3hot, wol);
|
|
||||||
pci_enable_wake(pdev, PCI_D3cold, wol);
|
|
||||||
|
|
||||||
pci_disable_device(pdev);
|
|
||||||
pci_set_power_state(pdev, PCI_D3hot);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pci_driver sky2_driver = {
|
static struct pci_driver sky2_driver = {
|
||||||
|
|
Loading…
Reference in New Issue