summaryrefslogtreecommitdiff
path: root/network/wlan/WDI/COMMON/ActionTimer.h
blob: 4b575d9a605dad58e1ef521fb4ec54fa6ff3a3d9 (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

#ifndef __INC_ACTION_TIMER_H
#define __INC_ACTION_TIMER_H


// Use Handle instead of pointer for private access ------
typedef u1Byte 	ACTION_TIMER_HANDLE;
#define 	INVALID_ACTION_TIMER_HANDLE		0
#define 	MAX_ACTION_TIMER_HANDLE			255
// ----------------------------------------------


typedef enum _ACTION_TIMER_REFERENCED_CLOCK
{
	CLOCK_INVALID = 0,
	SW_OS_SYSTEM_CLOCK,
	HW_TSF_CLOCK

} ACTION_TIMER_REFERENCED_CLOCK, *PACTION_TIMER_REFERENCED_CLOCK;


typedef enum _ACTION_TIMER_HW_TIMER
{
	HW_TIMER_NO_USE = 0,
	HW_TSF_CLOCK_PS_TIMER,
	HW_TIMER_MAX
	
} ACTION_TIMER_HW_TIMER, *PACTION_TIMER_HW_TIMER;



#define 	US_CLOCK_TO_MS(_usClock)		((_usClock) / 1000)

#define  ACTION_TIMER_HW_TIMER_INTERRUPT_DELAY_US	(50)

#define  ACTION_TIMER_ITEM_FIRE_TOLERANCE_TIME_US	(1000)
#define  ACTION_TIMER_ITEM_MAX_PENDING_TIME_MS		(30 * 1000)

#define  ACTION_TIMER_ITEM_MAX_TOTAL_EXECUTION_TIME_US		(3000)
#define  ACTION_TIMER_ITEM_MAX_SINGLE_EXECUTION_TIME_US		(1000)

typedef	struct _ACTION_TIMER_ITEM ACTION_TIMER_ITEM, *PACTION_TIMER_ITEM;

typedef enum _ACTION_TYPE
{
	ACTION_TYPE_INVALID = 0, 
	ACTION_TYPE_MULTICHANNEL_SWITCH,
	ACTION_TYPE_CUSTOMIZED_SCAN,
	ACTION_TYPE_P2P_POWERSAVE,
	ACTION_TYPE_ALL,
	ACTION_TYPE_MAX
	
} ACTION_TYPE, *PACTION_TYPE;


typedef VOID
(*ACTION_TIMER_ITEM_CALLBACK)(
	const ACTION_TIMER_ITEM * const	pOneShotActionItem
);

typedef	struct _ACTION_TIMER_ITEM
{
	// Internal Use for ActionTimer ---------------------------------------------
	RT_LIST_ENTRY				List;
	ACTION_TIMER_HANDLE			ActionOwner;		// Owner of this action item
	// ---------------------------------------------------------------------

	// Fill the Following to Register an Item --------------------------------------------------------------------
	ACTION_TYPE 				ActionType;			// Category for a set of action items implementing a single feature
	u8Byte						usTimeout;			// Absolute system us time specifying the timeout
	PVOID						pContext;			// User-specified data context
	ACTION_TIMER_ITEM_CALLBACK	CallbackFunc;		// Timeout callback function
	// ---------------------------------------------------------------------------------------------------
	
} ACTION_TIMER_ITEM, *PACTION_TIMER_ITEM;


typedef struct _ACTION_TIMER 
{
	RT_LIST_ENTRY			List;
	
	ACTION_TIMER_HANDLE		TimerHandle;

	ACTION_TIMER_REFERENCED_CLOCK	ClockType;

	// For Tsf Shared Hardware Timer -------------
	ACTION_TIMER_HW_TIMER	HwTimer;
	// ---------------------------------------
	
	// For SW_OS_SYSTEM_CLOCK ---------------
	RT_TIMER				SoftTimer;
	// ---------------------------------------

	RT_LIST_ENTRY			TimeOrderedActionItemQueue;	// Protected by ACTION_TIMER_COMMON_CONTEXT.ActionTimerLock
	u4Byte					uNumberOfActionItems;			// Protected by ACTION_TIMER_COMMON_CONTEXT.ActionTimerLock
	
} ACTION_TIMER, *PACTION_TIMER;


typedef struct _ACTION_TIMER_COMMON_CONTEXT {

	RT_SPIN_LOCK	ActionTimerLock;	

	// Preallocated Hw Action Timer (Indexed by ACTION_TIMER_HW_TIMER) -------------------------
	ACTION_TIMER	HwActionTimer[HW_TIMER_MAX];
	// ------------------------------------------------------------------------------------
	
	RT_LIST_ENTRY	ActionTimerQueue;				// Protected by ACTION_TIMER_COMMON_CONTEXT.ActionTimerLock
	u4Byte			uNumberOfActionTimers;			// Protected by ACTION_TIMER_COMMON_CONTEXT.ActionTimerLock
	u1Byte			LastAssignedTimerHandle;		// Protected by ACTION_TIMER_COMMON_CONTEXT.ActionTimerLock


	// Check if the dynamic memory is returned completely ------
	u4Byte 			uAllocatedMemory;
	u4Byte			uReleasedMemory;
	// --------------------------------------------------
		
} ACTION_TIMER_COMMON_CONTEXT, *PACTION_TIMER_COMMON_CONTEXT;

#define  ACTION_TIMER_SIZE_OF_COMMON_CONTEXT 		sizeof(ACTION_TIMER_COMMON_CONTEXT)



VOID
ActionTimerInitializeCommonContext(
	PADAPTER pAdapter
);

VOID
ActionTimerDeInitializeCommonContext(
	PADAPTER	pAdapter
);

VOID
ActionTimerRegisterActionItem(
	PADAPTER				pAdapter,
	PACTION_TIMER_ITEM		pInputDataItem,
	ACTION_TIMER_HANDLE	 	ActionTimerHandle
);

ACTION_TIMER_HANDLE
ActionTimerAllocate(
	PADAPTER 	pAdapter,
	const char*	pTimerName,
	ACTION_TIMER_REFERENCED_CLOCK	ClockType,
	ACTION_TIMER_HW_TIMER	HwTimerSelect
);

VOID
ActionTimerRelease(
	PADAPTER 				pAdapter,
	ACTION_TIMER_HANDLE		ActionTimerHandle
);

VOID
ActionTimerFlushActionItem(
	PADAPTER 				pAdapter,
	ACTION_TIMER_HANDLE		ActionTimerHandle,
	ACTION_TYPE				ActionType
);

VOID
ActionTimerHwTimerCallback(
	PADAPTER					pAdapter,
	ACTION_TIMER_HW_TIMER		HwTimer
);

#endif