aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/rtl8192e/r8192_pm.c
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2009-08-04 15:57:55 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2009-09-15 12:02:30 -0700
commitecdfa44610fa18678c3dd481af75368b9800c6c7 (patch)
tree294f4190ab902ac839e94cbf3d8e65d0b927a6c0 /drivers/staging/rtl8192e/r8192_pm.c
parentStaging: pohmelfs: sync with the development tree (diff)
downloadlinux-dev-ecdfa44610fa18678c3dd481af75368b9800c6c7.tar.xz
linux-dev-ecdfa44610fa18678c3dd481af75368b9800c6c7.zip
Staging: add Realtek 8192 PCI wireless driver
This wireless driver should work for the Realtek 8192 PCI devices. It comes directly from Realtek and has been tested to work on at least one laptop in the wild. Cc: Anthony Wong <awong1@novell.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/rtl8192e/r8192_pm.c')
-rw-r--r--drivers/staging/rtl8192e/r8192_pm.c181
1 files changed, 181 insertions, 0 deletions
diff --git a/drivers/staging/rtl8192e/r8192_pm.c b/drivers/staging/rtl8192e/r8192_pm.c
new file mode 100644
index 000000000000..d0f7c21bdf71
--- /dev/null
+++ b/drivers/staging/rtl8192e/r8192_pm.c
@@ -0,0 +1,181 @@
+/*
+ Power management interface routines.
+ Written by Mariusz Matuszek.
+ This code is currently just a placeholder for later work and
+ does not do anything useful.
+
+ This is part of rtl8180 OpenSource driver.
+ Copyright (C) Andrea Merello 2004 <andreamrl@tiscali.it>
+ Released under the terms of GPL (General Public Licence)
+*/
+
+#ifdef CONFIG_PM_RTL
+
+#include "r8192E.h"
+#include "r8192E_hw.h"
+#include "r8192_pm.h"
+#include "r8190_rtl8256.h"
+
+int rtl8192E_save_state (struct pci_dev *dev, pm_message_t state)
+{
+ printk(KERN_NOTICE "r8192E save state call (state %u).\n", state.event);
+ return(-EAGAIN);
+}
+
+
+int rtl8192E_suspend (struct pci_dev *pdev, pm_message_t state)
+{
+ struct net_device *dev = pci_get_drvdata(pdev);
+ struct r8192_priv *priv = ieee80211_priv(dev);
+ u8 ucRegRead;
+ u32 ulRegRead;
+
+ RT_TRACE(COMP_POWER, "============> r8192E suspend call.\n");
+ if (!netif_running(dev))
+ goto out_pci_suspend;
+
+ dev->stop(dev);
+#if 0
+
+ netif_carrier_off(dev);
+
+ ieee80211_softmac_stop_protocol(priv->ieee80211);
+
+ write_nic_byte(dev,MSR,(read_nic_byte(dev,MSR)&0xfc)|MSR_LINK_NONE);
+ if(!priv->ieee80211->bSupportRemoteWakeUp) {
+ /* disable tx/rx. In 8185 we write 0x10 (Reset bit),
+ * but here we make reference to WMAC and wirte 0x0.
+ * 2006.11.21 Emily
+ */
+ write_nic_byte(dev, CMDR, 0);
+ }
+ //disable interrupt
+ write_nic_dword(dev,INTA_MASK,0);
+ priv->irq_enabled = 0;
+ write_nic_dword(dev,ISR,read_nic_dword(dev, ISR));
+
+ /* need to free DM related functions */
+#if LINUX_VERSION_CODE >=KERNEL_VERSION(2,6,20)
+ cancel_work_sync(&priv->reset_wq);
+#else
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+ cancel_delayed_work(&priv->reset_wq);
+#endif
+#endif
+ del_timer_sync(&priv->fsync_timer);
+ del_timer_sync(&priv->watch_dog_timer);
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+ cancel_delayed_work(&priv->watch_dog_wq);
+ cancel_delayed_work(&priv->update_beacon_wq);
+#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
+ cancel_work_sync(&priv->qos_activate);
+#else
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+ cancel_delayed_work(&priv->qos_activate);
+#endif
+#endif
+
+ /* TODO
+#if ((DEV_BUS_TYPE == PCI_INTERFACE) && (HAL_CODE_BASE == RTL8192))
+pHalData->bHwRfOffAction = 2;
+#endif
+*/
+#endif
+ // Call MgntActSet_RF_State instead to prevent RF config race condition.
+ // By Bruce, 2008-01-17.
+ //
+ if(!priv->ieee80211->bSupportRemoteWakeUp) {
+ MgntActSet_RF_State(dev, eRfOff, RF_CHANGE_BY_INIT);
+ // 2006.11.30. System reset bit
+ ulRegRead = read_nic_dword(dev, CPU_GEN);
+ ulRegRead|=CPU_GEN_SYSTEM_RESET;
+ write_nic_dword(dev, CPU_GEN, ulRegRead);
+ } else {
+ //2008.06.03 for WOL
+ write_nic_dword(dev, WFCRC0, 0xffffffff);
+ write_nic_dword(dev, WFCRC1, 0xffffffff);
+ write_nic_dword(dev, WFCRC2, 0xffffffff);
+#ifdef RTL8190P
+ //GPIO 0 = TRUE
+ ucRegRead = read_nic_byte(dev, GPO);
+ ucRegRead |= BIT0;
+ write_nic_byte(dev, GPO, ucRegRead);
+#endif
+ //Write PMR register
+ write_nic_byte(dev, PMR, 0x5);
+ //Disable tx, enanble rx
+ write_nic_byte(dev, MacBlkCtrl, 0xa);
+ }
+
+out_pci_suspend:
+ RT_TRACE(COMP_POWER, "r8192E support WOL call??????????????????????\n");
+ if(priv->ieee80211->bSupportRemoteWakeUp) {
+ RT_TRACE(COMP_POWER, "r8192E support WOL call!!!!!!!!!!!!!!!!!!.\n");
+ }
+ netif_device_detach(dev);
+ pci_save_state(pdev);
+ pci_disable_device(pdev);
+ pci_enable_wake(pdev, pci_choose_state(pdev,state),\
+ priv->ieee80211->bSupportRemoteWakeUp?1:0);
+ pci_set_power_state(pdev,pci_choose_state(pdev,state));
+
+ return 0;
+}
+
+int rtl8192E_resume (struct pci_dev *pdev)
+{
+ struct net_device *dev = pci_get_drvdata(pdev);
+ //struct r8192_priv *priv = ieee80211_priv(dev);
+ //union iwreq_data wrqu;
+ int err;
+ u32 val;
+
+ RT_TRACE(COMP_POWER, "================>r8192E resume call.");
+
+ pci_set_power_state(pdev, PCI_D0);
+
+ err = pci_enable_device(pdev);
+ if(err) {
+ printk(KERN_ERR "%s: pci_enable_device failed on resume\n",
+ dev->name);
+ return err;
+ }
+
+ pci_restore_state(pdev);
+
+ /*
+ * Suspend/Resume resets the PCI configuration space, so we have to
+ * re-disable the RETRY_TIMEOUT register (0x41) to keep PCI Tx retries
+ * from interfering with C3 CPU state. pci_restore_state won't help
+ * here since it only restores the first 64 bytes pci config header.
+ */
+ pci_read_config_dword(pdev, 0x40, &val);
+ if ((val & 0x0000ff00) != 0) {
+ pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
+ }
+
+
+
+ pci_enable_wake(pdev, PCI_D0, 0);
+
+ if(!netif_running(dev))
+ goto out;
+
+ netif_device_attach(dev);
+
+ dev->open(dev);
+out:
+ RT_TRACE(COMP_POWER, "<================r8192E resume call.\n");
+ return 0;
+}
+
+
+int rtl8192E_enable_wake (struct pci_dev *dev, pm_message_t state, int enable)
+{
+ printk(KERN_NOTICE "r8192E enable wake call (state %u, enable %d).\n",
+ state.event, enable);
+ return(-EAGAIN);
+}
+
+#endif //CONFIG_PM_RTL