1 /******************************************************************************
2 * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
4 * Based on the r8180 driver, which is:
5 * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of version 2 of the GNU General Public License as
8 * published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 * You should have received a copy of the GNU General Public License along with
16 * this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 * The full GNU General Public License is included in this distribution in the
20 * file called LICENSE.
22 * Contact Information:
23 * wlanfae <wlanfae@realtek.com>
24 *****************************************************************************/
27 #include "r8192E_phy.h"
28 #include "r8192E_phyreg.h"
29 #include "r8190P_rtl8256.h" /* RTL8225 Radio frontend */
30 #include "r8192E_cmdpkt.h"
32 void rtl8192_hw_sleep_down(struct net_device *dev)
34 struct r8192_priv *priv = rtllib_priv(dev);
35 unsigned long flags = 0;
36 #ifdef CONFIG_ASPM_OR_D3
37 PRT_POWER_SAVE_CONTROL pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
39 spin_lock_irqsave(&priv->rf_ps_lock,flags);
40 if (priv->RFChangeInProgress) {
41 spin_unlock_irqrestore(&priv->rf_ps_lock,flags);
42 RT_TRACE(COMP_DBG, "rtl8192_hw_sleep_down(): RF Change in progress! \n");
45 spin_unlock_irqrestore(&priv->rf_ps_lock,flags);
46 RT_TRACE(COMP_DBG, "%s()============>come to sleep down\n", __func__);
48 #ifdef CONFIG_RTLWIFI_DEBUGFS
49 if (priv->debug->hw_holding) {
53 MgntActSet_RF_State(dev, eRfSleep, RF_CHANGE_BY_PS,false);
54 #ifdef CONFIG_ASPM_OR_D3
55 if (pPSC->RegRfPsLevel & RT_RF_LPS_LEVEL_ASPM)
58 RT_SET_PS_LEVEL(pPSC, RT_RF_LPS_LEVEL_ASPM);
63 void rtl8192_hw_sleep_wq(void *data)
65 struct rtllib_device *ieee = container_of_dwork_rsl(data,struct rtllib_device,hw_sleep_wq);
66 struct net_device *dev = ieee->dev;
67 rtl8192_hw_sleep_down(dev);
70 void rtl8192_hw_wakeup(struct net_device* dev)
72 struct r8192_priv *priv = rtllib_priv(dev);
73 unsigned long flags = 0;
74 #ifdef CONFIG_ASPM_OR_D3
75 PRT_POWER_SAVE_CONTROL pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
77 spin_lock_irqsave(&priv->rf_ps_lock,flags);
78 if (priv->RFChangeInProgress) {
79 spin_unlock_irqrestore(&priv->rf_ps_lock,flags);
80 RT_TRACE(COMP_DBG, "rtl8192_hw_wakeup(): RF Change in progress! \n");
81 queue_delayed_work_rsl(priv->rtllib->wq,&priv->rtllib->hw_wakeup_wq,MSECS(10));
84 spin_unlock_irqrestore(&priv->rf_ps_lock,flags);
85 #ifdef CONFIG_ASPM_OR_D3
86 if (pPSC->RegRfPsLevel & RT_RF_LPS_LEVEL_ASPM) {
88 RT_CLEAR_PS_LEVEL(pPSC, RT_RF_LPS_LEVEL_ASPM);
91 RT_TRACE(COMP_PS, "%s()============>come to wake up\n", __func__);
92 MgntActSet_RF_State(dev, eRfOn, RF_CHANGE_BY_PS,false);
95 void rtl8192_hw_wakeup_wq(void *data)
97 struct rtllib_device *ieee = container_of_dwork_rsl(data,struct rtllib_device,hw_wakeup_wq);
98 struct net_device *dev = ieee->dev;
99 rtl8192_hw_wakeup(dev);
103 #define MIN_SLEEP_TIME 50
104 #define MAX_SLEEP_TIME 10000
105 void rtl8192_hw_to_sleep(struct net_device *dev, u32 th, u32 tl)
107 struct r8192_priv *priv = rtllib_priv(dev);
112 spin_lock_irqsave(&priv->ps_lock,flags);
116 if (((tl>=rb)&& (tl-rb) <= MSECS(MIN_SLEEP_TIME))
117 ||((rb>tl)&& (rb-tl) < MSECS(MIN_SLEEP_TIME))) {
118 spin_unlock_irqrestore(&priv->ps_lock,flags);
119 printk("too short to sleep::%x, %x, %lx\n",tl, rb, MSECS(MIN_SLEEP_TIME));
123 if (((tl > rb) && ((tl-rb) > MSECS(MAX_SLEEP_TIME)))||
124 ((tl < rb) && (tl>MSECS(69)) && ((rb-tl) > MSECS(MAX_SLEEP_TIME)))||
125 ((tl<rb)&&(tl<MSECS(69))&&((tl+0xffffffff-rb)>MSECS(MAX_SLEEP_TIME)))) {
126 printk("========>too long to sleep:%x, %x, %lx\n", tl, rb, MSECS(MAX_SLEEP_TIME));
127 spin_unlock_irqrestore(&priv->ps_lock,flags);
131 u32 tmp = (tl>rb)?(tl-rb):(rb-tl);
132 queue_delayed_work_rsl(priv->rtllib->wq,
133 &priv->rtllib->hw_wakeup_wq,tmp);
135 queue_delayed_work_rsl(priv->rtllib->wq,
136 (void *)&priv->rtllib->hw_sleep_wq,0);
137 spin_unlock_irqrestore(&priv->ps_lock,flags);
140 void InactivePsWorkItemCallback(struct net_device *dev)
142 struct r8192_priv *priv = rtllib_priv(dev);
143 PRT_POWER_SAVE_CONTROL pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
145 RT_TRACE(COMP_PS, "InactivePsWorkItemCallback() ---------> \n");
146 pPSC->bSwRfProcessing = true;
148 RT_TRACE(COMP_PS, "InactivePsWorkItemCallback(): Set RF to %s.\n", \
149 pPSC->eInactivePowerState == eRfOff?"OFF":"ON");
150 #ifdef CONFIG_ASPM_OR_D3
151 if (pPSC->eInactivePowerState == eRfOn)
154 if ((pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_ASPM) && RT_IN_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_ASPM))
156 RT_DISABLE_ASPM(dev);
157 RT_CLEAR_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_ASPM);
161 MgntActSet_RF_State(dev, pPSC->eInactivePowerState, RF_CHANGE_BY_IPS,false);
163 #ifdef CONFIG_ASPM_OR_D3
164 if (pPSC->eInactivePowerState == eRfOff)
166 if (pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_ASPM)
169 RT_SET_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_ASPM);
174 pPSC->bSwRfProcessing = false;
175 RT_TRACE(COMP_PS, "InactivePsWorkItemCallback() <--------- \n");
179 IPSEnter(struct net_device *dev)
181 struct r8192_priv *priv = rtllib_priv(dev);
182 PRT_POWER_SAVE_CONTROL pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
183 RT_RF_POWER_STATE rtState;
185 if (pPSC->bInactivePs)
187 rtState = priv->rtllib->eRFPowerState;
188 if (rtState == eRfOn && !pPSC->bSwRfProcessing &&\
189 (priv->rtllib->state != RTLLIB_LINKED)&&\
190 (priv->rtllib->iw_mode != IW_MODE_MASTER))
192 RT_TRACE(COMP_PS,"IPSEnter(): Turn off RF.\n");
193 pPSC->eInactivePowerState = eRfOff;
194 priv->isRFOff = true;
195 priv->bInPowerSaveMode = true;
196 InactivePsWorkItemCallback(dev);
202 IPSLeave(struct net_device *dev)
204 struct r8192_priv *priv = rtllib_priv(dev);
205 PRT_POWER_SAVE_CONTROL pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
206 RT_RF_POWER_STATE rtState;
208 if (pPSC->bInactivePs)
210 rtState = priv->rtllib->eRFPowerState;
211 if (rtState != eRfOn && !pPSC->bSwRfProcessing && priv->rtllib->RfOffReason <= RF_CHANGE_BY_IPS)
213 RT_TRACE(COMP_PS, "IPSLeave(): Turn on RF.\n");
214 pPSC->eInactivePowerState = eRfOn;
215 priv->bInPowerSaveMode = false;
216 InactivePsWorkItemCallback(dev);
220 void IPSLeave_wq(void *data)
222 struct rtllib_device *ieee = container_of_work_rsl(data,struct rtllib_device,ips_leave_wq);
223 struct net_device *dev = ieee->dev;
224 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
225 down(&priv->rtllib->ips_sem);
227 up(&priv->rtllib->ips_sem);
230 void rtllib_ips_leave_wq(struct net_device *dev)
232 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
233 RT_RF_POWER_STATE rtState;
234 rtState = priv->rtllib->eRFPowerState;
236 if (priv->rtllib->PowerSaveControl.bInactivePs){
237 if (rtState == eRfOff){
238 if (priv->rtllib->RfOffReason > RF_CHANGE_BY_IPS)
240 RT_TRACE(COMP_ERR, "%s(): RF is OFF.\n",__func__);
244 printk("=========>%s(): IPSLeave\n",__func__);
245 queue_work_rsl(priv->rtllib->wq,&priv->rtllib->ips_leave_wq);
250 void rtllib_ips_leave(struct net_device *dev)
252 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
253 down(&priv->rtllib->ips_sem);
255 up(&priv->rtllib->ips_sem);
258 bool MgntActSet_802_11_PowerSaveMode(struct net_device *dev, u8 rtPsMode)
260 struct r8192_priv *priv = rtllib_priv(dev);
262 if (priv->rtllib->iw_mode == IW_MODE_ADHOC)
265 RT_TRACE(COMP_LPS,"%s(): set ieee->ps = %x\n",__func__,rtPsMode);
266 if (!priv->ps_force) {
267 priv->rtllib->ps = rtPsMode;
269 if (priv->rtllib->sta_sleep != LPS_IS_WAKE && rtPsMode == RTLLIB_PS_DISABLED) {
272 rtl8192_hw_wakeup(dev);
273 priv->rtllib->sta_sleep = LPS_IS_WAKE;
275 spin_lock_irqsave(&(priv->rtllib->mgmt_tx_lock), flags);
276 RT_TRACE(COMP_DBG, "LPS leave: notify AP we are awaked"
277 " ++++++++++ SendNullFunctionData\n");
278 rtllib_sta_ps_send_null_frame(priv->rtllib, 0);
279 spin_unlock_irqrestore(&(priv->rtllib->mgmt_tx_lock), flags);
286 void LeisurePSEnter(struct net_device *dev)
288 struct r8192_priv *priv = rtllib_priv(dev);
289 PRT_POWER_SAVE_CONTROL pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
291 RT_TRACE(COMP_PS, "LeisurePSEnter()...\n");
292 RT_TRACE(COMP_PS, "pPSC->bLeisurePs = %d, ieee->ps = %d,pPSC->LpsIdleCount is %d,RT_CHECK_FOR_HANG_PERIOD is %d\n",
293 pPSC->bLeisurePs, priv->rtllib->ps,pPSC->LpsIdleCount,RT_CHECK_FOR_HANG_PERIOD);
295 if (!((priv->rtllib->iw_mode == IW_MODE_INFRA) && (priv->rtllib->state == RTLLIB_LINKED))
296 || (priv->rtllib->iw_mode == IW_MODE_ADHOC) || (priv->rtllib->iw_mode == IW_MODE_MASTER))
299 if (pPSC->bLeisurePs) {
300 if (pPSC->LpsIdleCount >= RT_CHECK_FOR_HANG_PERIOD) {
302 if (priv->rtllib->ps == RTLLIB_PS_DISABLED) {
304 RT_TRACE(COMP_LPS, "LeisurePSEnter(): Enter 802.11 power save mode...\n");
306 if (!pPSC->bFwCtrlLPS) {
307 if (priv->rtllib->SetFwCmdHandler)
308 priv->rtllib->SetFwCmdHandler(dev, FW_CMD_LPS_ENTER);
310 MgntActSet_802_11_PowerSaveMode(dev, RTLLIB_PS_MBCAST|RTLLIB_PS_UNICAST);
313 pPSC->LpsIdleCount++;
318 void LeisurePSLeave(struct net_device *dev)
320 struct r8192_priv *priv = rtllib_priv(dev);
321 PRT_POWER_SAVE_CONTROL pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
324 RT_TRACE(COMP_PS, "LeisurePSLeave()...\n");
325 RT_TRACE(COMP_PS, "pPSC->bLeisurePs = %d, ieee->ps = %d\n",
326 pPSC->bLeisurePs, priv->rtllib->ps);
328 if (pPSC->bLeisurePs)
330 if (priv->rtllib->ps != RTLLIB_PS_DISABLED)
332 #ifdef CONFIG_ASPM_OR_D3
333 if (pPSC->RegRfPsLevel & RT_RF_LPS_LEVEL_ASPM && RT_IN_PS_LEVEL(pPSC, RT_RF_LPS_LEVEL_ASPM))
335 RT_DISABLE_ASPM(dev);
336 RT_CLEAR_PS_LEVEL(pPSC, RT_RF_LPS_LEVEL_ASPM);
339 RT_TRACE(COMP_LPS, "LeisurePSLeave(): Busy Traffic , Leave 802.11 power save..\n");
340 MgntActSet_802_11_PowerSaveMode(dev, RTLLIB_PS_DISABLED);
342 if (!pPSC->bFwCtrlLPS)
344 if (priv->rtllib->SetFwCmdHandler)
346 priv->rtllib->SetFwCmdHandler(dev, FW_CMD_LPS_LEAVE);
353 #ifdef CONFIG_ASPM_OR_D3
356 PlatformDisableHostL0s(struct net_device *dev)
358 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
359 u32 PciCfgAddrPort=0;
361 u8 uPciBridgeASPMSetting = 0;
364 if ( (priv->NdisAdapter.BusNumber == 0xff && priv->NdisAdapter.DevNumber == 0xff && priv->NdisAdapter.FuncNumber == 0xff) ||
365 (priv->NdisAdapter.PciBridgeBusNum == 0xff && priv->NdisAdapter.PciBridgeDevNum == 0xff && priv->NdisAdapter.PciBridgeFuncNum == 0xff) )
367 printk("PlatformDisableHostL0s(): Fail to enable ASPM. Cannot find the Bus of PCI(Bridge).\n");
371 PciCfgAddrPort= (priv->NdisAdapter.PciBridgeBusNum << 16)|(priv->NdisAdapter.PciBridgeDevNum<< 11)|(priv->NdisAdapter.PciBridgeFuncNum << 8)|(1 << 31);
372 Num4Bytes = (priv->NdisAdapter.PciBridgePCIeHdrOffset+0x10)/4;
375 NdisRawWritePortUlong(PCI_CONF_ADDRESS , PciCfgAddrPort+(Num4Bytes << 2));
377 NdisRawReadPortUchar(PCI_CONF_DATA, &uPciBridgeASPMSetting);
379 if (uPciBridgeASPMSetting & BIT0)
380 uPciBridgeASPMSetting &= ~(BIT0);
382 NdisRawWritePortUlong(PCI_CONF_ADDRESS , PciCfgAddrPort+(Num4Bytes << 2));
383 NdisRawWritePortUchar(PCI_CONF_DATA, uPciBridgeASPMSetting);
387 printk("PlatformDisableHostL0s():PciBridge BusNumber[%x], DevNumbe[%x], FuncNumber[%x], Write reg[%x] = %x\n",
388 priv->NdisAdapter.PciBridgeBusNum, priv->NdisAdapter.PciBridgeDevNum, priv->NdisAdapter.PciBridgeFuncNum,
389 (priv->NdisAdapter.PciBridgePCIeHdrOffset+0x10), (priv->NdisAdapter.PciBridgeLinkCtrlReg | (priv->RegDevicePciASPMSetting&~BIT0)));
393 PlatformEnable92CEBackDoor(struct net_device *dev)
395 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
399 if ( (priv->NdisAdapter.BusNumber == 0xff && priv->NdisAdapter.DevNumber == 0xff && priv->NdisAdapter.FuncNumber == 0xff) ||
400 (priv->NdisAdapter.PciBridgeBusNum == 0xff && priv->NdisAdapter.PciBridgeDevNum == 0xff && priv->NdisAdapter.PciBridgeFuncNum == 0xff) )
402 RT_TRACE(COMP_INIT, "PlatformEnableASPM(): Fail to enable ASPM. Cannot find the Bus of PCI(Bridge).\n");
406 pci_read_config_byte(priv->pdev, 0x70f, &value);
408 if (priv->NdisAdapter.PciBridgeVendor == PCI_BRIDGE_VENDOR_INTEL)
417 pci_write_config_byte(priv->pdev, 0x70f, value);
420 pci_read_config_byte(priv->pdev, 0x719, &value);
421 value |= (BIT3|BIT4);
422 pci_write_config_byte(priv->pdev, 0x719, value);
428 bool PlatformSwitchDevicePciASPM(struct net_device *dev, u8 value)
430 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
431 bool bResult = false;
433 pci_write_config_byte(priv->pdev, 0x80, value);
438 bool PlatformSwitchClkReq(struct net_device *dev, u8 value)
440 bool bResult = false;
441 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
447 if (Adapter->bDriverIsGoingToPnpSetPowerSleep && pDevice->RegSupportLowPowerState
452 pci_write_config_byte(priv->pdev,0x81,value);
459 PlatformDisableASPM(struct net_device *dev)
461 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
462 PRT_POWER_SAVE_CONTROL pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
463 u32 PciCfgAddrPort=0;
466 u16 PciBridgeLinkCtrlReg, ASPMLevel=0;
468 if (priv->NdisAdapter.PciBridgeVendor == PCI_BRIDGE_VENDOR_UNKNOWN)
470 RT_TRACE(COMP_POWER, "%s(): Disable ASPM. Recognize the Bus of PCI(Bridge) as UNKNOWN.\n",__func__);
474 LinkCtrlReg = priv->NdisAdapter.LinkCtrlReg;
475 PciBridgeLinkCtrlReg = priv->NdisAdapter.PciBridgeLinkCtrlReg;
477 ASPMLevel |= BIT0|BIT1;
478 LinkCtrlReg &=~ASPMLevel;
479 PciBridgeLinkCtrlReg &=~(BIT0|BIT1);
481 if ( (priv->NdisAdapter.BusNumber == 0xff && priv->NdisAdapter.DevNumber == 0xff && priv->NdisAdapter.FuncNumber == 0xff) ||
482 (priv->NdisAdapter.PciBridgeBusNum == 0xff && priv->NdisAdapter.PciBridgeDevNum == 0xff && priv->NdisAdapter.PciBridgeFuncNum == 0xff) )
485 PciCfgAddrPort= (priv->NdisAdapter.PciBridgeBusNum << 16)|(priv->NdisAdapter.PciBridgeDevNum<< 11)|(priv->NdisAdapter.PciBridgeFuncNum << 8)|(1 << 31);
486 Num4Bytes = (priv->NdisAdapter.PciBridgePCIeHdrOffset+0x10)/4;
488 NdisRawWritePortUlong(PCI_CONF_ADDRESS , PciCfgAddrPort+(Num4Bytes << 2));
490 NdisRawWritePortUchar(PCI_CONF_DATA, PciBridgeLinkCtrlReg);
491 RT_TRACE(COMP_POWER, "PlatformDisableASPM():PciBridge BusNumber[%x], DevNumbe[%x], FuncNumber[%x], Write reg[%x] = %x\n",
492 priv->NdisAdapter.PciBridgeBusNum, priv->NdisAdapter.PciBridgeDevNum, priv->NdisAdapter.PciBridgeFuncNum,
493 (priv->NdisAdapter.PciBridgePCIeHdrOffset+0x10), PciBridgeLinkCtrlReg);
499 void PlatformEnableASPM(struct net_device *dev)
501 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
502 PRT_POWER_SAVE_CONTROL pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
504 u32 PciCfgAddrPort=0;
506 u8 uPciBridgeASPMSetting = 0;
507 u8 uDeviceASPMSetting = 0;
510 if ( (priv->NdisAdapter.BusNumber == 0xff && priv->NdisAdapter.DevNumber == 0xff && priv->NdisAdapter.FuncNumber == 0xff) ||
511 (priv->NdisAdapter.PciBridgeBusNum == 0xff && priv->NdisAdapter.PciBridgeDevNum == 0xff && priv->NdisAdapter.PciBridgeFuncNum == 0xff) )
513 RT_TRACE(COMP_INIT, "PlatformEnableASPM(): Fail to enable ASPM. Cannot find the Bus of PCI(Bridge).\n");
517 ASPMLevel |= priv->RegDevicePciASPMSetting;
518 uDeviceASPMSetting = priv->NdisAdapter.LinkCtrlReg;
520 uDeviceASPMSetting |= ASPMLevel;
522 PlatformSwitchDevicePciASPM(dev, uDeviceASPMSetting);
524 if (pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_CLK_REQ) {
525 PlatformSwitchClkReq(dev,(pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_CLK_REQ) ? 1 : 0);
526 RT_SET_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_CLK_REQ);
533 u32 PlatformResetPciSpace(struct net_device *dev,u8 Value)
535 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
537 pci_write_config_byte(priv->pdev,0x04,Value);
542 bool PlatformSetPMCSR(struct net_device *dev,u8 value,bool bTempSetting)
544 bool bResult = false;
545 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
547 bool bActuallySet=false, bSetFunc=false;
551 spin_lock_irqsave(&priv->D3_lock,flag);
554 PlatformSwitchClkReq(dev, 0x01);
556 PlatformSwitchClkReq(dev, 0x00);
559 pci_write_config_byte(priv->pdev,0x44,Buffer);
560 RT_TRACE(COMP_POWER, "PlatformSetPMCSR(): D3(value: %d)\n", Buffer);
564 PlatformResetPciSpace(dev, 0x06);
565 PlatformResetPciSpace(dev, 0x07);
571 RT_DISABLE_FUNC(Adapter, DF_IO_D3_BIT);
575 RT_ENABLE_FUNC(Adapter, DF_IO_D3_BIT);
581 spin_unlock_irqrestore(&priv->D3_lock,flag);