skge: fix wake on lan

Need to rework wake on lan code to setup properly and get activated
on shutdown (and suspend), not when ethtool is run.

This does not need to go to stable queue because wake on lan
was not even included in 2.6.20 (or earlier versions).

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: Jeff Garzik <jeff@garzik.org>

authored by Stephen Hemminger and committed by Jeff Garzik 692412b3 9467a8fc

+59 -37
+59 -37
drivers/net/skge.c
··· 163 { 164 struct skge_hw *hw = skge->hw; 165 int port = skge->port; 166 - enum pause_control save_mode; 167 - u32 ctrl; 168 169 - /* Bring hardware out of reset */ 170 skge_write16(hw, B0_CTST, CS_RST_CLR); 171 skge_write16(hw, SK_REG(port, GMAC_LINK_CTRL), GMLC_RST_CLR); 172 173 - skge_write8(hw, SK_REG(port, GPHY_CTRL), GPC_RST_CLR); 174 - skge_write8(hw, SK_REG(port, GMAC_CTRL), GMC_RST_CLR); 175 176 /* Force to 10/100 skge_reset will re-enable on resume */ 177 - save_mode = skge->flow_control; 178 - skge->flow_control = FLOW_MODE_SYMMETRIC; 179 180 - ctrl = skge->advertising; 181 - skge->advertising &= ~(ADVERTISED_1000baseT_Half|ADVERTISED_1000baseT_Full); 182 - 183 - skge_phy_reset(skge); 184 - 185 - skge->flow_control = save_mode; 186 - skge->advertising = ctrl; 187 188 /* Set GMAC to no flow control and auto update for speed/duplex */ 189 gma_write16(hw, port, GM_GP_CTRL, ··· 246 struct skge_port *skge = netdev_priv(dev); 247 struct skge_hw *hw = skge->hw; 248 249 - if (wol->wolopts & wol_supported(hw)) 250 return -EOPNOTSUPP; 251 252 skge->wol = wol->wolopts; 253 - if (!netif_running(dev)) 254 - skge_wol_init(skge); 255 return 0; 256 } 257 ··· 2552 printk(KERN_INFO PFX "%s: disabling interface\n", dev->name); 2553 2554 netif_stop_queue(dev); 2555 - netif_carrier_off(dev); 2556 if (hw->chip_id == CHIP_ID_GENESIS && hw->phy_type == SK_PHY_XMAC) 2557 del_timer_sync(&skge->link_timer); 2558 2559 netif_poll_disable(dev); 2560 2561 spin_lock_irq(&hw->hw_lock); 2562 hw->intr_mask &= ~portmask[port]; ··· 3784 } 3785 3786 #ifdef CONFIG_PM 3787 - static int vaux_avail(struct pci_dev *pdev) 3788 - { 3789 - int pm_cap; 3790 - 3791 - pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM); 3792 - if (pm_cap) { 3793 - u16 ctl; 3794 - pci_read_config_word(pdev, pm_cap + PCI_PM_PMC, &ctl); 3795 - if (ctl & PCI_PM_CAP_AUX_POWER) 3796 - return 1; 3797 - } 3798 - return 0; 3799 - } 3800 - 3801 - 3802 static int skge_suspend(struct pci_dev *pdev, pm_message_t state) 3803 { 3804 struct skge_hw *hw = pci_get_drvdata(pdev); ··· 3804 3805 wol |= skge->wol; 3806 } 3807 - 3808 - if (wol && vaux_avail(pdev)) 3809 - skge_write8(hw, B0_POWER_CTRL, 3810 - PC_VAUX_ENA | PC_VCC_ENA | PC_VAUX_ON | PC_VCC_OFF); 3811 3812 skge_write32(hw, B0_IMSK, 0); 3813 pci_enable_wake(pdev, pci_choose_state(pdev, state), wol); ··· 3850 } 3851 #endif 3852 3853 static struct pci_driver skge_driver = { 3854 .name = DRV_NAME, 3855 .id_table = skge_id_table, ··· 3881 .suspend = skge_suspend, 3882 .resume = skge_resume, 3883 #endif 3884 }; 3885 3886 static int __init skge_init_module(void)
··· 163 { 164 struct skge_hw *hw = skge->hw; 165 int port = skge->port; 166 + u16 ctrl; 167 168 skge_write16(hw, B0_CTST, CS_RST_CLR); 169 skge_write16(hw, SK_REG(port, GMAC_LINK_CTRL), GMLC_RST_CLR); 170 171 + /* Turn on Vaux */ 172 + skge_write8(hw, B0_POWER_CTRL, 173 + PC_VAUX_ENA | PC_VCC_ENA | PC_VAUX_ON | PC_VCC_OFF); 174 + 175 + /* WA code for COMA mode -- clear PHY reset */ 176 + if (hw->chip_id == CHIP_ID_YUKON_LITE && 177 + hw->chip_rev >= CHIP_REV_YU_LITE_A3) { 178 + u32 reg = skge_read32(hw, B2_GP_IO); 179 + reg |= GP_DIR_9; 180 + reg &= ~GP_IO_9; 181 + skge_write32(hw, B2_GP_IO, reg); 182 + } 183 + 184 + skge_write32(hw, SK_REG(port, GPHY_CTRL), 185 + GPC_DIS_SLEEP | 186 + GPC_HWCFG_M_3 | GPC_HWCFG_M_2 | GPC_HWCFG_M_1 | GPC_HWCFG_M_0 | 187 + GPC_ANEG_1 | GPC_RST_SET); 188 + 189 + skge_write32(hw, SK_REG(port, GPHY_CTRL), 190 + GPC_DIS_SLEEP | 191 + GPC_HWCFG_M_3 | GPC_HWCFG_M_2 | GPC_HWCFG_M_1 | GPC_HWCFG_M_0 | 192 + GPC_ANEG_1 | GPC_RST_CLR); 193 + 194 + skge_write32(hw, SK_REG(port, GMAC_CTRL), GMC_RST_CLR); 195 196 /* Force to 10/100 skge_reset will re-enable on resume */ 197 + gm_phy_write(hw, port, PHY_MARV_AUNE_ADV, 198 + PHY_AN_100FULL | PHY_AN_100HALF | 199 + PHY_AN_10FULL | PHY_AN_10HALF| PHY_AN_CSMA); 200 + /* no 1000 HD/FD */ 201 + gm_phy_write(hw, port, PHY_MARV_1000T_CTRL, 0); 202 + gm_phy_write(hw, port, PHY_MARV_CTRL, 203 + PHY_CT_RESET | PHY_CT_SPS_LSB | PHY_CT_ANE | 204 + PHY_CT_RE_CFG | PHY_CT_DUP_MD); 205 206 207 /* Set GMAC to no flow control and auto update for speed/duplex */ 208 gma_write16(hw, port, GM_GP_CTRL, ··· 227 struct skge_port *skge = netdev_priv(dev); 228 struct skge_hw *hw = skge->hw; 229 230 + if (wol->wolopts & ~wol_supported(hw)) 231 return -EOPNOTSUPP; 232 233 skge->wol = wol->wolopts; 234 return 0; 235 } 236 ··· 2535 printk(KERN_INFO PFX "%s: disabling interface\n", dev->name); 2536 2537 netif_stop_queue(dev); 2538 + 2539 if (hw->chip_id == CHIP_ID_GENESIS && hw->phy_type == SK_PHY_XMAC) 2540 del_timer_sync(&skge->link_timer); 2541 2542 netif_poll_disable(dev); 2543 + netif_carrier_off(dev); 2544 2545 spin_lock_irq(&hw->hw_lock); 2546 hw->intr_mask &= ~portmask[port]; ··· 3766 } 3767 3768 #ifdef CONFIG_PM 3769 static int skge_suspend(struct pci_dev *pdev, pm_message_t state) 3770 { 3771 struct skge_hw *hw = pci_get_drvdata(pdev); ··· 3801 3802 wol |= skge->wol; 3803 } 3804 3805 skge_write32(hw, B0_IMSK, 0); 3806 pci_enable_wake(pdev, pci_choose_state(pdev, state), wol); ··· 3851 } 3852 #endif 3853 3854 + static void skge_shutdown(struct pci_dev *pdev) 3855 + { 3856 + struct skge_hw *hw = pci_get_drvdata(pdev); 3857 + int i, wol = 0; 3858 + 3859 + for (i = 0; i < hw->ports; i++) { 3860 + struct net_device *dev = hw->dev[i]; 3861 + struct skge_port *skge = netdev_priv(dev); 3862 + 3863 + if (skge->wol) 3864 + skge_wol_init(skge); 3865 + wol |= skge->wol; 3866 + } 3867 + 3868 + pci_enable_wake(pdev, PCI_D3hot, wol); 3869 + pci_enable_wake(pdev, PCI_D3cold, wol); 3870 + 3871 + pci_disable_device(pdev); 3872 + pci_set_power_state(pdev, PCI_D3hot); 3873 + 3874 + } 3875 + 3876 static struct pci_driver skge_driver = { 3877 .name = DRV_NAME, 3878 .id_table = skge_id_table, ··· 3860 .suspend = skge_suspend, 3861 .resume = skge_resume, 3862 #endif 3863 + .shutdown = skge_shutdown, 3864 }; 3865 3866 static int __init skge_init_module(void)