Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  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 : cmd.c                                                 */
 18 /*                                                                      */
 19 /*  Abstract                                                            */
 20 /*      This module contains command interface functions.               */
 21 /*                                                                      */
 22 /*  NOTES                                                               */
 23 /*      None                                                            */
 24 /*                                                                      */
 25 /************************************************************************/
 26 #include "cprecomp.h"
 27 #include "../hal/hpreg.h"
 28 
 29 
 30 u16_t zfWlanReset(zdev_t *dev);
 31 u32_t zfUpdateRxRate(zdev_t *dev);
 32 
 33 
 34 extern void zfiUsbRecv(zdev_t *dev, zbuf_t *buf);
 35 extern void zfiUsbRegIn(zdev_t *dev, u32_t *rsp, u16_t rspLen);
 36 extern void zfiUsbOutComplete(zdev_t *dev, zbuf_t *buf, u8_t status, u8_t *hdr);
 37 extern void zfiUsbRegOutComplete(zdev_t *dev);
 38 extern u16_t zfHpReinit(zdev_t *dev, u32_t frequency);
 39 
 40 /* Get size (byte) of driver core global data structure.    */
 41 /* This size will be used by driver wrapper to allocate     */
 42 /* a memory space for driver core to store global variables */
 43 u16_t zfiGlobalDataSize(zdev_t *dev)
 44 {
 45         u32_t ret;
 46         ret = (sizeof(struct zsWlanDev));
 47         zm_assert((ret>>16) == 0);
 48         return (u16_t)ret;
 49 }
 50 
 51 
 52 /* Initialize WLAN hardware and software, resource will be allocated */
 53 /* for WLAN operation, must be called first before other function.   */
 54 extern u16_t zfiWlanOpen(zdev_t *dev, struct zsCbFuncTbl *cbFuncTbl)
 55 {
 56         /* u16_t ret;
 57            u32_t i;
 58            u8_t* ch;
 59            u8_t  bPassive;
 60         */
 61         u32_t devSize;
 62         struct zfCbUsbFuncTbl cbUsbFuncTbl;
 63         zmw_get_wlan_dev(dev);
 64 
 65         zm_debug_msg0("start");
 66 
 67         devSize = sizeof(struct zsWlanDev);
 68         /* Zeroize zsWlanDev struct */
 69         zfZeroMemory((u8_t *)wd, (u16_t)devSize);
 70 
 71 #ifdef ZM_ENABLE_AGGREGATION
 72         zfAggInit(dev);
 73 #endif
 74 
 75         zfCwmInit(dev);
 76 
 77         wd->commTally.RateCtrlTxMPDU = 0;
 78         wd->commTally.RateCtrlBAFail = 0;
 79         wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_SHORT;
 80 
 81         if (cbFuncTbl == NULL) {
 82                 /* zfcbRecvEth() is mandatory */
 83                 zm_assert(0);
 84         } else {
 85                 if (cbFuncTbl->zfcbRecvEth == NULL) {
 86                         /* zfcbRecvEth() is mandatory */
 87                         zm_assert(0);
 88                 }
 89                 wd->zfcbAuthNotify = cbFuncTbl->zfcbAuthNotify;
 90                 wd->zfcbAuthNotify = cbFuncTbl->zfcbAuthNotify;
 91                 wd->zfcbAsocNotify = cbFuncTbl->zfcbAsocNotify;
 92                 wd->zfcbDisAsocNotify = cbFuncTbl->zfcbDisAsocNotify;
 93                 wd->zfcbApConnectNotify = cbFuncTbl->zfcbApConnectNotify;
 94                 wd->zfcbConnectNotify = cbFuncTbl->zfcbConnectNotify;
 95                 wd->zfcbScanNotify = cbFuncTbl->zfcbScanNotify;
 96                 wd->zfcbMicFailureNotify = cbFuncTbl->zfcbMicFailureNotify;
 97                 wd->zfcbApMicFailureNotify = cbFuncTbl->zfcbApMicFailureNotify;
 98                 wd->zfcbIbssPartnerNotify = cbFuncTbl->zfcbIbssPartnerNotify;
 99                 wd->zfcbMacAddressNotify = cbFuncTbl->zfcbMacAddressNotify;
100                 wd->zfcbSendCompleteIndication =
101                                         cbFuncTbl->zfcbSendCompleteIndication;
102                 wd->zfcbRecvEth = cbFuncTbl->zfcbRecvEth;
103                 wd->zfcbRestoreBufData = cbFuncTbl->zfcbRestoreBufData;
104                 wd->zfcbRecv80211 = cbFuncTbl->zfcbRecv80211;
105 #ifdef ZM_ENABLE_CENC
106                 wd->zfcbCencAsocNotify = cbFuncTbl->zfcbCencAsocNotify;
107 #endif /* ZM_ENABLE_CENC */
108                 wd->zfcbClassifyTxPacket = cbFuncTbl->zfcbClassifyTxPacket;
109                 wd->zfcbHwWatchDogNotify = cbFuncTbl->zfcbHwWatchDogNotify;
110         }
111 
112         /* add by honda 0330 */
113         cbUsbFuncTbl.zfcbUsbRecv = zfiUsbRecv;
114         cbUsbFuncTbl.zfcbUsbRegIn = zfiUsbRegIn;
115         cbUsbFuncTbl.zfcbUsbOutComplete = zfiUsbOutComplete;
116         cbUsbFuncTbl.zfcbUsbRegOutComplete = zfiUsbRegOutComplete;
117         zfwUsbRegisterCallBack(dev, &cbUsbFuncTbl);
118         /* Init OWN MAC address */
119         wd->macAddr[0] = 0x8000;
120         wd->macAddr[1] = 0x0000;
121         wd->macAddr[2] = 0x0000;
122 
123         wd->regulationTable.regionCode = 0xffff;
124 
125         zfHpInit(dev, wd->frequency);
126 
127         /* init region code */
128         /* wd->regulationTable.regionCode = NULL1_WORLD; //Only 2.4g RegCode */
129         /* zfHpGetRegulationTablefromRegionCode(dev, NULL1_WORLD); */
130         /* zfiWlanSetDot11DMode(dev , 1); //Enable 802.11d */
131         /* Get the first channel */
132         /* wd->frequency = zfChGetFirstChannel(dev, &bPassive); */
133 #ifdef ZM_AP_DEBUG
134         /* wd->frequency = 2437; */
135 #endif
136 
137         /* STA mode */
138         wd->sta.mTxRate = 0x0;
139         wd->sta.uTxRate = 0x3;
140         wd->sta.mmTxRate = 0x0;
141         wd->sta.adapterState = ZM_STA_STATE_DISCONNECT;
142         wd->sta.capability[0] = 0x01;
143         wd->sta.capability[1] = 0x00;
144 
145         wd->sta.preambleTypeHT = 0;
146         wd->sta.htCtrlBandwidth = 0;
147         wd->sta.htCtrlSTBC = 0;
148         wd->sta.htCtrlSG = 0;
149         wd->sta.defaultTA = 0;
150         /*wd->sta.activescanTickPerChannel =
151         *ZM_TIME_ACTIVE_SCAN/ZM_MS_PER_TICK;
152         */
153         {
154                 u8_t Dur = ZM_TIME_ACTIVE_SCAN;
155                 zfwGetActiveScanDur(dev, &Dur);
156                 wd->sta.activescanTickPerChannel = Dur / ZM_MS_PER_TICK;
157 
158         }
159         wd->sta.passiveScanTickPerChannel = ZM_TIME_PASSIVE_SCAN/ZM_MS_PER_TICK;
160         wd->sta.bAutoReconnect = TRUE;
161         wd->sta.dropUnencryptedPkts = FALSE;
162 
163         /* set default to bypass all multicast packet for linux,
164         *  window XP would set 0 by wrapper initialization
165         */
166         wd->sta.bAllMulticast = 1;
167 
168         /* Initial the RIFS Status / RIFS-like frame count / RIFS count */
169         wd->sta.rifsState = ZM_RIFS_STATE_DETECTING;
170         wd->sta.rifsLikeFrameCnt = 0;
171         wd->sta.rifsCount = 0;
172 
173         wd->sta.osRxFilter = 0;
174         wd->sta.bSafeMode = 0;
175 
176         /* Common */
177         zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_DISCONNECT);
178         wd->beaconInterval = 100;
179         wd->rtsThreshold = 2346;
180         wd->fragThreshold = 32767;
181         wd->wlanMode = ZM_MODE_INFRASTRUCTURE;
182         wd->txMCS = 0xff;    /* AUTO */
183         wd->dtim = 1;
184         /* wd->txMT = 1;       *//*OFDM */
185         wd->tick = 1;
186         wd->maxTxPower2 = 0xff;
187         wd->maxTxPower5 = 0xff;
188         wd->supportMode = 0xffffffff;
189         wd->ws.adhocMode = ZM_ADHOCBAND_G;
190         wd->ws.autoSetFrequency = 0xff;
191 
192         /* AP mode */
193         /* wd->bgMode = wd->ws.bgMode; */
194         wd->ap.ssidLen[0] = 6;
195         wd->ap.ssid[0][0] = 'Z';
196         wd->ap.ssid[0][1] = 'D';
197         wd->ap.ssid[0][2] = '1';
198         wd->ap.ssid[0][3] = '2';
199         wd->ap.ssid[0][4] = '2';
200         wd->ap.ssid[0][5] = '1';
201 
202         /* Init the country iso name as NA */
203         wd->ws.countryIsoName[0] = 0;
204         wd->ws.countryIsoName[1] = 0;
205         wd->ws.countryIsoName[2] = '\0';
206 
207         /* init fragmentation is disabled */
208         /* zfiWlanSetFragThreshold(dev, 0); */
209 
210         /* airopeek : swSniffer 1=>on  0=>off */
211         wd->swSniffer = 0;
212         wd->XLinkMode = 0;
213 
214         /* jhlee HT 0 */
215 #if 1
216         /* AP Mode*/
217         /* Init HT Capability Info */
218         wd->ap.HTCap.Data.ElementID = ZM_WLAN_EID_HT_CAPABILITY;
219         wd->ap.HTCap.Data.Length = 26;
220         /*wd->ap.HTCap.Data.SupChannelWidthSet = 0;
221         wd->ap.HTCap.Data.MIMOPowerSave = 3;
222         wd->ap.HTCap.Data.ShortGIfor40MHz = 0;
223         wd->ap.HTCap.Data.ShortGIfor20MHz = 0;
224         wd->ap.HTCap.Data.DSSSandCCKin40MHz = 0;
225         */
226         wd->ap.HTCap.Data.AMPDUParam |= HTCAP_MaxRxAMPDU3;
227         wd->ap.HTCap.Data.MCSSet[0] = 0xFF; /* MCS 0 ~  7 */
228         wd->ap.HTCap.Data.MCSSet[1] = 0xFF; /* MCS 8 ~ 15 */
229 
230         /* Init Extended HT Capability Info */
231         wd->ap.ExtHTCap.Data.ElementID = ZM_WLAN_EID_EXTENDED_HT_CAPABILITY;
232         wd->ap.ExtHTCap.Data.Length = 22;
233         wd->ap.ExtHTCap.Data.ControlChannel = 6;
234         /* wd->ap.ExtHTCap.Data.ExtChannelOffset = 3; */
235         wd->ap.ExtHTCap.Data.ChannelInfo |= ExtHtCap_RecomTxWidthSet;
236         /* wd->ap.ExtHTCap.Data.RIFSMode = 1; */
237         wd->ap.ExtHTCap.Data.OperatingInfo |= 1;
238 
239         /* STA Mode*/
240         /* Init HT Capability Info */
241         wd->sta.HTCap.Data.ElementID = ZM_WLAN_EID_HT_CAPABILITY;
242         wd->sta.HTCap.Data.Length = 26;
243 
244         /* Test with 5G-AP : 7603 */
245         /* wd->sta.HTCap.Data.SupChannelWidthSet = 1; */
246         wd->sta.HTCap.Data.HtCapInfo |= HTCAP_SMEnabled;
247         wd->sta.HTCap.Data.HtCapInfo |= HTCAP_SupChannelWidthSet;
248         wd->sta.HTCap.Data.HtCapInfo |= HTCAP_ShortGIfor40MHz;
249         wd->sta.HTCap.Data.HtCapInfo |= HTCAP_DSSSandCCKin40MHz;
250 #ifndef ZM_DISABLE_AMSDU8K_SUPPORT
251         wd->sta.HTCap.Data.HtCapInfo |= HTCAP_MaxAMSDULength;
252 #endif
253         /*wd->sta.HTCap.Data.MIMOPowerSave = 0;
254         wd->sta.HTCap.Data.ShortGIfor40MHz = 0;
255         wd->sta.HTCap.Data.ShortGIfor20MHz = 0;
256         wd->sta.HTCap.Data.DSSSandCCKin40MHz = 0;
257         */
258         wd->sta.HTCap.Data.AMPDUParam |= HTCAP_MaxRxAMPDU3;
259         wd->sta.HTCap.Data.MCSSet[0] = 0xFF; /* MCS 0 ~  7 */
260         wd->sta.HTCap.Data.MCSSet[1] = 0xFF; /* MCS 8 ~ 15 */
261         wd->sta.HTCap.Data.PCO |= HTCAP_TransmissionTime3;
262         /* wd->sta.HTCap.Data.TransmissionTime = 0; */
263         /* Init Extended HT Capability Info */
264         wd->sta.ExtHTCap.Data.ElementID = ZM_WLAN_EID_EXTENDED_HT_CAPABILITY;
265         wd->sta.ExtHTCap.Data.Length = 22;
266         wd->sta.ExtHTCap.Data.ControlChannel = 6;
267 
268         /* wd->sta.ExtHTCap.Data.ExtChannelOffset |= 3; */
269         wd->sta.ExtHTCap.Data.ChannelInfo |= ExtHtCap_ExtChannelOffsetBelow;
270 
271         /* wd->sta.ExtHTCap.Data.RecomTxWidthSet = 1; */
272         /* wd->sta.ExtHTCap.Data.RIFSMode = 1; */
273         wd->sta.ExtHTCap.Data.OperatingInfo |= 1;
274 #endif
275 
276 #if 0
277         /* WME test code */
278         wd->ap.qosMode[0] = 1;
279 #endif
280 
281         wd->ledStruct.ledMode[0] = 0x2221;
282         wd->ledStruct.ledMode[1] = 0x2221;
283 
284         zfTimerInit(dev);
285 
286         ZM_PERFORMANCE_INIT(dev);
287 
288         zfBssInfoCreate(dev);
289         zfScanMgrInit(dev);
290         zfPowerSavingMgrInit(dev);
291 
292 #if 0
293         /* Test code */
294         {
295                 u32_t key[4] = {0xffffffff, 0xff, 0, 0};
296                 u16_t addr[3] = {0x8000, 0x01ab, 0x0000};
297                 /*zfSetKey(dev, 0, 0, ZM_WEP64, addr, key);
298                 zfSetKey(dev, 0, 0, ZM_AES, addr, key);
299                 zfSetKey(dev, 64, 0, 1, wd->macAddr, key);
300                 */
301         }
302 #endif
303 
304         /* WME settings */
305         wd->ws.staWmeEnabled = 1;           /* Enable WME by default */
306 #define ZM_UAPSD_Q_SIZE 32 /* 2^N */
307         wd->ap.uapsdQ = zfQueueCreate(dev, ZM_UAPSD_Q_SIZE);
308         zm_assert(wd->ap.uapsdQ != NULL);
309         wd->sta.uapsdQ = zfQueueCreate(dev, ZM_UAPSD_Q_SIZE);
310         zm_assert(wd->sta.uapsdQ != NULL);
311 
312         /* zfHpInit(dev, wd->frequency); */
313 
314         /* MAC address */
315         /* zfHpSetMacAddress(dev, wd->macAddr, 0); */
316         zfHpGetMacAddress(dev);
317 
318         zfCoreSetFrequency(dev, wd->frequency);
319 
320 #if ZM_PCI_LOOP_BACK == 1
321         zfwWriteReg(dev, ZM_REG_PCI_CONTROL, 6);
322 #endif /* #if ZM_PCI_LOOP_BACK == 1 */
323 
324         /* zfiWlanSetDot11DMode(dev , 1); // Enable 802.11d */
325         /* zfiWlanSetDot11HDFSMode(dev , 1); // Enable 802.11h DFS */
326         wd->sta.DFSEnable = 1;
327         wd->sta.capability[1] |= ZM_BIT_0;
328 
329         /* zfiWlanSetFrequency(dev, 5260000, TRUE); */
330         /* zfiWlanSetAniMode(dev , 1); // Enable ANI */
331 
332         /* Trgger Rx DMA */
333         zfHpStartRecv(dev);
334 
335         zm_debug_msg0("end");
336 
337         return 0;
338 }
339 
340 /* WLAN hardware will be shutdown and all resource will be release */
341 u16_t zfiWlanClose(zdev_t *dev)
342 {
343         zmw_get_wlan_dev(dev);
344 
345         zm_msg0_init(ZM_LV_0, "enter");
346 
347         wd->state = ZM_WLAN_STATE_CLOSEDED;
348 
349         /* zfiWlanDisable(dev, 1); */
350         zfWlanReset(dev);
351 
352         zfHpStopRecv(dev);
353 
354         /* Disable MAC */
355         /* Disable PHY */
356         /* Disable RF */
357 
358         zfHpRelease(dev);
359 
360         zfQueueDestroy(dev, wd->ap.uapsdQ);
361         zfQueueDestroy(dev, wd->sta.uapsdQ);
362 
363         zfBssInfoDestroy(dev);
364 
365 #ifdef ZM_ENABLE_AGGREGATION
366         /* add by honda */
367         zfAggRxFreeBuf(dev, 1);  /* 1 for release structure memory */
368         /* end of add by honda */
369 #endif
370 
371         zm_msg0_init(ZM_LV_0, "exit");
372 
373         return 0;
374 }
375 
376 void zfGetWrapperSetting(zdev_t *dev)
377 {
378         u8_t bPassive;
379         u16_t vapId = 0;
380 
381         zmw_get_wlan_dev(dev);
382 
383         zmw_declare_for_critical_section();
384 #if 0
385         if ((wd->ws.countryIsoName[0] != 0)
386                 || (wd->ws.countryIsoName[1] != 0)
387                 || (wd->ws.countryIsoName[2] != '\0')) {
388                 zfHpGetRegulationTablefromRegionCode(dev,
389                 zfHpGetRegionCodeFromIsoName(dev, wd->ws.countryIsoName));
390         }
391 #endif
392         zmw_enter_critical_section(dev);
393 
394         wd->wlanMode = wd->ws.wlanMode;
395 
396         /* set channel */
397         if (wd->ws.frequency) {
398                 wd->frequency = wd->ws.frequency;
399                 wd->ws.frequency = 0;
400         } else {
401                 wd->frequency = zfChGetFirstChannel(dev, &bPassive);
402 
403                 if (wd->wlanMode == ZM_MODE_IBSS) {
404                         if (wd->ws.adhocMode == ZM_ADHOCBAND_A)
405                                 wd->frequency = ZM_CH_A_36;
406                         else
407                                 wd->frequency = ZM_CH_G_6;
408                 }
409         }
410 #ifdef ZM_AP_DEBUG
411         /* honda add for debug, 2437 channel 6, 2452 channel 9 */
412         wd->frequency = 2437;
413         /* end of add by honda */
414 #endif
415 
416         /* set preamble type */
417         switch (wd->ws.preambleType) {
418         case ZM_PREAMBLE_TYPE_AUTO:
419         case ZM_PREAMBLE_TYPE_SHORT:
420         case ZM_PREAMBLE_TYPE_LONG:
421                 wd->preambleType = wd->ws.preambleType;
422                 break;
423         default:
424                 wd->preambleType = ZM_PREAMBLE_TYPE_SHORT;
425                 break;
426         }
427         wd->ws.preambleType = 0;
428 
429         if (wd->wlanMode == ZM_MODE_AP) {
430                 vapId = zfwGetVapId(dev);
431 
432                 if (vapId == 0xffff) {
433                         wd->ap.authAlgo[0] = wd->ws.authMode;
434                         wd->ap.encryMode[0] = wd->ws.encryMode;
435                 } else {
436                         wd->ap.authAlgo[vapId + 1] = wd->ws.authMode;
437                         wd->ap.encryMode[vapId + 1] = wd->ws.encryMode;
438                 }
439                 wd->ws.authMode = 0;
440                 wd->ws.encryMode = ZM_NO_WEP;
441 
442                 /* Get beaconInterval from WrapperSetting */
443                 if ((wd->ws.beaconInterval >= 20) &&
444                                         (wd->ws.beaconInterval <= 1000))
445                         wd->beaconInterval = wd->ws.beaconInterval;
446                 else
447                         wd->beaconInterval = 100; /* 100ms */
448 
449                 if (wd->ws.dtim > 0)
450                         wd->dtim = wd->ws.dtim;
451                 else
452                         wd->dtim = 1;
453 
454 
455                 wd->ap.qosMode = wd->ws.apWmeEnabled & 0x1;
456                 wd->ap.uapsdEnabled = (wd->ws.apWmeEnabled & 0x2) >> 1;
457         } else {
458                 wd->sta.authMode = wd->ws.authMode;
459                 wd->sta.currentAuthMode = wd->ws.authMode;
460                 wd->sta.wepStatus = wd->ws.wepStatus;
461 
462                 if (wd->ws.beaconInterval)
463                         wd->beaconInterval = wd->ws.beaconInterval;
464                 else
465                         wd->beaconInterval = 0x64;
466 
467                 if (wd->wlanMode == ZM_MODE_IBSS) {
468                         /* 1. Set default channel 6 (2437MHz) */
469                         /* wd->frequency = 2437; */
470 
471                         /* 2. Otus support 802.11g Mode */
472                         if ((wd->ws.adhocMode == ZM_ADHOCBAND_G) ||
473                                 (wd->ws.adhocMode == ZM_ADHOCBAND_BG) ||
474                                 (wd->ws.adhocMode == ZM_ADHOCBAND_ABG))
475                                 wd->wfc.bIbssGMode = 1;
476                         else
477                                 wd->wfc.bIbssGMode = 0;
478 
479                         /* 3. set short preamble  */
480                         /* wd->sta.preambleType = ZM_PREAMBLE_TYPE_SHORT; */
481                 }
482 
483                 /* set ATIM window */
484                 if (wd->ws.atimWindow)
485                         wd->sta.atimWindow = wd->ws.atimWindow;
486                 else {
487                         /* wd->sta.atimWindow = 0x0a; */
488                         wd->sta.atimWindow = 0;
489                 }
490 
491                 /* wd->sta.connectingHiddenAP = 1;
492                    wd->ws.connectingHiddenAP;
493                 */
494                 wd->sta.dropUnencryptedPkts = wd->ws.dropUnencryptedPkts;
495                 wd->sta.ibssJoinOnly = wd->ws.ibssJoinOnly;
496 
497                 if (wd->ws.bDesiredBssid) {
498                         zfMemoryCopy(wd->sta.desiredBssid,
499                                                 wd->ws.desiredBssid, 6);
500                         wd->sta.bDesiredBssid = TRUE;
501                         wd->ws.bDesiredBssid = FALSE;
502                 } else
503                         wd->sta.bDesiredBssid = FALSE;
504 
505                 /* check ssid */
506                 if (wd->ws.ssidLen != 0) {
507                         if ((!zfMemoryIsEqual(wd->ws.ssid, wd->sta.ssid,
508                                 wd->sta.ssidLen)) ||
509                                 (wd->ws.ssidLen != wd->sta.ssidLen) ||
510                                 (wd->sta.authMode == ZM_AUTH_MODE_WPA) ||
511                                 (wd->sta.authMode == ZM_AUTH_MODE_WPAPSK) ||
512                                 (wd->ws.staWmeQosInfo != 0)) {
513                                 /* if u-APSD test(set QosInfo), clear
514                                    connectByReasso to do association
515                                    (not reassociation)
516                                 */
517                                 wd->sta.connectByReasso = FALSE;
518                                 wd->sta.failCntOfReasso = 0;
519                                 wd->sta.pmkidInfo.bssidCount = 0;
520 
521                                 wd->sta.ssidLen = wd->ws.ssidLen;
522                                 zfMemoryCopy(wd->sta.ssid, wd->ws.ssid,
523                                                         wd->sta.ssidLen);
524 
525                                 if (wd->sta.ssidLen < 32)
526                                         wd->sta.ssid[wd->sta.ssidLen] = 0;
527                         }
528                 } else {
529                         /* ANY BSS */
530                         wd->sta.ssid[0] = 0;
531                         wd->sta.ssidLen = 0;
532                 }
533 
534                 wd->sta.wmeEnabled = wd->ws.staWmeEnabled;
535                 wd->sta.wmeQosInfo = wd->ws.staWmeQosInfo;
536 
537         }
538 
539         zmw_leave_critical_section(dev);
540 }
541 
542 u16_t zfWlanEnable(zdev_t *dev)
543 {
544         u8_t bssid[6] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
545         u16_t i;
546 
547         zmw_get_wlan_dev(dev);
548 
549         zmw_declare_for_critical_section();
550 
551         if (wd->wlanMode == ZM_MODE_UNKNOWN) {
552                 zm_debug_msg0("Unknown Mode...Skip...");
553                 return 0;
554         }
555 
556         if (wd->wlanMode == ZM_MODE_AP) {
557                 u16_t vapId;
558 
559                 vapId = zfwGetVapId(dev);
560 
561                 if (vapId == 0xffff) {
562                         /* AP mode */
563                         zfApInitStaTbl(dev);
564 
565                         /* AP default parameters */
566                         wd->bRate = 0xf;
567                         wd->gRate = 0xff;
568                         wd->bRateBasic = 0xf;
569                         wd->gRateBasic = 0x0;
570                         /* wd->beaconInterval = 100; */
571                         wd->ap.apBitmap = 1;
572                         wd->ap.beaconCounter = 0;
573                         /* wd->ap.vapNumber = 1; //mark by ygwei for Vap */
574 
575                         wd->ap.hideSsid[0] = 0;
576                         wd->ap.staAgingTimeSec = 10*60;
577                         wd->ap.staProbingTimeSec = 60;
578 
579                         for (i = 0; i < ZM_MAX_AP_SUPPORT; i++)
580                                 wd->ap.bcmcHead[i] = wd->ap.bcmcTail[i] = 0;
581 
582                         /* wd->ap.uniHead = wd->ap.uniTail = 0; */
583 
584                         /* load AP parameters */
585                         wd->bRateBasic = wd->ws.bRateBasic;
586                         wd->gRateBasic = wd->ws.gRateBasic;
587                         wd->bgMode = wd->ws.bgMode;
588                         if ((wd->ws.ssidLen <= 32) && (wd->ws.ssidLen != 0)) {
589                                 wd->ap.ssidLen[0] = wd->ws.ssidLen;
590                                 for (i = 0; i < wd->ws.ssidLen; i++)
591                                         wd->ap.ssid[0][i] = wd->ws.ssid[i];
592                                 wd->ws.ssidLen = 0; /* Reset Wrapper Variable */
593                         }
594 
595                         if (wd->ap.encryMode[0] == 0)
596                                 wd->ap.capab[0] = 0x001;
597                         else
598                                 wd->ap.capab[0] = 0x011;
599                         /* set Short Slot Time bit if not 11b */
600                         if (wd->ap.wlanType[0] != ZM_WLAN_TYPE_PURE_B)
601                                 wd->ap.capab[0] |= 0x400;
602 
603                         /* wd->ap.vapNumber = 1; //mark by ygwei for Vap Test */
604                 } else {
605 #if 0
606                         /* VAP Test Code */
607                         wd->ap.apBitmap = 0x3;
608                         wd->ap.capab[1] = 0x401;
609                         wd->ap.ssidLen[1] = 4;
610                         wd->ap.ssid[1][0] = 'v';
611                         wd->ap.ssid[1][1] = 'a';
612                         wd->ap.ssid[1][2] = 'p';
613                         wd->ap.ssid[1][3] = '1';
614                         wd->ap.authAlgo[1] = wd->ws.authMode;
615                         wd->ap.encryMode[1] = wd->ws.encryMode;
616                         wd->ap.vapNumber = 2;
617 #else
618                         /* VAP Test Code */
619                         wd->ap.apBitmap = 0x1 | (0x01 << (vapId+1));
620 
621                         if ((wd->ws.ssidLen <= 32) && (wd->ws.ssidLen != 0)) {
622                                 wd->ap.ssidLen[vapId+1] = wd->ws.ssidLen;
623                                 for (i = 0; i < wd->ws.ssidLen; i++)
624                                         wd->ap.ssid[vapId+1][i] =
625                                                                 wd->ws.ssid[i];
626                                 wd->ws.ssidLen = 0; /* Reset Wrapper Variable */
627                         }
628 
629                         if (wd->ap.encryMode[vapId+1] == 0)
630                                 wd->ap.capab[vapId+1] = 0x401;
631                         else
632                                 wd->ap.capab[vapId+1] = 0x411;
633 
634                         wd->ap.authAlgo[vapId+1] = wd->ws.authMode;
635                         wd->ap.encryMode[vapId+1] = wd->ws.encryMode;
636 
637                         /* Need to be modified when VAP is used */
638                         /* wd->ap.vapNumber = 2; */
639 #endif
640                 }
641 
642                 wd->ap.vapNumber++;
643 
644                 zfCoreSetFrequency(dev, wd->frequency);
645 
646                 zfInitMacApMode(dev);
647 
648                 /* Disable protection mode */
649                 zfApSetProtectionMode(dev, 0);
650 
651                 zfApSendBeacon(dev);
652         } else { /*if (wd->wlanMode == ZM_MODE_AP) */
653 
654                 zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
655                 zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_EXTERNAL);
656 
657                 zmw_enter_critical_section(dev);
658                 wd->sta.oppositeCount = 0;    /* reset opposite count */
659                 /* wd->sta.bAutoReconnect = wd->sta.bAutoReconnectEnabled; */
660                 /* wd->sta.scanWithSSID = 0; */
661                 zfStaInitOppositeInfo(dev);
662                 zmw_leave_critical_section(dev);
663 
664                 zfStaResetStatus(dev, 0);
665 
666                 if ((wd->sta.cmDisallowSsidLength != 0) &&
667                 (wd->sta.ssidLen == wd->sta.cmDisallowSsidLength) &&
668                 (zfMemoryIsEqual(wd->sta.ssid, wd->sta.cmDisallowSsid,
669                 wd->sta.ssidLen)) &&
670                 (wd->sta.wepStatus == ZM_ENCRYPTION_TKIP)) {/*countermeasures*/
671                         zm_debug_msg0("countermeasures disallow association");
672                 } else {
673                         switch (wd->wlanMode) {
674                         case ZM_MODE_IBSS:
675                                 /* some registers may be set here */
676                                 if (wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK)
677                                         zfHpSetApStaMode(dev,
678                                         ZM_HAL_80211_MODE_IBSS_WPA2PSK);
679                                 else
680                                         zfHpSetApStaMode(dev,
681                                         ZM_HAL_80211_MODE_IBSS_GENERAL);
682 
683                                 zm_msg0_mm(ZM_LV_0, "ZM_MODE_IBSS");
684                                 zfIbssConnectNetwork(dev);
685                                 break;
686 
687                         case ZM_MODE_INFRASTRUCTURE:
688                                 /* some registers may be set here */
689                                 zfHpSetApStaMode(dev, ZM_HAL_80211_MODE_STA);
690 
691                                 zfInfraConnectNetwork(dev);
692                                 break;
693 
694                         case ZM_MODE_PSEUDO:
695                                 /* some registers may be set here */
696                                 zfHpSetApStaMode(dev, ZM_HAL_80211_MODE_STA);
697 
698                                 zfUpdateBssid(dev, bssid);
699                                 zfCoreSetFrequency(dev, wd->frequency);
700                                 break;
701 
702                         default:
703                                 break;
704                         }
705                 }
706 
707         }
708 
709 
710         /* if ((wd->wlanMode != ZM_MODE_INFRASTRUCTURE) &&
711                 (wd->wlanMode != ZM_MODE_AP))
712         */
713         if (wd->wlanMode == ZM_MODE_PSEUDO) {
714                 /* Reset Wlan status */
715                 zfWlanReset(dev);
716 
717                 if (wd->zfcbConnectNotify != NULL)
718                         wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_CONNECT,
719                                                                 wd->sta.bssid);
720                 zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTED);
721         }
722 
723 
724         if (wd->wlanMode == ZM_MODE_AP) {
725                 if (wd->zfcbConnectNotify != NULL)
726                         wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_CONNECT,
727                                                                 wd->sta.bssid);
728                 /* zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTED); */
729         }
730 
731         /* Assign default Tx Rate */
732         if (wd->sta.EnableHT) {
733                 u32_t oneTxStreamCap;
734                 oneTxStreamCap = (zfHpCapability(dev) &
735                                                 ZM_HP_CAP_11N_ONE_TX_STREAM);
736                 if (oneTxStreamCap)
737                         wd->CurrentTxRateKbps = 135000;
738                 else
739                         wd->CurrentTxRateKbps = 270000;
740                 wd->CurrentRxRateKbps = 270000;
741         } else {
742                 wd->CurrentTxRateKbps = 54000;
743                 wd->CurrentRxRateKbps = 54000;
744         }
745 
746         wd->state = ZM_WLAN_STATE_ENABLED;
747 
748         return 0;
749 }
750 
751 /* Enable/disable Wlan operation */
752 u16_t zfiWlanEnable(zdev_t *dev)
753 {
754         u16_t ret;
755 
756         zmw_get_wlan_dev(dev);
757 
758         zm_msg0_mm(ZM_LV_1, "Enable Wlan");
759 
760         zfGetWrapperSetting(dev);
761 
762         zfZeroMemory((u8_t *) &wd->trafTally, sizeof(struct zsTrafTally));
763 
764         /* Reset cmMicFailureCount to 0 for new association request */
765         if (wd->sta.cmMicFailureCount == 1) {
766                 zfTimerCancel(dev, ZM_EVENT_CM_TIMER);
767                 wd->sta.cmMicFailureCount = 0;
768         }
769 
770         zfFlushVtxq(dev);
771         if ((wd->queueFlushed & 0x10) != 0)
772                 zfHpUsbReset(dev);
773 
774         ret = zfWlanEnable(dev);
775 
776         return ret;
777 }
778 /* Add a flag named ResetKeyCache to show if KeyCache should be cleared.
779    for hostapd in AP mode, if driver receives iwconfig ioctl
780    after setting group key, it shouldn't clear KeyCache.
781 */
782 u16_t zfiWlanDisable(zdev_t *dev, u8_t ResetKeyCache)
783 {
784         u16_t  i;
785         u8_t isConnected;
786 
787         zmw_get_wlan_dev(dev);
788 
789 #ifdef ZM_ENABLE_IBSS_WPA2PSK
790         zmw_declare_for_critical_section();
791 #endif
792         wd->state = ZM_WLAN_STATE_DISABLED;
793 
794         zm_msg0_mm(ZM_LV_1, "Disable Wlan");
795 
796         if (wd->wlanMode != ZM_MODE_AP) {
797                 isConnected = zfStaIsConnected(dev);
798 
799                 if ((wd->wlanMode == ZM_MODE_INFRASTRUCTURE) &&
800                         (wd->sta.currentAuthMode != ZM_AUTH_MODE_WPA2)) {
801                         /* send deauthentication frame */
802                         if (isConnected) {
803                                 /* zfiWlanDeauth(dev, NULL, 0); */
804                                 zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH,
805                                                 wd->sta.bssid, 3, 0, 0);
806                                 /* zmw_debug_msg0("send a Deauth frame!"); */
807                         }
808                 }
809 
810                 /* Remove all the connected peer stations */
811                 if (wd->wlanMode == ZM_MODE_IBSS) {
812                         wd->sta.ibssBssIsCreator = 0;
813                         zfTimerCancel(dev, ZM_EVENT_IBSS_MONITOR);
814                         zfStaIbssMonitoring(dev, 1);
815                 }
816 
817 #ifdef ZM_ENABLE_IBSS_WPA2PSK
818                 zmw_enter_critical_section(dev);
819                 wd->sta.ibssWpa2Psk = 0;
820                 zmw_leave_critical_section(dev);
821 #endif
822 
823                 wd->sta.wpaState = ZM_STA_WPA_STATE_INIT;
824 
825                 /* reset connect timeout counter */
826                 wd->sta.connectTimeoutCount = 0;
827 
828                 /* reset connectState to None */
829                 wd->sta.connectState = ZM_STA_CONN_STATE_NONE;
830 
831                 /* reset leap enable variable */
832                 wd->sta.leapEnabled = 0;
833 
834                 /* Disable the RIFS Status/RIFS-like frame count/RIFS count */
835                 if (wd->sta.rifsState == ZM_RIFS_STATE_DETECTED)
836                         zfHpDisableRifs(dev);
837                 wd->sta.rifsState = ZM_RIFS_STATE_DETECTING;
838                 wd->sta.rifsLikeFrameCnt = 0;
839                 wd->sta.rifsCount = 0;
840 
841                 wd->sta.osRxFilter = 0;
842                 wd->sta.bSafeMode = 0;
843 
844                 zfChangeAdapterState(dev, ZM_STA_STATE_DISCONNECT);
845                 if (ResetKeyCache)
846                         zfHpResetKeyCache(dev);
847 
848                 if (isConnected) {
849                         if (wd->zfcbConnectNotify != NULL)
850                                 wd->zfcbConnectNotify(dev,
851                                 ZM_STATUS_MEDIA_CONNECTION_DISABLED,
852                                 wd->sta.bssid);
853                 } else {
854                         if (wd->zfcbConnectNotify != NULL)
855                                 wd->zfcbConnectNotify(dev,
856                                 ZM_STATUS_MEDIA_DISABLED, wd->sta.bssid);
857                 }
858         } else { /* if (wd->wlanMode == ZM_MODE_AP) */
859                 for (i = 0; i < ZM_MAX_STA_SUPPORT; i++) {
860                         /* send deauthentication frame */
861                         if (wd->ap.staTable[i].valid == 1) {
862                                 /* Reason : Sending station is leaving */
863                                 zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH,
864                                 wd->ap.staTable[i].addr, 3, 0, 0);
865                         }
866                 }
867 
868                 if (ResetKeyCache)
869                         zfHpResetKeyCache(dev);
870 
871                 wd->ap.vapNumber--;
872         }
873 
874         /* stop beacon */
875         zfHpDisableBeacon(dev);
876 
877         /* Flush VTxQ and MmQ */
878         zfFlushVtxq(dev);
879         /* Flush AP PS queues */
880         zfApFlushBufferedPsFrame(dev);
881         /* Free buffer in defragment list*/
882         zfAgingDefragList(dev, 1);
883 
884 #ifdef ZM_ENABLE_AGGREGATION
885         /* add by honda */
886         zfAggRxFreeBuf(dev, 0);  /* 1 for release structure memory */
887         /* end of add by honda */
888 #endif
889 
890         /* Clear the information for the peer stations
891         of IBSS or AP of Station mode
892         */
893         zfZeroMemory((u8_t *)wd->sta.oppositeInfo,
894                         sizeof(struct zsOppositeInfo) * ZM_MAX_OPPOSITE_COUNT);
895 
896         /* Turn off Software WEP/TKIP */
897         if (wd->sta.SWEncryptEnable != 0) {
898                 zm_debug_msg0("Disable software encryption");
899                 zfStaDisableSWEncryption(dev);
900         }
901 
902         /* Improve WEP/TKIP performace with HT AP,
903         detail information please look bug#32495 */
904         /* zfHpSetTTSIFSTime(dev, 0x8); */
905 
906         return 0;
907 }
908 
909 u16_t zfiWlanSuspend(zdev_t *dev)
910 {
911         zmw_get_wlan_dev(dev);
912         zmw_declare_for_critical_section();
913 
914         /* Change the HAL state to init so that any packet
915         can't be transmitted between resume & HAL reinit.
916         This would cause the chip hang issue in OTUS.
917         */
918         zmw_enter_critical_section(dev);
919         wd->halState = ZM_HAL_STATE_INIT;
920         zmw_leave_critical_section(dev);
921 
922         return 0;
923 }
924 
925 u16_t zfiWlanResume(zdev_t *dev, u8_t doReconn)
926 {
927         u16_t ret;
928         zmw_get_wlan_dev(dev);
929         zmw_declare_for_critical_section();
930 
931         /* Redownload firmware, Reinit MAC,PHY,RF */
932         zfHpReinit(dev, wd->frequency);
933 
934         /* Set channel according to AP's configuration */
935         zfCoreSetFrequencyExV2(dev, wd->frequency, wd->BandWidth40,
936                 wd->ExtOffset, NULL, 1);
937 
938         zfHpSetMacAddress(dev, wd->macAddr, 0);
939 
940         /* Start Rx */
941         zfHpStartRecv(dev);
942 
943         zfFlushVtxq(dev);
944 
945         if (wd->wlanMode != ZM_MODE_INFRASTRUCTURE &&
946                         wd->wlanMode != ZM_MODE_IBSS)
947                 return 1;
948 
949         zm_msg0_mm(ZM_LV_1, "Resume Wlan");
950         if ((zfStaIsConnected(dev)) || (zfStaIsConnecting(dev))) {
951                 if (doReconn == 1) {
952                         zm_msg0_mm(ZM_LV_1, "Re-connect...");
953                         zmw_enter_critical_section(dev);
954                         wd->sta.connectByReasso = FALSE;
955                         zmw_leave_critical_section(dev);
956 
957                         zfWlanEnable(dev);
958                 } else if (doReconn == 0)
959                         zfHpSetRollCallTable(dev);
960         }
961 
962         ret = 0;
963 
964         return ret;
965 }
966 
967 /************************************************************************/
968 /*                                                                      */
969 /*    FUNCTION DESCRIPTION                 zfiWlanFlushAllQueuedBuffers */
970 /*      Flush Virtual TxQ, MmQ, PS frames and defragment list           */
971 /*                                                                      */
972 /*    INPUTS                                                            */
973 /*      dev : device pointer                                            */
974 /*                                                                      */
975 /*    OUTPUTS                                                           */
976 /*      None                                                            */
977 /*                                                                      */
978 /*    AUTHOR                                                            */
979 /*      Stephen Chen        Atheros Communications, INC.    2007.1      */
980 /*                                                                      */
981 /************************************************************************/
982 void zfiWlanFlushAllQueuedBuffers(zdev_t *dev)
983 {
984         /* Flush VTxQ and MmQ */
985         zfFlushVtxq(dev);
986         /* Flush AP PS queues */
987         zfApFlushBufferedPsFrame(dev);
988         /* Free buffer in defragment list*/
989         zfAgingDefragList(dev, 1);
990 }
991 
992 /* Do WLAN site survey */
993 u16_t zfiWlanScan(zdev_t *dev)
994 {
995         u16_t ret = 1;
996         zmw_get_wlan_dev(dev);
997 
998         zm_debug_msg0("");
999 
1000         zmw_declare_for_critical_section();
1001 
1002         zmw_enter_critical_section(dev);
1003 
1004         if (wd->wlanMode == ZM_MODE_AP) {
1005                 wd->heartBeatNotification |= ZM_BSSID_LIST_SCAN;
1006                 wd->sta.scanFrequency = 0;
1007                 /* wd->sta.pUpdateBssList->bssCount = 0; */
1008                 ret = 0;
1009         } else {
1010 #if 0
1011                 if (!zfStaBlockWlanScan(dev)) {
1012                         zm_debug_msg0("scan request");
1013                         /*zfTimerSchedule(dev, ZM_EVENT_SCAN, ZM_TICK_ZERO);*/
1014                         ret = 0;
1015                         goto start_scan;
1016                 }
1017 #else
1018                 goto start_scan;
1019 #endif
1020         }
1021 
1022         zmw_leave_critical_section(dev);
1023 
1024         return ret;
1025 
1026 start_scan:
1027         zmw_leave_critical_section(dev);
1028 
1029         if (wd->ledStruct.LEDCtrlFlagFromReg & ZM_LED_CTRL_FLAG_ALPHA) {
1030                 /* flag for Alpha */
1031                 wd->ledStruct.LEDCtrlFlag |= ZM_LED_CTRL_FLAG_ALPHA;
1032         }
1033 
1034         ret = zfScanMgrScanStart(dev, ZM_SCAN_MGR_SCAN_EXTERNAL);
1035 
1036         zm_debug_msg1("ret = ", ret);
1037 
1038         return ret;
1039 }
1040 
1041 
1042 /* rate                 */
1043 /*    0 : AUTO          */
1044 /*    1 : CCK 1M        */
1045 /*    2 : CCK 2M        */
1046 /*    3 : CCK 5.5M      */
1047 /*    4 : CCK 11M       */
1048 /*    5 : OFDM 6M       */
1049 /*    6 : OFDM 9M       */
1050 /*    7 : OFDM 12M      */
1051 /*    8 : OFDM 18M      */
1052 /*    9 : OFDM 24M      */
1053 /*    10 : OFDM 36M     */
1054 /*    11 : OFDM 48M     */
1055 /*    12 : OFDM 54M     */
1056 /*    13 : MCS 0        */
1057 /*    28 : MCS 15       */
1058 u16_t zcRateToMCS[] =
1059     {0xff, 0, 1, 2, 3, 0xb, 0xf, 0xa, 0xe, 0x9, 0xd, 0x8, 0xc};
1060 u16_t zcRateToMT[] = {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1};
1061 
1062 u16_t zfiWlanSetTxRate(zdev_t *dev, u16_t rate)
1063 {
1064         /* jhlee HT 0 */
1065         zmw_get_wlan_dev(dev);
1066 
1067         if (rate <= 12) {
1068                 wd->txMCS = zcRateToMCS[rate];
1069                 wd->txMT = zcRateToMT[rate];
1070                 return ZM_SUCCESS;
1071         } else if ((rate <= 28) || (rate == 13 + 32)) {
1072                 wd->txMCS = rate - 12 - 1;
1073                 wd->txMT = 2;
1074                 return ZM_SUCCESS;
1075         }
1076 
1077         return ZM_ERR_INVALID_TX_RATE;
1078 }
1079 
1080 const u32_t zcRateIdToKbps40M[] =
1081 {
1082         1000, 2000, 5500, 11000, /* 1M, 2M, 5M, 11M ,  0  1  2  3             */
1083         6000, 9000, 12000, 18000, /* 6M  9M  12M  18M ,  4  5  6  7           */
1084         24000, 36000, 48000, 54000, /* 24M  36M  48M  54M ,  8  9 10 11       */
1085         13500, 27000, 40500, 54000, /* MCS0 MCS1 MCS2 MCS3 , 12 13 14 15      */
1086         81000, 108000, 121500, 135000, /* MCS4 MCS5 MCS6 MCS7 , 16 17 18 19   */
1087         27000, 54000, 81000, 108000, /* MCS8 MCS9 MCS10 MCS11 , 20 21 22 23   */
1088         162000, 216000, 243000, 270000, /*MCS12 MCS13 MCS14 MCS15, 24 25 26 27*/
1089         270000, 300000, 150000  /* MCS14SG, MCS15SG, MCS7SG , 28 29 30        */
1090 };
1091 
1092 const u32_t zcRateIdToKbps20M[] =
1093 {
1094         1000, 2000, 5500, 11000, /* 1M, 2M, 5M, 11M ,  0  1  2  3             */
1095         6000, 9000, 12000, 18000, /* 6M  9M  12M  18M  ,  4  5  6  7          */
1096         24000, 36000, 48000, 54000, /* 24M  36M  48M  54M ,  8  9 10 11       */
1097         6500, 13000, 19500, 26000, /* MCS0 MCS1 MCS2 MCS3 , 12 13 14 15       */
1098         39000, 52000, 58500, 65000, /* MCS4 MCS5 MCS6 MCS7 , 16 17 18 19      */
1099         13000, 26000, 39000, 52000, /* MCS8 MCS9 MCS10 MCS11 , 20 21 22 23    */
1100         78000, 104000, 117000, 130000, /* MCS12 MCS13 MCS14 MCS15, 24 25 26 27*/
1101         130000, 144400, 72200  /* MCS14SG, MCS15SG, MSG7SG , 28 29 30         */
1102 };
1103 
1104 u32_t zfiWlanQueryTxRate(zdev_t *dev)
1105 {
1106         u8_t rateId = 0xff;
1107         zmw_get_wlan_dev(dev);
1108         zmw_declare_for_critical_section();
1109 
1110         /* If Tx rate had not been trained, return maximum Tx rate instead */
1111         if ((wd->wlanMode == ZM_MODE_INFRASTRUCTURE) &&
1112                                                 (zfStaIsConnected(dev))) {
1113                 zmw_enter_critical_section(dev);
1114                 /* Not in fixed rate mode */
1115                 if (wd->txMCS == 0xff) {
1116                         if ((wd->sta.oppositeInfo[0].rcCell.flag &
1117                                                         ZM_RC_TRAINED_BIT) == 0)
1118                                 rateId = wd->sta.oppositeInfo[0].rcCell. \
1119                                 operationRateSet[wd->sta.oppositeInfo[0]. \
1120                                 rcCell.operationRateCount-1];
1121                         else
1122                                 rateId = wd->sta.oppositeInfo[0].rcCell. \
1123                                 operationRateSet[wd->sta.oppositeInfo[0]. \
1124                                 rcCell.currentRateIndex];
1125                 }
1126                 zmw_leave_critical_section(dev);
1127         }
1128 
1129         if (rateId != 0xff) {
1130                 if (wd->sta.htCtrlBandwidth)
1131                         return zcRateIdToKbps40M[rateId];
1132                 else
1133                         return zcRateIdToKbps20M[rateId];
1134         } else
1135                 return wd->CurrentTxRateKbps;
1136 }
1137 
1138 void zfWlanUpdateRxRate(zdev_t *dev, struct zsAdditionInfo *addInfo)
1139 {
1140         u32_t rxRateKbps;
1141         zmw_get_wlan_dev(dev);
1142         /* zm_msg1_mm(ZM_LV_0, "addInfo->Tail.Data.RxMacStatus =",
1143         *  addInfo->Tail.Data.RxMacStatus & 0x03);
1144         */
1145 
1146         /* b5~b4: MPDU indication.                */
1147         /*        00: Single MPDU.                */
1148         /*        10: First MPDU of A-MPDU.       */
1149         /*        11: Middle MPDU of A-MPDU.      */
1150         /*        01: Last MPDU of A-MPDU.        */
1151         /* Only First MPDU and Single MPDU have PLCP header */
1152         /* First MPDU  : (mpduInd & 0x30) == 0x00 */
1153         /* Single MPDU : (mpduInd & 0x30) == 0x20 */
1154         if ((addInfo->Tail.Data.RxMacStatus & 0x10) == 0) {
1155                 /* Modulation type */
1156                 wd->modulationType = addInfo->Tail.Data.RxMacStatus & 0x03;
1157                 switch (wd->modulationType) {
1158                 /* CCK mode */
1159                 case 0x0:
1160                         wd->rateField = addInfo->PlcpHeader[0] & 0xff;
1161                         wd->rxInfo = 0;
1162                         break;
1163                 /* Legacy-OFDM mode */
1164                 case 0x1:
1165                         wd->rateField = addInfo->PlcpHeader[0] & 0x0f;
1166                         wd->rxInfo = 0;
1167                         break;
1168                 /* HT-OFDM mode */
1169                 case 0x2:
1170                         wd->rateField = addInfo->PlcpHeader[3];
1171                         wd->rxInfo = addInfo->PlcpHeader[6];
1172                         break;
1173                 default:
1174                         break;
1175                 }
1176 
1177                 rxRateKbps = zfUpdateRxRate(dev);
1178                 if (wd->CurrentRxRateUpdated == 1) {
1179                         if (rxRateKbps > wd->CurrentRxRateKbps)
1180                                 wd->CurrentRxRateKbps = rxRateKbps;
1181                 } else {
1182                         wd->CurrentRxRateKbps = rxRateKbps;
1183                         wd->CurrentRxRateUpdated = 1;
1184                 }
1185         }
1186 }
1187 
1188 #if 0
1189 u16_t zcIndextoRateBG[16] = {1000, 2000, 5500, 11000, 0, 0, 0, 0, 48000,
1190                         24000, 12000, 6000, 54000, 36000, 18000, 9000};
1191 u32_t zcIndextoRateN20L[16] = {6500, 13000, 19500, 26000, 39000, 52000, 58500,
1192                         65000, 13000, 26000, 39000, 52000, 78000, 104000,
1193                         117000, 130000};
1194 u32_t zcIndextoRateN20S[16] = {7200, 14400, 21700, 28900, 43300, 57800, 65000,
1195                         72200, 14400, 28900, 43300, 57800, 86700, 115600,
1196                         130000, 144400};
1197 u32_t zcIndextoRateN40L[16] = {13500, 27000, 40500, 54000, 81000, 108000,
1198                         121500, 135000, 27000, 54000, 81000, 108000,
1199                         162000, 216000, 243000, 270000};
1200 u32_t zcIndextoRateN40S[16] = {15000, 30000, 45000, 60000, 90000, 120000,
1201                         135000, 150000, 30000, 60000, 90000, 120000,
1202                         180000, 240000, 270000, 300000};
1203 #endif
1204 
1205 extern u16_t zcIndextoRateBG[16];
1206 extern u32_t zcIndextoRateN20L[16];
1207 extern u32_t zcIndextoRateN20S[16];
1208 extern u32_t zcIndextoRateN40L[16];
1209 extern u32_t zcIndextoRateN40S[16];
1210 
1211 u32_t zfiWlanQueryRxRate(zdev_t *dev)
1212 {
1213         zmw_get_wlan_dev(dev);
1214 
1215         wd->CurrentRxRateUpdated = 0;
1216         return wd->CurrentRxRateKbps;
1217 }
1218 
1219 u32_t zfUpdateRxRate(zdev_t *dev)
1220 {
1221         u8_t mcs, bandwidth;
1222         u32_t rxRateKbps = 130000;
1223         zmw_get_wlan_dev(dev);
1224 
1225         switch (wd->modulationType) {
1226         /* CCK mode */
1227         case 0x0:
1228                 switch (wd->rateField) {
1229                 case 0x0a:
1230                         rxRateKbps = 1000;
1231                         break;
1232                 case 0x14:
1233                         rxRateKbps = 2000;
1234 
1235                 case 0x37:
1236                         rxRateKbps = 5500;
1237                         break;
1238                 case 0x6e:
1239                         rxRateKbps = 11000;
1240                         break;
1241                 default:
1242                         break;
1243                 }
1244                 break;
1245         /* Legacy-OFDM mode */
1246         case 0x1:
1247                 if (wd->rateField <= 15)
1248                         rxRateKbps = zcIndextoRateBG[wd->rateField];
1249                 break;
1250         /* HT-OFDM mode */
1251         case 0x2:
1252                 mcs = wd->rateField & 0x7F;
1253                 bandwidth = wd->rateField & 0x80;
1254                 if (mcs <= 15) {
1255                         if (bandwidth != 0) {
1256                                 if ((wd->rxInfo & 0x80) != 0) {
1257                                         /* Short GI 40 MHz MIMO Rate */
1258                                         rxRateKbps = zcIndextoRateN40S[mcs];
1259                                 } else {
1260                                         /* Long GI 40 MHz MIMO Rate */
1261                                         rxRateKbps = zcIndextoRateN40L[mcs];
1262                                 }
1263                         } else {
1264                                 if ((wd->rxInfo & 0x80) != 0) {
1265                                         /* Short GI 20 MHz MIMO Rate */
1266                                         rxRateKbps = zcIndextoRateN20S[mcs];
1267                                 } else {
1268                                         /* Long GI 20 MHz MIMO Rate */
1269                                         rxRateKbps = zcIndextoRateN20L[mcs];
1270                                 }
1271                         }
1272                 }
1273                 break;
1274         default:
1275                 break;
1276         }
1277         /*      zm_msg1_mm(ZM_LV_0, "wd->CurrentRxRateKbps=",
1278                 wd->CurrentRxRateKbps);
1279         */
1280 
1281         /* ToDo: use bandwith field to define 40MB */
1282         return rxRateKbps;
1283 }
1284 
1285 /* Get WLAN stastics */
1286 u16_t zfiWlanGetStatistics(zdev_t *dev)
1287 {
1288         /* Return link statistics */
1289         return 0;
1290 }
1291 
1292 u16_t zfiWlanReset(zdev_t *dev)
1293 {
1294         zmw_get_wlan_dev(dev);
1295 
1296         wd->state = ZM_WLAN_STATE_DISABLED;
1297 
1298         return zfWlanReset(dev);
1299 }
1300 
1301 /* Reset WLAN */
1302 u16_t zfWlanReset(zdev_t *dev)
1303 {
1304         u8_t isConnected;
1305         zmw_get_wlan_dev(dev);
1306 
1307         zmw_declare_for_critical_section();
1308 
1309         zm_debug_msg0("zfWlanReset");
1310 
1311         isConnected = zfStaIsConnected(dev);
1312 
1313         /* if ( wd->wlanMode != ZM_MODE_AP ) */
1314         {
1315                 if ((wd->wlanMode == ZM_MODE_INFRASTRUCTURE) &&
1316                 (wd->sta.currentAuthMode != ZM_AUTH_MODE_WPA2)) {
1317                         /* send deauthentication frame */
1318                         if (isConnected) {
1319                                 /* zfiWlanDeauth(dev, NULL, 0); */
1320                                 zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH,
1321                                                 wd->sta.bssid, 3, 0, 0);
1322                                 /* zmw_debug_msg0("send a Deauth frame!"); */
1323                         }
1324                 }
1325         }
1326 
1327         zfChangeAdapterState(dev, ZM_STA_STATE_DISCONNECT);
1328         zfHpResetKeyCache(dev);
1329 
1330         if (isConnected) {
1331                 /* zfiWlanDisable(dev); */
1332                 if (wd->zfcbConnectNotify != NULL)
1333                         wd->zfcbConnectNotify(dev,
1334                         ZM_STATUS_MEDIA_CONNECTION_RESET, wd->sta.bssid);
1335         } else {
1336                 if (wd->zfcbConnectNotify != NULL)
1337                         wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_RESET,
1338                                                                 wd->sta.bssid);
1339         }
1340 
1341         /* stop beacon */
1342         zfHpDisableBeacon(dev);
1343 
1344         /* Free buffer in defragment list*/
1345         zfAgingDefragList(dev, 1);
1346 
1347         /* Flush VTxQ and MmQ */
1348         zfFlushVtxq(dev);
1349 
1350 #ifdef ZM_ENABLE_AGGREGATION
1351         /* add by honda */
1352         zfAggRxFreeBuf(dev, 0);  /* 1 for release structure memory */
1353         /* end of add by honda */
1354 #endif
1355 
1356         zfStaRefreshBlockList(dev, 1);
1357 
1358         zmw_enter_critical_section(dev);
1359 
1360         zfTimerCancel(dev, ZM_EVENT_IBSS_MONITOR);
1361         zfTimerCancel(dev, ZM_EVENT_CM_BLOCK_TIMER);
1362         zfTimerCancel(dev, ZM_EVENT_CM_DISCONNECT);
1363 
1364         wd->sta.connectState = ZM_STA_CONN_STATE_NONE;
1365         wd->sta.connectByReasso = FALSE;
1366         wd->sta.cmDisallowSsidLength = 0;
1367         wd->sta.bAutoReconnect = 0;
1368         wd->sta.InternalScanReq = 0;
1369         wd->sta.encryMode = ZM_NO_WEP;
1370         wd->sta.wepStatus = ZM_ENCRYPTION_WEP_DISABLED;
1371         wd->sta.wpaState = ZM_STA_WPA_STATE_INIT;
1372         wd->sta.cmMicFailureCount = 0;
1373         wd->sta.ibssBssIsCreator = 0;
1374 #ifdef ZM_ENABLE_IBSS_WPA2PSK
1375         wd->sta.ibssWpa2Psk = 0;
1376 #endif
1377         /* reset connect timeout counter */
1378         wd->sta.connectTimeoutCount = 0;
1379 
1380         /* reset leap enable variable */
1381         wd->sta.leapEnabled = 0;
1382 
1383         /* Reset the RIFS Status / RIFS-like frame count / RIFS count */
1384         if (wd->sta.rifsState == ZM_RIFS_STATE_DETECTED)
1385                 zfHpDisableRifs(dev);
1386         wd->sta.rifsState = ZM_RIFS_STATE_DETECTING;
1387         wd->sta.rifsLikeFrameCnt = 0;
1388         wd->sta.rifsCount = 0;
1389 
1390         wd->sta.osRxFilter = 0;
1391         wd->sta.bSafeMode = 0;
1392 
1393         /*      Clear the information for the peer
1394                 stations of IBSS or AP of Station mode
1395         */
1396         zfZeroMemory((u8_t *)wd->sta.oppositeInfo,
1397                         sizeof(struct zsOppositeInfo) * ZM_MAX_OPPOSITE_COUNT);
1398 
1399         zmw_leave_critical_section(dev);
1400 
1401         zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
1402         zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_EXTERNAL);
1403 
1404         /* Turn off Software WEP/TKIP */
1405         if (wd->sta.SWEncryptEnable != 0) {
1406                 zm_debug_msg0("Disable software encryption");
1407                 zfStaDisableSWEncryption(dev);
1408         }
1409 
1410         /*      Improve WEP/TKIP performace with HT AP,
1411                 detail information please look bug#32495
1412         */
1413         /* zfHpSetTTSIFSTime(dev, 0x8); */
1414 
1415         /* Keep Pseudo mode */
1416         if (wd->wlanMode != ZM_MODE_PSEUDO)
1417                 wd->wlanMode = ZM_MODE_INFRASTRUCTURE;
1418 
1419         return 0;
1420 }
1421 
1422 /* Deauthenticate a STA */
1423 u16_t zfiWlanDeauth(zdev_t *dev, u16_t *macAddr, u16_t reason)
1424 {
1425         zmw_get_wlan_dev(dev);
1426 
1427         if (wd->wlanMode == ZM_MODE_AP) {
1428                 /* u16_t id; */
1429 
1430                 /*
1431                 * we will reset all key in zfHpResetKeyCache() when call
1432                 * zfiWlanDisable(), if we want to reset PairwiseKey for each
1433                 * sta, need to use a nullAddr to let keyindex not match.
1434                 * otherwise hardware will still find PairwiseKey when AP change
1435                 * encryption mode from WPA to WEP
1436                 */
1437 
1438                 /*
1439                 if ((id = zfApFindSta(dev, macAddr)) != 0xffff)
1440                 {
1441                         u32_t key[8];
1442                         u16_t nullAddr[3] = { 0x0, 0x0, 0x0 };
1443 
1444                         if (wd->ap.staTable[i].encryMode != ZM_NO_WEP)
1445                         {
1446                                 zfHpSetApPairwiseKey(dev, nullAddr,
1447                                 ZM_NO_WEP, &key[0], &key[4], i+1);
1448                         }
1449                         //zfHpSetApPairwiseKey(dev, (u16_t *)macAddr,
1450                         //        ZM_NO_WEP, &key[0], &key[4], id+1);
1451                 wd->ap.staTable[id].encryMode = ZM_NO_WEP;
1452                 wd->ap.staTable[id].keyIdx = 0xff;
1453                 }
1454                 */
1455 
1456                 zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, macAddr,
1457                                                                 reason, 0, 0);
1458         } else
1459                 zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH,
1460                                                 wd->sta.bssid, 3, 0, 0);
1461 
1462         /* Issue DEAUTH command to FW */
1463         return 0;
1464 }
1465 
1466 
1467 /* XP packet filter feature : */
1468 /* 1=>enable: All multicast address packets, not just the ones */
1469 /* enumerated in the multicast address list. */
1470 /* 0=>disable */
1471 void zfiWlanSetAllMulticast(zdev_t *dev, u32_t setting)
1472 {
1473         zmw_get_wlan_dev(dev);
1474         zm_msg1_mm(ZM_LV_0, "sta.bAllMulticast = ", setting);
1475         wd->sta.bAllMulticast = (u8_t)setting;
1476 }
1477 
1478 
1479 /* HT configure API */
1480 void zfiWlanSetHTCtrl(zdev_t *dev, u32_t *setting, u32_t forceTxTPC)
1481 {
1482         zmw_get_wlan_dev(dev);
1483 
1484         wd->preambleType        = (u8_t)setting[0];
1485         wd->sta.preambleTypeHT  = (u8_t)setting[1];
1486         wd->sta.htCtrlBandwidth = (u8_t)setting[2];
1487         wd->sta.htCtrlSTBC      = (u8_t)setting[3];
1488         wd->sta.htCtrlSG        = (u8_t)setting[4];
1489         wd->sta.defaultTA       = (u8_t)setting[5];
1490         wd->enableAggregation   = (u8_t)setting[6];
1491         wd->enableWDS           = (u8_t)setting[7];
1492 
1493         wd->forceTxTPC          = forceTxTPC;
1494 }
1495 
1496 /* FB50 in OS XP, RD private test code */
1497 void zfiWlanQueryHTCtrl(zdev_t *dev, u32_t *setting, u32_t *forceTxTPC)
1498 {
1499         zmw_get_wlan_dev(dev);
1500 
1501         setting[0] = wd->preambleType;
1502         setting[1] = wd->sta.preambleTypeHT;
1503         setting[2] = wd->sta.htCtrlBandwidth;
1504         setting[3] = wd->sta.htCtrlSTBC;
1505         setting[4] = wd->sta.htCtrlSG;
1506         setting[5] = wd->sta.defaultTA;
1507         setting[6] = wd->enableAggregation;
1508         setting[7] = wd->enableWDS;
1509 
1510         *forceTxTPC = wd->forceTxTPC;
1511 }
1512 
1513 void zfiWlanDbg(zdev_t *dev, u8_t setting)
1514 {
1515         zmw_get_wlan_dev(dev);
1516 
1517         wd->enableHALDbgInfo = setting;
1518 }
1519 
1520 /* FB50 in OS XP, RD private test code */
1521 void zfiWlanSetRxPacketDump(zdev_t *dev, u32_t setting)
1522 {
1523         zmw_get_wlan_dev(dev);
1524         if (setting)
1525                 wd->rxPacketDump = 1;   /* enable */
1526         else
1527                 wd->rxPacketDump = 0;   /* disable */
1528 }
1529 
1530 
1531 /* FB50 in OS XP, RD private test code */
1532 /* Tally */
1533 void zfiWlanResetTally(zdev_t *dev)
1534 {
1535         zmw_get_wlan_dev(dev);
1536 
1537         zmw_declare_for_critical_section();
1538 
1539         zmw_enter_critical_section(dev);
1540 
1541         wd->commTally.txUnicastFrm = 0;         /* txUnicastFrames */
1542         wd->commTally.txMulticastFrm = 0;       /* txMulticastFrames */
1543         wd->commTally.txUnicastOctets = 0;      /* txUniOctets  byte size */
1544         wd->commTally.txMulticastOctets = 0;    /* txMultiOctets  byte size */
1545         wd->commTally.txFrmUpperNDIS = 0;
1546         wd->commTally.txFrmDrvMgt = 0;
1547         wd->commTally.RetryFailCnt = 0;
1548         wd->commTally.Hw_TotalTxFrm = 0;        /* Hardware total Tx Frame */
1549         wd->commTally.Hw_RetryCnt = 0;          /* txMultipleRetriesFrames */
1550         wd->commTally.Hw_UnderrunCnt = 0;
1551         wd->commTally.DriverRxFrmCnt = 0;
1552         wd->commTally.rxUnicastFrm = 0;         /* rxUnicastFrames */
1553         wd->commTally.rxMulticastFrm = 0;       /* rxMulticastFrames */
1554         wd->commTally.NotifyNDISRxFrmCnt = 0;
1555         wd->commTally.rxUnicastOctets = 0;      /* rxUniOctets  byte size */
1556         wd->commTally.rxMulticastOctets = 0;    /* rxMultiOctets  byte size */
1557         wd->commTally.DriverDiscardedFrm = 0;   /* Discard by ValidateFrame */
1558         wd->commTally.LessThanDataMinLen = 0;
1559         wd->commTally.GreaterThanMaxLen = 0;
1560         wd->commTally.DriverDiscardedFrmCauseByMulticastList = 0;
1561         wd->commTally.DriverDiscardedFrmCauseByFrmCtrl = 0;
1562         wd->commTally.rxNeedFrgFrm = 0;         /* need more frg frm */
1563         wd->commTally.DriverRxMgtFrmCnt = 0;
1564         wd->commTally.rxBroadcastFrm = 0;/* Receive broadcast frame count */
1565         wd->commTally.rxBroadcastOctets = 0;/*Receive broadcast framebyte size*/
1566         wd->commTally.Hw_TotalRxFrm = 0;
1567         wd->commTally.Hw_CRC16Cnt = 0;          /* rxPLCPCRCErrCnt */
1568         wd->commTally.Hw_CRC32Cnt = 0;          /* rxCRC32ErrCnt */
1569         wd->commTally.Hw_DecrypErr_UNI = 0;
1570         wd->commTally.Hw_DecrypErr_Mul = 0;
1571         wd->commTally.Hw_RxFIFOOverrun = 0;
1572         wd->commTally.Hw_RxTimeOut = 0;
1573         wd->commTally.LossAP = 0;
1574 
1575         wd->commTally.Tx_MPDU = 0;
1576         wd->commTally.BA_Fail = 0;
1577         wd->commTally.Hw_Tx_AMPDU = 0;
1578         wd->commTally.Hw_Tx_MPDU = 0;
1579 
1580         wd->commTally.txQosDropCount[0] = 0;
1581         wd->commTally.txQosDropCount[1] = 0;
1582         wd->commTally.txQosDropCount[2] = 0;
1583         wd->commTally.txQosDropCount[3] = 0;
1584         wd->commTally.txQosDropCount[4] = 0;
1585 
1586         wd->commTally.Hw_RxMPDU = 0;
1587         wd->commTally.Hw_RxDropMPDU = 0;
1588         wd->commTally.Hw_RxDelMPDU = 0;
1589 
1590         wd->commTally.Hw_RxPhyMiscError = 0;
1591         wd->commTally.Hw_RxPhyXRError = 0;
1592         wd->commTally.Hw_RxPhyOFDMError = 0;
1593         wd->commTally.Hw_RxPhyCCKError = 0;
1594         wd->commTally.Hw_RxPhyHTError = 0;
1595         wd->commTally.Hw_RxPhyTotalCount = 0;
1596 
1597 #if (defined(GCCK) && defined(OFDM))
1598         wd->commTally.rx11bDataFrame = 0;
1599         wd->commTally.rxOFDMDataFrame = 0;
1600 #endif
1601 
1602         zmw_leave_critical_section(dev);
1603 }
1604 
1605 /* FB50 in OS XP, RD private test code */
1606 void zfiWlanQueryTally(zdev_t *dev, struct zsCommTally *tally)
1607 {
1608         zmw_get_wlan_dev(dev);
1609 
1610         zmw_declare_for_critical_section();
1611 
1612         zmw_enter_critical_section(dev);
1613         zfMemoryCopy((u8_t *)tally, (u8_t *)&wd->commTally,
1614                                                 sizeof(struct zsCommTally));
1615         zmw_leave_critical_section(dev);
1616 }
1617 
1618 void zfiWlanQueryTrafTally(zdev_t *dev, struct zsTrafTally *tally)
1619 {
1620         zmw_get_wlan_dev(dev);
1621 
1622         zmw_declare_for_critical_section();
1623 
1624         zmw_enter_critical_section(dev);
1625         zfMemoryCopy((u8_t *)tally, (u8_t *)&wd->trafTally,
1626                                                 sizeof(struct zsTrafTally));
1627         zmw_leave_critical_section(dev);
1628 }
1629 
1630 void zfiWlanQueryMonHalRxInfo(zdev_t *dev, struct zsMonHalRxInfo *monHalRxInfo)
1631 {
1632         zfHpQueryMonHalRxInfo(dev, (u8_t *)monHalRxInfo);
1633 }
1634 
1635 /* parse the modeMDKEnable to DrvCore */
1636 void zfiDKEnable(zdev_t *dev, u32_t enable)
1637 {
1638         zmw_get_wlan_dev(dev);
1639 
1640         wd->modeMDKEnable = enable;
1641         zm_debug_msg1("modeMDKEnable = ", wd->modeMDKEnable);
1642 }
1643 
1644 /* airoPeek */
1645 u32_t zfiWlanQueryPacketTypePromiscuous(zdev_t *dev)
1646 {
1647         zmw_get_wlan_dev(dev);
1648 
1649         return wd->swSniffer;
1650 }
1651 
1652 /* airoPeek */
1653 void zfiWlanSetPacketTypePromiscuous(zdev_t *dev, u32_t setValue)
1654 {
1655         zmw_get_wlan_dev(dev);
1656 
1657         wd->swSniffer = setValue;
1658         zm_msg1_mm(ZM_LV_0, "wd->swSniffer ", wd->swSniffer);
1659         if (setValue) {
1660                 /* write register for sniffer mode */
1661                 zfHpSetSnifferMode(dev, 1);
1662                 zm_msg0_mm(ZM_LV_1, "enalbe sniffer mode");
1663         } else {
1664                 zfHpSetSnifferMode(dev, 0);
1665                 zm_msg0_mm(ZM_LV_0, "disalbe sniffer mode");
1666         }
1667 }
1668 
1669 void zfiWlanSetXLinkMode(zdev_t *dev, u32_t setValue)
1670 {
1671         zmw_get_wlan_dev(dev);
1672 
1673         wd->XLinkMode = setValue;
1674         if (setValue) {
1675                 /* write register for sniffer mode */
1676                 zfHpSetSnifferMode(dev, 1);
1677         } else
1678                 zfHpSetSnifferMode(dev, 0);
1679 }
1680 
1681 extern void zfStaChannelManagement(zdev_t *dev, u8_t scan);
1682 
1683 void zfiSetChannelManagement(zdev_t *dev, u32_t setting)
1684 {
1685         zmw_get_wlan_dev(dev);
1686 
1687         switch (setting) {
1688         case 1:
1689                 wd->sta.EnableHT = 1;
1690                 wd->BandWidth40 = 1;
1691                 wd->ExtOffset   = 1;
1692                 break;
1693         case 3:
1694                 wd->sta.EnableHT = 1;
1695                 wd->BandWidth40 = 1;
1696                 wd->ExtOffset   = 3;
1697                 break;
1698         case 0:
1699                 wd->sta.EnableHT = 1;
1700                 wd->BandWidth40 = 0;
1701                 wd->ExtOffset   = 0;
1702                 break;
1703         default:
1704                 wd->BandWidth40 = 0;
1705                 wd->ExtOffset   = 0;
1706                 break;
1707         }
1708 
1709         zfCoreSetFrequencyEx(dev, wd->frequency, wd->BandWidth40,
1710                                                         wd->ExtOffset, NULL);
1711 }
1712 
1713 void zfiSetRifs(zdev_t *dev, u16_t setting)
1714 {
1715         zmw_get_wlan_dev(dev);
1716 
1717         wd->sta.ie.HtInfo.ChannelInfo |= ExtHtCap_RIFSMode;
1718         wd->sta.EnableHT = 1;
1719 
1720         switch (setting) {
1721         case 0:
1722                 wd->sta.HT2040 = 0;
1723                 /* zfHpSetRifs(dev, 1, 0,
1724                 *  (wd->sta.currentFrequency < 3000)? 1:0);
1725                 */
1726                 break;
1727         case 1:
1728                 wd->sta.HT2040 = 1;
1729                 /* zfHpSetRifs(dev, 1, 1,
1730                 *  (wd->sta.currentFrequency < 3000)? 1:0);
1731                 */
1732                 break;
1733         default:
1734                 wd->sta.HT2040 = 0;
1735                 /* zfHpSetRifs(dev, 1, 0,
1736                 *  (wd->sta.currentFrequency < 3000)? 1:0);
1737                 */
1738                 break;
1739         }
1740 }
1741 
1742 void zfiCheckRifs(zdev_t *dev)
1743 {
1744         zmw_get_wlan_dev(dev);
1745 
1746         if (wd->sta.ie.HtInfo.ChannelInfo & ExtHtCap_RIFSMode)
1747                 ;
1748                 /* zfHpSetRifs(dev, wd->sta.EnableHT, wd->sta.HT2040,
1749                 *  (wd->sta.currentFrequency < 3000)? 1:0);
1750                 */
1751 }
1752 
1753 void zfiSetReorder(zdev_t *dev, u16_t value)
1754 {
1755         zmw_get_wlan_dev(dev);
1756 
1757         wd->reorder = value;
1758 }
1759 
1760 void zfiSetSeqDebug(zdev_t *dev, u16_t value)
1761 {
1762         zmw_get_wlan_dev(dev);
1763 
1764         wd->seq_debug = value;
1765 }
1766 
  This page was automatically generated by the LXR engine.