aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/otus/80211core/pub_zfi.h
blob: 60b7d1c56deeefad85280e81a5f127923b506871 (plain) (blame)
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
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
/*
 * Copyright (c) 2007-2008 Atheros Communications Inc.
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#ifndef _PUB_DEFS_H
#define _PUB_DEFS_H

#include "../oal_dt.h"

/***** Section 1 : Tunable Parameters *****/
/* The definitions in this section are tunabel parameters */

/* Maximum number of BSS that could be scaned */
#define ZM_MAX_BSS                          128

/* Maximum number of WPA2 PMKID that supported */
#define ZM_PMKID_MAX_BSS_CNT               8

/* Enable aggregation and deaggregation */
#define ZM_ENABLE_AGGREGATION

#ifdef ZM_ENABLE_AGGREGATION
    /* Enable BA failed retransmission in firmware */
    #define ZM_ENABLE_FW_BA_RETRANSMISSION
    #define ZM_BYPASS_AGGR_SCHEDULING
    //#define ZM_AGGR_BIT_ON
#endif


#ifndef ZM_FB50
//#define ZM_FB50
#endif

#ifndef ZM_AP_DEBUG
//#define ZM_AP_DEBUG
#endif

//#define ZM_ENABLE_BA_RATECTRL

/***** End of section 1 *****/


/***** Section 2 : Public Definitions, data structures and prototypes *****/
/* function return status */
#define ZM_STATUS_SUCCESS                   0
#define ZM_STATUS_FAILURE                   1

// media connect status
#define ZM_STATUS_MEDIA_CONNECT             0x00
#define ZM_STATUS_MEDIA_DISCONNECT          0x01
#define ZM_STATUS_MEDIA_DISCONNECT_NOT_FOUND    0x02
#define ZM_STATUS_MEDIA_DISABLED            0x03
#define ZM_STATUS_MEDIA_CONNECTION_DISABLED 0x04
#define ZM_STATUS_MEDIA_CONNECTION_RESET    0x05
#define ZM_STATUS_MEDIA_RESET               0x06
#define ZM_STATUS_MEDIA_DISCONNECT_DEAUTH   0x07
#define ZM_STATUS_MEDIA_DISCONNECT_DISASOC  0x08
#define ZM_STATUS_MEDIA_DISCONNECT_TIMEOUT  0x09
#define ZM_STATUS_MEDIA_DISCONNECT_AUTH_FAILED  0x0a
#define ZM_STATUS_MEDIA_DISCONNECT_ASOC_FAILED  0x0b
#define ZM_STATUS_MEDIA_DISCONNECT_MIC_FAIL   0x0c
#define ZM_STATUS_MEDIA_DISCONNECT_UNREACHABLE 0x0d
#define ZM_STATUS_MEDIA_DISCONNECT_BEACON_MISS  0x0e

// Packet Filter
#define ZM_PACKET_TYPE_DIRECTED             0x00000001
#define ZM_PACKET_TYPE_MULTICAST            0x00000002
#define ZM_PACKET_TYPE_ALL_MULTICAST        0x00000004
#define ZM_PACKET_TYPE_BROADCAST            0x00000008
#define ZM_PACKET_TYPE_PROMISCUOUS          0x00000020

/* BSS mode definition */
/* TODO : The definitions here are coupled with XP's NDIS OID. */
/*        We can't be changed them freely, need to disarm this mine */
#define ZM_MODE_IBSS                        0
#define ZM_MODE_INFRASTRUCTURE              1
#define ZM_MODE_UNKNOWN                     2
#define ZM_MODE_INFRASTRUCTURE_MAX          3
#define ZM_MODE_AP                          4
#define ZM_MODE_PSEUDO                      5


/* Authentication mode */
#define ZM_AUTH_MODE_OPEN                   0
#define ZM_AUTH_MODE_SHARED_KEY             1
#define ZM_AUTH_MODE_AUTO                   2
#define ZM_AUTH_MODE_WPA                    3
#define ZM_AUTH_MODE_WPAPSK                 4
#define ZM_AUTH_MODE_WPA_NONE               5
#define ZM_AUTH_MODE_WPA2                   6
#define ZM_AUTH_MODE_WPA2PSK                7
#ifdef ZM_ENABLE_CENC
#define ZM_AUTH_MODE_CENC                   8
#endif //ZM_ENABLE_CENC
#define ZM_AUTH_MODE_WPA_AUTO               9
#define ZM_AUTH_MODE_WPAPSK_AUTO            10

// Encryption mode
#define ZM_NO_WEP                           0x0
#define ZM_AES                              0x4
#define ZM_TKIP                             0x2
#define ZM_WEP64                            0x1
#define ZM_WEP128                           0x5
#define ZM_WEP256                           0x6
#ifdef ZM_ENABLE_CENC
#define ZM_CENC                             0x7
#endif //ZM_ENABLE_CENC

/* Encryption type for wep status */
#define ZM_ENCRYPTION_WEP_DISABLED          0
#define ZM_ENCRYPTION_WEP_ENABLED           1
#define ZM_ENCRYPTION_WEP_KEY_ABSENT        2
#define ZM_ENCRYPTION_NOT_SUPPORTED         3
#define ZM_ENCRYPTION_TKIP                  4
#define ZM_ENCRYPTION_TKIP_KEY_ABSENT       5
#define ZM_ENCRYPTION_AES                   6
#define ZM_ENCRYPTION_AES_KEY_ABSENT        7

#ifdef ZM_ENABLE_CENC
#define ZM_ENCRYPTION_CENC                  8
#endif //ZM_ENABLE_CENC

/* security type */
#define ZM_SECURITY_TYPE_NONE               0
#define ZM_SECURITY_TYPE_WEP                1
#define ZM_SECURITY_TYPE_WPA                2

#ifdef ZM_ENABLE_CENC
#define ZM_SECURITY_TYPE_CENC               3
#endif //ZM_ENABLE_CENC

/* Encryption Exemption Action Type  */
#define ZM_ENCRYPTION_EXEMPT_NO_EXEMPTION   0
#define ZM_ENCRYPTION_EXEMPT_ALWAYS         1

/* MIC failure */
#define ZM_MIC_PAIRWISE_ERROR               0x06
#define ZM_MIC_GROUP_ERROR                  0x0E


/* power save mode */
#define ZM_STA_PS_NONE                    0
#define ZM_STA_PS_MAX                     1
#define ZM_STA_PS_FAST                    2
#define ZM_STA_PS_LIGHT                   3

/* WME AC Type */
#define ZM_WME_AC_BK                        0       /* Background AC */
#define ZM_WME_AC_BE                        1       /* Best-effort AC */
#define ZM_WME_AC_VIDEO                     2       /* Video AC */
#define ZM_WME_AC_VOICE                     3       /* Voice AC */

/* Preamble type */
#define ZM_PREAMBLE_TYPE_AUTO               0
#define ZM_PREAMBLE_TYPE_LONG               1
#define ZM_PREAMBLE_TYPE_SHORT              2

/* wireless modes constants */
#define ZM_WIRELESS_MODE_5_54        0x01   ///< 5 GHz 54 Mbps
#define ZM_WIRELESS_MODE_5_108       0x02   ///< 5 GHz 108 Mbps
#define ZM_WIRELESS_MODE_24_11       0x04   ///< 2.4 GHz 11 Mbps
#define ZM_WIRELESS_MODE_24_54       0x08   ///< 2.4 GHz 54 Mbps
#define ZM_WIRELESS_MODE_24_108      0x10   ///< 2.4 GHz 108 Mbps
#define ZM_WIRELESS_MODE_49_13      0x100   ///< 4.9 GHz 13.5 Mbps, quarter rate chn-bandwidth = 5
#define ZM_WIRELESS_MODE_49_27      0x200   ///< 4.9 GHz 27 Mbps, half rate chn-bandwidth = 10
#define ZM_WIRELESS_MODE_49_54      0x400   ///< 4.9 GHz 54 Mbps, full rate chn-bandwidth = 20
#define ZM_WIRELESS_MODE_5_300     0x1000   ///< 5 GHz 300 Mbps
#define ZM_WIRELESS_MODE_24_300    0x2000   ///< 2.4 GHz 300 Mbps
#define ZM_WIRELESS_MODE_5_130     0x4000   ///< 5 GHz 130 Mbps
#define ZM_WIRELESS_MODE_24_130    0x8000   ///< 2.4 GHz 130 Mbps

#define ZM_WIRELESS_MODE_24_N      (ZM_WIRELESS_MODE_24_130|ZM_WIRELESS_MODE_24_300)
#define ZM_WIRELESS_MODE_5_N       (ZM_WIRELESS_MODE_5_130|ZM_WIRELESS_MODE_5_300)
#define ZM_WIRELESS_MODE_24        (ZM_WIRELESS_MODE_24_11|ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)
#define ZM_WIRELESS_MODE_5         (ZM_WIRELESS_MODE_5_54|ZM_WIRELESS_MODE_5_N)

/* AdHoc Mode with different band */
#define ZM_ADHOCBAND_A         1
#define ZM_ADHOCBAND_B         2
#define ZM_ADHOCBAND_G         3
#define ZM_ADHOCBAND_BG        4
#define ZM_ADHOCBAND_ABG       5

/* Authentication algorithm in the field algNo of authentication frames */
#define ZM_AUTH_ALGO_OPEN_SYSTEM      0x10000    /* Open system */
#define ZM_AUTH_ALGO_SHARED_KEY       0x10001    /* Shared Key */
#define ZM_AUTH_ALGO_LEAP             0x10080    /* Leap */

struct zsScanResult
{
    u32_t reserved;
};


struct zsStastics
{
    u32_t reserved;
};

#define ZM_MAX_SUPP_RATES_IE_SIZE       12
#define ZM_MAX_IE_SIZE                  50 //100
#define ZM_MAX_WPS_IE_SIZE              150
#define ZM_MAX_PROBE_FRAME_BODY_SIZE    512//300
#define	ZM_MAX_COUNTRY_INFO_SIZE		20

#define ZM_MAX_SSID_LENGTH          32
struct zsBssInfo
{
    u8_t   macaddr[6];
    u8_t   bssid[6];
    u8_t   beaconInterval[2];
    u8_t   capability[2];
    u8_t   timeStamp[8];
    u8_t   ssid[ZM_MAX_SSID_LENGTH + 2];   // EID(1) + Length(1) + SSID(32)
    u8_t   supportedRates[ZM_MAX_SUPP_RATES_IE_SIZE + 2]; // EID(1) + Length(1) + supported rates [12]
    u8_t   channel;
    u16_t  frequency;
    u16_t  atimWindow;
    u8_t   erp;
    u8_t   extSupportedRates[ZM_MAX_SUPP_RATES_IE_SIZE + 2]; // EID(1) + Length(1) + extended supported rates [12]
    u8_t   wpaIe[ZM_MAX_IE_SIZE + 2];
    u8_t   wscIe[ZM_MAX_WPS_IE_SIZE + 2];
    u8_t   rsnIe[ZM_MAX_IE_SIZE + 2];
#ifdef ZM_ENABLE_CENC
    u8_t   cencIe[ZM_MAX_IE_SIZE + 2]; /* CENC */ /* half size because of memory exceed 64k boundary */
#endif //ZM_ENABLE_CENC
    u8_t   securityType;
    u8_t   signalStrength;
    u8_t   signalQuality;
    u16_t  sortValue;
    u8_t   wmeSupport;
    u8_t   flag;
    u8_t   EnableHT;
    u8_t   enableHT40;
    u8_t   SG40;
    u8_t   extChOffset;
    u8_t   apCap; // bit0:11N AP
    u16_t  frameBodysize;
    u8_t   frameBody[ZM_MAX_PROBE_FRAME_BODY_SIZE];
    u8_t   countryInfo[ZM_MAX_COUNTRY_INFO_SIZE + 2];
    u16_t  athOwlAp;
    u16_t  marvelAp;
    u16_t  broadcomHTAp;
    u32_t  tick;
    struct zsBssInfo* next;
};

struct zsBssList
{
    u8_t bssCount;
    struct zsBssInfo* head;
    struct zsBssInfo* tail;
};

struct zsBssListV1
{
    u8_t bssCount;
    struct zsBssInfo bssInfo[ZM_MAX_BSS];
};

#define ZM_KEY_FLAG_GK                 0x0001
#define ZM_KEY_FLAG_PK                 0X0002
#define ZM_KEY_FLAG_AUTHENTICATOR      0x0004
#define ZM_KEY_FLAG_INIT_IV            0x0008
#define ZM_KEY_FLAG_DEFAULT_KEY        0x0010

#ifdef ZM_ENABLE_CENC
#define ZM_KEY_FLAG_CENC               0x0020
#endif //ZM_ENABLE_CENC

// Comment: For TKIP, key[0]~key[15]  => TKIP key
//                    key[16]~key[23] => Tx MIC key
//                    key[24]~key[31] => Rx MIC key
struct zsKeyInfo
{
    u8_t*   key;
    u8_t    keyLength;
    u8_t    keyIndex;
    u8_t*   initIv;
    u16_t   flag;
    u8_t    vapId;
    u16_t    vapAddr[3];
    u16_t*   macAddr;
};



/*
 * Channels are specified by frequency.
 */
typedef struct {
	u16_t	channel;	/* setting in Mhz */
	u32_t	channelFlags;	/* see below */
	u8_t	privFlags;
	s8_t	maxRegTxPower;	/* max regulatory tx power in dBm */
	s8_t	maxTxPower;	/* max true tx power in 0.25 dBm */
	s8_t	minTxPower;	/* min true tx power in 0.25 dBm */
} ZM_HAL_CHANNEL;

struct zsRegulationTable
{
    u16_t   regionCode;
    u16_t   CurChIndex;
    u16_t   allowChannelCnt;
    ZM_HAL_CHANNEL   allowChannel[60];   /* 2.4GHz: 14 channels, 5 GHz: 31 channels */
};

struct zsPartnerNotifyEvent
{
    u8_t bssid[6];                      // The BSSID of IBSS
    u8_t peerMacAddr[6];                // The MAC address of peer station
};

#define ZM_RC_TRAINED_BIT   0x1
struct zsRcCell
{
    u32_t txCount;
    u32_t failCount;
    u8_t currentRate;
    u8_t currentRateIndex;
    u32_t probingTime;
    u8_t operationRateSet[24];
    u8_t operationRateCount;
    u16_t rxRssi;
    u8_t flag;
    u32_t  lasttxCount;
    u32_t  lastTime;
};

struct zsOppositeInfo
{
    u8_t            macAddr[6];
    struct zsRcCell rcCell;
    u8_t            valid;              // This indicate if this opposite is still valid
    u8_t            aliveCounter;
    u8_t            pkInstalled;

#ifdef ZM_ENABLE_IBSS_WPA2PSK
    /* For WPA2PSK ! */
    u8_t 			wpaState;
    u8_t            camIdx;
    u8_t            encryMode;
    u16_t           iv16;
    u32_t           iv32;
#endif
};

typedef void (*zfpIBSSIteratePeerStationCb)(
    zdev_t* dev, struct zsOppositeInfo *peerInfo, void *ctx, u8_t index);

typedef u16_t (*zfpStaRxSecurityCheckCb)(zdev_t* dev, zbuf_t* buf);


/* Communication Tally data structure */
struct zsCommTally
{
    u32_t txUnicastFrm;		    //  0 txUnicastFrames
    u32_t txMulticastFrm;		//  1 txMulticastFrames
    u32_t txUnicastOctets;	    //  2 txUniOctets  byte size
    u32_t txMulticastOctets;	//  3 txMultiOctets  byte size
    u32_t txFrmUpperNDIS;       //  4
    u32_t txFrmDrvMgt;          //  5
    u32_t RetryFailCnt;		    //  6
    u32_t Hw_TotalTxFrm;		//  7 Hardware total Tx Frame
    u32_t Hw_RetryCnt;		    //  8 txMultipleRetriesFrames
    u32_t Hw_UnderrunCnt;       //  9

    u32_t DriverRxFrmCnt;       // 10
    u32_t rxUnicastFrm;		    // 11 rxUnicastFrames
    u32_t rxMulticastFrm;	    // 12rxMulticastFrames

    u32_t NotifyNDISRxFrmCnt;   // 14
    u32_t rxUnicastOctets;	// 15 rxUniOctets  byte size
    u32_t rxMulticastOctets;	    // 16 rxMultiOctets  byte size
    u32_t DriverDiscardedFrm;       // 17 Discard by ValidateFrame
    u32_t LessThanDataMinLen;       // 18
    u32_t GreaterThanMaxLen;        // 19
    u32_t DriverDiscardedFrmCauseByMulticastList;
    u32_t DriverDiscardedFrmCauseByFrmCtrl;
    u32_t rxNeedFrgFrm;		    // 22 need more frg frm
    u32_t DriverRxMgtFrmCnt;
    u32_t rxBroadcastFrm;	    // 24 Receive broadcast frame count
    u32_t rxBroadcastOctets;	// 25 Receive broadcast frame byte size
    u32_t rx11bDataFrame;		// 26 Measured quality 11b data frame count
    u32_t rxOFDMDataFrame;	    // 27 Measured quality 11g data frame count


    u32_t Hw_TotalRxFrm;        // 28
    u32_t Hw_CRC16Cnt;		    // 29 rxPLCPCRCErrCnt
    u32_t Hw_CRC32Cnt;		    // 30 rxCRC32ErrCnt
    u32_t Hw_DecrypErr_UNI;     // 31
    u32_t Hw_DecrypErr_Mul;     // 32

    u32_t Hw_RxFIFOOverrun;     // 34
    u32_t Hw_RxTimeOut;         // 35
    u32_t LossAP;               // 36

    u32_t Tx_MPDU;              // 37
    u32_t BA_Fail;              // 38
    u32_t Hw_Tx_AMPDU;          // 39
    u32_t Hw_Tx_MPDU;           // 40

    u32_t RateCtrlTxMPDU;
    u32_t RateCtrlBAFail;

    u32_t txQosDropCount[5];    //41 42 43 44 45

	u32_t Hw_RxMPDU;            // 46
	u32_t Hw_RxDropMPDU;        // 47
	u32_t Hw_RxDelMPDU;         // 48

	u32_t Hw_RxPhyMiscError;    // 49
	u32_t Hw_RxPhyXRError;      // 50
    u32_t Hw_RxPhyOFDMError;    // 51
    u32_t Hw_RxPhyCCKError;     // 52
    u32_t Hw_RxPhyHTError;      // 53
    u32_t Hw_RxPhyTotalCount;   // 54

    u32_t swRxFragmentCount;         // 55
    u32_t swRxUnicastMicFailCount;   // 56
    u32_t swRxMulticastMicFailCount; // 57
    u32_t swRxDropUnencryptedCount;  // 58

    u32_t txBroadcastFrm;
    u32_t txBroadcastOctets;
};

/* Traffic Monitor Tally data structure */
struct zsTrafTally
{
    u32_t rxDuplicate;
    u32_t rxSrcIsOwnMac;
    //u32_t rxDataFrameCount;
    //u32_t rxDataByteCount;
    //u32_t rxDataBytesIn1000ms;
    //u32_t rxDataTmpFor1000ms;
    //u32_t rxDataBytesIn2000ms;
    //u32_t rxDataTmpFor2000ms;

    //u32_t txDataFrameCount;
    //u32_t txDataByteCount;
    //u32_t txDataBytesIn1000ms;
    //u32_t txDataTmpFor1000ms;
    u32_t txDataBytesIn2000ms;
    u32_t txDataTmpFor2000ms;
};

/* Hal rx packet moniter information */
struct zsMonHalRxInfo
{
    u32_t currentRSSI[7];
    u32_t currentRxEVM[14];
    u32_t currentRxDataMT;
    u32_t currentRxDataMCS;
    u32_t currentRxDataBW;
    u32_t currentRxDataSG;
};

struct zsTail
{
    u8_t SignalStrength1;
    u8_t SignalStrength2;
    u8_t SignalStrength3;
    u8_t SignalQuality;
    u8_t SAIndex;
    u8_t DAIndex;
    u8_t ErrorIndication;
    u8_t RxMacStatus;
};

union zuTail
{
    struct zsTail Data;
    u8_t Byte[8];
};

struct zsAdditionInfo
{
    u8_t PlcpHeader[12];
    union zuTail   Tail;
};


struct zsPmkidBssidInfo
{
    u16_t      bssid[3];
    u8_t       pmkid[16];
};

struct zsPmkidInfo
{
	   u32_t		bssidCount;
	   struct zsPmkidBssidInfo	bssidInfo[ZM_PMKID_MAX_BSS_CNT];
};


struct zsCbFuncTbl
{
    u16_t (*zfcbAuthNotify)(zdev_t* dev, u16_t* macAddr);
    u16_t (*zfcbAsocNotify)(zdev_t* dev, u16_t* macAddr, u8_t* body,
            u16_t bodySize, u16_t port);
    u16_t (*zfcbDisAsocNotify)(zdev_t* dev, u8_t* macAddr, u16_t port);
    u16_t (*zfcbApConnectNotify)(zdev_t* dev, u8_t* macAddr, u16_t port);
    void (*zfcbConnectNotify)(zdev_t* dev, u16_t status, u16_t* bssid);
    void (*zfcbScanNotify)(zdev_t* dev, struct zsScanResult* result);
    void (*zfcbMicFailureNotify)(zdev_t* dev, u16_t* addr, u16_t status);
    void (*zfcbApMicFailureNotify)(zdev_t* dev, u8_t* addr, zbuf_t* buf);
    void (*zfcbIbssPartnerNotify)(zdev_t* dev, u16_t status,
            struct zsPartnerNotifyEvent *event);
    void (*zfcbMacAddressNotify)(zdev_t* dev, u8_t* addr);
    void (*zfcbSendCompleteIndication)(zdev_t* dev, zbuf_t* buf);
    void (*zfcbRecvEth)(zdev_t* dev, zbuf_t* buf, u16_t port);
    void (*zfcbRecv80211)(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo);
    void (*zfcbRestoreBufData)(zdev_t* dev, zbuf_t* buf);
#ifdef ZM_ENABLE_CENC
    u16_t (*zfcbCencAsocNotify)(zdev_t* dev, u16_t* macAddr, u8_t* body,
            u16_t bodySize, u16_t port);
#endif //ZM_ENABLE_CENC
    u8_t (*zfcbClassifyTxPacket)(zdev_t* dev, zbuf_t* buf);

    void (*zfcbHwWatchDogNotify)(zdev_t* dev);
};

extern void zfZeroMemory(u8_t* va, u16_t length);
#define ZM_INIT_CB_FUNC_TABLE(p)        zfZeroMemory((u8_t *)p, sizeof(struct zsCbFuncTbl));

//extern struct zsWlanDev zgWlanDev;

/* Initialize WLAN hardware and software, resource will be allocated */
/* for WLAN operation, must be called first before other function.   */
extern u16_t zfiWlanOpen(zdev_t* dev, struct zsCbFuncTbl* cbFuncTbl);

/* WLAN hardware will be shutdown and all resource will be release */
extern u16_t zfiWlanClose(zdev_t* dev);

/* Enable/disable Wlan operation */
extern u16_t zfiWlanEnable(zdev_t* dev);
extern u16_t zfiWlanDisable(zdev_t* dev, u8_t ResetKeyCache);
extern u16_t zfiWlanResume(zdev_t* dev, u8_t doReconn);
extern u16_t zfiWlanSuspend(zdev_t* dev);

/* Enable/disable ISR interrupt */
extern u16_t zfiWlanInterruptEnable(zdev_t* dev);
extern u16_t zfiWlanInterruptDisable(zdev_t* dev);

/* Do WLAN site survey */
extern u16_t zfiWlanScan(zdev_t* dev);

/* Get WLAN stastics */
extern u16_t zfiWlanGetStatistics(zdev_t* dev);

/* Reset WLAN */
extern u16_t zfiWlanReset(zdev_t* dev);

/* Deauthenticate a STA */
extern u16_t zfiWlanDeauth(zdev_t* dev, u16_t* macAddr, u16_t reason);

extern u16_t zfiTxSendEth(zdev_t* dev, zbuf_t* buf, u16_t port);
extern u8_t zfiIsTxQueueFull(zdev_t* dev);
extern u16_t zfiTxSend80211Mgmt(zdev_t* dev, zbuf_t* buf, u16_t port);

extern void zfiIsrPci(zdev_t* dev);

extern u8_t zfiWlanIBSSGetPeerStationsCount(zdev_t* dev);
extern u8_t zfiWlanIBSSIteratePeerStations(zdev_t* dev, u8_t numToIterate, zfpIBSSIteratePeerStationCb callback, void *ctx);
extern void zfiWlanFlushAllQueuedBuffers(zdev_t* dev);

/* coid.c */
extern void zfiWlanQueryMacAddress(zdev_t* dev, u8_t* addr);

extern u16_t zfiGlobalDataSize(zdev_t* dev);

extern void zfiHeartBeat(zdev_t* dev);

extern void zfiWlanSetWlanMode(zdev_t* dev, u8_t wlanMode);
extern void zfiWlanSetAuthenticationMode(zdev_t* dev, u8_t authMode);
extern void zfiWlanSetWepStatus(zdev_t* dev, u8_t wepStatus);
extern void zfiWlanSetSSID(zdev_t* dev, u8_t* ssid, u8_t ssidLength);
extern void zfiWlanSetFragThreshold(zdev_t* dev, u16_t fragThreshold);
extern void zfiWlanSetRtsThreshold(zdev_t* dev, u16_t rtsThreshold);
extern void zfiWlanSetFrequency(zdev_t* dev, u32_t frequency, u8_t bImmediate);
extern void zfiWlanSetBssid(zdev_t* dev, u8_t* bssid);
extern void zfiWlanSetBeaconInterval(zdev_t* dev, u16_t beaconInterval,
                              u8_t bImmediate);
extern void zfiWlanSetDtimCount(zdev_t* dev, u8_t  dtim);
extern void zfiWlanSetAtimWindow(zdev_t* dev, u16_t atimWindow, u8_t bImmediate);
extern void zfiWlanSetEncryMode(zdev_t* dev, u8_t encryMode);
extern u8_t zfiWlanSetKey(zdev_t* dev, struct zsKeyInfo keyInfo);
extern u8_t zfiWlanPSEUDOSetKey(zdev_t* dev, struct zsKeyInfo keyInfo);
extern void zfiWlanSetPowerSaveMode(zdev_t* dev, u8_t mode);
extern void zfiWlanQueryBssListV1(zdev_t* dev, struct zsBssListV1* bssListV1);
extern void zfiWlanQueryBssList(zdev_t* dev, struct zsBssList* pBssList);
extern void zfiWlanSetProtectionMode(zdev_t* dev, u8_t mode);
extern void zfiWlanFlushBssList(zdev_t* dev);

void zfiWlanDisableDfsChannel(zdev_t* dev, u8_t disableFlag);

extern u8_t zfiWlanQueryWlanMode(zdev_t* dev);
extern u16_t zfiWlanChannelToFrequency(zdev_t* dev, u8_t channel);
extern u8_t zfiWlanFrequencyToChannel(zdev_t* dev, u16_t freq);

#define ZM_WLAN_STATE_OPENED        0
#define ZM_WLAN_STATE_ENABLED       1
#define ZM_WLAN_STATE_DISABLED      2
#define ZM_WLAN_STATE_CLOSEDED      3
extern u8_t zfiWlanQueryAdapterState(zdev_t* dev);
extern u8_t zfiWlanQueryAuthenticationMode(zdev_t* dev, u8_t bWrapper);
extern u8_t zfiWlanQueryWepStatus(zdev_t* dev, u8_t bWrapper);
extern void zfiWlanQuerySSID(zdev_t* dev, u8_t* ssid, u8_t* pSsidLength);
extern u16_t zfiWlanQueryFragThreshold(zdev_t* dev);
extern u16_t zfiWlanQueryRtsThreshold(zdev_t* dev);
extern u32_t zfiWlanQueryFrequency(zdev_t* dev);
extern u32_t zfiWlanQueryCurrentFrequency(zdev_t* dev, u8_t qmode);
extern u32_t zfiWlanQueryFrequencyAttribute(zdev_t* dev, u32_t frequency);
extern void zfiWlanQueryFrequencyHT(zdev_t* dev, u32_t *bandWidth, u32_t *extOffset);
extern u8_t zfiWlanQueryCWMode(zdev_t* dev);
extern u32_t zfiWlanQueryCWEnable(zdev_t* dev);
extern void zfiWlanQueryBssid(zdev_t* dev, u8_t* bssid);
extern u16_t zfiWlanQueryBeaconInterval(zdev_t* dev);
extern u32_t zfiWlanQueryRxBeaconTotal(zdev_t* dev);
extern u16_t zfiWlanQueryAtimWindow(zdev_t* dev);
extern u8_t zfiWlanQueryEncryMode(zdev_t* dev);
extern u16_t zfiWlanQueryCapability(zdev_t* dev);
extern u16_t zfiWlanQueryAid(zdev_t* dev);
extern void zfiWlanQuerySupportRate(zdev_t* dev, u8_t* rateArray, u8_t* pLength);
extern void zfiWlanQueryExtSupportRate(zdev_t* dev, u8_t* rateArray, u8_t* pLength);
extern void zfiWlanQueryRsnIe(zdev_t* dev, u8_t* ie, u8_t* pLength);
extern void zfiWlanQueryWpaIe(zdev_t* dev, u8_t* ie, u8_t* pLength);
extern u8_t zfiWlanQueryHTMode(zdev_t* dev);
extern u8_t zfiWlanQueryBandWidth40(zdev_t* dev);
extern u8_t zfiWlanQueryMulticastCipherAlgo(zdev_t *dev);
extern u16_t zfiWlanQueryRegionCode(zdev_t* dev);
extern void zfiWlanSetWpaIe(zdev_t* dev, u8_t* ie, u8_t Length);
extern void zfiWlanSetWpaSupport(zdev_t* dev, u8_t WpaSupport);
extern void zfiWlanCheckStaWpaIe(zdev_t* dev);
extern void zfiWlanSetBasicRate(zdev_t* dev, u8_t bRateSet, u8_t gRateSet,
                         u32_t nRateSet);
extern void zfiWlanSetBGMode(zdev_t* dev, u8_t mode);
extern void zfiWlanSetpreambleType(zdev_t* dev, u8_t type);
extern u8_t zfiWlanQuerypreambleType(zdev_t* dev);
extern u8_t zfiWlanQueryPowerSaveMode(zdev_t* dev);
extern void zfiWlanSetMacAddress(zdev_t* dev, u16_t* mac);
extern u16_t zfiWlanSetTxRate(zdev_t* dev, u16_t rate);
extern u32_t zfiWlanQueryTxRate(zdev_t* dev);
extern void zfWlanUpdateRxRate(zdev_t* dev, struct zsAdditionInfo* addInfo);
extern u32_t zfiWlanQueryRxRate(zdev_t* dev);
extern u8_t zfiWlanSetPmkidInfo(zdev_t* dev, u16_t* bssid, u8_t* pmkid);
extern u32_t zfiWlanQueryPmkidInfo(zdev_t* dev, u8_t* buf, u32_t len);
extern void zfiWlanSetAllMulticast(zdev_t* dev, u32_t setting);
extern void zfiWlanSetHTCtrl(zdev_t* dev, u32_t *setting, u32_t forceTxTPC);
extern void zfiWlanQueryHTCtrl(zdev_t* dev, u32_t *setting, u32_t *forceTxTPC);
extern void zfiWlanDbg(zdev_t* dev, u8_t setting);

extern void zfiWlanResetTally(zdev_t* dev);
extern void zfiWlanQueryTally(zdev_t* dev, struct zsCommTally *tally);
extern void zfiWlanQueryTrafTally(zdev_t* dev, struct zsTrafTally *tally);
extern void zfiWlanQueryMonHalRxInfo(zdev_t* dev, struct zsMonHalRxInfo *halRxInfo);

extern u32_t zfiFWConfig(zdev_t* dev, u32_t size);

extern void zfiDKEnable(zdev_t* dev, u32_t enable);

extern void zfiWlanSetMulticastList(zdev_t* dev, u8_t size, u8_t* pList);
extern void zfiWlanRemoveKey(zdev_t* dev, u8_t keyType, u8_t keyId);
extern u8_t zfiWlanQueryIsPKInstalled(zdev_t *dev, u8_t *staMacAddr);
extern u32_t zfiWlanQueryPacketTypePromiscuous(zdev_t* dev);
extern void zfiWlanSetPacketTypePromiscuous(zdev_t* dev, u32_t setValue);
extern void zfiSetChannelManagement(zdev_t* dev, u32_t setting);
extern void zfiSetRifs(zdev_t* dev, u16_t setting);
extern void zfiCheckRifs(zdev_t* dev);
extern void zfiSetReorder(zdev_t* dev, u16_t value);
extern void zfiSetSeqDebug(zdev_t* dev, u16_t value);

extern u16_t zfiConfigWdsPort(zdev_t* dev, u8_t wdsPortId, u16_t flag, u16_t* wdsAddr,
        u16_t encType, u32_t* wdsKey);
extern void zfiWlanQueryRegulationTable(zdev_t* dev, struct zsRegulationTable* pEntry);
extern void zfiWlanSetScanTimerPerChannel(zdev_t* dev, u16_t time);
extern void zfiWlanSetAutoReconnect(zdev_t* dev, u8_t enable);
extern u32_t zfiDebugCmd(zdev_t* dev, u32_t cmd, u32_t value);
extern void zfiWlanSetProbingHiddenSsid(zdev_t* dev, u8_t* ssid, u8_t ssidLen,
    u16_t entry);
extern void zfiWlanSetDropUnencryptedPackets(zdev_t* dev, u8_t enable);
extern void zfiWlanSetIBSSJoinOnly(zdev_t* dev, u8_t joinOnly);
extern void zfiWlanSetDefaultKeyId(zdev_t* dev, u8_t keyId);
extern void zfiWlanSetDisableProbingWithSsid(zdev_t* dev, u8_t mode);
extern void zfiWlanQueryGSN(zdev_t* dev, u8_t *gsn, u16_t vapId);
extern u16_t zfiStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType);
extern u8_t zfiWlanSetDot11DMode(zdev_t* dev, u8_t mode);
extern u8_t zfiWlanSetDot11HDFSMode(zdev_t* dev, u8_t mode);
extern u8_t zfiWlanSetDot11HTPCMode(zdev_t* dev, u8_t mode);
extern u8_t zfiWlanSetAniMode(zdev_t* dev, u8_t mode);
extern void zfiWlanSetStaWme(zdev_t* dev, u8_t enable, u8_t uapsdInfo);
extern void zfiWlanSetApWme(zdev_t* dev, u8_t enable);
extern u8_t zfiWlanQuerywmeEnable(zdev_t* dev);
#ifdef ZM_OS_LINUX_FUNC
extern void zfiWlanShowTally(zdev_t* dev);
#endif
#ifdef ZM_ENABLE_CENC
/* CENC */
extern u8_t zfiWlanSetCencPairwiseKey(zdev_t* dev, u8_t keyid, u32_t *txiv, u32_t *rxiv,
        u8_t *key, u8_t *mic);
extern u8_t zfiWlanSetCencGroupKey(zdev_t* dev, u8_t keyid, u32_t *rxiv,
        u8_t *key, u8_t *mic);
#endif //ZM_ENABLE_CENC
extern void zfiWlanQuerySignalInfo(zdev_t* dev, u8_t *buffer);
extern void zfiWlanQueryAdHocCreatedBssDesc(zdev_t* dev, struct zsBssInfo *pBssInfo);
extern u8_t zfiWlanQueryAdHocIsCreator(zdev_t* dev);
extern u32_t zfiWlanQuerySupportMode(zdev_t* dev);
extern u32_t zfiWlanQueryTransmitPower(zdev_t* dev);
extern void zfiWlanEnableLeapConfig(zdev_t* dev, u8_t leapEnabled);

/* returned buffer allocated by driver core */
extern void zfiRecvEthComplete(zdev_t* dev, zbuf_t* buf);

extern void zfiRecv80211(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo);

extern void zfiWlanSetMaxTxPower(zdev_t* dev, u8_t power2, u8_t power5);
extern void zfiWlanQueryMaxTxPower(zdev_t* dev, u8_t *power2, u8_t *power5);
extern void zfiWlanSetConnectMode(zdev_t* dev, u8_t mode);
extern void zfiWlanSetSupportMode(zdev_t* dev, u32_t mode);
extern void zfiWlanSetAdhocMode(zdev_t* dev, u32_t mode);
extern u32_t zfiWlanQueryAdhocMode(zdev_t* dev, u8_t bWrapper);
extern u8_t zfiWlanSetCountryIsoName(zdev_t* dev, u8_t *countryIsoName, u8_t length);
extern const char* zfiWlanQueryCountryIsoName(zdev_t* dev);
extern u8_t zfiWlanQueryregulatoryDomain(zdev_t* dev);
extern u8_t zfiWlanQueryCCS(zdev_t* dev);
extern void zfiWlanSetCCS(zdev_t* dev, u8_t mode);
extern void zfiWlanSetRegulatory(zdev_t* dev, u8_t CCS, u16_t Code, u8_t bfirstChannel);
extern const char* zfiHpGetisoNamefromregionCode(zdev_t* dev, u16_t regionCode);
extern void  zfiWlanSetLEDCtrlParam(zdev_t* dev, u8_t type, u8_t flag);
extern u32_t zfiWlanQueryReceivedPacket(zdev_t* dev);
extern void zfiWlanCheckSWEncryption(zdev_t* dev);
extern u16_t zfiWlanQueryAllowChannels(zdev_t *dev, u16_t *channels);
extern u16_t zfiWlanGetMulticastAddressCount(zdev_t* dev);
extern void zfiWlanGetMulticastList(zdev_t* dev, u8_t* pMCList);
extern void zfiWlanSetPacketFilter(zdev_t* dev, u32_t PacketFilter);
extern u8_t zfiCompareWithMulticastListAddress(zdev_t* dev, u16_t* dstMacAddr);
extern void zfiWlanSetSafeModeEnabled(zdev_t* dev, u8_t safeMode);
extern void zfiWlanSetIBSSAdditionalIELength(zdev_t* dev, u32_t ibssAdditionalIESize,  u8_t* ibssAdditionalIE);
extern void zfiWlanSetXLinkMode(zdev_t* dev, u32_t setValue);

/* hprw.c */
extern u32_t zfiDbgWriteFlash(zdev_t* dev, u32_t addr, u32_t val);
extern u32_t zfiDbgWriteReg(zdev_t* dev, u32_t addr, u32_t val);
extern u32_t zfiDbgReadReg(zdev_t* dev, u32_t addr);

extern u32_t zfiDbgWriteEeprom(zdev_t* dev, u32_t addr, u32_t val);
extern u32_t zfiDbgBlockWriteEeprom(zdev_t* dev, u32_t addr, u32_t* buf);
extern u32_t zfiDbgBlockWriteEeprom_v2(zdev_t* dev, u32_t addr, u32_t* buf, u32_t wrlen);

extern u16_t zfiDbgChipEraseFlash(zdev_t *dev);
extern u16_t zfiDbgProgramFlash(zdev_t *dev, u32_t offset, u32_t len, u32_t *data);
extern u32_t zfiDbgGetFlashCheckSum(zdev_t *dev, u32_t addr, u32_t len);
extern u32_t zfiDbgReadFlash(zdev_t *dev, u32_t addr, u32_t len);
extern u32_t zfiDownloadFwSet(zdev_t *dev);

extern u32_t zfiDbgDelayWriteReg(zdev_t* dev, u32_t addr, u32_t val);
extern u32_t zfiDbgFlushDelayWrite(zdev_t* dev);

extern u32_t zfiDbgSetIFSynthesizer(zdev_t* dev, u32_t value);
extern u32_t zfiDbgReadTally(zdev_t* dev);

extern u32_t zfiDbgQueryHwTxBusy(zdev_t* dev);

extern u8_t zfiWlanGetDestAddrFromBuf(zdev_t *dev, zbuf_t *buf, u16_t *macAddr);

extern u32_t zfiWlanQueryHwCapability(zdev_t* dev);

extern void zfiWlanSetDynamicSIFSParam(zdev_t* dev, u8_t val);

/***** End of section 2 *****/

/***** section 3 performace evaluation *****/
#ifdef ZM_ENABLE_PERFORMANCE_EVALUATION
extern void zfiTxPerformanceMSDU(zdev_t* dev, u32_t tick);
extern void zfiRxPerformanceMPDU(zdev_t* dev, zbuf_t* buf);
extern void zfiRxPerformanceReg(zdev_t* dev, u32_t reg, u32_t rsp);
#define ZM_PERFORMANCE_INIT(dev)                zfiPerformanceInit(dev);
#define ZM_PERFORMANCE_TX_MSDU(dev, tick)       zfiTxPerformanceMSDU(dev, tick);
#define ZM_PERFORMANCE_RX_MSDU(dev, tick)       zfiRxPerformanceMSDU(dev, tick);
#define ZM_PERFORMANCE_TX_MPDU(dev, tick)       zfiTxPerformanceMPDU(dev, tick);
#define ZM_PERFORMANCE_RX_MPDU(dev, buf)        zfiRxPerformanceMPDU(dev, buf);
#define ZM_PERFORMANCE_RX_SEQ(dev, buf)         zfiRxPerformanceSeq(dev, buf);
#define ZM_PERFORMANCE_REG(dev, reg, rsp)    {if(cmd[1] == reg) zfiRxPerformanceReg(dev, reg, rsp);}
#define ZM_PERFORMANCE_DUP(dev, buf1, buf2)     zfiRxPerformanceDup(dev, buf1, buf2);
#define ZM_PERFORMANCE_FREE(dev, buf)           zfiRxPerformanceFree(dev, buf);
#define ZM_PERFORMANCE_RX_AMSDU(dev, buf, len)  zfiRxPerformanceAMSDU(dev, buf, len);
#define ZM_PERFORMANCE_RX_FLUSH(dev)            zfiRxPerformanceFlush(dev);
#define ZM_PERFORMANCE_RX_CLEAR(dev)            zfiRxPerformanceClear(dev);
#define ZM_SEQ_DEBUG                            if (wd->seq_debug) DbgPrint
#define ZM_PERFORMANCE_RX_REORDER(dev)          zfiRxPerformanceReorder(dev);
#else
#define ZM_PERFORMANCE_INIT(dev)
#define ZM_PERFORMANCE_TX_MSDU(dev, tick)
#define ZM_PERFORMANCE_RX_MSDU(dev, tick)
#define ZM_PERFORMANCE_TX_MPDU(dev, tick)
#define ZM_PERFORMANCE_RX_MPDU(dev, buf)
#define ZM_PERFORMANCE_RX_SEQ(dev, buf)
#define ZM_PERFORMANCE_REG(dev, reg, rsp)
#define ZM_PERFORMANCE_DUP(dev, buf1, buf2)
#define ZM_PERFORMANCE_FREE(dev, buf)
#define ZM_PERFORMANCE_RX_AMSDU(dev, buf, len)
#define ZM_PERFORMANCE_RX_FLUSH(dev)
#define ZM_PERFORMANCE_RX_CLEAR(dev)
#define ZM_SEQ_DEBUG
#define ZM_PERFORMANCE_RX_REORDER(dev)
#endif
/***** End of section 3 *****/
#endif