summaryrefslogtreecommitdiff
path: root/network/wlan/WDI/PLATFORM/NdisComm/NdisComm.h
blob: 75561d1a92ff41e6625f3d22b4ee121b41c02c91 (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
#ifndef __INC_NDIS_COMMON_H
#define __INC_NDIS_COMMON_H


#define N6_LLC_SIZE			8
#define MAX_STALL_TIME		50		//us. If the delay time is larger than 50us, it's better to call NdisMSleep 


#define NDIS_ADAPTER_TYPE RT_SDIO_DEVICE
#define PNDIS_ADAPTER_TYPE PRT_SDIO_DEVICE
#define GET_NDIS_ADAPTER(_Adapter)	&_Adapter->NdisSdioDev

#ifndef	MAX_PATH
#define	MAX_PATH	260		// From DDK.
#endif // #ifndef	MAX_PATH


#define REGISTRY(_Adapter, _VAR)		(_Adapter->pNdisCommon->##_VAR)

#define SetRegLdpc(_Adapter, _RegLdpc)	(_Adapter->pNdisCommon->RegLdpc= _RegLdpc)
#define SetRegStbc(_Adapter, _RegStbc)	(_Adapter->pNdisCommon->RegStbc= _RegStbc)


//
// <Roger_DBG> Using following state flag to trace vWiFi and power transaction event for some vWiFi bus BSOD issue.
// 2013.1213
//
#define DrvStateNull				0
#define DrvStateNdisInitialized	BIT0
#define DrvStateHwInitialized		BIT1
#define DrvStateHwHalting		BIT2
#define DrvStateHwHalted			BIT3
#define DrvStateMacCreating		BIT4
#define DrvStateMacCreated		BIT5
#define DrvStateMacDeleting		BIT6
#define DrvStateMacDeleted		BIT7

//
// Following flags are abnormal cases
//
#define DrvStateMacCreate_NO_DO			BIT8
#define	DrvStateMacCreate_TMR_FAIL		BIT9
#define	DrvStateMacCreate_Fail			BIT10
#define DrvStateMacDelete_NO_DO			BIT11
#define	DrvStateMacDelete_TMR_FAIL		BIT12
#define	DrvStateMacDelete_Fail			BIT13
#define	DrvStateMacCreDel_WI_FAIL		BIT14

#define	DrvStateMacCreatDispatch		BIT15
#define	DrvStateMacCreatWait			BIT16

#define DrvStateNdisReqPended			BIT22
#define DrvStateNdisReqPended_Error0	BIT23
#define DrvStateMacPendReq_Error0		BIT24
#define DrvStateMacPendReq_Error1		BIT25
#define DrvStateMacPendReq_Error2		BIT26
#define DrvStateResetting					BIT27

#define DrvStateWI_Error0				BIT28
#define DrvStateWI_Error1				BIT29
#define DrvStateWI_Error2				BIT30
#define DrvStateWI_Error3				BIT31

#if DRV_LOG_REGISTRY
#define RT_GET_DRV_STATE(__pAdapter)				(GetDefaultAdapter(__pAdapter)->DrvState)
#define RT_GET_DRV_STATE_ERROR(__pAdapter)		(GetDefaultAdapter(__pAdapter)->bDrvStateError)
#define RT_CLEAR_DRV_STATE_ERROR(__pAdapter)		(GetDefaultAdapter(__pAdapter)->bDrvStateError = FALSE)

// Reset all driver state for initialization
#define RT_INIT_DRV_STATE(__pAdapter)\
{\
	u4Byte	DrvState;\
	RT_TRACE(COMP_INIT, DBG_TRACE, ("RT_INIT_DRV_STATE: \n"));\
	PlatformAcquireSpinLock(__pAdapter, RT_DRV_STATE_SPINLOCK);\
	GetDefaultAdapter(__pAdapter)->DrvState= DrvStateNull;\
	DrvState = RT_GET_DRV_STATE(__pAdapter);\
	PlatformReleaseSpinLock(__pAdapter, RT_DRV_STATE_SPINLOCK);\
	if(N6WriteRegDriverState(__pAdapter, DrvState) == NDIS_STATUS_FAILURE)\
	{\
		GetDefaultAdapter(__pAdapter)->bDrvStateError = TRUE;\
	}\
}

// Set specific driver state
#define RT_SET_DRV_STATE(__pAdapter, __StaBits)	\
{	\
	u4Byte	DrvState;\
	RT_TRACE(COMP_INIT, DBG_TRACE, ("RT_SET_DRV_STATE: %#x\n", __StaBits));\
	PlatformAcquireSpinLock(__pAdapter, RT_DRV_STATE_SPINLOCK);\
	(GetDefaultAdapter(__pAdapter))->DrvState |= ((RT_DF_TYPE)(__StaBits));\
	DrvState = RT_GET_DRV_STATE(__pAdapter);\
	PlatformReleaseSpinLock(__pAdapter, RT_DRV_STATE_SPINLOCK);\
	if(N6WriteRegDriverState(__pAdapter, DrvState) == NDIS_STATUS_FAILURE)\
	{\
		GetDefaultAdapter(__pAdapter)->bDrvStateError = TRUE;\
	}\
}

// Clear corresponding driver state
#define RT_CLEAR_DRV_STATE(__pAdapter, __StaBits)\
{\
	u4Byte	DrvState;\
	RT_TRACE(COMP_INIT, DBG_TRACE, ("RT_CLEAR_DRV_STATE: %#x\n", __StaBits));\
	PlatformAcquireSpinLock(__pAdapter, RT_DRV_STATE_SPINLOCK);\
	(GetDefaultAdapter(__pAdapter))->DrvState &= (~((RT_DF_TYPE)(__StaBits)));\
	DrvState = RT_GET_DRV_STATE(__pAdapter);\
	PlatformReleaseSpinLock(__pAdapter, RT_DRV_STATE_SPINLOCK);\
	if(N6WriteRegDriverState(__pAdapter, DrvState) == NDIS_STATUS_FAILURE)\
	{\
		GetDefaultAdapter(__pAdapter)->bDrvStateError = TRUE;\
	}\
}
#else
#define RT_GET_DRV_STATE(__pAdapter)	0
#define RT_GET_DRV_STATE_ERROR(__pAdapter)	0
#define RT_CLEAR_DRV_STATE_ERROR(__pAdapter)
#define RT_INIT_DRV_STATE(__pAdapter)
#define RT_SET_DRV_STATE(__pAdapter, __StaBits)
#define RT_CLEAR_DRV_STATE(__pAdapter, __StaBits)
#endif


typedef struct  __RT_THREAD_PLATFORM_EXT{
	NDIS_EVENT	CompleteEvent;
	NDIS_EVENT		TrigerEvent;
	u4Byte			Period;
	NDIS_SPIN_LOCK	Lock;


	PKTHREAD		Thread;

}RT_THREAD_PLATFORM_EXT, *PRT_THREAD_PLATFORM_EXT;


// Add for windwos common binary.
typedef struct _NIC_MUTEX
{
    ULONG                   Counter;
    ULONG                   ModuleAndLine;  // useful for debugging

} NIC_MUTEX, *PNIC_MUTEX;

//
// 2011/02/25 MH Moev the global spin lock and and mutex for global variable between two adapter
// we need to define all the MAC and structure for dedicated OS.
//
// Add for 92D Dual MAC communication protection.
typedef struct GLOBAL_SPINLOCK
{
    ULONG                   SpinlockCounter;

    KIRQL                    SpinlockIrql;

} GLOBAL_SPINLOCK, *PGLOBAL_SPINLOCK;



//
// Global Mutex: can only be used at PASSIVE level.
//
#define ACQUIRE_GLOBAL_MUTEX(_MutexCounter)                              \
{                                                               \
    while (NdisInterlockedIncrement((PULONG)&(_MutexCounter)) != 1)\
    {                                                           \
        NdisInterlockedDecrement((PULONG)&(_MutexCounter));        \
        NdisMSleep(10000);                          \
    }                                                           \
}

#define RELEASE_GLOBAL_MUTEX(_MutexCounter)                              \
{                                                               \
    NdisInterlockedDecrement((PULONG)&(_MutexCounter));              \
}

//
// Global Spinlock: can be used at PASSIVE and DISPATCH level.
//

#define ACQUIRE_GLOBAL_SPINLOCK(_pSpinlock)                         \
{                                                                                               \
    KIRQL                    TempIrql;                                                    \
    TempIrql = KeGetCurrentIrql();                                                 \
    if (TempIrql == PASSIVE_LEVEL)                                                  \
    {                                                                                           \
    	  KeRaiseIrql(DISPATCH_LEVEL, &TempIrql);	                          \
    }                                                                                           \
    while (NdisInterlockedIncrement((PULONG)&((_pSpinlock)->SpinlockCounter)) != 1)\
    {                                                                                                             \
        NdisInterlockedDecrement((PULONG)&((_pSpinlock)->SpinlockCounter));        \
        NdisStallExecution(40);                                                                            \
    }                                                                                                             \
    (_pSpinlock)->SpinlockIrql = TempIrql;                                                          \
}

#define RELEASE_GLOBAL_SPINLOCK(_pSpinlock)                                           \
{                                                                                                                \
    KIRQL                    TempIrql;                                                                      \
    TempIrql = (_pSpinlock)->SpinlockIrql;                                                         \
    NdisInterlockedDecrement((PULONG)&((_pSpinlock)->SpinlockCounter));          \
    if (TempIrql == PASSIVE_LEVEL)                                                                  \
        KeLowerIrql(TempIrql);                                                                           \
}


//===============================================
// The following is for Windows pIRP definition
//===============================================
typedef struct _IRP_ENTRY
{
	RT_LIST_ENTRY List;
	PIRP  	          pIrp;
}IRP_ENTRY, *PIRP_ENTRY;


//
// Data structure used in DbgWorkItem related OID.
//
typedef struct _RT8187DBGWIPARAM
{
	ULONG		bDbgActCompleted;
	ULONG		eDbgActType;
	ULONG		IoOffset;
	ULONG		IoValue;	
	ULONG		outLen;
	UCHAR		outBuf[200];
}RT8187DBGWIPARAM, *PRT8187DBGWIPARAM;

//===============================================

NDIS_STATUS
NdisStatusFromRtStatus(
	IN	u4Byte	rtStatus
	);


VOID
Dot11_UpdateDefaultSetting(
	IN	PADAPTER		pAdapter
);


VOID
HT_UpdateDefaultSetting(
	IN	PADAPTER		pAdapter
);


VOID
VHT_UpdateDefaultSetting(
	IN	PADAPTER		pAdapter
);

VOID 
PSC_UpdateDefaultSetting(
	IN	PADAPTER		pAdapter
);

VOID 
HAL_UpdateDefaultSetting(
	IN	PADAPTER		pAdapter
);

NTSTATUS
PlatformReadCommonDwordRegistry(
	IN	PWCHAR			registryName,
	OUT	pu4Byte			Data);

NTSTATUS
PlatformWriteCommonDwordRegistry(
	IN	PWCHAR			registryName,
	IN	pu4Byte			Data);

NTSTATUS
PlatformWriteBTAntPosDwordRegistry(
	IN	PWCHAR			registryName,
	IN	pu4Byte			Data);

NTSTATUS
PlatformReadBTFWLoaderDwordRegistry(
	IN	PWCHAR			registryName,
	OUT	pu1Byte			resultValue);


#endif