linux/drivers/staging/rtl8192e/rtl8192e/rtl_pm.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
   4 *
   5 * Contact Information: wlanfae <wlanfae@realtek.com>
   6 */
   7#include "rtl_core.h"
   8#include "r8192E_hw.h"
   9#include "r8190P_rtl8256.h"
  10#include "rtl_pm.h"
  11
  12
  13int rtl92e_suspend(struct device *dev_d)
  14{
  15        struct net_device *dev = dev_get_drvdata(dev_d);
  16        struct r8192_priv *priv = rtllib_priv(dev);
  17        u32     ulRegRead;
  18
  19        netdev_info(dev, "============> r8192E suspend call.\n");
  20        del_timer_sync(&priv->gpio_polling_timer);
  21        cancel_delayed_work_sync(&priv->gpio_change_rf_wq);
  22        priv->polling_timer_on = 0;
  23
  24        if (!netif_running(dev)) {
  25                netdev_info(dev,
  26                            "RTL819XE:UI is open out of suspend function\n");
  27                goto out_pci_suspend;
  28        }
  29
  30        if (dev->netdev_ops->ndo_stop)
  31                dev->netdev_ops->ndo_stop(dev);
  32        netif_device_detach(dev);
  33
  34        if (!priv->rtllib->bSupportRemoteWakeUp) {
  35                rtl92e_set_rf_state(dev, eRfOff, RF_CHANGE_BY_INIT);
  36                ulRegRead = rtl92e_readl(dev, CPU_GEN);
  37                ulRegRead |= CPU_GEN_SYSTEM_RESET;
  38                rtl92e_writel(dev, CPU_GEN, ulRegRead);
  39        } else {
  40                rtl92e_writel(dev, WFCRC0, 0xffffffff);
  41                rtl92e_writel(dev, WFCRC1, 0xffffffff);
  42                rtl92e_writel(dev, WFCRC2, 0xffffffff);
  43                rtl92e_writeb(dev, PMR, 0x5);
  44                rtl92e_writeb(dev, MacBlkCtrl, 0xa);
  45        }
  46out_pci_suspend:
  47        netdev_info(dev, "WOL is %s\n", priv->rtllib->bSupportRemoteWakeUp ?
  48                            "Supported" : "Not supported");
  49        device_set_wakeup_enable(dev_d, priv->rtllib->bSupportRemoteWakeUp);
  50
  51        mdelay(20);
  52
  53        return 0;
  54}
  55
  56int rtl92e_resume(struct device *dev_d)
  57{
  58        struct pci_dev *pdev = to_pci_dev(dev_d);
  59        struct net_device *dev = dev_get_drvdata(dev_d);
  60        struct r8192_priv *priv = rtllib_priv(dev);
  61        u32 val;
  62
  63        netdev_info(dev, "================>r8192E resume call.\n");
  64
  65
  66        pci_read_config_dword(pdev, 0x40, &val);
  67        if ((val & 0x0000ff00) != 0)
  68                pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
  69
  70        device_wakeup_disable(dev_d);
  71
  72        if (priv->polling_timer_on == 0)
  73                rtl92e_check_rfctrl_gpio_timer(&priv->gpio_polling_timer);
  74
  75        if (!netif_running(dev)) {
  76                netdev_info(dev,
  77                            "RTL819XE:UI is open out of resume function\n");
  78                goto out;
  79        }
  80
  81        netif_device_attach(dev);
  82        if (dev->netdev_ops->ndo_open)
  83                dev->netdev_ops->ndo_open(dev);
  84
  85        if (!priv->rtllib->bSupportRemoteWakeUp)
  86                rtl92e_set_rf_state(dev, eRfOn, RF_CHANGE_BY_INIT);
  87
  88out:
  89        RT_TRACE(COMP_POWER, "<================r8192E resume call.\n");
  90        return 0;
  91}
  92
  93