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 163 { 164 164 struct skge_hw *hw = skge->hw; 165 165 int port = skge->port; 166 - enum pause_control save_mode; 167 - u32 ctrl; 166 + u16 ctrl; 168 167 169 - /* Bring hardware out of reset */ 170 168 skge_write16(hw, B0_CTST, CS_RST_CLR); 171 169 skge_write16(hw, SK_REG(port, GMAC_LINK_CTRL), GMLC_RST_CLR); 172 170 173 - skge_write8(hw, SK_REG(port, GPHY_CTRL), GPC_RST_CLR); 174 - skge_write8(hw, SK_REG(port, GMAC_CTRL), GMC_RST_CLR); 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); 175 195 176 196 /* Force to 10/100 skge_reset will re-enable on resume */ 177 - save_mode = skge->flow_control; 178 - skge->flow_control = FLOW_MODE_SYMMETRIC; 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); 179 205 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 206 188 207 /* Set GMAC to no flow control and auto update for speed/duplex */ 189 208 gma_write16(hw, port, GM_GP_CTRL, ··· 246 227 struct skge_port *skge = netdev_priv(dev); 247 228 struct skge_hw *hw = skge->hw; 248 229 249 - if (wol->wolopts & wol_supported(hw)) 230 + if (wol->wolopts & ~wol_supported(hw)) 250 231 return -EOPNOTSUPP; 251 232 252 233 skge->wol = wol->wolopts; 253 - if (!netif_running(dev)) 254 - skge_wol_init(skge); 255 234 return 0; 256 235 } 257 236 ··· 2552 2535 printk(KERN_INFO PFX "%s: disabling interface\n", dev->name); 2553 2536 2554 2537 netif_stop_queue(dev); 2555 - netif_carrier_off(dev); 2538 + 2556 2539 if (hw->chip_id == CHIP_ID_GENESIS && hw->phy_type == SK_PHY_XMAC) 2557 2540 del_timer_sync(&skge->link_timer); 2558 2541 2559 2542 netif_poll_disable(dev); 2543 + netif_carrier_off(dev); 2560 2544 2561 2545 spin_lock_irq(&hw->hw_lock); 2562 2546 hw->intr_mask &= ~portmask[port]; ··· 3784 3766 } 3785 3767 3786 3768 #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 3769 static int skge_suspend(struct pci_dev *pdev, pm_message_t state) 3803 3770 { 3804 3771 struct skge_hw *hw = pci_get_drvdata(pdev); ··· 3804 3801 3805 3802 wol |= skge->wol; 3806 3803 } 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 3804 3812 3805 skge_write32(hw, B0_IMSK, 0); 3813 3806 pci_enable_wake(pdev, pci_choose_state(pdev, state), wol); ··· 3850 3851 } 3851 3852 #endif 3852 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 + 3853 3876 static struct pci_driver skge_driver = { 3854 3877 .name = DRV_NAME, 3855 3878 .id_table = skge_id_table, ··· 3881 3860 .suspend = skge_suspend, 3882 3861 .resume = skge_resume, 3883 3862 #endif 3863 + .shutdown = skge_shutdown, 3884 3864 }; 3885 3865 3886 3866 static int __init skge_init_module(void)