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
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
|
#ifndef __INC_MULTICHANNELS_H
#define __INC_MULTICHANNELS_H
#define MULTICHANNEL_QUEUE_FOR_EXTSTA BE_QUEUE
#define MULTICHANNEL_QUEUE_FOR_EXTCLIENT VI_QUEUE
#define MULTICHANNEL_QUEUE_FOR_EXTGO BK_QUEUE
#define MULTICHANNEL_ACTION_NONE 0
#define MULTICHANNEL_ACTION_STARTED 1
#define MULTICHANNEL_ACTION_PAUSED 2
#define MULTICHANNEL_FCS_SUPPORT_START 1
#define MULTICHANNEL_FCS_SUPPORT_GO 4
#define FCS_STATE_ACTIVE BIT0
#define FCS_STATE_CONNECTED BIT1
#define FCS_STATE_PKT_PAUSED BIT2
#define FCS_STATE_PKT_DROPPED BIT3
#define FCS_NOTIFY_TYPE_C2H 1
#define FCS_NOTIFY_TYPE_CHANNEL 2
#define FCS_NOTIFY_TYPE_BT_DISABLE 3
typedef enum _MULTICHANNEL_FCS_COMMON_INFO{
MULTICHANNEL_FCS_COMMON_NUMCLIENT = 1,
MULTICHANNEL_FCS_COMMON_DURATION = 2,
MULTICHANNEL_FCS_PORT_ORDER = 3,
MULTICHANNEL_FCS_PORT_CHANNEL = 4,
MULTICHANNEL_FCS_PORT_BANDWIDTH = 5,
MULTICHANNEL_FCS_PORT_EXTOFFSET_40MHZ = 6,
MULTICHANNEL_FCS_PORT_EXTOFFSET_80MHZ = 7,
MULTICHANNEL_FCS_PORT_DURATION = 8,
MULTICHANNEL_FCS_PORT_RFETYPE = 9,
MULTICHANNEL_FCS_PORT_CHANNEL_TX_NULL = 10,
MULTICHANNEL_FCS_PORT_C2H_REPORT = 11,
MULTICHANNEL_FCS_PORT_CHANNEL_SCAN = 12,
MULTICHANNEL_FCS_PORT_ROLE = 13,
MULTICHANNEL_FCS_COMMON_NOA_DURATION = 14,
MULTICHANNEL_FCS_COMMON_NOA_STARTTIME = 15,
MULTICHANNEL_FCS_COMMON_STA_BEACONTIME = 16,
MULTICHANNEL_FCS_COMMON_QPKT_LEVEL = 17,
MULTICHANNEL_FCS_PORT_MACID_BITMAP = 18,
}MULTICHANNEL_FCS_COMMON_INFO;
// Multi-channel switch role for each port
typedef enum _FCS_ROLE{
FCS_ROLE_STA = 0,
FCS_ROLE_AP = 1,
FCS_ROLE_GC = 2,
FCS_ROLE_GO = 3,
}FCS_ROLE;
// Represent Channel Tx Null setting
typedef enum _FCS_CHANNEL_TX_NULL{
FCS_ENABLE_TX_NULL = 0,
FCS_DISABLE_TX_NULL = 1,
}FCS_CHANNEL_TX_NULL, *PFCS_CHANNEL_TX_NULL;
// Represent Channel Scan
typedef enum _FCS_CHANNEL_SCAN{
FCS_CHIDX = 0,
FCS_SCANCH_RSVD_LOC = 1,
}FCS_CHANNEL_SCAN, *PFCS_CHANNEL_SCAN;
// Represent C2H Report setting
typedef enum _FCS_C2H_REPORT{
FCS_C2H_REPORT_DISABLE = 0,
FCS_C2H_REPORT_FAIL_STATUS = 1,
FCS_C2H_REPORT_ALL_STATUS = 2,
}FCS_C2H_REPORT, *PFCS_C2H_REPORT;
// Represent FW status report of channel switch
typedef enum _FCS_STATUS_RPT{
FCS_RPT_SUCCESS = 0,
FCS_RPT_TXNULL_FAIL = 1,
FCS_RPT_STOPFCS = 2,
FCS_RPT_READY = 3,
}FCS_STATUS, *PFCS_STATUS;
// Represent FW status
typedef enum _FCS_FW_STATE{
FCS_FW_IDLE = 0,
FCS_FW_STARTING = 1,
FCS_FW_STOPPED = 2,
}FCS_FW_STATE, *PFCS_FW_STATE;
// Represent channel switch operation mode
typedef enum _FCS_CHNL_OPMODE{
FCS_CHNL_OPMODE_NONE = 0,
FCS_CHNL_OPMODE_RESET = 1,
FCS_CHNL_OPMODE_JOINBSS = 2,
FCS_CHNL_OPMODE_DISCONNECT = 3,
FCS_CHNL_OPMODE_JOINFAIL = 4,
FCS_CHNL_OPMODE_STARTMCC = 5,
}CHNL_OPMODE, *PCHNL_OPMODE;
// Represent queue packet setting
typedef enum _FCS_QPKT_LEVEL{
FCS_QPKT_DEFAULT = 0,
FCS_QPKT_BY_MACID_SLEEP = 1,
FCS_QPKT_BY_DRIVER_DROP = 2,
FCS_QPKT_BY_MACID_DROP = 4,
}FCS_QPKT_LEVEL, *PFCS_QPKT_LEVEL;
//============================================================================
// Multiple Channel Supported
//============================================================================
// Context for Each Port Specific
typedef struct _MULTICHANNEL_PORT_CONTEXT {
//==================================================
// Client-Related Elements
//==================================================
// This controls the offset for this port to the HW TSF counter --
BOOLEAN bBssLocalTsfValid;
s8Byte BssLocalTsfOffset;
u8Byte BssTimestamp;
u2Byte BssBeaconInterval;
// -----------------------------------------------------
// Channel Information ------------------------------------
CHANNEL_WIDTH ConnectedBandWidthMode;
u1Byte ConnectedPrimary20MhzChannel;
EXTCHNL_OFFSET ConnectedExtChnlOffsetOf40MHz;
EXTCHNL_OFFSET ConnectedExtChnlOffsetOf80MHz;
RT_WORK_ITEM MultiChannelSwitchChannelWorkItem;
// -----------------------------------------------------
// Configuration Time --------------------------------------------------------
u2Byte ConnectionConfigurationTime; // For speeding up the WPS or DHCP packets: ms
// ------------------------------------------------------------------------
// Order for FW fast channel switch
u1Byte FCSOrder;
u1Byte FCSPortState;
u1Byte FcsDuration;
u1Byte Role;
u2Byte MacIdBitmap;
} MULTICHANNEL_PORT_CONTEXT, *PMULTICHANNEL_PORT_CONTEXT;
#define MULTICHANNEL_SIZE_OF_PORT_CONTEXT sizeof(MULTICHANNEL_PORT_CONTEXT)
// Common Context for All Ports (Only Valid in Default Port)
typedef struct _MULTICHANNEL_COMMON_CONTEXT {
// Channel Switch Timer -------------------------------------
// + Future Goal: Handle all channel swith actions for whole driver
ACTION_TIMER_HANDLE MultiChannelActionTimer;
// -------------------------------------------------------
// HW / SW Timer Switch --------------------------------
BOOLEAN bUseHardwareTimer;
// ----------------------------------------------------
// Channel Switch Scheduler Status --------------------
BOOLEAN bChannelSwitchSchedulerStarted;
u1Byte MultiChannelState;
PADAPTER pAdapterBeforeSwitch;
// ------------------------------------------------
// Used for HwTsf Synchronization -----------------
u1Byte TargetApBssid[6];
BOOLEAN bSyncHwTsfBeaconUpdateReceived;
RT_WORK_ITEM MultiChannelSyncHwTsfWorkItem;
// --------------------------------------------
// Tx Report Indication --------------------------------
BOOLEAN bWaitChannelSwitchTxReport;
// -------------------------------------------------
// For TxPause Read in Dispatch Level: USB and SDIO ---
u1Byte TxPauseCache;
// ----------------------------------------------
// Record current client count
u1Byte NumCurPort;
u1Byte FcsDuration;
BOOLEAN bDownloadRSVD;
BOOLEAN bStartFwFCS;
u1Byte uFCSReport;
u8Byte uSyncTsfDiff;
u1Byte MCCNoADuration;
u1Byte MCCNoAStartTime;
u1Byte MCCStaBeaconTime;
u1Byte MCCQPktLevel;
RT_WORK_ITEM MultiChannelC2HWorkItem;
RT_WORK_ITEM MultiChannelAdjustTsfWorkItem;
// ----------------------------------------------
u8Byte IGBoostEndTime; // us
u4Byte IGBoostStateFlag;
} MULTICHANNEL_COMMON_CONTEXT, *PMULTICHANNEL_COMMON_CONTEXT;
#define MULTICHANNEL_SIZE_OF_COMMON_CONTEXT sizeof(MULTICHANNEL_COMMON_CONTEXT)
typedef struct _FCS_C2H_NOTIFY{
u1Byte status;
u1Byte channel;
}FCS_C2H_NOTIFY, *PFCS_C2H_NOTIFY;
#define MC_DM_INIT_GAIN_BOOST_START 0x00000001
#define MC_DM_INIT_GAIN_BOOST_END 0x00000002
#define MC_DM_INIT_GAIN_BOOST_END_DELAY_SEC 0x00000003
#define MC_DM_INIT_GAIN_BOOST_CHECK 0x00000004
#define MC_DM_STATE_INIT_GAIN_BOOST_STARTED BIT31
#define MC_DM_INIT_GAIN_BOOST_DEFAULT_DELAY_SEC 10 // 10 sec
//-----------------------------------------------------------
// Public Functions
//-----------------------------------------------------------
VOID
MultiChannelWriteTxPauseCache(
PADAPTER pAdapter,
u1Byte TxPauseCommand
);
u1Byte
MultiChannelReadTxPauseCache(
PADAPTER pAdapter
);
VOID
MultiChannelAssociateConfirm(
PADAPTER pAdapter,
BOOLEAN bSuccess
);
VOID
MultiChannelHandleReceivedBeacon(
PADAPTER pAdapter,
OCTET_STRING osPacket
);
VOID
MultiChannelSwitchChannelWorkItemCallback(
IN PVOID pContext
);
VOID
MultiChannelHandleChannelSwitchToCurrentPort(
PADAPTER pAdapterBeforeSwitch,
PADAPTER pCurrentPort
);
VOID
MultiChannelSyncHwTsfWorkItemCallback(
IN PVOID pContext
);
VOID
MultiChannelResetApStatus(
PADAPTER pAdapter,
BOOLEAN bSet
);
VOID
MultiChannelStatusWatchdog(
PADAPTER pAdapter
);
VOID
MultiChannelDumpHwQueueStatus(
PADAPTER pAdapter
);
VOID
MultiChannelDisableEnableExactHwQueue(
PADAPTER pAdapter,
BOOLEAN bDisable
);
VOID
MultiChannelStopChannelSwitchScheduler(
PADAPTER pAdapter,
BOOLEAN bEnableSwitchOperation
);
BOOLEAN
MultiChannelSwitchNeeded(
PADAPTER pAdapter
);
BOOLEAN
MultiChannelSyncHwTsfNeeded(
PADAPTER pAdapter
);
u1Byte
MultiChannelRedirectPacketToSpecificQueue(
PRT_TCB pTcb
);
VOID
MultiChannelUpdateSettingBeforeScanOnResetRequest(
PADAPTER pAdapter
);
VOID
MultiChannelInitializeWorkItem(
PADAPTER pAdapter
);
VOID
MultiChannelReleaseWorkItem(
PADAPTER pAdapter
);
VOID
MultiChannelInitializeTimer(
PADAPTER pAdapter
);
VOID
MultiChannelReleaseTimer(
PADAPTER pAdapter
);
u1Byte
MultiChannelGetPortConnected20MhzChannel(
PADAPTER pAdapter
);
VOID
MultichannelHandlePacketDuringScan(
PADAPTER pAdapter,
BOOLEAN bDisable
);
VOID
MultichannelEnableGoQueue(
PADAPTER pAdapter
);
PADAPTER
MultiChannelGetConnectionAdapter(
PADAPTER pAdapter,
u1Byte Order
);
VOID
MultiChannelScanHandler(
PADAPTER pAdapter,
BOOLEAN bScan,
BOOLEAN bResume
);
VOID
MultiChannelDisconnectClient(
PADAPTER pAdapter,
BOOLEAN bSendDisassociate
);
VOID
MultiChannelDisconnectGo(
PADAPTER pAdapter
);
BOOLEAN
MultiChannelCheckUpdateHwTsf(
PADAPTER pAdapter
);
VOID
MultiChannelGetFcsCommonInfo(
PADAPTER pAdapter,
u1Byte FcsFlag,
pu1Byte value
);
VOID
MultiChannelSetFcsCommonInfo(
PADAPTER pAdapter,
u1Byte FcsFlag,
pu1Byte value
);
BOOLEAN
MultiChannel_IsFCSInProgress(
PADAPTER pAdapter
);
VOID
MultiChannel_OnBss(
PADAPTER pAdapter,
u8Byte uAPTsf,
u8Byte uCurrentTsf
);
RT_STATUS
FCS_Notify(
PADAPTER pAdapter,
ULONG NotifyType,
pu1Byte InformationBuffer,
ULONG InformationBufferLength
);
#if (MULTICHANNEL_SUPPORT == 1)
u1Byte
MultiChannelGetConnectedChannels(
IN PADAPTER pAdapter,
OUT pu1Byte pChnlArray,
IN u1Byte maxChnlArrayNum
);
RT_STATUS
McDynamicMachanismSet(
IN PADAPTER pAdapter,
IN u4Byte ReqID,
IN PVOID pInputBuffer,
IN u4Byte InputBufferLen
);
#else // #if (MULTICHANNEL_SUPPORT != 1)
#define MultiChannelGetConnectedChannels(_pAdapter, _pChnlArray, _maxChnlArrayNum) 0
#define McDynamicMachanismSet(_pAdapter, _ReqID, _pInputBuffer, _InputBufferLen) RT_STATUS_NOT_SUPPORT
#endif // #if (MULTICHANNEL_SUPPORT == 1)
#endif
|