1 /****************************************************************************** 2 * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved. 3 * 4 * This program is distributed in the hope that it will be useful, but WITHOUT 5 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 6 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 7 * more details. 8 * 9 * The full GNU General Public License is included in this distribution in the 10 * file called LICENSE. 11 * 12 * Contact Information: 13 * wlanfae <wlanfae@realtek.com> 14 ******************************************************************************/ 15 16 #include "rtl_core.h" 17 #include "r8192E_hw.h" 18 #include "r8190P_rtl8256.h" 19 #include "rtl_pm.h" 20 21 22 int rtl92e_suspend(struct pci_dev *pdev, pm_message_t state) 23 { 24 struct net_device *dev = pci_get_drvdata(pdev); 25 struct r8192_priv *priv = rtllib_priv(dev); 26 u32 ulRegRead; 27 28 netdev_info(dev, "============> r8192E suspend call.\n"); 29 del_timer_sync(&priv->gpio_polling_timer); 30 cancel_delayed_work_sync(&priv->gpio_change_rf_wq); 31 priv->polling_timer_on = 0; 32 33 if (!netif_running(dev)) { 34 netdev_info(dev, 35 "RTL819XE:UI is open out of suspend function\n"); 36 goto out_pci_suspend; 37 } 38 39 if (dev->netdev_ops->ndo_stop) 40 dev->netdev_ops->ndo_stop(dev); 41 netif_device_detach(dev); 42 43 if (!priv->rtllib->bSupportRemoteWakeUp) { 44 rtl92e_set_rf_state(dev, eRfOff, RF_CHANGE_BY_INIT); 45 ulRegRead = rtl92e_readl(dev, CPU_GEN); 46 ulRegRead |= CPU_GEN_SYSTEM_RESET; 47 rtl92e_writel(dev, CPU_GEN, ulRegRead); 48 } else { 49 rtl92e_writel(dev, WFCRC0, 0xffffffff); 50 rtl92e_writel(dev, WFCRC1, 0xffffffff); 51 rtl92e_writel(dev, WFCRC2, 0xffffffff); 52 rtl92e_writeb(dev, PMR, 0x5); 53 rtl92e_writeb(dev, MacBlkCtrl, 0xa); 54 } 55 out_pci_suspend: 56 netdev_info(dev, "WOL is %s\n", priv->rtllib->bSupportRemoteWakeUp ? 57 "Supported" : "Not supported"); 58 pci_save_state(pdev); 59 pci_disable_device(pdev); 60 pci_enable_wake(pdev, pci_choose_state(pdev, state), 61 priv->rtllib->bSupportRemoteWakeUp ? 1 : 0); 62 pci_set_power_state(pdev, pci_choose_state(pdev, state)); 63 64 mdelay(20); 65 66 return 0; 67 } 68 69 int rtl92e_resume(struct pci_dev *pdev) 70 { 71 struct net_device *dev = pci_get_drvdata(pdev); 72 struct r8192_priv *priv = rtllib_priv(dev); 73 int err; 74 u32 val; 75 76 netdev_info(dev, "================>r8192E resume call.\n"); 77 78 pci_set_power_state(pdev, PCI_D0); 79 80 err = pci_enable_device(pdev); 81 if (err) { 82 netdev_err(dev, "pci_enable_device failed on resume\n"); 83 return err; 84 } 85 pci_restore_state(pdev); 86 87 pci_read_config_dword(pdev, 0x40, &val); 88 if ((val & 0x0000ff00) != 0) 89 pci_write_config_dword(pdev, 0x40, val & 0xffff00ff); 90 91 pci_enable_wake(pdev, PCI_D0, 0); 92 93 if (priv->polling_timer_on == 0) 94 rtl92e_check_rfctrl_gpio_timer((unsigned long)dev); 95 96 if (!netif_running(dev)) { 97 netdev_info(dev, 98 "RTL819XE:UI is open out of resume function\n"); 99 goto out; 100 } 101 102 netif_device_attach(dev); 103 if (dev->netdev_ops->ndo_open) 104 dev->netdev_ops->ndo_open(dev); 105 106 if (!priv->rtllib->bSupportRemoteWakeUp) 107 rtl92e_set_rf_state(dev, eRfOn, RF_CHANGE_BY_INIT); 108 109 out: 110 RT_TRACE(COMP_POWER, "<================r8192E resume call.\n"); 111 return 0; 112 } 113 114