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
|