Merge branch 'for-linus' of git://www.jni.nu/cris
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / staging / otus / 80211core / ccmd.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 : 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 performance 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 performance 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 id = zfApFindSta(dev, macAddr);
1440 if (id != 0xffff)
1441 {
1442 u32_t key[8];
1443 u16_t nullAddr[3] = { 0x0, 0x0, 0x0 };
1444
1445 if (wd->ap.staTable[i].encryMode != ZM_NO_WEP)
1446 {
1447 zfHpSetApPairwiseKey(dev, nullAddr,
1448 ZM_NO_WEP, &key[0], &key[4], i+1);
1449 }
1450 //zfHpSetApPairwiseKey(dev, (u16_t *)macAddr,
1451 // ZM_NO_WEP, &key[0], &key[4], id+1);
1452 wd->ap.staTable[id].encryMode = ZM_NO_WEP;
1453 wd->ap.staTable[id].keyIdx = 0xff;
1454 }
1455 */
1456
1457 zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, macAddr,
1458 reason, 0, 0);
1459 } else
1460 zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH,
1461 wd->sta.bssid, 3, 0, 0);
1462
1463 /* Issue DEAUTH command to FW */
1464 return 0;
1465 }
1466
1467
1468 /* XP packet filter feature : */
1469 /* 1=>enable: All multicast address packets, not just the ones */
1470 /* enumerated in the multicast address list. */
1471 /* 0=>disable */
1472 void zfiWlanSetAllMulticast(zdev_t *dev, u32_t setting)
1473 {
1474 zmw_get_wlan_dev(dev);
1475 zm_msg1_mm(ZM_LV_0, "sta.bAllMulticast = ", setting);
1476 wd->sta.bAllMulticast = (u8_t)setting;
1477 }
1478
1479
1480 /* HT configure API */
1481 void zfiWlanSetHTCtrl(zdev_t *dev, u32_t *setting, u32_t forceTxTPC)
1482 {
1483 zmw_get_wlan_dev(dev);
1484
1485 wd->preambleType = (u8_t)setting[0];
1486 wd->sta.preambleTypeHT = (u8_t)setting[1];
1487 wd->sta.htCtrlBandwidth = (u8_t)setting[2];
1488 wd->sta.htCtrlSTBC = (u8_t)setting[3];
1489 wd->sta.htCtrlSG = (u8_t)setting[4];
1490 wd->sta.defaultTA = (u8_t)setting[5];
1491 wd->enableAggregation = (u8_t)setting[6];
1492 wd->enableWDS = (u8_t)setting[7];
1493
1494 wd->forceTxTPC = forceTxTPC;
1495 }
1496
1497 /* FB50 in OS XP, RD private test code */
1498 void zfiWlanQueryHTCtrl(zdev_t *dev, u32_t *setting, u32_t *forceTxTPC)
1499 {
1500 zmw_get_wlan_dev(dev);
1501
1502 setting[0] = wd->preambleType;
1503 setting[1] = wd->sta.preambleTypeHT;
1504 setting[2] = wd->sta.htCtrlBandwidth;
1505 setting[3] = wd->sta.htCtrlSTBC;
1506 setting[4] = wd->sta.htCtrlSG;
1507 setting[5] = wd->sta.defaultTA;
1508 setting[6] = wd->enableAggregation;
1509 setting[7] = wd->enableWDS;
1510
1511 *forceTxTPC = wd->forceTxTPC;
1512 }
1513
1514 void zfiWlanDbg(zdev_t *dev, u8_t setting)
1515 {
1516 zmw_get_wlan_dev(dev);
1517
1518 wd->enableHALDbgInfo = setting;
1519 }
1520
1521 /* FB50 in OS XP, RD private test code */
1522 void zfiWlanSetRxPacketDump(zdev_t *dev, u32_t setting)
1523 {
1524 zmw_get_wlan_dev(dev);
1525 if (setting)
1526 wd->rxPacketDump = 1; /* enable */
1527 else
1528 wd->rxPacketDump = 0; /* disable */
1529 }
1530
1531
1532 /* FB50 in OS XP, RD private test code */
1533 /* Tally */
1534 void zfiWlanResetTally(zdev_t *dev)
1535 {
1536 zmw_get_wlan_dev(dev);
1537
1538 zmw_declare_for_critical_section();
1539
1540 zmw_enter_critical_section(dev);
1541
1542 wd->commTally.txUnicastFrm = 0; /* txUnicastFrames */
1543 wd->commTally.txMulticastFrm = 0; /* txMulticastFrames */
1544 wd->commTally.txUnicastOctets = 0; /* txUniOctets byte size */
1545 wd->commTally.txMulticastOctets = 0; /* txMultiOctets byte size */
1546 wd->commTally.txFrmUpperNDIS = 0;
1547 wd->commTally.txFrmDrvMgt = 0;
1548 wd->commTally.RetryFailCnt = 0;
1549 wd->commTally.Hw_TotalTxFrm = 0; /* Hardware total Tx Frame */
1550 wd->commTally.Hw_RetryCnt = 0; /* txMultipleRetriesFrames */
1551 wd->commTally.Hw_UnderrunCnt = 0;
1552 wd->commTally.DriverRxFrmCnt = 0;
1553 wd->commTally.rxUnicastFrm = 0; /* rxUnicastFrames */
1554 wd->commTally.rxMulticastFrm = 0; /* rxMulticastFrames */
1555 wd->commTally.NotifyNDISRxFrmCnt = 0;
1556 wd->commTally.rxUnicastOctets = 0; /* rxUniOctets byte size */
1557 wd->commTally.rxMulticastOctets = 0; /* rxMultiOctets byte size */
1558 wd->commTally.DriverDiscardedFrm = 0; /* Discard by ValidateFrame */
1559 wd->commTally.LessThanDataMinLen = 0;
1560 wd->commTally.GreaterThanMaxLen = 0;
1561 wd->commTally.DriverDiscardedFrmCauseByMulticastList = 0;
1562 wd->commTally.DriverDiscardedFrmCauseByFrmCtrl = 0;
1563 wd->commTally.rxNeedFrgFrm = 0; /* need more frg frm */
1564 wd->commTally.DriverRxMgtFrmCnt = 0;
1565 wd->commTally.rxBroadcastFrm = 0;/* Receive broadcast frame count */
1566 wd->commTally.rxBroadcastOctets = 0;/*Receive broadcast framebyte size*/
1567 wd->commTally.Hw_TotalRxFrm = 0;
1568 wd->commTally.Hw_CRC16Cnt = 0; /* rxPLCPCRCErrCnt */
1569 wd->commTally.Hw_CRC32Cnt = 0; /* rxCRC32ErrCnt */
1570 wd->commTally.Hw_DecrypErr_UNI = 0;
1571 wd->commTally.Hw_DecrypErr_Mul = 0;
1572 wd->commTally.Hw_RxFIFOOverrun = 0;
1573 wd->commTally.Hw_RxTimeOut = 0;
1574 wd->commTally.LossAP = 0;
1575
1576 wd->commTally.Tx_MPDU = 0;
1577 wd->commTally.BA_Fail = 0;
1578 wd->commTally.Hw_Tx_AMPDU = 0;
1579 wd->commTally.Hw_Tx_MPDU = 0;
1580
1581 wd->commTally.txQosDropCount[0] = 0;
1582 wd->commTally.txQosDropCount[1] = 0;
1583 wd->commTally.txQosDropCount[2] = 0;
1584 wd->commTally.txQosDropCount[3] = 0;
1585 wd->commTally.txQosDropCount[4] = 0;
1586
1587 wd->commTally.Hw_RxMPDU = 0;
1588 wd->commTally.Hw_RxDropMPDU = 0;
1589 wd->commTally.Hw_RxDelMPDU = 0;
1590
1591 wd->commTally.Hw_RxPhyMiscError = 0;
1592 wd->commTally.Hw_RxPhyXRError = 0;
1593 wd->commTally.Hw_RxPhyOFDMError = 0;
1594 wd->commTally.Hw_RxPhyCCKError = 0;
1595 wd->commTally.Hw_RxPhyHTError = 0;
1596 wd->commTally.Hw_RxPhyTotalCount = 0;
1597
1598 #if (defined(GCCK) && defined(OFDM))
1599 wd->commTally.rx11bDataFrame = 0;
1600 wd->commTally.rxOFDMDataFrame = 0;
1601 #endif
1602
1603 zmw_leave_critical_section(dev);
1604 }
1605
1606 /* FB50 in OS XP, RD private test code */
1607 void zfiWlanQueryTally(zdev_t *dev, struct zsCommTally *tally)
1608 {
1609 zmw_get_wlan_dev(dev);
1610
1611 zmw_declare_for_critical_section();
1612
1613 zmw_enter_critical_section(dev);
1614 zfMemoryCopy((u8_t *)tally, (u8_t *)&wd->commTally,
1615 sizeof(struct zsCommTally));
1616 zmw_leave_critical_section(dev);
1617 }
1618
1619 void zfiWlanQueryTrafTally(zdev_t *dev, struct zsTrafTally *tally)
1620 {
1621 zmw_get_wlan_dev(dev);
1622
1623 zmw_declare_for_critical_section();
1624
1625 zmw_enter_critical_section(dev);
1626 zfMemoryCopy((u8_t *)tally, (u8_t *)&wd->trafTally,
1627 sizeof(struct zsTrafTally));
1628 zmw_leave_critical_section(dev);
1629 }
1630
1631 void zfiWlanQueryMonHalRxInfo(zdev_t *dev, struct zsMonHalRxInfo *monHalRxInfo)
1632 {
1633 zfHpQueryMonHalRxInfo(dev, (u8_t *)monHalRxInfo);
1634 }
1635
1636 /* parse the modeMDKEnable to DrvCore */
1637 void zfiDKEnable(zdev_t *dev, u32_t enable)
1638 {
1639 zmw_get_wlan_dev(dev);
1640
1641 wd->modeMDKEnable = enable;
1642 zm_debug_msg1("modeMDKEnable = ", wd->modeMDKEnable);
1643 }
1644
1645 /* airoPeek */
1646 u32_t zfiWlanQueryPacketTypePromiscuous(zdev_t *dev)
1647 {
1648 zmw_get_wlan_dev(dev);
1649
1650 return wd->swSniffer;
1651 }
1652
1653 /* airoPeek */
1654 void zfiWlanSetPacketTypePromiscuous(zdev_t *dev, u32_t setValue)
1655 {
1656 zmw_get_wlan_dev(dev);
1657
1658 wd->swSniffer = setValue;
1659 zm_msg1_mm(ZM_LV_0, "wd->swSniffer ", wd->swSniffer);
1660 if (setValue) {
1661 /* write register for sniffer mode */
1662 zfHpSetSnifferMode(dev, 1);
1663 zm_msg0_mm(ZM_LV_1, "enable sniffer mode");
1664 } else {
1665 zfHpSetSnifferMode(dev, 0);
1666 zm_msg0_mm(ZM_LV_0, "disalbe sniffer mode");
1667 }
1668 }
1669
1670 void zfiWlanSetXLinkMode(zdev_t *dev, u32_t setValue)
1671 {
1672 zmw_get_wlan_dev(dev);
1673
1674 wd->XLinkMode = setValue;
1675 if (setValue) {
1676 /* write register for sniffer mode */
1677 zfHpSetSnifferMode(dev, 1);
1678 } else
1679 zfHpSetSnifferMode(dev, 0);
1680 }
1681
1682 extern void zfStaChannelManagement(zdev_t *dev, u8_t scan);
1683
1684 void zfiSetChannelManagement(zdev_t *dev, u32_t setting)
1685 {
1686 zmw_get_wlan_dev(dev);
1687
1688 switch (setting) {
1689 case 1:
1690 wd->sta.EnableHT = 1;
1691 wd->BandWidth40 = 1;
1692 wd->ExtOffset = 1;
1693 break;
1694 case 3:
1695 wd->sta.EnableHT = 1;
1696 wd->BandWidth40 = 1;
1697 wd->ExtOffset = 3;
1698 break;
1699 case 0:
1700 wd->sta.EnableHT = 1;
1701 wd->BandWidth40 = 0;
1702 wd->ExtOffset = 0;
1703 break;
1704 default:
1705 wd->BandWidth40 = 0;
1706 wd->ExtOffset = 0;
1707 break;
1708 }
1709
1710 zfCoreSetFrequencyEx(dev, wd->frequency, wd->BandWidth40,
1711 wd->ExtOffset, NULL);
1712 }
1713
1714 void zfiSetRifs(zdev_t *dev, u16_t setting)
1715 {
1716 zmw_get_wlan_dev(dev);
1717
1718 wd->sta.ie.HtInfo.ChannelInfo |= ExtHtCap_RIFSMode;
1719 wd->sta.EnableHT = 1;
1720
1721 switch (setting) {
1722 case 0:
1723 wd->sta.HT2040 = 0;
1724 /* zfHpSetRifs(dev, 1, 0,
1725 * (wd->sta.currentFrequency < 3000)? 1:0);
1726 */
1727 break;
1728 case 1:
1729 wd->sta.HT2040 = 1;
1730 /* zfHpSetRifs(dev, 1, 1,
1731 * (wd->sta.currentFrequency < 3000)? 1:0);
1732 */
1733 break;
1734 default:
1735 wd->sta.HT2040 = 0;
1736 /* zfHpSetRifs(dev, 1, 0,
1737 * (wd->sta.currentFrequency < 3000)? 1:0);
1738 */
1739 break;
1740 }
1741 }
1742
1743 void zfiCheckRifs(zdev_t *dev)
1744 {
1745 zmw_get_wlan_dev(dev);
1746
1747 if (wd->sta.ie.HtInfo.ChannelInfo & ExtHtCap_RIFSMode)
1748 ;
1749 /* zfHpSetRifs(dev, wd->sta.EnableHT, wd->sta.HT2040,
1750 * (wd->sta.currentFrequency < 3000)? 1:0);
1751 */
1752 }
1753
1754 void zfiSetReorder(zdev_t *dev, u16_t value)
1755 {
1756 zmw_get_wlan_dev(dev);
1757
1758 wd->reorder = value;
1759 }
1760
1761 void zfiSetSeqDebug(zdev_t *dev, u16_t value)
1762 {
1763 zmw_get_wlan_dev(dev);
1764
1765 wd->seq_debug = value;
1766 }