Merge branch 'for-2.6.31' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6
[pandora-kernel.git] / drivers / staging / otus / 80211core / coid.c
1 /*
2  * Copyright (c) 2007-2008 Atheros Communications Inc.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 /*                                                                      */
17 /*  Module Name : iod.c                                                 */
18 /*                                                                      */
19 /*  Abstract                                                            */
20 /*      This module contains OID functions.                             */
21 /*                                                                      */
22 /*  NOTES                                                               */
23 /*      None                                                            */
24 /*                                                                      */
25 /************************************************************************/
26 #include "cprecomp.h"
27 #include "../hal/hpreg.h"
28
29 /************************************************************************/
30 /*                                                                      */
31 /*    FUNCTION DESCRIPTION                  zfiWlanQueryMacAddress      */
32 /*      Query OWN MAC address.                                          */
33 /*                                                                      */
34 /*    INPUTS                                                            */
35 /*      addr : for return MAC address                                   */
36 /*                                                                      */
37 /*    OUTPUTS                                                           */
38 /*      None                                                            */
39 /*                                                                      */
40 /*    AUTHOR                                                            */
41 /*      Stephen Chen        ZyDAS Technology Corporation    2005.10     */
42 /*                                                                      */
43 /************************************************************************/
44 void zfiWlanQueryMacAddress(zdev_t* dev, u8_t* addr)
45 {
46     u16_t vapId = 0;
47     zmw_get_wlan_dev(dev);
48
49     vapId = zfwGetVapId(dev);
50
51     addr[0] = (u8_t)(wd->macAddr[0] & 0xff);
52     addr[1] = (u8_t)(wd->macAddr[0] >> 8);
53     addr[2] = (u8_t)(wd->macAddr[1] & 0xff);
54     addr[3] = (u8_t)(wd->macAddr[1] >> 8);
55     addr[4] = (u8_t)(wd->macAddr[2] & 0xff);
56     if (vapId == 0xffff)
57         addr[5] = (u8_t)(wd->macAddr[2] >> 8);
58     else
59     {
60 #ifdef ZM_VAPMODE_MULTILE_SSID
61         addr[5] = (u8_t)(wd->macAddr[2] >> 8); // Multiple SSID
62 #else
63         addr[5] = vapId + 1 + (u8_t)(wd->macAddr[2] >> 8); //VAP
64 #endif
65     }
66
67     return;
68 }
69
70 void zfiWlanQueryBssList(zdev_t* dev, struct zsBssList* pBssList)
71 {
72     struct zsBssInfo*   pBssInfo;
73     struct zsBssInfo*   pDstBssInfo;
74     u8_t   i;
75     u8_t*  pMemList;
76     u8_t*  pMemInfo;
77
78     zmw_get_wlan_dev(dev);
79
80     zmw_declare_for_critical_section();
81
82     pMemList = (u8_t*) pBssList;
83     pMemInfo = pMemList + sizeof(struct zsBssList);
84     pBssList->head = (struct zsBssInfo*) pMemInfo;
85
86     zmw_enter_critical_section(dev);
87
88     pBssInfo = wd->sta.bssList.head;
89     pDstBssInfo = (struct zsBssInfo*) pMemInfo;
90     pBssList->bssCount = wd->sta.bssList.bssCount;
91
92     for( i=0; i<wd->sta.bssList.bssCount; i++ )
93     {
94         zfMemoryCopy((u8_t*)pDstBssInfo, (u8_t*)pBssInfo,
95                 sizeof(struct zsBssInfo));
96
97         if ( pBssInfo->next != NULL )
98         {
99             pBssInfo = pBssInfo->next;
100             pDstBssInfo->next = pDstBssInfo + 1;
101             pDstBssInfo++;
102         }
103         else
104         {
105             zm_assert(i==(wd->sta.bssList.bssCount-1));
106         }
107     }
108
109     zmw_leave_critical_section(dev);
110
111     zfScanMgrScanAck(dev);
112 }
113
114 void zfiWlanQueryBssListV1(zdev_t* dev, struct zsBssListV1* bssListV1)
115 {
116     struct zsBssInfo*   pBssInfo;
117     //struct zsBssInfo*   pDstBssInfo;
118     u8_t   i, j, bdrop = 0, k = 0, Same_Count = 0;
119     u8_t   bssid[6];
120     //u8_t*  pMemList;
121     //u8_t*  pMemInfo;
122     zmw_get_wlan_dev(dev);
123     zmw_declare_for_critical_section();
124
125     zmw_enter_critical_section(dev);
126
127     bssListV1->bssCount = wd->sta.bssList.bssCount;
128
129     pBssInfo = wd->sta.bssList.head;
130     ZM_MAC_WORD_TO_BYTE(wd->sta.bssid, bssid);
131
132     for( i=0; i<wd->sta.bssList.bssCount; i++ )
133     {
134         bdrop = 0;
135         if ( zfStaIsConnected(dev)
136              && (wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) )
137         {
138                         for (j = 0; j < 6; j++)
139             {
140                 if ( pBssInfo->bssid[j] != bssid[j] )
141                 {
142                     break;
143                 }
144             }
145
146             if  ( (j == 6)
147                   &&((pBssInfo->ssid[1] == wd->sta.ssidLen) || (pBssInfo->ssid[1] == 0) )&& (pBssInfo->frequency == wd->frequency) )
148             {
149                                 if(pBssInfo->ssid[1] == 0)
150                                         pBssInfo->ssid[1] = wd->sta.ssidLen;
151
152                                 if(Same_Count == 0)
153                                 {//First meet
154                                         Same_Count++;
155                                 }
156                                 else
157                                 {//same one
158                                         bdrop = 1;
159                                         bssListV1->bssCount--;
160                                 }
161
162             }
163         }
164
165         if (bdrop == 0)
166         {
167             zfMemoryCopy((u8_t*)(&bssListV1->bssInfo[k]), (u8_t*)pBssInfo,
168                 sizeof(struct zsBssInfo));
169
170                         if(Same_Count == 1)
171                         {
172                                 zfMemoryCopy(&(bssListV1->bssInfo[k].ssid[2]), wd->sta.ssid, wd->sta.ssidLen);
173                                 Same_Count++;
174                         }
175
176                         k++;
177         }
178
179         if ( pBssInfo->next != NULL )
180         {
181             pBssInfo = pBssInfo->next;
182         }
183         else
184         {
185             zm_assert(i==(wd->sta.bssList.bssCount-1));
186         }
187     }
188
189     zmw_leave_critical_section(dev);
190
191     zfScanMgrScanAck(dev);
192 }
193
194 void zfiWlanQueryAdHocCreatedBssDesc(zdev_t* dev, struct zsBssInfo *pBssInfo)
195 {
196     zmw_get_wlan_dev(dev);
197
198     zfMemoryCopy((u8_t *)pBssInfo, (u8_t *)&wd->sta.ibssBssDesc, sizeof(struct zsBssInfo));
199 }
200
201 u8_t zfiWlanQueryAdHocIsCreator(zdev_t* dev)
202 {
203     zmw_get_wlan_dev(dev);
204
205     return wd->sta.ibssBssIsCreator;
206 }
207
208 u32_t zfiWlanQuerySupportMode(zdev_t* dev)
209 {
210     zmw_get_wlan_dev(dev);
211
212     return wd->supportMode;
213 }
214
215 u32_t zfiWlanQueryTransmitPower(zdev_t* dev)
216 {
217     u32_t ret = 0;
218
219     zmw_get_wlan_dev(dev);
220
221     if (zfStaIsConnected(dev)) {
222         ret = wd->sta.connPowerInHalfDbm;
223     } else {
224         ret = zfHpGetTransmitPower(dev);
225     }
226
227     return ret;
228 }
229
230 /************************************************************************/
231 /*                                                                      */
232 /*    FUNCTION DESCRIPTION                  zfiWlanFlushBssList         */
233 /*      Flush BSSID List.                                               */
234 /*                                                                      */
235 /*    INPUTS                                                            */
236 /*      dev : device pointer                                            */
237 /*                                                                      */
238 /*    OUTPUTS                                                           */
239 /*      none                                                            */
240 /*                                                                      */
241 /*    AUTHOR                                                            */
242 /*      Stephen Chen        Atheros Communications, INC.    2006.12     */
243 /*                                                                      */
244 /************************************************************************/
245 void zfiWlanFlushBssList(zdev_t* dev)
246 {
247     zmw_declare_for_critical_section();
248
249     zmw_enter_critical_section(dev);
250     /* Call zfBssInfoRefresh() twice to remove all entry */
251     zfBssInfoRefresh(dev, 1);
252     zmw_leave_critical_section(dev);
253 }
254
255 void zfiWlanSetWlanMode(zdev_t* dev, u8_t wlanMode)
256 {
257     zmw_get_wlan_dev(dev);
258
259     zmw_declare_for_critical_section();
260
261     zmw_enter_critical_section(dev);
262     wd->ws.wlanMode = wlanMode;
263     zmw_leave_critical_section(dev);
264 }
265
266 void zfiWlanSetAuthenticationMode(zdev_t* dev, u8_t authMode)
267 {
268     zmw_get_wlan_dev(dev);
269
270     zmw_declare_for_critical_section();
271
272     zmw_enter_critical_section(dev);
273     wd->ws.authMode = authMode;
274     zmw_leave_critical_section(dev);
275 }
276
277 void zfiWlanSetWepStatus(zdev_t* dev, u8_t wepStatus)
278 {
279     zmw_get_wlan_dev(dev);
280
281     zmw_declare_for_critical_section();
282
283     zmw_enter_critical_section(dev);
284     wd->ws.wepStatus = wepStatus;
285     zmw_leave_critical_section(dev);
286
287 }
288
289 void zfiWlanSetSSID(zdev_t* dev, u8_t* ssid, u8_t ssidLength)
290 {
291     u16_t i;
292     zmw_get_wlan_dev(dev);
293
294     zmw_declare_for_critical_section();
295
296     if ( ssidLength <= 32 )
297     {
298         zmw_enter_critical_section(dev);
299
300         wd->ws.ssidLen = ssidLength;
301         zfMemoryCopy(wd->ws.ssid, ssid, ssidLength);
302
303         if ( ssidLength < 32 )
304         {
305             wd->ws.ssid[ssidLength] = 0;
306         }
307
308         wd->ws.probingSsidList[0].ssidLen = ssidLength;
309         zfMemoryCopy(wd->ws.probingSsidList[0].ssid, ssid, ssidLength);
310         for (i=1; i<ZM_MAX_PROBE_HIDDEN_SSID_SIZE; i++)
311         {
312             wd->ws.probingSsidList[i].ssidLen = 0;
313         }
314
315         zmw_leave_critical_section(dev);
316     }
317 }
318
319 void zfiWlanSetFragThreshold(zdev_t* dev, u16_t fragThreshold)
320 {
321     zmw_get_wlan_dev(dev);
322
323     zmw_declare_for_critical_section();
324
325     zmw_enter_critical_section(dev);
326
327     if (fragThreshold == 0)
328     {   /* fragmentation is disabled */
329         wd->fragThreshold = 32767;
330     }
331     else if (fragThreshold < 256)
332     {
333         /* Minimum fragment threshold */
334         wd->fragThreshold = 256;
335     }
336     else if (fragThreshold > 2346)
337     {
338         wd->fragThreshold = 2346;
339     }
340     else
341     {
342         wd->fragThreshold = fragThreshold & 0xfffe;
343     }
344
345     zmw_leave_critical_section(dev);
346 }
347
348 void zfiWlanSetRtsThreshold(zdev_t* dev, u16_t rtsThreshold)
349 {
350     zmw_get_wlan_dev(dev);
351
352     zmw_declare_for_critical_section();
353
354     zmw_enter_critical_section(dev);
355     wd->rtsThreshold = rtsThreshold;
356     zmw_leave_critical_section(dev);
357 }
358
359 void zfiWlanSetFrequency(zdev_t* dev, u32_t frequency, u8_t bImmediate)
360 {
361     zmw_get_wlan_dev(dev);
362
363     zmw_declare_for_critical_section();
364
365     if ( bImmediate )
366     {
367         zmw_enter_critical_section(dev);
368         wd->frequency = (u16_t) (frequency/1000);
369         zmw_leave_critical_section(dev);
370         zfCoreSetFrequency(dev, wd->frequency);
371     }
372     else
373     {
374         zmw_enter_critical_section(dev);
375         if( frequency == 0 )
376         { // Auto select clean channel depend on wireless environment !
377             wd->ws.autoSetFrequency = 0;
378         }
379         wd->ws.frequency = (u16_t) (frequency/1000);
380         zmw_leave_critical_section(dev);
381     }
382 }
383
384 void zfiWlanSetBssid(zdev_t* dev, u8_t* bssid)
385 {
386     u16_t i;
387     zmw_get_wlan_dev(dev);
388
389     zmw_declare_for_critical_section();
390
391     zmw_enter_critical_section(dev);
392     for (i=0; i<6; i++)
393     {
394         wd->ws.desiredBssid[i] = bssid[i];
395     }
396     wd->ws.bDesiredBssid = TRUE;
397     zmw_leave_critical_section(dev);
398
399 }
400
401 void zfiWlanSetBeaconInterval(zdev_t* dev,
402                               u16_t  beaconInterval,
403                               u8_t   bImmediate)
404 {
405     zmw_get_wlan_dev(dev);
406
407     zmw_declare_for_critical_section();
408
409     if ( bImmediate )
410     {
411         zmw_enter_critical_section(dev);
412         wd->beaconInterval = beaconInterval;
413         zmw_leave_critical_section(dev);
414
415         /* update beacon interval here */
416     }
417     else
418     {
419         zmw_enter_critical_section(dev);
420         wd->ws.beaconInterval = beaconInterval;
421         zmw_leave_critical_section(dev);
422     }
423 }
424
425
426 void zfiWlanSetDtimCount(zdev_t* dev, u8_t  dtim)
427 {
428     zmw_get_wlan_dev(dev);
429
430     zmw_declare_for_critical_section();
431
432     zmw_enter_critical_section(dev);
433     if (dtim > 0)
434     {
435         wd->ws.dtim = dtim;
436     }
437     zmw_leave_critical_section(dev);
438 }
439
440
441 void zfiWlanSetAtimWindow(zdev_t* dev, u16_t atimWindow, u8_t bImmediate)
442 {
443     zmw_get_wlan_dev(dev);
444
445     zmw_declare_for_critical_section();
446
447     if ( bImmediate )
448     {
449         zmw_enter_critical_section(dev);
450         wd->sta.atimWindow = atimWindow;
451         zmw_leave_critical_section(dev);
452
453         /* atim window here */
454     }
455     else
456     {
457         zmw_enter_critical_section(dev);
458         wd->ws.atimWindow = atimWindow;
459         zmw_leave_critical_section(dev);
460     }
461 }
462
463
464 void zfiWlanSetEncryMode(zdev_t* dev, u8_t encryMode)
465 {
466     zmw_get_wlan_dev(dev);
467
468     zmw_declare_for_critical_section();
469
470     zmw_enter_critical_section(dev);
471     if (wd->wlanMode == ZM_MODE_AP)
472     {
473         /* Hostapd Issue */
474         if ((wd->ws.encryMode != ZM_AES) && (wd->ws.encryMode != ZM_TKIP))
475             wd->ws.encryMode = encryMode;
476     }
477     else
478         wd->ws.encryMode = encryMode;
479     zmw_leave_critical_section(dev);
480 }
481
482 void zfiWlanSetDefaultKeyId(zdev_t* dev, u8_t keyId)
483 {
484     zmw_get_wlan_dev(dev);
485
486     wd->sta.keyId = keyId;
487 }
488
489 u8_t zfiWlanQueryIsPKInstalled(zdev_t *dev, u8_t *staMacAddr)
490 {
491     u8_t isInstalled = 0;
492
493 #if 1
494 //#ifdef ZM_ENABLE_IBSS_WPA2PSK
495     u8_t   res, peerIdx;
496
497     zmw_get_wlan_dev(dev);
498
499     zmw_declare_for_critical_section();
500
501     zmw_enter_critical_section(dev);
502     res = zfStaFindOppositeByMACAddr(dev, (u16_t *)staMacAddr, &peerIdx);
503     if( res == 0 )
504     {
505         isInstalled = wd->sta.oppositeInfo[peerIdx].pkInstalled;
506     }
507     zmw_leave_critical_section(dev);
508 //#endif
509 #endif
510
511     return isInstalled;
512 }
513
514 u8_t zfiWlanSetKey(zdev_t* dev, struct zsKeyInfo keyInfo)
515 {
516     u16_t  broadcast[3] = {0xffff, 0xffff, 0xffff};
517     u32_t* key;
518     u8_t   encryMode = ZM_NO_WEP;
519 #ifdef ZM_ENABLE_IBSS_WPA2PSK
520     u8_t   encryType = ZM_NO_WEP;
521 #endif
522     u8_t   micKey[16];
523     u16_t  id = 0;
524     u8_t   vapId, i, addr[6];
525     u8_t   userIdx=0;
526
527 #ifdef ZM_ENABLE_IBSS_WPA2PSK
528     /* Determine opposite exist or not */
529     u8_t   res, peerIdx;
530 //    u8_t   userIdx=0;
531
532     zmw_get_wlan_dev(dev);
533
534     if ( wd->sta.ibssWpa2Psk == 1 )
535     {
536         zmw_enter_critical_section(dev);
537         res = zfStaFindOppositeByMACAddr(dev, (u16_t*)keyInfo.macAddr, &peerIdx);
538         if( res == 0 )
539         {
540             userIdx = peerIdx;
541             if ( wd->sta.oppositeInfo[userIdx].camIdx == 0xff )
542                 wd->sta.oppositeInfo[userIdx].camIdx = userIdx;
543         }
544         zmw_leave_critical_section(dev);
545     }
546 #else
547     zmw_get_wlan_dev(dev);
548 #endif
549
550     if ( keyInfo.flag & ZM_KEY_FLAG_AUTHENTICATOR )
551     {   /* set key by authenticator */
552         /* set pairwise key */
553         if (keyInfo.flag & ZM_KEY_FLAG_PK)
554         {
555             /* Find STA's information */
556             if ((id = zfApFindSta(dev, keyInfo.macAddr)) == 0xffff)
557             {
558                 /* Can't STA in the staTable */
559                 return ZM_STATUS_FAILURE;
560             }
561
562             wd->ap.staTable[id].iv16 = 0;
563             wd->ap.staTable[id].iv32 = 0;
564
565             if (keyInfo.keyLength == 32)
566             {   /* TKIP */
567                 //u8_t KeyRsc[6] = {0, 0, 0, 0, 0, 0};
568
569                 /* In the current AP mode, we set KeyRsc to zero */
570                 //zfTkipInit(keyInfo.key, (u8_t*) wd->macAddr,
571                 //           &(wd->ap.staTable[id].txSeed), KeyRsc);
572                 //zfTkipInit(keyInfo.key, (u8_t*) keyInfo.macAddr,
573                 //           &(wd->ap.staTable[id].rxSeed), KeyRsc);
574 #ifdef ZM_ENABLE_CENC
575                 if (keyInfo.flag & ZM_KEY_FLAG_CENC)
576                 {
577                     zm_debug_msg0("Set CENC pairwise Key");
578
579                     wd->ap.staTable[id].encryMode = ZM_CENC;
580
581                     /* Reset txiv and rxiv */
582                     wd->ap.staTable[id].txiv[0] = 0x5c365c37;
583                     wd->ap.staTable[id].txiv[1] = 0x5c365c36;
584                     wd->ap.staTable[id].txiv[2] = 0x5c365c36;
585                     wd->ap.staTable[id].txiv[3] = 0x5c365c36;
586
587                     wd->ap.staTable[id].rxiv[0] = 0x5c365c36;
588                     wd->ap.staTable[id].rxiv[1] = 0x5c365c36;
589                     wd->ap.staTable[id].rxiv[2] = 0x5c365c36;
590                     wd->ap.staTable[id].rxiv[3] = 0x5c365c36;
591
592                     /* Set Key Index */
593                     wd->ap.staTable[id].cencKeyIdx = keyInfo.keyIndex;
594
595                     //zfCoreSetKey(dev, id+1, 1, ZM_CENC, (u16_t *)keyInfo.macAddr,
596                     //          (u32_t*) &keyInfo.key[16]);
597                 }
598                 else
599 #endif //ZM_ENABLE_CENC
600                 {
601                     wd->ap.staTable[id].encryMode = ZM_TKIP;
602
603                     zfMemoryCopy(micKey, &keyInfo.key[16], 8);
604                     zfMemoryCopy(&micKey[8], &keyInfo.key[24], 8);
605
606                     //zfCoreSetKey(dev, id+1, 1, ZM_TKIP, (u16_t *)keyInfo.macAddr,
607                     //           (u32_t*) micKey);
608
609                     /* For fragmentation, we use software MIC */
610                     zfMemoryCopy((u8_t *)&(wd->ap.staTable[id].txMicKey), &(keyInfo.key[16]), 8);
611                     zfMemoryCopy((u8_t *)&(wd->ap.staTable[id].rxMicKey), &(keyInfo.key[24]), 8);
612
613                 }
614             }
615             else if (keyInfo.keyLength == 16)
616             {   /* AES */
617                 wd->ap.staTable[id].encryMode = ZM_AES;
618             }
619             else if (keyInfo.keyLength == 0)
620             {
621                 /* Clear Key Info */
622                 zfApClearStaKey(dev, (u16_t *)keyInfo.macAddr);
623
624                 return ZM_STATUS_SUCCESS;
625             }
626             else
627             {
628                 return ZM_STATUS_FAILURE;
629             }
630
631             //zfCoreSetKey(dev, id+1, 0, wd->ap.staTable[id].encryMode,
632             //      (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
633             zfHpSetApPairwiseKey(dev, (u16_t *)keyInfo.macAddr,
634                     wd->ap.staTable[id].encryMode, (u32_t*) keyInfo.key,
635                     (u32_t*) &keyInfo.key[16], id+1);
636             wd->ap.staTable[id].keyIdx = id + 1 + 4;
637         }
638         else if (keyInfo.flag & ZM_KEY_FLAG_GK)
639         {
640             vapId = keyInfo.vapId;
641
642             wd->ap.iv16[vapId] = 0;
643             wd->ap.iv32[vapId] = 0;
644
645             if (keyInfo.keyLength == 32)
646             {   /* TKIP */
647                 //u8_t KeyRsc[6] = {0, 0, 0, 0, 0, 0};
648
649                 //zfTkipInit(keyInfo.key, (u8_t*) wd->macAddr,
650                 //           &(wd->ap.bcSeed), KeyRsc);
651 #ifdef ZM_ENABLE_CENC
652                 if (keyInfo.flag & ZM_KEY_FLAG_CENC)
653                 {
654                     encryMode = ZM_CENC;
655                     zm_debug_msg0("Set CENC group Key");
656
657                     /* Reset txiv and rxiv */
658                     wd->ap.txiv[vapId][0] = 0x5c365c36;
659                     wd->ap.txiv[vapId][1] = 0x5c365c36;
660                     wd->ap.txiv[vapId][2] = 0x5c365c36;
661                     wd->ap.txiv[vapId][3] = 0x5c365c36;
662
663                     //zfCoreSetKey(dev, 0, 1, ZM_CENC, keyInfo.vapAddr,
664                     //          (u32_t*) &keyInfo.key[16]);
665                     key = (u32_t*) keyInfo.key;
666                 }
667                 else
668 #endif //ZM_ENABLE_CENC
669                 {
670                     encryMode = ZM_TKIP;
671                     key = (u32_t *)keyInfo.key;
672
673                     /* set MIC key to HMAC */
674                     //zfCoreSetKey(dev, 0, 1, ZM_TKIP, broadcast,
675                     //         (u32_t*) (&keyInfo.key[16]));
676                     //zfCoreSetKey(dev, 0, 1, ZM_TKIP, keyInfo.vapAddr,
677                     //           (u32_t*) (&keyInfo.key[16]));
678
679                     zfMicSetKey(&(keyInfo.key[16]), &(wd->ap.bcMicKey[0]));
680                     key = (u32_t*) keyInfo.key;
681                 }
682             }
683             else if (keyInfo.keyLength == 16)
684             {   /* AES */
685                 encryMode = ZM_AES;
686                 key = (u32_t *)keyInfo.key;
687                 zm_debug_msg0("CWY - Set AES Group Key");
688             }
689             else if (keyInfo.keyLength == 0)
690             {
691                 /* Clear Key Info */
692                 zfApClearStaKey(dev, broadcast);
693
694                 /* Turn off WEP bit in the capability field */
695                 wd->ap.capab[vapId] &= 0xffef;
696
697                 return ZM_STATUS_SUCCESS;
698             }
699             else
700             {   /* WEP */
701                 if (keyInfo.keyLength == 5)
702                 {
703                     encryMode = ZM_WEP64;
704                 }
705                 else if (keyInfo.keyLength == 13)
706                 {
707                     encryMode = ZM_WEP128;
708                 }
709                 else if (keyInfo.keyLength == 29)
710                 {
711                     encryMode = ZM_WEP256;
712                 }
713
714                 key = (u32_t*) keyInfo.key;
715             }
716
717             // Modification for CAM not support VAP search
718             //zfCoreSetKey(dev, 0, 0, encryMode, broadcast, key);
719             //zfCoreSetKey(dev, 0, 0, encryMode, wd->macAddr, key);
720             //zfCoreSetKey(dev, 0, 0, encryMode, keyInfo.vapAddr, key);
721             zfHpSetApGroupKey(dev, wd->macAddr, encryMode,
722                     key, (u32_t*) &keyInfo.key[16], vapId);
723
724             //zfiWlanSetEncryMode(dev, encryMode);
725             wd->ws.encryMode = encryMode;
726
727             /* set the multicast address encryption type */
728             wd->ap.encryMode[vapId] = encryMode;
729
730             /* set the multicast key index */
731             wd->ap.bcKeyIndex[vapId] = keyInfo.keyIndex;
732             wd->ap.bcHalKeyIdx[vapId] = vapId + 60;
733
734             /* Turn on WEP bit in the capability field */
735             wd->ap.capab[vapId] |= 0x10;
736         }
737     }
738     else
739     {   /* set by supplicant */
740
741         if ( keyInfo.flag & ZM_KEY_FLAG_PK )
742         {   /* set pairwise key */
743
744             //zfTkipInit(keyInfo.key, (u8_t*) wd->macAddr,
745             //           &wd->sta.txSeed, keyInfo.initIv);
746             //zfTkipInit(keyInfo.key, (u8_t*) wd->sta.bssid,
747             //           &wd->sta.rxSeed[keyInfo.keyIndex], keyInfo.initIv);
748
749 #ifdef ZM_ENABLE_IBSS_WPA2PSK
750             if ( wd->sta.ibssWpa2Psk == 1 )
751             {
752                 /* unicast -- > pairwise key */
753                 wd->sta.oppositeInfo[userIdx].iv16 = 0;
754                 wd->sta.oppositeInfo[userIdx].iv32 = 0;
755             }
756             else
757             {
758                 wd->sta.iv16 = 0;
759                 wd->sta.iv32 = 0;
760             }
761
762             wd->sta.oppositeInfo[userIdx].pkInstalled = 1;
763 #else
764             wd->sta.iv16 = 0;
765             wd->sta.iv32 = 0;
766
767             wd->sta.oppositeInfo[userIdx].pkInstalled = 1;
768 #endif
769
770             if ( keyInfo.keyLength == 32 )
771             {   /* TKIP */
772                 zfTkipInit(keyInfo.key, (u8_t*) wd->macAddr,
773                         &wd->sta.txSeed, keyInfo.initIv);
774                 zfTkipInit(keyInfo.key, (u8_t*) wd->sta.bssid,
775                         &wd->sta.rxSeed[keyInfo.keyIndex], keyInfo.initIv);
776
777 #ifdef ZM_ENABLE_CENC
778                 if (keyInfo.flag & ZM_KEY_FLAG_CENC)
779                 {
780                     zm_debug_msg0("Set CENC pairwise Key");
781
782                     wd->sta.encryMode = ZM_CENC;
783
784                     /* Reset txiv and rxiv */
785                     wd->sta.txiv[0] = 0x5c365c36;
786                     wd->sta.txiv[1] = 0x5c365c36;
787                     wd->sta.txiv[2] = 0x5c365c36;
788                     wd->sta.txiv[3] = 0x5c365c36;
789
790                     wd->sta.rxiv[0] = 0x5c365c37;
791                     wd->sta.rxiv[1] = 0x5c365c36;
792                     wd->sta.rxiv[2] = 0x5c365c36;
793                     wd->sta.rxiv[3] = 0x5c365c36;
794
795                     /* Set Key Index */
796                     wd->sta.cencKeyId = keyInfo.keyIndex;
797
798                     //zfCoreSetKey(dev, id+1, 1, ZM_CENC, (u16_t *)keyInfo.macAddr,
799                     //         (u32_t*) &keyInfo.key[16]);
800                 }
801                 else
802 #endif //ZM_ENABLE_CENC
803                 {
804                     wd->sta.encryMode = ZM_TKIP;
805
806                     //zfCoreSetKey(dev, 0, 1, ZM_TKIP, wd->sta.bssid,
807                     //         (u32_t*) &keyInfo.key[16]);
808
809                     zfMicSetKey(&keyInfo.key[16], &wd->sta.txMicKey);
810                     zfMicSetKey(&keyInfo.key[24],
811                                 &wd->sta.rxMicKey[keyInfo.keyIndex]);
812                 }
813             }
814             else if ( keyInfo.keyLength == 16 )
815             {   /* AES */
816 #ifdef ZM_ENABLE_IBSS_WPA2PSK
817                 if ( wd->sta.ibssWpa2Psk == 1 )
818                 {
819                     wd->sta.oppositeInfo[userIdx].encryMode = ZM_AES;
820                     encryType = wd->sta.oppositeInfo[userIdx].encryMode;
821                 }
822                 else
823                 {
824                     wd->sta.encryMode = ZM_AES;
825                     encryType = wd->sta.encryMode;
826                 }
827 #else
828                 wd->sta.encryMode = ZM_AES;
829 #endif
830             }
831             else
832             {
833                 return ZM_STATUS_FAILURE;
834             }
835
836             /* user 0 */
837             //zfCoreSetKey(dev, 0, 0, wd->sta.encryMode,
838             //         wd->sta.bssid, (u32_t*) keyInfo.key);
839             //zfHpSetStaPairwiseKey(dev, wd->sta.bssid, wd->sta.encryMode,
840             //    (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
841
842 #ifdef ZM_ENABLE_IBSS_WPA2PSK
843             if ( (keyInfo.keyLength==16) && (wd->sta.ibssWpa2Psk==1) )
844             { /* If not AES-CCMP and ibss network , use traditional */
845                 zfHpSetPerUserKey(dev,
846                                 userIdx,
847                                 keyInfo.keyIndex,  // key id == 0 ( Pairwise key = 0 )
848                                 (u8_t*)keyInfo.macAddr,   // RX need Source Address ( Address 2 )
849                                 encryType,
850 //                              wd->sta.encryMode,
851                                 (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
852
853                 wd->sta.oppositeInfo[userIdx].wpaState = ZM_STA_WPA_STATE_PK_OK ;
854             }
855             else
856             {/* Big Endian and Little Endian Compatibility */
857                 for (i = 0; i < 3; i++)
858                 {
859                     addr[2 * i] = wd->sta.bssid[i] & 0xff;
860                     addr[2 * i + 1] = wd->sta.bssid[i] >> 8;
861                 }
862                 zfHpSetPerUserKey(dev,
863                                     ZM_USER_KEY_PK,   // user id
864                                     0,                // key id
865                                     addr,//(u8_t *)wd->sta.bssid,
866                               wd->sta.encryMode,
867                               (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
868
869                 wd->sta.keyId = 4;
870             }
871 #else
872             /* Big Endian and Little Endian Compatibility */
873             for (i = 0; i < 3; i++)
874             {
875                 addr[2 * i] = wd->sta.bssid[i] & 0xff;
876                 addr[2 * i + 1] = wd->sta.bssid[i] >> 8;
877             }
878             zfHpSetPerUserKey(dev,
879                               ZM_USER_KEY_PK,   // user id
880                               0,                // key id
881                               addr,//(u8_t *)wd->sta.bssid,
882                               wd->sta.encryMode,
883                               (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
884
885             wd->sta.keyId = 4;
886 #endif
887
888             wd->sta.wpaState = ZM_STA_WPA_STATE_PK_OK;
889         }
890         else if ( keyInfo.flag & ZM_KEY_FLAG_GK )
891         {   /* set group key */
892
893             zfTkipInit(keyInfo.key, (u8_t*) wd->sta.bssid,
894                        &wd->sta.rxSeed[keyInfo.keyIndex], keyInfo.initIv);
895
896             if ( keyInfo.keyLength == 32 )
897             {   /* TKIP */
898 #ifdef ZM_ENABLE_CENC
899                 if (keyInfo.flag & ZM_KEY_FLAG_CENC)
900                 {
901                     encryMode = ZM_CENC;
902                     zm_debug_msg0("Set CENC group Key");
903
904                     /* Reset txiv and rxiv */
905                     wd->sta.rxivGK[0] = 0x5c365c36;
906                     wd->sta.rxivGK[1] = 0x5c365c36;
907                     wd->sta.rxivGK[2] = 0x5c365c36;
908                     wd->sta.rxivGK[3] = 0x5c365c36;
909
910                     //zfCoreSetKey(dev, 0, 1, ZM_CENC, keyInfo.vapAddr,
911                     //         (u32_t*) &keyInfo.key[16]);
912                     key = (u32_t*) keyInfo.key;
913                 }
914                 else
915 #endif //ZM_ENABLE_CENC
916                 {
917                     encryMode = ZM_TKIP;
918                     key = (u32_t*) wd->sta.rxSeed[keyInfo.keyIndex].tk;
919
920                     if ( !(keyInfo.flag & ZM_KEY_FLAG_INIT_IV) )
921                     {
922                         wd->sta.rxSeed[keyInfo.keyIndex].iv16 = 0;
923                         wd->sta.rxSeed[keyInfo.keyIndex].iv32 = 0;
924                     }
925
926                     /* set MIC key to HMAC */
927                     //zfCoreSetKey(dev, 8, 1, ZM_TKIP, broadcast,
928                     //         (u32_t*) (&keyInfo.key[16]));
929
930                     zfMicSetKey(&keyInfo.key[24],
931                                 &wd->sta.rxMicKey[keyInfo.keyIndex]);
932                 }
933             }
934             else if ( keyInfo.keyLength == 16 )
935             {   /* AES */
936                 encryMode = ZM_AES;
937                 //key = (u32_t*) wd->sta.rxSeed[keyInfo.keyIndex].tk;
938             }
939             else
940             {   /* WEP */
941                 if ( keyInfo.keyLength == 5 )
942                 {
943                     encryMode = ZM_WEP64;
944                 }
945                 else if ( keyInfo.keyLength == 13 )
946                 {
947                     encryMode = ZM_WEP128;
948                 }
949                 else if ( keyInfo.keyLength == 29 )
950                 {
951                     encryMode = ZM_WEP256;
952                 }
953
954                 key = (u32_t*) keyInfo.key;
955             }
956
957             /* user 8 */
958             //zfCoreSetKey(dev, 8, 0, encryMode, broadcast, key);
959             //zfHpSetStaGroupKey(dev, broadcast, encryMode,
960             //        (u32_t*) keyInfo.key, (u32_t*) (&keyInfo.key[16]));
961
962 #ifdef ZM_ENABLE_IBSS_WPA2PSK
963             if ( (keyInfo.keyLength==16) && (wd->sta.ibssWpa2Psk==1) )
964             {/* If not AES-CCMP and ibss network , use traditional */
965                 zfHpSetPerUserKey(dev,
966                               userIdx,
967                               keyInfo.keyIndex,                // key id
968                               // (u8_t *)broadcast,                  // for only 2 stations IBSS netwrl ( A2 )
969                               (u8_t*)keyInfo.macAddr,   // for multiple ( > 2 ) stations IBSS network ( A2 )
970                               encryMode,
971                               (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
972             }
973             else
974             {
975                 zfHpSetPerUserKey(dev,
976                                 ZM_USER_KEY_GK,   // user id
977                                 0,                // key id
978                                 (u8_t *)broadcast,
979                                 encryMode,
980                                 (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
981
982                 wd->sta.wpaState = ZM_STA_WPA_STATE_GK_OK;
983             }
984 #else
985             zfHpSetPerUserKey(dev,
986                               ZM_USER_KEY_GK,   // user id
987                               0,                // key id
988                               (u8_t *)broadcast,
989                               encryMode,
990                               (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
991
992             wd->sta.wpaState = ZM_STA_WPA_STATE_GK_OK;
993 #endif
994         }
995         else
996         {   /* legacy WEP */
997             zm_debug_msg0("legacy WEP");
998
999             if ( keyInfo.keyIndex >= 4 )
1000             {
1001                 return ZM_STATUS_FAILURE;
1002             }
1003
1004             if ( keyInfo.keyLength == 5 )
1005             {
1006                 zm_debug_msg0("WEP 64");
1007
1008                 encryMode = ZM_WEP64;
1009             }
1010             else if ( keyInfo.keyLength == 13 )
1011             {
1012                 zm_debug_msg0("WEP 128");
1013
1014                 encryMode = ZM_WEP128;
1015             }
1016             else if ( keyInfo.keyLength == 32 )
1017             {
1018                 /* TKIP */
1019                 #if 0
1020                 // Don't reset the IV since some AP would fail in IV check and drop our connection
1021                 if ( wd->sta.wpaState != ZM_STA_WPA_STATE_PK_OK )
1022                 {
1023                     wd->sta.iv16 = 0;
1024                     wd->sta.iv32 = 0;
1025                 }
1026                 #endif
1027
1028                 encryMode = ZM_TKIP;
1029
1030                 zfTkipInit(keyInfo.key, (u8_t*) wd->sta.bssid,
1031                            &wd->sta.rxSeed[keyInfo.keyIndex], keyInfo.initIv);
1032                 zfMicSetKey(&keyInfo.key[24],
1033                            &wd->sta.rxMicKey[keyInfo.keyIndex]);
1034             }
1035             else if ( keyInfo.keyLength == 16 )
1036             {
1037                 /* AES */
1038                 #if 0
1039                 // Don't reset the IV since some AP would fail in IV check and drop our connection
1040                 if ( wd->sta.wpaState != ZM_STA_WPA_STATE_PK_OK )
1041                 {
1042                     /* broadcast -- > group key */
1043                     /* Only initialize when set our default key ! */
1044                     wd->sta.iv16 = 0;
1045                     wd->sta.iv32 = 0;
1046                 }
1047                 #endif
1048
1049                 encryMode = ZM_AES;
1050             }
1051             else if ( keyInfo.keyLength == 29 )
1052             {
1053                 zm_debug_msg0("WEP 256");
1054
1055                 encryMode = ZM_WEP256;
1056                 //zfCoreSetKey(dev, 64, 1, wd->sta.encryMode,
1057                 //         wd->sta.bssid, (u32_t*) (&keyInfo.key[16]));
1058             }
1059             else
1060             {
1061                 return ZM_STATUS_FAILURE;
1062             }
1063
1064             {
1065                 u8_t i;
1066
1067                 zm_debug_msg0("key = ");
1068                 for(i = 0; i < keyInfo.keyLength; i++)
1069                 {
1070                     zm_debug_msg2("", keyInfo.key[i]);
1071                 }
1072             }
1073
1074             if ( keyInfo.flag & ZM_KEY_FLAG_DEFAULT_KEY )
1075             {
1076                 //for WEP default key 1~3 and ATOM platform--CWYang(+)
1077                 vapId = 0;
1078                 wd->ap.bcHalKeyIdx[vapId] = keyInfo.keyIndex;
1079                 wd->ap.bcKeyIndex[vapId] = keyInfo.keyIndex;
1080                 wd->sta.keyId = keyInfo.keyIndex;
1081             }
1082
1083                         if(encryMode == ZM_TKIP)
1084                         {
1085                                 if(wd->TKIP_Group_KeyChanging == 0x1)
1086                                 {
1087                                         zm_debug_msg0("Countermeasure : Cancel Old Timer ");
1088                                         zfTimerCancel(dev,      ZM_EVENT_SKIP_COUNTERMEASURE);
1089                                 }
1090                                 else
1091                                 {
1092                                         zm_debug_msg0("Countermeasure : Create New Timer ");
1093                                 }
1094
1095                                 wd->TKIP_Group_KeyChanging = 0x1;
1096                                 zfTimerSchedule(dev, ZM_EVENT_SKIP_COUNTERMEASURE, 150);
1097                         }
1098
1099
1100
1101                         //------------------------------------------------------------------------
1102
1103             /* use default key */
1104             //zfCoreSetKey(dev, ZM_USER_KEY_DEFAULT+keyInfo.keyIndex, 0,
1105             //         wd->sta.encryMode, wd->sta.bssid, (u32_t*) keyInfo.key);
1106
1107             if ( encryMode == ZM_TKIP ||
1108                  encryMode == ZM_AES )
1109             {
1110                 zfHpSetDefaultKey(dev, keyInfo.keyIndex, encryMode,
1111                                  (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
1112
1113 #ifdef ZM_ENABLE_IBSS_WPA2PSK
1114             if ( (keyInfo.keyLength==16) && (wd->sta.ibssWpa2Psk==1) )
1115             {/* If not AES-CCMP and ibss network , use traditional */
1116                 wd->sta.wpaState = ZM_STA_WPA_STATE_PK_OK;
1117             }
1118             else
1119             {
1120                 if (wd->sta.wpaState == ZM_STA_WPA_STATE_PK_OK)
1121                     wd->sta.wpaState = ZM_STA_WPA_STATE_GK_OK;
1122                 else
1123                 {
1124                     wd->sta.wpaState = ZM_STA_WPA_STATE_PK_OK;
1125                     wd->sta.encryMode = encryMode;
1126                     wd->ws.encryMode = encryMode;
1127                 }
1128             }
1129 #else
1130                 if (wd->sta.wpaState == ZM_STA_WPA_STATE_PK_OK)
1131                     wd->sta.wpaState = ZM_STA_WPA_STATE_GK_OK;
1132                 else if ( wd->sta.wpaState == ZM_STA_WPA_STATE_INIT )
1133                 {
1134                     wd->sta.wpaState = ZM_STA_WPA_STATE_PK_OK;
1135                     wd->sta.encryMode = encryMode;
1136                     wd->ws.encryMode = encryMode;
1137                 }
1138 #endif
1139             }
1140             else
1141             {
1142                 zfHpSetDefaultKey(dev, keyInfo.keyIndex, encryMode,
1143                                (u32_t*) keyInfo.key, NULL);
1144
1145                 /* Save key for software WEP */
1146                 zfMemoryCopy(wd->sta.wepKey[keyInfo.keyIndex], keyInfo.key,
1147                         keyInfo.keyLength);
1148
1149                 /* TODO: Check whether we need to save the SWEncryMode */
1150                 wd->sta.SWEncryMode[keyInfo.keyIndex] = encryMode;
1151
1152                 wd->sta.encryMode = encryMode;
1153                 wd->ws.encryMode = encryMode;
1154             }
1155         }
1156     }
1157
1158 //    wd->sta.flagKeyChanging = 1;
1159     return ZM_STATUS_SUCCESS;
1160 }
1161
1162 /* PSEUDO test */
1163 u8_t zfiWlanPSEUDOSetKey(zdev_t* dev, struct zsKeyInfo keyInfo)
1164 {
1165     //u16_t  broadcast[3] = {0xffff, 0xffff, 0xffff};
1166     //u32_t* key;
1167     u8_t   micKey[16];
1168
1169     zmw_get_wlan_dev(dev);
1170
1171     switch (keyInfo.keyLength)
1172     {
1173         case 5:
1174             wd->sta.encryMode = ZM_WEP64;
1175             /* use default key */
1176             zfCoreSetKey(dev, 64, 0, ZM_WEP64, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
1177                           break;
1178
1179         case 13:
1180             wd->sta.encryMode = ZM_WEP128;
1181             /* use default key */
1182             zfCoreSetKey(dev, 64, 0, ZM_WEP128, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
1183                         break;
1184
1185         case 29:
1186             wd->sta.encryMode = ZM_WEP256;
1187             /* use default key */
1188             zfCoreSetKey(dev, 64, 1, ZM_WEP256,  (u16_t *)keyInfo.macAddr, (u32_t*) (&keyInfo.key[16]));
1189             zfCoreSetKey(dev, 64, 0, ZM_WEP256, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
1190                           break;
1191
1192         case 16:
1193             wd->sta.encryMode = ZM_AES;
1194             //zfCoreSetKey(dev, 0, 0, ZM_AES, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
1195             zfCoreSetKey(dev, 64, 0, ZM_AES, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
1196             break;
1197
1198         case 32:
1199 #ifdef ZM_ENABLE_CENC
1200             if (keyInfo.flag & ZM_KEY_FLAG_CENC)
1201             {
1202                 u16_t boardcastAddr[3] = {0xffff, 0xffff, 0xffff};
1203                 u16_t Addr_a[] = { 0x0000, 0x0080, 0x0901};
1204                 u16_t Addr_b[] = { 0x0000, 0x0080, 0x0902};
1205                 /* CENC test: user0,1 and user2 for boardcast */
1206                 wd->sta.encryMode = ZM_CENC;
1207                 zfCoreSetKey(dev, 0, 1, ZM_CENC, (u16_t *)Addr_a, (u32_t*) (&keyInfo.key[16]));
1208                 zfCoreSetKey(dev, 0, 0, ZM_CENC, (u16_t *)Addr_a, (u32_t*) keyInfo.key);
1209
1210                 zfCoreSetKey(dev, 1, 1, ZM_CENC, (u16_t *)Addr_b, (u32_t*) (&keyInfo.key[16]));
1211                 zfCoreSetKey(dev, 1, 0, ZM_CENC, (u16_t *)Addr_b, (u32_t*) keyInfo.key);
1212
1213                 zfCoreSetKey(dev, 2, 1, ZM_CENC, (u16_t *)boardcastAddr, (u32_t*) (&keyInfo.key[16]));
1214                 zfCoreSetKey(dev, 2, 0, ZM_CENC, (u16_t *)boardcastAddr, (u32_t*) keyInfo.key);
1215
1216                 /* Initialize PN sequence */
1217                 wd->sta.txiv[0] = 0x5c365c36;
1218                 wd->sta.txiv[1] = 0x5c365c36;
1219                 wd->sta.txiv[2] = 0x5c365c36;
1220                 wd->sta.txiv[3] = 0x5c365c36;
1221             }
1222             else
1223 #endif //ZM_ENABLE_CENC
1224             {
1225                 wd->sta.encryMode = ZM_TKIP;
1226                 zfCoreSetKey(dev, 64, 1, ZM_TKIP, (u16_t *)keyInfo.macAddr, (u32_t*) micKey);
1227                 zfCoreSetKey(dev, 64, 0, ZM_TKIP, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
1228             }
1229             break;
1230         default:
1231             wd->sta.encryMode = ZM_NO_WEP;
1232     }
1233
1234     return ZM_STATUS_SUCCESS;
1235 }
1236
1237 void zfiWlanSetPowerSaveMode(zdev_t* dev, u8_t mode)
1238 {
1239 #if 0
1240     zmw_get_wlan_dev(dev);
1241
1242     wd->sta.powerSaveMode = mode;
1243
1244     /* send null data with PwrBit to inform AP */
1245     if ( mode > ZM_STA_PS_NONE )
1246     {
1247         if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
1248         {
1249             zfSendNullData(dev, 1);
1250         }
1251
1252         /* device into PS mode */
1253         zfPSDeviceSleep(dev);
1254     }
1255 #endif
1256
1257     zfPowerSavingMgrSetMode(dev, mode);
1258 }
1259
1260 void zfiWlanSetMacAddress(zdev_t* dev, u16_t* mac)
1261 {
1262     zmw_get_wlan_dev(dev);
1263
1264     wd->macAddr[0] = mac[0];
1265     wd->macAddr[1] = mac[1];
1266     wd->macAddr[2] = mac[2];
1267
1268     zfHpSetMacAddress(dev, mac, 0);
1269 }
1270
1271 u8_t zfiWlanQueryWlanMode(zdev_t* dev)
1272 {
1273     zmw_get_wlan_dev(dev);
1274
1275     return wd->wlanMode;
1276 }
1277
1278 u8_t zfiWlanQueryAdapterState(zdev_t* dev)
1279 {
1280     zmw_get_wlan_dev(dev);
1281
1282     return wd->state;
1283 }
1284
1285 u8_t zfiWlanQueryAuthenticationMode(zdev_t* dev, u8_t bWrapper)
1286 {
1287     u8_t   authMode;
1288
1289     zmw_get_wlan_dev(dev);
1290
1291     if ( bWrapper )
1292     {
1293         authMode = wd->ws.authMode;
1294     }
1295     else
1296     {
1297         //authMode = wd->sta.authMode;
1298         authMode = wd->sta.currentAuthMode;
1299     }
1300
1301     return authMode;
1302 }
1303
1304 u8_t zfiWlanQueryWepStatus(zdev_t* dev, u8_t bWrapper)
1305 {
1306     u8_t wepStatus;
1307
1308     zmw_get_wlan_dev(dev);
1309
1310     if ( bWrapper )
1311     {
1312         wepStatus = wd->ws.wepStatus;
1313     }
1314     else
1315     {
1316         wepStatus = wd->sta.wepStatus;
1317     }
1318
1319     return wepStatus;
1320 }
1321
1322 void zfiWlanQuerySSID(zdev_t* dev, u8_t* ssid, u8_t* pSsidLength)
1323 {
1324     u16_t vapId = 0;
1325     zmw_get_wlan_dev(dev);
1326
1327     if (wd->wlanMode == ZM_MODE_AP)
1328     {
1329         vapId = zfwGetVapId(dev);
1330
1331         if (vapId == 0xffff)
1332         {
1333             *pSsidLength = wd->ap.ssidLen[0];
1334             zfMemoryCopy(ssid, wd->ap.ssid[0], wd->ap.ssidLen[0]);
1335         }
1336         else
1337         {
1338             *pSsidLength = wd->ap.ssidLen[vapId + 1];
1339             zfMemoryCopy(ssid, wd->ap.ssid[vapId + 1], wd->ap.ssidLen[vapId + 1]);
1340         }
1341     }
1342     else
1343     {
1344         *pSsidLength = wd->sta.ssidLen;
1345         zfMemoryCopy(ssid, wd->sta.ssid, wd->sta.ssidLen);
1346     }
1347 }
1348
1349 u16_t zfiWlanQueryFragThreshold(zdev_t* dev)
1350 {
1351     zmw_get_wlan_dev(dev);
1352
1353     return wd->fragThreshold;
1354 }
1355
1356 u16_t zfiWlanQueryRtsThreshold(zdev_t* dev)
1357 {
1358     zmw_get_wlan_dev(dev);
1359
1360     return wd->rtsThreshold;
1361 }
1362
1363 u32_t zfiWlanQueryFrequency(zdev_t* dev)
1364 {
1365     zmw_get_wlan_dev(dev);
1366
1367     return (wd->frequency*1000);
1368 }
1369
1370 /***********************************************************
1371  * Function: zfiWlanQueryCurrentFrequency
1372  * Return value:
1373  *   -   0 : no validate current frequency
1374  *   - (>0): current frequency depend on "qmode"
1375  * Input:
1376  *   - qmode:
1377  *      0: return value depend on the support mode, this
1378            qmode is use to solve the bug #31223
1379  *      1: return the actually current frequency
1380  ***********************************************************/
1381 u32_t zfiWlanQueryCurrentFrequency(zdev_t* dev, u8_t qmode)
1382 {
1383     u32_t frequency;
1384
1385     zmw_get_wlan_dev(dev);
1386
1387     switch (qmode)
1388     {
1389     case 0:
1390         if (wd->sta.currentFrequency > 3000)
1391         {
1392             if (wd->supportMode & ZM_WIRELESS_MODE_5)
1393             {
1394                 frequency = wd->sta.currentFrequency;
1395             }
1396             else if (wd->supportMode & ZM_WIRELESS_MODE_24)
1397             {
1398                 frequency = zfChGetFirst2GhzChannel(dev);
1399             }
1400             else
1401             {
1402                 frequency = 0;
1403             }
1404         }
1405         else
1406         {
1407             if (wd->supportMode & ZM_WIRELESS_MODE_24)
1408             {
1409                 frequency = wd->sta.currentFrequency;
1410             }
1411             else if (wd->supportMode & ZM_WIRELESS_MODE_5)
1412             {
1413                 frequency = zfChGetLast5GhzChannel(dev);
1414             }
1415             else
1416             {
1417                 frequency = 0;
1418             }
1419         }
1420         break;
1421
1422     case 1:
1423         frequency = wd->sta.currentFrequency;
1424         break;
1425
1426     default:
1427         frequency = 0;
1428     }
1429
1430     return (frequency*1000);
1431 }
1432
1433 u32_t zfiWlanQueryFrequencyAttribute(zdev_t* dev, u32_t freq)
1434 {
1435     u8_t  i;
1436     u16_t frequency = (u16_t) (freq/1000);
1437     u32_t ret = 0;
1438
1439     zmw_get_wlan_dev(dev);
1440
1441     for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
1442     {
1443         if ( wd->regulationTable.allowChannel[i].channel == frequency )
1444         {
1445             ret = wd->regulationTable.allowChannel[i].channelFlags;
1446         }
1447     }
1448
1449     return ret;
1450 }
1451
1452 /* BandWidth  0=>20  1=>40 */
1453 /* ExtOffset  0=>20  1=>high control 40   3=>low control 40 */
1454 void zfiWlanQueryFrequencyHT(zdev_t* dev, u32_t *bandWidth, u32_t *extOffset)
1455 {
1456     zmw_get_wlan_dev(dev);
1457
1458     *bandWidth = wd->BandWidth40;
1459     *extOffset = wd->ExtOffset;
1460 }
1461
1462 u8_t zfiWlanQueryCWMode(zdev_t* dev)
1463 {
1464     zmw_get_wlan_dev(dev);
1465
1466     return wd->cwm.cw_mode;
1467 }
1468
1469 u32_t zfiWlanQueryCWEnable(zdev_t* dev)
1470 {
1471     zmw_get_wlan_dev(dev);
1472
1473     return wd->cwm.cw_enable;
1474 }
1475
1476 void zfiWlanQueryBssid(zdev_t* dev, u8_t* bssid)
1477 {
1478     u8_t   addr[6];
1479
1480     zmw_get_wlan_dev(dev);
1481
1482     ZM_MAC_WORD_TO_BYTE(wd->sta.bssid, addr);
1483     zfMemoryCopy(bssid, addr, 6);
1484 }
1485
1486 u16_t zfiWlanQueryBeaconInterval(zdev_t* dev)
1487 {
1488     zmw_get_wlan_dev(dev);
1489
1490     return wd->beaconInterval;
1491 }
1492
1493 u32_t zfiWlanQueryRxBeaconTotal(zdev_t* dev)
1494 {
1495     zmw_get_wlan_dev(dev);
1496     wd->sta.rxBeaconTotal += wd->sta.rxBeaconCount;
1497
1498     return wd->sta.rxBeaconTotal;
1499 }
1500
1501 u16_t zfiWlanQueryAtimWindow(zdev_t* dev)
1502 {
1503     u16_t atimWindow;
1504
1505     zmw_get_wlan_dev(dev);
1506
1507     atimWindow = wd->sta.atimWindow;
1508
1509     return atimWindow;
1510 }
1511
1512 u8_t zfiWlanQueryEncryMode(zdev_t* dev)
1513 {
1514     zmw_get_wlan_dev(dev);
1515
1516     if (wd->wlanMode == ZM_MODE_AP)
1517         return wd->ap.encryMode[0];
1518     else
1519         return wd->sta.encryMode;
1520 }
1521
1522 u16_t zfiWlanQueryCapability(zdev_t* dev)
1523 {
1524     u16_t capability;
1525
1526     zmw_get_wlan_dev(dev);
1527
1528     capability = wd->sta.capability[0] +
1529                  (((u16_t) wd->sta.capability[1]) << 8);
1530
1531     return capability;
1532
1533 }
1534
1535 u16_t zfiWlanQueryAid(zdev_t* dev)
1536 {
1537     zmw_get_wlan_dev(dev);
1538
1539     return wd->sta.aid;
1540 }
1541
1542 void zfiWlanQuerySupportRate(zdev_t* dev, u8_t* rateArray, u8_t* pLength)
1543 {
1544     u8_t   i, j=0;
1545
1546     zmw_get_wlan_dev(dev);
1547
1548     for( i=0; i<4; i++ )
1549     {
1550         if ( wd->bRate & (0x1 << i) )
1551         {
1552             rateArray[j] = zg11bRateTbl[i] +
1553                            ((wd->bRateBasic & (0x1<<i))<<(7-i));
1554             j++;
1555         }
1556     }
1557
1558     *pLength = j;
1559 }
1560
1561 void zfiWlanQueryExtSupportRate(zdev_t* dev, u8_t* rateArray, u8_t* pLength)
1562 {
1563     u8_t   i, j=0;
1564
1565     zmw_get_wlan_dev(dev);
1566
1567     for( i=0; i<8; i++ )
1568     {
1569         if ( wd->gRate & (0x1 << i) )
1570         {
1571             rateArray[j] = zg11gRateTbl[i] +
1572                            ((wd->gRateBasic & (0x1<<i))<<(7-i));
1573             j++;
1574         }
1575     }
1576
1577     *pLength = j;
1578 }
1579
1580 void zfiWlanQueryRsnIe(zdev_t* dev, u8_t* ie, u8_t* pLength)
1581 {
1582     u8_t len;
1583
1584     zmw_get_wlan_dev(dev);
1585
1586     len = wd->sta.rsnIe[1] + 2;
1587     zfMemoryCopy(ie, wd->sta.rsnIe, len);
1588     *pLength = len;
1589 }
1590
1591 void zfiWlanQueryWpaIe(zdev_t* dev, u8_t* ie, u8_t* pLength)
1592 {
1593     u8_t len;
1594
1595     zmw_get_wlan_dev(dev);
1596
1597     len = wd->sta.wpaIe[1] + 2;
1598     zfMemoryCopy(ie, wd->sta.wpaIe, len);
1599     *pLength = len;
1600
1601 }
1602
1603 u8_t zfiWlanQueryMulticastCipherAlgo(zdev_t *dev)
1604 {
1605     zmw_get_wlan_dev(dev);
1606
1607     switch( wd->sta.currentAuthMode )
1608     {
1609         case ZM_AUTH_MODE_WPA2PSK:
1610         case ZM_AUTH_MODE_WPA2:
1611             if ( wd->sta.rsnIe[7] == 2 )
1612             {
1613                 return ZM_TKIP;
1614             }
1615             else
1616             {
1617                 return ZM_AES;
1618             }
1619             break;
1620
1621         case ZM_AUTH_MODE_WPAPSK:
1622         case ZM_AUTH_MODE_WPA:
1623             if ( wd->sta.rsnIe[11] == 2 )
1624             {
1625                 return ZM_TKIP;
1626             }
1627             else
1628             {
1629                 return ZM_AES;
1630             }
1631             break;
1632
1633         default:
1634             return wd->sta.encryMode;
1635     }
1636 }
1637
1638 u8_t zfiWlanQueryHTMode(zdev_t* dev)
1639 {
1640     zmw_get_wlan_dev(dev);
1641     // 0:Legancy, 1:N
1642     return wd->sta.EnableHT;
1643 }
1644
1645 u8_t zfiWlanQueryBandWidth40(zdev_t* dev)
1646 {
1647     zmw_get_wlan_dev(dev);
1648     // 0:20M, 1:40M
1649     return wd->BandWidth40;
1650 }
1651
1652 u16_t zfiWlanQueryRegionCode(zdev_t* dev)
1653 {
1654     zmw_get_wlan_dev(dev);
1655
1656     return wd->regulationTable.regionCode;
1657 }
1658 void zfiWlanSetWpaIe(zdev_t* dev, u8_t* ie, u8_t Length)
1659 {
1660     u16_t vapId = 0;
1661     zmw_get_wlan_dev(dev);
1662
1663     if (wd->wlanMode == ZM_MODE_AP) // AP Mode
1664     {
1665         vapId = zfwGetVapId(dev);
1666
1667         if (vapId == 0xffff)
1668             vapId = 0;
1669         else
1670             vapId++;
1671
1672         zm_assert(Length < ZM_MAX_WPAIE_SIZE);
1673         if (Length < ZM_MAX_WPAIE_SIZE)
1674         {
1675             wd->ap.wpaLen[vapId] = Length;
1676             zfMemoryCopy(wd->ap.wpaIe[vapId], ie, wd->ap.wpaLen[vapId]);
1677         }
1678
1679     }
1680     else
1681     {
1682         wd->sta.wpaLen = Length;
1683         zfMemoryCopy(wd->sta.wpaIe, ie, wd->sta.wpaLen);
1684     }
1685     //zfiWlanSetWpaSupport(dev, 1);
1686     if (wd->wlanMode == ZM_MODE_AP) // AP Mode
1687     {
1688         wd->ap.wpaSupport[vapId] = 1;
1689     }
1690     else
1691     {
1692         wd->sta.wpaSupport = 1;
1693     }
1694
1695 }
1696
1697 void zfiWlanSetWpaSupport(zdev_t* dev, u8_t WpaSupport)
1698 {
1699     u16_t vapId = 0;
1700     zmw_get_wlan_dev(dev);
1701
1702     if (wd->wlanMode == ZM_MODE_AP) // AP Mode
1703     {
1704         vapId = zfwGetVapId(dev);
1705
1706         if (vapId == 0xffff)
1707             vapId = 0;
1708         else
1709             vapId++;
1710
1711         wd->ap.wpaSupport[vapId] = WpaSupport;
1712     }
1713     else
1714     {
1715         wd->sta.wpaSupport = WpaSupport;
1716     }
1717
1718 }
1719
1720 void zfiWlanSetProtectionMode(zdev_t* dev, u8_t mode)
1721 {
1722     zmw_get_wlan_dev(dev);
1723
1724     wd->sta.bProtectionMode = mode;
1725     if (wd->sta.bProtectionMode == TRUE)
1726     {
1727         zfHpSetSlotTime(dev, 0);
1728     }
1729     else
1730     {
1731         zfHpSetSlotTime(dev, 1);
1732     }
1733
1734     zm_msg1_mm(ZM_LV_1, "wd->protectionMode=", wd->sta.bProtectionMode);
1735 }
1736
1737 void zfiWlanSetBasicRate(zdev_t* dev, u8_t bRateSet, u8_t gRateSet,
1738                          u32_t nRateSet)
1739 {
1740     zmw_get_wlan_dev(dev);
1741
1742     wd->ws.bRateBasic = bRateSet;
1743     wd->ws.gRateBasic = gRateSet;
1744     wd->ws.nRateBasic = nRateSet;
1745 }
1746
1747 void zfiWlanSetBGMode(zdev_t* dev, u8_t mode)
1748 {
1749     zmw_get_wlan_dev(dev);
1750
1751     wd->ws.bgMode = mode;
1752 }
1753
1754 void zfiWlanSetpreambleType(zdev_t* dev, u8_t type)
1755 {
1756     zmw_get_wlan_dev(dev);
1757
1758     wd->ws.preambleType = type;
1759 }
1760
1761 u8_t zfiWlanQuerypreambleType(zdev_t* dev)
1762 {
1763     zmw_get_wlan_dev(dev);
1764
1765     return wd->ws.preambleType;
1766 }
1767
1768 u8_t zfiWlanQueryPowerSaveMode(zdev_t* dev)
1769 {
1770     zmw_get_wlan_dev(dev);
1771
1772     return wd->sta.powerSaveMode;
1773 }
1774
1775 u8_t zfiWlanSetPmkidInfo(zdev_t* dev, u16_t* bssid, u8_t* pmkid)
1776 {
1777     u32_t  i;
1778
1779     zmw_get_wlan_dev(dev);
1780
1781     for(i=0; i<wd->sta.pmkidInfo.bssidCount; i++)
1782     {
1783         if ( zfMemoryIsEqual((u8_t*) wd->sta.pmkidInfo.bssidInfo[i].bssid,
1784                              (u8_t*) bssid, 6) )
1785         {
1786             /* matched */
1787             break;
1788         }
1789     }
1790
1791     if ( i < wd->sta.pmkidInfo.bssidCount )
1792     {
1793         /* overwrite the original one */
1794         zfMemoryCopy(wd->sta.pmkidInfo.bssidInfo[i].pmkid, pmkid, 16);
1795     }
1796     else
1797     {
1798         if ( i < ZM_PMKID_MAX_BSS_CNT )
1799         {
1800             wd->sta.pmkidInfo.bssidInfo[i].bssid[0] = bssid[0];
1801             wd->sta.pmkidInfo.bssidInfo[i].bssid[1] = bssid[1];
1802             wd->sta.pmkidInfo.bssidInfo[i].bssid[2] = bssid[2];
1803
1804             zfMemoryCopy(wd->sta.pmkidInfo.bssidInfo[i].pmkid, pmkid, 16);
1805             wd->sta.pmkidInfo.bssidCount++;
1806         }
1807     }
1808
1809     return 0;
1810 }
1811
1812 u32_t zfiWlanQueryPmkidInfo(zdev_t* dev, u8_t* buf, u32_t len)
1813 {
1814     //struct zsPmkidInfo* pPmkidInfo = ( struct zsPmkidInfo* ) buf;
1815     u32_t  size;
1816
1817     zmw_get_wlan_dev(dev);
1818
1819     size = sizeof(u32_t) +
1820            wd->sta.pmkidInfo.bssidCount * sizeof(struct zsPmkidBssidInfo);
1821
1822     if ( len < size )
1823     {
1824         return wd->sta.pmkidInfo.bssidCount;
1825     }
1826
1827     zfMemoryCopy(buf, (u8_t*) &wd->sta.pmkidInfo, (u16_t) size);
1828
1829     return 0;
1830 }
1831
1832 void zfiWlanSetMulticastList(zdev_t* dev, u8_t size, u8_t* pList)
1833 {
1834     struct zsMulticastAddr* pMacList = (struct zsMulticastAddr*) pList;
1835     u8_t   i;
1836     u8_t   bAllMulticast = 0;
1837     //u32_t  value;
1838
1839     zmw_get_wlan_dev(dev);
1840
1841     wd->sta.multicastList.size = size;
1842     for(i=0; i<size; i++)
1843     {
1844         zfMemoryCopy(wd->sta.multicastList.macAddr[i].addr,
1845                      pMacList[i].addr, 6);
1846     }
1847
1848     if ( wd->sta.osRxFilter & ZM_PACKET_TYPE_ALL_MULTICAST )
1849         bAllMulticast = 1;
1850     zfHpSetMulticastList(dev, size, pList, bAllMulticast);
1851
1852 }
1853
1854 void zfiWlanRemoveKey(zdev_t* dev, u8_t keyType, u8_t keyId)
1855 {
1856     u16_t  fakeMacAddr[3] = {0, 0, 0};
1857     u32_t  fakeKey[4] = {0, 0, 0, 0};
1858
1859     zmw_get_wlan_dev(dev);
1860
1861     if ( keyType == 0 )
1862     {
1863         /* remove WEP key */
1864         zm_debug_msg0("remove WEP key");
1865         zfCoreSetKey(dev, ZM_USER_KEY_DEFAULT+keyId, 0,
1866                  ZM_NO_WEP, fakeMacAddr, fakeKey);
1867         wd->sta.encryMode = ZM_NO_WEP;
1868     }
1869     else if ( keyType == 1 )
1870     {
1871         /* remove pairwise key */
1872         zm_debug_msg0("remove pairwise key");
1873         zfHpRemoveKey(dev, ZM_USER_KEY_PK);
1874         wd->sta.encryMode = ZM_NO_WEP;
1875     }
1876     else
1877     {
1878         /* remove group key */
1879         zm_debug_msg0("remove group key");
1880         zfHpRemoveKey(dev, ZM_USER_KEY_GK);
1881     }
1882 }
1883
1884
1885 void zfiWlanQueryRegulationTable(zdev_t* dev, struct zsRegulationTable* pEntry)
1886 {
1887     zmw_get_wlan_dev(dev);
1888
1889     zfMemoryCopy((u8_t*) pEntry, (u8_t*) &wd->regulationTable,
1890                  sizeof(struct zsRegulationTable));
1891 }
1892
1893 /* parameter "time" is specified in ms */
1894 void zfiWlanSetScanTimerPerChannel(zdev_t* dev, u16_t time)
1895 {
1896     zmw_get_wlan_dev(dev);
1897
1898     zm_debug_msg1("scan time (ms) = ", time);
1899
1900     wd->sta.activescanTickPerChannel = time / ZM_MS_PER_TICK;
1901 }
1902
1903 void zfiWlanSetAutoReconnect(zdev_t* dev, u8_t enable)
1904 {
1905     zmw_get_wlan_dev(dev);
1906
1907     wd->sta.bAutoReconnect = enable;
1908     //wd->sta.bAutoReconnectEnabled = enable;
1909 }
1910
1911 void zfiWlanSetStaWme(zdev_t* dev, u8_t enable, u8_t uapsdInfo)
1912 {
1913     zmw_get_wlan_dev(dev);
1914
1915     wd->ws.staWmeEnabled = enable & 0x3;
1916     if ((enable & 0x2) != 0)
1917     {
1918         wd->ws.staWmeQosInfo = uapsdInfo & 0x6f;
1919     }
1920     else
1921     {
1922         wd->ws.staWmeQosInfo = 0;
1923     }
1924 }
1925
1926 void zfiWlanSetApWme(zdev_t* dev, u8_t enable)
1927 {
1928     zmw_get_wlan_dev(dev);
1929
1930     wd->ws.apWmeEnabled = enable;
1931 }
1932
1933 u8_t zfiWlanQuerywmeEnable(zdev_t* dev)
1934 {
1935     zmw_get_wlan_dev(dev);
1936
1937     return wd->ws.staWmeEnabled;
1938 }
1939
1940 void zfiWlanSetProbingHiddenSsid(zdev_t* dev, u8_t* ssid, u8_t ssidLen,
1941     u16_t entry)
1942 {
1943     zmw_get_wlan_dev(dev);
1944     zmw_declare_for_critical_section();
1945
1946
1947     if ((ssidLen <= 32) && (entry < ZM_MAX_PROBE_HIDDEN_SSID_SIZE))
1948     {
1949         zmw_enter_critical_section(dev);
1950         wd->ws.probingSsidList[entry].ssidLen = ssidLen;
1951         zfMemoryCopy(wd->ws.probingSsidList[entry].ssid, ssid, ssidLen);
1952         zmw_leave_critical_section(dev);
1953     }
1954
1955     return;
1956 }
1957
1958 void zfiWlanSetDisableProbingWithSsid(zdev_t* dev, u8_t mode)
1959 {
1960     zmw_get_wlan_dev(dev);
1961
1962     wd->sta.disableProbingWithSsid = mode;
1963
1964     return;
1965 }
1966
1967 void zfiWlanSetDropUnencryptedPackets(zdev_t* dev, u8_t enable)
1968 {
1969     zmw_get_wlan_dev(dev);
1970
1971     wd->ws.dropUnencryptedPkts = enable;
1972 }
1973
1974 void zfiWlanSetStaRxSecurityCheckCb(zdev_t* dev, zfpStaRxSecurityCheckCb pStaRxSecurityCheckCb)
1975 {
1976     zmw_get_wlan_dev(dev);
1977
1978     wd->sta.pStaRxSecurityCheckCb = pStaRxSecurityCheckCb;
1979 }
1980
1981 void zfiWlanSetIBSSJoinOnly(zdev_t* dev, u8_t joinOnly)
1982 {
1983     zmw_get_wlan_dev(dev);
1984
1985     wd->ws.ibssJoinOnly = joinOnly;
1986 }
1987
1988 /************************************************************************/
1989 /*                                                                      */
1990 /*    FUNCTION DESCRIPTION                  zfiConfigWdsPort            */
1991 /*      Configure WDS port.                                             */
1992 /*                                                                      */
1993 /*    INPUTS                                                            */
1994 /*      dev : device pointer                                            */
1995 /*      wdsPortId : WDS port ID, start from 0                           */
1996 /*      flag : 0=>disable WDS port, 1=>enable WDS port                  */
1997 /*      wdsAddr : WDS neighbor MAC address                              */
1998 /*      encType : encryption type for WDS port                          */
1999 /*      wdsKey : encryption key for WDS port                            */
2000 /*                                                                      */
2001 /*    OUTPUTS                                                           */
2002 /*      Error code                                                      */
2003 /*                                                                      */
2004 /*    AUTHOR                                                            */
2005 /*      Stephen Chen        ZyDAS Technology Corporation    2006.6      */
2006 /*                                                                      */
2007 /************************************************************************/
2008 u16_t zfiConfigWdsPort(zdev_t* dev, u8_t wdsPortId, u16_t flag, u16_t* wdsAddr,
2009         u16_t encType, u32_t* wdsKey)
2010 {
2011     u16_t addr[3];
2012     u32_t key[4];
2013
2014     zmw_get_wlan_dev(dev);
2015
2016     if (wdsPortId >= ZM_MAX_WDS_SUPPORT)
2017     {
2018         return ZM_ERR_WDS_PORT_ID;
2019     }
2020
2021     if (flag == 1)
2022     {
2023         /* Enable WDS port */
2024         wd->ap.wds.macAddr[wdsPortId][0] = wdsAddr[0];
2025         wd->ap.wds.macAddr[wdsPortId][1] = wdsAddr[1];
2026         wd->ap.wds.macAddr[wdsPortId][2] = wdsAddr[2];
2027
2028         wd->ap.wds.wdsBitmap |= (1 << wdsPortId);
2029         wd->ap.wds.encryMode[wdsPortId] = (u8_t) encType;
2030
2031         zfCoreSetKey(dev, 10+ZM_MAX_WDS_SUPPORT, 0, (u8_t) encType, wdsAddr, wdsKey);
2032     }
2033     else
2034     {
2035         /* Disable WDS port */
2036         addr[0] = addr[1] = addr[2] = 0;
2037         key[0] = key[1] = key[2] = key[3] = 0;
2038         wd->ap.wds.wdsBitmap &= (~(1 << wdsPortId));
2039         zfCoreSetKey(dev, 10+ZM_MAX_WDS_SUPPORT, 0, ZM_NO_WEP, addr, key);
2040     }
2041
2042     return ZM_SUCCESS;
2043 }
2044 #ifdef ZM_ENABLE_CENC
2045 /* CENC */
2046 void zfiWlanQueryGSN(zdev_t* dev, u8_t *gsn, u16_t vapId)
2047 {
2048     //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev);
2049     u32_t txiv[4];
2050     zmw_get_wlan_dev(dev);
2051
2052     /* convert little endian to big endian for 32 bits */
2053     txiv[3] = wd->ap.txiv[vapId][0];
2054     txiv[2] = wd->ap.txiv[vapId][1];
2055     txiv[1] = wd->ap.txiv[vapId][2];
2056     txiv[0] = wd->ap.txiv[vapId][3];
2057
2058     zfMemoryCopy(gsn, (u8_t*)txiv, 16);
2059 }
2060 #endif //ZM_ENABLE_CENC
2061 //CWYang(+)
2062 void zfiWlanQuerySignalInfo(zdev_t* dev, u8_t *buffer)
2063 {
2064     zmw_get_wlan_dev(dev);
2065
2066     /*Change Signal Strength/Quality Value to Human Sense Here*/
2067
2068     buffer[0] = wd->SignalStrength;
2069     buffer[1] = wd->SignalQuality;
2070 }
2071
2072 /* OS-XP */
2073 u16_t zfiStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType)
2074 {
2075     return  zfStaAddIeWpaRsn(dev, buf, offset, frameType);
2076 }
2077
2078 /* zfiDebugCmd                                                                        */
2079 /*     cmd       value-description                                                  */
2080 /*         0       schedule timer                                                     */
2081 /*         1       cancel timer                                                         */
2082 /*         2       clear timer                                                           */
2083 /*         3       test timer                                                            */
2084 /*         4                                                                                 */
2085 /*         5                                                                                 */
2086 /*         6       checksum test     0/1                                           */
2087 /*         7       enableProtectionMode                                          */
2088 /*         8       rx packet content dump    0/1                               */
2089
2090 u32_t zfiDebugCmd(zdev_t* dev, u32_t cmd, u32_t value)
2091 {
2092     u16_t event;
2093     u32_t tick;
2094     zmw_get_wlan_dev(dev);
2095
2096     zmw_declare_for_critical_section();
2097
2098
2099     zmw_enter_critical_section(dev);
2100
2101     if ( cmd == 0 )
2102     {   /* schedule timer */
2103         event = (u16_t) ((value >> 16) & 0xffff);
2104         tick = value & 0xffff;
2105         zfTimerSchedule(dev, event, tick);
2106     }
2107     else if ( cmd == 1 )
2108     {   /* cancel timer */
2109         event = (u16_t) (value & 0xffff);
2110         zfTimerCancel(dev, event);
2111     }
2112     else if ( cmd == 2 )
2113     {   /* clear timer */
2114         zfTimerClear(dev);
2115     }
2116     else if ( cmd == 3 )
2117     {   /* test timer */
2118         zfTimerSchedule(dev, 1,  500);
2119         zfTimerSchedule(dev, 2, 1000);
2120         zfTimerSchedule(dev, 3, 1000);
2121         zfTimerSchedule(dev, 4, 1000);
2122         zfTimerSchedule(dev, 5, 1500);
2123         zfTimerSchedule(dev, 6, 2000);
2124         zfTimerSchedule(dev, 7, 2200);
2125         zfTimerSchedule(dev, 6, 2500);
2126         zfTimerSchedule(dev, 8, 2800);
2127     }
2128     else if ( cmd == 4)
2129     {
2130         zfTimerSchedule(dev, 1,  500);
2131         zfTimerSchedule(dev, 2, 1000);
2132         zfTimerSchedule(dev, 3, 1000);
2133         zfTimerSchedule(dev, 4, 1000);
2134         zfTimerSchedule(dev, 5, 1500);
2135         zfTimerSchedule(dev, 6, 2000);
2136         zfTimerSchedule(dev, 7, 2200);
2137         zfTimerSchedule(dev, 6, 2500);
2138         zfTimerSchedule(dev, 8, 2800);
2139         zfTimerCancel(dev, 1);
2140         zfTimerCancel(dev, 3);
2141         zfTimerCancel(dev, 6);
2142     }
2143     else if ( cmd == 5 )
2144     {
2145         wd->sta.keyId = (u8_t) value;
2146     }
2147         else if ( cmd == 6 )
2148         {
2149             /* 0: normal    1: always set TCP/UDP checksum zero */
2150         wd->checksumTest = value;
2151         }
2152         else if ( cmd == 7 )
2153         {
2154         wd->enableProtectionMode = value;
2155             zm_msg1_mm(ZM_LV_1, "wd->enableProtectionMode=", wd->enableProtectionMode);
2156         }
2157         else if ( cmd == 8 )
2158         {
2159         /* rx packet content dump */
2160         if (value)
2161         {
2162             wd->rxPacketDump = 1;
2163         }
2164         else
2165         {
2166             wd->rxPacketDump = 0;
2167         }
2168         }
2169
2170
2171     zmw_leave_critical_section(dev);
2172
2173     return 0;
2174 }
2175
2176 #ifdef ZM_ENABLE_CENC
2177 u8_t zfiWlanSetCencPairwiseKey(zdev_t* dev, u8_t keyid, u32_t *txiv, u32_t *rxiv,
2178         u8_t *key, u8_t *mic)
2179 {
2180     struct zsKeyInfo keyInfo;
2181     u8_t cencKey[32];
2182     u8_t i;
2183     u16_t macAddr[3];
2184
2185     zmw_get_wlan_dev(dev);
2186
2187     for (i = 0; i < 16; i++)
2188         cencKey[i] = key[i];
2189     for (i = 0; i < 16; i++)
2190         cencKey[i + 16] = mic[i];
2191     keyInfo.key = cencKey;
2192     keyInfo.keyLength = 32;
2193     keyInfo.keyIndex = keyid;
2194     keyInfo.flag = ZM_KEY_FLAG_CENC | ZM_KEY_FLAG_PK;
2195     for (i = 0; i < 3; i++)
2196         macAddr[i] = wd->sta.bssid[i];
2197     keyInfo.macAddr = macAddr;
2198
2199     zfiWlanSetKey(dev, keyInfo);
2200
2201     /* Reset txiv and rxiv */
2202     //wd->sta.txiv[0] = txiv[0];
2203     //wd->sta.txiv[1] = txiv[1];
2204     //wd->sta.txiv[2] = txiv[2];
2205     //wd->sta.txiv[3] = txiv[3];
2206     //
2207     //wd->sta.rxiv[0] = rxiv[0];
2208     //wd->sta.rxiv[1] = rxiv[1];
2209     //wd->sta.rxiv[2] = rxiv[2];
2210     //wd->sta.rxiv[3] = rxiv[3];
2211
2212     return 0;
2213 }
2214
2215 u8_t zfiWlanSetCencGroupKey(zdev_t* dev, u8_t keyid, u32_t *rxiv,
2216         u8_t *key, u8_t *mic)
2217 {
2218     struct zsKeyInfo keyInfo;
2219     u8_t cencKey[32];
2220     u8_t i;
2221     u16_t macAddr[6] = {0xffff, 0xffff, 0xffff};
2222
2223     zmw_get_wlan_dev(dev);
2224
2225     for (i = 0; i < 16; i++)
2226         cencKey[i] = key[i];
2227     for (i = 0; i < 16; i++)
2228         cencKey[i + 16] = mic[i];
2229     keyInfo.key = cencKey;
2230     keyInfo.keyLength = 32;
2231     keyInfo.keyIndex = keyid;
2232     keyInfo.flag = ZM_KEY_FLAG_CENC | ZM_KEY_FLAG_GK;
2233     keyInfo.vapId = 0;
2234     for (i = 0; i < 3; i++)
2235         keyInfo.vapAddr[i] = wd->macAddr[i];
2236     keyInfo.macAddr = macAddr;
2237
2238     zfiWlanSetKey(dev, keyInfo);
2239
2240     /* Reset txiv and rxiv */
2241     wd->sta.rxivGK[0] = ((rxiv[3] >> 24) & 0xFF)
2242                       + (((rxiv[3] >> 16) & 0xFF) << 8)
2243                       + (((rxiv[3] >> 8) & 0xFF) << 16)
2244                       + ((rxiv[3] & 0xFF) << 24);
2245     wd->sta.rxivGK[1] = ((rxiv[2] >> 24) & 0xFF)
2246                       + (((rxiv[2] >> 16) & 0xFF) << 8)
2247                       + (((rxiv[2] >> 8) & 0xFF) << 16)
2248                       + ((rxiv[2] & 0xFF) << 24);
2249     wd->sta.rxivGK[2] = ((rxiv[1] >> 24) & 0xFF)
2250                       + (((rxiv[1] >> 16) & 0xFF) << 8)
2251                       + (((rxiv[1] >> 8) & 0xFF) << 16)
2252                       + ((rxiv[1] & 0xFF) << 24);
2253     wd->sta.rxivGK[3] = ((rxiv[0] >> 24) & 0xFF)
2254                       + (((rxiv[0] >> 16) & 0xFF) << 8)
2255                       + (((rxiv[0] >> 8) & 0xFF) << 16)
2256                       + ((rxiv[0] & 0xFF) << 24);
2257
2258     wd->sta.authMode = ZM_AUTH_MODE_CENC;
2259     wd->sta.currentAuthMode = ZM_AUTH_MODE_CENC;
2260
2261     return 0;
2262 }
2263 #endif //ZM_ENABLE_CENC
2264
2265 u8_t zfiWlanSetDot11DMode(zdev_t* dev, u8_t mode)
2266 {
2267     u8_t i;
2268
2269     zmw_get_wlan_dev(dev);
2270
2271     wd->sta.b802_11D = mode;
2272     if (mode) //Enable 802.11d
2273     {
2274         wd->regulationTable.regionCode = NO_ENUMRD;
2275         for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
2276             wd->regulationTable.allowChannel[i].channelFlags |= ZM_REG_FLAG_CHANNEL_PASSIVE;
2277     }
2278     else //Disable
2279     {
2280         for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
2281             wd->regulationTable.allowChannel[i].channelFlags &= ~ZM_REG_FLAG_CHANNEL_PASSIVE;
2282     }
2283
2284     return 0;
2285 }
2286
2287 u8_t zfiWlanSetDot11HDFSMode(zdev_t* dev, u8_t mode)
2288 {
2289     zmw_get_wlan_dev(dev);
2290
2291     //zm_debug_msg0("CWY - Enable 802.11h DFS");
2292
2293     // TODO : DFS Enable in 5250 to 5350 MHz and 5470 to 5725 MHz .
2294     //if ( Adapter->ZD80211HSupport &&
2295     //   Adapter->CardSetting.NetworkTypeInUse == Ndis802_11OFDM5 &&
2296     //   ((ChannelNo >=52 && ChannelNo <= 64)   ||                              //5250~5350 MHZ
2297     //    (ChannelNo >=100 && ChannelNo <= 140)))                       //5470~5725 MHZ
2298     //{
2299     //   Adapter->ZD80211HSetting.DFSEnable=TRUE;
2300     //}
2301     //else
2302     //{
2303     //   Adapter->ZD80211HSetting.DFSEnable=FALSE;
2304     //}
2305
2306     wd->sta.DFSEnable = mode;
2307     if (mode)
2308         wd->sta.capability[1] |= ZM_BIT_0;
2309     else
2310         wd->sta.capability[1] &= (~ZM_BIT_0);
2311
2312     return 0;
2313 }
2314
2315 u8_t zfiWlanSetDot11HTPCMode(zdev_t* dev, u8_t mode)
2316 {
2317     zmw_get_wlan_dev(dev);
2318
2319     // TODO : TPC Enable in 5150~5350 MHz and 5470~5725MHz.
2320     //if ( Adapter->ZD80211HSupport &&
2321     //   Adapter->CardSetting.NetworkTypeInUse == Ndis802_11OFDM5 &&
2322     //   ((ChannelNo == 36 || ChannelNo == 40 || ChannelNo == 44 || ChannelNo == 48) || //5150~5250 MHZ , Not Japan
2323     //    (ChannelNo >=52 && ChannelNo <= 64) ||                                //5250~5350 MHZ
2324     //    (ChannelNo >=100 && ChannelNo <= 140)))                       //5470~5725 MHZ
2325     //{
2326     //   Adapter->ZD80211HSetting.TPCEnable=TRUE;
2327     //}
2328     //else
2329     //{
2330     //   Adapter->ZD80211HSetting.TPCEnable=FALSE;
2331     //}
2332
2333     wd->sta.TPCEnable = mode;
2334     if (mode)
2335         wd->sta.capability[1] |= ZM_BIT_0;
2336     else
2337         wd->sta.capability[1] &= (~ZM_BIT_0);
2338
2339     return 0;
2340 }
2341
2342 u8_t zfiWlanSetAniMode(zdev_t* dev, u8_t mode)
2343 {
2344     zmw_get_wlan_dev(dev);
2345
2346     wd->aniEnable = mode;
2347     if (mode)
2348         zfHpAniAttach(dev);
2349
2350     return 0;
2351 }
2352
2353 #ifdef ZM_OS_LINUX_FUNC
2354 void zfiWlanShowTally(zdev_t* dev)
2355 {
2356     zmw_get_wlan_dev(dev);
2357
2358     zm_msg1_mm(ZM_LV_0, "Hw_UnderrunCnt    = ", wd->commTally.Hw_UnderrunCnt);
2359     zm_msg1_mm(ZM_LV_0, "Hw_TotalRxFrm     = ", wd->commTally.Hw_TotalRxFrm);
2360     zm_msg1_mm(ZM_LV_0, "Hw_CRC32Cnt       = ", wd->commTally.Hw_CRC32Cnt);
2361     zm_msg1_mm(ZM_LV_0, "Hw_CRC16Cnt       = ", wd->commTally.Hw_CRC16Cnt);
2362     zm_msg1_mm(ZM_LV_1, "Hw_DecrypErr_UNI  = ", wd->commTally.Hw_DecrypErr_UNI);
2363     zm_msg1_mm(ZM_LV_0, "Hw_RxFIFOOverrun  = ", wd->commTally.Hw_RxFIFOOverrun);
2364     zm_msg1_mm(ZM_LV_1, "Hw_DecrypErr_Mul  = ", wd->commTally.Hw_DecrypErr_Mul);
2365     zm_msg1_mm(ZM_LV_1, "Hw_RetryCnt       = ", wd->commTally.Hw_RetryCnt);
2366     zm_msg1_mm(ZM_LV_0, "Hw_TotalTxFrm     = ", wd->commTally.Hw_TotalTxFrm);
2367     zm_msg1_mm(ZM_LV_0, "Hw_RxTimeOut      = ", wd->commTally.Hw_RxTimeOut);
2368     zm_msg1_mm(ZM_LV_0, "Tx_MPDU           = ", wd->commTally.Tx_MPDU);
2369     zm_msg1_mm(ZM_LV_0, "BA_Fail           = ", wd->commTally.BA_Fail);
2370     zm_msg1_mm(ZM_LV_0, "Hw_Tx_AMPDU       = ", wd->commTally.Hw_Tx_AMPDU);
2371     zm_msg1_mm(ZM_LV_0, "Hw_Tx_MPDU        = ", wd->commTally.Hw_Tx_MPDU);
2372
2373     zm_msg1_mm(ZM_LV_1, "Hw_RxMPDU          = ", wd->commTally.Hw_RxMPDU);
2374     zm_msg1_mm(ZM_LV_1, "Hw_RxDropMPDU      = ", wd->commTally.Hw_RxDropMPDU);
2375     zm_msg1_mm(ZM_LV_1, "Hw_RxDelMPDU       = ", wd->commTally.Hw_RxDelMPDU);
2376     zm_msg1_mm(ZM_LV_1, "Hw_RxPhyMiscError  = ", wd->commTally.Hw_RxPhyMiscError);
2377     zm_msg1_mm(ZM_LV_1, "Hw_RxPhyXRError    = ", wd->commTally.Hw_RxPhyXRError);
2378     zm_msg1_mm(ZM_LV_1, "Hw_RxPhyOFDMError  = ", wd->commTally.Hw_RxPhyOFDMError);
2379     zm_msg1_mm(ZM_LV_1, "Hw_RxPhyCCKError   = ", wd->commTally.Hw_RxPhyCCKError);
2380     zm_msg1_mm(ZM_LV_1, "Hw_RxPhyHTError    = ", wd->commTally.Hw_RxPhyHTError);
2381     zm_msg1_mm(ZM_LV_1, "Hw_RxPhyTotalCount = ", wd->commTally.Hw_RxPhyTotalCount);
2382
2383     if (!((wd->commTally.Tx_MPDU == 0) && (wd->commTally.BA_Fail == 0)))
2384     {
2385         zm_debug_msg_p("BA Fail Ratio(%)  = ", wd->commTally.BA_Fail * 100,
2386                 (wd->commTally.BA_Fail + wd->commTally.Tx_MPDU));
2387     }
2388
2389     if (!((wd->commTally.Hw_Tx_MPDU == 0) && (wd->commTally.Hw_Tx_AMPDU == 0)))
2390     {
2391         zm_debug_msg_p("Avg Agg Number    = ",
2392                 wd->commTally.Hw_Tx_MPDU, wd->commTally.Hw_Tx_AMPDU);
2393     }
2394 }
2395 #endif
2396
2397 void zfiWlanSetMaxTxPower(zdev_t* dev, u8_t power2, u8_t power5)
2398 {
2399     zmw_get_wlan_dev(dev);
2400
2401     zmw_declare_for_critical_section();
2402
2403     zmw_enter_critical_section(dev);
2404     wd->maxTxPower2 = power2;
2405     wd->maxTxPower5 = power5;
2406     zmw_leave_critical_section(dev);
2407 }
2408
2409 void zfiWlanQueryMaxTxPower(zdev_t* dev, u8_t *power2, u8_t *power5)
2410 {
2411     zmw_get_wlan_dev(dev);
2412
2413     *power2 = wd->maxTxPower2;
2414     *power5 = wd->maxTxPower5;
2415 }
2416
2417 void zfiWlanSetConnectMode(zdev_t* dev, u8_t mode)
2418 {
2419     zmw_get_wlan_dev(dev);
2420
2421     zmw_declare_for_critical_section();
2422
2423     zmw_enter_critical_section(dev);
2424     wd->connectMode = mode;
2425     zmw_leave_critical_section(dev);
2426 }
2427
2428 void zfiWlanSetSupportMode(zdev_t* dev, u32_t mode)
2429 {
2430     zmw_get_wlan_dev(dev);
2431
2432     zmw_declare_for_critical_section();
2433
2434     zmw_enter_critical_section(dev);
2435     wd->supportMode = mode;
2436     zmw_leave_critical_section(dev);
2437 }
2438
2439 void zfiWlanSetAdhocMode(zdev_t* dev, u32_t mode)
2440 {
2441     zmw_get_wlan_dev(dev);
2442
2443     wd->ws.adhocMode = mode;
2444 }
2445
2446 u32_t zfiWlanQueryAdhocMode(zdev_t* dev, u8_t bWrapper)
2447 {
2448     u32_t adhocMode;
2449
2450     zmw_get_wlan_dev(dev);
2451
2452     if ( bWrapper )
2453     {
2454         adhocMode = wd->ws.adhocMode;
2455     }
2456     else
2457     {
2458         adhocMode = wd->wfc.bIbssGMode;
2459     }
2460
2461     return adhocMode;
2462 }
2463
2464
2465 u8_t zfiWlanSetCountryIsoName(zdev_t* dev, u8_t *countryIsoName, u8_t length)
2466 {
2467     u8_t buf[5];
2468     zmw_get_wlan_dev(dev);
2469
2470     if (length == 4)
2471     {
2472         buf[2] = wd->ws.countryIsoName[0] = countryIsoName[2];
2473         buf[3] = wd->ws.countryIsoName[1] = countryIsoName[1];
2474         buf[4] = wd->ws.countryIsoName[2] = countryIsoName[0];
2475     }
2476     else if (length == 3)
2477     {
2478         buf[2] = wd->ws.countryIsoName[0] = countryIsoName[1];
2479         buf[3] = wd->ws.countryIsoName[1] = countryIsoName[0];
2480         buf[4] = wd->ws.countryIsoName[2] = '\0';
2481     }
2482     else
2483     {
2484         return 1;
2485     }
2486
2487     return zfHpGetRegulationTablefromISO(dev, buf, length);
2488 }
2489
2490
2491 const char* zfiWlanQueryCountryIsoName(zdev_t* dev)
2492 {
2493     zmw_get_wlan_dev(dev);
2494
2495     return wd->ws.countryIsoName;
2496 }
2497
2498
2499
2500 void zfiWlanSetRegulatory(zdev_t* dev, u8_t CCS, u16_t Code, u8_t bfirstChannel)
2501 {
2502     zmw_get_wlan_dev(dev);
2503
2504     zmw_declare_for_critical_section();
2505
2506     if (CCS)
2507     {
2508         /* Reset Regulation Table by Country Code */
2509         zfHpGetRegulationTablefromCountry(dev, Code);
2510     }
2511     else
2512     {
2513         /* Reset Regulation Table by Region Code */
2514         zfHpGetRegulationTablefromRegionCode(dev, Code);
2515     }
2516
2517     if (bfirstChannel) {
2518         zmw_enter_critical_section(dev);
2519         wd->frequency = zfChGetFirstChannel(dev, NULL);
2520         zmw_leave_critical_section(dev);
2521         zfCoreSetFrequency(dev, wd->frequency);
2522     }
2523 }
2524
2525
2526 const char* zfiHpGetisoNamefromregionCode(zdev_t* dev, u16_t regionCode)
2527 {
2528     return zfHpGetisoNamefromregionCode(dev, regionCode);
2529 }
2530
2531 u16_t zfiWlanChannelToFrequency(zdev_t* dev, u8_t channel)
2532 {
2533     return zfChNumToFreq(dev, channel, 0);
2534 }
2535
2536 u8_t zfiWlanFrequencyToChannel(zdev_t* dev, u16_t freq)
2537 {
2538     u8_t is5GBand = 0;
2539
2540     return zfChFreqToNum(freq, &is5GBand);
2541 }
2542
2543 void zfiWlanDisableDfsChannel(zdev_t* dev, u8_t disableFlag)
2544 {
2545     zfHpDisableDfsChannel(dev, disableFlag);
2546     return;
2547 }
2548
2549 void zfiWlanSetLEDCtrlParam(zdev_t* dev, u8_t type, u8_t flag)
2550 {
2551     zmw_get_wlan_dev(dev);
2552
2553     zmw_declare_for_critical_section();
2554
2555     zmw_enter_critical_section(dev);
2556     wd->ledStruct.LEDCtrlType = type;
2557     wd->ledStruct.LEDCtrlFlagFromReg  = flag;
2558     zmw_leave_critical_section(dev);
2559 }
2560
2561 void zfiWlanEnableLeapConfig(zdev_t* dev, u8_t leapEnabled)
2562 {
2563     zmw_get_wlan_dev(dev);
2564
2565     wd->sta.leapEnabled = leapEnabled;
2566 }
2567
2568 u32_t zfiWlanQueryHwCapability(zdev_t* dev)
2569 {
2570     return zfHpCapability(dev);
2571 }
2572
2573 u32_t zfiWlanQueryReceivedPacket(zdev_t* dev)
2574 {
2575     zmw_get_wlan_dev(dev);
2576
2577     return wd->sta.ReceivedPktRatePerSecond;
2578 }
2579
2580 void zfiWlanCheckSWEncryption(zdev_t* dev)
2581 {
2582     zmw_get_wlan_dev(dev);
2583
2584     if (wd->sta.SWEncryptEnable != 0)
2585     {
2586         zfHpSWDecrypt(dev, 1);
2587     }
2588 }
2589
2590 u16_t zfiWlanQueryAllowChannels(zdev_t* dev, u16_t *channels)
2591 {
2592     u16_t ii;
2593     zmw_get_wlan_dev(dev);
2594
2595     for (ii = 0; ii < wd->regulationTable.allowChannelCnt; ii++)
2596     {
2597         channels[ii] = wd->regulationTable.allowChannel[ii].channel;
2598     }
2599
2600     return wd->regulationTable.allowChannelCnt;
2601 }
2602
2603 void zfiWlanSetDynamicSIFSParam(zdev_t* dev, u8_t val)
2604 {
2605     zmw_get_wlan_dev(dev);
2606
2607     wd->dynamicSIFSEnable = val;
2608
2609     zm_debug_msg1("wd->dynamicSIFSEnable = ", wd->dynamicSIFSEnable)
2610 }
2611
2612 u16_t zfiWlanGetMulticastAddressCount(zdev_t* dev)
2613 {
2614     zmw_get_wlan_dev(dev);
2615
2616     return wd->sta.multicastList.size;
2617 }
2618
2619 void zfiWlanGetMulticastList(zdev_t* dev, u8_t* pMCList)
2620 {
2621     struct zsMulticastAddr* pMacList = (struct zsMulticastAddr*) pMCList;
2622     u8_t i;
2623
2624     zmw_get_wlan_dev(dev);
2625
2626     for ( i=0; i<wd->sta.multicastList.size; i++ )
2627     {
2628         zfMemoryCopy(pMacList[i].addr, wd->sta.multicastList.macAddr[i].addr, 6);
2629     }
2630 }
2631
2632 void zfiWlanSetPacketFilter(zdev_t* dev, u32_t PacketFilter)
2633 {
2634     u8_t  bAllMulticast = 0;
2635     u32_t oldFilter;
2636
2637     zmw_get_wlan_dev(dev);
2638
2639     oldFilter = wd->sta.osRxFilter;
2640
2641     wd->sta.osRxFilter = PacketFilter;
2642
2643     if ((oldFilter & ZM_PACKET_TYPE_ALL_MULTICAST) !=
2644         (wd->sta.osRxFilter & ZM_PACKET_TYPE_ALL_MULTICAST))
2645     {
2646         if ( wd->sta.osRxFilter & ZM_PACKET_TYPE_ALL_MULTICAST )
2647             bAllMulticast = 1;
2648         zfHpSetMulticastList(dev, wd->sta.multicastList.size,
2649                              (u8_t*)wd->sta.multicastList.macAddr, bAllMulticast);
2650     }
2651 }
2652
2653 u8_t zfiCompareWithMulticastListAddress(zdev_t* dev, u16_t* dstMacAddr)
2654 {
2655     u8_t i;
2656     u8_t bIsInMCListAddr = 0;
2657
2658     zmw_get_wlan_dev(dev);
2659
2660     for ( i=0; i<wd->sta.multicastList.size; i++ )
2661     {
2662         if ( zfwMemoryIsEqual((u8_t*)dstMacAddr, (u8_t*)wd->sta.multicastList.macAddr[i].addr, 6) )
2663         {
2664             bIsInMCListAddr = 1;
2665             break;
2666         }
2667     }
2668
2669     return bIsInMCListAddr;
2670 }
2671
2672 void zfiWlanSetSafeModeEnabled(zdev_t* dev, u8_t safeMode)
2673 {
2674     zmw_get_wlan_dev(dev);
2675
2676     wd->sta.bSafeMode = safeMode;
2677
2678     if ( safeMode )
2679         zfStaEnableSWEncryption(dev, 1);
2680     else
2681         zfStaDisableSWEncryption(dev);
2682 }
2683
2684 void zfiWlanSetIBSSAdditionalIELength(zdev_t* dev, u32_t ibssAdditionalIESize, u8_t* ibssAdditionalIE)
2685 {
2686         zmw_get_wlan_dev(dev);
2687
2688         if ( ibssAdditionalIESize )
2689     {
2690             wd->sta.ibssAdditionalIESize = ibssAdditionalIESize;
2691         zfMemoryCopy(wd->sta.ibssAdditionalIE, ibssAdditionalIE, (u16_t)ibssAdditionalIESize);
2692     }
2693     else
2694         wd->sta.ibssAdditionalIESize = 0;
2695 }