summaryrefslogtreecommitdiff
path: root/network/wlan/WDI/COMMON/PowerSave.h
blob: aa10b31b9f35a85cdac2d14c4babba10efca64e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
#ifndef __INC_POWERSAVE_H
#define __INC_POWERSAVE_H

/*++
Copyright (c) Realtek Semiconductor Corp. All rights reserved.

Module Name:
	HalUsb.h
	
Abstract:
	Prototype of HalUsbXXX() and related data structure.
	    
Major Change History:
	When       Who               What
	---------- ---------------   -------------------------------
	2006-11-06 Rcnjko            Create.
	
--*/


//================================================================================
// Helper macros. 
//================================================================================
#define IN_LEGACY_POWER_SAVE(__pStaQos) (((__pStaQos)->Curr4acUapsd & 0x0f) == 0)
#define	GET_POWER_SAVE_CONTROL(_pMgntInfo)	((PRT_POWER_SAVE_CONTROL)(&((_pMgntInfo)->PowerSaveControl)))
// 
// Get Wifi Mode Power Save, if it is true, follow PS-POLL or WMM APSD specification. Or use NULL-frame to
// implement power save mode. By Bruce, 2008-09-17.
//
#define	IS_WIFI_POWER_SAVE(_pMgntInfo) \
	((_pMgntInfo)->dot11PowerSaveMode != eActive && (_pMgntInfo)->PsPollType != 2 &&\
		((_pMgntInfo)->bWiFiConfg	|| (_pMgntInfo)->PsPollType == 1 ||				\
		!((_pMgntInfo)->IOTAction & HT_IOT_ACT_NULL_DATA_POWER_SAVING)))

#define	IS_FW_POWER_SAVE(_pMgntInfo) \
	((_pMgntInfo)->dot11PowerSaveMode != eActive && GET_POWER_SAVE_CONTROL(_pMgntInfo)->bFwCtrlLPS)


#define	RT_SET_PS_LEVEL(_pAdapter, _PS_FLAG)	(GET_POWER_SAVE_CONTROL(&(_pAdapter->MgntInfo))->CurPsLevel |= _PS_FLAG)
#define	RT_CLEAR_PS_LEVEL(_pAdapter, _PS_FLAG)	(GET_POWER_SAVE_CONTROL(&(_pAdapter->MgntInfo))->CurPsLevel &= (~(_PS_FLAG)))
#define	RT_GET_CUR_PS_LEVEL(_pAdapter)	(GET_POWER_SAVE_CONTROL(&(_pAdapter->MgntInfo))->CurPsLevel)
#define	RT_IN_PS_LEVEL(_pAdapter, _PS_FLAG)	((RT_GET_CUR_PS_LEVEL(_pAdapter) & _PS_FLAG) ? TRUE : FALSE)

//
// <Roger_Notes> Currently we only take PCIe interface into consideration for RTD3 function.
// 2013.02.08.
//

        #define IS_RTD3_SUPPORT(_pAdapter)	FALSE
        #define RTD3_GET_DEV_PWR_STATE PowerDeviceD0

// Currently we support the machanism on 8723BS A to D-cut for Intel Baytrail-CR old BIOS behavior. 
// 2014.04.09 by tynli.
#define IS_CARD_DISABLE_IN_FW_LOW_PWR_STATE(_pAdapter)	\
	(GET_POWER_SAVE_CONTROL(&(_pAdapter->MgntInfo))->CardDisableInLowClk && IS_VENDOR_8723B_D_CUT_BEFORE(_pAdapter))

//
// Only allow enter WoWLAN mode in infrastructure mode or no link. Do not support WoWLAN if adapter is
// operating in AP or IBSS mode.
//
#define IS_WOWLAN_OPERATING_MODE(_pMgntInfo) \
	((_pMgntInfo)->OpMode == RT_OP_MODE_INFRASTRUCTURE || \
		(_pMgntInfo)->OpMode == RT_OP_MODE_NO_LINK)


#define IPS_DISABLE_DEF_OPMODE	BIT0		// Disable IPS by default port OpMode (IBSS, AP)
#define IPS_DISABLE_EXT_OPMODE	BIT1		// Disable IPS by Extension port OpMode (VWifi)
#define IPS_DISABLE_PROXIMITY	BIT2		// Disable IPS by PROXIMITY Mode
#define IPS_DISABLE_BT_ON			BIT3		// Disable IPS by BT3.0+HS
#define IPS_DISABLE_BY_OID		BIT4


#define LPS_DISABLE_AP_MODE							BIT0
#define LPS_DISABLE_BT_HS_CONNECTION					BIT1
#define LPS_DISABLE_TURN_OFF_ADAPTER					BIT2
#define LPS_DISABLE_UPDATE_LPS_STATUS_HNDR			BIT3
#define LPS_DISABLE_DEBUG_CONTROL					BIT4
#define LPS_DISABLE_INTEL_PROX_MODE					BIT5
#define LPS_DISABLE_SET_DISASSOCIATE					BIT6
#define LPS_DISABLE_SET_DEAUTH						BIT7
#define LPS_DISABLE_ON_DISASSOC						BIT8
#define LPS_DISABLE_ON_DEAUTH							BIT9
#define LPS_DISABLE_MGNT_DISCONNECT					BIT10
#define LPS_DISABLE_MGNT_INDI_DISCONNECT				BIT11
#define LPS_DISABLE_JOIN_REQ							BIT12
#define LPS_DISABLE_LINK_REQ							BIT13
#define LPS_DISABLE_FOR_ROAMING						BIT14
#define LPS_DISABLE_WATCH_DOG_BUSY_TRAFFIC			BIT15
#define LPS_DISABLE_WATCH_DOG_MEDIA_DISCONNEC		BIT16
#define LPS_DISABLE_OID_SET							BIT17
#define LPS_DISABLE_LEAVE_ALL_PS						BIT18
#define LPS_DISABLE_LEAVE_CHK_RDY						BIT19
#define LPS_DISABLE_RX_DETECT_BUSY					BIT20
#define LPS_DISABLE_TX_EAPOL_PKT						BIT21
#define LPS_DISABLE_TX_DHCP_PKT						BIT22
#define LPS_DISABLE_TX_ARP_PKT						BIT23
#define LPS_DISABLE_TX_SPECIAL_PKT						BIT24
#define LPS_DISABLE_TX_DETECT_BUSY					BIT25
#define LPS_DISABLE_BT_COEX							BIT26
#define LPS_DISABLE_DEVICE_DISCOVERY					BIT27
//================================================================================
// Variable Definition. 
//================================================================================
typedef enum _POWER_LEVEL_CONFIG
{
	POWER_SAVING_NO_POWER_SAVING, // Maximal Performance
	POWER_SAVING_FAST_PSP, // Low Power Saving
	POWER_SAVING_MAX_PSP, // Medium Power Saving
	POWER_SAVING_MAXIMUM_LEVEL, // Maximal Power Saving
}POWER_LEVEL_CONFIG;

typedef enum _POWER_SETTING_CONFIG
{
	POWERGUID_MAX_POWER_SAVINGS, // Power Saver
	POWERGUID_TYPICAL_POWER_SAVINGS, // Banlanced
	POWERGUID_MIN_POWER_SAVINGS, // High performance
	POWERGUID_UNDEFINED,
}POWER_SETTING_CONFIG;

typedef enum _POWER_POLICY_CONFIG
{
	POWERCFG_MAX_POWER_SAVINGS,			// Enter IPS, LPS when DC mode
	POWERCFG_GLOBAL_POWER_SAVINGS,		// Enter IPS, LPS when DC mode and PowerSaver config. Depends on OS configuration.
	POWERCFG_LOCAL_POWER_SAVINGS,		// Enter IPS, LPS when DC mode and not Maximum Performance config. Depends on Wifi configuration.
	POWERCFG_LENOVO,					// Enter IPS, LPS when DC mode and not Maximum Performance, AC mode and Maximum Power Saving.
	POWERCFG_LENOVO_JANPEN,				// Enter IPS, LPS when OS config to Banlanced or PowerSave. Don't care about AC/DC mode.
	POWERCFG_SAMSUNG,					// Enter IPS, LPS when OS config to PowerSave. Don't care about AC/DC mode.
	POWERCFG_HP,					 	// Enter IPS, LPS when OS config to PowerSave. Don't care about AC/DC mode.
}POWER_POLICY_CONFIG;


//================================================================================
// Callback routines of timers and workitems.  
//================================================================================
VOID 
OnMoreData(
	IN PADAPTER		pAdapter
	);

BOOLEAN
IsOurFrameBuffred(
	IN	OCTET_STRING	Tim,
	IN	u2Byte			AId
	);

BOOLEAN
IsMcstFrameBuffered(
	IN	OCTET_STRING	octetTim
	);

VOID
DozeWorkItemCallback(
	IN PVOID		pContext
	);


VOID
AwakeTimerCallback(
	IN PRT_TIMER		pTimer
	);

VOID
AwakeWorkItemCallback(
	IN PVOID		pContext
	);

VOID
InactivePsWorkItemCallback(
	IN PVOID		pContext
	);

VOID
InactivePsTimerCallback(
	IN PRT_TIMER		pTimer
	);

//================================================================================
// 802.11 legacy power save.
//================================================================================
VOID
LPS_OnBeacon_BSS(
	IN	PADAPTER			pAdapter,
	IN	OCTET_STRING		osBeacon
	);

VOID
LPS_DozeStart(
	PADAPTER	pAdapter
	);

VOID
LPS_DozeComplete(
	IN	PADAPTER		pAdapter
	);

VOID
LPS_AwakeComplete(
	IN	PADAPTER		pAdapter
	);

BOOLEAN
LPS_OnTx(
	IN PADAPTER		pAdapter,
	IN PRT_TCB		pTcb
	);

//================================================================================
// WMM power save.
//================================================================================
VOID
WMMPS_OnBeacon_BSS(
	IN	PADAPTER			pAdapter,
	IN	OCTET_STRING		osBeacon
	);

VOID
WMMPS_DozeStart(
	PADAPTER	pAdapter
	);

VOID
WMMPS_DozeComplete(
	IN	PADAPTER		pAdapter
	);

VOID
WMMPS_AwakeComplete(
	IN	PADAPTER		pAdapter
	);

BOOLEAN
WMMPS_OnTx(
	IN PADAPTER		pAdapter,
	IN PRT_TCB		pTcb
	);

BOOLEAN
GetQosQueueIDMaskAPSD(
	u1Byte		QueueID,
	AC_UAPSD	APSD
	);

BOOLEAN
GetPS_Doze(
	IN PADAPTER		pAdapter
	);



//================================================================================
// Inactive power save.
//================================================================================

VOID
IPSEnter(
	IN PADAPTER		pAdapter
	);

VOID
IPSLeave(
	IN PADAPTER		pAdapter,
	IN BOOLEAN		bForceEnter
	);

VOID
IPSEnable(
	IN PADAPTER		pAdapter
	);

VOID
IPSDisable(
	IN PADAPTER		pAdapter,
	IN BOOLEAN		bForceEnter	,
	IN u1Byte		nReason
	);

VOID
IPSReturn(
	IN PADAPTER		pAdapter,
	IN u1Byte		nReason
	);

//================================================================================
// Leisure Power Save in linked state.
//================================================================================

VOID
LeisurePSEnter(
	IN PADAPTER		pAdapter
	);

VOID
LeisurePSLeave(
	IN PADAPTER		pAdapter,
	IN u4Byte			reason
	);

//================================================================================
// Fw control LPS.
//================================================================================

BOOLEAN
GetFwLPS_Doze(
	IN PADAPTER 	pAdapter
	);

VOID
LeaveAllPowerSaveMode(
	IN PADAPTER		Adapter
	);

BOOLEAN
LPSLeaveAndCheckReady(
	IN PADAPTER		Adapter
	);

VOID
FwPsClockOnWorkitemCallback(
	IN	PVOID	Context
	);

#endif