]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - src/patches/suse-2.6.27.39/patches.drivers/staging-add-otus-atheros-wireless-network-driver.patch
Fix oinkmaster patch.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.39 / patches.drivers / staging-add-otus-atheros-wireless-network-driver.patch
1 From 6dbf61162153a00ad21537c4153009d8a26df723 Mon Sep 17 00:00:00 2001
2 From: Luis R. Rodriguez <lrodriguez@atheros.com>
3 Date: Mon, 27 Oct 2008 22:44:22 -0700
4 Subject: Staging: add otus Atheros wireless network driver
5 Patch-mainline: 2.6.28
6
7 From: Luis R. Rodriguez <lrodriguez@atheros.com>
8
9 Initial dump of the otus USB wireless network driver.
10 It builds properly, but a lot of work needs to be done cleaning
11 it up before it can be merged into the wireless driver tree.
12
13 Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
14 Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
15 ---
16 drivers/staging/Kconfig | 2
17 drivers/staging/Makefile | 1
18 drivers/staging/otus/80211core/amsdu.c | 134
19 drivers/staging/otus/80211core/cagg.c | 3611 +++++++++++++++
20 drivers/staging/otus/80211core/cagg.h | 435 +
21 drivers/staging/otus/80211core/ccmd.c | 1861 ++++++++
22 drivers/staging/otus/80211core/cfunc.c | 1227 +++++
23 drivers/staging/otus/80211core/cfunc.h | 449 +
24 drivers/staging/otus/80211core/chb.c | 200
25 drivers/staging/otus/80211core/cic.c | 496 ++
26 drivers/staging/otus/80211core/cinit.c | 1911 ++++++++
27 drivers/staging/otus/80211core/cmm.c | 2141 +++++++++
28 drivers/staging/otus/80211core/cmmap.c | 2402 ++++++++++
29 drivers/staging/otus/80211core/cmmsta.c | 5782 +++++++++++++++++++++++++
30 drivers/staging/otus/80211core/coid.c | 2695 +++++++++++
31 drivers/staging/otus/80211core/cprecomp.h | 32
32 drivers/staging/otus/80211core/cpsmgr.c | 731 +++
33 drivers/staging/otus/80211core/cscanmgr.c | 535 ++
34 drivers/staging/otus/80211core/ctkip.c | 598 ++
35 drivers/staging/otus/80211core/ctxrx.c | 4096 +++++++++++++++++
36 drivers/staging/otus/80211core/cwep.c | 299 +
37 drivers/staging/otus/80211core/cwm.c | 131
38 drivers/staging/otus/80211core/cwm.h | 45
39 drivers/staging/otus/80211core/freqctrl.c | 259 +
40 drivers/staging/otus/80211core/ledmgr.c | 557 ++
41 drivers/staging/otus/80211core/performance.c | 431 +
42 drivers/staging/otus/80211core/performance.h | 97
43 drivers/staging/otus/80211core/pub_usb.h | 102
44 drivers/staging/otus/80211core/pub_zfi.h | 821 +++
45 drivers/staging/otus/80211core/pub_zfw.h | 93
46 drivers/staging/otus/80211core/queue.c | 303 +
47 drivers/staging/otus/80211core/queue.h | 37
48 drivers/staging/otus/80211core/ratectrl.c | 874 +++
49 drivers/staging/otus/80211core/ratectrl.h | 37
50 drivers/staging/otus/80211core/struct.h | 1315 +++++
51 drivers/staging/otus/80211core/wlan.h | 595 ++
52 drivers/staging/otus/Kconfig | 32
53 drivers/staging/otus/Makefile | 67
54 drivers/staging/otus/TODO | 9
55 drivers/staging/otus/apdbg.c | 457 +
56 drivers/staging/otus/athr_common.h | 141
57 drivers/staging/otus/hal/hpDKfwu.c | 832 +++
58 drivers/staging/otus/hal/hpani.c | 732 +++
59 drivers/staging/otus/hal/hpani.h | 420 +
60 drivers/staging/otus/hal/hpfw2.c | 1018 ++++
61 drivers/staging/otus/hal/hpfwbu.c | 5269 ++++++++++++++++++++++
62 drivers/staging/otus/hal/hpfwspiu.c | 655 ++
63 drivers/staging/otus/hal/hpfwu.c | 1017 ++++
64 drivers/staging/otus/hal/hpfwu.c.drv_ba_resend | 742 +++
65 drivers/staging/otus/hal/hpfwu_2k.c | 1016 ++++
66 drivers/staging/otus/hal/hpfwu_BA.c | 874 +++
67 drivers/staging/otus/hal/hpfwu_FB50_mdk.c | 721 +++
68 drivers/staging/otus/hal/hpfwu_OTUS_RC.c | 715 +++
69 drivers/staging/otus/hal/hpfwu_txstream.c | 1017 ++++
70 drivers/staging/otus/hal/hpfwuinit.c | 240 +
71 drivers/staging/otus/hal/hpmain.c | 4643 ++++++++++++++++++++
72 drivers/staging/otus/hal/hpreg.c | 2481 ++++++++++
73 drivers/staging/otus/hal/hpreg.h | 524 ++
74 drivers/staging/otus/hal/hprw.c | 1557 ++++++
75 drivers/staging/otus/hal/hpusb.c | 1584 ++++++
76 drivers/staging/otus/hal/hpusb.h | 437 +
77 drivers/staging/otus/hal/otus.ini | 414 +
78 drivers/staging/otus/ioctl.c | 2936 ++++++++++++
79 drivers/staging/otus/oal_dt.h | 60
80 drivers/staging/otus/oal_marc.h | 135
81 drivers/staging/otus/usbdrv.c | 1210 +++++
82 drivers/staging/otus/usbdrv.h | 257 +
83 drivers/staging/otus/wrap_buf.c | 114
84 drivers/staging/otus/wrap_dbg.c | 101
85 drivers/staging/otus/wrap_ev.c | 283 +
86 drivers/staging/otus/wrap_mem.c | 101
87 drivers/staging/otus/wrap_mis.c | 108
88 drivers/staging/otus/wrap_pkt.c | 178
89 drivers/staging/otus/wrap_sec.c | 127
90 drivers/staging/otus/wrap_usb.c | 195
91 drivers/staging/otus/wwrap.c | 1207 +++++
92 drivers/staging/otus/zdcompat.h | 116
93 drivers/staging/otus/zdusb.c | 295 +
94 drivers/staging/otus/zdusb.h | 43
95 79 files changed, 70415 insertions(+)
96
97 --- a/drivers/staging/Kconfig
98 +++ b/drivers/staging/Kconfig
99 @@ -45,4 +45,6 @@ source "drivers/staging/at76_usb/Kconfig
100
101 source "drivers/staging/agnx/Kconfig"
102
103 +source "drivers/staging/otus/Kconfig"
104 +
105 endif # STAGING
106 --- a/drivers/staging/Makefile
107 +++ b/drivers/staging/Makefile
108 @@ -14,3 +14,4 @@ obj-$(CONFIG_PRISM2_USB) += wlan-ng/
109 obj-$(CONFIG_ECHO) += echo/
110 obj-$(CONFIG_USB_ATMEL) += at76_usb/
111 obj-$(CONFIG_AGNX) += agnx/
112 +obj-$(CONFIG_OTUS) += otus/
113 --- /dev/null
114 +++ b/drivers/staging/otus/80211core/amsdu.c
115 @@ -0,0 +1,134 @@
116 +/*
117 + * Copyright (c) 2007-2008 Atheros Communications Inc.
118 + *
119 + * Permission to use, copy, modify, and/or distribute this software for any
120 + * purpose with or without fee is hereby granted, provided that the above
121 + * copyright notice and this permission notice appear in all copies.
122 + *
123 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
124 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
125 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
126 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
127 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
128 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
129 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
130 + */
131 +
132 +#include "cprecomp.h"
133 +
134 +
135 +/************************************************************************/
136 +/* */
137 +/* FUNCTION DESCRIPTION zfGetAmsduSubFrame */
138 +/* Get a subframe from a-MSDU. */
139 +/* */
140 +/* INPUTS */
141 +/* dev : device pointer */
142 +/* buf : A-MSDU frame buffer */
143 +/* offset : offset of subframe in the A-MSDU */
144 +/* */
145 +/* OUTPUTS */
146 +/* NULL or subframe */
147 +/* */
148 +/* AUTHOR */
149 +/* Stephen Chen Atheros Communications, INC. 2007.2 */
150 +/* */
151 +/************************************************************************/
152 +zbuf_t* zfGetAmsduSubFrame(zdev_t* dev, zbuf_t* buf, u16_t* offset)
153 +{
154 + u16_t subframeLen;
155 + u16_t amsduLen = zfwBufGetSize(dev, buf);
156 + zbuf_t* newBuf;
157 +
158 + ZM_PERFORMANCE_RX_AMSDU(dev, buf, amsduLen);
159 +
160 + /* Verify A-MSDU length */
161 + if (amsduLen < (*offset + 14))
162 + {
163 + return NULL;
164 + }
165 +
166 + /* Locate A-MSDU subframe by offset and verify subframe length */
167 + subframeLen = (zmw_buf_readb(dev, buf, *offset + 12) << 8) +
168 + zmw_buf_readb(dev, buf, *offset + 13);
169 + if (subframeLen == 0)
170 + {
171 + return NULL;
172 + }
173 +
174 + /* Verify A-MSDU subframe length */
175 + if ((*offset+14+subframeLen) <= amsduLen)
176 + {
177 + /* Allocate a new buffer */
178 + if ((newBuf = zfwBufAllocate(dev, 24+2+subframeLen)) != NULL)
179 + {
180 +#ifdef ZM_ENABLE_NATIVE_WIFI
181 + /* Copy and convert subframe to wlan frame format */
182 + /* SHALL NOT INCLUDE QOS and AMSDU header. Ray 20070807 For Vista */
183 + zfRxBufferCopy(dev, newBuf, buf, 0, 0, 24);
184 + zfRxBufferCopy(dev, newBuf, buf, 24, *offset+14, subframeLen);
185 + zfwBufSetSize(dev, newBuf, 24+subframeLen);
186 +#else
187 + /* Copy subframe to new buffer */
188 + zfRxBufferCopy(dev, newBuf, buf, 0, *offset, 14+subframeLen);
189 + zfwBufSetSize(dev, newBuf, 14+subframeLen);
190 +#endif
191 + /* Update offset */
192 + *offset += (((14+subframeLen)+3) & 0xfffc);
193 +
194 + /* Return buffer pointer */
195 + return newBuf;
196 + }
197 + }
198 + return NULL;
199 +}
200 +
201 +
202 +/************************************************************************/
203 +/* */
204 +/* FUNCTION DESCRIPTION zfDeAmsdu */
205 +/* De-AMSDU. */
206 +/* */
207 +/* INPUTS */
208 +/* dev : device pointer */
209 +/* buf : A-MSDU frame buffer */
210 +/* vap : VAP port */
211 +/* */
212 +/* OUTPUTS */
213 +/* None */
214 +/* */
215 +/* AUTHOR */
216 +/* Stephen Chen Atheros Communications, INC. 2007.2 */
217 +/* */
218 +/************************************************************************/
219 +void zfDeAmsdu(zdev_t* dev, zbuf_t* buf, u16_t vap, u8_t encryMode)
220 +{
221 + u16_t offset = ZM_SIZE_OF_WLAN_DATA_HEADER+ZM_SIZE_OF_QOS_CTRL;
222 + zbuf_t* subframeBuf;
223 + zmw_get_wlan_dev(dev);
224 +
225 + ZM_BUFFER_TRACE(dev, buf)
226 +
227 + if (encryMode == ZM_AES || encryMode == ZM_TKIP)
228 + {
229 + offset += (ZM_SIZE_OF_IV + ZM_SIZE_OF_EXT_IV);
230 + }
231 + else if (encryMode == ZM_WEP64 || encryMode == ZM_WEP128)
232 + {
233 + offset += ZM_SIZE_OF_IV;
234 + }
235 +
236 + /* Repeatly calling zfGetAmsduSubFrame() until NULL returned */
237 + while ((subframeBuf = zfGetAmsduSubFrame(dev, buf, &offset)) != NULL)
238 + {
239 + wd->commTally.NotifyNDISRxFrmCnt++;
240 + if (wd->zfcbRecvEth != NULL)
241 + {
242 + wd->zfcbRecvEth(dev, subframeBuf, (u8_t)vap);
243 + ZM_PERFORMANCE_RX_MSDU(dev, wd->tick);
244 + }
245 + }
246 + zfwBufFree(dev, buf, 0);
247 +
248 + return;
249 +}
250 --- /dev/null
251 +++ b/drivers/staging/otus/80211core/cagg.c
252 @@ -0,0 +1,3611 @@
253 +/*
254 + * Copyright (c) 2007-2008 Atheros Communications Inc.
255 + *
256 + * Permission to use, copy, modify, and/or distribute this software for any
257 + * purpose with or without fee is hereby granted, provided that the above
258 + * copyright notice and this permission notice appear in all copies.
259 + *
260 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
261 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
262 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
263 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
264 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
265 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
266 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
267 + */
268 +/* */
269 +/* Module Name : cagg.c */
270 +/* */
271 +/* Abstract */
272 +/* This module contains A-MPDU aggregation related functions. */
273 +/* */
274 +/* NOTES */
275 +/* None */
276 +/* */
277 +/************************************************************************/
278 +
279 +#include "cprecomp.h"
280 +
281 +extern u8_t zcUpToAc[8];
282 +const u8_t pri[] = {3,3,2,3,2,1,3,2,1,0};
283 +
284 +
285 +u16_t aggr_count;
286 +u32_t success_mpdu;
287 +u32_t total_mpdu;
288 +
289 +void zfAggInit(zdev_t* dev)
290 +{
291 + u16_t i,j;
292 +
293 + zmw_get_wlan_dev(dev);
294 +
295 + zmw_declare_for_critical_section();
296 + /*
297 + * reset sta information
298 + */
299 +
300 + zmw_enter_critical_section(dev);
301 + wd->aggInitiated = 0;
302 + wd->addbaComplete = 0;
303 + wd->addbaCount = 0;
304 + wd->reorder = 1;
305 + for (i=0; i<ZM_MAX_STA_SUPPORT; i++)
306 + {
307 + for (j=0; j<ZM_AC; j++)
308 + {
309 + //wd->aggSta[i].aggQNumber[j] = ZM_AGG_POOL_SIZE;
310 + wd->aggSta[i].aggFlag[j] = wd->aggSta[i].count[j] = 0;
311 + wd->aggSta[i].tid_tx[j] = NULL;
312 + wd->aggSta[i].tid_tx[j+1] = NULL;
313 +
314 + }
315 + }
316 +
317 + /*
318 + * reset Tx/Rx aggregation queue information
319 + */
320 + wd->aggState = 0;
321 + for (i=0; i<ZM_AGG_POOL_SIZE; i++)
322 + {
323 + /*
324 + * reset tx aggregation queue
325 + */
326 + wd->aggQPool[i] = zfwMemAllocate(dev, sizeof(struct aggQueue));
327 + if(!wd->aggQPool[i])
328 + {
329 + zmw_leave_critical_section(dev);
330 + return;
331 + }
332 + wd->aggQPool[i]->aggHead = wd->aggQPool[i]->aggTail =
333 + wd->aggQPool[i]->aggQEnabled = wd->aggQPool[i]->aggReady =
334 + wd->aggQPool[i]->clearFlag = wd->aggQPool[i]->deleteFlag = 0;
335 + //wd->aggQPool[i]->aggSize = 16;
336 +
337 + /*
338 + * reset rx aggregation queue
339 + */
340 + wd->tid_rx[i] = zfwMemAllocate(dev, sizeof(struct agg_tid_rx));
341 + if (!wd->tid_rx[i])
342 + {
343 + zmw_leave_critical_section(dev);
344 + return;
345 + }
346 + wd->tid_rx[i]->aid = ZM_MAX_STA_SUPPORT;
347 + wd->tid_rx[i]->seq_start = wd->tid_rx[i]->baw_head = \
348 + wd->tid_rx[i]->baw_tail = 0;
349 + wd->tid_rx[i]->sq_exceed_count = wd->tid_rx[i]->sq_behind_count = 0;
350 + for (j=0; j<=ZM_AGG_BAW_SIZE; j++)
351 + wd->tid_rx[i]->frame[j].buf = 0;
352 + /*
353 + * reset ADDBA exchange status code
354 + * 0: NULL
355 + * 1: ADDBA Request sent/received
356 + * 2: ACK for ADDBA Request sent/received
357 + * 3: ADDBA Response sent/received
358 + * 4: ACK for ADDBA Response sent/received
359 + */
360 + wd->tid_rx[i]->addBaExchangeStatusCode = 0;
361 +
362 + }
363 + zmw_leave_critical_section(dev);
364 + zfAggTallyReset(dev);
365 + DESTQ.init = zfAggDestInit;
366 + DESTQ.init(dev);
367 + wd->aggInitiated = 1;
368 + aggr_count = 0;
369 + success_mpdu = 0;
370 + total_mpdu = 0;
371 +#ifdef ZM_ENABLE_AGGREGATION
372 +#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
373 + BAW = zfwMemAllocate(dev, sizeof(struct baw_enabler));
374 + if(!BAW)
375 + {
376 + return;
377 + }
378 + BAW->init = zfBawInit;
379 + BAW->init(dev);
380 +#endif //disable BAW
381 +#endif
382 +}
383 +
384 +/************************************************************************/
385 +/* */
386 +/* FUNCTION DESCRIPTION zfAggGetSta */
387 +/* return STA AID. */
388 +/* take buf as input, use the dest address of buf as index to */
389 +/* search STA AID. */
390 +/* */
391 +/* INPUTS */
392 +/* dev : device pointer */
393 +/* buf : buffer for one particular packet */
394 +/* */
395 +/* OUTPUTS */
396 +/* AID */
397 +/* */
398 +/* AUTHOR */
399 +/* Honda ZyDAS Technology Corporation 2006.11 */
400 +/* */
401 +/************************************************************************/
402 +
403 +
404 +
405 +u16_t zfAggGetSta(zdev_t* dev, zbuf_t* buf)
406 +{
407 + u16_t id;
408 + u16_t dst[3];
409 +
410 + zmw_get_wlan_dev(dev);
411 +
412 + zmw_declare_for_critical_section();
413 +
414 + dst[0] = zmw_rx_buf_readh(dev, buf, 0);
415 + dst[1] = zmw_rx_buf_readh(dev, buf, 2);
416 + dst[2] = zmw_rx_buf_readh(dev, buf, 4);
417 +
418 + zmw_enter_critical_section(dev);
419 +
420 + if(wd->wlanMode == ZM_MODE_AP) {
421 + id = zfApFindSta(dev, dst);
422 + }
423 + else {
424 + id = 0;
425 + }
426 + zmw_leave_critical_section(dev);
427 +
428 +#if ZM_AGG_FPGA_DEBUG
429 + id = 0;
430 +#endif
431 +
432 + return id;
433 +}
434 +
435 +
436 +/************************************************************************/
437 +/* */
438 +/* FUNCTION DESCRIPTION zfAggTxGetQueue */
439 +/* return Queue Pool index. */
440 +/* take aid as input, look for the queue index associated */
441 +/* with this aid. */
442 +/* */
443 +/* INPUTS */
444 +/* dev : device pointer */
445 +/* aid : associated id */
446 +/* */
447 +/* OUTPUTS */
448 +/* Queue number */
449 +/* */
450 +/* AUTHOR */
451 +/* Honda ZyDAS Technology Corporation 2006.11 */
452 +/* */
453 +/************************************************************************/
454 +TID_TX zfAggTxGetQueue(zdev_t* dev, u16_t aid, u16_t tid)
455 +{
456 + //u16_t i;
457 + TID_TX tid_tx;
458 + zmw_get_wlan_dev(dev);
459 +
460 + //zmw_declare_for_critical_section();
461 +
462 + /*
463 + * not a STA aid
464 + */
465 + if (0xffff == aid)
466 + return NULL;
467 +
468 + //zmw_enter_critical_section(dev);
469 +
470 + tid_tx = wd->aggSta[aid].tid_tx[tid];
471 + if (!tid_tx) return NULL;
472 + if (0 == tid_tx->aggQEnabled)
473 + return NULL;
474 +
475 + //zmw_leave_critical_section(dev);
476 +
477 + return tid_tx;
478 +}
479 +
480 +/************************************************************************/
481 +/* */
482 +/* FUNCTION DESCRIPTION zfAggTxNewQueue */
483 +/* return Queue Pool index. */
484 +/* take aid as input, find a new queue for this aid. */
485 +/* */
486 +/* INPUTS */
487 +/* dev : device pointer */
488 +/* aid : associated id */
489 +/* */
490 +/* OUTPUTS */
491 +/* Queue number */
492 +/* */
493 +/* AUTHOR */
494 +/* Honda ZyDAS Technology Corporation 2006.12 */
495 +/* */
496 +/************************************************************************/
497 +TID_TX zfAggTxNewQueue(zdev_t* dev, u16_t aid, u16_t tid, zbuf_t* buf)
498 +{
499 + u16_t i;
500 + TID_TX tid_tx=NULL;
501 + u16_t ac = zcUpToAc[tid&0x7] & 0x3;
502 + zmw_get_wlan_dev(dev);
503 +
504 + zmw_declare_for_critical_section();
505 +
506 + /*
507 + * not a STA aid
508 + */
509 + if (0xffff == aid)
510 + return NULL;
511 +
512 + zmw_enter_critical_section(dev);
513 +
514 + /*
515 + * find one new queue for sta
516 + */
517 + for (i=0; i<ZM_AGG_POOL_SIZE; i++)
518 + {
519 + if (wd->aggQPool[i]->aggQEnabled)
520 + {
521 + /*
522 + * this q is enabled
523 + */
524 + }
525 + else
526 + {
527 + tid_tx = wd->aggQPool[i];
528 + tid_tx->aggQEnabled = 1;
529 + tid_tx->aggQSTA = aid;
530 + tid_tx->ac = ac;
531 + tid_tx->tid = tid;
532 + tid_tx->aggHead = tid_tx->aggTail = tid_tx->size = 0;
533 + tid_tx->aggReady = 0;
534 + wd->aggSta[aid].tid_tx[tid] = tid_tx;
535 + tid_tx->dst[0] = zmw_rx_buf_readh(dev, buf, 0);
536 + tid_tx->dst[1] = zmw_rx_buf_readh(dev, buf, 2);
537 + tid_tx->dst[2] = zmw_rx_buf_readh(dev, buf, 4);
538 + break;
539 + }
540 + }
541 +
542 + zmw_leave_critical_section(dev);
543 +
544 + return tid_tx;
545 +}
546 +
547 +
548 +
549 +/************************************************************************/
550 +/* */
551 +/* FUNCTION DESCRIPTION zfAggTxEnqueue */
552 +/* return Status code ZM_SUCCESS or error code */
553 +/* take (aid,ac,qnum,buf) as input */
554 +/* */
555 +/* INPUTS */
556 +/* dev : device pointer */
557 +/* aid : associated id */
558 +/* ac : access category */
559 +/* qnum: the queue number to which will be enqueued */
560 +/* buf : the packet to be queued */
561 +/* */
562 +/* OUTPUTS */
563 +/* status code */
564 +/* */
565 +/* AUTHOR */
566 +/* Honda Atheros Communications, INC. 2006.12 */
567 +/* */
568 +/************************************************************************/
569 +u16_t zfAggTxEnqueue(zdev_t* dev, zbuf_t* buf, u16_t aid, TID_TX tid_tx)
570 +{
571 + //u16_t qlen, frameLen;
572 + u32_t time;
573 +
574 + zmw_get_wlan_dev(dev);
575 +
576 + zmw_declare_for_critical_section();
577 +
578 + zmw_enter_critical_section(dev);
579 +
580 + tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail);
581 +
582 + if (tid_tx->size < (ZM_AGGQ_SIZE - 2))
583 + {
584 + /* Queue not full */
585 +
586 +
587 + /*
588 + * buffer copy
589 + * in zfwBufFree will return a ndismsendcomplete
590 + * to resolve the synchronize problem in aggregate
591 + */
592 +
593 + u8_t sendComplete = 0;
594 +
595 + tid_tx->aggvtxq[tid_tx->aggHead].buf = buf;
596 + time = zm_agg_GetTime();
597 + tid_tx->aggvtxq[tid_tx->aggHead].arrivalTime = time;
598 + tid_tx->aggvtxq[tid_tx->aggHead].baw_retransmit = 0;
599 +
600 + tid_tx->aggHead = ((tid_tx->aggHead + 1) & ZM_AGGQ_SIZE_MASK);
601 + tid_tx->lastArrival = time;
602 + tid_tx->size++;
603 + tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail);
604 + if (buf && (tid_tx->size < (ZM_AGGQ_SIZE - 10))) {
605 + tid_tx->complete = tid_tx->aggHead;
606 + sendComplete = 1;
607 + }
608 + zmw_leave_critical_section(dev);
609 +
610 + if (!DESTQ.exist(dev, 0, tid_tx->ac, tid_tx, NULL)) {
611 + DESTQ.insert(dev, 0, tid_tx->ac, tid_tx, NULL);
612 + }
613 +
614 + zm_msg1_agg(ZM_LV_0, "tid_tx->size=", tid_tx->size);
615 + //zm_debug_msg1("tid_tx->size=", tid_tx->size);
616 +
617 + if (buf && sendComplete && wd->zfcbSendCompleteIndication) {
618 + //zmw_leave_critical_section(dev);
619 + wd->zfcbSendCompleteIndication(dev, buf);
620 + }
621 +
622 + /*if (tid_tx->size >= 16 && zfHpGetFreeTxdCount(dev) > 20)
623 + zfAggTxSend(dev, zfHpGetFreeTxdCount(dev), tid_tx);
624 + */
625 + return ZM_SUCCESS;
626 + }
627 + else
628 + {
629 + zm_msg1_agg(ZM_LV_0, "can't enqueue, tid_tx->size=", tid_tx->size);
630 + /*
631 + * Queue Full
632 + */
633 +
634 + /*
635 + * zm_msg1_agg(ZM_LV_0, "Queue full, qnum = ", qnum);
636 + * wd->commTally.txQosDropCount[ac]++;
637 + * zfwBufFree(dev, buf, ZM_SUCCESS);
638 + * zm_msg1_agg(ZM_LV_1, "Packet discarded, VTXQ full, ac=", ac);
639 + *
640 + * return ZM_ERR_EXCEED_PRIORITY_THRESHOLD;
641 + */
642 + }
643 +
644 + zmw_leave_critical_section(dev);
645 +
646 + if (!DESTQ.exist(dev, 0, tid_tx->ac, tid_tx, NULL)) {
647 + DESTQ.insert(dev, 0, tid_tx->ac, tid_tx, NULL);
648 + }
649 +
650 + return ZM_ERR_EXCEED_PRIORITY_THRESHOLD;
651 +}
652 +
653 +u16_t zfAggDestExist(zdev_t* dev, u16_t Qtype, u16_t ac, TID_TX tid_tx, void* vtxq) {
654 + struct dest* dest;
655 + u16_t exist = 0;
656 + zmw_get_wlan_dev(dev);
657 +
658 + zmw_declare_for_critical_section();
659 +
660 + zmw_enter_critical_section(dev);
661 + if (!DESTQ.Head[ac]) {
662 + exist = 0;
663 + }
664 + else {
665 + dest = DESTQ.Head[ac];
666 + if (dest->tid_tx == tid_tx) {
667 + exist = 1;
668 + }
669 + else {
670 + while (dest->next != DESTQ.Head[ac]) {
671 + dest = dest->next;
672 + if (dest->tid_tx == tid_tx){
673 + exist = 1;
674 + break;
675 + }
676 + }
677 + }
678 + }
679 +
680 + zmw_leave_critical_section(dev);
681 +
682 + return exist;
683 +}
684 +
685 +void zfAggDestInsert(zdev_t* dev, u16_t Qtype, u16_t ac, TID_TX tid_tx, void* vtxq)
686 +{
687 + struct dest* new_dest;
688 + zmw_get_wlan_dev(dev);
689 +
690 + zmw_declare_for_critical_section();
691 +
692 + new_dest = zfwMemAllocate(dev, sizeof(struct dest));
693 + if(!new_dest)
694 + {
695 + return;
696 + }
697 + new_dest->Qtype = Qtype;
698 + new_dest->tid_tx = tid_tx;
699 + if (0 == Qtype)
700 + new_dest->tid_tx = tid_tx;
701 + else
702 + new_dest->vtxq = vtxq;
703 + if (!DESTQ.Head[ac]) {
704 +
705 + zmw_enter_critical_section(dev);
706 + new_dest->next = new_dest;
707 + DESTQ.Head[ac] = DESTQ.dest[ac] = new_dest;
708 + zmw_leave_critical_section(dev);
709 + }
710 + else {
711 +
712 + zmw_enter_critical_section(dev);
713 + new_dest->next = DESTQ.dest[ac]->next;
714 + DESTQ.dest[ac]->next = new_dest;
715 + zmw_leave_critical_section(dev);
716 + }
717 +
718 +
719 + //DESTQ.size[ac]++;
720 + return;
721 +}
722 +
723 +void zfAggDestDelete(zdev_t* dev, u16_t Qtype, TID_TX tid_tx, void* vtxq)
724 +{
725 + struct dest* dest, *temp;
726 + u16_t i;
727 +
728 + zmw_get_wlan_dev(dev);
729 +
730 + zmw_declare_for_critical_section();
731 +
732 + zmw_enter_critical_section(dev);
733 + if (wd->destLock) {
734 + zmw_leave_critical_section(dev);
735 + return;
736 + }
737 +
738 +
739 + //zmw_declare_for_critical_section();
740 + for (i=0; i<4; i++) {
741 + if (!DESTQ.Head[i]) continue;
742 + dest = DESTQ.Head[i];
743 + if (!dest) continue;
744 +
745 +
746 + while (dest && (dest->next != DESTQ.Head[i])) {
747 + if (Qtype == 0 && dest->next->tid_tx == tid_tx){
748 + break;
749 + }
750 + if (Qtype == 1 && dest->next->vtxq == vtxq) {
751 + break;
752 + }
753 + dest = dest->next;
754 + }
755 +
756 + if ((Qtype == 0 && dest->next->tid_tx == tid_tx) || (Qtype == 1 && dest->next->vtxq == vtxq)) {
757 +
758 + tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail);
759 + if (tid_tx->size) {
760 + zmw_leave_critical_section(dev);
761 + return;
762 + }
763 + if (!DESTQ.Head[i]) {
764 + temp = NULL;
765 + }
766 + else {
767 + temp = dest->next;
768 + if (temp == dest) {
769 + DESTQ.Head[i] = DESTQ.dest[i] = NULL;
770 + //DESTQ.size[i] = 0;
771 + }
772 + else {
773 + dest->next = dest->next->next;
774 + }
775 + }
776 +
777 + if (temp == NULL)
778 + {/* do nothing */} //zfwMemFree(dev, temp, sizeof(struct dest));
779 + else
780 + zfwMemFree(dev, temp, sizeof(struct dest));
781 +
782 + /*zmw_enter_critical_section(dev);
783 + if (DESTQ.size[i] > 0)
784 + DESTQ.size[i]--;
785 + zmw_leave_critical_section(dev);
786 + */
787 + }
788 +
789 + }
790 + zmw_leave_critical_section(dev);
791 + return;
792 +}
793 +
794 +void zfAggDestInit(zdev_t* dev)
795 +{
796 + u16_t i;
797 + zmw_get_wlan_dev(dev);
798 +
799 + //zmw_declare_for_critical_section();
800 +
801 + for (i=0; i<4; i++) {
802 + //wd->destQ.Head[i].next = wd->destQ.Head[i];
803 + //wd->destQ.dest[i] = wd->destQ.Head[i];
804 + //DESTQ.size[i] = 0;
805 + DESTQ.Head[i] = NULL;
806 + }
807 + DESTQ.insert = zfAggDestInsert;
808 + DESTQ.delete = zfAggDestDelete;
809 + DESTQ.init = zfAggDestInit;
810 + DESTQ.getNext = zfAggDestGetNext;
811 + DESTQ.exist = zfAggDestExist;
812 + DESTQ.ppri = 0;
813 + return;
814 +}
815 +
816 +struct dest* zfAggDestGetNext(zdev_t* dev, u16_t ac)
817 +{
818 + struct dest *dest = NULL;
819 + zmw_get_wlan_dev(dev);
820 +
821 + zmw_declare_for_critical_section();
822 +
823 + zmw_enter_critical_section(dev);
824 + if (DESTQ.dest[ac]) {
825 + dest = DESTQ.dest[ac];
826 + DESTQ.dest[ac] = DESTQ.dest[ac]->next;
827 + }
828 + else {
829 + dest = NULL;
830 + }
831 + zmw_leave_critical_section(dev);
832 +
833 + return dest;
834 +}
835 +
836 +#ifdef ZM_ENABLE_AGGREGATION
837 +#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
838 +u16_t zfAggTidTxInsertHead(zdev_t* dev, struct bufInfo *buf_info,TID_TX tid_tx)
839 +{
840 + zbuf_t* buf;
841 + u32_t time;
842 + struct baw_header *baw_header;
843 +
844 + zmw_get_wlan_dev(dev);
845 +
846 + zmw_declare_for_critical_section();
847 +
848 +
849 + buf = buf_info->buf;
850 +
851 + zmw_enter_critical_section(dev);
852 + tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail);
853 + zmw_leave_critical_section(dev);
854 +
855 + if (tid_tx->size >= (ZM_AGGQ_SIZE - 2)) {
856 + zfwBufFree(dev, buf, ZM_SUCCESS);
857 + return 0;
858 + }
859 +
860 + zmw_enter_critical_section(dev);
861 + tid_tx->aggTail = (tid_tx->aggTail == 0)? ZM_AGGQ_SIZE_MASK: tid_tx->aggTail - 1;
862 + tid_tx->aggvtxq[tid_tx->aggTail].buf = buf;
863 + //time = zm_agg_GetTime();
864 + tid_tx->aggvtxq[tid_tx->aggTail].arrivalTime = buf_info->timestamp;
865 + tid_tx->aggvtxq[tid_tx->aggTail].baw_retransmit = buf_info->baw_retransmit;
866 +
867 + baw_header = &tid_tx->aggvtxq[tid_tx->aggTail].baw_header;
868 + baw_header->headerLen = buf_info->baw_header->headerLen;
869 + baw_header->micLen = buf_info->baw_header->micLen;
870 + baw_header->snapLen = buf_info->baw_header->snapLen;
871 + baw_header->removeLen = buf_info->baw_header->removeLen;
872 + baw_header->keyIdx = buf_info->baw_header->keyIdx;
873 + zfwMemoryCopy((u8_t *)baw_header->header, (u8_t *)buf_info->baw_header->header, 58);
874 + zfwMemoryCopy((u8_t *)baw_header->mic , (u8_t *)buf_info->baw_header->mic , 8);
875 + zfwMemoryCopy((u8_t *)baw_header->snap , (u8_t *)buf_info->baw_header->snap , 8);
876 +
877 + tid_tx->size++;
878 + tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail);
879 + zmw_leave_critical_section(dev);
880 +
881 + //tid_tx->lastArrival = time;
882 + if (1 == tid_tx->size) {
883 + DESTQ.insert(dev, 0, tid_tx->ac, tid_tx, NULL);
884 + }
885 +
886 +
887 + zm_msg1_agg(ZM_LV_0, "0xC2:insertHead, tid_tx->size=", tid_tx->size);
888 +
889 + return TRUE;
890 +}
891 +#endif //disable BAW
892 +#endif
893 +
894 +void zfiTxComplete(zdev_t* dev)
895 +{
896 +
897 + zmw_get_wlan_dev(dev);
898 +
899 + //zmw_declare_for_critical_section();
900 +
901 + if( (wd->wlanMode == ZM_MODE_AP) ||
902 + (wd->wlanMode == ZM_MODE_INFRASTRUCTURE && wd->sta.EnableHT) ||
903 + (wd->wlanMode == ZM_MODE_PSEUDO) ) {
904 + zfAggTxScheduler(dev, 0);
905 + }
906 +
907 + return;
908 +}
909 +
910 +TID_TX zfAggTxReady(zdev_t* dev) {
911 + //struct dest* dest;
912 + u16_t i;
913 + TID_TX tid_tx = NULL;
914 + zmw_get_wlan_dev(dev);
915 +
916 + zmw_declare_for_critical_section();
917 +
918 + zmw_enter_critical_section(dev);
919 + for (i=0; i<ZM_AGG_POOL_SIZE; i++)
920 + {
921 + if (wd->aggQPool[i]->aggQEnabled)
922 + {
923 + if (wd->aggQPool[i]->size >= 16) {
924 + tid_tx = wd->aggQPool[i];
925 + break;
926 + }
927 + }
928 + else {
929 + }
930 + }
931 + zmw_leave_critical_section(dev);
932 + return tid_tx;
933 +}
934 +
935 +u16_t zfAggValidTidTx(zdev_t* dev, TID_TX tid_tx) {
936 + u16_t i, valid = 0;
937 + zmw_get_wlan_dev(dev);
938 +
939 + zmw_declare_for_critical_section();
940 +
941 + zmw_enter_critical_section(dev);
942 + for (i=0; i<ZM_AGG_POOL_SIZE; i++)
943 + {
944 + if (wd->aggQPool[i] == tid_tx)
945 + {
946 + valid = 1;
947 + break;
948 + }
949 + else {
950 + }
951 + }
952 + zmw_leave_critical_section(dev);
953 +
954 + return valid;
955 +}
956 +
957 +void zfAggTxScheduler(zdev_t* dev, u8_t ScanAndClear)
958 +{
959 + TID_TX tid_tx = NULL;
960 + void* vtxq;
961 + struct dest* dest;
962 + zbuf_t* buf;
963 + u32_t txql, min_txql;
964 + //u16_t aggr_size = 1;
965 + u16_t txq_threshold;
966 + zmw_get_wlan_dev(dev);
967 +
968 + zmw_declare_for_critical_section();
969 +
970 + if (!wd->aggInitiated)
971 + {
972 + return;
973 + }
974 +
975 + /* debug */
976 + txql = TXQL;
977 + min_txql = AGG_MIN_TXQL;
978 +
979 + if(wd->txq_threshold)
980 + txq_threshold = wd->txq_threshold;
981 + else
982 + txq_threshold = AGG_MIN_TXQL;
983 +
984 + tid_tx = zfAggTxReady(dev);
985 + if (tid_tx) ScanAndClear = 0;
986 + while (zfHpGetFreeTxdCount(dev) > 20 && (TXQL < txq_threshold || tid_tx)) {
987 + //while (zfHpGetFreeTxdCount(dev) > 20 && (ScanAndClear || tid_tx)) {
988 + //while (TXQL < txq_threshold) {
989 + u16_t i;
990 + u8_t ac;
991 + s8_t destQ_count = 0;
992 + //while ((zfHpGetFreeTxdCount(dev)) > 32) {
993 +
994 + //DbgPrint("zfAggTxScheduler: in while loop");
995 + for (i=0; i<4; i++) {
996 + if (DESTQ.Head[i]) destQ_count++;
997 + }
998 + if (0 >= destQ_count) break;
999 +
1000 + zmw_enter_critical_section(dev);
1001 + ac = pri[DESTQ.ppri]; DESTQ.ppri = (DESTQ.ppri + 1) % 10;
1002 + zmw_leave_critical_section(dev);
1003 +
1004 + for (i=0; i<10; i++){
1005 + if(DESTQ.Head[ac]) break;
1006 +
1007 + zmw_enter_critical_section(dev);
1008 + ac = pri[DESTQ.ppri]; DESTQ.ppri = (DESTQ.ppri + 1) % 10;
1009 + zmw_leave_critical_section(dev);
1010 + }
1011 + if (i == 10) break;
1012 + //DbgPrint("zfAggTxScheduler: have dest Q");
1013 + zmw_enter_critical_section(dev);
1014 + wd->destLock = 1;
1015 + zmw_leave_critical_section(dev);
1016 +
1017 + dest = DESTQ.getNext(dev, ac);
1018 + if (!dest) {
1019 + zmw_enter_critical_section(dev);
1020 + wd->destLock = 0;
1021 + zmw_leave_critical_section(dev);
1022 +
1023 + DbgPrint("bug report! DESTQ.getNext got nothing!");
1024 + break;
1025 + }
1026 + if (dest->Qtype == 0) {
1027 + tid_tx = dest->tid_tx;
1028 +
1029 + //DbgPrint("zfAggTxScheduler: have tid_tx Q");
1030 +
1031 + if(tid_tx && zfAggValidTidTx(dev, tid_tx))
1032 + tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail);
1033 + else {
1034 + zmw_enter_critical_section(dev);
1035 + wd->destLock = 0;
1036 + zmw_leave_critical_section(dev);
1037 +
1038 + tid_tx = zfAggTxReady(dev);
1039 + continue;
1040 + }
1041 +
1042 + zmw_enter_critical_section(dev);
1043 + wd->destLock = 0;
1044 + zmw_leave_critical_section(dev);
1045 + //zmw_enter_critical_section(dev);
1046 + if (tid_tx && !tid_tx->size) {
1047 +
1048 + //zmw_leave_critical_section(dev);
1049 + //DESTQ.delete(dev, 0, tid_tx, NULL);
1050 + }
1051 + else if(wd->aggState == 0){
1052 + //wd->aggState = 1;
1053 + //zmw_leave_critical_section(dev);
1054 + zfAggTxSend(dev, zfHpGetFreeTxdCount(dev), tid_tx);
1055 + //wd->aggState = 0;
1056 + }
1057 + else {
1058 + //zmw_leave_critical_section(dev);
1059 + break;
1060 + }
1061 + }
1062 + else {
1063 + vtxq = dest->vtxq;
1064 + buf = zfGetVtxq(dev, ac);
1065 + zm_assert( buf != 0 );
1066 +
1067 + zfTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0);
1068 +
1069 + }
1070 + /*flush all but < 16 frames in tid_tx to TXQ*/
1071 + tid_tx = zfAggTxReady(dev);
1072 + }
1073 +
1074 + /*while ((zfHpGetFreeTxdCount(dev)) > 32) {
1075 + //while ((zfHpGetFreeTxdCount(dev)) > 32) {
1076 +
1077 + destQ_count = 0;
1078 + for (i=0; i<4; i++) destQ_count += wd->destQ.size[i];
1079 + if (0 >= destQ_count) break;
1080 +
1081 + ac = pri[wd->destQ.ppri]; wd->destQ.ppri = (wd->destQ.ppri + 1) % 10;
1082 + for (i=0; i<10; i++){
1083 + if(wd->destQ.size[ac]!=0) break;
1084 + ac = pri[wd->destQ.ppri]; wd->destQ.ppri = (wd->destQ.ppri + 1) % 10;
1085 + }
1086 + if (i == 10) break;
1087 + dest = wd->destQ.getNext(dev, ac);
1088 + if (dest->Qtype == 0) {
1089 + tid_tx = dest->tid_tx;
1090 + tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail);
1091 + if (!tid_tx->size) {
1092 + wd->destQ.delete(dev, 0, tid_tx, NULL);
1093 + break;
1094 + }
1095 + else if((wd->aggState == 0) && (tid_tx->size >= 16)){
1096 + zfAggTxSend(dev, zfHpGetFreeTxdCount(dev), tid_tx);
1097 + }
1098 + else {
1099 + break;
1100 + }
1101 + }
1102 +
1103 + }
1104 + */
1105 + return;
1106 +}
1107 +
1108 +/************************************************************************/
1109 +/* */
1110 +/* FUNCTION DESCRIPTION zfAggTx */
1111 +/* return Status code ZM_SUCCESS or error code */
1112 +/* management A-MPDU aggregation function, */
1113 +/* management aggregation queue, calculate arrivalrate, */
1114 +/* add/delete an aggregation queue of a stream, */
1115 +/* enqueue packets into responsible aggregate queue. */
1116 +/* take (dev, buf, ac) as input */
1117 +/* */
1118 +/* INPUTS */
1119 +/* dev : device pointer */
1120 +/* buf : packet buff */
1121 +/* ac : access category */
1122 +/* */
1123 +/* OUTPUTS */
1124 +/* status code */
1125 +/* */
1126 +/* AUTHOR */
1127 +/* Honda Atheros Communications, INC. 2006.12 */
1128 +/* */
1129 +/************************************************************************/
1130 +u16_t zfAggTx(zdev_t* dev, zbuf_t* buf, u16_t tid)
1131 +{
1132 + u16_t aid;
1133 + //u16_t qnum;
1134 + //u16_t aggflag = 0;
1135 + //u16_t arrivalrate = 0;
1136 + TID_TX tid_tx;
1137 +
1138 + zmw_get_wlan_dev(dev);
1139 +
1140 + zmw_declare_for_critical_section();
1141 +
1142 + if(!wd->aggInitiated)
1143 + {
1144 + return ZM_ERR_TX_BUFFER_UNAVAILABLE;
1145 + }
1146 +
1147 + aid = zfAggGetSta(dev, buf);
1148 +
1149 + //arrivalrate = zfAggTxArrivalRate(dev, aid, tid);
1150 +
1151 + if (0xffff == aid)
1152 + {
1153 + /*
1154 + * STA not associated, this is a BC/MC or STA->AP packet
1155 + */
1156 +
1157 + return ZM_ERR_TX_BUFFER_UNAVAILABLE;
1158 + }
1159 +
1160 + /*
1161 + * STA associated, a unicast packet
1162 + */
1163 +
1164 + tid_tx = zfAggTxGetQueue(dev, aid, tid);
1165 +
1166 + /*tid_q.tid_tx = tid_tx;
1167 + wd->destQ.insert = zfAggDestInsert;
1168 + wd->destQ.insert(dev, 0, tid_q);
1169 + */
1170 + if (tid_tx != NULL)
1171 + {
1172 + /*
1173 + * this (aid, ac) is aggregated
1174 + */
1175 +
1176 + //if (arrivalrate < ZM_AGG_LOW_THRESHOLD)
1177 + if (0)
1178 + {
1179 + /*
1180 + * arrival rate too low
1181 + * delete this aggregate queue
1182 + */
1183 +
1184 + zmw_enter_critical_section(dev);
1185 +
1186 + //wd->aggQPool[qnum]->clearFlag = wd->aggQPool[qnum]->deleteFlag =1;
1187 +
1188 + zmw_leave_critical_section(dev);
1189 +
1190 + }
1191 +
1192 + return zfAggTxEnqueue(dev, buf, aid, tid_tx);
1193 +
1194 + }
1195 + else
1196 + {
1197 + /*
1198 + * this (aid, ac) not yet aggregated
1199 + * queue not found
1200 + */
1201 +
1202 + //if (arrivalrate > ZM_AGG_HIGH_THRESHOLD)
1203 + if (1)
1204 + {
1205 + /*
1206 + * arrivalrate high enough to get a new agg queue
1207 + */
1208 +
1209 + tid_tx = zfAggTxNewQueue(dev, aid, tid, buf);
1210 +
1211 + //zm_msg1_agg(ZM_LV_0, "get new AggQueue qnum = ", tid_tx->);
1212 +
1213 + if (tid_tx)
1214 + {
1215 + /*
1216 + * got a new aggregate queue
1217 + */
1218 +
1219 + //zmw_enter_critical_section(dev);
1220 +
1221 + //wd->aggSta[aid].aggFlag[ac] = 1;
1222 +
1223 + //zmw_leave_critical_section(dev);
1224 +
1225 + /*
1226 + * add ADDBA functions here
1227 + * return ZM_ERR_TX_BUFFER_UNAVAILABLE;
1228 + */
1229 +
1230 +
1231 + //zfAggSendAddbaRequest(dev, tid_tx->dst, tid_tx->ac, tid_tx->tid);
1232 + //zmw_enter_critical_section(dev);
1233 +
1234 + //wd->aggSta[aid].aggFlag[ac] = 0;
1235 +
1236 + //zmw_leave_critical_section(dev);
1237 +
1238 + return zfAggTxEnqueue(dev, buf, aid, tid_tx);
1239 +
1240 + }
1241 + else
1242 + {
1243 + /*
1244 + * just can't get a new aggregate queue
1245 + */
1246 +
1247 + return ZM_ERR_TX_BUFFER_UNAVAILABLE;
1248 + }
1249 + }
1250 + else
1251 + {
1252 + /*
1253 + * arrival rate is not high enough to get a new agg queue
1254 + */
1255 +
1256 + return ZM_ERR_TX_BUFFER_UNAVAILABLE;
1257 + }
1258 + }
1259 +
1260 +
1261 +
1262 +}
1263 +
1264 +
1265 +/************************************************************************/
1266 +/* */
1267 +/* FUNCTION DESCRIPTION zfAggTxReadyCount */
1268 +/* return counter of ready to aggregate queues. */
1269 +/* take (dev, ac) as input, only calculate the ready to aggregate */
1270 +/* queues of one particular ac. */
1271 +/* */
1272 +/* INPUTS */
1273 +/* dev : device pointer */
1274 +/* ac : access category */
1275 +/* */
1276 +/* OUTPUTS */
1277 +/* counter of ready to aggregate queues */
1278 +/* */
1279 +/* AUTHOR */
1280 +/* Honda Atheros Communications, INC. 2006.12 */
1281 +/* */
1282 +/************************************************************************/
1283 +u16_t zfAggTxReadyCount(zdev_t* dev, u16_t ac)
1284 +{
1285 + u16_t i;
1286 + u16_t readycount = 0;
1287 +
1288 + zmw_get_wlan_dev(dev);
1289 +
1290 + zmw_declare_for_critical_section();
1291 +
1292 + zmw_enter_critical_section(dev);
1293 +
1294 + for (i=0 ; i<ZM_AGG_POOL_SIZE; i++)
1295 + {
1296 + if (wd->aggQPool[i]->aggQEnabled && (wd->aggQPool[i]->aggReady || \
1297 + wd->aggQPool[i]->clearFlag) && ac == wd->aggQPool[i]->ac)
1298 + readycount++;
1299 + }
1300 +
1301 + zmw_leave_critical_section(dev);
1302 +
1303 + return readycount;
1304 +}
1305 +
1306 +/************************************************************************/
1307 +/* */
1308 +/* FUNCTION DESCRIPTION zfAggTxPartial */
1309 +/* return the number that Vtxq has to send. */
1310 +/* take (dev, ac, readycount) as input, calculate the ratio of */
1311 +/* Vtxq length to (Vtxq length + readycount) of a particular ac, */
1312 +/* and returns the Vtxq length * the ratio */
1313 +/* */
1314 +/* INPUTS */
1315 +/* dev : device pointer */
1316 +/* ac : access category */
1317 +/* readycount: the number of ready to aggregate queues of this ac */
1318 +/* */
1319 +/* OUTPUTS */
1320 +/* Vtxq length * ratio */
1321 +/* */
1322 +/* AUTHOR */
1323 +/* Honda Atheros Communications, INC. 2006.12 */
1324 +/* */
1325 +/************************************************************************/
1326 +u16_t zfAggTxPartial(zdev_t* dev, u16_t ac, u16_t readycount)
1327 +{
1328 + u16_t qlen;
1329 + u16_t partial;
1330 +
1331 + zmw_get_wlan_dev(dev);
1332 +
1333 + zmw_declare_for_critical_section();
1334 +
1335 + zmw_enter_critical_section(dev);
1336 +
1337 + qlen = zm_agg_qlen(dev, wd->vtxqHead[ac], wd->vtxqTail[ac]);
1338 +
1339 + if ((qlen + readycount) > 0)
1340 + {
1341 + partial = (u16_t)( zm_agg_weight(ac) * ((u16_t)qlen/(qlen + \
1342 + readycount)) );
1343 + }
1344 + else
1345 + {
1346 + partial = 0;
1347 + }
1348 +
1349 + zmw_leave_critical_section(dev);
1350 +
1351 + if (partial > qlen)
1352 + partial = qlen;
1353 +
1354 + return partial;
1355 +}
1356 +
1357 +
1358 +/************************************************************************/
1359 +/* */
1360 +/* FUNCTION DESCRIPTION zfAggTxSend */
1361 +/* return sentcount */
1362 +/* take (dev, ac, n) as input, n is the number of scheduled agg */
1363 +/* queues to be sent of the particular ac. */
1364 +/* */
1365 +/* INPUTS */
1366 +/* dev : device pointer */
1367 +/* ac : access category */
1368 +/* n : the number of scheduled aggregation queues to be sent */
1369 +/* */
1370 +/* OUTPUTS */
1371 +/* sentcount */
1372 +/* */
1373 +/* AUTHOR */
1374 +/* Honda Atheros Communications, INC. 2006.12 */
1375 +/* */
1376 +/************************************************************************/
1377 +u16_t zfAggTxSend(zdev_t* dev, u32_t freeTxd, TID_TX tid_tx)
1378 +{
1379 + //u16_t qnum;
1380 + //u16_t qlen;
1381 + u16_t j;
1382 + //u16_t sentcount = 0;
1383 + zbuf_t* buf;
1384 + struct aggControl aggControl;
1385 + u16_t aggLen;
1386 + //zbuf_t* newBuf;
1387 + //u16_t bufLen;
1388 + //TID_BAW tid_baw = NULL;
1389 + //struct bufInfo *buf_info;
1390 +
1391 + zmw_get_wlan_dev(dev);
1392 +
1393 + zmw_declare_for_critical_section();
1394 +
1395 + //while (tid_tx->size > 0)
1396 +
1397 + zmw_enter_critical_section(dev);
1398 + tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail);
1399 + aggLen = zm_agg_min(16, zm_agg_min(tid_tx->size, (u16_t)(freeTxd - 2)));
1400 + zmw_leave_critical_section(dev);
1401 +
1402 + /*
1403 + * why there have to be 2 free Txd?
1404 + */
1405 + if (aggLen <=0 )
1406 + return 0;
1407 +
1408 +
1409 + if (aggLen == 1) {
1410 + buf = zfAggTxGetVtxq(dev, tid_tx);
1411 + if (buf)
1412 + zfTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0);
1413 + if (tid_tx->size == 0) {
1414 + //DESTQ.delete(dev, 0, tid_tx, NULL);
1415 + }
1416 +
1417 + return 1;
1418 + }
1419 + /*
1420 + * Free Txd queue is big enough to put aggregation
1421 + */
1422 + zmw_enter_critical_section(dev);
1423 + if (wd->aggState == 1) {
1424 + zmw_leave_critical_section(dev);
1425 + return 0;
1426 + }
1427 + wd->aggState = 1;
1428 + zmw_leave_critical_section(dev);
1429 +
1430 +
1431 + zm_msg1_agg(ZM_LV_0, "aggLen=", aggLen);
1432 + tid_tx->aggFrameSize = 0;
1433 + for (j=0; j < aggLen; j++) {
1434 + buf = zfAggTxGetVtxq(dev, tid_tx);
1435 +
1436 + zmw_enter_critical_section(dev);
1437 + tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail);
1438 + zmw_leave_critical_section(dev);
1439 +
1440 + if ( buf ) {
1441 + //struct aggTally *agg_tal;
1442 + u16_t completeIndex;
1443 +
1444 + if (0 == j) {
1445 + aggControl.ampduIndication = ZM_AGG_FIRST_MPDU;
1446 +
1447 + }
1448 + else if ((j == (aggLen - 1)) || tid_tx->size == 0)
1449 + {
1450 + aggControl.ampduIndication = ZM_AGG_LAST_MPDU;
1451 + //wd->aggState = 0;
1452 +
1453 + }
1454 + else
1455 + {
1456 + aggControl.ampduIndication = ZM_AGG_MIDDLE_MPDU;
1457 + /* the packet is delayed more than 500 ms, drop it */
1458 +
1459 + }
1460 + tid_tx->aggFrameSize += zfwBufGetSize(dev, buf);
1461 + aggControl.addbaIndication = 0;
1462 + aggControl.aggEnabled = 1;
1463 +
1464 +#ifdef ZM_AGG_TALLY
1465 + agg_tal = &wd->agg_tal;
1466 + agg_tal->sent_packets_sum++;
1467 +
1468 +#endif
1469 +
1470 + zfAggTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0, &aggControl, tid_tx);
1471 +
1472 + zmw_enter_critical_section(dev);
1473 + completeIndex = tid_tx->complete;
1474 + if(zm_agg_inQ(tid_tx, tid_tx->complete))
1475 + zm_agg_plus(tid_tx->complete);
1476 + zmw_leave_critical_section(dev);
1477 +
1478 + if(zm_agg_inQ(tid_tx, completeIndex) && wd->zfcbSendCompleteIndication
1479 + && tid_tx->aggvtxq[completeIndex].buf) {
1480 + wd->zfcbSendCompleteIndication(dev, tid_tx->aggvtxq[completeIndex].buf);
1481 + zm_debug_msg0("in queue complete worked!");
1482 + }
1483 +
1484 + }
1485 + else {
1486 + /*
1487 + * this aggregation queue is empty
1488 + */
1489 + zm_msg1_agg(ZM_LV_0, "aggLen not reached, but no more frame, j=", j);
1490 +
1491 + break;
1492 + }
1493 + }
1494 + zmw_enter_critical_section(dev);
1495 + wd->aggState = 0;
1496 + zmw_leave_critical_section(dev);
1497 +
1498 + //zm_acquire_agg_spin_lock(Adapter);
1499 + tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail);
1500 + //zm_release_agg_spin_lock(Adapter);
1501 +
1502 + if (tid_tx->size == 0) {
1503 + //DESTQ.delete(dev, 0, tid_tx, NULL);
1504 + }
1505 +
1506 +
1507 +
1508 + //zfAggInvokeBar(dev, tid_tx);
1509 + if(j>0) {
1510 + aggr_count++;
1511 + zm_msg1_agg(ZM_LV_0, "0xC2:sent 1 aggr, aggr_count=", aggr_count);
1512 + zm_msg1_agg(ZM_LV_0, "0xC2:sent 1 aggr, aggr_size=", j);
1513 + }
1514 + return j;
1515 +}
1516 +
1517 +
1518 +/************************************************************************/
1519 +/* */
1520 +/* FUNCTION DESCRIPTION zfAggTxGetReadyQueue */
1521 +/* return the number of the aggregation queue */
1522 +/* take (dev, ac) as input, find the agg queue with smallest */
1523 +/* arrival time (waited longest) among those ready or clearFlag */
1524 +/* set queues. */
1525 +/* */
1526 +/* INPUTS */
1527 +/* dev : device pointer */
1528 +/* ac : access category */
1529 +/* */
1530 +/* OUTPUTS */
1531 +/* aggregation queue number */
1532 +/* */
1533 +/* AUTHOR */
1534 +/* Honda Atheros Communications, INC. 2006.12 */
1535 +/* */
1536 +/************************************************************************/
1537 +TID_TX zfAggTxGetReadyQueue(zdev_t* dev, u16_t ac)
1538 +{
1539 + //u16_t qnum = ZM_AGG_POOL_SIZE;
1540 + u16_t i;
1541 + u32_t time = 0;
1542 + TID_TX tid_tx = NULL;
1543 +
1544 + zmw_get_wlan_dev(dev);
1545 +
1546 + zmw_declare_for_critical_section();
1547 +
1548 + zmw_enter_critical_section(dev);
1549 +
1550 + for (i=0 ;i<ZM_AGG_POOL_SIZE; i++)
1551 + {
1552 + if (1 == wd->aggQPool[i]->aggQEnabled && ac == wd->aggQPool[i]->ac &&
1553 + (wd->aggQPool[i]->size > 0))
1554 + {
1555 + if (0 == time || time > wd->aggQPool[i]->aggvtxq[ \
1556 + wd->aggQPool[i]->aggHead ].arrivalTime)
1557 + {
1558 + tid_tx = wd->aggQPool[i];
1559 + time = tid_tx->aggvtxq[ tid_tx->aggHead ].arrivalTime;
1560 + }
1561 + }
1562 + }
1563 +
1564 + zmw_leave_critical_section(dev);
1565 +
1566 + return tid_tx;
1567 +}
1568 +
1569 +
1570 +
1571 +/************************************************************************/
1572 +/* */
1573 +/* FUNCTION DESCRIPTION zfAggTxGetVtxq */
1574 +/* return an MSDU */
1575 +/* take (dev, qnum) as input, return an MSDU out of the agg queue. */
1576 +/* */
1577 +/* INPUTS */
1578 +/* dev : device pointer */
1579 +/* qnum: queue number */
1580 +/* */
1581 +/* OUTPUTS */
1582 +/* a MSDU */
1583 +/* */
1584 +/* AUTHOR */
1585 +/* Honda Atheros Communications, INC. 2006.12 */
1586 +/* */
1587 +/************************************************************************/
1588 +zbuf_t* zfAggTxGetVtxq(zdev_t* dev, TID_TX tid_tx)
1589 +{
1590 + zbuf_t* buf = NULL;
1591 +
1592 + zmw_declare_for_critical_section();
1593 +
1594 + if (tid_tx->aggHead != tid_tx->aggTail)
1595 + {
1596 + buf = tid_tx->aggvtxq[ tid_tx->aggTail ].buf;
1597 +
1598 + tid_tx->aggvtxq[tid_tx->aggTail].buf = NULL;
1599 +
1600 + zmw_enter_critical_section(dev);
1601 + tid_tx->aggTail = ((tid_tx->aggTail + 1) & ZM_AGGQ_SIZE_MASK);
1602 + if(tid_tx->size > 0) tid_tx->size--;
1603 + tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail);
1604 + if (NULL == buf) {
1605 + //tid_tx->aggTail = tid_tx->aggHead = tid_tx->size = 0;
1606 + //zm_msg1_agg(ZM_LV_0, "GetVtxq buf == NULL, tid_tx->size=", tid_tx->size);
1607 + }
1608 + zmw_leave_critical_section(dev);
1609 + }
1610 + else
1611 + {
1612 + /*
1613 + * queue is empty
1614 + */
1615 + zm_msg1_agg(ZM_LV_0, "tid_tx->aggHead == tid_tx->aggTail, tid_tx->size=", tid_tx->size);
1616 +
1617 + }
1618 +
1619 + if (zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail) != tid_tx->size)
1620 + zm_msg1_agg(ZM_LV_0, "qlen!=tid_tx->size! tid_tx->size=", tid_tx->size);
1621 + return buf;
1622 +}
1623 +
1624 +
1625 +/************************************************************************/
1626 +/* */
1627 +/* FUNCTION DESCRIPTION zfAggTxDeleteQueue */
1628 +/* return ZM_SUCCESS (can't fail) */
1629 +/* take (dev, qnum) as input, reset (delete) this aggregate queue, */
1630 +/* this queue is virtually returned to the aggregate queue pool. */
1631 +/* */
1632 +/* INPUTS */
1633 +/* dev : device pointer */
1634 +/* qnum: queue number */
1635 +/* */
1636 +/* OUTPUTS */
1637 +/* ZM_SUCCESS */
1638 +/* */
1639 +/* AUTHOR */
1640 +/* Honda Atheros Communications, INC. 2006.12 */
1641 +/* */
1642 +/************************************************************************/
1643 +u16_t zfAggTxDeleteQueue(zdev_t* dev, u16_t qnum)
1644 +{
1645 + u16_t ac, tid;
1646 + struct aggQueue *tx_tid;
1647 + struct aggSta *agg_sta;
1648 +
1649 + zmw_get_wlan_dev(dev);
1650 +
1651 + zmw_declare_for_critical_section();
1652 +
1653 + tx_tid = wd->aggQPool[qnum];
1654 + agg_sta = &wd->aggSta[tx_tid->aggQSTA];
1655 + ac = tx_tid->ac;
1656 + tid = tx_tid->tid;
1657 +
1658 + zmw_enter_critical_section(dev);
1659 +
1660 + tx_tid->aggQEnabled = 0;
1661 + tx_tid->aggHead = tx_tid->aggTail = 0;
1662 + tx_tid->aggReady = 0;
1663 + tx_tid->clearFlag = tx_tid->deleteFlag = 0;
1664 + tx_tid->size = 0;
1665 + agg_sta->count[ac] = 0;
1666 +
1667 + agg_sta->tid_tx[tid] = NULL;
1668 + agg_sta->aggFlag[ac] = 0;
1669 +
1670 + zmw_leave_critical_section(dev);
1671 +
1672 + zm_msg1_agg(ZM_LV_0, "queue deleted! qnum=", qnum);
1673 +
1674 + return ZM_SUCCESS;
1675 +}
1676 +
1677 +#ifdef ZM_ENABLE_AGGREGATION
1678 +#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
1679 +void zfBawCore(zdev_t* dev, u16_t baw_seq, u32_t bitmap, u16_t aggLen) {
1680 + TID_BAW tid_baw;
1681 + s16_t i;
1682 + zbuf_t* buf;
1683 + struct bufInfo *buf_info;
1684 +
1685 + zmw_get_wlan_dev(dev);
1686 + //zmw_declare_for_critical_section();
1687 + tid_baw = BAW->getQ(dev, baw_seq);
1688 + //tid_baw = NULL;
1689 + if (NULL == tid_baw)
1690 + return;
1691 +
1692 + total_mpdu += aggLen;
1693 + for (i = aggLen - 1; i>=0; i--) {
1694 + if (((bitmap >> i) & 0x1) == 0) {
1695 + buf_info = BAW->pop(dev, i, tid_baw);
1696 + buf = buf_info->buf;
1697 + if (buf) {
1698 + //wd->zfcbSetBawQ(dev, buf, 0);
1699 + zfAggTidTxInsertHead(dev, buf_info, tid_baw->tid_tx);
1700 + }
1701 + }
1702 + else {
1703 + success_mpdu++;
1704 + }
1705 + }
1706 + BAW->disable(dev, tid_baw);
1707 + zfAggTxScheduler(dev);
1708 + zm_debug_msg1("success_mpdu = ", success_mpdu);
1709 + zm_debug_msg1(" total_mpdu = ", total_mpdu);
1710 +}
1711 +
1712 +void zfBawInit(zdev_t* dev) {
1713 + TID_BAW tid_baw;
1714 + u16_t i,j;
1715 + zmw_get_wlan_dev(dev);
1716 + //zmw_declare_for_critical_section();
1717 +
1718 + for (i=0; i<ZM_BAW_POOL_SIZE; i++){
1719 + tid_baw = &BAW->tid_baw[i];
1720 + for (j=0; j<ZM_VTXQ_SIZE; j++) {
1721 + tid_baw->frame[j].buf = NULL;
1722 + }
1723 + tid_baw->enabled = tid_baw->head = tid_baw->tail = tid_baw->size = 0;
1724 + tid_baw->start_seq = 0;
1725 + }
1726 + BAW->delPoint = 0;
1727 + BAW->core = zfBawCore;
1728 + BAW->getNewQ = zfBawGetNewQ;
1729 + BAW->insert = zfBawInsert;
1730 + BAW->pop = zfBawPop;
1731 + BAW->enable = zfBawEnable;
1732 + BAW->disable = zfBawDisable;
1733 + BAW->getQ = zfBawGetQ;
1734 +}
1735 +
1736 +
1737 +
1738 +TID_BAW zfBawGetNewQ(zdev_t* dev, u16_t start_seq, TID_TX tid_tx) {
1739 + TID_BAW tid_baw=NULL;
1740 + TID_BAW next_baw=NULL;
1741 + u16_t i;
1742 + zmw_get_wlan_dev(dev);
1743 + //zmw_declare_for_critical_section();
1744 +
1745 + /*
1746 + for (i=0; i<ZM_BAW_POOL_SIZE; i++){
1747 + tid_baw = &BAW->tid_baw[i];
1748 + if (FALSE == tid_baw->enabled)
1749 + break;
1750 + }
1751 + */
1752 +
1753 + tid_baw = &BAW->tid_baw[BAW->delPoint];
1754 + i = BAW->delPoint;
1755 + //if (ZM_BAW_POOL_SIZE == i) {
1756 + //return NULL;
1757 + // u8_t temp = BAW->delPoint;
1758 + // tid_baw = &BAW->tid_baw[BAW->delPoint];
1759 + // BAW->disable(dev, tid_baw);
1760 + // BAW->delPoint = (BAW->delPoint < (ZM_BAW_POOL_SIZE - 1))? (BAW->delPoint + 1): 0;
1761 + // temp = BAW->delPoint;
1762 + //}
1763 +
1764 + zm_msg1_agg(ZM_LV_0, "get new tid_baw, index=", i);
1765 + BAW->delPoint = (i < (ZM_BAW_POOL_SIZE -1))? (i + 1): 0;
1766 + next_baw = &BAW->tid_baw[BAW->delPoint];
1767 + if (1 == next_baw->enabled) BAW->disable(dev, next_baw);
1768 +
1769 + BAW->enable(dev, tid_baw, start_seq);
1770 + tid_baw->tid_tx = tid_tx;
1771 +
1772 + return tid_baw;
1773 +}
1774 +
1775 +u16_t zfBawInsert(zdev_t* dev, zbuf_t* buf, u16_t baw_seq, TID_BAW tid_baw, u8_t baw_retransmit, struct baw_header_r *header_r) {
1776 + //TID_BAW tid_baw;
1777 + //u16_t bufLen;
1778 +
1779 + //zmw_get_wlan_dev(dev);
1780 + //zmw_declare_for_critical_section();
1781 +
1782 + if(tid_baw->size < (ZM_VTXQ_SIZE - 1)) {
1783 + struct baw_header *baw_header = &tid_baw->frame[tid_baw->head].baw_header;
1784 +
1785 + baw_header->headerLen = header_r->headerLen;
1786 + baw_header->micLen = header_r->micLen;
1787 + baw_header->snapLen = header_r->snapLen;
1788 + baw_header->removeLen = header_r->removeLen;
1789 + baw_header->keyIdx = header_r->keyIdx;
1790 + zfwMemoryCopy((u8_t *)baw_header->header, (u8_t *)header_r->header, 58);
1791 + zfwMemoryCopy((u8_t *)baw_header->mic , (u8_t *)header_r->mic , 8);
1792 + zfwMemoryCopy((u8_t *)baw_header->snap , (u8_t *)header_r->snap , 8);
1793 + //wd->zfcbSetBawQ(dev, buf, 1);
1794 + tid_baw->frame[tid_baw->head].buf = buf;
1795 + tid_baw->frame[tid_baw->head].baw_seq = baw_seq;
1796 + tid_baw->frame[tid_baw->head].baw_retransmit = baw_retransmit + 1;
1797 +
1798 + //tid_baw->frame[tid_baw->head].data = pBuf->data;
1799 + tid_baw->head++;
1800 + tid_baw->size++;
1801 + }
1802 + else {
1803 + //wd->zfcbSetBawQ(dev, buf, 0);
1804 + zfwBufFree(dev, buf, ZM_SUCCESS);
1805 + return FALSE;
1806 + }
1807 + return TRUE;
1808 +}
1809 +
1810 +struct bufInfo* zfBawPop(zdev_t* dev, u16_t index, TID_BAW tid_baw) {
1811 + //TID_BAW tid_baw;
1812 + //zbuf_t* buf;
1813 + struct bufInfo *buf_info;
1814 + zmw_get_wlan_dev(dev);
1815 +
1816 + buf_info = &wd->buf_info;
1817 + buf_info->baw_header = NULL;
1818 +
1819 + if (NULL == (buf_info->buf = tid_baw->frame[index].buf))
1820 + return buf_info;
1821 +
1822 + buf_info->baw_retransmit = tid_baw->frame[index].baw_retransmit;
1823 + buf_info->baw_header = &tid_baw->frame[index].baw_header;
1824 + buf_info->timestamp = tid_baw->frame[index].timestamp;
1825 + //pBuf->data = pBuf->buffer;
1826 + //wd->zfcbRestoreBufData(dev, buf);
1827 + tid_baw->frame[index].buf = NULL;
1828 +
1829 + return buf_info;
1830 +}
1831 +
1832 +void zfBawEnable(zdev_t* dev, TID_BAW tid_baw, u16_t start_seq) {
1833 + //TID_BAW tid_baw;
1834 +
1835 + //zmw_get_wlan_dev(dev);
1836 + //zmw_declare_for_critical_section();
1837 +
1838 + tid_baw->enabled = TRUE;
1839 + tid_baw->head = tid_baw->tail = tid_baw->size = 0;
1840 + tid_baw->start_seq = start_seq;
1841 +}
1842 +
1843 +void zfBawDisable(zdev_t* dev, TID_BAW tid_baw) {
1844 + //TID_BAW tid_baw;
1845 + u16_t i;
1846 +
1847 + //zmw_get_wlan_dev(dev);
1848 + //zmw_declare_for_critical_section();
1849 + for (i=0; i<ZM_VTXQ_SIZE; i++) {
1850 + if (tid_baw->frame[i].buf) {
1851 +
1852 + //wd->zfcbSetBawQ(dev, tid_baw->frame[i].buf, 0);
1853 + zfwBufFree(dev, tid_baw->frame[i].buf, ZM_SUCCESS);
1854 + tid_baw->frame[i].buf = NULL;
1855 + }
1856 + }
1857 +
1858 + tid_baw->enabled = FALSE;
1859 +}
1860 +
1861 +TID_BAW zfBawGetQ(zdev_t* dev, u16_t baw_seq) {
1862 + TID_BAW tid_baw=NULL;
1863 + u16_t i;
1864 +
1865 + zmw_get_wlan_dev(dev);
1866 + //zmw_declare_for_critical_section();
1867 + for (i=0; i<ZM_BAW_POOL_SIZE; i++){
1868 + tid_baw = &BAW->tid_baw[i];
1869 + if (TRUE == tid_baw->enabled)
1870 + {
1871 + zm_msg1_agg(ZM_LV_0, "get an old tid_baw, baw_seq=", baw_seq);
1872 + zm_msg1_agg(ZM_LV_0, "check a tid_baw->start_seq=", tid_baw->start_seq);
1873 + if(baw_seq == tid_baw->start_seq)
1874 + break;
1875 + }
1876 +
1877 + }
1878 + if (ZM_BAW_POOL_SIZE == i)
1879 + return NULL;
1880 + return tid_baw;
1881 +}
1882 +#endif //disable BAW
1883 +#endif
1884 +
1885 +u16_t zfAggTallyReset(zdev_t* dev)
1886 +{
1887 + struct aggTally* agg_tal;
1888 +
1889 + zmw_get_wlan_dev(dev);
1890 +
1891 + //zmw_declare_for_critical_section();
1892 +
1893 + agg_tal = &wd->agg_tal;
1894 + agg_tal->got_packets_sum = 0;
1895 + agg_tal->got_bytes_sum = 0;
1896 + agg_tal->sent_bytes_sum = 0;
1897 + agg_tal->sent_packets_sum = 0;
1898 + agg_tal->avg_got_packets = 0;
1899 + agg_tal->avg_got_bytes = 0;
1900 + agg_tal->avg_sent_packets = 0;
1901 + agg_tal->avg_sent_bytes = 0;
1902 + agg_tal->time = 0;
1903 + return 0;
1904 +}
1905 +
1906 +
1907 +/************************************************************************/
1908 +/* */
1909 +/* FUNCTION DESCRIPTION zfAggScanAndClear */
1910 +/* If the packets in a queue have waited for too long, clear and */
1911 +/* delete this aggregation queue. */
1912 +/* */
1913 +/* INPUTS */
1914 +/* dev : device pointer */
1915 +/* time : current time */
1916 +/* */
1917 +/* OUTPUTS */
1918 +/* ZM_SUCCESS */
1919 +/* */
1920 +/* AUTHOR */
1921 +/* Honda Atheros Communications, INC. 2006.12 */
1922 +/* */
1923 +/************************************************************************/
1924 +u16_t zfAggScanAndClear(zdev_t* dev, u32_t time)
1925 +{
1926 + u16_t i;
1927 + u16_t head;
1928 + u16_t tail;
1929 + u32_t tick;
1930 + u32_t arrivalTime;
1931 + //u16_t aid, ac;
1932 + TID_TX tid_tx;
1933 +
1934 + zmw_get_wlan_dev(dev);
1935 +
1936 + zmw_declare_for_critical_section();
1937 +
1938 + if(!(wd->state == ZM_WLAN_STATE_ENABLED)) return 0;
1939 + zfAggTxScheduler(dev, 1);
1940 + tick = zm_agg_GetTime();
1941 + for (i=0; i<ZM_AGG_POOL_SIZE; i++)
1942 + {
1943 + if (!wd->aggQPool[i]) return 0;
1944 + if (1 == wd->aggQPool[i]->aggQEnabled)
1945 + {
1946 + tid_tx = wd->aggQPool[i];
1947 + zmw_enter_critical_section(dev);
1948 +
1949 + head = tid_tx->aggHead;
1950 + tail = tid_tx->aggTail;
1951 +
1952 + arrivalTime = (u32_t)tid_tx->aggvtxq[tid_tx->aggTail].arrivalTime;
1953 +
1954 +
1955 + if((tick - arrivalTime) <= ZM_AGG_CLEAR_TIME)
1956 + {
1957 +
1958 + }
1959 + else if((tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail)) > 0)
1960 + {
1961 +
1962 + tid_tx->clearFlag = 1;
1963 +
1964 + //zm_msg1_agg(ZM_LV_0, "clear queue tick =", tick);
1965 + //zm_msg1_agg(ZM_LV_0, "clear queue arrival =", arrivalTime);
1966 +
1967 +
1968 + //zmw_leave_critical_section(dev);
1969 + //zfAggTxScheduler(dev);
1970 + //zmw_enter_critical_section(dev);
1971 +
1972 + }
1973 +
1974 + if (tid_tx->size == 0)
1975 + {
1976 + /*
1977 + * queue empty
1978 + */
1979 + if (tick - tid_tx->lastArrival > ZM_AGG_DELETE_TIME)
1980 + {
1981 + zm_msg1_agg(ZM_LV_0, "delete queue, idle for n sec. n = ", \
1982 + ZM_AGG_DELETE_TIME/10);
1983 +
1984 + zmw_leave_critical_section(dev);
1985 + zfAggTxDeleteQueue(dev, i);
1986 + zmw_enter_critical_section(dev);
1987 + }
1988 + }
1989 +
1990 + zmw_leave_critical_section(dev);
1991 + }
1992 + }
1993 +
1994 + zfAggRxClear(dev, time);
1995 +
1996 +#ifdef ZM_AGG_TALLY
1997 + if((wd->tick % 100) == 0) {
1998 + zfAggPrintTally(dev);
1999 + }
2000 +#endif
2001 +
2002 + return ZM_SUCCESS;
2003 +}
2004 +
2005 +u16_t zfAggPrintTally(zdev_t* dev)
2006 +{
2007 + struct aggTally* agg_tal;
2008 +
2009 + zmw_get_wlan_dev(dev);
2010 +
2011 + //zmw_declare_for_critical_section();
2012 +
2013 + agg_tal = &wd->agg_tal;
2014 +
2015 + if(agg_tal->got_packets_sum < 10)
2016 + {
2017 + zfAggTallyReset(dev);
2018 + return 0;
2019 + }
2020 +
2021 + agg_tal->time++;
2022 + agg_tal->avg_got_packets = (agg_tal->avg_got_packets * (agg_tal->time - 1) +
2023 + agg_tal->got_packets_sum) / agg_tal->time;
2024 + agg_tal->avg_got_bytes = (agg_tal->avg_got_bytes * (agg_tal->time - 1) +
2025 + agg_tal->got_bytes_sum) / agg_tal->time;
2026 + agg_tal->avg_sent_packets = (agg_tal->avg_sent_packets * (agg_tal->time - 1)
2027 + + agg_tal->sent_packets_sum) / agg_tal->time;
2028 + agg_tal->avg_sent_bytes = (agg_tal->avg_sent_bytes * (agg_tal->time - 1) +
2029 + agg_tal->sent_bytes_sum) / agg_tal->time;
2030 + zm_msg1_agg(ZM_LV_0, "got_packets_sum =", agg_tal->got_packets_sum);
2031 + zm_msg1_agg(ZM_LV_0, " got_bytes_sum =", agg_tal->got_bytes_sum);
2032 + zm_msg1_agg(ZM_LV_0, "sent_packets_sum=", agg_tal->sent_packets_sum);
2033 + zm_msg1_agg(ZM_LV_0, " sent_bytes_sum =", agg_tal->sent_bytes_sum);
2034 + agg_tal->got_packets_sum = agg_tal->got_bytes_sum =agg_tal->sent_packets_sum
2035 + = agg_tal->sent_bytes_sum = 0;
2036 + zm_msg1_agg(ZM_LV_0, "avg_got_packets =", agg_tal->avg_got_packets);
2037 + zm_msg1_agg(ZM_LV_0, " avg_got_bytes =", agg_tal->avg_got_bytes);
2038 + zm_msg1_agg(ZM_LV_0, "avg_sent_packets=", agg_tal->avg_sent_packets);
2039 + zm_msg1_agg(ZM_LV_0, " avg_sent_bytes =", agg_tal->avg_sent_bytes);
2040 + if ((wd->commTally.BA_Fail == 0) || (wd->commTally.Hw_Tx_MPDU == 0))
2041 + {
2042 + zm_msg1_agg(ZM_LV_0, "Hardware Tx MPDU=", wd->commTally.Hw_Tx_MPDU);
2043 + zm_msg1_agg(ZM_LV_0, " BA Fail number=", wd->commTally.BA_Fail);
2044 + }
2045 + else
2046 + zm_msg1_agg(ZM_LV_0, "1/(BA fail rate)=", wd->commTally.Hw_Tx_MPDU/wd->commTally.BA_Fail);
2047 +
2048 + return 0;
2049 +}
2050 +
2051 +u16_t zfAggRxClear(zdev_t* dev, u32_t time)
2052 +{
2053 + u16_t i;
2054 + struct agg_tid_rx *tid_rx;
2055 +
2056 + zmw_get_wlan_dev(dev);
2057 +
2058 + zmw_declare_for_critical_section();
2059 +
2060 + for (i=0; i<ZM_AGG_POOL_SIZE; i++)
2061 + {
2062 + zmw_enter_critical_section(dev);
2063 + tid_rx = wd->tid_rx[i];
2064 + if (tid_rx->baw_head != tid_rx->baw_tail)
2065 + {
2066 + u16_t j = tid_rx->baw_tail;
2067 + while ((j != tid_rx->baw_head) && !tid_rx->frame[j].buf) {
2068 + j = (j + 1) & ZM_AGG_BAW_MASK;
2069 + }
2070 + if ((j != tid_rx->baw_head) && (time - tid_rx->frame[j].arrivalTime) >
2071 + (ZM_AGG_CLEAR_TIME - 5))
2072 + {
2073 + zmw_leave_critical_section(dev);
2074 + zm_msg0_agg(ZM_LV_1, "queue RxFlush by RxClear");
2075 + zfAggRxFlush(dev, 0, tid_rx);
2076 + zmw_enter_critical_section(dev);
2077 + }
2078 + }
2079 + zmw_leave_critical_section(dev);
2080 + }
2081 +
2082 + return ZM_SUCCESS;
2083 +}
2084 +
2085 +struct agg_tid_rx* zfAggRxEnabled(zdev_t* dev, zbuf_t* buf)
2086 +{
2087 + u16_t dst0, src[3], ac, aid, fragOff;
2088 + u8_t up;
2089 + u16_t offset = 0;
2090 + u16_t seq_no;
2091 + u16_t frameType;
2092 + u16_t frameCtrl;
2093 + u16_t frameSubtype;
2094 + u32_t tcp_seq;
2095 + //struct aggSta *agg_sta;
2096 +#if ZM_AGG_FPGA_REORDERING
2097 + struct agg_tid_rx *tid_rx;
2098 +#endif
2099 + zmw_get_wlan_dev(dev);
2100 +
2101 + //zmw_declare_for_critical_section();
2102 + seq_no = zmw_rx_buf_readh(dev, buf, 22) >> 4;
2103 + //DbgPrint("Rx seq=%d\n", seq_no);
2104 + if (wd->sta.EnableHT == 0)
2105 + {
2106 + return NULL;
2107 + }
2108 +
2109 + frameCtrl = zmw_rx_buf_readb(dev, buf, 0);
2110 + frameType = frameCtrl & 0xf;
2111 + frameSubtype = frameCtrl & 0xf0;
2112 +
2113 +
2114 + if (frameType != ZM_WLAN_DATA_FRAME) //non-Qos Data? (frameSubtype&0x80)
2115 + {
2116 + return NULL;
2117 + }
2118 +#ifdef ZM_ENABLE_PERFORMANCE_EVALUATION
2119 + tcp_seq = zmw_rx_buf_readb(dev, buf, 22+36) << 24;
2120 + tcp_seq += zmw_rx_buf_readb(dev, buf, 22+37) << 16;
2121 + tcp_seq += zmw_rx_buf_readb(dev, buf, 22+38) << 8;
2122 + tcp_seq += zmw_rx_buf_readb(dev, buf, 22+39);
2123 +#endif
2124 +
2125 + ZM_SEQ_DEBUG("In %5d, %12u\n", seq_no, tcp_seq);
2126 + dst0 = zmw_rx_buf_readh(dev, buf, offset+4);
2127 +
2128 + src[0] = zmw_rx_buf_readh(dev, buf, offset+10);
2129 + src[1] = zmw_rx_buf_readh(dev, buf, offset+12);
2130 + src[2] = zmw_rx_buf_readh(dev, buf, offset+14);
2131 +
2132 +#if ZM_AGG_FPGA_DEBUG
2133 + aid = 0;
2134 +#else
2135 + aid = zfApFindSta(dev, src);
2136 +#endif
2137 +
2138 + //agg_sta = &wd->aggSta[aid];
2139 + //zfTxGetIpTosAndFrag(dev, buf, &up, &fragOff);
2140 + //ac = zcUpToAc[up&0x7] & 0x3;
2141 +
2142 + /*
2143 + * Filter unicast frame only, aid == 0 is for debug only
2144 + */
2145 + if ((dst0 & 0x1) == 0 && aid == 0)
2146 + {
2147 +#if ZM_AGG_FPGA_REORDERING
2148 + tid_rx = zfAggRxGetQueue(dev, buf) ;
2149 + if(!tid_rx)
2150 + return NULL;
2151 + else
2152 + {
2153 + //if (tid_rx->addBaExchangeStatusCode == ZM_AGG_ADDBA_RESPONSE)
2154 + return tid_rx;
2155 + }
2156 +#else
2157 + return NULL;
2158 +#endif
2159 + }
2160 +
2161 + return NULL;
2162 +}
2163 +
2164 +u16_t zfAggRx(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo *addInfo, struct agg_tid_rx *tid_rx)
2165 +{
2166 + u16_t seq_no;
2167 + s16_t index;
2168 + u16_t offset = 0;
2169 + zbuf_t* pbuf;
2170 + u8_t frameSubType;
2171 +
2172 + zmw_get_wlan_dev(dev);
2173 +
2174 + zmw_declare_for_critical_section();
2175 +
2176 + ZM_BUFFER_TRACE(dev, buf)
2177 +
2178 + ZM_PERFORMANCE_RX_REORDER(dev);
2179 +
2180 + seq_no = zmw_rx_buf_readh(dev, buf, offset+22) >> 4;
2181 +
2182 + index = seq_no - tid_rx->seq_start;
2183 + /*
2184 + * for debug
2185 + */
2186 +
2187 + /* zm_msg2_agg(ZM_LV_0, "queue seq = ", seq_no);
2188 + * DbgPrint("%s:%s%lxh %s%lxh\n", __FUNCTION__, "queue seq=", seq_no,
2189 + * "; seq_start=", tid_rx->seq_start);
2190 + */
2191 +
2192 + //DbgPrint("seq_no=%d, seq_start=%d\n", seq_no, tid_rx->seq_start);
2193 +
2194 + /* In some APs, we found that it might transmit NULL data whose sequence number
2195 + is out or order. In order to avoid this problem, we ignore these NULL data.
2196 + */
2197 +
2198 + frameSubType = (zmw_rx_buf_readh(dev, buf, 0) & 0xF0) >> 4;
2199 +
2200 + /* If this is a NULL data instead of Qos NULL data */
2201 + if ((frameSubType & 0x0C) == 0x04)
2202 + {
2203 + s16_t seq_diff;
2204 +
2205 + seq_diff = (seq_no > tid_rx->seq_start) ?
2206 + seq_no - tid_rx->seq_start : tid_rx->seq_start - seq_no;
2207 +
2208 + if (seq_diff > ZM_AGG_BAW_SIZE)
2209 + {
2210 + zm_debug_msg0("Free Rx NULL data in zfAggRx");
2211 +
2212 + /* Free Rx buffer */
2213 + zfwBufFree(dev, buf, 0);
2214 + return ZM_ERR_OUT_OF_ORDER_NULL_DATA;
2215 + }
2216 + }
2217 +
2218 + /*
2219 + * sequence number wrap at 4k
2220 + */
2221 + if (tid_rx->seq_start > seq_no)
2222 + {
2223 + //index += 4096;
2224 +
2225 + zmw_enter_critical_section(dev);
2226 + if (tid_rx->seq_start >= 4096) {
2227 + tid_rx->seq_start = 0;
2228 + }
2229 + zmw_leave_critical_section(dev);
2230 +
2231 + }
2232 +
2233 + if (tid_rx->seq_start == seq_no) {
2234 + zmw_enter_critical_section(dev);
2235 + if (((tid_rx->baw_head - tid_rx->baw_tail) & ZM_AGG_BAW_MASK) > 0) {
2236 + //DbgPrint("head=%d, tail=%d", tid_rx->baw_head, tid_rx->baw_tail);
2237 + tid_rx->baw_tail = (tid_rx->baw_tail + 1) & ZM_AGG_BAW_MASK;
2238 + }
2239 + tid_rx->seq_start = (tid_rx->seq_start + 1) & (4096 - 1);
2240 + zmw_leave_critical_section(dev);
2241 +
2242 + ZM_PERFORMANCE_RX_SEQ(dev, buf);
2243 +
2244 + if (wd->zfcbRecv80211 != NULL) {
2245 + //seq_no = zmw_rx_buf_readh(dev, buf, offset+22) >> 4;
2246 + //DbgPrint("Recv indicate seq=%d\n", seq_no);
2247 + //DbgPrint("1. seq=%d\n", seq_no);
2248 +
2249 + wd->zfcbRecv80211(dev, buf, addInfo);
2250 + }
2251 + else {
2252 + zfiRecv80211(dev, buf, addInfo);
2253 + }
2254 + }
2255 + else if (!zfAggRxEnqueue(dev, buf, tid_rx, addInfo))
2256 + {
2257 + /*
2258 + * duplicated packet
2259 + */
2260 + return 1;
2261 + }
2262 +
2263 + while (tid_rx->baw_head != tid_rx->baw_tail) {// && tid_rx->frame[tid_rx->baw_tail].buf)
2264 + u16_t tailIndex;
2265 +
2266 + zmw_enter_critical_section(dev);
2267 +
2268 + tailIndex = tid_rx->baw_tail;
2269 + pbuf = tid_rx->frame[tailIndex].buf;
2270 + tid_rx->frame[tailIndex].buf = 0;
2271 + if (!pbuf)
2272 + {
2273 + zmw_leave_critical_section(dev);
2274 + break;
2275 + }
2276 +
2277 + tid_rx->baw_tail = (tid_rx->baw_tail + 1) & ZM_AGG_BAW_MASK;
2278 + tid_rx->seq_start = (tid_rx->seq_start + 1) & (4096 - 1);
2279 +
2280 +
2281 + //if(pbuf && tid_rx->baw_size > 0)
2282 + // tid_rx->baw_size--;
2283 +
2284 + zmw_leave_critical_section(dev);
2285 +
2286 + ZM_PERFORMANCE_RX_SEQ(dev, pbuf);
2287 +
2288 + if (wd->zfcbRecv80211 != NULL)
2289 + {
2290 + //seq_no = zmw_rx_buf_readh(dev, pbuf, offset+22) >> 4;
2291 + //DbgPrint("Recv indicate seq=%d\n", seq_no);
2292 + //DbgPrint("1. seq=%d\n", seq_no);
2293 + wd->zfcbRecv80211(dev, pbuf, addInfo);
2294 + }
2295 + else
2296 + {
2297 + //seq_no = zmw_rx_buf_readh(dev, pbuf, offset+22) >> 4;
2298 + //DbgPrint("Recv indicate seq=%d\n", seq_no);
2299 + zfiRecv80211(dev, pbuf, addInfo);
2300 + }
2301 + }
2302 +
2303 + return 1;
2304 +}
2305 +
2306 +struct agg_tid_rx *zfAggRxGetQueue(zdev_t* dev, zbuf_t* buf)
2307 +{
2308 + u16_t src[3];
2309 + u16_t aid, ac, i;
2310 + u16_t offset = 0;
2311 + struct agg_tid_rx *tid_rx = NULL;
2312 +
2313 + zmw_get_wlan_dev(dev);
2314 +
2315 + //zmw_declare_for_critical_section();
2316 +
2317 + src[0] = zmw_rx_buf_readh(dev, buf, offset+10);
2318 + src[1] = zmw_rx_buf_readh(dev, buf, offset+12);
2319 + src[2] = zmw_rx_buf_readh(dev, buf, offset+14);
2320 + aid = zfApFindSta(dev, src);
2321 +
2322 + ac = (zmw_rx_buf_readh(dev, buf, 24) & 0xF);
2323 +
2324 + // mark by spin lock debug
2325 + //zmw_enter_critical_section(dev);
2326 +
2327 + for (i=0; i<ZM_AGG_POOL_SIZE ; i++)
2328 + {
2329 + if((wd->tid_rx[i]->aid == aid) && (wd->tid_rx[i]->ac == ac))
2330 + {
2331 + tid_rx = wd->tid_rx[i];
2332 + break;
2333 + }
2334 + }
2335 +
2336 + // mark by spin lock debug
2337 + //zmw_leave_critical_section(dev);
2338 + return tid_rx;
2339 +}
2340 +
2341 +
2342 +u16_t zfAggRxEnqueue(zdev_t* dev, zbuf_t* buf, struct agg_tid_rx *tid_rx, struct zsAdditionInfo *addInfo)
2343 +{
2344 + u16_t seq_no, offset = 0;
2345 + u16_t q_index;
2346 + s16_t index;
2347 + u8_t bdropframe = 0;
2348 +
2349 + zmw_get_wlan_dev(dev);
2350 +
2351 + zmw_declare_for_critical_section();
2352 +
2353 + ZM_BUFFER_TRACE(dev, buf)
2354 +
2355 + seq_no = zmw_rx_buf_readh(dev, buf, offset+22) >> 4;
2356 + index = seq_no - tid_rx->seq_start;
2357 +
2358 + /*
2359 + * sequence number wrap at 4k
2360 + * -1000: check for duplicate past packet
2361 + */
2362 + bdropframe = 0;
2363 + if (tid_rx->seq_start > seq_no) {
2364 + if ((tid_rx->seq_start > 3967) && (seq_no < 128)) {
2365 + index += 4096;
2366 + } else if (tid_rx->seq_start - seq_no > 70) {
2367 + zmw_enter_critical_section(dev);
2368 + tid_rx->sq_behind_count++;
2369 + if (tid_rx->sq_behind_count > 3) {
2370 + tid_rx->sq_behind_count = 0;
2371 + } else {
2372 + bdropframe = 1;
2373 + }
2374 + zmw_leave_critical_section(dev);
2375 + } else {
2376 + bdropframe = 1;
2377 + }
2378 + } else {
2379 + if (seq_no - tid_rx->seq_start > 70) {
2380 + zmw_enter_critical_section(dev);
2381 + tid_rx->sq_exceed_count++;
2382 + if (tid_rx->sq_exceed_count > 3) {
2383 + tid_rx->sq_exceed_count = 0;
2384 + } else {
2385 + bdropframe = 1;
2386 + }
2387 + zmw_leave_critical_section(dev);
2388 + }
2389 + }
2390 +
2391 + if (bdropframe == 1) {
2392 + /*if (wd->zfcbRecv80211 != NULL) {
2393 + wd->zfcbRecv80211(dev, buf, addInfo);
2394 + }
2395 + else {
2396 + zfiRecv80211(dev, buf, addInfo);
2397 + }*/
2398 +
2399 + ZM_PERFORMANCE_FREE(dev, buf);
2400 +
2401 + zfwBufFree(dev, buf, 0);
2402 + /*zfAggRxFlush(dev, seq_no, tid_rx);
2403 + tid_rx->seq_start = seq_no;
2404 + index = seq_no - tid_rx->seq_start;
2405 + */
2406 +
2407 + //DbgPrint("Free an old packet, seq_start=%d, seq_no=%d\n", tid_rx->seq_start, seq_no);
2408 +
2409 + /*
2410 + * duplicate past packet
2411 + * happens only in simulated aggregation environment
2412 + */
2413 + return 0;
2414 + } else {
2415 + zmw_enter_critical_section(dev);
2416 + if (tid_rx->sq_exceed_count > 0){
2417 + tid_rx->sq_exceed_count--;
2418 + }
2419 +
2420 + if (tid_rx->sq_behind_count > 0) {
2421 + tid_rx->sq_behind_count--;
2422 + }
2423 + zmw_leave_critical_section(dev);
2424 + }
2425 +
2426 + if (index < 0) {
2427 + zfAggRxFlush(dev, seq_no, tid_rx);
2428 + tid_rx->seq_start = seq_no;
2429 + index = 0;
2430 + }
2431 +
2432 + //if (index >= (ZM_AGG_BAW_SIZE - 1))
2433 + if (index >= (ZM_AGG_BAW_MASK))
2434 + {
2435 + /*
2436 + * queue full
2437 + */
2438 + //DbgPrint("index >= 64, seq_start=%d, seq_no=%d\n", tid_rx->seq_start, seq_no);
2439 + zfAggRxFlush(dev, seq_no, tid_rx);
2440 + //tid_rx->seq_start = seq_no;
2441 + index = seq_no - tid_rx->seq_start;
2442 + if ((tid_rx->seq_start > seq_no) && (tid_rx->seq_start > 1000) && (tid_rx->seq_start - 1000) > seq_no)
2443 + {
2444 + //index = seq_no - tid_rx->seq_start;
2445 + index += 4096;
2446 + }
2447 + //index = seq_no - tid_rx->seq_start;
2448 + while (index >= (ZM_AGG_BAW_MASK)) {
2449 + //DbgPrint("index >= 64, seq_start=%d, seq_no=%d\n", tid_rx->seq_start, seq_no);
2450 + tid_rx->seq_start = (tid_rx->seq_start + ZM_AGG_BAW_MASK) & (4096 - 1);
2451 + index = seq_no - tid_rx->seq_start;
2452 + if ((tid_rx->seq_start > seq_no) && (tid_rx->seq_start > 1000) && (tid_rx->seq_start - 1000) > seq_no)
2453 + {
2454 + index += 4096;
2455 + }
2456 + }
2457 + }
2458 +
2459 +
2460 + q_index = (tid_rx->baw_tail + index) & ZM_AGG_BAW_MASK;
2461 + if (tid_rx->frame[q_index].buf && (((tid_rx->baw_head - tid_rx->baw_tail) & ZM_AGG_BAW_MASK) >
2462 + (((q_index) - tid_rx->baw_tail) & ZM_AGG_BAW_MASK)))
2463 + {
2464 +
2465 + ZM_PERFORMANCE_DUP(dev, tid_rx->frame[q_index].buf, buf);
2466 + zfwBufFree(dev, buf, 0);
2467 + //DbgPrint("Free a duplicate packet, seq_start=%d, seq_no=%d\n", tid_rx->seq_start, seq_no);
2468 + //DbgPrint("head=%d, tail=%d", tid_rx->baw_head, tid_rx->baw_tail);
2469 + /*
2470 + * duplicate packet
2471 + */
2472 + return 0;
2473 + }
2474 +
2475 + zmw_enter_critical_section(dev);
2476 + if(tid_rx->frame[q_index].buf) {
2477 + zfwBufFree(dev, tid_rx->frame[q_index].buf, 0);
2478 + tid_rx->frame[q_index].buf = 0;
2479 + }
2480 +
2481 + tid_rx->frame[q_index].buf = buf;
2482 + tid_rx->frame[q_index].arrivalTime = zm_agg_GetTime();
2483 + zfwMemoryCopy((void*)&tid_rx->frame[q_index].addInfo, (void*)addInfo, sizeof(struct zsAdditionInfo));
2484 +
2485 + /*
2486 + * for debug simulated aggregation only,
2487 + * should be done in rx of ADDBA Request
2488 + */
2489 + //tid_rx->addInfo = addInfo;
2490 +
2491 +
2492 + if (((tid_rx->baw_head - tid_rx->baw_tail) & ZM_AGG_BAW_MASK) <= index)
2493 + {
2494 + //tid_rx->baw_size = index + 1;
2495 + if (((tid_rx->baw_head - tid_rx->baw_tail) & ZM_AGG_BAW_MASK) <=
2496 + //((q_index + 1) & ZM_AGG_BAW_MASK))
2497 + (((q_index) - tid_rx->baw_tail) & ZM_AGG_BAW_MASK))//tid_rx->baw_size )
2498 + tid_rx->baw_head = (q_index + 1) & ZM_AGG_BAW_MASK;
2499 + }
2500 + zmw_leave_critical_section(dev);
2501 +
2502 + /*
2503 + * success
2504 + */
2505 + //DbgPrint("head=%d, tail=%d, start=%d", tid_rx->baw_head, tid_rx->baw_tail, tid_rx->seq_start);
2506 + return 1;
2507 +}
2508 +
2509 +u16_t zfAggRxFlush(zdev_t* dev, u16_t seq_no, struct agg_tid_rx *tid_rx)
2510 +{
2511 + zbuf_t* pbuf;
2512 + u16_t seq;
2513 + struct zsAdditionInfo addInfo;
2514 + zmw_get_wlan_dev(dev);
2515 + zmw_declare_for_critical_section();
2516 +
2517 + ZM_PERFORMANCE_RX_FLUSH(dev);
2518 +
2519 + while (1)
2520 + {
2521 + zmw_enter_critical_section(dev);
2522 + if (tid_rx->baw_tail == tid_rx->baw_head) {
2523 + zmw_leave_critical_section(dev);
2524 + break;
2525 + }
2526 +
2527 + pbuf = tid_rx->frame[tid_rx->baw_tail].buf;
2528 + zfwMemoryCopy((void*)&addInfo, (void*)&tid_rx->frame[tid_rx->baw_tail].addInfo, sizeof(struct zsAdditionInfo));
2529 + tid_rx->frame[tid_rx->baw_tail].buf = 0;
2530 + //if(pbuf && tid_rx->baw_size > 0) tid_rx->baw_size--;
2531 + tid_rx->baw_tail = (tid_rx->baw_tail + 1) & ZM_AGG_BAW_MASK;
2532 + tid_rx->seq_start = (tid_rx->seq_start + 1) & (4096 - 1);
2533 + zmw_leave_critical_section(dev);
2534 +
2535 + if (pbuf)
2536 + {
2537 +
2538 + ZM_PERFORMANCE_RX_SEQ(dev, pbuf);
2539 +
2540 + if (wd->zfcbRecv80211 != NULL)
2541 + {
2542 + seq = zmw_rx_buf_readh(dev, pbuf, 22) >> 4;
2543 + //DbgPrint("Recv indicate seq=%d\n", seq);
2544 + //DbgPrint("2. seq=%d\n", seq);
2545 + wd->zfcbRecv80211(dev, pbuf, &addInfo);
2546 + }
2547 + else
2548 + {
2549 + seq = zmw_rx_buf_readh(dev, pbuf, 22) >> 4;
2550 + //DbgPrint("Recv indicate seq=%d\n", seq);
2551 + zfiRecv80211(dev, pbuf, &addInfo);
2552 + }
2553 + }
2554 + }
2555 +
2556 + zmw_enter_critical_section(dev);
2557 + tid_rx->baw_head = tid_rx->baw_tail = 0;
2558 + zmw_leave_critical_section(dev);
2559 + return 1;
2560 +}
2561 +
2562 +
2563 +
2564 +/************************************************************************/
2565 +/* */
2566 +/* FUNCTION DESCRIPTION zfAggRxFreeBuf */
2567 +/* Frees all queued packets in buffer when the driver is down. */
2568 +/* The zfFreeResource() will check if the buffer is all freed. */
2569 +/* */
2570 +/* INPUTS */
2571 +/* dev : device pointer */
2572 +/* */
2573 +/* OUTPUTS */
2574 +/* ZM_SUCCESS */
2575 +/* */
2576 +/* AUTHOR */
2577 +/* Honda Atheros Communications, INC. 2006.12 */
2578 +/* */
2579 +/************************************************************************/
2580 +u16_t zfAggRxFreeBuf(zdev_t* dev, u16_t destroy)
2581 +{
2582 + u16_t i;
2583 + zbuf_t* buf;
2584 + struct agg_tid_rx *tid_rx;
2585 +
2586 + TID_TX tid_tx;
2587 + //struct bufInfo *buf_info;
2588 +
2589 + zmw_get_wlan_dev(dev);
2590 + zmw_declare_for_critical_section();
2591 +
2592 + for (i=0; i<ZM_AGG_POOL_SIZE; i++)
2593 + {
2594 + u16_t j;
2595 +
2596 + tid_rx = wd->tid_rx[i];
2597 +
2598 + for(j=0; j <= ZM_AGG_BAW_SIZE; j++)
2599 + {
2600 + zmw_enter_critical_section(dev);
2601 + buf = tid_rx->frame[j].buf;
2602 + tid_rx->frame[j].buf = 0;
2603 + zmw_leave_critical_section(dev);
2604 +
2605 + if (buf)
2606 + {
2607 + zfwBufFree(dev, buf, 0);
2608 + }
2609 + }
2610 +
2611 + #if 0
2612 + if ( tid_rx->baw_head != tid_rx->baw_tail )
2613 + {
2614 + while (tid_rx->baw_head != tid_rx->baw_tail)
2615 + {
2616 + buf = tid_rx->frame[tid_rx->baw_tail].buf;
2617 + tid_rx->frame[tid_rx->baw_tail].buf = 0;
2618 + if (buf)
2619 + {
2620 + zfwBufFree(dev, buf, 0);
2621 +
2622 + zmw_enter_critical_section(dev);
2623 + tid_rx->frame[tid_rx->baw_tail].buf = 0;
2624 + zmw_leave_critical_section(dev);
2625 + }
2626 + zmw_enter_critical_section(dev);
2627 + //if (tid_rx->baw_size > 0)tid_rx->baw_size--;
2628 + tid_rx->baw_tail = (tid_rx->baw_tail + 1) & ZM_AGG_BAW_MASK;
2629 + tid_rx->seq_start++;
2630 + zmw_leave_critical_section(dev);
2631 + }
2632 + }
2633 + #endif
2634 +
2635 + zmw_enter_critical_section(dev);
2636 + tid_rx->seq_start = 0;
2637 + tid_rx->baw_head = tid_rx->baw_tail = 0;
2638 + tid_rx->aid = ZM_MAX_STA_SUPPORT;
2639 + zmw_leave_critical_section(dev);
2640 +
2641 + #ifdef ZM_ENABLE_AGGREGATION
2642 + #ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
2643 + if (tid_baw->enabled) {
2644 + zm_msg1_agg(ZM_LV_0, "Device down, clear BAW queue:", i);
2645 + BAW->disable(dev, tid_baw);
2646 + }
2647 + #endif
2648 + #endif
2649 + if (1 == wd->aggQPool[i]->aggQEnabled) {
2650 + tid_tx = wd->aggQPool[i];
2651 + buf = zfAggTxGetVtxq(dev, tid_tx);
2652 + while (buf) {
2653 + zfwBufFree(dev, buf, 0);
2654 + buf = zfAggTxGetVtxq(dev, tid_tx);
2655 + }
2656 + }
2657 +
2658 + if(destroy) {
2659 + zfwMemFree(dev, wd->aggQPool[i], sizeof(struct aggQueue));
2660 + zfwMemFree(dev, wd->tid_rx[i], sizeof(struct agg_tid_rx));
2661 + }
2662 + }
2663 + #ifdef ZM_ENABLE_AGGREGATION
2664 + #ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
2665 + if(destroy) zfwMemFree(dev, BAW, sizeof(struct baw_enabler));
2666 + #endif
2667 + #endif
2668 + return ZM_SUCCESS;
2669 +}
2670 +
2671 +
2672 +void zfAggRecvBAR(zdev_t* dev, zbuf_t *buf) {
2673 + u16_t start_seq, len;
2674 + u8_t i, bitmap[8];
2675 + len = zfwBufGetSize(dev, buf);
2676 + start_seq = zmw_rx_buf_readh(dev, buf, len-2);
2677 + DbgPrint("Received a BAR Control frame, start_seq=%d", start_seq>>4);
2678 + /* todo: set the bitmap by reordering buffer! */
2679 + for (i=0; i<8; i++) bitmap[i]=0;
2680 + zfSendBA(dev, start_seq, bitmap);
2681 +}
2682 +
2683 +#ifdef ZM_ENABLE_AGGREGATION
2684 +#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
2685 +void zfAggTxRetransmit(zdev_t* dev, struct bufInfo *buf_info, struct aggControl *aggControl, TID_TX tid_tx) {
2686 + u16_t removeLen;
2687 + u16_t err;
2688 +
2689 + zmw_get_wlan_dev(dev);
2690 + if (aggControl && (ZM_AGG_FIRST_MPDU == aggControl->ampduIndication) ) {
2691 + tid_tx->bar_ssn = buf_info->baw_header->header[15];
2692 + aggControl->tid_baw->start_seq = tid_tx->bar_ssn >> 4;
2693 + zm_msg1_agg(ZM_LV_0, "start seq=", tid_tx->bar_ssn >> 4);
2694 + }
2695 + buf_info->baw_header->header[4] |= (1 << 11);
2696 + if (aggControl && aggControl->aggEnabled) {
2697 + //if (wd->enableAggregation==0 && !(buf_info->baw_header->header[6]&0x1))
2698 + //{
2699 + //if (((buf_info->baw_header->header[2] & 0x3) == 2))
2700 + //{
2701 + /* Enable aggregation */
2702 + buf_info->baw_header->header[1] |= 0x20;
2703 + if (ZM_AGG_LAST_MPDU == aggControl->ampduIndication) {
2704 + buf_info->baw_header->header[1] |= 0x4000;
2705 + }
2706 + else {
2707 + buf_info->baw_header->header[1] &= ~0x4000;
2708 + //zm_debug_msg0("ZM_AGG_LAST_MPDU");
2709 + }
2710 + //}
2711 + //else {
2712 + // zm_debug_msg1("no aggr, header[2]&0x3 = ",buf_info->baw_header->header[2] & 0x3)
2713 + // aggControl->aggEnabled = 0;
2714 + //}
2715 + //}
2716 + //else {
2717 + // zm_debug_msg1("no aggr, wd->enableAggregation = ", wd->enableAggregation);
2718 + // zm_debug_msg1("no aggr, !header[6]&0x1 = ",!(buf_info->baw_header->header[6]&0x1));
2719 + // aggControl->aggEnabled = 0;
2720 + //}
2721 + }
2722 +
2723 + /*if (aggControl->tid_baw) {
2724 + struct baw_header_r header_r;
2725 +
2726 + header_r.header = buf_info->baw_header->header;
2727 + header_r.mic = buf_info->baw_header->mic;
2728 + header_r.snap = buf_info->baw_header->snap;
2729 + header_r.headerLen = buf_info->baw_header->headerLen;
2730 + header_r.micLen = buf_info->baw_header->micLen;
2731 + header_r.snapLen = buf_info->baw_header->snapLen;
2732 + header_r.removeLen = buf_info->baw_header->removeLen;
2733 + header_r.keyIdx = buf_info->baw_header->keyIdx;
2734 +
2735 + BAW->insert(dev, buf_info->buf, tid_tx->bar_ssn >> 4, aggControl->tid_baw, buf_info->baw_retransmit, &header_r);
2736 + }*/
2737 +
2738 + if ((err = zfHpSend(dev,
2739 + buf_info->baw_header->header,
2740 + buf_info->baw_header->headerLen,
2741 + buf_info->baw_header->snap,
2742 + buf_info->baw_header->snapLen,
2743 + buf_info->baw_header->mic,
2744 + buf_info->baw_header->micLen,
2745 + buf_info->buf,
2746 + buf_info->baw_header->removeLen,
2747 + ZM_EXTERNAL_ALLOC_BUF,
2748 + (u8_t)tid_tx->ac,
2749 + buf_info->baw_header->keyIdx)) != ZM_SUCCESS)
2750 + {
2751 + goto zlError;
2752 + }
2753 +
2754 + return;
2755 +
2756 +zlError:
2757 + zfwBufFree(dev, buf_info->buf, 0);
2758 + return;
2759 +
2760 +}
2761 +#endif //disable BAW
2762 +#endif
2763 +/************************************************************************/
2764 +/* */
2765 +/* FUNCTION DESCRIPTION zfAggTxSendEth */
2766 +/* Called to transmit Ethernet frame from upper elayer. */
2767 +/* */
2768 +/* INPUTS */
2769 +/* dev : device pointer */
2770 +/* buf : buffer pointer */
2771 +/* port : WLAN port, 0=>standard, 0x10-0x17=>VAP, 0x20-0x25=>WDS */
2772 +/* */
2773 +/* OUTPUTS */
2774 +/* error code */
2775 +/* */
2776 +/* AUTHOR */
2777 +/* Stephen, Honda Atheros Communications, Inc. 2006.12 */
2778 +/* */
2779 +/************************************************************************/
2780 +u16_t zfAggTxSendEth(zdev_t* dev, zbuf_t* buf, u16_t port, u16_t bufType, u8_t flag, struct aggControl *aggControl, TID_TX tid_tx)
2781 +{
2782 + u16_t err;
2783 + //u16_t addrTblSize;
2784 + //struct zsAddrTbl addrTbl;
2785 + u16_t removeLen;
2786 + u16_t header[(8+30+2+18)/2]; /* ctr+(4+a1+a2+a3+2+a4)+qos+iv */
2787 + u16_t headerLen;
2788 + u16_t mic[8/2];
2789 + u16_t micLen;
2790 + u16_t snap[8/2];
2791 + u16_t snapLen;
2792 + u16_t fragLen;
2793 + u16_t frameLen;
2794 + u16_t fragNum;
2795 + struct zsFrag frag;
2796 + u16_t i, id;
2797 + u16_t da[3];
2798 + u16_t sa[3];
2799 + u8_t up;
2800 + u8_t qosType, keyIdx = 0;
2801 + u16_t fragOff;
2802 +
2803 + zmw_get_wlan_dev(dev);
2804 +
2805 + zmw_declare_for_critical_section();
2806 +
2807 + zm_msg1_tx(ZM_LV_2, "zfTxSendEth(), port=", port);
2808 +
2809 + /* Get IP TOS for QoS AC and IP frag offset */
2810 + zfTxGetIpTosAndFrag(dev, buf, &up, &fragOff);
2811 +
2812 +#ifdef ZM_ENABLE_NATIVE_WIFI
2813 + if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
2814 + {
2815 + /* DA */
2816 + da[0] = zmw_tx_buf_readh(dev, buf, 16);
2817 + da[1] = zmw_tx_buf_readh(dev, buf, 18);
2818 + da[2] = zmw_tx_buf_readh(dev, buf, 20);
2819 + /* SA */
2820 + sa[0] = zmw_tx_buf_readh(dev, buf, 10);
2821 + sa[1] = zmw_tx_buf_readh(dev, buf, 12);
2822 + sa[2] = zmw_tx_buf_readh(dev, buf, 14);
2823 + }
2824 + else if ( wd->wlanMode == ZM_MODE_IBSS )
2825 + {
2826 + /* DA */
2827 + da[0] = zmw_tx_buf_readh(dev, buf, 4);
2828 + da[1] = zmw_tx_buf_readh(dev, buf, 6);
2829 + da[2] = zmw_tx_buf_readh(dev, buf, 8);
2830 + /* SA */
2831 + sa[0] = zmw_tx_buf_readh(dev, buf, 10);
2832 + sa[1] = zmw_tx_buf_readh(dev, buf, 12);
2833 + sa[2] = zmw_tx_buf_readh(dev, buf, 14);
2834 + }
2835 + else if ( wd->wlanMode == ZM_MODE_AP )
2836 + {
2837 + /* DA */
2838 + da[0] = zmw_tx_buf_readh(dev, buf, 4);
2839 + da[1] = zmw_tx_buf_readh(dev, buf, 6);
2840 + da[2] = zmw_tx_buf_readh(dev, buf, 8);
2841 + /* SA */
2842 + sa[0] = zmw_tx_buf_readh(dev, buf, 16);
2843 + sa[1] = zmw_tx_buf_readh(dev, buf, 18);
2844 + sa[2] = zmw_tx_buf_readh(dev, buf, 20);
2845 + }
2846 + else
2847 + {
2848 + //
2849 + }
2850 +#else
2851 + /* DA */
2852 + da[0] = zmw_tx_buf_readh(dev, buf, 0);
2853 + da[1] = zmw_tx_buf_readh(dev, buf, 2);
2854 + da[2] = zmw_tx_buf_readh(dev, buf, 4);
2855 + /* SA */
2856 + sa[0] = zmw_tx_buf_readh(dev, buf, 6);
2857 + sa[1] = zmw_tx_buf_readh(dev, buf, 8);
2858 + sa[2] = zmw_tx_buf_readh(dev, buf, 10);
2859 +#endif
2860 + //Decide Key Index in ATOM, No meaning in OTUS--CWYang(m)
2861 + if (wd->wlanMode == ZM_MODE_AP)
2862 + {
2863 + keyIdx = wd->ap.bcHalKeyIdx[port];
2864 + id = zfApFindSta(dev, da);
2865 + if (id != 0xffff)
2866 + {
2867 + switch (wd->ap.staTable[id].encryMode)
2868 + {
2869 + case ZM_AES:
2870 + case ZM_TKIP:
2871 +#ifdef ZM_ENABLE_CENC
2872 + case ZM_CENC:
2873 +#endif //ZM_ENABLE_CENC
2874 + keyIdx = wd->ap.staTable[id].keyIdx;
2875 + break;
2876 + }
2877 + }
2878 + }
2879 + else
2880 + {
2881 + switch (wd->sta.encryMode)
2882 + {
2883 + case ZM_WEP64:
2884 + case ZM_WEP128:
2885 + case ZM_WEP256:
2886 + keyIdx = wd->sta.keyId;
2887 + break;
2888 + case ZM_AES:
2889 + case ZM_TKIP:
2890 + if ((da[0]& 0x1))
2891 + keyIdx = 5;
2892 + else
2893 + keyIdx = 4;
2894 + break;
2895 +#ifdef ZM_ENABLE_CENC
2896 + case ZM_CENC:
2897 + keyIdx = wd->sta.cencKeyId;
2898 + break;
2899 +#endif //ZM_ENABLE_CENC
2900 + }
2901 + }
2902 +
2903 + /* Create SNAP */
2904 + removeLen = zfTxGenWlanSnap(dev, buf, snap, &snapLen);
2905 + //zm_msg1_tx(ZM_LV_0, "fragOff=", fragOff);
2906 +
2907 + fragLen = wd->fragThreshold;
2908 + frameLen = zfwBufGetSize(dev, buf);
2909 + frameLen -= removeLen;
2910 +
2911 +#if 0
2912 + /* Create MIC */
2913 + if ( (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)&&
2914 + (wd->sta.encryMode == ZM_TKIP) )
2915 + {
2916 + if ( frameLen > fragLen )
2917 + {
2918 + micLen = zfTxGenWlanTail(dev, buf, snap, snapLen, mic);
2919 + }
2920 + else
2921 + {
2922 + /* append MIC by HMAC */
2923 + micLen = 8;
2924 + }
2925 + }
2926 + else
2927 + {
2928 + micLen = 0;
2929 + }
2930 +#else
2931 + if ( frameLen > fragLen )
2932 + {
2933 + micLen = zfTxGenWlanTail(dev, buf, snap, snapLen, mic);
2934 + }
2935 + else
2936 + {
2937 + /* append MIC by HMAC */
2938 + micLen = 0;
2939 + }
2940 +#endif
2941 +
2942 + /* Access Category */
2943 + if (wd->wlanMode == ZM_MODE_AP)
2944 + {
2945 + zfApGetStaQosType(dev, da, &qosType);
2946 + if (qosType == 0)
2947 + {
2948 + up = 0;
2949 + }
2950 + }
2951 + else if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)
2952 + {
2953 + if (wd->sta.wmeConnected == 0)
2954 + {
2955 + up = 0;
2956 + }
2957 + }
2958 + else
2959 + {
2960 + /* TODO : STA QoS control field */
2961 + up = 0;
2962 + }
2963 +
2964 + /* Assign sequence number */
2965 + zmw_enter_critical_section(dev);
2966 + frag.seq[0] = ((wd->seq[zcUpToAc[up&0x7]]++) << 4);
2967 + if (aggControl && (ZM_AGG_FIRST_MPDU == aggControl->ampduIndication) ) {
2968 + tid_tx->bar_ssn = frag.seq[0];
2969 +
2970 + zm_msg1_agg(ZM_LV_0, "start seq=", tid_tx->bar_ssn >> 4);
2971 + }
2972 + //tid_tx->baw_buf[tid_tx->baw_head-1].baw_seq=frag.seq[0];
2973 + zmw_leave_critical_section(dev);
2974 +
2975 +
2976 + frag.buf[0] = buf;
2977 + frag.bufType[0] = bufType;
2978 + frag.flag[0] = flag;
2979 + fragNum = 1;
2980 +
2981 + for (i=0; i<fragNum; i++)
2982 + {
2983 + /* Create WLAN header(Control Setting + 802.11 header + IV) */
2984 + if (up !=0 ) zm_debug_msg1("up not 0, up=",up);
2985 + headerLen = zfTxGenWlanHeader(dev, frag.buf[i], header, frag.seq[i],
2986 + frag.flag[i], snapLen+micLen, removeLen,
2987 + port, da, sa, up, &micLen, snap, snapLen,
2988 + aggControl);
2989 +
2990 + /* Get buffer DMA address */
2991 + //if ((addrTblSize = zfwBufMapDma(dev, frag.buf[i], &addrTbl)) == 0)
2992 + //if ((addrTblSize = zfwMapTxDma(dev, frag.buf[i], &addrTbl)) == 0)
2993 + //{
2994 + // err = ZM_ERR_BUFFER_DMA_ADDR;
2995 + // goto zlError;
2996 + //}
2997 +
2998 + /* Flush buffer on cache */
2999 + //zfwBufFlush(dev, frag.buf[i]);
3000 +
3001 +#if 0
3002 + zm_msg1_tx(ZM_LV_0, "headerLen=", headerLen);
3003 + zm_msg1_tx(ZM_LV_0, "snapLen=", snapLen);
3004 + zm_msg1_tx(ZM_LV_0, "micLen=", micLen);
3005 + zm_msg1_tx(ZM_LV_0, "removeLen=", removeLen);
3006 + zm_msg1_tx(ZM_LV_0, "addrTblSize=", addrTblSize);
3007 + zm_msg1_tx(ZM_LV_0, "frag.bufType[0]=", frag.bufType[0]);
3008 +#endif
3009 +
3010 + fragLen = zfwBufGetSize(dev, frag.buf[i]);
3011 + if ((da[0]&0x1) == 0)
3012 + {
3013 + wd->commTally.txUnicastFrm++;
3014 + wd->commTally.txUnicastOctets += (fragLen+snapLen);
3015 + }
3016 + else if ((da[0]& 0x1))
3017 + {
3018 + wd->commTally.txBroadcastFrm++;
3019 + wd->commTally.txBroadcastOctets += (fragLen+snapLen);
3020 + }
3021 + else
3022 + {
3023 + wd->commTally.txMulticastFrm++;
3024 + wd->commTally.txMulticastOctets += (fragLen+snapLen);
3025 + }
3026 + wd->ledStruct.txTraffic++;
3027 +
3028 +#if 0 //Who care this?
3029 + if ( (i)&&(i == (fragNum-1)) )
3030 + {
3031 + wd->trafTally.txDataByteCount -= micLen;
3032 + }
3033 +#endif
3034 +
3035 + /*if (aggControl->tid_baw && aggControl->aggEnabled) {
3036 + struct baw_header_r header_r;
3037 +
3038 + header_r.header = header;
3039 + header_r.mic = mic;
3040 + header_r.snap = snap;
3041 + header_r.headerLen = headerLen;
3042 + header_r.micLen = micLen;
3043 + header_r.snapLen = snapLen;
3044 + header_r.removeLen = removeLen;
3045 + header_r.keyIdx = keyIdx;
3046 +
3047 + BAW->insert(dev, buf, tid_tx->bar_ssn >> 4, aggControl->tid_baw, 0, &header_r);
3048 + }*/
3049 +
3050 + if ((err = zfHpSend(dev, header, headerLen, snap, snapLen,
3051 + mic, micLen, frag.buf[i], removeLen,
3052 + frag.bufType[i], zcUpToAc[up&0x7], keyIdx)) != ZM_SUCCESS)
3053 + {
3054 + goto zlError;
3055 + }
3056 +
3057 +
3058 + continue;
3059 +
3060 +zlError:
3061 + if (frag.bufType[i] == ZM_EXTERNAL_ALLOC_BUF)
3062 + {
3063 + zfwBufFree(dev, frag.buf[i], err);
3064 + }
3065 + else if (frag.bufType[i] == ZM_INTERNAL_ALLOC_BUF)
3066 + {
3067 + zfwBufFree(dev, frag.buf[i], 0);
3068 + }
3069 + else
3070 + {
3071 + zm_assert(0);
3072 + }
3073 + } /* for (i=0; i<fragNum; i++) */
3074 +
3075 + return ZM_SUCCESS;
3076 +}
3077 +
3078 +/*
3079 + * zfAggSendADDBA() refers zfSendMmFrame() in cmm.c
3080 + */
3081 +u16_t zfAggSendAddbaRequest(zdev_t* dev, u16_t *dst, u16_t ac, u16_t up)
3082 +{
3083 + zbuf_t* buf;
3084 + //u16_t addrTblSize;
3085 + //struct zsAddrTbl addrTbl;
3086 + //u16_t err;
3087 + u16_t offset = 0;
3088 + u16_t hlen = 32;
3089 + u16_t header[(24+25+1)/2];
3090 + u16_t vap = 0;
3091 + u16_t i;
3092 + u8_t encrypt = 0;
3093 +
3094 + //zmw_get_wlan_dev(dev);
3095 +
3096 + //zmw_declare_for_critical_section();
3097 +
3098 +
3099 + /*
3100 + * TBD : Maximum size of managment frame
3101 + */
3102 + if ((buf = zfwBufAllocate(dev, 1024)) == NULL)
3103 + {
3104 + zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!");
3105 + return ZM_SUCCESS;
3106 + }
3107 +
3108 + /*
3109 + * Reserve room for wlan header
3110 + */
3111 + offset = hlen;
3112 +
3113 + /*
3114 + * add addba frame body
3115 + */
3116 + offset = zfAggSetAddbaFrameBody(dev, buf, offset, ac, up);
3117 +
3118 +
3119 + zfwBufSetSize(dev, buf, offset);
3120 +
3121 + /*
3122 + * Copy wlan header
3123 + */
3124 + zfAggGenAddbaHeader(dev, dst, header, offset-hlen, buf, vap, encrypt);
3125 + for (i=0; i<(hlen>>1); i++)
3126 + {
3127 + zmw_tx_buf_writeh(dev, buf, i*2, header[i]);
3128 + }
3129 +
3130 + /* Get buffer DMA address */
3131 + //if ((addrTblSize = zfwBufMapDma(dev, buf, &addrTbl)) == 0)
3132 + //if ((addrTblSize = zfwMapTxDma(dev, buf, &addrTbl)) == 0)
3133 + //{
3134 + // goto zlError;
3135 + //}
3136 +
3137 + //zm_msg2_mm(ZM_LV_2, "offset=", offset);
3138 + //zm_msg2_mm(ZM_LV_2, "hlen=", hlen);
3139 + //zm_msg2_mm(ZM_LV_2, "addrTblSize=", addrTblSize);
3140 + //zm_msg2_mm(ZM_LV_2, "addrTbl.len[0]=", addrTbl.len[0]);
3141 + //zm_msg2_mm(ZM_LV_2, "addrTbl.physAddrl[0]=", addrTbl.physAddrl[0]);
3142 + //zm_msg2_mm(ZM_LV_2, "buf->data=", buf->data);
3143 +
3144 + #if 0
3145 + if ((err = zfHpSend(dev, NULL, 0, NULL, 0, NULL, 0, buf, 0,
3146 + ZM_INTERNAL_ALLOC_BUF, 0, 0xff)) != ZM_SUCCESS)
3147 + {
3148 + goto zlError;
3149 + }
3150 + #else
3151 + zfPutVmmq(dev, buf);
3152 + zfPushVtxq(dev);
3153 + #endif
3154 +
3155 + return ZM_SUCCESS;
3156 +
3157 +}
3158 +
3159 +u16_t zfAggSetAddbaFrameBody(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t ac, u16_t up)
3160 +{
3161 + u16_t ba_parameter, start_seq;
3162 +
3163 + zmw_get_wlan_dev(dev);
3164 +
3165 + //zmw_declare_for_critical_section();
3166 + /*
3167 + * ADDBA Request frame body
3168 + */
3169 +
3170 + /*
3171 + * Category
3172 + */
3173 + zmw_tx_buf_writeb(dev, buf, offset++, 3);
3174 + /*
3175 + * Action details = 0
3176 + */
3177 + zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_ADDBA_REQUEST_FRAME);
3178 + /*
3179 + * Dialog Token = nonzero
3180 + * TBD: define how to get dialog token?
3181 + */
3182 + zmw_tx_buf_writeb(dev, buf, offset++, 2);
3183 + /*
3184 + * Block Ack parameter set
3185 + * BA policy = 1 for immediate BA, 0 for delayed BA
3186 + * TID(4bits) & buffer size(4bits) (TID=up & buffer size=0x80)
3187 + * TBD: how to get buffer size?
3188 + * ¢z¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢{
3189 + * ¢x B0 ¢x B1 ¢x B2 B5 ¢x B6 B15 ¢x
3190 + * ¢u¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢t
3191 + * ¢x Reserved ¢x BA policy ¢x TID ¢x Buffer size ¢x
3192 + * ¢|¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢}
3193 + */
3194 + ba_parameter = 1 << 12; // buffer size = 0x40(64)
3195 + ba_parameter |= up << 2; // tid = up
3196 + ba_parameter |= 2; // ba policy = 1
3197 + zmw_tx_buf_writeh(dev, buf, offset, ba_parameter);
3198 + offset+=2;
3199 + /*
3200 + * BA timeout value
3201 + */
3202 + zmw_tx_buf_writeh(dev, buf, offset, 0);
3203 + offset+=2;
3204 + /*
3205 + * BA starting sequence number
3206 + * ¢z¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢{
3207 + * ¢x B0 B3 ¢x B4 B15 ¢x
3208 + * ¢u¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢t
3209 + * ¢x Frag num(0) ¢x BA starting seq num ¢x
3210 + * ¢|¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢}
3211 + */
3212 + start_seq = ((wd->seq[ac]) << 4) & 0xFFF0;
3213 + zmw_tx_buf_writeh(dev, buf, offset, start_seq);
3214 + offset+=2;
3215 +
3216 + return offset;
3217 +}
3218 +
3219 +u16_t zfAggGenAddbaHeader(zdev_t* dev, u16_t* dst,
3220 + u16_t* header, u16_t len, zbuf_t* buf, u16_t vap, u8_t encrypt)
3221 +{
3222 + u8_t hlen = 32; // MAC ctrl + PHY ctrl + 802.11 MM header
3223 + //u8_t frameType = ZM_WLAN_FRAME_TYPE_ACTION;
3224 +
3225 + zmw_get_wlan_dev(dev);
3226 +
3227 + zmw_declare_for_critical_section();
3228 +
3229 + /*
3230 + * Generate control setting
3231 + */
3232 + //bodyLen = zfwBufGetSize(dev, buf);
3233 + header[0] = 24+len+4; //Length
3234 + header[1] = 0x8; //MAC control, backoff + (ack)
3235 +
3236 +#if 0
3237 + /* CCK 1M */
3238 + header[2] = 0x0f00; //PHY control L
3239 + header[3] = 0x0000; //PHY control H
3240 +#else
3241 + /* OFDM 6M */
3242 + header[2] = 0x0f01; //PHY control L
3243 + header[3] = 0x000B; //PHY control H
3244 +#endif
3245 +
3246 + /*
3247 + * Generate WLAN header
3248 + * Frame control frame type and subtype
3249 + */
3250 + header[4+0] = ZM_WLAN_FRAME_TYPE_ACTION;
3251 + /*
3252 + * Duration
3253 + */
3254 + header[4+1] = 0;
3255 +
3256 + if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)
3257 + {
3258 + header[4+8] = wd->sta.bssid[0];
3259 + header[4+9] = wd->sta.bssid[1];
3260 + header[4+10] = wd->sta.bssid[2];
3261 + }
3262 + else if (wd->wlanMode == ZM_MODE_PSEUDO)
3263 + {
3264 + /* Address 3 = 00:00:00:00:00:00 */
3265 + header[4+8] = 0;
3266 + header[4+9] = 0;
3267 + header[4+10] = 0;
3268 + }
3269 + else if (wd->wlanMode == ZM_MODE_IBSS)
3270 + {
3271 + header[4+8] = wd->sta.bssid[0];
3272 + header[4+9] = wd->sta.bssid[1];
3273 + header[4+10] = wd->sta.bssid[2];
3274 + }
3275 + else if (wd->wlanMode == ZM_MODE_AP)
3276 + {
3277 + /* Address 3 = BSSID */
3278 + header[4+8] = wd->macAddr[0];
3279 + header[4+9] = wd->macAddr[1];
3280 + header[4+10] = wd->macAddr[2] + (vap<<8);
3281 + }
3282 +
3283 + /* Address 1 = DA */
3284 + header[4+2] = dst[0];
3285 + header[4+3] = dst[1];
3286 + header[4+4] = dst[2];
3287 +
3288 + /* Address 2 = SA */
3289 + header[4+5] = wd->macAddr[0];
3290 + header[4+6] = wd->macAddr[1];
3291 + if (wd->wlanMode == ZM_MODE_AP)
3292 + {
3293 + header[4+7] = wd->macAddr[2] + (vap<<8);
3294 + }
3295 + else
3296 + {
3297 + header[4+7] = wd->macAddr[2];
3298 + }
3299 +
3300 + /* Sequence Control */
3301 + zmw_enter_critical_section(dev);
3302 + header[4+11] = ((wd->mmseq++)<<4);
3303 + zmw_leave_critical_section(dev);
3304 +
3305 +
3306 + return hlen;
3307 +}
3308 +
3309 +
3310 +u16_t zfAggProcessAction(zdev_t* dev, zbuf_t* buf)
3311 +{
3312 + u16_t category;
3313 +
3314 + //zmw_get_wlan_dev(dev);
3315 +
3316 + //zmw_declare_for_critical_section();
3317 +
3318 + category = zmw_rx_buf_readb(dev, buf, 24);
3319 +
3320 + switch (category)
3321 + {
3322 + case ZM_WLAN_BLOCK_ACK_ACTION_FRAME:
3323 + zfAggBlockAckActionFrame(dev, buf);
3324 + break;
3325 +
3326 + }
3327 +
3328 + return ZM_SUCCESS;
3329 +}
3330 +
3331 +
3332 +u16_t zfAggBlockAckActionFrame(zdev_t* dev, zbuf_t* buf)
3333 +{
3334 + u8_t action;
3335 +
3336 + //zmw_get_wlan_dev(dev);
3337 +
3338 + //zmw_declare_for_critical_section();
3339 +
3340 + action = zmw_rx_buf_readb(dev, buf, 25);
3341 +#ifdef ZM_ENABLE_AGGREGATION
3342 + switch (action)
3343 + {
3344 + case ZM_WLAN_ADDBA_REQUEST_FRAME:
3345 + zm_msg0_agg(ZM_LV_0, "Received BA Action frame is ADDBA request");
3346 + zfAggRecvAddbaRequest(dev, buf);
3347 + break;
3348 + case ZM_WLAN_ADDBA_RESPONSE_FRAME:
3349 + zm_msg0_agg(ZM_LV_0, "Received BA Action frame is ADDBA response");
3350 + zfAggRecvAddbaResponse(dev, buf);
3351 + break;
3352 + case ZM_WLAN_DELBA_FRAME:
3353 + zfAggRecvDelba(dev, buf);
3354 + break;
3355 + }
3356 +#endif
3357 + return ZM_SUCCESS;
3358 +}
3359 +
3360 +u16_t zfAggRecvAddbaRequest(zdev_t* dev, zbuf_t* buf)
3361 +{
3362 + //u16_t dialog;
3363 + struct aggBaFrameParameter bf;
3364 + u16_t i;
3365 + //zmw_get_wlan_dev(dev);
3366 +
3367 + //zmw_declare_for_critical_section();
3368 +
3369 + bf.buf = buf;
3370 + bf.dialog = zmw_rx_buf_readb(dev, buf, 26);
3371 + /*
3372 + * ba parameter set
3373 + */
3374 + bf.ba_parameter = zmw_rx_buf_readh(dev, buf, 27);
3375 + bf.ba_policy = (bf.ba_parameter >> 1) & 1;
3376 + bf.tid = (bf.ba_parameter >> 2) & 0xF;
3377 + bf.buffer_size = (bf.ba_parameter >> 6);
3378 + /*
3379 + * BA timeout value
3380 + */
3381 + bf.ba_timeout = zmw_rx_buf_readh(dev, buf, 29);
3382 + /*
3383 + * BA starting sequence number
3384 + */
3385 + bf.ba_start_seq = zmw_rx_buf_readh(dev, buf, 31) >> 4;
3386 +
3387 + i=26;
3388 + while(i < 32) {
3389 + zm_debug_msg2("Recv ADDBA Req:", zmw_rx_buf_readb(dev,buf,i));
3390 + i++;
3391 + }
3392 +
3393 + zfAggSendAddbaResponse(dev, &bf);
3394 +
3395 + zfAggAddbaSetTidRx(dev, buf, &bf);
3396 +
3397 + return ZM_SUCCESS;
3398 +}
3399 +
3400 +u16_t zfAggAddbaSetTidRx(zdev_t* dev, zbuf_t* buf, struct aggBaFrameParameter *bf)
3401 +{
3402 + u16_t i, ac, aid, fragOff;
3403 + u16_t src[3];
3404 + u16_t offset = 0;
3405 + u8_t up;
3406 + struct agg_tid_rx *tid_rx = NULL;
3407 +
3408 + zmw_get_wlan_dev(dev);
3409 +
3410 + zmw_declare_for_critical_section();
3411 +
3412 + src[0] = zmw_rx_buf_readh(dev, buf, offset+10);
3413 + src[1] = zmw_rx_buf_readh(dev, buf, offset+12);
3414 + src[2] = zmw_rx_buf_readh(dev, buf, offset+14);
3415 + aid = zfApFindSta(dev, src);
3416 +
3417 + zfTxGetIpTosAndFrag(dev, buf, &up, &fragOff);
3418 + ac = zcUpToAc[up&0x7] & 0x3;
3419 +
3420 + ac = bf->tid;
3421 +
3422 + for (i=0; i<ZM_AGG_POOL_SIZE ; i++)
3423 + {
3424 + if((wd->tid_rx[i]->aid == aid) && (wd->tid_rx[i]->ac == ac))
3425 + {
3426 + tid_rx = wd->tid_rx[i];
3427 + break;
3428 + }
3429 + }
3430 +
3431 + if (!tid_rx)
3432 + {
3433 + for (i=0; i<ZM_AGG_POOL_SIZE; i++)
3434 + {
3435 + if (wd->tid_rx[i]->aid == ZM_MAX_STA_SUPPORT)
3436 + {
3437 + tid_rx = wd->tid_rx[i];
3438 + break;
3439 + }
3440 + }
3441 + if (!tid_rx)
3442 + return 0;
3443 + }
3444 +
3445 + zmw_enter_critical_section(dev);
3446 +
3447 + tid_rx->aid = aid;
3448 + tid_rx->ac = ac;
3449 + tid_rx->addBaExchangeStatusCode = ZM_AGG_ADDBA_RESPONSE;
3450 + tid_rx->seq_start = bf->ba_start_seq;
3451 + tid_rx->baw_head = tid_rx->baw_tail = 0;
3452 + tid_rx->sq_exceed_count = tid_rx->sq_behind_count = 0;
3453 + zmw_leave_critical_section(dev);
3454 +
3455 + return 0;
3456 +}
3457 +
3458 +u16_t zfAggRecvAddbaResponse(zdev_t* dev, zbuf_t* buf)
3459 +{
3460 + u16_t i,ac, aid=0;
3461 + u16_t src[3];
3462 + struct aggBaFrameParameter bf;
3463 +
3464 + zmw_get_wlan_dev(dev);
3465 +
3466 + //zmw_declare_for_critical_section();
3467 +
3468 + src[0] = zmw_rx_buf_readh(dev, buf, 10);
3469 + src[1] = zmw_rx_buf_readh(dev, buf, 12);
3470 + src[2] = zmw_rx_buf_readh(dev, buf, 14);
3471 +
3472 + if (wd->wlanMode == ZM_MODE_AP)
3473 + aid = zfApFindSta(dev, src);
3474 +
3475 +
3476 + bf.buf = buf;
3477 + bf.dialog = zmw_rx_buf_readb(dev, buf, 26);
3478 + bf.status_code = zmw_rx_buf_readh(dev, buf, 27);
3479 + if (!bf.status_code)
3480 + {
3481 + wd->addbaComplete=1;
3482 + }
3483 +
3484 + /*
3485 + * ba parameter set
3486 + */
3487 + bf.ba_parameter = zmw_rx_buf_readh(dev, buf, 29);
3488 + bf.ba_policy = (bf.ba_parameter >> 1) & 1;
3489 + bf.tid = (bf.ba_parameter >> 2) & 0xF;
3490 + bf.buffer_size = (bf.ba_parameter >> 6);
3491 + /*
3492 + * BA timeout value
3493 + */
3494 + bf.ba_timeout = zmw_rx_buf_readh(dev, buf, 31);
3495 +
3496 + i=26;
3497 + while(i < 32) {
3498 + zm_debug_msg2("Recv ADDBA Rsp:", zmw_rx_buf_readb(dev,buf,i));
3499 + i++;
3500 + }
3501 +
3502 + ac = zcUpToAc[bf.tid&0x7] & 0x3;
3503 +
3504 + //zmw_enter_critical_section(dev);
3505 +
3506 + //wd->aggSta[aid].aggFlag[ac] = 0;
3507 +
3508 + //zmw_leave_critical_section(dev);
3509 +
3510 + return ZM_SUCCESS;
3511 +}
3512 +
3513 +u16_t zfAggRecvDelba(zdev_t* dev, zbuf_t* buf)
3514 +{
3515 + //zmw_get_wlan_dev(dev);
3516 +
3517 + //zmw_declare_for_critical_section();
3518 + return ZM_SUCCESS;
3519 +}
3520 +
3521 +u16_t zfAggSendAddbaResponse(zdev_t* dev, struct aggBaFrameParameter *bf)
3522 +{
3523 + zbuf_t* buf;
3524 + //u16_t addrTblSize;
3525 + //struct zsAddrTbl addrTbl;
3526 + //u16_t err;
3527 + u16_t offset = 0;
3528 + u16_t hlen = 32;
3529 + u16_t header[(24+25+1)/2];
3530 + u16_t vap = 0;
3531 + u16_t i;
3532 + u8_t encrypt = 0;
3533 + u16_t dst[3];
3534 +
3535 + //zmw_get_wlan_dev(dev);
3536 +
3537 + //zmw_declare_for_critical_section();
3538 +
3539 +
3540 + /*
3541 + * TBD : Maximum size of managment frame
3542 + */
3543 + if ((buf = zfwBufAllocate(dev, 1024)) == NULL)
3544 + {
3545 + zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!");
3546 + return ZM_SUCCESS;
3547 + }
3548 +
3549 + /*
3550 + * Reserve room for wlan header
3551 + */
3552 + offset = hlen;
3553 +
3554 + /*
3555 + * add addba frame body
3556 + */
3557 + offset = zfAggSetAddbaResponseFrameBody(dev, buf, bf, offset);
3558 +
3559 +
3560 + zfwBufSetSize(dev, buf, offset);
3561 +
3562 + /*
3563 + * Copy wlan header
3564 + */
3565 +
3566 + dst[0] = zmw_rx_buf_readh(dev, bf->buf, 10);
3567 + dst[1] = zmw_rx_buf_readh(dev, bf->buf, 12);
3568 + dst[2] = zmw_rx_buf_readh(dev, bf->buf, 14);
3569 + zfAggGenAddbaHeader(dev, dst, header, offset-hlen, buf, vap, encrypt);
3570 + for (i=0; i<(hlen>>1); i++)
3571 + {
3572 + zmw_tx_buf_writeh(dev, buf, i*2, header[i]);
3573 + }
3574 +
3575 + /* Get buffer DMA address */
3576 + //if ((addrTblSize = zfwBufMapDma(dev, buf, &addrTbl)) == 0)
3577 + //if ((addrTblSize = zfwMapTxDma(dev, buf, &addrTbl)) == 0)
3578 + //{
3579 + // goto zlError;
3580 + //}
3581 +
3582 + //zm_msg2_mm(ZM_LV_2, "offset=", offset);
3583 + //zm_msg2_mm(ZM_LV_2, "hlen=", hlen);
3584 + //zm_msg2_mm(ZM_LV_2, "addrTblSize=", addrTblSize);
3585 + //zm_msg2_mm(ZM_LV_2, "addrTbl.len[0]=", addrTbl.len[0]);
3586 + //zm_msg2_mm(ZM_LV_2, "addrTbl.physAddrl[0]=", addrTbl.physAddrl[0]);
3587 + //zm_msg2_mm(ZM_LV_2, "buf->data=", buf->data);
3588 +
3589 + #if 0
3590 + if ((err = zfHpSend(dev, NULL, 0, NULL, 0, NULL, 0, buf, 0,
3591 + ZM_INTERNAL_ALLOC_BUF, 0, 0xff)) != ZM_SUCCESS)
3592 + {
3593 + goto zlError;
3594 + }
3595 + #else
3596 + zfPutVmmq(dev, buf);
3597 + zfPushVtxq(dev);
3598 + #endif
3599 +
3600 + //zfAggSendAddbaRequest(dev, dst, zcUpToAc[bf->tid&0x7] & 0x3, bf->tid);
3601 + return ZM_SUCCESS;
3602 +
3603 +}
3604 +
3605 +u16_t zfAggSetAddbaResponseFrameBody(zdev_t* dev, zbuf_t* buf,
3606 + struct aggBaFrameParameter *bf, u16_t offset)
3607 +{
3608 +
3609 + //zmw_get_wlan_dev(dev);
3610 +
3611 + //zmw_declare_for_critical_section();
3612 + /*
3613 + * ADDBA Request frame body
3614 + */
3615 +
3616 + /*
3617 + * Category
3618 + */
3619 + zmw_tx_buf_writeb(dev, buf, offset++, 3);
3620 + /*
3621 + * Action details = 0
3622 + */
3623 + zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_ADDBA_RESPONSE_FRAME);
3624 + /*
3625 + * Dialog Token = nonzero
3626 + */
3627 + zmw_tx_buf_writeb(dev, buf, offset++, bf->dialog);
3628 + /*
3629 + * Status code
3630 + */
3631 + zmw_tx_buf_writeh(dev, buf, offset, 0);
3632 + offset+=2;
3633 + /*
3634 + * Block Ack parameter set
3635 + * BA policy = 1 for immediate BA, 0 for delayed BA
3636 + * TID(4bits) & buffer size(4bits) (TID=0x1 & buffer size=0x80)
3637 + * TBD: how to get TID number and buffer size?
3638 + * ¢z¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢{
3639 + * ¢x B0 ¢x B1 ¢x B2 B5 ¢x B6 B15 ¢x
3640 + * ¢u¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢t
3641 + * ¢x Reserved ¢x BA policy ¢x TID ¢x Buffer size ¢x
3642 + * ¢|¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢}
3643 + */
3644 + zmw_tx_buf_writeh(dev, buf, offset, bf->ba_parameter);
3645 + offset+=2;
3646 + /*
3647 + * BA timeout value
3648 + */
3649 + zmw_tx_buf_writeh(dev, buf, offset, bf->ba_timeout);
3650 + offset+=2;
3651 +
3652 + return offset;
3653 +}
3654 +
3655 +void zfAggInvokeBar(zdev_t* dev, TID_TX tid_tx)
3656 +{
3657 + struct aggBarControl aggBarControl;
3658 + //zmw_get_wlan_dev(dev);
3659 +
3660 + //zmw_declare_for_critical_section();
3661 + //bar_control = aggBarControl->tid_info << 12 | aggBarControl->compressed_bitmap << 2
3662 + // | aggBarControl->multi_tid << 1 | aggBarControl->bar_ack_policy;
3663 + aggBarControl.bar_ack_policy = 0;
3664 + aggBarControl.multi_tid = 0;
3665 + aggBarControl.compressed_bitmap = 0;
3666 + aggBarControl.tid_info = tid_tx->tid;
3667 + zfAggSendBar(dev, tid_tx, &aggBarControl);
3668 +
3669 + return;
3670 +
3671 +}
3672 +/*
3673 + * zfAggSendBar() refers zfAggSendAddbaRequest()
3674 + */
3675 +u16_t zfAggSendBar(zdev_t* dev, TID_TX tid_tx, struct aggBarControl *aggBarControl)
3676 +{
3677 + zbuf_t* buf;
3678 + //u16_t addrTblSize;
3679 + //struct zsAddrTbl addrTbl;
3680 + //u16_t err;
3681 + u16_t offset = 0;
3682 + u16_t hlen = 16+8; /* mac header + control headers*/
3683 + u16_t header[(8+24+1)/2];
3684 + u16_t vap = 0;
3685 + u16_t i;
3686 + u8_t encrypt = 0;
3687 +
3688 + //zmw_get_wlan_dev(dev);
3689 +
3690 + //zmw_declare_for_critical_section();
3691 +
3692 +
3693 + /*
3694 + * TBD : Maximum size of managment frame
3695 + */
3696 + if ((buf = zfwBufAllocate(dev, 1024)) == NULL)
3697 + {
3698 + zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!");
3699 + return ZM_SUCCESS;
3700 + }
3701 +
3702 + /*
3703 + * Reserve room for wlan header
3704 + */
3705 + offset = hlen;
3706 +
3707 + /*
3708 + * add addba frame body
3709 + */
3710 + offset = zfAggSetBarBody(dev, buf, offset, tid_tx, aggBarControl);
3711 +
3712 +
3713 + zfwBufSetSize(dev, buf, offset);
3714 +
3715 + /*
3716 + * Copy wlan header
3717 + */
3718 + zfAggGenBarHeader(dev, tid_tx->dst, header, offset-hlen, buf, vap, encrypt);
3719 + for (i=0; i<(hlen>>1); i++)
3720 + {
3721 + zmw_tx_buf_writeh(dev, buf, i*2, header[i]);
3722 + }
3723 +
3724 + /* Get buffer DMA address */
3725 + //if ((addrTblSize = zfwBufMapDma(dev, buf, &addrTbl)) == 0)
3726 + //if ((addrTblSize = zfwMapTxDma(dev, buf, &addrTbl)) == 0)
3727 + //{
3728 + // goto zlError;
3729 + //}
3730 +
3731 + //zm_msg2_mm(ZM_LV_2, "offset=", offset);
3732 + //zm_msg2_mm(ZM_LV_2, "hlen=", hlen);
3733 + //zm_msg2_mm(ZM_LV_2, "addrTblSize=", addrTblSize);
3734 + //zm_msg2_mm(ZM_LV_2, "addrTbl.len[0]=", addrTbl.len[0]);
3735 + //zm_msg2_mm(ZM_LV_2, "addrTbl.physAddrl[0]=", addrTbl.physAddrl[0]);
3736 + //zm_msg2_mm(ZM_LV_2, "buf->data=", buf->data);
3737 +
3738 + #if 0
3739 + if ((err = zfHpSend(dev, NULL, 0, NULL, 0, NULL, 0, buf, 0,
3740 + ZM_INTERNAL_ALLOC_BUF, 0, 0xff)) != ZM_SUCCESS)
3741 + {
3742 + goto zlError;
3743 + }
3744 + #else
3745 + zfPutVmmq(dev, buf);
3746 + zfPushVtxq(dev);
3747 + #endif
3748 +
3749 + return ZM_SUCCESS;
3750 +
3751 +}
3752 +
3753 +u16_t zfAggSetBarBody(zdev_t* dev, zbuf_t* buf, u16_t offset, TID_TX tid_tx, struct aggBarControl *aggBarControl)
3754 +{
3755 + u16_t bar_control, start_seq;
3756 +
3757 + //zmw_get_wlan_dev(dev);
3758 +
3759 + //zmw_declare_for_critical_section();
3760 + /*
3761 + * BAR Control frame body
3762 + */
3763 +
3764 + /*
3765 + * BAR Control Field
3766 + * ¢z¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢{
3767 + * ¢x B0 ¢x B1 ¢x B2 ¢x B3 B11 ¢x B12 B15 ¢x
3768 + * ¢u¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢t
3769 + * ¢x BAR Ack ¢x Multi-TID ¢x Compressed ¢x Reserved ¢x TID_INFO ¢x
3770 + * ¢x Policy ¢x ¢x Bitmap ¢x ¢x ¢x
3771 + * ¢|¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢}
3772 + */
3773 + bar_control = aggBarControl->tid_info << 12 | aggBarControl->compressed_bitmap << 2
3774 + | aggBarControl->multi_tid << 1 | aggBarControl->bar_ack_policy;
3775 +
3776 + zmw_tx_buf_writeh(dev, buf, offset, bar_control);
3777 + offset+=2;
3778 + if (0 == aggBarControl->multi_tid) {
3779 + /*
3780 + * BA starting sequence number
3781 + * ¢z¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢{
3782 + * ¢x B0 B3 ¢x B4 B15 ¢x
3783 + * ¢u¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢t
3784 + * ¢x Frag num(0) ¢x BA starting seq num ¢x
3785 + * ¢|¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢}
3786 + */
3787 + start_seq = (tid_tx->bar_ssn << 4) & 0xFFF0;
3788 + zmw_tx_buf_writeh(dev, buf, offset, start_seq);
3789 + offset+=2;
3790 + }
3791 + if (1 == aggBarControl->multi_tid && 1 == aggBarControl->compressed_bitmap) {
3792 + /* multi-tid BlockAckReq variant, not implemented*/
3793 + }
3794 +
3795 + return offset;
3796 +}
3797 +
3798 +u16_t zfAggGenBarHeader(zdev_t* dev, u16_t* dst,
3799 + u16_t* header, u16_t len, zbuf_t* buf, u16_t vap, u8_t encrypt)
3800 +{
3801 + u8_t hlen = 16+8; // MAC ctrl + PHY ctrl + 802.11 MM header
3802 + //u8_t frameType = ZM_WLAN_FRAME_TYPE_ACTION;
3803 +
3804 + zmw_get_wlan_dev(dev);
3805 +
3806 + zmw_declare_for_critical_section();
3807 +
3808 + /*
3809 + * Generate control setting
3810 + */
3811 + //bodyLen = zfwBufGetSize(dev, buf);
3812 + header[0] = 16+len+4; //Length
3813 + header[1] = 0x8; //MAC control, backoff + (ack)
3814 +
3815 +#if 1
3816 + /* CCK 1M */
3817 + header[2] = 0x0f00; //PHY control L
3818 + header[3] = 0x0000; //PHY control H
3819 +#else
3820 + /* CCK 6M */
3821 + header[2] = 0x0f01; //PHY control L
3822 + header[3] = 0x000B; //PHY control H
3823 +
3824 +#endif
3825 + /*
3826 + * Generate WLAN header
3827 + * Frame control frame type and subtype
3828 + */
3829 + header[4+0] = ZM_WLAN_FRAME_TYPE_BAR;
3830 + /*
3831 + * Duration
3832 + */
3833 + header[4+1] = 0;
3834 +
3835 + /* Address 1 = DA */
3836 + header[4+2] = dst[0];
3837 + header[4+3] = dst[1];
3838 + header[4+4] = dst[2];
3839 +
3840 + /* Address 2 = SA */
3841 + header[4+5] = wd->macAddr[0];
3842 + header[4+6] = wd->macAddr[1];
3843 + if (wd->wlanMode == ZM_MODE_AP)
3844 + {
3845 +#ifdef ZM_VAPMODE_MULTILE_SSID
3846 + header[4+7] = wd->macAddr[2]; //Multiple SSID
3847 +#else
3848 + header[4+7] = wd->macAddr[2] + (vap<<8); //VAP
3849 +#endif
3850 + }
3851 + else
3852 + {
3853 + header[4+7] = wd->macAddr[2];
3854 + }
3855 +
3856 + /* Sequence Control */
3857 + zmw_enter_critical_section(dev);
3858 + header[4+11] = ((wd->mmseq++)<<4);
3859 + zmw_leave_critical_section(dev);
3860 +
3861 +
3862 + return hlen;
3863 +}
3864 --- /dev/null
3865 +++ b/drivers/staging/otus/80211core/cagg.h
3866 @@ -0,0 +1,435 @@
3867 +/*
3868 + * Copyright (c) 2007-2008 Atheros Communications Inc.
3869 + *
3870 + * Permission to use, copy, modify, and/or distribute this software for any
3871 + * purpose with or without fee is hereby granted, provided that the above
3872 + * copyright notice and this permission notice appear in all copies.
3873 + *
3874 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3875 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3876 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3877 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3878 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3879 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3880 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3881 + */
3882 +/* */
3883 +/* Module Name : cagg.h */
3884 +/* */
3885 +/* Abstract */
3886 +/* This module contains A-MPDU aggregation relatived functions. */
3887 +/* */
3888 +/* NOTES */
3889 +/* None */
3890 +/* */
3891 +/****************************************************************************/
3892 +/*Revision History: */
3893 +/* Who When What */
3894 +/* -------- -------- ----------------------------------------------*/
3895 +/* */
3896 +/* Honda 12-4-06 created */
3897 +/* */
3898 +/****************************************************************************/
3899 +
3900 +#ifndef _CAGG_H
3901 +#define _CAGG_H
3902 +
3903 +
3904 +/*
3905 + * the aggregation functions flag, 0 if don't do aggregate
3906 + */
3907 +
3908 +#define ZM_AGG_FPGA_DEBUG 1
3909 +#define ZM_AGG_FPGA_REORDERING 1
3910 +
3911 +#ifndef ZM_AGG_TALLY
3912 +//#define ZM_AGG_TALLY
3913 +#endif
3914 +/*
3915 + * Aggregate control
3916 + */
3917 +
3918 +
3919 +#define ZM_AGG_POOL_SIZE 20
3920 +#define ZM_BAW_POOL_SIZE 32
3921 +#define ZM_AGGQ_SIZE 64
3922 +#define ZM_AGGQ_SIZE_MASK (ZM_AGGQ_SIZE-1)
3923 +#define ZM_AGG_LOW_THRESHOLD 1
3924 +#define ZM_AGG_HIGH_THRESHOLD 5
3925 +
3926 +/*
3927 + * number of access categories (ac)
3928 + */
3929 +#define ZM_AC 4
3930 +/*
3931 + * the timer to clear aggregation queue, unit: 1 tick
3932 + * if the packet is too old (current time - arrival time)
3933 + * the packet and the aggregate queue will be cleared
3934 + */
3935 +#define ZM_AGG_CLEAR_TIME 10
3936 +/*
3937 + * delete the queue if idle for ZM_DELETE_TIME
3938 + * unit: 10ms
3939 + */
3940 +#define ZM_AGG_DELETE_TIME 10000
3941 +
3942 +/*
3943 + * block ack window size
3944 + */
3945 +#define ZM_AGG_BAW_SIZE 64
3946 +#define ZM_AGG_BAW_MASK (ZM_AGG_BAW_SIZE-1)
3947 +/*
3948 + * originator ADDBA Resquest receiver
3949 + * |----------------------------->|
3950 + * 1| ACK |1
3951 + * |<-----------------------------|
3952 + * 2| ADDBA Response |2
3953 + * |<-----------------------------|
3954 + * 3| ACK |3
3955 + * |----------------------------->|
3956 + * 4 4
3957 + */
3958 +#define ZM_AGG_ADDBA_REQUEST 1
3959 +#define ZM_AGG_ADDBA_REQUEST_ACK 2
3960 +#define ZM_AGG_ADDBA_RESPONSE 3
3961 +#define ZM_AGG_ADDBA_RESPONSE_ACK 4
3962 +
3963 +#define ZM_AGG_SINGLE_MPDU 00
3964 +#define ZM_AGG_FIRST_MPDU 01
3965 +#define ZM_AGG_MIDDLE_MPDU 11
3966 +#define ZM_AGG_LAST_MPDU 10
3967 +/*
3968 + * end of Aggregate control
3969 + */
3970 +
3971 +#define TID_TX struct aggQueue*
3972 +#define TID_BAW struct baw_q*
3973 +#define BAW wd->baw_enabler
3974 +#define DESTQ wd->destQ
3975 +
3976 +/*
3977 + * Queue access
3978 + */
3979 +#define zm_agg_qlen(dev, head, tail) ((head - tail) & ZM_AGGQ_SIZE_MASK)
3980 +#define zm_agg_inQ(tid_tx, pt) ((((pt - tid_tx->aggTail) & ZM_AGGQ_SIZE_MASK) < \
3981 + ((tid_tx->aggHead - tid_tx->aggTail) & ZM_AGGQ_SIZE_MASK))? TRUE:FALSE)
3982 +#define zm_agg_plus(pt) pt = (pt + 1) & ZM_AGGQ_SIZE_MASK
3983 +#define zm_agg_min(A, B) ((A>B)? B:A)
3984 +#define zm_agg_GetTime() wd->tick
3985 +#define TXQL (zfHpGetMaxTxdCount(dev) - zfHpGetFreeTxdCount(dev))
3986 +
3987 +/* don't change AGG_MIN_TXQL easily, this might cause BAW BSOD */
3988 +#define AGG_MIN_TXQL 2
3989 +/*
3990 + * consider tcp,udp,ac(1234)
3991 + */
3992 +#define zm_agg_dynamic_threshold(dev, ar) ((ar > 16)? 11: \
3993 + (ar > 12)? 8: \
3994 + (ar > 8)? 5: \
3995 + (ar > 4)? 2:1)
3996 +#define zm_agg_weight(ac) ((3 == ac)? 4: \
3997 + (2 == ac)? 3: \
3998 + (0 == ac)? 2:1)
3999 +/*
4000 + * the required free queue ratio per ac
4001 + */
4002 +
4003 +#define zm_agg_ratio(ac) ((3 == ac)? 3: \
4004 + (2 == ac)? (zfHpGetMaxTxdCount(dev)*1/4): \
4005 + (0 == ac)? (zfHpGetMaxTxdCount(dev)*2/4): \
4006 + (zfHpGetMaxTxdCount(dev)*3/4))
4007 +
4008 +//#define zm_agg_ratio(ac) 3
4009 +/*
4010 + * end of Queue access
4011 + */
4012 +
4013 +#define ZM_AGGMSG_LEV ZM_LV_3
4014 +#define zm_msg0_agg(lv, msg) if (ZM_AGGMSG_LEV >= lv) \
4015 + {zm_debug_msg0(msg);}
4016 +#define zm_msg1_agg(lv, msg, val) if (ZM_AGGMSG_LEV >= lv) \
4017 + {zm_debug_msg1(msg, val);}
4018 +#define zm_msg2_agg(lv, msg, val) if (ZM_AGGMSG_LEV >= lv) \
4019 + {zm_debug_msg2(msg, val);}
4020 +
4021 +#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
4022 +struct baw_header_r {
4023 + u16_t *header;
4024 + u16_t *mic;
4025 + u16_t *snap;
4026 + u16_t headerLen;
4027 + u16_t micLen;
4028 + u16_t snapLen;
4029 + u16_t removeLen;
4030 + u8_t keyIdx;
4031 +};
4032 +
4033 +struct baw_header {
4034 + u16_t header[29];//[(8+30+2+18)/2]; 58 bytes /* ctr+(4+a1+a2+a3+2+a4)+qos+iv */
4035 + u16_t headerLen;
4036 + u16_t mic[4]; //[8/2]; 8 bytes
4037 + u16_t micLen;
4038 + u16_t snap[4]; //[8/2]; 8 bytes
4039 + u16_t snapLen;
4040 + u16_t removeLen;
4041 + u8_t keyIdx;
4042 +};
4043 +
4044 +struct bufInfo {
4045 + zbuf_t* buf;
4046 + u8_t baw_retransmit;
4047 + u32_t timestamp;
4048 + struct baw_header *baw_header;
4049 +};
4050 +#endif
4051 +struct aggElement
4052 +{
4053 + zbuf_t* buf;
4054 + u32_t arrivalTime;
4055 + u8_t baw_retransmit;
4056 + struct zsAdditionInfo addInfo;
4057 + //struct baw_header baw_header;
4058 +};
4059 +
4060 +
4061 +#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
4062 +struct baw_buf
4063 +{
4064 + zbuf_t* buf;
4065 + u16_t baw_seq;
4066 + u32_t timestamp;
4067 + u8_t baw_retransmit;
4068 + struct baw_header baw_header;
4069 +};
4070 +
4071 +struct baw_q {
4072 + struct baw_buf frame[ZM_VTXQ_SIZE];
4073 + u16_t enabled;
4074 + u16_t start_seq;
4075 + u16_t head;
4076 + u16_t tail;
4077 + u16_t size;
4078 + TID_TX tid_tx;
4079 +
4080 + //struct baw_header *baw_header;
4081 +};
4082 +
4083 +struct baw_enabler
4084 +{
4085 + struct baw_q tid_baw[ZM_BAW_POOL_SIZE];
4086 + u8_t delPoint;
4087 + void (*core)(zdev_t* dev, u16_t baw_seq, u32_t bitmap, u16_t aggLen);
4088 + //void (*core);
4089 + void (*init)(zdev_t* dev);
4090 + TID_BAW (*getNewQ)(zdev_t* dev, u16_t start_seq, TID_TX tid_tx);
4091 + TID_BAW (*getQ)(zdev_t* dev, u16_t baw_seq);
4092 + u16_t (*insert)(zdev_t* dev, zbuf_t* buf, u16_t baw_seq, TID_BAW tid_baw, u8_t baw_retransmit, struct baw_header_r *header_r);
4093 + struct bufInfo* (*pop)(zdev_t* dev, u16_t index, TID_BAW tid_baw);
4094 + void (*enable)(zdev_t* dev, TID_BAW tid_baw, u16_t start_seq);
4095 + void (*disable)(zdev_t* dev, TID_BAW tid_baw);
4096 +
4097 +};
4098 +#endif
4099 +struct aggQueue
4100 +{
4101 + struct aggElement aggvtxq[ZM_AGGQ_SIZE];
4102 + u16_t aggHead;
4103 + u16_t aggTail;
4104 + s16_t size;
4105 + u16_t aggQSTA;
4106 + u16_t aggQEnabled;
4107 + u16_t ac;
4108 + u16_t tid;
4109 + u16_t aggReady;
4110 + u16_t clearFlag;
4111 + u16_t deleteFlag;
4112 + u32_t lastArrival;
4113 + u16_t aggFrameSize;
4114 + u16_t bar_ssn; /* starting sequence number in BAR */
4115 + u16_t dst[3];
4116 + u16_t complete; /* complete indication pointer */
4117 +};
4118 +
4119 +struct aggSta
4120 +{
4121 + u16_t count[ZM_AC];
4122 + TID_TX tid_tx[8];
4123 + u16_t aggFlag[ZM_AC];
4124 +};
4125 +
4126 +struct agg_tid_rx
4127 +{
4128 + u16_t aid;
4129 + u16_t ac;
4130 + u16_t addBaExchangeStatusCode;
4131 + //struct zsAdditionInfo *addInfo;
4132 + u16_t seq_start; /* first seq expected next */
4133 + u16_t baw_head; /* head of valid block ack window */
4134 + u16_t baw_tail; /* tail of valid block ack window */
4135 + //u16_t free_count; /* block ack window size */
4136 + u8_t sq_exceed_count;
4137 + u8_t sq_behind_count;
4138 + struct aggElement frame[ZM_AGG_BAW_SIZE + 1]; /* out-of-order rx frames */
4139 +};
4140 +
4141 +struct aggControl
4142 +{
4143 + u16_t aggEnabled;
4144 + u16_t ampduIndication;
4145 + u16_t addbaIndication;
4146 + //TID_BAW tid_baw;
4147 + u32_t timestamp;
4148 +};
4149 +
4150 +struct aggBaFrameParameter
4151 +{
4152 + zbuf_t* buf;
4153 + u16_t ba_parameter;
4154 + u8_t dialog;
4155 + u16_t ba_policy;
4156 + u16_t tid;
4157 + u16_t buffer_size;
4158 + u16_t ba_timeout;
4159 + u16_t ba_start_seq;
4160 + u16_t status_code;
4161 +};
4162 +
4163 +struct aggBarControl
4164 +{
4165 + u16_t bar_ack_policy ;
4166 + u16_t multi_tid ;
4167 + u16_t compressed_bitmap ;
4168 + u16_t tid_info ;
4169 +};
4170 +
4171 +struct aggTally
4172 +{
4173 + u32_t got_packets_sum;
4174 + u32_t got_bytes_sum;
4175 + u32_t sent_packets_sum;
4176 + u32_t sent_bytes_sum;
4177 + u32_t avg_got_packets;
4178 + u32_t avg_got_bytes;
4179 + u32_t avg_sent_packets;
4180 + u32_t avg_sent_bytes;
4181 + u16_t time;
4182 +};
4183 +
4184 +
4185 +struct destQ {
4186 + struct dest{
4187 + u16_t Qtype : 1; /* 0 aggr, 1 vtxq */
4188 + TID_TX tid_tx;
4189 + void* vtxq;
4190 +
4191 + struct dest* next;
4192 + } *dest[4];
4193 + struct dest* Head[4];
4194 + //s16_t size[4];
4195 + u16_t ppri;
4196 + void (*insert)(zdev_t* dev, u16_t Qtype, u16_t ac, TID_TX tid_tx, void* vtxq);
4197 + void (*delete)(zdev_t* dev, u16_t Qtype, TID_TX tid_tx, void* vtxq);
4198 + void (*init)(zdev_t* dev);
4199 + struct dest* (*getNext)(zdev_t* dev, u16_t ac);
4200 + u16_t (*exist)(zdev_t* dev, u16_t Qtype, u16_t ac, TID_TX tid_tx, void* vtxq);
4201 + //void (*scan)(zdev_t* dev);
4202 +};
4203 +/*
4204 + * aggregation tx
4205 + */
4206 +void zfAggInit(zdev_t* dev);
4207 +u16_t zfApFindSta(zdev_t* dev, u16_t* addr);
4208 +u16_t zfAggGetSta(zdev_t* dev, zbuf_t* buf);
4209 +TID_TX zfAggTxGetQueue(zdev_t* dev, u16_t aid, u16_t tid);
4210 +TID_TX zfAggTxNewQueue(zdev_t* dev, u16_t aid, u16_t tid, zbuf_t* buf);
4211 +u16_t zfAggTxEnqueue(zdev_t* dev, zbuf_t* buf, u16_t aid, TID_TX tid_tx);
4212 +u16_t zfAggTx(zdev_t* dev, zbuf_t* buf, u16_t tid);
4213 +u16_t zfAggTxReadyCount(zdev_t* dev, u16_t ac);
4214 +u16_t zfAggTxPartial(zdev_t* dev, u16_t ac, u16_t readycount);
4215 +u16_t zfAggTxSend(zdev_t* dev, u32_t freeTxd, TID_TX tid_tx);
4216 +TID_TX zfAggTxGetReadyQueue(zdev_t* dev, u16_t ac);
4217 +zbuf_t* zfAggTxGetVtxq(zdev_t* dev, TID_TX tid_tx);
4218 +u16_t zfAggTxDeleteQueue(zdev_t* dev, u16_t qnum);
4219 +u16_t zfAggScanAndClear(zdev_t* dev, u32_t time);
4220 +u16_t zfAggClearQueue(zdev_t* dev);
4221 +void zfAggTxScheduler(zdev_t* dev, u8_t ScanAndClear);
4222 +
4223 +/* tid_tx manipulation */
4224 +#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
4225 +u16_t zfAggTidTxInsertHead(zdev_t* dev, struct bufInfo* buf_info, TID_TX tid_tx);
4226 +#endif
4227 +void zfAggDestInsert(zdev_t* dev, u16_t Qtype, u16_t ac, TID_TX tid_tx, void* vtxq);
4228 +void zfAggDestDelete(zdev_t* dev, u16_t Qtype, TID_TX tid_tx, void* vtxq);
4229 +void zfAggDestInit(zdev_t* dev);
4230 +struct dest* zfAggDestGetNext(zdev_t* dev, u16_t ac);
4231 +u16_t zfAggDestExist(zdev_t* dev, u16_t Qtype, u16_t ac, TID_TX tid_tx, void* vtxq);
4232 +/*
4233 + * aggregation rx
4234 + */
4235 +struct agg_tid_rx *zfAggRxEnabled(zdev_t* dev, zbuf_t* buf);
4236 +u16_t zfAggRx(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo *addInfo, struct agg_tid_rx *tid_rx);
4237 +struct agg_tid_rx *zfAggRxGetQueue(zdev_t* dev, zbuf_t* buf);
4238 +u16_t zfAggRxEnqueue(zdev_t* dev, zbuf_t* buf, struct agg_tid_rx *tid_rx, struct zsAdditionInfo *addInfo);
4239 +u16_t zfAggRxFlush(zdev_t* dev, u16_t seq_no, struct agg_tid_rx *tid_rx);
4240 +u16_t zfAggRxFreeBuf(zdev_t* dev, u16_t destroy);
4241 +u16_t zfAggRxClear(zdev_t* dev, u32_t time);
4242 +void zfAggRecvBAR(zdev_t* dev, zbuf_t* buf);
4243 +/*
4244 + * end of aggregation rx
4245 + */
4246 +
4247 +/*
4248 + * ADDBA
4249 + */
4250 +u16_t zfAggSendAddbaRequest(zdev_t* dev, u16_t *dst, u16_t ac, u16_t up);
4251 +u16_t zfAggSetAddbaFrameBody(zdev_t* dev,zbuf_t* buf, u16_t offset, u16_t ac, u16_t up);
4252 +u16_t zfAggGenAddbaHeader(zdev_t* dev, u16_t* dst,
4253 + u16_t* header, u16_t len, zbuf_t* buf, u16_t vap, u8_t encrypt);
4254 +u16_t zfAggProcessAction(zdev_t* dev, zbuf_t* buf);
4255 +u16_t zfAggBlockAckActionFrame(zdev_t* dev, zbuf_t* buf);
4256 +u16_t zfAggRecvAddbaRequest(zdev_t* dev, zbuf_t* buf);
4257 +u16_t zfAggRecvAddbaResponse(zdev_t* dev, zbuf_t* buf);
4258 +u16_t zfAggRecvDelba(zdev_t* dev, zbuf_t* buf);
4259 +u16_t zfAggSendAddbaResponse(zdev_t* dev, struct aggBaFrameParameter *bf);
4260 +u16_t zfAggSetAddbaResponseFrameBody(zdev_t* dev, zbuf_t* buf,
4261 + struct aggBaFrameParameter *bf, u16_t offset);
4262 +u16_t zfAggAddbaSetTidRx(zdev_t* dev, zbuf_t* buf,
4263 + struct aggBaFrameParameter *bf);
4264 +/*
4265 + * zfAggTxSendEth
4266 + */
4267 +u16_t zfAggTxSendEth(zdev_t* dev, zbuf_t* buf, u16_t port, u16_t bufType, u8_t flag, struct aggControl *aggControl, TID_TX tid_tx);
4268 +
4269 +/*
4270 + * statistics functions
4271 + */
4272 +u16_t zfAggTallyReset(zdev_t* dev);
4273 +
4274 +u16_t zfAggPrintTally(zdev_t* dev);
4275 +
4276 +/*
4277 + * BAR
4278 + */
4279 +void zfAggInvokeBar(zdev_t* dev, TID_TX tid_tx);
4280 +u16_t zfAggSendBar(zdev_t* dev, TID_TX tid_tx, struct aggBarControl *aggBarControl);
4281 +u16_t zfAggSetBarBody(zdev_t* dev, zbuf_t* buf, u16_t offset, TID_TX tid_tx, struct aggBarControl *aggBarControl);
4282 +u16_t zfAggGenBarHeader(zdev_t* dev, u16_t* dst,
4283 + u16_t* header, u16_t len, zbuf_t* buf, u16_t vap, u8_t encrypt);
4284 +
4285 +#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
4286 +/* BAW BA retransmission */
4287 +void zfBawCore(zdev_t* dev, u16_t baw_seq, u32_t bitmap, u16_t aggLen);
4288 +void zfBawInit(zdev_t* dev);
4289 +TID_BAW zfBawGetNewQ(zdev_t* dev, u16_t start_seq, TID_TX tid_tx);
4290 +u16_t zfBawInsert(zdev_t* dev, zbuf_t* buf, u16_t baw_seq, TID_BAW tid_baw, u8_t baw_retransmit, struct baw_header_r *header_r);
4291 +struct bufInfo* zfBawPop(zdev_t* dev, u16_t index, TID_BAW tid_baw);
4292 +void zfBawEnable(zdev_t* dev, TID_BAW tid_baw, u16_t start_seq);
4293 +void zfBawDisable(zdev_t* dev, TID_BAW tid_baw);
4294 +TID_BAW zfBawGetQ(zdev_t* dev, u16_t baw_seq);
4295 +void zfAggTxRetransmit(zdev_t* dev, struct bufInfo *buf_info, struct aggControl *aggControl, TID_TX tid_tx);
4296 +#endif
4297 +/* extern functions */
4298 +extern zbuf_t* zfGetVtxq(zdev_t* dev, u8_t ac);
4299 +
4300 +#endif /* #ifndef _CAGG_H */
4301 +
4302 --- /dev/null
4303 +++ b/drivers/staging/otus/80211core/ccmd.c
4304 @@ -0,0 +1,1861 @@
4305 +/*
4306 + * Copyright (c) 2007-2008 Atheros Communications Inc.
4307 + *
4308 + * Permission to use, copy, modify, and/or distribute this software for any
4309 + * purpose with or without fee is hereby granted, provided that the above
4310 + * copyright notice and this permission notice appear in all copies.
4311 + *
4312 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
4313 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
4314 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
4315 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
4316 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
4317 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
4318 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
4319 + */
4320 +/* */
4321 +/* Module Name : cmd.c */
4322 +/* */
4323 +/* Abstract */
4324 +/* This module contains command interface functions. */
4325 +/* */
4326 +/* NOTES */
4327 +/* None */
4328 +/* */
4329 +/************************************************************************/
4330 +#include "cprecomp.h"
4331 +#include "../hal/hpreg.h"
4332 +
4333 +
4334 +u16_t zfWlanReset(zdev_t* dev);
4335 +u32_t zfUpdateRxRate(zdev_t* dev);
4336 +
4337 +
4338 +extern void zfiUsbRecv(zdev_t *dev, zbuf_t *buf);
4339 +extern void zfiUsbRegIn(zdev_t* dev, u32_t* rsp, u16_t rspLen);
4340 +extern void zfiUsbOutComplete(zdev_t* dev, zbuf_t *buf, u8_t status, u8_t *hdr);
4341 +extern void zfiUsbRegOutComplete(zdev_t* dev);
4342 +extern u16_t zfHpReinit(zdev_t* dev, u32_t frequency);
4343 +
4344 +/* Get size (byte) of driver core global data structure. */
4345 +/* This size will be used by driver wrapper to allocate */
4346 +/* a memory space for driver core to store global variables */
4347 +u16_t zfiGlobalDataSize(zdev_t* dev)
4348 +{
4349 + u32_t ret;
4350 + ret = (sizeof(struct zsWlanDev));
4351 + zm_assert((ret>>16) == 0);
4352 + return (u16_t)ret;
4353 +}
4354 +
4355 +
4356 +/* Initialize WLAN hardware and software, resource will be allocated */
4357 +/* for WLAN operation, must be called first before other function. */
4358 +extern u16_t zfiWlanOpen(zdev_t* dev, struct zsCbFuncTbl* cbFuncTbl)
4359 +{
4360 + //u16_t ret;
4361 + //u32_t i;
4362 + //u8_t* ch;
4363 + //u8_t bPassive;
4364 + u32_t devSize;
4365 + struct zfCbUsbFuncTbl cbUsbFuncTbl;
4366 + zmw_get_wlan_dev(dev);
4367 +
4368 + zm_debug_msg0("start");
4369 +
4370 + devSize = sizeof(struct zsWlanDev);
4371 + /* Zeroize zsWlanDev struct */
4372 + zfZeroMemory((u8_t*)wd, (u16_t)devSize);
4373 +
4374 +#ifdef ZM_ENABLE_AGGREGATION
4375 + zfAggInit(dev);
4376 +#endif
4377 +
4378 + zfCwmInit(dev);
4379 +
4380 + wd->commTally.RateCtrlTxMPDU = 0;
4381 + wd->commTally.RateCtrlBAFail = 0;
4382 + wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_SHORT;
4383 +
4384 + if (cbFuncTbl == NULL)
4385 + {
4386 + /* zfcbRecvEth() is mandatory */
4387 + zm_assert(0);
4388 + }
4389 + else
4390 + {
4391 + if (cbFuncTbl->zfcbRecvEth == NULL)
4392 + {
4393 + /* zfcbRecvEth() is mandatory */
4394 + zm_assert(0);
4395 + }
4396 + wd->zfcbAuthNotify = cbFuncTbl->zfcbAuthNotify;
4397 + wd->zfcbAuthNotify = cbFuncTbl->zfcbAuthNotify;
4398 + wd->zfcbAsocNotify = cbFuncTbl->zfcbAsocNotify;
4399 + wd->zfcbDisAsocNotify = cbFuncTbl->zfcbDisAsocNotify;
4400 + wd->zfcbApConnectNotify = cbFuncTbl->zfcbApConnectNotify;
4401 + wd->zfcbConnectNotify = cbFuncTbl->zfcbConnectNotify;
4402 + wd->zfcbScanNotify = cbFuncTbl->zfcbScanNotify;
4403 + wd->zfcbMicFailureNotify = cbFuncTbl->zfcbMicFailureNotify;
4404 + wd->zfcbApMicFailureNotify = cbFuncTbl->zfcbApMicFailureNotify;
4405 + wd->zfcbIbssPartnerNotify = cbFuncTbl->zfcbIbssPartnerNotify;
4406 + wd->zfcbMacAddressNotify = cbFuncTbl->zfcbMacAddressNotify;
4407 + wd->zfcbSendCompleteIndication = cbFuncTbl->zfcbSendCompleteIndication;
4408 + wd->zfcbRecvEth = cbFuncTbl->zfcbRecvEth;
4409 + wd->zfcbRestoreBufData = cbFuncTbl->zfcbRestoreBufData;
4410 + wd->zfcbRecv80211 = cbFuncTbl->zfcbRecv80211;
4411 +#ifdef ZM_ENABLE_CENC
4412 + wd->zfcbCencAsocNotify = cbFuncTbl->zfcbCencAsocNotify;
4413 +#endif //ZM_ENABLE_CENC
4414 + wd->zfcbClassifyTxPacket = cbFuncTbl->zfcbClassifyTxPacket;
4415 + wd->zfcbHwWatchDogNotify = cbFuncTbl->zfcbHwWatchDogNotify;
4416 + }
4417 +
4418 + //add by honda 0330
4419 + cbUsbFuncTbl.zfcbUsbRecv = zfiUsbRecv;
4420 + cbUsbFuncTbl.zfcbUsbRegIn = zfiUsbRegIn;
4421 + cbUsbFuncTbl.zfcbUsbOutComplete = zfiUsbOutComplete;
4422 + cbUsbFuncTbl.zfcbUsbRegOutComplete = zfiUsbRegOutComplete;
4423 + zfwUsbRegisterCallBack(dev, &cbUsbFuncTbl);
4424 + /* Init OWN MAC address */
4425 + wd->macAddr[0] = 0x8000;
4426 + wd->macAddr[1] = 0x0000;
4427 + wd->macAddr[2] = 0x0000;
4428 +
4429 + wd->regulationTable.regionCode = 0xffff;
4430 +
4431 + zfHpInit(dev, wd->frequency);
4432 +
4433 + /* init region code */
4434 + //wd->regulationTable.regionCode = NULL1_WORLD; //Only 2.4g RegCode
4435 + //zfHpGetRegulationTablefromRegionCode(dev, NULL1_WORLD);
4436 + //zfiWlanSetDot11DMode(dev , 1); // Enable 802.11d
4437 + /* Get the first channel */
4438 + //wd->frequency = zfChGetFirstChannel(dev, &bPassive);
4439 +#ifdef ZM_AP_DEBUG
4440 + //wd->frequency = 2437;
4441 +#endif
4442 +
4443 + //STA mode
4444 + wd->sta.mTxRate = 0x0;
4445 + wd->sta.uTxRate = 0x3;
4446 + wd->sta.mmTxRate = 0x0;
4447 + wd->sta.adapterState = ZM_STA_STATE_DISCONNECT;
4448 + wd->sta.capability[0] = 0x01;
4449 + wd->sta.capability[1] = 0x00;
4450 +
4451 + wd->sta.preambleTypeHT = 0;
4452 + wd->sta.htCtrlBandwidth = 0;
4453 + wd->sta.htCtrlSTBC = 0;
4454 + wd->sta.htCtrlSG = 0;
4455 + wd->sta.defaultTA = 0;
4456 + //wd->sta.activescanTickPerChannel = ZM_TIME_ACTIVE_SCAN/ZM_MS_PER_TICK;
4457 + {
4458 + u8_t Dur = ZM_TIME_ACTIVE_SCAN;
4459 + zfwGetActiveScanDur(dev, &Dur);
4460 + wd->sta.activescanTickPerChannel = Dur/ZM_MS_PER_TICK;
4461 +
4462 + }
4463 + wd->sta.passiveScanTickPerChannel = ZM_TIME_PASSIVE_SCAN/ZM_MS_PER_TICK;
4464 + wd->sta.bAutoReconnect = TRUE;
4465 + wd->sta.dropUnencryptedPkts = FALSE;
4466 +
4467 + /* set default to bypass all multicast packet for linux, window XP would set 0 by wrapper initialization */
4468 + wd->sta.bAllMulticast = 1;
4469 +
4470 + /* Initial the RIFS Status / RIFS-like frame count / RIFS count */
4471 + wd->sta.rifsState = ZM_RIFS_STATE_DETECTING;
4472 + wd->sta.rifsLikeFrameCnt = 0;
4473 + wd->sta.rifsCount = 0;
4474 +
4475 + wd->sta.osRxFilter = 0;
4476 + wd->sta.bSafeMode = 0;
4477 +
4478 + //Common
4479 + zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_DISCONNECT);
4480 + wd->beaconInterval = 100;
4481 + wd->rtsThreshold = 2346;
4482 + wd->fragThreshold = 32767;
4483 + wd->wlanMode = ZM_MODE_INFRASTRUCTURE;
4484 + wd->txMCS = 0xff; //AUTO
4485 + wd->dtim = 1;
4486 + //wd->txMT = 1; //OFDM
4487 + wd->tick = 1;
4488 + wd->maxTxPower2 = 0xff;
4489 + wd->maxTxPower5 = 0xff;
4490 + wd->supportMode = 0xffffffff;
4491 + wd->ws.adhocMode = ZM_ADHOCBAND_G;
4492 + wd->ws.autoSetFrequency = 0xff;
4493 +
4494 + //AP mode
4495 + //wd->bgMode = wd->ws.bgMode;
4496 + wd->ap.ssidLen[0] = 6;
4497 + wd->ap.ssid[0][0] = 'Z';
4498 + wd->ap.ssid[0][1] = 'D';
4499 + wd->ap.ssid[0][2] = '1';
4500 + wd->ap.ssid[0][3] = '2';
4501 + wd->ap.ssid[0][4] = '2';
4502 + wd->ap.ssid[0][5] = '1';
4503 +
4504 + // Init the country iso name as NA
4505 + wd->ws.countryIsoName[0] = 0;
4506 + wd->ws.countryIsoName[1] = 0;
4507 + wd->ws.countryIsoName[2] = '\0';
4508 +
4509 + /* init fragmentation is disabled */
4510 + //zfiWlanSetFragThreshold(dev, 0);
4511 +
4512 + /* airopeek : swSniffer 1=>on 0=>off */
4513 + wd->swSniffer = 0;
4514 + wd->XLinkMode = 0;
4515 +
4516 +// jhlee HT 0
4517 +#if 1
4518 + /* AP Mode*/
4519 + /* Init HT Capability Info */
4520 + wd->ap.HTCap.Data.ElementID = ZM_WLAN_EID_HT_CAPABILITY;
4521 + wd->ap.HTCap.Data.Length = 26;
4522 + //wd->ap.HTCap.Data.SupChannelWidthSet = 0;
4523 + //wd->ap.HTCap.Data.MIMOPowerSave = 3;
4524 + //wd->ap.HTCap.Data.ShortGIfor40MHz = 0;
4525 + //wd->ap.HTCap.Data.ShortGIfor20MHz = 0;
4526 + //wd->ap.HTCap.Data.DSSSandCCKin40MHz = 0;
4527 + wd->ap.HTCap.Data.AMPDUParam |= HTCAP_MaxRxAMPDU3;
4528 + wd->ap.HTCap.Data.MCSSet[0] = 0xFF; // MCS 0 ~ 7
4529 + wd->ap.HTCap.Data.MCSSet[1] = 0xFF; // MCS 8 ~ 15
4530 +
4531 + /* Init Extended HT Capability Info */
4532 + wd->ap.ExtHTCap.Data.ElementID = ZM_WLAN_EID_EXTENDED_HT_CAPABILITY;
4533 + wd->ap.ExtHTCap.Data.Length = 22;
4534 + wd->ap.ExtHTCap.Data.ControlChannel = 6;
4535 + //wd->ap.ExtHTCap.Data.ExtChannelOffset = 3;
4536 + wd->ap.ExtHTCap.Data.ChannelInfo |= ExtHtCap_RecomTxWidthSet;
4537 + //wd->ap.ExtHTCap.Data.RIFSMode = 1;
4538 + wd->ap.ExtHTCap.Data.OperatingInfo |= 1;
4539 +
4540 + /* STA Mode*/
4541 + /* Init HT Capability Info */
4542 + wd->sta.HTCap.Data.ElementID = ZM_WLAN_EID_HT_CAPABILITY;
4543 + wd->sta.HTCap.Data.Length = 26;
4544 +
4545 + /* Test with 5G-AP : 7603 */
4546 + //wd->sta.HTCap.Data.SupChannelWidthSet = 1;
4547 + wd->sta.HTCap.Data.HtCapInfo |= HTCAP_SMEnabled;
4548 + wd->sta.HTCap.Data.HtCapInfo |= HTCAP_SupChannelWidthSet;
4549 + wd->sta.HTCap.Data.HtCapInfo |= HTCAP_ShortGIfor40MHz;
4550 + wd->sta.HTCap.Data.HtCapInfo |= HTCAP_DSSSandCCKin40MHz;
4551 +#ifndef ZM_DISABLE_AMSDU8K_SUPPORT
4552 + wd->sta.HTCap.Data.HtCapInfo |= HTCAP_MaxAMSDULength;
4553 +#endif
4554 + //wd->sta.HTCap.Data.MIMOPowerSave = 0;
4555 + //wd->sta.HTCap.Data.ShortGIfor40MHz = 0;
4556 + //wd->sta.HTCap.Data.ShortGIfor20MHz = 0;
4557 + //wd->sta.HTCap.Data.DSSSandCCKin40MHz = 0;
4558 + wd->sta.HTCap.Data.AMPDUParam |= HTCAP_MaxRxAMPDU3;
4559 + wd->sta.HTCap.Data.MCSSet[0] = 0xFF; // MCS 0 ~ 7
4560 + wd->sta.HTCap.Data.MCSSet[1] = 0xFF; // MCS 8 ~ 15
4561 + wd->sta.HTCap.Data.PCO |= HTCAP_TransmissionTime3;
4562 + //wd->sta.HTCap.Data.TransmissionTime = 0;
4563 + /* Init Extended HT Capability Info */
4564 + wd->sta.ExtHTCap.Data.ElementID = ZM_WLAN_EID_EXTENDED_HT_CAPABILITY;
4565 + wd->sta.ExtHTCap.Data.Length = 22;
4566 + wd->sta.ExtHTCap.Data.ControlChannel = 6;
4567 +
4568 + //wd->sta.ExtHTCap.Data.ExtChannelOffset |= 3;
4569 + wd->sta.ExtHTCap.Data.ChannelInfo |= ExtHtCap_ExtChannelOffsetBelow;
4570 +
4571 + //wd->sta.ExtHTCap.Data.RecomTxWidthSet = 1;
4572 + //wd->sta.ExtHTCap.Data.RIFSMode = 1;
4573 + wd->sta.ExtHTCap.Data.OperatingInfo |= 1;
4574 +#endif
4575 +
4576 +#if 0
4577 + /* WME test code */
4578 + wd->ap.qosMode[0] = 1;
4579 +#endif
4580 +
4581 + wd->ledStruct.ledMode[0] = 0x2221;
4582 + wd->ledStruct.ledMode[1] = 0x2221;
4583 +
4584 + zfTimerInit(dev);
4585 +
4586 + ZM_PERFORMANCE_INIT(dev);
4587 +
4588 + zfBssInfoCreate(dev);
4589 + zfScanMgrInit(dev);
4590 + zfPowerSavingMgrInit(dev);
4591 +
4592 +#if 0
4593 + /* Test code */
4594 + {
4595 + u32_t key[4] = {0xffffffff, 0xff, 0, 0};
4596 + u16_t addr[3] = {0x8000, 0x01ab, 0x0000};
4597 + //zfSetKey(dev, 0, 0, ZM_WEP64, addr, key);
4598 + //zfSetKey(dev, 0, 0, ZM_AES, addr, key);
4599 + //zfSetKey(dev, 64, 0, 1, wd->macAddr, key);
4600 + }
4601 +#endif
4602 +
4603 + // WME settings
4604 + wd->ws.staWmeEnabled = 1; // Enable WME by default
4605 + #define ZM_UAPSD_Q_SIZE 32 //2^N
4606 + wd->ap.uapsdQ = zfQueueCreate(dev, ZM_UAPSD_Q_SIZE);
4607 + zm_assert(wd->ap.uapsdQ != NULL);
4608 + wd->sta.uapsdQ = zfQueueCreate(dev, ZM_UAPSD_Q_SIZE);
4609 + zm_assert(wd->sta.uapsdQ != NULL);
4610 +
4611 + //zfHpInit(dev, wd->frequency);
4612 +
4613 + /* MAC address */
4614 + //zfHpSetMacAddress(dev, wd->macAddr, 0);
4615 + zfHpGetMacAddress(dev);
4616 +
4617 + zfCoreSetFrequency(dev, wd->frequency);
4618 +
4619 +#if ZM_PCI_LOOP_BACK == 1
4620 + zfwWriteReg(dev, ZM_REG_PCI_CONTROL, 6);
4621 +#endif /* #if ZM_PCI_LOOP_BACK == 1 */
4622 +
4623 + //zfiWlanSetDot11DMode(dev , 1); // Enable 802.11d
4624 + //zfiWlanSetDot11HDFSMode(dev , 1); // Enable 802.11h DFS
4625 + wd->sta.DFSEnable = 1;
4626 + wd->sta.capability[1] |= ZM_BIT_0;
4627 +
4628 + //zfiWlanSetFrequency(dev, 5260000, TRUE);
4629 + //zfiWlanSetAniMode(dev , 1); // Enable ANI
4630 +
4631 + /* Trgger Rx DMA */
4632 + zfHpStartRecv(dev);
4633 +
4634 + zm_debug_msg0("end");
4635 +
4636 + return 0;
4637 +}
4638 +
4639 +/* WLAN hardware will be shutdown and all resource will be release */
4640 +u16_t zfiWlanClose(zdev_t* dev)
4641 +{
4642 + zmw_get_wlan_dev(dev);
4643 +
4644 + zm_msg0_init(ZM_LV_0, "enter");
4645 +
4646 + wd->state = ZM_WLAN_STATE_CLOSEDED;
4647 +
4648 + //zfiWlanDisable(dev, 1);
4649 + zfWlanReset(dev);
4650 +
4651 + zfHpStopRecv(dev);
4652 +
4653 + /* Disable MAC */
4654 + /* Disable PHY */
4655 + /* Disable RF */
4656 +
4657 + zfHpRelease(dev);
4658 +
4659 + zfQueueDestroy(dev, wd->ap.uapsdQ);
4660 + zfQueueDestroy(dev, wd->sta.uapsdQ);
4661 +
4662 + zfBssInfoDestroy(dev);
4663 +
4664 +#ifdef ZM_ENABLE_AGGREGATION
4665 + /* add by honda */
4666 + zfAggRxFreeBuf(dev, 1); //1 for release structure memory
4667 + /* end of add by honda */
4668 +#endif
4669 +
4670 + zm_msg0_init(ZM_LV_0, "exit");
4671 +
4672 + return 0;
4673 +}
4674 +
4675 +void zfGetWrapperSetting(zdev_t* dev)
4676 +{
4677 + u8_t bPassive;
4678 + u16_t vapId = 0;
4679 +
4680 + zmw_get_wlan_dev(dev);
4681 +
4682 + zmw_declare_for_critical_section();
4683 +#if 0
4684 + if ( (wd->ws.countryIsoName[0] != 0)
4685 + || (wd->ws.countryIsoName[1] != 0)
4686 + || (wd->ws.countryIsoName[2] != '\0') )
4687 + {
4688 + zfHpGetRegulationTablefromRegionCode(
4689 + dev,
4690 + zfHpGetRegionCodeFromIsoName(dev, wd->ws.countryIsoName) );
4691 + }
4692 +#endif
4693 + zmw_enter_critical_section(dev);
4694 +
4695 + wd->wlanMode = wd->ws.wlanMode;
4696 +
4697 + /* set channel */
4698 + if ( wd->ws.frequency )
4699 + {
4700 + wd->frequency = wd->ws.frequency;
4701 + wd->ws.frequency = 0;
4702 + }
4703 + else
4704 + {
4705 + wd->frequency = zfChGetFirstChannel(dev, &bPassive);
4706 +
4707 + if ( wd->wlanMode == ZM_MODE_IBSS )
4708 + {
4709 + if (wd->ws.adhocMode == ZM_ADHOCBAND_A)
4710 + {
4711 + wd->frequency = ZM_CH_A_36;
4712 + }
4713 + else
4714 + {
4715 + wd->frequency = ZM_CH_G_6;
4716 + }
4717 + }
4718 + }
4719 +#ifdef ZM_AP_DEBUG
4720 + /* honda add for debug, 2437 channel 6, 2452 channel 9 */
4721 + wd->frequency = 2437;
4722 + /* end of add by honda */
4723 +#endif
4724 +
4725 + /* set preamble type */
4726 + switch (wd->ws.preambleType)
4727 + {
4728 + case ZM_PREAMBLE_TYPE_AUTO:
4729 + case ZM_PREAMBLE_TYPE_SHORT:
4730 + case ZM_PREAMBLE_TYPE_LONG:
4731 + wd->preambleType = wd->ws.preambleType;
4732 + break;
4733 + default:
4734 + wd->preambleType = ZM_PREAMBLE_TYPE_SHORT;
4735 + break;
4736 + }
4737 + wd->ws.preambleType = 0;
4738 +
4739 + if ( wd->wlanMode == ZM_MODE_AP )
4740 + {
4741 + vapId = zfwGetVapId(dev);
4742 +
4743 + if (vapId == 0xffff)
4744 + {
4745 + wd->ap.authAlgo[0] = wd->ws.authMode;
4746 + wd->ap.encryMode[0] = wd->ws.encryMode;
4747 + }
4748 + else
4749 + {
4750 + wd->ap.authAlgo[vapId + 1] = wd->ws.authMode;
4751 + wd->ap.encryMode[vapId + 1] = wd->ws.encryMode;
4752 + }
4753 + wd->ws.authMode = 0;
4754 + wd->ws.encryMode = ZM_NO_WEP;
4755 +
4756 + /* Get beaconInterval from WrapperSetting */
4757 + if ((wd->ws.beaconInterval >= 20) && (wd->ws.beaconInterval <= 1000))
4758 + {
4759 + wd->beaconInterval = wd->ws.beaconInterval;
4760 + }
4761 + else
4762 + {
4763 + wd->beaconInterval = 100; //100ms
4764 + }
4765 +
4766 + if (wd->ws.dtim > 0)
4767 + {
4768 + wd->dtim = wd->ws.dtim;
4769 + }
4770 + else
4771 + {
4772 + wd->dtim = 1;
4773 + }
4774 +
4775 + wd->ap.qosMode = wd->ws.apWmeEnabled & 0x1;
4776 + wd->ap.uapsdEnabled = (wd->ws.apWmeEnabled & 0x2) >> 1;
4777 + }
4778 + else
4779 + {
4780 + wd->sta.authMode = wd->ws.authMode;
4781 + wd->sta.currentAuthMode = wd->ws.authMode;
4782 + wd->sta.wepStatus = wd->ws.wepStatus;
4783 +
4784 + if ( wd->ws.beaconInterval )
4785 + {
4786 + wd->beaconInterval = wd->ws.beaconInterval;
4787 + }
4788 + else
4789 + {
4790 + wd->beaconInterval = 0x64;
4791 + }
4792 +
4793 + if ( wd->wlanMode == ZM_MODE_IBSS )
4794 + {
4795 + /* 1. Set default channel 6 (2437MHz) */
4796 +// wd->frequency = 2437;
4797 +
4798 + /* 2. Otus support 802.11g Mode */
4799 + if ((wd->ws.adhocMode == ZM_ADHOCBAND_G) ||
4800 + (wd->ws.adhocMode == ZM_ADHOCBAND_BG) ||
4801 + (wd->ws.adhocMode == ZM_ADHOCBAND_ABG) ) {
4802 + wd->wfc.bIbssGMode = 1;
4803 + } else {
4804 + wd->wfc.bIbssGMode = 0;
4805 + }
4806 +
4807 + /* 3. set short preamble */
4808 + //wd->sta.preambleType = ZM_PREAMBLE_TYPE_SHORT ;
4809 + }
4810 +
4811 + /* set ATIM window */
4812 + if ( wd->ws.atimWindow )
4813 + {
4814 + wd->sta.atimWindow = wd->ws.atimWindow;
4815 + }
4816 + else
4817 + {
4818 + //wd->sta.atimWindow = 0x0a;
4819 + wd->sta.atimWindow = 0;
4820 + }
4821 +
4822 + //wd->sta.connectingHiddenAP = 1;//wd->ws.connectingHiddenAP;
4823 + wd->sta.dropUnencryptedPkts = wd->ws.dropUnencryptedPkts;
4824 + wd->sta.ibssJoinOnly = wd->ws.ibssJoinOnly;
4825 +
4826 + if ( wd->ws.bDesiredBssid )
4827 + {
4828 + zfMemoryCopy(wd->sta.desiredBssid, wd->ws.desiredBssid, 6);
4829 + wd->sta.bDesiredBssid = TRUE;
4830 + wd->ws.bDesiredBssid = FALSE;
4831 + }
4832 + else
4833 + {
4834 + wd->sta.bDesiredBssid = FALSE;
4835 + }
4836 +
4837 + /* check ssid */
4838 + if ( wd->ws.ssidLen != 0 )
4839 + {
4840 + if ( (!zfMemoryIsEqual(wd->ws.ssid, wd->sta.ssid,
4841 + wd->sta.ssidLen))||
4842 + (wd->ws.ssidLen != wd->sta.ssidLen)||
4843 + (wd->sta.authMode == ZM_AUTH_MODE_WPA)||
4844 + (wd->sta.authMode == ZM_AUTH_MODE_WPAPSK) ||
4845 + (wd->ws.staWmeQosInfo!= 0) )
4846 + {
4847 + /*if u-APSD test(set QosInfo), clear connectByReasso to do association (not reassociation)*/
4848 + wd->sta.connectByReasso = FALSE;
4849 + wd->sta.failCntOfReasso = 0;
4850 + wd->sta.pmkidInfo.bssidCount = 0;
4851 +
4852 + wd->sta.ssidLen = wd->ws.ssidLen;
4853 + zfMemoryCopy(wd->sta.ssid, wd->ws.ssid, wd->sta.ssidLen);
4854 +
4855 + if ( wd->sta.ssidLen < 32 )
4856 + {
4857 + wd->sta.ssid[wd->sta.ssidLen] = 0;
4858 + }
4859 + }
4860 + }
4861 + else
4862 + { /* ANY BSS */
4863 + wd->sta.ssid[0] = 0;
4864 + wd->sta.ssidLen = 0;
4865 + }
4866 +
4867 + wd->sta.wmeEnabled = wd->ws.staWmeEnabled;
4868 + wd->sta.wmeQosInfo = wd->ws.staWmeQosInfo;
4869 +
4870 + }
4871 +
4872 + zmw_leave_critical_section(dev);
4873 +}
4874 +
4875 +u16_t zfWlanEnable(zdev_t* dev)
4876 +{
4877 + u8_t bssid[6] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
4878 + u16_t i;
4879 +
4880 + zmw_get_wlan_dev(dev);
4881 +
4882 + zmw_declare_for_critical_section();
4883 +
4884 + if ( wd->wlanMode == ZM_MODE_UNKNOWN )
4885 + {
4886 + zm_debug_msg0("Unknown Mode...Skip...");
4887 + return 0;
4888 + }
4889 +
4890 + if (wd->wlanMode == ZM_MODE_AP)
4891 + {
4892 + u16_t vapId;
4893 +
4894 + vapId = zfwGetVapId(dev);
4895 +
4896 + if (vapId == 0xffff)
4897 + {
4898 + /* AP mode */
4899 + zfApInitStaTbl(dev);
4900 +
4901 + /* AP default parameters */
4902 + wd->bRate = 0xf;
4903 + wd->gRate = 0xff;
4904 + wd->bRateBasic = 0xf;
4905 + wd->gRateBasic = 0x0;
4906 + //wd->beaconInterval = 100;
4907 + wd->ap.apBitmap = 1;
4908 + wd->ap.beaconCounter = 0;
4909 + //wd->ap.vapNumber = 1; //mark by ygwei for Vap
4910 +
4911 + wd->ap.hideSsid[0] = 0;
4912 + wd->ap.staAgingTimeSec = 10*60;
4913 + wd->ap.staProbingTimeSec = 60;
4914 +
4915 + for (i=0; i<ZM_MAX_AP_SUPPORT; i++)
4916 + {
4917 + wd->ap.bcmcHead[i] = wd->ap.bcmcTail[i] = 0;
4918 + }
4919 +
4920 + //wd->ap.uniHead = wd->ap.uniTail = 0;
4921 +
4922 + /* load AP parameters */
4923 + wd->bRateBasic = wd->ws.bRateBasic;
4924 + wd->gRateBasic = wd->ws.gRateBasic;
4925 + wd->bgMode = wd->ws.bgMode;
4926 + if ((wd->ws.ssidLen <= 32) && (wd->ws.ssidLen != 0))
4927 + {
4928 + wd->ap.ssidLen[0] = wd->ws.ssidLen;
4929 + for(i=0; i<wd->ws.ssidLen; i++)
4930 + {
4931 + wd->ap.ssid[0][i] = wd->ws.ssid[i];
4932 + }
4933 + wd->ws.ssidLen = 0; // Reset Wrapper Variable
4934 + }
4935 +
4936 + if (wd->ap.encryMode[0] == 0)
4937 + {
4938 + wd->ap.capab[0] = 0x001;
4939 + }
4940 + else
4941 + {
4942 + wd->ap.capab[0] = 0x011;
4943 + }
4944 + /* set Short Slot Time bit if not 11b */
4945 + if (wd->ap.wlanType[0] != ZM_WLAN_TYPE_PURE_B)
4946 + {
4947 + wd->ap.capab[0] |= 0x400;
4948 + }
4949 +
4950 + // wd->ap.vapNumber = 1; // mark by ygwei for Vap Test
4951 + }
4952 + else
4953 + {
4954 +#if 0
4955 + /* VAP Test Code */
4956 + wd->ap.apBitmap = 0x3;
4957 + wd->ap.capab[1] = 0x401;
4958 + wd->ap.ssidLen[1] = 4;
4959 + wd->ap.ssid[1][0] = 'v';
4960 + wd->ap.ssid[1][1] = 'a';
4961 + wd->ap.ssid[1][2] = 'p';
4962 + wd->ap.ssid[1][3] = '1';
4963 + wd->ap.authAlgo[1] = wd->ws.authMode;
4964 + wd->ap.encryMode[1] = wd->ws.encryMode;
4965 + wd->ap.vapNumber = 2;
4966 +#else
4967 + /* VAP Test Code */
4968 + wd->ap.apBitmap = 0x1 | (0x01 << (vapId+1));
4969 +
4970 + if ((wd->ws.ssidLen <= 32) && (wd->ws.ssidLen != 0))
4971 + {
4972 + wd->ap.ssidLen[vapId+1] = wd->ws.ssidLen;
4973 + for(i=0; i<wd->ws.ssidLen; i++)
4974 + {
4975 + wd->ap.ssid[vapId+1][i] = wd->ws.ssid[i];
4976 + }
4977 + wd->ws.ssidLen = 0; // Reset Wrapper Variable
4978 + }
4979 +
4980 + if (wd->ap.encryMode[vapId+1] == 0)
4981 + {
4982 + wd->ap.capab[vapId+1] = 0x401;
4983 + }
4984 + else
4985 + {
4986 + wd->ap.capab[vapId+1] = 0x411;
4987 + }
4988 +
4989 + wd->ap.authAlgo[vapId+1] = wd->ws.authMode;
4990 + wd->ap.encryMode[vapId+1] = wd->ws.encryMode;
4991 +
4992 + /* Need to be modified when VAP is used */
4993 + //wd->ap.vapNumber = 2;
4994 +#endif
4995 + }
4996 +
4997 + wd->ap.vapNumber++;
4998 +
4999 + zfCoreSetFrequency(dev, wd->frequency);
5000 +
5001 + zfInitMacApMode(dev);
5002 +
5003 + /* Disable protection mode */
5004 + zfApSetProtectionMode(dev, 0);
5005 +
5006 + zfApSendBeacon(dev);
5007 + } /*if (wd->wlanMode == ZM_MODE_AP) */
5008 + else
5009 + {
5010 + zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
5011 + zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_EXTERNAL);
5012 +
5013 + zmw_enter_critical_section(dev);
5014 + wd->sta.oppositeCount = 0; /* reset opposite count */
5015 + //wd->sta.bAutoReconnect = wd->sta.bAutoReconnectEnabled;
5016 + //wd->sta.scanWithSSID = 0;
5017 + zfStaInitOppositeInfo(dev);
5018 + zmw_leave_critical_section(dev);
5019 +
5020 + zfStaResetStatus(dev, 0);
5021 +
5022 + if ( (wd->sta.cmDisallowSsidLength != 0)&&
5023 + (wd->sta.ssidLen == wd->sta.cmDisallowSsidLength)&&
5024 + (zfMemoryIsEqual(wd->sta.ssid, wd->sta.cmDisallowSsid,
5025 + wd->sta.ssidLen)) &&
5026 + (wd->sta.wepStatus == ZM_ENCRYPTION_TKIP))
5027 + { /* countermeasures */
5028 + zm_debug_msg0("countermeasures disallow association");
5029 +
5030 + }
5031 + else
5032 + {
5033 + switch( wd->wlanMode )
5034 + {
5035 + case ZM_MODE_IBSS:
5036 + /* some registers may be set here */
5037 + if ( wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK )
5038 + {
5039 + zfHpSetApStaMode(dev, ZM_HAL_80211_MODE_IBSS_WPA2PSK);
5040 + }
5041 + else
5042 + {
5043 + zfHpSetApStaMode(dev, ZM_HAL_80211_MODE_IBSS_GENERAL);
5044 + }
5045 +
5046 + zm_msg0_mm(ZM_LV_0, "ZM_MODE_IBSS");
5047 + zfIbssConnectNetwork(dev);
5048 + break;
5049 +
5050 + case ZM_MODE_INFRASTRUCTURE:
5051 + /* some registers may be set here */
5052 + zfHpSetApStaMode(dev, ZM_HAL_80211_MODE_STA);
5053 +
5054 + zfInfraConnectNetwork(dev);
5055 + break;
5056 +
5057 + case ZM_MODE_PSEUDO:
5058 + /* some registers may be set here */
5059 + zfHpSetApStaMode(dev, ZM_HAL_80211_MODE_STA);
5060 +
5061 + zfUpdateBssid(dev, bssid);
5062 + zfCoreSetFrequency(dev, wd->frequency);
5063 + break;
5064 +
5065 + default:
5066 + break;
5067 + }
5068 + }
5069 +
5070 + }
5071 +
5072 +
5073 + //if ( (wd->wlanMode != ZM_MODE_INFRASTRUCTURE)&&
5074 + // (wd->wlanMode != ZM_MODE_AP) )
5075 + if ( wd->wlanMode == ZM_MODE_PSEUDO )
5076 + {
5077 + /* Reset Wlan status */
5078 + zfWlanReset(dev);
5079 +
5080 + if (wd->zfcbConnectNotify != NULL)
5081 + {
5082 + wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_CONNECT, wd->sta.bssid);
5083 + }
5084 + zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTED);
5085 + }
5086 +
5087 +
5088 + if(wd->wlanMode == ZM_MODE_AP)
5089 + {
5090 + if (wd->zfcbConnectNotify != NULL)
5091 + {
5092 + wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_CONNECT, wd->sta.bssid);
5093 + }
5094 + //zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTED);
5095 + }
5096 +
5097 + // Assign default Tx Rate
5098 + if ( wd->sta.EnableHT )
5099 + {
5100 + u32_t oneTxStreamCap;
5101 + oneTxStreamCap = (zfHpCapability(dev) & ZM_HP_CAP_11N_ONE_TX_STREAM);
5102 + if(oneTxStreamCap)
5103 + wd->CurrentTxRateKbps = 135000;
5104 + else
5105 + wd->CurrentTxRateKbps = 270000;
5106 + wd->CurrentRxRateKbps = 270000;
5107 + }
5108 + else
5109 + {
5110 + wd->CurrentTxRateKbps = 54000;
5111 + wd->CurrentRxRateKbps = 54000;
5112 + }
5113 +
5114 + wd->state = ZM_WLAN_STATE_ENABLED;
5115 +
5116 + return 0;
5117 +}
5118 +
5119 +/* Enable/disable Wlan operation */
5120 +u16_t zfiWlanEnable(zdev_t* dev)
5121 +{
5122 + u16_t ret;
5123 +
5124 + zmw_get_wlan_dev(dev);
5125 +
5126 + zm_msg0_mm(ZM_LV_1, "Enable Wlan");
5127 +
5128 + zfGetWrapperSetting(dev);
5129 +
5130 + zfZeroMemory((u8_t*) &wd->trafTally, sizeof(struct zsTrafTally));
5131 +
5132 + // Reset cmMicFailureCount to 0 for new association request
5133 + if ( wd->sta.cmMicFailureCount == 1 )
5134 + {
5135 + zfTimerCancel(dev, ZM_EVENT_CM_TIMER);
5136 + wd->sta.cmMicFailureCount = 0;
5137 + }
5138 +
5139 + zfFlushVtxq(dev);
5140 + if ((wd->queueFlushed & 0x10) != 0)
5141 + {
5142 + zfHpUsbReset(dev);
5143 + }
5144 + ret = zfWlanEnable(dev);
5145 +
5146 + return ret;
5147 +}
5148 +/* Add a flag named ResetKeyCache to show if KeyCache should be cleared.
5149 + for hostapd in AP mode, if driver receives iwconfig ioctl
5150 + after setting group key, it shouldn't clear KeyCache. */
5151 +u16_t zfiWlanDisable(zdev_t* dev, u8_t ResetKeyCache)
5152 +{
5153 + u16_t i;
5154 + u8_t isConnected;
5155 +
5156 + zmw_get_wlan_dev(dev);
5157 +
5158 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
5159 + zmw_declare_for_critical_section();
5160 +#endif
5161 + wd->state = ZM_WLAN_STATE_DISABLED;
5162 +
5163 + zm_msg0_mm(ZM_LV_1, "Disable Wlan");
5164 +
5165 + if ( wd->wlanMode != ZM_MODE_AP )
5166 + {
5167 + isConnected = zfStaIsConnected(dev);
5168 +
5169 + if ( (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)&&
5170 + (wd->sta.currentAuthMode != ZM_AUTH_MODE_WPA2) )
5171 + {
5172 + /* send deauthentication frame */
5173 + if (isConnected)
5174 + {
5175 + //zfiWlanDeauth(dev, NULL, 0);
5176 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, wd->sta.bssid, 3, 0, 0);
5177 + //zmw_debug_msg0("send a Deauth frame!");
5178 + }
5179 + }
5180 +
5181 + // Remove all the connected peer stations
5182 + if ( wd->wlanMode == ZM_MODE_IBSS )
5183 + {
5184 + wd->sta.ibssBssIsCreator = 0;
5185 + zfTimerCancel(dev, ZM_EVENT_IBSS_MONITOR);
5186 + zfStaIbssMonitoring(dev, 1);
5187 + }
5188 +
5189 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
5190 + zmw_enter_critical_section(dev);
5191 + wd->sta.ibssWpa2Psk = 0;
5192 + zmw_leave_critical_section(dev);
5193 +#endif
5194 +
5195 + wd->sta.wpaState = ZM_STA_WPA_STATE_INIT;
5196 +
5197 + /* reset connect timeout counter */
5198 + wd->sta.connectTimeoutCount = 0;
5199 +
5200 + /* reset connectState to None */
5201 + wd->sta.connectState = ZM_STA_CONN_STATE_NONE;
5202 +
5203 + /* reset leap enable variable */
5204 + wd->sta.leapEnabled = 0;
5205 +
5206 + /* Disable the RIFS Status / RIFS-like frame count / RIFS count */
5207 + if( wd->sta.rifsState == ZM_RIFS_STATE_DETECTED )
5208 + zfHpDisableRifs(dev);
5209 + wd->sta.rifsState = ZM_RIFS_STATE_DETECTING;
5210 + wd->sta.rifsLikeFrameCnt = 0;
5211 + wd->sta.rifsCount = 0;
5212 +
5213 + wd->sta.osRxFilter = 0;
5214 + wd->sta.bSafeMode = 0;
5215 +
5216 + zfChangeAdapterState(dev, ZM_STA_STATE_DISCONNECT);
5217 + if (ResetKeyCache)
5218 + zfHpResetKeyCache(dev);
5219 +
5220 + if (isConnected)
5221 + {
5222 + if (wd->zfcbConnectNotify != NULL)
5223 + {
5224 + wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_CONNECTION_DISABLED, wd->sta.bssid);
5225 + }
5226 + }
5227 + else
5228 + {
5229 + if (wd->zfcbConnectNotify != NULL)
5230 + {
5231 + wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_DISABLED, wd->sta.bssid);
5232 + }
5233 + }
5234 + }
5235 + else //if (wd->wlanMode == ZM_MODE_AP)
5236 + {
5237 + for (i=0; i<ZM_MAX_STA_SUPPORT; i++)
5238 + {
5239 + /* send deauthentication frame */
5240 + if (wd->ap.staTable[i].valid == 1)
5241 + {
5242 + /* Reason : Sending station is leaving */
5243 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH,
5244 + wd->ap.staTable[i].addr, 3, 0, 0);
5245 + }
5246 + }
5247 +
5248 + if (ResetKeyCache)
5249 + zfHpResetKeyCache(dev);
5250 +
5251 + wd->ap.vapNumber--;
5252 + }
5253 +
5254 + /* stop beacon */
5255 + zfHpDisableBeacon(dev);
5256 +
5257 + /* Flush VTxQ and MmQ */
5258 + zfFlushVtxq(dev);
5259 + /* Flush AP PS queues */
5260 + zfApFlushBufferedPsFrame(dev);
5261 + /* Free buffer in defragment list*/
5262 + zfAgingDefragList(dev, 1);
5263 +
5264 + #ifdef ZM_ENABLE_AGGREGATION
5265 + /* add by honda */
5266 + zfAggRxFreeBuf(dev, 0); //1 for release structure memory
5267 + /* end of add by honda */
5268 + #endif
5269 +
5270 + // Clear the information for the peer stations of IBSS or AP of Station mode
5271 + zfZeroMemory((u8_t*)wd->sta.oppositeInfo, sizeof(struct zsOppositeInfo) * ZM_MAX_OPPOSITE_COUNT);
5272 +
5273 + /* Turn off Software WEP/TKIP */
5274 + if (wd->sta.SWEncryptEnable != 0)
5275 + {
5276 + zm_debug_msg0("Disable software encryption");
5277 + zfStaDisableSWEncryption(dev);
5278 + }
5279 +
5280 + /* Improve WEP/TKIP performace with HT AP, detail information please look bug#32495 */
5281 + //zfHpSetTTSIFSTime(dev, 0x8);
5282 +
5283 + return 0;
5284 +}
5285 +
5286 +u16_t zfiWlanSuspend(zdev_t* dev)
5287 +{
5288 + zmw_get_wlan_dev(dev);
5289 + zmw_declare_for_critical_section();
5290 +
5291 + // Change the HAL state to init so that any packet can't be transmitted between
5292 + // resume & HAL reinit. This would cause the chip hang issue in OTUS.
5293 + zmw_enter_critical_section(dev);
5294 + wd->halState = ZM_HAL_STATE_INIT;
5295 + zmw_leave_critical_section(dev);
5296 +
5297 + return 0;
5298 +}
5299 +
5300 +u16_t zfiWlanResume(zdev_t* dev, u8_t doReconn)
5301 +{
5302 + u16_t ret;
5303 + zmw_get_wlan_dev(dev);
5304 + zmw_declare_for_critical_section();
5305 +
5306 + /* Redownload firmware, Reinit MAC,PHY,RF */
5307 + zfHpReinit(dev, wd->frequency);
5308 +
5309 + //Set channel according to AP's configuration
5310 + zfCoreSetFrequencyExV2(dev, wd->frequency, wd->BandWidth40,
5311 + wd->ExtOffset, NULL, 1);
5312 +
5313 + zfHpSetMacAddress(dev, wd->macAddr, 0);
5314 +
5315 + /* Start Rx */
5316 + zfHpStartRecv(dev);
5317 +
5318 + zfFlushVtxq(dev);
5319 +
5320 + if ( wd->wlanMode != ZM_MODE_INFRASTRUCTURE &&
5321 + wd->wlanMode != ZM_MODE_IBSS )
5322 + {
5323 + return 1;
5324 + }
5325 +
5326 + zm_msg0_mm(ZM_LV_1, "Resume Wlan");
5327 + if ( (zfStaIsConnected(dev)) || (zfStaIsConnecting(dev)) )
5328 + {
5329 + if (doReconn == 1)
5330 + {
5331 + zm_msg0_mm(ZM_LV_1, "Re-connect...");
5332 + zmw_enter_critical_section(dev);
5333 + wd->sta.connectByReasso = FALSE;
5334 + zmw_leave_critical_section(dev);
5335 +
5336 + zfWlanEnable(dev);
5337 + }
5338 + else if (doReconn == 0)
5339 + {
5340 + zfHpSetRollCallTable(dev);
5341 + }
5342 + }
5343 +
5344 + ret = 0;
5345 +
5346 + return ret;
5347 +}
5348 +
5349 +/************************************************************************/
5350 +/* */
5351 +/* FUNCTION DESCRIPTION zfiWlanFlushAllQueuedBuffers */
5352 +/* Flush Virtual TxQ, MmQ, PS frames and defragment list */
5353 +/* */
5354 +/* INPUTS */
5355 +/* dev : device pointer */
5356 +/* */
5357 +/* OUTPUTS */
5358 +/* None */
5359 +/* */
5360 +/* AUTHOR */
5361 +/* Stephen Chen Atheros Communications, INC. 2007.1 */
5362 +/* */
5363 +/************************************************************************/
5364 +void zfiWlanFlushAllQueuedBuffers(zdev_t* dev)
5365 +{
5366 + /* Flush VTxQ and MmQ */
5367 + zfFlushVtxq(dev);
5368 + /* Flush AP PS queues */
5369 + zfApFlushBufferedPsFrame(dev);
5370 + /* Free buffer in defragment list*/
5371 + zfAgingDefragList(dev, 1);
5372 +}
5373 +
5374 +/* Do WLAN site survey */
5375 +u16_t zfiWlanScan(zdev_t* dev)
5376 +{
5377 + u16_t ret = 1;
5378 + zmw_get_wlan_dev(dev);
5379 +
5380 + zm_debug_msg0("");
5381 +
5382 + zmw_declare_for_critical_section();
5383 +
5384 + zmw_enter_critical_section(dev);
5385 +
5386 + if (wd->wlanMode == ZM_MODE_AP)
5387 + {
5388 + wd->heartBeatNotification |= ZM_BSSID_LIST_SCAN;
5389 + wd->sta.scanFrequency = 0;
5390 + //wd->sta.pUpdateBssList->bssCount = 0;
5391 + ret = 0;
5392 + }
5393 + else
5394 + {
5395 + #if 0
5396 + if ( !zfStaBlockWlanScan(dev) )
5397 + {
5398 + zm_debug_msg0("scan request");
5399 + //zfTimerSchedule(dev, ZM_EVENT_SCAN, ZM_TICK_ZERO);
5400 + ret = 0;
5401 + goto start_scan;
5402 + }
5403 + #else
5404 + goto start_scan;
5405 + #endif
5406 + }
5407 +
5408 + zmw_leave_critical_section(dev);
5409 +
5410 + return ret;
5411 +
5412 +start_scan:
5413 + zmw_leave_critical_section(dev);
5414 +
5415 + if(wd->ledStruct.LEDCtrlFlagFromReg & ZM_LED_CTRL_FLAG_ALPHA) // flag for Alpha
5416 + wd->ledStruct.LEDCtrlFlag |= ZM_LED_CTRL_FLAG_ALPHA;
5417 +
5418 + ret = zfScanMgrScanStart(dev, ZM_SCAN_MGR_SCAN_EXTERNAL);
5419 +
5420 + zm_debug_msg1("ret = ", ret);
5421 +
5422 + return ret;
5423 +}
5424 +
5425 +
5426 +/* rate */
5427 +/* 0 : AUTO */
5428 +/* 1 : CCK 1M */
5429 +/* 2 : CCK 2M */
5430 +/* 3 : CCK 5.5M */
5431 +/* 4 : CCK 11M */
5432 +/* 5 : OFDM 6M */
5433 +/* 6 : OFDM 9M */
5434 +/* 7 : OFDM 12M */
5435 +/* 8 : OFDM 18M */
5436 +/* 9 : OFDM 24M */
5437 +/* 10 : OFDM 36M */
5438 +/* 11 : OFDM 48M */
5439 +/* 12 : OFDM 54M */
5440 +/* 13 : MCS 0 */
5441 +/* 28 : MCS 15 */
5442 +u16_t zcRateToMCS[] =
5443 + {0xff, 0, 1, 2, 3, 0xb, 0xf, 0xa, 0xe, 0x9, 0xd, 0x8, 0xc};
5444 +u16_t zcRateToMT[] = {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1};
5445 +
5446 +u16_t zfiWlanSetTxRate(zdev_t* dev, u16_t rate)
5447 +{ // jhlee HT 0
5448 + zmw_get_wlan_dev(dev);
5449 +
5450 + if (rate <=12)
5451 + {
5452 + wd->txMCS = zcRateToMCS[rate];
5453 + wd->txMT = zcRateToMT[rate];
5454 + return ZM_SUCCESS;
5455 + }
5456 + else if ((rate<=28)||(rate==13+32))
5457 + {
5458 + wd->txMCS = rate - 12 - 1;
5459 + wd->txMT = 2;
5460 + return ZM_SUCCESS;
5461 + }
5462 +
5463 + return ZM_ERR_INVALID_TX_RATE;
5464 +}
5465 +
5466 +const u32_t zcRateIdToKbps40M[] =
5467 + {
5468 + 1000, 2000, 5500, 11000, /* 1M, 2M, 5M, 11M , 0 1 2 3*/
5469 + 6000, 9000, 12000, 18000, /* 6M 9M 12M 18M , 4 5 6 7*/
5470 + 24000, 36000, 48000, 54000, /* 24M 36M 48M 54M , 8 9 10 11*/
5471 + 13500, 27000, 40500, 54000, /* MCS0 MCS1 MCS2 MCS3 , 12 13 14 15*/
5472 + 81000, 108000, 121500, 135000, /* MCS4 MCS5 MCS6 MCS7 , 16 17 18 19*/
5473 + 27000, 54000, 81000, 108000, /* MCS8 MCS9 MCS10 MCS11 , 20 21 22 23*/
5474 + 162000, 216000, 243000, 270000, /* MCS12 MCS13 MCS14 MCS15 , 24 25 26 27*/
5475 + 270000, 300000, 150000 /* MCS14SG, MCS15SG, MCS7SG , 28 29 30*/
5476 + };
5477 +
5478 +const u32_t zcRateIdToKbps20M[] =
5479 + {
5480 + 1000, 2000, 5500, 11000, /* 1M, 2M, 5M, 11M , 0 1 2 3*/
5481 + 6000, 9000, 12000, 18000, /* 6M 9M 12M 18M , 4 5 6 7*/
5482 + 24000, 36000, 48000, 54000, /* 24M 36M 48M 54M , 8 9 10 11*/
5483 + 6500, 13000, 19500, 26000, /* MCS0 MCS1 MCS2 MCS3 , 12 13 14 15*/
5484 + 39000, 52000, 58500, 65000, /* MCS4 MCS5 MCS6 MCS7 , 16 17 18 19*/
5485 + 13000, 26000, 39000, 52000, /* MCS8 MCS9 MCS10 MCS11 , 20 21 22 23*/
5486 + 78000, 104000, 117000, 130000, /* MCS12 MCS13 MCS14 MCS15 , 24 25 26 27*/
5487 + 130000, 144400, 72200 /* MCS14SG, MCS15SG, MSG7SG , 28 29 30*/
5488 + };
5489 +
5490 +u32_t zfiWlanQueryTxRate(zdev_t* dev)
5491 +{
5492 + u8_t rateId = 0xff;
5493 + zmw_get_wlan_dev(dev);
5494 + zmw_declare_for_critical_section();
5495 +
5496 + /* If Tx rate had not been trained, return maximum Tx rate instead */
5497 + if ((wd->wlanMode == ZM_MODE_INFRASTRUCTURE) && (zfStaIsConnected(dev)))
5498 + {
5499 + zmw_enter_critical_section(dev);
5500 + //Not in fixed rate mode
5501 + if (wd->txMCS == 0xff)
5502 + {
5503 + if ((wd->sta.oppositeInfo[0].rcCell.flag & ZM_RC_TRAINED_BIT) == 0)
5504 + {
5505 + rateId = wd->sta.oppositeInfo[0].rcCell.operationRateSet[wd->sta.oppositeInfo[0].rcCell.operationRateCount-1];
5506 + }
5507 + else
5508 + {
5509 + rateId = wd->sta.oppositeInfo[0].rcCell.operationRateSet[wd->sta.oppositeInfo[0].rcCell.currentRateIndex];
5510 + }
5511 + }
5512 + zmw_leave_critical_section(dev);
5513 + }
5514 + if (rateId != 0xff)
5515 + {
5516 + if (wd->sta.htCtrlBandwidth)
5517 + {
5518 + return zcRateIdToKbps40M[rateId];
5519 + }
5520 + else
5521 + {
5522 + return zcRateIdToKbps20M[rateId];
5523 + }
5524 + }
5525 + else
5526 + {
5527 + return wd->CurrentTxRateKbps;
5528 + }
5529 +}
5530 +
5531 +void zfWlanUpdateRxRate(zdev_t* dev, struct zsAdditionInfo* addInfo)
5532 +{
5533 + u32_t rxRateKbps;
5534 + zmw_get_wlan_dev(dev);
5535 + //zm_msg1_mm(ZM_LV_0, "addInfo->Tail.Data.RxMacStatus =", addInfo->Tail.Data.RxMacStatus & 0x03);
5536 +
5537 + /* b5~b4: MPDU indication. */
5538 + /* 00: Single MPDU. */
5539 + /* 10: First MPDU of A-MPDU. */
5540 + /* 11: Middle MPDU of A-MPDU. */
5541 + /* 01: Last MPDU of A-MPDU. */
5542 + /* Only First MPDU and Single MPDU have PLCP header */
5543 + /* First MPDU : (mpduInd & 0x30) == 0x00 */
5544 + /* Single MPDU : (mpduInd & 0x30) == 0x20 */
5545 + if ((addInfo->Tail.Data.RxMacStatus & 0x10) == 0)
5546 + {
5547 + /* Modulation type */
5548 + wd->modulationType = addInfo->Tail.Data.RxMacStatus & 0x03;
5549 + switch(wd->modulationType)
5550 + {
5551 + case 0x0: wd->rateField = addInfo->PlcpHeader[0] & 0xff; //CCK mode
5552 + wd->rxInfo = 0;
5553 + break;
5554 + case 0x1: wd->rateField = addInfo->PlcpHeader[0] & 0x0f; //Legacy-OFDM mode
5555 + wd->rxInfo = 0;
5556 + break;
5557 + case 0x2: wd->rateField = addInfo->PlcpHeader[3]; //HT-OFDM mode
5558 + wd->rxInfo = addInfo->PlcpHeader[6];
5559 + break;
5560 + default: break;
5561 + }
5562 +
5563 + rxRateKbps = zfUpdateRxRate(dev);
5564 + if (wd->CurrentRxRateUpdated == 1)
5565 + {
5566 + if (rxRateKbps > wd->CurrentRxRateKbps)
5567 + {
5568 + wd->CurrentRxRateKbps = rxRateKbps;
5569 + }
5570 + }
5571 + else
5572 + {
5573 + wd->CurrentRxRateKbps = rxRateKbps;
5574 + wd->CurrentRxRateUpdated = 1;
5575 + }
5576 + }
5577 +}
5578 +#if 0
5579 +u16_t zcIndextoRateBG[16] = {1000, 2000, 5500, 11000, 0, 0, 0, 0, 48000,
5580 + 24000, 12000, 6000, 54000, 36000, 18000, 9000};
5581 +u32_t zcIndextoRateN20L[16] = {6500, 13000, 19500, 26000, 39000, 52000, 58500,
5582 + 65000, 13000, 26000, 39000, 52000, 78000, 104000,
5583 + 117000, 130000};
5584 +u32_t zcIndextoRateN20S[16] = {7200, 14400, 21700, 28900, 43300, 57800, 65000,
5585 + 72200, 14400, 28900, 43300, 57800, 86700, 115600,
5586 + 130000, 144400};
5587 +u32_t zcIndextoRateN40L[16] = {13500, 27000, 40500, 54000, 81000, 108000, 121500,
5588 + 135000, 27000, 54000, 81000, 108000, 162000, 216000,
5589 + 243000, 270000};
5590 +u32_t zcIndextoRateN40S[16] = {15000, 30000, 45000, 60000, 90000, 120000, 135000,
5591 + 150000, 30000, 60000, 90000, 120000, 180000, 240000,
5592 + 270000, 300000};
5593 +#endif
5594 +
5595 +extern u16_t zcIndextoRateBG[16];
5596 +extern u32_t zcIndextoRateN20L[16];
5597 +extern u32_t zcIndextoRateN20S[16];
5598 +extern u32_t zcIndextoRateN40L[16];
5599 +extern u32_t zcIndextoRateN40S[16];
5600 +
5601 +u32_t zfiWlanQueryRxRate(zdev_t* dev)
5602 +{
5603 + zmw_get_wlan_dev(dev);
5604 +
5605 + wd->CurrentRxRateUpdated = 0;
5606 + return wd->CurrentRxRateKbps;
5607 +}
5608 +
5609 +u32_t zfUpdateRxRate(zdev_t* dev)
5610 +{
5611 + u8_t mcs, bandwidth;
5612 + u32_t rxRateKbps = 130000;
5613 + zmw_get_wlan_dev(dev);
5614 +
5615 + switch (wd->modulationType)
5616 + {
5617 + case 0x0: //CCK mode
5618 + switch (wd->rateField)
5619 + {
5620 + case 0x0a: rxRateKbps = 1000;
5621 + break;
5622 + case 0x14: rxRateKbps = 2000;
5623 +
5624 + case 0x37: rxRateKbps = 5500;
5625 + break;
5626 + case 0x6e: rxRateKbps = 11000;
5627 + break;
5628 + default:
5629 + break;
5630 + }
5631 + break;
5632 + case 0x1: //Legacy-OFDM mode
5633 + if (wd->rateField <= 15)
5634 + {
5635 + rxRateKbps = zcIndextoRateBG[wd->rateField];
5636 + }
5637 + break;
5638 + case 0x2: //HT-OFDM mode
5639 + mcs = wd->rateField & 0x7F;
5640 + bandwidth = wd->rateField & 0x80;
5641 + if (mcs <= 15)
5642 + {
5643 + if (bandwidth != 0)
5644 + {
5645 + if((wd->rxInfo & 0x80) != 0)
5646 + {
5647 + /* Short GI 40 MHz MIMO Rate */
5648 + rxRateKbps = zcIndextoRateN40S[mcs];
5649 + }
5650 + else
5651 + {
5652 + /* Long GI 40 MHz MIMO Rate */
5653 + rxRateKbps = zcIndextoRateN40L[mcs];
5654 + }
5655 + }
5656 + else
5657 + {
5658 + if((wd->rxInfo & 0x80) != 0)
5659 + {
5660 + /* Short GI 20 MHz MIMO Rate */
5661 + rxRateKbps = zcIndextoRateN20S[mcs];
5662 + }
5663 + else
5664 + {
5665 + /* Long GI 20 MHz MIMO Rate */
5666 + rxRateKbps = zcIndextoRateN20L[mcs];
5667 + }
5668 + }
5669 + }
5670 + break;
5671 + default:
5672 + break;
5673 + }
5674 + //zm_msg1_mm(ZM_LV_0, "wd->CurrentRxRateKbps=", wd->CurrentRxRateKbps);
5675 +
5676 + // ToDo: use bandwith field to define 40MB
5677 + return rxRateKbps;
5678 +}
5679 +
5680 +/* Get WLAN stastics */
5681 +u16_t zfiWlanGetStatistics(zdev_t* dev)
5682 +{
5683 + /* Return link statistics */
5684 + return 0;
5685 +}
5686 +
5687 +u16_t zfiWlanReset(zdev_t* dev)
5688 +{
5689 + zmw_get_wlan_dev(dev);
5690 +
5691 + wd->state = ZM_WLAN_STATE_DISABLED;
5692 +
5693 + return zfWlanReset(dev);
5694 +}
5695 +
5696 +/* Reset WLAN */
5697 +u16_t zfWlanReset(zdev_t* dev)
5698 +{
5699 + u8_t isConnected;
5700 + zmw_get_wlan_dev(dev);
5701 +
5702 + zmw_declare_for_critical_section();
5703 +
5704 + zm_debug_msg0("zfWlanReset");
5705 +
5706 + isConnected = zfStaIsConnected(dev);
5707 +
5708 + //if ( wd->wlanMode != ZM_MODE_AP )
5709 + {
5710 + if ( (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)&&
5711 + (wd->sta.currentAuthMode != ZM_AUTH_MODE_WPA2) )
5712 + {
5713 + /* send deauthentication frame */
5714 + if (isConnected)
5715 + {
5716 + //zfiWlanDeauth(dev, NULL, 0);
5717 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, wd->sta.bssid, 3, 0, 0);
5718 + //zmw_debug_msg0("send a Deauth frame!");
5719 + }
5720 + }
5721 + }
5722 +
5723 + zfChangeAdapterState(dev, ZM_STA_STATE_DISCONNECT);
5724 + zfHpResetKeyCache(dev);
5725 +
5726 + if (isConnected)
5727 + {
5728 + //zfiWlanDisable(dev);
5729 + if (wd->zfcbConnectNotify != NULL)
5730 + {
5731 + wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_CONNECTION_RESET, wd->sta.bssid);
5732 + }
5733 + }
5734 + else
5735 + {
5736 + if (wd->zfcbConnectNotify != NULL)
5737 + {
5738 + wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_RESET, wd->sta.bssid);
5739 + }
5740 + }
5741 +
5742 + /* stop beacon */
5743 + zfHpDisableBeacon(dev);
5744 +
5745 + /* Free buffer in defragment list*/
5746 + zfAgingDefragList(dev, 1);
5747 +
5748 + /* Flush VTxQ and MmQ */
5749 + zfFlushVtxq(dev);
5750 +
5751 + #ifdef ZM_ENABLE_AGGREGATION
5752 + /* add by honda */
5753 + zfAggRxFreeBuf(dev, 0); //1 for release structure memory
5754 + /* end of add by honda */
5755 + #endif
5756 +
5757 + zfStaRefreshBlockList(dev, 1);
5758 +
5759 + zmw_enter_critical_section(dev);
5760 +
5761 + zfTimerCancel(dev, ZM_EVENT_IBSS_MONITOR);
5762 + zfTimerCancel(dev, ZM_EVENT_CM_BLOCK_TIMER);
5763 + zfTimerCancel(dev, ZM_EVENT_CM_DISCONNECT);
5764 +
5765 + wd->sta.connectState = ZM_STA_CONN_STATE_NONE;
5766 + wd->sta.connectByReasso = FALSE;
5767 + wd->sta.cmDisallowSsidLength = 0;
5768 + wd->sta.bAutoReconnect = 0;
5769 + wd->sta.InternalScanReq = 0;
5770 + wd->sta.encryMode = ZM_NO_WEP;
5771 + wd->sta.wepStatus = ZM_ENCRYPTION_WEP_DISABLED;
5772 + wd->sta.wpaState = ZM_STA_WPA_STATE_INIT;
5773 + wd->sta.cmMicFailureCount = 0;
5774 + wd->sta.ibssBssIsCreator = 0;
5775 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
5776 + wd->sta.ibssWpa2Psk = 0;
5777 +#endif
5778 + /* reset connect timeout counter */
5779 + wd->sta.connectTimeoutCount = 0;
5780 +
5781 + /* reset leap enable variable */
5782 + wd->sta.leapEnabled = 0;
5783 +
5784 + /* Reset the RIFS Status / RIFS-like frame count / RIFS count */
5785 + if( wd->sta.rifsState == ZM_RIFS_STATE_DETECTED )
5786 + zfHpDisableRifs(dev);
5787 + wd->sta.rifsState = ZM_RIFS_STATE_DETECTING;
5788 + wd->sta.rifsLikeFrameCnt = 0;
5789 + wd->sta.rifsCount = 0;
5790 +
5791 + wd->sta.osRxFilter = 0;
5792 + wd->sta.bSafeMode = 0;
5793 +
5794 + // Clear the information for the peer stations of IBSS or AP of Station mode
5795 + zfZeroMemory((u8_t*)wd->sta.oppositeInfo, sizeof(struct zsOppositeInfo) * ZM_MAX_OPPOSITE_COUNT);
5796 +
5797 + zmw_leave_critical_section(dev);
5798 +
5799 + zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
5800 + zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_EXTERNAL);
5801 +
5802 + /* Turn off Software WEP/TKIP */
5803 + if (wd->sta.SWEncryptEnable != 0)
5804 + {
5805 + zm_debug_msg0("Disable software encryption");
5806 + zfStaDisableSWEncryption(dev);
5807 + }
5808 +
5809 + /* Improve WEP/TKIP performace with HT AP, detail information please look bug#32495 */
5810 + //zfHpSetTTSIFSTime(dev, 0x8);
5811 +
5812 + /* Keep Pseudo mode */
5813 + if ( wd->wlanMode != ZM_MODE_PSEUDO )
5814 + {
5815 + wd->wlanMode = ZM_MODE_INFRASTRUCTURE;
5816 + }
5817 + return 0;
5818 +}
5819 +
5820 +/* Deauthenticate a STA */
5821 +u16_t zfiWlanDeauth(zdev_t* dev, u16_t* macAddr, u16_t reason)
5822 +{
5823 + zmw_get_wlan_dev(dev);
5824 +
5825 + if ( wd->wlanMode == ZM_MODE_AP )
5826 + {
5827 + //u16_t id;
5828 +
5829 + /*
5830 + * we will reset all key in zfHpResetKeyCache() when call
5831 + * zfiWlanDisable(), if we want to reset PairwiseKey for each sta,
5832 + * need to use a nullAddr to let keyindex not match.
5833 + * otherwise hardware will still find PairwiseKey when AP change
5834 + * encryption mode from WPA to WEP
5835 + */
5836 +
5837 + /*
5838 + if ((id = zfApFindSta(dev, macAddr)) != 0xffff)
5839 + {
5840 + u32_t key[8];
5841 + u16_t nullAddr[3] = { 0x0, 0x0, 0x0 };
5842 +
5843 + if (wd->ap.staTable[i].encryMode != ZM_NO_WEP)
5844 + {
5845 + zfHpSetApPairwiseKey(dev, nullAddr,
5846 + ZM_NO_WEP, &key[0], &key[4], i+1);
5847 + }
5848 + //zfHpSetApPairwiseKey(dev, (u16_t *)macAddr,
5849 + // ZM_NO_WEP, &key[0], &key[4], id+1);
5850 + wd->ap.staTable[id].encryMode = ZM_NO_WEP;
5851 + wd->ap.staTable[id].keyIdx = 0xff;
5852 + }
5853 + */
5854 +
5855 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, macAddr, reason, 0, 0);
5856 + }
5857 + else
5858 + {
5859 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, wd->sta.bssid, 3, 0, 0);
5860 + }
5861 +
5862 + /* Issue DEAUTH command to FW */
5863 + return 0;
5864 +}
5865 +
5866 +
5867 +/* XP packet filter feature : */
5868 +/* 1=>enable: All multicast address packets, not just the ones enumerated in the multicast address list. */
5869 +/* 0=>disable */
5870 +void zfiWlanSetAllMulticast(zdev_t* dev, u32_t setting)
5871 +{
5872 + zmw_get_wlan_dev(dev);
5873 + zm_msg1_mm(ZM_LV_0, "sta.bAllMulticast = ", setting);
5874 + wd->sta.bAllMulticast = (u8_t)setting;
5875 +}
5876 +
5877 +
5878 +/* HT configure API */
5879 +void zfiWlanSetHTCtrl(zdev_t* dev, u32_t *setting, u32_t forceTxTPC)
5880 +{
5881 + zmw_get_wlan_dev(dev);
5882 +
5883 + wd->preambleType = (u8_t)setting[0];
5884 + wd->sta.preambleTypeHT = (u8_t)setting[1];
5885 + wd->sta.htCtrlBandwidth = (u8_t)setting[2];
5886 + wd->sta.htCtrlSTBC = (u8_t)setting[3];
5887 + wd->sta.htCtrlSG = (u8_t)setting[4];
5888 + wd->sta.defaultTA = (u8_t)setting[5];
5889 + wd->enableAggregation = (u8_t)setting[6];
5890 + wd->enableWDS = (u8_t)setting[7];
5891 +
5892 + wd->forceTxTPC = forceTxTPC;
5893 +}
5894 +
5895 +/* FB50 in OS XP, RD private test code */
5896 +void zfiWlanQueryHTCtrl(zdev_t* dev, u32_t *setting, u32_t *forceTxTPC)
5897 +{
5898 + zmw_get_wlan_dev(dev);
5899 +
5900 + setting[0] = wd->preambleType;
5901 + setting[1] = wd->sta.preambleTypeHT;
5902 + setting[2] = wd->sta.htCtrlBandwidth;
5903 + setting[3] = wd->sta.htCtrlSTBC;
5904 + setting[4] = wd->sta.htCtrlSG;
5905 + setting[5] = wd->sta.defaultTA;
5906 + setting[6] = wd->enableAggregation;
5907 + setting[7] = wd->enableWDS;
5908 +
5909 + *forceTxTPC = wd->forceTxTPC;
5910 +}
5911 +
5912 +void zfiWlanDbg(zdev_t* dev, u8_t setting)
5913 +{
5914 + zmw_get_wlan_dev(dev);
5915 +
5916 + wd->enableHALDbgInfo = setting;
5917 +}
5918 +
5919 +/* FB50 in OS XP, RD private test code */
5920 +void zfiWlanSetRxPacketDump(zdev_t* dev, u32_t setting)
5921 +{
5922 + zmw_get_wlan_dev(dev);
5923 + if (setting)
5924 + {
5925 + wd->rxPacketDump = 1; /* enable */
5926 + }
5927 + else
5928 + {
5929 + wd->rxPacketDump = 0; /* disable */
5930 + }
5931 +}
5932 +
5933 +
5934 +/* FB50 in OS XP, RD private test code */
5935 +/* Tally */
5936 +void zfiWlanResetTally(zdev_t* dev)
5937 +{
5938 + zmw_get_wlan_dev(dev);
5939 +
5940 + zmw_declare_for_critical_section();
5941 +
5942 + zmw_enter_critical_section(dev);
5943 +
5944 + wd->commTally.txUnicastFrm = 0; //txUnicastFrames
5945 + wd->commTally.txMulticastFrm = 0; //txMulticastFrames
5946 + wd->commTally.txUnicastOctets = 0; //txUniOctets byte size
5947 + wd->commTally.txMulticastOctets = 0; //txMultiOctets byte size
5948 + wd->commTally.txFrmUpperNDIS = 0;
5949 + wd->commTally.txFrmDrvMgt = 0;
5950 + wd->commTally.RetryFailCnt = 0;
5951 + wd->commTally.Hw_TotalTxFrm = 0; //Hardware total Tx Frame
5952 + wd->commTally.Hw_RetryCnt = 0; //txMultipleRetriesFrames
5953 + wd->commTally.Hw_UnderrunCnt = 0;//
5954 + wd->commTally.DriverRxFrmCnt = 0;//
5955 + wd->commTally.rxUnicastFrm = 0; //rxUnicastFrames
5956 + wd->commTally.rxMulticastFrm = 0; //rxMulticastFrames
5957 + wd->commTally.NotifyNDISRxFrmCnt = 0;//
5958 + wd->commTally.rxUnicastOctets = 0; //rxUniOctets byte size
5959 + wd->commTally.rxMulticastOctets = 0; //rxMultiOctets byte size
5960 + wd->commTally.DriverDiscardedFrm = 0;// Discard by ValidateFrame
5961 + wd->commTally.LessThanDataMinLen = 0;//
5962 + wd->commTally.GreaterThanMaxLen = 0;//
5963 + wd->commTally.DriverDiscardedFrmCauseByMulticastList = 0;
5964 + wd->commTally.DriverDiscardedFrmCauseByFrmCtrl = 0;
5965 + wd->commTally.rxNeedFrgFrm = 0; // need more frg frm
5966 + wd->commTally.DriverRxMgtFrmCnt = 0;
5967 + wd->commTally.rxBroadcastFrm = 0; //Receive broadcast frame count
5968 + wd->commTally.rxBroadcastOctets = 0; //Receive broadcast frame byte size
5969 + wd->commTally.Hw_TotalRxFrm = 0;//
5970 + wd->commTally.Hw_CRC16Cnt = 0; //rxPLCPCRCErrCnt
5971 + wd->commTally.Hw_CRC32Cnt = 0; //rxCRC32ErrCnt
5972 + wd->commTally.Hw_DecrypErr_UNI = 0;//
5973 + wd->commTally.Hw_DecrypErr_Mul = 0;//
5974 + wd->commTally.Hw_RxFIFOOverrun = 0;//
5975 + wd->commTally.Hw_RxTimeOut = 0;
5976 + wd->commTally.LossAP = 0;//
5977 +
5978 + wd->commTally.Tx_MPDU = 0;
5979 + wd->commTally.BA_Fail = 0;
5980 + wd->commTally.Hw_Tx_AMPDU = 0;
5981 + wd->commTally.Hw_Tx_MPDU = 0;
5982 +
5983 + wd->commTally.txQosDropCount[0] = 0;
5984 + wd->commTally.txQosDropCount[1] = 0;
5985 + wd->commTally.txQosDropCount[2] = 0;
5986 + wd->commTally.txQosDropCount[3] = 0;
5987 + wd->commTally.txQosDropCount[4] = 0;
5988 +
5989 + wd->commTally.Hw_RxMPDU = 0;
5990 + wd->commTally.Hw_RxDropMPDU = 0;
5991 + wd->commTally.Hw_RxDelMPDU = 0;
5992 +
5993 + wd->commTally.Hw_RxPhyMiscError = 0;
5994 + wd->commTally.Hw_RxPhyXRError = 0;
5995 + wd->commTally.Hw_RxPhyOFDMError = 0;
5996 + wd->commTally.Hw_RxPhyCCKError = 0;
5997 + wd->commTally.Hw_RxPhyHTError = 0;
5998 + wd->commTally.Hw_RxPhyTotalCount = 0;
5999 +
6000 +#if (defined(GCCK) && defined(OFDM))
6001 + wd->commTally.rx11bDataFrame = 0;
6002 + wd->commTally.rxOFDMDataFrame = 0;
6003 +#endif
6004 +
6005 + zmw_leave_critical_section(dev);
6006 +}
6007 +
6008 +/* FB50 in OS XP, RD private test code */
6009 +void zfiWlanQueryTally(zdev_t* dev, struct zsCommTally *tally)
6010 +{
6011 + zmw_get_wlan_dev(dev);
6012 +
6013 + zmw_declare_for_critical_section();
6014 +
6015 + zmw_enter_critical_section(dev);
6016 + zfMemoryCopy((u8_t*)tally, (u8_t*)&wd->commTally, sizeof(struct zsCommTally));
6017 + zmw_leave_critical_section(dev);
6018 +}
6019 +void zfiWlanQueryTrafTally(zdev_t* dev, struct zsTrafTally *tally)
6020 +{
6021 + zmw_get_wlan_dev(dev);
6022 +
6023 + zmw_declare_for_critical_section();
6024 +
6025 + zmw_enter_critical_section(dev);
6026 + zfMemoryCopy((u8_t*)tally, (u8_t*)&wd->trafTally, sizeof(struct zsTrafTally));
6027 + zmw_leave_critical_section(dev);
6028 +}
6029 +
6030 +void zfiWlanQueryMonHalRxInfo(zdev_t* dev, struct zsMonHalRxInfo *monHalRxInfo)
6031 +{
6032 + zfHpQueryMonHalRxInfo(dev, (u8_t *)monHalRxInfo);
6033 +}
6034 +
6035 +/* parse the modeMDKEnable to DrvCore */
6036 +void zfiDKEnable(zdev_t* dev, u32_t enable)
6037 +{
6038 + zmw_get_wlan_dev(dev);
6039 +
6040 + wd->modeMDKEnable = enable;
6041 + zm_debug_msg1("modeMDKEnable = ", wd->modeMDKEnable);
6042 +}
6043 +
6044 +/* airoPeek */
6045 +u32_t zfiWlanQueryPacketTypePromiscuous(zdev_t* dev)
6046 +{
6047 + zmw_get_wlan_dev(dev);
6048 +
6049 + return wd->swSniffer;
6050 +}
6051 +
6052 +/* airoPeek */
6053 +void zfiWlanSetPacketTypePromiscuous(zdev_t* dev, u32_t setValue)
6054 +{
6055 + zmw_get_wlan_dev(dev);
6056 +
6057 + wd->swSniffer = setValue;
6058 + zm_msg1_mm(ZM_LV_0, "wd->swSniffer ", wd->swSniffer);
6059 + if (setValue)
6060 + {
6061 + /* write register for sniffer mode */
6062 + zfHpSetSnifferMode(dev, 1);
6063 + zm_msg0_mm(ZM_LV_1, "enalbe sniffer mode");
6064 + }
6065 + else
6066 + {
6067 + zfHpSetSnifferMode(dev, 0);
6068 + zm_msg0_mm(ZM_LV_0, "disalbe sniffer mode");
6069 + }
6070 +}
6071 +
6072 +void zfiWlanSetXLinkMode(zdev_t* dev, u32_t setValue)
6073 +{
6074 + zmw_get_wlan_dev(dev);
6075 +
6076 + wd->XLinkMode = setValue;
6077 + if (setValue)
6078 + {
6079 + /* write register for sniffer mode */
6080 + zfHpSetSnifferMode(dev, 1);
6081 + }
6082 + else
6083 + {
6084 + zfHpSetSnifferMode(dev, 0);
6085 + }
6086 +}
6087 +
6088 +extern void zfStaChannelManagement(zdev_t* dev, u8_t scan);
6089 +void zfiSetChannelManagement(zdev_t* dev, u32_t setting)
6090 +{
6091 + zmw_get_wlan_dev(dev);
6092 +
6093 + switch (setting)
6094 + {
6095 + case 1:
6096 + wd->sta.EnableHT = 1;
6097 + wd->BandWidth40 = 1;
6098 + wd->ExtOffset = 1;
6099 + break;
6100 + case 3:
6101 + wd->sta.EnableHT = 1;
6102 + wd->BandWidth40 = 1;
6103 + wd->ExtOffset = 3;
6104 + break;
6105 + case 0:
6106 + wd->sta.EnableHT = 1;
6107 + wd->BandWidth40 = 0;
6108 + wd->ExtOffset = 0;
6109 + break;
6110 + default:
6111 + wd->BandWidth40 = 0;
6112 + wd->ExtOffset = 0;
6113 + break;
6114 +
6115 + }
6116 + zfCoreSetFrequencyEx(dev, wd->frequency, wd->BandWidth40,
6117 + wd->ExtOffset, NULL);
6118 +}
6119 +
6120 +void zfiSetRifs(zdev_t* dev, u16_t setting)
6121 +{
6122 + zmw_get_wlan_dev(dev);
6123 +
6124 + wd->sta.ie.HtInfo.ChannelInfo |= ExtHtCap_RIFSMode;
6125 + wd->sta.EnableHT = 1;
6126 + switch (setting)
6127 + {
6128 + case 0:
6129 + wd->sta.HT2040 = 0;
6130 +// zfHpSetRifs(dev, 1, 0, (wd->sta.currentFrequency < 3000)? 1:0);
6131 + break;
6132 + case 1:
6133 + wd->sta.HT2040 = 1;
6134 +// zfHpSetRifs(dev, 1, 1, (wd->sta.currentFrequency < 3000)? 1:0);
6135 + break;
6136 + default:
6137 + wd->sta.HT2040 = 0;
6138 +// zfHpSetRifs(dev, 1, 0, (wd->sta.currentFrequency < 3000)? 1:0);
6139 + break;
6140 + }
6141 +}
6142 +
6143 +void zfiCheckRifs(zdev_t* dev)
6144 +{
6145 + zmw_get_wlan_dev(dev);
6146 +
6147 + if(wd->sta.ie.HtInfo.ChannelInfo & ExtHtCap_RIFSMode)
6148 + {
6149 +// zfHpSetRifs(dev, wd->sta.EnableHT, wd->sta.HT2040, (wd->sta.currentFrequency < 3000)? 1:0);
6150 + }
6151 +}
6152 +
6153 +void zfiSetReorder(zdev_t* dev, u16_t value)
6154 +{
6155 + zmw_get_wlan_dev(dev);
6156 +
6157 + wd->reorder = value;
6158 +}
6159 +
6160 +void zfiSetSeqDebug(zdev_t* dev, u16_t value)
6161 +{
6162 + zmw_get_wlan_dev(dev);
6163 +
6164 + wd->seq_debug = value;
6165 +}
6166 --- /dev/null
6167 +++ b/drivers/staging/otus/80211core/cfunc.c
6168 @@ -0,0 +1,1227 @@
6169 +/*
6170 + * Copyright (c) 2007-2008 Atheros Communications Inc.
6171 + *
6172 + * Permission to use, copy, modify, and/or distribute this software for any
6173 + * purpose with or without fee is hereby granted, provided that the above
6174 + * copyright notice and this permission notice appear in all copies.
6175 + *
6176 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
6177 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
6178 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
6179 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
6180 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
6181 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
6182 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
6183 + */
6184 +
6185 +#include "cprecomp.h"
6186 +
6187 +u8_t zfQueryOppositeRate(zdev_t* dev, u8_t dst_mac[6], u8_t frameType)
6188 +{
6189 + zmw_get_wlan_dev(dev);
6190 +
6191 + /* For AP's rate adaption */
6192 + if ( wd->wlanMode == ZM_MODE_AP )
6193 + {
6194 + return 0;
6195 + }
6196 +
6197 + /* For STA's rate adaption */
6198 + if ( (frameType & 0x0c) == ZM_WLAN_DATA_FRAME )
6199 + {
6200 + if ( ZM_IS_MULTICAST(dst_mac) )
6201 + {
6202 + return wd->sta.mTxRate;
6203 + }
6204 + else
6205 + {
6206 + return wd->sta.uTxRate;
6207 + }
6208 + }
6209 +
6210 + return wd->sta.mmTxRate;
6211 +}
6212 +
6213 +void zfCopyToIntTxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* src,
6214 + u16_t offset, u16_t length)
6215 +{
6216 + u16_t i;
6217 +
6218 + for(i=0; i<length;i++)
6219 + {
6220 + zmw_tx_buf_writeb(dev, buf, offset+i, src[i]);
6221 + }
6222 +}
6223 +
6224 +void zfCopyToRxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* src,
6225 + u16_t offset, u16_t length)
6226 +{
6227 + u16_t i;
6228 +
6229 + for(i=0; i<length;i++)
6230 + {
6231 + zmw_rx_buf_writeb(dev, buf, offset+i, src[i]);
6232 + }
6233 +}
6234 +
6235 +void zfCopyFromIntTxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* dst,
6236 + u16_t offset, u16_t length)
6237 +{
6238 + u16_t i;
6239 +
6240 + for(i=0; i<length; i++)
6241 + {
6242 + dst[i] = zmw_tx_buf_readb(dev, buf, offset+i);
6243 + }
6244 +}
6245 +
6246 +void zfCopyFromRxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* dst,
6247 + u16_t offset, u16_t length)
6248 +{
6249 + u16_t i;
6250 +
6251 + for(i=0; i<length; i++)
6252 + {
6253 + dst[i] = zmw_rx_buf_readb(dev, buf, offset+i);
6254 + }
6255 +}
6256 +
6257 +#if 1
6258 +void zfMemoryCopy(u8_t* dst, u8_t* src, u16_t length)
6259 +{
6260 + zfwMemoryCopy(dst, src, length);
6261 +}
6262 +
6263 +void zfMemoryMove(u8_t* dst, u8_t* src, u16_t length)
6264 +{
6265 + zfwMemoryMove(dst, src, length);
6266 +}
6267 +
6268 +void zfZeroMemory(u8_t* va, u16_t length)
6269 +{
6270 + zfwZeroMemory(va, length);
6271 +}
6272 +
6273 +u8_t zfMemoryIsEqual(u8_t* m1, u8_t* m2, u16_t length)
6274 +{
6275 + return zfwMemoryIsEqual(m1, m2, length);
6276 +}
6277 +#endif
6278 +
6279 +u8_t zfRxBufferEqualToStr(zdev_t* dev, zbuf_t* buf,
6280 + const u8_t* str, u16_t offset, u16_t length)
6281 +{
6282 + u16_t i;
6283 + u8_t ch;
6284 +
6285 + for(i=0; i<length; i++)
6286 + {
6287 + ch = zmw_rx_buf_readb(dev, buf, offset+i);
6288 + if ( ch != str[i] )
6289 + {
6290 + return FALSE;
6291 + }
6292 + }
6293 +
6294 + return TRUE;
6295 +}
6296 +
6297 +void zfTxBufferCopy(zdev_t*dev, zbuf_t* dst, zbuf_t* src,
6298 + u16_t dstOffset, u16_t srcOffset, u16_t length)
6299 +{
6300 + u16_t i;
6301 +
6302 + for(i=0; i<length; i++)
6303 + {
6304 + zmw_tx_buf_writeb(dev, dst, dstOffset+i,
6305 + zmw_tx_buf_readb(dev, src, srcOffset+i));
6306 + }
6307 +}
6308 +
6309 +void zfRxBufferCopy(zdev_t*dev, zbuf_t* dst, zbuf_t* src,
6310 + u16_t dstOffset, u16_t srcOffset, u16_t length)
6311 +{
6312 + u16_t i;
6313 +
6314 + for(i=0; i<length; i++)
6315 + {
6316 + zmw_rx_buf_writeb(dev, dst, dstOffset+i,
6317 + zmw_rx_buf_readb(dev, src, srcOffset+i));
6318 + }
6319 +}
6320 +
6321 +
6322 +void zfCollectHWTally(zdev_t*dev, u32_t* rsp, u8_t id)
6323 +{
6324 + zmw_get_wlan_dev(dev);
6325 +
6326 + zmw_declare_for_critical_section();
6327 +
6328 + zmw_enter_critical_section(dev);
6329 +
6330 + if (id == 0)
6331 + {
6332 + wd->commTally.Hw_UnderrunCnt += (0xFFFF & rsp[1]);
6333 + wd->commTally.Hw_TotalRxFrm += rsp[2];
6334 + wd->commTally.Hw_CRC32Cnt += rsp[3];
6335 + wd->commTally.Hw_CRC16Cnt += rsp[4];
6336 + #ifdef ZM_ENABLE_NATIVE_WIFI
6337 + /* These code are here to satisfy Vista DTM */
6338 + wd->commTally.Hw_DecrypErr_UNI += ((rsp[5]>50) && (rsp[5]<60))?50:rsp[5];
6339 + #else
6340 + wd->commTally.Hw_DecrypErr_UNI += rsp[5];
6341 + #endif
6342 + wd->commTally.Hw_RxFIFOOverrun += rsp[6];
6343 + wd->commTally.Hw_DecrypErr_Mul += rsp[7];
6344 + wd->commTally.Hw_RetryCnt += rsp[8];
6345 + wd->commTally.Hw_TotalTxFrm += rsp[9];
6346 + wd->commTally.Hw_RxTimeOut +=rsp[10];
6347 +
6348 + wd->commTally.Tx_MPDU += rsp[11];
6349 + wd->commTally.BA_Fail += rsp[12];
6350 + wd->commTally.Hw_Tx_AMPDU += rsp[13];
6351 + wd->commTally.Hw_Tx_MPDU += rsp[14];
6352 + wd->commTally.RateCtrlTxMPDU += rsp[11];
6353 + wd->commTally.RateCtrlBAFail += rsp[12];
6354 + }
6355 + else
6356 + {
6357 + wd->commTally.Hw_RxMPDU += rsp[1];
6358 + wd->commTally.Hw_RxDropMPDU += rsp[2];
6359 + wd->commTally.Hw_RxDelMPDU += rsp[3];
6360 +
6361 + wd->commTally.Hw_RxPhyMiscError += rsp[4];
6362 + wd->commTally.Hw_RxPhyXRError += rsp[5];
6363 + wd->commTally.Hw_RxPhyOFDMError += rsp[6];
6364 + wd->commTally.Hw_RxPhyCCKError += rsp[7];
6365 + wd->commTally.Hw_RxPhyHTError += rsp[8];
6366 + wd->commTally.Hw_RxPhyTotalCount += rsp[9];
6367 + }
6368 +
6369 + zmw_leave_critical_section(dev);
6370 +
6371 + if (id == 0)
6372 + {
6373 + zm_msg1_mm(ZM_LV_1, "rsplen =", rsp[0]);
6374 + zm_msg1_mm(ZM_LV_1, "Hw_UnderrunCnt = ", (0xFFFF & rsp[1]));
6375 + zm_msg1_mm(ZM_LV_1, "Hw_TotalRxFrm = ", rsp[2]);
6376 + zm_msg1_mm(ZM_LV_1, "Hw_CRC32Cnt = ", rsp[3]);
6377 + zm_msg1_mm(ZM_LV_1, "Hw_CRC16Cnt = ", rsp[4]);
6378 + zm_msg1_mm(ZM_LV_1, "Hw_DecrypErr_UNI = ", rsp[5]);
6379 + zm_msg1_mm(ZM_LV_1, "Hw_RxFIFOOverrun = ", rsp[6]);
6380 + zm_msg1_mm(ZM_LV_1, "Hw_DecrypErr_Mul = ", rsp[7]);
6381 + zm_msg1_mm(ZM_LV_1, "Hw_RetryCnt = ", rsp[8]);
6382 + zm_msg1_mm(ZM_LV_1, "Hw_TotalTxFrm = ", rsp[9]);
6383 + zm_msg1_mm(ZM_LV_1, "Hw_RxTimeOut = ", rsp[10]);
6384 + zm_msg1_mm(ZM_LV_1, "Tx_MPDU = ", rsp[11]);
6385 + zm_msg1_mm(ZM_LV_1, "BA_Fail = ", rsp[12]);
6386 + zm_msg1_mm(ZM_LV_1, "Hw_Tx_AMPDU = ", rsp[13]);
6387 + zm_msg1_mm(ZM_LV_1, "Hw_Tx_MPDU = ", rsp[14]);
6388 + }
6389 + else
6390 + {
6391 + zm_msg1_mm(ZM_LV_1, "rsplen = ", rsp[0]);
6392 + zm_msg1_mm(ZM_LV_1, "Hw_RxMPDU = ", (0xFFFF & rsp[1]));
6393 + zm_msg1_mm(ZM_LV_1, "Hw_RxDropMPDU = ", rsp[2]);
6394 + zm_msg1_mm(ZM_LV_1, "Hw_RxDelMPDU = ", rsp[3]);
6395 + zm_msg1_mm(ZM_LV_1, "Hw_RxPhyMiscError = ", rsp[4]);
6396 + zm_msg1_mm(ZM_LV_1, "Hw_RxPhyXRError = ", rsp[5]);
6397 + zm_msg1_mm(ZM_LV_1, "Hw_RxPhyOFDMError = ", rsp[6]);
6398 + zm_msg1_mm(ZM_LV_1, "Hw_RxPhyCCKError = ", rsp[7]);
6399 + zm_msg1_mm(ZM_LV_1, "Hw_RxPhyHTError = ", rsp[8]);
6400 + zm_msg1_mm(ZM_LV_1, "Hw_RxPhyTotalCount = ", rsp[9]);
6401 + }
6402 +
6403 +}
6404 +
6405 +/* Timer related functions */
6406 +void zfTimerInit(zdev_t* dev)
6407 +{
6408 + u8_t i;
6409 +
6410 + zmw_get_wlan_dev(dev);
6411 +
6412 + zm_debug_msg0("");
6413 +
6414 + wd->timerList.freeCount = ZM_MAX_TIMER_COUNT;
6415 + wd->timerList.head = &(wd->timerList.list[0]);
6416 + wd->timerList.tail = &(wd->timerList.list[ZM_MAX_TIMER_COUNT-1]);
6417 + wd->timerList.head->pre = NULL;
6418 + wd->timerList.head->next = &(wd->timerList.list[1]);
6419 + wd->timerList.tail->pre = &(wd->timerList.list[ZM_MAX_TIMER_COUNT-2]);
6420 + wd->timerList.tail->next = NULL;
6421 +
6422 + for( i=1; i<(ZM_MAX_TIMER_COUNT-1); i++ )
6423 + {
6424 + wd->timerList.list[i].pre = &(wd->timerList.list[i-1]);
6425 + wd->timerList.list[i].next = &(wd->timerList.list[i+1]);
6426 + }
6427 +
6428 + wd->bTimerReady = TRUE;
6429 +}
6430 +
6431 +
6432 +u16_t zfTimerSchedule(zdev_t* dev, u16_t event, u32_t tick)
6433 +{
6434 + struct zsTimerEntry *pFreeEntry;
6435 + struct zsTimerEntry *pEntry;
6436 + u8_t i, count;
6437 +
6438 + zmw_get_wlan_dev(dev);
6439 +
6440 + if ( wd->timerList.freeCount == 0 )
6441 + {
6442 + zm_debug_msg0("no more timer");
6443 + return 1;
6444 + }
6445 +
6446 + //zm_debug_msg2("event = ", event);
6447 + //zm_debug_msg1("target tick = ", wd->tick + tick);
6448 +
6449 + count = ZM_MAX_TIMER_COUNT - wd->timerList.freeCount;
6450 +
6451 + if ( count == 0 )
6452 + {
6453 + wd->timerList.freeCount--;
6454 + wd->timerList.head->event = event;
6455 + wd->timerList.head->timer = wd->tick + tick;
6456 + //zm_debug_msg1("free timer count = ", wd->timerList.freeCount);
6457 +
6458 + return 0;
6459 + }
6460 +
6461 + pFreeEntry = wd->timerList.tail;
6462 + pFreeEntry->timer = wd->tick + tick;
6463 + pFreeEntry->event = event;
6464 + wd->timerList.tail = pFreeEntry->pre;
6465 + pEntry = wd->timerList.head;
6466 +
6467 + for( i=0; i<count; i++ )
6468 + {
6469 + // prevent from the case of tick overflow
6470 + if ( ( pEntry->timer > pFreeEntry->timer )&&
6471 + ((pEntry->timer - pFreeEntry->timer) < 1000000000) )
6472 + {
6473 + if ( i != 0 )
6474 + {
6475 + pFreeEntry->pre = pEntry->pre;
6476 + pFreeEntry->pre->next = pFreeEntry;
6477 + }
6478 + else
6479 + {
6480 + pFreeEntry->pre = NULL;
6481 + }
6482 +
6483 + pEntry->pre = pFreeEntry;
6484 + pFreeEntry->next = pEntry;
6485 + break;
6486 + }
6487 +
6488 + pEntry = pEntry->next;
6489 + }
6490 +
6491 + if ( i == 0 )
6492 + {
6493 + wd->timerList.head = pFreeEntry;
6494 + }
6495 +
6496 + if ( i == count )
6497 + {
6498 + pFreeEntry->pre = pEntry->pre;
6499 + pFreeEntry->pre->next = pFreeEntry;
6500 + pEntry->pre = pFreeEntry;
6501 + pFreeEntry->next = pEntry;
6502 + }
6503 +
6504 + wd->timerList.freeCount--;
6505 + //zm_debug_msg1("free timer count = ", wd->timerList.freeCount);
6506 +
6507 + return 0;
6508 +}
6509 +
6510 +u16_t zfTimerCancel(zdev_t* dev, u16_t event)
6511 +{
6512 + struct zsTimerEntry *pEntry;
6513 + u8_t i, count;
6514 +
6515 + zmw_get_wlan_dev(dev);
6516 +
6517 + //zm_debug_msg2("event = ", event);
6518 + //zm_debug_msg1("free timer count(b) = ", wd->timerList.freeCount);
6519 +
6520 + pEntry = wd->timerList.head;
6521 + count = ZM_MAX_TIMER_COUNT - wd->timerList.freeCount;
6522 +
6523 + for( i=0; i<count; i++ )
6524 + {
6525 + if ( pEntry->event == event )
6526 + {
6527 + if ( pEntry == wd->timerList.head )
6528 + { /* remove head entry */
6529 + wd->timerList.head = pEntry->next;
6530 + wd->timerList.tail->next = pEntry;
6531 + pEntry->pre = wd->timerList.tail;
6532 + wd->timerList.tail = pEntry;
6533 + pEntry = wd->timerList.head;
6534 + }
6535 + else
6536 + { /* remove non-head entry */
6537 + pEntry->pre->next = pEntry->next;
6538 + pEntry->next->pre = pEntry->pre;
6539 + wd->timerList.tail->next = pEntry;
6540 + pEntry->pre = wd->timerList.tail;
6541 + wd->timerList.tail = pEntry;
6542 + pEntry = pEntry->next;
6543 + }
6544 +
6545 + wd->timerList.freeCount++;
6546 + }
6547 + else
6548 + {
6549 + pEntry = pEntry->next;
6550 + }
6551 + }
6552 +
6553 + //zm_debug_msg1("free timer count(a) = ", wd->timerList.freeCount);
6554 +
6555 + return 0;
6556 +}
6557 +
6558 +void zfTimerClear(zdev_t* dev)
6559 +{
6560 + zmw_get_wlan_dev(dev);
6561 +
6562 + wd->timerList.freeCount = ZM_MAX_TIMER_COUNT;
6563 +}
6564 +
6565 +u16_t zfTimerCheckAndHandle(zdev_t* dev)
6566 +{
6567 + struct zsTimerEntry *pEntry;
6568 + struct zsTimerEntry *pTheLastEntry = NULL;
6569 + u16_t event[ZM_MAX_TIMER_COUNT];
6570 + u8_t i, j=0, count;
6571 +
6572 + zmw_get_wlan_dev(dev);
6573 +
6574 + zmw_declare_for_critical_section();
6575 +
6576 + if ( !wd->bTimerReady )
6577 + {
6578 + return 0;
6579 + }
6580 +
6581 + zmw_enter_critical_section(dev);
6582 +
6583 + pEntry = wd->timerList.head;
6584 + count = ZM_MAX_TIMER_COUNT - wd->timerList.freeCount;
6585 +
6586 + for( i=0; i<count; i++ )
6587 + {
6588 + // prevent from the case of tick overflow
6589 + if ( ( pEntry->timer > wd->tick )&&
6590 + ((pEntry->timer - wd->tick) < 1000000000) )
6591 + {
6592 + break;
6593 + }
6594 +
6595 + event[j++] = pEntry->event;
6596 + pTheLastEntry = pEntry;
6597 + pEntry = pEntry->next;
6598 + }
6599 +
6600 + if ( j > 0 )
6601 + {
6602 + wd->timerList.tail->next = wd->timerList.head;
6603 + wd->timerList.head->pre = wd->timerList.tail;
6604 + wd->timerList.head = pEntry;
6605 + wd->timerList.tail = pTheLastEntry;
6606 + wd->timerList.freeCount += j;
6607 + //zm_debug_msg1("free timer count = ", wd->timerList.freeCount);
6608 + }
6609 +
6610 + zmw_leave_critical_section(dev);
6611 +
6612 + zfProcessEvent(dev, event, j);
6613 +
6614 + return 0;
6615 +}
6616 +
6617 +u32_t zfCoreSetKey(zdev_t* dev, u8_t user, u8_t keyId, u8_t type,
6618 + u16_t* mac, u32_t* key)
6619 +{
6620 + u32_t ret;
6621 +
6622 + zmw_get_wlan_dev(dev);
6623 + zmw_declare_for_critical_section();
6624 +
6625 + zmw_enter_critical_section(dev);
6626 + wd->sta.flagKeyChanging++;
6627 + zm_debug_msg1(" zfCoreSetKey++++ ", wd->sta.flagKeyChanging);
6628 + zmw_leave_critical_section(dev);
6629 +
6630 + ret = zfHpSetKey(dev, user, keyId, type, mac, key);
6631 + return ret;
6632 +}
6633 +
6634 +void zfCoreSetKeyComplete(zdev_t* dev)
6635 +{
6636 + zmw_get_wlan_dev(dev);
6637 + zmw_declare_for_critical_section();
6638 +
6639 +#if 0
6640 + wd->sta.flagKeyChanging = 0;
6641 +#else
6642 + if(wd->sta.flagKeyChanging)
6643 + {
6644 + zmw_enter_critical_section(dev);
6645 + wd->sta.flagKeyChanging--;
6646 + zmw_leave_critical_section(dev);
6647 + }
6648 +#endif
6649 + zm_debug_msg1(" zfCoreSetKeyComplete--- ", wd->sta.flagKeyChanging);
6650 +
6651 + zfPushVtxq(dev);
6652 +}
6653 +
6654 +void zfCoreHalInitComplete(zdev_t* dev)
6655 +{
6656 + zmw_get_wlan_dev(dev);
6657 + zmw_declare_for_critical_section();
6658 +
6659 + zmw_enter_critical_section(dev);
6660 + wd->halState = ZM_HAL_STATE_RUNNING;
6661 + zmw_leave_critical_section(dev);
6662 +
6663 + zfPushVtxq(dev);
6664 +}
6665 +
6666 +void zfCoreMacAddressNotify(zdev_t* dev, u8_t* addr)
6667 +{
6668 + zmw_get_wlan_dev(dev);
6669 +
6670 + wd->macAddr[0] = addr[0] | ((u16_t)addr[1]<<8);
6671 + wd->macAddr[1] = addr[2] | ((u16_t)addr[3]<<8);
6672 + wd->macAddr[2] = addr[4] | ((u16_t)addr[5]<<8);
6673 +
6674 +
6675 + //zfHpSetMacAddress(dev, wd->macAddr, 0);
6676 + if (wd->zfcbMacAddressNotify != NULL)
6677 + {
6678 + wd->zfcbMacAddressNotify(dev, addr);
6679 + }
6680 +}
6681 +
6682 +void zfCoreSetIsoName(zdev_t* dev, u8_t* isoName)
6683 +{
6684 + zmw_get_wlan_dev(dev);
6685 +
6686 + wd->ws.countryIsoName[0] = isoName[0];
6687 + wd->ws.countryIsoName[1] = isoName[1];
6688 + wd->ws.countryIsoName[2] = '\0';
6689 + }
6690 +
6691 +
6692 +extern void zfScanMgrScanEventStart(zdev_t* dev);
6693 +extern u8_t zfScanMgrScanEventTimeout(zdev_t* dev);
6694 +extern void zfScanMgrScanEventRetry(zdev_t* dev);
6695 +
6696 +void zfProcessEvent(zdev_t* dev, u16_t* eventArray, u8_t eventCount)
6697 +{
6698 + u8_t i, j, bypass = FALSE;
6699 + u16_t eventBypass[32];
6700 + u8_t eventBypassCount = 0;
6701 +
6702 + zmw_get_wlan_dev(dev);
6703 +
6704 + zmw_declare_for_critical_section();
6705 +
6706 + zfZeroMemory((u8_t*) eventBypass, 64);
6707 +
6708 + for( i=0; i<eventCount; i++ )
6709 + {
6710 + for( j=0; j<eventBypassCount; j++ )
6711 + {
6712 + if ( eventBypass[j] == eventArray[i] )
6713 + {
6714 + bypass = TRUE;
6715 + break;
6716 + }
6717 + }
6718 +
6719 + if ( bypass )
6720 + {
6721 + continue;
6722 + }
6723 +
6724 + switch( eventArray[i] )
6725 + {
6726 + case ZM_EVENT_SCAN:
6727 + {
6728 + zfScanMgrScanEventStart(dev);
6729 + eventBypass[eventBypassCount++] = ZM_EVENT_IN_SCAN;
6730 + eventBypass[eventBypassCount++] = ZM_EVENT_TIMEOUT_SCAN;
6731 + }
6732 + break;
6733 +
6734 + case ZM_EVENT_TIMEOUT_SCAN:
6735 + {
6736 + u8_t res;
6737 +
6738 + res = zfScanMgrScanEventTimeout(dev);
6739 + if ( res == 0 )
6740 + {
6741 + eventBypass[eventBypassCount++] = ZM_EVENT_TIMEOUT_SCAN;
6742 + }
6743 + else if ( res == 1 )
6744 + {
6745 + eventBypass[eventBypassCount++] = ZM_EVENT_IN_SCAN;
6746 + }
6747 + }
6748 + break;
6749 +
6750 + case ZM_EVENT_IBSS_MONITOR:
6751 + {
6752 + zfStaIbssMonitoring(dev, 0);
6753 + }
6754 + break;
6755 +
6756 + case ZM_EVENT_IN_SCAN:
6757 + {
6758 + zfScanMgrScanEventRetry(dev);
6759 + }
6760 + break;
6761 +
6762 + case ZM_EVENT_CM_TIMER:
6763 + {
6764 + zm_msg0_mm(ZM_LV_0, "ZM_EVENT_CM_TIMER");
6765 +
6766 + wd->sta.cmMicFailureCount = 0;
6767 + }
6768 + break;
6769 +
6770 + case ZM_EVENT_CM_DISCONNECT:
6771 + {
6772 + zm_msg0_mm(ZM_LV_0, "ZM_EVENT_CM_DISCONNECT");
6773 +
6774 + zfChangeAdapterState(dev, ZM_STA_STATE_DISCONNECT);
6775 +
6776 + zmw_enter_critical_section(dev);
6777 + //zfTimerSchedule(dev, ZM_EVENT_CM_BLOCK_TIMER,
6778 + // ZM_TICK_CM_BLOCK_TIMEOUT);
6779 +
6780 + /* Timer Resolution on WinXP is 15/16 ms */
6781 + /* Decrease Time offset for <XP> Counter Measure */
6782 + zfTimerSchedule(dev, ZM_EVENT_CM_BLOCK_TIMER,
6783 + ZM_TICK_CM_BLOCK_TIMEOUT - ZM_TICK_CM_BLOCK_TIMEOUT_OFFSET);
6784 +
6785 + zmw_leave_critical_section(dev);
6786 + wd->sta.cmMicFailureCount = 0;
6787 + //zfiWlanDisable(dev);
6788 + zfHpResetKeyCache(dev);
6789 + if (wd->zfcbConnectNotify != NULL)
6790 + {
6791 + wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_DISCONNECT_MIC_FAIL,
6792 + wd->sta.bssid);
6793 + }
6794 + }
6795 + break;
6796 +
6797 + case ZM_EVENT_CM_BLOCK_TIMER:
6798 + {
6799 + zm_msg0_mm(ZM_LV_0, "ZM_EVENT_CM_BLOCK_TIMER");
6800 +
6801 + //zmw_enter_critical_section(dev);
6802 + wd->sta.cmDisallowSsidLength = 0;
6803 + if ( wd->sta.bAutoReconnect )
6804 + {
6805 + zm_msg0_mm(ZM_LV_0, "ZM_EVENT_CM_BLOCK_TIMER:bAutoReconnect!=0");
6806 + zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
6807 + zfScanMgrScanStart(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
6808 + }
6809 + //zmw_leave_critical_section(dev);
6810 + }
6811 + break;
6812 +
6813 + case ZM_EVENT_TIMEOUT_ADDBA:
6814 + {
6815 + if (!wd->addbaComplete && (wd->addbaCount < 5))
6816 + {
6817 + zfAggSendAddbaRequest(dev, wd->sta.bssid, 0, 0);
6818 + wd->addbaCount++;
6819 + zfTimerSchedule(dev, ZM_EVENT_TIMEOUT_ADDBA, 100);
6820 + }
6821 + else
6822 + {
6823 + zfTimerCancel(dev, ZM_EVENT_TIMEOUT_ADDBA);
6824 + }
6825 + }
6826 + break;
6827 +
6828 + #ifdef ZM_ENABLE_PERFORMANCE_EVALUATION
6829 + case ZM_EVENT_TIMEOUT_PERFORMANCE:
6830 + {
6831 + zfiPerformanceRefresh(dev);
6832 + }
6833 + break;
6834 + #endif
6835 + case ZM_EVENT_SKIP_COUNTERMEASURE:
6836 + //enable the Countermeasure
6837 + {
6838 + zm_debug_msg0("Countermeasure : Enable MIC Check ");
6839 + wd->TKIP_Group_KeyChanging = 0x0;
6840 + }
6841 + break;
6842 +
6843 + default:
6844 + break;
6845 + }
6846 + }
6847 +}
6848 +
6849 +void zfBssInfoCreate(zdev_t* dev)
6850 +{
6851 + u8_t i;
6852 +
6853 + zmw_get_wlan_dev(dev);
6854 +
6855 + zmw_declare_for_critical_section();
6856 +
6857 + zmw_enter_critical_section(dev);
6858 +
6859 + wd->sta.bssList.bssCount = 0;
6860 + wd->sta.bssList.head = NULL;
6861 + wd->sta.bssList.tail = NULL;
6862 + wd->sta.bssInfoArrayHead = 0;
6863 + wd->sta.bssInfoArrayTail = 0;
6864 + wd->sta.bssInfoFreeCount = ZM_MAX_BSS;
6865 +
6866 + for( i=0; i< ZM_MAX_BSS; i++ )
6867 + {
6868 + //wd->sta.bssInfoArray[i] = &(wd->sta.bssInfoPool[i]);
6869 + wd->sta.bssInfoArray[i] = zfwMemAllocate(dev, sizeof(struct zsBssInfo));
6870 +
6871 + }
6872 +
6873 + zmw_leave_critical_section(dev);
6874 +}
6875 +
6876 +void zfBssInfoDestroy(zdev_t* dev)
6877 +{
6878 + u8_t i;
6879 + zmw_get_wlan_dev(dev);
6880 +
6881 + zfBssInfoRefresh(dev, 1);
6882 +
6883 + for( i=0; i< ZM_MAX_BSS; i++ )
6884 + {
6885 + if (wd->sta.bssInfoArray[i] != NULL)
6886 + {
6887 + zfwMemFree(dev, wd->sta.bssInfoArray[i], sizeof(struct zsBssInfo));
6888 + }
6889 + else
6890 + {
6891 + zm_assert(0);
6892 + }
6893 + }
6894 + return;
6895 +}
6896 +
6897 +struct zsBssInfo* zfBssInfoAllocate(zdev_t* dev)
6898 +{
6899 + struct zsBssInfo* pBssInfo;
6900 +
6901 + zmw_get_wlan_dev(dev);
6902 +
6903 + if (wd->sta.bssInfoFreeCount == 0)
6904 + return NULL;
6905 +
6906 + pBssInfo = wd->sta.bssInfoArray[wd->sta.bssInfoArrayHead];
6907 + wd->sta.bssInfoArray[wd->sta.bssInfoArrayHead] = NULL;
6908 + wd->sta.bssInfoArrayHead = (wd->sta.bssInfoArrayHead + 1) & (ZM_MAX_BSS - 1);
6909 + wd->sta.bssInfoFreeCount--;
6910 +
6911 + zfZeroMemory((u8_t*)pBssInfo, sizeof(struct zsBssInfo));
6912 +
6913 + return pBssInfo;
6914 +}
6915 +
6916 +void zfBssInfoFree(zdev_t* dev, struct zsBssInfo* pBssInfo)
6917 +{
6918 + zmw_get_wlan_dev(dev);
6919 +
6920 + zm_assert(wd->sta.bssInfoArray[wd->sta.bssInfoArrayTail] == NULL);
6921 +
6922 + pBssInfo->signalStrength = pBssInfo->signalQuality = 0;
6923 + pBssInfo->sortValue = 0;
6924 +
6925 + wd->sta.bssInfoArray[wd->sta.bssInfoArrayTail] = pBssInfo;
6926 + wd->sta.bssInfoArrayTail = (wd->sta.bssInfoArrayTail + 1) & (ZM_MAX_BSS - 1);
6927 + wd->sta.bssInfoFreeCount++;
6928 +}
6929 +
6930 +void zfBssInfoReorderList(zdev_t* dev)
6931 +{
6932 + struct zsBssInfo* pBssInfo = NULL;
6933 + struct zsBssInfo* pInsBssInfo = NULL;
6934 + struct zsBssInfo* pNextBssInfo = NULL;
6935 + struct zsBssInfo* pPreBssInfo = NULL;
6936 + u8_t i = 0;
6937 +
6938 + zmw_get_wlan_dev(dev);
6939 +
6940 + zmw_declare_for_critical_section();
6941 +
6942 + zmw_enter_critical_section(dev);
6943 +
6944 + if (wd->sta.bssList.bssCount > 1)
6945 + {
6946 + pInsBssInfo = wd->sta.bssList.head;
6947 + wd->sta.bssList.tail = pInsBssInfo;
6948 + pBssInfo = pInsBssInfo->next;
6949 + pInsBssInfo->next = NULL;
6950 + while (pBssInfo != NULL)
6951 + {
6952 + i = 0;
6953 + while (1)
6954 + {
6955 +// if (pBssInfo->signalStrength >= pInsBssInfo->signalStrength)
6956 + if( pBssInfo->sortValue >= pInsBssInfo->sortValue)
6957 + {
6958 + if (i==0)
6959 + {
6960 + //Insert BssInfo to head
6961 + wd->sta.bssList.head = pBssInfo;
6962 + pNextBssInfo = pBssInfo->next;
6963 + pBssInfo->next = pInsBssInfo;
6964 + break;
6965 + }
6966 + else
6967 + {
6968 + //Insert BssInfo to neither head nor tail
6969 + pPreBssInfo->next = pBssInfo;
6970 + pNextBssInfo = pBssInfo->next;
6971 + pBssInfo->next = pInsBssInfo;
6972 + break;
6973 + }
6974 + }
6975 + else
6976 + {
6977 + if (pInsBssInfo->next != NULL)
6978 + {
6979 + //Signal strength smaller than current BssInfo, check next
6980 + pPreBssInfo = pInsBssInfo;
6981 + pInsBssInfo = pInsBssInfo->next;
6982 + }
6983 + else
6984 + {
6985 + //Insert BssInfo to tail
6986 + pInsBssInfo->next = pBssInfo;
6987 + pNextBssInfo = pBssInfo->next;
6988 + wd->sta.bssList.tail = pBssInfo;
6989 + pBssInfo->next = NULL;
6990 + break;
6991 + }
6992 + }
6993 + i++;
6994 + }
6995 + pBssInfo = pNextBssInfo;
6996 + pInsBssInfo = wd->sta.bssList.head;
6997 + }
6998 + } //if (wd->sta.bssList.bssCount > 1)
6999 +
7000 + zmw_leave_critical_section(dev);
7001 +}
7002 +
7003 +void zfBssInfoInsertToList(zdev_t* dev, struct zsBssInfo* pBssInfo)
7004 +{
7005 + zmw_get_wlan_dev(dev);
7006 +
7007 + zm_assert(pBssInfo);
7008 +
7009 + //zm_debug_msg2("pBssInfo = ", pBssInfo);
7010 +
7011 + if ( wd->sta.bssList.bssCount == 0 )
7012 + {
7013 + wd->sta.bssList.head = pBssInfo;
7014 + wd->sta.bssList.tail = pBssInfo;
7015 + }
7016 + else
7017 + {
7018 + wd->sta.bssList.tail->next = pBssInfo;
7019 + wd->sta.bssList.tail = pBssInfo;
7020 + }
7021 +
7022 + pBssInfo->next = NULL;
7023 + wd->sta.bssList.bssCount++;
7024 +
7025 + //zm_debug_msg2("bss count = ", wd->sta.bssList.bssCount);
7026 +}
7027 +
7028 +void zfBssInfoRemoveFromList(zdev_t* dev, struct zsBssInfo* pBssInfo)
7029 +{
7030 + struct zsBssInfo* pNowBssInfo;
7031 + struct zsBssInfo* pPreBssInfo = NULL;
7032 + u8_t i;
7033 +
7034 + zmw_get_wlan_dev(dev);
7035 +
7036 + zm_assert(pBssInfo);
7037 + zm_assert(wd->sta.bssList.bssCount);
7038 +
7039 + //zm_debug_msg2("pBssInfo = ", pBssInfo);
7040 +
7041 + pNowBssInfo = wd->sta.bssList.head;
7042 +
7043 + for( i=0; i<wd->sta.bssList.bssCount; i++ )
7044 + {
7045 + if ( pNowBssInfo == pBssInfo )
7046 + {
7047 + if ( i == 0 )
7048 + { /* remove head */
7049 + wd->sta.bssList.head = pBssInfo->next;
7050 + }
7051 + else
7052 + {
7053 + pPreBssInfo->next = pBssInfo->next;
7054 + }
7055 +
7056 + if ( i == (wd->sta.bssList.bssCount - 1) )
7057 + { /* remove tail */
7058 + wd->sta.bssList.tail = pPreBssInfo;
7059 + }
7060 +
7061 + break;
7062 + }
7063 +
7064 + pPreBssInfo = pNowBssInfo;
7065 + pNowBssInfo = pNowBssInfo->next;
7066 + }
7067 +
7068 + zm_assert(i != wd->sta.bssList.bssCount);
7069 + wd->sta.bssList.bssCount--;
7070 +
7071 + //zm_debug_msg2("bss count = ", wd->sta.bssList.bssCount);
7072 +}
7073 +
7074 +void zfBssInfoRefresh(zdev_t* dev, u16_t mode)
7075 +{
7076 + struct zsBssInfo* pBssInfo;
7077 + struct zsBssInfo* pNextBssInfo;
7078 + u8_t i, bssCount;
7079 +
7080 + zmw_get_wlan_dev(dev);
7081 +
7082 + pBssInfo = wd->sta.bssList.head;
7083 + bssCount = wd->sta.bssList.bssCount;
7084 +
7085 + for( i=0; i<bssCount; i++ )
7086 + {
7087 + if (mode == 1)
7088 + {
7089 + pNextBssInfo = pBssInfo->next;
7090 + zfBssInfoRemoveFromList(dev, pBssInfo);
7091 + zfBssInfoFree(dev, pBssInfo);
7092 + pBssInfo = pNextBssInfo;
7093 + }
7094 + else
7095 + {
7096 + if ( pBssInfo->flag & ZM_BSS_INFO_VALID_BIT )
7097 + { /* this one must be kept */
7098 + pBssInfo->flag &= ~ZM_BSS_INFO_VALID_BIT;
7099 + pBssInfo = pBssInfo->next;
7100 + }
7101 + else
7102 + {
7103 + #define ZM_BSS_CACHE_TIME_IN_MS 20000
7104 + if ((wd->tick - pBssInfo->tick) > (ZM_BSS_CACHE_TIME_IN_MS/ZM_MS_PER_TICK))
7105 + {
7106 + pNextBssInfo = pBssInfo->next;
7107 + zfBssInfoRemoveFromList(dev, pBssInfo);
7108 + zfBssInfoFree(dev, pBssInfo);
7109 + pBssInfo = pNextBssInfo;
7110 + }
7111 + else
7112 + {
7113 + pBssInfo = pBssInfo->next;
7114 + }
7115 + }
7116 + }
7117 + } //for( i=0; i<bssCount; i++ )
7118 + return;
7119 +}
7120 +
7121 +void zfDumpSSID(u8_t length, u8_t *value)
7122 +{
7123 + u8_t buf[50];
7124 + u8_t tmpLength = length;
7125 +
7126 + if ( tmpLength > 49 )
7127 + {
7128 + tmpLength = 49;
7129 + }
7130 +
7131 + zfMemoryCopy(buf, value, tmpLength);
7132 + buf[tmpLength] = '\0';
7133 + //printk("SSID: %s\n", buf);
7134 + //zm_debug_msg_s("ssid = ", value);
7135 +}
7136 +
7137 +void zfCoreReinit(zdev_t* dev)
7138 +{
7139 + zmw_get_wlan_dev(dev);
7140 +
7141 + wd->sta.flagKeyChanging = 0;
7142 + wd->sta.flagFreqChanging = 0;
7143 +}
7144 +
7145 +void zfGenerateRandomBSSID(zdev_t* dev, u8_t *MACAddr, u8_t *BSSID)
7146 +{
7147 + //ULONGLONG time;
7148 + u32_t time;
7149 +
7150 + zmw_get_wlan_dev(dev);
7151 +
7152 + time = wd->tick;
7153 +
7154 + //
7155 + // Initialize the random BSSID to be the same as MAC address.
7156 + //
7157 +
7158 + // RtlCopyMemory(BSSID, MACAddr, sizeof(DOT11_MAC_ADDRESS));
7159 + zfMemoryCopy(BSSID, MACAddr, 6);
7160 +
7161 + //
7162 + // Get the system time in 10 millisecond.
7163 + //
7164 +
7165 + // NdisGetCurrentSystemTime((PLARGE_INTEGER)&time);
7166 + // time /= 100000;
7167 +
7168 + //
7169 + // Randomize the first 4 bytes of BSSID.
7170 + //
7171 +
7172 + BSSID[0] ^= (u8_t)(time & 0xff);
7173 + BSSID[0] &= ~0x01; // Turn off multicast bit
7174 + BSSID[0] |= 0x02; // Turn on local bit
7175 +
7176 + time >>= 8;
7177 + BSSID[1] ^= (u8_t)(time & 0xff);
7178 +
7179 + time >>= 8;
7180 + BSSID[2] ^= (u8_t)(time & 0xff);
7181 +
7182 + time >>= 8;
7183 + BSSID[3] ^= (u8_t)(time & 0xff);
7184 +}
7185 +
7186 +u8_t zfiWlanGetDestAddrFromBuf(zdev_t *dev, zbuf_t *buf, u16_t *macAddr)
7187 +{
7188 +#ifdef ZM_ENABLE_NATIVE_WIFI
7189 + zmw_get_wlan_dev(dev);
7190 +
7191 + if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
7192 + {
7193 + /* DA */
7194 + macAddr[0] = zmw_tx_buf_readh(dev, buf, 16);
7195 + macAddr[1] = zmw_tx_buf_readh(dev, buf, 18);
7196 + macAddr[2] = zmw_tx_buf_readh(dev, buf, 20);
7197 + }
7198 + else if ( wd->wlanMode == ZM_MODE_IBSS )
7199 + {
7200 + /* DA */
7201 + macAddr[0] = zmw_tx_buf_readh(dev, buf, 4);
7202 + macAddr[1] = zmw_tx_buf_readh(dev, buf, 6);
7203 + macAddr[2] = zmw_tx_buf_readh(dev, buf, 8);
7204 + }
7205 + else if ( wd->wlanMode == ZM_MODE_AP )
7206 + {
7207 + /* DA */
7208 + macAddr[0] = zmw_tx_buf_readh(dev, buf, 4);
7209 + macAddr[1] = zmw_tx_buf_readh(dev, buf, 6);
7210 + macAddr[2] = zmw_tx_buf_readh(dev, buf, 8);
7211 + }
7212 + else
7213 + {
7214 + return 1;
7215 + }
7216 +#else
7217 + /* DA */
7218 + macAddr[0] = zmw_tx_buf_readh(dev, buf, 0);
7219 + macAddr[1] = zmw_tx_buf_readh(dev, buf, 2);
7220 + macAddr[2] = zmw_tx_buf_readh(dev, buf, 4);
7221 +#endif
7222 +
7223 + return 0;
7224 +}
7225 +
7226 +/* Leave an empty line below to remove warning message on some compiler */
7227 +
7228 +u16_t zfFindCleanFrequency(zdev_t* dev, u32_t adhocMode)
7229 +{
7230 + u8_t i, j;
7231 + u16_t returnChannel;
7232 + u16_t count_24G = 0, min24GIndex = 0;
7233 + u16_t count_5G = 0, min5GIndex = 0;
7234 + u16_t CombinationBssNumberIn24G[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
7235 + u16_t BssNumberIn24G[17] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
7236 + u16_t Array_24G[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
7237 + u16_t BssNumberIn5G[31] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
7238 + u16_t Array_5G[31] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
7239 + struct zsBssInfo* pBssInfo;
7240 +
7241 + zmw_get_wlan_dev(dev);
7242 +
7243 + if ((pBssInfo = wd->sta.bssList.head) == NULL)
7244 + {
7245 + if( adhocMode == ZM_ADHOCBAND_B || adhocMode == ZM_ADHOCBAND_G ||
7246 + adhocMode == ZM_ADHOCBAND_BG || adhocMode == ZM_ADHOCBAND_ABG )
7247 + {
7248 + returnChannel = zfChGetFirst2GhzChannel(dev);
7249 + }
7250 + else
7251 + {
7252 + returnChannel = zfChGetFirst5GhzChannel(dev);
7253 + }
7254 +
7255 + return returnChannel;
7256 + }
7257 +
7258 + /* #1 Get Allowed Channel following Country Code ! */
7259 + zmw_declare_for_critical_section();
7260 + zmw_enter_critical_section(dev);
7261 + for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
7262 + {
7263 + if (wd->regulationTable.allowChannel[i].channel < 3000)
7264 + { // 2.4GHz
7265 + Array_24G[count_24G] = wd->regulationTable.allowChannel[i].channel;
7266 + count_24G++;
7267 + }
7268 + else
7269 + { // 5GHz
7270 + count_5G++;
7271 + Array_5G[i] = wd->regulationTable.allowChannel[i].channel;
7272 + }
7273 + }
7274 + zmw_leave_critical_section(dev);
7275 +
7276 + while( pBssInfo != NULL )
7277 + {
7278 + /* #2_1 Count BSS number in some specificed frequency in 2.4GHz band ! */
7279 + if( adhocMode == ZM_ADHOCBAND_B || adhocMode == ZM_ADHOCBAND_G ||
7280 + adhocMode == ZM_ADHOCBAND_BG || adhocMode == ZM_ADHOCBAND_ABG )
7281 + {
7282 + for( i=0; i<=(count_24G+3); i++ )
7283 + {
7284 + if( pBssInfo->frequency == Array_24G[i] )
7285 + { // Array_24G[0] correspond to BssNumberIn24G[2]
7286 + BssNumberIn24G[pBssInfo->channel+1]++;
7287 + }
7288 + }
7289 + }
7290 +
7291 + /* #2_2 Count BSS number in some specificed frequency in 5GHz band ! */
7292 + if( adhocMode == ZM_ADHOCBAND_A || adhocMode == ZM_ADHOCBAND_ABG )
7293 + {
7294 + for( i=0; i<count_5G; i++ )
7295 + { // 5GHz channel is not equal to array index
7296 + if( pBssInfo->frequency == Array_5G[i] )
7297 + { // Array_5G[0] correspond to BssNumberIn5G[0]
7298 + BssNumberIn5G[i]++;
7299 + }
7300 + }
7301 + }
7302 +
7303 + pBssInfo = pBssInfo->next;
7304 + }
7305 +
7306 +#if 0
7307 + for(i=0; i<=(count_24G+3); i++)
7308 + {
7309 + printk("2.4GHz Before combin, %d BSS network : %d", i, BssNumberIn24G[i]);
7310 + }
7311 +
7312 + for(i=0; i<count_5G; i++)
7313 + {
7314 + printk("5GHz Before combin, %d BSS network : %d", i, BssNumberIn5G[i]);
7315 + }
7316 +#endif
7317 +
7318 + if( adhocMode == ZM_ADHOCBAND_B || adhocMode == ZM_ADHOCBAND_G ||
7319 + adhocMode == ZM_ADHOCBAND_BG || adhocMode == ZM_ADHOCBAND_ABG )
7320 + {
7321 + /* #3_1 Count BSS number that influence the specificed frequency in 2.4GHz ! */
7322 + for( j=0; j<count_24G; j++ )
7323 + {
7324 + CombinationBssNumberIn24G[j] = BssNumberIn24G[j] + BssNumberIn24G[j+1] +
7325 + BssNumberIn24G[j+2] + BssNumberIn24G[j+3] +
7326 + BssNumberIn24G[j+4];
7327 + //printk("After combine, the number of BSS network channel %d is %d",
7328 + // j , CombinationBssNumberIn24G[j]);
7329 + }
7330 +
7331 + /* #4_1 Find the less utilized frequency in 2.4GHz band ! */
7332 + min24GIndex = zfFindMinimumUtilizationChannelIndex(dev, CombinationBssNumberIn24G, count_24G);
7333 + }
7334 +
7335 + /* #4_2 Find the less utilized frequency in 5GHz band ! */
7336 + if( adhocMode == ZM_ADHOCBAND_A || adhocMode == ZM_ADHOCBAND_ABG )
7337 + {
7338 + min5GIndex = zfFindMinimumUtilizationChannelIndex(dev, BssNumberIn5G, count_5G);
7339 + }
7340 +
7341 + if( adhocMode == ZM_ADHOCBAND_B || adhocMode == ZM_ADHOCBAND_G || adhocMode == ZM_ADHOCBAND_BG )
7342 + {
7343 + return Array_24G[min24GIndex];
7344 + }
7345 + else if( adhocMode == ZM_ADHOCBAND_A )
7346 + {
7347 + return Array_5G[min5GIndex];
7348 + }
7349 + else if( adhocMode == ZM_ADHOCBAND_ABG )
7350 + {
7351 + if ( CombinationBssNumberIn24G[min24GIndex] <= BssNumberIn5G[min5GIndex] )
7352 + return Array_24G[min24GIndex];
7353 + else
7354 + return Array_5G[min5GIndex];
7355 + }
7356 + else
7357 + return 2412;
7358 +}
7359 +
7360 +u16_t zfFindMinimumUtilizationChannelIndex(zdev_t* dev, u16_t* array, u16_t count)
7361 +{
7362 + u8_t i;
7363 + u16_t tempMinIndex, tempMinValue;
7364 +
7365 + zmw_get_wlan_dev(dev);
7366 +
7367 + i = 1;
7368 + tempMinIndex = 0;
7369 + tempMinValue = array[tempMinIndex];
7370 + while( i< count )
7371 + {
7372 + if( array[i] < tempMinValue )
7373 + {
7374 + tempMinValue = array[i];
7375 + tempMinIndex = i;
7376 + }
7377 + i++;
7378 + }
7379 +
7380 + return tempMinIndex;
7381 +}
7382 +
7383 +u8_t zfCompareWithBssid(zdev_t* dev, u16_t* bssid)
7384 +{
7385 + zmw_get_wlan_dev(dev);
7386 +
7387 + if ( zfMemoryIsEqual((u8_t*)bssid, (u8_t*)wd->sta.bssid, 6) )
7388 + {
7389 + return 1;
7390 + }
7391 + else
7392 + {
7393 + return 0;
7394 + }
7395 +}
7396 --- /dev/null
7397 +++ b/drivers/staging/otus/80211core/cfunc.h
7398 @@ -0,0 +1,449 @@
7399 +/*
7400 + * Copyright (c) 2007-2008 Atheros Communications Inc.
7401 + *
7402 + * Permission to use, copy, modify, and/or distribute this software for any
7403 + * purpose with or without fee is hereby granted, provided that the above
7404 + * copyright notice and this permission notice appear in all copies.
7405 + *
7406 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
7407 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
7408 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
7409 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
7410 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
7411 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
7412 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
7413 + */
7414 +/* */
7415 +/* Module Name : func_extr.c */
7416 +/* */
7417 +/* Abstract */
7418 +/* This module contains function prototype. */
7419 +/* */
7420 +/* NOTES */
7421 +/* None */
7422 +/* */
7423 +/************************************************************************/
7424 +
7425 +#ifndef _CFUNC_H
7426 +#define _CFUNC_H
7427 +
7428 +#include "queue.h"
7429 +
7430 +/* amsdu.c */
7431 +void zfDeAmsdu(zdev_t* dev, zbuf_t* buf, u16_t vap, u8_t encryMode);
7432 +
7433 +/* cscanmgr.c */
7434 +void zfScanMgrInit(zdev_t* dev);
7435 +u8_t zfScanMgrScanStart(zdev_t* dev, u8_t scanType);
7436 +void zfScanMgrScanStop(zdev_t* dev, u8_t scanType);
7437 +void zfScanMgrScanAck(zdev_t* dev);
7438 +
7439 +/* cpsmgr.c */
7440 +void zfPowerSavingMgrInit(zdev_t* dev);
7441 +void zfPowerSavingMgrSetMode(zdev_t* dev, u8_t mode);
7442 +void zfPowerSavingMgrMain(zdev_t* dev);
7443 +void zfPowerSavingMgrWakeup(zdev_t* dev);
7444 +u8_t zfPowerSavingMgrIsSleeping(zdev_t *dev);
7445 +void zfPowerSavingMgrProcessBeacon(zdev_t* dev, zbuf_t* buf);
7446 +void zfPowerSavingMgrAtimWinExpired(zdev_t* dev);
7447 +void zfPowerSavingMgrConnectNotify(zdev_t *dev);
7448 +void zfPowerSavingMgrPreTBTTInterrupt(zdev_t *dev);
7449 +
7450 +/* ccmd.c */
7451 +u16_t zfWlanEnable(zdev_t* dev);
7452 +
7453 +/* cfunc.c */
7454 +u8_t zfQueryOppositeRate(zdev_t* dev, u8_t dst_mac[6], u8_t frameType);
7455 +void zfCopyToIntTxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* src,
7456 + u16_t offset, u16_t length);
7457 +void zfCopyToRxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* src,
7458 + u16_t offset, u16_t length);
7459 +void zfCopyFromIntTxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* dst,
7460 + u16_t offset, u16_t length);
7461 +void zfCopyFromRxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* dst,
7462 + u16_t offset, u16_t length);
7463 +void zfMemoryCopy(u8_t* dst, u8_t* src, u16_t length);
7464 +void zfMemoryMove(u8_t* dst, u8_t* src, u16_t length);
7465 +void zfZeroMemory(u8_t* va, u16_t length);
7466 +u8_t zfMemoryIsEqual(u8_t* m1, u8_t* m2, u16_t length);
7467 +u8_t zfRxBufferEqualToStr(zdev_t* dev, zbuf_t* buf, const u8_t* str,
7468 + u16_t offset, u16_t length);
7469 +void zfTxBufferCopy(zdev_t*dev, zbuf_t* dst, zbuf_t* src,
7470 + u16_t dstOffset, u16_t srcOffset, u16_t length);
7471 +void zfRxBufferCopy(zdev_t*dev, zbuf_t* dst, zbuf_t* src,
7472 + u16_t dstOffset, u16_t srcOffset, u16_t length);
7473 +
7474 +void zfCollectHWTally(zdev_t*dev, u32_t* rsp, u8_t id);
7475 +void zfTimerInit(zdev_t* dev);
7476 +u16_t zfTimerSchedule(zdev_t* dev, u16_t event, u32_t tick);
7477 +u16_t zfTimerCancel(zdev_t* dev, u16_t event);
7478 +void zfTimerClear(zdev_t* dev);
7479 +u16_t zfTimerCheckAndHandle(zdev_t* dev);
7480 +void zfProcessEvent(zdev_t* dev, u16_t* eventArray, u8_t eventCount);
7481 +
7482 +void zfBssInfoCreate(zdev_t* dev);
7483 +void zfBssInfoDestroy(zdev_t* dev);
7484 +
7485 +struct zsBssInfo* zfBssInfoAllocate(zdev_t* dev);
7486 +void zfBssInfoFree(zdev_t* dev, struct zsBssInfo* pBssInfo);
7487 +void zfBssInfoReorderList(zdev_t* dev);
7488 +void zfBssInfoInsertToList(zdev_t* dev, struct zsBssInfo* pBssInfo);
7489 +void zfBssInfoRemoveFromList(zdev_t* dev, struct zsBssInfo* pBssInfo);
7490 +void zfBssInfoRefresh(zdev_t* dev, u16_t mode);
7491 +void zfCoreSetFrequencyComplete(zdev_t* dev);
7492 +void zfCoreSetFrequency(zdev_t* dev, u16_t frequency);
7493 +void zfCoreSetFrequencyV2(zdev_t* dev, u16_t frequency,
7494 + zfpFreqChangeCompleteCb cb);
7495 +void zfCoreSetFrequencyEx(zdev_t* dev, u16_t frequency, u8_t bw40,
7496 + u8_t extOffset, zfpFreqChangeCompleteCb cb);
7497 +void zfCoreSetFrequencyExV2(zdev_t* dev, u16_t frequency, u8_t bw40,
7498 + u8_t extOffset, zfpFreqChangeCompleteCb cb, u8_t forceSetFreq);
7499 +void zfReSetCurrentFrequency(zdev_t* dev);
7500 +u32_t zfCoreSetKey(zdev_t* dev, u8_t user, u8_t keyId, u8_t type,
7501 + u16_t* mac, u32_t* key);
7502 +void zfCoreSetKeyComplete(zdev_t* dev);
7503 +void zfCoreReinit(zdev_t* dev);
7504 +void zfCoreMacAddressNotify(zdev_t* dev, u8_t *addr);
7505 +void zfCoreSetIsoName(zdev_t* dev, u8_t* isoName);
7506 +void zfGenerateRandomBSSID(zdev_t* dev, u8_t *MACAddr, u8_t *BSSID);
7507 +void zfCoreHalInitComplete(zdev_t* dev);
7508 +
7509 +u16_t zfFindCleanFrequency(zdev_t* dev, u32_t adhocMode);
7510 +u16_t zfFindMinimumUtilizationChannelIndex(zdev_t* dev, u16_t* array, u16_t count);
7511 +u8_t zfCompareWithBssid(zdev_t* dev, u16_t* bssid);
7512 +
7513 +/* chb.c */
7514 +void zfDumpBssList(zdev_t* dev);
7515 +
7516 +
7517 +u16_t zfIssueCmd(zdev_t* dev, u32_t* cmd, u16_t cmdLen, u16_t src, u8_t* buf);
7518 +
7519 +
7520 +/* cic.c */
7521 +void zfUpdateBssid(zdev_t* dev, u8_t* bssid);
7522 +void zfResetSupportRate(zdev_t* dev, u8_t type);
7523 +void zfUpdateSupportRate(zdev_t* dev, u8_t* rateArray);
7524 +u8_t zfIsGOnlyMode(zdev_t* dev, u16_t frequency, u8_t* rateArray);
7525 +void zfGatherBMode(zdev_t* dev, u8_t* rateArray, u8_t* extrateArray);
7526 +u8_t zfPSDeviceSleep(zdev_t* dev);
7527 +u16_t zfGetRandomNumber(zdev_t* dev, u16_t initValue);
7528 +void zfCoreEvent(zdev_t* dev, u16_t event, u8_t* rsp);
7529 +void zfBeaconCfgInterrupt(zdev_t* dev, u8_t* rsp);
7530 +void zfEndOfAtimWindowInterrupt(zdev_t* dev);
7531 +
7532 +/* cinit.c */
7533 +u16_t zfTxGenWlanHeader(zdev_t* dev, zbuf_t* buf, u16_t* header, u16_t seq,
7534 + u8_t flag, u16_t plusLen, u16_t minusLen, u16_t port,
7535 + u16_t* da, u16_t* sa, u8_t up, u16_t *micLen,
7536 + u16_t* snap, u16_t snapLen, struct aggControl *aggControl);
7537 +u16_t zfTxGenMmHeader(zdev_t* dev, u8_t frameType, u16_t* dst,
7538 + u16_t* header, u16_t len, zbuf_t* buf, u16_t vap, u8_t encrypt);
7539 +void zfInitMacApMode(zdev_t* dev);
7540 +u16_t zfChGetNextChannel(zdev_t* dev, u16_t frequency, u8_t* pbPassive);
7541 +u16_t zfChGetFirstChannel(zdev_t* dev, u8_t* pbPassive);
7542 +u16_t zfChGetFirst2GhzChannel(zdev_t* dev);
7543 +u16_t zfChGetFirst5GhzChannel(zdev_t* dev);
7544 +u16_t zfChGetLastChannel(zdev_t* dev, u8_t* pbPassive);
7545 +u16_t zfChGetLast5GhzChannel(zdev_t* dev);
7546 +u16_t zfChNumToFreq(zdev_t* dev, u8_t ch, u8_t freqBand);
7547 +u8_t zfChFreqToNum(u16_t freq, u8_t* bIs5GBand);
7548 +
7549 +/* cmm.c */
7550 +void zfProcessManagement(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo); //CWYang(m)
7551 +void zfSendMmFrame(zdev_t* dev, u8_t frameType, u16_t* dst,
7552 + u32_t p1, u32_t p2, u32_t p3);
7553 +u16_t zfFindElement(zdev_t* dev, zbuf_t* buf, u8_t eid);
7554 +u16_t zfFindWifiElement(zdev_t* dev, zbuf_t* buf, u8_t type, u8_t subtype);
7555 +u16_t zfFindSuperGElement(zdev_t* dev, zbuf_t* buf, u8_t type);
7556 +u16_t zfFindXRElement(zdev_t* dev, zbuf_t* buf, u8_t type);
7557 +u16_t zfRemoveElement(zdev_t* dev, u8_t* buf, u16_t size, u8_t eid);
7558 +u16_t zfUpdateElement(zdev_t* dev, u8_t* buf, u16_t size, u8_t* updateeid);
7559 +void zfProcessProbeReq(zdev_t* dev, zbuf_t* buf, u16_t* src);
7560 +void zfProcessProbeRsp(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo);
7561 +u16_t zfSendProbeReq(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t bWithSSID);
7562 +u16_t zfMmAddIeSupportRate(zdev_t* dev, zbuf_t* buf,
7563 + u16_t offset, u8_t eid, u8_t rateSet);
7564 +u16_t zfMmAddIeDs(zdev_t* dev, zbuf_t* buf, u16_t offset);
7565 +u16_t zfMmAddIeErp(zdev_t* dev, zbuf_t* buf, u16_t offset);
7566 +void zfUpdateDefaultQosParameter(zdev_t* dev, u8_t mode);
7567 +u16_t zfMmAddIeWpa(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t apId);
7568 +u16_t zfMmAddHTCapability(zdev_t* dev, zbuf_t* buf, u16_t offset); //CWYang(+)
7569 +u16_t zfMmAddPreNHTCapability(zdev_t* dev, zbuf_t* buf, u16_t offset);
7570 +u16_t zfMmAddExtendedHTCapability(zdev_t* dev, zbuf_t* buf, u16_t offset); //CWYang(+)
7571 +u16_t zfFindATHExtCap(zdev_t* dev, zbuf_t* buf, u8_t type, u8_t subtype);
7572 +u16_t zfFindBrdcmMrvlRlnkExtCap(zdev_t* dev, zbuf_t* buf);
7573 +u16_t zfFindMarvelExtCap(zdev_t* dev, zbuf_t* buf);
7574 +u16_t zfFindBroadcomExtCap(zdev_t* dev, zbuf_t* buf);
7575 +u16_t zfFindRlnkExtCap(zdev_t* dev, zbuf_t* buf);
7576 +
7577 +/* cmmap.c */
7578 +void zfMmApTimeTick(zdev_t* dev);
7579 +void zfApAgingSta(zdev_t* dev);
7580 +u16_t zfApAddSta(zdev_t* dev, u16_t* addr, u16_t state, u16_t apId, u8_t type,
7581 + u8_t qosType, u8_t qosInfo);
7582 +void zfApProtctionMonitor(zdev_t* dev);
7583 +void zfApProcessBeacon(zdev_t* dev, zbuf_t* buf);
7584 +void zfApProcessAuth(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId);
7585 +void zfApProcessAsocReq(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId);
7586 +void zfApProcessAsocRsp(zdev_t* dev, zbuf_t* buf);
7587 +void zfApProcessDeauth(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId);
7588 +void zfApProcessDisasoc(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId);
7589 +void zfApProcessProbeRsp(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo);
7590 +void zfApStoreAsocReqIe(zdev_t* dev, zbuf_t* buf, u16_t aid);
7591 +u16_t zfApAddIeSsid(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t vap);
7592 +void zfApSendBeacon(zdev_t* dev);
7593 +u16_t zfApGetSTAInfo(zdev_t* dev, u16_t* addr, u16_t* state, u8_t* vap);
7594 +u16_t zfIntrabssForward(zdev_t* dev, zbuf_t* buf, u8_t srcVap);
7595 +u16_t zfApBufferPsFrame(zdev_t* dev, zbuf_t* buf, u16_t port);
7596 +void zfApInitStaTbl(zdev_t* dev);
7597 +void zfApGetStaTxRateAndQosType(zdev_t* dev, u16_t* addr, u32_t* phyCtrl,
7598 + u8_t* qosType, u16_t* rcProbingFlag);
7599 +void zfApGetStaQosType(zdev_t* dev, u16_t* addr, u8_t* qosType);
7600 +void zfApSetStaTxRate(zdev_t* dev, u16_t* addr, u32_t phyCtrl);
7601 +struct zsMicVar* zfApGetRxMicKey(zdev_t* dev, zbuf_t* buf);
7602 +struct zsMicVar* zfApGetTxMicKey(zdev_t* dev, zbuf_t* buf, u8_t* qosType);
7603 +u16_t zfApAddIeWmePara(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t vap);
7604 +u16_t zfApUpdatePsBit(zdev_t* dev, zbuf_t* buf, u8_t* vap, u8_t* uapsdTrig);
7605 +void zfApProcessPsPoll(zdev_t* dev, zbuf_t* buf);
7606 +u16_t zfApFindSta(zdev_t* dev, u16_t* addr);
7607 +void zfApGetStaEncryType(zdev_t* dev, u16_t* addr, u8_t* encryType);
7608 +void zfApGetStaWpaIv(zdev_t* dev, u16_t* addr, u16_t* iv16, u32_t* iv32);
7609 +void zfApSetStaWpaIv(zdev_t* dev, u16_t* addr, u16_t iv16, u32_t iv32);
7610 +void zfApClearStaKey(zdev_t* dev, u16_t* addr);
7611 +#ifdef ZM_ENABLE_CENC
7612 +void zfApGetStaCencIvAndKeyIdx(zdev_t* dev, u16_t* addr, u32_t *iv,
7613 + u8_t *keyIdx);
7614 +void zfApSetStaCencIv(zdev_t* dev, u16_t* addr, u32_t *iv);
7615 +#endif //ZM_ENABLE_CENC
7616 +void zfApSetProtectionMode(zdev_t* dev, u16_t mode);
7617 +void zfApFlushBufferedPsFrame(zdev_t* dev);
7618 +void zfApSendFailure(zdev_t* dev, u8_t* addr);
7619 +u8_t zfApRemoveFromPsQueue(zdev_t* dev, u16_t id, u16_t* src);
7620 +void zfApProcessAction(zdev_t* dev, zbuf_t* buf);
7621 +/* cmmsta.c */
7622 +void zfMmStaTimeTick(zdev_t* dev);
7623 +void zfReWriteBeaconStartAddress(zdev_t* dev); // Mxzeng
7624 +void zfStaProcessBeacon(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo); //CWYang(m)
7625 +void zfStaProcessAuth(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId);
7626 +void zfStaProcessAsocReq(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId);
7627 +void zfStaProcessAsocRsp(zdev_t* dev, zbuf_t* buf);
7628 +void zfStaProcessDeauth(zdev_t* dev, zbuf_t* buf);
7629 +void zfStaProcessDisasoc(zdev_t* dev, zbuf_t* buf);
7630 +void zfStaProcessProbeRsp(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo);
7631 +void zfStaProcessAtim(zdev_t* dev, zbuf_t* buf);
7632 +void zfStaStoreAsocRspIe(zdev_t* dev, zbuf_t* buf);
7633 +void zfStaChannelManagement(zdev_t* dev, u8_t scan);
7634 +void zfIbssConnectNetwork(zdev_t* dev);
7635 +void zfInfraConnectNetwork(zdev_t* dev);
7636 +u8_t zfCheckAuthentication(zdev_t* dev, struct zsBssInfo* pBssInfo);
7637 +u8_t zfChangeAdapterState(zdev_t* dev, u8_t newState);
7638 +u16_t zfStaAddIeSsid(zdev_t* dev, zbuf_t* buf, u16_t offset);
7639 +u16_t zfStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType);
7640 +u16_t zfStaAddIeIbss(zdev_t* dev, zbuf_t* buf, u16_t offset);
7641 +void zfStaStartConnect(zdev_t* dev, u8_t bIsSharedKey);
7642 +u8_t zfStaIsConnected(zdev_t* dev);
7643 +u8_t zfStaIsConnecting(zdev_t* dev);
7644 +u8_t zfStaIsDisconnect(zdev_t* dev);
7645 +void zfStaSendBeacon(zdev_t* dev);
7646 +void zfSendNullData(zdev_t* dev, u8_t type);
7647 +void zfSendPSPoll(zdev_t* dev);
7648 +void zfSendBA(zdev_t* dev, u16_t start_seq, u8_t *bitmap);
7649 +void zdRateInfoCountTx(zdev_t* dev, u16_t* macAddr);
7650 +struct zsMicVar* zfStaGetRxMicKey(zdev_t* dev, zbuf_t* buf);
7651 +struct zsMicVar* zfStaGetTxMicKey(zdev_t* dev, zbuf_t* buf);
7652 +u16_t zfStaRxValidateFrame(zdev_t* dev, zbuf_t* buf);
7653 +void zfStaMicFailureHandling(zdev_t* dev, zbuf_t* buf);
7654 +u8_t zfStaBlockWlanScan(zdev_t* dev);
7655 +void zfStaIbssPSCheckState(zdev_t* dev, zbuf_t* buf);
7656 +u8_t zfStaIbssPSQueueData(zdev_t* dev, zbuf_t* buf);
7657 +void zfStaIbssPSSend(zdev_t* dev);
7658 +void zfStaResetStatus(zdev_t* dev, u8_t bInit);
7659 +u16_t zfStaAddIeWmeInfo(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t qosInfo);
7660 +void zfInitPartnerNotifyEvent(zdev_t* dev, zbuf_t* buf, struct zsPartnerNotifyEvent *event);
7661 +void zfStaInitOppositeInfo(zdev_t* dev);
7662 +void zfStaIbssMonitoring(zdev_t* dev, u8_t reset);
7663 +struct zsBssInfo* zfStaFindBssInfo(zdev_t* dev, zbuf_t* buf, struct zsWlanProbeRspFrameHeader *pProbeRspHeader);
7664 +u8_t zfStaInitBssInfo(zdev_t* dev, zbuf_t* buf,
7665 + struct zsWlanProbeRspFrameHeader *pProbeRspHeader,
7666 + struct zsBssInfo* pBssInfo, struct zsAdditionInfo* AddInfo, u8_t type);
7667 +s8_t zfStaFindFreeOpposite(zdev_t* dev, u16_t *sa, int *pFoundIdx);
7668 +s8_t zfStaFindOppositeByMACAddr(zdev_t* dev, u16_t *sa, u8_t *pFoundIdx);
7669 +void zfStaRefreshBlockList(zdev_t* dev, u16_t flushFlag);
7670 +void zfStaConnectFail(zdev_t* dev, u16_t reason, u16_t* bssid, u8_t weight);
7671 +void zfStaGetTxRate(zdev_t* dev, u16_t* macAddr, u32_t* phyCtrl,
7672 + u16_t* rcProbingFlag);
7673 +u16_t zfStaProcessAction(zdev_t* dev, zbuf_t* buf);
7674 +struct zsTkipSeed* zfStaGetRxSeed(zdev_t* dev, zbuf_t* buf);
7675 +#ifdef ZM_ENABLE_CENC
7676 +/* CENC */
7677 +u16_t zfStaAddIeCenc(zdev_t* dev, zbuf_t* buf, u16_t offset);
7678 +#endif //ZM_ENABLE_CENC
7679 +void zfStaEnableSWEncryption(zdev_t *dev, u8_t value);
7680 +void zfStaDisableSWEncryption(zdev_t *dev);
7681 +u16_t zfComputeBssInfoWeightValue(zdev_t *dev, u8_t isBMode, u8_t isHT, u8_t isHT40, u8_t signalStrength);
7682 +u16_t zfStaAddIbssAdditionalIE(zdev_t* dev, zbuf_t* buf, u16_t offset);
7683 +
7684 +/* ctkip.c */
7685 +void zfTkipInit(u8_t* key, u8_t* ta, struct zsTkipSeed* pSeed, u8_t* initIv);
7686 +void zfMicSetKey(u8_t* key, struct zsMicVar* pMic);
7687 +void zfMicAppendByte(u8_t b, struct zsMicVar* pMic);
7688 +void zfMicClear(struct zsMicVar* pMic);
7689 +void zfMicAppendTxBuf(zdev_t* dev, zbuf_t* buf, u8_t* da, u8_t* sa,
7690 + u16_t removeLen, u8_t* mic);
7691 +u8_t zfMicRxVerify(zdev_t* dev, zbuf_t* buf);
7692 +void zfMicGetMic(u8_t* dst, struct zsMicVar* pMic);
7693 +void zfCalTxMic(zdev_t *dev, zbuf_t *buf, u8_t *snap, u16_t snapLen, u16_t offset, u16_t *da, u16_t *sa, u8_t up, u8_t *mic);
7694 +void zfTKIPEncrypt(zdev_t *dev, zbuf_t *buf, u8_t *snap, u16_t snapLen, u16_t offset, u8_t keyLen, u8_t* key, u32_t* icv);
7695 +u16_t zfTKIPDecrypt(zdev_t *dev, zbuf_t *buf, u16_t offset, u8_t keyLen, u8_t* key);
7696 +void zfTkipGetseeds(u16_t iv16, u8_t *RC4Key, struct zsTkipSeed *Seed);
7697 +u8_t zfTkipPhase1KeyMix(u32_t iv32, struct zsTkipSeed* pSeed);
7698 +u8_t zfTkipPhase2KeyMix(u16_t iv16, struct zsTkipSeed* pSeed);
7699 +void zfWEPEncrypt(zdev_t *dev, zbuf_t *buf, u8_t *snap, u16_t snapLen, u16_t offset, u8_t keyLen, u8_t* WepKey, u8_t *iv);
7700 +u16_t zfWEPDecrypt(zdev_t *dev, zbuf_t *buf, u16_t offset, u8_t keyLen, u8_t* WepKey, u8_t *iv);
7701 +
7702 +/* ctxrx.c */
7703 +u16_t zfSend80211Frame(zdev_t* dev, zbuf_t* buf);
7704 +void zfIsrPciTxComp(zdev_t* dev);
7705 +void zfTxPciDmaStart(zdev_t* dev);
7706 +u16_t zfTxPortControl(zdev_t* dev, zbuf_t* buf, u16_t port);
7707 +u16_t zfTxSendEth(zdev_t* dev, zbuf_t* buf, u16_t port,
7708 + u16_t bufType, u16_t flag);
7709 +u16_t zfTxGenWlanTail(zdev_t* dev, zbuf_t* buf, u16_t* snap, u16_t snaplen,
7710 + u16_t* mic);
7711 +u16_t zfTxGenWlanSnap(zdev_t* dev, zbuf_t* buf, u16_t* snap, u16_t* snaplen);
7712 +void zfTxGetIpTosAndFrag(zdev_t* dev, zbuf_t* buf, u8_t* up, u16_t* fragOff);
7713 +u16_t zfPutVtxq(zdev_t* dev, zbuf_t* buf);
7714 +void zfPushVtxq(zdev_t* dev);
7715 +u8_t zfIsVtxqEmpty(zdev_t* dev);
7716 +u16_t zfGetSeqCtrl(zdev_t* dev, zbuf_t* buf, u16_t offset);
7717 +u8_t zfGetFragNo(zdev_t* dev, zbuf_t* buf);
7718 +void zfShowRxEAPOL(zdev_t* dev, zbuf_t* buf, u16_t offset);
7719 +void zfShowTxEAPOL(zdev_t* dev, zbuf_t* buf, u16_t offset);
7720 +void zfCoreRecv(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo);
7721 +u16_t zfPutVmmq(zdev_t* dev, zbuf_t* buf);
7722 +void zfFlushVtxq(zdev_t* dev);
7723 +void zfAgingDefragList(zdev_t* dev, u16_t flushFlag);
7724 +
7725 +void zfLed100msCtrl(zdev_t* dev);
7726 +void zf80211FrameSend(zdev_t* dev, zbuf_t* buf, u16_t* header, u16_t snapLen,
7727 + u16_t* da, u16_t* sa, u8_t up, u16_t headerLen, u16_t* snap,
7728 + u16_t* tail, u16_t tailLen, u16_t offset, u16_t bufType,
7729 + u8_t ac, u8_t keyIdx);
7730 +void zfCheckIsRIFSFrame(zdev_t* dev, zbuf_t* buf, u16_t frameSubType);
7731 +
7732 +/* queue.c */
7733 +struct zsQueue* zfQueueCreate(zdev_t* dev, u16_t size);
7734 +void zfQueueDestroy(zdev_t* dev, struct zsQueue* q);
7735 +u16_t zfQueuePutNcs(zdev_t* dev, struct zsQueue* q, zbuf_t* buf, u32_t tick);
7736 +u16_t zfQueuePut(zdev_t* dev, struct zsQueue* q, zbuf_t* buf, u32_t tick);
7737 +zbuf_t* zfQueueGet(zdev_t* dev, struct zsQueue* q);
7738 +zbuf_t* zfQueueGetWithMac(zdev_t* dev, struct zsQueue* q, u8_t* addr, u8_t* mb);
7739 +void zfQueueFlush(zdev_t* dev, struct zsQueue* q);
7740 +void zfQueueAge(zdev_t* dev, struct zsQueue* q, u32_t tick, u32_t msAge);
7741 +void zfQueueGenerateUapsdTim(zdev_t* dev, struct zsQueue* q,
7742 + u8_t* uniBitMap, u16_t* highestByte);
7743 +
7744 +/* hpmain.c */
7745 +u16_t zfHpInit(zdev_t* dev, u32_t frequency);
7746 +u16_t zfHpRelease(zdev_t* dev);
7747 +void zfHpSetFrequencyEx(zdev_t* dev, u32_t frequency, u8_t bw40,
7748 + u8_t extOffset, u8_t initRF);
7749 +u16_t zfHpStartRecv(zdev_t* dev);
7750 +u16_t zfHpStopRecv(zdev_t* dev);
7751 +u16_t zfHpResetKeyCache(zdev_t* dev);
7752 +u16_t zfHpSetApStaMode(zdev_t* dev, u8_t mode);
7753 +u16_t zfHpSetBssid(zdev_t* dev, u8_t* bssid);
7754 +u16_t zfHpSetSnifferMode(zdev_t* dev, u16_t on);
7755 +u8_t zfHpUpdateQosParameter(zdev_t* dev, u16_t* cwminTbl, u16_t* cwmaxTbl,
7756 + u16_t* aifsTbl, u16_t* txopTbl);
7757 +void zfHpSetAtimWindow(zdev_t* dev, u16_t atimWin);
7758 +void zfHpEnableBeacon(zdev_t* dev, u16_t mode, u16_t bcnInterval, u16_t dtim, u8_t enableAtim);
7759 +void zfHpDisableBeacon(zdev_t* dev);
7760 +void zfHpSetBasicRateSet(zdev_t* dev, u16_t bRateBasic, u16_t gRateBasic);
7761 +void zfHpSetRTSCTSRate(zdev_t* dev, u32_t rate);
7762 +void zfHpSetMacAddress(zdev_t* dev, u16_t* macAddr, u16_t macAddrId);
7763 +u32_t zfHpGetMacAddress(zdev_t* dev);
7764 +u32_t zfHpGetTransmitPower(zdev_t* dev);
7765 +void zfHpSetMulticastList(zdev_t* dev, u8_t size, u8_t* pList, u8_t bAllMulticast);
7766 +
7767 +u16_t zfHpRemoveKey(zdev_t* dev, u16_t user);
7768 +u32_t zfHpSetKey(zdev_t* dev, u8_t user, u8_t keyId, u8_t type,
7769 + u16_t* mac, u32_t* key);
7770 +//u32_t zfHpSetStaPairwiseKey(zdev_t* dev, u16_t* apMacAddr, u8_t type,
7771 +// u32_t* key, u32_t* micKey);
7772 +//u32_t zfHpSetStaGroupKey(zdev_t* dev, u16_t* apMacAddr, u8_t type,
7773 +// u32_t* key, u32_t* micKey);
7774 +u32_t zfHpSetApPairwiseKey(zdev_t* dev, u16_t* staMacAddr, u8_t type,
7775 + u32_t* key, u32_t* micKey, u16_t staAid);
7776 +u32_t zfHpSetApGroupKey(zdev_t* dev, u16_t* apMacAddr, u8_t type,
7777 + u32_t* key, u32_t* micKey, u16_t vapId);
7778 +u32_t zfHpSetDefaultKey(zdev_t* dev, u8_t keyId, u8_t type, u32_t* key, u32_t* micKey);
7779 +u32_t zfHpSetPerUserKey(zdev_t* dev, u8_t user, u8_t keyId, u8_t* mac, u8_t type, u32_t* key, u32_t* micKey);
7780 +
7781 +void zfHpSendBeacon(zdev_t* dev, zbuf_t* buf, u16_t len);
7782 +u16_t zfHpGetPayloadLen(zdev_t* dev,
7783 + zbuf_t* buf,
7784 + u16_t len,
7785 + u16_t plcpHdrLen,
7786 + u32_t *rxMT,
7787 + u32_t *rxMCS,
7788 + u32_t *rxBW,
7789 + u32_t *rxSG
7790 + );
7791 +u32_t zfHpGetFreeTxdCount(zdev_t* dev);
7792 +u32_t zfHpGetMaxTxdCount(zdev_t* dev);
7793 +u16_t zfHpSend(zdev_t* dev, u16_t* header, u16_t headerLen,
7794 + u16_t* snap, u16_t snapLen, u16_t* tail, u16_t tailLen, zbuf_t* buf,
7795 + u16_t offset, u16_t bufType, u8_t ac, u8_t keyIdx);
7796 +void zfHpGetRegulationTablefromRegionCode(zdev_t* dev, u16_t regionCode);
7797 +void zfHpGetRegulationTablefromCountry(zdev_t* dev, u16_t CountryCode);
7798 +u8_t zfHpGetRegulationTablefromISO(zdev_t* dev, u8_t *countryInfo, u8_t length);
7799 +const char* zfHpGetisoNamefromregionCode(zdev_t* dev, u16_t regionCode);
7800 +u16_t zfHpGetRegionCodeFromIsoName(zdev_t* dev, u8_t *countryIsoName);
7801 +u8_t zfHpGetRegulatoryDomain(zdev_t* dev);
7802 +void zfHpLedCtrl(zdev_t* dev, u16_t ledId, u8_t mode);
7803 +u16_t zfHpResetTxRx(zdev_t* dev);
7804 +u16_t zfHpDeleteAllowChannel(zdev_t* dev, u16_t freq);
7805 +u16_t zfHpAddAllowChannel(zdev_t* dev, u16_t freq);
7806 +u32_t zfHpCwmUpdate(zdev_t* dev);
7807 +u32_t zfHpAniUpdate(zdev_t* dev);
7808 +u32_t zfHpAniUpdateRssi(zdev_t* dev, u8_t rssi);
7809 +void zfHpAniAttach(zdev_t* dev);
7810 +void zfHpAniArPoll(zdev_t* dev, u32_t listenTime, u32_t phyCnt1, u32_t phyCnt2);
7811 +void zfHpHeartBeat(zdev_t* dev);
7812 +void zfHpPowerSaveSetState(zdev_t* dev, u8_t psState);
7813 +void zfHpPowerSaveSetMode(zdev_t* dev, u8_t staMode, u8_t psMode, u16_t bcnInterval);
7814 +u16_t zfHpIsDfsChannel(zdev_t* dev, u16_t freq);
7815 +u16_t zfHpIsDfsChannelNCS(zdev_t* dev, u16_t freq);
7816 +u16_t zfHpFindFirstNonDfsChannel(zdev_t* dev, u16_t aBand);
7817 +u16_t zfHpIsAllowedChannel(zdev_t* dev, u16_t freq);
7818 +void zfHpDisableDfsChannel(zdev_t* dev, u8_t disableFlag);
7819 +void zfHpSetTTSIFSTime(zdev_t* dev, u8_t sifs_time);
7820 +
7821 +void zfHpQueryMonHalRxInfo(zdev_t* dev, u8_t *monHalRxInfo);
7822 +
7823 +void zfDumpSSID(u8_t length, u8_t *value);
7824 +void zfHpSetAggPktNum(zdev_t* dev, u32_t num);
7825 +void zfHpSetMPDUDensity(zdev_t* dev, u8_t density);
7826 +void zfHpSetSlotTime(zdev_t* dev, u8_t type);
7827 +void zfHpSetSlotTimeRegister(zdev_t* dev, u8_t type);
7828 +void zfHpSetRifs(zdev_t* dev, u8_t ht_enable, u8_t ht2040, u8_t g_mode);
7829 +void zfHpBeginSiteSurvey(zdev_t* dev, u8_t status);
7830 +void zfHpFinishSiteSurvey(zdev_t* dev, u8_t status);
7831 +u16_t zfHpEnableHwRetry(zdev_t* dev);
7832 +u16_t zfHpDisableHwRetry(zdev_t* dev);
7833 +void zfHpSWDecrypt(zdev_t* dev, u8_t enable);
7834 +void zfHpSWEncrypt(zdev_t* dev, u8_t enable);
7835 +u32_t zfHpCapability(zdev_t* dev);
7836 +void zfHpSetRollCallTable(zdev_t* dev);
7837 +u8_t zfHpregulatoryDomain(zdev_t* dev);
7838 +u16_t zfStaAddIePowerCap(zdev_t* dev, zbuf_t* buf, u16_t offset);
7839 +u8_t zfHpGetMaxTxPower(zdev_t* dev);
7840 +u8_t zfHpGetMinTxPower(zdev_t* dev);
7841 +u16_t zfStaAddIeSupportCh(zdev_t* dev, zbuf_t* buf, u16_t offset);
7842 +void zfHpEnableRifs(zdev_t* dev, u8_t mode24g, u8_t modeHt, u8_t modeHt2040);
7843 +void zfHpDisableRifs(zdev_t* dev);
7844 +u16_t zfHpUsbReset(zdev_t* dev);
7845 +
7846 +
7847 +#endif /* #ifndef _CFUNC_H */
7848 --- /dev/null
7849 +++ b/drivers/staging/otus/80211core/chb.c
7850 @@ -0,0 +1,200 @@
7851 +/*
7852 + * Copyright (c) 2007-2008 Atheros Communications Inc.
7853 + *
7854 + * Permission to use, copy, modify, and/or distribute this software for any
7855 + * purpose with or without fee is hereby granted, provided that the above
7856 + * copyright notice and this permission notice appear in all copies.
7857 + *
7858 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
7859 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
7860 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
7861 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
7862 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
7863 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
7864 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
7865 + */
7866 +/* */
7867 +/* Module Name : hb.c */
7868 +/* */
7869 +/* Abstract */
7870 +/* This module contains house keeping and timer functions. */
7871 +/* */
7872 +/* NOTES */
7873 +/* None */
7874 +/* */
7875 +/************************************************************************/
7876 +#include "cprecomp.h"
7877 +
7878 +/* Called by wrapper every 10 msec */
7879 +void zfiHeartBeat(zdev_t* dev)
7880 +{
7881 + zmw_get_wlan_dev(dev);
7882 +
7883 + wd->tick++;
7884 +
7885 +#if 0
7886 + /* => every 1.28 seconds */
7887 + if (wd->cwm.cw_enable && ((wd->tick & 0x7f) == 0x3f))
7888 + {
7889 + zfHpCwmUpdate(dev);
7890 + }
7891 +#endif
7892 + /* => every 2.56 seconds */
7893 + if ((wd->tick & 0xff) == 0)
7894 + {
7895 + zfAgingDefragList(dev, 1);
7896 + }
7897 +
7898 + /* Watch Dog */
7899 + //zfWatchDog();
7900 +
7901 + /* LED Control (per 100ms) */
7902 + if ((wd->tick % 10) == 9)
7903 + {
7904 + zfLed100msCtrl(dev);
7905 +#ifdef ZM_ENABLE_BA_RATECTRL
7906 + if (!wd->modeMDKEnable)
7907 + {
7908 + zfiDbgReadTally(dev);
7909 + }
7910 +#endif
7911 + }
7912 +
7913 +#ifdef ZM_ENABLE_REWRITE_BEACON_START_ADDRESS
7914 + if ( wd->wlanMode == ZM_MODE_IBSS )
7915 + {
7916 + if ( zfStaIsConnected(dev) )
7917 + {
7918 + zfReWriteBeaconStartAddress(dev);
7919 + }
7920 + }
7921 +#endif
7922 +
7923 + if ( wd->wlanMode == ZM_MODE_IBSS )
7924 + {
7925 + if ( zfStaIsConnected(dev) )
7926 + {
7927 + wd->tickIbssReceiveBeacon++; // add 10ms
7928 +
7929 + if ( (wd->sta.ibssSiteSurveyStatus == 2) &&
7930 + (wd->tickIbssReceiveBeacon == 300) &&
7931 + (wd->sta.ibssReceiveBeaconCount < 3) )
7932 + {
7933 + zm_debug_msg0("It is happen!!! No error message");
7934 + zfReSetCurrentFrequency(dev);
7935 + }
7936 + }
7937 + }
7938 +
7939 + if(wd->sta.ReceivedPacketRateCounter <= 0)
7940 + {
7941 + wd->sta.ReceivedPktRatePerSecond = wd->sta.TotalNumberOfReceivePackets;
7942 + //zm_debug_msg1("Receive Packet Per Second = ", wd->sta.ReceivedPktRatePerSecond);
7943 + if (wd->sta.TotalNumberOfReceivePackets != 0)
7944 + {
7945 + wd->sta.avgSizeOfReceivePackets = wd->sta.TotalNumberOfReceiveBytes/wd->sta.TotalNumberOfReceivePackets;
7946 + }
7947 + else
7948 + {
7949 + wd->sta.avgSizeOfReceivePackets = 640;
7950 + }
7951 + wd->sta.TotalNumberOfReceivePackets = 0;
7952 + wd->sta.TotalNumberOfReceiveBytes = 0;
7953 + wd->sta.ReceivedPacketRateCounter = 100; /*for another 1s*/
7954 + }
7955 + else
7956 + {
7957 + wd->sta.ReceivedPacketRateCounter--;
7958 + }
7959 +
7960 + /* => every 1.28 seconds */
7961 + if((wd->tick & 0x7f) == 0x3f)
7962 + {
7963 + if( wd->sta.NonNAPcount > 0)
7964 + {
7965 + wd->sta.RTSInAGGMode = TRUE;
7966 + wd->sta.NonNAPcount = 0;
7967 + }
7968 + else
7969 + {
7970 + wd->sta.RTSInAGGMode = FALSE;
7971 + }
7972 + }
7973 +
7974 +
7975 +
7976 + /* Maintain management time tick */
7977 + zfMmApTimeTick(dev);
7978 + zfMmStaTimeTick(dev);
7979 +
7980 + //zfPhyCrTuning(dev);
7981 +
7982 + //zfTxPowerControl(dev);
7983 + zfHpHeartBeat(dev);
7984 +
7985 +}
7986 +
7987 +
7988 +void zfDumpBssList(zdev_t* dev)
7989 +{
7990 + struct zsBssInfo* pBssInfo;
7991 + u8_t str[33];
7992 + u8_t i, j;
7993 + u32_t addr1, addr2;
7994 + zmw_get_wlan_dev(dev);
7995 + zmw_declare_for_critical_section();
7996 +
7997 + zm_debug_msg0("***** Bss scan result *****");
7998 + zmw_enter_critical_section(dev);
7999 +
8000 + pBssInfo = wd->sta.bssList.head;
8001 +
8002 + for( i=0; i<wd->sta.bssList.bssCount; i++ )
8003 + {
8004 + if ( i )
8005 + {
8006 + zm_debug_msg0("---------------------------");
8007 + }
8008 +
8009 + zm_debug_msg1("BSS #", i);
8010 + for(j=0; j<pBssInfo->ssid[1]; j++)
8011 + {
8012 + str[j] = pBssInfo->ssid[2+j];
8013 + }
8014 + str[pBssInfo->ssid[1]] = 0;
8015 + zm_debug_msg0("SSID = ");
8016 + zm_debug_msg0(str);
8017 +
8018 + addr1 = (pBssInfo->bssid[0] << 16) + (pBssInfo->bssid[1] << 8 )
8019 + + pBssInfo->bssid[2];
8020 + addr2 = (pBssInfo->bssid[3] << 16) + (pBssInfo->bssid[4] << 8 )
8021 + + pBssInfo->bssid[5];
8022 + zm_debug_msg2("Bssid = ", addr1);
8023 + zm_debug_msg2(" ", addr2);
8024 + zm_debug_msg1("frequency = ", pBssInfo->frequency);
8025 + zm_debug_msg1("security type = ", pBssInfo->securityType);
8026 + zm_debug_msg1("WME = ", pBssInfo->wmeSupport);
8027 + zm_debug_msg1("beacon interval = ", pBssInfo->beaconInterval[0]
8028 + + (pBssInfo->beaconInterval[1] << 8));
8029 + zm_debug_msg1("capability = ", pBssInfo->capability[0]
8030 + + (pBssInfo->capability[1] << 8));
8031 + if ( pBssInfo->supportedRates[1] > 0 )
8032 + {
8033 + for( j=0; j<pBssInfo->supportedRates[1]; j++ )
8034 + {
8035 + zm_debug_msg2("supported rates = ", pBssInfo->supportedRates[2+j]);
8036 + }
8037 + }
8038 +
8039 + for( j=0; j<pBssInfo->extSupportedRates[1]; j++ )
8040 + {
8041 + zm_debug_msg2("ext supported rates = ", pBssInfo->extSupportedRates[2+j]);
8042 + }
8043 +
8044 + pBssInfo = pBssInfo->next;
8045 + }
8046 + zmw_leave_critical_section(dev);
8047 +
8048 + zm_debug_msg0("***************************");
8049 +}
8050 +
8051 --- /dev/null
8052 +++ b/drivers/staging/otus/80211core/cic.c
8053 @@ -0,0 +1,496 @@
8054 +/*
8055 + * Copyright (c) 2007-2008 Atheros Communications Inc.
8056 + *
8057 + * Permission to use, copy, modify, and/or distribute this software for any
8058 + * purpose with or without fee is hereby granted, provided that the above
8059 + * copyright notice and this permission notice appear in all copies.
8060 + *
8061 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8062 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
8063 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
8064 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
8065 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
8066 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
8067 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
8068 + */
8069 +
8070 +#include "cprecomp.h"
8071 +#include "ratectrl.h"
8072 +
8073 +
8074 +void zfUpdateBssid(zdev_t* dev, u8_t* bssid)
8075 +{
8076 +
8077 + zmw_get_wlan_dev(dev);
8078 +
8079 + //zmw_declare_for_critical_section();
8080 +
8081 + //zmw_enter_critical_section(dev);
8082 + wd->sta.bssid[0] = bssid[0] + (((u16_t) bssid[1]) << 8);
8083 + wd->sta.bssid[1] = bssid[2] + (((u16_t) bssid[3]) << 8);
8084 + wd->sta.bssid[2] = bssid[4] + (((u16_t) bssid[5]) << 8);
8085 + //zmw_leave_critical_section(dev);
8086 +
8087 + zfHpSetBssid(dev, bssid);
8088 +
8089 +}
8090 +
8091 +/************************************************************************************/
8092 +/* */
8093 +/* FUNCTION DESCRIPTION zfResetSupportRate */
8094 +/* Reset support rate to default value. */
8095 +/* */
8096 +/* INPUTS */
8097 +/* dev : device pointer */
8098 +/* type: ZM_DEFAULT_SUPPORT_RATE_ZERO => reset to zero */
8099 +/* ZM_DEFAULT_SUPPORT_RATE_DISCONNECT => reset to disconnect status */
8100 +/* ZM_DEFAULT_SUPPORT_RATE_IBSS_B => reset to IBSS creator(b mode) */
8101 +/* ZM_DEFAULT_SUPPORT_RATE_IBSS_AG => reset to IBSS creator(a/g mode) */
8102 +/* */
8103 +/************************************************************************************/
8104 +void zfResetSupportRate(zdev_t* dev, u8_t type)
8105 +{
8106 + zmw_get_wlan_dev(dev);
8107 +
8108 + switch(type)
8109 + {
8110 + case ZM_DEFAULT_SUPPORT_RATE_ZERO:
8111 + wd->bRate = 0;
8112 + wd->bRateBasic = 0;
8113 + wd->gRate = 0;
8114 + wd->gRateBasic = 0;
8115 + break;
8116 + case ZM_DEFAULT_SUPPORT_RATE_DISCONNECT:
8117 + wd->bRate = 0xf;
8118 + wd->bRateBasic = 0xf;
8119 + wd->gRate = 0xff;
8120 + wd->gRateBasic = 0x15;
8121 + break;
8122 + case ZM_DEFAULT_SUPPORT_RATE_IBSS_B:
8123 + wd->bRate = 0xf;
8124 + wd->bRateBasic = 0xf;
8125 + wd->gRate = 0;
8126 + wd->gRateBasic = 0;
8127 + break;
8128 + case ZM_DEFAULT_SUPPORT_RATE_IBSS_AG:
8129 + wd->bRate = 0xf;
8130 + wd->bRateBasic = 0xf;
8131 + wd->gRate = 0xff;
8132 + wd->gRateBasic = 0;
8133 + break;
8134 + }
8135 +}
8136 +
8137 +void zfUpdateSupportRate(zdev_t* dev, u8_t* rateArray)
8138 +{
8139 + u8_t bRate=0, bRateBasic=0, gRate=0, gRateBasic=0;
8140 + u8_t length = rateArray[1];
8141 + u8_t i, j;
8142 +
8143 + zmw_get_wlan_dev(dev);
8144 +
8145 + for(i=2; i<length+2; i++)
8146 + {
8147 + for(j=0; j<4; j++)
8148 + {
8149 + if ( (rateArray[i] & 0x7f) == zg11bRateTbl[j] )
8150 + {
8151 + bRate |= (1 << j);
8152 + if ( rateArray[i] & 0x80 )
8153 + {
8154 + bRateBasic |= (1 << j);
8155 + }
8156 + }
8157 + }
8158 +
8159 + if ( j == 4 )
8160 + {
8161 + for(j=0; j<8; j++)
8162 + {
8163 + if ( (rateArray[i] & 0x7f) == zg11gRateTbl[j] )
8164 + {
8165 + gRate |= (1 << j);
8166 + if ( rateArray[i] & 0x80 )
8167 + {
8168 + gRateBasic |= (1 << j);
8169 + }
8170 + }
8171 + }
8172 + }
8173 + }
8174 +
8175 +
8176 + wd->bRate |= bRate;
8177 + wd->bRateBasic |= bRateBasic;
8178 + wd->gRate |= gRate;
8179 + wd->gRateBasic |= gRateBasic;
8180 +}
8181 +
8182 +u8_t zfIsGOnlyMode(zdev_t* dev, u16_t frequency, u8_t* rateArray)
8183 +{
8184 + u8_t length = rateArray[1];
8185 + u8_t i, j;
8186 +
8187 + if (frequency < 3000) {
8188 + for (i = 2; i < length+2; i++) {
8189 + for (j = 0; j < 8; j++) {
8190 + if ( ((rateArray[i] & 0x7f) == zg11gRateTbl[j])
8191 + && (rateArray[i] & 0x80) ) {
8192 + return 1;
8193 + }
8194 + }
8195 + }
8196 + }
8197 +
8198 + return 0;
8199 +}
8200 +
8201 +void zfGatherBMode(zdev_t* dev, u8_t* rateArray, u8_t* extrateArray)
8202 +{
8203 + u8_t gatherBMode[ZM_MAX_SUPP_RATES_IE_SIZE + 2];
8204 + u8_t i, j, k = 0;
8205 + u8_t length;
8206 +
8207 + gatherBMode[0] = ZM_WLAN_EID_SUPPORT_RATE;
8208 + gatherBMode[1] = 0;
8209 +
8210 + length = rateArray[1];
8211 + for (i = 2; i < length+2; i++) {
8212 + for (j = 0; j < 4; j++) {
8213 + if ( (rateArray[i] & 0x7f) == zg11bRateTbl[j] ) {
8214 + gatherBMode[2+k] = rateArray[i];
8215 +
8216 + gatherBMode[1]++;
8217 + k++;
8218 + }
8219 + }
8220 + }
8221 +
8222 + length = extrateArray[1];
8223 + for (i = 2; i < length+2; i++) {
8224 + for (j = 0; j < 4; j++) {
8225 + if ( (extrateArray[i] & 0x7f) == zg11bRateTbl[j] ) {
8226 + gatherBMode[2+k] = extrateArray[i];
8227 +
8228 + gatherBMode[1]++;
8229 + k++;
8230 + }
8231 + }
8232 + }
8233 +
8234 + extrateArray[0] = extrateArray[1] = 0;
8235 + zfMemoryCopy(rateArray, gatherBMode, gatherBMode[1]+2);
8236 +}
8237 +
8238 +u16_t zfGetRandomNumber(zdev_t* dev, u16_t initValue)
8239 +{
8240 +#if 0
8241 + /* Compiler/Linker error on Linux */
8242 + if ( initValue )
8243 + {
8244 + srand(initValue);
8245 + }
8246 +
8247 + return ((u16_t)rand());
8248 +#endif
8249 + return 0;
8250 +}
8251 +
8252 +u8_t zfPSDeviceSleep(zdev_t* dev)
8253 +{
8254 + //zmw_get_wlan_dev(dev);
8255 +
8256 + /* enter PS mode */
8257 +
8258 + return 0;
8259 +}
8260 +
8261 +u8_t zcOfdmPhyCrtlToRate[] =
8262 +{
8263 + /* 0x8=48M, 0x9=24M, 0xa=12M, 0xb=6M, 0xc=54M, 0xd=36M, 0xe=18M, 0xf=9M */
8264 + 10, 8, 6, 4, 11, 9, 7, 5
8265 +};
8266 +
8267 +u8_t zfPhyCtrlToRate(u32_t phyCtrl)
8268 +{
8269 + u32_t mt, mcs, sg;
8270 + u8_t rate = 0;
8271 +
8272 + mt = phyCtrl & 0x3;
8273 + mcs = (phyCtrl>>18) & 0x3f;
8274 + sg = (phyCtrl>>31) & 0x1;
8275 +
8276 + if ((mt == 0) && (mcs <=3))
8277 + {
8278 + rate = (u8_t)mcs;
8279 + }
8280 + else if ((mt == 1) && (mcs >= 0x8) && (mcs <= 0xf))
8281 + {
8282 + rate = zcOfdmPhyCrtlToRate[mcs-8];
8283 + }
8284 + else if ((mt == 2) && (mcs <= 15))
8285 + {
8286 + rate = (u8_t)mcs + 12;
8287 + if(sg) {
8288 + if (mcs != 7)
8289 + {
8290 + rate = (u8_t)mcs + 12 + 2;
8291 + }
8292 + else //MCS7-SG
8293 + {
8294 + rate = (u8_t)30;
8295 + }
8296 + }
8297 + }
8298 +
8299 + return rate;
8300 +}
8301 +
8302 +
8303 +void zfCoreEvent(zdev_t* dev, u16_t event, u8_t* rsp)
8304 +{
8305 + u16_t i;
8306 + zbuf_t* psBuf;
8307 + u8_t moreData;
8308 + u8_t vap = 0;
8309 + u8_t peerIdx;
8310 + s8_t res;
8311 + zmw_get_wlan_dev(dev);
8312 + zmw_declare_for_critical_section();
8313 +
8314 +
8315 + if (event == 0) //Beacon Event
8316 + {
8317 + if ( wd->wlanMode == ZM_MODE_AP )
8318 + {
8319 + zfApSendBeacon(dev);
8320 +
8321 + if (wd->CurrentDtimCount == 0)
8322 + {
8323 + /* TODO : Send queued broadcast frames at BC/MC event */
8324 + do
8325 + {
8326 + psBuf = NULL;
8327 + moreData = 0;
8328 + zmw_enter_critical_section(dev);
8329 + if (wd->ap.bcmcTail[vap] != wd->ap.bcmcHead[vap])
8330 + {
8331 + //zm_msg0_mm(ZM_LV_0, "Send BCMC frames");
8332 + psBuf = wd->ap.bcmcArray[vap][wd->ap.bcmcHead[vap]];
8333 + wd->ap.bcmcHead[vap] = (wd->ap.bcmcHead[vap] + 1)
8334 + & (ZM_BCMC_ARRAY_SIZE - 1);
8335 + if (wd->ap.bcmcTail[vap] != wd->ap.bcmcHead[vap])
8336 + {
8337 + moreData = 0x20;
8338 + }
8339 + }
8340 + zmw_leave_critical_section(dev);
8341 + if (psBuf != NULL)
8342 + {
8343 + /* TODO : config moreData bit */
8344 + zfTxSendEth(dev, psBuf, 0, ZM_EXTERNAL_ALLOC_BUF,
8345 + moreData);
8346 + }
8347 + } while(psBuf != NULL);
8348 +
8349 + }
8350 + }
8351 + else
8352 + {
8353 + /* STA mode */
8354 + if ( wd->sta.powerSaveMode > ZM_STA_PS_NONE )
8355 + {
8356 + /* send queued packets */
8357 + for(i=0; i<wd->sta.staPSDataCount; i++)
8358 + {
8359 + zfTxSendEth(dev, wd->sta.staPSDataQueue[i], 0,
8360 + ZM_EXTERNAL_ALLOC_BUF, 0);
8361 + }
8362 +
8363 + wd->sta.staPSDataCount = 0;
8364 + }
8365 +
8366 + if ( wd->wlanMode == ZM_MODE_IBSS )
8367 + {
8368 + zfStaSendBeacon(dev);
8369 + wd->sta.ibssAtimTimer = ZM_BIT_15 | wd->sta.atimWindow;
8370 + }
8371 +
8372 + zfPowerSavingMgrPreTBTTInterrupt(dev);
8373 + }
8374 + } //if (event == 0) //Beacon Event
8375 + else if (event == 1) //Retry completed event
8376 + {
8377 + u32_t retryRate;
8378 +
8379 + retryRate = (u32_t)(rsp[6]) + (((u32_t)(rsp[7]))<<8)
8380 + + (((u32_t)(rsp[8]))<<16) + (((u32_t)(rsp[9]))<<24);
8381 + /* Degrade Tx Rate */
8382 + if (wd->wlanMode == ZM_MODE_AP)
8383 + {
8384 + zmw_enter_critical_section(dev);
8385 + if ((i=zfApFindSta(dev, (u16_t*)rsp)) != 0xffff)
8386 + {
8387 + zfRateCtrlTxFailEvent(dev, &wd->ap.staTable[i].rcCell, 0,(u32_t)zfPhyCtrlToRate(retryRate));
8388 + }
8389 + zmw_leave_critical_section(dev);
8390 + }
8391 + else
8392 + {
8393 + zmw_enter_critical_section(dev);
8394 + res = zfStaFindOppositeByMACAddr(dev, (u16_t*)rsp, &peerIdx);
8395 + if ( res == 0 )
8396 + {
8397 + zfRateCtrlTxFailEvent(dev, &wd->sta.oppositeInfo[peerIdx].rcCell, 0,(u32_t)zfPhyCtrlToRate(retryRate));
8398 + }
8399 + zmw_leave_critical_section(dev);
8400 + }
8401 + } //else if (event == 1) //Retry completed event
8402 + else if (event == 2) //Tx Fail event
8403 + {
8404 + u32_t retryRate;
8405 +
8406 + retryRate = (u32_t)(rsp[6]) + (((u32_t)(rsp[7]))<<8)
8407 + + (((u32_t)(rsp[8]))<<16) + (((u32_t)(rsp[9]))<<24);
8408 +
8409 + /* Degrade Tx Rate */
8410 + if (wd->wlanMode == ZM_MODE_AP)
8411 + {
8412 + zmw_enter_critical_section(dev);
8413 + if ((i=zfApFindSta(dev, (u16_t*)rsp)) != 0xffff)
8414 + {
8415 + zfRateCtrlTxFailEvent(dev, &wd->ap.staTable[i].rcCell, 0,(u32_t)zfPhyCtrlToRate(retryRate));
8416 + }
8417 + zmw_leave_critical_section(dev);
8418 +
8419 + zfApSendFailure(dev, rsp);
8420 + }
8421 + else
8422 + {
8423 + zmw_enter_critical_section(dev);
8424 + res = zfStaFindOppositeByMACAddr(dev, (u16_t*)rsp, &peerIdx);
8425 + if ( res == 0 )
8426 + {
8427 + zfRateCtrlTxFailEvent(dev, &wd->sta.oppositeInfo[peerIdx].rcCell, 0,(u32_t)zfPhyCtrlToRate(retryRate));
8428 + }
8429 + zmw_leave_critical_section(dev);
8430 + }
8431 + } //else if (event == 2) //Tx Fail event
8432 + else if (event == 3) //Tx Comp event
8433 + {
8434 + u32_t retryRate;
8435 +
8436 + retryRate = (u32_t)(rsp[6]) + (((u32_t)(rsp[7]))<<8)
8437 + + (((u32_t)(rsp[8]))<<16) + (((u32_t)(rsp[9]))<<24);
8438 +
8439 + /* TODO : Tx completed, used for rate control probing */
8440 + if (wd->wlanMode == ZM_MODE_AP)
8441 + {
8442 + zmw_enter_critical_section(dev);
8443 + if ((i=zfApFindSta(dev, (u16_t*)rsp)) != 0xffff)
8444 + {
8445 + zfRateCtrlTxSuccessEvent(dev, &wd->ap.staTable[i].rcCell, zfPhyCtrlToRate(retryRate));
8446 + }
8447 + zmw_leave_critical_section(dev);
8448 + }
8449 + else
8450 + {
8451 + zmw_enter_critical_section(dev);
8452 + res = zfStaFindOppositeByMACAddr(dev, (u16_t*)rsp, &peerIdx);
8453 + if ( res == 0 )
8454 + {
8455 + zfRateCtrlTxSuccessEvent(dev, &wd->sta.oppositeInfo[peerIdx].rcCell, zfPhyCtrlToRate(retryRate));
8456 + }
8457 + zmw_leave_critical_section(dev);
8458 + }
8459 + } //else if (event == 3) //Tx Comp event
8460 + else if (event == 4) //BA failed count
8461 + {
8462 + u32_t fail;
8463 + u32_t rate;
8464 + peerIdx = 0;
8465 +
8466 + fail=((u32_t*)rsp)[0] & 0xFFFF;
8467 + rate=((u32_t*)rsp)[0] >> 16;
8468 +
8469 + if (rate > 15) {
8470 + rate = (rate & 0xF) + 12 + 2;
8471 + }
8472 + else {
8473 + rate = rate + 12;
8474 + }
8475 +
8476 + zmw_enter_critical_section(dev);
8477 + zfRateCtrlTxFailEvent(dev, &wd->sta.oppositeInfo[peerIdx].rcCell, (u8_t)rate, fail);
8478 + zmw_leave_critical_section(dev);
8479 + }
8480 +}
8481 +
8482 +void zfBeaconCfgInterrupt(zdev_t* dev, u8_t* rsp)
8483 +{
8484 + u32_t txBeaconCounter;
8485 +
8486 + zmw_get_wlan_dev(dev);
8487 +
8488 + zmw_declare_for_critical_section();
8489 +
8490 + if ( wd->wlanMode == ZM_MODE_IBSS )
8491 + {
8492 + txBeaconCounter = *((u32_t *)rsp);
8493 + if ( wd->sta.beaconTxCnt != txBeaconCounter )
8494 + {
8495 + wd->sta.txBeaconInd = 1;
8496 +
8497 + zmw_enter_critical_section(dev);
8498 + wd->tickIbssSendBeacon = 0;
8499 + zmw_leave_critical_section(dev);
8500 + }
8501 + else
8502 + {
8503 + wd->sta.txBeaconInd = 0;
8504 + }
8505 +
8506 +#ifdef ZM_ENABLE_IBSS_DELAYED_JOIN_INDICATION
8507 + if ( wd->sta.txBeaconInd && wd->sta.ibssDelayedInd )
8508 + {
8509 + if (wd->zfcbIbssPartnerNotify != NULL)
8510 + {
8511 + wd->zfcbIbssPartnerNotify(dev, 1, &wd->sta.ibssDelayedIndEvent);
8512 + }
8513 +
8514 + wd->sta.ibssDelayedInd = 0;
8515 + }
8516 +#endif
8517 +
8518 + wd->sta.beaconTxCnt = txBeaconCounter;
8519 +
8520 + // Need to check if the time is expired after ATIM window??
8521 +
8522 + // Check if we have buffered any data for those stations that are sleeping
8523 + // If it's true, then transmitting ATIM pkt to notify them
8524 +
8525 +#ifdef ZM_ENABLE_IBSS_PS
8526 + // TODO: Need to check if the station receive our ATIM pkt???
8527 + zfStaIbssPSSend(dev);
8528 +
8529 + if ( wd->sta.atimWindow == 0 )
8530 + {
8531 + // We won't receive the end of ATIM isr so we fake it
8532 + zfPowerSavingMgrAtimWinExpired(dev);
8533 + }
8534 +#endif
8535 + }
8536 +}
8537 +
8538 +void zfEndOfAtimWindowInterrupt(zdev_t* dev)
8539 +{
8540 +#ifdef ZM_ENABLE_IBSS_PS
8541 + zmw_get_wlan_dev(dev);
8542 +
8543 + if ( wd->wlanMode == ZM_MODE_IBSS )
8544 + {
8545 + // Transmit any queued pkt for the stations!!
8546 + zfPowerSavingMgrAtimWinExpired(dev);
8547 + }
8548 +#endif
8549 +}
8550 --- /dev/null
8551 +++ b/drivers/staging/otus/80211core/cinit.c
8552 @@ -0,0 +1,1911 @@
8553 +/*
8554 + * Copyright (c) 2007-2008 Atheros Communications Inc.
8555 + *
8556 + * Permission to use, copy, modify, and/or distribute this software for any
8557 + * purpose with or without fee is hereby granted, provided that the above
8558 + * copyright notice and this permission notice appear in all copies.
8559 + *
8560 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8561 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
8562 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
8563 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
8564 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
8565 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
8566 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
8567 + */
8568 +/* */
8569 +/* Module Name : init.c */
8570 +/* */
8571 +/* Abstract */
8572 +/* This module contains init functions. */
8573 +/* */
8574 +/* NOTES */
8575 +/* None */
8576 +/* */
8577 +/************************************************************************/
8578 +#include "cprecomp.h"
8579 +#include "../hal/hpreg.h"
8580 +
8581 +extern const u8_t zcUpToAc[8];
8582 +
8583 +u16_t zcIndextoRateBG[16] = {1000, 2000, 5500, 11000, 0, 0, 0, 0, 48000,
8584 + 24000, 12000, 6000, 54000, 36000, 18000, 9000};
8585 +u32_t zcIndextoRateN20L[16] = {6500, 13000, 19500, 26000, 39000, 52000, 58500,
8586 + 65000, 13000, 26000, 39000, 52000, 78000, 104000,
8587 + 117000, 130000};
8588 +u32_t zcIndextoRateN20S[16] = {7200, 14400, 21700, 28900, 43300, 57800, 65000,
8589 + 72200, 14400, 28900, 43300, 57800, 86700, 115600,
8590 + 130000, 144400};
8591 +u32_t zcIndextoRateN40L[16] = {13500, 27000, 40500, 54000, 81000, 108000, 121500,
8592 + 135000, 27000, 54000, 81000, 108000, 162000, 216000,
8593 + 243000, 270000};
8594 +u32_t zcIndextoRateN40S[16] = {15000, 30000, 45000, 60000, 90000, 120000, 135000,
8595 + 150000, 30000, 60000, 90000, 120000, 180000, 240000,
8596 + 270000, 300000};
8597 +
8598 +/************************************************************************/
8599 +/* */
8600 +/* FUNCTION DESCRIPTION zfTxGenWlanHeader */
8601 +/* Generate WLAN MAC header and LLC header. */
8602 +/* */
8603 +/* INPUTS */
8604 +/* dev : device pointer */
8605 +/* buf : buffer pointer */
8606 +/* id : Index of TxD */
8607 +/* port : WLAN port */
8608 +/* */
8609 +/* OUTPUTS */
8610 +/* length of removed Ethernet header */
8611 +/* */
8612 +/* AUTHOR */
8613 +/* Stephen ZyDAS Technology Corporation 2005.5 */
8614 +/* */
8615 +/************************************************************************/
8616 +u16_t zfTxGenWlanHeader(zdev_t* dev, zbuf_t* buf, u16_t* header, u16_t seq,
8617 + u8_t flag, u16_t plusLen, u16_t minusLen, u16_t port,
8618 + u16_t* da, u16_t* sa, u8_t up, u16_t *micLen,
8619 + u16_t* snap, u16_t snapLen, struct aggControl *aggControl)
8620 +{
8621 +
8622 + u16_t len;
8623 + u16_t macCtrl;
8624 + u32_t phyCtrl;
8625 + u16_t hlen = 16;
8626 + u16_t icvLen = 0;
8627 + u16_t wdsPortId;
8628 + u16_t vap = 0;
8629 + u16_t mcs = 0;
8630 + u16_t mt = 0;
8631 + u8_t qosType;
8632 + u8_t b1, b2;
8633 + u16_t wdsPort;
8634 + u8_t encExemptionActionType;
8635 + u16_t rateProbingFlag = 0;
8636 + u8_t tkipFrameOffset = 0;
8637 +
8638 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
8639 + u8_t res, peerIdx;
8640 + u8_t userIdx=0;
8641 + u16_t *iv16;
8642 + u32_t *iv32;
8643 +#endif
8644 +
8645 + zmw_get_wlan_dev(dev);
8646 +
8647 + /* Generate WLAN header */
8648 + /* Frame control */
8649 + header[4] = 0x0008 | (flag<<8);
8650 + /* Duration */
8651 + header[5] = 0x0000;
8652 +
8653 + if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)
8654 + {
8655 + /* ToDS bit */
8656 + header[4] |= 0x0100;
8657 +
8658 + /*Sometimes we wake up to tx/rx but AP still think we are sleeping, so still need to set this bit*/
8659 + if ( zfPowerSavingMgrIsSleeping(dev) || wd->sta.psMgr.tempWakeUp == 1 )
8660 + {
8661 + header[4] |= 0x1000;
8662 + }
8663 +
8664 + /* Address 1 = BSSID */
8665 + header[6] = wd->sta.bssid[0];
8666 + header[7] = wd->sta.bssid[1];
8667 + header[8] = wd->sta.bssid[2];
8668 + /* Address 3 = DA */
8669 + header[12] = da[0];
8670 + header[13] = da[1];
8671 + header[14] = da[2];
8672 + }
8673 + else if (wd->wlanMode == ZM_MODE_PSEUDO)
8674 + {
8675 + /* Address 1 = DA */
8676 + header[6] = da[0];
8677 + header[7] = da[1];
8678 + header[8] = da[2];
8679 + /* Address 3 = 00:00:00:00:00:00 */
8680 + header[12] = 0;
8681 + header[13] = 0;
8682 + header[14] = 0;
8683 +
8684 + /* PSEUDO test : WDS */
8685 + if (wd->enableWDS)
8686 + {
8687 + /* ToDS and FromDS bit */
8688 + header[4] |= 0x0300;
8689 +
8690 + /* Address 4 = SA */
8691 + header[16] = 0;
8692 + header[17] = 0;
8693 + header[18] = 0;
8694 +
8695 + hlen = 19;
8696 + }
8697 + }
8698 + else if (wd->wlanMode == ZM_MODE_IBSS)
8699 + {
8700 + /* Address 1 = DA */
8701 + header[6] = da[0];
8702 + header[7] = da[1];
8703 + header[8] = da[2];
8704 + /* Address 3 = BSSID */
8705 + header[12] = wd->sta.bssid[0];
8706 + header[13] = wd->sta.bssid[1];
8707 + header[14] = wd->sta.bssid[2];
8708 +
8709 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
8710 + zmw_enter_critical_section(dev);
8711 + res = zfStaFindOppositeByMACAddr(dev, da, &peerIdx);
8712 + if(res == 0) // Find opposite in our OppositeInfo Structure !
8713 + {
8714 + userIdx = peerIdx;
8715 + }
8716 + zmw_leave_critical_section(dev);
8717 +#endif
8718 + }
8719 + else if (wd->wlanMode == ZM_MODE_AP)
8720 + {
8721 + if (port < 0x20)
8722 + /* AP mode */
8723 + {
8724 + /* FromDS bit */
8725 + header[4] |= 0x0200;
8726 +
8727 + /* Address 1 = DA */
8728 + header[6] = da[0];
8729 + header[7] = da[1];
8730 + header[8] = da[2];
8731 + /* Address 3 = SA */
8732 + header[12] = sa[0];
8733 + header[13] = sa[1];
8734 + header[14] = sa[2];
8735 +
8736 + if (port < ZM_MAX_AP_SUPPORT)
8737 + {
8738 + vap = port;
8739 + header[14] += (vap<<8);
8740 + }
8741 + }
8742 + else
8743 + /* WDS port */
8744 + {
8745 + /* ToDS and FromDS bit */
8746 + header[4] |= 0x0300;
8747 +
8748 + wdsPortId = port - 0x20;
8749 +
8750 + /* Address 1 = RA */
8751 + header[6] = wd->ap.wds.macAddr[wdsPortId][0];
8752 + header[7] = wd->ap.wds.macAddr[wdsPortId][1];
8753 + header[8] = wd->ap.wds.macAddr[wdsPortId][2];
8754 + /* Address 3 = DA */
8755 + header[12] = da[0];
8756 + header[13] = da[1];
8757 + header[14] = da[2];
8758 + /* Address 4 = SA */
8759 + header[16] = sa[0];
8760 + header[17] = sa[1];
8761 + header[18] = sa[2];
8762 +
8763 + hlen = 19;
8764 + }
8765 + } /* else if (wd->wlanMode == ZM_MODE_AP) */
8766 +
8767 + /* Address 2 = TA */
8768 + header[9] = wd->macAddr[0];
8769 + header[10] = wd->macAddr[1];
8770 +#ifdef ZM_VAPMODE_MULTILE_SSID
8771 + header[11] = wd->macAddr[2]; //Multiple SSID
8772 +#else
8773 + header[11] = wd->macAddr[2] + (vap<<8); //VAP
8774 +#endif
8775 +
8776 + if ( (wd->wlanMode == ZM_MODE_IBSS) && (wd->XLinkMode) )
8777 + {
8778 + header[9] = sa[0];
8779 + header[10] = sa[1];
8780 + header[11] = sa[2];
8781 + }
8782 +
8783 + /* Sequence Control */
8784 + header[15] = seq;
8785 +
8786 +
8787 + if (wd->wlanMode == ZM_MODE_AP)
8788 + {
8789 + zfApGetStaTxRateAndQosType(dev, da, &phyCtrl, &qosType, &rateProbingFlag);
8790 + mt = (u16_t)(phyCtrl & 0x3);
8791 + mcs = (u16_t)((phyCtrl >> 16) & 0x3f);
8792 +#if 1
8793 + //zfApGetStaQosType(dev, da, &qosType);
8794 +
8795 + /* if DA == WME STA */
8796 + if (qosType == 1)
8797 + {
8798 + /* QoS data */
8799 + header[4] |= 0x0080;
8800 +
8801 + /* QoS Control */
8802 + header[hlen] = up;
8803 + hlen += 1;
8804 + }
8805 +#endif
8806 + }
8807 +
8808 +#if 0
8809 + //AGG Test Code
8810 + if (header[6] == 0x8000)
8811 + {
8812 + /* QoS data */
8813 + header[4] |= 0x0080;
8814 +
8815 + /* QoS Control */
8816 + header[hlen] = 0;
8817 + hlen += 1;
8818 + }
8819 +#endif
8820 +
8821 + if (wd->wlanMode == ZM_MODE_AP) {
8822 + /* Todo: rate control here for qos field */
8823 + }
8824 + else {
8825 + /* Rate control */
8826 + zfStaGetTxRate(dev, da, &phyCtrl, &rateProbingFlag);
8827 + mt = (u16_t)(phyCtrl & 0x3);
8828 + mcs = (u16_t)((phyCtrl >> 16) & 0x3f);
8829 + }
8830 +
8831 + if (wd->txMCS != 0xff)
8832 + {
8833 + /* fixed rate */
8834 + phyCtrl = ((u32_t)wd->txMCS<<16) + wd->txMT;
8835 + mcs = wd->txMCS;
8836 + mt = wd->txMT;
8837 + }
8838 +
8839 + if (wd->enableAggregation)
8840 + {
8841 + /* force enable aggregation */
8842 + if (wd->enableAggregation==2 && !(header[6]&0x1))
8843 + {
8844 + /* QoS data */
8845 + header[4] |= 0x0080;
8846 +
8847 + /* QoS Control */
8848 + header[hlen] = 0;
8849 + hlen += 1;
8850 + }
8851 + /* if wd->enableAggregation=1 => force disable */
8852 + /* if wd->enableAggregation=0 => auto */
8853 + }
8854 +
8855 +#ifdef ZM_ENABLE_AGGREGATION
8856 + /*
8857 + * aggregation control
8858 + */
8859 +
8860 + /*
8861 + * QoS data
8862 + */
8863 + if (wd->wlanMode == ZM_MODE_AP) {
8864 + if (aggControl && mt == 2) {
8865 + if (wd->enableAggregation==0 && !(header[6]&0x1))
8866 + {
8867 + header[4] |= 0x0080;
8868 +
8869 + /*
8870 + * QoS Control
8871 + */
8872 + header[hlen] = 0;
8873 + hlen += 1;
8874 + }
8875 + }
8876 + }
8877 +#endif
8878 +
8879 + // MSDU Length
8880 + len = zfwBufGetSize(dev, buf);
8881 +
8882 + /* Generate control setting */
8883 + /* Backoff, Non-Burst and hardware duration */
8884 + macCtrl = 0x208;
8885 +
8886 + /* ACK */
8887 + if ((header[6] & 0x1) == 0x1)
8888 + {
8889 + /* multicast frame : Set NO-ACK bit */
8890 + macCtrl |= 0x4;
8891 + }
8892 + else
8893 + {
8894 + /* unicast frame */
8895 + #if 0
8896 + // Enable RTS according to MPDU Lengths ( not MSDU Lengths )
8897 + if (len >= wd->rtsThreshold)
8898 + {
8899 + /* Enable RTS */
8900 + macCtrl |= 1;
8901 + }
8902 + #endif
8903 + }
8904 + /* VAP test code */
8905 + //macCtrl |= 0x4;
8906 +
8907 + if (wd->wlanMode == ZM_MODE_AP)
8908 + {
8909 + u8_t encryType;
8910 + u16_t iv16;
8911 + u32_t iv32;
8912 +
8913 + /* Check whether this is a multicast frame */
8914 + if ((header[6] & 0x1) == 0x1)
8915 + {
8916 + /* multicast frame */
8917 + if (wd->ap.encryMode[vap] == ZM_TKIP)
8918 + {
8919 + wd->ap.iv16[vap]++;
8920 +
8921 + if(wd->ap.iv16[vap] == 0)
8922 + {
8923 + wd->ap.iv32[vap]++;
8924 + }
8925 +
8926 + b1 = (u8_t) (wd->ap.iv16[vap] >> 8);
8927 + b2 = (b1 | 0x20) & 0x7f;
8928 + header[hlen] = ((u16_t)b2 << 8) + b1;
8929 + b1 = (u8_t) wd->ap.iv16[vap];
8930 + b2 = 0x20 | (wd->ap.bcKeyIndex[vap] << 6);
8931 + header[hlen+1] = ((u16_t)b2 << 8) + b1;
8932 + header[hlen+2] = (u16_t) wd->ap.iv32[vap];
8933 + header[hlen+3] = (u16_t) (wd->ap.iv32[vap] >> 16);
8934 +
8935 + //macCtrl |= 0x80;
8936 + macCtrl |= 0x40;
8937 + icvLen = 4;
8938 +
8939 + /* set hardware MIC */
8940 + if ( (!(seq & 0xf))&&(!(flag & 0x4)) )
8941 + {
8942 + macCtrl |= 0x100;
8943 + plusLen += 8;
8944 + *micLen = 8;
8945 + }
8946 +
8947 + header[4] |= 0x4000;
8948 + hlen += 4;
8949 + }
8950 + else if (wd->ap.encryMode[vap] == ZM_AES)
8951 + {
8952 + wd->ap.iv16[vap]++;
8953 +
8954 + if(wd->ap.iv16[vap] == 0)
8955 + {
8956 + wd->ap.iv32[vap]++;
8957 + }
8958 +
8959 + b1 = (u8_t) wd->ap.iv16[vap];
8960 + b2 = (u8_t) (wd->ap.iv16[vap] >> 8);
8961 + header[hlen] = ((u16_t)b2 << 8) + b1;
8962 + header[hlen+1] = 0x2000 | (wd->ap.bcKeyIndex[vap] << 14);
8963 + header[hlen+2] = (u16_t) (wd->ap.iv32[vap]);
8964 + header[hlen+3] = (u16_t) (wd->ap.iv32[vap] >> 16);
8965 +
8966 + macCtrl |= 0xc0;
8967 + icvLen = 8; /* MIC */
8968 +
8969 + header[4] |= 0x4000;
8970 + hlen += 4;
8971 + }
8972 + #ifdef ZM_ENABLE_CENC
8973 + else if (wd->ap.encryMode[vap] == ZM_CENC)
8974 + {
8975 + //u32_t txiv[4];
8976 +
8977 + wd->ap.txiv[vap][0]++;
8978 +
8979 + if (wd->ap.txiv[vap][0] == 0)
8980 + {
8981 + wd->ap.txiv[vap][1]++;
8982 + }
8983 +
8984 + if (wd->ap.txiv[vap][1] == 0)
8985 + {
8986 + wd->ap.txiv[vap][2]++;
8987 + }
8988 +
8989 + if (wd->ap.txiv[vap][2] == 0)
8990 + {
8991 + wd->ap.txiv[vap][3]++;
8992 + }
8993 +
8994 + if (wd->ap.txiv[vap][3] == 0)
8995 + {
8996 + wd->ap.txiv[vap][0] = 0;
8997 + wd->ap.txiv[vap][1] = 0;
8998 + wd->ap.txiv[vap][2] = 0;
8999 + }
9000 +
9001 + header[hlen] = (wd->ap.bcKeyIndex[vap] & 0x0001); /* For Key Id and reserved field */
9002 + header[hlen+1] = (u16_t)wd->ap.txiv[vap][0];
9003 + header[hlen+2] = (u16_t)(wd->ap.txiv[vap][0] >> 16);
9004 + header[hlen+3] = (u16_t)wd->ap.txiv[vap][1];
9005 + header[hlen+4] = (u16_t)(wd->ap.txiv[vap][1] >> 16);
9006 + header[hlen+5] = (u16_t)wd->ap.txiv[vap][2];
9007 + header[hlen+6] = (u16_t)(wd->ap.txiv[vap][2] >> 16);
9008 + header[hlen+7] = (u16_t)wd->ap.txiv[vap][3];
9009 + header[hlen+8] = (u16_t)(wd->ap.txiv[vap][3] >> 16);
9010 +
9011 + macCtrl |= 0x80;
9012 + icvLen = 16; /* MIC */
9013 +
9014 + header[4] |= 0x4000;
9015 + hlen += 9;
9016 + }
9017 + #endif //ZM_ENABLE_CENC
9018 + }
9019 + else
9020 + {
9021 + /* Get STA's encryption type */
9022 + zfApGetStaEncryType(dev, da, &encryType);
9023 +
9024 + if (encryType == ZM_TKIP)
9025 + {
9026 + /* Get iv16 and iv32 */
9027 + zfApGetStaWpaIv(dev, da, &iv16, &iv32);
9028 +
9029 + iv16++;
9030 + if (iv16 == 0)
9031 + {
9032 + iv32++;
9033 + }
9034 +
9035 + b1 = (u8_t) (iv16 >> 8);
9036 + b2 = (b1 | 0x20) & 0x7f;
9037 + header[hlen] = ((u16_t)b2 << 8) + b1;
9038 + b1 = (u8_t) iv16;
9039 + b2 = 0x20;
9040 + header[hlen+1] = ((u16_t)b2 << 8) + b1;
9041 + header[hlen+2] = (u16_t) iv32;
9042 + header[hlen+3] = (u16_t) (iv32 >> 16);
9043 +
9044 + //macCtrl |= 0x80;
9045 + macCtrl |= 0x40;
9046 + icvLen = 4;
9047 +
9048 + /* set hardware MIC */
9049 + if ( (!(seq & 0xf))&&(!(flag & 0x4)) )
9050 + {
9051 + macCtrl |= 0x100;
9052 + plusLen += 8;
9053 + *micLen = 8;
9054 + }
9055 +
9056 + header[4] |= 0x4000;
9057 + hlen += 4;
9058 +
9059 + /* Set iv16 and iv32 */
9060 + zfApSetStaWpaIv(dev, da, iv16, iv32);
9061 + }
9062 + else if (encryType == ZM_AES)
9063 + {
9064 + /* Get iv16 and iv32 */
9065 + zfApGetStaWpaIv(dev, da, &iv16, &iv32);
9066 +
9067 + iv16++;
9068 + if (iv16 == 0)
9069 + {
9070 + iv32++;
9071 + }
9072 +
9073 + b1 = (u8_t) iv16;
9074 + b2 = (u8_t) (iv16 >> 8);
9075 + header[hlen] = ((u16_t)b2 << 8) + b1;
9076 + header[hlen+1] = 0x2000;
9077 + header[hlen+2] = (u16_t) (iv32);
9078 + header[hlen+3] = (u16_t) (iv32 >> 16);
9079 +
9080 + macCtrl |= 0xc0;
9081 + icvLen = 8; /* MIC */
9082 +
9083 + header[4] |= 0x4000;
9084 + hlen += 4;
9085 +
9086 + /* Set iv16 and iv32 */
9087 + zfApSetStaWpaIv(dev, da, iv16, iv32);
9088 + }
9089 + #ifdef ZM_ENABLE_CENC
9090 + else if (encryType == ZM_CENC)
9091 + {
9092 + u32_t txiv[4];
9093 + u8_t keyIdx;
9094 +
9095 + /* Get CENC TxIV */
9096 + zfApGetStaCencIvAndKeyIdx(dev, da, txiv, &keyIdx);
9097 +
9098 + txiv[0] += 2;
9099 +
9100 + if (txiv[0] == 0 || txiv[0] == 1)
9101 + {
9102 + txiv[1]++;
9103 + }
9104 +
9105 + if (txiv[1] == 0)
9106 + {
9107 + txiv[2]++;
9108 + }
9109 +
9110 + if (txiv[2] == 0)
9111 + {
9112 + txiv[3]++;
9113 + }
9114 +
9115 + if (txiv[3] == 0)
9116 + {
9117 + txiv[0] = 0;
9118 + txiv[1] = 0;
9119 + txiv[2] = 0;
9120 + }
9121 +
9122 + header[hlen] = (keyIdx & 0x0001); /* For Key Id and reserved field */
9123 + header[hlen+1] = (u16_t)txiv[0];
9124 + header[hlen+2] = (u16_t)(txiv[0] >> 16);
9125 + header[hlen+3] = (u16_t)txiv[1];
9126 + header[hlen+4] = (u16_t)(txiv[1] >> 16);
9127 + header[hlen+5] = (u16_t)txiv[2];
9128 + header[hlen+6] = (u16_t)(txiv[2] >> 16);
9129 + header[hlen+7] = (u16_t)txiv[3];
9130 + header[hlen+8] = (u16_t)(txiv[3] >> 16);
9131 +
9132 + macCtrl |= 0x80;
9133 + icvLen = 16; /* MIC */
9134 +
9135 + header[4] |= 0x4000;
9136 + hlen += 9;
9137 +
9138 + /* Set CENC IV */
9139 + zfApSetStaCencIv(dev, da, txiv);
9140 + }
9141 + #endif //ZM_ENABLE_CENC
9142 + }
9143 +
9144 + /* protection mode */
9145 + if (wd->ap.protectionMode == 1)
9146 + {
9147 + /* Enable Self-CTS */
9148 + macCtrl &= 0xFFFC;
9149 + macCtrl |= 2;
9150 + }
9151 +
9152 + /* Rate Control */
9153 + if (port < 0x20)
9154 + {
9155 + /* AP */
9156 + /* IV */
9157 + if ((wd->ap.encryMode[vap] == ZM_WEP64) ||
9158 + (wd->ap.encryMode[vap] == ZM_WEP128) ||
9159 + (wd->ap.encryMode[vap] == ZM_WEP256))
9160 + {
9161 + header[4] |= 0x4000;
9162 + header[hlen] = 0x0; //IV
9163 + header[hlen+1] = wd->ap.bcKeyIndex[vap] << 14; //IV with Keyid--CWYang(m)
9164 + hlen += 2;
9165 + icvLen = 4;
9166 + macCtrl |= 0x40;
9167 + }
9168 + }
9169 + else
9170 + {
9171 + /* WDS */
9172 +
9173 + /* TODO : Fixed rate to 54M */
9174 + phyCtrl = 0xc0001; //PHY control L
9175 +
9176 + /* WDS port checking */
9177 + if ((wdsPort = (port - 0x20)) >= ZM_MAX_WDS_SUPPORT)
9178 + {
9179 + wdsPort = 0;
9180 + }
9181 +
9182 + #if 1
9183 + /* IV */
9184 + switch (wd->ap.wds.encryMode[wdsPort])
9185 + {
9186 + case ZM_WEP64:
9187 + case ZM_WEP128:
9188 + case ZM_WEP256:
9189 + header[4] |= 0x4000;
9190 + header[hlen] = 0x0; //IV
9191 + header[hlen+1] = wd->ap.bcKeyIndex[vap] << 14; //IV with Keyid
9192 + hlen += 2;
9193 + icvLen = 4;
9194 + macCtrl |= 0x40;
9195 + break;
9196 +
9197 + case ZM_TKIP:
9198 + wd->sta.iv16++;
9199 +
9200 + if ( wd->sta.iv16 == 0 )
9201 + {
9202 + wd->sta.iv32++;
9203 + }
9204 +
9205 + b1 = (u8_t) (wd->sta.iv16 >> 8);
9206 + b2 = (b1 | 0x20) & 0x7f;
9207 + header[hlen] = ((u16_t)b2 << 8) + b1;
9208 + b1 = (u8_t) wd->sta.iv16;
9209 + b2 = 0x20;
9210 + header[hlen+1] = ((u16_t)b2 << 8) + b1;
9211 + header[hlen+2] = (u16_t) wd->sta.iv32;
9212 + header[hlen+3] = (u16_t) (wd->sta.iv32 >> 16);
9213 +
9214 + //macCtrl |= 0x80;
9215 + macCtrl |= 0x40;
9216 + icvLen = 4;
9217 +
9218 + /* set hardware MIC */
9219 + if ( (!(seq & 0xf))&&(!(flag & 0x4)) )
9220 + {
9221 + macCtrl |= 0x100;
9222 + plusLen += 8;
9223 + *micLen = 8;
9224 + }
9225 +
9226 + header[4] |= 0x4000;
9227 + hlen += 4;
9228 + break;
9229 +
9230 + case ZM_AES:
9231 + wd->sta.iv16++;
9232 + if ( wd->sta.iv16 == 0 )
9233 + {
9234 + wd->sta.iv32++;
9235 + }
9236 +
9237 + b1 = (u8_t) wd->sta.iv16;
9238 + b2 = (u8_t) (wd->sta.iv16 >> 8);
9239 + header[hlen] = ((u16_t)b2 << 8) + b1;
9240 + header[hlen+1] = 0x2000;
9241 + header[hlen+2] = (u16_t) (wd->sta.iv32);
9242 + header[hlen+3] = (u16_t) (wd->sta.iv32 >> 16);
9243 +
9244 + macCtrl |= 0xc0; /* Set to AES in control setting */
9245 + icvLen = 8; /* MIC */
9246 +
9247 + header[4] |= 0x4000; /* Set WEP bit in wlan header */
9248 + hlen += 4; /* plus IV length */
9249 + break;
9250 + }/* end of switch */
9251 + #endif
9252 + }
9253 + }
9254 + else /* wd->wlanMode != ZM_MODE_AP */
9255 + {
9256 + encExemptionActionType = zfwGetPktEncExemptionActionType(dev, buf);
9257 +
9258 + if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
9259 + {
9260 + #if 1
9261 + /* if WME AP */
9262 + if (wd->sta.wmeConnected != 0)
9263 + {
9264 + /* QoS data */
9265 + header[4] |= 0x0080;
9266 +
9267 + /* QoS Control */
9268 + header[hlen] = up;
9269 + hlen += 1;
9270 + }
9271 + #endif
9272 +
9273 + if ( encExemptionActionType == ZM_ENCRYPTION_EXEMPT_NO_EXEMPTION )
9274 + {
9275 + if ( wd->sta.authMode < ZM_AUTH_MODE_WPA )
9276 + { /* non-WPA */
9277 + if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_ENABLED )
9278 + {
9279 + if ( (wd->sta.encryMode == ZM_WEP64)||
9280 + (wd->sta.encryMode == ZM_WEP128)||
9281 + (wd->sta.encryMode == ZM_WEP256) )
9282 + {
9283 + header[4] |= 0x4000;
9284 + header[hlen] = 0x0; //IV
9285 + header[hlen+1] = 0x0; //IV
9286 + header[hlen+1] |= (((u16_t) wd->sta.keyId) << 14);
9287 + hlen += 2;
9288 + icvLen = 4;
9289 +
9290 + /* For Software WEP */
9291 + if ((wd->sta.SWEncryptEnable & ZM_SW_WEP_ENCRY_EN) != 0)
9292 + {
9293 + u8_t keyLen = 5;
9294 + u8_t iv[3];
9295 +
9296 + iv[0] = 0x0;
9297 + iv[1] = 0x0;
9298 + iv[2] = 0x0;
9299 +
9300 + if (wd->sta.SWEncryMode[wd->sta.keyId] == ZM_WEP64)
9301 + {
9302 + keyLen = 5;
9303 + }
9304 + else if (wd->sta.SWEncryMode[wd->sta.keyId] == ZM_WEP128)
9305 + {
9306 + keyLen = 13;
9307 + }
9308 + else if (wd->sta.SWEncryMode[wd->sta.keyId] == ZM_WEP256)
9309 + {
9310 + keyLen = 29;
9311 + }
9312 +
9313 + zfWEPEncrypt(dev, buf, (u8_t*) snap, snapLen, minusLen, keyLen,
9314 + wd->sta.wepKey[wd->sta.keyId], iv);
9315 + }
9316 + else
9317 + {
9318 + macCtrl |= 0x40;
9319 + }
9320 + }
9321 + }
9322 + }
9323 + else
9324 + { /* WPA */
9325 + if ( wd->sta.wpaState >= ZM_STA_WPA_STATE_PK_OK )
9326 + {
9327 + wd->sta.iv16++;
9328 + if ( wd->sta.iv16 == 0 )
9329 + {
9330 + wd->sta.iv32++;
9331 + }
9332 +
9333 + /* set encryption mode */
9334 + if ( wd->sta.encryMode == ZM_TKIP )
9335 + {
9336 + b1 = (u8_t) (wd->sta.iv16 >> 8);
9337 + b2 = (b1 | 0x20) & 0x7f;
9338 + header[hlen] = ((u16_t)b2 << 8) + b1;
9339 + b1 = (u8_t) wd->sta.iv16;
9340 + b2 = 0x20;
9341 +
9342 + // header[hlen+1] = (((u16_t) wd->sta.keyId) << 14) | (((u16_t)b2 << 8) + b1);
9343 + // STA in infrastructure mode should use keyId = 0 to transmit unicast !
9344 + header[hlen+1] = (((u16_t)b2 << 8) + b1);
9345 + header[hlen+2] = (u16_t) wd->sta.iv32;
9346 + header[hlen+3] = (u16_t) (wd->sta.iv32 >> 16);
9347 +
9348 + /* If software encryption enable */
9349 + if ((wd->sta.SWEncryptEnable & ZM_SW_TKIP_ENCRY_EN) == 0)
9350 + {
9351 + //macCtrl |= 0x80;
9352 + /* TKIP same to WEP */
9353 + macCtrl |= 0x40;
9354 + icvLen = 4;
9355 +
9356 + /* set hardware MIC */
9357 + if ( (!(seq & 0xf))&&(!(flag & 0x4)) )
9358 + {
9359 + macCtrl |= 0x100;
9360 + plusLen += 8;
9361 + *micLen = 8;
9362 + }
9363 + }
9364 + else
9365 + {
9366 + u8_t mic[8];
9367 + u16_t offset;
9368 + u32_t icv;
9369 + u8_t RC4Key[16];
9370 +
9371 + /* TODO: Remove the criticial section here. */
9372 + zmw_declare_for_critical_section();
9373 +
9374 + zmw_enter_critical_section(dev);
9375 + /* Calculate MIC */
9376 + zfCalTxMic(dev, buf, (u8_t *)snap, snapLen, minusLen, da, sa, up, mic);
9377 +
9378 + offset = zfwBufGetSize(dev, buf);
9379 +
9380 + /* Append MIC to the buffer */
9381 + zfCopyToIntTxBuffer(dev, buf, mic, offset, 8);
9382 + zfwBufSetSize(dev, buf, offset+8);
9383 + zmw_leave_critical_section(dev);
9384 +
9385 + /* TKIP Key Mixing */
9386 + zfTkipPhase1KeyMix(wd->sta.iv32, &wd->sta.txSeed);
9387 + zfTkipPhase2KeyMix(wd->sta.iv16, &wd->sta.txSeed);
9388 + zfTkipGetseeds(wd->sta.iv16, RC4Key, &wd->sta.txSeed);
9389 +
9390 + /* Encrypt Data */
9391 + zfTKIPEncrypt(dev, buf, (u8_t *)snap, snapLen, minusLen, 16, RC4Key, &icv);
9392 +
9393 + icvLen = 4;
9394 + len += 8;
9395 + }
9396 +
9397 + header[4] |= 0x4000;
9398 + hlen += 4;
9399 + }
9400 + else if ( wd->sta.encryMode == ZM_AES )
9401 + {
9402 + b1 = (u8_t) wd->sta.iv16;
9403 + b2 = (u8_t) (wd->sta.iv16 >> 8);
9404 + header[hlen] = ((u16_t)b2 << 8) + b1;
9405 + // header[hlen+1] = (((u16_t) wd->sta.keyId) << 14) | (0x2000);
9406 + // STA in infrastructure mode should use keyId = 0 to transmit unicast !
9407 + header[hlen+1] = 0x2000;
9408 + header[hlen+2] = (u16_t) (wd->sta.iv32);
9409 + header[hlen+3] = (u16_t) (wd->sta.iv32 >> 16);
9410 +
9411 + macCtrl |= 0xc0;
9412 + icvLen = 8; /* MIC */
9413 +
9414 + header[4] |= 0x4000;
9415 + hlen += 4;
9416 + }
9417 + #ifdef ZM_ENABLE_CENC
9418 + else if ( wd->sta.encryMode == ZM_CENC )
9419 + {
9420 + /* Accumlate the PN sequence */
9421 + wd->sta.txiv[0] += 2;
9422 +
9423 + if (wd->sta.txiv[0] == 0 || wd->sta.txiv[0] == 1)
9424 + {
9425 + wd->sta.txiv[1]++;
9426 + }
9427 +
9428 + if (wd->sta.txiv[1] == 0)
9429 + {
9430 + wd->sta.txiv[2]++;
9431 + }
9432 +
9433 + if (wd->sta.txiv[2] == 0)
9434 + {
9435 + wd->sta.txiv[3]++;
9436 + }
9437 +
9438 + if (wd->sta.txiv[3] == 0)
9439 + {
9440 + wd->sta.txiv[0] = 0;
9441 + wd->sta.txiv[1] = 0;
9442 + wd->sta.txiv[2] = 0;
9443 + }
9444 +
9445 + header[hlen] = (wd->sta.cencKeyId & 0x0001); /* For Key Id and reserved field */
9446 + header[hlen+1] = (u16_t) wd->sta.txiv[0];
9447 + header[hlen+2] = (u16_t) (wd->sta.txiv[0] >> 16);
9448 + header[hlen+3] = (u16_t) wd->sta.txiv[1];
9449 + header[hlen+4] = (u16_t) (wd->sta.txiv[1] >> 16);
9450 + header[hlen+5] = (u16_t) wd->sta.txiv[2];
9451 + header[hlen+6] = (u16_t) (wd->sta.txiv[2] >> 16);
9452 + header[hlen+7] = (u16_t) wd->sta.txiv[3];
9453 + header[hlen+8] = (u16_t) (wd->sta.txiv[3] >> 16);
9454 +
9455 + macCtrl |= 0x80;
9456 + icvLen = 16; /* MIC */
9457 +
9458 + header[4] |= 0x4000;
9459 + hlen += 9;
9460 + }
9461 + #endif //ZM_ENABLE_CENC
9462 + }
9463 + }
9464 + } // if ( encExemptionActionType == ZM_ENCRYPTION_EXEMPT_NO_EXEMPTION )
9465 + } /* if ( wd->wlanMode != ZM_MODE_INFRASTRUCTURE ) */
9466 +
9467 + if ( wd->wlanMode == ZM_MODE_IBSS )
9468 + {
9469 + if ( encExemptionActionType == ZM_ENCRYPTION_EXEMPT_NO_EXEMPTION )
9470 + {
9471 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
9472 + if( wd->sta.oppositeInfo[userIdx].wpaState >= ZM_STA_WPA_STATE_PK_OK || wd->sta.wpaState >= ZM_STA_WPA_STATE_PK_OK)
9473 + {
9474 + int isUnicast = 1 ;
9475 +
9476 + if((da[0]& 0x1))
9477 + {
9478 + isUnicast = 0 ; // Not unicast , is broadcast
9479 + }
9480 +
9481 + if( wd->sta.ibssWpa2Psk == 1 )
9482 + { /* The IV order is not the same between unicast and broadcast ! */
9483 + if ( isUnicast )
9484 + {
9485 + iv16 = &wd->sta.oppositeInfo[userIdx].iv16;
9486 + iv32 = &wd->sta.oppositeInfo[userIdx].iv32;
9487 + }
9488 + else
9489 + {
9490 + iv16 = &wd->sta.iv16;
9491 + iv32 = &wd->sta.iv32;
9492 + }
9493 + }
9494 + else
9495 + {
9496 + iv16 = &wd->sta.iv16;
9497 + iv32 = &wd->sta.iv32;
9498 + }
9499 +
9500 + (*iv16)++;
9501 + if ( *iv16 == 0 )
9502 + {
9503 + *iv32++;
9504 + }
9505 +
9506 + if ( wd->sta.oppositeInfo[userIdx].encryMode == ZM_AES || wd->sta.encryMode == ZM_AES)
9507 + {
9508 + //printk("Station encryption mode is AES-CCMP\n") ;
9509 + b1 = (u8_t) (*iv16);
9510 + b2 = (u8_t) ((*iv16) >> 8);
9511 + header[hlen] = ((u16_t)b2 << 8) + b1;
9512 +
9513 + if ( isUnicast )
9514 + {
9515 + header[hlen+1] = 0x2000;
9516 + }
9517 + else
9518 + {
9519 + header[hlen+1] = 0x2000 | (((u16_t) wd->sta.keyId) << 14);
9520 + }
9521 +
9522 + header[hlen+2] = (u16_t) (*iv32);
9523 + header[hlen+3] = (u16_t) ((*iv32) >> 16);
9524 + macCtrl |= 0xc0;
9525 + icvLen = 8; /* MIC */
9526 + }
9527 +
9528 + header[4] |= 0x4000;
9529 + hlen += 4;
9530 + }
9531 + else if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_ENABLED)
9532 + {
9533 + if ( (wd->sta.encryMode == ZM_WEP64)||
9534 + (wd->sta.encryMode == ZM_WEP128)||
9535 + (wd->sta.encryMode == ZM_WEP256) )
9536 + {
9537 + header[4] |= 0x4000;
9538 + header[hlen] = 0x0; //IV
9539 + header[hlen+1] = 0x0; //IV
9540 + header[hlen+1] |= (((u16_t) wd->sta.keyId) << 14);
9541 + hlen += 2;
9542 + icvLen = 4;
9543 + macCtrl |= 0x40;
9544 + }
9545 + }
9546 +#else
9547 + /* ----- 20070405 add by Mxzeng ----- */
9548 + if( wd->sta.wpaState >= ZM_STA_WPA_STATE_PK_OK )
9549 + {
9550 + int isUnicast = 1 ;
9551 +
9552 + if((da[0]& 0x1))
9553 + {
9554 + isUnicast = 0 ; // Not unicast , is broadcast
9555 + }
9556 +
9557 + wd->sta.iv16++;
9558 + if ( wd->sta.iv16 == 0 )
9559 + {
9560 + wd->sta.iv32++;
9561 + }
9562 +
9563 + if ( wd->sta.encryMode == ZM_AES )
9564 + {
9565 + //printk("Station encryption mode is AES-CCMP\n") ;
9566 + b1 = (u8_t) wd->sta.iv16;
9567 + b2 = (u8_t) (wd->sta.iv16 >> 8);
9568 + header[hlen] = ((u16_t)b2 << 8) + b1;
9569 +
9570 + if ( isUnicast )
9571 + {
9572 + header[hlen+1] = 0x2000;
9573 + }
9574 + else
9575 + {
9576 + header[hlen+1] = 0x2000 | (((u16_t) wd->sta.keyId) << 14);
9577 + }
9578 +
9579 + header[hlen+2] = (u16_t) (wd->sta.iv32);
9580 + header[hlen+3] = (u16_t) (wd->sta.iv32 >> 16);
9581 + macCtrl |= 0xc0;
9582 + icvLen = 8; /* MIC */
9583 + }
9584 +
9585 + header[4] |= 0x4000;
9586 + hlen += 4;
9587 + }
9588 + else if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_ENABLED)
9589 + {
9590 + if ( (wd->sta.encryMode == ZM_WEP64)||
9591 + (wd->sta.encryMode == ZM_WEP128)||
9592 + (wd->sta.encryMode == ZM_WEP256) )
9593 + {
9594 + header[4] |= 0x4000;
9595 + header[hlen] = 0x0; //IV
9596 + header[hlen+1] = 0x0; //IV
9597 + header[hlen+1] |= (((u16_t) wd->sta.keyId) << 14);
9598 + hlen += 2;
9599 + icvLen = 4;
9600 + macCtrl |= 0x40;
9601 + }
9602 + }
9603 +#endif
9604 + } // End if ( encExemptionActionType == ZM_ENCRYPTION_EXEMPT_NO_EXEMPTION )
9605 + } // End if ( wd->wlanMode == ZM_MODE_IBSS )
9606 + else if ( wd->wlanMode == ZM_MODE_PSEUDO )
9607 + {
9608 + switch (wd->sta.encryMode)
9609 + {
9610 + case ZM_WEP64:
9611 + case ZM_WEP128:
9612 + case ZM_WEP256:
9613 + header[4] |= 0x4000;
9614 + header[hlen] = 0x0; //IV
9615 + header[hlen+1] = 0x0; //IV
9616 + hlen += 2;
9617 + icvLen = 4;
9618 + macCtrl |= 0x40;
9619 + break;
9620 +
9621 + case ZM_TKIP:
9622 + {
9623 + wd->sta.iv16++;
9624 + if ( wd->sta.iv16 == 0 )
9625 + {
9626 + wd->sta.iv32++;
9627 + }
9628 +
9629 + b1 = (u8_t) (wd->sta.iv16 >> 8);
9630 + b2 = (b1 | 0x20) & 0x7f;
9631 + header[hlen] = ((u16_t)b2 << 8) + b1;
9632 + b1 = (u8_t) wd->sta.iv16;
9633 + b2 = 0x20;
9634 + header[hlen+1] = ((u16_t)b2 << 8) + b1;
9635 + header[hlen+2] = (u16_t) wd->sta.iv32;
9636 + header[hlen+3] = (u16_t) (wd->sta.iv32 >> 16);
9637 +
9638 + //macCtrl |= 0x80;
9639 + macCtrl |= 0x40;
9640 + icvLen = 4;
9641 +
9642 + /* set hardware MIC */
9643 + if ( (!(seq & 0xf))&&(!(flag & 0x4)) )
9644 + {
9645 + macCtrl |= 0x100;
9646 + plusLen += 8;
9647 + *micLen = 8;
9648 + }
9649 +
9650 + header[4] |= 0x4000;
9651 + hlen += 4;
9652 + }/* end of PSEUDO TKIP */
9653 + break;
9654 +
9655 + case ZM_AES:
9656 + {
9657 + wd->sta.iv16++;
9658 + if ( wd->sta.iv16 == 0 )
9659 + {
9660 + wd->sta.iv32++;
9661 + }
9662 +
9663 + b1 = (u8_t) wd->sta.iv16;
9664 + b2 = (u8_t) (wd->sta.iv16 >> 8);
9665 + header[hlen] = ((u16_t)b2 << 8) + b1;
9666 + header[hlen+1] = 0x2000;
9667 + header[hlen+2] = (u16_t) (wd->sta.iv32);
9668 + header[hlen+3] = (u16_t) (wd->sta.iv32 >> 16);
9669 + macCtrl |= 0xc0;
9670 + icvLen = 8; /* MIC */
9671 + header[4] |= 0x4000;
9672 + hlen += 4;
9673 + }/* end of PSEUDO AES */
9674 + break;
9675 +
9676 + #ifdef ZM_ENABLE_CENC
9677 + case ZM_CENC:
9678 + /* Accumlate the PN sequence */
9679 + wd->sta.txiv[0] += 2;
9680 +
9681 + if (wd->sta.txiv[0] == 0 || wd->sta.txiv[0] == 1)
9682 + {
9683 + wd->sta.txiv[1]++;
9684 + }
9685 +
9686 + if (wd->sta.txiv[1] == 0)
9687 + {
9688 + wd->sta.txiv[2]++;
9689 + }
9690 +
9691 + if (wd->sta.txiv[2] == 0)
9692 + {
9693 + wd->sta.txiv[3]++;
9694 + }
9695 +
9696 + if (wd->sta.txiv[3] == 0)
9697 + {
9698 + wd->sta.txiv[0] = 0;
9699 + wd->sta.txiv[1] = 0;
9700 + wd->sta.txiv[2] = 0;
9701 + }
9702 +
9703 + header[hlen] = 0;
9704 + header[hlen+1] = (u16_t) wd->sta.txiv[0];
9705 + header[hlen+2] = (u16_t) (wd->sta.txiv[0] >> 16);
9706 + header[hlen+3] = (u16_t) wd->sta.txiv[1];
9707 + header[hlen+4] = (u16_t) (wd->sta.txiv[1] >> 16);
9708 + header[hlen+5] = (u16_t) wd->sta.txiv[2];
9709 + header[hlen+6] = (u16_t) (wd->sta.txiv[2] >> 16);
9710 + header[hlen+7] = (u16_t) wd->sta.txiv[3];
9711 + header[hlen+8] = (u16_t) (wd->sta.txiv[3] >> 16);
9712 +
9713 + macCtrl |= 0x80;
9714 + icvLen = 16; /* MIC */
9715 +
9716 + header[4] |= 0x4000;
9717 + hlen += 9;
9718 + break;
9719 + #endif //ZM_ENABLE_CENC
9720 + }/* end of switch */
9721 + }
9722 +
9723 + /* Generate control setting */
9724 +
9725 + /* protection mode */
9726 + if (wd->enableProtectionMode)
9727 + {
9728 + if (wd->enableProtectionMode==2)
9729 + {
9730 + /* Force enable protection: self cts */
9731 + macCtrl &= 0xFFFC;
9732 + macCtrl |= 2;
9733 + }
9734 + /* if wd->enableProtectionMode=1 => force disable */
9735 + /* if wd->enableProtectionMode=0 => auto */
9736 + }
9737 + else
9738 + {
9739 +
9740 + /* protection mode */
9741 + if (wd->sta.bProtectionMode == TRUE)
9742 + {
9743 + /* Enable Self-CTS */
9744 + macCtrl &= 0xFFFC;
9745 + macCtrl |= 2;
9746 + }
9747 + }
9748 +
9749 + }
9750 +
9751 + if (wd->txMCS != 0xff)
9752 + {
9753 + /* fixed rate */
9754 + phyCtrl = ((u32_t)wd->txMCS<<16) + wd->txMT;
9755 + mcs = wd->txMCS;
9756 + mt = wd->txMT;
9757 + }
9758 +
9759 + if (mt == 2)
9760 + {
9761 +#if 0
9762 + /* HT PT: 0 Mixed mode 1 Green field */
9763 + if (wd->sta.preambleTypeHT == ZM_PREAMBLE_TYPE_GREEN_FIELD)
9764 + {
9765 + phyCtrl |= 0x4; /* Bit 2 */
9766 + }
9767 +#endif
9768 + /* Bandwidth */
9769 + if (wd->sta.htCtrlBandwidth == ZM_BANDWIDTH_40MHZ)
9770 + {
9771 + phyCtrl |= (0x80<<16); /* BIT 23 */
9772 + }
9773 +#if 0
9774 + /* STBC */
9775 + if (wd->sta.htCtrlSTBC<=0x3)
9776 + {
9777 + phyCtrl |= (wd->sta.htCtrlSTBC<<28); /* BIT 23 */
9778 + }
9779 +#endif
9780 + /* Short GI */
9781 + if(wd->sta.htCtrlSG)
9782 + {
9783 + phyCtrl |= (0x8000<<16); /* BIT 31 */
9784 + }
9785 +
9786 + /* TA */
9787 + if ( ((mcs >=0x8) && (mcs<=0xf)) || (wd->sta.htCtrlSTBC) )
9788 + {
9789 + phyCtrl |= 0x1800; /* BIT 11 12 */
9790 + }
9791 + }
9792 + else if(mt == 1)
9793 + {
9794 + #if 0
9795 + //bug that cause OFDM rate become duplicate legacy rate
9796 + /* Bandwidth */
9797 + if (wd->sta.htCtrlBandwidth == ZM_BANDWIDTH_40MHZ)
9798 + {
9799 + phyCtrl |= (0x80<<16); /* BIT 23 */
9800 + mt = 3; /* duplicate legacy */
9801 + phyCtrl |= mt;
9802 + }
9803 + #endif
9804 + }
9805 + else if(mt == 0)
9806 + {
9807 + /* CCK PT: Legcy Preamble: 1 long preamble 2 short preamble */
9808 + if (wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_SHORT)
9809 + {
9810 + //phyCtrl |= 0x4; /* BIT 2 */
9811 + }
9812 + }
9813 +
9814 + /* TA */
9815 + if (wd->sta.defaultTA)
9816 + {
9817 + phyCtrl |= 0x1000;
9818 + }
9819 + else
9820 + {
9821 + phyCtrl |= 0x0800;
9822 + }
9823 +
9824 + //Get CurrentTxRate -- CWYang(+)
9825 + if ((mt == 0) || (mt == 1)) //B,G Rate
9826 + {
9827 + if (mcs < 16)
9828 + {
9829 + wd->CurrentTxRateKbps = zcIndextoRateBG[mcs];
9830 + }
9831 + }
9832 + else if (mt == 2)
9833 + {
9834 + if (mcs < 16)
9835 + {
9836 + if (wd->sta.htCtrlBandwidth == ZM_BANDWIDTH_40MHZ)
9837 + {
9838 + if((phyCtrl & 0x80000000) != 0)
9839 + {
9840 + /* Short GI 40 MHz MIMO Rate */
9841 + wd->CurrentTxRateKbps = zcIndextoRateN40S[mcs];
9842 + }
9843 + else
9844 + {
9845 + /* Long GI 40 MHz MIMO Rate */
9846 + wd->CurrentTxRateKbps = zcIndextoRateN40L[mcs];
9847 + }
9848 + }
9849 + else
9850 + {
9851 + if((phyCtrl & 0x80000000) != 0)
9852 + {
9853 + /* Short GI 20 MHz MIMO Rate */
9854 + wd->CurrentTxRateKbps = zcIndextoRateN20S[mcs];
9855 + }
9856 + else
9857 + {
9858 + /* Long GI 20 MHz MIMO Rate */
9859 + wd->CurrentTxRateKbps = zcIndextoRateN20L[mcs];
9860 + }
9861 + }
9862 + }
9863 + }
9864 +
9865 + //802.11 header(include IV) = (hlen<<1)-8
9866 + //ethernet frame = len
9867 + //snap + mic = plusLen
9868 + //ethernet header = minusLen
9869 + //icv = icvLen
9870 + //crc32 = 4
9871 + //length=802.11 header+snap+(ethernet frame-ethernet header)+mic+icv+crc32
9872 + header[0] = ((hlen<<1)-8)+plusLen+(len-minusLen)+icvLen+4; //Length
9873 +
9874 + // header[0] : MPDU Lengths
9875 + if ((header[6] & 0x1) != 0x1) // Unicast Frame
9876 + {
9877 + if (header[0] >= wd->rtsThreshold)
9878 + {
9879 + /* Enable RTS */
9880 + macCtrl |= 1;
9881 + }
9882 + }
9883 +
9884 + if ( wd->sta.encryMode == ZM_TKIP )
9885 + tkipFrameOffset = 8;
9886 +
9887 + if( wd->sta.EnableHT != 1 )
9888 + { // Aggregation should not be fragmented !
9889 + if ( header[0] > ( wd->fragThreshold + tkipFrameOffset ) )
9890 + {
9891 + return 0; // Need to be fragmented ! !
9892 + }
9893 + }
9894 +
9895 + //if ( wd->sta.encryMode == ZM_TKIP )
9896 + //{
9897 + // zm_debug_msg1("ctrl length = ", header[0]);
9898 + //}
9899 +
9900 + //MAC control
9901 + if (rateProbingFlag != 0)
9902 + {
9903 + macCtrl |= 0x8000;
9904 + }
9905 + header[1] = macCtrl;
9906 + //PHY control L
9907 + header[2] = (u16_t) ((phyCtrl&0xffff) | 0x700 | (zcUpToAc[up&0x7]<<13));
9908 + //PHY control H
9909 + header[3] = (u16_t) ((phyCtrl>>16) | 0x700);
9910 +
9911 + if (wd->enableAggregation)
9912 + {
9913 + /* force enable aggregation */
9914 + if (wd->enableAggregation==2 && !(header[6]&0x1))
9915 + {
9916 + if (((header[2] & 0x3) == 2))
9917 + {
9918 + /* Enable aggregation */
9919 + header[1] |= 0x20;
9920 + }
9921 + }
9922 + /* if wd->enableAggregation=1 => force disable */
9923 + /* if wd->enableAggregation=0 => auto */
9924 + }
9925 +
9926 +#ifdef ZM_ENABLE_AGGREGATION
9927 + if (wd->addbaComplete) {
9928 + #ifdef ZM_BYPASS_AGGR_SCHEDULING
9929 + if (!(header[6]&0x1) && !rateProbingFlag && (wd->enableAggregation != 1))
9930 + {
9931 + if (((header[2] & 0x3) == 2))
9932 + {
9933 + /* Unicast frame with HT rate => Enable aggregation */
9934 + /* We only support software encryption in single packet mode */
9935 + if ((wd->sta.SWEncryptEnable & ZM_SW_TKIP_ENCRY_EN) == 0 &&
9936 + (wd->sta.SWEncryptEnable & ZM_SW_WEP_ENCRY_EN) == 0)
9937 + {
9938 + /* Set aggregation group bits per AC */
9939 + header[1] |= (0x20 | (zcUpToAc[up&0x7]<<10));
9940 +
9941 + //if (wd->sta.currentFrequency < 3000)
9942 + {
9943 + /* issue: -PB42 Enable RTS/CTS to prevent OWL Tx hang up */
9944 + /* If this is Owl Ap, enable RTS/CTS protect */
9945 + if ( (wd->sta.athOwlAp == 1) || (wd->sta.RTSInAGGMode == TRUE) )
9946 + {
9947 + header[1] &= 0xfffc;
9948 + header[1] |= 0x1;
9949 + }
9950 +
9951 + /* Enable RIFS : workaround 854T RTS/CTS */
9952 + /* Bit13 : TI enable RIFS */
9953 + //header[1] |= 0x2000;
9954 + }
9955 + }
9956 + }
9957 + }
9958 + #else
9959 + /*
9960 + * aggregation ampduIndication control
9961 + */
9962 + if (aggControl && aggControl->aggEnabled) {
9963 + if (wd->enableAggregation==0 && !(header[6]&0x1))
9964 + {
9965 + if (((header[2] & 0x3) == 2))
9966 + {
9967 + /* Enable aggregation */
9968 + header[1] |= 0x20;
9969 + if (ZM_AGG_LAST_MPDU == aggControl->ampduIndication)
9970 + header[1] |= 0x4000;
9971 + }
9972 + else {
9973 + zm_debug_msg1("no aggr, header[2]&0x3 = ",header[2] & 0x3)
9974 + aggControl->aggEnabled = 0;
9975 + }
9976 + }
9977 + else {
9978 + zm_debug_msg1("no aggr, wd->enableAggregation = ", wd->enableAggregation);
9979 + zm_debug_msg1("no aggr, !header[6]&0x1 = ",!(header[6]&0x1));
9980 + aggControl->aggEnabled = 0;
9981 + }
9982 + }
9983 + #endif
9984 +
9985 + #ifdef ZM_AGGR_BIT_ON
9986 + if (!(header[6]&0x1) && !rateProbingFlag)
9987 + {
9988 + if (((header[2] & 0x3) == 2))
9989 + {
9990 + /* Unicast frame with HT rate => Enable aggregation */
9991 + /* Set aggregation group bits per AC */
9992 + header[1] |= (0x20 | (zcUpToAc[up&0x7]<<10));
9993 +
9994 + //if (wd->sta.currentFrequency < 3000)
9995 + {
9996 + /* Enable RTS/CTS to prevent OWL Tx hang up */
9997 + header[1] &= 0xfffc;
9998 + header[1] |= 0x1;
9999 + }
10000 + }
10001 + }
10002 + #endif
10003 + }
10004 +#endif
10005 +
10006 + return (hlen<<1);
10007 +}
10008 +
10009 +
10010 +u16_t zfTxGenMmHeader(zdev_t* dev, u8_t frameType, u16_t* dst,
10011 + u16_t* header, u16_t len, zbuf_t* buf, u16_t vap, u8_t encrypt)
10012 +{
10013 + //u16_t bodyLen;
10014 + u8_t hlen = 32; // MAC ctrl + PHY ctrl + 802.11 MM header
10015 +
10016 + zmw_get_wlan_dev(dev);
10017 +
10018 + zmw_declare_for_critical_section();
10019 +
10020 + /* Generate control setting */
10021 + //bodyLen = zfwBufGetSize(dev, buf);
10022 + header[0] = 24+len+4; //Length
10023 + if ((dst[0] & 0x1) != 0) //Broadcast, multicast frames
10024 + {
10025 + header[1] = 0xc; //MAC control, backoff + noack
10026 + }
10027 + else
10028 + {
10029 + header[1] = 0x8; //MAC control, backoff + (ack)
10030 + }
10031 + /* Dualband Management frame tx Rate */
10032 + if (wd->wlanMode == ZM_MODE_AP)
10033 + {
10034 + if (wd->frequency < 3000)
10035 + {
10036 + /* CCK 1M */
10037 + header[2] = 0x0f00; //PHY control L
10038 + header[3] = 0x0000; //PHY control H
10039 + }
10040 + else
10041 + {
10042 + /* CCK 6M */
10043 + header[2] = 0x0f01; //PHY control L
10044 + header[3] = 0x000B; //PHY control H
10045 + }
10046 + }
10047 + else
10048 + {
10049 + if (wd->sta.currentFrequency < 3000)
10050 + {
10051 + /* CCK 2M */
10052 + header[2] = 0x0f00; //PHY control L
10053 + header[3] = 0x0001; //PHY control H
10054 + }
10055 + else
10056 + {
10057 + /* CCK 6M */
10058 + header[2] = 0x0f01; //PHY control L
10059 + header[3] = 0x000B; //PHY control H
10060 + }
10061 + }
10062 + /* Generate WLAN header */
10063 + /* Frame control */
10064 + header[4+0] = frameType;
10065 + /* Duration */
10066 + header[4+1] = 0;
10067 +
10068 + if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)
10069 + {
10070 + if ( frameType == ZM_WLAN_FRAME_TYPE_PROBEREQ )
10071 + {
10072 + header[4+8] = 0xFFFF;
10073 + header[4+9] = 0xFFFF;
10074 + header[4+10] = 0xFFFF;
10075 + }
10076 + else if ( frameType == ZM_WLAN_FRAME_TYPE_BA ) {
10077 + /* do nothing */
10078 + }
10079 + else
10080 + {
10081 + header[4+8] = wd->sta.bssid[0];
10082 + header[4+9] = wd->sta.bssid[1];
10083 + header[4+10] = wd->sta.bssid[2];
10084 + }
10085 + }
10086 + else if (wd->wlanMode == ZM_MODE_PSEUDO)
10087 + {
10088 + /* Address 3 = 00:00:00:00:00:00 */
10089 + header[4+8] = 0;
10090 + header[4+9] = 0;
10091 + header[4+10] = 0;
10092 + }
10093 + else if (wd->wlanMode == ZM_MODE_IBSS)
10094 + {
10095 + header[4+8] = wd->sta.bssid[0];
10096 + header[4+9] = wd->sta.bssid[1];
10097 + header[4+10] = wd->sta.bssid[2];
10098 +
10099 + if ( frameType == ZM_WLAN_FRAME_TYPE_ATIM )
10100 + {
10101 + /* put ATIM to queue 5th */
10102 + //header[2] |= (ZM_BIT_13|ZM_BIT_14);
10103 + header[2] |= ZM_BIT_15;
10104 + }
10105 + }
10106 + else if (wd->wlanMode == ZM_MODE_AP)
10107 + {
10108 + /* Address 3 = BSSID */
10109 + header[4+8] = wd->macAddr[0];
10110 + header[4+9] = wd->macAddr[1];
10111 +#ifdef ZM_VAPMODE_MULTILE_SSID
10112 + header[4+10] = wd->macAddr[2]; //Multiple SSID
10113 +#else
10114 + header[4+10] = wd->macAddr[2] + (vap<<8); //VAP
10115 +#endif
10116 + //if in scan, must set address 3 to broadcast because of some ap would care this
10117 + //if ((wd->heartBeatNotification & ZM_BSSID_LIST_SCAN)
10118 + // == ZM_BSSID_LIST_SCAN)
10119 + //if FrameType is Probe Request, Address3 should be boradcast
10120 + if (frameType == ZM_WLAN_FRAME_TYPE_PROBEREQ)
10121 + {
10122 + header[4+8] = 0xFFFF;
10123 + header[4+9] = 0xFFFF;
10124 + header[4+10] = 0xFFFF;
10125 + }
10126 + }
10127 +
10128 + /* Address 1 = DA */
10129 + header[4+2] = dst[0];
10130 + header[4+3] = dst[1];
10131 + header[4+4] = dst[2];
10132 +
10133 + /* Address 2 = SA */
10134 + header[4+5] = wd->macAddr[0];
10135 + header[4+6] = wd->macAddr[1];
10136 + if (wd->wlanMode == ZM_MODE_AP)
10137 + {
10138 +#ifdef ZM_VAPMODE_MULTILE_SSID
10139 + header[4+7] = wd->macAddr[2]; //Multiple SSID
10140 +#else
10141 + header[4+7] = wd->macAddr[2] + (vap<<8); //VAP
10142 +#endif
10143 + }
10144 + else
10145 + {
10146 + header[4+7] = wd->macAddr[2];
10147 + }
10148 +
10149 + /* Sequence Control */
10150 + zmw_enter_critical_section(dev);
10151 + header[4+11] = ((wd->mmseq++)<<4);
10152 + zmw_leave_critical_section(dev);
10153 +
10154 + if( frameType == ZM_WLAN_FRAME_TYPE_QOS_NULL )
10155 + {
10156 + /*Qos Control*/
10157 + header[4+12] = 0x0;
10158 + hlen+=2;
10159 + header[0]+=2;
10160 + }
10161 +
10162 + if ( encrypt )
10163 + {
10164 + if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_ENABLED )
10165 + {
10166 + if ( (wd->sta.encryMode == ZM_WEP64)||
10167 + (wd->sta.encryMode == ZM_WEP128)||
10168 + (wd->sta.encryMode == ZM_WEP256) )
10169 + {
10170 + header[4] |= 0x4000;
10171 + header[16] = 0x0; //IV
10172 + header[17] = 0x0; //IV
10173 + header[17] |= (((u16_t) wd->sta.keyId) << 14);
10174 + hlen += 4;
10175 +
10176 + header[0] += 8; // icvLen = 4;
10177 + header[1] |= 0x40; // enable encryption on macCtrl
10178 + }
10179 + }
10180 + }
10181 +
10182 + // Enable HW duration
10183 + if ( frameType != ZM_WLAN_FRAME_TYPE_PSPOLL )
10184 + {
10185 + header[1] |= 0x200;
10186 + }
10187 +
10188 + return hlen;
10189 +}
10190 +
10191 +void zfInitMacApMode(zdev_t* dev)
10192 +{
10193 + u16_t i;
10194 +
10195 + zmw_get_wlan_dev(dev);
10196 +
10197 + zfHpEnableBeacon(dev, ZM_MODE_AP, (wd->beaconInterval/wd->ap.vapNumber), 1, 0);
10198 +
10199 + /* AP mode */
10200 + zfHpSetApStaMode(dev, ZM_HAL_80211_MODE_AP);
10201 +
10202 + /* VAP test code */
10203 + /* AP + VAP mode */
10204 + if (wd->ap.vapNumber >= 2)
10205 + {
10206 + for (i=1; i<ZM_MAX_AP_SUPPORT; i++)
10207 + {
10208 + if (((wd->ap.apBitmap >> i) & 0x1) != 0)
10209 + {
10210 + u16_t mac[3];
10211 + mac[0] = wd->macAddr[0];
10212 + mac[1] = wd->macAddr[1];
10213 +#ifdef ZM_VAPMODE_MULTILE_SSID
10214 + mac[2] = wd->macAddr[2]; //Multiple SSID
10215 +#else
10216 + mac[2] = wd->macAddr[2] + (i<<8); //VAP
10217 +#endif
10218 + zfHpSetMacAddress(dev, mac, i);
10219 +
10220 + }
10221 + }
10222 + }
10223 +
10224 + /* basic rate setting */
10225 + zfHpSetBasicRateSet(dev, wd->bRateBasic, wd->gRateBasic);
10226 +
10227 + /* Set TxQs CWMIN, CWMAX, AIFS and TXO to WME AP default. */
10228 + zfUpdateDefaultQosParameter(dev, 1);
10229 +
10230 + return;
10231 +}
10232 +
10233 +u16_t zfChGetNextChannel(zdev_t* dev, u16_t frequency, u8_t* pbPassive)
10234 +{
10235 + u8_t i;
10236 + u8_t bPassive;
10237 +
10238 + zmw_get_wlan_dev(dev);
10239 +
10240 + /* Avoid NULL value */
10241 + if ( pbPassive == NULL )
10242 + {
10243 + pbPassive = &bPassive;
10244 + }
10245 +
10246 + for( i=0; i<wd->regulationTable.allowChannelCnt; i++ )
10247 + {
10248 + if ( wd->regulationTable.allowChannel[i].channel == frequency )
10249 + {
10250 + if ( i == (wd->regulationTable.allowChannelCnt-1) )
10251 + {
10252 + i = 0;
10253 + }
10254 + else
10255 + {
10256 + i++;
10257 + }
10258 +
10259 + if ( wd->regulationTable.allowChannel[i].channelFlags
10260 + & ZM_REG_FLAG_CHANNEL_PASSIVE )
10261 + {
10262 + *pbPassive = TRUE;
10263 + }
10264 + else
10265 + {
10266 + *pbPassive = FALSE;
10267 + }
10268 +
10269 + return wd->regulationTable.allowChannel[i].channel;
10270 + }
10271 + }
10272 +
10273 + return 0xffff;
10274 +}
10275 +
10276 +u16_t zfChGetFirstChannel(zdev_t* dev, u8_t* pbPassive)
10277 +{
10278 + u8_t bPassive;
10279 +
10280 + zmw_get_wlan_dev(dev);
10281 +
10282 + /* Avoid NULL value */
10283 + if ( pbPassive == NULL )
10284 + {
10285 + pbPassive = &bPassive;
10286 + }
10287 +
10288 + if ( wd->regulationTable.allowChannel[0].channelFlags & ZM_REG_FLAG_CHANNEL_PASSIVE )
10289 + {
10290 + *pbPassive = TRUE;
10291 + }
10292 + else
10293 + {
10294 + *pbPassive = FALSE;
10295 + }
10296 +
10297 + return wd->regulationTable.allowChannel[0].channel;
10298 +}
10299 +
10300 +u16_t zfChGetFirst2GhzChannel(zdev_t* dev)
10301 +{
10302 + u8_t i;
10303 +
10304 + zmw_get_wlan_dev(dev);
10305 +
10306 + for( i=0; i<wd->regulationTable.allowChannelCnt; i++ )
10307 + {
10308 + if ( wd->regulationTable.allowChannel[i].channel < 3000 )
10309 + {
10310 + /* find the first 2Ghz channel */
10311 + return wd->regulationTable.allowChannel[i].channel;
10312 + }
10313 + }
10314 +
10315 + /* Can not find any 2Ghz channel */
10316 + return 0;
10317 +}
10318 +
10319 +u16_t zfChGetFirst5GhzChannel(zdev_t* dev)
10320 +{
10321 + u8_t i;
10322 +
10323 + zmw_get_wlan_dev(dev);
10324 +
10325 + for( i=0; i<wd->regulationTable.allowChannelCnt; i++ )
10326 + {
10327 + if ( wd->regulationTable.allowChannel[i].channel > 3000 )
10328 + {
10329 + /* find the first 5Ghz channel */
10330 + return wd->regulationTable.allowChannel[i].channel;
10331 + }
10332 + }
10333 +
10334 + /* Can not find any 5Ghz channel */
10335 + return 0;
10336 +}
10337 +
10338 +u16_t zfChGetLastChannel(zdev_t* dev, u8_t* pbPassive)
10339 +{
10340 + u8_t bPassive;
10341 + u8_t ChannelIndex;
10342 +
10343 + zmw_get_wlan_dev(dev);
10344 +
10345 + ChannelIndex = wd->regulationTable.allowChannelCnt-1;
10346 +
10347 + /* Avoid NULL value */
10348 + if ( pbPassive == NULL )
10349 + {
10350 + pbPassive = &bPassive;
10351 + }
10352 +
10353 + if ( wd->regulationTable.allowChannel[ChannelIndex].channelFlags
10354 + & ZM_REG_FLAG_CHANNEL_PASSIVE )
10355 + {
10356 + *pbPassive = TRUE;
10357 + }
10358 + else
10359 + {
10360 + *pbPassive = FALSE;
10361 + }
10362 +
10363 + return wd->regulationTable.allowChannel[ChannelIndex].channel;
10364 +}
10365 +
10366 +u16_t zfChGetLast5GhzChannel(zdev_t* dev)
10367 +{
10368 + u8_t i;
10369 + u16_t last5Ghzfrequency;
10370 +
10371 + zmw_get_wlan_dev(dev);
10372 +
10373 + last5Ghzfrequency = 0;
10374 + for( i=0; i<wd->regulationTable.allowChannelCnt; i++ )
10375 + {
10376 + if ( wd->regulationTable.allowChannel[i].channel > 3000 )
10377 + {
10378 + last5Ghzfrequency = wd->regulationTable.allowChannel[i].channel;
10379 + }
10380 + }
10381 +
10382 + return last5Ghzfrequency;
10383 +}
10384 +
10385 +/* freqBand = 0 => auto check */
10386 +/* = 1 => 2.4 GHz band */
10387 +/* = 2 => 5 GHz band */
10388 +u16_t zfChNumToFreq(zdev_t* dev, u8_t ch, u8_t freqBand)
10389 +{
10390 + u16_t freq = 0xffff;
10391 +
10392 + if ( freqBand == 0 )
10393 + {
10394 + if (ch > 14)
10395 + { /* adapter is at 5 GHz band */
10396 + freqBand = 2;
10397 + }
10398 + else
10399 + {
10400 + freqBand = 1;
10401 + }
10402 + }
10403 +
10404 + if ( freqBand == 2 )
10405 + { /* the channel belongs to 5 GHz band */
10406 + if ( (ch >= 184)&&(ch <= 196) )
10407 + {
10408 + freq = 4000 + ch*5;
10409 + }
10410 + else
10411 + {
10412 + freq = 5000 + ch*5;
10413 + }
10414 + }
10415 + else
10416 + { /* the channel belongs to 2.4 GHz band */
10417 + if ( ch == 14 )
10418 + {
10419 + freq = ZM_CH_G_14;
10420 + }
10421 + else
10422 + {
10423 + freq = ZM_CH_G_1 + (ch-1)*5;
10424 + }
10425 + }
10426 +
10427 + return freq;
10428 +}
10429 +
10430 +u8_t zfChFreqToNum(u16_t freq, u8_t* pbIs5GBand)
10431 +{
10432 + u8_t ch;
10433 + u8_t Is5GBand;
10434 +
10435 + /* to avoid NULL value */
10436 + if ( pbIs5GBand == NULL )
10437 + {
10438 + pbIs5GBand = &Is5GBand;
10439 + }
10440 +
10441 + *pbIs5GBand = FALSE;
10442 +
10443 + if ( freq == ZM_CH_G_14 )
10444 + {
10445 + ch = 14;
10446 + }
10447 + else if ( freq < 4000 )
10448 + {
10449 + ch = (freq - ZM_CH_G_1) / 5 + 1;
10450 + }
10451 + else if ( freq < 5000 )
10452 + {
10453 + ch = (freq - 4000) / 5;
10454 + *pbIs5GBand = TRUE;
10455 + }
10456 + else
10457 + {
10458 + ch = (freq - 5000) / 5;
10459 + *pbIs5GBand = TRUE;
10460 + }
10461 +
10462 + return ch;
10463 +}
10464 --- /dev/null
10465 +++ b/drivers/staging/otus/80211core/cmmap.c
10466 @@ -0,0 +1,2402 @@
10467 +/*
10468 + * Copyright (c) 2007-2008 Atheros Communications Inc.
10469 + *
10470 + * Permission to use, copy, modify, and/or distribute this software for any
10471 + * purpose with or without fee is hereby granted, provided that the above
10472 + * copyright notice and this permission notice appear in all copies.
10473 + *
10474 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10475 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10476 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
10477 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
10478 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
10479 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
10480 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
10481 + */
10482 +/* */
10483 +/* Module Name : mm.c */
10484 +/* */
10485 +/* Abstract */
10486 +/* This module contains common functions for handle AP */
10487 +/* management frame. */
10488 +/* */
10489 +/* NOTES */
10490 +/* None */
10491 +/* */
10492 +/************************************************************************/
10493 +#include "cprecomp.h"
10494 +#include "ratectrl.h"
10495 +
10496 +extern const u8_t zcUpToAc[];
10497 +
10498 +void zfMmApTimeTick(zdev_t* dev)
10499 +{
10500 + u32_t now;
10501 + zmw_get_wlan_dev(dev);
10502 +
10503 + //zm_debug_msg1("wd->wlanMode : ", wd->wlanMode);
10504 + if (wd->wlanMode == ZM_MODE_AP)
10505 + {
10506 + /* => every 1.28 seconds */
10507 + /* AP : aging STA that does not active for wd->ap.staAgingTime */
10508 + now = wd->tick & 0x7f;
10509 + if (now == 0x0)
10510 + {
10511 + zfApAgingSta(dev);
10512 + }
10513 + else if (now == 0x1f)
10514 + {
10515 + zfQueueAge(dev, wd->ap.uapsdQ, wd->tick, 10000);
10516 + }
10517 + /* AP : check (wd->ap.protectedObss) and (wd->ap.bStaAssociated) */
10518 + /* to enable NonErp and Protection mode */
10519 + else if (now == 0x3f)
10520 + {
10521 + //zfApProtctionMonitor(dev);
10522 + }
10523 + }
10524 +}
10525 +
10526 +/************************************************************************/
10527 +/* */
10528 +/* FUNCTION DESCRIPTION zfApInitStaTbl */
10529 +/* Init AP's station table. */
10530 +/* */
10531 +/* INPUTS */
10532 +/* dev : device pointer */
10533 +/* */
10534 +/* OUTPUTS */
10535 +/* None */
10536 +/* */
10537 +/* AUTHOR */
10538 +/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
10539 +/* */
10540 +/************************************************************************/
10541 +void zfApInitStaTbl(zdev_t* dev)
10542 +{
10543 + u16_t i;
10544 +
10545 + zmw_get_wlan_dev(dev);
10546 +
10547 + for (i=0; i<ZM_MAX_STA_SUPPORT; i++)
10548 + {
10549 + wd->ap.staTable[i].valid = 0;
10550 + wd->ap.staTable[i].state = 0;
10551 + wd->ap.staTable[i].addr[0] = 0;
10552 + wd->ap.staTable[i].addr[1] = 0;
10553 + wd->ap.staTable[i].addr[2] = 0;
10554 + wd->ap.staTable[i].time = 0;
10555 + wd->ap.staTable[i].vap = 0;
10556 + wd->ap.staTable[i].encryMode = ZM_NO_WEP;
10557 + }
10558 + return;
10559 +}
10560 +
10561 +
10562 +/************************************************************************/
10563 +/* */
10564 +/* FUNCTION DESCRIPTION zfApFindSta */
10565 +/* Find a STA in station table. */
10566 +/* */
10567 +/* INPUTS */
10568 +/* dev : device pointer */
10569 +/* addr : Target STA address */
10570 +/* */
10571 +/* OUTPUTS */
10572 +/* 0xffff : fail */
10573 +/* other : STA table index */
10574 +/* */
10575 +/* AUTHOR */
10576 +/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
10577 +/* */
10578 +/************************************************************************/
10579 +u16_t zfApFindSta(zdev_t* dev, u16_t* addr)
10580 +{
10581 + u16_t i;
10582 +
10583 + zmw_get_wlan_dev(dev);
10584 +
10585 + for (i=0; i<ZM_MAX_STA_SUPPORT; i++)
10586 + {
10587 + if (wd->ap.staTable[i].valid == 1)
10588 + {
10589 + if ((wd->ap.staTable[i].addr[0] == addr[0])
10590 + && (wd->ap.staTable[i].addr[1] == addr[1])
10591 + && (wd->ap.staTable[i].addr[2] == addr[2]))
10592 + {
10593 + return i;
10594 + }
10595 + }
10596 + }
10597 + return 0xffff;
10598 +}
10599 +
10600 +u16_t zfApGetSTAInfo(zdev_t* dev, u16_t* addr, u16_t* state, u8_t* vap)
10601 +{
10602 + u16_t id;
10603 +
10604 + zmw_get_wlan_dev(dev);
10605 +
10606 + zmw_declare_for_critical_section();
10607 +
10608 + zmw_enter_critical_section(dev);
10609 +
10610 + if ((id = zfApFindSta(dev, addr)) != 0xffff)
10611 + {
10612 + *vap = wd->ap.staTable[id].vap;
10613 + *state = wd->ap.staTable[id++].state;
10614 + }
10615 +
10616 + zmw_leave_critical_section(dev);
10617 +
10618 + return id;
10619 +}
10620 +
10621 +
10622 +void zfApGetStaQosType(zdev_t* dev, u16_t* addr, u8_t* qosType)
10623 +{
10624 + u16_t id;
10625 +
10626 + zmw_get_wlan_dev(dev);
10627 +
10628 + zmw_declare_for_critical_section();
10629 +
10630 + zmw_enter_critical_section(dev);
10631 +
10632 + if ((id = zfApFindSta(dev, addr)) != 0xffff)
10633 + {
10634 + *qosType = wd->ap.staTable[id].qosType;
10635 + }
10636 + else
10637 + {
10638 + *qosType = 0;
10639 + }
10640 +
10641 + zmw_leave_critical_section(dev);
10642 +
10643 + return;
10644 +}
10645 +
10646 +void zfApGetStaTxRateAndQosType(zdev_t* dev, u16_t* addr, u32_t* phyCtrl,
10647 + u8_t* qosType, u16_t* rcProbingFlag)
10648 +{
10649 + u16_t id;
10650 + u8_t rate;
10651 +
10652 + zmw_get_wlan_dev(dev);
10653 +
10654 + zmw_declare_for_critical_section();
10655 +
10656 + zmw_enter_critical_section(dev);
10657 +
10658 + if ((id = zfApFindSta(dev, addr)) != 0xffff)
10659 + {
10660 + rate = (u8_t)zfRateCtrlGetTxRate(dev, &wd->ap.staTable[id].rcCell, rcProbingFlag);
10661 +#ifdef ZM_AP_DEBUG
10662 + //rate = 15;
10663 +#endif
10664 + *phyCtrl = zcRateToPhyCtrl[rate];
10665 + *qosType = wd->ap.staTable[id].qosType;
10666 + }
10667 + else
10668 + {
10669 + if (wd->frequency < 3000)
10670 + {
10671 + /* CCK 1M */
10672 + //header[2] = 0x0f00; //PHY control L
10673 + //header[3] = 0x0000; //PHY control H
10674 + *phyCtrl = 0x00000F00;
10675 + }
10676 + else
10677 + {
10678 + /* CCK 6M */
10679 + //header[2] = 0x0f01; //PHY control L
10680 + //header[3] = 0x000B; //PHY control H
10681 + *phyCtrl = 0x000B0F01;
10682 + }
10683 + *qosType = 0;
10684 + }
10685 +
10686 + zmw_leave_critical_section(dev);
10687 +
10688 + zm_msg2_mm(ZM_LV_3, "PhyCtrl=", *phyCtrl);
10689 + return;
10690 +}
10691 +
10692 +void zfApGetStaEncryType(zdev_t* dev, u16_t* addr, u8_t* encryType)
10693 +{
10694 + //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev);
10695 + u16_t id;
10696 +
10697 + zmw_get_wlan_dev(dev);
10698 +
10699 + zmw_declare_for_critical_section();
10700 +
10701 + zmw_enter_critical_section(dev);
10702 +
10703 + if ((id = zfApFindSta(dev, addr)) != 0xffff)
10704 + {
10705 + *encryType = wd->ap.staTable[id].encryMode;
10706 + }
10707 + else
10708 + {
10709 + *encryType = ZM_NO_WEP;
10710 + }
10711 +
10712 + zmw_leave_critical_section(dev);
10713 +
10714 + zm_msg2_mm(ZM_LV_3, "encyrType=", *encryType);
10715 + return;
10716 +}
10717 +
10718 +void zfApGetStaWpaIv(zdev_t* dev, u16_t* addr, u16_t* iv16, u32_t* iv32)
10719 +{
10720 + //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev);
10721 + u16_t id;
10722 +
10723 + zmw_get_wlan_dev(dev);
10724 +
10725 + zmw_declare_for_critical_section();
10726 +
10727 + zmw_enter_critical_section(dev);
10728 +
10729 + if ((id = zfApFindSta(dev, addr)) != 0xffff)
10730 + {
10731 + *iv16 = wd->ap.staTable[id].iv16;
10732 + *iv32 = wd->ap.staTable[id].iv32;
10733 + }
10734 + else
10735 + {
10736 + *iv16 = 0;
10737 + *iv32 = 0;
10738 + }
10739 +
10740 + zmw_leave_critical_section(dev);
10741 +
10742 + zm_msg2_mm(ZM_LV_3, "iv16=", *iv16);
10743 + zm_msg2_mm(ZM_LV_3, "iv32=", *iv32);
10744 + return;
10745 +}
10746 +
10747 +void zfApSetStaWpaIv(zdev_t* dev, u16_t* addr, u16_t iv16, u32_t iv32)
10748 +{
10749 + //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev);
10750 + u16_t id;
10751 +
10752 + zmw_get_wlan_dev(dev);
10753 +
10754 + zmw_declare_for_critical_section();
10755 +
10756 + zmw_enter_critical_section(dev);
10757 +
10758 + if ((id = zfApFindSta(dev, addr)) != 0xffff)
10759 + {
10760 + wd->ap.staTable[id].iv16 = iv16;
10761 + wd->ap.staTable[id].iv32 = iv32;
10762 + }
10763 +
10764 + zmw_leave_critical_section(dev);
10765 +
10766 + zm_msg2_mm(ZM_LV_3, "iv16=", iv16);
10767 + zm_msg2_mm(ZM_LV_3, "iv32=", iv32);
10768 + return;
10769 +}
10770 +
10771 +void zfApClearStaKey(zdev_t* dev, u16_t* addr)
10772 +{
10773 + //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev);
10774 + u16_t bcAddr[3] = { 0xffff, 0xffff, 0xffff };
10775 + u16_t id;
10776 +
10777 + zmw_get_wlan_dev(dev);
10778 +
10779 + if (zfMemoryIsEqual((u8_t*)bcAddr, (u8_t*)addr, sizeof(bcAddr)) == TRUE)
10780 + {
10781 + /* Turn off group key information */
10782 + // zfClearKey(dev, 0);
10783 + }
10784 + else
10785 + {
10786 + zmw_declare_for_critical_section();
10787 +
10788 + zmw_enter_critical_section(dev);
10789 +
10790 + if ((id = zfApFindSta(dev, addr)) != 0xffff)
10791 + {
10792 + /* Turn off STA's key information */
10793 + zfHpRemoveKey(dev, id+1);
10794 +
10795 + /* Update STA's Encryption Type */
10796 + wd->ap.staTable[id].encryMode = ZM_NO_WEP;
10797 + }
10798 + else
10799 + {
10800 + zm_msg0_mm(ZM_LV_3, "Can't find STA address\n");
10801 + }
10802 + zmw_leave_critical_section(dev);
10803 + }
10804 +}
10805 +
10806 +#ifdef ZM_ENABLE_CENC
10807 +void zfApGetStaCencIvAndKeyIdx(zdev_t* dev, u16_t* addr, u32_t *iv, u8_t *keyIdx)
10808 +{
10809 + //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev);
10810 + u16_t id;
10811 + zmw_get_wlan_dev(dev);
10812 + zmw_declare_for_critical_section();
10813 +
10814 +
10815 + zmw_enter_critical_section(dev);
10816 +
10817 + if ((id = zfApFindSta(dev, addr)) != 0xffff)
10818 + {
10819 + *iv++ = wd->ap.staTable[id].txiv[0];
10820 + *iv++ = wd->ap.staTable[id].txiv[1];
10821 + *iv++ = wd->ap.staTable[id].txiv[2];
10822 + *iv = wd->ap.staTable[id].txiv[3];
10823 + *keyIdx = wd->ap.staTable[id].cencKeyIdx;
10824 + }
10825 + else
10826 + {
10827 + *iv++ = 0x5c365c37;
10828 + *iv++ = 0x5c365c36;
10829 + *iv++ = 0x5c365c36;
10830 + *iv = 0x5c365c36;
10831 + *keyIdx = 0;
10832 + }
10833 +
10834 + zmw_leave_critical_section(dev);
10835 + return;
10836 +}
10837 +
10838 +void zfApSetStaCencIv(zdev_t* dev, u16_t* addr, u32_t *iv)
10839 +{
10840 + //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev);
10841 + u16_t id;
10842 + zmw_get_wlan_dev(dev);
10843 + zmw_declare_for_critical_section();
10844 +
10845 +
10846 + zmw_enter_critical_section(dev);
10847 +
10848 + if ((id = zfApFindSta(dev, addr)) != 0xffff)
10849 + {
10850 + wd->ap.staTable[id].txiv[0] = *iv++;
10851 + wd->ap.staTable[id].txiv[1] = *iv++;
10852 + wd->ap.staTable[id].txiv[2] = *iv++;
10853 + wd->ap.staTable[id].txiv[3] = *iv;
10854 + }
10855 +
10856 + zmw_leave_critical_section(dev);
10857 +
10858 + return;
10859 +}
10860 +#endif //ZM_ENABLE_CENC
10861 +
10862 +
10863 +/************************************************************************/
10864 +/* */
10865 +/* FUNCTION DESCRIPTION zfApFlushBufferedPsFrame */
10866 +/* Free buffered PS frames. */
10867 +/* */
10868 +/* INPUTS */
10869 +/* dev : device pointer */
10870 +/* */
10871 +/* OUTPUTS */
10872 +/* None */
10873 +/* */
10874 +/* AUTHOR */
10875 +/* Stephen Chen Atheros Communications, INC. 2007.1 */
10876 +/* */
10877 +/************************************************************************/
10878 +void zfApFlushBufferedPsFrame(zdev_t* dev)
10879 +{
10880 + u16_t emptyFlag;
10881 + u16_t freeCount;
10882 + u16_t vap;
10883 + zbuf_t* psBuf = NULL;
10884 + zmw_get_wlan_dev(dev);
10885 + zmw_declare_for_critical_section();
10886 +
10887 + freeCount = 0;
10888 + emptyFlag = 0;
10889 + while (1)
10890 + {
10891 + psBuf = NULL;
10892 + zmw_enter_critical_section(dev);
10893 + if (wd->ap.uniHead != wd->ap.uniTail)
10894 + {
10895 + psBuf = wd->ap.uniArray[wd->ap.uniHead];
10896 + wd->ap.uniHead = (wd->ap.uniHead + 1) & (ZM_UNI_ARRAY_SIZE - 1);
10897 + }
10898 + else
10899 + {
10900 + emptyFlag = 1;
10901 + }
10902 + zmw_leave_critical_section(dev);
10903 +
10904 + if (psBuf != NULL)
10905 + {
10906 + zfwBufFree(dev, psBuf, ZM_ERR_FLUSH_PS_QUEUE);
10907 + }
10908 + zm_assert(freeCount++ < (ZM_UNI_ARRAY_SIZE*2));
10909 +
10910 + if (emptyFlag != 0)
10911 + {
10912 + break;
10913 + }
10914 + }
10915 +
10916 + for (vap=0; vap<ZM_MAX_AP_SUPPORT; vap++)
10917 + {
10918 + freeCount = 0;
10919 + emptyFlag = 0;
10920 + while (1)
10921 + {
10922 + psBuf = NULL;
10923 + zmw_enter_critical_section(dev);
10924 + if (wd->ap.bcmcHead[vap] != wd->ap.bcmcTail[vap])
10925 + {
10926 + psBuf = wd->ap.bcmcArray[vap][wd->ap.bcmcHead[vap]];
10927 + wd->ap.bcmcHead[vap] = (wd->ap.bcmcHead[vap] + 1)
10928 + & (ZM_BCMC_ARRAY_SIZE - 1);
10929 + }
10930 + else
10931 + {
10932 + emptyFlag = 1;
10933 + }
10934 + zmw_leave_critical_section(dev);
10935 +
10936 + if (psBuf != NULL)
10937 + {
10938 + zfwBufFree(dev, psBuf, ZM_ERR_FLUSH_PS_QUEUE);
10939 + }
10940 + zm_assert(freeCount++ < (ZM_BCMC_ARRAY_SIZE*2));
10941 +
10942 + if (emptyFlag != 0)
10943 + {
10944 + break;
10945 + }
10946 + }
10947 + }
10948 + return;
10949 +}
10950 +
10951 +
10952 +u16_t zfApBufferPsFrame(zdev_t* dev, zbuf_t* buf, u16_t port)
10953 +{
10954 + u16_t id;
10955 + u16_t addr[3];
10956 + u16_t vap = 0;
10957 + u8_t up;
10958 + u16_t fragOff;
10959 + u8_t ac;
10960 + u16_t ret;
10961 +
10962 + zmw_get_wlan_dev(dev);
10963 +
10964 + zmw_declare_for_critical_section();
10965 +
10966 + if (port < ZM_MAX_AP_SUPPORT)
10967 + {
10968 + vap = port;
10969 + }
10970 +
10971 + addr[0] = zmw_rx_buf_readh(dev, buf, 0);
10972 + addr[1] = zmw_rx_buf_readh(dev, buf, 2);
10973 + addr[2] = zmw_rx_buf_readh(dev, buf, 4);
10974 +
10975 + if ((addr[0] & 0x1) == 0x1)
10976 + {
10977 + if (wd->ap.staPowerSaving > 0)
10978 + {
10979 + zmw_enter_critical_section(dev);
10980 +
10981 + /* Buffer this BC or MC frame */
10982 + if (((wd->ap.bcmcTail[vap]+1)&(ZM_BCMC_ARRAY_SIZE-1))
10983 + != wd->ap.bcmcHead[vap])
10984 + {
10985 + wd->ap.bcmcArray[vap][wd->ap.bcmcTail[vap]++] = buf;
10986 + wd->ap.bcmcTail[vap] &= (ZM_BCMC_ARRAY_SIZE-1);
10987 + zmw_leave_critical_section(dev);
10988 +
10989 + zm_msg0_tx(ZM_LV_0, "Buffer BCMC");
10990 + }
10991 + else
10992 + {
10993 + /* bcmcArray full */
10994 + zmw_leave_critical_section(dev);
10995 +
10996 + zm_msg0_tx(ZM_LV_0, "BCMC buffer full");
10997 +
10998 + /* free buffer according to buffer type */
10999 + zfwBufFree(dev, buf, ZM_ERR_BCMC_PS_BUFFER_UNAVAILABLE);
11000 + }
11001 + return 1;
11002 + }
11003 + }
11004 + else
11005 + {
11006 + zmw_enter_critical_section(dev);
11007 +
11008 + if ((id = zfApFindSta(dev, addr)) != 0xffff)
11009 + {
11010 + if (wd->ap.staTable[id].psMode == 1)
11011 + {
11012 +
11013 + zfTxGetIpTosAndFrag(dev, buf, &up, &fragOff);
11014 + ac = zcUpToAc[up&0x7] & 0x3;
11015 +
11016 + if ((wd->ap.staTable[id].qosType == 1) &&
11017 + ((wd->ap.staTable[id].qosInfo & (0x8>>ac)) != 0))
11018 + {
11019 + ret = zfQueuePutNcs(dev, wd->ap.uapsdQ, buf, wd->tick);
11020 + zmw_leave_critical_section(dev);
11021 + if (ret != ZM_SUCCESS)
11022 + {
11023 + zfwBufFree(dev, buf, ZM_ERR_AP_UAPSD_QUEUE_FULL);
11024 + }
11025 + }
11026 + else
11027 + {
11028 + /* Buffer this unicast frame */
11029 + if (((wd->ap.uniTail+1)&(ZM_UNI_ARRAY_SIZE-1))
11030 + != wd->ap.uniHead)
11031 + {
11032 + wd->ap.uniArray[wd->ap.uniTail++] = buf;
11033 + wd->ap.uniTail &= (ZM_UNI_ARRAY_SIZE-1);
11034 + zmw_leave_critical_section(dev);
11035 + zm_msg0_tx(ZM_LV_0, "Buffer UNI");
11036 +
11037 + }
11038 + else
11039 + {
11040 + /* uniArray full */
11041 + zmw_leave_critical_section(dev);
11042 + zm_msg0_tx(ZM_LV_0, "UNI buffer full");
11043 + /* free buffer according to buffer type */
11044 + zfwBufFree(dev, buf, ZM_ERR_UNI_PS_BUFFER_UNAVAILABLE);
11045 + }
11046 + }
11047 + return 1;
11048 + } /* if (wd->ap.staTable[id++].psMode == 1) */
11049 + } /* if ((id = zfApFindSta(dev, addr)) != 0xffff) */
11050 + zmw_leave_critical_section(dev);
11051 + }
11052 +
11053 + return 0;
11054 +}
11055 +
11056 +u16_t zfApGetSTAInfoAndUpdatePs(zdev_t* dev, u16_t* addr, u16_t* state,
11057 + u8_t* vap, u16_t psMode, u8_t* uapsdTrig)
11058 +{
11059 + u16_t id;
11060 + u8_t uapsdStaAwake = 0;
11061 +
11062 + zmw_get_wlan_dev(dev);
11063 +
11064 + zmw_declare_for_critical_section();
11065 +
11066 + zmw_enter_critical_section(dev);
11067 +
11068 +#ifdef ZM_AP_DEBUG
11069 + //psMode=0;
11070 +#endif
11071 +
11072 + if ((id = zfApFindSta(dev, addr)) != 0xffff)
11073 + {
11074 + if (psMode != 0)
11075 + {
11076 + zm_msg0_mm(ZM_LV_0, "psMode = 1");
11077 + if (wd->ap.staTable[id].psMode == 0)
11078 + {
11079 + wd->ap.staPowerSaving++;
11080 + }
11081 + else
11082 + {
11083 + if (wd->ap.staTable[id].qosType == 1)
11084 + {
11085 + zm_msg0_mm(ZM_LV_0, "UAPSD trigger");
11086 + *uapsdTrig = wd->ap.staTable[id].qosInfo;
11087 + }
11088 + }
11089 + }
11090 + else
11091 + {
11092 + if (wd->ap.staTable[id].psMode != 0)
11093 + {
11094 + wd->ap.staPowerSaving--;
11095 + if ((wd->ap.staTable[id].qosType == 1) && ((wd->ap.staTable[id].qosInfo&0xf)!=0))
11096 + {
11097 + uapsdStaAwake = 1;
11098 + }
11099 + }
11100 + }
11101 +
11102 + wd->ap.staTable[id].psMode = (u8_t) psMode;
11103 + wd->ap.staTable[id].time = wd->tick;
11104 + *vap = wd->ap.staTable[id].vap;
11105 + *state = wd->ap.staTable[id++].state;
11106 + }
11107 +
11108 + zmw_leave_critical_section(dev);
11109 +
11110 + if (uapsdStaAwake == 1)
11111 + {
11112 + zbuf_t* psBuf;
11113 + u8_t mb;
11114 +
11115 + while (1)
11116 + {
11117 + if ((psBuf = zfQueueGetWithMac(dev, wd->ap.uapsdQ, (u8_t*)addr, &mb)) != NULL)
11118 + {
11119 + zfTxSendEth(dev, psBuf, 0, ZM_EXTERNAL_ALLOC_BUF, 0);
11120 + }
11121 + else
11122 + {
11123 + break;
11124 + }
11125 + }
11126 + }
11127 +
11128 + return id;
11129 +}
11130 +
11131 +/************************************************************************/
11132 +/* */
11133 +/* FUNCTION DESCRIPTION zfApGetNewSta */
11134 +/* Get a new STA from station table. */
11135 +/* */
11136 +/* INPUTS */
11137 +/* dev : device pointer */
11138 +/* */
11139 +/* OUTPUTS */
11140 +/* 0xffff : fail */
11141 +/* other : STA table index */
11142 +/* */
11143 +/* AUTHOR */
11144 +/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
11145 +/* */
11146 +/************************************************************************/
11147 +u16_t zfApGetNewSta(zdev_t* dev)
11148 +{
11149 + u16_t i;
11150 +
11151 + zmw_get_wlan_dev(dev);
11152 +
11153 + for (i=0; i<ZM_MAX_STA_SUPPORT; i++)
11154 + {
11155 + if (wd->ap.staTable[i].valid == 0)
11156 + {
11157 + zm_msg2_mm(ZM_LV_0, "zfApGetNewSta=", i);
11158 + return i;
11159 + }
11160 + }
11161 + return 0xffff;
11162 +}
11163 +
11164 +
11165 +/************************************************************************/
11166 +/* */
11167 +/* FUNCTION DESCRIPTION zfApAddSta */
11168 +/* Add a STA to station table. */
11169 +/* */
11170 +/* INPUTS */
11171 +/* dev : device pointer */
11172 +/* addr : STA MAC address */
11173 +/* state : STA state */
11174 +/* apId : Virtual AP ID */
11175 +/* type : 0=>11b, 1=>11g */
11176 +/* */
11177 +/* OUTPUTS */
11178 +/* 0xffff : fail */
11179 +/* Other : index */
11180 +/* */
11181 +/* AUTHOR */
11182 +/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
11183 +/* */
11184 +/************************************************************************/
11185 +u16_t zfApAddSta(zdev_t* dev, u16_t* addr, u16_t state, u16_t apId, u8_t type,
11186 + u8_t qosType, u8_t qosInfo)
11187 +{
11188 + u16_t index;
11189 + u16_t i;
11190 +
11191 + zmw_get_wlan_dev(dev);
11192 +
11193 + zmw_declare_for_critical_section();
11194 +
11195 + zm_msg1_mm(ZM_LV_0, "STA type=", type);
11196 +
11197 + zmw_enter_critical_section(dev);
11198 +
11199 + if ((index = zfApFindSta(dev, addr)) != 0xffff)
11200 + {
11201 + zm_msg0_mm(ZM_LV_2, "found");
11202 + /* Update STA state */
11203 + if ((state == ZM_STATE_AUTH) || (state == ZM_STATE_PREAUTH))
11204 + {
11205 + wd->ap.staTable[index].state = state;
11206 + wd->ap.staTable[index].time = wd->tick;
11207 + wd->ap.staTable[index].vap = (u8_t)apId;
11208 + }
11209 + else if (state == ZM_STATE_ASOC)
11210 + {
11211 + if ((wd->ap.staTable[index].state == ZM_STATE_AUTH))
11212 + //&& (wd->ap.staTable[index].vap == apId))
11213 + {
11214 + wd->ap.staTable[index].state = state;
11215 + wd->ap.staTable[index].time = wd->tick;
11216 + wd->ap.staTable[index].qosType = qosType;
11217 + wd->ap.staTable[index].vap = (u8_t)apId;
11218 + wd->ap.staTable[index].staType = type;
11219 + wd->ap.staTable[index].qosInfo = qosInfo;
11220 +
11221 + if (wd->frequency < 3000)
11222 + {
11223 + /* Init 11b/g */
11224 + zfRateCtrlInitCell(dev, &wd->ap.staTable[index].rcCell, type, 1, 1);
11225 + }
11226 + else
11227 + {
11228 + /* Init 11a */
11229 + zfRateCtrlInitCell(dev, &wd->ap.staTable[index].rcCell, type, 0, 1);
11230 + }
11231 +
11232 + if (wd->zfcbApConnectNotify != NULL)
11233 + {
11234 + wd->zfcbApConnectNotify(dev, (u8_t*)addr, apId);
11235 + }
11236 + }
11237 + else
11238 + {
11239 + index = 0xffff;
11240 + }
11241 + }
11242 + }
11243 + else
11244 + {
11245 + zm_msg0_mm(ZM_LV_2, "Not found");
11246 + if ((state == ZM_STATE_AUTH) || (state == ZM_STATE_PREAUTH))
11247 + {
11248 + /* Get a new STA and update state */
11249 + index = zfApGetNewSta(dev);
11250 + zm_msg2_mm(ZM_LV_1, "new STA index=", index);
11251 +
11252 + if (index != 0xffff)
11253 + {
11254 + for (i=0; i<3; i++)
11255 + {
11256 + wd->ap.staTable[index].addr[i] = addr[i];
11257 + }
11258 + wd->ap.staTable[index].state = state;
11259 + wd->ap.staTable[index].valid = 1;
11260 + wd->ap.staTable[index].time = wd->tick;
11261 + wd->ap.staTable[index].vap = (u8_t)apId;
11262 + wd->ap.staTable[index].encryMode = ZM_NO_WEP;
11263 + }
11264 + }
11265 + }
11266 +
11267 + zmw_leave_critical_section(dev);
11268 +
11269 + return index;
11270 +}
11271 +
11272 +
11273 +/************************************************************************/
11274 +/* */
11275 +/* FUNCTION DESCRIPTION zfApAgingSta */
11276 +/* Aging STA in station table. */
11277 +/* */
11278 +/* INPUTS */
11279 +/* dev : device pointer */
11280 +/* */
11281 +/* OUTPUTS */
11282 +/* number of 11b STA in STA table */
11283 +/* */
11284 +/* AUTHOR */
11285 +/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
11286 +/* */
11287 +/************************************************************************/
11288 +void zfApAgingSta(zdev_t* dev)
11289 +{
11290 + u16_t i;
11291 + u32_t deltaMs;
11292 + u16_t addr[3];
11293 + u16_t txFlag;
11294 + u16_t psStaCount = 0;
11295 +
11296 + zmw_get_wlan_dev(dev);
11297 +
11298 + zmw_declare_for_critical_section();
11299 +
11300 + wd->ap.gStaAssociated = wd->ap.bStaAssociated = 0;
11301 +
11302 + for (i=0; i<ZM_MAX_STA_SUPPORT; i++)
11303 + {
11304 + txFlag = 0;
11305 + zmw_enter_critical_section(dev);
11306 + if (wd->ap.staTable[i].valid == 1)
11307 + {
11308 + addr[0] = wd->ap.staTable[i].addr[0];
11309 + addr[1] = wd->ap.staTable[i].addr[1];
11310 + addr[2] = wd->ap.staTable[i].addr[2];
11311 + /* millisecond */
11312 + deltaMs = (u32_t)((u32_t)wd->tick-(u32_t)wd->ap.staTable[i].time)
11313 + * ZM_MS_PER_TICK;
11314 +
11315 + /* preauth */
11316 + if ((wd->ap.staTable[i].state == ZM_STATE_PREAUTH)
11317 + && (deltaMs > ZM_PREAUTH_TIMEOUT_MS))
11318 + {
11319 + /* Aging STA */
11320 + wd->ap.staTable[i].valid = 0;
11321 + wd->ap.authSharing = 0;
11322 + txFlag = 1;
11323 + }
11324 +
11325 + /* auth */
11326 + if ((wd->ap.staTable[i].state == ZM_STATE_AUTH)
11327 + && (deltaMs > ZM_AUTH_TIMEOUT_MS))
11328 + {
11329 + /* Aging STA */
11330 + wd->ap.staTable[i].valid = 0;
11331 + txFlag = 1;
11332 + }
11333 +
11334 + /* asoc */
11335 + if (wd->ap.staTable[i].state == ZM_STATE_ASOC)
11336 + {
11337 + if (wd->ap.staTable[i].psMode != 0)
11338 + {
11339 + psStaCount++;
11340 + }
11341 +
11342 + if (deltaMs > ((u32_t)wd->ap.staAgingTimeSec<<10))
11343 + {
11344 + /* Aging STA */
11345 + zm_msg1_mm(ZM_LV_0, "Age STA index=", i);
11346 + wd->ap.staTable[i].valid = 0;
11347 + txFlag = 1;
11348 + }
11349 + else if (deltaMs > ((u32_t)wd->ap.staProbingTimeSec<<10))
11350 + {
11351 + if (wd->ap.staTable[i].psMode == 0)
11352 + {
11353 + /* Probing non-PS STA */
11354 + zm_msg1_mm(ZM_LV_0, "Probing STA index=", i);
11355 + wd->ap.staTable[i].time +=
11356 + (wd->ap.staProbingTimeSec * ZM_TICK_PER_SECOND);
11357 + txFlag = 2;
11358 + }
11359 + }
11360 + }
11361 +
11362 +
11363 + }
11364 + zmw_leave_critical_section(dev);
11365 +
11366 + if (txFlag == 1)
11367 + {
11368 + /* Send deauthentication management frame */
11369 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, addr, 4, 0, 0);
11370 + }
11371 + else if (txFlag == 2)
11372 + {
11373 + zfSendMmFrame(dev, ZM_WLAN_DATA_FRAME, addr, 0, 0, 0);
11374 + }
11375 +
11376 + }
11377 +
11378 + wd->ap.staPowerSaving = psStaCount;
11379 +
11380 + return;
11381 +}
11382 +
11383 +void zfApProtctionMonitor(zdev_t* dev)
11384 +{
11385 + zmw_get_wlan_dev(dev);
11386 +
11387 + /* 11b STA associated => nonErp, Protect */
11388 + if (wd->ap.bStaAssociated > 0)
11389 + {
11390 + /* Enable NonErp bit in information element */
11391 + wd->erpElement = ZM_WLAN_NON_ERP_PRESENT_BIT
11392 + | ZM_WLAN_USE_PROTECTION_BIT;
11393 +
11394 + /* Enable protection mode */
11395 + zfApSetProtectionMode(dev, 1);
11396 +
11397 + }
11398 + /* 11b STA not associated, protection OBSS present => Protect */
11399 + else if (wd->ap.protectedObss > 2) //Threshold
11400 + {
11401 + if (wd->disableSelfCts == 0)
11402 + {
11403 + /* Disable NonErp bit in information element */
11404 + wd->erpElement = ZM_WLAN_USE_PROTECTION_BIT;
11405 +
11406 + /* Enable protection mode */
11407 + zfApSetProtectionMode(dev, 1);
11408 + }
11409 + }
11410 + else
11411 + {
11412 + /* Disable NonErp bit in information element */
11413 + wd->erpElement = 0;
11414 +
11415 + /* Disable protection mode */
11416 + zfApSetProtectionMode(dev, 0);
11417 + }
11418 + wd->ap.protectedObss = 0;
11419 +}
11420 +
11421 +
11422 +void zfApProcessBeacon(zdev_t* dev, zbuf_t* buf)
11423 +{
11424 + u16_t offset;
11425 + u8_t ch;
11426 +
11427 + zmw_get_wlan_dev(dev);
11428 +
11429 + zm_msg0_mm(ZM_LV_3, "Rx beacon");
11430 +
11431 + /* update Non-ERP flag(wd->ap.nonErpObss) */
11432 + if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_ERP)) == 0xffff)
11433 + {
11434 + /* 11b OBSS */
11435 + wd->ap.protectedObss++;
11436 + return;
11437 + }
11438 +
11439 + ch = zmw_rx_buf_readb(dev, buf, offset+2);
11440 + if ((ch & ZM_WLAN_USE_PROTECTION_BIT) == ZM_WLAN_USE_PROTECTION_BIT)
11441 + {
11442 + /* Protected OBSS */
11443 + wd->ap.protectedObss = 1;
11444 + }
11445 +
11446 + return;
11447 +}
11448 +
11449 +
11450 +/************************************************************************/
11451 +/* */
11452 +/* FUNCTION DESCRIPTION zfProcessAuth */
11453 +/* Process authenticate management frame. */
11454 +/* */
11455 +/* INPUTS */
11456 +/* dev : device pointer */
11457 +/* buf : auth frame buffer */
11458 +/* */
11459 +/* OUTPUTS */
11460 +/* none */
11461 +/* */
11462 +/* AUTHOR */
11463 +/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
11464 +/* */
11465 +/************************************************************************/
11466 +/* Note : AP allows one authenticating STA at a time, does not */
11467 +/* support multiple authentication process. Make sure */
11468 +/* authentication state machine will not be blocked due */
11469 +/* to incompleted authentication handshake. */
11470 +void zfApProcessAuth(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId)
11471 +{
11472 + u16_t algo, seq, status;
11473 + u8_t authSharing;
11474 + u16_t ret;
11475 + u16_t i;
11476 + u8_t challengePassed = 0;
11477 + u8_t frameCtrl;
11478 + u32_t retAlgoSeq;
11479 + u32_t retStatus;
11480 + zmw_get_wlan_dev(dev);
11481 + zmw_declare_for_critical_section();
11482 +
11483 +
11484 + frameCtrl = zmw_rx_buf_readb(dev, buf, 1);
11485 + /* AP : Auth share 3 */
11486 + /* shift for WEP IV */
11487 + if ((frameCtrl & 0x40) != 0)
11488 + {
11489 + algo = zmw_rx_buf_readh(dev, buf, 28);
11490 + seq = zmw_rx_buf_readh(dev, buf, 30);
11491 + status = zmw_rx_buf_readh(dev, buf, 32);
11492 + }
11493 + else
11494 + {
11495 + algo = zmw_rx_buf_readh(dev, buf, 24);
11496 + seq = zmw_rx_buf_readh(dev, buf, 26);
11497 + status = zmw_rx_buf_readh(dev, buf, 28);
11498 + }
11499 +
11500 + zm_msg2_mm(ZM_LV_0, "Rx Auth, seq=", seq);
11501 +
11502 + /* Set default to authentication algorithm not support */
11503 + retAlgoSeq = 0x20000 | algo;
11504 + retStatus = 13; /* authentication algorithm not support */
11505 +
11506 + /* AP : Auth open 1 */
11507 + if (algo == 0)
11508 + {
11509 + if (wd->ap.authAlgo[apId] == 0)
11510 + {
11511 + retAlgoSeq = 0x20000;
11512 + if (seq == 1)
11513 + {
11514 + /* AP : update STA to auth */
11515 + if ((ret = zfApAddSta(dev, src, ZM_STATE_AUTH, apId, 0, 0, 0)) != 0xffff)
11516 + {
11517 + /* AP : call zfwAuthNotify() for host to judge */
11518 + //zfwAuthNotify(dev, src);
11519 +
11520 + /* AP : response Auth seq=2, success */
11521 + retStatus = 0;
11522 +
11523 + }
11524 + else
11525 + {
11526 + /* AP : response Auth seq=2, unspecific error */
11527 + retStatus = 1;
11528 + }
11529 + }
11530 + else
11531 + {
11532 + /* AP : response Auth seq=2, sequence number out of expected */
11533 + retStatus = 14;
11534 + }
11535 + }
11536 + }
11537 + /* AP : Auth share 1 */
11538 + else if (algo == 1)
11539 + {
11540 + if (wd->ap.authAlgo[apId] == 1)
11541 + {
11542 + if (seq == 1)
11543 + {
11544 + retAlgoSeq = 0x20001;
11545 +
11546 + /* critical section */
11547 + zmw_enter_critical_section(dev);
11548 + if (wd->ap.authSharing == 1)
11549 + {
11550 + authSharing = 1;
11551 + }
11552 + else
11553 + {
11554 + authSharing = 0;
11555 + wd->ap.authSharing = 1;
11556 + }
11557 + /* end of critical section */
11558 + zmw_leave_critical_section(dev);
11559 +
11560 + if (authSharing == 1)
11561 + {
11562 + /* AP : response Auth seq=2, status = fail */
11563 + retStatus = 1;
11564 + }
11565 + else
11566 + {
11567 + /* AP : update STA to preauth */
11568 + zfApAddSta(dev, src, ZM_STATE_PREAUTH, apId, 0, 0, 0);
11569 +
11570 + /* AP : call zfwAuthNotify() for host to judge */
11571 + //zfwAuthNotify(dev, src);
11572 +
11573 + /* AP : response Auth seq=2 */
11574 + retStatus = 0;
11575 + }
11576 + }
11577 + else if (seq == 3)
11578 + {
11579 + retAlgoSeq = 0x40001;
11580 +
11581 + if (wd->ap.authSharing == 1)
11582 + {
11583 + /* check challenge text */
11584 + if (zmw_buf_readh(dev, buf, 30+4) == 0x8010)
11585 + {
11586 + for (i=0; i<128; i++)
11587 + {
11588 + if (wd->ap.challengeText[i]
11589 + != zmw_buf_readb(dev, buf, 32+i+4))
11590 + {
11591 + break;
11592 + }
11593 + }
11594 + if (i == 128)
11595 + {
11596 + challengePassed = 1;
11597 + }
11598 + }
11599 +
11600 + if (challengePassed == 1)
11601 + {
11602 + /* AP : update STA to auth */
11603 + zfApAddSta(dev, src, ZM_STATE_AUTH, apId, 0, 0, 0);
11604 +
11605 + /* AP : response Auth seq=2 */
11606 + retStatus = 0;
11607 + }
11608 + else
11609 + {
11610 + /* AP : response Auth seq=2, challenge failure */
11611 + retStatus = 15;
11612 +
11613 + /* TODO : delete STA */
11614 + }
11615 +
11616 + wd->ap.authSharing = 0;
11617 + }
11618 + }
11619 + else
11620 + {
11621 + retAlgoSeq = 0x40001;
11622 + retStatus = 14;
11623 + }
11624 + }
11625 + }
11626 +
11627 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_AUTH, src, retAlgoSeq,
11628 + retStatus, apId);
11629 + return;
11630 +}
11631 +
11632 +void zfApProcessAsocReq(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId)
11633 +{
11634 + u16_t aid = 0xffff;
11635 + u8_t frameType;
11636 + u16_t offset;
11637 + u8_t staType = 0;
11638 + u8_t qosType = 0;
11639 + u8_t qosInfo = 0;
11640 + u8_t tmp;
11641 + u16_t i, j, k;
11642 + u16_t encMode = 0;
11643 +
11644 + zmw_get_wlan_dev(dev);
11645 + /* AP : check SSID */
11646 + if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_SSID)) != 0xffff)
11647 + {
11648 + k = 0;
11649 + for (j = 0; j < wd->ap.vapNumber; j++)
11650 + {
11651 + if ((tmp = zmw_buf_readb(dev, buf, offset+1))
11652 + != wd->ap.ssidLen[j])
11653 + {
11654 + k++;
11655 + }
11656 + }
11657 + if (k == wd->ap.vapNumber)
11658 + {
11659 + goto zlDeauth;
11660 + }
11661 +
11662 + k = 0;
11663 + for (j = 0; j < wd->ap.vapNumber; j++)
11664 + {
11665 + for (i=0; i<wd->ap.ssidLen[j]; i++)
11666 + {
11667 + if ((tmp = zmw_buf_readb(dev, buf, offset+2+i))
11668 + != wd->ap.ssid[j][i])
11669 + {
11670 + break;
11671 + }
11672 + }
11673 + if (i == wd->ap.ssidLen[j])
11674 + {
11675 + apId = j;
11676 + }
11677 + else
11678 + {
11679 + k++;
11680 + }
11681 + }
11682 + if (k == wd->ap.vapNumber)
11683 + {
11684 + goto zlDeauth;
11685 + }
11686 + }
11687 +
11688 + /* TODO : check capability */
11689 +
11690 + /* AP : check support rate */
11691 + if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_RATE)) != 0xffff)
11692 + {
11693 + /* 11g STA */
11694 + staType = 1;
11695 + }
11696 + //CWYang(+)
11697 + if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_HT_CAPABILITY)) != 0xffff)
11698 + {
11699 + /* 11n STA */
11700 + staType = 2;
11701 + }
11702 +
11703 + /* TODO : do not allow 11b STA to associated in Pure G mode */
11704 + if (wd->ap.wlanType[apId] == ZM_WLAN_TYPE_PURE_G && staType == 0)
11705 + {
11706 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, src, 3, 0, 0);
11707 + return;
11708 + }
11709 +
11710 + /* In pure B mode, we set G STA into B mode */
11711 + if (wd->ap.wlanType[apId] == ZM_WLAN_TYPE_PURE_B && staType == 1)
11712 + {
11713 + staType = 0;
11714 + }
11715 +
11716 + /* AP : check 11i and WPA */
11717 + /* AP : check 11h */
11718 +
11719 + /* AP : check WME */
11720 + if ((offset = zfFindWifiElement(dev, buf, 2, 0)) != 0xffff)
11721 + {
11722 + /* WME STA */
11723 + qosType = 1;
11724 + zm_msg0_mm(ZM_LV_0, "WME STA");
11725 +
11726 + if (wd->ap.uapsdEnabled != 0)
11727 + {
11728 + qosInfo = zmw_rx_buf_readb(dev, buf, offset+8);
11729 + }
11730 + }
11731 +
11732 + if (wd->ap.wpaSupport[apId] == 1)
11733 + {
11734 + if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_WPA_IE)) != 0xffff )
11735 + {
11736 + /* get WPA IE */
11737 + u8_t length = zmw_rx_buf_readb(dev, buf, offset+1);
11738 + if (length+2 < ZM_MAX_WPAIE_SIZE)
11739 + {
11740 + zfCopyFromRxBuffer(dev, buf, wd->ap.stawpaIe[apId], offset, length+2);
11741 + wd->ap.stawpaLen[apId] = length+2;
11742 + encMode = 1;
11743 +
11744 +
11745 + zm_msg1_mm(ZM_LV_0, "WPA Mode zfwAsocNotify, apId=", apId);
11746 +
11747 + /* AP : Call zfwAsocNotify() */
11748 + if (wd->zfcbAsocNotify != NULL)
11749 + {
11750 + wd->zfcbAsocNotify(dev, src, wd->ap.stawpaIe[apId], wd->ap.stawpaLen[apId], apId);
11751 + }
11752 + }
11753 + else
11754 + {
11755 + goto zlDeauth;
11756 + }
11757 + }
11758 + else if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_RSN_IE)) != 0xffff )
11759 + {
11760 + /* get RSN IE */
11761 + u8_t length = zmw_rx_buf_readb(dev, buf, offset+1);
11762 + if (length+2 < ZM_MAX_WPAIE_SIZE)
11763 + {
11764 + zfCopyFromRxBuffer(dev, buf, wd->ap.stawpaIe[apId], offset, length+2);
11765 + wd->ap.stawpaLen[apId] = length+2;
11766 + encMode = 1;
11767 +
11768 + zm_msg1_mm(ZM_LV_0, "RSN Mode zfwAsocNotify, apId=", apId);
11769 +
11770 + /* AP : Call zfwAsocNotify() */
11771 + if (wd->zfcbAsocNotify != NULL)
11772 + {
11773 + wd->zfcbAsocNotify(dev, src, wd->ap.stawpaIe[apId], wd->ap.stawpaLen[apId], apId);
11774 + }
11775 + }
11776 + else
11777 + {
11778 + goto zlDeauth;
11779 + }
11780 + }
11781 +#ifdef ZM_ENABLE_CENC
11782 + else if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_CENC_IE)) != 0xffff )
11783 + {
11784 + /* get CENC IE */
11785 + u8_t length = zmw_rx_buf_readb(dev, buf, offset+1);
11786 +
11787 + if (length+2 < ZM_MAX_WPAIE_SIZE)
11788 + {
11789 + zfCopyFromRxBuffer(dev, buf, wd->ap.stawpaIe[apId], offset, length+2);
11790 + wd->ap.stawpaLen[apId] = length+2;
11791 + encMode = 1;
11792 +
11793 + zm_msg1_mm(ZM_LV_0, "CENC Mode zfwAsocNotify, apId=", apId);
11794 +
11795 + /* AP : Call zfwAsocNotify() */
11796 + if (wd->zfcbCencAsocNotify != NULL)
11797 + {
11798 + wd->zfcbCencAsocNotify(dev, src, wd->ap.stawpaIe[apId],
11799 + wd->ap.stawpaLen[apId], apId);
11800 + }
11801 + }
11802 + else
11803 + {
11804 + goto zlDeauth;
11805 + }
11806 + }
11807 +#endif //ZM_ENABLE_CENC
11808 + else
11809 + { /* ap is encryption but sta has no wpa/rsn ie */
11810 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, src, 6, 0, 0);
11811 + return;
11812 + }
11813 + }
11814 + /* sta has wpa/rsn ie but ap is no encryption */
11815 + if ((wd->ap.wpaSupport[apId] == 0) && (encMode == 1))
11816 + {
11817 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, src, 6, 0, 0);
11818 + return;
11819 + }
11820 +
11821 + /* AP : update STA to asoc */
11822 + aid = zfApAddSta(dev, src, ZM_STATE_ASOC, apId, staType, qosType, qosInfo);
11823 +
11824 + zfApStoreAsocReqIe(dev, buf, aid);
11825 +
11826 +zlDeauth:
11827 + /* AP : send asoc rsp2 */
11828 + if (aid != 0xffff)
11829 + {
11830 + frameType = zmw_rx_buf_readb(dev, buf, 0);
11831 +
11832 + if (frameType == ZM_WLAN_FRAME_TYPE_ASOCREQ)
11833 + {
11834 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_ASOCRSP, src, 0, aid+1, apId);
11835 + }
11836 + else
11837 + {
11838 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_REASOCRSP, src, 0, aid+1, apId);
11839 + }
11840 + }
11841 + else
11842 + {
11843 + /* TODO : send deauthentication */
11844 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, src, 6, 0, 0);
11845 + }
11846 +
11847 + return;
11848 +}
11849 +
11850 +void zfApStoreAsocReqIe(zdev_t* dev, zbuf_t* buf, u16_t aid)
11851 +{
11852 + //struct zsWlanAssoFrameHeader* pAssoFrame;
11853 + //u8_t pBuf[sizeof(struct zsWlanAssoFrameHeader)];
11854 + u16_t offset;
11855 + u32_t i;
11856 + u16_t length;
11857 + u8_t *htcap;
11858 +
11859 + zmw_get_wlan_dev(dev);
11860 +
11861 + for (i=0; i<wd->sta.asocRspFrameBodySize; i++)
11862 + {
11863 + wd->sta.asocRspFrameBody[i] = zmw_rx_buf_readb(dev, buf, i+24);
11864 + }
11865 + /* capability: 2 octets */
11866 + offset = 24;
11867 +
11868 + /* Listen interval: 2 octets */
11869 + offset = 26;
11870 +
11871 + /* SSID */
11872 + offset = 28;
11873 +
11874 + /* supported rates */
11875 + if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_SUPPORT_RATE)) == 0xffff)
11876 + return;
11877 + length = zmw_rx_buf_readb(dev, buf, offset + 1);
11878 +
11879 + /* extended supported rates */
11880 + if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_RATE)) == 0xffff)
11881 + return;
11882 + length = zmw_rx_buf_readb(dev, buf, offset + 1);
11883 +
11884 + /* power capability:4 octets */
11885 + offset = offset + 2 + length;
11886 +
11887 + /* supported channels: 4 octets */
11888 + offset = offset + 2 + 4;
11889 +
11890 + /* RSN */
11891 +
11892 + /* QoS */
11893 +
11894 + /* HT capabilities: 28 octets */
11895 + if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_HT_CAPABILITY)) != 0xffff) {
11896 + /* atheros pre n */
11897 + htcap = (u8_t *)&wd->ap.ie[aid].HtCap;
11898 + htcap[0] = zmw_rx_buf_readb(dev, buf, offset);
11899 + htcap[1] = 26;
11900 + for (i=1; i<=26; i++)
11901 + {
11902 + htcap[i+1] = zmw_rx_buf_readb(dev, buf, offset + i);
11903 + zm_debug_msg2("ASOC: HT Capabilities, htcap=", htcap[i+1]);
11904 + }
11905 + return;
11906 + }
11907 + else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTCAPABILITY)) != 0xffff) {
11908 + /* pre n 2.0 standard */
11909 + htcap = (u8_t *)&wd->ap.ie[aid].HtCap;
11910 + for (i=0; i<28; i++)
11911 + {
11912 + htcap[i] = zmw_rx_buf_readb(dev, buf, offset + i);
11913 + zm_debug_msg2("ASOC: HT Capabilities, htcap=", htcap[i]);
11914 + }
11915 + }
11916 + else {
11917 + /* not 11n AP */
11918 + return;
11919 + }
11920 +
11921 +
11922 + /* supported regulatory classes */
11923 + offset = offset + length;
11924 + //length = zmw_rx_buf_readb(dev, buf, offset + 1);
11925 + {
11926 + u8_t *htcap;
11927 + htcap = (u8_t *)&wd->sta.ie.HtInfo;
11928 + //zm_debug_msg2("ASOC: HT Capabilities info=", ((u16_t *)htcap)[1]);
11929 + //zm_debug_msg2("ASOC: A-MPDU parameters=", htcap[4]);
11930 + //zm_debug_msg2("ASOC: Supported MCS set=", ((u32_t *)htcap)[1]>>8);
11931 + }
11932 +
11933 +}
11934 +
11935 +void zfApProcessAsocRsp(zdev_t* dev, zbuf_t* buf)
11936 +{
11937 +
11938 +}
11939 +
11940 +void zfApProcessDeauth(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId)
11941 +{
11942 + u16_t aid;
11943 + zmw_get_wlan_dev(dev);
11944 + zmw_declare_for_critical_section();
11945 +
11946 + zmw_enter_critical_section(dev);
11947 + /* AP : if SA=associated STA then deauthenticate STA */
11948 + if ((aid = zfApFindSta(dev, src)) != 0xffff)
11949 + {
11950 + /* Clear STA table */
11951 + wd->ap.staTable[aid].valid = 0;
11952 + if (wd->zfcbDisAsocNotify != NULL)
11953 + {
11954 + wd->zfcbDisAsocNotify(dev, (u8_t*)src, apId);
11955 + }
11956 + }
11957 + zmw_leave_critical_section(dev);
11958 +
11959 +}
11960 +
11961 +void zfApProcessDisasoc(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId)
11962 +{
11963 + u16_t aid;
11964 + zmw_get_wlan_dev(dev);
11965 + zmw_declare_for_critical_section();
11966 +
11967 + zmw_enter_critical_section(dev);
11968 + /* AP : if SA=associated STA then deauthenticate STA */
11969 + if ((aid = zfApFindSta(dev, src)) != 0xffff)
11970 + {
11971 + /* Clear STA table */
11972 + wd->ap.staTable[aid].valid = 0;
11973 + zmw_leave_critical_section(dev);
11974 + if (wd->zfcbDisAsocNotify != NULL)
11975 + {
11976 + wd->zfcbDisAsocNotify(dev, (u8_t*)src, apId);
11977 + }
11978 + }
11979 + zmw_leave_critical_section(dev);
11980 +
11981 +}
11982 +
11983 +
11984 +void zfApProcessProbeRsp(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo)
11985 +{
11986 +#if 0
11987 + zmw_get_wlan_dev(dev);
11988 +
11989 + zm_msg0_mm(ZM_LV_0, "Rx probersp");
11990 +
11991 + /* Gather scan result */
11992 +
11993 + //zm_debug_msg1("bssList Count = ", wd->sta.bssList.bssCount);
11994 + /* return if not in scanning */
11995 + if ((wd->heartBeatNotification & ZM_BSSID_LIST_SCAN)
11996 + != ZM_BSSID_LIST_SCAN)
11997 + {
11998 + return;
11999 + }
12000 +
12001 + //if ( wd->sta.pUpdateBssList->bssCount == ZM_MAX_BSS )
12002 + if ( wd->sta.bssList.bssCount == ZM_MAX_BSS )
12003 + {
12004 + return;
12005 + }
12006 +
12007 + zfProcessProbeRsp(dev, buf, AddInfo);
12008 +
12009 +#endif
12010 +}
12011 +
12012 +/************************************************************************/
12013 +/* */
12014 +/* FUNCTION DESCRIPTION zfApAddIeSsid */
12015 +/* Add AP information element SSID to buffer. */
12016 +/* */
12017 +/* INPUTS */
12018 +/* dev : device pointer */
12019 +/* buf : buffer to add information element */
12020 +/* offset : add information element from this offset */
12021 +/* vap : virtual AP ID */
12022 +/* */
12023 +/* OUTPUTS */
12024 +/* buffer offset after adding information element */
12025 +/* */
12026 +/* AUTHOR */
12027 +/* Stephen Chen ZyDAS Technology Corporation 2005.11 */
12028 +/* */
12029 +/************************************************************************/
12030 +u16_t zfApAddIeSsid(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t vap)
12031 +{
12032 + u16_t i;
12033 +
12034 + zmw_get_wlan_dev(dev);
12035 +
12036 + /* Element ID */
12037 + zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SSID);
12038 +
12039 + /* Element Length */
12040 + zmw_tx_buf_writeb(dev, buf, offset++, wd->ap.ssidLen[vap]);
12041 +
12042 + /* Information : SSID */
12043 + for (i=0; i<wd->ap.ssidLen[vap]; i++)
12044 + {
12045 + zmw_tx_buf_writeb(dev, buf, offset++, wd->ap.ssid[vap][i]);
12046 + }
12047 +
12048 + return offset;
12049 +}
12050 +
12051 +
12052 +/************************************************************************/
12053 +/* */
12054 +/* FUNCTION DESCRIPTION zfApAddIeTim */
12055 +/* Add AP information element TIM to buffer. */
12056 +/* */
12057 +/* INPUTS */
12058 +/* dev : device pointer */
12059 +/* buf : buffer to add information element */
12060 +/* offset : add information element from this offset */
12061 +/* vap : virtual AP ID */
12062 +/* */
12063 +/* OUTPUTS */
12064 +/* buffer offset after adding information element */
12065 +/* */
12066 +/* AUTHOR */
12067 +/* Stephen Chen ZyDAS Technology Corporation 2005.11 */
12068 +/* */
12069 +/************************************************************************/
12070 +u16_t zfApAddIeTim(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t vap)
12071 +{
12072 + u8_t uniBitMap[9];
12073 + u16_t highestByte;
12074 + u16_t i;
12075 + u16_t lenOffset;
12076 + u16_t id;
12077 + u16_t dst[3];
12078 + u16_t aid;
12079 + u16_t bitPosition;
12080 + u16_t bytePosition;
12081 + zbuf_t* psBuf;
12082 + zbuf_t* tmpBufArray[ZM_UNI_ARRAY_SIZE];
12083 + u16_t tmpBufArraySize = 0;
12084 +
12085 + zmw_get_wlan_dev(dev);
12086 +
12087 + zmw_declare_for_critical_section();
12088 +
12089 + /* Element ID */
12090 + zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_TIM);
12091 +
12092 + /* offset of Element Length */
12093 + lenOffset = offset++;
12094 +
12095 + /* Information : TIM */
12096 + /* DTIM count */
12097 + /* TODO : Doesn't work for Virtual AP's case */
12098 + wd->CurrentDtimCount++;
12099 + if (wd->CurrentDtimCount >= wd->dtim)
12100 + {
12101 + wd->CurrentDtimCount = 0;
12102 + }
12103 + zmw_tx_buf_writeb(dev, buf, offset++, wd->CurrentDtimCount);
12104 + /* DTIM period */
12105 + zmw_tx_buf_writeb(dev, buf, offset++, wd->dtim);
12106 + /* bitmap offset */
12107 + zmw_tx_buf_writeb(dev, buf, offset++, 0);
12108 +
12109 + /* Update BCMC bit */
12110 + if (wd->CurrentDtimCount == 0)
12111 + {
12112 + zmw_enter_critical_section(dev);
12113 + wd->ap.timBcmcBit[vap] = (wd->ap.bcmcTail[vap]!=wd->ap.bcmcHead[vap])?1:0;
12114 + zmw_leave_critical_section(dev);
12115 + }
12116 + else
12117 + {
12118 + wd->ap.timBcmcBit[vap] = 0;
12119 + }
12120 +
12121 + /* Update Unicast bitmap */
12122 + /* reset bit map */
12123 + for (i=0; i<9; i++)
12124 + {
12125 + uniBitMap[i] = 0;
12126 + }
12127 + highestByte = 0;
12128 +#if 1
12129 +
12130 + zmw_enter_critical_section(dev);
12131 +
12132 + id = wd->ap.uniHead;
12133 + while (id != wd->ap.uniTail)
12134 + {
12135 + psBuf = wd->ap.uniArray[id];
12136 +
12137 + /* TODO : Aging PS frame after queuing for more than 10 seconds */
12138 +
12139 + /* get destination STA's aid */
12140 + dst[0] = zmw_tx_buf_readh(dev, psBuf, 0);
12141 + dst[1] = zmw_tx_buf_readh(dev, psBuf, 2);
12142 + dst[2] = zmw_tx_buf_readh(dev, psBuf, 4);
12143 + if ((aid = zfApFindSta(dev, dst)) != 0xffff)
12144 + {
12145 + if (wd->ap.staTable[aid].psMode != 0)
12146 + {
12147 + zm_msg1_mm(ZM_LV_0, "aid=",aid);
12148 + aid++;
12149 + zm_assert(aid<=64);
12150 + bitPosition = (1 << (aid & 0x7));
12151 + bytePosition = (aid >> 3);
12152 + uniBitMap[bytePosition] |= bitPosition;
12153 +
12154 + if (bytePosition>highestByte)
12155 + {
12156 + highestByte = bytePosition;
12157 + }
12158 + id = (id+1) & (ZM_UNI_ARRAY_SIZE-1);
12159 + }
12160 + else
12161 + {
12162 + zm_msg0_mm(ZM_LV_0, "Send PS frame which STA no longer in PS mode");
12163 + /* Send PS frame which STA no longer in PS mode */
12164 + zfApRemoveFromPsQueue(dev, id, dst);
12165 + tmpBufArray[tmpBufArraySize++] = psBuf;
12166 + }
12167 + }
12168 + else
12169 + {
12170 + zm_msg0_mm(ZM_LV_0, "Free garbage PS frame");
12171 + /* Free garbage PS frame */
12172 + zfApRemoveFromPsQueue(dev, id, dst);
12173 + zfwBufFree(dev, psBuf, 0);
12174 + }
12175 + }
12176 +
12177 + zmw_leave_critical_section(dev);
12178 +#endif
12179 +
12180 + zfQueueGenerateUapsdTim(dev, wd->ap.uapsdQ, uniBitMap, &highestByte);
12181 +
12182 + zm_msg1_mm(ZM_LV_3, "bm=",uniBitMap[0]);
12183 + zm_msg1_mm(ZM_LV_3, "highestByte=",highestByte);
12184 + zm_msg1_mm(ZM_LV_3, "timBcmcBit[]=",wd->ap.timBcmcBit[vap]);
12185 +
12186 + /* bitmap */
12187 + zmw_tx_buf_writeb(dev, buf, offset++,
12188 + uniBitMap[0] | wd->ap.timBcmcBit[vap]);
12189 + for (i=0; i<highestByte; i++)
12190 + {
12191 + zmw_tx_buf_writeb(dev, buf, offset++, uniBitMap[i+1]);
12192 + }
12193 +
12194 + /* Element Length */
12195 + zmw_tx_buf_writeb(dev, buf, lenOffset, highestByte+4);
12196 +
12197 + for (i=0; i<tmpBufArraySize; i++)
12198 + {
12199 + /* Put to VTXQ[ac] */
12200 + zfPutVtxq(dev, tmpBufArray[i]);
12201 + }
12202 + /* Push VTXQ[ac] */
12203 + zfPushVtxq(dev);
12204 +
12205 + return offset;
12206 +}
12207 +
12208 +
12209 +
12210 +/************************************************************************/
12211 +/* */
12212 +/* FUNCTION DESCRIPTION zfApRemoveFromPsQueue */
12213 +/* Remove zbuf from PS queue. */
12214 +/* */
12215 +/* INPUTS */
12216 +/* dev : device pointer */
12217 +/* id : index in ps queue */
12218 +/* */
12219 +/* OUTPUTS */
12220 +/* more data bit */
12221 +/* */
12222 +/* AUTHOR */
12223 +/* Stephen Chen Atheros Communications, INC. 2007.1 */
12224 +/* */
12225 +/************************************************************************/
12226 +u8_t zfApRemoveFromPsQueue(zdev_t* dev, u16_t id, u16_t* addr)
12227 +{
12228 + u16_t dst[3];
12229 + u16_t nid;
12230 + u8_t moreData = 0;
12231 + zmw_get_wlan_dev(dev);
12232 +
12233 + wd->ap.uniTail = (wd->ap.uniTail-1) & (ZM_UNI_ARRAY_SIZE-1);
12234 + while (id != wd->ap.uniTail)
12235 + {
12236 + nid = (id + 1) & (ZM_UNI_ARRAY_SIZE - 1);
12237 + wd->ap.uniArray[id] = wd->ap.uniArray[nid];
12238 +
12239 + /* Search until tail to config more data bit */
12240 + dst[0] = zmw_buf_readh(dev, wd->ap.uniArray[id], 0);
12241 + dst[1] = zmw_buf_readh(dev, wd->ap.uniArray[id], 2);
12242 + dst[2] = zmw_buf_readh(dev, wd->ap.uniArray[id], 4);
12243 + if ((addr[0] == dst[0]) && (addr[1] == dst[1])
12244 + && (addr[2] == dst[2]))
12245 + {
12246 + moreData = 0x20;
12247 + }
12248 +
12249 + id = nid;
12250 + }
12251 + return moreData;
12252 +}
12253 +
12254 +/************************************************************************/
12255 +/* */
12256 +/* FUNCTION DESCRIPTION zfApAddIeWmePara */
12257 +/* Add WME Parameter Element to buffer. */
12258 +/* */
12259 +/* INPUTS */
12260 +/* dev : device pointer */
12261 +/* buf : buffer to add information element */
12262 +/* offset : add information element from this offset */
12263 +/* vap : virtual AP ID */
12264 +/* */
12265 +/* OUTPUTS */
12266 +/* buffer offset after adding information element */
12267 +/* */
12268 +/* AUTHOR */
12269 +/* Stephen Chen ZyDAS Technology Corporation 2006.1 */
12270 +/* */
12271 +/************************************************************************/
12272 +u16_t zfApAddIeWmePara(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t vap)
12273 +{
12274 + zmw_get_wlan_dev(dev);
12275 +
12276 + /* Element ID */
12277 + zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_WIFI_IE);
12278 +
12279 + /* Element Length */
12280 + zmw_tx_buf_writeb(dev, buf, offset++, 24);
12281 +
12282 + /* OUI */
12283 + zmw_tx_buf_writeb(dev, buf, offset++, 0x00);
12284 + zmw_tx_buf_writeb(dev, buf, offset++, 0x50);
12285 + zmw_tx_buf_writeb(dev, buf, offset++, 0xF2);
12286 + zmw_tx_buf_writeb(dev, buf, offset++, 0x02);
12287 + zmw_tx_buf_writeb(dev, buf, offset++, 0x01);
12288 + zmw_tx_buf_writeb(dev, buf, offset++, 0x01);
12289 +
12290 + /* QoS Info */
12291 + if (wd->ap.uapsdEnabled)
12292 + {
12293 + zmw_tx_buf_writeb(dev, buf, offset++, 0x81);
12294 + }
12295 + else
12296 + {
12297 + zmw_tx_buf_writeb(dev, buf, offset++, 0x01);
12298 + }
12299 +
12300 + /* Reserved */
12301 + zmw_tx_buf_writeb(dev, buf, offset++, 0x00);
12302 +
12303 + /* Best Effort AC parameters */
12304 + zmw_tx_buf_writeb(dev, buf, offset++, 0x03);
12305 + zmw_tx_buf_writeb(dev, buf, offset++, 0xA4);
12306 + zmw_tx_buf_writeb(dev, buf, offset++, 0x00);
12307 + zmw_tx_buf_writeb(dev, buf, offset++, 0x00);
12308 + /* Backfround AC parameters */
12309 + zmw_tx_buf_writeb(dev, buf, offset++, 0x27);
12310 + zmw_tx_buf_writeb(dev, buf, offset++, 0xA4);
12311 + zmw_tx_buf_writeb(dev, buf, offset++, 0x00);
12312 + zmw_tx_buf_writeb(dev, buf, offset++, 0x00);
12313 + /* Video AC parameters */
12314 + zmw_tx_buf_writeb(dev, buf, offset++, 0x42);
12315 + zmw_tx_buf_writeb(dev, buf, offset++, 0x43);
12316 + zmw_tx_buf_writeb(dev, buf, offset++, 0x5E);
12317 + zmw_tx_buf_writeb(dev, buf, offset++, 0x00);
12318 + /* Voice AC parameters */
12319 + zmw_tx_buf_writeb(dev, buf, offset++, 0x62);
12320 + zmw_tx_buf_writeb(dev, buf, offset++, 0x32);
12321 + zmw_tx_buf_writeb(dev, buf, offset++, 0x2F);
12322 + zmw_tx_buf_writeb(dev, buf, offset++, 0x00);
12323 +
12324 + return offset;
12325 +}
12326 +
12327 +
12328 +/************************************************************************/
12329 +/* */
12330 +/* FUNCTION DESCRIPTION zfApSendBeacon */
12331 +/* Sned AP mode beacon. */
12332 +/* */
12333 +/* INPUTS */
12334 +/* dev : device pointer */
12335 +/* */
12336 +/* OUTPUTS */
12337 +/* none */
12338 +/* */
12339 +/* AUTHOR */
12340 +/* Stephen Chen ZyDAS Technology Corporation 2005.11 */
12341 +/* */
12342 +/************************************************************************/
12343 +void zfApSendBeacon(zdev_t* dev)
12344 +{
12345 + zbuf_t* buf;
12346 + u16_t offset;
12347 + u16_t vap;
12348 + u16_t seq;
12349 +
12350 + zmw_get_wlan_dev(dev);
12351 +
12352 + zmw_declare_for_critical_section();
12353 +
12354 + wd->ap.beaconCounter++;
12355 + if (wd->ap.beaconCounter >= wd->ap.vapNumber)
12356 + {
12357 + wd->ap.beaconCounter = 0;
12358 + }
12359 + vap = wd->ap.beaconCounter;
12360 +
12361 +
12362 + zm_msg1_mm(ZM_LV_2, "Send beacon, vap=", vap);
12363 +
12364 + /* TBD : Maximum size of beacon */
12365 + if ((buf = zfwBufAllocate(dev, 1024)) == NULL)
12366 + {
12367 + zm_msg0_mm(ZM_LV_0, "Alloc beacon buf Fail!");
12368 + return;
12369 + }
12370 +
12371 + offset = 0;
12372 +
12373 + /* wlan header */
12374 + /* Frame control */
12375 + zmw_tx_buf_writeh(dev, buf, offset, 0x0080);
12376 + offset+=2;
12377 + /* Duration */
12378 + zmw_tx_buf_writeh(dev, buf, offset, 0x0000);
12379 + offset+=2;
12380 + /* Address 1 */
12381 + zmw_tx_buf_writeh(dev, buf, offset, 0xffff);
12382 + offset+=2;
12383 + zmw_tx_buf_writeh(dev, buf, offset, 0xffff);
12384 + offset+=2;
12385 + zmw_tx_buf_writeh(dev, buf, offset, 0xffff);
12386 + offset+=2;
12387 + /* Address 2 */
12388 + zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[0]);
12389 + offset+=2;
12390 + zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[1]);
12391 + offset+=2;
12392 +#ifdef ZM_VAPMODE_MULTILE_SSID
12393 + zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[2]); //Multiple SSID
12394 +#else
12395 + zmw_tx_buf_writeh(dev, buf, offset, (wd->macAddr[2]+(vap<<8))); //VAP
12396 +#endif
12397 + offset+=2;
12398 + /* Address 3 */
12399 + zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[0]);
12400 + offset+=2;
12401 + zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[1]);
12402 + offset+=2;
12403 +#ifdef ZM_VAPMODE_MULTILE_SSID
12404 + zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[2]); //Multiple SSID
12405 +#else
12406 + zmw_tx_buf_writeh(dev, buf, offset, (wd->macAddr[2]+(vap<<8))); //VAP
12407 +#endif
12408 + offset+=2;
12409 +
12410 + /* Sequence number */
12411 + zmw_enter_critical_section(dev);
12412 + seq = ((wd->mmseq++)<<4);
12413 + zmw_leave_critical_section(dev);
12414 + zmw_tx_buf_writeh(dev, buf, offset, seq);
12415 + offset+=2;
12416 +
12417 + /* 24-31 Time Stamp : hardware will fill this field */
12418 + zmw_tx_buf_writeh(dev, buf, offset, 0);
12419 + zmw_tx_buf_writeh(dev, buf, offset+2, 0);
12420 + zmw_tx_buf_writeh(dev, buf, offset+4, 0);
12421 + zmw_tx_buf_writeh(dev, buf, offset+6, 0);
12422 + offset+=8;
12423 +
12424 + /* Beacon Interval */
12425 + zmw_tx_buf_writeh(dev, buf, offset, wd->beaconInterval);
12426 + offset+=2;
12427 +
12428 + /* Capability */
12429 + zmw_tx_buf_writeh(dev, buf, offset, wd->ap.capab[vap]);
12430 + offset+=2;
12431 +
12432 + /* SSID */
12433 + if (wd->ap.hideSsid[vap] == 0)
12434 + {
12435 + offset = zfApAddIeSsid(dev, buf, offset, vap);
12436 + }
12437 + else
12438 + {
12439 + zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SSID);
12440 + zmw_tx_buf_writeb(dev, buf, offset++, 0);
12441 +
12442 + }
12443 +
12444 + /* Support Rate */
12445 + if ( wd->frequency < 3000 )
12446 + {
12447 + offset = zfMmAddIeSupportRate(dev, buf, offset,
12448 + ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_CCK);
12449 + }
12450 + else
12451 + {
12452 + offset = zfMmAddIeSupportRate(dev, buf, offset,
12453 + ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_OFDM);
12454 + }
12455 +
12456 + /* DS parameter set */
12457 + offset = zfMmAddIeDs(dev, buf, offset);
12458 +
12459 + /* TIM */
12460 + offset = zfApAddIeTim(dev, buf, offset, vap);
12461 +
12462 + /* If WLAN Type is not PURE B */
12463 + if (wd->ap.wlanType[vap] != ZM_WLAN_TYPE_PURE_B)
12464 + {
12465 + if ( wd->frequency < 3000 )
12466 + {
12467 + /* ERP Information */
12468 + offset = zfMmAddIeErp(dev, buf, offset);
12469 +
12470 + /* Extended Supported Rates */
12471 + offset = zfMmAddIeSupportRate(dev, buf, offset,
12472 + ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
12473 + }
12474 + }
12475 +
12476 + /* TODO : country information */
12477 + /* TODO : RSN */
12478 + if (wd->ap.wpaSupport[vap] == 1)
12479 + {
12480 + offset = zfMmAddIeWpa(dev, buf, offset, vap);
12481 + }
12482 +
12483 + /* WME Parameters */
12484 + if (wd->ap.qosMode == 1)
12485 + {
12486 + offset = zfApAddIeWmePara(dev, buf, offset, vap);
12487 + }
12488 +
12489 + /* HT Capabilities Info */
12490 + offset = zfMmAddHTCapability(dev, buf, offset);
12491 +
12492 + /* Extended HT Capabilities Info */
12493 + offset = zfMmAddExtendedHTCapability(dev, buf, offset);
12494 +
12495 + /* 1212 : write to beacon fifo */
12496 + /* 1221 : write to share memory */
12497 + zfHpSendBeacon(dev, buf, offset);
12498 +
12499 + /* Free beacon buffer */
12500 + /* TODO: In order to fit the madwifi beacon architecture, we need to
12501 + free beacon buffer in the HAL layer.
12502 + */
12503 +
12504 + //zfwBufFree(dev, buf, 0);
12505 +}
12506 +
12507 +
12508 +/************************************************************************/
12509 +/* */
12510 +/* FUNCTION DESCRIPTION zfIntrabssForward */
12511 +/* Called to transmit intra-BSS frame from upper layer. */
12512 +/* */
12513 +/* INPUTS */
12514 +/* dev : device pointer */
12515 +/* buf : buffer pointer */
12516 +/* vap : virtual AP */
12517 +/* */
12518 +/* OUTPUTS */
12519 +/* 1 : unicast intras-BSS frame */
12520 +/* 0 : other frames */
12521 +/* */
12522 +/* AUTHOR */
12523 +/* Stephen ZyDAS Technology Corporation 2005.11 */
12524 +/* */
12525 +/************************************************************************/
12526 +u16_t zfIntrabssForward(zdev_t* dev, zbuf_t* buf, u8_t srcVap)
12527 +{
12528 + u16_t err;
12529 + u16_t asocFlag = 0;
12530 + u16_t dst[3];
12531 + u16_t aid;
12532 + u16_t staState;
12533 + zbuf_t* txBuf;
12534 + u16_t len;
12535 + u16_t i;
12536 + u16_t temp;
12537 + u16_t ret;
12538 + u8_t vap = 0;
12539 +#ifdef ZM_ENABLE_NATIVE_WIFI
12540 + dst[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET);
12541 + dst[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+2);
12542 + dst[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+4);
12543 +#else
12544 + dst[0] = zmw_rx_buf_readh(dev, buf, 0);
12545 + dst[1] = zmw_rx_buf_readh(dev, buf, 2);
12546 + dst[2] = zmw_rx_buf_readh(dev, buf, 4);
12547 +#endif // ZM_ENABLE_NATIVE_WIFI
12548 +
12549 + /* Do Intra-BSS forward(data copy) if necessary*/
12550 + if ((dst[0]&0x1) != 0x1)
12551 + {
12552 + aid = zfApGetSTAInfo(dev, dst, &staState, &vap);
12553 + if ((aid != 0xffff) && (staState == ZM_STATE_ASOC) && (srcVap == vap))
12554 + {
12555 + asocFlag = 1;
12556 + zm_msg0_rx(ZM_LV_2, "Intra-BSS forward : asoc STA");
12557 + }
12558 +
12559 + }
12560 + else
12561 + {
12562 + vap = srcVap;
12563 + zm_msg0_rx(ZM_LV_2, "Intra-BSS forward : BCorMC");
12564 + }
12565 +
12566 + /* destination address = associated STA or BC/MC */
12567 + if ((asocFlag == 1) || ((dst[0]&0x1) == 0x1))
12568 + {
12569 + /* Allocate frame */
12570 + if ((txBuf = zfwBufAllocate(dev, ZM_RX_FRAME_SIZE))
12571 + == NULL)
12572 + {
12573 + zm_msg0_rx(ZM_LV_1, "Alloc intra-bss buf Fail!");
12574 + goto zlAllocError;
12575 + }
12576 +
12577 + /* Copy frame */
12578 + len = zfwBufGetSize(dev, buf);
12579 + for (i=0; i<len; i+=2)
12580 + {
12581 + temp = zmw_rx_buf_readh(dev, buf, i);
12582 + zmw_tx_buf_writeh(dev, txBuf, i, temp);
12583 + }
12584 + zfwBufSetSize(dev, txBuf, len);
12585 +
12586 +#ifdef ZM_ENABLE_NATIVE_WIFI
12587 + /* Tx-A2 = Rx-A1, Tx-A3 = Rx-A2, Tx-A1 = Rx-A3 */
12588 + for (i=0; i<6; i+=2)
12589 + {
12590 + temp = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET+i);
12591 + zmw_tx_buf_writeh(dev, txBuf, ZM_WLAN_HEADER_A2_OFFSET+i, temp);
12592 + temp = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+i);
12593 + zmw_tx_buf_writeh(dev, txBuf, ZM_WLAN_HEADER_A3_OFFSET+i, temp);
12594 + temp = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+i);
12595 + zmw_tx_buf_writeh(dev, txBuf, ZM_WLAN_HEADER_A1_OFFSET+i, temp);
12596 + }
12597 +
12598 + #endif
12599 +
12600 + /* Transmit frame */
12601 + /* Return error if port is disabled */
12602 + if ((err = zfTxPortControl(dev, txBuf, vap)) == ZM_PORT_DISABLED)
12603 + {
12604 + err = ZM_ERR_TX_PORT_DISABLED;
12605 + goto zlTxError;
12606 + }
12607 +
12608 +#if 1
12609 + /* AP : Buffer frame for power saving STA */
12610 + if ((ret = zfApBufferPsFrame(dev, txBuf, vap)) == 0)
12611 + {
12612 + /* forward frame if not been buffered */
12613 + #if 1
12614 + /* Put to VTXQ[ac] */
12615 + ret = zfPutVtxq(dev, txBuf);
12616 + /* Push VTXQ[ac] */
12617 + zfPushVtxq(dev);
12618 + #else
12619 + zfTxSendEth(dev, txBuf, vap, ZM_INTERNAL_ALLOC_BUF, 0);
12620 + #endif
12621 +
12622 + }
12623 +#endif
12624 + }
12625 + return asocFlag;
12626 +
12627 +zlTxError:
12628 + zfwBufFree(dev, txBuf, 0);
12629 +zlAllocError:
12630 + return asocFlag;
12631 +}
12632 +
12633 +struct zsMicVar* zfApGetRxMicKey(zdev_t* dev, zbuf_t* buf)
12634 +{
12635 + u8_t sa[6];
12636 + u16_t id = 0, macAddr[3];
12637 +
12638 + zmw_get_wlan_dev(dev);
12639 +
12640 + zfCopyFromRxBuffer(dev, buf, sa, ZM_WLAN_HEADER_A2_OFFSET, 6);
12641 +
12642 + macAddr[0] = sa[0] + (sa[1] << 8);
12643 + macAddr[1] = sa[2] + (sa[3] << 8);
12644 + macAddr[2] = sa[4] + (sa[5] << 8);
12645 +
12646 + if ((id = zfApFindSta(dev, macAddr)) != 0xffff)
12647 + return (&wd->ap.staTable[id].rxMicKey);
12648 +
12649 + return NULL;
12650 +}
12651 +
12652 +struct zsMicVar* zfApGetTxMicKey(zdev_t* dev, zbuf_t* buf, u8_t* qosType)
12653 +{
12654 + u8_t da[6];
12655 + u16_t id = 0, macAddr[3];
12656 +
12657 + zmw_get_wlan_dev(dev);
12658 +
12659 + zfCopyFromIntTxBuffer(dev, buf, da, 0, 6);
12660 +
12661 + macAddr[0] = da[0] + (da[1] << 8);
12662 + macAddr[1] = da[2] + (da[3] << 8);
12663 + macAddr[2] = da[4] + (da[5] << 8);
12664 +
12665 + if ((macAddr[0] & 0x1))
12666 + {
12667 + return (&wd->ap.bcMicKey[0]);
12668 + }
12669 + else if ((id = zfApFindSta(dev, macAddr)) != 0xffff)
12670 + {
12671 + *qosType = wd->ap.staTable[id].qosType;
12672 + return (&wd->ap.staTable[id].txMicKey);
12673 + }
12674 +
12675 + return NULL;
12676 +}
12677 +
12678 +u16_t zfApUpdatePsBit(zdev_t* dev, zbuf_t* buf, u8_t* vap, u8_t* uapsdTrig)
12679 +{
12680 + u16_t staState;
12681 + u16_t aid;
12682 + u16_t psBit;
12683 + u16_t src[3];
12684 + u16_t dst[1];
12685 + u16_t i;
12686 +
12687 + zmw_get_wlan_dev(dev);
12688 +
12689 + src[0] = zmw_rx_buf_readh(dev, buf, 10);
12690 + src[1] = zmw_rx_buf_readh(dev, buf, 12);
12691 + src[2] = zmw_rx_buf_readh(dev, buf, 14);
12692 +
12693 + if ((zmw_rx_buf_readb(dev, buf, 1) & 0x3) != 3)
12694 + {
12695 + /* AP */
12696 + dst[0] = zmw_rx_buf_readh(dev, buf, 4);
12697 +
12698 + psBit = (zmw_rx_buf_readb(dev, buf, 1) & 0x10) >> 4;
12699 + /* Get AID and update STA PS mode */
12700 + aid = zfApGetSTAInfoAndUpdatePs(dev, src, &staState, vap, psBit, uapsdTrig);
12701 +
12702 + /* if STA not associated, send deauth */
12703 + if ((aid == 0xffff) || (staState != ZM_STATE_ASOC))
12704 + {
12705 + if ((dst[0]&0x1)==0)
12706 + {
12707 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, src, 0x7,
12708 + 0, 0);
12709 + }
12710 +
12711 + return ZM_ERR_STA_NOT_ASSOCIATED;
12712 + }
12713 + } /* if ((zmw_rx_buf_readb(dev, buf, 1) & 0x3) != 3) */
12714 + else
12715 + {
12716 + /* WDS */
12717 + for (i=0; i<ZM_MAX_WDS_SUPPORT; i++)
12718 + {
12719 + if ((wd->ap.wds.wdsBitmap & (1<<i)) != 0)
12720 + {
12721 + if ((src[0] == wd->ap.wds.macAddr[i][0])
12722 + && (src[1] == wd->ap.wds.macAddr[i][1])
12723 + && (src[2] == wd->ap.wds.macAddr[i][2]))
12724 + {
12725 + *vap = 0x20 + i;
12726 + break;
12727 + }
12728 + }
12729 + }
12730 + }
12731 + return ZM_SUCCESS;
12732 +}
12733 +
12734 +void zfApProcessPsPoll(zdev_t* dev, zbuf_t* buf)
12735 +{
12736 + u16_t src[3];
12737 + u16_t dst[3];
12738 + zbuf_t* psBuf = NULL;
12739 + u16_t id;
12740 + u8_t moreData = 0;
12741 +
12742 + zmw_get_wlan_dev(dev);
12743 +
12744 + zmw_declare_for_critical_section();
12745 +
12746 + src[0] = zmw_tx_buf_readh(dev, buf, 10);
12747 + src[1] = zmw_tx_buf_readh(dev, buf, 12);
12748 + src[2] = zmw_tx_buf_readh(dev, buf, 14);
12749 +
12750 + /* Find ps buffer for PsPoll */
12751 + zmw_enter_critical_section(dev);
12752 + id = wd->ap.uniHead;
12753 + while (id != wd->ap.uniTail)
12754 + {
12755 + psBuf = wd->ap.uniArray[id];
12756 +
12757 + dst[0] = zmw_tx_buf_readh(dev, psBuf, 0);
12758 + dst[1] = zmw_tx_buf_readh(dev, psBuf, 2);
12759 + dst[2] = zmw_tx_buf_readh(dev, psBuf, 4);
12760 +
12761 + if ((src[0] == dst[0]) && (src[1] == dst[1]) && (src[2] == dst[2]))
12762 + {
12763 + moreData = zfApRemoveFromPsQueue(dev, id, src);
12764 + break;
12765 + }
12766 + else
12767 + {
12768 + psBuf = NULL;
12769 + }
12770 + id = (id + 1) & (ZM_UNI_ARRAY_SIZE - 1);
12771 + }
12772 + zmw_leave_critical_section(dev);
12773 +
12774 + /* Send ps buffer */
12775 + if (psBuf != NULL)
12776 + {
12777 + /* Send with more data bit */
12778 + zfTxSendEth(dev, psBuf, 0, ZM_EXTERNAL_ALLOC_BUF, moreData);
12779 + }
12780 +
12781 + return;
12782 +}
12783 +
12784 +void zfApSetProtectionMode(zdev_t* dev, u16_t mode)
12785 +{
12786 + zmw_get_wlan_dev(dev);
12787 +
12788 + if (mode == 0)
12789 + {
12790 + if (wd->ap.protectionMode != mode)
12791 + {
12792 + /* Write MAC&PHY registers to disable protection */
12793 +
12794 + wd->ap.protectionMode = mode;
12795 + }
12796 +
12797 + }
12798 + else
12799 + {
12800 + if (wd->ap.protectionMode != mode)
12801 + {
12802 + /* Write MAC&PHY registers to enable protection */
12803 +
12804 + wd->ap.protectionMode = mode;
12805 + }
12806 + }
12807 + return;
12808 +}
12809 +
12810 +
12811 +/************************************************************************/
12812 +/* */
12813 +/* FUNCTION DESCRIPTION zfApSendFailure */
12814 +/* Send failure. */
12815 +/* */
12816 +/* INPUTS */
12817 +/* dev : device pointer */
12818 +/* addr : receiver address */
12819 +/* */
12820 +/* OUTPUTS */
12821 +/* None */
12822 +/* */
12823 +/* AUTHOR */
12824 +/* Stephen Chen Atheros Communications, INC. 2007.1 */
12825 +/* */
12826 +/************************************************************************/
12827 +void zfApSendFailure(zdev_t* dev, u8_t* addr)
12828 +{
12829 + u16_t id;
12830 + u16_t staAddr[3];
12831 + zmw_get_wlan_dev(dev);
12832 + zmw_declare_for_critical_section();
12833 +
12834 + staAddr[0] = addr[0] + (((u16_t)addr[1])<<8);
12835 + staAddr[1] = addr[2] + (((u16_t)addr[3])<<8);
12836 + staAddr[2] = addr[4] + (((u16_t)addr[5])<<8);
12837 + zmw_enter_critical_section(dev);
12838 + if ((id = zfApFindSta(dev, staAddr)) != 0xffff)
12839 + {
12840 + /* Send failture : Add 3 minutes to inactive time that will */
12841 + /* will make STA been kicked out soon */
12842 + wd->ap.staTable[id].time -= (3*ZM_TICK_PER_MINUTE);
12843 + }
12844 + zmw_leave_critical_section(dev);
12845 +}
12846 +
12847 +
12848 +void zfApProcessAction(zdev_t* dev, zbuf_t* buf)
12849 +{
12850 + u8_t category;
12851 +
12852 + //zmw_get_wlan_dev(dev);
12853 +
12854 + //zmw_declare_for_critical_section();
12855 +
12856 + category = zmw_rx_buf_readb(dev, buf, 24);
12857 +
12858 + switch (category)
12859 + {
12860 + case ZM_WLAN_BLOCK_ACK_ACTION_FRAME:
12861 + zfAggBlockAckActionFrame(dev, buf);
12862 + break;
12863 + default:
12864 + break;
12865 + }
12866 +
12867 + return;
12868 +}
12869 --- /dev/null
12870 +++ b/drivers/staging/otus/80211core/cmm.c
12871 @@ -0,0 +1,2141 @@
12872 +/*
12873 + * Copyright (c) 2007-2008 Atheros Communications Inc.
12874 + *
12875 + * Permission to use, copy, modify, and/or distribute this software for any
12876 + * purpose with or without fee is hereby granted, provided that the above
12877 + * copyright notice and this permission notice appear in all copies.
12878 + *
12879 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12880 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12881 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12882 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12883 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
12884 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
12885 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
12886 + */
12887 +/* */
12888 +/* Module Name : mm.c */
12889 +/* */
12890 +/* Abstract */
12891 +/* This module contains common functions for handle management */
12892 +/* frame. */
12893 +/* */
12894 +/* NOTES */
12895 +/* None */
12896 +/* */
12897 +/************************************************************************/
12898 +#include "cprecomp.h"
12899 +#include "../hal/hpreg.h"
12900 +
12901 +/* TODO : put all constant tables to a file */
12902 +const u8_t zg11bRateTbl[4] = {2, 4, 11, 22};
12903 +const u8_t zg11gRateTbl[8] = {12, 18, 24, 36, 48, 72, 96, 108};
12904 +
12905 +/* 0xff => element does not exist */
12906 +const u8_t zgElementOffsetTable[] =
12907 +{
12908 + 4, /* 0 : asoc req */
12909 + 6, /* 1 : asoc rsp */
12910 + 10, /* 2 : reasoc req*/
12911 + 6, /* 3 : reasoc rsp */
12912 + 0, /* 4 : probe req */
12913 + 12, /* 5 : probe rsp */
12914 + 0xff, /* 6 : reserved */
12915 + 0xff, /* 7 : reserved */
12916 + 12, /* 8 : beacon */
12917 + 4, /* 9 : ATIM */
12918 + 0xff, /* 10 : disasoc */
12919 + 6, /* 11 : auth */
12920 + 0xff, /* 12 : deauth */
12921 + 4, /* 13 : action */
12922 + 0xff, /* 14 : reserved */
12923 + 0xff, /* 15 : reserved */
12924 +};
12925 +
12926 +/************************************************************************/
12927 +/* */
12928 +/* FUNCTION DESCRIPTION zfFindElement */
12929 +/* Find a specific element in management frame */
12930 +/* */
12931 +/* INPUTS */
12932 +/* dev : device pointer */
12933 +/* buf : management frame buffer */
12934 +/* eid : target element id */
12935 +/* */
12936 +/* OUTPUTS */
12937 +/* byte offset of target element */
12938 +/* or 0xffff if not found */
12939 +/* */
12940 +/* AUTHOR */
12941 +/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
12942 +/* */
12943 +/************************************************************************/
12944 +u16_t zfFindElement(zdev_t* dev, zbuf_t* buf, u8_t eid)
12945 +{
12946 + u8_t subType;
12947 + u16_t offset;
12948 + u16_t bufLen;
12949 + u16_t elen;
12950 + u8_t id, HTEid=0;
12951 + u8_t oui[4] = {0x00, 0x50, 0xf2, 0x01};
12952 + u8_t oui11n[3] = {0x00,0x90,0x4C};
12953 + u8_t HTType = 0;
12954 +
12955 + /* Get offset of first element */
12956 + subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
12957 + if ((offset = zgElementOffsetTable[subType]) == 0xff)
12958 + {
12959 + zm_assert(0);
12960 + }
12961 +
12962 + /* Plus wlan header */
12963 + offset += 24;
12964 +
12965 + // jhlee HT 0
12966 +
12967 + if ((eid == ZM_WLAN_EID_HT_CAPABILITY) ||
12968 + (eid == ZM_WLAN_EID_EXTENDED_HT_CAPABILITY))
12969 + {
12970 + HTEid = eid;
12971 + eid = ZM_WLAN_EID_WPA_IE;
12972 + HTType = 1;
12973 + }
12974 +
12975 +
12976 + bufLen = zfwBufGetSize(dev, buf);
12977 + /* Search loop */
12978 + while ((offset+2)<bufLen) // including element ID and length (2bytes)
12979 + {
12980 + /* Search target element */
12981 + if ((id = zmw_rx_buf_readb(dev, buf, offset)) == eid)
12982 + {
12983 + /* Bingo */
12984 + if ((elen = zmw_rx_buf_readb(dev, buf, offset+1))>(bufLen - offset))
12985 + {
12986 + /* Element length error */
12987 + return 0xffff;
12988 + }
12989 +
12990 + if ( elen == 0 && eid != ZM_WLAN_EID_SSID)
12991 + {
12992 + /* Element length error */
12993 + return 0xffff;
12994 + }
12995 +
12996 + if ( eid == ZM_WLAN_EID_WPA_IE )
12997 + {
12998 + /* avoid sta to be thought use 11n when find a WPA_IE */
12999 + if ( (HTType == 0) && zfRxBufferEqualToStr(dev, buf, oui, offset+2, 4) )
13000 + {
13001 + return offset;
13002 + }
13003 +
13004 + // jhlee HT 0
13005 + // CWYang(+)
13006 +
13007 + if ((HTType == 1) && ( zfRxBufferEqualToStr(dev, buf, oui11n, offset+2, 3) ))
13008 + {
13009 + if ( zmw_rx_buf_readb(dev, buf, offset+5) == HTEid )
13010 + {
13011 + return offset + 5;
13012 + }
13013 + }
13014 +
13015 + }
13016 + else
13017 + {
13018 + return offset;
13019 + }
13020 + }
13021 + /* Advance to next element */
13022 + #if 1
13023 + elen = zmw_rx_buf_readb(dev, buf, offset+1);
13024 + #else
13025 + if ((elen = zmw_rx_buf_readb(dev, buf, offset+1)) == 0)
13026 + {
13027 + return 0xffff;
13028 + }
13029 + #endif
13030 +
13031 + offset += (elen+2);
13032 + }
13033 + return 0xffff;
13034 +}
13035 +
13036 +
13037 +/************************************************************************/
13038 +/* */
13039 +/* FUNCTION DESCRIPTION zfFindWifiElement */
13040 +/* Find a specific Wifi element in management frame */
13041 +/* */
13042 +/* INPUTS */
13043 +/* dev : device pointer */
13044 +/* buf : management frame buffer */
13045 +/* type : OUI type */
13046 +/* subType : OUI subtype */
13047 +/* */
13048 +/* OUTPUTS */
13049 +/* byte offset of target element */
13050 +/* or 0xffff if not found */
13051 +/* */
13052 +/* AUTHOR */
13053 +/* Stephen Chen ZyDAS Technology Corporation 2006.1 */
13054 +/* */
13055 +/************************************************************************/
13056 +u16_t zfFindWifiElement(zdev_t* dev, zbuf_t* buf, u8_t type, u8_t subtype)
13057 +{
13058 + u8_t subType;
13059 + u16_t offset;
13060 + u16_t bufLen;
13061 + u16_t elen;
13062 + u8_t id;
13063 + u8_t tmp;
13064 +
13065 + /* Get offset of first element */
13066 + subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
13067 +
13068 + if ((offset = zgElementOffsetTable[subType]) == 0xff)
13069 + {
13070 + zm_assert(0);
13071 + }
13072 +
13073 + /* Plus wlan header */
13074 + offset += 24;
13075 +
13076 + bufLen = zfwBufGetSize(dev, buf);
13077 + /* Search loop */
13078 + while ((offset+2)<bufLen) // including element ID and length (2bytes)
13079 + {
13080 + /* Search target element */
13081 + if ((id = zmw_rx_buf_readb(dev, buf, offset)) == ZM_WLAN_EID_WIFI_IE)
13082 + {
13083 + /* Bingo */
13084 + if ((elen = zmw_rx_buf_readb(dev, buf, offset+1))>(bufLen - offset))
13085 + {
13086 + /* Element length error */
13087 + return 0xffff;
13088 + }
13089 +
13090 + if ( elen == 0 )
13091 + {
13092 + return 0xffff;
13093 + }
13094 +
13095 + if (((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x00)
13096 + && ((tmp = zmw_rx_buf_readb(dev, buf, offset+3)) == 0x50)
13097 + && ((tmp = zmw_rx_buf_readb(dev, buf, offset+4)) == 0xF2)
13098 + && ((tmp = zmw_rx_buf_readb(dev, buf, offset+5)) == type))
13099 +
13100 + {
13101 + if ( subtype != 0xff )
13102 + {
13103 + if ( (tmp = zmw_rx_buf_readb(dev, buf, offset+6)) == subtype )
13104 + {
13105 + return offset;
13106 + }
13107 + }
13108 + else
13109 + {
13110 + return offset;
13111 + }
13112 + }
13113 + }
13114 + /* Advance to next element */
13115 + if ((elen = zmw_rx_buf_readb(dev, buf, offset+1)) == 0)
13116 + {
13117 + return 0xffff;
13118 + }
13119 + offset += (elen+2);
13120 + }
13121 + return 0xffff;
13122 +}
13123 +
13124 +u16_t zfRemoveElement(zdev_t* dev, u8_t* buf, u16_t size, u8_t eid)
13125 +{
13126 + u16_t offset = 0;
13127 + u16_t elen;
13128 + u8_t HTEid = 0;
13129 + u8_t oui[4] = {0x00, 0x50, 0xf2, 0x01};
13130 + u8_t oui11n[3] = {0x00,0x90,0x4C};
13131 + u8_t HTType = 0;
13132 +
13133 + if ((eid == ZM_WLAN_EID_HT_CAPABILITY) ||
13134 + (eid == ZM_WLAN_EID_EXTENDED_HT_CAPABILITY))
13135 + {
13136 + HTEid = eid;
13137 + eid = ZM_WLAN_EID_WPA_IE;
13138 + HTType = 1;
13139 + }
13140 +
13141 + while (offset < size)
13142 + {
13143 + elen = *(buf+offset+1);
13144 +
13145 + if (*(buf+offset) == eid)
13146 + {
13147 + if ( eid == ZM_WLAN_EID_WPA_IE )
13148 + {
13149 + if ( (HTType == 0)
13150 + && (*(buf+offset+2) == oui[0])
13151 + && (*(buf+offset+3) == oui[1])
13152 + && (*(buf+offset+4) == oui[2])
13153 + && (*(buf+offset+5) == oui[3]) )
13154 + {
13155 + zfMemoryMove(buf+offset, buf+offset+elen+2, size-offset-elen-2);
13156 + return (size-elen-2);
13157 + }
13158 +
13159 + if ( (HTType == 1)
13160 + && (*(buf+offset+2) == oui11n[0])
13161 + && (*(buf+offset+3) == oui11n[1])
13162 + && (*(buf+offset+4) == oui11n[2])
13163 + && (*(buf+offset+5) == HTEid) )
13164 + {
13165 + zfMemoryMove(buf+offset, buf+offset+elen+2, size-offset-elen-2);
13166 + return (size-elen-2);
13167 + }
13168 + }
13169 + else
13170 + {
13171 + zfMemoryMove(buf+offset, buf+offset+elen+2, size-offset-elen-2);
13172 + return (size-elen-2);
13173 + }
13174 + }
13175 +
13176 + offset += (elen+2);
13177 + }
13178 +
13179 + return size;
13180 +}
13181 +
13182 +u16_t zfUpdateElement(zdev_t* dev, u8_t* buf, u16_t size, u8_t* updateeid)
13183 +{
13184 + u16_t offset = 0;
13185 + u16_t elen;
13186 +
13187 + while (offset < size) {
13188 + elen = *(buf+offset+1);
13189 +
13190 + if (*(buf+offset) == updateeid[0]) {
13191 + if (updateeid[1] <= elen) {
13192 + zfMemoryMove(buf+offset, updateeid, updateeid[1]+2);
13193 + zfMemoryMove(buf+offset+updateeid[1]+2, buf+offset+elen+2, size-offset-elen-2);
13194 +
13195 + return size-(elen-updateeid[1]);
13196 + } else {
13197 + zfMemoryMove(buf+offset+updateeid[1]+2, buf+offset+elen+2, size-offset-elen-2);
13198 + zfMemoryMove(buf+offset, updateeid, updateeid[1]+2);
13199 +
13200 + return size+(updateeid[1]-elen);
13201 + }
13202 + }
13203 +
13204 + offset += (elen+2);
13205 + }
13206 +
13207 + return size;
13208 +}
13209 +
13210 +u16_t zfFindSuperGElement(zdev_t* dev, zbuf_t* buf, u8_t type)
13211 +{
13212 + u8_t subType;
13213 + u16_t offset;
13214 + u16_t bufLen;
13215 + u16_t elen;
13216 + u8_t id;
13217 + u8_t super_feature;
13218 + u8_t ouiSuperG[6] = {0x00,0x03,0x7f,0x01, 0x01, 0x00};
13219 +
13220 + zmw_get_wlan_dev(dev);
13221 +
13222 + /* Get offset of first element */
13223 + subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
13224 + if ((offset = zgElementOffsetTable[subType]) == 0xff)
13225 + {
13226 + zm_assert(0);
13227 + }
13228 +
13229 + /* Plus wlan header */
13230 + offset += 24;
13231 +
13232 + bufLen = zfwBufGetSize(dev, buf);
13233 + /* Search loop */
13234 + while ((offset+2)<bufLen) // including element ID and length (2bytes)
13235 + {
13236 + /* Search target element */
13237 + if ((id = zmw_rx_buf_readb(dev, buf, offset)) == ZM_WLAN_EID_VENDOR_PRIVATE)
13238 + {
13239 + /* Bingo */
13240 + if ((elen = zmw_rx_buf_readb(dev, buf, offset+1))>(bufLen - offset))
13241 + {
13242 + /* Element length error */
13243 + return 0xffff;
13244 + }
13245 +
13246 + if ( elen == 0 )
13247 + {
13248 + return 0xffff;
13249 + }
13250 +
13251 + if (zfRxBufferEqualToStr(dev, buf, ouiSuperG, offset+2, 6) && ( zmw_rx_buf_readb(dev, buf, offset+1) >= 6))
13252 + {
13253 + /* super_feature 0:useFastFrame, 1:useCompression, 2:useTurboPrime */
13254 + super_feature= zmw_rx_buf_readb(dev, buf, offset+8);
13255 + if ((super_feature & 0x01) || (super_feature & 0x02) || (super_feature & 0x04))
13256 + {
13257 + return offset;
13258 + }
13259 + }
13260 + }
13261 + /* Advance to next element */
13262 + #if 1
13263 + elen = zmw_rx_buf_readb(dev, buf, offset+1);
13264 + #else
13265 + if ((elen = zmw_rx_buf_readb(dev, buf, offset+1)) == 0)
13266 + {
13267 + return 0xffff;
13268 + }
13269 + #endif
13270 +
13271 + offset += (elen+2);
13272 + }
13273 + return 0xffff;
13274 +}
13275 +
13276 +u16_t zfFindXRElement(zdev_t* dev, zbuf_t* buf, u8_t type)
13277 +{
13278 + u8_t subType;
13279 + u16_t offset;
13280 + u16_t bufLen;
13281 + u16_t elen;
13282 + u8_t id;
13283 + u8_t ouixr[6] = {0x00,0x03,0x7f,0x03, 0x01, 0x00};
13284 +
13285 + zmw_get_wlan_dev(dev);
13286 +
13287 + /* Get offset of first element */
13288 + subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
13289 + if ((offset = zgElementOffsetTable[subType]) == 0xff)
13290 + {
13291 + zm_assert(0);
13292 + }
13293 +
13294 + /* Plus wlan header */
13295 + offset += 24;
13296 +
13297 + bufLen = zfwBufGetSize(dev, buf);
13298 + /* Search loop */
13299 + while ((offset+2)<bufLen) // including element ID and length (2bytes)
13300 + {
13301 + /* Search target element */
13302 + if ((id = zmw_rx_buf_readb(dev, buf, offset)) == ZM_WLAN_EID_VENDOR_PRIVATE)
13303 + {
13304 + /* Bingo */
13305 + if ((elen = zmw_rx_buf_readb(dev, buf, offset+1))>(bufLen - offset))
13306 + {
13307 + /* Element length error */
13308 + return 0xffff;
13309 + }
13310 +
13311 + if ( elen == 0 )
13312 + {
13313 + return 0xffff;
13314 + }
13315 +
13316 + if (zfRxBufferEqualToStr(dev, buf, ouixr, offset+2, 6) && ( zmw_rx_buf_readb(dev, buf, offset+1) >= 6))
13317 + {
13318 + return offset;
13319 + }
13320 + }
13321 + /* Advance to next element */
13322 + #if 1
13323 + elen = zmw_rx_buf_readb(dev, buf, offset+1);
13324 + #else
13325 + if ((elen = zmw_rx_buf_readb(dev, buf, offset+1)) == 0)
13326 + {
13327 + return 0xffff;
13328 + }
13329 + #endif
13330 +
13331 + offset += (elen+2);
13332 + }
13333 + return 0xffff;
13334 +}
13335 +
13336 +/************************************************************************/
13337 +/* */
13338 +/* FUNCTION DESCRIPTION zfMmAddIeSupportRate */
13339 +/* Add information element Support Rate to buffer. */
13340 +/* */
13341 +/* INPUTS */
13342 +/* dev : device pointer */
13343 +/* buf : buffer to add information element */
13344 +/* offset : add information element from this offset */
13345 +/* eid : element ID */
13346 +/* rateSet : CCK or OFDM */
13347 +/* */
13348 +/* OUTPUTS */
13349 +/* buffer offset after adding information element */
13350 +/* */
13351 +/* AUTHOR */
13352 +/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
13353 +/* */
13354 +/************************************************************************/
13355 +u16_t zfMmAddIeSupportRate(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t eid, u8_t rateSet)
13356 +{
13357 + u8_t len = 0;
13358 + u16_t i;
13359 +
13360 + zmw_get_wlan_dev(dev);
13361 +
13362 + //if ( (rateSet == ZM_RATE_SET_OFDM)&&((wd->gRate & 0xff) == 0) )
13363 + //{
13364 + // return offset;
13365 + //}
13366 +
13367 + /* Information : Support Rate */
13368 + if ( rateSet == ZM_RATE_SET_CCK )
13369 + {
13370 + for (i=0; i<4; i++)
13371 + {
13372 + if ((wd->bRate & (0x1<<i)) == (0x1<<i))
13373 + //if ((0xf & (0x1<<i)) == (0x1<<i))
13374 + {
13375 + zmw_tx_buf_writeb(dev, buf, offset+len+2,
13376 + zg11bRateTbl[i]+((wd->bRateBasic & (0x1<<i))<<(7-i)));
13377 + len++;
13378 + }
13379 + }
13380 + }
13381 + else if ( rateSet == ZM_RATE_SET_OFDM )
13382 + {
13383 + for (i=0; i<8; i++)
13384 + {
13385 + if ((wd->gRate & (0x1<<i)) == (0x1<<i))
13386 + //if ((0xff & (0x1<<i)) == (0x1<<i))
13387 + {
13388 + zmw_tx_buf_writeb(dev, buf, offset+len+2,
13389 + zg11gRateTbl[i]+((wd->gRateBasic & (0x1<<i))<<(7-i)));
13390 + len++;
13391 + }
13392 + }
13393 + }
13394 +
13395 + if (len > 0)
13396 + {
13397 + /* Element ID */
13398 + zmw_tx_buf_writeb(dev, buf, offset, eid);
13399 +
13400 + /* Element Length */
13401 + zmw_tx_buf_writeb(dev, buf, offset+1, len);
13402 +
13403 + /* Return value */
13404 + offset += (2+len);
13405 + }
13406 +
13407 + return offset;
13408 +}
13409 +
13410 +/************************************************************************/
13411 +/* */
13412 +/* FUNCTION DESCRIPTION zfMmAddIeDs */
13413 +/* Add information element DS to buffer. */
13414 +/* */
13415 +/* INPUTS */
13416 +/* dev : device pointer */
13417 +/* buf : buffer to add information element */
13418 +/* offset : add information element from this offset */
13419 +/* */
13420 +/* OUTPUTS */
13421 +/* buffer offset after adding information element */
13422 +/* */
13423 +/* AUTHOR */
13424 +/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
13425 +/* */
13426 +/************************************************************************/
13427 +u16_t zfMmAddIeDs(zdev_t* dev, zbuf_t* buf, u16_t offset)
13428 +{
13429 + zmw_get_wlan_dev(dev);
13430 +
13431 + /* Element ID */
13432 + zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_DS);
13433 +
13434 + /* Element Length */
13435 + zmw_tx_buf_writeb(dev, buf, offset++, 1);
13436 +
13437 + /* Information : DS */
13438 + zmw_tx_buf_writeb(dev, buf, offset++,
13439 + zfChFreqToNum(wd->frequency, NULL));
13440 +
13441 + return offset;
13442 +}
13443 +
13444 +
13445 +/************************************************************************/
13446 +/* */
13447 +/* FUNCTION DESCRIPTION zfMmAddIeErp */
13448 +/* Add information element ERP to buffer. */
13449 +/* */
13450 +/* INPUTS */
13451 +/* dev : device pointer */
13452 +/* buf : buffer to add information element */
13453 +/* offset : add information element from this offset */
13454 +/* */
13455 +/* OUTPUTS */
13456 +/* buffer offset after adding information element */
13457 +/* */
13458 +/* AUTHOR */
13459 +/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
13460 +/* */
13461 +/************************************************************************/
13462 +u16_t zfMmAddIeErp(zdev_t* dev, zbuf_t* buf, u16_t offset)
13463 +{
13464 + zmw_get_wlan_dev(dev);
13465 +
13466 + /* Element ID */
13467 + zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_ERP);
13468 +
13469 + /* Element Length */
13470 + zmw_tx_buf_writeb(dev, buf, offset++, 1);
13471 +
13472 + /* Information : ERP */
13473 + zmw_tx_buf_writeb(dev, buf, offset++, wd->erpElement);
13474 +
13475 + return offset;
13476 +}
13477 +
13478 +
13479 +/************************************************************************/
13480 +/* */
13481 +/* FUNCTION DESCRIPTION zfMmAddIeWpa */
13482 +/* Add information element WPA to buffer. */
13483 +/* */
13484 +/* INPUTS */
13485 +/* dev : device pointer */
13486 +/* buf : buffer to add information element */
13487 +/* offset : add information element from this offset */
13488 +/* */
13489 +/* OUTPUTS */
13490 +/* buffer offset after adding information element */
13491 +/* */
13492 +/* AUTHOR */
13493 +/* Yuan-Gu Wei ZyDAS Technology Corporation 2006.2 */
13494 +/* */
13495 +/************************************************************************/
13496 +u16_t zfMmAddIeWpa(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t apId)
13497 +{
13498 + //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev);
13499 + int i;
13500 +
13501 + zmw_get_wlan_dev(dev);
13502 +
13503 + /* Element ID */
13504 + //zmw_inttx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_WPA_IE);
13505 +
13506 + /* Element Length */
13507 + //zmw_inttx_buf_writeb(dev, buf, offset++, wd->ap.wpaLen);
13508 + for(i = 0; i < wd->ap.wpaLen[apId]; i++)
13509 + {
13510 + /* Information : WPA */
13511 + zmw_tx_buf_writeb(dev, buf, offset++, wd->ap.wpaIe[apId][i]);
13512 + }
13513 +
13514 + return offset;
13515 +}
13516 +
13517 +/************************************************************************/
13518 +/* */
13519 +/* FUNCTION DESCRIPTION zfMmAddHTCapability */
13520 +/* Add HT Capability Infomation to buffer. */
13521 +/* */
13522 +/* INPUTS */
13523 +/* dev : device pointer */
13524 +/* buf : buffer to add information element */
13525 +/* offset : add information element from this offset */
13526 +/* */
13527 +/* OUTPUTS */
13528 +/* buffer offset after adding information element */
13529 +/* */
13530 +/* AUTHOR */
13531 +/* Chao-Wen Yang ZyDAS Technology Corporation 2006.06 */
13532 +/* */
13533 +/************************************************************************/
13534 +u16_t zfMmAddHTCapability(zdev_t* dev, zbuf_t* buf, u16_t offset)
13535 +{
13536 + u8_t OUI[3] = {0x0,0x90,0x4C};
13537 + u16_t i;
13538 +
13539 + zmw_get_wlan_dev(dev);
13540 +
13541 + /* Prob ID */
13542 + zmw_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_WPA_IE);
13543 +
13544 + if ( wd->wlanMode == ZM_MODE_AP )
13545 + {
13546 + /* Element Length */
13547 + zmw_buf_writeb(dev, buf, offset++, wd->ap.HTCap.Data.Length + 4);
13548 +
13549 + /* OUI Data */
13550 + for (i = 0; i < 3; i++)
13551 + {
13552 + zmw_buf_writeb(dev, buf, offset++, OUI[i]);
13553 + }
13554 +
13555 + /* Element Type ID */
13556 + zmw_buf_writeb(dev, buf, offset++, wd->ap.HTCap.Data.ElementID);
13557 +
13558 + /* HT Capability Data */
13559 + for (i = 0; i < 26; i++)
13560 + {
13561 + zmw_buf_writeb(dev, buf, offset++, wd->ap.HTCap.Byte[i+2]);
13562 + }
13563 + }
13564 + else
13565 + {
13566 + /* Element Length */
13567 + zmw_buf_writeb(dev, buf, offset++, wd->sta.HTCap.Data.Length + 4);
13568 +
13569 + /* OUI Data */
13570 + for (i = 0; i < 3; i++)
13571 + {
13572 + zmw_buf_writeb(dev, buf, offset++, OUI[i]);
13573 + }
13574 +
13575 + /* Element Type ID */
13576 + zmw_buf_writeb(dev, buf, offset++, wd->sta.HTCap.Data.ElementID);
13577 +
13578 + /* HT Capability Data */
13579 + for (i = 0; i < 26; i++)
13580 + {
13581 + zmw_buf_writeb(dev, buf, offset++, wd->sta.HTCap.Byte[i+2]);
13582 + }
13583 + }
13584 +
13585 + return offset;
13586 +}
13587 +
13588 +
13589 +u16_t zfMmAddPreNHTCapability(zdev_t* dev, zbuf_t* buf, u16_t offset)
13590 +{
13591 + //u8_t OUI[3] = {0x0,0x90,0x4C};
13592 + u16_t i;
13593 +
13594 + zmw_get_wlan_dev(dev);
13595 +
13596 + /* Prob ID */
13597 + zmw_buf_writeb(dev, buf, offset++, ZM_WLAN_PREN2_EID_HTCAPABILITY);
13598 +
13599 + if ( wd->wlanMode == ZM_MODE_AP )
13600 + {
13601 + /* Element Length */
13602 + zmw_buf_writeb(dev, buf, offset++, wd->ap.HTCap.Data.Length);
13603 +
13604 + /* HT Capability Data */
13605 + for (i = 0; i < 26; i++)
13606 + {
13607 + zmw_buf_writeb(dev, buf, offset++, wd->ap.HTCap.Byte[i+2]);
13608 + }
13609 + }
13610 + else
13611 + {
13612 + /* Element Length */
13613 + zmw_buf_writeb(dev, buf, offset++, wd->sta.HTCap.Data.Length);
13614 +
13615 + /* HT Capability Data */
13616 + for (i = 0; i < 26; i++)
13617 + {
13618 + zmw_buf_writeb(dev, buf, offset++, wd->sta.HTCap.Byte[i+2]);
13619 + }
13620 + }
13621 +
13622 + return offset;
13623 +}
13624 +
13625 +/************************************************************************/
13626 +/* */
13627 +/* FUNCTION DESCRIPTION zfMmAddExtendedHTCapability */
13628 +/* Add Extended HT Capability Infomation to buffer. */
13629 +/* */
13630 +/* INPUTS */
13631 +/* dev : device pointer */
13632 +/* buf : buffer to add information element */
13633 +/* offset : add information element from this offset */
13634 +/* */
13635 +/* OUTPUTS */
13636 +/* buffer offset after adding information element */
13637 +/* */
13638 +/* AUTHOR */
13639 +/* Chao-Wen Yang ZyDAS Technology Corporation 2006.06 */
13640 +/* */
13641 +/************************************************************************/
13642 +u16_t zfMmAddExtendedHTCapability(zdev_t* dev, zbuf_t* buf, u16_t offset)
13643 +{
13644 + u8_t OUI[3] = {0x0,0x90,0x4C};
13645 + u16_t i;
13646 +
13647 + zmw_get_wlan_dev(dev);
13648 +
13649 + /* Prob ID */
13650 + zmw_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_WPA_IE);
13651 +
13652 + if ( wd->wlanMode == ZM_MODE_AP )
13653 + {
13654 + /* Element Length */
13655 + zmw_buf_writeb(dev, buf, offset++, wd->ap.ExtHTCap.Data.Length + 4);
13656 +
13657 + /* OUI Data */
13658 + for (i = 0; i < 3; i++)
13659 + {
13660 + zmw_buf_writeb(dev, buf, offset++, OUI[i]);
13661 + }
13662 +
13663 + /* Element Type ID */
13664 + zmw_buf_writeb(dev, buf, offset++, wd->ap.ExtHTCap.Data.ElementID);
13665 +
13666 + /* HT Capability Data */
13667 + for (i = 0; i < 22; i++)
13668 + {
13669 + zmw_buf_writeb(dev, buf, offset++, wd->ap.ExtHTCap.Byte[i+2]);
13670 + }
13671 + }
13672 + else
13673 + {
13674 + /* Element Length */
13675 + zmw_buf_writeb(dev, buf, offset++, wd->sta.ExtHTCap.Data.Length + 4);
13676 +
13677 + /* OUI Data */
13678 + for (i = 0; i < 3; i++)
13679 + {
13680 + zmw_buf_writeb(dev, buf, offset++, OUI[i]);
13681 + }
13682 +
13683 + /* Element Type ID */
13684 + zmw_buf_writeb(dev, buf, offset++, wd->sta.ExtHTCap.Data.ElementID);
13685 +
13686 + /* HT Capability Data */
13687 + for (i = 0; i < 22; i++)
13688 + {
13689 + zmw_buf_writeb(dev, buf, offset++, wd->sta.ExtHTCap.Byte[i+2]);
13690 + }
13691 + }
13692 +
13693 + return offset;
13694 +}
13695 +
13696 +
13697 +
13698 +/************************************************************************/
13699 +/* */
13700 +/* FUNCTION DESCRIPTION zfSendMmFrame */
13701 +/* Send management frame. */
13702 +/* */
13703 +/* INPUTS */
13704 +/* dev : device pointer */
13705 +/* frameType : management frame type */
13706 +/* dst : destination MAC address */
13707 +/* p1 : parameter 1 */
13708 +/* p2 : parameter 2 */
13709 +/* p3 : parameter 3 */
13710 +/* */
13711 +/* OUTPUTS */
13712 +/* none */
13713 +/* */
13714 +/* AUTHOR */
13715 +/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
13716 +/* */
13717 +/************************************************************************/
13718 +/* probe req : p1=> bWithSSID, p2=>R, p3=>R */
13719 +/* probe rsp : p1=>R, p2=>R, p3=>VAP ID(AP) */
13720 +/* deauth : p1=>Reason Code, p2=>R, p3=>VAP ID(AP) */
13721 +/* Disasoc : p1=>Reason Code, p2=>R, p3=>VAP ID(AP) */
13722 +/* ATIM : p1=>R, p2=>R, p3=>R */
13723 +/* (re)asoc rsp : p1=>Status Code, p2=>AID, p3=>VAP ID(AP) */
13724 +/* asoc req : p1=>R, p2=>R, p3=>R */
13725 +/* reasoc req : p1=>AP MAC[0], p2=>AP MAC[1], p3=>AP MAC[2] */
13726 +/* auth : p1=>low=Algorithm, high=Transaction, p2=>Status, p3=>VAP ID */
13727 +void zfSendMmFrame(zdev_t* dev, u8_t frameType, u16_t* dst,
13728 + u32_t p1, u32_t p2, u32_t p3)
13729 +{
13730 + zbuf_t* buf;
13731 + //u16_t addrTblSize;
13732 + //struct zsAddrTbl addrTbl;
13733 + u16_t offset = 0;
13734 + u16_t hlen = 32;
13735 + u16_t header[(24+25+1)/2];
13736 + u16_t vap = 0;
13737 + u16_t i;
13738 + u8_t encrypt = 0;
13739 + u16_t aid;
13740 +
13741 + zmw_get_wlan_dev(dev);
13742 + zmw_declare_for_critical_section();
13743 +
13744 + zm_msg2_mm(ZM_LV_2, "Send mm frame, type=", frameType);
13745 + /* TBD : Maximum size of managment frame */
13746 + if ((buf = zfwBufAllocate(dev, 1024)) == NULL)
13747 + {
13748 + zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!");
13749 + return;
13750 + }
13751 +
13752 + //Reserve room for wlan header
13753 + offset = hlen;
13754 +
13755 + switch (frameType)
13756 + {
13757 + case ZM_WLAN_FRAME_TYPE_PROBEREQ :
13758 + offset = zfSendProbeReq(dev, buf, offset, (u8_t) p1);
13759 + break;
13760 +
13761 + case ZM_WLAN_FRAME_TYPE_PROBERSP :
13762 + zm_msg0_mm(ZM_LV_3, "probe rsp");
13763 + /* 24-31 Time Stamp : hardware WON'T fill this field */
13764 + zmw_tx_buf_writeh(dev, buf, offset, 0);
13765 + zmw_tx_buf_writeh(dev, buf, offset+2, 0);
13766 + zmw_tx_buf_writeh(dev, buf, offset+4, 0);
13767 + zmw_tx_buf_writeh(dev, buf, offset+6, 0);
13768 + offset+=8;
13769 +
13770 + /* Beacon Interval */
13771 + zmw_tx_buf_writeh(dev, buf, offset, wd->beaconInterval);
13772 + offset+=2;
13773 +
13774 + if (wd->wlanMode == ZM_MODE_AP)
13775 + {
13776 + vap = (u16_t) p3;
13777 + /* Capability */
13778 + zmw_tx_buf_writeh(dev, buf, offset, wd->ap.capab[vap]);
13779 + offset+=2;
13780 + /* SSID */
13781 + offset = zfApAddIeSsid(dev, buf, offset, vap);
13782 + }
13783 + else
13784 + {
13785 + /* Capability */
13786 + zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[0]);
13787 + zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[1]);
13788 + /* SSID */
13789 + offset = zfStaAddIeSsid(dev, buf, offset);
13790 + }
13791 +
13792 + /* Support Rate */
13793 + if ( wd->frequency < 3000 )
13794 + {
13795 + offset = zfMmAddIeSupportRate(dev, buf, offset,
13796 + ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_CCK);
13797 + }
13798 + else
13799 + {
13800 + offset = zfMmAddIeSupportRate(dev, buf, offset,
13801 + ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_OFDM);
13802 + }
13803 +
13804 + /* DS parameter set */
13805 + offset = zfMmAddIeDs(dev, buf, offset);
13806 +
13807 + /* TODO ¡G IBSS */
13808 + if ( wd->wlanMode == ZM_MODE_IBSS )
13809 + {
13810 + offset = zfStaAddIeIbss(dev, buf, offset);
13811 +
13812 + if (wd->frequency < 3000)
13813 + {
13814 + if( wd->wfc.bIbssGMode
13815 + && (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) ) // Only accompany with enabling a mode .
13816 + {
13817 + /* ERP Information */
13818 + wd->erpElement = 0;
13819 + offset = zfMmAddIeErp(dev, buf, offset);
13820 +
13821 + /* Enable G Mode */
13822 + /* Extended Supported Rates */
13823 + offset = zfMmAddIeSupportRate(dev, buf, offset,
13824 + ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
13825 + }
13826 + }
13827 + }
13828 +
13829 +
13830 + if ((wd->wlanMode == ZM_MODE_AP)
13831 + && (wd->ap.wlanType[vap] != ZM_WLAN_TYPE_PURE_B))
13832 + {
13833 + /* ERP Information */
13834 + offset = zfMmAddIeErp(dev, buf, offset);
13835 +
13836 + /* Extended Supported Rates */
13837 + if ( wd->frequency < 3000 )
13838 + {
13839 + offset = zfMmAddIeSupportRate(dev, buf, offset,
13840 + ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
13841 + }
13842 + }
13843 +
13844 + /* ERP Information */
13845 + //offset = zfMmAddIeErp(dev, buf, offset);
13846 +
13847 + /* Extended Supported Rates */
13848 + //offset = zfMmAddIeSupportRate(dev, buf, offset,
13849 + // ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
13850 +
13851 + /* TODO : RSN */
13852 + if (wd->wlanMode == ZM_MODE_AP && wd->ap.wpaSupport[vap] == 1)
13853 + {
13854 + offset = zfMmAddIeWpa(dev, buf, offset, vap);
13855 + }
13856 + else if ( wd->wlanMode == ZM_MODE_IBSS && wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK)
13857 + {
13858 + offset = zfwStaAddIeWpaRsn(dev, buf, offset, ZM_WLAN_FRAME_TYPE_AUTH);
13859 + }
13860 +
13861 + /* WME Parameters */
13862 + if (wd->wlanMode == ZM_MODE_AP)
13863 + {
13864 + if (wd->ap.qosMode == 1)
13865 + {
13866 + offset = zfApAddIeWmePara(dev, buf, offset, vap);
13867 + }
13868 + }
13869 +
13870 + if ( wd->wlanMode != ZM_MODE_IBSS )
13871 + {
13872 + // jhlee HT 0
13873 + //CWYang(+)
13874 + /* TODO : Need to check if it is ok */
13875 + /* HT Capabilities Info */
13876 + offset = zfMmAddHTCapability(dev, buf, offset);
13877 + //CWYang(+)
13878 + /* Extended HT Capabilities Info */
13879 + offset = zfMmAddExtendedHTCapability(dev, buf, offset);
13880 + }
13881 +
13882 + if ( wd->sta.ibssAdditionalIESize )
13883 + offset = zfStaAddIbssAdditionalIE(dev, buf, offset);
13884 + break;
13885 +
13886 + case ZM_WLAN_FRAME_TYPE_AUTH :
13887 + if (p1 == 0x30001)
13888 + {
13889 + hlen += 4;
13890 + offset += 4; // for reserving wep header
13891 + encrypt = 1;
13892 + }
13893 +
13894 + /* Algotrithm Number */
13895 + zmw_tx_buf_writeh(dev, buf, offset, (u16_t)(p1&0xffff));
13896 + offset+=2;
13897 +
13898 + /* Transaction Number */
13899 + zmw_tx_buf_writeh(dev, buf, offset, (u16_t)(p1>>16));
13900 + offset+=2;
13901 +
13902 + /* Status Code */
13903 + zmw_tx_buf_writeh(dev, buf, offset, (u16_t)p2);
13904 + offset+=2;
13905 +
13906 + if (wd->wlanMode == ZM_MODE_AP)
13907 + {
13908 + vap = (u16_t) p3;
13909 + }
13910 +
13911 + /* Challenge Text => share-2 or share-3 */
13912 + if (p1 == 0x20001)
13913 + {
13914 + if (p2 == 0) //Status == success
13915 + {
13916 + zmw_buf_writeh(dev, buf, offset, 0x8010);
13917 + offset+=2;
13918 + /* share-2 : AP generate challenge text */
13919 + for (i=0; i<128; i++)
13920 + {
13921 + wd->ap.challengeText[i] = (u8_t)zfGetRandomNumber(dev, 0);
13922 + }
13923 + zfCopyToIntTxBuffer(dev, buf, wd->ap.challengeText, offset, 128);
13924 + offset += 128;
13925 + }
13926 + }
13927 + else if (p1 == 0x30001)
13928 + {
13929 + /* share-3 : STA return challenge Text */
13930 + zfCopyToIntTxBuffer(dev, buf, wd->sta.challengeText, offset, wd->sta.challengeText[1]+2);
13931 + offset += (wd->sta.challengeText[1]+2);
13932 + }
13933 +
13934 + break;
13935 +
13936 + case ZM_WLAN_FRAME_TYPE_ASOCREQ :
13937 + case ZM_WLAN_FRAME_TYPE_REASOCREQ :
13938 + /* Capability */
13939 + zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[0]);
13940 + zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[1]);
13941 +
13942 + /* Listen Interval */
13943 + zmw_tx_buf_writeh(dev, buf, offset, 0x0005);
13944 + offset+=2;
13945 +
13946 + /* Reassocaited Request : Current AP address */
13947 + if (frameType == ZM_WLAN_FRAME_TYPE_REASOCREQ)
13948 + {
13949 + zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[0]);
13950 + offset+=2;
13951 + zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[1]);
13952 + offset+=2;
13953 + zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[2]);
13954 + offset+=2;
13955 + }
13956 +
13957 + /* SSID */
13958 + offset = zfStaAddIeSsid(dev, buf, offset);
13959 +
13960 +
13961 + if ( wd->sta.currentFrequency < 3000 )
13962 + {
13963 + /* Support Rate */
13964 + offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_CCK);
13965 + }
13966 + else
13967 + {
13968 + /* Support Rate */
13969 + offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_OFDM);
13970 + }
13971 +
13972 + if ((wd->sta.capability[1] & ZM_BIT_0) == 1)
13973 + { //spectrum managment flag enable
13974 + offset = zfStaAddIePowerCap(dev, buf, offset);
13975 + offset = zfStaAddIeSupportCh(dev, buf, offset);
13976 + }
13977 +
13978 + if (wd->sta.currentFrequency < 3000)
13979 + {
13980 + /* Extended Supported Rates */
13981 + if (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N))
13982 + {
13983 + offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
13984 + }
13985 + }
13986 +
13987 +
13988 + //offset = zfStaAddIeWpaRsn(dev, buf, offset, frameType);
13989 + //Move to wrapper function, for OS difference--CWYang(m)
13990 + //for windows wrapper, zfwStaAddIeWpaRsn() should be below:
13991 + //u16_t zfwStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType)
13992 + //{
13993 + // return zfStaAddIeWpaRsn(dev, buf, offset, frameType);
13994 + //}
13995 + offset = zfwStaAddIeWpaRsn(dev, buf, offset, frameType);
13996 +
13997 +#ifdef ZM_ENABLE_CENC
13998 + /* CENC */
13999 + //if (wd->sta.encryMode == ZM_CENC)
14000 + offset = zfStaAddIeCenc(dev, buf, offset);
14001 +#endif //ZM_ENABLE_CENC
14002 + if (((wd->sta.wmeEnabled & ZM_STA_WME_ENABLE_BIT) != 0) //WME enabled
14003 + && ((wd->sta.apWmeCapability & 0x1) != 0)) //WME AP
14004 + {
14005 + if (((wd->sta.apWmeCapability & 0x80) != 0) //UAPSD AP
14006 + && ((wd->sta.wmeEnabled & ZM_STA_UAPSD_ENABLE_BIT) != 0)) //UAPSD enabled
14007 + {
14008 + offset = zfStaAddIeWmeInfo(dev, buf, offset, wd->sta.wmeQosInfo);
14009 + }
14010 + else
14011 + {
14012 + offset = zfStaAddIeWmeInfo(dev, buf, offset, 0);
14013 + }
14014 + }
14015 + // jhlee HT 0
14016 + //CWYang(+)
14017 + if (wd->sta.EnableHT != 0)
14018 + {
14019 + #ifndef ZM_DISABLE_AMSDU8K_SUPPORT
14020 + //Support 8K A-MSDU
14021 + if (wd->sta.wepStatus == ZM_ENCRYPTION_WEP_DISABLED)
14022 + {
14023 + wd->sta.HTCap.Data.HtCapInfo |= HTCAP_MaxAMSDULength;
14024 + }
14025 + else
14026 + {
14027 + wd->sta.HTCap.Data.HtCapInfo &= (~HTCAP_MaxAMSDULength);
14028 + }
14029 + #else
14030 + //Support 4K A-MSDU
14031 + wd->sta.HTCap.Data.HtCapInfo &= (~HTCAP_MaxAMSDULength);
14032 + #endif
14033 +
14034 + /* HT Capabilities Info */
14035 + if (wd->BandWidth40 == 1) {
14036 + wd->sta.HTCap.Data.HtCapInfo |= HTCAP_SupChannelWidthSet;
14037 + }
14038 + else {
14039 + wd->sta.HTCap.Data.HtCapInfo &= ~HTCAP_SupChannelWidthSet;
14040 + //wd->sta.HTCap.Data.HtCapInfo |= HTCAP_SupChannelWidthSet;
14041 + }
14042 +
14043 + wd->sta.HTCap.Data.AMPDUParam &= ~HTCAP_MaxRxAMPDU3;
14044 + wd->sta.HTCap.Data.AMPDUParam |= HTCAP_MaxRxAMPDU3;
14045 + wd->sta.HTCap.Data.MCSSet[1] = 0xFF; // MCS 8 ~ 15
14046 + offset = zfMmAddHTCapability(dev, buf, offset);
14047 + offset = zfMmAddPreNHTCapability(dev, buf, offset);
14048 + //CWYang(+)
14049 + /* Extended HT Capabilities Info */
14050 + //offset = zfMmAddExtendedHTCapability(dev, buf, offset);
14051 + }
14052 +
14053 +
14054 + //Store asoc request frame body, for VISTA only
14055 + wd->sta.asocReqFrameBodySize = ((offset - hlen) >
14056 + ZM_CACHED_FRAMEBODY_SIZE)?
14057 + ZM_CACHED_FRAMEBODY_SIZE:(offset - hlen);
14058 + for (i=0; i<wd->sta.asocReqFrameBodySize; i++)
14059 + {
14060 + wd->sta.asocReqFrameBody[i] = zmw_tx_buf_readb(dev, buf, i + hlen);
14061 + }
14062 + break;
14063 +
14064 + case ZM_WLAN_FRAME_TYPE_ASOCRSP :
14065 + case ZM_WLAN_FRAME_TYPE_REASOCRSP :
14066 + vap = (u16_t) p3;
14067 +
14068 + /* Capability */
14069 + zmw_tx_buf_writeh(dev, buf, offset, wd->ap.capab[vap]);
14070 + offset+=2;
14071 +
14072 + /* Status Code */
14073 + zmw_tx_buf_writeh(dev, buf, offset, (u16_t)p1);
14074 + offset+=2;
14075 +
14076 + /* AID */
14077 + zmw_tx_buf_writeh(dev, buf, offset, (u16_t)(p2|0xc000));
14078 + offset+=2;
14079 +
14080 +
14081 + if ( wd->frequency < 3000 )
14082 + {
14083 + /* Support Rate */
14084 + offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_CCK);
14085 +
14086 + /* Extended Supported Rates */
14087 + offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
14088 + }
14089 + else
14090 + {
14091 + /* Support Rate */
14092 + offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_OFDM);
14093 + }
14094 +
14095 +
14096 +
14097 + /* WME Parameters */
14098 + if (wd->wlanMode == ZM_MODE_AP)
14099 + {
14100 + /* TODO : if WME STA then send WME parameter element */
14101 + if (wd->ap.qosMode == 1)
14102 + {
14103 + offset = zfApAddIeWmePara(dev, buf, offset, vap);
14104 + }
14105 + }
14106 + // jhlee HT 0
14107 + //CWYang(+)
14108 + /* HT Capabilities Info */
14109 + offset = zfMmAddHTCapability(dev, buf, offset);
14110 + //CWYang(+)
14111 + /* Extended HT Capabilities Info */
14112 + offset = zfMmAddExtendedHTCapability(dev, buf, offset);
14113 + break;
14114 +
14115 + case ZM_WLAN_FRAME_TYPE_ATIM :
14116 + /* NULL frame */
14117 + /* TODO : add two dumb bytes temporarily */
14118 + offset += 2;
14119 + break;
14120 +
14121 + case ZM_WLAN_FRAME_TYPE_QOS_NULL :
14122 + zmw_buf_writeh(dev, buf, offset, 0x0010);
14123 + offset += 2;
14124 + break;
14125 +
14126 + case ZM_WLAN_DATA_FRAME :
14127 + break;
14128 +
14129 + case ZM_WLAN_FRAME_TYPE_DISASOC :
14130 + case ZM_WLAN_FRAME_TYPE_DEAUTH :
14131 + if (wd->wlanMode == ZM_MODE_AP)
14132 + {
14133 + vap = (u16_t) p3;
14134 +
14135 + if ((aid = zfApFindSta(dev, dst)) != 0xffff)
14136 + {
14137 + zmw_enter_critical_section(dev);
14138 + /* Clear STA table */
14139 + wd->ap.staTable[aid].valid = 0;
14140 +
14141 + zmw_leave_critical_section(dev);
14142 +
14143 + if (wd->zfcbDisAsocNotify != NULL)
14144 + {
14145 + wd->zfcbDisAsocNotify(dev, (u8_t*)dst, vap);
14146 + }
14147 + }
14148 + }
14149 + /* Reason Code */
14150 + zmw_tx_buf_writeh(dev, buf, offset, (u16_t)p1);
14151 + offset+=2;
14152 + break;
14153 + }
14154 +
14155 + zfwBufSetSize(dev, buf, offset);
14156 +
14157 + zm_msg2_mm(ZM_LV_2, "management frame body size=", offset-hlen);
14158 +
14159 + //Copy wlan header
14160 + zfTxGenMmHeader(dev, frameType, dst, header, offset-hlen, buf, vap, encrypt);
14161 + for (i=0; i<(hlen>>1); i++)
14162 + {
14163 + zmw_tx_buf_writeh(dev, buf, i*2, header[i]);
14164 + }
14165 +
14166 + /* Get buffer DMA address */
14167 + //if ((addrTblSize = zfwBufMapDma(dev, buf, &addrTbl)) == 0)
14168 + //if ((addrTblSize = zfwMapTxDma(dev, buf, &addrTbl)) == 0)
14169 + //{
14170 + // goto zlError;
14171 + //}
14172 +
14173 + zm_msg2_mm(ZM_LV_2, "offset=", offset);
14174 + zm_msg2_mm(ZM_LV_2, "hlen=", hlen);
14175 + //zm_msg2_mm(ZM_LV_2, "addrTblSize=", addrTblSize);
14176 + //zm_msg2_mm(ZM_LV_2, "addrTbl.len[0]=", addrTbl.len[0]);
14177 + //zm_msg2_mm(ZM_LV_2, "addrTbl.physAddrl[0]=", addrTbl.physAddrl[0]);
14178 + //zm_msg2_mm(ZM_LV_2, "buf->data=", buf->data);
14179 +
14180 + #if 0
14181 + if ((err = zfHpSend(dev, NULL, 0, NULL, 0, NULL, 0, buf, 0,
14182 + ZM_INTERNAL_ALLOC_BUF, 0, 0xff)) != ZM_SUCCESS)
14183 + {
14184 + goto zlError;
14185 + }
14186 + #else
14187 + zfPutVmmq(dev, buf);
14188 + zfPushVtxq(dev);
14189 + #endif
14190 +
14191 + return;
14192 +#if 0
14193 +zlError:
14194 +
14195 + zfwBufFree(dev, buf, 0);
14196 + return;
14197 +#endif
14198 +}
14199 +
14200 +
14201 +/************************************************************************/
14202 +/* */
14203 +/* FUNCTION DESCRIPTION zfProcessManagement */
14204 +/* Process received management frame. */
14205 +/* */
14206 +/* INPUTS */
14207 +/* dev : device pointer */
14208 +/* buf : received management frame buffer */
14209 +/* */
14210 +/* OUTPUTS */
14211 +/* none */
14212 +/* */
14213 +/* AUTHOR */
14214 +/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
14215 +/* */
14216 +/************************************************************************/
14217 +void zfProcessManagement(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo) //CWYang(m)
14218 +{
14219 + u8_t frameType;
14220 + u16_t ta[3];
14221 + u16_t ra[3];
14222 + u16_t vap = 0, index = 0;
14223 + //u16_t i;
14224 +
14225 + zmw_get_wlan_dev(dev);
14226 +
14227 + ra[0] = zmw_rx_buf_readh(dev, buf, 4);
14228 + ra[1] = zmw_rx_buf_readh(dev, buf, 6);
14229 + ra[2] = zmw_rx_buf_readh(dev, buf, 8);
14230 +
14231 + ta[0] = zmw_rx_buf_readh(dev, buf, 10);
14232 + ta[1] = zmw_rx_buf_readh(dev, buf, 12);
14233 + ta[2] = zmw_rx_buf_readh(dev, buf, 14);
14234 +
14235 + frameType = zmw_rx_buf_readb(dev, buf, 0);
14236 +
14237 + if (wd->wlanMode == ZM_MODE_AP)
14238 + {
14239 +#if 1
14240 + vap = 0;
14241 + if ((ra[0] & 0x1) != 1)
14242 + {
14243 + /* AP : Find virtual AP */
14244 + if ((index = zfApFindSta(dev, ta)) != 0xffff)
14245 + {
14246 + vap = wd->ap.staTable[index].vap;
14247 + }
14248 + }
14249 + zm_msg2_mm(ZM_LV_2, "vap=", vap);
14250 +#endif
14251 +
14252 + /* Dispatch by frame type */
14253 + switch (frameType)
14254 + {
14255 + /* Beacon */
14256 + case ZM_WLAN_FRAME_TYPE_BEACON :
14257 + zfApProcessBeacon(dev, buf);
14258 + break;
14259 + /* Authentication */
14260 + case ZM_WLAN_FRAME_TYPE_AUTH :
14261 + zfApProcessAuth(dev, buf, ta, vap);
14262 + break;
14263 + /* Association request */
14264 + case ZM_WLAN_FRAME_TYPE_ASOCREQ :
14265 + /* Reassociation request */
14266 + case ZM_WLAN_FRAME_TYPE_REASOCREQ :
14267 + zfApProcessAsocReq(dev, buf, ta, vap);
14268 + break;
14269 + /* Association response */
14270 + case ZM_WLAN_FRAME_TYPE_ASOCRSP :
14271 + //zfApProcessAsocRsp(dev, buf);
14272 + break;
14273 + /* Deauthentication */
14274 + case ZM_WLAN_FRAME_TYPE_DEAUTH :
14275 + zfApProcessDeauth(dev, buf, ta, vap);
14276 + break;
14277 + /* Disassociation */
14278 + case ZM_WLAN_FRAME_TYPE_DISASOC :
14279 + zfApProcessDisasoc(dev, buf, ta, vap);
14280 + break;
14281 + /* Probe request */
14282 + case ZM_WLAN_FRAME_TYPE_PROBEREQ :
14283 + zfProcessProbeReq(dev, buf, ta);
14284 + break;
14285 + /* Probe response */
14286 + case ZM_WLAN_FRAME_TYPE_PROBERSP :
14287 + zfApProcessProbeRsp(dev, buf, AddInfo);
14288 + break;
14289 + /* Action */
14290 + case ZM_WLAN_FRAME_TYPE_ACTION :
14291 + zfApProcessAction(dev, buf);
14292 + break;
14293 + }
14294 + }
14295 + else //if ((wd->wlanMode == ZM_MODE_INFRASTRUCTURE) || (wd->wlanMode == ZM_MODE_IBSS))
14296 + {
14297 + /* Dispatch by frame type */
14298 + switch (frameType)
14299 + {
14300 + /* Beacon */
14301 + case ZM_WLAN_FRAME_TYPE_BEACON :
14302 + /* if enable 802.11h and current chanel is silent but receive beacon from other AP */
14303 + if (((wd->regulationTable.allowChannel[wd->regulationTable.CurChIndex].channelFlags
14304 + & ZM_REG_FLAG_CHANNEL_CSA) != 0) && wd->sta.DFSEnable)
14305 + {
14306 + wd->regulationTable.allowChannel[wd->regulationTable.CurChIndex].channelFlags
14307 + &= ~(ZM_REG_FLAG_CHANNEL_CSA & ZM_REG_FLAG_CHANNEL_PASSIVE);
14308 + }
14309 + zfStaProcessBeacon(dev, buf, AddInfo); //CWYang(m)
14310 + break;
14311 + /* Authentication */
14312 + case ZM_WLAN_FRAME_TYPE_AUTH :
14313 + /* TODO : vap parameter is useless in STA mode, get rid of it */
14314 + zfStaProcessAuth(dev, buf, ta, 0);
14315 + break;
14316 + /* Association request */
14317 + case ZM_WLAN_FRAME_TYPE_ASOCREQ :
14318 + /* TODO : vap parameter is useless in STA mode, get rid of it */
14319 + zfStaProcessAsocReq(dev, buf, ta, 0);
14320 + break;
14321 + /* Association response */
14322 + case ZM_WLAN_FRAME_TYPE_ASOCRSP :
14323 + /* Reassociation request */
14324 + case ZM_WLAN_FRAME_TYPE_REASOCRSP :
14325 + zfStaProcessAsocRsp(dev, buf);
14326 + break;
14327 + /* Deauthentication */
14328 + case ZM_WLAN_FRAME_TYPE_DEAUTH :
14329 + zm_debug_msg0("Deauthentication received");
14330 + zfStaProcessDeauth(dev, buf);
14331 + break;
14332 + /* Disassociation */
14333 + case ZM_WLAN_FRAME_TYPE_DISASOC :
14334 + zm_debug_msg0("Disassociation received");
14335 + zfStaProcessDisasoc(dev, buf);
14336 + break;
14337 + /* Probe request */
14338 + case ZM_WLAN_FRAME_TYPE_PROBEREQ :
14339 + zfProcessProbeReq(dev, buf, ta);
14340 + break;
14341 + /* Probe response */
14342 + case ZM_WLAN_FRAME_TYPE_PROBERSP :
14343 + /* if enable 802.11h and current chanel is silent but receive probe response from other AP */
14344 + if (((wd->regulationTable.allowChannel[wd->regulationTable.CurChIndex].channelFlags
14345 + & ZM_REG_FLAG_CHANNEL_CSA) != 0) && wd->sta.DFSEnable)
14346 + {
14347 + wd->regulationTable.allowChannel[wd->regulationTable.CurChIndex].channelFlags
14348 + &= ~(ZM_REG_FLAG_CHANNEL_CSA & ZM_REG_FLAG_CHANNEL_PASSIVE);
14349 + }
14350 + zfStaProcessProbeRsp(dev, buf, AddInfo);
14351 + break;
14352 +
14353 + case ZM_WLAN_FRAME_TYPE_ATIM:
14354 + zfStaProcessAtim(dev, buf);
14355 + break;
14356 + /* Action */
14357 + case ZM_WLAN_FRAME_TYPE_ACTION :
14358 + zm_msg0_mm(ZM_LV_2, "ProcessActionMgtFrame");
14359 + zfStaProcessAction(dev, buf);
14360 + break;
14361 + }
14362 + }
14363 +}
14364 +
14365 +/************************************************************************/
14366 +/* */
14367 +/* FUNCTION DESCRIPTION zfProcessProbeReq */
14368 +/* Process probe request management frame. */
14369 +/* */
14370 +/* INPUTS */
14371 +/* dev : device pointer */
14372 +/* buf : auth frame buffer */
14373 +/* */
14374 +/* OUTPUTS */
14375 +/* none */
14376 +/* */
14377 +/* AUTHOR */
14378 +/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
14379 +/* */
14380 +/************************************************************************/
14381 +void zfProcessProbeReq(zdev_t* dev, zbuf_t* buf, u16_t* src)
14382 +{
14383 + u16_t offset;
14384 + u8_t len;
14385 + u16_t i, j;
14386 + u8_t ch;
14387 + u16_t sendFlag;
14388 +
14389 + zmw_get_wlan_dev(dev);
14390 +
14391 + /* check mode : AP/IBSS */
14392 + if ((wd->wlanMode != ZM_MODE_AP) && (wd->wlanMode != ZM_MODE_IBSS))
14393 + {
14394 + zm_msg0_mm(ZM_LV_3, "Ignore probe req");
14395 + return;
14396 + }
14397 +
14398 + if ((wd->wlanMode != ZM_MODE_AP) && (wd->sta.adapterState == ZM_STA_STATE_DISCONNECT))
14399 + {
14400 + zm_msg0_mm(ZM_LV_3, "Packets dropped due to disconnect state");
14401 + return;
14402 + }
14403 +
14404 + if ( wd->wlanMode == ZM_MODE_IBSS )
14405 + {
14406 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_PROBERSP, src, 0, 0, 0);
14407 +
14408 + return;
14409 + }
14410 +
14411 + /* check SSID */
14412 + if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_SSID)) == 0xffff)
14413 + {
14414 + zm_msg0_mm(ZM_LV_3, "probe req SSID not found");
14415 + return;
14416 + }
14417 +
14418 + len = zmw_rx_buf_readb(dev, buf, offset+1);
14419 +
14420 + for (i=0; i<ZM_MAX_AP_SUPPORT; i++)
14421 + {
14422 + if ((wd->ap.apBitmap & (1<<i)) != 0)
14423 + {
14424 + zm_msg1_mm(ZM_LV_3, "len=", len);
14425 + sendFlag = 0;
14426 + /* boardcast SSID */
14427 + if (len == 0)
14428 + {
14429 + if (wd->ap.hideSsid[i] == 0)
14430 + {
14431 + sendFlag = 1;
14432 + }
14433 + }
14434 + /* Not broadcast SSID */
14435 + else if (wd->ap.ssidLen[i] == len)
14436 + {
14437 + for (j=0; j<len; j++)
14438 + {
14439 + if ((ch = zmw_rx_buf_readb(dev, buf, offset+2+j))
14440 + != wd->ap.ssid[i][j])
14441 + {
14442 + break;
14443 + }
14444 + }
14445 + if (j == len)
14446 + {
14447 + sendFlag = 1;
14448 + }
14449 + }
14450 + if (sendFlag == 1)
14451 + {
14452 + /* Send probe response */
14453 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_PROBERSP, src, i, 0, i);
14454 + }
14455 + }
14456 + }
14457 +}
14458 +
14459 +/************************************************************************/
14460 +/* */
14461 +/* FUNCTION DESCRIPTION zfProcessProbeRsp */
14462 +/* Process probe response management frame. */
14463 +/* */
14464 +/* INPUTS */
14465 +/* dev : device pointer */
14466 +/* buf : auth frame buffer */
14467 +/* AddInfo : Rx Header and Rx Mac Status */
14468 +/* */
14469 +/* OUTPUTS */
14470 +/* none */
14471 +/* */
14472 +/* AUTHOR */
14473 +/* Aress Yang ZyDAS Technology Corporation 2006.11 */
14474 +/* */
14475 +/************************************************************************/
14476 +void zfProcessProbeRsp(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo)
14477 +{
14478 + /* Gather scan result */
14479 + /* Parse TIM and send PS-POLL in power saving mode */
14480 + struct zsWlanProbeRspFrameHeader* pProbeRspHeader;
14481 + struct zsBssInfo* pBssInfo;
14482 + u8_t pBuf[sizeof(struct zsWlanProbeRspFrameHeader)];
14483 + int res;
14484 +
14485 + zmw_get_wlan_dev(dev);
14486 +
14487 + zmw_declare_for_critical_section();
14488 +
14489 + zfCopyFromRxBuffer(dev, buf, pBuf, 0,
14490 + sizeof(struct zsWlanProbeRspFrameHeader));
14491 + pProbeRspHeader = (struct zsWlanProbeRspFrameHeader*) pBuf;
14492 +
14493 + zmw_enter_critical_section(dev);
14494 +
14495 + //zm_debug_msg1("bss count = ", wd->sta.bssList.bssCount);
14496 +
14497 + pBssInfo = zfStaFindBssInfo(dev, buf, pProbeRspHeader);
14498 +
14499 + //if ( i == wd->sta.bssList.bssCount )
14500 + if ( pBssInfo == NULL )
14501 + {
14502 + /* Allocate a new entry if BSS not in the scan list */
14503 + pBssInfo = zfBssInfoAllocate(dev);
14504 + if (pBssInfo != NULL)
14505 + {
14506 + res = zfStaInitBssInfo(dev, buf, pProbeRspHeader, pBssInfo, AddInfo, 0);
14507 + //zfDumpSSID(pBssInfo->ssid[1], &(pBssInfo->ssid[2]));
14508 + if ( res != 0 )
14509 + {
14510 + zfBssInfoFree(dev, pBssInfo);
14511 + }
14512 + else
14513 + {
14514 + zfBssInfoInsertToList(dev, pBssInfo);
14515 + }
14516 + }
14517 + }
14518 + else
14519 + {
14520 + res = zfStaInitBssInfo(dev, buf, pProbeRspHeader, pBssInfo, AddInfo, 1);
14521 + if (res == 2)
14522 + {
14523 + zfBssInfoRemoveFromList(dev, pBssInfo);
14524 + zfBssInfoFree(dev, pBssInfo);
14525 + }
14526 + else if ( wd->wlanMode == ZM_MODE_IBSS )
14527 + {
14528 + int idx;
14529 +
14530 + // It would reset the alive counter if the peer station is found!
14531 + zfStaFindFreeOpposite(dev, (u16_t *)pBssInfo->macaddr, &idx);
14532 + }
14533 + }
14534 +
14535 + zmw_leave_critical_section(dev);
14536 +
14537 + return;
14538 +}
14539 +
14540 +/************************************************************************/
14541 +/* */
14542 +/* FUNCTION DESCRIPTION zfSendProbeReq */
14543 +/* Send probe request management frame. */
14544 +/* */
14545 +/* INPUTS */
14546 +/* dev : device pointer */
14547 +/* */
14548 +/* */
14549 +/* OUTPUTS */
14550 +/* none */
14551 +/* */
14552 +/* AUTHOR */
14553 +/* Ji-Huang Lee ZyDAS Technology Corporation 2005.11 */
14554 +/* */
14555 +/************************************************************************/
14556 +
14557 +u16_t zfSendProbeReq(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t bWithSSID)
14558 +{
14559 + zmw_get_wlan_dev(dev);
14560 + zmw_declare_for_critical_section();
14561 +
14562 +
14563 + /* SSID */
14564 + if (bWithSSID == 0) /* broadcast ssid */
14565 + {
14566 + //zmw_leave_critical_section(dev);
14567 + zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SSID);
14568 + zmw_tx_buf_writeb(dev, buf, offset++, 0); /* length = 0 */
14569 + }
14570 + else
14571 + {
14572 + zmw_enter_critical_section(dev);
14573 + if (wd->ws.probingSsidList[bWithSSID-1].ssidLen == 0)
14574 + {
14575 + zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SSID);
14576 + zmw_tx_buf_writeb(dev, buf, offset++, 0); /* length = 0 */
14577 + }
14578 + else
14579 + {
14580 + zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SSID);
14581 + zmw_tx_buf_writeb(dev, buf, offset++,
14582 + wd->ws.probingSsidList[bWithSSID-1].ssidLen);
14583 + zfCopyToIntTxBuffer(dev, buf,
14584 + wd->ws.probingSsidList[bWithSSID-1].ssid,
14585 + offset,
14586 + wd->ws.probingSsidList[bWithSSID-1].ssidLen); /* ssid */
14587 + offset += wd->ws.probingSsidList[bWithSSID-1].ssidLen;
14588 + }
14589 + zmw_leave_critical_section(dev);
14590 + }
14591 +
14592 + /* Supported rates */
14593 + if ( wd->sta.currentFrequency < 3000 )
14594 + { /* 802.11b+g */
14595 + offset = zfMmAddIeSupportRate(dev, buf, offset,
14596 + ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_CCK);
14597 +
14598 + if (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) {
14599 + if (wd->wlanMode == ZM_MODE_IBSS) {
14600 + if (wd->wfc.bIbssGMode) {
14601 + offset = zfMmAddIeSupportRate(dev, buf, offset,
14602 + ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
14603 + }
14604 + } else {
14605 + offset = zfMmAddIeSupportRate(dev, buf, offset,
14606 + ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
14607 + }
14608 + }
14609 + }
14610 + else
14611 + { /* 802.11a */
14612 + offset = zfMmAddIeSupportRate(dev, buf, offset,
14613 + ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_OFDM);
14614 + }
14615 +
14616 + return offset;
14617 +}
14618 +
14619 +
14620 +/************************************************************************/
14621 +/* */
14622 +/* FUNCTION DESCRIPTION zfUpdateDefaultQosParameter */
14623 +/* Update TxQs CWMIN, CWMAX, AIFS and TXO to WME default value. */
14624 +/* */
14625 +/* INPUTS */
14626 +/* dev : device pointer */
14627 +/* mode : 0=>STA, 1=>AP */
14628 +/* */
14629 +/* OUTPUTS */
14630 +/* none */
14631 +/* */
14632 +/* AUTHOR */
14633 +/* Stephen ZyDAS Technology Corporation 2006.6 */
14634 +/* */
14635 +/************************************************************************/
14636 +void zfUpdateDefaultQosParameter(zdev_t* dev, u8_t mode)
14637 +{
14638 + u16_t cwmin[5];
14639 + u16_t cwmax[5];
14640 + u16_t aifs[5];
14641 + u16_t txop[5];
14642 +
14643 + /* WMM parameter for STA */
14644 + /* Best Effor */
14645 + cwmin[0] = 15;
14646 + cwmax[0] = 1023;
14647 + aifs[0] = 3 * 9 + 10;
14648 + txop[0] = 0;
14649 + /* Back Ground */
14650 + cwmin[1] = 15;
14651 + cwmax[1] = 1023;
14652 + aifs[1] = 7 * 9 + 10;
14653 + txop[1] = 0;
14654 + /* VIDEO */
14655 + cwmin[2] = 7;
14656 + cwmax[2] = 15;
14657 + aifs[2] = 2 * 9 + 10;
14658 + txop[2] = 94;
14659 + /* VOICE */
14660 + cwmin[3] = 3;
14661 + cwmax[3] = 7;
14662 + aifs[3] = 2 * 9 + 10;
14663 + txop[3] = 47;
14664 + /* Special TxQ */
14665 + cwmin[4] = 3;
14666 + cwmax[4] = 7;
14667 + aifs[4] = 2 * 9 + 10;
14668 + txop[4] = 0;
14669 +
14670 + /* WMM parameter for AP */
14671 + if (mode == 1)
14672 + {
14673 + cwmax[0] = 63;
14674 + aifs[3] = 1 * 9 + 10;
14675 + aifs[4] = 1 * 9 + 10;
14676 + }
14677 + zfHpUpdateQosParameter(dev, cwmin, cwmax, aifs, txop);
14678 +}
14679 +
14680 +u16_t zfFindATHExtCap(zdev_t* dev, zbuf_t* buf, u8_t type, u8_t subtype)
14681 +{
14682 + u8_t subType;
14683 + u16_t offset;
14684 + u16_t bufLen;
14685 + u16_t elen;
14686 + u8_t id;
14687 + u8_t tmp;
14688 +
14689 + /* Get offset of first element */
14690 + subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
14691 +
14692 + if ((offset = zgElementOffsetTable[subType]) == 0xff)
14693 + {
14694 + zm_assert(0);
14695 + }
14696 +
14697 + /* Plus wlan header */
14698 + offset += 24;
14699 +
14700 + bufLen = zfwBufGetSize(dev, buf);
14701 +
14702 + /* Search loop */
14703 + while ((offset+2)<bufLen) // including element ID and length (2bytes)
14704 + {
14705 + /* Search target element */
14706 + if ((id = zmw_rx_buf_readb(dev, buf, offset)) == ZM_WLAN_EID_WIFI_IE)
14707 + {
14708 + /* Bingo */
14709 + if ((elen = zmw_rx_buf_readb(dev, buf, offset+1))>(bufLen - offset))
14710 + {
14711 + /* Element length error */
14712 + return 0xffff;
14713 + }
14714 +
14715 + if ( elen == 0 )
14716 + {
14717 + return 0xffff;
14718 + }
14719 +
14720 + if (((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x00)
14721 + && ((tmp = zmw_rx_buf_readb(dev, buf, offset+3)) == 0x03)
14722 + && ((tmp = zmw_rx_buf_readb(dev, buf, offset+4)) == 0x7f)
14723 + && ((tmp = zmw_rx_buf_readb(dev, buf, offset+5)) == type))
14724 +
14725 + {
14726 + if ( subtype != 0xff )
14727 + {
14728 + if ( (tmp = zmw_rx_buf_readb(dev, buf, offset+6)) == subtype )
14729 + {
14730 + return offset;
14731 + }
14732 + }
14733 + else
14734 + {
14735 + return offset;
14736 + }
14737 + }
14738 + }
14739 +
14740 + /* Advance to next element */
14741 + if ((elen = zmw_rx_buf_readb(dev, buf, offset+1)) == 0)
14742 + {
14743 + return 0xffff;
14744 + }
14745 + offset += (elen+2);
14746 + }
14747 + return 0xffff;
14748 +}
14749 +
14750 +u16_t zfFindBrdcmMrvlRlnkExtCap(zdev_t* dev, zbuf_t* buf)
14751 +{
14752 + u8_t subType;
14753 + u16_t offset;
14754 + u16_t bufLen;
14755 + u16_t elen;
14756 + u8_t id;
14757 + u8_t tmp;
14758 +
14759 + /* Get offset of first element */
14760 + subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
14761 +
14762 + if ((offset = zgElementOffsetTable[subType]) == 0xff)
14763 + {
14764 + zm_assert(0);
14765 + }
14766 +
14767 + /* Plus wlan header */
14768 + offset += 24;
14769 +
14770 + bufLen = zfwBufGetSize(dev, buf);
14771 +
14772 + /* Search loop */
14773 + while ((offset+2)<bufLen) // including element ID and length (2bytes)
14774 + {
14775 + /* Search target element */
14776 + if ((id = zmw_rx_buf_readb(dev, buf, offset)) == ZM_WLAN_EID_WIFI_IE)
14777 + {
14778 + /* Bingo */
14779 + if ((elen = zmw_rx_buf_readb(dev, buf, offset+1))>(bufLen - offset))
14780 + {
14781 + /* Element length error */
14782 + return 0xffff;
14783 + }
14784 +
14785 + if ( elen == 0 )
14786 + {
14787 + return 0xffff;
14788 + }
14789 +
14790 + if (((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x00)
14791 + && ((tmp = zmw_rx_buf_readb(dev, buf, offset+3)) == 0x10)
14792 + && ((tmp = zmw_rx_buf_readb(dev, buf, offset+4)) == 0x18))
14793 +
14794 + {
14795 + return offset;
14796 + }
14797 + else if (((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x00)
14798 + && ((tmp = zmw_rx_buf_readb(dev, buf, offset+3)) == 0x50)
14799 + && ((tmp = zmw_rx_buf_readb(dev, buf, offset+4)) == 0x43))
14800 +
14801 + {
14802 + return offset;
14803 + }
14804 + }
14805 + else if ((id = zmw_rx_buf_readb(dev, buf, offset)) == 0x7F)
14806 + {
14807 + /* Bingo */
14808 + if ((elen = zmw_rx_buf_readb(dev, buf, offset+1))>(bufLen - offset))
14809 + {
14810 + /* Element length error */
14811 + return 0xffff;
14812 + }
14813 +
14814 + if ( elen == 0 )
14815 + {
14816 + return 0xffff;
14817 + }
14818 +
14819 + if ((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x01)
14820 +
14821 + {
14822 + return offset;
14823 + }
14824 + }
14825 +
14826 + /* Advance to next element */
14827 + if ((elen = zmw_rx_buf_readb(dev, buf, offset+1)) == 0)
14828 + {
14829 + return 0xffff;
14830 + }
14831 + offset += (elen+2);
14832 + }
14833 + return 0xffff;
14834 +}
14835 +
14836 +u16_t zfFindMarvelExtCap(zdev_t* dev, zbuf_t* buf)
14837 +{
14838 + u8_t subType;
14839 + u16_t offset;
14840 + u16_t bufLen;
14841 + u16_t elen;
14842 + u8_t id;
14843 + u8_t tmp;
14844 +
14845 + /* Get offset of first element */
14846 + subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
14847 +
14848 + if ((offset = zgElementOffsetTable[subType]) == 0xff)
14849 + {
14850 + zm_assert(0);
14851 + }
14852 +
14853 + /* Plus wlan header */
14854 + offset += 24;
14855 +
14856 + bufLen = zfwBufGetSize(dev, buf);
14857 +
14858 + /* Search loop */
14859 + while ((offset+2)<bufLen) // including element ID and length (2bytes)
14860 + {
14861 + /* Search target element */
14862 + if ((id = zmw_rx_buf_readb(dev, buf, offset)) == ZM_WLAN_EID_WIFI_IE)
14863 + {
14864 + /* Bingo */
14865 + if ((elen = zmw_rx_buf_readb(dev, buf, offset+1))>(bufLen - offset))
14866 + {
14867 + /* Element length error */
14868 + return 0xffff;
14869 + }
14870 +
14871 + if ( elen == 0 )
14872 + {
14873 + return 0xffff;
14874 + }
14875 +
14876 + if (((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x00)
14877 + && ((tmp = zmw_rx_buf_readb(dev, buf, offset+3)) == 0x50)
14878 + && ((tmp = zmw_rx_buf_readb(dev, buf, offset+4)) == 0x43))
14879 +
14880 + {
14881 + return offset;
14882 + }
14883 + }
14884 +
14885 + /* Advance to next element */
14886 + if ((elen = zmw_rx_buf_readb(dev, buf, offset+1)) == 0)
14887 + {
14888 + return 0xffff;
14889 + }
14890 + offset += (elen+2);
14891 + }
14892 + return 0xffff;
14893 +}
14894 +
14895 +u16_t zfFindBroadcomExtCap(zdev_t* dev, zbuf_t* buf)
14896 +{
14897 + u8_t subType;
14898 + u16_t offset;
14899 + u16_t bufLen;
14900 + u16_t elen;
14901 + u8_t id;
14902 + u8_t tmp;
14903 +
14904 + /* Get offset of first element */
14905 + subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
14906 +
14907 + if ((offset = zgElementOffsetTable[subType]) == 0xff)
14908 + {
14909 + zm_assert(0);
14910 + }
14911 +
14912 + /* Plus wlan header */
14913 + offset += 24;
14914 +
14915 + bufLen = zfwBufGetSize(dev, buf);
14916 +
14917 + /* Search loop */
14918 + while((offset+2) < bufLen) // including element ID and length (2bytes)
14919 + {
14920 + /* Search target element */
14921 + if ((id = zmw_rx_buf_readb(dev, buf, offset)) == ZM_WLAN_EID_WIFI_IE)
14922 + {
14923 + /* Bingo */
14924 + if ((elen = zmw_rx_buf_readb(dev, buf, offset+1)) > (bufLen - offset))
14925 + {
14926 + /* Element length error */
14927 + return 0xffff;
14928 + }
14929 +
14930 + if (elen == 0)
14931 + {
14932 + return 0xffff;
14933 + }
14934 +
14935 + if ( ((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x00)
14936 + && ((tmp = zmw_rx_buf_readb(dev, buf, offset+3)) == 0x10)
14937 + && ((tmp = zmw_rx_buf_readb(dev, buf, offset+4)) == 0x18) )
14938 + {
14939 + return offset;
14940 + }
14941 + }
14942 +
14943 + /* Advance to next element */
14944 + if ((elen = zmw_rx_buf_readb(dev, buf, offset+1)) == 0)
14945 + {
14946 + return 0xffff;
14947 + }
14948 +
14949 + offset += (elen+2);
14950 + }
14951 +
14952 + return 0xffff;
14953 +}
14954 +
14955 +u16_t zfFindRlnkExtCap(zdev_t* dev, zbuf_t* buf)
14956 +{
14957 + u8_t subType;
14958 + u16_t offset;
14959 + u16_t bufLen;
14960 + u16_t elen;
14961 + u8_t id;
14962 + u8_t tmp;
14963 +
14964 + /* Get offset of first element */
14965 + subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
14966 +
14967 + if ((offset = zgElementOffsetTable[subType]) == 0xff)
14968 + {
14969 + zm_assert(0);
14970 + }
14971 +
14972 + /* Plus wlan header */
14973 + offset += 24;
14974 +
14975 + bufLen = zfwBufGetSize(dev, buf);
14976 +
14977 + /* Search loop */
14978 + while((offset+2) < bufLen) // including element ID and length (2bytes)
14979 + {
14980 + /* Search target element */
14981 + if ((id = zmw_rx_buf_readb(dev, buf, offset)) == 0x7F)
14982 + {
14983 + /* Bingo */
14984 + if ((elen = zmw_rx_buf_readb(dev, buf, offset+1)) > (bufLen - offset))
14985 + {
14986 + /* Element length error */
14987 + return 0xffff;
14988 + }
14989 +
14990 + if ( elen == 0 )
14991 + {
14992 + return 0xffff;
14993 + }
14994 +
14995 + if ((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x01)
14996 +
14997 + {
14998 + return offset;
14999 + }
15000 + }
15001 +
15002 + /* Advance to next element */
15003 + if ((elen = zmw_rx_buf_readb(dev, buf, offset+1)) == 0)
15004 + {
15005 + return 0xffff;
15006 + }
15007 +
15008 + offset += (elen+2);
15009 + }
15010 +
15011 + return 0xffff;
15012 +}
15013 --- /dev/null
15014 +++ b/drivers/staging/otus/80211core/cmmsta.c
15015 @@ -0,0 +1,5782 @@
15016 +/*
15017 + * Copyright (c) 2007-2008 Atheros Communications Inc.
15018 + *
15019 + * Permission to use, copy, modify, and/or distribute this software for any
15020 + * purpose with or without fee is hereby granted, provided that the above
15021 + * copyright notice and this permission notice appear in all copies.
15022 + *
15023 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
15024 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
15025 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15026 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15027 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15028 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15029 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15030 + */
15031 +
15032 +#include "cprecomp.h"
15033 +#include "ratectrl.h"
15034 +#include "../hal/hpreg.h"
15035 +
15036 +/* TODO : change global variable to constant */
15037 +u8_t zgWpaRadiusOui[] = { 0x00, 0x50, 0xf2, 0x01 };
15038 +u8_t zgWpaAesOui[] = { 0x00, 0x50, 0xf2, 0x04 };
15039 +u8_t zgWpa2RadiusOui[] = { 0x00, 0x0f, 0xac, 0x01 };
15040 +u8_t zgWpa2AesOui[] = { 0x00, 0x0f, 0xac, 0x04 };
15041 +
15042 +const u16_t zcCwTlb[16] = { 0, 1, 3, 7, 15, 31, 63, 127,
15043 + 255, 511, 1023, 2047, 4095, 4095, 4095, 4095};
15044 +
15045 +void zfStaStartConnectCb(zdev_t* dev);
15046 +
15047 +/************************************************************************/
15048 +/* */
15049 +/* FUNCTION DESCRIPTION zfStaPutApIntoBlockingList */
15050 +/* Put AP into blocking AP list. */
15051 +/* */
15052 +/* INPUTS */
15053 +/* dev : device pointer */
15054 +/* bssid : AP's BSSID */
15055 +/* weight : weight of AP */
15056 +/* */
15057 +/* OUTPUTS */
15058 +/* none */
15059 +/* */
15060 +/* AUTHOR */
15061 +/* Stephen Chen Atheros Communications, INC. 2006.12 */
15062 +/* */
15063 +/************************************************************************/
15064 +void zfStaPutApIntoBlockingList(zdev_t* dev, u8_t* bssid, u8_t weight)
15065 +{
15066 + u16_t i, j;
15067 + zmw_get_wlan_dev(dev);
15068 + zmw_declare_for_critical_section();
15069 +
15070 + if (weight > 0)
15071 + {
15072 + zmw_enter_critical_section(dev);
15073 + /*Find same bssid entry first*/
15074 + for (i=0; i<ZM_MAX_BLOCKING_AP_LIST_SIZE; i++)
15075 + {
15076 + for (j=0; j<6; j++)
15077 + {
15078 + if(wd->sta.blockingApList[i].addr[j]!= bssid[j])
15079 + {
15080 + break;
15081 + }
15082 + }
15083 +
15084 + if(j==6)
15085 + {
15086 + break;
15087 + }
15088 + }
15089 + /*This bssid doesn't have old record.Find an empty entry*/
15090 + if (i == ZM_MAX_BLOCKING_AP_LIST_SIZE)
15091 + {
15092 + for (i=0; i<ZM_MAX_BLOCKING_AP_LIST_SIZE; i++)
15093 + {
15094 + if (wd->sta.blockingApList[i].weight == 0)
15095 + {
15096 + break;
15097 + }
15098 + }
15099 + }
15100 +
15101 + /* If the list is full, pick one entry for replacement */
15102 + if (i == ZM_MAX_BLOCKING_AP_LIST_SIZE)
15103 + {
15104 + i = bssid[5] & (ZM_MAX_BLOCKING_AP_LIST_SIZE-1);
15105 + }
15106 +
15107 + /* Update AP address and weight */
15108 + for (j=0; j<6; j++)
15109 + {
15110 + wd->sta.blockingApList[i].addr[j] = bssid[j];
15111 + }
15112 +
15113 + wd->sta.blockingApList[i].weight = weight;
15114 + zmw_leave_critical_section(dev);
15115 + }
15116 +
15117 + return;
15118 +}
15119 +
15120 +
15121 +/************************************************************************/
15122 +/* */
15123 +/* FUNCTION DESCRIPTION zfStaIsApInBlockingList */
15124 +/* Is AP in blocking list. */
15125 +/* */
15126 +/* INPUTS */
15127 +/* dev : device pointer */
15128 +/* bssid : AP's BSSID */
15129 +/* */
15130 +/* OUTPUTS */
15131 +/* TRUE : AP in blocking list */
15132 +/* FALSE : AP not in blocking list */
15133 +/* */
15134 +/* AUTHOR */
15135 +/* Stephen Chen Atheros Communications, INC. 2006.12 */
15136 +/* */
15137 +/************************************************************************/
15138 +u16_t zfStaIsApInBlockingList(zdev_t* dev, u8_t* bssid)
15139 +{
15140 + u16_t i, j;
15141 + zmw_get_wlan_dev(dev);
15142 + //zmw_declare_for_critical_section();
15143 +
15144 + //zmw_enter_critical_section(dev);
15145 + for (i=0; i<ZM_MAX_BLOCKING_AP_LIST_SIZE; i++)
15146 + {
15147 + if (wd->sta.blockingApList[i].weight != 0)
15148 + {
15149 + for (j=0; j<6; j++)
15150 + {
15151 + if (wd->sta.blockingApList[i].addr[j] != bssid[j])
15152 + {
15153 + break;
15154 + }
15155 + }
15156 + if (j == 6)
15157 + {
15158 + //zmw_leave_critical_section(dev);
15159 + return TRUE;
15160 + }
15161 + }
15162 + }
15163 + //zmw_leave_critical_section(dev);
15164 + return FALSE;
15165 +}
15166 +
15167 +
15168 +/************************************************************************/
15169 +/* */
15170 +/* FUNCTION DESCRIPTION zfStaRefreshBlockList */
15171 +/* Is AP in blocking list. */
15172 +/* */
15173 +/* INPUTS */
15174 +/* dev : device pointer */
15175 +/* flushFlag : flush whole blocking list */
15176 +/* */
15177 +/* OUTPUTS */
15178 +/* none */
15179 +/* */
15180 +/* AUTHOR */
15181 +/* Stephen Chen Atheros Communications, INC. 2006.12 */
15182 +/* */
15183 +/************************************************************************/
15184 +void zfStaRefreshBlockList(zdev_t* dev, u16_t flushFlag)
15185 +{
15186 + u16_t i;
15187 + zmw_get_wlan_dev(dev);
15188 + zmw_declare_for_critical_section();
15189 +
15190 + zmw_enter_critical_section(dev);
15191 + for (i=0; i<ZM_MAX_BLOCKING_AP_LIST_SIZE; i++)
15192 + {
15193 + if (wd->sta.blockingApList[i].weight != 0)
15194 + {
15195 + if (flushFlag != 0)
15196 + {
15197 + wd->sta.blockingApList[i].weight = 0;
15198 + }
15199 + else
15200 + {
15201 + wd->sta.blockingApList[i].weight--;
15202 + }
15203 + }
15204 + }
15205 + zmw_leave_critical_section(dev);
15206 + return;
15207 +}
15208 +
15209 +
15210 +/************************************************************************/
15211 +/* */
15212 +/* FUNCTION DESCRIPTION zfStaConnectFail */
15213 +/* Handle Connect failure. */
15214 +/* */
15215 +/* INPUTS */
15216 +/* dev : device pointer */
15217 +/* bssid : BSSID */
15218 +/* reason : reason of failure */
15219 +/* */
15220 +/* OUTPUTS */
15221 +/* none */
15222 +/* */
15223 +/* AUTHOR */
15224 +/* Stephen Chen Atheros Communications, INC. 2006.12 */
15225 +/* */
15226 +/************************************************************************/
15227 +void zfStaConnectFail(zdev_t* dev, u16_t reason, u16_t* bssid, u8_t weight)
15228 +{
15229 + zmw_get_wlan_dev(dev);
15230 +
15231 + /* Change internal state */
15232 + zfChangeAdapterState(dev, ZM_STA_STATE_DISCONNECT);
15233 +
15234 + /* Improve WEP/TKIP performace with HT AP, detail information please look bug#32495 */
15235 + //zfHpSetTTSIFSTime(dev, 0x8);
15236 +
15237 + /* Notify wrapper of connection status changes */
15238 + if (wd->zfcbConnectNotify != NULL)
15239 + {
15240 + wd->zfcbConnectNotify(dev, reason, bssid);
15241 + }
15242 +
15243 + /* Put AP into internal blocking list */
15244 + zfStaPutApIntoBlockingList(dev, (u8_t *)bssid, weight);
15245 +
15246 + /* Issue another SCAN */
15247 + if ( wd->sta.bAutoReconnect )
15248 + {
15249 + zm_debug_msg0("Start internal scan...");
15250 + zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
15251 + zfScanMgrScanStart(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
15252 + }
15253 +}
15254 +
15255 +u8_t zfiWlanIBSSGetPeerStationsCount(zdev_t* dev)
15256 +{
15257 + zmw_get_wlan_dev(dev);
15258 +
15259 + return wd->sta.oppositeCount;
15260 +}
15261 +
15262 +u8_t zfiWlanIBSSIteratePeerStations(zdev_t* dev, u8_t numToIterate, zfpIBSSIteratePeerStationCb callback, void *ctx)
15263 +{
15264 + u8_t oppositeCount;
15265 + u8_t i;
15266 + u8_t index = 0;
15267 +
15268 + zmw_get_wlan_dev(dev);
15269 +
15270 + zmw_declare_for_critical_section();
15271 +
15272 + zmw_enter_critical_section(dev);
15273 +
15274 + oppositeCount = wd->sta.oppositeCount;
15275 + if ( oppositeCount > numToIterate )
15276 + {
15277 + oppositeCount = numToIterate;
15278 + }
15279 +
15280 + for(i=0; i < ZM_MAX_OPPOSITE_COUNT; i++)
15281 + {
15282 + if ( oppositeCount == 0 )
15283 + {
15284 + break;
15285 + }
15286 +
15287 + if ( wd->sta.oppositeInfo[i].valid == 0 )
15288 + {
15289 + continue;
15290 + }
15291 +
15292 + callback(dev, &wd->sta.oppositeInfo[i], ctx, index++);
15293 + oppositeCount--;
15294 +
15295 + }
15296 +
15297 + zmw_leave_critical_section(dev);
15298 +
15299 + return index;
15300 +}
15301 +
15302 +
15303 +s8_t zfStaFindFreeOpposite(zdev_t* dev, u16_t *sa, int *pFoundIdx)
15304 +{
15305 + int oppositeCount;
15306 + int i;
15307 +
15308 + zmw_get_wlan_dev(dev);
15309 +
15310 + oppositeCount = wd->sta.oppositeCount;
15311 +
15312 + for(i=0; i < ZM_MAX_OPPOSITE_COUNT; i++)
15313 + {
15314 + if ( oppositeCount == 0 )
15315 + {
15316 + break;
15317 + }
15318 +
15319 + if ( wd->sta.oppositeInfo[i].valid == 0 )
15320 + {
15321 + continue;
15322 + }
15323 +
15324 + oppositeCount--;
15325 + if ( zfMemoryIsEqual((u8_t*) sa, wd->sta.oppositeInfo[i].macAddr, 6) )
15326 + {
15327 + //wd->sta.oppositeInfo[i].aliveCounter++;
15328 + wd->sta.oppositeInfo[i].aliveCounter = ZM_IBSS_PEER_ALIVE_COUNTER;
15329 +
15330 + /* it is already stored */
15331 + return 1;
15332 + }
15333 + }
15334 +
15335 + // Check if there's still space for new comer
15336 + if ( wd->sta.oppositeCount == ZM_MAX_OPPOSITE_COUNT )
15337 + {
15338 + return -1;
15339 + }
15340 +
15341 + // Find an unused slot for new peer station
15342 + for(i=0; i < ZM_MAX_OPPOSITE_COUNT; i++)
15343 + {
15344 + if ( wd->sta.oppositeInfo[i].valid == 0 )
15345 + {
15346 + break;
15347 + }
15348 + }
15349 +
15350 + *pFoundIdx = i;
15351 + return 0;
15352 +}
15353 +
15354 +s8_t zfStaFindOppositeByMACAddr(zdev_t* dev, u16_t *sa, u8_t *pFoundIdx)
15355 +{
15356 + u32_t oppositeCount;
15357 + u32_t i;
15358 +
15359 + zmw_get_wlan_dev(dev);
15360 +
15361 + oppositeCount = wd->sta.oppositeCount;
15362 +
15363 + for(i=0; i < ZM_MAX_OPPOSITE_COUNT; i++)
15364 + {
15365 + if ( oppositeCount == 0 )
15366 + {
15367 + break;
15368 + }
15369 +
15370 + if ( wd->sta.oppositeInfo[i].valid == 0 )
15371 + {
15372 + continue;
15373 + }
15374 +
15375 + oppositeCount--;
15376 + if ( zfMemoryIsEqual((u8_t*) sa, wd->sta.oppositeInfo[i].macAddr, 6) )
15377 + {
15378 + *pFoundIdx = (u8_t)i;
15379 +
15380 + return 0;
15381 + }
15382 + }
15383 +
15384 + *pFoundIdx = 0;
15385 + return 1;
15386 +}
15387 +
15388 +static void zfStaInitCommonOppositeInfo(zdev_t* dev, int i)
15389 +{
15390 + zmw_get_wlan_dev(dev);
15391 +
15392 + /* set the default rate to the highest rate */
15393 + wd->sta.oppositeInfo[i].valid = 1;
15394 + wd->sta.oppositeInfo[i].aliveCounter = ZM_IBSS_PEER_ALIVE_COUNTER;
15395 + wd->sta.oppositeCount++;
15396 +
15397 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
15398 + /* Set parameters for new opposite peer station !!! */
15399 + wd->sta.oppositeInfo[i].camIdx = 0xff; // Not set key in this location
15400 + wd->sta.oppositeInfo[i].pkInstalled = 0;
15401 + wd->sta.oppositeInfo[i].wpaState = ZM_STA_WPA_STATE_INIT ; // No encryption
15402 +#endif
15403 +}
15404 +
15405 +int zfStaSetOppositeInfoFromBSSInfo(zdev_t* dev, struct zsBssInfo* pBssInfo)
15406 +{
15407 + int i;
15408 + u8_t* dst;
15409 + u16_t sa[3];
15410 + int res;
15411 + u32_t oneTxStreamCap;
15412 +
15413 + zmw_get_wlan_dev(dev);
15414 +
15415 + zfMemoryCopy((u8_t*) sa, pBssInfo->macaddr, 6);
15416 +
15417 + res = zfStaFindFreeOpposite(dev, sa, &i);
15418 + if ( res != 0 )
15419 + {
15420 + goto zlReturn;
15421 + }
15422 +
15423 + dst = wd->sta.oppositeInfo[i].macAddr;
15424 + zfMemoryCopy(dst, (u8_t *)sa, 6);
15425 +
15426 + oneTxStreamCap = (zfHpCapability(dev) & ZM_HP_CAP_11N_ONE_TX_STREAM);
15427 +
15428 + if (pBssInfo->extSupportedRates[1] != 0)
15429 + {
15430 + /* TODO : Handle 11n */
15431 + if (pBssInfo->frequency < 3000)
15432 + {
15433 + /* 2.4GHz */
15434 + if (pBssInfo->EnableHT == 1)
15435 + zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 1, pBssInfo->SG40);
15436 + else
15437 + zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 1, pBssInfo->SG40);
15438 + }
15439 + else
15440 + {
15441 + /* 5GHz */
15442 + if (pBssInfo->EnableHT == 1)
15443 + zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 0, pBssInfo->SG40);
15444 + else
15445 + zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 0, pBssInfo->SG40);
15446 + }
15447 + }
15448 + else
15449 + {
15450 + /* TODO : Handle 11n */
15451 + if (pBssInfo->frequency < 3000)
15452 + {
15453 + /* 2.4GHz */
15454 + if (pBssInfo->EnableHT == 1)
15455 + zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 1, pBssInfo->SG40);
15456 + else
15457 + zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 0, 1, pBssInfo->SG40);
15458 + }
15459 + else
15460 + {
15461 + /* 5GHz */
15462 + if (pBssInfo->EnableHT == 1)
15463 + zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 0, pBssInfo->SG40);
15464 + else
15465 + zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 0, pBssInfo->SG40);
15466 + }
15467 + }
15468 +
15469 +
15470 + zfStaInitCommonOppositeInfo(dev, i);
15471 +zlReturn:
15472 + return 0;
15473 +}
15474 +
15475 +int zfStaSetOppositeInfoFromRxBuf(zdev_t* dev, zbuf_t* buf)
15476 +{
15477 + int i;
15478 + u8_t* dst;
15479 + u16_t sa[3];
15480 + int res = 0;
15481 + u16_t offset;
15482 + u8_t bSupportExtRate;
15483 + u32_t rtsctsRate = 0xffffffff; /* CTS:OFDM 6M, RTS:OFDM 6M */
15484 + u32_t oneTxStreamCap;
15485 +
15486 + zmw_get_wlan_dev(dev);
15487 + zmw_declare_for_critical_section();
15488 +
15489 + sa[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET);
15490 + sa[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+2);
15491 + sa[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+4);
15492 +
15493 + zmw_enter_critical_section(dev);
15494 +
15495 + res = zfStaFindFreeOpposite(dev, sa, &i);
15496 + if ( res != 0 )
15497 + {
15498 + goto zlReturn;
15499 + }
15500 +
15501 + dst = wd->sta.oppositeInfo[i].macAddr;
15502 + zfCopyFromRxBuffer(dev, buf, dst, ZM_WLAN_HEADER_A2_OFFSET, 6);
15503 +
15504 + if ( (wd->sta.currentFrequency < 3000) && !(wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) )
15505 + {
15506 + bSupportExtRate = 0;
15507 + } else {
15508 + bSupportExtRate = 1;
15509 + }
15510 +
15511 + if ( (bSupportExtRate == 1)
15512 + && (wd->sta.currentFrequency < 3000)
15513 + && (wd->wlanMode == ZM_MODE_IBSS)
15514 + && (wd->wfc.bIbssGMode == 0) )
15515 + {
15516 + bSupportExtRate = 0;
15517 + }
15518 +
15519 + wd->sta.connection_11b = 0;
15520 + oneTxStreamCap = (zfHpCapability(dev) & ZM_HP_CAP_11N_ONE_TX_STREAM);
15521 +
15522 + if ( ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_RATE)) != 0xffff)
15523 + && (bSupportExtRate == 1) )
15524 + {
15525 + /* TODO : Handle 11n */
15526 + if (wd->sta.currentFrequency < 3000)
15527 + {
15528 + /* 2.4GHz */
15529 + if (wd->sta.EnableHT == 1)
15530 + {
15531 + //11ng
15532 + zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 1, wd->sta.SG40);
15533 + }
15534 + else
15535 + {
15536 + //11g
15537 + zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 1, wd->sta.SG40);
15538 + }
15539 + rtsctsRate = 0x00001bb; /* CTS:CCK 1M, RTS:OFDM 6M */
15540 + }
15541 + else
15542 + {
15543 + /* 5GHz */
15544 + if (wd->sta.EnableHT == 1)
15545 + {
15546 + //11na
15547 + zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 0, wd->sta.SG40);
15548 + }
15549 + else
15550 + {
15551 + //11a
15552 + zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 0, wd->sta.SG40);
15553 + }
15554 + rtsctsRate = 0x10b01bb; /* CTS:OFDM 6M, RTS:OFDM 6M */
15555 + }
15556 + }
15557 + else
15558 + {
15559 + /* TODO : Handle 11n */
15560 + if (wd->sta.currentFrequency < 3000)
15561 + {
15562 + /* 2.4GHz */
15563 + if (wd->sta.EnableHT == 1)
15564 + {
15565 + //11ng
15566 + zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 1, wd->sta.SG40);
15567 + rtsctsRate = 0x00001bb; /* CTS:CCK 1M, RTS:OFDM 6M */
15568 + }
15569 + else
15570 + {
15571 + //11b
15572 + zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 0, 1, wd->sta.SG40);
15573 + rtsctsRate = 0x0; /* CTS:CCK 1M, RTS:CCK 1M */
15574 + wd->sta.connection_11b = 1;
15575 + }
15576 + }
15577 + else
15578 + {
15579 + /* 5GHz */
15580 + if (wd->sta.EnableHT == 1)
15581 + {
15582 + //11na
15583 + zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 0, wd->sta.SG40);
15584 + }
15585 + else
15586 + {
15587 + //11a
15588 + zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 0, wd->sta.SG40);
15589 + }
15590 + rtsctsRate = 0x10b01bb; /* CTS:OFDM 6M, RTS:OFDM 6M */
15591 + }
15592 + }
15593 +
15594 + zfStaInitCommonOppositeInfo(dev, i);
15595 +
15596 +zlReturn:
15597 + zmw_leave_critical_section(dev);
15598 +
15599 + if (rtsctsRate != 0xffffffff)
15600 + {
15601 + zfHpSetRTSCTSRate(dev, rtsctsRate);
15602 + }
15603 + return res;
15604 +}
15605 +
15606 +void zfStaProtErpMonitor(zdev_t* dev, zbuf_t* buf)
15607 +{
15608 + u16_t offset;
15609 + u8_t erp;
15610 + u8_t bssid[6];
15611 +
15612 + zmw_get_wlan_dev(dev);
15613 +
15614 + if ( (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)&&(zfStaIsConnected(dev)) )
15615 + {
15616 + ZM_MAC_WORD_TO_BYTE(wd->sta.bssid, bssid);
15617 +
15618 + if (zfRxBufferEqualToStr(dev, buf, bssid, ZM_WLAN_HEADER_A2_OFFSET, 6))
15619 + {
15620 + if ( (offset=zfFindElement(dev, buf, ZM_WLAN_EID_ERP)) != 0xffff )
15621 + {
15622 + erp = zmw_rx_buf_readb(dev, buf, offset+2);
15623 +
15624 + if ( erp & ZM_BIT_1 )
15625 + {
15626 + //zm_debug_msg0("protection mode on");
15627 + if (wd->sta.bProtectionMode == FALSE)
15628 + {
15629 + wd->sta.bProtectionMode = TRUE;
15630 + zfHpSetSlotTime(dev, 0);
15631 + }
15632 + }
15633 + else
15634 + {
15635 + //zm_debug_msg0("protection mode off");
15636 + if (wd->sta.bProtectionMode == TRUE)
15637 + {
15638 + wd->sta.bProtectionMode = FALSE;
15639 + zfHpSetSlotTime(dev, 1);
15640 + }
15641 + }
15642 + }
15643 + }
15644 + //Check the existence of Non-N AP
15645 + //Follow the check the "pBssInfo->EnableHT"
15646 + if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_HT_CAPABILITY)) != 0xffff)
15647 + {}
15648 + else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTCAPABILITY)) != 0xffff)
15649 + {}
15650 + else
15651 + {wd->sta.NonNAPcount++;}
15652 + }
15653 +}
15654 +
15655 +void zfStaUpdateWmeParameter(zdev_t* dev, zbuf_t* buf)
15656 +{
15657 + u16_t tmp;
15658 + u16_t aifs[5];
15659 + u16_t cwmin[5];
15660 + u16_t cwmax[5];
15661 + u16_t txop[5];
15662 + u8_t acm;
15663 + u8_t ac;
15664 + u16_t len;
15665 + u16_t i;
15666 + u16_t offset;
15667 + u8_t rxWmeParameterSetCount;
15668 +
15669 + zmw_get_wlan_dev(dev);
15670 +
15671 + /* Update if WME parameter set count is changed */
15672 + /* If connect to WME AP */
15673 + if (wd->sta.wmeConnected != 0)
15674 + {
15675 + /* Find WME parameter element */
15676 + if ((offset = zfFindWifiElement(dev, buf, 2, 1)) != 0xffff)
15677 + {
15678 + if ((len = zmw_rx_buf_readb(dev, buf, offset+1)) >= 7)
15679 + {
15680 + rxWmeParameterSetCount=zmw_rx_buf_readb(dev, buf, offset+8);
15681 + if (rxWmeParameterSetCount != wd->sta.wmeParameterSetCount)
15682 + {
15683 + zm_msg0_mm(ZM_LV_0, "wmeParameterSetCount changed!");
15684 + wd->sta.wmeParameterSetCount = rxWmeParameterSetCount;
15685 + /* retrieve WME parameter and update TxQ parameters */
15686 + acm = 0xf;
15687 + for (i=0; i<4; i++)
15688 + {
15689 + if (len >= (8+(i*4)+4))
15690 + {
15691 + tmp=zmw_rx_buf_readb(dev, buf, offset+10+i*4);
15692 + ac = (tmp >> 5) & 0x3;
15693 + if ((tmp & 0x10) == 0)
15694 + {
15695 + acm &= (~(1<<ac));
15696 + }
15697 + aifs[ac] = ((tmp & 0xf) * 9) + 10;
15698 + tmp=zmw_rx_buf_readb(dev, buf, offset+11+i*4);
15699 + /* Convert to 2^n */
15700 + cwmin[ac] = zcCwTlb[(tmp & 0xf)];
15701 + cwmax[ac] = zcCwTlb[(tmp >> 4)];
15702 + txop[ac]=zmw_rx_buf_readh(dev, buf,
15703 + offset+12+i*4);
15704 + }
15705 + }
15706 +
15707 + if ((acm & 0x4) != 0)
15708 + {
15709 + cwmin[2] = cwmin[0];
15710 + cwmax[2] = cwmax[0];
15711 + aifs[2] = aifs[0];
15712 + txop[2] = txop[0];
15713 + }
15714 + if ((acm & 0x8) != 0)
15715 + {
15716 + cwmin[3] = cwmin[2];
15717 + cwmax[3] = cwmax[2];
15718 + aifs[3] = aifs[2];
15719 + txop[3] = txop[2];
15720 + }
15721 + cwmin[4] = 3;
15722 + cwmax[4] = 7;
15723 + aifs[4] = 28;
15724 +
15725 + if ((cwmin[2]+aifs[2]) > ((cwmin[0]+aifs[0])+1))
15726 + {
15727 + wd->sta.ac0PriorityHigherThanAc2 = 1;
15728 + }
15729 + else
15730 + {
15731 + wd->sta.ac0PriorityHigherThanAc2 = 0;
15732 + }
15733 + zfHpUpdateQosParameter(dev, cwmin, cwmax, aifs, txop);
15734 + }
15735 + }
15736 + }
15737 + } //if (wd->sta.wmeConnected != 0)
15738 +}
15739 +/* process 802.11h Dynamic Frequency Selection */
15740 +void zfStaUpdateDot11HDFS(zdev_t* dev, zbuf_t* buf)
15741 +{
15742 + zmw_get_wlan_dev(dev);
15743 +
15744 + /*
15745 + Channel Switch Announcement Element Format
15746 + +------+----------+------+-------------------+------------------+--------------------+
15747 + |Format|Element ID|Length|Channel Switch Mode|New Channel Number|Channel Switch Count|
15748 + +------+----------+------+-------------------+------------------+--------------------+
15749 + |Bytes | 1 | 1 | 1 | 1 | 1 |
15750 + +------+----------+------+-------------------+------------------+--------------------+
15751 + |Value | 37 | 3 | 0 or 1 |unsigned integer |unsigned integer |
15752 + +------+----------+------+-------------------+------------------+--------------------+
15753 + */
15754 + //u8_t length, channel, is5G;
15755 + u16_t offset;
15756 +
15757 + /* get EID(Channel Switch Announcement) */
15758 + if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_CHANNEL_SWITCH_ANNOUNCE)) == 0xffff )
15759 + {
15760 + //zm_debug_msg0("EID(Channel Switch Announcement) not found");
15761 + return;
15762 + }
15763 + else if ( zmw_rx_buf_readb(dev, buf, offset+1) == 0x3 )
15764 + {
15765 + zm_debug_msg0("EID(Channel Switch Announcement) found");
15766 +
15767 + //length = zmw_rx_buf_readb(dev, buf, offset+1);
15768 + //zfCopyFromRxBuffer(dev, buf, pBssInfo->supportedRates, offset, length+2);
15769 +
15770 + //Chanell Switch Mode set to 1, driver should disable transmit immediate
15771 + //we do this by poll CCA high
15772 + if (zmw_rx_buf_readb(dev, buf, offset+2) == 0x1 )
15773 + {
15774 + //use ZM_OID_INTERNAL_WRITE,ZM_CMD_RESET to notice firmware flush quene and stop dma,
15775 + //then restart rx dma but not tx dma
15776 + if (wd->sta.DFSDisableTx != TRUE)
15777 + {
15778 + /* TODO : zfHpResetTxRx would cause Rx hang */
15779 + //zfHpResetTxRx(dev);
15780 + wd->sta.DFSDisableTx = TRUE;
15781 + /* Trgger Rx DMA */
15782 + zfHpStartRecv(dev);
15783 + }
15784 + //Adapter->ZD80211HSetting.DisableTxBy80211H=TRUE;
15785 + //AcquireCtrOfPhyReg(Adapter);
15786 + //ZD1205_WRITE_REGISTER(Adapter,CR24, 0x0);
15787 + //ReleaseDoNotSleep(Adapter);
15788 + }
15789 +
15790 + if (zmw_rx_buf_readb(dev, buf, offset+4) <= 0x2 )
15791 + {
15792 + //Channel Switch
15793 + //if Channel Switch Count = 0 , STA should change channel immediately.
15794 + //if Channel Switch Count > 0 , STA should change channel after TBTT*count
15795 + //But it won't be accurate to let driver calculate TBTT*count, and the value of
15796 + //Channel Switch Count will decrease by one each when continue receving beacon
15797 + //So we change channel here when we receive count <=2.
15798 +
15799 + zfHpDeleteAllowChannel(dev, wd->sta.currentFrequency);
15800 + wd->frequency = zfChNumToFreq(dev, zmw_rx_buf_readb(dev, buf, offset+3), 0);
15801 + //zfHpAddAllowChannel(dev, wd->frequency);
15802 + zm_debug_msg1("CWY - jump to frequency = ", wd->frequency);
15803 + zfCoreSetFrequency(dev, wd->frequency);
15804 + wd->sta.DFSDisableTx = FALSE;
15805 + /* Increase rxBeaconCount to prevent beacon lost */
15806 + if (zfStaIsConnected(dev))
15807 + {
15808 + wd->sta.rxBeaconCount = 1 << 6; // 2 times of check would pass
15809 + }
15810 + //start tx dma to transmit packet
15811 +
15812 + //if (zmw_rx_buf_readb(dev, buf, offset+3) != wd->frequency)
15813 + //{
15814 + // //ZDDbgPrint(("Radar Detect by AP\n"));
15815 + // zfCoreSetFrequency();
15816 + // ProcessRadarDetectEvent(Adapter);
15817 + // Set_RF_Channel(Adapter, SwRfd->Rfd->RxBuffer[index+3], (UCHAR)Adapter->RF_Mode, 1);
15818 + // Adapter->CardSetting.Channel = SwRfd->Rfd->RxBuffer[index+3];
15819 + // Adapter->SaveChannel = Adapter->CardSetting.Channel;
15820 + // Adapter->UtilityChannel = Adapter->CardSetting.Channel;
15821 + //}
15822 + }
15823 + }
15824 +
15825 +}
15826 +/* TODO : process 802.11h Transmission Power Control */
15827 +void zfStaUpdateDot11HTPC(zdev_t* dev, zbuf_t* buf)
15828 +{
15829 +}
15830 +
15831 +/* IBSS power-saving mode */
15832 +void zfStaIbssPSCheckState(zdev_t* dev, zbuf_t* buf)
15833 +{
15834 + u8_t i, frameCtrl;
15835 +
15836 + zmw_get_wlan_dev(dev);
15837 +
15838 + if ( !zfStaIsConnected(dev) )
15839 + {
15840 + return;
15841 + }
15842 +
15843 + if ( wd->wlanMode != ZM_MODE_IBSS )
15844 + {
15845 + return ;
15846 + }
15847 +
15848 + /* check BSSID */
15849 + if ( !zfRxBufferEqualToStr(dev, buf, (u8_t*) wd->sta.bssid,
15850 + ZM_WLAN_HEADER_A3_OFFSET, 6) )
15851 + {
15852 + return;
15853 + }
15854 +
15855 + frameCtrl = zmw_rx_buf_readb(dev, buf, 1);
15856 +
15857 + /* check power management bit */
15858 + if ( frameCtrl & ZM_BIT_4 )
15859 + {
15860 + for(i=1; i<ZM_MAX_PS_STA; i++)
15861 + {
15862 + if ( !wd->sta.staPSList.entity[i].bUsed )
15863 + {
15864 + continue;
15865 + }
15866 +
15867 + /* check source address */
15868 + if ( zfRxBufferEqualToStr(dev, buf,
15869 + wd->sta.staPSList.entity[i].macAddr,
15870 + ZM_WLAN_HEADER_A2_OFFSET, 6) )
15871 + {
15872 + return;
15873 + }
15874 + }
15875 +
15876 + for(i=1; i<ZM_MAX_PS_STA; i++)
15877 + {
15878 + if ( !wd->sta.staPSList.entity[i].bUsed )
15879 + {
15880 + wd->sta.staPSList.entity[i].bUsed = TRUE;
15881 + wd->sta.staPSList.entity[i].bDataQueued = FALSE;
15882 + break;
15883 + }
15884 + }
15885 +
15886 + if ( i == ZM_MAX_PS_STA )
15887 + {
15888 + /* STA list is full */
15889 + return;
15890 + }
15891 +
15892 + zfCopyFromRxBuffer(dev, buf, wd->sta.staPSList.entity[i].macAddr,
15893 + ZM_WLAN_HEADER_A2_OFFSET, 6);
15894 +
15895 + if ( wd->sta.staPSList.count == 0 )
15896 + {
15897 + // enable ATIM window
15898 + //zfEnableAtimWindow(dev);
15899 + }
15900 +
15901 + wd->sta.staPSList.count++;
15902 + }
15903 + else if ( wd->sta.staPSList.count )
15904 + {
15905 + for(i=1; i<ZM_MAX_PS_STA; i++)
15906 + {
15907 + if ( wd->sta.staPSList.entity[i].bUsed )
15908 + {
15909 + if ( zfRxBufferEqualToStr(dev, buf,
15910 + wd->sta.staPSList.entity[i].macAddr,
15911 + ZM_WLAN_HEADER_A2_OFFSET, 6) )
15912 + {
15913 + wd->sta.staPSList.entity[i].bUsed = FALSE;
15914 + wd->sta.staPSList.count--;
15915 +
15916 + if ( wd->sta.staPSList.entity[i].bDataQueued )
15917 + {
15918 + /* send queued data */
15919 + }
15920 + }
15921 + }
15922 + }
15923 +
15924 + if ( wd->sta.staPSList.count == 0 )
15925 + {
15926 + /* disable ATIM window */
15927 + //zfDisableAtimWindow(dev);
15928 + }
15929 +
15930 + }
15931 +}
15932 +
15933 +/* IBSS power-saving mode */
15934 +u8_t zfStaIbssPSQueueData(zdev_t* dev, zbuf_t* buf)
15935 +{
15936 + u8_t i;
15937 + u16_t da[3];
15938 +
15939 + zmw_get_wlan_dev(dev);
15940 +
15941 + if ( !zfStaIsConnected(dev) )
15942 + {
15943 + return 0;
15944 + }
15945 +
15946 + if ( wd->wlanMode != ZM_MODE_IBSS )
15947 + {
15948 + return 0;
15949 + }
15950 +
15951 + if ( wd->sta.staPSList.count == 0 && wd->sta.powerSaveMode <= ZM_STA_PS_NONE )
15952 + {
15953 + return 0;
15954 + }
15955 +
15956 + /* DA */
15957 +#ifdef ZM_ENABLE_NATIVE_WIFI
15958 + da[0] = zmw_tx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET);
15959 + da[1] = zmw_tx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET + 2);
15960 + da[2] = zmw_tx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET + 4);
15961 +#else
15962 + da[0] = zmw_tx_buf_readh(dev, buf, 0);
15963 + da[1] = zmw_tx_buf_readh(dev, buf, 2);
15964 + da[2] = zmw_tx_buf_readh(dev, buf, 4);
15965 +#endif
15966 +
15967 + if ( ZM_IS_MULTICAST_OR_BROADCAST(da) )
15968 + {
15969 + wd->sta.staPSList.entity[0].bDataQueued = TRUE;
15970 + wd->sta.ibssPSDataQueue[wd->sta.ibssPSDataCount++] = buf;
15971 + return 1;
15972 + }
15973 +
15974 + // Unicast packet...
15975 +
15976 + for(i=1; i<ZM_MAX_PS_STA; i++)
15977 + {
15978 + if ( zfMemoryIsEqual(wd->sta.staPSList.entity[i].macAddr,
15979 + (u8_t*) da, 6) )
15980 + {
15981 + wd->sta.staPSList.entity[i].bDataQueued = TRUE;
15982 + wd->sta.ibssPSDataQueue[wd->sta.ibssPSDataCount++] = buf;
15983 +
15984 + return 1;
15985 + }
15986 + }
15987 +
15988 +#if 0
15989 + if ( wd->sta.powerSaveMode > ZM_STA_PS_NONE )
15990 + {
15991 + wd->sta.staPSDataQueue[wd->sta.staPSDataCount++] = buf;
15992 +
15993 + return 1;
15994 + }
15995 +#endif
15996 +
15997 + return 0;
15998 +}
15999 +
16000 +/* IBSS power-saving mode */
16001 +void zfStaIbssPSSend(zdev_t* dev)
16002 +{
16003 + u8_t i;
16004 + u16_t bcastAddr[3] = {0xffff, 0xffff, 0xffff};
16005 +
16006 + zmw_get_wlan_dev(dev);
16007 +
16008 + if ( !zfStaIsConnected(dev) )
16009 + {
16010 + return ;
16011 + }
16012 +
16013 + if ( wd->wlanMode != ZM_MODE_IBSS )
16014 + {
16015 + return ;
16016 + }
16017 +
16018 + for(i=0; i<ZM_MAX_PS_STA; i++)
16019 + {
16020 + if ( wd->sta.staPSList.entity[i].bDataQueued )
16021 + {
16022 + if ( i == 0 )
16023 + {
16024 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_ATIM,
16025 + bcastAddr,
16026 + 0, 0, 0);
16027 + }
16028 + else if ( wd->sta.staPSList.entity[i].bUsed )
16029 + {
16030 + // Send ATIM to prevent the peer to go to sleep
16031 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_ATIM,
16032 + (u16_t*) wd->sta.staPSList.entity[i].macAddr,
16033 + 0, 0, 0);
16034 + }
16035 +
16036 + wd->sta.staPSList.entity[i].bDataQueued = FALSE;
16037 + }
16038 + }
16039 +
16040 + for(i=0; i<wd->sta.ibssPSDataCount; i++)
16041 + {
16042 + zfTxSendEth(dev, wd->sta.ibssPSDataQueue[i], 0,
16043 + ZM_EXTERNAL_ALLOC_BUF, 0);
16044 + }
16045 +
16046 + wd->sta.ibssPrevPSDataCount = wd->sta.ibssPSDataCount;
16047 + wd->sta.ibssPSDataCount = 0;
16048 +}
16049 +
16050 +
16051 +void zfStaReconnect(zdev_t* dev)
16052 +{
16053 + zmw_get_wlan_dev(dev);
16054 + zmw_declare_for_critical_section();
16055 +
16056 + if ( wd->wlanMode != ZM_MODE_INFRASTRUCTURE &&
16057 + wd->wlanMode != ZM_MODE_IBSS )
16058 + {
16059 + return;
16060 + }
16061 +
16062 + if ( (zfStaIsConnected(dev))||(zfStaIsConnecting(dev)) )
16063 + {
16064 + return;
16065 + }
16066 +
16067 + if ( wd->sta.bChannelScan )
16068 + {
16069 + return;
16070 + }
16071 +
16072 + /* Recover zero SSID length */
16073 + if ( (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) && (wd->ws.ssidLen == 0))
16074 + {
16075 + zm_debug_msg0("zfStaReconnect: NOT Support!! Set SSID to any BSS");
16076 + /* ANY BSS */
16077 + zmw_enter_critical_section(dev);
16078 + wd->sta.ssid[0] = 0;
16079 + wd->sta.ssidLen = 0;
16080 + zmw_leave_critical_section(dev);
16081 + }
16082 +
16083 + // RAY: To ensure no TX pending before re-connecting
16084 + zfFlushVtxq(dev);
16085 + zfWlanEnable(dev);
16086 + zfScanMgrScanAck(dev);
16087 +}
16088 +
16089 +void zfStaTimer100ms(zdev_t* dev)
16090 +{
16091 + zmw_get_wlan_dev(dev);
16092 +
16093 + if ( (wd->tick % 10) == 0 )
16094 + {
16095 + zfPushVtxq(dev);
16096 +// zfPowerSavingMgrMain(dev);
16097 + }
16098 +}
16099 +
16100 +
16101 +void zfStaCheckRxBeacon(zdev_t* dev)
16102 +{
16103 + zmw_get_wlan_dev(dev);
16104 +
16105 + if (( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) && (zfStaIsConnected(dev)))
16106 + {
16107 + if (wd->beaconInterval == 0)
16108 + {
16109 + wd->beaconInterval = 100;
16110 + }
16111 + if ( (wd->tick % ((wd->beaconInterval * 10) / ZM_MS_PER_TICK)) == 0 )
16112 + {
16113 + /* Check rxBeaconCount */
16114 + if (wd->sta.rxBeaconCount == 0)
16115 + {
16116 + if (wd->sta.beaconMissState == 1)
16117 + {
16118 + /*notify AP that we left*/
16119 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, wd->sta.bssid, 3, 0, 0);
16120 + /* Beacon Lost */
16121 + zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_BEACON_MISS,
16122 + wd->sta.bssid, 0);
16123 + }
16124 + else
16125 + {
16126 + wd->sta.beaconMissState = 1;
16127 + /* Reset channel */
16128 + zfCoreSetFrequencyExV2(dev, wd->frequency, wd->BandWidth40,
16129 + wd->ExtOffset, NULL, 1);
16130 + }
16131 + }
16132 + else
16133 + {
16134 + wd->sta.beaconMissState = 0;
16135 + }
16136 + wd->sta.rxBeaconCount = 0;
16137 + }
16138 + }
16139 +}
16140 +
16141 +
16142 +
16143 +void zfStaCheckConnectTimeout(zdev_t* dev)
16144 +{
16145 + zmw_get_wlan_dev(dev);
16146 + zmw_declare_for_critical_section();
16147 +
16148 + if ( wd->wlanMode != ZM_MODE_INFRASTRUCTURE )
16149 + {
16150 + return;
16151 + }
16152 +
16153 + if ( !zfStaIsConnecting(dev) )
16154 + {
16155 + return;
16156 + }
16157 +
16158 + zmw_enter_critical_section(dev);
16159 + if ( (wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_OPEN)||
16160 + (wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_SHARE_1)||
16161 + (wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_SHARE_2)||
16162 + (wd->sta.connectState == ZM_STA_CONN_STATE_ASSOCIATE) )
16163 + {
16164 + if ( (wd->tick - wd->sta.connectTimer) > ZM_INTERVAL_CONNECT_TIMEOUT )
16165 + {
16166 + if ( wd->sta.connectByReasso )
16167 + {
16168 + wd->sta.failCntOfReasso++;
16169 + if ( wd->sta.failCntOfReasso > 2 )
16170 + {
16171 + wd->sta.connectByReasso = FALSE;
16172 + }
16173 + }
16174 +
16175 + wd->sta.connectState = ZM_STA_CONN_STATE_NONE;
16176 + zm_debug_msg1("connect timeout, state = ", wd->sta.connectState);
16177 + //zfiWlanDisable(dev);
16178 + goto failed;
16179 + }
16180 + }
16181 +
16182 + zmw_leave_critical_section(dev);
16183 + return;
16184 +
16185 +failed:
16186 + zmw_leave_critical_section(dev);
16187 + if(wd->sta.authMode == ZM_AUTH_MODE_AUTO)
16188 + { // Fix some AP not send authentication failed message to sta and lead to connect timeout !
16189 + wd->sta.connectTimeoutCount++;
16190 + }
16191 + zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_TIMEOUT, wd->sta.bssid, 2);
16192 + return;
16193 +}
16194 +
16195 +void zfMmStaTimeTick(zdev_t* dev)
16196 +{
16197 + zmw_get_wlan_dev(dev);
16198 +
16199 + /* airopeek */
16200 + if (wd->wlanMode != ZM_MODE_AP && !wd->swSniffer)
16201 + {
16202 + if ( wd->tick & 1 )
16203 + {
16204 + zfTimerCheckAndHandle(dev);
16205 + }
16206 +
16207 + zfStaCheckRxBeacon(dev);
16208 + zfStaTimer100ms(dev);
16209 + zfStaCheckConnectTimeout(dev);
16210 + zfPowerSavingMgrMain(dev);
16211 + }
16212 +
16213 +#ifdef ZM_ENABLE_AGGREGATION
16214 + /*
16215 + * add by honda
16216 + */
16217 + zfAggScanAndClear(dev, wd->tick);
16218 +#endif
16219 +}
16220 +
16221 +void zfStaSendBeacon(zdev_t* dev)
16222 +{
16223 + zbuf_t* buf;
16224 + u16_t offset, seq;
16225 +
16226 + zmw_get_wlan_dev(dev);
16227 +
16228 + zmw_declare_for_critical_section();
16229 +
16230 + //zm_debug_msg0("\n");
16231 +
16232 + /* TBD : Maximum size of beacon */
16233 + if ((buf = zfwBufAllocate(dev, 1024)) == NULL)
16234 + {
16235 + zm_debug_msg0("Allocate beacon buffer failed");
16236 + return;
16237 + }
16238 +
16239 + offset = 0;
16240 + /* wlan header */
16241 + /* Frame control */
16242 + zmw_tx_buf_writeh(dev, buf, offset, 0x0080);
16243 + offset+=2;
16244 + /* Duration */
16245 + zmw_tx_buf_writeh(dev, buf, offset, 0x0000);
16246 + offset+=2;
16247 + /* Address 1 */
16248 + zmw_tx_buf_writeh(dev, buf, offset, 0xffff);
16249 + offset+=2;
16250 + zmw_tx_buf_writeh(dev, buf, offset, 0xffff);
16251 + offset+=2;
16252 + zmw_tx_buf_writeh(dev, buf, offset, 0xffff);
16253 + offset+=2;
16254 + /* Address 2 */
16255 + zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[0]);
16256 + offset+=2;
16257 + zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[1]);
16258 + offset+=2;
16259 + zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[2]);
16260 + offset+=2;
16261 + /* Address 3 */
16262 + zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[0]);
16263 + offset+=2;
16264 + zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[1]);
16265 + offset+=2;
16266 + zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[2]);
16267 + offset+=2;
16268 +
16269 + /* Sequence number */
16270 + zmw_enter_critical_section(dev);
16271 + seq = ((wd->mmseq++)<<4);
16272 + zmw_leave_critical_section(dev);
16273 + zmw_tx_buf_writeh(dev, buf, offset, seq);
16274 + offset+=2;
16275 +
16276 + /* 24-31 Time Stamp : hardware will fill this field */
16277 + offset+=8;
16278 +
16279 + /* Beacon Interval */
16280 + zmw_tx_buf_writeh(dev, buf, offset, wd->beaconInterval);
16281 + offset+=2;
16282 +
16283 + /* Capability */
16284 + zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[0]);
16285 + zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[1]);
16286 +
16287 + /* SSID */
16288 + offset = zfStaAddIeSsid(dev, buf, offset);
16289 +
16290 + if(wd->frequency <= ZM_CH_G_14) // 2.4 GHz b+g
16291 + {
16292 +
16293 + /* Support Rate */
16294 + offset = zfMmAddIeSupportRate(dev, buf, offset,
16295 + ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_CCK);
16296 +
16297 + /* DS parameter set */
16298 + offset = zfMmAddIeDs(dev, buf, offset);
16299 +
16300 + offset = zfStaAddIeIbss(dev, buf, offset);
16301 +
16302 + if( wd->wfc.bIbssGMode
16303 + && (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) ) // Only accompany with enabling a mode .
16304 + {
16305 + /* ERP Information */
16306 + wd->erpElement = 0;
16307 + offset = zfMmAddIeErp(dev, buf, offset);
16308 + }
16309 +
16310 + /* TODO : country information */
16311 + /* RSN */
16312 + if ( wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK )
16313 + {
16314 + offset = zfwStaAddIeWpaRsn(dev, buf, offset, ZM_WLAN_FRAME_TYPE_AUTH);
16315 + }
16316 +
16317 + if( wd->wfc.bIbssGMode
16318 + && (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) ) // Only accompany with enabling a mode .
16319 + {
16320 + /* Enable G Mode */
16321 + /* Extended Supported Rates */
16322 + offset = zfMmAddIeSupportRate(dev, buf, offset,
16323 + ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
16324 + }
16325 + }
16326 + else // 5GHz a
16327 + {
16328 + /* Support Rate a Mode */
16329 + offset = zfMmAddIeSupportRate(dev, buf, offset,
16330 + ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_OFDM);
16331 +
16332 + /* DS parameter set */
16333 + offset = zfMmAddIeDs(dev, buf, offset);
16334 +
16335 + offset = zfStaAddIeIbss(dev, buf, offset);
16336 +
16337 + /* TODO : country information */
16338 + /* RSN */
16339 + if ( wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK )
16340 + {
16341 + offset = zfwStaAddIeWpaRsn(dev, buf, offset, ZM_WLAN_FRAME_TYPE_AUTH);
16342 + }
16343 + }
16344 +
16345 + if ( wd->wlanMode != ZM_MODE_IBSS )
16346 + {
16347 + /* TODO : Need to check if it is ok */
16348 + /* HT Capabilities Info */
16349 + offset = zfMmAddHTCapability(dev, buf, offset);
16350 +
16351 + /* Extended HT Capabilities Info */
16352 + offset = zfMmAddExtendedHTCapability(dev, buf, offset);
16353 + }
16354 +
16355 + if ( wd->sta.ibssAdditionalIESize )
16356 + offset = zfStaAddIbssAdditionalIE(dev, buf, offset);
16357 +
16358 + /* 1212 : write to beacon fifo */
16359 + /* 1221 : write to share memory */
16360 + zfHpSendBeacon(dev, buf, offset);
16361 +
16362 + /* Free beacon buffer */
16363 + //zfwBufFree(dev, buf, 0);
16364 +}
16365 +
16366 +void zfStaSignalStatistic(zdev_t* dev, u8_t SignalStrength, u8_t SignalQuality) //CWYang(+)
16367 +{
16368 + zmw_get_wlan_dev(dev);
16369 +
16370 + /* Add Your Code to Do Works Like Moving Average Here */
16371 + wd->SignalStrength = (wd->SignalStrength * 7 + SignalStrength * 3)/10;
16372 + wd->SignalQuality = (wd->SignalQuality * 7 + SignalQuality * 3)/10;
16373 +
16374 +}
16375 +
16376 +struct zsBssInfo* zfStaFindBssInfo(zdev_t* dev, zbuf_t* buf, struct zsWlanProbeRspFrameHeader *pProbeRspHeader)
16377 +{
16378 + u8_t i;
16379 + u8_t j;
16380 + u8_t k;
16381 + u8_t isMatched, length, channel;
16382 + u16_t offset, frequency;
16383 + struct zsBssInfo* pBssInfo;
16384 +
16385 + zmw_get_wlan_dev(dev);
16386 +
16387 + if ((pBssInfo = wd->sta.bssList.head) == NULL)
16388 + {
16389 + return NULL;
16390 + }
16391 +
16392 + for( i=0; i<wd->sta.bssList.bssCount; i++ )
16393 + {
16394 + //zm_debug_msg2("check pBssInfo = ", pBssInfo);
16395 +
16396 + /* Check BSSID */
16397 + for( j=0; j<6; j++ )
16398 + {
16399 + if ( pBssInfo->bssid[j] != pProbeRspHeader->bssid[j] )
16400 + {
16401 + break;
16402 + }
16403 + }
16404 +
16405 + /* Check SSID */
16406 + if (j == 6)
16407 + {
16408 + if (pProbeRspHeader->ssid[1] <= 32)
16409 + {
16410 + /* compare length and ssid */
16411 + isMatched = 1;
16412 + if((pProbeRspHeader->ssid[1] != 0) && (pBssInfo->ssid[1] != 0))
16413 + {
16414 + for( k=1; k<pProbeRspHeader->ssid[1] + 1; k++ )
16415 + {
16416 + if ( pBssInfo->ssid[k] != pProbeRspHeader->ssid[k] )
16417 + {
16418 + isMatched = 0;
16419 + break;
16420 + }
16421 + }
16422 + }
16423 + }
16424 + else
16425 + {
16426 + isMatched = 0;
16427 + }
16428 + }
16429 + else
16430 + {
16431 + isMatched = 0;
16432 + }
16433 +
16434 + /* Check channel */
16435 + /* Add check channel to solve the bug #31222 */
16436 + if (isMatched) {
16437 + if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_DS)) != 0xffff) {
16438 + if ((length = zmw_rx_buf_readb(dev, buf, offset+1)) == 1) {
16439 + channel = zmw_rx_buf_readb(dev, buf, offset+2);
16440 + if (zfHpIsAllowedChannel(dev, zfChNumToFreq(dev, channel, 0)) == 0) {
16441 + frequency = 0;
16442 + } else {
16443 + frequency = zfChNumToFreq(dev, channel, 0);;
16444 + }
16445 + } else {
16446 + frequency = 0;
16447 + }
16448 + } else {
16449 + frequency = wd->sta.currentFrequency;
16450 + }
16451 +
16452 + if (frequency != 0) {
16453 + if ( ((frequency > 3000) && (pBssInfo->frequency > 3000))
16454 + || ((frequency < 3000) && (pBssInfo->frequency < 3000)) ) {
16455 + /* redundant */
16456 + break;
16457 + }
16458 + }
16459 + }
16460 +
16461 + pBssInfo = pBssInfo->next;
16462 + }
16463 +
16464 + if ( i == wd->sta.bssList.bssCount )
16465 + {
16466 + pBssInfo = NULL;
16467 + }
16468 +
16469 + return pBssInfo;
16470 +}
16471 +
16472 +u8_t zfStaInitBssInfo(zdev_t* dev, zbuf_t* buf,
16473 + struct zsWlanProbeRspFrameHeader *pProbeRspHeader,
16474 + struct zsBssInfo* pBssInfo, struct zsAdditionInfo* AddInfo, u8_t type)
16475 +{
16476 + u8_t length, channel, is5G;
16477 + u16_t i, offset;
16478 + u8_t apQosInfo;
16479 + u16_t eachIElength = 0;
16480 + u16_t accumulateLen = 0;
16481 +
16482 + zmw_get_wlan_dev(dev);
16483 +
16484 + if ((type == 1) && ((pBssInfo->flag & ZM_BSS_INFO_VALID_BIT) != 0))
16485 + {
16486 + goto zlUpdateRssi;
16487 + }
16488 +
16489 + /* get SSID */
16490 + if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_SSID)) == 0xffff )
16491 + {
16492 + zm_debug_msg0("EID(SSID) not found");
16493 + goto zlError;
16494 + }
16495 +
16496 + length = zmw_rx_buf_readb(dev, buf, offset+1);
16497 +
16498 + {
16499 + u8_t Show_Flag = 0;
16500 + zfwGetShowZeroLengthSSID(dev, &Show_Flag);
16501 +
16502 + if(Show_Flag)
16503 + {
16504 + if (length > ZM_MAX_SSID_LENGTH )
16505 + {
16506 + zm_debug_msg0("EID(SSID) is invalid");
16507 + goto zlError;
16508 + }
16509 + }
16510 + else
16511 + {
16512 + if ( length == 0 || length > ZM_MAX_SSID_LENGTH )
16513 + {
16514 + zm_debug_msg0("EID(SSID) is invalid");
16515 + goto zlError;
16516 + }
16517 +
16518 + }
16519 + }
16520 + zfCopyFromRxBuffer(dev, buf, pBssInfo->ssid, offset, length+2);
16521 +
16522 + /* get DS parameter */
16523 + if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_DS)) != 0xffff )
16524 + {
16525 + length = zmw_rx_buf_readb(dev, buf, offset+1);
16526 + if ( length != 1 )
16527 + {
16528 + zm_msg0_mm(ZM_LV_0, "Abnormal DS Param Set IE");
16529 + goto zlError;
16530 + }
16531 + channel = zmw_rx_buf_readb(dev, buf, offset+2);
16532 +
16533 + if (zfHpIsAllowedChannel(dev, zfChNumToFreq(dev, channel, 0)) == 0)
16534 + {
16535 + goto zlError2;
16536 + }
16537 +
16538 + pBssInfo->frequency = zfChNumToFreq(dev, channel, 0); // auto check
16539 + pBssInfo->channel = channel;
16540 +
16541 +
16542 + }
16543 + else
16544 + {
16545 + /* DS parameter not found */
16546 + pBssInfo->frequency = wd->sta.currentFrequency;
16547 + pBssInfo->channel = zfChFreqToNum(wd->sta.currentFrequency, &is5G);
16548 + }
16549 +
16550 + /* initialize security type */
16551 + pBssInfo->securityType = ZM_SECURITY_TYPE_NONE;
16552 +
16553 + /* get macaddr */
16554 + for( i=0; i<6; i++ )
16555 + {
16556 + pBssInfo->macaddr[i] = pProbeRspHeader->sa[i];
16557 + }
16558 +
16559 + /* get bssid */
16560 + for( i=0; i<6; i++ )
16561 + {
16562 + pBssInfo->bssid[i] = pProbeRspHeader->bssid[i];
16563 + }
16564 +
16565 + /* get timestamp */
16566 + for( i=0; i<8; i++ )
16567 + {
16568 + pBssInfo->timeStamp[i] = pProbeRspHeader->timeStamp[i];
16569 + }
16570 +
16571 + /* get beacon interval */
16572 + pBssInfo->beaconInterval[0] = pProbeRspHeader->beaconInterval[0];
16573 + pBssInfo->beaconInterval[1] = pProbeRspHeader->beaconInterval[1];
16574 +
16575 + /* get capability */
16576 + pBssInfo->capability[0] = pProbeRspHeader->capability[0];
16577 + pBssInfo->capability[1] = pProbeRspHeader->capability[1];
16578 +
16579 + /* Copy frame body */
16580 + offset = 36; // Copy from the start of variable IE
16581 + pBssInfo->frameBodysize = zfwBufGetSize(dev, buf)-offset;
16582 + if (pBssInfo->frameBodysize > (ZM_MAX_PROBE_FRAME_BODY_SIZE-1))
16583 + {
16584 + pBssInfo->frameBodysize = ZM_MAX_PROBE_FRAME_BODY_SIZE-1;
16585 + }
16586 + accumulateLen = 0;
16587 + do
16588 + {
16589 + eachIElength = zmw_rx_buf_readb(dev, buf, offset + accumulateLen+1) + 2; //Len+(EID+Data)
16590 +
16591 + if ( (eachIElength >= 2)
16592 + && ((accumulateLen + eachIElength) <= pBssInfo->frameBodysize) )
16593 + {
16594 + zfCopyFromRxBuffer(dev, buf, pBssInfo->frameBody+accumulateLen, offset+accumulateLen, eachIElength);
16595 + accumulateLen+=(u16_t)eachIElength;
16596 + }
16597 + else
16598 + {
16599 + zm_msg0_mm(ZM_LV_1, "probersp frameBodysize abnormal");
16600 + break;
16601 + }
16602 + }
16603 + while(accumulateLen < pBssInfo->frameBodysize);
16604 + pBssInfo->frameBodysize = accumulateLen;
16605 +
16606 + /* get supported rates */
16607 + if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_SUPPORT_RATE)) == 0xffff )
16608 + {
16609 + zm_debug_msg0("EID(supported rates) not found");
16610 + goto zlError;
16611 + }
16612 +
16613 + length = zmw_rx_buf_readb(dev, buf, offset+1);
16614 + if ( length == 0 || length > ZM_MAX_SUPP_RATES_IE_SIZE)
16615 + {
16616 + zm_msg0_mm(ZM_LV_0, "Supported rates IE length abnormal");
16617 + goto zlError;
16618 + }
16619 + zfCopyFromRxBuffer(dev, buf, pBssInfo->supportedRates, offset, length+2);
16620 +
16621 +
16622 +
16623 + /* get Country information */
16624 + if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_COUNTRY)) != 0xffff )
16625 + {
16626 + length = zmw_rx_buf_readb(dev, buf, offset+1);
16627 + if (length > ZM_MAX_COUNTRY_INFO_SIZE)
16628 + {
16629 + length = ZM_MAX_COUNTRY_INFO_SIZE;
16630 + }
16631 + zfCopyFromRxBuffer(dev, buf, pBssInfo->countryInfo, offset, length+2);
16632 + /* check 802.11d support data */
16633 + if (wd->sta.b802_11D)
16634 + {
16635 + zfHpGetRegulationTablefromISO(dev, (u8_t *)&pBssInfo->countryInfo, 3);
16636 + /* only set regulatory one time */
16637 + wd->sta.b802_11D = 0;
16638 + }
16639 + }
16640 +
16641 + /* get ERP information */
16642 + if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_ERP)) != 0xffff )
16643 + {
16644 + pBssInfo->erp = zmw_rx_buf_readb(dev, buf, offset+2);
16645 + }
16646 +
16647 + /* get extended supported rates */
16648 + if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_RATE)) != 0xffff )
16649 + {
16650 + length = zmw_rx_buf_readb(dev, buf, offset+1);
16651 + if (length > ZM_MAX_SUPP_RATES_IE_SIZE)
16652 + {
16653 + zm_msg0_mm(ZM_LV_0, "Extended rates IE length abnormal");
16654 + goto zlError;
16655 + }
16656 + zfCopyFromRxBuffer(dev, buf, pBssInfo->extSupportedRates, offset, length+2);
16657 + }
16658 + else
16659 + {
16660 + pBssInfo->extSupportedRates[0] = 0;
16661 + pBssInfo->extSupportedRates[1] = 0;
16662 + }
16663 +
16664 + /* get WPA IE */
16665 + if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_WPA_IE)) != 0xffff )
16666 + {
16667 + length = zmw_rx_buf_readb(dev, buf, offset+1);
16668 + if (length > ZM_MAX_IE_SIZE)
16669 + {
16670 + length = ZM_MAX_IE_SIZE;
16671 + }
16672 + zfCopyFromRxBuffer(dev, buf, pBssInfo->wpaIe, offset, length+2);
16673 + pBssInfo->securityType = ZM_SECURITY_TYPE_WPA;
16674 + }
16675 + else
16676 + {
16677 + pBssInfo->wpaIe[1] = 0;
16678 + }
16679 +
16680 + /* get WPS IE */
16681 + if ((offset = zfFindWifiElement(dev, buf, 4, 0xff)) != 0xffff)
16682 + {
16683 + length = zmw_rx_buf_readb(dev, buf, offset+1);
16684 + if (length > ZM_MAX_WPS_IE_SIZE )
16685 + {
16686 + length = ZM_MAX_WPS_IE_SIZE;
16687 + }
16688 + zfCopyFromRxBuffer(dev, buf, pBssInfo->wscIe, offset, length+2);
16689 + }
16690 + else
16691 + {
16692 + pBssInfo->wscIe[1] = 0;
16693 + }
16694 +
16695 + /* get SuperG IE */
16696 + if ((offset = zfFindSuperGElement(dev, buf, ZM_WLAN_EID_VENDOR_PRIVATE)) != 0xffff)
16697 + {
16698 + pBssInfo->apCap |= ZM_SuperG_AP;
16699 + }
16700 +
16701 + /* get XR IE */
16702 + if ((offset = zfFindXRElement(dev, buf, ZM_WLAN_EID_VENDOR_PRIVATE)) != 0xffff)
16703 + {
16704 + pBssInfo->apCap |= ZM_XR_AP;
16705 + }
16706 +
16707 + /* get RSN IE */
16708 + if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_RSN_IE)) != 0xffff )
16709 + {
16710 + length = zmw_rx_buf_readb(dev, buf, offset+1);
16711 + if (length > ZM_MAX_IE_SIZE)
16712 + {
16713 + length = ZM_MAX_IE_SIZE;
16714 + }
16715 + zfCopyFromRxBuffer(dev, buf, pBssInfo->rsnIe, offset, length+2);
16716 + pBssInfo->securityType = ZM_SECURITY_TYPE_WPA;
16717 + }
16718 + else
16719 + {
16720 + pBssInfo->rsnIe[1] = 0;
16721 + }
16722 +#ifdef ZM_ENABLE_CENC
16723 + /* get CENC IE */
16724 + if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_CENC_IE)) != 0xffff )
16725 + {
16726 + length = zmw_rx_buf_readb(dev, buf, offset+1);
16727 + if (length > ZM_MAX_IE_SIZE )
16728 + {
16729 + length = ZM_MAX_IE_SIZE;
16730 + }
16731 + zfCopyFromRxBuffer(dev, buf, pBssInfo->cencIe, offset, length+2);
16732 + pBssInfo->securityType = ZM_SECURITY_TYPE_CENC;
16733 + pBssInfo->capability[0] &= 0xffef;
16734 + }
16735 + else
16736 + {
16737 + pBssInfo->cencIe[1] = 0;
16738 + }
16739 +#endif //ZM_ENABLE_CENC
16740 + /* get WME Parameter IE, probe rsp may contain WME parameter element */
16741 + //if ( wd->bQoSEnable )
16742 + {
16743 + if ((offset = zfFindWifiElement(dev, buf, 2, 1)) != 0xffff)
16744 + {
16745 + apQosInfo = zmw_rx_buf_readb(dev, buf, offset+8) & 0x80;
16746 + pBssInfo->wmeSupport = 1 | apQosInfo;
16747 + }
16748 + else if ((offset = zfFindWifiElement(dev, buf, 2, 0)) != 0xffff)
16749 + {
16750 + apQosInfo = zmw_rx_buf_readb(dev, buf, offset+8) & 0x80;
16751 + pBssInfo->wmeSupport = 1 | apQosInfo;
16752 + }
16753 + else
16754 + {
16755 + pBssInfo->wmeSupport = 0;
16756 + }
16757 + }
16758 + //CWYang(+)
16759 + if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_HT_CAPABILITY)) != 0xffff)
16760 + {
16761 + /* 11n AP */
16762 + pBssInfo->EnableHT = 1;
16763 + if (zmw_rx_buf_readb(dev, buf, offset+1) & 0x02)
16764 + {
16765 + pBssInfo->enableHT40 = 1;
16766 + }
16767 + else
16768 + {
16769 + pBssInfo->enableHT40 = 0;
16770 + }
16771 +
16772 + if (zmw_rx_buf_readb(dev, buf, offset+1) & 0x40)
16773 + {
16774 + pBssInfo->SG40 = 1;
16775 + }
16776 + else
16777 + {
16778 + pBssInfo->SG40 = 0;
16779 + }
16780 + }
16781 + else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTCAPABILITY)) != 0xffff)
16782 + {
16783 + /* 11n AP */
16784 + pBssInfo->EnableHT = 1;
16785 + pBssInfo->apCap |= ZM_All11N_AP;
16786 + if (zmw_rx_buf_readb(dev, buf, offset+2) & 0x02)
16787 + {
16788 + pBssInfo->enableHT40 = 1;
16789 + }
16790 + else
16791 + {
16792 + pBssInfo->enableHT40 = 0;
16793 + }
16794 +
16795 + if (zmw_rx_buf_readb(dev, buf, offset+2) & 0x40)
16796 + {
16797 + pBssInfo->SG40 = 1;
16798 + }
16799 + else
16800 + {
16801 + pBssInfo->SG40 = 0;
16802 + }
16803 + }
16804 + else
16805 + {
16806 + pBssInfo->EnableHT = 0;
16807 + }
16808 + /* HT information */
16809 + if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY)) != 0xffff)
16810 + {
16811 + /* atheros pre n */
16812 + pBssInfo->extChOffset = zmw_rx_buf_readb(dev, buf, offset+2) & 0x03;
16813 + }
16814 + else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTINFORMATION)) != 0xffff)
16815 + {
16816 + /* pre n 2.0 standard */
16817 + pBssInfo->extChOffset = zmw_rx_buf_readb(dev, buf, offset+3) & 0x03;
16818 + }
16819 + else
16820 + {
16821 + pBssInfo->extChOffset = 0;
16822 + }
16823 +
16824 + if ( (pBssInfo->enableHT40 == 1)
16825 + && ((pBssInfo->extChOffset != 1) && (pBssInfo->extChOffset != 3)) )
16826 + {
16827 + pBssInfo->enableHT40 = 0;
16828 + }
16829 +
16830 + if (pBssInfo->enableHT40 == 1)
16831 + {
16832 + if (zfHpIsAllowedChannel(dev, pBssInfo->frequency+((pBssInfo->extChOffset==1)?20:-20)) == 0)
16833 + {
16834 + /* if extension channel is not an allowed channel, treat AP as non-HT mode */
16835 + pBssInfo->EnableHT = 0;
16836 + pBssInfo->enableHT40 = 0;
16837 + pBssInfo->extChOffset = 0;
16838 + }
16839 + }
16840 +
16841 + /* get ATH Extended Capability */
16842 + if ( ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY)) != 0xffff)&&
16843 + ((offset = zfFindBrdcmMrvlRlnkExtCap(dev, buf)) == 0xffff))
16844 +
16845 + {
16846 + pBssInfo->athOwlAp = 1;
16847 + }
16848 + else
16849 + {
16850 + pBssInfo->athOwlAp = 0;
16851 + }
16852 +
16853 + /* get Broadcom Extended Capability */
16854 + if ( (pBssInfo->EnableHT == 1) //((offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY)) != 0xffff)
16855 + && ((offset = zfFindBroadcomExtCap(dev, buf)) != 0xffff) )
16856 + {
16857 + pBssInfo->broadcomHTAp = 1;
16858 + }
16859 + else
16860 + {
16861 + pBssInfo->broadcomHTAp = 0;
16862 + }
16863 +
16864 + /* get Marvel Extended Capability */
16865 + if ((offset = zfFindMarvelExtCap(dev, buf)) != 0xffff)
16866 + {
16867 + pBssInfo->marvelAp = 1;
16868 + }
16869 + else
16870 + {
16871 + pBssInfo->marvelAp = 0;
16872 + }
16873 +
16874 + /* get ATIM window */
16875 + if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_IBSS)) != 0xffff )
16876 + {
16877 + pBssInfo->atimWindow = zmw_rx_buf_readh(dev, buf,offset+2);
16878 + }
16879 +
16880 + /* Fit for support mode */
16881 + if (pBssInfo->frequency > 3000) {
16882 + if (wd->supportMode & ZM_WIRELESS_MODE_5_N) {
16883 +#if 0
16884 + if (wd->supportMode & ZM_WIRELESS_MODE_5_54) {
16885 + /* support mode: a, n */
16886 + /* do nothing */
16887 + } else {
16888 + /* support mode: n */
16889 + /* reject non-n bss info */
16890 + if (!pBssInfo->EnableHT) {
16891 + goto zlError2;
16892 + }
16893 + }
16894 +#endif
16895 + } else {
16896 + if (wd->supportMode & ZM_WIRELESS_MODE_5_54) {
16897 + /* support mode: a */
16898 + /* delete n mode information */
16899 + pBssInfo->EnableHT = 0;
16900 + pBssInfo->enableHT40 = 0;
16901 + pBssInfo->apCap &= (~ZM_All11N_AP);
16902 + pBssInfo->extChOffset = 0;
16903 + pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
16904 + pBssInfo->frameBodysize, ZM_WLAN_EID_HT_CAPABILITY);
16905 + pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
16906 + pBssInfo->frameBodysize, ZM_WLAN_PREN2_EID_HTCAPABILITY);
16907 + pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
16908 + pBssInfo->frameBodysize, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY);
16909 + pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
16910 + pBssInfo->frameBodysize, ZM_WLAN_PREN2_EID_HTINFORMATION);
16911 + } else {
16912 + /* support mode: none */
16913 + goto zlError2;
16914 + }
16915 + }
16916 + } else {
16917 + if (wd->supportMode & ZM_WIRELESS_MODE_24_N) {
16918 +#if 0
16919 + if (wd->supportMode & ZM_WIRELESS_MODE_24_54) {
16920 + if (wd->supportMode & ZM_WIRELESS_MODE_24_11) {
16921 + /* support mode: b, g, n */
16922 + /* do nothing */
16923 + } else {
16924 + /* support mode: g, n */
16925 + /* reject b-only bss info */
16926 + if ( (!pBssInfo->EnableHT)
16927 + && (pBssInfo->extSupportedRates[1] == 0) ) {
16928 + goto zlError2;
16929 + }
16930 + }
16931 + } else {
16932 + if (wd->supportMode & ZM_WIRELESS_MODE_24_11) {
16933 + /* support mode: b, n */
16934 + /* 1. reject g-only bss info
16935 + * 2. if non g-only, delete g mode information
16936 + */
16937 + if ( !pBssInfo->EnableHT ) {
16938 + if ( zfIsGOnlyMode(dev, pBssInfo->frequency, pBssInfo->supportedRates)
16939 + || zfIsGOnlyMode(dev, pBssInfo->frequency, pBssInfo->extSupportedRates) ) {
16940 + goto zlError2;
16941 + } else {
16942 + zfGatherBMode(dev, pBssInfo->supportedRates,
16943 + pBssInfo->extSupportedRates);
16944 + pBssInfo->erp = 0;
16945 +
16946 + pBssInfo->frameBodysize = zfRemoveElement(dev,
16947 + pBssInfo->frameBody, pBssInfo->frameBodysize,
16948 + ZM_WLAN_EID_ERP);
16949 + pBssInfo->frameBodysize = zfRemoveElement(dev,
16950 + pBssInfo->frameBody, pBssInfo->frameBodysize,
16951 + ZM_WLAN_EID_EXTENDED_RATE);
16952 +
16953 + pBssInfo->frameBodysize = zfUpdateElement(dev,
16954 + pBssInfo->frameBody, pBssInfo->frameBodysize,
16955 + pBssInfo->supportedRates);
16956 + }
16957 + }
16958 + } else {
16959 + /* support mode: n */
16960 + /* reject non-n bss info */
16961 + if (!pBssInfo->EnableHT) {
16962 + goto zlError2;
16963 + }
16964 + }
16965 + }
16966 +#endif
16967 + } else {
16968 + /* delete n mode information */
16969 + pBssInfo->EnableHT = 0;
16970 + pBssInfo->enableHT40 = 0;
16971 + pBssInfo->apCap &= (~ZM_All11N_AP);
16972 + pBssInfo->extChOffset = 0;
16973 + pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
16974 + pBssInfo->frameBodysize, ZM_WLAN_EID_HT_CAPABILITY);
16975 + pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
16976 + pBssInfo->frameBodysize, ZM_WLAN_PREN2_EID_HTCAPABILITY);
16977 + pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
16978 + pBssInfo->frameBodysize, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY);
16979 + pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
16980 + pBssInfo->frameBodysize, ZM_WLAN_PREN2_EID_HTINFORMATION);
16981 +
16982 + if (wd->supportMode & ZM_WIRELESS_MODE_24_54) {
16983 +#if 0
16984 + if (wd->supportMode & ZM_WIRELESS_MODE_24_11) {
16985 + /* support mode: b, g */
16986 + /* delete n mode information */
16987 + } else {
16988 + /* support mode: g */
16989 + /* delete n mode information */
16990 + /* reject b-only bss info */
16991 + if (pBssInfo->extSupportedRates[1] == 0) {
16992 + goto zlError2;
16993 + }
16994 + }
16995 +#endif
16996 + } else {
16997 + if (wd->supportMode & ZM_WIRELESS_MODE_24_11) {
16998 + /* support mode: b */
16999 + /* delete n mode information */
17000 + if ( zfIsGOnlyMode(dev, pBssInfo->frequency, pBssInfo->supportedRates)
17001 + || zfIsGOnlyMode(dev, pBssInfo->frequency, pBssInfo->extSupportedRates) ) {
17002 + goto zlError2;
17003 + } else {
17004 + zfGatherBMode(dev, pBssInfo->supportedRates,
17005 + pBssInfo->extSupportedRates);
17006 + pBssInfo->erp = 0;
17007 +
17008 + pBssInfo->frameBodysize = zfRemoveElement(dev,
17009 + pBssInfo->frameBody, pBssInfo->frameBodysize,
17010 + ZM_WLAN_EID_ERP);
17011 + pBssInfo->frameBodysize = zfRemoveElement(dev,
17012 + pBssInfo->frameBody, pBssInfo->frameBodysize,
17013 + ZM_WLAN_EID_EXTENDED_RATE);
17014 +
17015 + pBssInfo->frameBodysize = zfUpdateElement(dev,
17016 + pBssInfo->frameBody, pBssInfo->frameBodysize,
17017 + pBssInfo->supportedRates);
17018 + }
17019 + } else {
17020 + /* support mode: none */
17021 + goto zlError2;
17022 + }
17023 + }
17024 + }
17025 + }
17026 +
17027 + pBssInfo->flag |= ZM_BSS_INFO_VALID_BIT;
17028 +
17029 +zlUpdateRssi:
17030 + /* Update Timer information */
17031 + pBssInfo->tick = wd->tick;
17032 +
17033 + /* Update ERP information */
17034 + if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_ERP)) != 0xffff )
17035 + {
17036 + pBssInfo->erp = zmw_rx_buf_readb(dev, buf, offset+2);
17037 + }
17038 +
17039 + if( (s8_t)pBssInfo->signalStrength < (s8_t)AddInfo->Tail.Data.SignalStrength1 )
17040 + {
17041 + /* Update signal strength */
17042 + pBssInfo->signalStrength = (u8_t)AddInfo->Tail.Data.SignalStrength1;
17043 + /* Update signal quality */
17044 + pBssInfo->signalQuality = (u8_t)(AddInfo->Tail.Data.SignalStrength1 * 2);
17045 +
17046 + /* Update the sorting value */
17047 + pBssInfo->sortValue = zfComputeBssInfoWeightValue(dev,
17048 + (pBssInfo->supportedRates[6] + pBssInfo->extSupportedRates[0]),
17049 + pBssInfo->EnableHT,
17050 + pBssInfo->enableHT40,
17051 + pBssInfo->signalStrength);
17052 + }
17053 +
17054 + return 0;
17055 +
17056 +zlError:
17057 +
17058 + return 1;
17059 +
17060 +zlError2:
17061 +
17062 + return 2;
17063 +}
17064 +
17065 +void zfStaProcessBeacon(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo) //CWYang(m)
17066 +{
17067 + /* Parse TIM and send PS-POLL in power saving mode */
17068 + struct zsWlanBeaconFrameHeader* pBeaconHeader;
17069 + struct zsBssInfo* pBssInfo;
17070 + u8_t pBuf[sizeof(struct zsWlanBeaconFrameHeader)];
17071 + u8_t bssid[6];
17072 + int res;
17073 +
17074 + zmw_get_wlan_dev(dev);
17075 +
17076 + zmw_declare_for_critical_section();
17077 +
17078 + /* sta routine jobs */
17079 + zfStaProtErpMonitor(dev, buf); /* check protection mode */
17080 +
17081 + if (zfStaIsConnected(dev))
17082 + {
17083 + ZM_MAC_WORD_TO_BYTE(wd->sta.bssid, bssid);
17084 +
17085 + if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
17086 + {
17087 + if ( zfRxBufferEqualToStr(dev, buf, bssid, ZM_WLAN_HEADER_A2_OFFSET, 6) )
17088 + {
17089 + zfPowerSavingMgrProcessBeacon(dev, buf);
17090 + zfStaUpdateWmeParameter(dev, buf);
17091 + if (wd->sta.DFSEnable)
17092 + zfStaUpdateDot11HDFS(dev, buf);
17093 + if (wd->sta.TPCEnable)
17094 + zfStaUpdateDot11HTPC(dev, buf);
17095 + /* update signal strength and signal quality */
17096 + zfStaSignalStatistic(dev, AddInfo->Tail.Data.SignalStrength1,
17097 + AddInfo->Tail.Data.SignalQuality); //CWYang(+)
17098 + wd->sta.rxBeaconCount++;
17099 + }
17100 + }
17101 + else if ( wd->wlanMode == ZM_MODE_IBSS )
17102 + {
17103 + if ( zfRxBufferEqualToStr(dev, buf, bssid, ZM_WLAN_HEADER_A3_OFFSET, 6) )
17104 + {
17105 + int res;
17106 + struct zsPartnerNotifyEvent event;
17107 +
17108 + zm_debug_msg0("20070916 Receive opposite Beacon!");
17109 + zmw_enter_critical_section(dev);
17110 + wd->sta.ibssReceiveBeaconCount++;
17111 + zmw_leave_critical_section(dev);
17112 +
17113 + res = zfStaSetOppositeInfoFromRxBuf(dev, buf);
17114 + if ( res == 0 )
17115 + {
17116 + // New peer station found. Notify the wrapper now
17117 + zfInitPartnerNotifyEvent(dev, buf, &event);
17118 + if (wd->zfcbIbssPartnerNotify != NULL)
17119 + {
17120 + wd->zfcbIbssPartnerNotify(dev, 1, &event);
17121 + }
17122 + }
17123 + /* update signal strength and signal quality */
17124 + zfStaSignalStatistic(dev, AddInfo->Tail.Data.SignalStrength1,
17125 + AddInfo->Tail.Data.SignalQuality); //CWYang(+)
17126 + }
17127 + //else if ( wd->sta.ibssPartnerStatus == ZM_IBSS_PARTNER_LOST )
17128 + // Why does this happen in IBSS?? The impact of Vista since
17129 + // we need to tell it the BSSID
17130 +#if 0
17131 + else if ( wd->sta.oppositeCount == 0 )
17132 + { /* IBSS merge if SSID matched */
17133 + if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_SSID)) != 0xffff )
17134 + {
17135 + if ( (wd->sta.ssidLen == zmw_buf_readb(dev, buf, offset+1))&&
17136 + (zfRxBufferEqualToStr(dev, buf, wd->sta.ssid,
17137 + offset+2, wd->sta.ssidLen)) )
17138 + {
17139 + capabilityInfo = zmw_buf_readh(dev, buf, 34);
17140 +
17141 + if ( capabilityInfo & ZM_BIT_1 )
17142 + {
17143 + if ( (wd->sta.capability[0] & ZM_BIT_4) ==
17144 + (capabilityInfo & ZM_BIT_4) )
17145 + {
17146 + zm_debug_msg0("IBSS merge");
17147 + zfCopyFromRxBuffer(dev, buf, bssid,
17148 + ZM_WLAN_HEADER_A3_OFFSET, 6);
17149 + zfUpdateBssid(dev, bssid);
17150 + }
17151 + }
17152 + }
17153 + }
17154 + }
17155 +#endif
17156 + }
17157 + }
17158 +
17159 + /* return if not channel scan */
17160 + if ( !wd->sta.bChannelScan )
17161 + {
17162 + goto zlReturn;
17163 + }
17164 +
17165 + zfCopyFromRxBuffer(dev, buf, pBuf, 0, sizeof(struct zsWlanBeaconFrameHeader));
17166 + pBeaconHeader = (struct zsWlanBeaconFrameHeader*) pBuf;
17167 +
17168 + zmw_enter_critical_section(dev);
17169 +
17170 + //zm_debug_msg1("bss count = ", wd->sta.bssList.bssCount);
17171 +
17172 + pBssInfo = zfStaFindBssInfo(dev, buf, pBeaconHeader);
17173 +
17174 + if ( pBssInfo == NULL )
17175 + {
17176 + /* Allocate a new entry if BSS not in the scan list */
17177 + pBssInfo = zfBssInfoAllocate(dev);
17178 + if (pBssInfo != NULL)
17179 + {
17180 + res = zfStaInitBssInfo(dev, buf, pBeaconHeader, pBssInfo, AddInfo, 0);
17181 + //zfDumpSSID(pBssInfo->ssid[1], &(pBssInfo->ssid[2]));
17182 + if ( res != 0 )
17183 + {
17184 + zfBssInfoFree(dev, pBssInfo);
17185 + }
17186 + else
17187 + {
17188 + zfBssInfoInsertToList(dev, pBssInfo);
17189 + }
17190 + }
17191 + }
17192 + else
17193 + {
17194 + res = zfStaInitBssInfo(dev, buf, pBeaconHeader, pBssInfo, AddInfo, 1);
17195 + if (res == 2)
17196 + {
17197 + zfBssInfoRemoveFromList(dev, pBssInfo);
17198 + zfBssInfoFree(dev, pBssInfo);
17199 + }
17200 + else if ( wd->wlanMode == ZM_MODE_IBSS )
17201 + {
17202 + int idx;
17203 +
17204 + // It would reset the alive counter if the peer station is found!
17205 + zfStaFindFreeOpposite(dev, (u16_t *)pBssInfo->macaddr, &idx);
17206 + }
17207 + }
17208 +
17209 + zmw_leave_critical_section(dev);
17210 +
17211 +zlReturn:
17212 +
17213 + return;
17214 +}
17215 +
17216 +
17217 +void zfAuthFreqCompleteCb(zdev_t* dev)
17218 +{
17219 + zmw_get_wlan_dev(dev);
17220 + zmw_declare_for_critical_section();
17221 +
17222 + zmw_enter_critical_section(dev);
17223 +
17224 + if (wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_COMPLETED)
17225 + {
17226 + zm_debug_msg0("ZM_STA_CONN_STATE_ASSOCIATE");
17227 + wd->sta.connectTimer = wd->tick;
17228 + wd->sta.connectState = ZM_STA_CONN_STATE_ASSOCIATE;
17229 + }
17230 +
17231 + zmw_leave_critical_section(dev);
17232 + return;
17233 +}
17234 +
17235 +/************************************************************************/
17236 +/* */
17237 +/* FUNCTION DESCRIPTION zfProcessAuth */
17238 +/* Process authenticate management frame. */
17239 +/* */
17240 +/* INPUTS */
17241 +/* dev : device pointer */
17242 +/* buf : auth frame buffer */
17243 +/* */
17244 +/* OUTPUTS */
17245 +/* none */
17246 +/* */
17247 +/* AUTHOR */
17248 +/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
17249 +/* */
17250 +/************************************************************************/
17251 +/* Note : AP allows one authenticating STA at a time, does not */
17252 +/* support multiple authentication process. Make sure */
17253 +/* authentication state machine will not be blocked due */
17254 +/* to incompleted authentication handshake. */
17255 +void zfStaProcessAuth(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId)
17256 +{
17257 + struct zsWlanAuthFrameHeader* pAuthFrame;
17258 + u8_t pBuf[sizeof(struct zsWlanAuthFrameHeader)];
17259 + u32_t p1, p2;
17260 +
17261 + zmw_get_wlan_dev(dev);
17262 + zmw_declare_for_critical_section();
17263 +
17264 + if ( !zfStaIsConnecting(dev) )
17265 + {
17266 + return;
17267 + }
17268 +
17269 + pAuthFrame = (struct zsWlanAuthFrameHeader*) pBuf;
17270 + zfCopyFromRxBuffer(dev, buf, pBuf, 0, sizeof(struct zsWlanAuthFrameHeader));
17271 +
17272 + if ( wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_OPEN )
17273 + {
17274 + if ( (zmw_le16_to_cpu(pAuthFrame->seq) == 2)&&
17275 + (zmw_le16_to_cpu(pAuthFrame->algo) == 0)&&
17276 + (zmw_le16_to_cpu(pAuthFrame->status) == 0) )
17277 + {
17278 +
17279 + zmw_enter_critical_section(dev);
17280 + wd->sta.connectTimer = wd->tick;
17281 + zm_debug_msg0("ZM_STA_CONN_STATE_AUTH_COMPLETED");
17282 + wd->sta.connectState = ZM_STA_CONN_STATE_AUTH_COMPLETED;
17283 + zmw_leave_critical_section(dev);
17284 +
17285 + //Set channel according to AP's configuration
17286 + //Move to here because of Cisco 11n AP feature
17287 + zfCoreSetFrequencyEx(dev, wd->frequency, wd->BandWidth40,
17288 + wd->ExtOffset, zfAuthFreqCompleteCb);
17289 +
17290 + /* send association frame */
17291 + if ( wd->sta.connectByReasso )
17292 + {
17293 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_REASOCREQ,
17294 + wd->sta.bssid, 0, 0, 0);
17295 + }
17296 + else
17297 + {
17298 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_ASOCREQ,
17299 + wd->sta.bssid, 0, 0, 0);
17300 + }
17301 +
17302 +
17303 + }
17304 + else
17305 + {
17306 + zm_debug_msg1("authentication failed, status = ",
17307 + pAuthFrame->status);
17308 +
17309 + if (wd->sta.authMode == ZM_AUTH_MODE_AUTO)
17310 + {
17311 + wd->sta.bIsSharedKey = 1;
17312 + zfStaStartConnect(dev, wd->sta.bIsSharedKey);
17313 + }
17314 + else
17315 + {
17316 + zm_debug_msg0("ZM_STA_STATE_DISCONNECT");
17317 + zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_AUTH_FAILED, wd->sta.bssid, 3);
17318 + }
17319 + }
17320 + }
17321 + else if ( wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_SHARE_1 )
17322 + {
17323 + if ( (zmw_le16_to_cpu(pAuthFrame->algo) == 1) &&
17324 + (zmw_le16_to_cpu(pAuthFrame->seq) == 2) &&
17325 + (zmw_le16_to_cpu(pAuthFrame->status) == 0))
17326 + //&& (pAuthFrame->challengeText[1] <= 255) )
17327 + {
17328 + zfMemoryCopy(wd->sta.challengeText, pAuthFrame->challengeText,
17329 + pAuthFrame->challengeText[1]+2);
17330 +
17331 + /* send the 3rd authentication frame */
17332 + p1 = 0x30001;
17333 + p2 = 0;
17334 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_AUTH,
17335 + wd->sta.bssid, p1, p2, 0);
17336 +
17337 + zmw_enter_critical_section(dev);
17338 + wd->sta.connectTimer = wd->tick;
17339 +
17340 + zm_debug_msg0("ZM_STA_SUB_STATE_AUTH_SHARE_2");
17341 + wd->sta.connectState = ZM_STA_CONN_STATE_AUTH_SHARE_2;
17342 + zmw_leave_critical_section(dev);
17343 + }
17344 + else
17345 + {
17346 + zm_debug_msg1("authentication failed, status = ",
17347 + pAuthFrame->status);
17348 +
17349 + zm_debug_msg0("ZM_STA_STATE_DISCONNECT");
17350 + zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_AUTH_FAILED, wd->sta.bssid, 3);
17351 + }
17352 + }
17353 + else if ( wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_SHARE_2 )
17354 + {
17355 + if ( (zmw_le16_to_cpu(pAuthFrame->algo) == 1)&&
17356 + (zmw_le16_to_cpu(pAuthFrame->seq) == 4)&&
17357 + (zmw_le16_to_cpu(pAuthFrame->status) == 0) )
17358 + {
17359 + //Set channel according to AP's configuration
17360 + //Move to here because of Cisco 11n AP feature
17361 + zfCoreSetFrequencyEx(dev, wd->frequency, wd->BandWidth40,
17362 + wd->ExtOffset, NULL);
17363 +
17364 + /* send association frame */
17365 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_ASOCREQ,
17366 + wd->sta.bssid, 0, 0, 0);
17367 +
17368 + zmw_enter_critical_section(dev);
17369 + wd->sta.connectTimer = wd->tick;
17370 +
17371 + zm_debug_msg0("ZM_STA_SUB_STATE_ASSOCIATE");
17372 + wd->sta.connectState = ZM_STA_CONN_STATE_ASSOCIATE;
17373 + zmw_leave_critical_section(dev);
17374 + }
17375 + else
17376 + {
17377 + zm_debug_msg1("authentication failed, status = ",
17378 + pAuthFrame->status);
17379 +
17380 + zm_debug_msg0("ZM_STA_STATE_DISCONNECT");
17381 + zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_AUTH_FAILED, wd->sta.bssid, 3);
17382 + }
17383 + }
17384 + else
17385 + {
17386 + zm_debug_msg0("unknown case");
17387 + }
17388 +}
17389 +
17390 +void zfStaProcessAsocReq(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId)
17391 +{
17392 +
17393 + return;
17394 +}
17395 +
17396 +void zfStaProcessAsocRsp(zdev_t* dev, zbuf_t* buf)
17397 +{
17398 + struct zsWlanAssoFrameHeader* pAssoFrame;
17399 + u8_t pBuf[sizeof(struct zsWlanAssoFrameHeader)];
17400 + u16_t offset;
17401 + u32_t i;
17402 + u32_t oneTxStreamCap;
17403 +
17404 + zmw_get_wlan_dev(dev);
17405 +
17406 + if ( !zfStaIsConnecting(dev) )
17407 + {
17408 + return;
17409 + }
17410 +
17411 + pAssoFrame = (struct zsWlanAssoFrameHeader*) pBuf;
17412 + zfCopyFromRxBuffer(dev, buf, pBuf, 0, sizeof(struct zsWlanAssoFrameHeader));
17413 +
17414 + if ( wd->sta.connectState == ZM_STA_CONN_STATE_ASSOCIATE )
17415 + {
17416 + if ( pAssoFrame->status == 0 )
17417 + {
17418 + zm_debug_msg0("ZM_STA_STATE_CONNECTED");
17419 +
17420 + if (wd->sta.EnableHT == 1)
17421 + {
17422 + wd->sta.wmeConnected = 1;
17423 + }
17424 + if ((wd->sta.wmeEnabled & ZM_STA_WME_ENABLE_BIT) != 0) //WME enabled
17425 + {
17426 + /* Asoc rsp may contain WME parameter element */
17427 + if ((offset = zfFindWifiElement(dev, buf, 2, 1)) != 0xffff)
17428 + {
17429 + zm_debug_msg0("WME enable");
17430 + wd->sta.wmeConnected = 1;
17431 + if ((wd->sta.wmeEnabled & ZM_STA_UAPSD_ENABLE_BIT) != 0)
17432 + {
17433 + if ((zmw_rx_buf_readb(dev, buf, offset+8) & 0x80) != 0)
17434 + {
17435 + zm_debug_msg0("UAPSD enable");
17436 + wd->sta.qosInfo = wd->sta.wmeQosInfo;
17437 + }
17438 + }
17439 +
17440 + zfStaUpdateWmeParameter(dev, buf);
17441 + }
17442 + }
17443 +
17444 +
17445 + //Store asoc response frame body, for VISTA only
17446 + wd->sta.asocRspFrameBodySize = zfwBufGetSize(dev, buf)-24;
17447 + if (wd->sta.asocRspFrameBodySize > ZM_CACHED_FRAMEBODY_SIZE)
17448 + {
17449 + wd->sta.asocRspFrameBodySize = ZM_CACHED_FRAMEBODY_SIZE;
17450 + }
17451 + for (i=0; i<wd->sta.asocRspFrameBodySize; i++)
17452 + {
17453 + wd->sta.asocRspFrameBody[i] = zmw_rx_buf_readb(dev, buf, i+24);
17454 + }
17455 +
17456 + zfStaStoreAsocRspIe(dev, buf);
17457 + if (wd->sta.EnableHT &&
17458 + ((wd->sta.ie.HtCap.HtCapInfo & HTCAP_SupChannelWidthSet) != 0) &&
17459 + (wd->ExtOffset != 0))
17460 + {
17461 + wd->sta.htCtrlBandwidth = 1;
17462 + }
17463 + else
17464 + {
17465 + wd->sta.htCtrlBandwidth = 0;
17466 + }
17467 +
17468 + //Set channel according to AP's configuration
17469 + //zfCoreSetFrequencyEx(dev, wd->frequency, wd->BandWidth40,
17470 + // wd->ExtOffset, NULL);
17471 +
17472 + if (wd->sta.EnableHT == 1)
17473 + {
17474 + wd->addbaComplete = 0;
17475 +
17476 + if ((wd->sta.SWEncryptEnable & ZM_SW_TKIP_ENCRY_EN) == 0 &&
17477 + (wd->sta.SWEncryptEnable & ZM_SW_WEP_ENCRY_EN) == 0)
17478 + {
17479 + wd->addbaCount = 1;
17480 + zfAggSendAddbaRequest(dev, wd->sta.bssid, 0, 0);
17481 + zfTimerSchedule(dev, ZM_EVENT_TIMEOUT_ADDBA, 100);
17482 + }
17483 + }
17484 +
17485 + /* set RIFS support */
17486 + if(wd->sta.ie.HtInfo.ChannelInfo & ExtHtCap_RIFSMode)
17487 + {
17488 + wd->sta.HT2040 = 1;
17489 +// zfHpSetRifs(dev, wd->sta.EnableHT, 1, (wd->sta.currentFrequency < 3000)? 1:0);
17490 + }
17491 +
17492 + wd->sta.aid = pAssoFrame->aid & 0x3fff;
17493 + wd->sta.oppositeCount = 0; /* reset opposite count */
17494 + zfStaSetOppositeInfoFromRxBuf(dev, buf);
17495 +
17496 + wd->sta.rxBeaconCount = 16;
17497 +
17498 + zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTED);
17499 + wd->sta.connPowerInHalfDbm = zfHpGetTransmitPower(dev);
17500 + if (wd->zfcbConnectNotify != NULL)
17501 + {
17502 + if (wd->sta.EnableHT != 0) /* 11n */
17503 + {
17504 + oneTxStreamCap = (zfHpCapability(dev) & ZM_HP_CAP_11N_ONE_TX_STREAM);
17505 + if (wd->sta.htCtrlBandwidth == 1) /* HT40*/
17506 + {
17507 + if(oneTxStreamCap) /* one Tx stream */
17508 + {
17509 + if (wd->sta.SG40)
17510 + {
17511 + wd->CurrentTxRateKbps = 150000;
17512 + wd->CurrentRxRateKbps = 300000;
17513 + }
17514 + else
17515 + {
17516 + wd->CurrentTxRateKbps = 135000;
17517 + wd->CurrentRxRateKbps = 270000;
17518 + }
17519 + }
17520 + else /* Two Tx streams */
17521 + {
17522 + if (wd->sta.SG40)
17523 + {
17524 + wd->CurrentTxRateKbps = 300000;
17525 + wd->CurrentRxRateKbps = 300000;
17526 + }
17527 + else
17528 + {
17529 + wd->CurrentTxRateKbps = 270000;
17530 + wd->CurrentRxRateKbps = 270000;
17531 + }
17532 + }
17533 + }
17534 + else /* HT20 */
17535 + {
17536 + if(oneTxStreamCap) /* one Tx stream */
17537 + {
17538 + wd->CurrentTxRateKbps = 650000;
17539 + wd->CurrentRxRateKbps = 130000;
17540 + }
17541 + else /* Two Tx streams */
17542 + {
17543 + wd->CurrentTxRateKbps = 130000;
17544 + wd->CurrentRxRateKbps = 130000;
17545 + }
17546 + }
17547 + }
17548 + else /* 11abg */
17549 + {
17550 + if (wd->sta.connection_11b != 0)
17551 + {
17552 + wd->CurrentTxRateKbps = 11000;
17553 + wd->CurrentRxRateKbps = 11000;
17554 + }
17555 + else
17556 + {
17557 + wd->CurrentTxRateKbps = 54000;
17558 + wd->CurrentRxRateKbps = 54000;
17559 + }
17560 + }
17561 +
17562 +
17563 + wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_CONNECT, wd->sta.bssid);
17564 + }
17565 + wd->sta.connectByReasso = TRUE;
17566 + wd->sta.failCntOfReasso = 0;
17567 +
17568 + zfPowerSavingMgrConnectNotify(dev);
17569 +
17570 + /* Disable here because fixed rate is only for test, TBD. */
17571 + //if (wd->sta.EnableHT)
17572 + //{
17573 + // wd->txMCS = 7; //Rate = 65Mbps
17574 + // wd->txMT = 2; // Ht rate
17575 + // wd->enableAggregation = 2; // Enable Aggregation
17576 + //}
17577 + }
17578 + else
17579 + {
17580 + zm_debug_msg1("association failed, status = ",
17581 + pAssoFrame->status);
17582 +
17583 + zm_debug_msg0("ZM_STA_STATE_DISCONNECT");
17584 + wd->sta.connectByReasso = FALSE;
17585 + zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_ASOC_FAILED, wd->sta.bssid, 3);
17586 + }
17587 + }
17588 +
17589 +}
17590 +
17591 +void zfStaStoreAsocRspIe(zdev_t* dev, zbuf_t* buf)
17592 +{
17593 + u16_t offset;
17594 + u32_t i;
17595 + u16_t length;
17596 + u8_t *htcap;
17597 + u8_t asocBw40 = 0;
17598 + u8_t asocExtOffset = 0;
17599 +
17600 + zmw_get_wlan_dev(dev);
17601 +
17602 + for (i=0; i<wd->sta.asocRspFrameBodySize; i++)
17603 + {
17604 + wd->sta.asocRspFrameBody[i] = zmw_rx_buf_readb(dev, buf, i+24);
17605 + }
17606 +
17607 + /* HT capabilities: 28 octets */
17608 + if ( ((wd->sta.currentFrequency > 3000) && !(wd->supportMode & ZM_WIRELESS_MODE_5_N))
17609 + || ((wd->sta.currentFrequency < 3000) && !(wd->supportMode & ZM_WIRELESS_MODE_24_N)) )
17610 + {
17611 + /* not 11n AP */
17612 + htcap = (u8_t *)&wd->sta.ie.HtCap;
17613 + for (i=0; i<28; i++)
17614 + {
17615 + htcap[i] = 0;
17616 + }
17617 + wd->BandWidth40 = 0;
17618 + wd->ExtOffset = 0;
17619 + return;
17620 + }
17621 +
17622 + if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_HT_CAPABILITY)) != 0xffff)
17623 + {
17624 + /* atheros pre n */
17625 + zm_debug_msg0("atheros pre n");
17626 + htcap = (u8_t *)&wd->sta.ie.HtCap;
17627 + htcap[0] = zmw_rx_buf_readb(dev, buf, offset);
17628 + htcap[1] = 26;
17629 + for (i=1; i<=26; i++)
17630 + {
17631 + htcap[i+1] = zmw_rx_buf_readb(dev, buf, offset + i);
17632 + zm_msg2_mm(ZM_LV_1, "ASOC: HT Capabilities, htcap=", htcap[i+1]);
17633 + }
17634 + }
17635 + else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTCAPABILITY)) != 0xffff)
17636 + {
17637 + /* pre n 2.0 standard */
17638 + zm_debug_msg0("pre n 2.0 standard");
17639 + htcap = (u8_t *)&wd->sta.ie.HtCap;
17640 + for (i=0; i<28; i++)
17641 + {
17642 + htcap[i] = zmw_rx_buf_readb(dev, buf, offset + i);
17643 + zm_msg2_mm(ZM_LV_1, "ASOC: HT Capabilities, htcap=", htcap[i]);
17644 + }
17645 + }
17646 + else
17647 + {
17648 + /* not 11n AP */
17649 + htcap = (u8_t *)&wd->sta.ie.HtCap;
17650 + for (i=0; i<28; i++)
17651 + {
17652 + htcap[i] = 0;
17653 + }
17654 + wd->BandWidth40 = 0;
17655 + wd->ExtOffset = 0;
17656 + return;
17657 + }
17658 +
17659 + asocBw40 = (u8_t)((wd->sta.ie.HtCap.HtCapInfo & HTCAP_SupChannelWidthSet) >> 1);
17660 +
17661 + /* HT information */
17662 + if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY)) != 0xffff)
17663 + {
17664 + /* atheros pre n */
17665 + zm_debug_msg0("atheros pre n HTINFO");
17666 + length = 22;
17667 + htcap = (u8_t *)&wd->sta.ie.HtInfo;
17668 + htcap[0] = zmw_rx_buf_readb(dev, buf, offset);
17669 + htcap[1] = 22;
17670 + for (i=1; i<=22; i++)
17671 + {
17672 + htcap[i+1] = zmw_rx_buf_readb(dev, buf, offset + i);
17673 + zm_msg2_mm(ZM_LV_1, "ASOC: HT Info, htinfo=", htcap[i+1]);
17674 + }
17675 + }
17676 + else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTINFORMATION)) != 0xffff)
17677 + {
17678 + /* pre n 2.0 standard */
17679 + zm_debug_msg0("pre n 2.0 standard HTINFO");
17680 + length = zmw_rx_buf_readb(dev, buf, offset + 1);
17681 + htcap = (u8_t *)&wd->sta.ie.HtInfo;
17682 + for (i=0; i<24; i++)
17683 + {
17684 + htcap[i] = zmw_rx_buf_readb(dev, buf, offset + i);
17685 + zm_msg2_mm(ZM_LV_1, "ASOC: HT Info, htinfo=", htcap[i]);
17686 + }
17687 + }
17688 + else
17689 + {
17690 + zm_debug_msg0("no HTINFO");
17691 + htcap = (u8_t *)&wd->sta.ie.HtInfo;
17692 + for (i=0; i<24; i++)
17693 + {
17694 + htcap[i] = 0;
17695 + }
17696 + }
17697 + asocExtOffset = wd->sta.ie.HtInfo.ChannelInfo & ExtHtCap_ExtChannelOffsetBelow;
17698 +
17699 + if ((wd->sta.EnableHT == 1) && (asocBw40 == 1) && ((asocExtOffset == 1) || (asocExtOffset == 3)))
17700 + {
17701 + wd->BandWidth40 = asocBw40;
17702 + wd->ExtOffset = asocExtOffset;
17703 + }
17704 + else
17705 + {
17706 + wd->BandWidth40 = 0;
17707 + wd->ExtOffset = 0;
17708 + }
17709 +
17710 + return;
17711 +}
17712 +
17713 +void zfStaProcessDeauth(zdev_t* dev, zbuf_t* buf)
17714 +{
17715 + u16_t apMacAddr[3];
17716 +
17717 + zmw_get_wlan_dev(dev);
17718 + zmw_declare_for_critical_section();
17719 +
17720 + /* STA : if SA=connected AP then disconnect with AP */
17721 + if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
17722 + {
17723 + apMacAddr[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET);
17724 + apMacAddr[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+2);
17725 + apMacAddr[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+4);
17726 + if ((apMacAddr[0] == wd->sta.bssid[0]) && (apMacAddr[1] == wd->sta.bssid[1]) && (apMacAddr[2] == wd->sta.bssid[2]))
17727 + {
17728 + if (zfwBufGetSize(dev, buf) >= 24+2) //not a malformed frame
17729 + {
17730 + if ( zfStaIsConnected(dev) )
17731 + {
17732 + zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_DEAUTH, wd->sta.bssid, 2);
17733 + }
17734 + else if (zfStaIsConnecting(dev))
17735 + {
17736 + zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_AUTH_FAILED, wd->sta.bssid, 3);
17737 + }
17738 + else
17739 + {
17740 + }
17741 + }
17742 + }
17743 + }
17744 + else if ( wd->wlanMode == ZM_MODE_IBSS )
17745 + {
17746 + u16_t peerMacAddr[3];
17747 + u8_t peerIdx;
17748 + s8_t res;
17749 +
17750 + if ( zfStaIsConnected(dev) )
17751 + {
17752 + peerMacAddr[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET);
17753 + peerMacAddr[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+2);
17754 + peerMacAddr[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+4);
17755 +
17756 + zmw_enter_critical_section(dev);
17757 + res = zfStaFindOppositeByMACAddr(dev, peerMacAddr, &peerIdx);
17758 + if ( res == 0 )
17759 + {
17760 + wd->sta.oppositeInfo[peerIdx].aliveCounter = 0;
17761 + }
17762 + zmw_leave_critical_section(dev);
17763 + }
17764 + }
17765 +}
17766 +
17767 +void zfStaProcessDisasoc(zdev_t* dev, zbuf_t* buf)
17768 +{
17769 + u16_t apMacAddr[3];
17770 +
17771 + zmw_get_wlan_dev(dev);
17772 +
17773 + /* STA : if SA=connected AP then disconnect with AP */
17774 + if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
17775 + {
17776 + apMacAddr[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET);
17777 + apMacAddr[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+2);
17778 + apMacAddr[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+4);
17779 +
17780 + if ((apMacAddr[0] == wd->sta.bssid[0]) && (apMacAddr[1] == wd->sta.bssid[1]) && (apMacAddr[2] == wd->sta.bssid[2]))
17781 + {
17782 + if (zfwBufGetSize(dev, buf) >= 24+2) //not a malformed frame
17783 + {
17784 + if ( zfStaIsConnected(dev) )
17785 + {
17786 + zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_DISASOC, wd->sta.bssid, 2);
17787 + }
17788 + else
17789 + {
17790 + zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_ASOC_FAILED, wd->sta.bssid, 3);
17791 + }
17792 + }
17793 + }
17794 + }
17795 +}
17796 +
17797 +
17798 +
17799 +/************************************************************************/
17800 +/* */
17801 +/* FUNCTION DESCRIPTION zfProcessProbeReq */
17802 +/* Process probe request management frame. */
17803 +/* */
17804 +/* INPUTS */
17805 +/* dev : device pointer */
17806 +/* buf : auth frame buffer */
17807 +/* */
17808 +/* OUTPUTS */
17809 +/* none */
17810 +/* */
17811 +/* AUTHOR */
17812 +/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
17813 +/* */
17814 +/************************************************************************/
17815 +void zfStaProcessProbeReq(zdev_t* dev, zbuf_t* buf, u16_t* src)
17816 +{
17817 + u16_t offset;
17818 + u8_t len;
17819 + u16_t i, j;
17820 + u16_t sendFlag;
17821 +
17822 + zmw_get_wlan_dev(dev);
17823 +
17824 + /* check mode : AP/IBSS */
17825 + if ((wd->wlanMode != ZM_MODE_AP) || (wd->wlanMode != ZM_MODE_IBSS))
17826 + {
17827 + zm_msg0_mm(ZM_LV_3, "Ignore probe req");
17828 + return;
17829 + }
17830 +
17831 + /* check SSID */
17832 + if ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_SSID)) == 0xffff)
17833 + {
17834 + zm_msg0_mm(ZM_LV_3, "probe req SSID not found");
17835 + return;
17836 + }
17837 +
17838 + len = zmw_rx_buf_readb(dev, buf, offset+1);
17839 +
17840 + for (i=0; i<ZM_MAX_AP_SUPPORT; i++)
17841 + {
17842 + if ((wd->ap.apBitmap & (i<<i)) != 0)
17843 + {
17844 + sendFlag = 0;
17845 + /* boardcast SSID */
17846 + if ((len == 0) && (wd->ap.hideSsid[i] == 0))
17847 + {
17848 + sendFlag = 1;
17849 + }
17850 + /* Not broadcast SSID */
17851 + else if (wd->ap.ssidLen[i] == len)
17852 + {
17853 + for (j=0; j<len; j++)
17854 + {
17855 + if (zmw_rx_buf_readb(dev, buf, offset+1+j)
17856 + != wd->ap.ssid[i][j])
17857 + {
17858 + break;
17859 + }
17860 + }
17861 + if (j == len)
17862 + {
17863 + sendFlag = 1;
17864 + }
17865 + }
17866 + if (sendFlag == 1)
17867 + {
17868 + /* Send probe response */
17869 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_PROBERSP, src, i, 0, 0);
17870 + }
17871 + }
17872 + }
17873 +}
17874 +
17875 +void zfStaProcessProbeRsp(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo)
17876 +{
17877 + /* return if not channel scan */
17878 + // Probe response is sent with unicast. Is this required?
17879 + // IBSS would send probe request and the code below would prevent
17880 + // the probe response from handling.
17881 + #if 0
17882 + zmw_get_wlan_dev(dev);
17883 +
17884 + if ( !wd->sta.bChannelScan )
17885 + {
17886 + return;
17887 + }
17888 + #endif
17889 +
17890 + zfProcessProbeRsp(dev, buf, AddInfo);
17891 +}
17892 +
17893 +void zfIBSSSetupBssDesc(zdev_t *dev)
17894 +{
17895 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
17896 + u8_t i;
17897 +#endif
17898 + struct zsBssInfo *pBssInfo;
17899 + u16_t offset = 0;
17900 +
17901 + zmw_get_wlan_dev(dev);
17902 +
17903 + pBssInfo = &wd->sta.ibssBssDesc;
17904 + zfZeroMemory((u8_t *)pBssInfo, sizeof(struct zsBssInfo));
17905 +
17906 + pBssInfo->signalStrength = 100;
17907 +
17908 + zfMemoryCopy((u8_t *)pBssInfo->macaddr, (u8_t *)wd->macAddr,6);
17909 + zfMemoryCopy((u8_t *)pBssInfo->bssid, (u8_t *)wd->sta.bssid, 6);
17910 +
17911 + pBssInfo->beaconInterval[0] = (u8_t)(wd->beaconInterval) ;
17912 + pBssInfo->beaconInterval[1] = (u8_t)((wd->beaconInterval) >> 8) ;
17913 +
17914 + pBssInfo->capability[0] = wd->sta.capability[0];
17915 + pBssInfo->capability[1] = wd->sta.capability[1];
17916 +
17917 + pBssInfo->ssid[0] = ZM_WLAN_EID_SSID;
17918 + pBssInfo->ssid[1] = wd->sta.ssidLen;
17919 + zfMemoryCopy((u8_t *)&pBssInfo->ssid[2], (u8_t *)wd->sta.ssid, wd->sta.ssidLen);
17920 + zfMemoryCopy((u8_t *)&pBssInfo->frameBody[offset], (u8_t *)pBssInfo->ssid,
17921 + wd->sta.ssidLen + 2);
17922 + offset += wd->sta.ssidLen + 2;
17923 +
17924 + /* support rate */
17925 +
17926 + /* DS parameter set */
17927 + pBssInfo->channel = zfChFreqToNum(wd->frequency, NULL);
17928 + pBssInfo->frequency = wd->frequency;
17929 + pBssInfo->atimWindow = wd->sta.atimWindow;
17930 +
17931 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
17932 + if ( wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK )
17933 + {
17934 + u8_t rsn[64]=
17935 + {
17936 + /* Element ID */
17937 + 0x30,
17938 + /* Length */
17939 + 0x14,
17940 + /* Version */
17941 + 0x01, 0x00,
17942 + /* Group Cipher Suite, default=TKIP */
17943 + 0x00, 0x0f, 0xac, 0x04,
17944 + /* Pairwise Cipher Suite Count */
17945 + 0x01, 0x00,
17946 + /* Pairwise Cipher Suite, default=TKIP */
17947 + 0x00, 0x0f, 0xac, 0x02,
17948 + /* Authentication and Key Management Suite Count */
17949 + 0x01, 0x00,
17950 + /* Authentication type, default=PSK */
17951 + 0x00, 0x0f, 0xac, 0x02,
17952 + /* RSN capability */
17953 + 0x00, 0x00
17954 + };
17955 +
17956 + /* Overwrite Group Cipher Suite by AP's setting */
17957 + zfMemoryCopy(rsn+4, zgWpa2AesOui, 4);
17958 +
17959 + if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
17960 + {
17961 + /* Overwrite Pairwise Cipher Suite by AES */
17962 + zfMemoryCopy(rsn+10, zgWpa2AesOui, 4);
17963 + }
17964 +
17965 + // RSN element id
17966 + pBssInfo->frameBody[offset++] = ZM_WLAN_EID_RSN_IE ;
17967 +
17968 + // RSN length
17969 + pBssInfo->frameBody[offset++] = rsn[1] ;
17970 +
17971 + // RSN information
17972 + for(i=0; i<rsn[1]; i++)
17973 + {
17974 + pBssInfo->frameBody[offset++] = rsn[i+2] ;
17975 + }
17976 +
17977 + zfMemoryCopy(pBssInfo->rsnIe, rsn, rsn[1]+2);
17978 + }
17979 +#endif
17980 +}
17981 +
17982 +void zfIbssConnectNetwork(zdev_t* dev)
17983 +{
17984 + struct zsBssInfo* pBssInfo;
17985 + struct zsBssInfo tmpBssInfo;
17986 + u8_t macAddr[6], bssid[6], bssNotFound = TRUE;
17987 + u16_t i, j=100;
17988 + u16_t k;
17989 + struct zsPartnerNotifyEvent event;
17990 + u32_t channelFlags;
17991 + u16_t oppositeWepStatus;
17992 +
17993 + zmw_get_wlan_dev(dev);
17994 +
17995 + zmw_declare_for_critical_section();
17996 +
17997 + /* change state to CONNECTING and stop the channel scanning */
17998 + zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTING);
17999 + zfPowerSavingMgrWakeup(dev);
18000 +
18001 + /* Set TxQs CWMIN, CWMAX, AIFS and TXO to WME STA default. */
18002 + zfUpdateDefaultQosParameter(dev, 0);
18003 +
18004 + wd->sta.bProtectionMode = FALSE;
18005 + zfHpSetSlotTime(dev, 1);
18006 +
18007 + /* ESS bit off */
18008 + wd->sta.capability[0] &= ~ZM_BIT_0;
18009 + /* IBSS bit on */
18010 + wd->sta.capability[0] |= ZM_BIT_1;
18011 + /* not not use short slot time */
18012 + wd->sta.capability[1] &= ~ZM_BIT_2;
18013 +
18014 + wd->sta.wmeConnected = 0;
18015 + wd->sta.psMgr.tempWakeUp = 0;
18016 + wd->sta.qosInfo = 0;
18017 + wd->sta.EnableHT = 0;
18018 + wd->BandWidth40 = 0;
18019 + wd->ExtOffset = 0;
18020 +
18021 + if ( wd->sta.bssList.bssCount )
18022 + {
18023 + //Reorder BssList by RSSI--CWYang(+)
18024 + zfBssInfoReorderList(dev);
18025 +
18026 + zmw_enter_critical_section(dev);
18027 +
18028 + pBssInfo = wd->sta.bssList.head;
18029 +
18030 + for(i=0; i<wd->sta.bssList.bssCount; i++)
18031 + {
18032 + // 20070806 #1 Privacy bit
18033 + if ( pBssInfo->capability[0] & ZM_BIT_4 )
18034 + { // Privacy Ibss network
18035 +// zm_debug_msg0("Privacy bit on");
18036 + oppositeWepStatus = ZM_ENCRYPTION_WEP_ENABLED;
18037 +
18038 + if ( pBssInfo->rsnIe[1] != 0 )
18039 + {
18040 + if ( (pBssInfo->rsnIe[7] == 0x01) || (pBssInfo->rsnIe[7] == 0x05) )
18041 + { // WEP-40 & WEP-104
18042 +// zm_debug_msg0("WEP40 or WEP104");
18043 + oppositeWepStatus = ZM_ENCRYPTION_WEP_ENABLED;
18044 + }
18045 + else if ( pBssInfo->rsnIe[7] == 0x02 )
18046 + { // TKIP
18047 +// zm_debug_msg0("TKIP");
18048 + oppositeWepStatus = ZM_ENCRYPTION_TKIP;
18049 + }
18050 + else if ( pBssInfo->rsnIe[7] == 0x04 )
18051 + { // AES
18052 +// zm_debug_msg0("CCMP-AES");
18053 + oppositeWepStatus = ZM_ENCRYPTION_AES;
18054 + }
18055 + }
18056 + }
18057 + else
18058 + {
18059 +// zm_debug_msg0("Privacy bit off");
18060 + oppositeWepStatus = ZM_ENCRYPTION_WEP_DISABLED;
18061 + }
18062 +
18063 + if ( (zfMemoryIsEqual(&(pBssInfo->ssid[2]), wd->sta.ssid,
18064 + wd->sta.ssidLen))&&
18065 + (wd->sta.ssidLen == pBssInfo->ssid[1])&&
18066 + (oppositeWepStatus == wd->sta.wepStatus) )
18067 + {
18068 + /* Check support mode */
18069 + if (pBssInfo->frequency > 3000) {
18070 + if ( (pBssInfo->EnableHT == 1)
18071 + || (pBssInfo->apCap & ZM_All11N_AP) ) //11n AP
18072 + {
18073 + channelFlags = CHANNEL_A_HT;
18074 + if (pBssInfo->enableHT40 == 1) {
18075 + channelFlags |= CHANNEL_HT40;
18076 + }
18077 + } else {
18078 + channelFlags = CHANNEL_A;
18079 + }
18080 + } else {
18081 + if ( (pBssInfo->EnableHT == 1)
18082 + || (pBssInfo->apCap & ZM_All11N_AP) ) //11n AP
18083 + {
18084 + channelFlags = CHANNEL_G_HT;
18085 + if(pBssInfo->enableHT40 == 1) {
18086 + channelFlags |= CHANNEL_HT40;
18087 + }
18088 + } else {
18089 + if (pBssInfo->extSupportedRates[1] == 0) {
18090 + channelFlags = CHANNEL_B;
18091 + } else {
18092 + channelFlags = CHANNEL_G;
18093 + }
18094 + }
18095 + }
18096 +
18097 + if ( ((channelFlags == CHANNEL_B) && (wd->connectMode & ZM_BIT_0))
18098 + || ((channelFlags == CHANNEL_G) && (wd->connectMode & ZM_BIT_1))
18099 + || ((channelFlags == CHANNEL_A) && (wd->connectMode & ZM_BIT_2))
18100 + || ((channelFlags & CHANNEL_HT20) && (wd->connectMode & ZM_BIT_3)) )
18101 + {
18102 + pBssInfo = pBssInfo->next;
18103 + continue;
18104 + }
18105 +
18106 + /* Bypass DFS channel */
18107 + if (zfHpIsDfsChannelNCS(dev, pBssInfo->frequency))
18108 + {
18109 + zm_debug_msg0("Bypass DFS channel");
18110 + continue;
18111 + }
18112 +
18113 + /* check IBSS bit */
18114 + if ( pBssInfo->capability[0] & ZM_BIT_1 )
18115 + {
18116 + /* may check timestamp here */
18117 + j = i;
18118 + break;
18119 + }
18120 + }
18121 +
18122 + pBssInfo = pBssInfo->next;
18123 + }
18124 +
18125 + if ((j < wd->sta.bssList.bssCount) && (pBssInfo != NULL))
18126 + {
18127 + zfwMemoryCopy((u8_t*)&tmpBssInfo, (u8_t*)(pBssInfo), sizeof(struct zsBssInfo));
18128 + pBssInfo = &tmpBssInfo;
18129 + }
18130 + else
18131 + {
18132 + pBssInfo = NULL;
18133 + }
18134 +
18135 + zmw_leave_critical_section(dev);
18136 +
18137 + //if ( j < wd->sta.bssList.bssCount )
18138 + if (pBssInfo != NULL)
18139 + {
18140 + int res;
18141 +
18142 + zm_debug_msg0("IBSS found");
18143 +
18144 + /* Found IBSS, reset bssNotFoundCount */
18145 + zmw_enter_critical_section(dev);
18146 + wd->sta.bssNotFoundCount = 0;
18147 + zmw_leave_critical_section(dev);
18148 +
18149 + bssNotFound = FALSE;
18150 + wd->sta.atimWindow = pBssInfo->atimWindow;
18151 + wd->frequency = pBssInfo->frequency;
18152 + //wd->sta.flagFreqChanging = 1;
18153 + zfCoreSetFrequency(dev, wd->frequency);
18154 + zfUpdateBssid(dev, pBssInfo->bssid);
18155 + zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_ZERO);
18156 + zfUpdateSupportRate(dev, pBssInfo->supportedRates);
18157 + zfUpdateSupportRate(dev, pBssInfo->extSupportedRates);
18158 + wd->beaconInterval = pBssInfo->beaconInterval[0] +
18159 + (((u16_t) pBssInfo->beaconInterval[1]) << 8);
18160 +
18161 + if (wd->beaconInterval == 0)
18162 + {
18163 + wd->beaconInterval = 100;
18164 + }
18165 +
18166 + /* rsn information element */
18167 + if ( pBssInfo->rsnIe[1] != 0 )
18168 + {
18169 + zfMemoryCopy(wd->sta.rsnIe, pBssInfo->rsnIe,
18170 + pBssInfo->rsnIe[1]+2);
18171 +
18172 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
18173 + /* If not use RSNA , run traditional */
18174 + zmw_enter_critical_section(dev);
18175 + wd->sta.ibssWpa2Psk = 1;
18176 + zmw_leave_critical_section(dev);
18177 +#endif
18178 + }
18179 + else
18180 + {
18181 + wd->sta.rsnIe[1] = 0;
18182 + }
18183 +
18184 + /* privacy bit */
18185 + if ( pBssInfo->capability[0] & ZM_BIT_4 )
18186 + {
18187 + wd->sta.capability[0] |= ZM_BIT_4;
18188 + }
18189 + else
18190 + {
18191 + wd->sta.capability[0] &= ~ZM_BIT_4;
18192 + }
18193 +
18194 + /* preamble type */
18195 + wd->preambleTypeInUsed = wd->preambleType;
18196 + if ( wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_AUTO )
18197 + {
18198 + if (pBssInfo->capability[0] & ZM_BIT_5)
18199 + {
18200 + wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_SHORT;
18201 + }
18202 + else
18203 + {
18204 + wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_LONG;
18205 + }
18206 + }
18207 +
18208 + if (wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_LONG)
18209 + {
18210 + wd->sta.capability[0] &= ~ZM_BIT_5;
18211 + }
18212 + else
18213 + {
18214 + wd->sta.capability[0] |= ZM_BIT_5;
18215 + }
18216 +
18217 + wd->sta.beaconFrameBodySize = pBssInfo->frameBodysize + 12;
18218 +
18219 + if (wd->sta.beaconFrameBodySize > ZM_CACHED_FRAMEBODY_SIZE)
18220 + {
18221 + wd->sta.beaconFrameBodySize = ZM_CACHED_FRAMEBODY_SIZE;
18222 + }
18223 +
18224 + for (k=0; k<8; k++)
18225 + {
18226 + wd->sta.beaconFrameBody[k] = pBssInfo->timeStamp[k];
18227 + }
18228 + wd->sta.beaconFrameBody[8] = pBssInfo->beaconInterval[0];
18229 + wd->sta.beaconFrameBody[9] = pBssInfo->beaconInterval[1];
18230 + wd->sta.beaconFrameBody[10] = pBssInfo->capability[0];
18231 + wd->sta.beaconFrameBody[11] = pBssInfo->capability[1];
18232 + //for (k=12; k<wd->sta.beaconFrameBodySize; k++)
18233 + for (k=0; k<pBssInfo->frameBodysize; k++)
18234 + {
18235 + wd->sta.beaconFrameBody[k+12] = pBssInfo->frameBody[k];
18236 + }
18237 +
18238 + zmw_enter_critical_section(dev);
18239 + res = zfStaSetOppositeInfoFromBSSInfo(dev, pBssInfo);
18240 + if ( res == 0 )
18241 + {
18242 + zfMemoryCopy(event.bssid, (u8_t *)(pBssInfo->bssid), 6);
18243 + zfMemoryCopy(event.peerMacAddr, (u8_t *)(pBssInfo->macaddr), 6);
18244 + }
18245 + zmw_leave_critical_section(dev);
18246 +
18247 + //zfwIbssPartnerNotify(dev, 1, &event);
18248 + goto connect_done;
18249 + }
18250 + }
18251 +
18252 + /* IBSS not found */
18253 + if ( bssNotFound )
18254 + {
18255 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
18256 + u16_t offset ;
18257 +#endif
18258 + if ( wd->sta.ibssJoinOnly )
18259 + {
18260 + zm_debug_msg0("IBSS join only...retry...");
18261 + goto retry_ibss;
18262 + }
18263 +
18264 + if(wd->sta.bssNotFoundCount<2)
18265 + {
18266 + zmw_enter_critical_section(dev);
18267 + zm_debug_msg1("IBSS not found, do sitesurvey!! bssNotFoundCount=", wd->sta.bssNotFoundCount);
18268 + wd->sta.bssNotFoundCount++;
18269 + zmw_leave_critical_section(dev);
18270 + goto retry_ibss;
18271 + }
18272 + else
18273 + {
18274 + zmw_enter_critical_section(dev);
18275 + /* Fail IBSS found, TODO create IBSS */
18276 + wd->sta.bssNotFoundCount = 0;
18277 + zmw_leave_critical_section(dev);
18278 + }
18279 +
18280 +
18281 + if (zfHpIsDfsChannel(dev, wd->frequency))
18282 + {
18283 + wd->frequency = zfHpFindFirstNonDfsChannel(dev, wd->frequency > 3000);
18284 + }
18285 +
18286 + if( wd->ws.autoSetFrequency == 0 )
18287 + { /* Auto set frequency */
18288 + zm_debug_msg1("Create Ad Hoc Network Band ", wd->ws.adhocMode);
18289 + wd->frequency = zfFindCleanFrequency(dev, wd->ws.adhocMode);
18290 + wd->ws.autoSetFrequency = 0xff;
18291 + }
18292 + zm_debug_msg1("IBSS not found, created one in channel ", wd->frequency);
18293 +
18294 + wd->sta.ibssBssIsCreator = 1;
18295 +
18296 + //wd->sta.flagFreqChanging = 1;
18297 + zfCoreSetFrequency(dev, wd->frequency);
18298 + if (wd->sta.bDesiredBssid == TRUE)
18299 + {
18300 + for (k=0; k<6; k++)
18301 + {
18302 + bssid[k] = wd->sta.desiredBssid[k];
18303 + }
18304 + }
18305 + else
18306 + {
18307 + #if 1
18308 + macAddr[0] = (wd->macAddr[0] & 0xff);
18309 + macAddr[1] = (wd->macAddr[0] >> 8);
18310 + macAddr[2] = (wd->macAddr[1] & 0xff);
18311 + macAddr[3] = (wd->macAddr[1] >> 8);
18312 + macAddr[4] = (wd->macAddr[2] & 0xff);
18313 + macAddr[5] = (wd->macAddr[2] >> 8);
18314 + zfGenerateRandomBSSID(dev, (u8_t *)wd->macAddr, (u8_t *)bssid);
18315 + #else
18316 + for (k=0; k<6; k++)
18317 + {
18318 + bssid[k] = (u8_t) zfGetRandomNumber(dev, 0);
18319 + }
18320 + bssid[0] &= ~ZM_BIT_0;
18321 + bssid[0] |= ZM_BIT_1;
18322 + #endif
18323 + }
18324 +
18325 + zfUpdateBssid(dev, bssid);
18326 + //wd->sta.atimWindow = 0x0a;
18327 +
18328 + /* rate information */
18329 + if(wd->frequency <= ZM_CH_G_14) // 2.4 GHz b+g
18330 + {
18331 + if ( wd->wfc.bIbssGMode
18332 + && (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) )
18333 + {
18334 + zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_IBSS_AG);
18335 + }
18336 + else
18337 + {
18338 + zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_IBSS_B);
18339 + }
18340 + } else {
18341 + zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_IBSS_AG);
18342 + }
18343 +
18344 + if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_DISABLED )
18345 + {
18346 + wd->sta.capability[0] &= ~ZM_BIT_4;
18347 + }
18348 + else
18349 + {
18350 + wd->sta.capability[0] |= ZM_BIT_4;
18351 + }
18352 +
18353 + wd->preambleTypeInUsed = wd->preambleType;
18354 + if (wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_LONG)
18355 + {
18356 + wd->sta.capability[0] &= ~ZM_BIT_5;
18357 + }
18358 + else
18359 + {
18360 + wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_SHORT;
18361 + wd->sta.capability[0] |= ZM_BIT_5;
18362 + }
18363 +
18364 + zfIBSSSetupBssDesc(dev);
18365 +
18366 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
18367 +
18368 + // 20070411 Add WPA2PSK information to its IBSS network !!!
18369 + offset = 0 ;
18370 +
18371 + /* timestamp */
18372 + offset += 8 ;
18373 +
18374 + /* beacon interval */
18375 + wd->sta.beaconFrameBody[offset++] = (u8_t)(wd->beaconInterval) ;
18376 + wd->sta.beaconFrameBody[offset++] = (u8_t)((wd->beaconInterval) >> 8) ;
18377 +
18378 + /* capability information */
18379 + wd->sta.beaconFrameBody[offset++] = wd->sta.capability[0] ;
18380 + wd->sta.beaconFrameBody[offset++] = wd->sta.capability[1] ;
18381 + #if 0
18382 + /* ssid */
18383 + // ssid element id
18384 + wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_SSID ;
18385 + // ssid length
18386 + wd->sta.beaconFrameBody[offset++] = wd->sta.ssidLen ;
18387 + // ssid information
18388 + for(i=0; i<wd->sta.ssidLen; i++)
18389 + {
18390 + wd->sta.beaconFrameBody[offset++] = wd->sta.ssid[i] ;
18391 + }
18392 +
18393 + /* support rate */
18394 + rateSet = ZM_RATE_SET_CCK ;
18395 + if ( (rateSet == ZM_RATE_SET_OFDM)&&((wd->gRate & 0xff) == 0) )
18396 + {
18397 + offset += 0 ;
18398 + }
18399 + else
18400 + {
18401 + // support rate element id
18402 + wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_SUPPORT_RATE ;
18403 +
18404 + // support rate length
18405 + lenOffset = offset++;
18406 +
18407 + // support rate information
18408 + for (i=0; i<4; i++)
18409 + {
18410 + if ((wd->bRate & (0x1<<i)) == (0x1<<i))
18411 + {
18412 + wd->sta.beaconFrameBody[offset++] =
18413 + zg11bRateTbl[i]+((wd->bRateBasic & (0x1<<i))<<(7-i)) ;
18414 + len++;
18415 + }
18416 + }
18417 +
18418 + // support rate length
18419 + wd->sta.beaconFrameBody[lenOffset] = len ;
18420 + }
18421 +
18422 + /* DS parameter set */
18423 + // DS parameter set elemet id
18424 + wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_DS ;
18425 +
18426 + // DS parameter set length
18427 + wd->sta.beaconFrameBody[offset++] = 1 ;
18428 +
18429 + // DS parameter set information
18430 + wd->sta.beaconFrameBody[offset++] =
18431 + zfChFreqToNum(wd->frequency, NULL) ;
18432 +
18433 + /* IBSS parameter set */
18434 + // IBSS parameter set element id
18435 + wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_IBSS ;
18436 +
18437 + // IBSS parameter set length
18438 + wd->sta.beaconFrameBody[offset++] = 2 ;
18439 +
18440 + // IBSS parameter set information
18441 + wd->sta.beaconFrameBody[offset] = wd->sta.atimWindow ;
18442 + offset += 2 ;
18443 +
18444 + /* ERP Information and Extended Supported Rates */
18445 + if ( wd->wfc.bIbssGMode
18446 + && (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) )
18447 + {
18448 + /* ERP Information */
18449 + wd->erpElement = 0;
18450 + // ERP element id
18451 + wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_ERP ;
18452 +
18453 + // ERP length
18454 + wd->sta.beaconFrameBody[offset++] = 1 ;
18455 +
18456 + // ERP information
18457 + wd->sta.beaconFrameBody[offset++] = wd->erpElement ;
18458 +
18459 + /* Extended Supported Rates */
18460 + if ( (rateSet == ZM_RATE_SET_OFDM)&&((wd->gRate & 0xff) == 0) )
18461 + {
18462 + offset += 0 ;
18463 + }
18464 + else
18465 + {
18466 + len = 0 ;
18467 +
18468 + // Extended Supported Rates element id
18469 + wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_EXTENDED_RATE ;
18470 +
18471 + // Extended Supported Rates length
18472 + lenOffset = offset++ ;
18473 +
18474 + // Extended Supported Rates information
18475 + for (i=0; i<8; i++)
18476 + {
18477 + if ((wd->gRate & (0x1<<i)) == (0x1<<i))
18478 + {
18479 + wd->sta.beaconFrameBody[offset++] =
18480 + zg11gRateTbl[i]+((wd->gRateBasic & (0x1<<i))<<(7-i));
18481 + len++;
18482 + }
18483 + }
18484 +
18485 + // extended support rate length
18486 + wd->sta.beaconFrameBody[lenOffset] = len ;
18487 + }
18488 + }
18489 + #endif
18490 +
18491 + /* RSN : important information influence the result of creating an IBSS network */
18492 + if ( wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK )
18493 + {
18494 + u8_t frameType = ZM_WLAN_FRAME_TYPE_AUTH ;
18495 + u8_t rsn[64]=
18496 + {
18497 + /* Element ID */
18498 + 0x30,
18499 + /* Length */
18500 + 0x14,
18501 + /* Version */
18502 + 0x01, 0x00,
18503 + /* Group Cipher Suite, default=TKIP */
18504 + 0x00, 0x0f, 0xac, 0x04,
18505 + /* Pairwise Cipher Suite Count */
18506 + 0x01, 0x00,
18507 + /* Pairwise Cipher Suite, default=TKIP */
18508 + 0x00, 0x0f, 0xac, 0x02,
18509 + /* Authentication and Key Management Suite Count */
18510 + 0x01, 0x00,
18511 + /* Authentication type, default=PSK */
18512 + 0x00, 0x0f, 0xac, 0x02,
18513 + /* RSN capability */
18514 + 0x00, 0x00
18515 + };
18516 +
18517 + /* Overwrite Group Cipher Suite by AP's setting */
18518 + zfMemoryCopy(rsn+4, zgWpa2AesOui, 4);
18519 +
18520 + if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
18521 + {
18522 + /* Overwrite Pairwise Cipher Suite by AES */
18523 + zfMemoryCopy(rsn+10, zgWpa2AesOui, 4);
18524 + }
18525 +
18526 + // RSN element id
18527 + wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_RSN_IE ;
18528 +
18529 + // RSN length
18530 + wd->sta.beaconFrameBody[offset++] = rsn[1] ;
18531 +
18532 + // RSN information
18533 + for(i=0; i<rsn[1]; i++)
18534 + wd->sta.beaconFrameBody[offset++] = rsn[i+2] ;
18535 +
18536 + zfMemoryCopy(wd->sta.rsnIe, rsn, rsn[1]+2);
18537 +
18538 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
18539 + /* If not use RSNA , run traditional */
18540 + zmw_enter_critical_section(dev);
18541 + wd->sta.ibssWpa2Psk = 1;
18542 + zmw_leave_critical_section(dev);
18543 +#endif
18544 + }
18545 +
18546 + #if 0
18547 + /* HT Capabilities Info */
18548 + {
18549 + u8_t OUI[3] = { 0x0 , 0x90 , 0x4C } ;
18550 +
18551 + wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_WPA_IE ;
18552 +
18553 + wd->sta.beaconFrameBody[offset++] = wd->sta.HTCap.Data.Length + 4 ;
18554 +
18555 + for (i = 0; i < 3; i++)
18556 + {
18557 + wd->sta.beaconFrameBody[offset++] = OUI[i] ;
18558 + }
18559 +
18560 + wd->sta.beaconFrameBody[offset++] = wd->sta.HTCap.Data.ElementID ;
18561 +
18562 + for (i = 0; i < 26; i++)
18563 + {
18564 + wd->sta.beaconFrameBody[offset++] = wd->sta.HTCap.Byte[i+2] ;
18565 + }
18566 + }
18567 +
18568 + /* Extended HT Capabilities Info */
18569 + {
18570 + u8_t OUI[3] = { 0x0 , 0x90 , 0x4C } ;
18571 +
18572 + wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_WPA_IE ;
18573 +
18574 + wd->sta.beaconFrameBody[offset++] = wd->sta.ExtHTCap.Data.Length + 4 ;
18575 +
18576 + for (i = 0; i < 3; i++)
18577 + {
18578 + wd->sta.beaconFrameBody[offset++] = OUI[i] ;
18579 + }
18580 +
18581 + wd->sta.beaconFrameBody[offset++] = wd->sta.ExtHTCap.Data.ElementID ;
18582 +
18583 + for (i = 0; i < 22; i++)
18584 + {
18585 + wd->sta.beaconFrameBody[offset++] = wd->sta.ExtHTCap.Byte[i+2] ;
18586 + }
18587 + }
18588 + #endif
18589 +
18590 + wd->sta.beaconFrameBodySize = offset ;
18591 +
18592 + if (wd->sta.beaconFrameBodySize > ZM_CACHED_FRAMEBODY_SIZE)
18593 + {
18594 + wd->sta.beaconFrameBodySize = ZM_CACHED_FRAMEBODY_SIZE;
18595 + }
18596 +
18597 + // 20070416 Let Create IBSS network could enter the zfwIbssPartnerNotify function
18598 + // bssNotFound = FALSE ;
18599 +
18600 + printk("The capability info 1 = %02x\n", wd->sta.capability[0]) ;
18601 + printk("The capability info 2 = %02x\n", wd->sta.capability[1]) ;
18602 + for(k=0; k<wd->sta.beaconFrameBodySize; k++)
18603 + {
18604 + printk("%02x ", wd->sta.beaconFrameBody[k]) ;
18605 + }
18606 + #if 0
18607 + zmw_enter_critical_section(dev);
18608 + zfMemoryCopy(event.bssid, (u8_t *)bssid, 6);
18609 + zfMemoryCopy(event.peerMacAddr, (u8_t *)wd->macAddr, 6);
18610 + zmw_leave_critical_section(dev);
18611 + #endif
18612 +#endif
18613 +
18614 + //zmw_enter_critical_section(dev);
18615 + //wd->sta.ibssPartnerStatus = ZM_IBSS_PARTNER_LOST;
18616 + //zmw_leave_critical_section(dev);
18617 + }
18618 + else
18619 + {
18620 + wd->sta.ibssBssIsCreator = 0;
18621 + }
18622 +
18623 +connect_done:
18624 + zfHpEnableBeacon(dev, ZM_MODE_IBSS, wd->beaconInterval, wd->dtim, (u8_t)wd->sta.atimWindow);
18625 + zfStaSendBeacon(dev); // Refresh Beacon content for ZD1211B HalPlus
18626 + zfHpSetAtimWindow(dev, wd->sta.atimWindow);
18627 +
18628 + // Start the IBSS timer to monitor for new stations
18629 + zmw_enter_critical_section(dev);
18630 + zfTimerSchedule(dev, ZM_EVENT_IBSS_MONITOR, ZM_TICK_IBSS_MONITOR);
18631 + zmw_leave_critical_section(dev);
18632 +
18633 +
18634 + if (wd->zfcbConnectNotify != NULL)
18635 + {
18636 + wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_CONNECT, wd->sta.bssid);
18637 + }
18638 + zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTED);
18639 + wd->sta.connPowerInHalfDbm = zfHpGetTransmitPower(dev);
18640 +
18641 +#ifdef ZM_ENABLE_IBSS_DELAYED_JOIN_INDICATION
18642 + if ( !bssNotFound )
18643 + {
18644 + wd->sta.ibssDelayedInd = 1;
18645 + zfMemoryCopy((u8_t *)&wd->sta.ibssDelayedIndEvent, (u8_t *)&event, sizeof(struct zsPartnerNotifyEvent));
18646 + }
18647 +#else
18648 + if ( !bssNotFound )
18649 + {
18650 + if (wd->zfcbIbssPartnerNotify != NULL)
18651 + {
18652 + wd->zfcbIbssPartnerNotify(dev, 1, &event);
18653 + }
18654 + }
18655 +#endif
18656 +
18657 + return;
18658 +
18659 +retry_ibss:
18660 + zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTING);
18661 + zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_NOT_FOUND, wd->sta.bssid, 0);
18662 + return;
18663 +}
18664 +
18665 +void zfStaProcessAtim(zdev_t* dev, zbuf_t* buf)
18666 +{
18667 + zmw_get_wlan_dev(dev);
18668 +
18669 + zm_debug_msg0("Receiving Atim window notification");
18670 +
18671 + wd->sta.recvAtim = 1;
18672 +}
18673 +
18674 +static struct zsBssInfo* zfInfraFindAPToConnect(zdev_t* dev,
18675 + struct zsBssInfo* candidateBss)
18676 +{
18677 + struct zsBssInfo* pBssInfo;
18678 + struct zsBssInfo* pNowBssInfo=NULL;
18679 + u16_t i;
18680 + u16_t ret, apWepStatus;
18681 + u32_t k;
18682 + u32_t channelFlags;
18683 +
18684 + zmw_get_wlan_dev(dev);
18685 + zmw_declare_for_critical_section();
18686 +
18687 + zmw_enter_critical_section(dev);
18688 +
18689 + pBssInfo = wd->sta.bssList.head;
18690 +
18691 + for(i=0; i<wd->sta.bssList.bssCount; i++)
18692 + {
18693 + if ( pBssInfo->capability[0] & ZM_BIT_4 )
18694 + {
18695 + apWepStatus = ZM_ENCRYPTION_WEP_ENABLED;
18696 + }
18697 + else
18698 + {
18699 + apWepStatus = ZM_ENCRYPTION_WEP_DISABLED;
18700 + }
18701 +
18702 + if ( ((zfMemoryIsEqual(&(pBssInfo->ssid[2]), wd->sta.ssid,
18703 + wd->sta.ssidLen))&&
18704 + (wd->sta.ssidLen == pBssInfo->ssid[1]))||
18705 + ((wd->sta.ssidLen == 0)&&
18706 + /* connect to any BSS: AP's ans STA's WEP status must match */
18707 + (wd->sta.wepStatus == apWepStatus )&&
18708 + (pBssInfo->securityType != ZM_SECURITY_TYPE_WPA) ))
18709 + {
18710 + if ( wd->sta.ssidLen == 0 )
18711 + {
18712 + zm_debug_msg0("ANY BSS found");
18713 + }
18714 +
18715 + if ( ((wd->sta.wepStatus == ZM_ENCRYPTION_WEP_DISABLED && apWepStatus == ZM_ENCRYPTION_WEP_ENABLED) ||
18716 + (wd->sta.wepStatus == ZM_ENCRYPTION_WEP_ENABLED &&
18717 + (apWepStatus == ZM_ENCRYPTION_WEP_DISABLED && wd->sta.dropUnencryptedPkts == 1))) &&
18718 + (wd->sta.authMode >= ZM_AUTH_MODE_OPEN && wd->sta.authMode <= ZM_AUTH_MODE_AUTO) )
18719 + {
18720 + zm_debug_msg0("Privacy policy is inconsistent");
18721 + pBssInfo = pBssInfo->next;
18722 + continue;
18723 + }
18724 +
18725 + /* for WPA negative test */
18726 + if ( !zfCheckAuthentication(dev, pBssInfo) )
18727 + {
18728 + pBssInfo = pBssInfo->next;
18729 + continue;
18730 + }
18731 +
18732 + /* Check bssid */
18733 + if (wd->sta.bDesiredBssid == TRUE)
18734 + {
18735 + for (k=0; k<6; k++)
18736 + {
18737 + if (wd->sta.desiredBssid[k] != pBssInfo->bssid[k])
18738 + {
18739 + zm_msg0_mm(ZM_LV_1, "desired bssid not matched 1");
18740 + break;
18741 + }
18742 + }
18743 +
18744 + if (k != 6)
18745 + {
18746 + zm_msg0_mm(ZM_LV_1, "desired bssid not matched 2");
18747 + pBssInfo = pBssInfo->next;
18748 + continue;
18749 + }
18750 + }
18751 +
18752 + /* Check support mode */
18753 + if (pBssInfo->frequency > 3000) {
18754 + if ( (pBssInfo->EnableHT == 1)
18755 + || (pBssInfo->apCap & ZM_All11N_AP) ) //11n AP
18756 + {
18757 + channelFlags = CHANNEL_A_HT;
18758 + if (pBssInfo->enableHT40 == 1) {
18759 + channelFlags |= CHANNEL_HT40;
18760 + }
18761 + } else {
18762 + channelFlags = CHANNEL_A;
18763 + }
18764 + } else {
18765 + if ( (pBssInfo->EnableHT == 1)
18766 + || (pBssInfo->apCap & ZM_All11N_AP) ) //11n AP
18767 + {
18768 + channelFlags = CHANNEL_G_HT;
18769 + if(pBssInfo->enableHT40 == 1) {
18770 + channelFlags |= CHANNEL_HT40;
18771 + }
18772 + } else {
18773 + if (pBssInfo->extSupportedRates[1] == 0) {
18774 + channelFlags = CHANNEL_B;
18775 + } else {
18776 + channelFlags = CHANNEL_G;
18777 + }
18778 + }
18779 + }
18780 +
18781 + if ( ((channelFlags == CHANNEL_B) && (wd->connectMode & ZM_BIT_0))
18782 + || ((channelFlags == CHANNEL_G) && (wd->connectMode & ZM_BIT_1))
18783 + || ((channelFlags == CHANNEL_A) && (wd->connectMode & ZM_BIT_2))
18784 + || ((channelFlags & CHANNEL_HT20) && (wd->connectMode & ZM_BIT_3)) )
18785 + {
18786 + pBssInfo = pBssInfo->next;
18787 + continue;
18788 + }
18789 +
18790 + /* Skip if AP in blocking list */
18791 + if ((ret = zfStaIsApInBlockingList(dev, pBssInfo->bssid)) == TRUE)
18792 + {
18793 + zm_msg0_mm(ZM_LV_0, "Candidate AP in blocking List, skip if there's stilla choice!");
18794 + pNowBssInfo = pBssInfo;
18795 + pBssInfo = pBssInfo->next;
18796 + continue;
18797 + }
18798 +
18799 + if ( pBssInfo->capability[0] & ZM_BIT_0 ) // check if infra-BSS
18800 + {
18801 + pNowBssInfo = pBssInfo;
18802 + wd->sta.apWmeCapability = pBssInfo->wmeSupport;
18803 +
18804 +
18805 + goto done;
18806 + }
18807 + }
18808 +
18809 + pBssInfo = pBssInfo->next;
18810 + }
18811 +
18812 +done:
18813 + if (pNowBssInfo != NULL)
18814 + {
18815 + zfwMemoryCopy((void*)candidateBss, (void*)pNowBssInfo, sizeof(struct zsBssInfo));
18816 + pNowBssInfo = candidateBss;
18817 + }
18818 +
18819 + zmw_leave_critical_section(dev);
18820 +
18821 + return pNowBssInfo;
18822 +}
18823 +
18824 +
18825 +void zfInfraConnectNetwork(zdev_t* dev)
18826 +{
18827 + struct zsBssInfo* pBssInfo;
18828 + struct zsBssInfo* pNowBssInfo=NULL;
18829 + struct zsBssInfo candidateBss;
18830 + //u16_t i, j=100, quality=10000;
18831 + //u8_t ret=FALSE, apWepStatus;
18832 + u8_t ret=FALSE;
18833 + u16_t k;
18834 + u8_t density = ZM_MPDU_DENSITY_NONE;
18835 +
18836 + zmw_get_wlan_dev(dev);
18837 + zmw_declare_for_critical_section();
18838 +
18839 + /* Reset bssNotFoundCount for Ad-Hoc:IBSS */
18840 + /* Need review : IbssConn -> InfraConn -> IbssConn etc, flag/counter reset? */
18841 + zmw_enter_critical_section(dev);
18842 + wd->sta.bssNotFoundCount = 0;
18843 + zmw_leave_critical_section(dev);
18844 +
18845 + /* Set TxQs CWMIN, CWMAX, AIFS and TXO to WME STA default. */
18846 + zfUpdateDefaultQosParameter(dev, 0);
18847 +
18848 + zfStaRefreshBlockList(dev, 0);
18849 +
18850 + /* change state to CONNECTING and stop the channel scanning */
18851 + zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTING);
18852 + zfPowerSavingMgrWakeup(dev);
18853 +
18854 + wd->sta.wmeConnected = 0;
18855 + wd->sta.psMgr.tempWakeUp = 0;
18856 + wd->sta.qosInfo = 0;
18857 + zfQueueFlush(dev, wd->sta.uapsdQ);
18858 +
18859 + wd->sta.connectState = ZM_STA_CONN_STATE_NONE;
18860 +
18861 + //Reorder BssList by RSSI--CWYang(+)
18862 + zfBssInfoReorderList(dev);
18863 +
18864 + pNowBssInfo = zfInfraFindAPToConnect(dev, &candidateBss);
18865 +
18866 + if (wd->sta.SWEncryptEnable != 0)
18867 + {
18868 + if (wd->sta.bSafeMode == 0)
18869 + {
18870 + zfStaDisableSWEncryption(dev);//Quickly reboot
18871 + }
18872 + }
18873 + if ( pNowBssInfo != NULL )
18874 + {
18875 + //zm_assert(pNowBssInfo != NULL);
18876 +
18877 + pBssInfo = pNowBssInfo;
18878 + wd->sta.ssidLen = pBssInfo->ssid[1];
18879 + zfMemoryCopy(wd->sta.ssid, &(pBssInfo->ssid[2]), pBssInfo->ssid[1]);
18880 + wd->frequency = pBssInfo->frequency;
18881 + //wd->sta.flagFreqChanging = 1;
18882 +
18883 + //zfCoreSetFrequency(dev, wd->frequency);
18884 + zfUpdateBssid(dev, pBssInfo->bssid);
18885 + zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_ZERO);
18886 + zfUpdateSupportRate(dev, pBssInfo->supportedRates);
18887 + zfUpdateSupportRate(dev, pBssInfo->extSupportedRates);
18888 +
18889 + wd->beaconInterval = pBssInfo->beaconInterval[0] +
18890 + (((u16_t) pBssInfo->beaconInterval[1]) << 8);
18891 + if (wd->beaconInterval == 0)
18892 + {
18893 + wd->beaconInterval = 100;
18894 + }
18895 +
18896 + /* ESS bit on */
18897 + wd->sta.capability[0] |= ZM_BIT_0;
18898 + /* IBSS bit off */
18899 + wd->sta.capability[0] &= ~ZM_BIT_1;
18900 +
18901 + /* 11n AP flag */
18902 + wd->sta.EnableHT = pBssInfo->EnableHT;
18903 + wd->sta.SG40 = pBssInfo->SG40;
18904 +#ifdef ZM_ENABLE_CENC
18905 + if ( pBssInfo->securityType == ZM_SECURITY_TYPE_CENC )
18906 + {
18907 + wd->sta.wmeEnabled = 0; //Disable WMM in CENC
18908 + cencInit(dev);
18909 + cencSetCENCMode(dev, NdisCENC_PSK);
18910 + wd->sta.wpaState = ZM_STA_WPA_STATE_INIT;
18911 + /* CENC */
18912 + if ( pBssInfo->cencIe[1] != 0 )
18913 + {
18914 + //wd->sta.wepStatus = ZM_ENCRYPTION_CENC;
18915 + //wd->sta.encryMode = ZM_CENC;
18916 + zfwCencHandleBeaconProbrespon(dev, (u8_t *)&pBssInfo->cencIe,
18917 + (u8_t *)&pBssInfo->ssid, (u8_t *)&pBssInfo->macaddr);
18918 + zfMemoryCopy(wd->sta.cencIe, pBssInfo->cencIe,
18919 + pBssInfo->cencIe[1]+2);
18920 + }
18921 + else
18922 + {
18923 + wd->sta.cencIe[1] = 0;
18924 + }
18925 + }
18926 +#endif //ZM_ENABLE_CENC
18927 + if ( pBssInfo->securityType == ZM_SECURITY_TYPE_WPA )
18928 + {
18929 + wd->sta.wpaState = ZM_STA_WPA_STATE_INIT;
18930 +
18931 + if ( wd->sta.wepStatus == ZM_ENCRYPTION_TKIP )
18932 + {
18933 + wd->sta.encryMode = ZM_TKIP;
18934 +
18935 + /* Turn on software encryption/decryption for TKIP */
18936 + if (wd->sta.EnableHT == 1)
18937 + {
18938 + zfStaEnableSWEncryption(dev, (ZM_SW_TKIP_ENCRY_EN|ZM_SW_TKIP_DECRY_EN));
18939 + }
18940 +
18941 + /* Do not support TKIP in 11n mode */
18942 + //wd->sta.EnableHT = 0;
18943 + //pBssInfo->enableHT40 = 0;
18944 + }
18945 + else if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
18946 + {
18947 + wd->sta.encryMode = ZM_AES;
18948 +
18949 + /* If AP supports HT mode */
18950 + if (wd->sta.EnableHT)
18951 + {
18952 + /* Set MPDU density to 8 us*/
18953 + density = ZM_MPDU_DENSITY_8US;
18954 + }
18955 + }
18956 +
18957 + if ( pBssInfo->wpaIe[1] != 0 )
18958 + {
18959 + zfMemoryCopy(wd->sta.wpaIe, pBssInfo->wpaIe,
18960 + pBssInfo->wpaIe[1]+2);
18961 + }
18962 + else
18963 + {
18964 + wd->sta.wpaIe[1] = 0;
18965 + }
18966 +
18967 + if ( pBssInfo->rsnIe[1] != 0 )
18968 + {
18969 + zfMemoryCopy(wd->sta.rsnIe, pBssInfo->rsnIe,
18970 + pBssInfo->rsnIe[1]+2);
18971 + }
18972 + else
18973 + {
18974 + wd->sta.rsnIe[1] = 0;
18975 + }
18976 + }
18977 +
18978 +
18979 +
18980 + /* check preamble bit */
18981 + wd->preambleTypeInUsed = wd->preambleType;
18982 + if ( wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_AUTO )
18983 + {
18984 + if (pBssInfo->capability[0] & ZM_BIT_5)
18985 + {
18986 + wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_SHORT;
18987 + }
18988 + else
18989 + {
18990 + wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_LONG;
18991 + }
18992 + }
18993 +
18994 + if (wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_LONG)
18995 + {
18996 + wd->sta.capability[0] &= ~ZM_BIT_5;
18997 + }
18998 + else
18999 + {
19000 + wd->sta.capability[0] |= ZM_BIT_5;
19001 + }
19002 +
19003 + /* check 802.11n 40MHz Setting */
19004 + if ((pBssInfo->enableHT40 == 1) &&
19005 + ((pBssInfo->extChOffset == 1) || (pBssInfo->extChOffset == 3)))
19006 + {
19007 + wd->BandWidth40 = pBssInfo->enableHT40;
19008 + wd->ExtOffset = pBssInfo->extChOffset;
19009 + }
19010 + else
19011 + {
19012 + wd->BandWidth40 = 0;
19013 + wd->ExtOffset = 0;
19014 + }
19015 +
19016 + /* check 802.11H support bit */
19017 +
19018 + /* check Owl Ap */
19019 + if ( pBssInfo->athOwlAp & ZM_BIT_0 )
19020 + {
19021 + /* In this function, FW retry will be enable, ZM_MAC_REG_RETRY_MAX
19022 + will be set to 0.
19023 + */
19024 + zfHpDisableHwRetry(dev);
19025 + wd->sta.athOwlAp = 1;
19026 + /* Set MPDU density to 8 us*/
19027 + density = ZM_MPDU_DENSITY_8US;
19028 + }
19029 + else
19030 + {
19031 + /* In this function, FW retry will be disable, ZM_MAC_REG_RETRY_MAX
19032 + will be set to 3.
19033 + */
19034 + zfHpEnableHwRetry(dev);
19035 + wd->sta.athOwlAp = 0;
19036 + }
19037 + wd->reorder = 1;
19038 +
19039 + /* Set MPDU density */
19040 + zfHpSetMPDUDensity(dev, density);
19041 +
19042 + /* check short slot time bit */
19043 + if ( pBssInfo->capability[1] & ZM_BIT_2 )
19044 + {
19045 + wd->sta.capability[1] |= ZM_BIT_2;
19046 + }
19047 +
19048 + if ( pBssInfo->erp & ZM_BIT_1 )
19049 + {
19050 + //zm_debug_msg0("protection mode on");
19051 + wd->sta.bProtectionMode = TRUE;
19052 + zfHpSetSlotTime(dev, 0);
19053 + }
19054 + else
19055 + {
19056 + //zm_debug_msg0("protection mode off");
19057 + wd->sta.bProtectionMode = FALSE;
19058 + zfHpSetSlotTime(dev, 1);
19059 + }
19060 +
19061 + if (pBssInfo->marvelAp == 1)
19062 + {
19063 + wd->sta.enableDrvBA = 0;
19064 + /*
19065 + * 8701 : NetGear 3500 (MARVELL)
19066 + * Downlink issue : set slottime to 20.
19067 + */
19068 + zfHpSetSlotTimeRegister(dev, 0);
19069 + }
19070 + else
19071 + {
19072 + wd->sta.enableDrvBA = 1;
19073 +
19074 + /*
19075 + * This is not good for here do reset slot time.
19076 + * I think it should reset when leave MARVELL ap
19077 + * or enter disconnect state etc.
19078 + */
19079 + zfHpSetSlotTimeRegister(dev, 1);
19080 + }
19081 +
19082 + //Store probe response frame body, for VISTA only
19083 + wd->sta.beaconFrameBodySize = pBssInfo->frameBodysize + 12;
19084 + if (wd->sta.beaconFrameBodySize > ZM_CACHED_FRAMEBODY_SIZE)
19085 + {
19086 + wd->sta.beaconFrameBodySize = ZM_CACHED_FRAMEBODY_SIZE;
19087 + }
19088 + for (k=0; k<8; k++)
19089 + {
19090 + wd->sta.beaconFrameBody[k] = pBssInfo->timeStamp[k];
19091 + }
19092 + wd->sta.beaconFrameBody[8] = pBssInfo->beaconInterval[0];
19093 + wd->sta.beaconFrameBody[9] = pBssInfo->beaconInterval[1];
19094 + wd->sta.beaconFrameBody[10] = pBssInfo->capability[0];
19095 + wd->sta.beaconFrameBody[11] = pBssInfo->capability[1];
19096 + for (k=0; k<(wd->sta.beaconFrameBodySize - 12); k++)
19097 + {
19098 + wd->sta.beaconFrameBody[k+12] = pBssInfo->frameBody[k];
19099 + }
19100 +
19101 + if ( ( pBssInfo->capability[0] & ZM_BIT_4 )&&
19102 + (( wd->sta.authMode == ZM_AUTH_MODE_OPEN )||
19103 + ( wd->sta.authMode == ZM_AUTH_MODE_SHARED_KEY)||
19104 + (wd->sta.authMode == ZM_AUTH_MODE_AUTO)) )
19105 + { /* privacy enabled */
19106 +
19107 + if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_DISABLED )
19108 + {
19109 + zm_debug_msg0("Adapter is no WEP, try to connect to WEP AP");
19110 + ret = FALSE;
19111 + }
19112 +
19113 + /* Do not support WEP in 11n mode */
19114 + if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_ENABLED )
19115 + {
19116 + /* Turn on software encryption/decryption for WEP */
19117 + if (wd->sta.EnableHT == 1)
19118 + {
19119 + zfStaEnableSWEncryption(dev, (ZM_SW_WEP_ENCRY_EN|ZM_SW_WEP_DECRY_EN));
19120 + }
19121 +
19122 + //wd->sta.EnableHT = 0;
19123 + //wd->BandWidth40 = 0;
19124 + //wd->ExtOffset = 0;
19125 + }
19126 +
19127 + wd->sta.capability[0] |= ZM_BIT_4;
19128 +
19129 + if ( wd->sta.authMode == ZM_AUTH_MODE_AUTO )
19130 + { /* Try to use open and shared-key authehtication alternatively */
19131 + if ( (wd->sta.connectTimeoutCount % 2) == 0 )
19132 + wd->sta.bIsSharedKey = 0;
19133 + else
19134 + wd->sta.bIsSharedKey = 1;
19135 + }
19136 + else if ( wd->sta.authMode != ZM_AUTH_MODE_SHARED_KEY )
19137 + { /* open or auto */
19138 + //zfStaStartConnect(dev, 0);
19139 + wd->sta.bIsSharedKey = 0;
19140 + }
19141 + else if ( wd->sta.authMode != ZM_AUTH_MODE_OPEN )
19142 + { /* shared key */
19143 + //zfStaStartConnect(dev, 1) ;
19144 + wd->sta.bIsSharedKey = 1;
19145 + }
19146 + }
19147 + else
19148 + {
19149 + if ( (pBssInfo->securityType == ZM_SECURITY_TYPE_WPA)||
19150 + (pBssInfo->capability[0] & ZM_BIT_4) )
19151 + {
19152 + wd->sta.capability[0] |= ZM_BIT_4;
19153 + /* initialize WPA related parameters */
19154 + }
19155 + else
19156 + {
19157 + wd->sta.capability[0] &= (~ZM_BIT_4);
19158 + }
19159 +
19160 + /* authentication with open system */
19161 + //zfStaStartConnect(dev, 0);
19162 + wd->sta.bIsSharedKey = 0;
19163 + }
19164 +
19165 + /* Improve WEP/TKIP performace with HT AP, detail information please look bug#32495 */
19166 + /*
19167 + if ( (pBssInfo->broadcomHTAp == 1)
19168 + && (wd->sta.SWEncryptEnable != 0) )
19169 + {
19170 + zfHpSetTTSIFSTime(dev, 0xa);
19171 + }
19172 + else
19173 + {
19174 + zfHpSetTTSIFSTime(dev, 0x8);
19175 + }
19176 + */
19177 + }
19178 + else
19179 + {
19180 + zm_debug_msg0("Desired SSID not found");
19181 + goto zlConnectFailed;
19182 + }
19183 +
19184 +
19185 + zfCoreSetFrequencyV2(dev, wd->frequency, zfStaStartConnectCb);
19186 + return;
19187 +
19188 +zlConnectFailed:
19189 + zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_NOT_FOUND, wd->sta.bssid, 0);
19190 + return;
19191 +}
19192 +
19193 +u8_t zfCheckWPAAuth(zdev_t* dev, struct zsBssInfo* pBssInfo)
19194 +{
19195 + u8_t ret=TRUE;
19196 + u8_t pmkCount;
19197 + u8_t i;
19198 + u16_t encAlgoType = 0;
19199 +
19200 + zmw_get_wlan_dev(dev);
19201 +
19202 + if ( wd->sta.wepStatus == ZM_ENCRYPTION_TKIP )
19203 + {
19204 + encAlgoType = ZM_TKIP;
19205 + }
19206 + else if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
19207 + {
19208 + encAlgoType = ZM_AES;
19209 + }
19210 +
19211 + switch(wd->sta.authMode)
19212 + {
19213 + case ZM_AUTH_MODE_WPA:
19214 + case ZM_AUTH_MODE_WPAPSK:
19215 + if ( pBssInfo->wpaIe[1] == 0 )
19216 + {
19217 + ret = FALSE;
19218 + break;
19219 + }
19220 +
19221 + pmkCount = pBssInfo->wpaIe[12];
19222 + for(i=0; i < pmkCount; i++)
19223 + {
19224 + if ( pBssInfo->wpaIe[17 + 4*i] == encAlgoType )
19225 + {
19226 + ret = TRUE;
19227 + goto done;
19228 + }
19229 + }
19230 +
19231 + ret = FALSE;
19232 + break;
19233 +
19234 + case ZM_AUTH_MODE_WPA2:
19235 + case ZM_AUTH_MODE_WPA2PSK:
19236 + if ( pBssInfo->rsnIe[1] == 0 )
19237 + {
19238 + ret = FALSE;
19239 + break;
19240 + }
19241 +
19242 + pmkCount = pBssInfo->rsnIe[8];
19243 + for(i=0; i < pmkCount; i++)
19244 + {
19245 + if ( pBssInfo->rsnIe[13 + 4*i] == encAlgoType )
19246 + {
19247 + ret = TRUE;
19248 + goto done;
19249 + }
19250 + }
19251 +
19252 + ret = FALSE;
19253 + break;
19254 + }
19255 +
19256 +done:
19257 + return ret;
19258 +}
19259 +
19260 +u8_t zfCheckAuthentication(zdev_t* dev, struct zsBssInfo* pBssInfo)
19261 +{
19262 + u8_t ret=TRUE;
19263 + u16_t encAlgoType;
19264 + u16_t UnicastCipherNum;
19265 +
19266 + zmw_get_wlan_dev(dev);
19267 +
19268 + /* Connecting to ANY has been checked */
19269 + if ( wd->sta.ssidLen == 0 )
19270 + {
19271 + return ret;
19272 + }
19273 +
19274 +
19275 + switch(wd->sta.authMode)
19276 + //switch(wd->ws.authMode)//Quickly reboot
19277 + {
19278 + case ZM_AUTH_MODE_WPA_AUTO:
19279 + case ZM_AUTH_MODE_WPAPSK_AUTO:
19280 + encAlgoType = 0;
19281 + if(pBssInfo->rsnIe[1] != 0)
19282 + {
19283 + UnicastCipherNum = (pBssInfo->rsnIe[8]) +
19284 + (pBssInfo->rsnIe[9] << 8);
19285 +
19286 + /* If there is only one unicast cipher */
19287 + if (UnicastCipherNum == 1)
19288 + {
19289 + encAlgoType = pBssInfo->rsnIe[13];
19290 + //encAlgoType = pBssInfo->rsnIe[7];
19291 + }
19292 + else
19293 + {
19294 + u16_t ii;
19295 + u16_t desiredCipher = 0;
19296 + u16_t IEOffSet = 13;
19297 +
19298 + /* Enumerate all the supported unicast cipher */
19299 + for (ii = 0; ii < UnicastCipherNum; ii++)
19300 + {
19301 + if (pBssInfo->rsnIe[IEOffSet+ii*4] > desiredCipher)
19302 + {
19303 + desiredCipher = pBssInfo->rsnIe[IEOffSet+ii*4];
19304 + }
19305 + }
19306 +
19307 + encAlgoType = desiredCipher;
19308 + }
19309 +
19310 + if ( encAlgoType == 0x02 )
19311 + {
19312 + wd->sta.wepStatus = ZM_ENCRYPTION_TKIP;
19313 +
19314 + if ( wd->sta.authMode == ZM_AUTH_MODE_WPA_AUTO )
19315 + {
19316 + wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA2;
19317 + }
19318 + else //ZM_AUTH_MODE_WPAPSK_AUTO
19319 + {
19320 + wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA2PSK;
19321 + }
19322 + }
19323 + else if ( encAlgoType == 0x04 )
19324 + {
19325 + wd->sta.wepStatus = ZM_ENCRYPTION_AES;
19326 +
19327 + if ( wd->sta.authMode == ZM_AUTH_MODE_WPA_AUTO )
19328 + {
19329 + wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA2;
19330 + }
19331 + else //ZM_AUTH_MODE_WPAPSK_AUTO
19332 + {
19333 + wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA2PSK;
19334 + }
19335 + }
19336 + else
19337 + {
19338 + ret = FALSE;
19339 + }
19340 + }
19341 + else if(pBssInfo->wpaIe[1] != 0)
19342 + {
19343 + UnicastCipherNum = (pBssInfo->wpaIe[12]) +
19344 + (pBssInfo->wpaIe[13] << 8);
19345 +
19346 + /* If there is only one unicast cipher */
19347 + if (UnicastCipherNum == 1)
19348 + {
19349 + encAlgoType = pBssInfo->wpaIe[17];
19350 + //encAlgoType = pBssInfo->wpaIe[11];
19351 + }
19352 + else
19353 + {
19354 + u16_t ii;
19355 + u16_t desiredCipher = 0;
19356 + u16_t IEOffSet = 17;
19357 +
19358 + /* Enumerate all the supported unicast cipher */
19359 + for (ii = 0; ii < UnicastCipherNum; ii++)
19360 + {
19361 + if (pBssInfo->wpaIe[IEOffSet+ii*4] > desiredCipher)
19362 + {
19363 + desiredCipher = pBssInfo->wpaIe[IEOffSet+ii*4];
19364 + }
19365 + }
19366 +
19367 + encAlgoType = desiredCipher;
19368 + }
19369 +
19370 + if ( encAlgoType == 0x02 )
19371 + {
19372 + wd->sta.wepStatus = ZM_ENCRYPTION_TKIP;
19373 +
19374 + if ( wd->sta.authMode == ZM_AUTH_MODE_WPA_AUTO )
19375 + {
19376 + wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA;
19377 + }
19378 + else //ZM_AUTH_MODE_WPAPSK_AUTO
19379 + {
19380 + wd->sta.currentAuthMode = ZM_AUTH_MODE_WPAPSK;
19381 + }
19382 + }
19383 + else if ( encAlgoType == 0x04 )
19384 + {
19385 + wd->sta.wepStatus = ZM_ENCRYPTION_AES;
19386 +
19387 + if ( wd->sta.authMode == ZM_AUTH_MODE_WPA_AUTO )
19388 + {
19389 + wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA;
19390 + }
19391 + else //ZM_AUTH_MODE_WPAPSK_AUTO
19392 + {
19393 + wd->sta.currentAuthMode = ZM_AUTH_MODE_WPAPSK;
19394 + }
19395 + }
19396 + else
19397 + {
19398 + ret = FALSE;
19399 + }
19400 +
19401 +
19402 + }
19403 + else
19404 + {
19405 + ret = FALSE;
19406 + }
19407 +
19408 + break;
19409 +
19410 + case ZM_AUTH_MODE_WPA:
19411 + case ZM_AUTH_MODE_WPAPSK:
19412 + case ZM_AUTH_MODE_WPA_NONE:
19413 + case ZM_AUTH_MODE_WPA2:
19414 + case ZM_AUTH_MODE_WPA2PSK:
19415 + {
19416 + if ( pBssInfo->securityType != ZM_SECURITY_TYPE_WPA )
19417 + {
19418 + ret = FALSE;
19419 + }
19420 +
19421 + ret = zfCheckWPAAuth(dev, pBssInfo);
19422 + }
19423 + break;
19424 +
19425 + case ZM_AUTH_MODE_OPEN:
19426 + case ZM_AUTH_MODE_SHARED_KEY:
19427 + case ZM_AUTH_MODE_AUTO:
19428 + {
19429 + if ( pBssInfo->wscIe[1] )
19430 + {
19431 + // If the AP is a Jumpstart AP, it's ok!! Ray
19432 + break;
19433 + }
19434 + else if ( pBssInfo->securityType == ZM_SECURITY_TYPE_WPA )
19435 + {
19436 + ret = FALSE;
19437 + }
19438 + }
19439 + break;
19440 +
19441 + default:
19442 + break;
19443 + }
19444 +
19445 + return ret;
19446 +}
19447 +
19448 +u8_t zfStaIsConnected(zdev_t* dev)
19449 +{
19450 + zmw_get_wlan_dev(dev);
19451 +
19452 + if ( wd->sta.adapterState == ZM_STA_STATE_CONNECTED )
19453 + {
19454 + return TRUE;
19455 + }
19456 +
19457 + return FALSE;
19458 +}
19459 +
19460 +u8_t zfStaIsConnecting(zdev_t* dev)
19461 +{
19462 + zmw_get_wlan_dev(dev);
19463 +
19464 + if ( wd->sta.adapterState == ZM_STA_STATE_CONNECTING )
19465 + {
19466 + return TRUE;
19467 + }
19468 +
19469 + return FALSE;
19470 +}
19471 +
19472 +u8_t zfStaIsDisconnect(zdev_t* dev)
19473 +{
19474 + zmw_get_wlan_dev(dev);
19475 +
19476 + if ( wd->sta.adapterState == ZM_STA_STATE_DISCONNECT )
19477 + {
19478 + return TRUE;
19479 + }
19480 +
19481 + return FALSE;
19482 +}
19483 +
19484 +u8_t zfChangeAdapterState(zdev_t* dev, u8_t newState)
19485 +{
19486 + u8_t ret = TRUE;
19487 +
19488 + zmw_get_wlan_dev(dev);
19489 +
19490 + zmw_declare_for_critical_section();
19491 +
19492 + //if ( newState == wd->sta.adapterState )
19493 + //{
19494 + // return FALSE;
19495 + //}
19496 +
19497 + switch(newState)
19498 + {
19499 + case ZM_STA_STATE_DISCONNECT:
19500 + zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_DISCONNECT);
19501 +
19502 + #if 1
19503 + zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
19504 + #else
19505 + if ( wd->sta.bChannelScan )
19506 + {
19507 + /* stop the action of channel scanning */
19508 + wd->sta.bChannelScan = FALSE;
19509 + ret = TRUE;
19510 + break;
19511 + }
19512 + #endif
19513 +
19514 + break;
19515 + case ZM_STA_STATE_CONNECTING:
19516 + #if 1
19517 + zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
19518 + #else
19519 + if ( wd->sta.bChannelScan )
19520 + {
19521 + /* stop the action of channel scanning */
19522 + wd->sta.bChannelScan = FALSE;
19523 + ret = TRUE;
19524 + break;
19525 + }
19526 + #endif
19527 +
19528 + break;
19529 + case ZM_STA_STATE_CONNECTED:
19530 + break;
19531 + default:
19532 + break;
19533 + }
19534 +
19535 + //if ( ret )
19536 + //{
19537 + zmw_enter_critical_section(dev);
19538 + wd->sta.adapterState = newState;
19539 + zmw_leave_critical_section(dev);
19540 +
19541 + zm_debug_msg1("change adapter state = ", newState);
19542 + //}
19543 +
19544 + return ret;
19545 +}
19546 +
19547 +/************************************************************************/
19548 +/* */
19549 +/* FUNCTION DESCRIPTION zfStaMmAddIeSsid */
19550 +/* Add information element SSID to buffer. */
19551 +/* */
19552 +/* INPUTS */
19553 +/* dev : device pointer */
19554 +/* buf : buffer to add information element */
19555 +/* offset : add information element from this offset */
19556 +/* */
19557 +/* OUTPUTS */
19558 +/* buffer offset after adding information element */
19559 +/* */
19560 +/* AUTHOR */
19561 +/* Ji-Huang Lee ZyDAS Technology Corporation 2005.11 */
19562 +/* */
19563 +/************************************************************************/
19564 +u16_t zfStaAddIeSsid(zdev_t* dev, zbuf_t* buf, u16_t offset)
19565 +{
19566 + u16_t i;
19567 +
19568 + zmw_get_wlan_dev(dev);
19569 +
19570 + /* Element ID */
19571 + zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SSID);
19572 +
19573 + /* Element Length */
19574 + zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.ssidLen);
19575 +
19576 + /* Information : SSID */
19577 + for (i=0; i<wd->sta.ssidLen; i++)
19578 + {
19579 + zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.ssid[i]);
19580 + }
19581 +
19582 + return offset;
19583 +}
19584 +
19585 +/************************************************************************/
19586 +/* */
19587 +/* FUNCTION DESCRIPTION zfStaMmAddIeWpa */
19588 +/* Add information element SSID to buffer. */
19589 +/* */
19590 +/* INPUTS */
19591 +/* dev : device pointer */
19592 +/* buf : buffer to add information element */
19593 +/* offset : add information element from this offset */
19594 +/* */
19595 +/* OUTPUTS */
19596 +/* buffer offset after adding information element */
19597 +/* */
19598 +/* AUTHOR */
19599 +/* Ji-Huang Lee ZyDAS Technology Corporation 2006.01 */
19600 +/* */
19601 +/************************************************************************/
19602 +u16_t zfStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType)
19603 +{
19604 + u32_t i;
19605 + u8_t ssn[64]={
19606 + /* Element ID */
19607 + 0xdd,
19608 + /* Length */
19609 + 0x18,
19610 + /* OUI type */
19611 + 0x00, 0x50, 0xf2, 0x01,
19612 + /* Version */
19613 + 0x01, 0x00,
19614 + /* Group Cipher Suite, default=TKIP */
19615 + 0x00, 0x50, 0xf2, 0x02,
19616 + /* Pairwise Cipher Suite Count */
19617 + 0x01, 0x00,
19618 + /* Pairwise Cipher Suite, default=TKIP */
19619 + 0x00, 0x50, 0xf2, 0x02,
19620 + /* Authentication and Key Management Suite Count */
19621 + 0x01, 0x00,
19622 + /* Authentication type, default=PSK */
19623 + 0x00, 0x50, 0xf2, 0x02,
19624 + /* WPA capability */
19625 + 0x00, 0x00
19626 + };
19627 +
19628 + u8_t rsn[64]={
19629 + /* Element ID */
19630 + 0x30,
19631 + /* Length */
19632 + 0x14,
19633 + /* Version */
19634 + 0x01, 0x00,
19635 + /* Group Cipher Suite, default=TKIP */
19636 + 0x00, 0x0f, 0xac, 0x02,
19637 + /* Pairwise Cipher Suite Count */
19638 + 0x01, 0x00,
19639 + /* Pairwise Cipher Suite, default=TKIP */
19640 + 0x00, 0x0f, 0xac, 0x02,
19641 + /* Authentication and Key Management Suite Count */
19642 + 0x01, 0x00,
19643 + /* Authentication type, default=PSK */
19644 + 0x00, 0x0f, 0xac, 0x02,
19645 + /* RSN capability */
19646 + 0x00, 0x00
19647 + };
19648 +
19649 + zmw_get_wlan_dev(dev);
19650 +
19651 + if ( wd->sta.currentAuthMode == ZM_AUTH_MODE_WPAPSK )
19652 + {
19653 + /* Overwrite Group Cipher Suite by AP's setting */
19654 + zfMemoryCopy(ssn+8, wd->sta.wpaIe+8, 4);
19655 +
19656 + if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
19657 + {
19658 + /* Overwrite Pairwise Cipher Suite by AES */
19659 + zfMemoryCopy(ssn+14, zgWpaAesOui, 4);
19660 + }
19661 +
19662 + zfCopyToIntTxBuffer(dev, buf, ssn, offset, ssn[1]+2);
19663 + zfMemoryCopy(wd->sta.wpaIe, ssn, ssn[1]+2);
19664 + offset += (ssn[1]+2);
19665 + }
19666 + else if ( wd->sta.currentAuthMode == ZM_AUTH_MODE_WPA )
19667 + {
19668 + /* Overwrite Group Cipher Suite by AP's setting */
19669 + zfMemoryCopy(ssn+8, wd->sta.wpaIe+8, 4);
19670 + /* Overwrite Key Management Suite by WPA-Radius */
19671 + zfMemoryCopy(ssn+20, zgWpaRadiusOui, 4);
19672 +
19673 + if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
19674 + {
19675 + /* Overwrite Pairwise Cipher Suite by AES */
19676 + zfMemoryCopy(ssn+14, zgWpaAesOui, 4);
19677 + }
19678 +
19679 + zfCopyToIntTxBuffer(dev, buf, ssn, offset, ssn[1]+2);
19680 + zfMemoryCopy(wd->sta.wpaIe, ssn, ssn[1]+2);
19681 + offset += (ssn[1]+2);
19682 + }
19683 + else if ( wd->sta.currentAuthMode == ZM_AUTH_MODE_WPA2PSK )
19684 + {
19685 + /* Overwrite Group Cipher Suite by AP's setting */
19686 + zfMemoryCopy(rsn+4, wd->sta.rsnIe+4, 4);
19687 +
19688 + if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
19689 + {
19690 + /* Overwrite Pairwise Cipher Suite by AES */
19691 + zfMemoryCopy(rsn+10, zgWpa2AesOui, 4);
19692 + }
19693 +
19694 + if ( frameType == ZM_WLAN_FRAME_TYPE_REASOCREQ )
19695 + {
19696 + for(i=0; i<wd->sta.pmkidInfo.bssidCount; i++)
19697 + {
19698 + if ( zfMemoryIsEqual((u8_t*) wd->sta.pmkidInfo.bssidInfo[i].bssid,
19699 + (u8_t*) wd->sta.bssid, 6) )
19700 + {
19701 + /* matched */
19702 + break;
19703 + }
19704 +
19705 + if ( i < wd->sta.pmkidInfo.bssidCount )
19706 + {
19707 + // Fill PMKID Count in RSN information element
19708 + rsn[22] = 0x01;
19709 + rsn[23] = 0x00;
19710 +
19711 + // Fill PMKID in RSN information element
19712 + zfMemoryCopy(rsn+24,
19713 + wd->sta.pmkidInfo.bssidInfo[i].pmkid, 16);
19714 + rsn[1] += 18;
19715 + }
19716 + }
19717 + }
19718 +
19719 + zfCopyToIntTxBuffer(dev, buf, rsn, offset, rsn[1]+2);
19720 + zfMemoryCopy(wd->sta.rsnIe, rsn, rsn[1]+2);
19721 + offset += (rsn[1]+2);
19722 + }
19723 + else if ( wd->sta.currentAuthMode == ZM_AUTH_MODE_WPA2 )
19724 + {
19725 + /* Overwrite Group Cipher Suite by AP's setting */
19726 + zfMemoryCopy(rsn+4, wd->sta.rsnIe+4, 4);
19727 + /* Overwrite Key Management Suite by WPA2-Radius */
19728 + zfMemoryCopy(rsn+16, zgWpa2RadiusOui, 4);
19729 +
19730 + if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
19731 + {
19732 + /* Overwrite Pairwise Cipher Suite by AES */
19733 + zfMemoryCopy(rsn+10, zgWpa2AesOui, 4);
19734 + }
19735 +
19736 + if (( frameType == ZM_WLAN_FRAME_TYPE_REASOCREQ || ( frameType == ZM_WLAN_FRAME_TYPE_ASOCREQ )))
19737 + {
19738 +
19739 + if (wd->sta.pmkidInfo.bssidCount != 0) {
19740 + // Fill PMKID Count in RSN information element
19741 + rsn[22] = 1;
19742 + rsn[23] = 0;
19743 + /*
19744 + * The caller is respnsible to give us the relevant PMKID.
19745 + * We'll only accept 1 PMKID for now.
19746 + */
19747 + for(i=0; i<wd->sta.pmkidInfo.bssidCount; i++)
19748 + {
19749 + if ( zfMemoryIsEqual((u8_t*) wd->sta.pmkidInfo.bssidInfo[i].bssid, (u8_t*) wd->sta.bssid, 6) )
19750 + {
19751 + zfMemoryCopy(rsn+24, wd->sta.pmkidInfo.bssidInfo[i].pmkid, 16);
19752 + break;
19753 + }
19754 + }
19755 + rsn[1] += 18;
19756 + }
19757 +
19758 + }
19759 +
19760 + zfCopyToIntTxBuffer(dev, buf, rsn, offset, rsn[1]+2);
19761 + zfMemoryCopy(wd->sta.rsnIe, rsn, rsn[1]+2);
19762 + offset += (rsn[1]+2);
19763 + }
19764 +
19765 + return offset;
19766 +}
19767 +
19768 +/************************************************************************/
19769 +/* */
19770 +/* FUNCTION DESCRIPTION zfStaAddIeIbss */
19771 +/* Add information element IBSS parameter to buffer. */
19772 +/* */
19773 +/* INPUTS */
19774 +/* dev : device pointer */
19775 +/* buf : buffer to add information element */
19776 +/* offset : add information element from this offset */
19777 +/* */
19778 +/* OUTPUTS */
19779 +/* buffer offset after adding information element */
19780 +/* */
19781 +/* AUTHOR */
19782 +/* Ji-Huang Lee ZyDAS Technology Corporation 2005.12 */
19783 +/* */
19784 +/************************************************************************/
19785 +u16_t zfStaAddIeIbss(zdev_t* dev, zbuf_t* buf, u16_t offset)
19786 +{
19787 + zmw_get_wlan_dev(dev);
19788 +
19789 + /* Element ID */
19790 + zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_IBSS);
19791 +
19792 + /* Element Length */
19793 + zmw_tx_buf_writeb(dev, buf, offset++, 2);
19794 +
19795 + /* ATIM window */
19796 + zmw_tx_buf_writeh(dev, buf, offset, wd->sta.atimWindow);
19797 + offset += 2;
19798 +
19799 + return offset;
19800 +}
19801 +
19802 +
19803 +
19804 +/************************************************************************/
19805 +/* */
19806 +/* FUNCTION DESCRIPTION zfStaAddIeWmeInfo */
19807 +/* Add WME Information Element to buffer. */
19808 +/* */
19809 +/* INPUTS */
19810 +/* dev : device pointer */
19811 +/* buf : buffer to add information element */
19812 +/* offset : add information element from this offset */
19813 +/* */
19814 +/* OUTPUTS */
19815 +/* buffer offset after adding information element */
19816 +/* */
19817 +/* AUTHOR */
19818 +/* Stephen Chen ZyDAS Technology Corporation 2006.6 */
19819 +/* */
19820 +/************************************************************************/
19821 +u16_t zfStaAddIeWmeInfo(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t qosInfo)
19822 +{
19823 + /* Element ID */
19824 + zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_WIFI_IE);
19825 +
19826 + /* Element Length */
19827 + zmw_tx_buf_writeb(dev, buf, offset++, 7);
19828 +
19829 + /* OUI */
19830 + zmw_tx_buf_writeb(dev, buf, offset++, 0x00);
19831 + zmw_tx_buf_writeb(dev, buf, offset++, 0x50);
19832 + zmw_tx_buf_writeb(dev, buf, offset++, 0xF2);
19833 + zmw_tx_buf_writeb(dev, buf, offset++, 0x02);
19834 + zmw_tx_buf_writeb(dev, buf, offset++, 0x00);
19835 + zmw_tx_buf_writeb(dev, buf, offset++, 0x01);
19836 +
19837 + /* QoS Info */
19838 + zmw_tx_buf_writeb(dev, buf, offset++, qosInfo);
19839 +
19840 + return offset;
19841 +}
19842 +
19843 +/************************************************************************/
19844 +/* */
19845 +/* FUNCTION DESCRIPTION zfStaAddIePowerCap */
19846 +/* Add information element Power capability to buffer. */
19847 +/* */
19848 +/* INPUTS */
19849 +/* dev : device pointer */
19850 +/* buf : buffer to add information element */
19851 +/* offset : add information element from this offset */
19852 +/* */
19853 +/* OUTPUTS */
19854 +/* buffer offset after adding information element */
19855 +/* */
19856 +/* AUTHOR */
19857 +/* Sharon 2007.12 */
19858 +/* */
19859 +/************************************************************************/
19860 +u16_t zfStaAddIePowerCap(zdev_t* dev, zbuf_t* buf, u16_t offset)
19861 +{
19862 + u8_t MaxTxPower;
19863 + u8_t MinTxPower;
19864 +
19865 + zmw_get_wlan_dev(dev);
19866 +
19867 + /* Element ID */
19868 + zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_POWER_CAPABILITY);
19869 +
19870 + /* Element Length */
19871 + zmw_tx_buf_writeb(dev, buf, offset++, 2);
19872 +
19873 + MinTxPower = (u8_t)(zfHpGetMinTxPower(dev)/2);
19874 + MaxTxPower = (u8_t)(zfHpGetMaxTxPower(dev)/2);
19875 +
19876 + /* Min Transmit Power Cap */
19877 + zmw_tx_buf_writeh(dev, buf, offset++, MinTxPower);
19878 +
19879 + /* Max Transmit Power Cap */
19880 + zmw_tx_buf_writeh(dev, buf, offset++, MaxTxPower);
19881 +
19882 + return offset;
19883 +}
19884 +/************************************************************************/
19885 +/* */
19886 +/* FUNCTION DESCRIPTION zfStaAddIeSupportCh */
19887 +/* Add information element supported channels to buffer. */
19888 +/* */
19889 +/* INPUTS */
19890 +/* dev : device pointer */
19891 +/* buf : buffer to add information element */
19892 +/* offset : add information element from this offset */
19893 +/* */
19894 +/* OUTPUTS */
19895 +/* buffer offset after adding information element */
19896 +/* */
19897 +/* AUTHOR */
19898 +/* Sharon 2007.12 */
19899 +/* */
19900 +/************************************************************************/
19901 +u16_t zfStaAddIeSupportCh(zdev_t* dev, zbuf_t* buf, u16_t offset)
19902 +{
19903 +
19904 + u8_t i;
19905 + u16_t count_24G = 0;
19906 + u16_t count_5G = 0;
19907 + u16_t channelNum;
19908 + u8_t length;
19909 +
19910 + zmw_get_wlan_dev(dev);
19911 +
19912 + zmw_declare_for_critical_section();
19913 + zmw_enter_critical_section(dev);
19914 +
19915 + for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
19916 + {
19917 + if (wd->regulationTable.allowChannel[i].channel < 3000)
19918 + { // 2.4Hz
19919 + count_24G++;
19920 + }
19921 + else
19922 + { // 5GHz
19923 + count_5G++;
19924 + }
19925 + }
19926 +
19927 + length = (u8_t)(count_5G * 2 + 2); //5G fill by pair, 2,4G (continuous channels) fill 2 bytes
19928 +
19929 + /* Element ID */
19930 + zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SUPPORTED_CHANNELS );
19931 +
19932 + /* Element Length */
19933 + zmw_tx_buf_writeb(dev, buf, offset++, length);
19934 +
19935 + // 2.4GHz (continuous channels)
19936 + /* First channel number */
19937 + zmw_tx_buf_writeh(dev, buf, offset++, 1); //Start from channle 1
19938 + /* Number of channels */
19939 + zmw_tx_buf_writeh(dev, buf, offset++, count_24G);
19940 +
19941 + for (i = 0; i < wd->regulationTable.allowChannelCnt ; i++)
19942 + {
19943 + if (wd->regulationTable.allowChannel[i].channel > 4000 && wd->regulationTable.allowChannel[i].channel < 5000)
19944 + { // 5GHz 4000 -5000Mhz
19945 + channelNum = (wd->regulationTable.allowChannel[i].channel-4000)/5;
19946 + /* First channel number */
19947 + zmw_tx_buf_writeh(dev, buf, offset++, channelNum);
19948 + /* Number of channels */
19949 + zmw_tx_buf_writeh(dev, buf, offset++, 1);
19950 + }
19951 + else if (wd->regulationTable.allowChannel[i].channel >= 5000)
19952 + { // 5GHz >5000Mhz
19953 + channelNum = (wd->regulationTable.allowChannel[i].channel-5000)/5;
19954 + /* First channel number */
19955 + zmw_tx_buf_writeh(dev, buf, offset++, channelNum);
19956 + /* Number of channels */
19957 + zmw_tx_buf_writeh(dev, buf, offset++, 1);
19958 + }
19959 + }
19960 + zmw_leave_critical_section(dev);
19961 +
19962 + return offset;
19963 +}
19964 +
19965 +void zfStaStartConnectCb(zdev_t* dev)
19966 +{
19967 + zmw_get_wlan_dev(dev);
19968 +
19969 + zfStaStartConnect(dev, wd->sta.bIsSharedKey);
19970 +}
19971 +
19972 +void zfStaStartConnect(zdev_t* dev, u8_t bIsSharedKey)
19973 +{
19974 + u32_t p1, p2;
19975 + u8_t newConnState;
19976 +
19977 + zmw_get_wlan_dev(dev);
19978 + zmw_declare_for_critical_section();
19979 +
19980 + /* p1_low = algorithm number, p1_high = transaction sequence number */
19981 + if ( bIsSharedKey )
19982 + {
19983 + //wd->sta.connectState = ZM_STA_CONN_STATE_AUTH_SHARE_1;
19984 + newConnState = ZM_STA_CONN_STATE_AUTH_SHARE_1;
19985 + zm_debug_msg0("ZM_STA_CONN_STATE_AUTH_SHARE_1");
19986 + p1 = ZM_AUTH_ALGO_SHARED_KEY;
19987 + }
19988 + else
19989 + {
19990 + //wd->sta.connectState = ZM_STA_CONN_STATE_AUTH_OPEN;
19991 + newConnState = ZM_STA_CONN_STATE_AUTH_OPEN;
19992 + zm_debug_msg0("ZM_STA_CONN_STATE_AUTH_OPEN");
19993 + if( wd->sta.leapEnabled )
19994 + p1 = ZM_AUTH_ALGO_LEAP;
19995 + else
19996 + p1 = ZM_AUTH_ALGO_OPEN_SYSTEM;
19997 + }
19998 +
19999 + /* status code */
20000 + p2 = 0x0;
20001 +
20002 + zmw_enter_critical_section(dev);
20003 + wd->sta.connectTimer = wd->tick;
20004 + wd->sta.connectState = newConnState;
20005 + zmw_leave_critical_section(dev);
20006 +
20007 + /* send the 1st authentication frame */
20008 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_AUTH, wd->sta.bssid, p1, p2, 0);
20009 +
20010 + return;
20011 +}
20012 +
20013 +void zfSendNullData(zdev_t* dev, u8_t type)
20014 +{
20015 + zbuf_t* buf;
20016 + //u16_t addrTblSize;
20017 + //struct zsAddrTbl addrTbl;
20018 + u16_t err;
20019 + u16_t hlen;
20020 + u16_t header[(34+8+1)/2];
20021 + u16_t bcastAddr[3] = {0xffff,0xffff,0xffff};
20022 + u16_t *dstAddr;
20023 +
20024 + zmw_get_wlan_dev(dev);
20025 +
20026 + if ((buf = zfwBufAllocate(dev, 1024)) == NULL)
20027 + {
20028 + zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!");
20029 + return;
20030 + }
20031 +
20032 + zfwBufSetSize(dev, buf, 0);
20033 +
20034 + //zm_msg2_mm(ZM_LV_2, "buf->len=", buf->len);
20035 +
20036 + if ( wd->wlanMode == ZM_MODE_IBSS)
20037 + {
20038 + dstAddr = bcastAddr;
20039 + }
20040 + else
20041 + {
20042 + dstAddr = wd->sta.bssid;
20043 + }
20044 +
20045 + if (wd->sta.wmeConnected != 0)
20046 + {
20047 + /* If connect to a WMM AP, Send QoS Null data */
20048 + hlen = zfTxGenMmHeader(dev, ZM_WLAN_FRAME_TYPE_QOS_NULL, dstAddr, header, 0, buf, 0, 0);
20049 + }
20050 + else
20051 + {
20052 + hlen = zfTxGenMmHeader(dev, ZM_WLAN_FRAME_TYPE_NULL, dstAddr, header, 0, buf, 0, 0);
20053 + }
20054 +
20055 + if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)
20056 + {
20057 + header[4] |= 0x0100; //TODS bit
20058 + }
20059 +
20060 + if ( type == 1 )
20061 + {
20062 + header[4] |= 0x1000;
20063 + }
20064 +
20065 + /* Get buffer DMA address */
20066 + //if ((addrTblSize = zfwBufMapDma(dev, buf, &addrTbl)) == 0)
20067 + //if ((addrTblSize = zfwMapTxDma(dev, buf, &addrTbl)) == 0)
20068 + //{
20069 + // goto zlError;
20070 + //}
20071 +
20072 + /*increase unicast frame counter*/
20073 + wd->commTally.txUnicastFrm++;
20074 +
20075 + if ((err = zfHpSend(dev, header, hlen, NULL, 0, NULL, 0, buf, 0,
20076 + ZM_INTERNAL_ALLOC_BUF, 0, 0xff)) != ZM_SUCCESS)
20077 + {
20078 + goto zlError;
20079 + }
20080 +
20081 +
20082 + return;
20083 +
20084 +zlError:
20085 +
20086 + zfwBufFree(dev, buf, 0);
20087 + return;
20088 +
20089 +}
20090 +
20091 +void zfSendPSPoll(zdev_t* dev)
20092 +{
20093 + zbuf_t* buf;
20094 + //u16_t addrTblSize;
20095 + //struct zsAddrTbl addrTbl;
20096 + u16_t err;
20097 + u16_t hlen;
20098 + u16_t header[(8+24+1)/2];
20099 +
20100 + zmw_get_wlan_dev(dev);
20101 +
20102 + if ((buf = zfwBufAllocate(dev, 1024)) == NULL)
20103 + {
20104 + zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!");
20105 + return;
20106 + }
20107 +
20108 + zfwBufSetSize(dev, buf, 0);
20109 +
20110 + //zm_msg2_mm(ZM_LV_2, "buf->len=", buf->len);
20111 +
20112 + zfTxGenMmHeader(dev, ZM_WLAN_FRAME_TYPE_PSPOLL, wd->sta.bssid, header, 0, buf, 0, 0);
20113 +
20114 + header[0] = 20;
20115 + header[4] |= 0x1000;
20116 + header[5] = wd->sta.aid | 0xc000; //Both bit-14 and bit-15 are 1
20117 + hlen = 16 + 8;
20118 +
20119 + /* Get buffer DMA address */
20120 + //if ((addrTblSize = zfwBufMapDma(dev, buf, &addrTbl)) == 0)
20121 + //if ((addrTblSize = zfwMapTxDma(dev, buf, &addrTbl)) == 0)
20122 + //{
20123 + // goto zlError;
20124 + //}
20125 +
20126 + if ((err = zfHpSend(dev, header, hlen, NULL, 0, NULL, 0, buf, 0,
20127 + ZM_INTERNAL_ALLOC_BUF, 0, 0xff)) != ZM_SUCCESS)
20128 + {
20129 + goto zlError;
20130 + }
20131 +
20132 + return;
20133 +
20134 +zlError:
20135 +
20136 + zfwBufFree(dev, buf, 0);
20137 + return;
20138 +
20139 +}
20140 +
20141 +void zfSendBA(zdev_t* dev, u16_t start_seq, u8_t *bitmap)
20142 +{
20143 + zbuf_t* buf;
20144 + //u16_t addrTblSize;
20145 + //struct zsAddrTbl addrTbl;
20146 + u16_t err;
20147 + u16_t hlen;
20148 + u16_t header[(8+24+1)/2];
20149 + u16_t i, offset = 0;
20150 +
20151 + zmw_get_wlan_dev(dev);
20152 +
20153 + if ((buf = zfwBufAllocate(dev, 1024)) == NULL)
20154 + {
20155 + zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!");
20156 + return;
20157 + }
20158 +
20159 + zfwBufSetSize(dev, buf, 12); // 28 = FC 2 + DU 2 + RA 6 + TA 6 + BAC 2 + SEQ 2 + BitMap 8
20160 + // 12 = BAC 2 + SEQ 2 + BitMap 8
20161 +
20162 + //zm_msg2_mm(ZM_LV_2, "buf->len=", buf->len);
20163 +
20164 + zfTxGenMmHeader(dev, ZM_WLAN_FRAME_TYPE_BA, wd->sta.bssid, header, 0, buf, 0, 0);
20165 +
20166 + header[0] = 32; /* MAC header 16 + BA control 2 + BA info 10 + FCS 4*/
20167 + header[1] = 0x4; /* No ACK */
20168 +
20169 + /* send by OFDM 6M */
20170 + header[2] = (u16_t)(zcRateToPhyCtrl[4] & 0xffff);
20171 + header[3] = (u16_t)(zcRateToPhyCtrl[4]>>16) & 0xffff;
20172 +
20173 + hlen = 16 + 8; /* MAC header 16 + control 8*/
20174 + offset = 0;
20175 + zmw_tx_buf_writeh(dev, buf, offset, 0x05); /*compressed bitmap on*/
20176 + offset+=2;
20177 + zmw_tx_buf_writeh(dev, buf, offset, start_seq);
20178 + offset+=2;
20179 +
20180 + for (i=0; i<8; i++) {
20181 + zmw_tx_buf_writeb(dev, buf, offset, bitmap[i]);
20182 + offset++;
20183 + }
20184 +
20185 + if ((err = zfHpSend(dev, header, hlen, NULL, 0, NULL, 0, buf, 0,
20186 + ZM_INTERNAL_ALLOC_BUF, 0, 0xff)) != ZM_SUCCESS)
20187 + {
20188 + goto zlError;
20189 + }
20190 +
20191 + return;
20192 +
20193 +zlError:
20194 +
20195 + zfwBufFree(dev, buf, 0);
20196 + return;
20197 +
20198 +}
20199 +
20200 +void zfStaGetTxRate(zdev_t* dev, u16_t* macAddr, u32_t* phyCtrl,
20201 + u16_t* rcProbingFlag)
20202 +{
20203 + u8_t addr[6], i;
20204 + u8_t rate;
20205 + zmw_get_wlan_dev(dev);
20206 + zmw_declare_for_critical_section();
20207 +
20208 + ZM_MAC_WORD_TO_BYTE(macAddr, addr);
20209 + *phyCtrl = 0;
20210 +
20211 + if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
20212 + {
20213 + zmw_enter_critical_section(dev);
20214 + rate = (u8_t)zfRateCtrlGetTxRate(dev, &wd->sta.oppositeInfo[0].rcCell, rcProbingFlag);
20215 +//#ifdef ZM_FB50
20216 + //rate = 27;
20217 +//#endif
20218 + *phyCtrl = zcRateToPhyCtrl[rate];
20219 + zmw_leave_critical_section(dev);
20220 + }
20221 + else
20222 + {
20223 + zmw_enter_critical_section(dev);
20224 + for(i=0; i<wd->sta.oppositeCount; i++)
20225 + {
20226 + if ( addr[0] && 0x01 == 1 ) // The default beacon transmitted rate is CCK and 1 Mbps , but the a mode should use
20227 + // OFDM modulation and 6Mbps to transmit beacon.
20228 + {
20229 + //rate = (u8_t)zfRateCtrlGetTxRate(dev, &wd->sta.oppositeInfo[i].rcCell, rcProbingFlag);
20230 + rate = wd->sta.oppositeInfo[i].rcCell.operationRateSet[0];
20231 + *phyCtrl = zcRateToPhyCtrl[rate];
20232 + break;
20233 + }
20234 + else if ( zfMemoryIsEqual(addr, wd->sta.oppositeInfo[i].macAddr, 6) )
20235 + {
20236 + rate = (u8_t)zfRateCtrlGetTxRate(dev, &wd->sta.oppositeInfo[i].rcCell, rcProbingFlag);
20237 + *phyCtrl = zcRateToPhyCtrl[rate];
20238 + break;
20239 + }
20240 + }
20241 + zmw_leave_critical_section(dev);
20242 + }
20243 +
20244 + return;
20245 +}
20246 +
20247 +struct zsMicVar* zfStaGetRxMicKey(zdev_t* dev, zbuf_t* buf)
20248 +{
20249 + u8_t keyIndex;
20250 + u8_t da0;
20251 +
20252 + zmw_get_wlan_dev(dev);
20253 +
20254 + /* if need not check MIC, return NULL */
20255 + if ( ((wd->sta.encryMode != ZM_TKIP)&&(wd->sta.encryMode != ZM_AES))||
20256 + (wd->sta.wpaState < ZM_STA_WPA_STATE_PK_OK) )
20257 + {
20258 + return NULL;
20259 + }
20260 +
20261 + da0 = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A1_OFFSET);
20262 +
20263 + if ((zmw_rx_buf_readb(dev, buf, 0) & 0x80) == 0x80)
20264 + keyIndex = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_IV_OFFSET+5); /* Qos Packet*/
20265 + else
20266 + keyIndex = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_IV_OFFSET+3); /* normal Packet*/
20267 + keyIndex = (keyIndex & 0xc0) >> 6;
20268 +
20269 + return (&wd->sta.rxMicKey[keyIndex]);
20270 +}
20271 +
20272 +struct zsMicVar* zfStaGetTxMicKey(zdev_t* dev, zbuf_t* buf)
20273 +{
20274 + zmw_get_wlan_dev(dev);
20275 +
20276 + /* if need not check MIC, return NULL */
20277 + //if ( ((wd->sta.encryMode != ZM_TKIP)&&(wd->sta.encryMode != ZM_AES))||
20278 + // (wd->sta.wpaState < ZM_STA_WPA_STATE_PK_OK) )
20279 + if ( (wd->sta.encryMode != ZM_TKIP) || (wd->sta.wpaState < ZM_STA_WPA_STATE_PK_OK) )
20280 + {
20281 + return NULL;
20282 + }
20283 +
20284 + return (&wd->sta.txMicKey);
20285 +}
20286 +
20287 +u16_t zfStaRxValidateFrame(zdev_t* dev, zbuf_t* buf)
20288 +{
20289 + u8_t frameType, frameCtrl;
20290 + u8_t da0;
20291 + //u16_t sa[3];
20292 + u16_t ret;
20293 + u16_t i;
20294 + //u8_t sa0;
20295 +
20296 + zmw_get_wlan_dev(dev);
20297 +
20298 + frameType = zmw_rx_buf_readb(dev, buf, 0);
20299 + da0 = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A1_OFFSET);
20300 + //sa0 = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A2_OFFSET);
20301 +
20302 + if ( (!zfStaIsConnected(dev))&&((frameType & 0xf) == ZM_WLAN_DATA_FRAME) )
20303 + {
20304 + return ZM_ERR_DATA_BEFORE_CONNECTED;
20305 + }
20306 +
20307 +
20308 + if ( (zfStaIsConnected(dev))&&((frameType & 0xf) == ZM_WLAN_DATA_FRAME) )
20309 + {
20310 + /* check BSSID */
20311 + if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
20312 + {
20313 + /* Big Endian and Little Endian Compatibility */
20314 + u16_t mac[3];
20315 + mac[0] = zmw_cpu_to_le16(wd->sta.bssid[0]);
20316 + mac[1] = zmw_cpu_to_le16(wd->sta.bssid[1]);
20317 + mac[2] = zmw_cpu_to_le16(wd->sta.bssid[2]);
20318 + if ( !zfRxBufferEqualToStr(dev, buf, (u8_t *)mac,
20319 + ZM_WLAN_HEADER_A2_OFFSET, 6) )
20320 + {
20321 +/*We will get lots of garbage data, especially in AES mode.*/
20322 +/*To avoid sending too many deauthentication frames in STA mode, mark it.*/
20323 +#if 0
20324 + /* If unicast frame, send deauth to the transmitter */
20325 + if (( da0 & 0x01 ) == 0)
20326 + {
20327 + for (i=0; i<3; i++)
20328 + {
20329 + sa[i] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+(i*2));
20330 + }
20331 + /* If mutilcast address, don't send deauthentication*/
20332 + if (( sa0 & 0x01 ) == 0)
20333 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, sa, 7, 0, 0);
20334 + }
20335 +#endif
20336 + return ZM_ERR_DATA_BSSID_NOT_MATCHED;
20337 + }
20338 + }
20339 + else if ( wd->wlanMode == ZM_MODE_IBSS )
20340 + {
20341 + /* Big Endian and Little Endian Compatibility */
20342 + u16_t mac[3];
20343 + mac[0] = zmw_cpu_to_le16(wd->sta.bssid[0]);
20344 + mac[1] = zmw_cpu_to_le16(wd->sta.bssid[1]);
20345 + mac[2] = zmw_cpu_to_le16(wd->sta.bssid[2]);
20346 + if ( !zfRxBufferEqualToStr(dev, buf, (u8_t *)mac,
20347 + ZM_WLAN_HEADER_A3_OFFSET, 6) )
20348 + {
20349 + return ZM_ERR_DATA_BSSID_NOT_MATCHED;
20350 + }
20351 + }
20352 +
20353 + frameCtrl = zmw_rx_buf_readb(dev, buf, 1);
20354 +
20355 + /* check security bit */
20356 + if ( wd->sta.dropUnencryptedPkts &&
20357 + (wd->sta.wepStatus != ZM_ENCRYPTION_WEP_DISABLED )&&
20358 + ( !(frameCtrl & ZM_BIT_6) ) )
20359 + { /* security on, but got data without encryption */
20360 +
20361 + #if 1
20362 + ret = ZM_ERR_DATA_NOT_ENCRYPTED;
20363 + if ( wd->sta.pStaRxSecurityCheckCb != NULL )
20364 + {
20365 + ret = wd->sta.pStaRxSecurityCheckCb(dev, buf);
20366 + }
20367 + else
20368 + {
20369 + ret = ZM_ERR_DATA_NOT_ENCRYPTED;
20370 + }
20371 + if (ret == ZM_ERR_DATA_NOT_ENCRYPTED)
20372 + {
20373 + wd->commTally.swRxDropUnencryptedCount++;
20374 + }
20375 + return ret;
20376 + #else
20377 + if ( (wd->sta.wepStatus != ZM_ENCRYPTION_TKIP)&&
20378 + (wd->sta.wepStatus != ZM_ENCRYPTION_AES) )
20379 + {
20380 + return ZM_ERR_DATA_NOT_ENCRYPTED;
20381 + }
20382 + #endif
20383 + }
20384 + }
20385 +
20386 + return ZM_SUCCESS;
20387 +}
20388 +
20389 +void zfStaMicFailureHandling(zdev_t* dev, zbuf_t* buf)
20390 +{
20391 + u8_t da0;
20392 + u8_t micNotify = 1;
20393 +
20394 + zmw_get_wlan_dev(dev);
20395 +
20396 + zmw_declare_for_critical_section();
20397 +
20398 + if ( wd->sta.wpaState < ZM_STA_WPA_STATE_PK_OK )
20399 + {
20400 + return;
20401 + }
20402 +
20403 + zmw_enter_critical_section(dev);
20404 +
20405 + wd->sta.cmMicFailureCount++;
20406 +
20407 + if ( wd->sta.cmMicFailureCount == 1 )
20408 + {
20409 + zm_debug_msg0("get the first MIC failure");
20410 + //zfTimerSchedule(dev, ZM_EVENT_CM_TIMER, ZM_TICK_CM_TIMEOUT);
20411 +
20412 + /* Timer Resolution on WinXP is 15/16 ms */
20413 + /* Decrease Time offset for <XP> Counter Measure */
20414 + zfTimerSchedule(dev, ZM_EVENT_CM_TIMER, ZM_TICK_CM_TIMEOUT - ZM_TICK_CM_TIMEOUT_OFFSET);
20415 + }
20416 + else if ( wd->sta.cmMicFailureCount == 2 )
20417 + {
20418 + zm_debug_msg0("get the second MIC failure");
20419 + /* reserve 2 second for OS to send MIC failure report to AP */
20420 + wd->sta.cmDisallowSsidLength = wd->sta.ssidLen;
20421 + zfMemoryCopy(wd->sta.cmDisallowSsid, wd->sta.ssid, wd->sta.ssidLen);
20422 + //wd->sta.cmMicFailureCount = 0;
20423 + zfTimerCancel(dev, ZM_EVENT_CM_TIMER);
20424 + //zfTimerSchedule(dev, ZM_EVENT_CM_DISCONNECT, ZM_TICK_CM_DISCONNECT);
20425 +
20426 + /* Timer Resolution on WinXP is 15/16 ms */
20427 + /* Decrease Time offset for <XP> Counter Measure */
20428 + zfTimerSchedule(dev, ZM_EVENT_CM_DISCONNECT, ZM_TICK_CM_DISCONNECT - ZM_TICK_CM_DISCONNECT_OFFSET);
20429 + }
20430 + else
20431 + {
20432 + micNotify = 0;
20433 + }
20434 +
20435 + zmw_leave_critical_section(dev);
20436 +
20437 + if (micNotify == 1)
20438 + {
20439 + da0 = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A1_OFFSET);
20440 + if ( da0 & 0x01 )
20441 + {
20442 + if (wd->zfcbMicFailureNotify != NULL)
20443 + {
20444 + wd->zfcbMicFailureNotify(dev, wd->sta.bssid, ZM_MIC_GROUP_ERROR);
20445 + }
20446 + }
20447 + else
20448 + {
20449 + if (wd->zfcbMicFailureNotify != NULL)
20450 + {
20451 + wd->zfcbMicFailureNotify(dev, wd->sta.bssid, ZM_MIC_PAIRWISE_ERROR);
20452 + }
20453 + }
20454 + }
20455 +}
20456 +
20457 +
20458 +u8_t zfStaBlockWlanScan(zdev_t* dev)
20459 +{
20460 + u8_t ret=FALSE;
20461 +
20462 + zmw_get_wlan_dev(dev);
20463 +
20464 + if ( wd->sta.bChannelScan )
20465 + {
20466 + return TRUE;
20467 + }
20468 +
20469 + return ret;
20470 +}
20471 +
20472 +void zfStaResetStatus(zdev_t* dev, u8_t bInit)
20473 +{
20474 + u8_t i;
20475 +
20476 + zmw_get_wlan_dev(dev);
20477 +
20478 + zfHpDisableBeacon(dev);
20479 +
20480 + wd->dtim = 1;
20481 + wd->sta.capability[0] = 0x01;
20482 + wd->sta.capability[1] = 0x00;
20483 + /* 802.11h */
20484 + if (wd->sta.DFSEnable || wd->sta.TPCEnable)
20485 + wd->sta.capability[1] |= ZM_BIT_0;
20486 +
20487 + /* release queued packets */
20488 + for(i=0; i<wd->sta.ibssPSDataCount; i++)
20489 + {
20490 + zfwBufFree(dev, wd->sta.ibssPSDataQueue[i], 0);
20491 + }
20492 +
20493 + for(i=0; i<wd->sta.staPSDataCount; i++)
20494 + {
20495 + zfwBufFree(dev, wd->sta.staPSDataQueue[i], 0);
20496 + }
20497 +
20498 + wd->sta.ibssPSDataCount = 0;
20499 + wd->sta.staPSDataCount = 0;
20500 + zfZeroMemory((u8_t*) &wd->sta.staPSList, sizeof(struct zsStaPSList));
20501 +
20502 + wd->sta.wmeConnected = 0;
20503 + wd->sta.psMgr.tempWakeUp = 0;
20504 + wd->sta.qosInfo = 0;
20505 + zfQueueFlush(dev, wd->sta.uapsdQ);
20506 +
20507 + return;
20508 +
20509 +}
20510 +
20511 +void zfStaIbssMonitoring(zdev_t* dev, u8_t reset)
20512 +{
20513 + u16_t i;
20514 + u16_t oppositeCount;
20515 + struct zsPartnerNotifyEvent event;
20516 +
20517 + zmw_get_wlan_dev(dev);
20518 +
20519 + zmw_declare_for_critical_section();
20520 +
20521 + //zm_debug_msg1("zfStaIbssMonitoring %d", wd->sta.oppositeCount);
20522 +
20523 + zmw_enter_critical_section(dev);
20524 +
20525 + if ( wd->sta.oppositeCount == 0 )
20526 + {
20527 + goto done;
20528 + }
20529 +
20530 + if ( wd->sta.bChannelScan )
20531 + {
20532 + goto done;
20533 + }
20534 +
20535 + oppositeCount = wd->sta.oppositeCount;
20536 +
20537 + for(i=0; i < ZM_MAX_OPPOSITE_COUNT; i++)
20538 + {
20539 + if ( oppositeCount == 0 )
20540 + {
20541 + break;
20542 + }
20543 +
20544 + if ( reset )
20545 + {
20546 + wd->sta.oppositeInfo[i].valid = 0;
20547 + }
20548 +
20549 + if ( wd->sta.oppositeInfo[i].valid == 0 )
20550 + {
20551 + continue;
20552 + }
20553 +
20554 + oppositeCount--;
20555 +
20556 + if ( wd->sta.oppositeInfo[i].aliveCounter )
20557 + {
20558 + zm_debug_msg1("Setting alive to ", wd->sta.oppositeInfo[i].aliveCounter);
20559 +
20560 + zmw_leave_critical_section(dev);
20561 +
20562 + if ( wd->sta.oppositeInfo[i].aliveCounter != ZM_IBSS_PEER_ALIVE_COUNTER )
20563 + {
20564 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_PROBEREQ,
20565 + (u16_t*)wd->sta.oppositeInfo[i].macAddr, 1, 0, 0);
20566 + }
20567 +
20568 + zmw_enter_critical_section(dev);
20569 + wd->sta.oppositeInfo[i].aliveCounter--;
20570 + }
20571 + else
20572 + {
20573 + zm_debug_msg0("zfStaIbssMonitoring remove the peer station");
20574 + zfMemoryCopy(event.bssid, (u8_t *)(wd->sta.bssid), 6);
20575 + zfMemoryCopy(event.peerMacAddr, wd->sta.oppositeInfo[i].macAddr, 6);
20576 +
20577 + wd->sta.oppositeInfo[i].valid = 0;
20578 + wd->sta.oppositeCount--;
20579 + if (wd->zfcbIbssPartnerNotify != NULL)
20580 + {
20581 + zmw_leave_critical_section(dev);
20582 + wd->zfcbIbssPartnerNotify(dev, 0, &event);
20583 + zmw_enter_critical_section(dev);
20584 + }
20585 + }
20586 + }
20587 +
20588 +done:
20589 + if ( reset == 0 )
20590 + {
20591 + zfTimerSchedule(dev, ZM_EVENT_IBSS_MONITOR, ZM_TICK_IBSS_MONITOR);
20592 + }
20593 +
20594 + zmw_leave_critical_section(dev);
20595 +}
20596 +
20597 +void zfInitPartnerNotifyEvent(zdev_t* dev, zbuf_t* buf, struct zsPartnerNotifyEvent *event)
20598 +{
20599 + u16_t *peerMacAddr;
20600 +
20601 + zmw_get_wlan_dev(dev);
20602 +
20603 + peerMacAddr = (u16_t *)event->peerMacAddr;
20604 +
20605 + zfMemoryCopy(event->bssid, (u8_t *)(wd->sta.bssid), 6);
20606 + peerMacAddr[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET);
20607 + peerMacAddr[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET + 2);
20608 + peerMacAddr[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET + 4);
20609 +}
20610 +
20611 +void zfStaInitOppositeInfo(zdev_t* dev)
20612 +{
20613 + int i;
20614 +
20615 + zmw_get_wlan_dev(dev);
20616 +
20617 + for(i=0; i<ZM_MAX_OPPOSITE_COUNT; i++)
20618 + {
20619 + wd->sta.oppositeInfo[i].valid = 0;
20620 + wd->sta.oppositeInfo[i].aliveCounter = ZM_IBSS_PEER_ALIVE_COUNTER;
20621 + }
20622 +}
20623 +#ifdef ZM_ENABLE_CENC
20624 +u16_t zfStaAddIeCenc(zdev_t* dev, zbuf_t* buf, u16_t offset)
20625 +{
20626 + zmw_get_wlan_dev(dev);
20627 +
20628 + if (wd->sta.cencIe[1] != 0)
20629 + {
20630 + zfCopyToIntTxBuffer(dev, buf, wd->sta.cencIe, offset, wd->sta.cencIe[1]+2);
20631 + offset += (wd->sta.cencIe[1]+2);
20632 + }
20633 + return offset;
20634 +}
20635 +#endif //ZM_ENABLE_CENC
20636 +u16_t zfStaProcessAction(zdev_t* dev, zbuf_t* buf)
20637 +{
20638 + u8_t category, actionDetails;
20639 + zmw_get_wlan_dev(dev);
20640 +
20641 + category = zmw_rx_buf_readb(dev, buf, 24);
20642 + actionDetails = zmw_rx_buf_readb(dev, buf, 25);
20643 + switch (category)
20644 + {
20645 + case 0: //Spectrum Management
20646 + switch(actionDetails)
20647 + {
20648 + case 0: //Measurement Request
20649 + break;
20650 + case 1: //Measurement Report
20651 + //ProcessActionSpectrumFrame_MeasurementReport(Adapter,pActionBody+3);
20652 + break;
20653 + case 2: //TPC request
20654 + //if (wd->sta.TPCEnable)
20655 + // zfStaUpdateDot11HTPC(dev, buf);
20656 + break;
20657 + case 3: //TPC report
20658 + //if (wd->sta.TPCEnable)
20659 + // zfStaUpdateDot11HTPC(dev, buf);
20660 + break;
20661 + case 4: //Channel Switch Announcement
20662 + if (wd->sta.DFSEnable)
20663 + zfStaUpdateDot11HDFS(dev, buf);
20664 + break;
20665 + default:
20666 + zm_debug_msg1("Action Frame contain not support action field ", actionDetails);
20667 + break;
20668 + }
20669 + break;
20670 + case ZM_WLAN_BLOCK_ACK_ACTION_FRAME:
20671 + zfAggBlockAckActionFrame(dev, buf);
20672 + break;
20673 + case 17: //Qos Management
20674 + break;
20675 + }
20676 +
20677 + return 0;
20678 +}
20679 +
20680 +/* Determine the time not send beacon , if more than some value ,
20681 + re-write the beacon start address */
20682 +void zfReWriteBeaconStartAddress(zdev_t* dev)
20683 +{
20684 + zmw_get_wlan_dev(dev);
20685 +
20686 + zmw_declare_for_critical_section();
20687 +
20688 + zmw_enter_critical_section(dev);
20689 + wd->tickIbssSendBeacon++; // Increase 1 per 10ms .
20690 + zmw_leave_critical_section(dev);
20691 +
20692 + if ( wd->tickIbssSendBeacon == 40 )
20693 + {
20694 +// DbgPrint("20070727");
20695 + zfHpEnableBeacon(dev, ZM_MODE_IBSS, wd->beaconInterval, wd->dtim, (u8_t)wd->sta.atimWindow);
20696 + zmw_enter_critical_section(dev);
20697 + wd->tickIbssSendBeacon = 0;
20698 + zmw_leave_critical_section(dev);
20699 + }
20700 +}
20701 +
20702 +struct zsTkipSeed* zfStaGetRxSeed(zdev_t* dev, zbuf_t* buf)
20703 +{
20704 + u8_t keyIndex;
20705 + u8_t da0;
20706 +
20707 + zmw_get_wlan_dev(dev);
20708 +
20709 + /* if need not check MIC, return NULL */
20710 + if ( ((wd->sta.encryMode != ZM_TKIP)&&(wd->sta.encryMode != ZM_AES))||
20711 + (wd->sta.wpaState < ZM_STA_WPA_STATE_PK_OK) )
20712 + {
20713 + return NULL;
20714 + }
20715 +
20716 + da0 = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A1_OFFSET);
20717 +
20718 + if ((zmw_rx_buf_readb(dev, buf, 0) & 0x80) == 0x80)
20719 + keyIndex = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_IV_OFFSET+5); /* Qos Packet*/
20720 + else
20721 + keyIndex = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_IV_OFFSET+3); /* normal Packet*/
20722 + keyIndex = (keyIndex & 0xc0) >> 6;
20723 +
20724 + return (&wd->sta.rxSeed[keyIndex]);
20725 +}
20726 +
20727 +void zfStaEnableSWEncryption(zdev_t *dev, u8_t value)
20728 +{
20729 + zmw_get_wlan_dev(dev);
20730 +
20731 + wd->sta.SWEncryptEnable = value;
20732 + zfHpSWDecrypt(dev, 1);
20733 + zfHpSWEncrypt(dev, 1);
20734 +}
20735 +
20736 +void zfStaDisableSWEncryption(zdev_t *dev)
20737 +{
20738 + zmw_get_wlan_dev(dev);
20739 +
20740 + wd->sta.SWEncryptEnable = 0;
20741 + zfHpSWDecrypt(dev, 0);
20742 + zfHpSWEncrypt(dev, 0);
20743 +}
20744 +
20745 +u16_t zfComputeBssInfoWeightValue(zdev_t *dev, u8_t isBMode, u8_t isHT, u8_t isHT40, u8_t signalStrength)
20746 +{
20747 + u8_t weightOfB = 0;
20748 + u8_t weightOfAGBelowThr = 0;
20749 + u8_t weightOfAGUpThr = 15;
20750 + u8_t weightOfN20BelowThr = 15;
20751 + u8_t weightOfN20UpThr = 30;
20752 + u8_t weightOfN40BelowThr = 16;
20753 + u8_t weightOfN40UpThr = 32;
20754 +
20755 + zmw_get_wlan_dev(dev);
20756 +
20757 + if( isBMode == 0 )
20758 + return (signalStrength + weightOfB); // pure b mode , do not add the weight value for this AP !
20759 + else
20760 + {
20761 + if( isHT == 0 && isHT40 == 0 )
20762 + { // a , g , b/g mode ! add the weight value 15 for this AP if it's signal strength is more than some value !
20763 + if( signalStrength < 18 ) // -77 dBm
20764 + return signalStrength + weightOfAGBelowThr;
20765 + else
20766 + return (signalStrength + weightOfAGUpThr);
20767 + }
20768 + else if( isHT == 1 && isHT40 == 0 )
20769 + { // 80211n mode use 20MHz
20770 + if( signalStrength < 23 ) // -72 dBm
20771 + return (signalStrength + weightOfN20BelowThr);
20772 + else
20773 + return (signalStrength + weightOfN20UpThr);
20774 + }
20775 + else // isHT == 1 && isHT40 == 1
20776 + { // 80211n mode use 40MHz
20777 + if( signalStrength < 16 ) // -79 dBm
20778 + return (signalStrength + weightOfN40BelowThr);
20779 + else
20780 + return (signalStrength + weightOfN40UpThr);
20781 + }
20782 + }
20783 +}
20784 +
20785 +u16_t zfStaAddIbssAdditionalIE(zdev_t* dev, zbuf_t* buf, u16_t offset)
20786 +{
20787 + u16_t i;
20788 +
20789 + zmw_get_wlan_dev(dev);
20790 +
20791 + for (i=0; i<wd->sta.ibssAdditionalIESize; i++)
20792 + {
20793 + zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.ibssAdditionalIE[i]);
20794 + }
20795 +
20796 + return offset;
20797 +}
20798 --- /dev/null
20799 +++ b/drivers/staging/otus/80211core/coid.c
20800 @@ -0,0 +1,2695 @@
20801 +/*
20802 + * Copyright (c) 2007-2008 Atheros Communications Inc.
20803 + *
20804 + * Permission to use, copy, modify, and/or distribute this software for any
20805 + * purpose with or without fee is hereby granted, provided that the above
20806 + * copyright notice and this permission notice appear in all copies.
20807 + *
20808 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
20809 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
20810 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
20811 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
20812 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20813 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
20814 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20815 + */
20816 +/* */
20817 +/* Module Name : iod.c */
20818 +/* */
20819 +/* Abstract */
20820 +/* This module contains OID functions. */
20821 +/* */
20822 +/* NOTES */
20823 +/* None */
20824 +/* */
20825 +/************************************************************************/
20826 +#include "cprecomp.h"
20827 +#include "../hal/hpreg.h"
20828 +
20829 +/************************************************************************/
20830 +/* */
20831 +/* FUNCTION DESCRIPTION zfiWlanQueryMacAddress */
20832 +/* Query OWN MAC address. */
20833 +/* */
20834 +/* INPUTS */
20835 +/* addr : for return MAC address */
20836 +/* */
20837 +/* OUTPUTS */
20838 +/* None */
20839 +/* */
20840 +/* AUTHOR */
20841 +/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
20842 +/* */
20843 +/************************************************************************/
20844 +void zfiWlanQueryMacAddress(zdev_t* dev, u8_t* addr)
20845 +{
20846 + u16_t vapId = 0;
20847 + zmw_get_wlan_dev(dev);
20848 +
20849 + vapId = zfwGetVapId(dev);
20850 +
20851 + addr[0] = (u8_t)(wd->macAddr[0] & 0xff);
20852 + addr[1] = (u8_t)(wd->macAddr[0] >> 8);
20853 + addr[2] = (u8_t)(wd->macAddr[1] & 0xff);
20854 + addr[3] = (u8_t)(wd->macAddr[1] >> 8);
20855 + addr[4] = (u8_t)(wd->macAddr[2] & 0xff);
20856 + if (vapId == 0xffff)
20857 + addr[5] = (u8_t)(wd->macAddr[2] >> 8);
20858 + else
20859 + {
20860 +#ifdef ZM_VAPMODE_MULTILE_SSID
20861 + addr[5] = (u8_t)(wd->macAddr[2] >> 8); // Multiple SSID
20862 +#else
20863 + addr[5] = vapId + 1 + (u8_t)(wd->macAddr[2] >> 8); //VAP
20864 +#endif
20865 + }
20866 +
20867 + return;
20868 +}
20869 +
20870 +void zfiWlanQueryBssList(zdev_t* dev, struct zsBssList* pBssList)
20871 +{
20872 + struct zsBssInfo* pBssInfo;
20873 + struct zsBssInfo* pDstBssInfo;
20874 + u8_t i;
20875 + u8_t* pMemList;
20876 + u8_t* pMemInfo;
20877 +
20878 + zmw_get_wlan_dev(dev);
20879 +
20880 + zmw_declare_for_critical_section();
20881 +
20882 + pMemList = (u8_t*) pBssList;
20883 + pMemInfo = pMemList + sizeof(struct zsBssList);
20884 + pBssList->head = (struct zsBssInfo*) pMemInfo;
20885 +
20886 + zmw_enter_critical_section(dev);
20887 +
20888 + pBssInfo = wd->sta.bssList.head;
20889 + pDstBssInfo = (struct zsBssInfo*) pMemInfo;
20890 + pBssList->bssCount = wd->sta.bssList.bssCount;
20891 +
20892 + for( i=0; i<wd->sta.bssList.bssCount; i++ )
20893 + {
20894 + zfMemoryCopy((u8_t*)pDstBssInfo, (u8_t*)pBssInfo,
20895 + sizeof(struct zsBssInfo));
20896 +
20897 + if ( pBssInfo->next != NULL )
20898 + {
20899 + pBssInfo = pBssInfo->next;
20900 + pDstBssInfo->next = pDstBssInfo + 1;
20901 + pDstBssInfo++;
20902 + }
20903 + else
20904 + {
20905 + zm_assert(i==(wd->sta.bssList.bssCount-1));
20906 + }
20907 + }
20908 +
20909 + zmw_leave_critical_section(dev);
20910 +
20911 + zfScanMgrScanAck(dev);
20912 +}
20913 +
20914 +void zfiWlanQueryBssListV1(zdev_t* dev, struct zsBssListV1* bssListV1)
20915 +{
20916 + struct zsBssInfo* pBssInfo;
20917 + //struct zsBssInfo* pDstBssInfo;
20918 + u8_t i, j, bdrop = 0, k = 0, Same_Count = 0;
20919 + u8_t bssid[6];
20920 + //u8_t* pMemList;
20921 + //u8_t* pMemInfo;
20922 + zmw_get_wlan_dev(dev);
20923 + zmw_declare_for_critical_section();
20924 +
20925 + zmw_enter_critical_section(dev);
20926 +
20927 + bssListV1->bssCount = wd->sta.bssList.bssCount;
20928 +
20929 + pBssInfo = wd->sta.bssList.head;
20930 + ZM_MAC_WORD_TO_BYTE(wd->sta.bssid, bssid);
20931 +
20932 + for( i=0; i<wd->sta.bssList.bssCount; i++ )
20933 + {
20934 + bdrop = 0;
20935 + if ( zfStaIsConnected(dev)
20936 + && (wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) )
20937 + {
20938 + for (j = 0; j < 6; j++)
20939 + {
20940 + if ( pBssInfo->bssid[j] != bssid[j] )
20941 + {
20942 + break;
20943 + }
20944 + }
20945 +
20946 + if ( (j == 6)
20947 + &&((pBssInfo->ssid[1] == wd->sta.ssidLen) || (pBssInfo->ssid[1] == 0) )&& (pBssInfo->frequency == wd->frequency) )
20948 + {
20949 + if(pBssInfo->ssid[1] == 0)
20950 + pBssInfo->ssid[1] = wd->sta.ssidLen;
20951 +
20952 + if(Same_Count == 0)
20953 + {//First meet
20954 + Same_Count++;
20955 + }
20956 + else
20957 + {//same one
20958 + bdrop = 1;
20959 + bssListV1->bssCount--;
20960 + }
20961 +
20962 + }
20963 + }
20964 +
20965 + if (bdrop == 0)
20966 + {
20967 + zfMemoryCopy((u8_t*)(&bssListV1->bssInfo[k]), (u8_t*)pBssInfo,
20968 + sizeof(struct zsBssInfo));
20969 +
20970 + if(Same_Count == 1)
20971 + {
20972 + zfMemoryCopy(&(bssListV1->bssInfo[k].ssid[2]), wd->sta.ssid, wd->sta.ssidLen);
20973 + Same_Count++;
20974 + }
20975 +
20976 + k++;
20977 + }
20978 +
20979 + if ( pBssInfo->next != NULL )
20980 + {
20981 + pBssInfo = pBssInfo->next;
20982 + }
20983 + else
20984 + {
20985 + zm_assert(i==(wd->sta.bssList.bssCount-1));
20986 + }
20987 + }
20988 +
20989 + zmw_leave_critical_section(dev);
20990 +
20991 + zfScanMgrScanAck(dev);
20992 +}
20993 +
20994 +void zfiWlanQueryAdHocCreatedBssDesc(zdev_t* dev, struct zsBssInfo *pBssInfo)
20995 +{
20996 + zmw_get_wlan_dev(dev);
20997 +
20998 + zfMemoryCopy((u8_t *)pBssInfo, (u8_t *)&wd->sta.ibssBssDesc, sizeof(struct zsBssInfo));
20999 +}
21000 +
21001 +u8_t zfiWlanQueryAdHocIsCreator(zdev_t* dev)
21002 +{
21003 + zmw_get_wlan_dev(dev);
21004 +
21005 + return wd->sta.ibssBssIsCreator;
21006 +}
21007 +
21008 +u32_t zfiWlanQuerySupportMode(zdev_t* dev)
21009 +{
21010 + zmw_get_wlan_dev(dev);
21011 +
21012 + return wd->supportMode;
21013 +}
21014 +
21015 +u32_t zfiWlanQueryTransmitPower(zdev_t* dev)
21016 +{
21017 + zmw_get_wlan_dev(dev);
21018 +
21019 + u32_t ret = 0;
21020 +
21021 + if (zfStaIsConnected(dev)) {
21022 + ret = wd->sta.connPowerInHalfDbm;
21023 + } else {
21024 + ret = zfHpGetTransmitPower(dev);
21025 + }
21026 +
21027 + return ret;
21028 +}
21029 +
21030 +/************************************************************************/
21031 +/* */
21032 +/* FUNCTION DESCRIPTION zfiWlanFlushBssList */
21033 +/* Flush BSSID List. */
21034 +/* */
21035 +/* INPUTS */
21036 +/* dev : device pointer */
21037 +/* */
21038 +/* OUTPUTS */
21039 +/* none */
21040 +/* */
21041 +/* AUTHOR */
21042 +/* Stephen Chen Atheros Communications, INC. 2006.12 */
21043 +/* */
21044 +/************************************************************************/
21045 +void zfiWlanFlushBssList(zdev_t* dev)
21046 +{
21047 + zmw_declare_for_critical_section();
21048 +
21049 + zmw_enter_critical_section(dev);
21050 + /* Call zfBssInfoRefresh() twice to remove all entry */
21051 + zfBssInfoRefresh(dev, 1);
21052 + zmw_leave_critical_section(dev);
21053 +}
21054 +
21055 +void zfiWlanSetWlanMode(zdev_t* dev, u8_t wlanMode)
21056 +{
21057 + zmw_get_wlan_dev(dev);
21058 +
21059 + zmw_declare_for_critical_section();
21060 +
21061 + zmw_enter_critical_section(dev);
21062 + wd->ws.wlanMode = wlanMode;
21063 + zmw_leave_critical_section(dev);
21064 +}
21065 +
21066 +void zfiWlanSetAuthenticationMode(zdev_t* dev, u8_t authMode)
21067 +{
21068 + zmw_get_wlan_dev(dev);
21069 +
21070 + zmw_declare_for_critical_section();
21071 +
21072 + zmw_enter_critical_section(dev);
21073 + wd->ws.authMode = authMode;
21074 + zmw_leave_critical_section(dev);
21075 +}
21076 +
21077 +void zfiWlanSetWepStatus(zdev_t* dev, u8_t wepStatus)
21078 +{
21079 + zmw_get_wlan_dev(dev);
21080 +
21081 + zmw_declare_for_critical_section();
21082 +
21083 + zmw_enter_critical_section(dev);
21084 + wd->ws.wepStatus = wepStatus;
21085 + zmw_leave_critical_section(dev);
21086 +
21087 +}
21088 +
21089 +void zfiWlanSetSSID(zdev_t* dev, u8_t* ssid, u8_t ssidLength)
21090 +{
21091 + u16_t i;
21092 + zmw_get_wlan_dev(dev);
21093 +
21094 + zmw_declare_for_critical_section();
21095 +
21096 + if ( ssidLength <= 32 )
21097 + {
21098 + zmw_enter_critical_section(dev);
21099 +
21100 + wd->ws.ssidLen = ssidLength;
21101 + zfMemoryCopy(wd->ws.ssid, ssid, ssidLength);
21102 +
21103 + if ( ssidLength < 32 )
21104 + {
21105 + wd->ws.ssid[ssidLength] = 0;
21106 + }
21107 +
21108 + wd->ws.probingSsidList[0].ssidLen = ssidLength;
21109 + zfMemoryCopy(wd->ws.probingSsidList[0].ssid, ssid, ssidLength);
21110 + for (i=1; i<ZM_MAX_PROBE_HIDDEN_SSID_SIZE; i++)
21111 + {
21112 + wd->ws.probingSsidList[i].ssidLen = 0;
21113 + }
21114 +
21115 + zmw_leave_critical_section(dev);
21116 + }
21117 +}
21118 +
21119 +void zfiWlanSetFragThreshold(zdev_t* dev, u16_t fragThreshold)
21120 +{
21121 + zmw_get_wlan_dev(dev);
21122 +
21123 + zmw_declare_for_critical_section();
21124 +
21125 + zmw_enter_critical_section(dev);
21126 +
21127 + if (fragThreshold == 0)
21128 + { /* fragmentation is disabled */
21129 + wd->fragThreshold = 32767;
21130 + }
21131 + else if (fragThreshold < 256)
21132 + {
21133 + /* Minimum fragment threshold */
21134 + wd->fragThreshold = 256;
21135 + }
21136 + else if (fragThreshold > 2346)
21137 + {
21138 + wd->fragThreshold = 2346;
21139 + }
21140 + else
21141 + {
21142 + wd->fragThreshold = fragThreshold & 0xfffe;
21143 + }
21144 +
21145 + zmw_leave_critical_section(dev);
21146 +}
21147 +
21148 +void zfiWlanSetRtsThreshold(zdev_t* dev, u16_t rtsThreshold)
21149 +{
21150 + zmw_get_wlan_dev(dev);
21151 +
21152 + zmw_declare_for_critical_section();
21153 +
21154 + zmw_enter_critical_section(dev);
21155 + wd->rtsThreshold = rtsThreshold;
21156 + zmw_leave_critical_section(dev);
21157 +}
21158 +
21159 +void zfiWlanSetFrequency(zdev_t* dev, u32_t frequency, u8_t bImmediate)
21160 +{
21161 + zmw_get_wlan_dev(dev);
21162 +
21163 + zmw_declare_for_critical_section();
21164 +
21165 + if ( bImmediate )
21166 + {
21167 + zmw_enter_critical_section(dev);
21168 + wd->frequency = (u16_t) (frequency/1000);
21169 + zmw_leave_critical_section(dev);
21170 + zfCoreSetFrequency(dev, wd->frequency);
21171 + }
21172 + else
21173 + {
21174 + zmw_enter_critical_section(dev);
21175 + if( frequency == 0 )
21176 + { // Auto select clean channel depend on wireless environment !
21177 + wd->ws.autoSetFrequency = 0;
21178 + }
21179 + wd->ws.frequency = (u16_t) (frequency/1000);
21180 + zmw_leave_critical_section(dev);
21181 + }
21182 +}
21183 +
21184 +void zfiWlanSetBssid(zdev_t* dev, u8_t* bssid)
21185 +{
21186 + u16_t i;
21187 + zmw_get_wlan_dev(dev);
21188 +
21189 + zmw_declare_for_critical_section();
21190 +
21191 + zmw_enter_critical_section(dev);
21192 + for (i=0; i<6; i++)
21193 + {
21194 + wd->ws.desiredBssid[i] = bssid[i];
21195 + }
21196 + wd->ws.bDesiredBssid = TRUE;
21197 + zmw_leave_critical_section(dev);
21198 +
21199 +}
21200 +
21201 +void zfiWlanSetBeaconInterval(zdev_t* dev,
21202 + u16_t beaconInterval,
21203 + u8_t bImmediate)
21204 +{
21205 + zmw_get_wlan_dev(dev);
21206 +
21207 + zmw_declare_for_critical_section();
21208 +
21209 + if ( bImmediate )
21210 + {
21211 + zmw_enter_critical_section(dev);
21212 + wd->beaconInterval = beaconInterval;
21213 + zmw_leave_critical_section(dev);
21214 +
21215 + /* update beacon interval here */
21216 + }
21217 + else
21218 + {
21219 + zmw_enter_critical_section(dev);
21220 + wd->ws.beaconInterval = beaconInterval;
21221 + zmw_leave_critical_section(dev);
21222 + }
21223 +}
21224 +
21225 +
21226 +void zfiWlanSetDtimCount(zdev_t* dev, u8_t dtim)
21227 +{
21228 + zmw_get_wlan_dev(dev);
21229 +
21230 + zmw_declare_for_critical_section();
21231 +
21232 + zmw_enter_critical_section(dev);
21233 + if (dtim > 0)
21234 + {
21235 + wd->ws.dtim = dtim;
21236 + }
21237 + zmw_leave_critical_section(dev);
21238 +}
21239 +
21240 +
21241 +void zfiWlanSetAtimWindow(zdev_t* dev, u16_t atimWindow, u8_t bImmediate)
21242 +{
21243 + zmw_get_wlan_dev(dev);
21244 +
21245 + zmw_declare_for_critical_section();
21246 +
21247 + if ( bImmediate )
21248 + {
21249 + zmw_enter_critical_section(dev);
21250 + wd->sta.atimWindow = atimWindow;
21251 + zmw_leave_critical_section(dev);
21252 +
21253 + /* atim window here */
21254 + }
21255 + else
21256 + {
21257 + zmw_enter_critical_section(dev);
21258 + wd->ws.atimWindow = atimWindow;
21259 + zmw_leave_critical_section(dev);
21260 + }
21261 +}
21262 +
21263 +
21264 +void zfiWlanSetEncryMode(zdev_t* dev, u8_t encryMode)
21265 +{
21266 + zmw_get_wlan_dev(dev);
21267 +
21268 + zmw_declare_for_critical_section();
21269 +
21270 + zmw_enter_critical_section(dev);
21271 + if (wd->wlanMode == ZM_MODE_AP)
21272 + {
21273 + /* Hostapd Issue */
21274 + if ((wd->ws.encryMode != ZM_AES) && (wd->ws.encryMode != ZM_TKIP))
21275 + wd->ws.encryMode = encryMode;
21276 + }
21277 + else
21278 + wd->ws.encryMode = encryMode;
21279 + zmw_leave_critical_section(dev);
21280 +}
21281 +
21282 +void zfiWlanSetDefaultKeyId(zdev_t* dev, u8_t keyId)
21283 +{
21284 + zmw_get_wlan_dev(dev);
21285 +
21286 + wd->sta.keyId = keyId;
21287 +}
21288 +
21289 +u8_t zfiWlanQueryIsPKInstalled(zdev_t *dev, u8_t *staMacAddr)
21290 +{
21291 + u8_t isInstalled = 0;
21292 +
21293 +#if 1
21294 +//#ifdef ZM_ENABLE_IBSS_WPA2PSK
21295 + u8_t res, peerIdx;
21296 +
21297 + zmw_get_wlan_dev(dev);
21298 +
21299 + zmw_declare_for_critical_section();
21300 +
21301 + zmw_enter_critical_section(dev);
21302 + res = zfStaFindOppositeByMACAddr(dev, (u16_t *)staMacAddr, &peerIdx);
21303 + if( res == 0 )
21304 + {
21305 + isInstalled = wd->sta.oppositeInfo[peerIdx].pkInstalled;
21306 + }
21307 + zmw_leave_critical_section(dev);
21308 +//#endif
21309 +#endif
21310 +
21311 + return isInstalled;
21312 +}
21313 +
21314 +u8_t zfiWlanSetKey(zdev_t* dev, struct zsKeyInfo keyInfo)
21315 +{
21316 + u16_t broadcast[3] = {0xffff, 0xffff, 0xffff};
21317 + u32_t* key;
21318 + u8_t encryMode = ZM_NO_WEP;
21319 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
21320 + u8_t encryType = ZM_NO_WEP;
21321 +#endif
21322 + u8_t micKey[16];
21323 + u16_t id = 0;
21324 + u8_t vapId, i, addr[6];
21325 + u8_t userIdx=0;
21326 +
21327 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
21328 + /* Determine opposite exist or not */
21329 + u8_t res, peerIdx;
21330 +// u8_t userIdx=0;
21331 +
21332 + zmw_get_wlan_dev(dev);
21333 +
21334 + if ( wd->sta.ibssWpa2Psk == 1 )
21335 + {
21336 + zmw_enter_critical_section(dev);
21337 + res = zfStaFindOppositeByMACAddr(dev, (u16_t*)keyInfo.macAddr, &peerIdx);
21338 + if( res == 0 )
21339 + {
21340 + userIdx = peerIdx;
21341 + if ( wd->sta.oppositeInfo[userIdx].camIdx == 0xff )
21342 + wd->sta.oppositeInfo[userIdx].camIdx = userIdx;
21343 + }
21344 + zmw_leave_critical_section(dev);
21345 + }
21346 +#else
21347 + zmw_get_wlan_dev(dev);
21348 +#endif
21349 +
21350 + if ( keyInfo.flag & ZM_KEY_FLAG_AUTHENTICATOR )
21351 + { /* set key by authenticator */
21352 + /* set pairwise key */
21353 + if (keyInfo.flag & ZM_KEY_FLAG_PK)
21354 + {
21355 + /* Find STA's information */
21356 + if ((id = zfApFindSta(dev, keyInfo.macAddr)) == 0xffff)
21357 + {
21358 + /* Can't STA in the staTable */
21359 + return ZM_STATUS_FAILURE;
21360 + }
21361 +
21362 + wd->ap.staTable[id].iv16 = 0;
21363 + wd->ap.staTable[id].iv32 = 0;
21364 +
21365 + if (keyInfo.keyLength == 32)
21366 + { /* TKIP */
21367 + //u8_t KeyRsc[6] = {0, 0, 0, 0, 0, 0};
21368 +
21369 + /* In the current AP mode, we set KeyRsc to zero */
21370 + //zfTkipInit(keyInfo.key, (u8_t*) wd->macAddr,
21371 + // &(wd->ap.staTable[id].txSeed), KeyRsc);
21372 + //zfTkipInit(keyInfo.key, (u8_t*) keyInfo.macAddr,
21373 + // &(wd->ap.staTable[id].rxSeed), KeyRsc);
21374 +#ifdef ZM_ENABLE_CENC
21375 + if (keyInfo.flag & ZM_KEY_FLAG_CENC)
21376 + {
21377 + zm_debug_msg0("Set CENC pairwise Key");
21378 +
21379 + wd->ap.staTable[id].encryMode = ZM_CENC;
21380 +
21381 + /* Reset txiv and rxiv */
21382 + wd->ap.staTable[id].txiv[0] = 0x5c365c37;
21383 + wd->ap.staTable[id].txiv[1] = 0x5c365c36;
21384 + wd->ap.staTable[id].txiv[2] = 0x5c365c36;
21385 + wd->ap.staTable[id].txiv[3] = 0x5c365c36;
21386 +
21387 + wd->ap.staTable[id].rxiv[0] = 0x5c365c36;
21388 + wd->ap.staTable[id].rxiv[1] = 0x5c365c36;
21389 + wd->ap.staTable[id].rxiv[2] = 0x5c365c36;
21390 + wd->ap.staTable[id].rxiv[3] = 0x5c365c36;
21391 +
21392 + /* Set Key Index */
21393 + wd->ap.staTable[id].cencKeyIdx = keyInfo.keyIndex;
21394 +
21395 + //zfCoreSetKey(dev, id+1, 1, ZM_CENC, (u16_t *)keyInfo.macAddr,
21396 + // (u32_t*) &keyInfo.key[16]);
21397 + }
21398 + else
21399 +#endif //ZM_ENABLE_CENC
21400 + {
21401 + wd->ap.staTable[id].encryMode = ZM_TKIP;
21402 +
21403 + zfMemoryCopy(micKey, &keyInfo.key[16], 8);
21404 + zfMemoryCopy(&micKey[8], &keyInfo.key[24], 8);
21405 +
21406 + //zfCoreSetKey(dev, id+1, 1, ZM_TKIP, (u16_t *)keyInfo.macAddr,
21407 + // (u32_t*) micKey);
21408 +
21409 + /* For fragmentation, we use software MIC */
21410 + zfMemoryCopy((u8_t *)&(wd->ap.staTable[id].txMicKey), &(keyInfo.key[16]), 8);
21411 + zfMemoryCopy((u8_t *)&(wd->ap.staTable[id].rxMicKey), &(keyInfo.key[24]), 8);
21412 +
21413 + }
21414 + }
21415 + else if (keyInfo.keyLength == 16)
21416 + { /* AES */
21417 + wd->ap.staTable[id].encryMode = ZM_AES;
21418 + }
21419 + else if (keyInfo.keyLength == 0)
21420 + {
21421 + /* Clear Key Info */
21422 + zfApClearStaKey(dev, (u16_t *)keyInfo.macAddr);
21423 +
21424 + return ZM_STATUS_SUCCESS;
21425 + }
21426 + else
21427 + {
21428 + return ZM_STATUS_FAILURE;
21429 + }
21430 +
21431 + //zfCoreSetKey(dev, id+1, 0, wd->ap.staTable[id].encryMode,
21432 + // (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
21433 + zfHpSetApPairwiseKey(dev, (u16_t *)keyInfo.macAddr,
21434 + wd->ap.staTable[id].encryMode, (u32_t*) keyInfo.key,
21435 + (u32_t*) &keyInfo.key[16], id+1);
21436 + wd->ap.staTable[id].keyIdx = id + 1 + 4;
21437 + }
21438 + else if (keyInfo.flag & ZM_KEY_FLAG_GK)
21439 + {
21440 + vapId = keyInfo.vapId;
21441 +
21442 + wd->ap.iv16[vapId] = 0;
21443 + wd->ap.iv32[vapId] = 0;
21444 +
21445 + if (keyInfo.keyLength == 32)
21446 + { /* TKIP */
21447 + //u8_t KeyRsc[6] = {0, 0, 0, 0, 0, 0};
21448 +
21449 + //zfTkipInit(keyInfo.key, (u8_t*) wd->macAddr,
21450 + // &(wd->ap.bcSeed), KeyRsc);
21451 +#ifdef ZM_ENABLE_CENC
21452 + if (keyInfo.flag & ZM_KEY_FLAG_CENC)
21453 + {
21454 + encryMode = ZM_CENC;
21455 + zm_debug_msg0("Set CENC group Key");
21456 +
21457 + /* Reset txiv and rxiv */
21458 + wd->ap.txiv[vapId][0] = 0x5c365c36;
21459 + wd->ap.txiv[vapId][1] = 0x5c365c36;
21460 + wd->ap.txiv[vapId][2] = 0x5c365c36;
21461 + wd->ap.txiv[vapId][3] = 0x5c365c36;
21462 +
21463 + //zfCoreSetKey(dev, 0, 1, ZM_CENC, keyInfo.vapAddr,
21464 + // (u32_t*) &keyInfo.key[16]);
21465 + key = (u32_t*) keyInfo.key;
21466 + }
21467 + else
21468 +#endif //ZM_ENABLE_CENC
21469 + {
21470 + encryMode = ZM_TKIP;
21471 + key = (u32_t *)keyInfo.key;
21472 +
21473 + /* set MIC key to HMAC */
21474 + //zfCoreSetKey(dev, 0, 1, ZM_TKIP, broadcast,
21475 + // (u32_t*) (&keyInfo.key[16]));
21476 + //zfCoreSetKey(dev, 0, 1, ZM_TKIP, keyInfo.vapAddr,
21477 + // (u32_t*) (&keyInfo.key[16]));
21478 +
21479 + zfMicSetKey(&(keyInfo.key[16]), &(wd->ap.bcMicKey[0]));
21480 + key = (u32_t*) keyInfo.key;
21481 + }
21482 + }
21483 + else if (keyInfo.keyLength == 16)
21484 + { /* AES */
21485 + encryMode = ZM_AES;
21486 + key = (u32_t *)keyInfo.key;
21487 + zm_debug_msg0("CWY - Set AES Group Key");
21488 + }
21489 + else if (keyInfo.keyLength == 0)
21490 + {
21491 + /* Clear Key Info */
21492 + zfApClearStaKey(dev, broadcast);
21493 +
21494 + /* Turn off WEP bit in the capability field */
21495 + wd->ap.capab[vapId] &= 0xffef;
21496 +
21497 + return ZM_STATUS_SUCCESS;
21498 + }
21499 + else
21500 + { /* WEP */
21501 + if (keyInfo.keyLength == 5)
21502 + {
21503 + encryMode = ZM_WEP64;
21504 + }
21505 + else if (keyInfo.keyLength == 13)
21506 + {
21507 + encryMode = ZM_WEP128;
21508 + }
21509 + else if (keyInfo.keyLength == 29)
21510 + {
21511 + encryMode = ZM_WEP256;
21512 + }
21513 +
21514 + key = (u32_t*) keyInfo.key;
21515 + }
21516 +
21517 + // Modification for CAM not support VAP search
21518 + //zfCoreSetKey(dev, 0, 0, encryMode, broadcast, key);
21519 + //zfCoreSetKey(dev, 0, 0, encryMode, wd->macAddr, key);
21520 + //zfCoreSetKey(dev, 0, 0, encryMode, keyInfo.vapAddr, key);
21521 + zfHpSetApGroupKey(dev, wd->macAddr, encryMode,
21522 + key, (u32_t*) &keyInfo.key[16], vapId);
21523 +
21524 + //zfiWlanSetEncryMode(dev, encryMode);
21525 + wd->ws.encryMode = encryMode;
21526 +
21527 + /* set the multicast address encryption type */
21528 + wd->ap.encryMode[vapId] = encryMode;
21529 +
21530 + /* set the multicast key index */
21531 + wd->ap.bcKeyIndex[vapId] = keyInfo.keyIndex;
21532 + wd->ap.bcHalKeyIdx[vapId] = vapId + 60;
21533 +
21534 + /* Turn on WEP bit in the capability field */
21535 + wd->ap.capab[vapId] |= 0x10;
21536 + }
21537 + }
21538 + else
21539 + { /* set by supplicant */
21540 +
21541 + if ( keyInfo.flag & ZM_KEY_FLAG_PK )
21542 + { /* set pairwise key */
21543 +
21544 + //zfTkipInit(keyInfo.key, (u8_t*) wd->macAddr,
21545 + // &wd->sta.txSeed, keyInfo.initIv);
21546 + //zfTkipInit(keyInfo.key, (u8_t*) wd->sta.bssid,
21547 + // &wd->sta.rxSeed[keyInfo.keyIndex], keyInfo.initIv);
21548 +
21549 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
21550 + if ( wd->sta.ibssWpa2Psk == 1 )
21551 + {
21552 + /* unicast -- > pairwise key */
21553 + wd->sta.oppositeInfo[userIdx].iv16 = 0;
21554 + wd->sta.oppositeInfo[userIdx].iv32 = 0;
21555 + }
21556 + else
21557 + {
21558 + wd->sta.iv16 = 0;
21559 + wd->sta.iv32 = 0;
21560 + }
21561 +
21562 + wd->sta.oppositeInfo[userIdx].pkInstalled = 1;
21563 +#else
21564 + wd->sta.iv16 = 0;
21565 + wd->sta.iv32 = 0;
21566 +
21567 + wd->sta.oppositeInfo[userIdx].pkInstalled = 1;
21568 +#endif
21569 +
21570 + if ( keyInfo.keyLength == 32 )
21571 + { /* TKIP */
21572 + zfTkipInit(keyInfo.key, (u8_t*) wd->macAddr,
21573 + &wd->sta.txSeed, keyInfo.initIv);
21574 + zfTkipInit(keyInfo.key, (u8_t*) wd->sta.bssid,
21575 + &wd->sta.rxSeed[keyInfo.keyIndex], keyInfo.initIv);
21576 +
21577 +#ifdef ZM_ENABLE_CENC
21578 + if (keyInfo.flag & ZM_KEY_FLAG_CENC)
21579 + {
21580 + zm_debug_msg0("Set CENC pairwise Key");
21581 +
21582 + wd->sta.encryMode = ZM_CENC;
21583 +
21584 + /* Reset txiv and rxiv */
21585 + wd->sta.txiv[0] = 0x5c365c36;
21586 + wd->sta.txiv[1] = 0x5c365c36;
21587 + wd->sta.txiv[2] = 0x5c365c36;
21588 + wd->sta.txiv[3] = 0x5c365c36;
21589 +
21590 + wd->sta.rxiv[0] = 0x5c365c37;
21591 + wd->sta.rxiv[1] = 0x5c365c36;
21592 + wd->sta.rxiv[2] = 0x5c365c36;
21593 + wd->sta.rxiv[3] = 0x5c365c36;
21594 +
21595 + /* Set Key Index */
21596 + wd->sta.cencKeyId = keyInfo.keyIndex;
21597 +
21598 + //zfCoreSetKey(dev, id+1, 1, ZM_CENC, (u16_t *)keyInfo.macAddr,
21599 + // (u32_t*) &keyInfo.key[16]);
21600 + }
21601 + else
21602 +#endif //ZM_ENABLE_CENC
21603 + {
21604 + wd->sta.encryMode = ZM_TKIP;
21605 +
21606 + //zfCoreSetKey(dev, 0, 1, ZM_TKIP, wd->sta.bssid,
21607 + // (u32_t*) &keyInfo.key[16]);
21608 +
21609 + zfMicSetKey(&keyInfo.key[16], &wd->sta.txMicKey);
21610 + zfMicSetKey(&keyInfo.key[24],
21611 + &wd->sta.rxMicKey[keyInfo.keyIndex]);
21612 + }
21613 + }
21614 + else if ( keyInfo.keyLength == 16 )
21615 + { /* AES */
21616 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
21617 + if ( wd->sta.ibssWpa2Psk == 1 )
21618 + {
21619 + wd->sta.oppositeInfo[userIdx].encryMode = ZM_AES;
21620 + encryType = wd->sta.oppositeInfo[userIdx].encryMode;
21621 + }
21622 + else
21623 + {
21624 + wd->sta.encryMode = ZM_AES;
21625 + encryType = wd->sta.encryMode;
21626 + }
21627 +#else
21628 + wd->sta.encryMode = ZM_AES;
21629 +#endif
21630 + }
21631 + else
21632 + {
21633 + return ZM_STATUS_FAILURE;
21634 + }
21635 +
21636 + /* user 0 */
21637 + //zfCoreSetKey(dev, 0, 0, wd->sta.encryMode,
21638 + // wd->sta.bssid, (u32_t*) keyInfo.key);
21639 + //zfHpSetStaPairwiseKey(dev, wd->sta.bssid, wd->sta.encryMode,
21640 + // (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
21641 +
21642 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
21643 + if ( (keyInfo.keyLength==16) && (wd->sta.ibssWpa2Psk==1) )
21644 + { /* If not AES-CCMP and ibss network , use traditional */
21645 + zfHpSetPerUserKey(dev,
21646 + userIdx,
21647 + keyInfo.keyIndex, // key id == 0 ( Pairwise key = 0 )
21648 + (u8_t*)keyInfo.macAddr, // RX need Source Address ( Address 2 )
21649 + encryType,
21650 +// wd->sta.encryMode,
21651 + (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
21652 +
21653 + wd->sta.oppositeInfo[userIdx].wpaState = ZM_STA_WPA_STATE_PK_OK ;
21654 + }
21655 + else
21656 + {/* Big Endian and Little Endian Compatibility */
21657 + for (i = 0; i < 3; i++)
21658 + {
21659 + addr[2 * i] = wd->sta.bssid[i] & 0xff;
21660 + addr[2 * i + 1] = wd->sta.bssid[i] >> 8;
21661 + }
21662 + zfHpSetPerUserKey(dev,
21663 + ZM_USER_KEY_PK, // user id
21664 + 0, // key id
21665 + addr,//(u8_t *)wd->sta.bssid,
21666 + wd->sta.encryMode,
21667 + (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
21668 +
21669 + wd->sta.keyId = 4;
21670 + }
21671 +#else
21672 + /* Big Endian and Little Endian Compatibility */
21673 + for (i = 0; i < 3; i++)
21674 + {
21675 + addr[2 * i] = wd->sta.bssid[i] & 0xff;
21676 + addr[2 * i + 1] = wd->sta.bssid[i] >> 8;
21677 + }
21678 + zfHpSetPerUserKey(dev,
21679 + ZM_USER_KEY_PK, // user id
21680 + 0, // key id
21681 + addr,//(u8_t *)wd->sta.bssid,
21682 + wd->sta.encryMode,
21683 + (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
21684 +
21685 + wd->sta.keyId = 4;
21686 +#endif
21687 +
21688 + wd->sta.wpaState = ZM_STA_WPA_STATE_PK_OK;
21689 + }
21690 + else if ( keyInfo.flag & ZM_KEY_FLAG_GK )
21691 + { /* set group key */
21692 +
21693 + zfTkipInit(keyInfo.key, (u8_t*) wd->sta.bssid,
21694 + &wd->sta.rxSeed[keyInfo.keyIndex], keyInfo.initIv);
21695 +
21696 + if ( keyInfo.keyLength == 32 )
21697 + { /* TKIP */
21698 +#ifdef ZM_ENABLE_CENC
21699 + if (keyInfo.flag & ZM_KEY_FLAG_CENC)
21700 + {
21701 + encryMode = ZM_CENC;
21702 + zm_debug_msg0("Set CENC group Key");
21703 +
21704 + /* Reset txiv and rxiv */
21705 + wd->sta.rxivGK[0] = 0x5c365c36;
21706 + wd->sta.rxivGK[1] = 0x5c365c36;
21707 + wd->sta.rxivGK[2] = 0x5c365c36;
21708 + wd->sta.rxivGK[3] = 0x5c365c36;
21709 +
21710 + //zfCoreSetKey(dev, 0, 1, ZM_CENC, keyInfo.vapAddr,
21711 + // (u32_t*) &keyInfo.key[16]);
21712 + key = (u32_t*) keyInfo.key;
21713 + }
21714 + else
21715 +#endif //ZM_ENABLE_CENC
21716 + {
21717 + encryMode = ZM_TKIP;
21718 + key = (u32_t*) wd->sta.rxSeed[keyInfo.keyIndex].tk;
21719 +
21720 + if ( !(keyInfo.flag & ZM_KEY_FLAG_INIT_IV) )
21721 + {
21722 + wd->sta.rxSeed[keyInfo.keyIndex].iv16 = 0;
21723 + wd->sta.rxSeed[keyInfo.keyIndex].iv32 = 0;
21724 + }
21725 +
21726 + /* set MIC key to HMAC */
21727 + //zfCoreSetKey(dev, 8, 1, ZM_TKIP, broadcast,
21728 + // (u32_t*) (&keyInfo.key[16]));
21729 +
21730 + zfMicSetKey(&keyInfo.key[24],
21731 + &wd->sta.rxMicKey[keyInfo.keyIndex]);
21732 + }
21733 + }
21734 + else if ( keyInfo.keyLength == 16 )
21735 + { /* AES */
21736 + encryMode = ZM_AES;
21737 + //key = (u32_t*) wd->sta.rxSeed[keyInfo.keyIndex].tk;
21738 + }
21739 + else
21740 + { /* WEP */
21741 + if ( keyInfo.keyLength == 5 )
21742 + {
21743 + encryMode = ZM_WEP64;
21744 + }
21745 + else if ( keyInfo.keyLength == 13 )
21746 + {
21747 + encryMode = ZM_WEP128;
21748 + }
21749 + else if ( keyInfo.keyLength == 29 )
21750 + {
21751 + encryMode = ZM_WEP256;
21752 + }
21753 +
21754 + key = (u32_t*) keyInfo.key;
21755 + }
21756 +
21757 + /* user 8 */
21758 + //zfCoreSetKey(dev, 8, 0, encryMode, broadcast, key);
21759 + //zfHpSetStaGroupKey(dev, broadcast, encryMode,
21760 + // (u32_t*) keyInfo.key, (u32_t*) (&keyInfo.key[16]));
21761 +
21762 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
21763 + if ( (keyInfo.keyLength==16) && (wd->sta.ibssWpa2Psk==1) )
21764 + {/* If not AES-CCMP and ibss network , use traditional */
21765 + zfHpSetPerUserKey(dev,
21766 + userIdx,
21767 + keyInfo.keyIndex, // key id
21768 + // (u8_t *)broadcast, // for only 2 stations IBSS netwrl ( A2 )
21769 + (u8_t*)keyInfo.macAddr, // for multiple ( > 2 ) stations IBSS network ( A2 )
21770 + encryMode,
21771 + (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
21772 + }
21773 + else
21774 + {
21775 + zfHpSetPerUserKey(dev,
21776 + ZM_USER_KEY_GK, // user id
21777 + 0, // key id
21778 + (u8_t *)broadcast,
21779 + encryMode,
21780 + (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
21781 +
21782 + wd->sta.wpaState = ZM_STA_WPA_STATE_GK_OK;
21783 + }
21784 +#else
21785 + zfHpSetPerUserKey(dev,
21786 + ZM_USER_KEY_GK, // user id
21787 + 0, // key id
21788 + (u8_t *)broadcast,
21789 + encryMode,
21790 + (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
21791 +
21792 + wd->sta.wpaState = ZM_STA_WPA_STATE_GK_OK;
21793 +#endif
21794 + }
21795 + else
21796 + { /* legacy WEP */
21797 + zm_debug_msg0("legacy WEP");
21798 +
21799 + if ( keyInfo.keyIndex >= 4 )
21800 + {
21801 + return ZM_STATUS_FAILURE;
21802 + }
21803 +
21804 + if ( keyInfo.keyLength == 5 )
21805 + {
21806 + zm_debug_msg0("WEP 64");
21807 +
21808 + encryMode = ZM_WEP64;
21809 + }
21810 + else if ( keyInfo.keyLength == 13 )
21811 + {
21812 + zm_debug_msg0("WEP 128");
21813 +
21814 + encryMode = ZM_WEP128;
21815 + }
21816 + else if ( keyInfo.keyLength == 32 )
21817 + {
21818 + /* TKIP */
21819 + #if 0
21820 + // Don't reset the IV since some AP would fail in IV check and drop our connection
21821 + if ( wd->sta.wpaState != ZM_STA_WPA_STATE_PK_OK )
21822 + {
21823 + wd->sta.iv16 = 0;
21824 + wd->sta.iv32 = 0;
21825 + }
21826 + #endif
21827 +
21828 + encryMode = ZM_TKIP;
21829 +
21830 + zfTkipInit(keyInfo.key, (u8_t*) wd->sta.bssid,
21831 + &wd->sta.rxSeed[keyInfo.keyIndex], keyInfo.initIv);
21832 + zfMicSetKey(&keyInfo.key[24],
21833 + &wd->sta.rxMicKey[keyInfo.keyIndex]);
21834 + }
21835 + else if ( keyInfo.keyLength == 16 )
21836 + {
21837 + /* AES */
21838 + #if 0
21839 + // Don't reset the IV since some AP would fail in IV check and drop our connection
21840 + if ( wd->sta.wpaState != ZM_STA_WPA_STATE_PK_OK )
21841 + {
21842 + /* broadcast -- > group key */
21843 + /* Only initialize when set our default key ! */
21844 + wd->sta.iv16 = 0;
21845 + wd->sta.iv32 = 0;
21846 + }
21847 + #endif
21848 +
21849 + encryMode = ZM_AES;
21850 + }
21851 + else if ( keyInfo.keyLength == 29 )
21852 + {
21853 + zm_debug_msg0("WEP 256");
21854 +
21855 + encryMode = ZM_WEP256;
21856 + //zfCoreSetKey(dev, 64, 1, wd->sta.encryMode,
21857 + // wd->sta.bssid, (u32_t*) (&keyInfo.key[16]));
21858 + }
21859 + else
21860 + {
21861 + return ZM_STATUS_FAILURE;
21862 + }
21863 +
21864 + {
21865 + u8_t i;
21866 +
21867 + zm_debug_msg0("key = ");
21868 + for(i = 0; i < keyInfo.keyLength; i++)
21869 + {
21870 + zm_debug_msg2("", keyInfo.key[i]);
21871 + }
21872 + }
21873 +
21874 + if ( keyInfo.flag & ZM_KEY_FLAG_DEFAULT_KEY )
21875 + {
21876 + //for WEP default key 1~3 and ATOM platform--CWYang(+)
21877 + vapId = 0;
21878 + wd->ap.bcHalKeyIdx[vapId] = keyInfo.keyIndex;
21879 + wd->ap.bcKeyIndex[vapId] = keyInfo.keyIndex;
21880 + wd->sta.keyId = keyInfo.keyIndex;
21881 + }
21882 +
21883 + if(encryMode == ZM_TKIP)
21884 + {
21885 + if(wd->TKIP_Group_KeyChanging == 0x1)
21886 + {
21887 + zm_debug_msg0("Countermeasure : Cancel Old Timer ");
21888 + zfTimerCancel(dev, ZM_EVENT_SKIP_COUNTERMEASURE);
21889 + }
21890 + else
21891 + {
21892 + zm_debug_msg0("Countermeasure : Create New Timer ");
21893 + }
21894 +
21895 + wd->TKIP_Group_KeyChanging = 0x1;
21896 + zfTimerSchedule(dev, ZM_EVENT_SKIP_COUNTERMEASURE, 150);
21897 + }
21898 +
21899 +
21900 +
21901 + //------------------------------------------------------------------------
21902 +
21903 + /* use default key */
21904 + //zfCoreSetKey(dev, ZM_USER_KEY_DEFAULT+keyInfo.keyIndex, 0,
21905 + // wd->sta.encryMode, wd->sta.bssid, (u32_t*) keyInfo.key);
21906 +
21907 + if ( encryMode == ZM_TKIP ||
21908 + encryMode == ZM_AES )
21909 + {
21910 + zfHpSetDefaultKey(dev, keyInfo.keyIndex, encryMode,
21911 + (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
21912 +
21913 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
21914 + if ( (keyInfo.keyLength==16) && (wd->sta.ibssWpa2Psk==1) )
21915 + {/* If not AES-CCMP and ibss network , use traditional */
21916 + wd->sta.wpaState = ZM_STA_WPA_STATE_PK_OK;
21917 + }
21918 + else
21919 + {
21920 + if (wd->sta.wpaState == ZM_STA_WPA_STATE_PK_OK)
21921 + wd->sta.wpaState = ZM_STA_WPA_STATE_GK_OK;
21922 + else
21923 + {
21924 + wd->sta.wpaState = ZM_STA_WPA_STATE_PK_OK;
21925 + wd->sta.encryMode = encryMode;
21926 + wd->ws.encryMode = encryMode;
21927 + }
21928 + }
21929 +#else
21930 + if (wd->sta.wpaState == ZM_STA_WPA_STATE_PK_OK)
21931 + wd->sta.wpaState = ZM_STA_WPA_STATE_GK_OK;
21932 + else if ( wd->sta.wpaState == ZM_STA_WPA_STATE_INIT )
21933 + {
21934 + wd->sta.wpaState = ZM_STA_WPA_STATE_PK_OK;
21935 + wd->sta.encryMode = encryMode;
21936 + wd->ws.encryMode = encryMode;
21937 + }
21938 +#endif
21939 + }
21940 + else
21941 + {
21942 + zfHpSetDefaultKey(dev, keyInfo.keyIndex, encryMode,
21943 + (u32_t*) keyInfo.key, NULL);
21944 +
21945 + /* Save key for software WEP */
21946 + zfMemoryCopy(wd->sta.wepKey[keyInfo.keyIndex], keyInfo.key,
21947 + keyInfo.keyLength);
21948 +
21949 + /* TODO: Check whether we need to save the SWEncryMode */
21950 + wd->sta.SWEncryMode[keyInfo.keyIndex] = encryMode;
21951 +
21952 + wd->sta.encryMode = encryMode;
21953 + wd->ws.encryMode = encryMode;
21954 + }
21955 + }
21956 + }
21957 +
21958 +// wd->sta.flagKeyChanging = 1;
21959 + return ZM_STATUS_SUCCESS;
21960 +}
21961 +
21962 +/* PSEUDO test */
21963 +u8_t zfiWlanPSEUDOSetKey(zdev_t* dev, struct zsKeyInfo keyInfo)
21964 +{
21965 + //u16_t broadcast[3] = {0xffff, 0xffff, 0xffff};
21966 + //u32_t* key;
21967 + u8_t micKey[16];
21968 +
21969 + zmw_get_wlan_dev(dev);
21970 +
21971 + switch (keyInfo.keyLength)
21972 + {
21973 + case 5:
21974 + wd->sta.encryMode = ZM_WEP64;
21975 + /* use default key */
21976 + zfCoreSetKey(dev, 64, 0, ZM_WEP64, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
21977 + break;
21978 +
21979 + case 13:
21980 + wd->sta.encryMode = ZM_WEP128;
21981 + /* use default key */
21982 + zfCoreSetKey(dev, 64, 0, ZM_WEP128, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
21983 + break;
21984 +
21985 + case 29:
21986 + wd->sta.encryMode = ZM_WEP256;
21987 + /* use default key */
21988 + zfCoreSetKey(dev, 64, 1, ZM_WEP256, (u16_t *)keyInfo.macAddr, (u32_t*) (&keyInfo.key[16]));
21989 + zfCoreSetKey(dev, 64, 0, ZM_WEP256, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
21990 + break;
21991 +
21992 + case 16:
21993 + wd->sta.encryMode = ZM_AES;
21994 + //zfCoreSetKey(dev, 0, 0, ZM_AES, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
21995 + zfCoreSetKey(dev, 64, 0, ZM_AES, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
21996 + break;
21997 +
21998 + case 32:
21999 +#ifdef ZM_ENABLE_CENC
22000 + if (keyInfo.flag & ZM_KEY_FLAG_CENC)
22001 + {
22002 + u16_t boardcastAddr[3] = {0xffff, 0xffff, 0xffff};
22003 + u16_t Addr_a[] = { 0x0000, 0x0080, 0x0901};
22004 + u16_t Addr_b[] = { 0x0000, 0x0080, 0x0902};
22005 + /* CENC test: user0,1 and user2 for boardcast */
22006 + wd->sta.encryMode = ZM_CENC;
22007 + zfCoreSetKey(dev, 0, 1, ZM_CENC, (u16_t *)Addr_a, (u32_t*) (&keyInfo.key[16]));
22008 + zfCoreSetKey(dev, 0, 0, ZM_CENC, (u16_t *)Addr_a, (u32_t*) keyInfo.key);
22009 +
22010 + zfCoreSetKey(dev, 1, 1, ZM_CENC, (u16_t *)Addr_b, (u32_t*) (&keyInfo.key[16]));
22011 + zfCoreSetKey(dev, 1, 0, ZM_CENC, (u16_t *)Addr_b, (u32_t*) keyInfo.key);
22012 +
22013 + zfCoreSetKey(dev, 2, 1, ZM_CENC, (u16_t *)boardcastAddr, (u32_t*) (&keyInfo.key[16]));
22014 + zfCoreSetKey(dev, 2, 0, ZM_CENC, (u16_t *)boardcastAddr, (u32_t*) keyInfo.key);
22015 +
22016 + /* Initialize PN sequence */
22017 + wd->sta.txiv[0] = 0x5c365c36;
22018 + wd->sta.txiv[1] = 0x5c365c36;
22019 + wd->sta.txiv[2] = 0x5c365c36;
22020 + wd->sta.txiv[3] = 0x5c365c36;
22021 + }
22022 + else
22023 +#endif //ZM_ENABLE_CENC
22024 + {
22025 + wd->sta.encryMode = ZM_TKIP;
22026 + zfCoreSetKey(dev, 64, 1, ZM_TKIP, (u16_t *)keyInfo.macAddr, (u32_t*) micKey);
22027 + zfCoreSetKey(dev, 64, 0, ZM_TKIP, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
22028 + }
22029 + break;
22030 + default:
22031 + wd->sta.encryMode = ZM_NO_WEP;
22032 + }
22033 +
22034 + return ZM_STATUS_SUCCESS;
22035 +}
22036 +
22037 +void zfiWlanSetPowerSaveMode(zdev_t* dev, u8_t mode)
22038 +{
22039 +#if 0
22040 + zmw_get_wlan_dev(dev);
22041 +
22042 + wd->sta.powerSaveMode = mode;
22043 +
22044 + /* send null data with PwrBit to inform AP */
22045 + if ( mode > ZM_STA_PS_NONE )
22046 + {
22047 + if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
22048 + {
22049 + zfSendNullData(dev, 1);
22050 + }
22051 +
22052 + /* device into PS mode */
22053 + zfPSDeviceSleep(dev);
22054 + }
22055 +#endif
22056 +
22057 + zfPowerSavingMgrSetMode(dev, mode);
22058 +}
22059 +
22060 +void zfiWlanSetMacAddress(zdev_t* dev, u16_t* mac)
22061 +{
22062 + zmw_get_wlan_dev(dev);
22063 +
22064 + wd->macAddr[0] = mac[0];
22065 + wd->macAddr[1] = mac[1];
22066 + wd->macAddr[2] = mac[2];
22067 +
22068 + zfHpSetMacAddress(dev, mac, 0);
22069 +}
22070 +
22071 +u8_t zfiWlanQueryWlanMode(zdev_t* dev)
22072 +{
22073 + zmw_get_wlan_dev(dev);
22074 +
22075 + return wd->wlanMode;
22076 +}
22077 +
22078 +u8_t zfiWlanQueryAdapterState(zdev_t* dev)
22079 +{
22080 + zmw_get_wlan_dev(dev);
22081 +
22082 + return wd->state;
22083 +}
22084 +
22085 +u8_t zfiWlanQueryAuthenticationMode(zdev_t* dev, u8_t bWrapper)
22086 +{
22087 + u8_t authMode;
22088 +
22089 + zmw_get_wlan_dev(dev);
22090 +
22091 + if ( bWrapper )
22092 + {
22093 + authMode = wd->ws.authMode;
22094 + }
22095 + else
22096 + {
22097 + //authMode = wd->sta.authMode;
22098 + authMode = wd->sta.currentAuthMode;
22099 + }
22100 +
22101 + return authMode;
22102 +}
22103 +
22104 +u8_t zfiWlanQueryWepStatus(zdev_t* dev, u8_t bWrapper)
22105 +{
22106 + u8_t wepStatus;
22107 +
22108 + zmw_get_wlan_dev(dev);
22109 +
22110 + if ( bWrapper )
22111 + {
22112 + wepStatus = wd->ws.wepStatus;
22113 + }
22114 + else
22115 + {
22116 + wepStatus = wd->sta.wepStatus;
22117 + }
22118 +
22119 + return wepStatus;
22120 +}
22121 +
22122 +void zfiWlanQuerySSID(zdev_t* dev, u8_t* ssid, u8_t* pSsidLength)
22123 +{
22124 + u16_t vapId = 0;
22125 + zmw_get_wlan_dev(dev);
22126 +
22127 + if (wd->wlanMode == ZM_MODE_AP)
22128 + {
22129 + vapId = zfwGetVapId(dev);
22130 +
22131 + if (vapId == 0xffff)
22132 + {
22133 + *pSsidLength = wd->ap.ssidLen[0];
22134 + zfMemoryCopy(ssid, wd->ap.ssid[0], wd->ap.ssidLen[0]);
22135 + }
22136 + else
22137 + {
22138 + *pSsidLength = wd->ap.ssidLen[vapId + 1];
22139 + zfMemoryCopy(ssid, wd->ap.ssid[vapId + 1], wd->ap.ssidLen[vapId + 1]);
22140 + }
22141 + }
22142 + else
22143 + {
22144 + *pSsidLength = wd->sta.ssidLen;
22145 + zfMemoryCopy(ssid, wd->sta.ssid, wd->sta.ssidLen);
22146 + }
22147 +}
22148 +
22149 +u16_t zfiWlanQueryFragThreshold(zdev_t* dev)
22150 +{
22151 + zmw_get_wlan_dev(dev);
22152 +
22153 + return wd->fragThreshold;
22154 +}
22155 +
22156 +u16_t zfiWlanQueryRtsThreshold(zdev_t* dev)
22157 +{
22158 + zmw_get_wlan_dev(dev);
22159 +
22160 + return wd->rtsThreshold;
22161 +}
22162 +
22163 +u32_t zfiWlanQueryFrequency(zdev_t* dev)
22164 +{
22165 + zmw_get_wlan_dev(dev);
22166 +
22167 + return (wd->frequency*1000);
22168 +}
22169 +
22170 +/***********************************************************
22171 + * Function: zfiWlanQueryCurrentFrequency
22172 + * Return value:
22173 + * - 0 : no validate current frequency
22174 + * - (>0): current frequency depend on "qmode"
22175 + * Input:
22176 + * - qmode:
22177 + * 0: return value depend on the support mode, this
22178 + qmode is use to solve the bug #31223
22179 + * 1: return the actually current frequency
22180 + ***********************************************************/
22181 +u32_t zfiWlanQueryCurrentFrequency(zdev_t* dev, u8_t qmode)
22182 +{
22183 + u32_t frequency;
22184 +
22185 + zmw_get_wlan_dev(dev);
22186 +
22187 + switch (qmode)
22188 + {
22189 + case 0:
22190 + if (wd->sta.currentFrequency > 3000)
22191 + {
22192 + if (wd->supportMode & ZM_WIRELESS_MODE_5)
22193 + {
22194 + frequency = wd->sta.currentFrequency;
22195 + }
22196 + else if (wd->supportMode & ZM_WIRELESS_MODE_24)
22197 + {
22198 + frequency = zfChGetFirst2GhzChannel(dev);
22199 + }
22200 + else
22201 + {
22202 + frequency = 0;
22203 + }
22204 + }
22205 + else
22206 + {
22207 + if (wd->supportMode & ZM_WIRELESS_MODE_24)
22208 + {
22209 + frequency = wd->sta.currentFrequency;
22210 + }
22211 + else if (wd->supportMode & ZM_WIRELESS_MODE_5)
22212 + {
22213 + frequency = zfChGetLast5GhzChannel(dev);
22214 + }
22215 + else
22216 + {
22217 + frequency = 0;
22218 + }
22219 + }
22220 + break;
22221 +
22222 + case 1:
22223 + frequency = wd->sta.currentFrequency;
22224 + break;
22225 +
22226 + default:
22227 + frequency = 0;
22228 + }
22229 +
22230 + return (frequency*1000);
22231 +}
22232 +
22233 +u32_t zfiWlanQueryFrequencyAttribute(zdev_t* dev, u32_t freq)
22234 +{
22235 + zmw_get_wlan_dev(dev);
22236 +
22237 + u8_t i;
22238 + u16_t frequency = (u16_t) (freq/1000);
22239 + u32_t ret = 0;
22240 +
22241 + for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
22242 + {
22243 + if ( wd->regulationTable.allowChannel[i].channel == frequency )
22244 + {
22245 + ret = wd->regulationTable.allowChannel[i].channelFlags;
22246 + }
22247 + }
22248 +
22249 + return ret;
22250 +}
22251 +
22252 +/* BandWidth 0=>20 1=>40 */
22253 +/* ExtOffset 0=>20 1=>high control 40 3=>low control 40 */
22254 +void zfiWlanQueryFrequencyHT(zdev_t* dev, u32_t *bandWidth, u32_t *extOffset)
22255 +{
22256 + zmw_get_wlan_dev(dev);
22257 +
22258 + *bandWidth = wd->BandWidth40;
22259 + *extOffset = wd->ExtOffset;
22260 +}
22261 +
22262 +u8_t zfiWlanQueryCWMode(zdev_t* dev)
22263 +{
22264 + zmw_get_wlan_dev(dev);
22265 +
22266 + return wd->cwm.cw_mode;
22267 +}
22268 +
22269 +u32_t zfiWlanQueryCWEnable(zdev_t* dev)
22270 +{
22271 + zmw_get_wlan_dev(dev);
22272 +
22273 + return wd->cwm.cw_enable;
22274 +}
22275 +
22276 +void zfiWlanQueryBssid(zdev_t* dev, u8_t* bssid)
22277 +{
22278 + u8_t addr[6];
22279 +
22280 + zmw_get_wlan_dev(dev);
22281 +
22282 + ZM_MAC_WORD_TO_BYTE(wd->sta.bssid, addr);
22283 + zfMemoryCopy(bssid, addr, 6);
22284 +}
22285 +
22286 +u16_t zfiWlanQueryBeaconInterval(zdev_t* dev)
22287 +{
22288 + zmw_get_wlan_dev(dev);
22289 +
22290 + return wd->beaconInterval;
22291 +}
22292 +
22293 +u32_t zfiWlanQueryRxBeaconTotal(zdev_t* dev)
22294 +{
22295 + zmw_get_wlan_dev(dev);
22296 + wd->sta.rxBeaconTotal += wd->sta.rxBeaconCount;
22297 +
22298 + return wd->sta.rxBeaconTotal;
22299 +}
22300 +
22301 +u16_t zfiWlanQueryAtimWindow(zdev_t* dev)
22302 +{
22303 + u16_t atimWindow;
22304 +
22305 + zmw_get_wlan_dev(dev);
22306 +
22307 + atimWindow = wd->sta.atimWindow;
22308 +
22309 + return atimWindow;
22310 +}
22311 +
22312 +u8_t zfiWlanQueryEncryMode(zdev_t* dev)
22313 +{
22314 + zmw_get_wlan_dev(dev);
22315 +
22316 + if (wd->wlanMode == ZM_MODE_AP)
22317 + return wd->ap.encryMode[0];
22318 + else
22319 + return wd->sta.encryMode;
22320 +}
22321 +
22322 +u16_t zfiWlanQueryCapability(zdev_t* dev)
22323 +{
22324 + u16_t capability;
22325 +
22326 + zmw_get_wlan_dev(dev);
22327 +
22328 + capability = wd->sta.capability[0] +
22329 + (((u16_t) wd->sta.capability[1]) << 8);
22330 +
22331 + return capability;
22332 +
22333 +}
22334 +
22335 +u16_t zfiWlanQueryAid(zdev_t* dev)
22336 +{
22337 + zmw_get_wlan_dev(dev);
22338 +
22339 + return wd->sta.aid;
22340 +}
22341 +
22342 +void zfiWlanQuerySupportRate(zdev_t* dev, u8_t* rateArray, u8_t* pLength)
22343 +{
22344 + u8_t i, j=0;
22345 +
22346 + zmw_get_wlan_dev(dev);
22347 +
22348 + for( i=0; i<4; i++ )
22349 + {
22350 + if ( wd->bRate & (0x1 << i) )
22351 + {
22352 + rateArray[j] = zg11bRateTbl[i] +
22353 + ((wd->bRateBasic & (0x1<<i))<<(7-i));
22354 + j++;
22355 + }
22356 + }
22357 +
22358 + *pLength = j;
22359 +}
22360 +
22361 +void zfiWlanQueryExtSupportRate(zdev_t* dev, u8_t* rateArray, u8_t* pLength)
22362 +{
22363 + u8_t i, j=0;
22364 +
22365 + zmw_get_wlan_dev(dev);
22366 +
22367 + for( i=0; i<8; i++ )
22368 + {
22369 + if ( wd->gRate & (0x1 << i) )
22370 + {
22371 + rateArray[j] = zg11gRateTbl[i] +
22372 + ((wd->gRateBasic & (0x1<<i))<<(7-i));
22373 + j++;
22374 + }
22375 + }
22376 +
22377 + *pLength = j;
22378 +}
22379 +
22380 +void zfiWlanQueryRsnIe(zdev_t* dev, u8_t* ie, u8_t* pLength)
22381 +{
22382 + u8_t len;
22383 +
22384 + zmw_get_wlan_dev(dev);
22385 +
22386 + len = wd->sta.rsnIe[1] + 2;
22387 + zfMemoryCopy(ie, wd->sta.rsnIe, len);
22388 + *pLength = len;
22389 +}
22390 +
22391 +void zfiWlanQueryWpaIe(zdev_t* dev, u8_t* ie, u8_t* pLength)
22392 +{
22393 + u8_t len;
22394 +
22395 + zmw_get_wlan_dev(dev);
22396 +
22397 + len = wd->sta.wpaIe[1] + 2;
22398 + zfMemoryCopy(ie, wd->sta.wpaIe, len);
22399 + *pLength = len;
22400 +
22401 +}
22402 +
22403 +u8_t zfiWlanQueryMulticastCipherAlgo(zdev_t *dev)
22404 +{
22405 + zmw_get_wlan_dev(dev);
22406 +
22407 + switch( wd->sta.currentAuthMode )
22408 + {
22409 + case ZM_AUTH_MODE_WPA2PSK:
22410 + case ZM_AUTH_MODE_WPA2:
22411 + if ( wd->sta.rsnIe[7] == 2 )
22412 + {
22413 + return ZM_TKIP;
22414 + }
22415 + else
22416 + {
22417 + return ZM_AES;
22418 + }
22419 + break;
22420 +
22421 + case ZM_AUTH_MODE_WPAPSK:
22422 + case ZM_AUTH_MODE_WPA:
22423 + if ( wd->sta.rsnIe[11] == 2 )
22424 + {
22425 + return ZM_TKIP;
22426 + }
22427 + else
22428 + {
22429 + return ZM_AES;
22430 + }
22431 + break;
22432 +
22433 + default:
22434 + return wd->sta.encryMode;
22435 + }
22436 +}
22437 +
22438 +u8_t zfiWlanQueryHTMode(zdev_t* dev)
22439 +{
22440 + zmw_get_wlan_dev(dev);
22441 + // 0:Legancy, 1:N
22442 + return wd->sta.EnableHT;
22443 +}
22444 +
22445 +u8_t zfiWlanQueryBandWidth40(zdev_t* dev)
22446 +{
22447 + zmw_get_wlan_dev(dev);
22448 + // 0:20M, 1:40M
22449 + return wd->BandWidth40;
22450 +}
22451 +
22452 +u16_t zfiWlanQueryRegionCode(zdev_t* dev)
22453 +{
22454 + zmw_get_wlan_dev(dev);
22455 +
22456 + return wd->regulationTable.regionCode;
22457 +}
22458 +void zfiWlanSetWpaIe(zdev_t* dev, u8_t* ie, u8_t Length)
22459 +{
22460 + u16_t vapId = 0;
22461 + zmw_get_wlan_dev(dev);
22462 +
22463 + if (wd->wlanMode == ZM_MODE_AP) // AP Mode
22464 + {
22465 + vapId = zfwGetVapId(dev);
22466 +
22467 + if (vapId == 0xffff)
22468 + vapId = 0;
22469 + else
22470 + vapId++;
22471 +
22472 + zm_assert(Length < ZM_MAX_WPAIE_SIZE);
22473 + if (Length < ZM_MAX_WPAIE_SIZE)
22474 + {
22475 + wd->ap.wpaLen[vapId] = Length;
22476 + zfMemoryCopy(wd->ap.wpaIe[vapId], ie, wd->ap.wpaLen[vapId]);
22477 + }
22478 +
22479 + }
22480 + else
22481 + {
22482 + wd->sta.wpaLen = Length;
22483 + zfMemoryCopy(wd->sta.wpaIe, ie, wd->sta.wpaLen);
22484 + }
22485 + //zfiWlanSetWpaSupport(dev, 1);
22486 + if (wd->wlanMode == ZM_MODE_AP) // AP Mode
22487 + {
22488 + wd->ap.wpaSupport[vapId] = 1;
22489 + }
22490 + else
22491 + {
22492 + wd->sta.wpaSupport = 1;
22493 + }
22494 +
22495 +}
22496 +
22497 +void zfiWlanSetWpaSupport(zdev_t* dev, u8_t WpaSupport)
22498 +{
22499 + u16_t vapId = 0;
22500 + zmw_get_wlan_dev(dev);
22501 +
22502 + if (wd->wlanMode == ZM_MODE_AP) // AP Mode
22503 + {
22504 + vapId = zfwGetVapId(dev);
22505 +
22506 + if (vapId == 0xffff)
22507 + vapId = 0;
22508 + else
22509 + vapId++;
22510 +
22511 + wd->ap.wpaSupport[vapId] = WpaSupport;
22512 + }
22513 + else
22514 + {
22515 + wd->sta.wpaSupport = WpaSupport;
22516 + }
22517 +
22518 +}
22519 +
22520 +void zfiWlanSetProtectionMode(zdev_t* dev, u8_t mode)
22521 +{
22522 + zmw_get_wlan_dev(dev);
22523 +
22524 + wd->sta.bProtectionMode = mode;
22525 + if (wd->sta.bProtectionMode == TRUE)
22526 + {
22527 + zfHpSetSlotTime(dev, 0);
22528 + }
22529 + else
22530 + {
22531 + zfHpSetSlotTime(dev, 1);
22532 + }
22533 +
22534 + zm_msg1_mm(ZM_LV_1, "wd->protectionMode=", wd->sta.bProtectionMode);
22535 +}
22536 +
22537 +void zfiWlanSetBasicRate(zdev_t* dev, u8_t bRateSet, u8_t gRateSet,
22538 + u32_t nRateSet)
22539 +{
22540 + zmw_get_wlan_dev(dev);
22541 +
22542 + wd->ws.bRateBasic = bRateSet;
22543 + wd->ws.gRateBasic = gRateSet;
22544 + wd->ws.nRateBasic = nRateSet;
22545 +}
22546 +
22547 +void zfiWlanSetBGMode(zdev_t* dev, u8_t mode)
22548 +{
22549 + zmw_get_wlan_dev(dev);
22550 +
22551 + wd->ws.bgMode = mode;
22552 +}
22553 +
22554 +void zfiWlanSetpreambleType(zdev_t* dev, u8_t type)
22555 +{
22556 + zmw_get_wlan_dev(dev);
22557 +
22558 + wd->ws.preambleType = type;
22559 +}
22560 +
22561 +u8_t zfiWlanQuerypreambleType(zdev_t* dev)
22562 +{
22563 + zmw_get_wlan_dev(dev);
22564 +
22565 + return wd->ws.preambleType;
22566 +}
22567 +
22568 +u8_t zfiWlanQueryPowerSaveMode(zdev_t* dev)
22569 +{
22570 + zmw_get_wlan_dev(dev);
22571 +
22572 + return wd->sta.powerSaveMode;
22573 +}
22574 +
22575 +u8_t zfiWlanSetPmkidInfo(zdev_t* dev, u16_t* bssid, u8_t* pmkid)
22576 +{
22577 + u32_t i;
22578 +
22579 + zmw_get_wlan_dev(dev);
22580 +
22581 + for(i=0; i<wd->sta.pmkidInfo.bssidCount; i++)
22582 + {
22583 + if ( zfMemoryIsEqual((u8_t*) wd->sta.pmkidInfo.bssidInfo[i].bssid,
22584 + (u8_t*) bssid, 6) )
22585 + {
22586 + /* matched */
22587 + break;
22588 + }
22589 + }
22590 +
22591 + if ( i < wd->sta.pmkidInfo.bssidCount )
22592 + {
22593 + /* overwrite the original one */
22594 + zfMemoryCopy(wd->sta.pmkidInfo.bssidInfo[i].pmkid, pmkid, 16);
22595 + }
22596 + else
22597 + {
22598 + if ( i < ZM_PMKID_MAX_BSS_CNT )
22599 + {
22600 + wd->sta.pmkidInfo.bssidInfo[i].bssid[0] = bssid[0];
22601 + wd->sta.pmkidInfo.bssidInfo[i].bssid[1] = bssid[1];
22602 + wd->sta.pmkidInfo.bssidInfo[i].bssid[2] = bssid[2];
22603 +
22604 + zfMemoryCopy(wd->sta.pmkidInfo.bssidInfo[i].pmkid, pmkid, 16);
22605 + wd->sta.pmkidInfo.bssidCount++;
22606 + }
22607 + }
22608 +
22609 + return 0;
22610 +}
22611 +
22612 +u32_t zfiWlanQueryPmkidInfo(zdev_t* dev, u8_t* buf, u32_t len)
22613 +{
22614 + //struct zsPmkidInfo* pPmkidInfo = ( struct zsPmkidInfo* ) buf;
22615 + u32_t size;
22616 +
22617 + zmw_get_wlan_dev(dev);
22618 +
22619 + size = sizeof(u32_t) +
22620 + wd->sta.pmkidInfo.bssidCount * sizeof(struct zsPmkidBssidInfo);
22621 +
22622 + if ( len < size )
22623 + {
22624 + return wd->sta.pmkidInfo.bssidCount;
22625 + }
22626 +
22627 + zfMemoryCopy(buf, (u8_t*) &wd->sta.pmkidInfo, (u16_t) size);
22628 +
22629 + return 0;
22630 +}
22631 +
22632 +void zfiWlanSetMulticastList(zdev_t* dev, u8_t size, u8_t* pList)
22633 +{
22634 + struct zsMulticastAddr* pMacList = (struct zsMulticastAddr*) pList;
22635 + u8_t i;
22636 + u8_t bAllMulticast = 0;
22637 + //u32_t value;
22638 +
22639 + zmw_get_wlan_dev(dev);
22640 +
22641 + wd->sta.multicastList.size = size;
22642 + for(i=0; i<size; i++)
22643 + {
22644 + zfMemoryCopy(wd->sta.multicastList.macAddr[i].addr,
22645 + pMacList[i].addr, 6);
22646 + }
22647 +
22648 + if ( wd->sta.osRxFilter & ZM_PACKET_TYPE_ALL_MULTICAST )
22649 + bAllMulticast = 1;
22650 + zfHpSetMulticastList(dev, size, pList, bAllMulticast);
22651 +
22652 +}
22653 +
22654 +void zfiWlanRemoveKey(zdev_t* dev, u8_t keyType, u8_t keyId)
22655 +{
22656 + u16_t fakeMacAddr[3] = {0, 0, 0};
22657 + u32_t fakeKey[4] = {0, 0, 0, 0};
22658 +
22659 + zmw_get_wlan_dev(dev);
22660 +
22661 + if ( keyType == 0 )
22662 + {
22663 + /* remove WEP key */
22664 + zm_debug_msg0("remove WEP key");
22665 + zfCoreSetKey(dev, ZM_USER_KEY_DEFAULT+keyId, 0,
22666 + ZM_NO_WEP, fakeMacAddr, fakeKey);
22667 + wd->sta.encryMode = ZM_NO_WEP;
22668 + }
22669 + else if ( keyType == 1 )
22670 + {
22671 + /* remove pairwise key */
22672 + zm_debug_msg0("remove pairwise key");
22673 + zfHpRemoveKey(dev, ZM_USER_KEY_PK);
22674 + wd->sta.encryMode = ZM_NO_WEP;
22675 + }
22676 + else
22677 + {
22678 + /* remove group key */
22679 + zm_debug_msg0("remove group key");
22680 + zfHpRemoveKey(dev, ZM_USER_KEY_GK);
22681 + }
22682 +}
22683 +
22684 +
22685 +void zfiWlanQueryRegulationTable(zdev_t* dev, struct zsRegulationTable* pEntry)
22686 +{
22687 + zmw_get_wlan_dev(dev);
22688 +
22689 + zfMemoryCopy((u8_t*) pEntry, (u8_t*) &wd->regulationTable,
22690 + sizeof(struct zsRegulationTable));
22691 +}
22692 +
22693 +/* parameter "time" is specified in ms */
22694 +void zfiWlanSetScanTimerPerChannel(zdev_t* dev, u16_t time)
22695 +{
22696 + zmw_get_wlan_dev(dev);
22697 +
22698 + zm_debug_msg1("scan time (ms) = ", time);
22699 +
22700 + wd->sta.activescanTickPerChannel = time / ZM_MS_PER_TICK;
22701 +}
22702 +
22703 +void zfiWlanSetAutoReconnect(zdev_t* dev, u8_t enable)
22704 +{
22705 + zmw_get_wlan_dev(dev);
22706 +
22707 + wd->sta.bAutoReconnect = enable;
22708 + //wd->sta.bAutoReconnectEnabled = enable;
22709 +}
22710 +
22711 +void zfiWlanSetStaWme(zdev_t* dev, u8_t enable, u8_t uapsdInfo)
22712 +{
22713 + zmw_get_wlan_dev(dev);
22714 +
22715 + wd->ws.staWmeEnabled = enable & 0x3;
22716 + if ((enable & 0x2) != 0)
22717 + {
22718 + wd->ws.staWmeQosInfo = uapsdInfo & 0x6f;
22719 + }
22720 + else
22721 + {
22722 + wd->ws.staWmeQosInfo = 0;
22723 + }
22724 +}
22725 +
22726 +void zfiWlanSetApWme(zdev_t* dev, u8_t enable)
22727 +{
22728 + zmw_get_wlan_dev(dev);
22729 +
22730 + wd->ws.apWmeEnabled = enable;
22731 +}
22732 +
22733 +u8_t zfiWlanQuerywmeEnable(zdev_t* dev)
22734 +{
22735 + zmw_get_wlan_dev(dev);
22736 +
22737 + return wd->ws.staWmeEnabled;
22738 +}
22739 +
22740 +void zfiWlanSetProbingHiddenSsid(zdev_t* dev, u8_t* ssid, u8_t ssidLen,
22741 + u16_t entry)
22742 +{
22743 + zmw_get_wlan_dev(dev);
22744 + zmw_declare_for_critical_section();
22745 +
22746 +
22747 + if ((ssidLen <= 32) && (entry < ZM_MAX_PROBE_HIDDEN_SSID_SIZE))
22748 + {
22749 + zmw_enter_critical_section(dev);
22750 + wd->ws.probingSsidList[entry].ssidLen = ssidLen;
22751 + zfMemoryCopy(wd->ws.probingSsidList[entry].ssid, ssid, ssidLen);
22752 + zmw_leave_critical_section(dev);
22753 + }
22754 +
22755 + return;
22756 +}
22757 +
22758 +void zfiWlanSetDisableProbingWithSsid(zdev_t* dev, u8_t mode)
22759 +{
22760 + zmw_get_wlan_dev(dev);
22761 +
22762 + wd->sta.disableProbingWithSsid = mode;
22763 +
22764 + return;
22765 +}
22766 +
22767 +void zfiWlanSetDropUnencryptedPackets(zdev_t* dev, u8_t enable)
22768 +{
22769 + zmw_get_wlan_dev(dev);
22770 +
22771 + wd->ws.dropUnencryptedPkts = enable;
22772 +}
22773 +
22774 +void zfiWlanSetStaRxSecurityCheckCb(zdev_t* dev, zfpStaRxSecurityCheckCb pStaRxSecurityCheckCb)
22775 +{
22776 + zmw_get_wlan_dev(dev);
22777 +
22778 + wd->sta.pStaRxSecurityCheckCb = pStaRxSecurityCheckCb;
22779 +}
22780 +
22781 +void zfiWlanSetIBSSJoinOnly(zdev_t* dev, u8_t joinOnly)
22782 +{
22783 + zmw_get_wlan_dev(dev);
22784 +
22785 + wd->ws.ibssJoinOnly = joinOnly;
22786 +}
22787 +
22788 +/************************************************************************/
22789 +/* */
22790 +/* FUNCTION DESCRIPTION zfiConfigWdsPort */
22791 +/* Configure WDS port. */
22792 +/* */
22793 +/* INPUTS */
22794 +/* dev : device pointer */
22795 +/* wdsPortId : WDS port ID, start from 0 */
22796 +/* flag : 0=>disable WDS port, 1=>enable WDS port */
22797 +/* wdsAddr : WDS neighbor MAC address */
22798 +/* encType : encryption type for WDS port */
22799 +/* wdsKey : encryption key for WDS port */
22800 +/* */
22801 +/* OUTPUTS */
22802 +/* Error code */
22803 +/* */
22804 +/* AUTHOR */
22805 +/* Stephen Chen ZyDAS Technology Corporation 2006.6 */
22806 +/* */
22807 +/************************************************************************/
22808 +u16_t zfiConfigWdsPort(zdev_t* dev, u8_t wdsPortId, u16_t flag, u16_t* wdsAddr,
22809 + u16_t encType, u32_t* wdsKey)
22810 +{
22811 + u16_t addr[3];
22812 + u32_t key[4];
22813 +
22814 + zmw_get_wlan_dev(dev);
22815 +
22816 + if (wdsPortId > ZM_MAX_WDS_SUPPORT)
22817 + {
22818 + return ZM_ERR_WDS_PORT_ID;
22819 + }
22820 +
22821 + if (flag == 1)
22822 + {
22823 + /* Enable WDS port */
22824 + wd->ap.wds.macAddr[wdsPortId][0] = wdsAddr[0];
22825 + wd->ap.wds.macAddr[wdsPortId][1] = wdsAddr[1];
22826 + wd->ap.wds.macAddr[wdsPortId][2] = wdsAddr[2];
22827 +
22828 + wd->ap.wds.wdsBitmap |= (1 << wdsPortId);
22829 + wd->ap.wds.encryMode[wdsPortId] = (u8_t) encType;
22830 +
22831 + zfCoreSetKey(dev, 10+ZM_MAX_WDS_SUPPORT, 0, (u8_t) encType, wdsAddr, wdsKey);
22832 + }
22833 + else
22834 + {
22835 + /* Disable WDS port */
22836 + addr[0] = addr[1] = addr[2] = 0;
22837 + key[0] = key[1] = key[2] = key[3] = 0;
22838 + wd->ap.wds.wdsBitmap &= (~(1 << wdsPortId));
22839 + zfCoreSetKey(dev, 10+ZM_MAX_WDS_SUPPORT, 0, ZM_NO_WEP, addr, key);
22840 + }
22841 +
22842 + return ZM_SUCCESS;
22843 +}
22844 +#ifdef ZM_ENABLE_CENC
22845 +/* CENC */
22846 +void zfiWlanQueryGSN(zdev_t* dev, u8_t *gsn, u16_t vapId)
22847 +{
22848 + //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev);
22849 + u32_t txiv[4];
22850 + zmw_get_wlan_dev(dev);
22851 +
22852 + /* convert little endian to big endian for 32 bits */
22853 + txiv[3] = wd->ap.txiv[vapId][0];
22854 + txiv[2] = wd->ap.txiv[vapId][1];
22855 + txiv[1] = wd->ap.txiv[vapId][2];
22856 + txiv[0] = wd->ap.txiv[vapId][3];
22857 +
22858 + zfMemoryCopy(gsn, (u8_t*)txiv, 16);
22859 +}
22860 +#endif //ZM_ENABLE_CENC
22861 +//CWYang(+)
22862 +void zfiWlanQuerySignalInfo(zdev_t* dev, u8_t *buffer)
22863 +{
22864 + zmw_get_wlan_dev(dev);
22865 +
22866 + /*Change Signal Strength/Quality Value to Human Sense Here*/
22867 +
22868 + buffer[0] = wd->SignalStrength;
22869 + buffer[1] = wd->SignalQuality;
22870 +}
22871 +
22872 +/* OS-XP */
22873 +u16_t zfiStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType)
22874 +{
22875 + return zfStaAddIeWpaRsn(dev, buf, offset, frameType);
22876 +}
22877 +
22878 +/* zfiDebugCmd */
22879 +/* cmd value-description */
22880 +/* 0 schedule timer */
22881 +/* 1 cancel timer */
22882 +/* 2 clear timer */
22883 +/* 3 test timer */
22884 +/* 4 */
22885 +/* 5 */
22886 +/* 6 checksum test 0/1 */
22887 +/* 7 enableProtectionMode */
22888 +/* 8 rx packet content dump 0/1 */
22889 +
22890 +u32_t zfiDebugCmd(zdev_t* dev, u32_t cmd, u32_t value)
22891 +{
22892 + u16_t event;
22893 + u32_t tick;
22894 + zmw_get_wlan_dev(dev);
22895 +
22896 + zmw_declare_for_critical_section();
22897 +
22898 +
22899 + zmw_enter_critical_section(dev);
22900 +
22901 + if ( cmd == 0 )
22902 + { /* schedule timer */
22903 + event = (u16_t) ((value >> 16) & 0xffff);
22904 + tick = value & 0xffff;
22905 + zfTimerSchedule(dev, event, tick);
22906 + }
22907 + else if ( cmd == 1 )
22908 + { /* cancel timer */
22909 + event = (u16_t) (value & 0xffff);
22910 + zfTimerCancel(dev, event);
22911 + }
22912 + else if ( cmd == 2 )
22913 + { /* clear timer */
22914 + zfTimerClear(dev);
22915 + }
22916 + else if ( cmd == 3 )
22917 + { /* test timer */
22918 + zfTimerSchedule(dev, 1, 500);
22919 + zfTimerSchedule(dev, 2, 1000);
22920 + zfTimerSchedule(dev, 3, 1000);
22921 + zfTimerSchedule(dev, 4, 1000);
22922 + zfTimerSchedule(dev, 5, 1500);
22923 + zfTimerSchedule(dev, 6, 2000);
22924 + zfTimerSchedule(dev, 7, 2200);
22925 + zfTimerSchedule(dev, 6, 2500);
22926 + zfTimerSchedule(dev, 8, 2800);
22927 + }
22928 + else if ( cmd == 4)
22929 + {
22930 + zfTimerSchedule(dev, 1, 500);
22931 + zfTimerSchedule(dev, 2, 1000);
22932 + zfTimerSchedule(dev, 3, 1000);
22933 + zfTimerSchedule(dev, 4, 1000);
22934 + zfTimerSchedule(dev, 5, 1500);
22935 + zfTimerSchedule(dev, 6, 2000);
22936 + zfTimerSchedule(dev, 7, 2200);
22937 + zfTimerSchedule(dev, 6, 2500);
22938 + zfTimerSchedule(dev, 8, 2800);
22939 + zfTimerCancel(dev, 1);
22940 + zfTimerCancel(dev, 3);
22941 + zfTimerCancel(dev, 6);
22942 + }
22943 + else if ( cmd == 5 )
22944 + {
22945 + wd->sta.keyId = (u8_t) value;
22946 + }
22947 + else if ( cmd == 6 )
22948 + {
22949 + /* 0: normal 1: always set TCP/UDP checksum zero */
22950 + wd->checksumTest = value;
22951 + }
22952 + else if ( cmd == 7 )
22953 + {
22954 + wd->enableProtectionMode = value;
22955 + zm_msg1_mm(ZM_LV_1, "wd->enableProtectionMode=", wd->enableProtectionMode);
22956 + }
22957 + else if ( cmd == 8 )
22958 + {
22959 + /* rx packet content dump */
22960 + if (value)
22961 + {
22962 + wd->rxPacketDump = 1;
22963 + }
22964 + else
22965 + {
22966 + wd->rxPacketDump = 0;
22967 + }
22968 + }
22969 +
22970 +
22971 + zmw_leave_critical_section(dev);
22972 +
22973 + return 0;
22974 +}
22975 +
22976 +#ifdef ZM_ENABLE_CENC
22977 +u8_t zfiWlanSetCencPairwiseKey(zdev_t* dev, u8_t keyid, u32_t *txiv, u32_t *rxiv,
22978 + u8_t *key, u8_t *mic)
22979 +{
22980 + struct zsKeyInfo keyInfo;
22981 + u8_t cencKey[32];
22982 + u8_t i;
22983 + u16_t macAddr[3];
22984 +
22985 + zmw_get_wlan_dev(dev);
22986 +
22987 + for (i = 0; i < 16; i++)
22988 + cencKey[i] = key[i];
22989 + for (i = 0; i < 16; i++)
22990 + cencKey[i + 16] = mic[i];
22991 + keyInfo.key = cencKey;
22992 + keyInfo.keyLength = 32;
22993 + keyInfo.keyIndex = keyid;
22994 + keyInfo.flag = ZM_KEY_FLAG_CENC | ZM_KEY_FLAG_PK;
22995 + for (i = 0; i < 3; i++)
22996 + macAddr[i] = wd->sta.bssid[i];
22997 + keyInfo.macAddr = macAddr;
22998 +
22999 + zfiWlanSetKey(dev, keyInfo);
23000 +
23001 + /* Reset txiv and rxiv */
23002 + //wd->sta.txiv[0] = txiv[0];
23003 + //wd->sta.txiv[1] = txiv[1];
23004 + //wd->sta.txiv[2] = txiv[2];
23005 + //wd->sta.txiv[3] = txiv[3];
23006 + //
23007 + //wd->sta.rxiv[0] = rxiv[0];
23008 + //wd->sta.rxiv[1] = rxiv[1];
23009 + //wd->sta.rxiv[2] = rxiv[2];
23010 + //wd->sta.rxiv[3] = rxiv[3];
23011 +
23012 + return 0;
23013 +}
23014 +
23015 +u8_t zfiWlanSetCencGroupKey(zdev_t* dev, u8_t keyid, u32_t *rxiv,
23016 + u8_t *key, u8_t *mic)
23017 +{
23018 + struct zsKeyInfo keyInfo;
23019 + u8_t cencKey[32];
23020 + u8_t i;
23021 + u16_t macAddr[6] = {0xffff, 0xffff, 0xffff};
23022 +
23023 + zmw_get_wlan_dev(dev);
23024 +
23025 + for (i = 0; i < 16; i++)
23026 + cencKey[i] = key[i];
23027 + for (i = 0; i < 16; i++)
23028 + cencKey[i + 16] = mic[i];
23029 + keyInfo.key = cencKey;
23030 + keyInfo.keyLength = 32;
23031 + keyInfo.keyIndex = keyid;
23032 + keyInfo.flag = ZM_KEY_FLAG_CENC | ZM_KEY_FLAG_GK;
23033 + keyInfo.vapId = 0;
23034 + for (i = 0; i < 3; i++)
23035 + keyInfo.vapAddr[i] = wd->macAddr[i];
23036 + keyInfo.macAddr = macAddr;
23037 +
23038 + zfiWlanSetKey(dev, keyInfo);
23039 +
23040 + /* Reset txiv and rxiv */
23041 + wd->sta.rxivGK[0] = ((rxiv[3] >> 24) & 0xFF)
23042 + + (((rxiv[3] >> 16) & 0xFF) << 8)
23043 + + (((rxiv[3] >> 8) & 0xFF) << 16)
23044 + + ((rxiv[3] & 0xFF) << 24);
23045 + wd->sta.rxivGK[1] = ((rxiv[2] >> 24) & 0xFF)
23046 + + (((rxiv[2] >> 16) & 0xFF) << 8)
23047 + + (((rxiv[2] >> 8) & 0xFF) << 16)
23048 + + ((rxiv[2] & 0xFF) << 24);
23049 + wd->sta.rxivGK[2] = ((rxiv[1] >> 24) & 0xFF)
23050 + + (((rxiv[1] >> 16) & 0xFF) << 8)
23051 + + (((rxiv[1] >> 8) & 0xFF) << 16)
23052 + + ((rxiv[1] & 0xFF) << 24);
23053 + wd->sta.rxivGK[3] = ((rxiv[0] >> 24) & 0xFF)
23054 + + (((rxiv[0] >> 16) & 0xFF) << 8)
23055 + + (((rxiv[0] >> 8) & 0xFF) << 16)
23056 + + ((rxiv[0] & 0xFF) << 24);
23057 +
23058 + wd->sta.authMode = ZM_AUTH_MODE_CENC;
23059 + wd->sta.currentAuthMode = ZM_AUTH_MODE_CENC;
23060 +
23061 + return 0;
23062 +}
23063 +#endif //ZM_ENABLE_CENC
23064 +
23065 +u8_t zfiWlanSetDot11DMode(zdev_t* dev, u8_t mode)
23066 +{
23067 + u8_t i;
23068 +
23069 + zmw_get_wlan_dev(dev);
23070 +
23071 + wd->sta.b802_11D = mode;
23072 + if (mode) //Enable 802.11d
23073 + {
23074 + wd->regulationTable.regionCode = NO_ENUMRD;
23075 + for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
23076 + wd->regulationTable.allowChannel[i].channelFlags |= ZM_REG_FLAG_CHANNEL_PASSIVE;
23077 + }
23078 + else //Disable
23079 + {
23080 + for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
23081 + wd->regulationTable.allowChannel[i].channelFlags &= ~ZM_REG_FLAG_CHANNEL_PASSIVE;
23082 + }
23083 +
23084 + return 0;
23085 +}
23086 +
23087 +u8_t zfiWlanSetDot11HDFSMode(zdev_t* dev, u8_t mode)
23088 +{
23089 + zmw_get_wlan_dev(dev);
23090 +
23091 + //zm_debug_msg0("CWY - Enable 802.11h DFS");
23092 +
23093 + // TODO : DFS Enable in 5250 to 5350 MHz and 5470 to 5725 MHz .
23094 + //if ( Adapter->ZD80211HSupport &&
23095 + // Adapter->CardSetting.NetworkTypeInUse == Ndis802_11OFDM5 &&
23096 + // ((ChannelNo >=52 && ChannelNo <= 64) || //5250~5350 MHZ
23097 + // (ChannelNo >=100 && ChannelNo <= 140))) //5470~5725 MHZ
23098 + //{
23099 + // Adapter->ZD80211HSetting.DFSEnable=TRUE;
23100 + //}
23101 + //else
23102 + //{
23103 + // Adapter->ZD80211HSetting.DFSEnable=FALSE;
23104 + //}
23105 +
23106 + wd->sta.DFSEnable = mode;
23107 + if (mode)
23108 + wd->sta.capability[1] |= ZM_BIT_0;
23109 + else
23110 + wd->sta.capability[1] &= (~ZM_BIT_0);
23111 +
23112 + return 0;
23113 +}
23114 +
23115 +u8_t zfiWlanSetDot11HTPCMode(zdev_t* dev, u8_t mode)
23116 +{
23117 + zmw_get_wlan_dev(dev);
23118 +
23119 + // TODO : TPC Enable in 5150~5350 MHz and 5470~5725MHz.
23120 + //if ( Adapter->ZD80211HSupport &&
23121 + // Adapter->CardSetting.NetworkTypeInUse == Ndis802_11OFDM5 &&
23122 + // ((ChannelNo == 36 || ChannelNo == 40 || ChannelNo == 44 || ChannelNo == 48) || //5150~5250 MHZ , Not Japan
23123 + // (ChannelNo >=52 && ChannelNo <= 64) || //5250~5350 MHZ
23124 + // (ChannelNo >=100 && ChannelNo <= 140))) //5470~5725 MHZ
23125 + //{
23126 + // Adapter->ZD80211HSetting.TPCEnable=TRUE;
23127 + //}
23128 + //else
23129 + //{
23130 + // Adapter->ZD80211HSetting.TPCEnable=FALSE;
23131 + //}
23132 +
23133 + wd->sta.TPCEnable = mode;
23134 + if (mode)
23135 + wd->sta.capability[1] |= ZM_BIT_0;
23136 + else
23137 + wd->sta.capability[1] &= (~ZM_BIT_0);
23138 +
23139 + return 0;
23140 +}
23141 +
23142 +u8_t zfiWlanSetAniMode(zdev_t* dev, u8_t mode)
23143 +{
23144 + zmw_get_wlan_dev(dev);
23145 +
23146 + wd->aniEnable = mode;
23147 + if (mode)
23148 + zfHpAniAttach(dev);
23149 +
23150 + return 0;
23151 +}
23152 +
23153 +#ifdef ZM_OS_LINUX_FUNC
23154 +void zfiWlanShowTally(zdev_t* dev)
23155 +{
23156 + zmw_get_wlan_dev(dev);
23157 +
23158 + zm_msg1_mm(ZM_LV_0, "Hw_UnderrunCnt = ", wd->commTally.Hw_UnderrunCnt);
23159 + zm_msg1_mm(ZM_LV_0, "Hw_TotalRxFrm = ", wd->commTally.Hw_TotalRxFrm);
23160 + zm_msg1_mm(ZM_LV_0, "Hw_CRC32Cnt = ", wd->commTally.Hw_CRC32Cnt);
23161 + zm_msg1_mm(ZM_LV_0, "Hw_CRC16Cnt = ", wd->commTally.Hw_CRC16Cnt);
23162 + zm_msg1_mm(ZM_LV_1, "Hw_DecrypErr_UNI = ", wd->commTally.Hw_DecrypErr_UNI);
23163 + zm_msg1_mm(ZM_LV_0, "Hw_RxFIFOOverrun = ", wd->commTally.Hw_RxFIFOOverrun);
23164 + zm_msg1_mm(ZM_LV_1, "Hw_DecrypErr_Mul = ", wd->commTally.Hw_DecrypErr_Mul);
23165 + zm_msg1_mm(ZM_LV_1, "Hw_RetryCnt = ", wd->commTally.Hw_RetryCnt);
23166 + zm_msg1_mm(ZM_LV_0, "Hw_TotalTxFrm = ", wd->commTally.Hw_TotalTxFrm);
23167 + zm_msg1_mm(ZM_LV_0, "Hw_RxTimeOut = ", wd->commTally.Hw_RxTimeOut);
23168 + zm_msg1_mm(ZM_LV_0, "Tx_MPDU = ", wd->commTally.Tx_MPDU);
23169 + zm_msg1_mm(ZM_LV_0, "BA_Fail = ", wd->commTally.BA_Fail);
23170 + zm_msg1_mm(ZM_LV_0, "Hw_Tx_AMPDU = ", wd->commTally.Hw_Tx_AMPDU);
23171 + zm_msg1_mm(ZM_LV_0, "Hw_Tx_MPDU = ", wd->commTally.Hw_Tx_MPDU);
23172 +
23173 + zm_msg1_mm(ZM_LV_1, "Hw_RxMPDU = ", wd->commTally.Hw_RxMPDU);
23174 + zm_msg1_mm(ZM_LV_1, "Hw_RxDropMPDU = ", wd->commTally.Hw_RxDropMPDU);
23175 + zm_msg1_mm(ZM_LV_1, "Hw_RxDelMPDU = ", wd->commTally.Hw_RxDelMPDU);
23176 + zm_msg1_mm(ZM_LV_1, "Hw_RxPhyMiscError = ", wd->commTally.Hw_RxPhyMiscError);
23177 + zm_msg1_mm(ZM_LV_1, "Hw_RxPhyXRError = ", wd->commTally.Hw_RxPhyXRError);
23178 + zm_msg1_mm(ZM_LV_1, "Hw_RxPhyOFDMError = ", wd->commTally.Hw_RxPhyOFDMError);
23179 + zm_msg1_mm(ZM_LV_1, "Hw_RxPhyCCKError = ", wd->commTally.Hw_RxPhyCCKError);
23180 + zm_msg1_mm(ZM_LV_1, "Hw_RxPhyHTError = ", wd->commTally.Hw_RxPhyHTError);
23181 + zm_msg1_mm(ZM_LV_1, "Hw_RxPhyTotalCount = ", wd->commTally.Hw_RxPhyTotalCount);
23182 +
23183 + if (!((wd->commTally.Tx_MPDU == 0) && (wd->commTally.BA_Fail == 0)))
23184 + {
23185 + zm_debug_msg_p("BA Fail Ratio(%) = ", wd->commTally.BA_Fail * 100,
23186 + (wd->commTally.BA_Fail + wd->commTally.Tx_MPDU));
23187 + }
23188 +
23189 + if (!((wd->commTally.Hw_Tx_MPDU == 0) && (wd->commTally.Hw_Tx_AMPDU == 0)))
23190 + {
23191 + zm_debug_msg_p("Avg Agg Number = ",
23192 + wd->commTally.Hw_Tx_MPDU, wd->commTally.Hw_Tx_AMPDU);
23193 + }
23194 +}
23195 +#endif
23196 +
23197 +void zfiWlanSetMaxTxPower(zdev_t* dev, u8_t power2, u8_t power5)
23198 +{
23199 + zmw_get_wlan_dev(dev);
23200 +
23201 + zmw_declare_for_critical_section();
23202 +
23203 + zmw_enter_critical_section(dev);
23204 + wd->maxTxPower2 = power2;
23205 + wd->maxTxPower5 = power5;
23206 + zmw_leave_critical_section(dev);
23207 +}
23208 +
23209 +void zfiWlanQueryMaxTxPower(zdev_t* dev, u8_t *power2, u8_t *power5)
23210 +{
23211 + zmw_get_wlan_dev(dev);
23212 +
23213 + *power2 = wd->maxTxPower2;
23214 + *power5 = wd->maxTxPower5;
23215 +}
23216 +
23217 +void zfiWlanSetConnectMode(zdev_t* dev, u8_t mode)
23218 +{
23219 + zmw_get_wlan_dev(dev);
23220 +
23221 + zmw_declare_for_critical_section();
23222 +
23223 + zmw_enter_critical_section(dev);
23224 + wd->connectMode = mode;
23225 + zmw_leave_critical_section(dev);
23226 +}
23227 +
23228 +void zfiWlanSetSupportMode(zdev_t* dev, u32_t mode)
23229 +{
23230 + zmw_get_wlan_dev(dev);
23231 +
23232 + zmw_declare_for_critical_section();
23233 +
23234 + zmw_enter_critical_section(dev);
23235 + wd->supportMode = mode;
23236 + zmw_leave_critical_section(dev);
23237 +}
23238 +
23239 +void zfiWlanSetAdhocMode(zdev_t* dev, u32_t mode)
23240 +{
23241 + zmw_get_wlan_dev(dev);
23242 +
23243 + wd->ws.adhocMode = mode;
23244 +}
23245 +
23246 +u32_t zfiWlanQueryAdhocMode(zdev_t* dev, u8_t bWrapper)
23247 +{
23248 + u32_t adhocMode;
23249 +
23250 + zmw_get_wlan_dev(dev);
23251 +
23252 + if ( bWrapper )
23253 + {
23254 + adhocMode = wd->ws.adhocMode;
23255 + }
23256 + else
23257 + {
23258 + adhocMode = wd->wfc.bIbssGMode;
23259 + }
23260 +
23261 + return adhocMode;
23262 +}
23263 +
23264 +
23265 +u8_t zfiWlanSetCountryIsoName(zdev_t* dev, u8_t *countryIsoName, u8_t length)
23266 +{
23267 + u8_t buf[5];
23268 + zmw_get_wlan_dev(dev);
23269 +
23270 + if (length == 4)
23271 + {
23272 + buf[2] = wd->ws.countryIsoName[0] = countryIsoName[2];
23273 + buf[3] = wd->ws.countryIsoName[1] = countryIsoName[1];
23274 + buf[4] = wd->ws.countryIsoName[2] = countryIsoName[0];
23275 + }
23276 + else if (length == 3)
23277 + {
23278 + buf[2] = wd->ws.countryIsoName[0] = countryIsoName[1];
23279 + buf[3] = wd->ws.countryIsoName[1] = countryIsoName[0];
23280 + buf[4] = wd->ws.countryIsoName[2] = '\0';
23281 + }
23282 + else
23283 + {
23284 + return 1;
23285 + }
23286 +
23287 + return zfHpGetRegulationTablefromISO(dev, buf, length);
23288 +}
23289 +
23290 +
23291 +const char* zfiWlanQueryCountryIsoName(zdev_t* dev)
23292 +{
23293 + zmw_get_wlan_dev(dev);
23294 +
23295 + return wd->ws.countryIsoName;
23296 +}
23297 +
23298 +
23299 +
23300 +void zfiWlanSetRegulatory(zdev_t* dev, u8_t CCS, u16_t Code, u8_t bfirstChannel)
23301 +{
23302 + zmw_get_wlan_dev(dev);
23303 +
23304 + zmw_declare_for_critical_section();
23305 +
23306 + if (CCS)
23307 + {
23308 + /* Reset Regulation Table by Country Code */
23309 + zfHpGetRegulationTablefromCountry(dev, Code);
23310 + }
23311 + else
23312 + {
23313 + /* Reset Regulation Table by Region Code */
23314 + zfHpGetRegulationTablefromRegionCode(dev, Code);
23315 + }
23316 +
23317 + if (bfirstChannel) {
23318 + zmw_enter_critical_section(dev);
23319 + wd->frequency = zfChGetFirstChannel(dev, NULL);
23320 + zmw_leave_critical_section(dev);
23321 + zfCoreSetFrequency(dev, wd->frequency);
23322 + }
23323 +}
23324 +
23325 +
23326 +const char* zfiHpGetisoNamefromregionCode(zdev_t* dev, u16_t regionCode)
23327 +{
23328 + return zfHpGetisoNamefromregionCode(dev, regionCode);
23329 +}
23330 +
23331 +u16_t zfiWlanChannelToFrequency(zdev_t* dev, u8_t channel)
23332 +{
23333 + return zfChNumToFreq(dev, channel, 0);
23334 +}
23335 +
23336 +u8_t zfiWlanFrequencyToChannel(zdev_t* dev, u16_t freq)
23337 +{
23338 + u8_t is5GBand = 0;
23339 +
23340 + return zfChFreqToNum(freq, &is5GBand);
23341 +}
23342 +
23343 +void zfiWlanDisableDfsChannel(zdev_t* dev, u8_t disableFlag)
23344 +{
23345 + zfHpDisableDfsChannel(dev, disableFlag);
23346 + return;
23347 +}
23348 +
23349 +void zfiWlanSetLEDCtrlParam(zdev_t* dev, u8_t type, u8_t flag)
23350 +{
23351 + zmw_get_wlan_dev(dev);
23352 +
23353 + zmw_declare_for_critical_section();
23354 +
23355 + zmw_enter_critical_section(dev);
23356 + wd->ledStruct.LEDCtrlType = type;
23357 + wd->ledStruct.LEDCtrlFlagFromReg = flag;
23358 + zmw_leave_critical_section(dev);
23359 +}
23360 +
23361 +void zfiWlanEnableLeapConfig(zdev_t* dev, u8_t leapEnabled)
23362 +{
23363 + zmw_get_wlan_dev(dev);
23364 +
23365 + wd->sta.leapEnabled = leapEnabled;
23366 +}
23367 +
23368 +u32_t zfiWlanQueryHwCapability(zdev_t* dev)
23369 +{
23370 + return zfHpCapability(dev);
23371 +}
23372 +
23373 +u32_t zfiWlanQueryReceivedPacket(zdev_t* dev)
23374 +{
23375 + zmw_get_wlan_dev(dev);
23376 +
23377 + return wd->sta.ReceivedPktRatePerSecond;
23378 +}
23379 +
23380 +void zfiWlanCheckSWEncryption(zdev_t* dev)
23381 +{
23382 + zmw_get_wlan_dev(dev);
23383 +
23384 + if (wd->sta.SWEncryptEnable != 0)
23385 + {
23386 + zfHpSWDecrypt(dev, 1);
23387 + }
23388 +}
23389 +
23390 +u16_t zfiWlanQueryAllowChannels(zdev_t* dev, u16_t *channels)
23391 +{
23392 + u16_t ii;
23393 + zmw_get_wlan_dev(dev);
23394 +
23395 + for (ii = 0; ii < wd->regulationTable.allowChannelCnt; ii++)
23396 + {
23397 + channels[ii] = wd->regulationTable.allowChannel[ii].channel;
23398 + }
23399 +
23400 + return wd->regulationTable.allowChannelCnt;
23401 +}
23402 +
23403 +void zfiWlanSetDynamicSIFSParam(zdev_t* dev, u8_t val)
23404 +{
23405 + zmw_get_wlan_dev(dev);
23406 +
23407 + wd->dynamicSIFSEnable = val;
23408 +
23409 + zm_debug_msg1("wd->dynamicSIFSEnable = ", wd->dynamicSIFSEnable)
23410 +}
23411 +
23412 +u16_t zfiWlanGetMulticastAddressCount(zdev_t* dev)
23413 +{
23414 + zmw_get_wlan_dev(dev);
23415 +
23416 + return wd->sta.multicastList.size;
23417 +}
23418 +
23419 +void zfiWlanGetMulticastList(zdev_t* dev, u8_t* pMCList)
23420 +{
23421 + struct zsMulticastAddr* pMacList = (struct zsMulticastAddr*) pMCList;
23422 + u8_t i;
23423 +
23424 + zmw_get_wlan_dev(dev);
23425 +
23426 + for ( i=0; i<wd->sta.multicastList.size; i++ )
23427 + {
23428 + zfMemoryCopy(pMacList[i].addr, wd->sta.multicastList.macAddr[i].addr, 6);
23429 + }
23430 +}
23431 +
23432 +void zfiWlanSetPacketFilter(zdev_t* dev, u32_t PacketFilter)
23433 +{
23434 + u8_t bAllMulticast = 0;
23435 + u32_t oldFilter;
23436 +
23437 + zmw_get_wlan_dev(dev);
23438 +
23439 + oldFilter = wd->sta.osRxFilter;
23440 +
23441 + wd->sta.osRxFilter = PacketFilter;
23442 +
23443 + if ((oldFilter & ZM_PACKET_TYPE_ALL_MULTICAST) !=
23444 + (wd->sta.osRxFilter & ZM_PACKET_TYPE_ALL_MULTICAST))
23445 + {
23446 + if ( wd->sta.osRxFilter & ZM_PACKET_TYPE_ALL_MULTICAST )
23447 + bAllMulticast = 1;
23448 + zfHpSetMulticastList(dev, wd->sta.multicastList.size,
23449 + (u8_t*)wd->sta.multicastList.macAddr, bAllMulticast);
23450 + }
23451 +}
23452 +
23453 +u8_t zfiCompareWithMulticastListAddress(zdev_t* dev, u16_t* dstMacAddr)
23454 +{
23455 + u8_t i;
23456 + u8_t bIsInMCListAddr = 0;
23457 +
23458 + zmw_get_wlan_dev(dev);
23459 +
23460 + for ( i=0; i<wd->sta.multicastList.size; i++ )
23461 + {
23462 + if ( zfwMemoryIsEqual((u8_t*)dstMacAddr, (u8_t*)wd->sta.multicastList.macAddr[i].addr, 6) )
23463 + {
23464 + bIsInMCListAddr = 1;
23465 + break;
23466 + }
23467 + }
23468 +
23469 + return bIsInMCListAddr;
23470 +}
23471 +
23472 +void zfiWlanSetSafeModeEnabled(zdev_t* dev, u8_t safeMode)
23473 +{
23474 + zmw_get_wlan_dev(dev);
23475 +
23476 + wd->sta.bSafeMode = safeMode;
23477 +
23478 + if ( safeMode )
23479 + zfStaEnableSWEncryption(dev, 1);
23480 + else
23481 + zfStaDisableSWEncryption(dev);
23482 +}
23483 +
23484 +void zfiWlanSetIBSSAdditionalIELength(zdev_t* dev, u32_t ibssAdditionalIESize, u8_t* ibssAdditionalIE)
23485 +{
23486 + zmw_get_wlan_dev(dev);
23487 +
23488 + if ( ibssAdditionalIESize )
23489 + {
23490 + wd->sta.ibssAdditionalIESize = ibssAdditionalIESize;
23491 + zfMemoryCopy(wd->sta.ibssAdditionalIE, ibssAdditionalIE, (u16_t)ibssAdditionalIESize);
23492 + }
23493 + else
23494 + wd->sta.ibssAdditionalIESize = 0;
23495 +}
23496 --- /dev/null
23497 +++ b/drivers/staging/otus/80211core/cprecomp.h
23498 @@ -0,0 +1,32 @@
23499 +/*
23500 + * Copyright (c) 2007-2008 Atheros Communications Inc.
23501 + *
23502 + * Permission to use, copy, modify, and/or distribute this software for any
23503 + * purpose with or without fee is hereby granted, provided that the above
23504 + * copyright notice and this permission notice appear in all copies.
23505 + *
23506 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
23507 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
23508 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
23509 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
23510 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
23511 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
23512 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23513 + */
23514 +
23515 +#ifndef _CPRECOMP_H
23516 +#define _CPRECOMP_H
23517 +
23518 +#include "../oal_dt.h"
23519 +#include "../oal_marc.h"
23520 +#include "pub_zfi.h"
23521 +#include "pub_zfw.h"
23522 +#include "pub_usb.h"
23523 +#include "wlan.h"
23524 +#include "struct.h"
23525 +#include "cfunc.h"
23526 +#include "cagg.h"
23527 +#include "cwm.h"
23528 +#include "performance.h"
23529 +#endif
23530 +
23531 --- /dev/null
23532 +++ b/drivers/staging/otus/80211core/cpsmgr.c
23533 @@ -0,0 +1,731 @@
23534 +/*
23535 + * Copyright (c) 2007-2008 Atheros Communications Inc.
23536 + *
23537 + * Permission to use, copy, modify, and/or distribute this software for any
23538 + * purpose with or without fee is hereby granted, provided that the above
23539 + * copyright notice and this permission notice appear in all copies.
23540 + *
23541 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
23542 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
23543 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
23544 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
23545 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
23546 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
23547 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23548 + */
23549 +
23550 +/**
23551 + * The power saving manager is to save the power as much as possible.
23552 + * Generally speaking, it controls:
23553 + *
23554 + * - when to sleep
23555 + * -
23556 + *
23557 + */
23558 +#include "cprecomp.h"
23559 +
23560 +void zfPowerSavingMgrInit(zdev_t* dev)
23561 +{
23562 + zmw_get_wlan_dev(dev);
23563 +
23564 + wd->sta.powerSaveMode = ZM_STA_PS_NONE;
23565 + wd->sta.psMgr.state = ZM_PS_MSG_STATE_ACTIVE;
23566 + wd->sta.psMgr.isSleepAllowed = 0;
23567 + wd->sta.psMgr.maxSleepPeriods = 1;
23568 + wd->sta.psMgr.ticks = 0;
23569 + wd->sta.psMgr.sleepAllowedtick = 0;
23570 +}
23571 +
23572 +static u16_t zfPowerSavingMgrHandlePsNone(zdev_t* dev, u8_t *isWakeUpRequired)
23573 +{
23574 + u16_t ret = 0;
23575 + zmw_get_wlan_dev(dev);
23576 +
23577 + switch(wd->sta.psMgr.state)
23578 + {
23579 + case ZM_PS_MSG_STATE_ACTIVE:
23580 + *isWakeUpRequired = 0;
23581 + break;
23582 +
23583 + case ZM_PS_MSG_STATE_T1:
23584 + case ZM_PS_MSG_STATE_T2:
23585 + case ZM_PS_MSG_STATE_SLEEP:
23586 + default:
23587 + *isWakeUpRequired = 1;
23588 +zm_debug_msg0("zfPowerSavingMgrHandlePsNone: Wake up now\n");
23589 + if ( zfStaIsConnected(dev) )
23590 + {
23591 + zm_debug_msg0("zfPowerSavingMgrOnHandleT1 send Null data\n");
23592 + //zfSendNullData(dev, 0);
23593 + ret = 1;
23594 + }
23595 +
23596 + wd->sta.psMgr.state = ZM_PS_MSG_STATE_ACTIVE;
23597 + break;
23598 + }
23599 + return ret;
23600 +}
23601 +
23602 +static void zfPowerSavingMgrHandlePs(zdev_t* dev)
23603 +{
23604 + zmw_get_wlan_dev(dev);
23605 +
23606 + switch(wd->sta.psMgr.state)
23607 + {
23608 + case ZM_PS_MSG_STATE_ACTIVE:
23609 + //zm_debug_msg0("zfPowerSavingMgrHandlePs: Prepare to sleep...\n");
23610 + //wd->sta.psMgr.state = ZM_PS_MSG_STATE_T1;
23611 + break;
23612 +
23613 + case ZM_PS_MSG_STATE_T1:
23614 + case ZM_PS_MSG_STATE_T2:
23615 + case ZM_PS_MSG_STATE_SLEEP:
23616 + default:
23617 + break;
23618 + }
23619 +}
23620 +
23621 +void zfPowerSavingMgrSetMode(zdev_t* dev, u8_t mode)
23622 +{
23623 + u16_t sendNull = 0;
23624 + u8_t isWakeUpRequired = 0;
23625 +
23626 + zmw_get_wlan_dev(dev);
23627 + zmw_declare_for_critical_section();
23628 +
23629 + zm_debug_msg1("mode = ", mode);
23630 +
23631 + if (mode > ZM_STA_PS_LIGHT)
23632 + {
23633 + zm_debug_msg0("return - wrong power save mode");
23634 + return;
23635 + }
23636 +
23637 + zmw_enter_critical_section(dev);
23638 +
23639 + #if 1
23640 + switch(mode)
23641 + {
23642 + case ZM_STA_PS_NONE:
23643 + sendNull = zfPowerSavingMgrHandlePsNone(dev, &isWakeUpRequired);
23644 + break;
23645 +
23646 + case ZM_STA_PS_FAST:
23647 + case ZM_STA_PS_LIGHT:
23648 + wd->sta.psMgr.maxSleepPeriods = 1;
23649 + zfPowerSavingMgrHandlePs(dev);
23650 + break;
23651 +
23652 + case ZM_STA_PS_MAX:
23653 + wd->sta.psMgr.maxSleepPeriods = ZM_PS_MAX_SLEEP_PERIODS;
23654 + zfPowerSavingMgrHandlePs(dev);
23655 + break;
23656 + }
23657 + #else
23658 + switch(wd->sta.psMgr.state)
23659 + {
23660 + case ZM_PS_MSG_STATE_ACTIVE:
23661 + if ( mode != ZM_STA_PS_NONE )
23662 + {
23663 +zm_debug_msg0("zfPowerSavingMgrSetMode: switch from ZM_PS_MSG_STATE_ACTIVE to ZM_PS_MSG_STATE_T1\n");
23664 + // Stall the TX & start to wait the pending TX to be completed
23665 + wd->sta.psMgr.state = ZM_PS_MSG_STATE_T1;
23666 + }
23667 + break;
23668 +
23669 + case ZM_PS_MSG_STATE_SLEEP:
23670 + break;
23671 + }
23672 + #endif
23673 +
23674 + wd->sta.powerSaveMode = mode;
23675 + zmw_leave_critical_section(dev);
23676 +
23677 + if ( isWakeUpRequired )
23678 + {
23679 + zfHpPowerSaveSetState(dev, 0);
23680 + wd->sta.psMgr.tempWakeUp = 0;
23681 + }
23682 +
23683 + if ( zfStaIsConnected(dev)
23684 + && (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) )
23685 + {
23686 + switch(mode)
23687 + {
23688 + case ZM_STA_PS_NONE:
23689 + zfHpPowerSaveSetMode(dev, 0, 0, wd->beaconInterval);
23690 + break;
23691 +
23692 + case ZM_STA_PS_FAST:
23693 + case ZM_STA_PS_MAX:
23694 + case ZM_STA_PS_LIGHT:
23695 + zfHpPowerSaveSetMode(dev, 0, 1, wd->beaconInterval);
23696 + break;
23697 +
23698 + default:
23699 + zfHpPowerSaveSetMode(dev, 0, 0, wd->beaconInterval);
23700 + break;
23701 + }
23702 + }
23703 +
23704 + if (sendNull == 1)
23705 + {
23706 + zfSendNullData(dev, 0);
23707 + }
23708 +
23709 + return;
23710 +}
23711 +
23712 +static void zfPowerSavingMgrNotifyPSToAP(zdev_t *dev)
23713 +{
23714 + zmw_get_wlan_dev(dev);
23715 + zmw_declare_for_critical_section();
23716 +
23717 + if ( (wd->sta.psMgr.tempWakeUp != 1)&&
23718 + (wd->sta.psMgr.lastTxUnicastFrm != wd->commTally.txUnicastFrm ||
23719 + wd->sta.psMgr.lastTxBroadcastFrm != wd->commTally.txBroadcastFrm ||
23720 + wd->sta.psMgr.lastTxMulticastFrm != wd->commTally.txMulticastFrm) )
23721 + {
23722 + zmw_enter_critical_section(dev);
23723 + wd->sta.psMgr.lastTxUnicastFrm = wd->commTally.txUnicastFrm;
23724 + wd->sta.psMgr.lastTxBroadcastFrm = wd->commTally.txBroadcastFrm;
23725 + wd->sta.psMgr.lastTxMulticastFrm = wd->commTally.txMulticastFrm;
23726 + zmw_leave_critical_section(dev);
23727 +
23728 + zfSendNullData(dev, 1);
23729 + }
23730 +}
23731 +
23732 +static void zfPowerSavingMgrOnHandleT1(zdev_t* dev)
23733 +{
23734 + zmw_get_wlan_dev(dev);
23735 + zmw_declare_for_critical_section();
23736 +
23737 + // If the tx Q is not empty...return
23738 + if ( zfIsVtxqEmpty(dev) == FALSE )
23739 + {
23740 + return;
23741 + }
23742 +
23743 +zm_debug_msg0("VtxQ is empty now...Check if HAL TXQ is empty\n");
23744 +
23745 + // The the HAL TX Q is not empty...return
23746 + if ( zfHpGetFreeTxdCount(dev) != zfHpGetMaxTxdCount(dev) )
23747 + {
23748 + return;
23749 + }
23750 +
23751 +zm_debug_msg0("HAL TXQ is empty now...Could go to sleep...\n");
23752 +
23753 + zmw_enter_critical_section(dev);
23754 +
23755 + if (wd->sta.powerSaveMode == ZM_STA_PS_LIGHT)
23756 + {
23757 + if (wd->sta.ReceivedPktRatePerSecond > 200)
23758 + {
23759 + zmw_leave_critical_section(dev);
23760 + return;
23761 + }
23762 +
23763 + if ( zfStaIsConnected(dev)
23764 + && (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) )
23765 + {
23766 + if (wd->sta.psMgr.sleepAllowedtick) {
23767 + wd->sta.psMgr.sleepAllowedtick--;
23768 + zmw_leave_critical_section(dev);
23769 + return;
23770 + }
23771 + }
23772 + }
23773 +
23774 + wd->sta.psMgr.state = ZM_PS_MSG_STATE_T2;
23775 +
23776 + zmw_leave_critical_section(dev);
23777 +
23778 + // Send the Null pkt to AP to notify that I'm going to sleep
23779 + if ( zfStaIsConnected(dev) )
23780 + {
23781 +zm_debug_msg0("zfPowerSavingMgrOnHandleT1 send Null data\n");
23782 + zfPowerSavingMgrNotifyPSToAP(dev);
23783 + }
23784 +
23785 + // Stall the TX now
23786 + // zfTxEngineStop(dev);
23787 +}
23788 +
23789 +static void zfPowerSavingMgrOnHandleT2(zdev_t* dev)
23790 +{
23791 + zmw_get_wlan_dev(dev);
23792 + zmw_declare_for_critical_section();
23793 +
23794 + // Wait until the Null pkt is transmitted
23795 + if ( zfHpGetFreeTxdCount(dev) != zfHpGetMaxTxdCount(dev) )
23796 + {
23797 + return;
23798 + }
23799 +
23800 + zmw_enter_critical_section(dev);
23801 + wd->sta.psMgr.state = ZM_PS_MSG_STATE_SLEEP;
23802 + wd->sta.psMgr.lastTxUnicastFrm = wd->commTally.txUnicastFrm;
23803 + wd->sta.psMgr.lastTxBroadcastFrm = wd->commTally.txBroadcastFrm;
23804 + wd->sta.psMgr.lastTxMulticastFrm = wd->commTally.txMulticastFrm;
23805 + zmw_leave_critical_section(dev);
23806 +
23807 + // Let CHIP sleep now
23808 +zm_debug_msg0("zfPowerSavingMgrOnHandleT2 zzzz....\n");
23809 + zfHpPowerSaveSetState(dev, 1);
23810 + wd->sta.psMgr.tempWakeUp = 0;
23811 +}
23812 +
23813 +u8_t zfPowerSavingMgrIsSleeping(zdev_t *dev)
23814 +{
23815 + u8_t isSleeping = FALSE;
23816 + zmw_get_wlan_dev(dev);
23817 + zmw_declare_for_critical_section();
23818 +
23819 + zmw_enter_critical_section(dev);
23820 + if ( wd->sta.psMgr.state == ZM_PS_MSG_STATE_SLEEP ||
23821 + wd->sta.psMgr.state == ZM_PS_MSG_STATE_T2)
23822 + {
23823 + isSleeping = TRUE;
23824 + }
23825 + zmw_leave_critical_section(dev);
23826 + return isSleeping;
23827 +}
23828 +
23829 +static u8_t zfPowerSavingMgrIsIdle(zdev_t *dev)
23830 +{
23831 + u8_t isIdle = 0;
23832 +
23833 + zmw_get_wlan_dev(dev);
23834 + zmw_declare_for_critical_section();
23835 +
23836 + zmw_enter_critical_section(dev);
23837 +
23838 + if ( zfStaIsConnected(dev) && wd->sta.psMgr.isSleepAllowed == 0 )
23839 + {
23840 + goto done;
23841 + }
23842 +
23843 + if ( wd->sta.bChannelScan )
23844 + {
23845 + goto done;
23846 + }
23847 +
23848 + if ( zfStaIsConnecting(dev) )
23849 + {
23850 + goto done;
23851 + }
23852 +
23853 + if (wd->sta.powerSaveMode == ZM_STA_PS_LIGHT)
23854 + {
23855 + if (wd->sta.ReceivedPktRatePerSecond > 200)
23856 + {
23857 + goto done;
23858 + }
23859 +
23860 + if ( zfStaIsConnected(dev)
23861 + && (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) )
23862 + {
23863 + if (wd->sta.psMgr.sleepAllowedtick) {
23864 + wd->sta.psMgr.sleepAllowedtick--;
23865 + goto done;
23866 + }
23867 + }
23868 + }
23869 +
23870 + isIdle = 1;
23871 +
23872 +done:
23873 + zmw_leave_critical_section(dev);
23874 +
23875 + if ( zfIsVtxqEmpty(dev) == FALSE )
23876 + {
23877 + isIdle = 0;
23878 + }
23879 +
23880 + return isIdle;
23881 +}
23882 +
23883 +static void zfPowerSavingMgrSleepIfIdle(zdev_t *dev)
23884 +{
23885 + u8_t isIdle;
23886 +
23887 + zmw_get_wlan_dev(dev);
23888 + zmw_declare_for_critical_section();
23889 +
23890 + isIdle = zfPowerSavingMgrIsIdle(dev);
23891 +
23892 + if ( isIdle == 0 )
23893 + {
23894 + return;
23895 + }
23896 +
23897 + zmw_enter_critical_section(dev);
23898 +
23899 + switch(wd->sta.powerSaveMode)
23900 + {
23901 + case ZM_STA_PS_NONE:
23902 + break;
23903 +
23904 + case ZM_STA_PS_MAX:
23905 + case ZM_STA_PS_FAST:
23906 + case ZM_STA_PS_LIGHT:
23907 + zm_debug_msg0("zfPowerSavingMgrSleepIfIdle: IDLE so slep now...\n");
23908 + wd->sta.psMgr.state = ZM_PS_MSG_STATE_T1;
23909 + break;
23910 + }
23911 +
23912 + zmw_leave_critical_section(dev);
23913 +}
23914 +
23915 +static void zfPowerSavingMgrDisconnectMain(zdev_t* dev)
23916 +{
23917 + zmw_get_wlan_dev(dev);
23918 +
23919 +#ifdef ZM_ENABLE_DISCONNECT_PS
23920 + switch(wd->sta.psMgr.state)
23921 + {
23922 + case ZM_PS_MSG_STATE_ACTIVE:
23923 + zfPowerSavingMgrSleepIfIdle(dev);
23924 + break;
23925 +
23926 + case ZM_PS_MSG_STATE_SLEEP:
23927 + break;
23928 +
23929 + case ZM_PS_MSG_STATE_T1:
23930 + zfPowerSavingMgrOnHandleT1(dev);
23931 + break;
23932 +
23933 + case ZM_PS_MSG_STATE_T2:
23934 + zfPowerSavingMgrOnHandleT2(dev);
23935 + break;
23936 + }
23937 +#else
23938 + zfPowerSavingMgrWakeup(dev);
23939 +#endif
23940 +}
23941 +
23942 +static void zfPowerSavingMgrInfraMain(zdev_t* dev)
23943 +{
23944 + zmw_get_wlan_dev(dev);
23945 +
23946 + switch(wd->sta.psMgr.state)
23947 + {
23948 + case ZM_PS_MSG_STATE_ACTIVE:
23949 + zfPowerSavingMgrSleepIfIdle(dev);
23950 + break;
23951 +
23952 + case ZM_PS_MSG_STATE_SLEEP:
23953 + break;
23954 +
23955 + case ZM_PS_MSG_STATE_T1:
23956 + zfPowerSavingMgrOnHandleT1(dev);
23957 + break;
23958 +
23959 + case ZM_PS_MSG_STATE_T2:
23960 + zfPowerSavingMgrOnHandleT2(dev);
23961 + break;
23962 + }
23963 +}
23964 +
23965 +void zfPowerSavingMgrAtimWinExpired(zdev_t* dev)
23966 +{
23967 + zmw_get_wlan_dev(dev);
23968 +
23969 +//printk("zfPowerSavingMgrAtimWinExpired #1\n");
23970 + if ( wd->sta.powerSaveMode == ZM_STA_PS_NONE )
23971 + {
23972 + return;
23973 + }
23974 +
23975 +//printk("zfPowerSavingMgrAtimWinExpired #2\n");
23976 + // if we received any ATIM window from the others to indicate we have buffered data
23977 + // at the other station, we can't go to sleep
23978 + if ( wd->sta.recvAtim )
23979 + {
23980 + wd->sta.recvAtim = 0;
23981 + zm_debug_msg0("Can't sleep due to receving ATIM window!");
23982 + return;
23983 + }
23984 +
23985 + // if we are the one to tx beacon during last beacon interval. we can't go to sleep
23986 + // since we need to be alive to respond the probe request!
23987 + if ( wd->sta.txBeaconInd )
23988 + {
23989 + zm_debug_msg0("Can't sleep due to just transmit a beacon!");
23990 + return;
23991 + }
23992 +
23993 + // If we buffer any data for the other stations. we could not go to sleep
23994 + if ( wd->sta.ibssPrevPSDataCount != 0 )
23995 + {
23996 + zm_debug_msg0("Can't sleep due to buffering data for the others!");
23997 + return;
23998 + }
23999 +
24000 + // before sleeping, we still need to notify the others by transmitting null
24001 + // pkt with power mgmt bit turned on.
24002 + zfPowerSavingMgrOnHandleT1(dev);
24003 +}
24004 +
24005 +static void zfPowerSavingMgrIBSSMain(zdev_t* dev)
24006 +{
24007 + // wait for the end of
24008 + // if need to wait to know if we are the one to transmit the beacon
24009 + // during the beacon interval. If it's me, we can't go to sleep.
24010 +
24011 + zmw_get_wlan_dev(dev);
24012 +
24013 + switch(wd->sta.psMgr.state)
24014 + {
24015 + case ZM_PS_MSG_STATE_ACTIVE:
24016 + case ZM_PS_MSG_STATE_SLEEP:
24017 + case ZM_PS_MSG_STATE_T1:
24018 + break;
24019 +
24020 + case ZM_PS_MSG_STATE_T2:
24021 + zfPowerSavingMgrOnHandleT2(dev);
24022 + break;
24023 + }
24024 +
24025 + return;
24026 +}
24027 +
24028 +#if 1
24029 +void zfPowerSavingMgrMain(zdev_t* dev)
24030 +{
24031 + zmw_get_wlan_dev(dev);
24032 +
24033 + switch (wd->sta.adapterState)
24034 + {
24035 + case ZM_STA_STATE_DISCONNECT:
24036 + zfPowerSavingMgrDisconnectMain(dev);
24037 + break;
24038 + case ZM_STA_STATE_CONNECTED:
24039 + {
24040 + if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) {
24041 + zfPowerSavingMgrInfraMain(dev);
24042 + } else if (wd->wlanMode == ZM_MODE_IBSS) {
24043 + zfPowerSavingMgrIBSSMain(dev);
24044 + }
24045 + }
24046 + break;
24047 + case ZM_STA_STATE_CONNECTING:
24048 + default:
24049 + break;
24050 + }
24051 +}
24052 +#else
24053 +void zfPowerSavingMgrMain(zdev_t* dev)
24054 +{
24055 + zmw_get_wlan_dev(dev);
24056 +
24057 + if ( wd->wlanMode != ZM_MODE_INFRASTRUCTURE )
24058 + {
24059 + return;
24060 + }
24061 +
24062 + switch(wd->sta.psMgr.state)
24063 + {
24064 + case ZM_PS_MSG_STATE_ACTIVE:
24065 + goto check_sleep;
24066 + break;
24067 +
24068 + case ZM_PS_MSG_STATE_SLEEP:
24069 + goto sleeping;
24070 + break;
24071 +
24072 + case ZM_PS_MSG_STATE_T1:
24073 + zfPowerSavingMgrOnHandleT1(dev);
24074 + break;
24075 +
24076 + case ZM_PS_MSG_STATE_T2:
24077 + zfPowerSavingMgrOnHandleT2(dev);
24078 + break;
24079 + }
24080 +
24081 + return;
24082 +
24083 +sleeping:
24084 + return;
24085 +
24086 +check_sleep:
24087 + zfPowerSavingMgrSleepIfIdle(dev);
24088 + return;
24089 +}
24090 +#endif
24091 +
24092 +#ifdef ZM_ENABLE_POWER_SAVE
24093 +void zfPowerSavingMgrWakeup(zdev_t* dev)
24094 +{
24095 + zmw_get_wlan_dev(dev);
24096 + zmw_declare_for_critical_section();
24097 +
24098 +//zm_debug_msg0("zfPowerSavingMgrWakeup");
24099 +
24100 + //if ( wd->sta.psMgr.state != ZM_PS_MSG_STATE_ACTIVE && ( zfPowerSavingMgrIsIdle(dev) == 0 ))
24101 + if ( wd->sta.psMgr.state != ZM_PS_MSG_STATE_ACTIVE )
24102 + {
24103 + zmw_enter_critical_section(dev);
24104 +
24105 + wd->sta.psMgr.isSleepAllowed = 0;
24106 + wd->sta.psMgr.state = ZM_PS_MSG_STATE_ACTIVE;
24107 +
24108 + if ( wd->sta.powerSaveMode > ZM_STA_PS_NONE )
24109 + wd->sta.psMgr.tempWakeUp = 1;
24110 +
24111 + zmw_leave_critical_section(dev);
24112 +
24113 + // Wake up the CHIP now!!
24114 + zfHpPowerSaveSetState(dev, 0);
24115 + }
24116 +}
24117 +#else
24118 +void zfPowerSavingMgrWakeup(zdev_t* dev)
24119 +{
24120 +}
24121 +#endif
24122 +
24123 +void zfPowerSavingMgrProcessBeacon(zdev_t* dev, zbuf_t* buf)
24124 +{
24125 + u8_t length, bitmap;
24126 + u16_t offset, n1, n2, q, r;
24127 + zbuf_t* psBuf;
24128 +
24129 + zmw_get_wlan_dev(dev);
24130 + zmw_declare_for_critical_section();
24131 +
24132 + if ( wd->sta.powerSaveMode == ZM_STA_PS_NONE )
24133 + //if ( wd->sta.psMgr.state != ZM_PS_MSG_STATE_SLEEP )
24134 + {
24135 + return;
24136 + }
24137 +
24138 + wd->sta.psMgr.isSleepAllowed = 1;
24139 +
24140 + if ( (offset=zfFindElement(dev, buf, ZM_WLAN_EID_TIM)) != 0xffff )
24141 + {
24142 + length = zmw_rx_buf_readb(dev, buf, offset+1);
24143 +
24144 + if ( length > 3 )
24145 + {
24146 + n1 = zmw_rx_buf_readb(dev, buf, offset+4) & (~ZM_BIT_0);
24147 + n2 = length + n1 - 4;
24148 + q = wd->sta.aid >> 3;
24149 + r = wd->sta.aid & 7;
24150 +
24151 + if ((q >= n1) && (q <= n2))
24152 + {
24153 + bitmap = zmw_rx_buf_readb(dev, buf, offset+5+q-n1);
24154 +
24155 + if ( (bitmap >> r) & ZM_BIT_0 )
24156 + {
24157 + //if ( wd->sta.powerSaveMode == ZM_STA_PS_FAST )
24158 + if ( 0 )
24159 + {
24160 + wd->sta.psMgr.state = ZM_PS_MSG_STATE_S1;
24161 + //zfSendPSPoll(dev);
24162 + zfSendNullData(dev, 0);
24163 + }
24164 + else
24165 + {
24166 + if ((wd->sta.qosInfo&0xf) != 0xf)
24167 + {
24168 + /* send ps-poll */
24169 + //printk("zfSendPSPoll #1\n");
24170 +
24171 + wd->sta.psMgr.isSleepAllowed = 0;
24172 +
24173 + switch (wd->sta.powerSaveMode)
24174 + {
24175 + case ZM_STA_PS_MAX:
24176 + case ZM_STA_PS_FAST:
24177 + //zm_debug_msg0("wake up and send PS-Poll\n");
24178 + zfSendPSPoll(dev);
24179 + break;
24180 + case ZM_STA_PS_LIGHT:
24181 + zm_debug_msg0("wake up and send null data\n");
24182 +
24183 + zmw_enter_critical_section(dev);
24184 + wd->sta.psMgr.sleepAllowedtick = 400;
24185 + zmw_leave_critical_section(dev);
24186 +
24187 + zfSendNullData(dev, 0);
24188 + break;
24189 + }
24190 +
24191 + wd->sta.psMgr.tempWakeUp = 0;
24192 + }
24193 + }
24194 + }
24195 + }
24196 + }
24197 + }
24198 +
24199 + while ((psBuf = zfQueueGet(dev, wd->sta.uapsdQ)) != NULL)
24200 + {
24201 + zfTxSendEth(dev, psBuf, 0, ZM_EXTERNAL_ALLOC_BUF, 0);
24202 + }
24203 +
24204 + //printk("zfPowerSavingMgrProcessBeacon #1\n");
24205 + zfPowerSavingMgrMain(dev);
24206 +}
24207 +
24208 +void zfPowerSavingMgrConnectNotify(zdev_t *dev)
24209 +{
24210 + zmw_get_wlan_dev(dev);
24211 +
24212 + if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
24213 + {
24214 + switch(wd->sta.powerSaveMode)
24215 + {
24216 + case ZM_STA_PS_NONE:
24217 + zfHpPowerSaveSetMode(dev, 0, 0, wd->beaconInterval);
24218 + break;
24219 +
24220 + case ZM_STA_PS_FAST:
24221 + case ZM_STA_PS_MAX:
24222 + case ZM_STA_PS_LIGHT:
24223 + zfHpPowerSaveSetMode(dev, 0, 1, wd->beaconInterval);
24224 + break;
24225 +
24226 + default:
24227 + zfHpPowerSaveSetMode(dev, 0, 0, wd->beaconInterval);
24228 + break;
24229 + }
24230 + }
24231 +}
24232 +
24233 +void zfPowerSavingMgrPreTBTTInterrupt(zdev_t *dev)
24234 +{
24235 + zmw_get_wlan_dev(dev);
24236 + zmw_declare_for_critical_section();
24237 +
24238 + /* disable TBTT interrupt when change from connection to disconnect */
24239 + if (zfStaIsDisconnect(dev)) {
24240 + zfHpPowerSaveSetMode(dev, 0, 0, 0);
24241 + zfPowerSavingMgrWakeup(dev);
24242 + return;
24243 + }
24244 +
24245 + zmw_enter_critical_section(dev);
24246 + wd->sta.psMgr.ticks++;
24247 +
24248 + if ( wd->sta.psMgr.ticks < wd->sta.psMgr.maxSleepPeriods )
24249 + {
24250 + zmw_leave_critical_section(dev);
24251 + return;
24252 + }
24253 + else
24254 + {
24255 + wd->sta.psMgr.ticks = 0;
24256 + }
24257 +
24258 + zmw_leave_critical_section(dev);
24259 +
24260 + zfPowerSavingMgrWakeup(dev);
24261 +}
24262 +
24263 +/* Leave an empty line below to remove warning message on some compiler */
24264 +
24265 --- /dev/null
24266 +++ b/drivers/staging/otus/80211core/cscanmgr.c
24267 @@ -0,0 +1,535 @@
24268 +/*
24269 + * Copyright (c) 2007-2008 Atheros Communications Inc.
24270 + *
24271 + * Permission to use, copy, modify, and/or distribute this software for any
24272 + * purpose with or without fee is hereby granted, provided that the above
24273 + * copyright notice and this permission notice appear in all copies.
24274 + *
24275 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
24276 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
24277 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
24278 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
24279 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
24280 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
24281 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
24282 + */
24283 +
24284 +#include "cprecomp.h"
24285 +
24286 +void zfScanMgrInit(zdev_t* dev)
24287 +{
24288 + zmw_get_wlan_dev(dev);
24289 +
24290 + wd->sta.scanMgr.scanReqs[0] = 0;
24291 + wd->sta.scanMgr.scanReqs[1] = 0;
24292 +
24293 + wd->sta.scanMgr.currScanType = ZM_SCAN_MGR_SCAN_NONE;
24294 + wd->sta.scanMgr.scanStartDelay = 3;
24295 + //wd->sta.scanMgr.scanStartDelay = 0;
24296 +}
24297 +
24298 +u8_t zfScanMgrScanStart(zdev_t* dev, u8_t scanType)
24299 +{
24300 + u8_t i;
24301 +
24302 + zmw_get_wlan_dev(dev);
24303 +
24304 + zm_debug_msg1("scanType = ", scanType);
24305 +
24306 + zmw_declare_for_critical_section();
24307 +
24308 + if ( scanType != ZM_SCAN_MGR_SCAN_INTERNAL &&
24309 + scanType != ZM_SCAN_MGR_SCAN_EXTERNAL )
24310 + {
24311 + zm_debug_msg0("unknown scanType");
24312 + return 1;
24313 + }
24314 + else if (zfStaIsConnecting(dev))
24315 + {
24316 + zm_debug_msg0("reject scan request due to connecting");
24317 + return 1;
24318 + }
24319 +
24320 + i = scanType - 1;
24321 +
24322 + zmw_enter_critical_section(dev);
24323 +
24324 + if ( wd->sta.scanMgr.scanReqs[i] == 1 )
24325 + {
24326 + zm_debug_msg1("scan rescheduled", scanType);
24327 + goto scan_done;
24328 + }
24329 +
24330 + wd->sta.scanMgr.scanReqs[i] = 1;
24331 + zm_debug_msg1("scan scheduled: ", scanType);
24332 +
24333 + // If there's no scan pending, we do the scan right away.
24334 + // If there's an internal scan and the new scan request is external one,
24335 + // we will restart the scan.
24336 + if ( wd->sta.scanMgr.currScanType == ZM_SCAN_MGR_SCAN_NONE )
24337 + {
24338 + goto schedule_scan;
24339 + }
24340 + else if ( wd->sta.scanMgr.currScanType == ZM_SCAN_MGR_SCAN_INTERNAL &&
24341 + scanType == ZM_SCAN_MGR_SCAN_EXTERNAL )
24342 + {
24343 + // Stop the internal scan & schedule external scan first
24344 + zfTimerCancel(dev, ZM_EVENT_SCAN);
24345 +
24346 + /* Fix for WHQL sendrecv => we do not apply delay time in which the device
24347 + stop transmitting packet when we already connect to some AP */
24348 + wd->sta.bScheduleScan = FALSE;
24349 +
24350 + zfTimerCancel(dev, ZM_EVENT_TIMEOUT_SCAN);
24351 + zfTimerCancel(dev, ZM_EVENT_IN_SCAN);
24352 +
24353 + wd->sta.bChannelScan = FALSE;
24354 + goto schedule_scan;
24355 + }
24356 + else
24357 + {
24358 + zm_debug_msg0("Scan is busy...waiting later to start\n");
24359 + }
24360 +
24361 + zmw_leave_critical_section(dev);
24362 + return 0;
24363 +
24364 +scan_done:
24365 + zmw_leave_critical_section(dev);
24366 + return 1;
24367 +
24368 +schedule_scan:
24369 +
24370 + wd->sta.bScheduleScan = TRUE;
24371 +
24372 + zfTimerSchedule(dev, ZM_EVENT_SCAN, wd->sta.scanMgr.scanStartDelay);
24373 + wd->sta.scanMgr.scanStartDelay = 3;
24374 + //wd->sta.scanMgr.scanStartDelay = 0;
24375 + wd->sta.scanMgr.currScanType = scanType;
24376 + zmw_leave_critical_section(dev);
24377 +
24378 + if ((zfStaIsConnected(dev)) && (!zfPowerSavingMgrIsSleeping(dev)))
24379 + {
24380 + zfSendNullData(dev, 1);
24381 + }
24382 + return 0;
24383 +}
24384 +
24385 +void zfScanMgrScanStop(zdev_t* dev, u8_t scanType)
24386 +{
24387 + u8_t scanNotifyRequired = 0;
24388 + u8_t theOtherScan = ZM_SCAN_MGR_SCAN_NONE;
24389 +
24390 + zmw_get_wlan_dev(dev);
24391 +
24392 + zmw_declare_for_critical_section();
24393 +
24394 + zmw_enter_critical_section(dev);
24395 +
24396 + if ( wd->sta.scanMgr.currScanType == ZM_SCAN_MGR_SCAN_NONE )
24397 + {
24398 + zm_assert(wd->sta.scanMgr.scanReqs[0] == 0);
24399 + zm_assert(wd->sta.scanMgr.scanReqs[1] == 0);
24400 + goto done;
24401 + }
24402 +
24403 + switch(scanType)
24404 + {
24405 + case ZM_SCAN_MGR_SCAN_EXTERNAL:
24406 + scanNotifyRequired = 1;
24407 + theOtherScan = ZM_SCAN_MGR_SCAN_INTERNAL;
24408 + break;
24409 +
24410 + case ZM_SCAN_MGR_SCAN_INTERNAL:
24411 + theOtherScan = ZM_SCAN_MGR_SCAN_EXTERNAL;
24412 + break;
24413 +
24414 + default:
24415 + goto done;
24416 + }
24417 +
24418 + if ( wd->sta.scanMgr.currScanType != scanType )
24419 + {
24420 + goto stop_done;
24421 + }
24422 +
24423 + zfTimerCancel(dev, ZM_EVENT_SCAN);
24424 +
24425 + /* Fix for WHQL sendrecv => we do not apply delay time in which the device
24426 + stop transmitting packet when we already connect to some AP */
24427 + wd->sta.bScheduleScan = FALSE;
24428 +
24429 + zfTimerCancel(dev, ZM_EVENT_TIMEOUT_SCAN);
24430 + zfTimerCancel(dev, ZM_EVENT_IN_SCAN);
24431 +
24432 + wd->sta.bChannelScan = FALSE;
24433 + wd->sta.scanFrequency = 0;
24434 +
24435 + if ( wd->sta.scanMgr.scanReqs[theOtherScan - 1] )
24436 + {
24437 + wd->sta.scanMgr.currScanType = theOtherScan;
24438 +
24439 + // Schedule the other scan after 1 second later
24440 + zfTimerSchedule(dev, ZM_EVENT_SCAN, 100);
24441 + }
24442 + else
24443 + {
24444 + wd->sta.scanMgr.currScanType = ZM_SCAN_MGR_SCAN_NONE;
24445 + }
24446 +
24447 +stop_done:
24448 + wd->sta.scanMgr.scanReqs[scanType - 1] = 0;
24449 +
24450 + zmw_leave_critical_section(dev);
24451 +
24452 + /* avoid lose receive packet when site survey */
24453 + if ((zfStaIsConnected(dev)) && (!zfPowerSavingMgrIsSleeping(dev)))
24454 + {
24455 + zfSendNullData(dev, 0);
24456 + }
24457 +
24458 + if ( scanNotifyRequired )
24459 + {
24460 + zm_debug_msg0("Scan notify after reset");
24461 + if (wd->zfcbScanNotify != NULL)
24462 + {
24463 + wd->zfcbScanNotify(dev, NULL);
24464 + }
24465 + }
24466 +
24467 + return;
24468 +
24469 +done:
24470 + zmw_leave_critical_section(dev);
24471 + return;
24472 +}
24473 +
24474 +void zfScanMgrScanAck(zdev_t* dev)
24475 +{
24476 + zmw_get_wlan_dev(dev);
24477 +
24478 + zmw_declare_for_critical_section();
24479 +
24480 + zmw_enter_critical_section(dev);
24481 +
24482 + wd->sta.scanMgr.scanStartDelay = 3;
24483 + //wd->sta.scanMgr.scanStartDelay = 0;
24484 +
24485 + zmw_leave_critical_section(dev);
24486 + return;
24487 +}
24488 +
24489 +extern void zfStaReconnect(zdev_t* dev);
24490 +
24491 +static void zfScanSendProbeRequest(zdev_t* dev)
24492 +{
24493 + u8_t k;
24494 + u16_t dst[3] = { 0xffff, 0xffff, 0xffff };
24495 +
24496 + zmw_get_wlan_dev(dev);
24497 +
24498 + /* Increase rxBeaconCount to prevent beacon lost */
24499 + if (zfStaIsConnected(dev))
24500 + {
24501 + wd->sta.rxBeaconCount++;
24502 + }
24503 +
24504 + if ( wd->sta.bPassiveScan )
24505 + {
24506 + return;
24507 + }
24508 + /* enable 802.l11h and in DFS Band , disable sending probe request */
24509 + if (wd->sta.DFSEnable)
24510 + {
24511 + if (zfHpIsDfsChannel(dev, wd->sta.scanFrequency))
24512 + {
24513 + return;
24514 + }
24515 + }
24516 +
24517 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_PROBEREQ, dst, 0, 0, 0);
24518 +
24519 + if ( wd->sta.disableProbingWithSsid )
24520 + {
24521 + return;
24522 + }
24523 +
24524 + for (k=1; k<=ZM_MAX_PROBE_HIDDEN_SSID_SIZE; k++)
24525 + {
24526 + if ( wd->ws.probingSsidList[k-1].ssidLen != 0 )
24527 + {
24528 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_PROBEREQ, dst, k, 0, 0);
24529 + }
24530 + }
24531 +}
24532 +
24533 +static void zfScanMgrEventSetFreqCompleteCb(zdev_t* dev)
24534 +{
24535 + zmw_get_wlan_dev(dev);
24536 +
24537 + zmw_declare_for_critical_section();
24538 +
24539 +//printk("zfScanMgrEventSetFreqCompleteCb #1\n");
24540 +
24541 + zmw_enter_critical_section(dev);
24542 + zfTimerSchedule(dev, ZM_EVENT_IN_SCAN, ZM_TICK_IN_SCAN);
24543 + if (wd->sta.bPassiveScan)
24544 + {
24545 + zfTimerSchedule(dev, ZM_EVENT_TIMEOUT_SCAN, wd->sta.passiveScanTickPerChannel);
24546 + }
24547 + else
24548 + {
24549 + zfTimerSchedule(dev, ZM_EVENT_TIMEOUT_SCAN, wd->sta.activescanTickPerChannel);
24550 + }
24551 + zmw_leave_critical_section(dev);
24552 +
24553 + zfScanSendProbeRequest(dev);
24554 +}
24555 +
24556 +
24557 +static void zfScanMgrEventScanCompleteCb(zdev_t* dev)
24558 +{
24559 + zmw_get_wlan_dev(dev);
24560 +
24561 + if ((zfStaIsConnected(dev)) && (!zfPowerSavingMgrIsSleeping(dev)))
24562 + {
24563 + zfSendNullData(dev, 0);
24564 + }
24565 + return;
24566 +}
24567 +
24568 +
24569 +void zfScanMgrScanEventRetry(zdev_t* dev)
24570 +{
24571 + zmw_get_wlan_dev(dev);
24572 +
24573 + if ( !wd->sta.bChannelScan )
24574 + {
24575 + return;
24576 + }
24577 +
24578 + if ( !wd->sta.bPassiveScan )
24579 + {
24580 + zfScanSendProbeRequest(dev);
24581 + #if 0
24582 + zmw_enter_critical_section(dev);
24583 + zfTimerSchedule(dev, ZM_EVENT_IN_SCAN, ZM_TICK_IN_SCAN);
24584 + zmw_leave_critical_section(dev);
24585 + #endif
24586 + }
24587 +}
24588 +
24589 +u8_t zfScanMgrScanEventTimeout(zdev_t* dev)
24590 +{
24591 + u16_t nextScanFrequency = 0;
24592 + u8_t temp;
24593 +
24594 + zmw_get_wlan_dev(dev);
24595 +
24596 + zmw_declare_for_critical_section();
24597 +
24598 + zmw_enter_critical_section(dev);
24599 + if ( wd->sta.scanFrequency == 0 )
24600 + {
24601 + zmw_leave_critical_section(dev);
24602 + return -1;
24603 + }
24604 +
24605 + nextScanFrequency = zfChGetNextChannel(dev, wd->sta.scanFrequency,
24606 + &wd->sta.bPassiveScan);
24607 +
24608 + if ( (nextScanFrequency == 0xffff)
24609 + || (wd->sta.scanFrequency == zfChGetLastChannel(dev, &temp)) )
24610 + {
24611 + u8_t currScanType;
24612 + u8_t isExternalScan = 0;
24613 + u8_t isInternalScan = 0;
24614 +
24615 + //zm_debug_msg1("end scan = ", KeQueryInterruptTime());
24616 + wd->sta.scanFrequency = 0;
24617 +
24618 + zm_debug_msg1("scan 1 type: ", wd->sta.scanMgr.currScanType);
24619 + zm_debug_msg1("scan channel count = ", wd->regulationTable.allowChannelCnt);
24620 +
24621 + //zfBssInfoRefresh(dev);
24622 + zfTimerCancel(dev, ZM_EVENT_TIMEOUT_SCAN);
24623 +
24624 + if ( wd->sta.bChannelScan == FALSE )
24625 + {
24626 + zm_debug_msg0("WOW!! scan is cancelled\n");
24627 + zmw_leave_critical_section(dev);
24628 + goto report_scan_result;
24629 + }
24630 +
24631 +
24632 + currScanType = wd->sta.scanMgr.currScanType;
24633 + switch(currScanType)
24634 + {
24635 + case ZM_SCAN_MGR_SCAN_EXTERNAL:
24636 + isExternalScan = 1;
24637 +
24638 + if ( wd->sta.scanMgr.scanReqs[ZM_SCAN_MGR_SCAN_INTERNAL - 1] )
24639 + {
24640 + wd->sta.scanMgr.scanReqs[ZM_SCAN_MGR_SCAN_INTERNAL - 1] = 0;
24641 + isInternalScan = 1;
24642 + }
24643 +
24644 + break;
24645 +
24646 + case ZM_SCAN_MGR_SCAN_INTERNAL:
24647 + isInternalScan = 1;
24648 +
24649 + if ( wd->sta.scanMgr.scanReqs[ZM_SCAN_MGR_SCAN_EXTERNAL - 1] )
24650 + {
24651 + // Because the external scan should pre-empts internal scan.
24652 + // So this shall not be happened!!
24653 + zm_assert(0);
24654 + }
24655 +
24656 + break;
24657 +
24658 + default:
24659 + zm_assert(0);
24660 + break;
24661 + }
24662 +
24663 + wd->sta.scanMgr.scanReqs[currScanType - 1] = 0;
24664 + wd->sta.scanMgr.scanStartDelay = 100;
24665 + wd->sta.scanMgr.currScanType = ZM_SCAN_MGR_SCAN_NONE;
24666 + zmw_leave_critical_section(dev);
24667 +
24668 + //Set channel according to AP's configuration
24669 + zfCoreSetFrequencyEx(dev, wd->frequency, wd->BandWidth40,
24670 + wd->ExtOffset, zfScanMgrEventScanCompleteCb);
24671 +
24672 + wd->sta.bChannelScan = FALSE;
24673 +
24674 + #if 1
24675 + if (zfStaIsConnected(dev))
24676 + { // Finish site survey, reset the variable to detect using wrong frequency !
24677 + zfHpFinishSiteSurvey(dev, 1);
24678 + zmw_enter_critical_section(dev);
24679 + wd->sta.ibssSiteSurveyStatus = 2;
24680 + wd->tickIbssReceiveBeacon = 0;
24681 + wd->sta.ibssReceiveBeaconCount = 0;
24682 + zmw_leave_critical_section(dev);
24683 +
24684 + /* #5 Re-enable RIFS function after the site survey ! */
24685 + /* This is because switch band will reset the BB register to initial value */
24686 + if( wd->sta.rifsState == ZM_RIFS_STATE_DETECTED )
24687 + {
24688 + zfHpEnableRifs(dev, ((wd->sta.currentFrequency<3000)?1:0), wd->sta.EnableHT, wd->sta.HT2040);
24689 + }
24690 + }
24691 + else
24692 + {
24693 + zfHpFinishSiteSurvey(dev, 0);
24694 + zmw_enter_critical_section(dev);
24695 + wd->sta.ibssSiteSurveyStatus = 0;
24696 + zmw_leave_critical_section(dev);
24697 + }
24698 + #endif
24699 +
24700 +report_scan_result:
24701 + /* avoid lose receive packet when site survey */
24702 + //if ((zfStaIsConnected(dev)) && (!zfPowerSavingMgrIsSleeping(dev)))
24703 + //{
24704 + // zfSendNullData(dev, 0);
24705 + //}
24706 +
24707 + if ( isExternalScan )//Quickly reboot
24708 + {
24709 + if (wd->zfcbScanNotify != NULL)
24710 + {
24711 + wd->zfcbScanNotify(dev, NULL);
24712 + }
24713 + }
24714 +
24715 + if ( isInternalScan )
24716 + {
24717 + //wd->sta.InternalScanReq = 0;
24718 + zfStaReconnect(dev);
24719 + }
24720 +
24721 + return 0;
24722 + }
24723 + else
24724 + {
24725 + wd->sta.scanFrequency = nextScanFrequency;
24726 +
24727 + //zmw_enter_critical_section(dev);
24728 + zfTimerCancel(dev, ZM_EVENT_IN_SCAN);
24729 + zmw_leave_critical_section(dev);
24730 +
24731 + zm_debug_msg0("scan 2");
24732 + zfCoreSetFrequencyV2(dev, wd->sta.scanFrequency, zfScanMgrEventSetFreqCompleteCb);
24733 +
24734 + return 1;
24735 + }
24736 +}
24737 +
24738 +void zfScanMgrScanEventStart(zdev_t* dev)
24739 +{
24740 + zmw_get_wlan_dev(dev);
24741 +
24742 + zmw_declare_for_critical_section();
24743 +
24744 + if ( wd->sta.bChannelScan )
24745 + {
24746 + return;
24747 + }
24748 +
24749 + zfPowerSavingMgrWakeup(dev);
24750 +
24751 + zmw_enter_critical_section(dev);
24752 +
24753 + if ( wd->sta.scanMgr.currScanType == ZM_SCAN_MGR_SCAN_NONE )
24754 + {
24755 + goto no_scan;
24756 + }
24757 +
24758 + //zfBssInfoRefresh(dev);
24759 + zfBssInfoRefresh(dev, 0);
24760 + wd->sta.bChannelScan = TRUE;
24761 + wd->sta.bScheduleScan = FALSE;
24762 + zfTimerCancel(dev, ZM_EVENT_IN_SCAN);
24763 + zfTimerCancel(dev, ZM_EVENT_TIMEOUT_SCAN);
24764 +
24765 + //zm_debug_msg1("start scan = ", KeQueryInterruptTime());
24766 + wd->sta.scanFrequency = zfChGetFirstChannel(dev, &wd->sta.bPassiveScan);
24767 + zmw_leave_critical_section(dev);
24768 +
24769 + /* avoid lose receive packet when site survey */
24770 + //if ((zfStaIsConnected(dev)) && (!zfPowerSavingMgrIsSleeping(dev)))
24771 + //{
24772 + // zfSendNullData(dev, 1);
24773 + //}
24774 +// zm_debug_msg0("scan 0");
24775 +// zfCoreSetFrequencyV2(dev, wd->sta.scanFrequency, zfScanMgrEventSetFreqCompleteCb);
24776 +
24777 + #if 1
24778 + if (zfStaIsConnected(dev))
24779 + {// If doing site survey !
24780 + zfHpBeginSiteSurvey(dev, 1);
24781 + zmw_enter_critical_section(dev);
24782 + wd->sta.ibssSiteSurveyStatus = 1;
24783 + zmw_leave_critical_section(dev);
24784 + }
24785 + else
24786 + {
24787 + zfHpBeginSiteSurvey(dev, 0);
24788 + zmw_enter_critical_section(dev);
24789 + wd->sta.ibssSiteSurveyStatus = 0;
24790 + zmw_leave_critical_section(dev);
24791 + }
24792 + #endif
24793 +
24794 + zm_debug_msg0("scan 0");
24795 + zfCoreSetFrequencyV2(dev, wd->sta.scanFrequency, zfScanMgrEventSetFreqCompleteCb);
24796 +
24797 + return;
24798 +
24799 +no_scan:
24800 + zmw_leave_critical_section(dev);
24801 + return;
24802 +}
24803 --- /dev/null
24804 +++ b/drivers/staging/otus/80211core/ctkip.c
24805 @@ -0,0 +1,598 @@
24806 +/*
24807 + * Copyright (c) 2007-2008 Atheros Communications Inc.
24808 + *
24809 + * Permission to use, copy, modify, and/or distribute this software for any
24810 + * purpose with or without fee is hereby granted, provided that the above
24811 + * copyright notice and this permission notice appear in all copies.
24812 + *
24813 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
24814 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
24815 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
24816 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
24817 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
24818 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
24819 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
24820 + */
24821 +/* */
24822 +/* Module Name : ctkip.c */
24823 +/* */
24824 +/* Abstract */
24825 +/* This module contains Tx and Rx functions. */
24826 +/* */
24827 +/* NOTES */
24828 +/* None */
24829 +/* */
24830 +/************************************************************************/
24831 +#include "cprecomp.h"
24832 +
24833 +u16_t zgTkipSboxLower[256] =
24834 + {
24835 + 0xA5,0x84,0x99,0x8D,0x0D,0xBD,0xB1,0x54,
24836 + 0x50,0x03,0xA9,0x7D,0x19,0x62,0xE6,0x9A,
24837 + 0x45,0x9D,0x40,0x87,0x15,0xEB,0xC9,0x0B,
24838 + 0xEC,0x67,0xFD,0xEA,0xBF,0xF7,0x96,0x5B,
24839 + 0xC2,0x1C,0xAE,0x6A,0x5A,0x41,0x02,0x4F,
24840 + 0x5C,0xF4,0x34,0x08,0x93,0x73,0x53,0x3F,
24841 + 0x0C,0x52,0x65,0x5E,0x28,0xA1,0x0F,0xB5,
24842 + 0x09,0x36,0x9B,0x3D,0x26,0x69,0xCD,0x9F,
24843 + 0x1B,0x9E,0x74,0x2E,0x2D,0xB2,0xEE,0xFB,
24844 + 0xF6,0x4D,0x61,0xCE,0x7B,0x3E,0x71,0x97,
24845 + 0xF5,0x68,0x00,0x2C,0x60,0x1F,0xC8,0xED,
24846 + 0xBE,0x46,0xD9,0x4B,0xDE,0xD4,0xE8,0x4A,
24847 + 0x6B,0x2A,0xE5,0x16,0xC5,0xD7,0x55,0x94,
24848 + 0xCF,0x10,0x06,0x81,0xF0,0x44,0xBA,0xE3,
24849 + 0xF3,0xFE,0xC0,0x8A,0xAD,0xBC,0x48,0x04,
24850 + 0xDF,0xC1,0x75,0x63,0x30,0x1A,0x0E,0x6D,
24851 + 0x4C,0x14,0x35,0x2F,0xE1,0xA2,0xCC,0x39,
24852 + 0x57,0xF2,0x82,0x47,0xAC,0xE7,0x2B,0x95,
24853 + 0xA0,0x98,0xD1,0x7F,0x66,0x7E,0xAB,0x83,
24854 + 0xCA,0x29,0xD3,0x3C,0x79,0xE2,0x1D,0x76,
24855 + 0x3B,0x56,0x4E,0x1E,0xDB,0x0A,0x6C,0xE4,
24856 + 0x5D,0x6E,0xEF,0xA6,0xA8,0xA4,0x37,0x8B,
24857 + 0x32,0x43,0x59,0xB7,0x8C,0x64,0xD2,0xE0,
24858 + 0xB4,0xFA,0x07,0x25,0xAF,0x8E,0xE9,0x18,
24859 + 0xD5,0x88,0x6F,0x72,0x24,0xF1,0xC7,0x51,
24860 + 0x23,0x7C,0x9C,0x21,0xDD,0xDC,0x86,0x85,
24861 + 0x90,0x42,0xC4,0xAA,0xD8,0x05,0x01,0x12,
24862 + 0xA3,0x5F,0xF9,0xD0,0x91,0x58,0x27,0xB9,
24863 + 0x38,0x13,0xB3,0x33,0xBB,0x70,0x89,0xA7,
24864 + 0xB6,0x22,0x92,0x20,0x49,0xFF,0x78,0x7A,
24865 + 0x8F,0xF8,0x80,0x17,0xDA,0x31,0xC6,0xB8,
24866 + 0xC3,0xB0,0x77,0x11,0xCB,0xFC,0xD6,0x3A
24867 + };
24868 +
24869 +
24870 +u16_t zgTkipSboxUpper[256] =
24871 + {
24872 + 0xC6,0xF8,0xEE,0xF6,0xFF,0xD6,0xDE,0x91,
24873 + 0x60,0x02,0xCE,0x56,0xE7,0xB5,0x4D,0xEC,
24874 + 0x8F,0x1F,0x89,0xFA,0xEF,0xB2,0x8E,0xFB,
24875 + 0x41,0xB3,0x5F,0x45,0x23,0x53,0xE4,0x9B,
24876 + 0x75,0xE1,0x3D,0x4C,0x6C,0x7E,0xF5,0x83,
24877 + 0x68,0x51,0xD1,0xF9,0xE2,0xAB,0x62,0x2A,
24878 + 0x08,0x95,0x46,0x9D,0x30,0x37,0x0A,0x2F,
24879 + 0x0E,0x24,0x1B,0xDF,0xCD,0x4E,0x7F,0xEA,
24880 + 0x12,0x1D,0x58,0x34,0x36,0xDC,0xB4,0x5B,
24881 + 0xA4,0x76,0xB7,0x7D,0x52,0xDD,0x5E,0x13,
24882 + 0xA6,0xB9,0x00,0xC1,0x40,0xE3,0x79,0xB6,
24883 + 0xD4,0x8D,0x67,0x72,0x94,0x98,0xB0,0x85,
24884 + 0xBB,0xC5,0x4F,0xED,0x86,0x9A,0x66,0x11,
24885 + 0x8A,0xE9,0x04,0xFE,0xA0,0x78,0x25,0x4B,
24886 + 0xA2,0x5D,0x80,0x05,0x3F,0x21,0x70,0xF1,
24887 + 0x63,0x77,0xAF,0x42,0x20,0xE5,0xFD,0xBF,
24888 + 0x81,0x18,0x26,0xC3,0xBE,0x35,0x88,0x2E,
24889 + 0x93,0x55,0xFC,0x7A,0xC8,0xBA,0x32,0xE6,
24890 + 0xC0,0x19,0x9E,0xA3,0x44,0x54,0x3B,0x0B,
24891 + 0x8C,0xC7,0x6B,0x28,0xA7,0xBC,0x16,0xAD,
24892 + 0xDB,0x64,0x74,0x14,0x92,0x0C,0x48,0xB8,
24893 + 0x9F,0xBD,0x43,0xC4,0x39,0x31,0xD3,0xF2,
24894 + 0xD5,0x8B,0x6E,0xDA,0x01,0xB1,0x9C,0x49,
24895 + 0xD8,0xAC,0xF3,0xCF,0xCA,0xF4,0x47,0x10,
24896 + 0x6F,0xF0,0x4A,0x5C,0x38,0x57,0x73,0x97,
24897 + 0xCB,0xA1,0xE8,0x3E,0x96,0x61,0x0D,0x0F,
24898 + 0xE0,0x7C,0x71,0xCC,0x90,0x06,0xF7,0x1C,
24899 + 0xC2,0x6A,0xAE,0x69,0x17,0x99,0x3A,0x27,
24900 + 0xD9,0xEB,0x2B,0x22,0xD2,0xA9,0x07,0x33,
24901 + 0x2D,0x3C,0x15,0xC9,0x87,0xAA,0x50,0xA5,
24902 + 0x03,0x59,0x09,0x1A,0x65,0xD7,0x84,0xD0,
24903 + 0x82,0x29,0x5A,0x1E,0x7B,0xA8,0x6D,0x2C
24904 + };
24905 +
24906 +u16_t zfrotr1(u16_t a)
24907 +// rotate right by 1 bit.
24908 +{
24909 + u16_t b;
24910 +
24911 + if (a & 0x01)
24912 + {
24913 + b = (a >> 1) | 0x8000;
24914 + }
24915 + else
24916 + {
24917 + b = (a >> 1) & 0x7fff;
24918 + }
24919 + return b;
24920 +}
24921 +
24922 +/*************************************************************/
24923 +/* zfTkipSbox() */
24924 +/* Returns a 16 bit value from a 64K entry table. The Table */
24925 +/* is synthesized from two 256 entry byte wide tables. */
24926 +/*************************************************************/
24927 +u16_t zfTkipSbox(u16_t index)
24928 +{
24929 + u16_t low;
24930 + u16_t high;
24931 + u16_t left, right;
24932 +
24933 + low = (index & 0xFF);
24934 + high = ((index >> 8) & 0xFF);
24935 +
24936 + left = zgTkipSboxLower[low] + (zgTkipSboxUpper[low] << 8 );
24937 + right = zgTkipSboxUpper[high] + (zgTkipSboxLower[high] << 8 );
24938 +
24939 + return (left ^ right);
24940 +}
24941 +
24942 +u8_t zfTkipPhase1KeyMix(u32_t iv32, struct zsTkipSeed* pSeed)
24943 +{
24944 + u16_t tsc0;
24945 + u16_t tsc1;
24946 + u16_t i, j;
24947 +#if 0
24948 + /* Need not proceed this function with the same iv32 */
24949 + if ( iv32 == pSeed->iv32 )
24950 + {
24951 + return 1;
24952 + }
24953 +#endif
24954 + tsc0 = (u16_t) ((iv32 >> 16) & 0xffff); /* msb */
24955 + tsc1 = (u16_t) (iv32 & 0xffff);
24956 +
24957 + /* Phase 1, step 1 */
24958 + pSeed->ttak[0] = tsc1;
24959 + pSeed->ttak[1] = tsc0;
24960 + pSeed->ttak[2] = (u16_t) (pSeed->ta[0] + (pSeed->ta[1] <<8));
24961 + pSeed->ttak[3] = (u16_t) (pSeed->ta[2] + (pSeed->ta[3] <<8));
24962 + pSeed->ttak[4] = (u16_t) (pSeed->ta[4] + (pSeed->ta[5] <<8));
24963 +
24964 + /* Phase 1, step 2 */
24965 + for (i=0; i<8; i++)
24966 + {
24967 + j = 2*(i & 1);
24968 + pSeed->ttak[0] =(pSeed->ttak[0] + zfTkipSbox(pSeed->ttak[4]
24969 + ^ ZM_BYTE_TO_WORD(pSeed->tk[1+j], pSeed->tk[j])))
24970 + & 0xffff;
24971 + pSeed->ttak[1] =(pSeed->ttak[1] + zfTkipSbox(pSeed->ttak[0]
24972 + ^ ZM_BYTE_TO_WORD(pSeed->tk[5+j], pSeed->tk[4+j] )))
24973 + & 0xffff;
24974 + pSeed->ttak[2] =(pSeed->ttak[2] + zfTkipSbox(pSeed->ttak[1]
24975 + ^ ZM_BYTE_TO_WORD(pSeed->tk[9+j], pSeed->tk[8+j] )))
24976 + & 0xffff;
24977 + pSeed->ttak[3] =(pSeed->ttak[3] + zfTkipSbox(pSeed->ttak[2]
24978 + ^ ZM_BYTE_TO_WORD(pSeed->tk[13+j], pSeed->tk[12+j])))
24979 + & 0xffff;
24980 + pSeed->ttak[4] =(pSeed->ttak[4] + zfTkipSbox(pSeed->ttak[3]
24981 + ^ ZM_BYTE_TO_WORD(pSeed->tk[1+j], pSeed->tk[j] )))
24982 + & 0xffff;
24983 + pSeed->ttak[4] =(pSeed->ttak[4] + i) & 0xffff;
24984 + }
24985 +
24986 + if ( iv32 == (pSeed->iv32+1) )
24987 + {
24988 + pSeed->iv32tmp = iv32;
24989 + return 1;
24990 + }
24991 +
24992 + return 0;
24993 +}
24994 +
24995 +u8_t zfTkipPhase2KeyMix(u16_t iv16, struct zsTkipSeed* pSeed)
24996 +{
24997 + u16_t tsc2;
24998 +
24999 + tsc2 = iv16;
25000 +
25001 + /* Phase 2, Step 1 */
25002 + pSeed->ppk[0] = pSeed->ttak[0];
25003 + pSeed->ppk[1] = pSeed->ttak[1];
25004 + pSeed->ppk[2] = pSeed->ttak[2];
25005 + pSeed->ppk[3] = pSeed->ttak[3];
25006 + pSeed->ppk[4] = pSeed->ttak[4];
25007 + pSeed->ppk[5] = (pSeed->ttak[4] + tsc2) & 0xffff;
25008 +
25009 + /* Phase2, Step 2 */
25010 + pSeed->ppk[0] = pSeed->ppk[0]
25011 + + zfTkipSbox(pSeed->ppk[5] ^ ZM_BYTE_TO_WORD(pSeed->tk[1],pSeed->tk[0]));
25012 + pSeed->ppk[1] = pSeed->ppk[1]
25013 + + zfTkipSbox(pSeed->ppk[0] ^ ZM_BYTE_TO_WORD(pSeed->tk[3],pSeed->tk[2]));
25014 + pSeed->ppk[2] = pSeed->ppk[2]
25015 + + zfTkipSbox(pSeed->ppk[1] ^ ZM_BYTE_TO_WORD(pSeed->tk[5],pSeed->tk[4]));
25016 + pSeed->ppk[3] = pSeed->ppk[3]
25017 + + zfTkipSbox(pSeed->ppk[2] ^ ZM_BYTE_TO_WORD(pSeed->tk[7],pSeed->tk[6]));
25018 + pSeed->ppk[4] = pSeed->ppk[4]
25019 + + zfTkipSbox(pSeed->ppk[3] ^ ZM_BYTE_TO_WORD(pSeed->tk[9],pSeed->tk[8]));
25020 + pSeed->ppk[5] = pSeed->ppk[5]
25021 + + zfTkipSbox(pSeed->ppk[4] ^ ZM_BYTE_TO_WORD(pSeed->tk[11],pSeed->tk[10]));
25022 +
25023 + pSeed->ppk[0] = pSeed->ppk[0]
25024 + + zfrotr1(pSeed->ppk[5] ^ ZM_BYTE_TO_WORD(pSeed->tk[13],pSeed->tk[12]));
25025 + pSeed->ppk[1] = pSeed->ppk[1]
25026 + + zfrotr1(pSeed->ppk[0] ^ ZM_BYTE_TO_WORD(pSeed->tk[15],pSeed->tk[14]));
25027 + pSeed->ppk[2] = pSeed->ppk[2] + zfrotr1(pSeed->ppk[1]);
25028 + pSeed->ppk[3] = pSeed->ppk[3] + zfrotr1(pSeed->ppk[2]);
25029 + pSeed->ppk[4] = pSeed->ppk[4] + zfrotr1(pSeed->ppk[3]);
25030 + pSeed->ppk[5] = pSeed->ppk[5] + zfrotr1(pSeed->ppk[4]);
25031 +
25032 + if (iv16 == 0)
25033 + {
25034 + if (pSeed->iv16 == 0xffff)
25035 + {
25036 + pSeed->iv16tmp=0;
25037 + return 1;
25038 + }
25039 + else
25040 + return 0;
25041 + }
25042 + else if (iv16 == (pSeed->iv16+1))
25043 + {
25044 + pSeed->iv16tmp = iv16;
25045 + return 1;
25046 + }
25047 + else
25048 + return 0;
25049 +}
25050 +
25051 +void zfTkipInit(u8_t* key, u8_t* ta, struct zsTkipSeed* pSeed, u8_t* initIv)
25052 +{
25053 + u16_t iv16;
25054 + u32_t iv32;
25055 + u16_t i;
25056 +
25057 + /* clear memory */
25058 + zfZeroMemory((u8_t*) pSeed, sizeof(struct zsTkipSeed));
25059 + /* set key to seed */
25060 + zfMemoryCopy(pSeed->ta, ta, 6);
25061 + zfMemoryCopy(pSeed->tk, key, 16);
25062 +
25063 + iv16 = *initIv++;
25064 + iv16 += *initIv<<8;
25065 + initIv++;
25066 +
25067 + iv32=0;
25068 +
25069 + for(i=0; i<4; i++) // initiv is little endian
25070 + {
25071 + iv32 += *initIv<<(i*8);
25072 + *initIv++;
25073 + }
25074 +
25075 + pSeed->iv32 = iv32+1; // Force Recalculating on Tkip Phase1
25076 + zfTkipPhase1KeyMix(iv32, pSeed);
25077 +
25078 + pSeed->iv16 = iv16;
25079 + pSeed->iv32 = iv32;
25080 +}
25081 +
25082 +u32_t zfGetU32t(u8_t* p)
25083 +{
25084 + u32_t res=0;
25085 + u16_t i;
25086 +
25087 + for( i=0; i<4; i++ )
25088 + {
25089 + res |= (*p++) << (8*i);
25090 + }
25091 +
25092 + return res;
25093 +
25094 +}
25095 +
25096 +void zfPutU32t(u8_t* p, u32_t value)
25097 +{
25098 + u16_t i;
25099 +
25100 + for(i=0; i<4; i++)
25101 + {
25102 + *p++ = (u8_t) (value & 0xff);
25103 + value >>= 8;
25104 + }
25105 +}
25106 +
25107 +void zfMicClear(struct zsMicVar* pMic)
25108 +{
25109 + pMic->left = pMic->k0;
25110 + pMic->right = pMic->k1;
25111 + pMic->nBytes = 0;
25112 + pMic->m = 0;
25113 +}
25114 +
25115 +void zfMicSetKey(u8_t* key, struct zsMicVar* pMic)
25116 +{
25117 + pMic->k0 = zfGetU32t(key);
25118 + pMic->k1 = zfGetU32t(key+4);
25119 + zfMicClear(pMic);
25120 +}
25121 +
25122 +void zfMicAppendByte(u8_t b, struct zsMicVar* pMic)
25123 +{
25124 + // Append the byte to our word-sized buffer
25125 + pMic->m |= b << (8* pMic->nBytes);
25126 + pMic->nBytes++;
25127 +
25128 + // Process the word if it is full.
25129 + if ( pMic->nBytes >= 4 )
25130 + {
25131 + pMic->left ^= pMic->m;
25132 + pMic->right ^= ZM_ROL32(pMic->left, 17 );
25133 + pMic->left += pMic->right;
25134 + pMic->right ^= ((pMic->left & 0xff00ff00) >> 8) |
25135 + ((pMic->left & 0x00ff00ff) << 8);
25136 + pMic->left += pMic->right;
25137 + pMic->right ^= ZM_ROL32( pMic->left, 3 );
25138 + pMic->left += pMic->right;
25139 + pMic->right ^= ZM_ROR32( pMic->left, 2 );
25140 + pMic->left += pMic->right;
25141 + // Clear the buffer
25142 + pMic->m = 0;
25143 + pMic->nBytes = 0;
25144 + }
25145 +}
25146 +
25147 +void zfMicGetMic(u8_t* dst, struct zsMicVar* pMic)
25148 +{
25149 + // Append the minimum padding
25150 + zfMicAppendByte(0x5a, pMic);
25151 + zfMicAppendByte(0, pMic);
25152 + zfMicAppendByte(0, pMic);
25153 + zfMicAppendByte(0, pMic);
25154 + zfMicAppendByte(0, pMic);
25155 +
25156 + // and then zeroes until the length is a multiple of 4
25157 + while( pMic->nBytes != 0 )
25158 + {
25159 + zfMicAppendByte(0, pMic);
25160 + }
25161 +
25162 + // The appendByte function has already computed the result.
25163 + zfPutU32t(dst, pMic->left);
25164 + zfPutU32t(dst+4, pMic->right);
25165 +
25166 + // Reset to the empty message.
25167 + zfMicClear(pMic);
25168 +
25169 +}
25170 +
25171 +u8_t zfMicRxVerify(zdev_t* dev, zbuf_t* buf)
25172 +{
25173 + struct zsMicVar* pMicKey;
25174 + struct zsMicVar MyMicKey;
25175 + u8_t mic[8];
25176 + u8_t da[6];
25177 + u8_t sa[6];
25178 + u8_t bValue;
25179 + u16_t i, payloadOffset, tailOffset;
25180 +
25181 + zmw_get_wlan_dev(dev);
25182 +
25183 + /* need not check MIC if pMicKEy is equal to NULL */
25184 + if ( wd->wlanMode == ZM_MODE_AP )
25185 + {
25186 + pMicKey = zfApGetRxMicKey(dev, buf);
25187 +
25188 + if ( pMicKey != NULL )
25189 + {
25190 + zfCopyFromRxBuffer(dev, buf, sa, ZM_WLAN_HEADER_A2_OFFSET, 6);
25191 + zfCopyFromRxBuffer(dev, buf, da, ZM_WLAN_HEADER_A3_OFFSET, 6);
25192 + }
25193 + else
25194 + {
25195 + return ZM_MIC_SUCCESS;
25196 + }
25197 + }
25198 + else if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
25199 + {
25200 + pMicKey = zfStaGetRxMicKey(dev, buf);
25201 +
25202 + if ( pMicKey != NULL )
25203 + {
25204 + zfCopyFromRxBuffer(dev, buf, sa, ZM_WLAN_HEADER_A3_OFFSET, 6);
25205 + zfCopyFromRxBuffer(dev, buf, da, ZM_WLAN_HEADER_A1_OFFSET, 6);
25206 + }
25207 + else
25208 + {
25209 + return ZM_MIC_SUCCESS;
25210 + }
25211 + }
25212 + else
25213 + {
25214 + return ZM_MIC_SUCCESS;
25215 + }
25216 +
25217 + MyMicKey.k0=pMicKey->k0;
25218 + MyMicKey.k1=pMicKey->k1;
25219 + pMicKey = &MyMicKey;
25220 +
25221 + zfMicClear(pMicKey);
25222 + tailOffset = zfwBufGetSize(dev, buf);
25223 + tailOffset -= 8;
25224 +
25225 + /* append DA */
25226 + for(i=0; i<6; i++)
25227 + {
25228 + zfMicAppendByte(da[i], pMicKey);
25229 + }
25230 + /* append SA */
25231 + for(i=0; i<6; i++)
25232 + {
25233 + zfMicAppendByte(sa[i], pMicKey);
25234 + }
25235 +
25236 + /* append for alignment */
25237 + if ((zmw_rx_buf_readb(dev, buf, 0) & 0x80) != 0)
25238 + zfMicAppendByte(zmw_rx_buf_readb(dev, buf,24)&0x7, pMicKey);
25239 + else
25240 + zfMicAppendByte(0, pMicKey);
25241 + zfMicAppendByte(0, pMicKey);
25242 + zfMicAppendByte(0, pMicKey);
25243 + zfMicAppendByte(0, pMicKey);
25244 +
25245 + /* append payload */
25246 + payloadOffset = ZM_SIZE_OF_WLAN_DATA_HEADER +
25247 + ZM_SIZE_OF_IV +
25248 + ZM_SIZE_OF_EXT_IV;
25249 +
25250 + if ((zmw_rx_buf_readb(dev, buf, 0) & 0x80) != 0)
25251 + {
25252 + /* Qos Packet, Plcpheader + 2 */
25253 + if (wd->wlanMode == ZM_MODE_AP)
25254 + {
25255 + /* TODO : Rx Qos element offset in software MIC check */
25256 + }
25257 + else if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)
25258 + {
25259 + if (wd->sta.wmeConnected != 0)
25260 + {
25261 + payloadOffset += 2;
25262 + }
25263 + }
25264 + }
25265 +
25266 + for(i=payloadOffset; i<tailOffset; i++)
25267 + {
25268 + bValue = zmw_rx_buf_readb(dev, buf, i);
25269 + zfMicAppendByte(bValue, pMicKey);
25270 + }
25271 +
25272 + zfMicGetMic(mic, pMicKey);
25273 +
25274 + if ( !zfRxBufferEqualToStr(dev, buf, mic, tailOffset, 8) )
25275 + {
25276 + return ZM_MIC_FAILURE;
25277 + }
25278 +
25279 + return ZM_MIC_SUCCESS;
25280 +}
25281 +
25282 +void zfTkipGetseeds(u16_t iv16, u8_t *RC4Key, struct zsTkipSeed *Seed)
25283 +{
25284 + RC4Key[0] = ZM_HI8(iv16);
25285 + RC4Key[1] = (ZM_HI8(iv16) | 0x20) & 0x7f;
25286 + RC4Key[2] = ZM_LO8(iv16);
25287 + RC4Key[3] = ((Seed->ppk[5] ^ ZM_BYTE_TO_WORD(Seed->tk[1],Seed->tk[0]))>>1) & 0xff;
25288 + RC4Key[4] = Seed->ppk[0] & 0xff;
25289 + RC4Key[5] = Seed->ppk[0] >> 8;
25290 + RC4Key[6] = Seed->ppk[1] & 0xff;
25291 + RC4Key[7] = Seed->ppk[1] >> 8;
25292 + RC4Key[8] = Seed->ppk[2] & 0xff;
25293 + RC4Key[9] = Seed->ppk[2] >> 8;
25294 + RC4Key[10] = Seed->ppk[3] & 0xff;
25295 + RC4Key[11] = Seed->ppk[3] >> 8;
25296 + RC4Key[12] = Seed->ppk[4] & 0xff;
25297 + RC4Key[13] = Seed->ppk[4] >> 8;
25298 + RC4Key[14] = Seed->ppk[5] & 0xff;
25299 + RC4Key[15] = Seed->ppk[5] >> 8;
25300 +}
25301 +
25302 +void zfCalTxMic(zdev_t *dev, zbuf_t *buf, u8_t *snap, u16_t snapLen, u16_t offset, u16_t *da, u16_t *sa, u8_t up, u8_t *mic)
25303 +{
25304 + struct zsMicVar* pMicKey;
25305 + u16_t i;
25306 + u16_t len;
25307 + u8_t bValue;
25308 + u8_t qosType;
25309 + u8_t *pDa = (u8_t *)da;
25310 + u8_t *pSa = (u8_t *)sa;
25311 +
25312 + zmw_get_wlan_dev(dev);
25313 +
25314 + /* need not check MIC if pMicKEy is equal to NULL */
25315 + if ( wd->wlanMode == ZM_MODE_AP )
25316 + {
25317 + pMicKey = zfApGetTxMicKey(dev, buf, &qosType);
25318 +
25319 + if ( pMicKey == NULL )
25320 + return;
25321 + }
25322 + else if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
25323 + {
25324 + pMicKey = zfStaGetTxMicKey(dev, buf);
25325 +
25326 + if ( pMicKey == NULL )
25327 + {
25328 + zm_debug_msg0("pMicKey is NULL");
25329 + return;
25330 + }
25331 + }
25332 + else
25333 + {
25334 + return;
25335 + }
25336 +
25337 + zfMicClear(pMicKey);
25338 + len = zfwBufGetSize(dev, buf);
25339 +
25340 + /* append DA */
25341 + for(i = 0; i < 6; i++)
25342 + {
25343 + zfMicAppendByte(pDa[i], pMicKey);
25344 + }
25345 +
25346 + /* append SA */
25347 + for(i = 0; i < 6; i++)
25348 + {
25349 + zfMicAppendByte(pSa[i], pMicKey);
25350 + }
25351 +
25352 + if (up != 0)
25353 + zfMicAppendByte((up&0x7), pMicKey);
25354 + else
25355 + zfMicAppendByte(0, pMicKey);
25356 +
25357 + zfMicAppendByte(0, pMicKey);
25358 + zfMicAppendByte(0, pMicKey);
25359 + zfMicAppendByte(0, pMicKey);
25360 +
25361 + /* For Snap header */
25362 + for(i = 0; i < snapLen; i++)
25363 + {
25364 + zfMicAppendByte(snap[i], pMicKey);
25365 + }
25366 +
25367 + for(i = offset; i < len; i++)
25368 + {
25369 + bValue = zmw_tx_buf_readb(dev, buf, i);
25370 + zfMicAppendByte(bValue, pMicKey);
25371 + }
25372 +
25373 + zfMicGetMic(mic, pMicKey);
25374 +}
25375 +
25376 +void zfTKIPEncrypt(zdev_t *dev, zbuf_t *buf, u8_t *snap, u16_t snapLen, u16_t offset, u8_t keyLen, u8_t* key, u32_t* icv)
25377 +{
25378 + u8_t iv[3];
25379 +
25380 + iv[0] = key[0];
25381 + iv[1] = key[1];
25382 + iv[2] = key[2];
25383 +
25384 + keyLen -= 3;
25385 +
25386 + zfWEPEncrypt(dev, buf, snap, snapLen, offset, keyLen, &key[3], iv);
25387 +}
25388 +
25389 +u16_t zfTKIPDecrypt(zdev_t *dev, zbuf_t *buf, u16_t offset, u8_t keyLen, u8_t* key)
25390 +{
25391 + u16_t ret = ZM_ICV_SUCCESS;
25392 + u8_t iv[3];
25393 +
25394 + iv[0] = key[0];
25395 + iv[1] = key[1];
25396 + iv[2] = key[2];
25397 +
25398 + keyLen -= 3;
25399 +
25400 + ret = zfWEPDecrypt(dev, buf, offset, keyLen, &key[3], iv);
25401 +
25402 + return ret;
25403 +}
25404 --- /dev/null
25405 +++ b/drivers/staging/otus/80211core/ctxrx.c
25406 @@ -0,0 +1,4096 @@
25407 +/*
25408 + * Copyright (c) 2007-2008 Atheros Communications Inc.
25409 + *
25410 + * Permission to use, copy, modify, and/or distribute this software for any
25411 + * purpose with or without fee is hereby granted, provided that the above
25412 + * copyright notice and this permission notice appear in all copies.
25413 + *
25414 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
25415 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
25416 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
25417 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
25418 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
25419 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
25420 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
25421 + */
25422 +/* */
25423 +/* Module Name : htr.c */
25424 +/* */
25425 +/* Abstract */
25426 +/* This module contains Tx and Rx functions. */
25427 +/* */
25428 +/* NOTES */
25429 +/* None */
25430 +/* */
25431 +/************************************************************************/
25432 +#include "cprecomp.h"
25433 +
25434 +u16_t zfWlanRxValidate(zdev_t* dev, zbuf_t* buf);
25435 +u16_t zfWlanRxFilter(zdev_t* dev, zbuf_t* buf);
25436 +
25437 +
25438 +
25439 +const u8_t zgSnapBridgeTunnel[6] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8 };
25440 +const u8_t zgSnap8021h[6] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00 };
25441 +/* Table for converting IP DSCP P2-P0 bits to 802.11e Access Category */
25442 +const u8_t zcUpToAc[8] = {0, 1, 1, 0, 2, 2, 3, 3}; //WMM default
25443 +//const u8_t zcUpToAc[8] = {0, 1, 1, 0, 0, 0, 0, 0}; //For 2 TxQ
25444 +//const u8_t zcUpToAc[8] = {0, 0, 0, 0, 0, 0, 0, 0}; //For single TxQ
25445 +const u8_t zcMaxspToPktNum[4] = {8, 2, 4, 6};
25446 +
25447 +u8_t zfGetEncryModeFromRxStatus(struct zsAdditionInfo* addInfo)
25448 +{
25449 + u8_t securityByte;
25450 + u8_t encryMode;
25451 +
25452 + securityByte = (addInfo->Tail.Data.SAIndex & 0xc0) >> 4; /* byte4 */
25453 + securityByte |= (addInfo->Tail.Data.DAIndex & 0xc0) >> 6; /* byte5 */
25454 +
25455 + switch( securityByte )
25456 + {
25457 + case ZM_NO_WEP:
25458 + case ZM_WEP64:
25459 + case ZM_WEP128:
25460 + case ZM_WEP256:
25461 +#ifdef ZM_ENABLE_CENC
25462 + case ZM_CENC:
25463 +#endif //ZM_ENABLE_CENC
25464 + case ZM_TKIP:
25465 + case ZM_AES:
25466 +
25467 + encryMode = securityByte;
25468 + break;
25469 +
25470 + default:
25471 +
25472 + if ( (securityByte & 0xf8) == 0x08 )
25473 + {
25474 + // decrypted by software
25475 + }
25476 +
25477 + encryMode = ZM_NO_WEP;
25478 + break;
25479 + }
25480 +
25481 + return encryMode;
25482 +}
25483 +
25484 +void zfGetRxIvIcvLength(zdev_t* dev, zbuf_t* buf, u8_t vap, u16_t* pIvLen,
25485 + u16_t* pIcvLen, struct zsAdditionInfo* addInfo)
25486 +{
25487 + u16_t wdsPort;
25488 + u8_t encryMode;
25489 +
25490 + zmw_get_wlan_dev(dev);
25491 +
25492 + *pIvLen = 0;
25493 + *pIcvLen = 0;
25494 +
25495 + encryMode = zfGetEncryModeFromRxStatus(addInfo);
25496 +
25497 + if ( wd->wlanMode == ZM_MODE_AP )
25498 + {
25499 + if (vap < ZM_MAX_AP_SUPPORT)
25500 + {
25501 + if (( wd->ap.encryMode[vap] == ZM_WEP64 ) ||
25502 + ( wd->ap.encryMode[vap] == ZM_WEP128 ) ||
25503 + ( wd->ap.encryMode[vap] == ZM_WEP256 ))
25504 + {
25505 + *pIvLen = 4;
25506 + *pIcvLen = 4;
25507 + }
25508 + else
25509 + {
25510 + u16_t id;
25511 + u16_t addr[3];
25512 +
25513 + addr[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET);
25514 + addr[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+2);
25515 + addr[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+4);
25516 +
25517 + /* Find STA's information */
25518 + if ((id = zfApFindSta(dev, addr)) != 0xffff)
25519 + {
25520 + if (wd->ap.staTable[id].encryMode == ZM_TKIP)
25521 + {
25522 + *pIvLen = 8;
25523 + *pIcvLen = 4;
25524 + }
25525 + else if (wd->ap.staTable[id].encryMode == ZM_AES)
25526 + {
25527 + *pIvLen = 8;
25528 + *pIcvLen = 8; // AES MIC
25529 + //*pIcvLen = 0;
25530 + }
25531 +#ifdef ZM_ENABLE_CENC
25532 + else if (wd->ap.staTable[id].encryMode == ZM_CENC)
25533 + {
25534 + *pIvLen = 18;
25535 + *pIcvLen= 16;
25536 + }
25537 +#endif //ZM_ENABLE_CENC
25538 + }
25539 + }
25540 + /* WDS port checking */
25541 + if ((wdsPort = vap - 0x20) >= ZM_MAX_WDS_SUPPORT)
25542 + {
25543 + wdsPort = 0;
25544 + }
25545 +
25546 + switch (wd->ap.wds.encryMode[wdsPort])
25547 + {
25548 + case ZM_WEP64:
25549 + case ZM_WEP128:
25550 + case ZM_WEP256:
25551 + *pIvLen = 4;
25552 + *pIcvLen = 4;
25553 + break;
25554 + case ZM_TKIP:
25555 + *pIvLen = 8;
25556 + *pIcvLen = 4;
25557 + break;
25558 + case ZM_AES:
25559 + *pIvLen = 8;
25560 + *pIcvLen = 0;
25561 + break;
25562 +#ifdef ZM_ENABLE_CENC
25563 + case ZM_CENC:
25564 + *pIvLen = 18;
25565 + *pIcvLen = 16;
25566 + break;
25567 +#endif //ZM_ENABLE_CENC
25568 + }/* end of switch */
25569 + }
25570 + }
25571 + else if ( wd->wlanMode == ZM_MODE_PSEUDO)
25572 + {
25573 + /* test: 6518 for QA auto test */
25574 + switch (encryMode)
25575 + {
25576 + case ZM_WEP64:
25577 + case ZM_WEP128:
25578 + case ZM_WEP256:
25579 + *pIvLen = 4;
25580 + *pIcvLen = 4;
25581 + break;
25582 + case ZM_TKIP:
25583 + *pIvLen = 8;
25584 + *pIcvLen = 4;
25585 + break;
25586 + case ZM_AES:
25587 + *pIvLen = 8;
25588 + *pIcvLen = 0;
25589 + break;
25590 +#ifdef ZM_ENABLE_CENC
25591 + case ZM_CENC:
25592 + *pIvLen = 18;
25593 + *pIcvLen = 16;
25594 +#endif //ZM_ENABLE_CENC
25595 + }/* end of switch */
25596 + }
25597 + else
25598 + {
25599 + if ( (encryMode == ZM_WEP64)||
25600 + (encryMode == ZM_WEP128)||
25601 + (encryMode == ZM_WEP256) )
25602 + {
25603 + *pIvLen = 4;
25604 + *pIcvLen = 4;
25605 + }
25606 + else if ( encryMode == ZM_TKIP )
25607 + {
25608 + *pIvLen = 8;
25609 + *pIcvLen = 4;
25610 + }
25611 + else if ( encryMode == ZM_AES )
25612 + {
25613 + *pIvLen = 8;
25614 + *pIcvLen = 8; // AES MIC
25615 + }
25616 +#ifdef ZM_ENABLE_CENC
25617 + else if ( encryMode == ZM_CENC)
25618 + {
25619 + *pIvLen = 18;
25620 + *pIcvLen= 16;
25621 + }
25622 +#endif //ZM_ENABLE_CENC
25623 + }
25624 +}
25625 +
25626 +
25627 +/************************************************************************/
25628 +/* */
25629 +/* FUNCTION DESCRIPTION zfAgingDefragList */
25630 +/* Force flushing whole defrag list or aging the buffer */
25631 +/* in the defrag list. */
25632 +/* */
25633 +/* INPUTS */
25634 +/* dev : device pointer */
25635 +/* flushFlag : 1=>flushing, 0=>Aging */
25636 +/* */
25637 +/* OUTPUTS */
25638 +/* None */
25639 +/* */
25640 +/* AUTHOR */
25641 +/* Stephen Chen Atheros Communications, INC. 2007.1 */
25642 +/* */
25643 +/************************************************************************/
25644 +void zfAgingDefragList(zdev_t* dev, u16_t flushFlag)
25645 +{
25646 + u16_t i, j;
25647 + zmw_get_wlan_dev(dev);
25648 + zmw_declare_for_critical_section();
25649 +
25650 + zmw_enter_critical_section(dev);
25651 +
25652 + for(i=0; i<ZM_MAX_DEFRAG_ENTRIES; i++)
25653 + {
25654 + if (wd->defragTable.defragEntry[i].fragCount != 0 )
25655 + {
25656 + if (((wd->tick - wd->defragTable.defragEntry[i].tick) >
25657 + (ZM_DEFRAG_AGING_TIME_SEC * ZM_TICK_PER_SECOND))
25658 + || (flushFlag != 0))
25659 + {
25660 + zm_msg1_rx(ZM_LV_2, "Aging defrag list :", i);
25661 + /* Free the buffers in the defrag list */
25662 + for (j=0; j<wd->defragTable.defragEntry[i].fragCount; j++)
25663 + {
25664 + zfwBufFree(dev, wd->defragTable.defragEntry[i].fragment[j], 0);
25665 + }
25666 + }
25667 + }
25668 + wd->defragTable.defragEntry[i].fragCount = 0;
25669 + }
25670 +
25671 + zmw_leave_critical_section(dev);
25672 +
25673 + return;
25674 +}
25675 +
25676 +
25677 +/************************************************************************/
25678 +/* */
25679 +/* FUNCTION DESCRIPTION zfAddFirstFragToDefragList */
25680 +/* Add first fragment to defragment list, the first empty entry */
25681 +/* will be selected. If the list is full, sequentially select */
25682 +/* one entry for replacement. */
25683 +/* */
25684 +/* INPUTS */
25685 +/* dev : device pointer */
25686 +/* buf : first fragment buffer */
25687 +/* addr : address of first fragment buffer */
25688 +/* seqNum : sequence of first fragment buffer */
25689 +/* */
25690 +/* OUTPUTS */
25691 +/* None */
25692 +/* */
25693 +/* AUTHOR */
25694 +/* Stephen Chen Atheros Communications, INC. 2007.1 */
25695 +/* */
25696 +/************************************************************************/
25697 +void zfAddFirstFragToDefragList(zdev_t* dev, zbuf_t* buf, u8_t* addr, u16_t seqNum)
25698 +{
25699 + u16_t i, j;
25700 + zmw_get_wlan_dev(dev);
25701 + zmw_declare_for_critical_section();
25702 +
25703 + zmw_enter_critical_section(dev);
25704 +
25705 + /* Find an empty one in defrag list */
25706 + for(i=0; i<ZM_MAX_DEFRAG_ENTRIES; i++)
25707 + {
25708 + if ( wd->defragTable.defragEntry[i].fragCount == 0 )
25709 + {
25710 + break;
25711 + }
25712 + }
25713 +
25714 + /* If full, sequentially replace existing one */
25715 + if (i == ZM_MAX_DEFRAG_ENTRIES)
25716 + {
25717 + i = wd->defragTable.replaceNum++ & (ZM_MAX_DEFRAG_ENTRIES-1);
25718 + /* Free the buffers in the defrag list to be replaced */
25719 + for (j=0; j<wd->defragTable.defragEntry[i].fragCount; j++)
25720 + {
25721 + zfwBufFree(dev, wd->defragTable.defragEntry[i].fragment[j], 0);
25722 + }
25723 + }
25724 +
25725 + wd->defragTable.defragEntry[i].fragCount = 1;
25726 + wd->defragTable.defragEntry[i].fragment[0] = buf;
25727 + wd->defragTable.defragEntry[i].seqNum = seqNum;
25728 + wd->defragTable.defragEntry[i].tick = wd->tick;
25729 +
25730 + for (j=0; j<6; j++)
25731 + {
25732 + wd->defragTable.defragEntry[i].addr[j] = addr[j];
25733 + }
25734 +
25735 + zmw_leave_critical_section(dev);
25736 +
25737 + return;
25738 +}
25739 +
25740 +
25741 +/************************************************************************/
25742 +/* */
25743 +/* FUNCTION DESCRIPTION zfAddFragToDefragList */
25744 +/* Add middle or last fragment to defragment list. */
25745 +/* */
25746 +/* INPUTS */
25747 +/* dev : device pointer */
25748 +/* buf : first fragment buffer */
25749 +/* addr : address of fragment buffer */
25750 +/* seqNum : sequence fragment buffer */
25751 +/* fragNum : fragment number of fragment buffer */
25752 +/* moreFrag : more frag bit of fragment buffer */
25753 +/* addInfo : addition info of fragment buffer */
25754 +/* */
25755 +/* OUTPUTS */
25756 +/* None */
25757 +/* */
25758 +/* AUTHOR */
25759 +/* Stephen Chen Atheros Communications, INC. 2007.1 */
25760 +/* */
25761 +/************************************************************************/
25762 +zbuf_t* zfAddFragToDefragList(zdev_t* dev, zbuf_t* buf, u8_t* addr,
25763 + u16_t seqNum, u8_t fragNum, u8_t moreFrag,
25764 + struct zsAdditionInfo* addInfo)
25765 +{
25766 + u16_t i, j, k;
25767 + zbuf_t* returnBuf = NULL;
25768 + u16_t defragDone = 0;
25769 + u16_t lenErr = 0;
25770 + u16_t startAddr, fragHead, frameLen, ivLen, icvLen;
25771 + zmw_get_wlan_dev(dev);
25772 + zmw_declare_for_critical_section();
25773 +
25774 + zmw_enter_critical_section(dev);
25775 +
25776 + /* Find frag in the defrag list */
25777 + for(i=0; i<ZM_MAX_DEFRAG_ENTRIES; i++)
25778 + {
25779 + if ( wd->defragTable.defragEntry[i].fragCount != 0 )
25780 + {
25781 + /* Compare address */
25782 + for (j=0; j<6; j++)
25783 + {
25784 + if (addr[j] != wd->defragTable.defragEntry[i].addr[j])
25785 + {
25786 + break;
25787 + }
25788 + }
25789 + if (j == 6)
25790 + {
25791 + /* Compare sequence and fragment number */
25792 + if (seqNum == wd->defragTable.defragEntry[i].seqNum)
25793 + {
25794 + if ((fragNum == wd->defragTable.defragEntry[i].fragCount)
25795 + && (fragNum < 8))
25796 + {
25797 + /* Add frag frame to defrag list */
25798 + wd->defragTable.defragEntry[i].fragment[fragNum] = buf;
25799 + wd->defragTable.defragEntry[i].fragCount++;
25800 + defragDone = 1;
25801 +
25802 + if (moreFrag == 0)
25803 + {
25804 + /* merge all fragment if more data bit is cleared */
25805 + returnBuf = wd->defragTable.defragEntry[i].fragment[0];
25806 + startAddr = zfwBufGetSize(dev, returnBuf);
25807 + /* skip WLAN header 24(Data) or 26(QoS Data) */
25808 + fragHead = 24 + ((zmw_rx_buf_readh(dev, returnBuf, 0) & 0x80) >> 6);
25809 + zfGetRxIvIcvLength(dev, returnBuf, 0, &ivLen, &icvLen, addInfo);
25810 + fragHead += ivLen; /* skip IV */
25811 + for(k=1; k<wd->defragTable.defragEntry[i].fragCount; k++)
25812 + {
25813 + frameLen = zfwBufGetSize(dev,
25814 + wd->defragTable.defragEntry[i].fragment[k]);
25815 + if ((startAddr+frameLen-fragHead) < 1560)
25816 + {
25817 + zfRxBufferCopy(dev, returnBuf, wd->defragTable.defragEntry[i].fragment[k],
25818 + startAddr, fragHead, frameLen-fragHead);
25819 + startAddr += (frameLen-fragHead);
25820 + }
25821 + else
25822 + {
25823 + lenErr = 1;
25824 + }
25825 + zfwBufFree(dev, wd->defragTable.defragEntry[i].fragment[k], 0);
25826 + }
25827 +
25828 + wd->defragTable.defragEntry[i].fragCount = 0;
25829 + zfwBufSetSize(dev, returnBuf, startAddr);
25830 + }
25831 + break;
25832 + }
25833 + }
25834 + }
25835 + }
25836 + }
25837 +
25838 + zmw_leave_critical_section(dev);
25839 +
25840 + if (lenErr == 1)
25841 + {
25842 + zfwBufFree(dev, returnBuf, 0);
25843 + return NULL;
25844 + }
25845 + if (defragDone == 0)
25846 + {
25847 + zfwBufFree(dev, buf, 0);
25848 + return NULL;
25849 + }
25850 +
25851 + return returnBuf;
25852 +}
25853 +
25854 +
25855 +/* return value = NULL => save or free this frame */
25856 +zbuf_t* zfDefragment(zdev_t* dev, zbuf_t* buf, u8_t* pbIsDefrag,
25857 + struct zsAdditionInfo* addInfo)
25858 +{
25859 + u8_t fragNum;
25860 + u16_t seqNum;
25861 + u8_t moreFragBit;
25862 + u8_t addr[6];
25863 + u16_t i;
25864 + zmw_get_wlan_dev(dev);
25865 +
25866 + ZM_BUFFER_TRACE(dev, buf)
25867 +
25868 + *pbIsDefrag = FALSE;
25869 + seqNum = zmw_buf_readh(dev, buf, 22);
25870 + fragNum = (u8_t)(seqNum & 0xf);
25871 + moreFragBit = (zmw_buf_readb(dev, buf, 1) & ZM_BIT_2) >> 2;
25872 +
25873 + if ((fragNum == 0) && (moreFragBit == 0))
25874 + {
25875 + /* Not part of a fragmentation */
25876 +
25877 + return buf;
25878 + }
25879 + else
25880 + {
25881 + wd->commTally.swRxFragmentCount++;
25882 + seqNum = seqNum >> 4;
25883 + for (i=0; i<6; i++)
25884 + {
25885 + addr[i] = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+i);
25886 + }
25887 +
25888 + if (fragNum == 0)
25889 + {
25890 + /* more frag = 1 */
25891 + /* First part of a fragmentation */
25892 + zm_msg1_rx(ZM_LV_2, "First Frag, seq=", seqNum);
25893 + zfAddFirstFragToDefragList(dev, buf, addr, seqNum);
25894 + buf = NULL;
25895 + }
25896 + else
25897 + {
25898 + /* Middle or last part of a fragmentation */
25899 + zm_msg1_rx(ZM_LV_2, "Frag seq=", seqNum);
25900 + zm_msg1_rx(ZM_LV_2, "Frag moreFragBit=", moreFragBit);
25901 + buf = zfAddFragToDefragList(dev, buf, addr, seqNum, fragNum, moreFragBit, addInfo);
25902 + if (buf != NULL)
25903 + {
25904 + *pbIsDefrag = TRUE;
25905 + }
25906 + }
25907 + }
25908 +
25909 + return buf;
25910 +}
25911 +
25912 +
25913 +#if ZM_PROTOCOL_RESPONSE_SIMULATION
25914 +u16_t zfSwap(u16_t num)
25915 +{
25916 + return ((num >> 8) + ((num & 0xff) << 8));
25917 +}
25918 +
25919 +
25920 +void zfProtRspSim(zdev_t* dev, zbuf_t* buf)
25921 +{
25922 + u16_t ethType;
25923 + u16_t arpOp;
25924 + u16_t prot;
25925 + u16_t temp;
25926 + u16_t i;
25927 + u16_t dip[2];
25928 + u16_t dstPort;
25929 + u16_t srcPort;
25930 +
25931 + ethType = zmw_rx_buf_readh(dev, buf, 12);
25932 + zm_msg2_rx(ZM_LV_2, "ethType=", ethType);
25933 +
25934 + /* ARP */
25935 + if (ethType == 0x0608)
25936 + {
25937 + arpOp = zmw_rx_buf_readh(dev, buf, 20);
25938 + dip[0] = zmw_rx_buf_readh(dev, buf, 38);
25939 + dip[1] = zmw_rx_buf_readh(dev, buf, 40);
25940 + zm_msg2_rx(ZM_LV_2, "arpOp=", arpOp);
25941 + zm_msg2_rx(ZM_LV_2, "ip0=", dip[0]);
25942 + zm_msg2_rx(ZM_LV_2, "ip1=", dip[1]);
25943 +
25944 + //ARP request to 192.168.1.15
25945 + if ((arpOp == 0x0100) && (dip[0] == 0xa8c0) && (dip[1] == 0x0f01));
25946 + {
25947 + zm_msg0_rx(ZM_LV_2, "ARP");
25948 + /* ARP response */
25949 + zmw_rx_buf_writeh(dev, buf, 20, 0x0200);
25950 +
25951 + /* dst hardware address */
25952 +
25953 + /* src hardware address */
25954 + //zmw_rx_buf_writeh(dev, buf, 6, 0xa000);
25955 + //zmw_rx_buf_writeh(dev, buf, 8, 0x0000);
25956 + //zmw_rx_buf_writeh(dev, buf, 10, 0x0000);
25957 +
25958 + /* dst ip address */
25959 + for (i=0; i<5; i++)
25960 + {
25961 + temp = zmw_rx_buf_readh(dev, buf, 22+(i*2));
25962 + zmw_rx_buf_writeh(dev, buf, 32+(i*2), temp);
25963 + }
25964 +
25965 + /* src hardware address */
25966 + zmw_rx_buf_writeh(dev, buf, 22, 0xa000);
25967 + zmw_rx_buf_writeh(dev, buf, 24, 0x0000);
25968 + zmw_rx_buf_writeh(dev, buf, 26, 0x0000);
25969 +
25970 + /* src ip address */
25971 + zmw_rx_buf_writeh(dev, buf, 28, 0xa8c0);
25972 + zmw_rx_buf_writeh(dev, buf, 30, 0x0f01);
25973 + }
25974 + }
25975 + /* ICMP */
25976 + else if (ethType == 0x0008)
25977 + {
25978 + zm_msg0_rx(ZM_LV_2, "IP");
25979 + prot = zmw_rx_buf_readb(dev, buf, 23);
25980 + dip[0] = zmw_rx_buf_readh(dev, buf, 30);
25981 + dip[1] = zmw_rx_buf_readh(dev, buf, 32);
25982 + zm_msg2_rx(ZM_LV_2, "prot=", prot);
25983 + zm_msg2_rx(ZM_LV_2, "ip0=", dip[0]);
25984 + zm_msg2_rx(ZM_LV_2, "ip1=", dip[1]);
25985 +
25986 + /* PING request to 192.168.1.15 */
25987 + if ((prot == 0x1) && (dip[0] == 0xa8c0) && (dip[1] == 0x0f01))
25988 + {
25989 + zm_msg0_rx(ZM_LV_2, "ICMP");
25990 + /* change dst */
25991 + for (i=0; i<3; i++)
25992 + {
25993 + temp = zmw_rx_buf_readh(dev, buf, 6+(i*2));
25994 + zmw_rx_buf_writeh(dev, buf, i*2, temp);
25995 + }
25996 + /* change src */
25997 + zmw_rx_buf_writeh(dev, buf, 6, 0xa000);
25998 + zmw_rx_buf_writeh(dev, buf, 8, 0x0000);
25999 + zmw_rx_buf_writeh(dev, buf, 10, 0x0000);
26000 +
26001 + /* exchange src ip and dst ip */
26002 + for (i=0; i<2; i++)
26003 + {
26004 + temp = zmw_rx_buf_readh(dev, buf, 26+(i*2));
26005 + zmw_rx_buf_writeh(dev, buf, 30+(i*2), temp);
26006 + }
26007 + zmw_rx_buf_writeh(dev, buf, 26, 0xa8c0);
26008 + zmw_rx_buf_writeh(dev, buf, 28, 0x0f01);
26009 +
26010 + /* change icmp type to echo reply */
26011 + zmw_rx_buf_writeb(dev, buf, 34, 0x0);
26012 +
26013 + /* update icmp checksum */
26014 + temp = zmw_rx_buf_readh(dev, buf, 36);
26015 + temp += 8;
26016 + zmw_rx_buf_writeh(dev, buf, 36, temp);
26017 + }
26018 + else if (prot == 0x6)
26019 + {
26020 + zm_msg0_rx(ZM_LV_2, "TCP");
26021 + srcPort = zmw_rx_buf_readh(dev, buf, 34);
26022 + dstPort = zmw_rx_buf_readh(dev, buf, 36);
26023 + zm_msg2_rx(ZM_LV_2, "Src Port=", srcPort);
26024 + zm_msg2_rx(ZM_LV_2, "Dst Port=", dstPort);
26025 + if ((dstPort == 0x1500) || (srcPort == 0x1500))
26026 + {
26027 + zm_msg0_rx(ZM_LV_2, "FTP");
26028 +
26029 + /* change dst */
26030 + for (i=0; i<3; i++)
26031 + {
26032 + temp = zmw_rx_buf_readh(dev, buf, 6+(i*2));
26033 + zmw_rx_buf_writeh(dev, buf, i*2, temp);
26034 + }
26035 + /* change src */
26036 + zmw_rx_buf_writeh(dev, buf, 6, 0xa000);
26037 + zmw_rx_buf_writeh(dev, buf, 8, 0x0000);
26038 + zmw_rx_buf_writeh(dev, buf, 10, 0x0000);
26039 +
26040 + /* exchange src ip and dst ip */
26041 + for (i=0; i<2; i++)
26042 + {
26043 + temp = zmw_rx_buf_readh(dev, buf, 26+(i*2));
26044 + zmw_rx_buf_writeh(dev, buf, 30+(i*2), temp);
26045 + }
26046 + zmw_rx_buf_writeh(dev, buf, 26, 0xa8c0);
26047 + zmw_rx_buf_writeh(dev, buf, 28, 0x0f01);
26048 +#if 0
26049 + /* Patch src port */
26050 + temp = zmw_rx_buf_readh(dev, buf, 34);
26051 + temp = zfSwap(zfSwap(temp) + 1);
26052 + zmw_rx_buf_writeh(dev, buf, 34, temp);
26053 + temp = zmw_rx_buf_readh(dev, buf, 38);
26054 + temp = zfSwap(zfSwap(temp) + 1);
26055 + zmw_rx_buf_writeh(dev, buf, 38, temp);
26056 +
26057 + /* Patch checksum */
26058 + temp = zmw_rx_buf_readh(dev, buf, 50);
26059 + temp = zfSwap(temp);
26060 + temp = ~temp;
26061 + temp += 2;
26062 + temp = ~temp;
26063 + temp = zfSwap(temp);
26064 + zmw_rx_buf_writeh(dev, buf, 50, temp);
26065 +#endif
26066 + }
26067 +
26068 + }
26069 + else if (prot == 0x11)
26070 + {
26071 + /* change dst */
26072 + for (i=0; i<3; i++)
26073 + {
26074 + temp = zmw_rx_buf_readh(dev, buf, 6+(i*2));
26075 + zmw_rx_buf_writeh(dev, buf, i*2, temp);
26076 + }
26077 + /* change src */
26078 + zmw_rx_buf_writeh(dev, buf, 6, 0xa000);
26079 + zmw_rx_buf_writeh(dev, buf, 8, 0x0000);
26080 + zmw_rx_buf_writeh(dev, buf, 10, 0x0000);
26081 +
26082 + zm_msg0_rx(ZM_LV_2, "UDP");
26083 + srcPort = zmw_rx_buf_readh(dev, buf, 34);
26084 + dstPort = zmw_rx_buf_readh(dev, buf, 36);
26085 + zm_msg2_rx(ZM_LV_2, "Src Port=", srcPort);
26086 + zm_msg2_rx(ZM_LV_2, "Dst Port=", dstPort);
26087 +
26088 + /* exchange src ip and dst ip */
26089 + for (i=0; i<2; i++)
26090 + {
26091 + temp = zmw_rx_buf_readh(dev, buf, 26+(i*2));
26092 + zmw_rx_buf_writeh(dev, buf, 30+(i*2), temp);
26093 + }
26094 + zmw_rx_buf_writeh(dev, buf, 26, 0xa8c0);
26095 + zmw_rx_buf_writeh(dev, buf, 28, 0x0f01);
26096 +
26097 + /* exchange port */
26098 + zmw_rx_buf_writeh(dev, buf, 34, srcPort+1);
26099 + zmw_rx_buf_writeh(dev, buf, 36, dstPort);
26100 +
26101 + /* checksum = 0 */
26102 + zmw_rx_buf_writeh(dev, buf, 40, 0);
26103 + }
26104 +
26105 + }
26106 + else if (ethType == 0x0060) /* =>0x0060 is port */
26107 + {
26108 + /* change src for Evl tool loop back receive */
26109 + zmw_rx_buf_writeh(dev, buf, 6, 0xa000);
26110 + zmw_rx_buf_writeh(dev, buf, 8, 0x0000);
26111 + zmw_rx_buf_writeh(dev, buf, 10, 0x0000);
26112 + }
26113 +
26114 +}
26115 +#endif
26116 +
26117 +/************************************************************************/
26118 +/* */
26119 +/* FUNCTION DESCRIPTION zfiTxSendEth */
26120 +/* Called to native 802.11 management frames */
26121 +/* */
26122 +/* INPUTS */
26123 +/* dev : device pointer */
26124 +/* buf : buffer pointer */
26125 +/* port : WLAN port, 0=>standard, 0x1-0x7=>VAP, 0x20-0x25=>WDS */
26126 +/* */
26127 +/* OUTPUTS */
26128 +/* error code */
26129 +/* */
26130 +/* AUTHOR */
26131 +/* Ray ZyDAS Technology Corporation 2005.5 */
26132 +/* */
26133 +/************************************************************************/
26134 +u16_t zfiTxSend80211Mgmt(zdev_t* dev, zbuf_t* buf, u16_t port)
26135 +{
26136 + u16_t err;
26137 + //u16_t addrTblSize = 0;
26138 + //struct zsAddrTbl addrTbl;
26139 + u16_t hlen;
26140 + u16_t header[(24+25+1)/2];
26141 + int i;
26142 +
26143 + for(i=0;i<12;i++)
26144 + {
26145 + header[i] = zmw_buf_readh(dev, buf, i);
26146 + }
26147 + hlen = 24;
26148 +
26149 + zfwBufRemoveHead(dev, buf, 24);
26150 +
26151 + if ((err = zfHpSend(dev, header, hlen, NULL, 0, NULL, 0, buf, 0,
26152 + ZM_EXTERNAL_ALLOC_BUF, 0, 0)) != ZM_SUCCESS)
26153 + {
26154 + goto zlError;
26155 + }
26156 +
26157 + return 0;
26158 +
26159 +zlError:
26160 +
26161 + zfwBufFree(dev, buf, 0);
26162 + return 0;
26163 +}
26164 +
26165 +u8_t zfiIsTxQueueFull(zdev_t* dev)
26166 +{
26167 + zmw_get_wlan_dev(dev);
26168 + zmw_declare_for_critical_section();
26169 +
26170 + zmw_enter_critical_section(dev);
26171 + if ((((wd->vtxqHead[0] + 1) & ZM_VTXQ_SIZE_MASK) != wd->vtxqTail[0]) )
26172 + {
26173 + zmw_leave_critical_section(dev);
26174 + return 0;
26175 + }
26176 + else
26177 + {
26178 + zmw_leave_critical_section(dev);
26179 + return 1;
26180 + }
26181 +}
26182 +
26183 +/************************************************************************/
26184 +/* */
26185 +/* FUNCTION DESCRIPTION zfiTxSendEth */
26186 +/* Called to transmit Ethernet frame from upper layer. */
26187 +/* */
26188 +/* INPUTS */
26189 +/* dev : device pointer */
26190 +/* buf : buffer pointer */
26191 +/* port : WLAN port, 0=>standard, 0x1-0x7=>VAP, 0x20-0x25=>WDS */
26192 +/* */
26193 +/* OUTPUTS */
26194 +/* error code */
26195 +/* */
26196 +/* AUTHOR */
26197 +/* Stephen ZyDAS Technology Corporation 2005.5 */
26198 +/* */
26199 +/************************************************************************/
26200 +u16_t zfiTxSendEth(zdev_t* dev, zbuf_t* buf, u16_t port)
26201 +{
26202 + u16_t err, ret;
26203 +
26204 + zmw_get_wlan_dev(dev);
26205 +
26206 + ZM_PERFORMANCE_TX_MSDU(dev, wd->tick);
26207 + zm_msg1_tx(ZM_LV_2, "zfiTxSendEth(), port=", port);
26208 + /* Return error if port is disabled */
26209 + if ((err = zfTxPortControl(dev, buf, port)) == ZM_PORT_DISABLED)
26210 + {
26211 + err = ZM_ERR_TX_PORT_DISABLED;
26212 + goto zlError;
26213 + }
26214 +
26215 +#if 1
26216 + if ((wd->wlanMode == ZM_MODE_AP) && (port < 0x20))
26217 + {
26218 + /* AP : Buffer frame for power saving STA */
26219 + if ((ret = zfApBufferPsFrame(dev, buf, port)) == 1)
26220 + {
26221 + return ZM_SUCCESS;
26222 + }
26223 + }
26224 + else
26225 +#endif
26226 + if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)
26227 + {
26228 + if ( zfPowerSavingMgrIsSleeping(dev) )
26229 + {
26230 + /*check ZM_ENABLE_POWER_SAVE flag*/
26231 + zfPowerSavingMgrWakeup(dev);
26232 + }
26233 + }
26234 +#ifdef ZM_ENABLE_IBSS_PS
26235 + /* IBSS power-saving mode */
26236 + else if ( wd->wlanMode == ZM_MODE_IBSS )
26237 + {
26238 + if ( zfStaIbssPSQueueData(dev, buf) )
26239 + {
26240 + return ZM_SUCCESS;
26241 + }
26242 + }
26243 +#endif
26244 +
26245 +#if 1
26246 + //if ( wd->bQoSEnable )
26247 + if (1)
26248 + {
26249 + /* Put to VTXQ[ac] */
26250 + ret = zfPutVtxq(dev, buf);
26251 +
26252 + /* Push VTXQ[ac] */
26253 + zfPushVtxq(dev);
26254 + }
26255 + else
26256 + {
26257 + ret = zfTxSendEth(dev, buf, port, ZM_EXTERNAL_ALLOC_BUF, 0);
26258 + }
26259 +
26260 + return ret;
26261 +#else
26262 + return zfTxSendEth(dev, buf, port, ZM_EXTERNAL_ALLOC_BUF, 0);
26263 +#endif
26264 +
26265 +zlError:
26266 + zm_msg2_tx(ZM_LV_1, "Tx Comp err=", err);
26267 +
26268 + zfwBufFree(dev, buf, err);
26269 + return err;
26270 +}
26271 +
26272 +
26273 +/************************************************************************/
26274 +/* */
26275 +/* FUNCTION DESCRIPTION zfTxSendEth */
26276 +/* Called to transmit Ethernet frame from upper layer. */
26277 +/* */
26278 +/* INPUTS */
26279 +/* dev : device pointer */
26280 +/* buf : buffer pointer */
26281 +/* port : WLAN port, 0=>standard, 0x10-0x17=>VAP, 0x20-0x25=>WDS */
26282 +/* */
26283 +/* OUTPUTS */
26284 +/* error code */
26285 +/* */
26286 +/* AUTHOR */
26287 +/* Stephen ZyDAS Technology Corporation 2005.5 */
26288 +/* */
26289 +/************************************************************************/
26290 +u16_t zfTxSendEth(zdev_t* dev, zbuf_t* buf, u16_t port, u16_t bufType, u16_t flag)
26291 +{
26292 + u16_t err;
26293 + //u16_t addrTblSize;
26294 + //struct zsAddrTbl addrTbl;
26295 + u16_t removeLen;
26296 + u16_t header[(8+30+2+18)/2]; /* ctr+(4+a1+a2+a3+2+a4)+qos+iv */
26297 + u16_t headerLen;
26298 + u16_t mic[8/2];
26299 + u16_t micLen;
26300 + u16_t snap[8/2];
26301 + u16_t snapLen;
26302 + u16_t fragLen;
26303 + u16_t frameLen;
26304 + u16_t fragNum;
26305 + struct zsFrag frag;
26306 + u16_t i, j, id;
26307 + u16_t offset;
26308 + u16_t da[3];
26309 + u16_t sa[3];
26310 + u8_t up;
26311 + u8_t qosType, keyIdx = 0;
26312 + u16_t fragOff;
26313 + u16_t newFlag;
26314 + struct zsMicVar* pMicKey;
26315 + u8_t tkipFrameOffset = 0;
26316 +
26317 + zmw_get_wlan_dev(dev);
26318 +
26319 + zmw_declare_for_critical_section();
26320 +
26321 + newFlag = flag & 0xff00;
26322 + flag = flag & 0xff;
26323 +
26324 + zm_msg1_tx(ZM_LV_2, "zfTxSendEth(), port=", port);
26325 +
26326 + /* Get IP TOS for QoS AC and IP frag offset */
26327 + zfTxGetIpTosAndFrag(dev, buf, &up, &fragOff);
26328 +
26329 + //EOSP bit
26330 + if (newFlag & 0x100)
26331 + {
26332 + up |= 0x10;
26333 + }
26334 +
26335 +#ifdef ZM_ENABLE_NATIVE_WIFI
26336 + if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
26337 + {
26338 + /* DA */
26339 + da[0] = zmw_tx_buf_readh(dev, buf, 16);
26340 + da[1] = zmw_tx_buf_readh(dev, buf, 18);
26341 + da[2] = zmw_tx_buf_readh(dev, buf, 20);
26342 + /* SA */
26343 + sa[0] = zmw_tx_buf_readh(dev, buf, 10);
26344 + sa[1] = zmw_tx_buf_readh(dev, buf, 12);
26345 + sa[2] = zmw_tx_buf_readh(dev, buf, 14);
26346 + }
26347 + else if ( wd->wlanMode == ZM_MODE_IBSS )
26348 + {
26349 + /* DA */
26350 + da[0] = zmw_tx_buf_readh(dev, buf, 4);
26351 + da[1] = zmw_tx_buf_readh(dev, buf, 6);
26352 + da[2] = zmw_tx_buf_readh(dev, buf, 8);
26353 + /* SA */
26354 + sa[0] = zmw_tx_buf_readh(dev, buf, 10);
26355 + sa[1] = zmw_tx_buf_readh(dev, buf, 12);
26356 + sa[2] = zmw_tx_buf_readh(dev, buf, 14);
26357 + }
26358 + else if ( wd->wlanMode == ZM_MODE_AP )
26359 + {
26360 + /* DA */
26361 + da[0] = zmw_tx_buf_readh(dev, buf, 4);
26362 + da[1] = zmw_tx_buf_readh(dev, buf, 6);
26363 + da[2] = zmw_tx_buf_readh(dev, buf, 8);
26364 + /* SA */
26365 + sa[0] = zmw_tx_buf_readh(dev, buf, 16);
26366 + sa[1] = zmw_tx_buf_readh(dev, buf, 18);
26367 + sa[2] = zmw_tx_buf_readh(dev, buf, 20);
26368 + }
26369 + else
26370 + {
26371 + //
26372 + }
26373 +#else
26374 + /* DA */
26375 + da[0] = zmw_tx_buf_readh(dev, buf, 0);
26376 + da[1] = zmw_tx_buf_readh(dev, buf, 2);
26377 + da[2] = zmw_tx_buf_readh(dev, buf, 4);
26378 + /* SA */
26379 + sa[0] = zmw_tx_buf_readh(dev, buf, 6);
26380 + sa[1] = zmw_tx_buf_readh(dev, buf, 8);
26381 + sa[2] = zmw_tx_buf_readh(dev, buf, 10);
26382 +#endif
26383 + //Decide Key Index in ATOM, No meaning in OTUS--CWYang(m)
26384 + if (wd->wlanMode == ZM_MODE_AP)
26385 + {
26386 + keyIdx = wd->ap.bcHalKeyIdx[port];
26387 + id = zfApFindSta(dev, da);
26388 + if (id != 0xffff)
26389 + {
26390 + switch (wd->ap.staTable[id].encryMode)
26391 + {
26392 + case ZM_AES:
26393 + case ZM_TKIP:
26394 +#ifdef ZM_ENABLE_CENC
26395 + case ZM_CENC:
26396 +#endif //ZM_ENABLE_CENC
26397 + keyIdx = wd->ap.staTable[id].keyIdx;
26398 + break;
26399 + }
26400 + }
26401 + }
26402 + else
26403 + {
26404 + switch (wd->sta.encryMode)
26405 + {
26406 + case ZM_WEP64:
26407 + case ZM_WEP128:
26408 + case ZM_WEP256:
26409 + keyIdx = wd->sta.keyId;
26410 + break;
26411 + case ZM_AES:
26412 + case ZM_TKIP:
26413 + if ((da[0] & 0x1))
26414 + keyIdx = 5;
26415 + else
26416 + keyIdx = 4;
26417 + break;
26418 +#ifdef ZM_ENABLE_CENC
26419 + case ZM_CENC:
26420 + keyIdx = wd->sta.cencKeyId;
26421 + break;
26422 +#endif //ZM_ENABLE_CENC
26423 + }
26424 + }
26425 +
26426 + /* Create SNAP */
26427 + removeLen = zfTxGenWlanSnap(dev, buf, snap, &snapLen);
26428 + //zm_msg1_tx(ZM_LV_0, "fragOff=", fragOff);
26429 +
26430 +
26431 +/* ********************************************************************************************** */
26432 +/* Add 20071025 Mxzeng */
26433 +/* ********************************************************************************************** */
26434 +/* ---------------------------------------------------------------------------------------------- */
26435 +/* Ethernet : frameLen = zfwBufGetSize(dev, buf); */
26436 +/* ---+--6--+--6--+--2--+-----20-----+-------------------------+------ Variable -------+--------- */
26437 +/* | DA | SA | Type| IP Header | TCP(20) UDP(12) ICMP(8) | Application Payload L | */
26438 +/* ---+-----+-----+-----+------------+-------------------------+-----------------------+--------- */
26439 +/* MSDU = 6 + 6 + 2 + ( Network Layer header ) + ( Transport Layer header ) + L */
26440 +/* */
26441 +/* MSDU - DA - SA : frameLen -= removeLen; */
26442 +/* ---+--2--+-----20-----+-------------------------+------ Variable -------+--------------------- */
26443 +/* | Type| IP Header | TCP(20) UDP(12) ICMP(8) | Application Payload L | */
26444 +/* ---+-----+------------+-------------------------+-----------------------+--------------------- */
26445 +/* */
26446 +/* MPDU : frameLen + mpduLengthOffset ; */
26447 +/* -+---2---+----2---+-6-+-6-+--6--+---2----+--1--+--1-+---1---+-------3------+-frameLen-+---4--+- */
26448 +/* | frame |duration| DA|SA |BSSID|sequence|SNAP |SNAP|Control| RFC 1042 | | FCS | */
26449 +/* |Control| | | | | number |DSAP |SSAP| | encapsulation| | | */
26450 +/* -+-------+--------+---+---+-----+--------+-----+----+-------+--------------+----------+------+- */
26451 +/* ----------------------------------------------------------------------------------------------- */
26452 +
26453 + if ( wd->sta.encryMode == ZM_TKIP )
26454 + tkipFrameOffset = 8;
26455 +
26456 + fragLen = wd->fragThreshold + tkipFrameOffset; // Fragmentation threshold for MPDU Lengths
26457 + frameLen = zfwBufGetSize(dev, buf); // MSDU Lengths
26458 + frameLen -= removeLen; // MSDU Lengths - DA - SA
26459 +
26460 + /* #1st create MIC Length manually */
26461 + micLen = 0;
26462 +
26463 + /* Access Category */
26464 + if (wd->wlanMode == ZM_MODE_AP)
26465 + {
26466 + zfApGetStaQosType(dev, da, &qosType);
26467 + if (qosType == 0)
26468 + {
26469 + up = 0;
26470 + }
26471 + }
26472 + else if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)
26473 + {
26474 + if (wd->sta.wmeConnected == 0)
26475 + {
26476 + up = 0;
26477 + }
26478 + }
26479 + else
26480 + {
26481 + /* TODO : STA QoS control field */
26482 + up = 0;
26483 + }
26484 +
26485 + /* #2nd Assign sequence number */
26486 + zmw_enter_critical_section(dev);
26487 + frag.seq[0] = ((wd->seq[zcUpToAc[up&0x7]]++) << 4);
26488 + zmw_leave_critical_section(dev);
26489 +
26490 + /* #3rd Pass the total payload to generate MPDU length ! */
26491 + frag.buf[0] = buf;
26492 + frag.bufType[0] = bufType;
26493 + frag.flag[0] = (u8_t)flag;
26494 + fragNum = 1;
26495 +
26496 + headerLen = zfTxGenWlanHeader(dev, frag.buf[0], header, frag.seq[0],
26497 + frag.flag[0], snapLen+micLen, removeLen, port, da, sa,
26498 + up, &micLen, snap, snapLen, NULL);
26499 +
26500 + //zm_debug_msg1("#1 headerLen = ", headerLen);
26501 +
26502 + /* #4th Check the HeaderLen and determine whether the MPDU Lengths bigger than Fragmentation threshold */
26503 + /* If MPDU Lengths large than fragmentation threshold --> headerLen = 0 */
26504 + if( headerLen != 0 )
26505 + {
26506 + zf80211FrameSend(dev, frag.buf[0], header, snapLen, da, sa, up,
26507 + headerLen, snap, mic, micLen, removeLen, frag.bufType[0],
26508 + zcUpToAc[up&0x7], keyIdx);
26509 + }
26510 + else //if( headerLen == 0 ) // Need to be fragmented
26511 + {
26512 + u16_t mpduLengthOffset;
26513 + u16_t pseudSnapLen = 0;
26514 +
26515 + mpduLengthOffset = header[0] - frameLen; // For fragmentation threshold !
26516 +
26517 + micLen = zfTxGenWlanTail(dev, buf, snap, snapLen, mic); // Get snap and mic information
26518 +
26519 + fragLen = fragLen - mpduLengthOffset;
26520 +
26521 + //zm_debug_msg1("#2 frameLen = ", frameLen);
26522 + //zm_debug_msg1("#3 fragThreshold = ", fragLen);
26523 +
26524 + /* fragmentation */
26525 + if (frameLen >= fragLen)
26526 + {
26527 + //copy fragLen to frag
26528 + i = 0;
26529 + while( frameLen > 0 )
26530 + {
26531 + if ((frag.buf[i] = zfwBufAllocate(dev, fragLen+32)) != NULL)
26532 + {
26533 + frag.bufType[i] = ZM_INTERNAL_ALLOC_BUF;
26534 + frag.seq[i] = frag.seq[0] + i;
26535 + offset = removeLen + i*fragLen;
26536 +
26537 + /* Consider the offset if we consider snap length to the other fragmented frame */
26538 + if ( i >= 1 )
26539 + offset = offset + pseudSnapLen*(i-1);
26540 +
26541 + if (frameLen > fragLen + pseudSnapLen)
26542 + {
26543 + frag.flag[i] = flag | 0x4; /* More data */
26544 + /* First fragment */
26545 + if (i == 0)
26546 + {
26547 + /* Add SNAP */
26548 + for (j=0; j<snapLen; j+=2)
26549 + {
26550 + zmw_tx_buf_writeh(dev, frag.buf[i], j, snap[(j>>1)]);
26551 + }
26552 + zfTxBufferCopy(dev, frag.buf[i], buf, snapLen, offset, fragLen);
26553 + zfwBufSetSize(dev, frag.buf[i], snapLen+fragLen);
26554 +
26555 + /* Add pseud snap length to the other fragmented frame */
26556 + pseudSnapLen = snapLen;
26557 +
26558 + frameLen -= fragLen;
26559 + }
26560 + /* Intermediate Fragment */
26561 + else
26562 + {
26563 + //zfTxBufferCopy(dev, frag.buf[i], buf, 0, offset, fragLen);
26564 + //zfwBufSetSize(dev, frag.buf[i], fragLen);
26565 +
26566 + zfTxBufferCopy(dev, frag.buf[i], buf, 0, offset, fragLen+pseudSnapLen );
26567 + zfwBufSetSize(dev, frag.buf[i], fragLen+pseudSnapLen);
26568 +
26569 + frameLen -= (fragLen+pseudSnapLen);
26570 + }
26571 + //frameLen -= fragLen;
26572 + }
26573 + else
26574 + {
26575 + /* Last fragment */
26576 + zfTxBufferCopy(dev, frag.buf[i], buf, 0, offset, frameLen);
26577 + /* Add MIC if need */
26578 + if ( micLen )
26579 + {
26580 + zfCopyToRxBuffer(dev, frag.buf[i], (u8_t*) mic, frameLen, micLen);
26581 + }
26582 + zfwBufSetSize(dev, frag.buf[i], frameLen+micLen);
26583 + frameLen = 0;
26584 + frag.flag[i] = (u8_t)flag; /* No more data */
26585 + }
26586 + i++;
26587 + }
26588 + else
26589 + {
26590 + break;
26591 + }
26592 +
26593 + // Please pay attention to the index of the buf !!!
26594 + // If write to null buf , the OS will crash !!!
26595 + zfwCopyBufContext(dev, buf, frag.buf[i-1]);
26596 + }
26597 + fragNum = i;
26598 + snapLen = micLen = removeLen = 0;
26599 +
26600 + zfwBufFree(dev, buf, 0);
26601 + }
26602 +
26603 + for (i=0; i<fragNum; i++)
26604 + {
26605 + /* Create WLAN header(Control Setting + 802.11 header + IV) */
26606 + headerLen = zfTxGenWlanHeader(dev, frag.buf[i], header, frag.seq[i],
26607 + frag.flag[i], snapLen+micLen, removeLen, port, da, sa, up, &micLen,
26608 + snap, snapLen, NULL);
26609 +
26610 + zf80211FrameSend(dev, frag.buf[i], header, snapLen, da, sa, up,
26611 + headerLen, snap, mic, micLen, removeLen, frag.bufType[i],
26612 + zcUpToAc[up&0x7], keyIdx);
26613 +
26614 + } /* for (i=0; i<fragNum; i++) */
26615 + }
26616 +
26617 + return ZM_SUCCESS;
26618 +}
26619 +
26620 +
26621 +/************************************************************************/
26622 +/* */
26623 +/* FUNCTION DESCRIPTION zfTxPortControl */
26624 +/* Check port status. */
26625 +/* */
26626 +/* INPUTS */
26627 +/* buf : buffer pointer */
26628 +/* port : port number, 0=>standard, 10-17=>Virtual AP, 20-25=>WDS */
26629 +/* */
26630 +/* OUTPUTS */
26631 +/* ZM_PORT_ENABLED or ZM_PORT_DISABLE */
26632 +/* */
26633 +/* AUTHOR */
26634 +/* Signature ZyDAS Technology Corporation 2005.4 */
26635 +/* */
26636 +/************************************************************************/
26637 +u16_t zfTxPortControl(zdev_t* dev, zbuf_t* buf, u16_t port)
26638 +{
26639 + zmw_get_wlan_dev(dev);
26640 +
26641 + if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
26642 + {
26643 + if ( wd->sta.adapterState == ZM_STA_STATE_DISCONNECT )
26644 + {
26645 + zm_msg0_tx(ZM_LV_3, "Packets dropped due to disconnect state");
26646 + return ZM_PORT_DISABLED;
26647 + }
26648 + }
26649 +
26650 + return ZM_PORT_ENABLED;
26651 +}
26652 +
26653 +
26654 +
26655 +/************************************************************************/
26656 +/* */
26657 +/* FUNCTION DESCRIPTION zfIdlRecv */
26658 +/* Do frame validation and filtering then pass to zfwRecv80211(). */
26659 +/* */
26660 +/* INPUTS */
26661 +/* dev : device pointer */
26662 +/* buf : received 802.11 frame buffer. */
26663 +/* */
26664 +/* OUTPUTS */
26665 +/* None */
26666 +/* */
26667 +/* AUTHOR */
26668 +/* Stephen ZyDAS Technology Corporation 2005.10 */
26669 +/* */
26670 +/************************************************************************/
26671 +void zfCoreRecv(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo)
26672 +{
26673 + u16_t ret = 0;
26674 + u16_t bssid[3];
26675 + struct agg_tid_rx *tid_rx;
26676 + zmw_get_wlan_dev(dev);
26677 +
26678 + ZM_BUFFER_TRACE(dev, buf)
26679 +
26680 + /* tally */
26681 + wd->commTally.DriverRxFrmCnt++;
26682 +
26683 + bssid[0] = zmw_buf_readh(dev, buf, 16);
26684 + bssid[1] = zmw_buf_readh(dev, buf, 18);
26685 + bssid[2] = zmw_buf_readh(dev, buf, 20);
26686 +
26687 + /* Validate Rx frame */
26688 + if ((ret = zfWlanRxValidate(dev, buf)) != ZM_SUCCESS)
26689 + {
26690 + zm_msg1_rx(ZM_LV_1, "Rx invalid:", ret);
26691 + goto zlError;
26692 + }
26693 +
26694 +#ifdef ZM_ENABLE_AGGREGATION
26695 + //#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION
26696 + /*
26697 + * add by honda
26698 + */
26699 + tid_rx = zfAggRxEnabled(dev, buf);
26700 + if (tid_rx && wd->reorder)
26701 + {
26702 + zfAggRx(dev, buf, addInfo, tid_rx);
26703 +
26704 + return;
26705 + }
26706 + /*
26707 + * end of add by honda
26708 + */
26709 + //#endif
26710 +#endif
26711 +
26712 + /* Filter Rx frame */
26713 + if ((ret = zfWlanRxFilter(dev, buf)) != ZM_SUCCESS)
26714 + {
26715 + zm_msg1_rx(ZM_LV_1, "Rx duplicated:", ret);
26716 + goto zlError;
26717 + }
26718 +
26719 + /* Discard error frame except mic failure */
26720 + if ((addInfo->Tail.Data.ErrorIndication & 0x3f) != 0)
26721 + {
26722 + if ( wd->XLinkMode && ((addInfo->Tail.Data.ErrorIndication & 0x3f)==0x10) &&
26723 + zfCompareWithBssid(dev, bssid) )
26724 + {
26725 + // Bypass frames !!!
26726 + }
26727 + else
26728 + {
26729 + goto zlError;
26730 + }
26731 + }
26732 +
26733 +
26734 + /* OTUS command-8212 dump rx packet */
26735 + if (wd->rxPacketDump)
26736 + {
26737 + zfwDumpBuf(dev, buf);
26738 + }
26739 +
26740 + /* Call zfwRecv80211() wrapper function to deliver Rx packet */
26741 + /* to driver framework. */
26742 +
26743 + if (wd->zfcbRecv80211 != NULL)
26744 + {
26745 + wd->zfcbRecv80211(dev, buf, addInfo); //CWYang(m)
26746 + }
26747 + else
26748 + {
26749 + zfiRecv80211(dev, buf, addInfo);
26750 + }
26751 + return;
26752 +
26753 +zlError:
26754 + zm_msg1_rx(ZM_LV_1, "Free packet, error code:", ret);
26755 +
26756 + wd->commTally.DriverDiscardedFrm++;
26757 +
26758 + /* Free Rx buffer */
26759 + zfwBufFree(dev, buf, 0);
26760 +
26761 + return;
26762 +}
26763 +
26764 +
26765 +void zfShowRxEAPOL(zdev_t* dev, zbuf_t* buf, u16_t offset)
26766 +{
26767 + u8_t packetType, keyType, code, identifier, type, flags;
26768 + u16_t packetLen, keyInfo, keyLen, keyDataLen, length, Op_Code;
26769 + u32_t replayCounterH, replayCounterL, vendorId, VendorType;
26770 +
26771 + /* EAPOL packet type */
26772 + packetType = zmw_rx_buf_readb(dev, buf, offset+1); // 0: EAP-Packet
26773 + // 1: EAPOL-Start
26774 + // 2: EAPOL-Logoff
26775 + // 3: EAPOL-Key
26776 + // 4: EAPOL-Encapsulated-ASF-Alert
26777 +
26778 + /* EAPOL frame format */
26779 + /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
26780 + /* ----------------------------------------------- */
26781 + /* PAE Ethernet Type (0x888e) */
26782 + /* ----------------------------------------------- 2 */
26783 + /* Protocol Version | Type */
26784 + /* ----------------------------------------------- 4 */
26785 + /* Length */
26786 + /* ----------------------------------------------- 6 */
26787 + /* Packet Body */
26788 + /* ----------------------------------------------- N */
26789 +
26790 + /* EAPOL body length */
26791 + packetLen = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+2)) << 8) +
26792 + zmw_rx_buf_readb(dev, buf, offset+3);
26793 +
26794 + if( packetType == 0 )
26795 + { // EAP-Packet
26796 +
26797 + /* EAP-Packet Code */
26798 + code = zmw_rx_buf_readb(dev, buf, offset+4); // 1 : Request
26799 + // 2 : Response
26800 + // 3 : Success
26801 + // 4 : Failure
26802 + // An EAP packet of the type of Success and Failure has no Data field, and has a length of 4.
26803 +
26804 + /* EAP Packet format */
26805 + /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
26806 + /* ----------------------------------------------- */
26807 + /* Code | Identifier */
26808 + /* ----------------------------------------------- 2 */
26809 + /* Length */
26810 + /* ----------------------------------------------- 4 */
26811 + /* Data */
26812 + /* ----------------------------------------------- N */
26813 +
26814 + zm_debug_msg0("EAP-Packet");
26815 + zm_debug_msg1("Packet Length = ", packetLen);
26816 + zm_debug_msg1("EAP-Packet Code = ", code);
26817 +
26818 + if( code == 1 )
26819 + {
26820 + zm_debug_msg0("EAP-Packet Request");
26821 +
26822 + /* EAP-Packet Identifier */
26823 + identifier = zmw_rx_buf_readb(dev, buf, offset+5);
26824 + /* EAP-Packet Length */
26825 + length = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+6)) << 8) +
26826 + zmw_rx_buf_readb(dev, buf, offset+7);
26827 + /* EAP-Packet Type */
26828 + type = zmw_rx_buf_readb(dev, buf, offset+8); // 1 : Identity
26829 + // 2 : Notification
26830 + // 3 : Nak (Response Only)
26831 + // 4 : MD5-Challenge
26832 + // 5 : One Time Password (OTP)
26833 + // 6 : Generic Token Card (GTC)
26834 + // 254 : (Expanded Types)Wi-Fi Protected Setup
26835 + // 255 : Experimental Use
26836 +
26837 + /* The data field in an EAP packet of the type of Request or Response is in the format shown bellowing */
26838 + /* 0 1 2 3 4 5 6 7 N */
26839 + /* ----------------------------------------------- */
26840 + /* Type | Type Data */
26841 + /* ----------------------------------------------- */
26842 +
26843 + zm_debug_msg1("EAP-Packet Identifier = ", identifier);
26844 + zm_debug_msg1("EAP-Packet Length = ", length);
26845 + zm_debug_msg1("EAP-Packet Type = ", type);
26846 +
26847 + if( type == 1 )
26848 + {
26849 + zm_debug_msg0("EAP-Packet Request Identity");
26850 + }
26851 + else if( type == 2 )
26852 + {
26853 + zm_debug_msg0("EAP-Packet Request Notification");
26854 + }
26855 + else if( type == 4 )
26856 + {
26857 + zm_debug_msg0("EAP-Packet Request MD5-Challenge");
26858 + }
26859 + else if( type == 5 )
26860 + {
26861 + zm_debug_msg0("EAP-Packet Request One Time Password");
26862 + }
26863 + else if( type == 6 )
26864 + {
26865 + zm_debug_msg0("EAP-Packet Request Generic Token Card");
26866 + }
26867 + else if( type == 254 )
26868 + {
26869 + zm_debug_msg0("EAP-Packet Request Wi-Fi Protected Setup");
26870 +
26871 + /* 0 1 2 3 */
26872 + /* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 */
26873 + /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
26874 + /*| Type | Vendor-Id |*/
26875 + /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
26876 + /*| Vendor-Type |*/
26877 + /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
26878 + /*| Vendor data... */
26879 + /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
26880 +
26881 + /* EAP-Packet Vendor ID */
26882 + vendorId = (((u32_t) zmw_rx_buf_readb(dev, buf, offset+9)) << 16) +
26883 + (((u32_t) zmw_rx_buf_readb(dev, buf, offset+10)) << 8) +
26884 + zmw_rx_buf_readb(dev, buf, offset+11);
26885 + /* EAP-Packet Vendor Type */
26886 + VendorType = (((u32_t) zmw_rx_buf_readb(dev, buf, offset+12)) << 24) +
26887 + (((u32_t) zmw_rx_buf_readb(dev, buf, offset+13)) << 16) +
26888 + (((u32_t) zmw_rx_buf_readb(dev, buf, offset+14)) << 8) +
26889 + zmw_rx_buf_readb(dev, buf, offset+15);
26890 + /* EAP-Packet Op Code */
26891 + Op_Code = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+16)) << 8) +
26892 + zmw_rx_buf_readb(dev, buf, offset+17);
26893 + /* EAP-Packet Flags */
26894 + flags = zmw_rx_buf_readb(dev, buf, offset+18);
26895 +
26896 + zm_debug_msg1("EAP-Packet Vendor ID = ", vendorId);
26897 + zm_debug_msg1("EAP-Packet Venodr Type = ", VendorType);
26898 + zm_debug_msg1("EAP-Packet Op Code = ", Op_Code);
26899 + zm_debug_msg1("EAP-Packet Flags = ", flags);
26900 + }
26901 + }
26902 + else if( code == 2 )
26903 + {
26904 + zm_debug_msg0("EAP-Packet Response");
26905 +
26906 + /* EAP-Packet Identifier */
26907 + identifier = zmw_rx_buf_readb(dev, buf, offset+5);
26908 + /* EAP-Packet Length */
26909 + length = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+6)) << 8) +
26910 + zmw_rx_buf_readb(dev, buf, offset+7);
26911 + /* EAP-Packet Type */
26912 + type = zmw_rx_buf_readb(dev, buf, offset+8);
26913 +
26914 + zm_debug_msg1("EAP-Packet Identifier = ", identifier);
26915 + zm_debug_msg1("EAP-Packet Length = ", length);
26916 + zm_debug_msg1("EAP-Packet Type = ", type);
26917 +
26918 + if( type == 1 )
26919 + {
26920 + zm_debug_msg0("EAP-Packet Response Identity");
26921 + }
26922 + else if( type == 2 )
26923 + {
26924 + zm_debug_msg0("EAP-Packet Request Notification");
26925 + }
26926 + else if( type == 3 )
26927 + {
26928 + zm_debug_msg0("EAP-Packet Request Nak");
26929 + }
26930 + else if( type == 4 )
26931 + {
26932 + zm_debug_msg0("EAP-Packet Request MD5-Challenge");
26933 + }
26934 + else if( type == 5 )
26935 + {
26936 + zm_debug_msg0("EAP-Packet Request One Time Password");
26937 + }
26938 + else if( type == 6 )
26939 + {
26940 + zm_debug_msg0("EAP-Packet Request Generic Token Card");
26941 + }
26942 + else if( type == 254 )
26943 + {
26944 + zm_debug_msg0("EAP-Packet Response Wi-Fi Protected Setup");
26945 +
26946 + /* EAP-Packet Vendor ID */
26947 + vendorId = (((u32_t) zmw_rx_buf_readb(dev, buf, offset+9)) << 16) +
26948 + (((u32_t) zmw_rx_buf_readb(dev, buf, offset+10)) << 8) +
26949 + zmw_rx_buf_readb(dev, buf, offset+11);
26950 + /* EAP-Packet Vendor Type */
26951 + VendorType = (((u32_t) zmw_rx_buf_readb(dev, buf, offset+12)) << 24) +
26952 + (((u32_t) zmw_rx_buf_readb(dev, buf, offset+13)) << 16) +
26953 + (((u32_t) zmw_rx_buf_readb(dev, buf, offset+14)) << 8) +
26954 + zmw_rx_buf_readb(dev, buf, offset+15);
26955 + /* EAP-Packet Op Code */
26956 + Op_Code = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+16)) << 8) +
26957 + zmw_rx_buf_readb(dev, buf, offset+17);
26958 + /* EAP-Packet Flags */
26959 + flags = zmw_rx_buf_readb(dev, buf, offset+18);
26960 +
26961 + zm_debug_msg1("EAP-Packet Vendor ID = ", vendorId);
26962 + zm_debug_msg1("EAP-Packet Venodr Type = ", VendorType);
26963 + zm_debug_msg1("EAP-Packet Op Code = ", Op_Code);
26964 + zm_debug_msg1("EAP-Packet Flags = ", flags);
26965 + }
26966 + }
26967 + else if( code == 3 )
26968 + {
26969 + zm_debug_msg0("EAP-Packet Success");
26970 +
26971 + /* EAP-Packet Identifier */
26972 + identifier = zmw_rx_buf_readb(dev, buf, offset+5);
26973 + /* EAP-Packet Length */
26974 + length = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+6)) << 8) +
26975 + zmw_rx_buf_readb(dev, buf, offset+7);
26976 +
26977 + zm_debug_msg1("EAP-Packet Identifier = ", identifier);
26978 + zm_debug_msg1("EAP-Packet Length = ", length);
26979 + }
26980 + else if( code == 4 )
26981 + {
26982 + zm_debug_msg0("EAP-Packet Failure");
26983 +
26984 + /* EAP-Packet Identifier */
26985 + identifier = zmw_rx_buf_readb(dev, buf, offset+5);
26986 + /* EAP-Packet Length */
26987 + length = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+6)) << 8) +
26988 + zmw_rx_buf_readb(dev, buf, offset+7);
26989 +
26990 + zm_debug_msg1("EAP-Packet Identifier = ", identifier);
26991 + zm_debug_msg1("EAP-Packet Length = ", length);
26992 + }
26993 + }
26994 + else if( packetType == 1 )
26995 + { // EAPOL-Start
26996 + zm_debug_msg0("EAPOL-Start");
26997 + }
26998 + else if( packetType == 2 )
26999 + { // EAPOL-Logoff
27000 + zm_debug_msg0("EAPOL-Logoff");
27001 + }
27002 + else if( packetType == 3 )
27003 + { // EAPOL-Key
27004 + /* EAPOL-Key type */
27005 + keyType = zmw_rx_buf_readb(dev, buf, offset+4);
27006 + /* EAPOL-Key information */
27007 + keyInfo = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+5)) << 8) +
27008 + zmw_rx_buf_readb(dev, buf, offset+6);
27009 + /* EAPOL-Key length */
27010 + keyLen = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+7)) << 8) +
27011 + zmw_rx_buf_readb(dev, buf, offset+8);
27012 + /* EAPOL-Key replay counter (high double word) */
27013 + replayCounterH = (((u32_t) zmw_rx_buf_readb(dev, buf, offset+9)) << 24) +
27014 + (((u32_t) zmw_rx_buf_readb(dev, buf, offset+10)) << 16) +
27015 + (((u32_t) zmw_rx_buf_readb(dev, buf, offset+11)) << 8) +
27016 + zmw_rx_buf_readb(dev, buf, offset+12);
27017 + /* EAPOL-Key replay counter (low double word) */
27018 + replayCounterL = (((u32_t) zmw_rx_buf_readb(dev, buf, offset+13)) << 24) +
27019 + (((u32_t) zmw_rx_buf_readb(dev, buf, offset+14)) << 16) +
27020 + (((u32_t) zmw_rx_buf_readb(dev, buf, offset+15)) << 8) +
27021 + zmw_rx_buf_readb(dev, buf, offset+16);
27022 + /* EAPOL-Key data length */
27023 + keyDataLen = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+97)) << 8) +
27024 + zmw_rx_buf_readb(dev, buf, offset+98);
27025 +
27026 + zm_debug_msg0("EAPOL-Key");
27027 + zm_debug_msg1("packet length = ", packetLen);
27028 +
27029 + if ( keyType == 254 )
27030 + {
27031 + zm_debug_msg0("key type = 254 (SSN key descriptor)");
27032 + }
27033 + else
27034 + {
27035 + zm_debug_msg2("key type = 0x", keyType);
27036 + }
27037 +
27038 + zm_debug_msg2("replay counter(L) = ", replayCounterL);
27039 +
27040 + zm_debug_msg2("key information = ", keyInfo);
27041 +
27042 + if ( keyInfo & ZM_BIT_3 )
27043 + {
27044 + zm_debug_msg0(" - pairwise key");
27045 + }
27046 + else
27047 + {
27048 + zm_debug_msg0(" - group key");
27049 + }
27050 +
27051 + if ( keyInfo & ZM_BIT_6 )
27052 + {
27053 + zm_debug_msg0(" - Tx key installed");
27054 + }
27055 + else
27056 + {
27057 + zm_debug_msg0(" - Tx key not set");
27058 + }
27059 +
27060 + if ( keyInfo & ZM_BIT_7 )
27061 + {
27062 + zm_debug_msg0(" - Ack needed");
27063 + }
27064 + else
27065 + {
27066 + zm_debug_msg0(" - Ack not needed");
27067 + }
27068 +
27069 + if ( keyInfo & ZM_BIT_8 )
27070 + {
27071 + zm_debug_msg0(" - MIC set");
27072 + }
27073 + else
27074 + {
27075 + zm_debug_msg0(" - MIC not set");
27076 + }
27077 +
27078 + if ( keyInfo & ZM_BIT_9 )
27079 + {
27080 + zm_debug_msg0(" - packet encrypted");
27081 + }
27082 + else
27083 + {
27084 + zm_debug_msg0(" - packet not encrypted");
27085 + }
27086 +
27087 + zm_debug_msg1("keyLen = ", keyLen);
27088 + zm_debug_msg1("keyDataLen = ", keyDataLen);
27089 + }
27090 + else if( packetType == 4 )
27091 + {
27092 + zm_debug_msg0("EAPOL-Encapsulated-ASF-Alert");
27093 + }
27094 +}
27095 +
27096 +void zfShowTxEAPOL(zdev_t* dev, zbuf_t* buf, u16_t offset)
27097 +{
27098 + u8_t packetType, keyType, code, identifier, type, flags;
27099 + u16_t packetLen, keyInfo, keyLen, keyDataLen, length, Op_Code;
27100 + u32_t replayCounterH, replayCounterL, vendorId, VendorType;
27101 +
27102 + zmw_get_wlan_dev(dev);
27103 +
27104 + zm_debug_msg1("EAPOL Packet size = ", zfwBufGetSize(dev, buf));
27105 +
27106 + /* EAPOL packet type */
27107 + // 0: EAP-Packet
27108 + // 1: EAPOL-Start
27109 + // 2: EAPOL-Logoff
27110 + // 3: EAPOL-Key
27111 + // 4: EAPOL-Encapsulated-ASF-Alert
27112 +
27113 + /* EAPOL frame format */
27114 + /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
27115 + /* ----------------------------------------------- */
27116 + /* PAE Ethernet Type (0x888e) */
27117 + /* ----------------------------------------------- 2 */
27118 + /* Protocol Version | Type */
27119 + /* ----------------------------------------------- 4 */
27120 + /* Length */
27121 + /* ----------------------------------------------- 6 */
27122 + /* Packet Body */
27123 + /* ----------------------------------------------- N */
27124 +
27125 + packetType = zmw_tx_buf_readb(dev, buf, offset+1);
27126 + /* EAPOL body length */
27127 + packetLen = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+2)) << 8) +
27128 + zmw_tx_buf_readb(dev, buf, offset+3);
27129 +
27130 + if( packetType == 0 )
27131 + { // EAP-Packet
27132 + /* EAP-Packet Code */
27133 + code = zmw_tx_buf_readb(dev, buf, offset+4); // 1 : Request
27134 + // 2 : Response
27135 + // 3 : Success
27136 + // 4 : Failure
27137 +
27138 + // An EAP packet of the type of Success and Failure has no Data field, and has a length of 4.
27139 +
27140 + /* EAP Packet format */
27141 + /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
27142 + /* ----------------------------------------------- */
27143 + /* Code | Identifier */
27144 + /* ----------------------------------------------- 2 */
27145 + /* Length */
27146 + /* ----------------------------------------------- 4 */
27147 + /* Data */
27148 + /* ----------------------------------------------- N */
27149 +
27150 + zm_debug_msg0("EAP-Packet");
27151 + zm_debug_msg1("Packet Length = ", packetLen);
27152 + zm_debug_msg1("EAP-Packet Code = ", code);
27153 +
27154 + if( code == 1 )
27155 + {
27156 + zm_debug_msg0("EAP-Packet Request");
27157 +
27158 + /* EAP-Packet Identifier */
27159 + identifier = zmw_tx_buf_readb(dev, buf, offset+5);
27160 + /* EAP-Packet Length */
27161 + length = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+6)) << 8) +
27162 + zmw_tx_buf_readb(dev, buf, offset+7);
27163 + /* EAP-Packet Type */
27164 + type = zmw_tx_buf_readb(dev, buf, offset+8); // 1 : Identity
27165 + // 2 : Notification
27166 + // 3 : Nak (Response Only)
27167 + // 4 : MD5-Challenge
27168 + // 5 : One Time Password (OTP)
27169 + // 6 : Generic Token Card (GTC)
27170 + // 254 : (Expanded Types)Wi-Fi Protected Setup
27171 + // 255 : Experimental Use
27172 +
27173 + /* The data field in an EAP packet of the type of Request or Response is in the format shown bellowing */
27174 + /* 0 1 2 3 4 5 6 7 N */
27175 + /* ----------------------------------------------- */
27176 + /* Type | Type Data */
27177 + /* ----------------------------------------------- */
27178 +
27179 + zm_debug_msg1("EAP-Packet Identifier = ", identifier);
27180 + zm_debug_msg1("EAP-Packet Length = ", length);
27181 + zm_debug_msg1("EAP-Packet Type = ", type);
27182 +
27183 + if( type == 1 )
27184 + {
27185 + zm_debug_msg0("EAP-Packet Request Identity");
27186 + }
27187 + else if( type == 2 )
27188 + {
27189 + zm_debug_msg0("EAP-Packet Request Notification");
27190 + }
27191 + else if( type == 4 )
27192 + {
27193 + zm_debug_msg0("EAP-Packet Request MD5-Challenge");
27194 + }
27195 + else if( type == 5 )
27196 + {
27197 + zm_debug_msg0("EAP-Packet Request One Time Password");
27198 + }
27199 + else if( type == 6 )
27200 + {
27201 + zm_debug_msg0("EAP-Packet Request Generic Token Card");
27202 + }
27203 + else if( type == 254 )
27204 + {
27205 + zm_debug_msg0("EAP-Packet Request Wi-Fi Protected Setup");
27206 +
27207 + /* 0 1 2 3 */
27208 + /* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 */
27209 + /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
27210 + /*| Type | Vendor-Id |*/
27211 + /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
27212 + /*| Vendor-Type |*/
27213 + /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
27214 + /*| Vendor data... */
27215 + /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
27216 +
27217 + /* EAP-Packet Vendor ID */
27218 + vendorId = (((u32_t) zmw_tx_buf_readb(dev, buf, offset+9)) << 16) +
27219 + (((u32_t) zmw_tx_buf_readb(dev, buf, offset+10)) << 8) +
27220 + zmw_tx_buf_readb(dev, buf, offset+11);
27221 + /* EAP-Packet Vendor Type */
27222 + VendorType = (((u32_t) zmw_tx_buf_readb(dev, buf, offset+12)) << 24) +
27223 + (((u32_t) zmw_tx_buf_readb(dev, buf, offset+13)) << 16) +
27224 + (((u32_t) zmw_tx_buf_readb(dev, buf, offset+14)) << 8) +
27225 + zmw_tx_buf_readb(dev, buf, offset+15);
27226 + /* EAP-Packet Op Code */
27227 + Op_Code = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+16)) << 8) +
27228 + zmw_tx_buf_readb(dev, buf, offset+17);
27229 + /* EAP-Packet Flags */
27230 + flags = zmw_tx_buf_readb(dev, buf, offset+18);
27231 +
27232 + zm_debug_msg1("EAP-Packet Vendor ID = ", vendorId);
27233 + zm_debug_msg1("EAP-Packet Venodr Type = ", VendorType);
27234 + zm_debug_msg1("EAP-Packet Op Code = ", Op_Code);
27235 + zm_debug_msg1("EAP-Packet Flags = ", flags);
27236 + }
27237 + }
27238 + else if( code == 2 )
27239 + {
27240 + zm_debug_msg0("EAP-Packet Response");
27241 +
27242 + /* EAP-Packet Identifier */
27243 + identifier = zmw_tx_buf_readb(dev, buf, offset+5);
27244 + /* EAP-Packet Length */
27245 + length = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+6)) << 8) +
27246 + zmw_tx_buf_readb(dev, buf, offset+7);
27247 + /* EAP-Packet Type */
27248 + type = zmw_tx_buf_readb(dev, buf, offset+8);
27249 +
27250 + zm_debug_msg1("EAP-Packet Identifier = ", identifier);
27251 + zm_debug_msg1("EAP-Packet Length = ", length);
27252 + zm_debug_msg1("EAP-Packet Type = ", type);
27253 +
27254 + if( type == 1 )
27255 + {
27256 + zm_debug_msg0("EAP-Packet Response Identity");
27257 + }
27258 + else if( type == 2 )
27259 + {
27260 + zm_debug_msg0("EAP-Packet Request Notification");
27261 + }
27262 + else if( type == 3 )
27263 + {
27264 + zm_debug_msg0("EAP-Packet Request Nak");
27265 + }
27266 + else if( type == 4 )
27267 + {
27268 + zm_debug_msg0("EAP-Packet Request MD5-Challenge");
27269 + }
27270 + else if( type == 5 )
27271 + {
27272 + zm_debug_msg0("EAP-Packet Request One Time Password");
27273 + }
27274 + else if( type == 6 )
27275 + {
27276 + zm_debug_msg0("EAP-Packet Request Generic Token Card");
27277 + }
27278 + else if( type == 254 )
27279 + {
27280 + zm_debug_msg0("EAP-Packet Response Wi-Fi Protected Setup");
27281 +
27282 + /* EAP-Packet Vendor ID */
27283 + vendorId = (((u32_t) zmw_tx_buf_readb(dev, buf, offset+9)) << 16) +
27284 + (((u32_t) zmw_tx_buf_readb(dev, buf, offset+10)) << 8) +
27285 + zmw_tx_buf_readb(dev, buf, offset+11);
27286 + /* EAP-Packet Vendor Type */
27287 + VendorType = (((u32_t) zmw_tx_buf_readb(dev, buf, offset+12)) << 24) +
27288 + (((u32_t) zmw_tx_buf_readb(dev, buf, offset+13)) << 16) +
27289 + (((u32_t) zmw_tx_buf_readb(dev, buf, offset+14)) << 8) +
27290 + zmw_tx_buf_readb(dev, buf, offset+15);
27291 + /* EAP-Packet Op Code */
27292 + Op_Code = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+16)) << 8) +
27293 + zmw_tx_buf_readb(dev, buf, offset+17);
27294 + /* EAP-Packet Flags */
27295 + flags = zmw_tx_buf_readb(dev, buf, offset+18);
27296 +
27297 + zm_debug_msg1("EAP-Packet Vendor ID = ", vendorId);
27298 + zm_debug_msg1("EAP-Packet Venodr Type = ", VendorType);
27299 + zm_debug_msg1("EAP-Packet Op Code = ", Op_Code);
27300 + zm_debug_msg1("EAP-Packet Flags = ", flags);
27301 + }
27302 + }
27303 + else if( code == 3 )
27304 + {
27305 + zm_debug_msg0("EAP-Packet Success");
27306 +
27307 + /* EAP-Packet Identifier */
27308 + identifier = zmw_rx_buf_readb(dev, buf, offset+5);
27309 + /* EAP-Packet Length */
27310 + length = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+6)) << 8) +
27311 + zmw_rx_buf_readb(dev, buf, offset+7);
27312 +
27313 + zm_debug_msg1("EAP-Packet Identifier = ", identifier);
27314 + zm_debug_msg1("EAP-Packet Length = ", length);
27315 + }
27316 + else if( code == 4 )
27317 + {
27318 + zm_debug_msg0("EAP-Packet Failure");
27319 +
27320 + /* EAP-Packet Identifier */
27321 + identifier = zmw_tx_buf_readb(dev, buf, offset+5);
27322 + /* EAP-Packet Length */
27323 + length = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+6)) << 8) +
27324 + zmw_tx_buf_readb(dev, buf, offset+7);
27325 +
27326 + zm_debug_msg1("EAP-Packet Identifier = ", identifier);
27327 + zm_debug_msg1("EAP-Packet Length = ", length);
27328 + }
27329 + }
27330 + else if( packetType == 1 )
27331 + { // EAPOL-Start
27332 + zm_debug_msg0("EAPOL-Start");
27333 + }
27334 + else if( packetType == 2 )
27335 + { // EAPOL-Logoff
27336 + zm_debug_msg0("EAPOL-Logoff");
27337 + }
27338 + else if( packetType == 3 )
27339 + { // EAPOL-Key
27340 + /* EAPOL-Key type */
27341 + keyType = zmw_tx_buf_readb(dev, buf, offset+4);
27342 + /* EAPOL-Key information */
27343 + keyInfo = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+5)) << 8) +
27344 + zmw_tx_buf_readb(dev, buf, offset+6);
27345 + /* EAPOL-Key length */
27346 + keyLen = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+7)) << 8) +
27347 + zmw_tx_buf_readb(dev, buf, offset+8);
27348 + /* EAPOL-Key replay counter (high double word) */
27349 + replayCounterH = (((u32_t) zmw_tx_buf_readb(dev, buf, offset+9)) << 24) +
27350 + (((u32_t) zmw_tx_buf_readb(dev, buf, offset+10)) << 16) +
27351 + (((u32_t) zmw_tx_buf_readb(dev, buf, offset+11)) << 8) +
27352 + zmw_tx_buf_readb(dev, buf, offset+12);
27353 + /* EAPOL-Key replay counter (low double word) */
27354 + replayCounterL = (((u32_t) zmw_tx_buf_readb(dev, buf, offset+13)) << 24) +
27355 + (((u32_t) zmw_tx_buf_readb(dev, buf, offset+14)) << 16) +
27356 + (((u32_t) zmw_tx_buf_readb(dev, buf, offset+15)) << 8) +
27357 + zmw_tx_buf_readb(dev, buf, offset+16);
27358 + /* EAPOL-Key data length */
27359 + keyDataLen = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+97)) << 8) +
27360 + zmw_tx_buf_readb(dev, buf, offset+98);
27361 +
27362 + zm_debug_msg0("EAPOL-Key");
27363 + zm_debug_msg1("packet length = ", packetLen);
27364 +
27365 + if ( keyType == 254 )
27366 + {
27367 + zm_debug_msg0("key type = 254 (SSN key descriptor)");
27368 + }
27369 + else
27370 + {
27371 + zm_debug_msg2("key type = 0x", keyType);
27372 + }
27373 +
27374 + zm_debug_msg2("replay counter(L) = ", replayCounterL);
27375 +
27376 + zm_debug_msg2("key information = ", keyInfo);
27377 +
27378 + if ( keyInfo & ZM_BIT_3 )
27379 + {
27380 + zm_debug_msg0(" - pairwise key");
27381 + }
27382 + else
27383 + {
27384 + zm_debug_msg0(" - group key");
27385 + }
27386 +
27387 + if ( keyInfo & ZM_BIT_6 )
27388 + {
27389 + zm_debug_msg0(" - Tx key installed");
27390 + }
27391 + else
27392 + {
27393 + zm_debug_msg0(" - Tx key not set");
27394 + }
27395 +
27396 + if ( keyInfo & ZM_BIT_7 )
27397 + {
27398 + zm_debug_msg0(" - Ack needed");
27399 + }
27400 + else
27401 + {
27402 + zm_debug_msg0(" - Ack not needed");
27403 + }
27404 +
27405 + if ( keyInfo & ZM_BIT_8 )
27406 + {
27407 + zm_debug_msg0(" - MIC set");
27408 + }
27409 + else
27410 + {
27411 + zm_debug_msg0(" - MIC not set");
27412 + }
27413 +
27414 + if ( keyInfo & ZM_BIT_9 )
27415 + {
27416 + zm_debug_msg0(" - packet encrypted");
27417 + }
27418 + else
27419 + {
27420 + zm_debug_msg0(" - packet not encrypted");
27421 + }
27422 +
27423 + zm_debug_msg1("keyLen = ", keyLen);
27424 + zm_debug_msg1("keyDataLen = ", keyDataLen);
27425 + }
27426 + else if( packetType == 4 )
27427 + {
27428 + zm_debug_msg0("EAPOL-Encapsulated-ASF-Alert");
27429 + }
27430 +}
27431 +
27432 +
27433 +/************************************************************************/
27434 +/* */
27435 +/* FUNCTION DESCRIPTION zfiRecv80211 */
27436 +/* Called to receive 802.11 frame. */
27437 +/* */
27438 +/* INPUTS */
27439 +/* dev : device pointer */
27440 +/* buf : received 802.11 frame buffer. */
27441 +/* */
27442 +/* OUTPUTS */
27443 +/* None */
27444 +/* */
27445 +/* AUTHOR */
27446 +/* Stephen ZyDAS Technology Corporation 2005.5 */
27447 +/* */
27448 +/************************************************************************/
27449 +void zfiRecv80211(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo)
27450 +{
27451 + u8_t snapCase=0, encryMode;
27452 + u16_t frameType, typeLengthField;
27453 + u16_t frameCtrl;
27454 + u16_t frameSubtype;
27455 + u16_t ret;
27456 + u16_t len;
27457 + u8_t bIsDefrag = 0;
27458 + u16_t offset, tailLen;
27459 + u8_t vap = 0;
27460 + u16_t da[3], sa[3];
27461 + u16_t ii;
27462 + u8_t uapsdTrig = 0;
27463 + zbuf_t* psBuf;
27464 +#ifdef ZM_ENABLE_NATIVE_WIFI
27465 + u8_t i;
27466 +#endif
27467 +
27468 + zmw_get_wlan_dev(dev);
27469 +
27470 + ZM_BUFFER_TRACE(dev, buf)
27471 +
27472 + //zm_msg2_rx(ZM_LV_2, "zfiRecv80211(), buf=", buf);
27473 +
27474 + //zm_msg2_rx(ZM_LV_0, "h[0]=", zmw_rx_buf_readh(dev, buf, 0));
27475 + //zm_msg2_rx(ZM_LV_0, "h[2]=", zmw_rx_buf_readh(dev, buf, 2));
27476 + //zm_msg2_rx(ZM_LV_0, "h[4]=", zmw_rx_buf_readh(dev, buf, 4));
27477 +
27478 + frameCtrl = zmw_rx_buf_readb(dev, buf, 0);
27479 + frameType = frameCtrl & 0xf;
27480 + frameSubtype = frameCtrl & 0xf0;
27481 +
27482 +#if 0 // Move to ProcessBeacon to judge if there's a new peer station
27483 + if ( (wd->wlanMode == ZM_MODE_IBSS)&&
27484 + (wd->sta.ibssPartnerStatus != ZM_IBSS_PARTNER_ALIVE) )
27485 + {
27486 + zfStaIbssMonitoring(dev, buf);
27487 + }
27488 +#endif
27489 +
27490 + /* If data frame */
27491 + if (frameType == ZM_WLAN_DATA_FRAME)
27492 + {
27493 + wd->sta.TotalNumberOfReceivePackets++;
27494 + wd->sta.TotalNumberOfReceiveBytes += zfwBufGetSize(dev, buf);
27495 + //zm_debug_msg1("Receive packets = ", wd->sta.TotalNumberOfReceivePackets);
27496 +
27497 + //zm_msg0_rx(ZM_LV_0, "Rx data");
27498 + if (wd->wlanMode == ZM_MODE_AP)
27499 + {
27500 + if ((ret = zfApUpdatePsBit(dev, buf, &vap, &uapsdTrig)) != ZM_SUCCESS)
27501 + {
27502 + zfwBufFree(dev, buf, 0);
27503 + return;
27504 + }
27505 +
27506 + if (((uapsdTrig&0xf) != 0) && ((frameSubtype & 0x80) != 0))
27507 + {
27508 + u8_t ac = zcUpToAc[zmw_buf_readb(dev, buf, 24)&0x7];
27509 + u8_t pktNum;
27510 + u8_t mb;
27511 + u16_t flag;
27512 + u8_t src[6];
27513 +
27514 + //printk("QoS ctrl=%d\n", zmw_buf_readb(dev, buf, 24));
27515 + //printk("UAPSD trigger, ac=%d\n", ac);
27516 +
27517 + if (((0x8>>ac) & uapsdTrig) != 0)
27518 + {
27519 + pktNum = zcMaxspToPktNum[(uapsdTrig>>4) & 0x3];
27520 +
27521 + for (ii=0; ii<6; ii++)
27522 + {
27523 + src[ii] = zmw_buf_readb(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+ii);
27524 + }
27525 +
27526 + for (ii=0; ii<pktNum; ii++)
27527 + {
27528 + //if ((psBuf = zfQueueGet(dev, wd->ap.uapsdQ)) != NULL)
27529 + if ((psBuf = zfQueueGetWithMac(dev, wd->ap.uapsdQ, src, &mb)) != NULL)
27530 + {
27531 + if ((ii+1) == pktNum)
27532 + {
27533 + //EOSP anyway
27534 + flag = 0x100 | (mb<<5);
27535 + }
27536 + else
27537 + {
27538 + if (mb != 0)
27539 + {
27540 + //more data, not EOSP
27541 + flag = 0x20;
27542 + }
27543 + else
27544 + {
27545 + //no more data, EOSP
27546 + flag = 0x100;
27547 + }
27548 + }
27549 + zfTxSendEth(dev, psBuf, 0, ZM_EXTERNAL_ALLOC_BUF, flag);
27550 + }
27551 +
27552 + if ((psBuf == NULL) || (mb == 0))
27553 + {
27554 + if ((ii == 0) && (psBuf == NULL))
27555 + {
27556 + zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_QOS_NULL, (u16_t*)src, 0, 0, 0);
27557 + }
27558 + break;
27559 + }
27560 + }
27561 + }
27562 + }
27563 +
27564 + }
27565 + else if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
27566 + {
27567 + u16_t frameCtrlMSB;
27568 + u8_t bssid[6];
27569 +
27570 + /* Check Is RIFS frame and decide to enable RIFS or not */
27571 + if( wd->sta.EnableHT )
27572 + zfCheckIsRIFSFrame(dev, buf, frameSubtype);
27573 +
27574 + if ( zfPowerSavingMgrIsSleeping(dev) || wd->sta.psMgr.tempWakeUp == 1)
27575 + {
27576 + frameCtrlMSB = zmw_rx_buf_readb(dev, buf, 1);
27577 +
27578 + /* check more data */
27579 + if ( frameCtrlMSB & ZM_BIT_5 )
27580 + {
27581 + //if rx frame's AC is not delivery-enabled
27582 + if ((wd->sta.qosInfo&0xf) != 0xf)
27583 + {
27584 + u8_t rxAc = 0;
27585 + if ((frameSubtype & 0x80) != 0)
27586 + {
27587 + rxAc = zcUpToAc[zmw_buf_readb(dev, buf, 24)&0x7];
27588 + }
27589 +
27590 + if (((0x8>>rxAc) & wd->sta.qosInfo) == 0)
27591 + {
27592 + zfSendPSPoll(dev);
27593 + wd->sta.psMgr.tempWakeUp = 0;
27594 + }
27595 + }
27596 + }
27597 + }
27598 + /*increase beacon count when receive vaild data frame from AP*/
27599 + ZM_MAC_WORD_TO_BYTE(wd->sta.bssid, bssid);
27600 +
27601 + if (zfStaIsConnected(dev)&&
27602 + zfRxBufferEqualToStr(dev, buf, bssid, ZM_WLAN_HEADER_A2_OFFSET, 6))
27603 + {
27604 + wd->sta.rxBeaconCount++;
27605 + }
27606 + }
27607 +
27608 + zm_msg1_rx(ZM_LV_2, "Rx VAP=", vap);
27609 +
27610 + /* handle IV, EXT-IV, ICV, and EXT-ICV */
27611 + zfGetRxIvIcvLength(dev, buf, vap, &offset, &tailLen, addInfo);
27612 +
27613 + zfStaIbssPSCheckState(dev, buf);
27614 + //QoS data frame
27615 + if ((frameSubtype & 0x80) == 0x80)
27616 + {
27617 + offset += 2;
27618 + }
27619 +
27620 + len = zfwBufGetSize(dev, buf);
27621 + /* remove ICV */
27622 + if (tailLen > 0)
27623 + {
27624 + if (len > tailLen)
27625 + {
27626 + len -= tailLen;
27627 + zfwBufSetSize(dev, buf, len);
27628 + }
27629 + }
27630 +
27631 + /* Filter NULL data */
27632 + if (((frameSubtype&0x40) != 0) || ((len = zfwBufGetSize(dev, buf))<=24))
27633 + {
27634 + zm_msg1_rx(ZM_LV_1, "Free Rx NULL data, len=", len);
27635 + zfwBufFree(dev, buf, 0);
27636 + return;
27637 + }
27638 +
27639 + /* check and handle defragmentation */
27640 + if ( wd->sta.bSafeMode && (wd->sta.wepStatus == ZM_ENCRYPTION_AES) && wd->sta.SWEncryptEnable )
27641 + {
27642 + zm_msg0_rx(ZM_LV_1, "Bypass defragmentation packets in safe mode");
27643 + }
27644 + else
27645 + {
27646 + if ( (buf = zfDefragment(dev, buf, &bIsDefrag, addInfo)) == NULL )
27647 + {
27648 + /* In this case, the buffer has been freed in zfDefragment */
27649 + return;
27650 + }
27651 + }
27652 +
27653 + ret = ZM_MIC_SUCCESS;
27654 +
27655 + /* If SW WEP/TKIP are not turned on */
27656 + if ((wd->sta.SWEncryptEnable & ZM_SW_TKIP_DECRY_EN) == 0 &&
27657 + (wd->sta.SWEncryptEnable & ZM_SW_WEP_DECRY_EN) == 0)
27658 + {
27659 + encryMode = zfGetEncryModeFromRxStatus(addInfo);
27660 +
27661 + /* check if TKIP */
27662 + if ( encryMode == ZM_TKIP )
27663 + {
27664 + if ( bIsDefrag )
27665 + {
27666 + ret = zfMicRxVerify(dev, buf);
27667 + }
27668 + else
27669 + {
27670 + /* check MIC failure bit */
27671 + if ( ZM_RX_STATUS_IS_MIC_FAIL(addInfo) )
27672 + {
27673 + ret = ZM_MIC_FAILURE;
27674 + }
27675 + }
27676 +
27677 + if ( ret == ZM_MIC_FAILURE )
27678 + {
27679 + u8_t Unicast_Pkt = 0x0;
27680 +
27681 + if ((zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET) & 0x1) == 0)
27682 + {
27683 + wd->commTally.swRxUnicastMicFailCount++;
27684 + Unicast_Pkt = 0x1;
27685 + }/*
27686 + else if (zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET) == 0xffff)
27687 + {
27688 + wd->commTally.swRxMulticastMicFailCount++;
27689 + }*/
27690 + else
27691 + {
27692 + wd->commTally.swRxMulticastMicFailCount++;
27693 + }
27694 + if ( wd->wlanMode == ZM_MODE_AP )
27695 + {
27696 + u16_t idx;
27697 + u8_t addr[6];
27698 +
27699 + for (idx=0; idx<6; idx++)
27700 + {
27701 + addr[idx] = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+idx);
27702 + }
27703 +
27704 + if (wd->zfcbApMicFailureNotify != NULL)
27705 + {
27706 + wd->zfcbApMicFailureNotify(dev, addr, buf);
27707 + }
27708 + }
27709 + else
27710 + {
27711 + if(Unicast_Pkt)
27712 + {
27713 + zm_debug_msg0("Countermeasure : Unicast_Pkt ");
27714 + }
27715 + else
27716 + {
27717 + zm_debug_msg0("Countermeasure : Non-Unicast_Pkt ");
27718 + }
27719 +
27720 + if((wd->TKIP_Group_KeyChanging == 0x0) || (Unicast_Pkt == 0x1))
27721 + {
27722 + zm_debug_msg0("Countermeasure : Do MIC Check ");
27723 + zfStaMicFailureHandling(dev, buf);
27724 + }
27725 + else
27726 + {
27727 + zm_debug_msg0("Countermeasure : SKIP MIC Check due to Group Keychanging ");
27728 + }
27729 + }
27730 + /* Discard MIC failed frame */
27731 + zfwBufFree(dev, buf, 0);
27732 + return;
27733 + }
27734 + }
27735 + }
27736 + else
27737 + {
27738 + u8_t IsEncryFrame;
27739 +
27740 + /* TODO: Check whether WEP bit is turned on in MAC header */
27741 + encryMode = ZM_NO_WEP;
27742 +
27743 + IsEncryFrame = (zmw_rx_buf_readb(dev, buf, 1) & 0x40);
27744 +
27745 + if (IsEncryFrame)
27746 + {
27747 + /* Software decryption for TKIP */
27748 + if (wd->sta.SWEncryptEnable & ZM_SW_TKIP_DECRY_EN)
27749 + {
27750 + u16_t iv16;
27751 + u16_t iv32;
27752 + u8_t RC4Key[16];
27753 + u16_t IvOffset;
27754 + struct zsTkipSeed *rxSeed;
27755 +
27756 + IvOffset = offset + ZM_SIZE_OF_WLAN_DATA_HEADER;
27757 +
27758 + rxSeed = zfStaGetRxSeed(dev, buf);
27759 +
27760 + if (rxSeed == NULL)
27761 + {
27762 + zm_debug_msg0("rxSeed is NULL");
27763 +
27764 + /* Discard this frame */
27765 + zfwBufFree(dev, buf, 0);
27766 + return;
27767 + }
27768 +
27769 + iv16 = (zmw_rx_buf_readb(dev, buf, IvOffset) << 8) + zmw_rx_buf_readb(dev, buf, IvOffset+2);
27770 + iv32 = zmw_rx_buf_readb(dev, buf, IvOffset+4) +
27771 + (zmw_rx_buf_readb(dev, buf, IvOffset+5) << 8) +
27772 + (zmw_rx_buf_readb(dev, buf, IvOffset+6) << 16) +
27773 + (zmw_rx_buf_readb(dev, buf, IvOffset+7) << 24);
27774 +
27775 + /* TKIP Key Mixing */
27776 + zfTkipPhase1KeyMix(iv32, rxSeed);
27777 + zfTkipPhase2KeyMix(iv16, rxSeed);
27778 + zfTkipGetseeds(iv16, RC4Key, rxSeed);
27779 +
27780 + /* Decrypt Data */
27781 + ret = zfTKIPDecrypt(dev, buf, IvOffset+ZM_SIZE_OF_IV+ZM_SIZE_OF_EXT_IV, 16, RC4Key);
27782 +
27783 + if (ret == ZM_ICV_FAILURE)
27784 + {
27785 + zm_debug_msg0("TKIP ICV fail");
27786 +
27787 + /* Discard ICV failed frame */
27788 + zfwBufFree(dev, buf, 0);
27789 + return;
27790 + }
27791 +
27792 + /* Remove ICV from buffer */
27793 + zfwBufSetSize(dev, buf, len-4);
27794 +
27795 + /* Check MIC */
27796 + ret = zfMicRxVerify(dev, buf);
27797 +
27798 + if (ret == ZM_MIC_FAILURE)
27799 + {
27800 + if ((zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET) & 0x1) == 0)
27801 + {
27802 + wd->commTally.swRxUnicastMicFailCount++;
27803 + }
27804 + else if (zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET) == 0xffff)
27805 + {
27806 + wd->commTally.swRxMulticastMicFailCount++;
27807 + }
27808 + else
27809 + {
27810 + wd->commTally.swRxMulticastMicFailCount++;
27811 + }
27812 + if ( wd->wlanMode == ZM_MODE_AP )
27813 + {
27814 + u16_t idx;
27815 + u8_t addr[6];
27816 +
27817 + for (idx=0; idx<6; idx++)
27818 + {
27819 + addr[idx] = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+idx);
27820 + }
27821 +
27822 + if (wd->zfcbApMicFailureNotify != NULL)
27823 + {
27824 + wd->zfcbApMicFailureNotify(dev, addr, buf);
27825 + }
27826 + }
27827 + else
27828 + {
27829 + zfStaMicFailureHandling(dev, buf);
27830 + }
27831 +
27832 + zm_debug_msg0("MIC fail");
27833 + /* Discard MIC failed frame */
27834 + zfwBufFree(dev, buf, 0);
27835 + return;
27836 + }
27837 +
27838 + encryMode = ZM_TKIP;
27839 + offset += ZM_SIZE_OF_IV + ZM_SIZE_OF_EXT_IV;
27840 + }
27841 + else if(wd->sta.SWEncryptEnable & ZM_SW_WEP_DECRY_EN)
27842 + {
27843 + u16_t IvOffset;
27844 + u8_t keyLen = 5;
27845 + u8_t iv[3];
27846 + u8_t *wepKey;
27847 + u8_t keyIdx;
27848 +
27849 + IvOffset = offset + ZM_SIZE_OF_WLAN_DATA_HEADER;
27850 +
27851 + /* Retrieve IV */
27852 + iv[0] = zmw_rx_buf_readb(dev, buf, IvOffset);
27853 + iv[1] = zmw_rx_buf_readb(dev, buf, IvOffset+1);
27854 + iv[2] = zmw_rx_buf_readb(dev, buf, IvOffset+2);
27855 +
27856 + keyIdx = ((zmw_rx_buf_readb(dev, buf, IvOffset+3) >> 6) & 0x03);
27857 +
27858 + IvOffset += ZM_SIZE_OF_IV;
27859 +
27860 + if (wd->sta.SWEncryMode[keyIdx] == ZM_WEP64)
27861 + {
27862 + keyLen = 5;
27863 + }
27864 + else if (wd->sta.SWEncryMode[keyIdx] == ZM_WEP128)
27865 + {
27866 + keyLen = 13;
27867 + }
27868 + else if (wd->sta.SWEncryMode[keyIdx] == ZM_WEP256)
27869 + {
27870 + keyLen = 29;
27871 + }
27872 +
27873 + zfWEPDecrypt(dev, buf, IvOffset, keyLen, wd->sta.wepKey[keyIdx], iv);
27874 +
27875 + if (ret == ZM_ICV_FAILURE)
27876 + {
27877 + zm_debug_msg0("WEP ICV fail");
27878 +
27879 + /* Discard ICV failed frame */
27880 + zfwBufFree(dev, buf, 0);
27881 + return;
27882 + }
27883 +
27884 + encryMode = wd->sta.SWEncryMode[keyIdx];
27885 +
27886 + /* Remove ICV from buffer */
27887 + zfwBufSetSize(dev, buf, len-4);
27888 +
27889 + offset += ZM_SIZE_OF_IV;
27890 + }
27891 + }
27892 + }
27893 +
27894 +#ifdef ZM_ENABLE_CENC
27895 + //else if ( encryMode == ZM_CENC ) /* check if CENC */
27896 + if ( encryMode == ZM_CENC )
27897 + {
27898 + u32_t rxIV[4];
27899 +
27900 + rxIV[0] = (zmw_rx_buf_readh(dev, buf, 28) << 16)
27901 + + zmw_rx_buf_readh(dev, buf, 26);
27902 + rxIV[1] = (zmw_rx_buf_readh(dev, buf, 32) << 16)
27903 + + zmw_rx_buf_readh(dev, buf, 30);
27904 + rxIV[2] = (zmw_rx_buf_readh(dev, buf, 36) << 16)
27905 + + zmw_rx_buf_readh(dev, buf, 34);
27906 + rxIV[3] = (zmw_rx_buf_readh(dev, buf, 40) << 16)
27907 + + zmw_rx_buf_readh(dev, buf, 38);
27908 +
27909 + //zm_debug_msg2("rxIV[0] = 0x", rxIV[0]);
27910 + //zm_debug_msg2("rxIV[1] = 0x", rxIV[1]);
27911 + //zm_debug_msg2("rxIV[2] = 0x", rxIV[2]);
27912 + //zm_debug_msg2("rxIV[3] = 0x", rxIV[3]);
27913 +
27914 + /* destination address*/
27915 + da[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET);
27916 + da[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET+2);
27917 + da[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET+4);
27918 +
27919 + if ( wd->wlanMode == ZM_MODE_AP )
27920 + {
27921 + }
27922 + else
27923 + {
27924 + if ((da[0] & 0x1))
27925 + { //multicast frame
27926 + /* Accumlate the PN sequence */
27927 + wd->sta.rxivGK[0] ++;
27928 +
27929 + if (wd->sta.rxivGK[0] == 0)
27930 + {
27931 + wd->sta.rxivGK[1]++;
27932 + }
27933 +
27934 + if (wd->sta.rxivGK[1] == 0)
27935 + {
27936 + wd->sta.rxivGK[2]++;
27937 + }
27938 +
27939 + if (wd->sta.rxivGK[2] == 0)
27940 + {
27941 + wd->sta.rxivGK[3]++;
27942 + }
27943 +
27944 + if (wd->sta.rxivGK[3] == 0)
27945 + {
27946 + wd->sta.rxivGK[0] = 0;
27947 + wd->sta.rxivGK[1] = 0;
27948 + wd->sta.rxivGK[2] = 0;
27949 + }
27950 +
27951 + //zm_debug_msg2("wd->sta.rxivGK[0] = 0x", wd->sta.rxivGK[0]);
27952 + //zm_debug_msg2("wd->sta.rxivGK[1] = 0x", wd->sta.rxivGK[1]);
27953 + //zm_debug_msg2("wd->sta.rxivGK[2] = 0x", wd->sta.rxivGK[2]);
27954 + //zm_debug_msg2("wd->sta.rxivGK[3] = 0x", wd->sta.rxivGK[3]);
27955 +
27956 + if ( !((wd->sta.rxivGK[0] == rxIV[0])
27957 + && (wd->sta.rxivGK[1] == rxIV[1])
27958 + && (wd->sta.rxivGK[2] == rxIV[2])
27959 + && (wd->sta.rxivGK[3] == rxIV[3])))
27960 + {
27961 + u8_t PacketDiscard = 0;
27962 + /* Discard PN Code Error frame */
27963 + if (rxIV[0] < wd->sta.rxivGK[0])
27964 + {
27965 + PacketDiscard = 1;
27966 + }
27967 + if (wd->sta.rxivGK[0] > 0xfffffff0)
27968 + { //boundary case
27969 + if ((rxIV[0] < 0xfffffff0)
27970 + && (((0xffffffff - wd->sta.rxivGK[0]) + rxIV[0]) > 16))
27971 + {
27972 + PacketDiscard = 1;
27973 + }
27974 + }
27975 + else
27976 + { //normal case
27977 + if ((rxIV[0] - wd->sta.rxivGK[0]) > 16)
27978 + {
27979 + PacketDiscard = 1;
27980 + }
27981 + }
27982 + // sync sta pn code with ap because of losting some packets
27983 + wd->sta.rxivGK[0] = rxIV[0];
27984 + wd->sta.rxivGK[1] = rxIV[1];
27985 + wd->sta.rxivGK[2] = rxIV[2];
27986 + wd->sta.rxivGK[3] = rxIV[3];
27987 + if (PacketDiscard)
27988 + {
27989 + zm_debug_msg0("Discard PN Code lost too much multicast frame");
27990 + zfwBufFree(dev, buf, 0);
27991 + return;
27992 + }
27993 + }
27994 + }
27995 + else
27996 + { //unicast frame
27997 + /* Accumlate the PN sequence */
27998 + wd->sta.rxiv[0] += 2;
27999 +
28000 + if (wd->sta.rxiv[0] == 0 || wd->sta.rxiv[0] == 1)
28001 + {
28002 + wd->sta.rxiv[1]++;
28003 + }
28004 +
28005 + if (wd->sta.rxiv[1] == 0)
28006 + {
28007 + wd->sta.rxiv[2]++;
28008 + }
28009 +
28010 + if (wd->sta.rxiv[2] == 0)
28011 + {
28012 + wd->sta.rxiv[3]++;
28013 + }
28014 +
28015 + if (wd->sta.rxiv[3] == 0)
28016 + {
28017 + wd->sta.rxiv[0] = 0;
28018 + wd->sta.rxiv[1] = 0;
28019 + wd->sta.rxiv[2] = 0;
28020 + }
28021 +
28022 + //zm_debug_msg2("wd->sta.rxiv[0] = 0x", wd->sta.rxiv[0]);
28023 + //zm_debug_msg2("wd->sta.rxiv[1] = 0x", wd->sta.rxiv[1]);
28024 + //zm_debug_msg2("wd->sta.rxiv[2] = 0x", wd->sta.rxiv[2]);
28025 + //zm_debug_msg2("wd->sta.rxiv[3] = 0x", wd->sta.rxiv[3]);
28026 +
28027 + if ( !((wd->sta.rxiv[0] == rxIV[0])
28028 + && (wd->sta.rxiv[1] == rxIV[1])
28029 + && (wd->sta.rxiv[2] == rxIV[2])
28030 + && (wd->sta.rxiv[3] == rxIV[3])))
28031 + {
28032 + zm_debug_msg0("PN Code mismatch, lost unicast frame, sync pn code to recv packet");
28033 + // sync sta pn code with ap because of losting some packets
28034 + wd->sta.rxiv[0] = rxIV[0];
28035 + wd->sta.rxiv[1] = rxIV[1];
28036 + wd->sta.rxiv[2] = rxIV[2];
28037 + wd->sta.rxiv[3] = rxIV[3];
28038 + /* Discard PN Code Error frame */
28039 + //zm_debug_msg0("Discard PN Code mismatch unicast frame");
28040 + //zfwBufFree(dev, buf, 0);
28041 + //return;
28042 + }
28043 + }
28044 + }
28045 + }
28046 +#endif //ZM_ENABLE_CENC
28047 +
28048 + /* for tally */
28049 + if ((zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET) & 0x1) == 0)
28050 + {
28051 + /* for ACU to display RxRate */
28052 + zfWlanUpdateRxRate(dev, addInfo);
28053 +
28054 + wd->commTally.rxUnicastFrm++;
28055 + wd->commTally.rxUnicastOctets += (len-24);
28056 + }
28057 + else if (zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET) == 0xffff)
28058 + {
28059 + wd->commTally.rxBroadcastFrm++;
28060 + wd->commTally.rxBroadcastOctets += (len-24);
28061 + }
28062 + else
28063 + {
28064 + wd->commTally.rxMulticastFrm++;
28065 + wd->commTally.rxMulticastOctets += (len-24);
28066 + }
28067 + wd->ledStruct.rxTraffic++;
28068 +
28069 + if ((frameSubtype & 0x80) == 0x80)
28070 + {
28071 + /* if QoS control bit-7 is 1 => A-MSDU frame */
28072 + if ((zmw_rx_buf_readh(dev, buf, 24) & 0x80) != 0)
28073 + {
28074 + zfDeAmsdu(dev, buf, vap, encryMode);
28075 + return;
28076 + }
28077 + }
28078 +
28079 + // Remove MIC of TKIP
28080 + if ( encryMode == ZM_TKIP )
28081 + {
28082 + zfwBufSetSize(dev, buf, zfwBufGetSize(dev, buf) - 8);
28083 + }
28084 +
28085 + /* Convert 802.11 and SNAP header to ethernet header */
28086 + if ( (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)||
28087 + (wd->wlanMode == ZM_MODE_IBSS) )
28088 + {
28089 + /* destination address*/
28090 + da[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET);
28091 + da[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET+2);
28092 + da[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET+4);
28093 +
28094 + /* check broadcast frame */
28095 + if ( (da[0] == 0xffff) && (da[1] == 0xffff) && (da[2] == 0xffff) )
28096 + {
28097 + // Ap send broadcast frame to the DUT !
28098 + }
28099 + /* check multicast frame */
28100 + /* TODO : Remove these code, hardware should be able to block */
28101 + /* multicast frame on the multicast address list */
28102 + /* or bypass all multicast packet by flag bAllMulticast */
28103 + else if ((da[0] & 0x01) && (wd->sta.bAllMulticast == 0))
28104 + {
28105 + for(ii=0; ii<wd->sta.multicastList.size; ii++)
28106 + {
28107 + if ( zfMemoryIsEqual(wd->sta.multicastList.macAddr[ii].addr,
28108 + (u8_t*) da, 6))
28109 + {
28110 + break;
28111 + }
28112 + }
28113 +
28114 + if ( ii == wd->sta.multicastList.size )
28115 + { /* not found */
28116 + zm_debug_msg0("discard unknown multicast frame");
28117 +
28118 + zfwBufFree(dev, buf, 0);
28119 + return;
28120 + }
28121 + }
28122 +
28123 +#ifdef ZM_ENABLE_NATIVE_WIFI //Native Wifi : 1, Ethernet format : 0
28124 + //To remove IV
28125 + if (offset > 0)
28126 + {
28127 + for (i=12; i>0; i--)
28128 + {
28129 + zmw_rx_buf_writeh(dev, buf, ((i-1)*2)+offset,
28130 + zmw_rx_buf_readh(dev, buf, (i-1)*2));
28131 + }
28132 + zfwBufRemoveHead(dev, buf, offset);
28133 + }
28134 +#else
28135 +
28136 + if (zfRxBufferEqualToStr(dev, buf, zgSnapBridgeTunnel,
28137 + 24+offset, 6))
28138 + {
28139 + snapCase = 1;
28140 + }
28141 + else if ( zfRxBufferEqualToStr(dev, buf, zgSnap8021h,
28142 + 24+offset, 6) )
28143 + {
28144 + typeLengthField =
28145 + (((u16_t) zmw_rx_buf_readb(dev, buf, 30+offset)) << 8) +
28146 + zmw_rx_buf_readb(dev, buf, 31+offset);
28147 +
28148 + //zm_debug_msg2("tpyeLengthField = ", typeLengthField);
28149 +
28150 + //8137 : IPX, 80F3 : Appletalk
28151 + if ( (typeLengthField != 0x8137)&&
28152 + (typeLengthField != 0x80F3) )
28153 + {
28154 + snapCase = 2;
28155 + }
28156 +
28157 + if ( typeLengthField == 0x888E )
28158 + {
28159 + zfShowRxEAPOL(dev, buf, 32);
28160 + }
28161 + }
28162 + else
28163 + {
28164 + //zfwDumpBuf(dev, buf);
28165 + }
28166 +
28167 + /* source address */
28168 + if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
28169 + {
28170 + /* SA = Address 3 */
28171 + sa[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET);
28172 + sa[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+2);
28173 + sa[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+4);
28174 + }
28175 + else
28176 + {
28177 + /* SA = Address 2 */
28178 + sa[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET);
28179 + sa[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+2);
28180 + sa[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+4);
28181 + }
28182 +
28183 + if ( snapCase )
28184 + {
28185 + /* SA */
28186 + zmw_rx_buf_writeh(dev, buf, 24+offset, sa[0]);
28187 + zmw_rx_buf_writeh(dev, buf, 26+offset, sa[1]);
28188 + zmw_rx_buf_writeh(dev, buf, 28+offset, sa[2]);
28189 +
28190 + /* DA = Address 1 */
28191 + zmw_rx_buf_writeh(dev, buf, 18+offset, da[0]);
28192 + zmw_rx_buf_writeh(dev, buf, 20+offset, da[1]);
28193 + zmw_rx_buf_writeh(dev, buf, 22+offset, da[2]);
28194 + zfwBufRemoveHead(dev, buf, 18+offset);
28195 + }
28196 + else
28197 + {
28198 + /* SA */
28199 + zmw_rx_buf_writeh(dev, buf, 16+offset, sa[0]);
28200 + zmw_rx_buf_writeh(dev, buf, 18+offset, sa[1]);
28201 + zmw_rx_buf_writeh(dev, buf, 20+offset, sa[2]);
28202 +
28203 + /* DA = Address 1 */
28204 + zmw_rx_buf_writeh(dev, buf, 10+offset, da[0]);
28205 + zmw_rx_buf_writeh(dev, buf, 12+offset, da[1]);
28206 + zmw_rx_buf_writeh(dev, buf, 14+offset, da[2]);
28207 + zfwBufRemoveHead(dev, buf, 10+offset);
28208 + /* Ethernet payload length */
28209 + typeLengthField = zfwBufGetSize(dev, buf) - 14;
28210 + zmw_rx_buf_writeh(dev, buf, 12, (typeLengthField<<8)+(typeLengthField>>8));
28211 + }
28212 +#endif // ZM_ENABLE_NATIVE_WIFI
28213 + }
28214 + else if (wd->wlanMode == ZM_MODE_AP)
28215 + {
28216 + //if ((zmw_rx_buf_readb(dev, buf, 1) & 0x3) != 3)
28217 + if (vap < ZM_MAX_AP_SUPPORT)
28218 + /* AP mode */
28219 + {
28220 +#ifdef ZM_ENABLE_NATIVE_WIFI //Native Wifi : 1, Ethernet format : 0
28221 + //To remove IV
28222 + if (offset > 0)
28223 + {
28224 + for (i=12; i>0; i--)
28225 + {
28226 + zmw_rx_buf_writeh(dev, buf, ((i-1)*2)+offset,
28227 + zmw_rx_buf_readh(dev, buf, (i-1)*2));
28228 + }
28229 + zfwBufRemoveHead(dev, buf, offset);
28230 + }
28231 +#else
28232 + /* SA = Address 2 */
28233 + zmw_rx_buf_writeh(dev, buf, 24+offset, zmw_rx_buf_readh(dev, buf,
28234 + ZM_WLAN_HEADER_A2_OFFSET));
28235 + zmw_rx_buf_writeh(dev, buf, 26+offset, zmw_rx_buf_readh(dev, buf,
28236 + ZM_WLAN_HEADER_A2_OFFSET+2));
28237 + zmw_rx_buf_writeh(dev, buf, 28+offset, zmw_rx_buf_readh(dev, buf,
28238 + ZM_WLAN_HEADER_A2_OFFSET+4));
28239 + /* DA = Address 3 */
28240 + /* Seq : Read 20 write 22, read 18 write 20, read 16 write 18 */
28241 + /* sequence must not be inverted */
28242 + zmw_rx_buf_writeh(dev, buf, 22+offset, zmw_rx_buf_readh(dev, buf,
28243 + ZM_WLAN_HEADER_A3_OFFSET+4));
28244 + zmw_rx_buf_writeh(dev, buf, 20+offset, zmw_rx_buf_readh(dev, buf,
28245 + ZM_WLAN_HEADER_A3_OFFSET+2));
28246 + zmw_rx_buf_writeh(dev, buf, 18+offset, zmw_rx_buf_readh(dev, buf,
28247 + ZM_WLAN_HEADER_A3_OFFSET));
28248 + zfwBufRemoveHead(dev, buf, 18+offset);
28249 +#endif // ZM_ENABLE_NATIVE_WIFI
28250 + #if 1
28251 + if ((ret = zfIntrabssForward(dev, buf, vap)) == 1)
28252 + {
28253 + /* Free Rx buffer if intra-BSS unicast frame */
28254 + zm_msg0_rx(ZM_LV_2, "Free intra-BSS unicast frame");
28255 + zfwBufFree(dev, buf, 0);
28256 + return;
28257 + }
28258 + #endif
28259 + }
28260 + else
28261 + /* WDS mode */
28262 + {
28263 + zm_msg0_rx(ZM_LV_2, "Rx WDS data");
28264 +
28265 + /* SA = Address 4 */
28266 + zmw_rx_buf_writeh(dev, buf, 30+offset, zmw_rx_buf_readh(dev, buf,
28267 + ZM_WLAN_HEADER_A4_OFFSET));
28268 + zmw_rx_buf_writeh(dev, buf, 32+offset, zmw_rx_buf_readh(dev, buf,
28269 + ZM_WLAN_HEADER_A4_OFFSET+2));
28270 + zmw_rx_buf_writeh(dev, buf, 34+offset, zmw_rx_buf_readh(dev, buf,
28271 + ZM_WLAN_HEADER_A4_OFFSET+4));
28272 + /* DA = Address 3 */
28273 + /* Seq : Read 20 write 22, read 18 write 20, read 16 write 18 */
28274 + /* sequence must not be inverted */
28275 + zmw_rx_buf_writeh(dev, buf, 28+offset, zmw_rx_buf_readh(dev, buf,
28276 + ZM_WLAN_HEADER_A3_OFFSET+4));
28277 + zmw_rx_buf_writeh(dev, buf, 26+offset, zmw_rx_buf_readh(dev, buf,
28278 + ZM_WLAN_HEADER_A3_OFFSET+2));
28279 + zmw_rx_buf_writeh(dev, buf, 24+offset, zmw_rx_buf_readh(dev, buf,
28280 + ZM_WLAN_HEADER_A3_OFFSET));
28281 + zfwBufRemoveHead(dev, buf, 24+offset);
28282 + }
28283 + }
28284 + else if (wd->wlanMode == ZM_MODE_PSEUDO)
28285 + {
28286 + /* WDS test: remove add4 */
28287 + if (wd->enableWDS)
28288 + {
28289 + offset += 6;
28290 + }
28291 +
28292 + /* SA = Address 2 */
28293 + zmw_rx_buf_writeh(dev, buf, 24+offset, zmw_rx_buf_readh(dev, buf,
28294 + ZM_WLAN_HEADER_A2_OFFSET));
28295 + zmw_rx_buf_writeh(dev, buf, 26+offset, zmw_rx_buf_readh(dev, buf,
28296 + ZM_WLAN_HEADER_A2_OFFSET+2));
28297 + zmw_rx_buf_writeh(dev, buf, 28+offset, zmw_rx_buf_readh(dev, buf,
28298 + ZM_WLAN_HEADER_A2_OFFSET+4));
28299 + /* DA = Address 1 */
28300 + zmw_rx_buf_writeh(dev, buf, 18+offset, zmw_rx_buf_readh(dev, buf,
28301 + ZM_WLAN_HEADER_A1_OFFSET));
28302 + zmw_rx_buf_writeh(dev, buf, 20+offset, zmw_rx_buf_readh(dev, buf,
28303 + ZM_WLAN_HEADER_A1_OFFSET+2));
28304 + zmw_rx_buf_writeh(dev, buf, 22+offset, zmw_rx_buf_readh(dev, buf,
28305 + ZM_WLAN_HEADER_A1_OFFSET+4));
28306 + zfwBufRemoveHead(dev, buf, 18+offset);
28307 + }
28308 + else
28309 + {
28310 + zm_assert(0);
28311 + }
28312 +
28313 + /* Call zfwRecvEth() to notify upper layer */
28314 + //zm_msg2_rx(ZM_LV_2, "Call zfwRecvEth(), buf=", buf);
28315 + //zfwDumpBuf(dev, buf);
28316 +
28317 + #if ZM_PROTOCOL_RESPONSE_SIMULATION == 1
28318 + zfProtRspSim(dev, buf);
28319 + #endif
28320 + //zfwDumpBuf(dev, buf);
28321 +
28322 + /* tally */
28323 + wd->commTally.NotifyNDISRxFrmCnt++;
28324 +
28325 + if (wd->zfcbRecvEth != NULL)
28326 + {
28327 + wd->zfcbRecvEth(dev, buf, vap);
28328 + ZM_PERFORMANCE_RX_MSDU(dev, wd->tick)
28329 + }
28330 + }
28331 + /* if management frame */
28332 + else if (frameType == ZM_WLAN_MANAGEMENT_FRAME)
28333 + {
28334 + zm_msg2_rx(ZM_LV_2, "Rx management,FC=", frameCtrl);
28335 + /* Call zfProcessManagement() to handle management frame */
28336 + zfProcessManagement(dev, buf, addInfo); //CWYang(m)
28337 + zfwBufFree(dev, buf, 0);
28338 + }
28339 + /* PsPoll */
28340 + else if ((wd->wlanMode == ZM_MODE_AP) && (frameCtrl == 0xa4))
28341 + {
28342 + zm_msg0_rx(ZM_LV_0, "Rx PsPoll");
28343 + zfApProcessPsPoll(dev, buf);
28344 + zfwBufFree(dev, buf, 0);
28345 + }
28346 + else
28347 + {
28348 + zm_msg0_rx(ZM_LV_1, "Rx discard!!");
28349 + wd->commTally.DriverDiscardedFrm++;
28350 +
28351 + zfwBufFree(dev, buf, 0);
28352 + }
28353 + return;
28354 +}
28355 +
28356 +
28357 +/************************************************************************/
28358 +/* */
28359 +/* FUNCTION DESCRIPTION zfWlanRxValidate */
28360 +/* Validate Rx frame. */
28361 +/* */
28362 +/* INPUTS */
28363 +/* dev : device pointer */
28364 +/* buf : received 802.11 frame buffer. */
28365 +/* */
28366 +/* OUTPUTS */
28367 +/* Error code */
28368 +/* */
28369 +/* AUTHOR */
28370 +/* Stephen ZyDAS Technology Corporation 2005.10 */
28371 +/* */
28372 +/************************************************************************/
28373 +u16_t zfWlanRxValidate(zdev_t* dev, zbuf_t* buf)
28374 +{
28375 + u16_t frameType;
28376 + u16_t frameCtrl;
28377 + u16_t frameLen;
28378 + u16_t ret;
28379 + u8_t frameSubType;
28380 +
28381 + zmw_get_wlan_dev(dev);
28382 +
28383 + frameCtrl = zmw_rx_buf_readh(dev, buf, 0);
28384 + frameType = frameCtrl & 0xC;
28385 + frameSubType = (frameCtrl & 0xF0) >> 4;
28386 +
28387 + frameLen = zfwBufGetSize(dev, buf);
28388 +
28389 + /* Accept Data/Management frame with protocol version = 0 */
28390 + if ((frameType == 0x8) || (frameType == 0x0))
28391 + {
28392 +
28393 + /* TODO : check rx status => erro bit */
28394 +
28395 + /* Check Minimum Length with Wep */
28396 + if ((frameCtrl & 0x4000) != 0)
28397 + {
28398 + /* Minimum Length = */
28399 + /* PLCP(5)+Header(24)+IV(4)+ICV(4)+CRC(4)+RxStatus(8) */
28400 + if (frameLen < 32)
28401 + {
28402 + return ZM_ERR_MIN_RX_ENCRYPT_FRAME_LENGTH;
28403 + }
28404 + }
28405 + else if ( frameSubType == 0x5 || frameSubType == 0x8 )
28406 + {
28407 + /* Minimum Length = PLCP(5)+MACHeader(24)+Timestamp(8)+BeaconInterval(2)+Cap(2)+CRC(4)+RxStatus(8) */
28408 + if (frameLen < 36)
28409 + {
28410 + return ZM_ERR_MIN_RX_FRAME_LENGTH;
28411 + }
28412 + }
28413 + else
28414 + {
28415 + /* Minimum Length = PLCP(5)+MACHeader(24)+CRC(4)+RxStatus(8) */
28416 + if (frameLen < 24)
28417 + {
28418 + return ZM_ERR_MIN_RX_FRAME_LENGTH;
28419 + }
28420 + }
28421 +
28422 + /* Check if frame Length > ZM_WLAN_MAX_RX_SIZE. */
28423 + if (frameLen > ZM_WLAN_MAX_RX_SIZE)
28424 + {
28425 + return ZM_ERR_MAX_RX_FRAME_LENGTH;
28426 + }
28427 + }
28428 + else if ((frameCtrl&0xff) == 0xa4)
28429 + {
28430 + /* PsPoll */
28431 + //zm_msg0_rx(ZM_LV_0, "rx pspoll");
28432 + }
28433 + else if ((frameCtrl&0xff) == ZM_WLAN_FRAME_TYPE_BAR)
28434 + {
28435 + if (wd->sta.enableDrvBA == 1)
28436 + {
28437 + zfAggRecvBAR(dev, buf);
28438 + }
28439 +
28440 + return ZM_ERR_RX_BAR_FRAME;
28441 + }
28442 + else
28443 + {
28444 + return ZM_ERR_RX_FRAME_TYPE;
28445 + }
28446 +
28447 + if ( wd->wlanMode == ZM_MODE_AP )
28448 + {
28449 + }
28450 + else if ( wd->wlanMode != ZM_MODE_PSEUDO )
28451 + {
28452 + if ( (ret=zfStaRxValidateFrame(dev, buf))!=ZM_SUCCESS )
28453 + {
28454 + //zm_debug_msg1("discard frame, code = ", ret);
28455 + return ret;
28456 + }
28457 + }
28458 +
28459 + return ZM_SUCCESS;
28460 +}
28461 +
28462 +
28463 +/************************************************************************/
28464 +/* */
28465 +/* FUNCTION DESCRIPTION zfWlanRxFilter */
28466 +/* Filter duplicated frame. */
28467 +/* */
28468 +/* INPUTS */
28469 +/* dev : device pointer */
28470 +/* buf : received 802.11 frame buffer. */
28471 +/* */
28472 +/* OUTPUTS */
28473 +/* Error code */
28474 +/* */
28475 +/* AUTHOR */
28476 +/* Stephen ZyDAS Technology Corporation 2005.10 */
28477 +/* */
28478 +/************************************************************************/
28479 +u16_t zfWlanRxFilter(zdev_t* dev, zbuf_t* buf)
28480 +{
28481 + u16_t src[3];
28482 + u16_t dst0;
28483 + u16_t frameType;
28484 + u16_t seq;
28485 + u16_t offset;
28486 + u16_t index;
28487 + u16_t col;
28488 + u16_t i;
28489 + u8_t up = 0; /* User priority */
28490 +
28491 + zmw_get_wlan_dev(dev);
28492 +
28493 + zmw_declare_for_critical_section();
28494 +
28495 + ZM_BUFFER_TRACE(dev, buf)
28496 +
28497 + /* RX PREFIX */
28498 + offset = 0;
28499 +
28500 + frameType = zmw_rx_buf_readh(dev, buf, offset);
28501 +
28502 + // Don't divide 2^4 because we don't want the fragementation pkt to be treated as
28503 + // duplicated frames
28504 + seq = zmw_rx_buf_readh(dev, buf, offset+22);
28505 + dst0 = zmw_rx_buf_readh(dev, buf, offset+4);
28506 + src[0] = zmw_rx_buf_readh(dev, buf, offset+10);
28507 + src[1] = zmw_rx_buf_readh(dev, buf, offset+12);
28508 + src[2] = zmw_rx_buf_readh(dev, buf, offset+14);
28509 +
28510 + /* QoS data frame */
28511 + if ((frameType & 0x88) == 0x88)
28512 + {
28513 + up = zmw_rx_buf_readb(dev, buf, offset+24);
28514 + up &= 0x7;
28515 + }
28516 +
28517 + index = (src[2]+up) & (ZM_FILTER_TABLE_ROW-1);
28518 +
28519 + /* TBD : filter frame with source address == own MAC adress */
28520 + if ((wd->macAddr[0] == src[0]) && (wd->macAddr[1] == src[1])
28521 + && (wd->macAddr[2] == src[2]))
28522 + {
28523 + //zm_msg0_rx(ZM_LV_0, "Rx filter=>src is own MAC");
28524 + wd->trafTally.rxSrcIsOwnMac++;
28525 +#if 0
28526 + return ZM_ERR_RX_SRC_ADDR_IS_OWN_MAC;
28527 +#endif
28528 + }
28529 +
28530 + zm_msg2_rx(ZM_LV_2, "Rx seq=", seq);
28531 +
28532 + /* Filter unicast frame only */
28533 + if ((dst0 & 0x1) == 0)
28534 + {
28535 + zmw_enter_critical_section(dev);
28536 +
28537 + for(i=0; i<ZM_FILTER_TABLE_COL; i++)
28538 + {
28539 + if ((wd->rxFilterTbl[i][index].addr[0] == src[0])
28540 + && (wd->rxFilterTbl[i][index].addr[1] == src[1])
28541 + && (wd->rxFilterTbl[i][index].addr[2] == src[2])
28542 + && (wd->rxFilterTbl[i][index].up == up))
28543 + {
28544 + if (((frameType&0x800)==0x800)
28545 + &&(wd->rxFilterTbl[i][index].seq==seq))
28546 + {
28547 + zmw_leave_critical_section(dev);
28548 + /* hit : duplicated frame */
28549 + zm_msg0_rx(ZM_LV_1, "Rx filter hit=>duplicated");
28550 + wd->trafTally.rxDuplicate++;
28551 + return ZM_ERR_RX_DUPLICATE;
28552 + }
28553 + else
28554 + {
28555 + /* hit : not duplicated frame, update sequence number */
28556 + wd->rxFilterTbl[i][index].seq = seq;
28557 + zmw_leave_critical_section(dev);
28558 + zm_msg0_rx(ZM_LV_2, "Rx filter hit");
28559 + return ZM_SUCCESS;
28560 + }
28561 + }
28562 + } /* for(i=0; i<ZM_FILTER_TABLE_COL; i++) */
28563 +
28564 + /* miss : add to table */
28565 + zm_msg0_rx(ZM_LV_1, "Rx filter miss");
28566 + /* TODO : Random select a column */
28567 + col = (u16_t)(wd->tick & (ZM_FILTER_TABLE_COL-1));
28568 + wd->rxFilterTbl[col][index].addr[0] = src[0];
28569 + wd->rxFilterTbl[col][index].addr[1] = src[1];
28570 + wd->rxFilterTbl[col][index].addr[2] = src[2];
28571 + wd->rxFilterTbl[col][index].seq = seq;
28572 + wd->rxFilterTbl[col][index].up = up;
28573 +
28574 + zmw_leave_critical_section(dev);
28575 + } /* if ((dst0 & 0x1) == 0) */
28576 +
28577 + return ZM_SUCCESS;
28578 +}
28579 +
28580 +
28581 +
28582 +u16_t zfTxGenWlanTail(zdev_t* dev, zbuf_t* buf, u16_t* snap, u16_t snaplen,
28583 + u16_t* mic)
28584 +{
28585 + struct zsMicVar* pMicKey;
28586 + u16_t i, length, payloadOffset;
28587 + u8_t bValue, qosType = 0;
28588 + u8_t snapByte[12];
28589 +
28590 + zmw_get_wlan_dev(dev);
28591 +
28592 + if ( wd->wlanMode == ZM_MODE_AP )
28593 + {
28594 + pMicKey = zfApGetTxMicKey(dev, buf, &qosType);
28595 +
28596 + if ( pMicKey == NULL )
28597 + {
28598 + return 0;
28599 + }
28600 + }
28601 + else if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
28602 + {
28603 + pMicKey = zfStaGetTxMicKey(dev, buf);
28604 +
28605 + if ( pMicKey == NULL )
28606 + {
28607 + return 0;
28608 + }
28609 + }
28610 + else
28611 + {
28612 + return 0;
28613 + }
28614 +
28615 + length = zfwBufGetSize(dev, buf);
28616 +
28617 + zfMicClear(pMicKey);
28618 +
28619 + /* append DA and SA */
28620 +#ifdef ZM_ENABLE_NATIVE_WIFI
28621 + for(i=16; i<22; i++)
28622 + { // VISTA DA
28623 + bValue = zmw_tx_buf_readb(dev, buf, i);
28624 + zfMicAppendByte(bValue, pMicKey);
28625 + }
28626 + for(i=10; i<16; i++)
28627 + { // VISTA SA
28628 + bValue = zmw_tx_buf_readb(dev, buf, i);
28629 + zfMicAppendByte(bValue, pMicKey);
28630 + }
28631 +#else
28632 + for(i=0; i<12; i++)
28633 + {
28634 + bValue = zmw_tx_buf_readb(dev, buf, i);
28635 + zfMicAppendByte(bValue, pMicKey);
28636 + }
28637 +#endif
28638 +
28639 + /* append for alignment */
28640 + if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
28641 + {
28642 + if (wd->sta.wmeConnected != 0)
28643 + zfMicAppendByte(zmw_tx_buf_readb(dev, buf, ZM_80211_FRAME_IP_OFFSET + 1) >> 5, pMicKey);
28644 + else
28645 + zfMicAppendByte(0, pMicKey);
28646 + }
28647 + else if ( wd->wlanMode == ZM_MODE_AP )
28648 + {
28649 + if (qosType == 1)
28650 + zfMicAppendByte(zmw_tx_buf_readb(dev, buf, ZM_80211_FRAME_IP_OFFSET + 1) >> 5, pMicKey);
28651 + else
28652 + zfMicAppendByte(0, pMicKey);
28653 + }
28654 + else
28655 + {
28656 + /* TODO : Qos Software MIC in IBSS Mode */
28657 + zfMicAppendByte(0, pMicKey);
28658 + }
28659 + zfMicAppendByte(0, pMicKey);
28660 + zfMicAppendByte(0, pMicKey);
28661 + zfMicAppendByte(0, pMicKey);
28662 +
28663 + if ( snaplen == 0 )
28664 + {
28665 + payloadOffset = ZM_80211_FRAME_IP_OFFSET;
28666 + }
28667 + else
28668 + {
28669 + payloadOffset = ZM_80211_FRAME_TYPE_OFFSET;
28670 +
28671 + for(i=0; i<(snaplen>>1); i++)
28672 + {
28673 + snapByte[i*2] = (u8_t) (snap[i] & 0xff);
28674 + snapByte[i*2+1] = (u8_t) ((snap[i] >> 8) & 0xff);
28675 + }
28676 +
28677 + for(i=0; i<snaplen; i++)
28678 + {
28679 + zfMicAppendByte(snapByte[i], pMicKey);
28680 + }
28681 + }
28682 +
28683 + for(i=payloadOffset; i<length; i++)
28684 + {
28685 + bValue = zmw_tx_buf_readb(dev, buf, i);
28686 + zfMicAppendByte(bValue, pMicKey);
28687 + }
28688 +
28689 + zfMicGetMic( (u8_t*) mic, pMicKey);
28690 +
28691 + return ZM_SIZE_OF_MIC;
28692 +}
28693 +
28694 +
28695 +/************************************************************************/
28696 +/* */
28697 +/* FUNCTION DESCRIPTION zfTxGetIpTosAndFrag */
28698 +/* Get IP TOS and frag offset from Tx buffer */
28699 +/* */
28700 +/* INPUTS */
28701 +/* dev : device pointer */
28702 +/* buf : Tx buffer pointer */
28703 +/* up : pointer for returning user priority */
28704 +/* fragOff : pointer for returning ip frag offset */
28705 +/* */
28706 +/* OUTPUTS */
28707 +/* None */
28708 +/* */
28709 +/* AUTHOR */
28710 +/* Stephen Chen ZyDAS Technology Corporation 2006.6 */
28711 +/* */
28712 +/************************************************************************/
28713 +void zfTxGetIpTosAndFrag(zdev_t* dev, zbuf_t* buf, u8_t* up, u16_t* fragOff)
28714 +{
28715 + u8_t ipv;
28716 + u16_t len;
28717 + u16_t etherType;
28718 + u8_t tos;
28719 +
28720 + *up = 0;
28721 + *fragOff = 0;
28722 +
28723 + len = zfwBufGetSize(dev, buf);
28724 +
28725 + if (len >= 34) //Minimum IPv4 packet size, 14(Ether header)+20(IPv4 header)
28726 + {
28727 + etherType = (((u16_t)zmw_tx_buf_readb(dev, buf, ZM_80211_FRAME_TYPE_OFFSET))<<8)
28728 + + zmw_tx_buf_readb(dev, buf, ZM_80211_FRAME_TYPE_OFFSET + 1);
28729 +
28730 + /* protocol type = IP */
28731 + if (etherType == 0x0800)
28732 + {
28733 + ipv = zmw_tx_buf_readb(dev, buf, ZM_80211_FRAME_IP_OFFSET) >> 4;
28734 + if (ipv == 0x4) //IPv4
28735 + {
28736 + tos = zmw_tx_buf_readb(dev, buf, ZM_80211_FRAME_IP_OFFSET + 1);
28737 + *up = (tos >> 5);
28738 + *fragOff = zmw_tx_buf_readh(dev, buf, ZM_80211_FRAME_IP_OFFSET + 6);
28739 + }
28740 + /* TODO : handle VLAN tag and IPv6 packet */
28741 + }
28742 + }
28743 + return;
28744 +}
28745 +
28746 +#ifdef ZM_ENABLE_NATIVE_WIFI
28747 +u16_t zfTxGenWlanSnap(zdev_t* dev, zbuf_t* buf, u16_t* snap, u16_t* snaplen)
28748 +{
28749 + snap[0] = zmw_buf_readh(dev, buf, ZM_80211_FRAME_HEADER_LEN + 0);
28750 + snap[1] = zmw_buf_readh(dev, buf, ZM_80211_FRAME_HEADER_LEN + 2);
28751 + snap[2] = zmw_buf_readh(dev, buf, ZM_80211_FRAME_HEADER_LEN + 4);
28752 + *snaplen = 6;
28753 +
28754 + return ZM_80211_FRAME_HEADER_LEN + *snaplen;
28755 +}
28756 +#else
28757 +u16_t zfTxGenWlanSnap(zdev_t* dev, zbuf_t* buf, u16_t* snap, u16_t* snaplen)
28758 +{
28759 + u16_t removed;
28760 + u16_t etherType;
28761 + u16_t len;
28762 +
28763 + len = zfwBufGetSize(dev, buf);
28764 + if (len < 14) //Minimum Ethernet packet size, 14(Ether header)
28765 + {
28766 + /* TODO : Assert? */
28767 + *snaplen = 0;
28768 + return 0;
28769 + }
28770 +
28771 + /* Generate RFC1042 header */
28772 + etherType = (((u16_t)zmw_tx_buf_readb(dev, buf, 12))<<8)
28773 + + zmw_tx_buf_readb(dev, buf, 13);
28774 +
28775 + //zm_debug_msg2("ethernet type or length = ", etherType);
28776 +
28777 + if (etherType > 1500)
28778 + {
28779 + /* ETHERNET format */
28780 + removed = 12;
28781 + snap[0] = 0xaaaa;
28782 + snap[1] = 0x0003;
28783 + if ((etherType ==0x8137) || (etherType == 0x80f3))
28784 + {
28785 + /* Bridge Tunnel */
28786 + snap[2] = 0xF800;
28787 + }
28788 + else
28789 + {
28790 + /* RFC 1042 */
28791 + snap[2] = 0x0000;
28792 + }
28793 + *snaplen = 6;
28794 +
28795 + if ( etherType == 0x888E )
28796 + {
28797 + zfShowTxEAPOL(dev, buf, 14);
28798 + }
28799 + }
28800 + else
28801 + {
28802 + /* 802.3 format */
28803 + removed = 14;
28804 + *snaplen = 0;
28805 + }
28806 +
28807 + return removed;
28808 +}
28809 +#endif
28810 +
28811 +u8_t zfIsVtxqEmpty(zdev_t* dev)
28812 +{
28813 + u8_t isEmpty = TRUE;
28814 + u8_t i;
28815 +
28816 + zmw_get_wlan_dev(dev);
28817 +
28818 + zmw_declare_for_critical_section();
28819 +
28820 + zmw_enter_critical_section(dev);
28821 +
28822 + if (wd->vmmqHead != wd->vmmqTail)
28823 + {
28824 + isEmpty = FALSE;
28825 + goto check_done;
28826 + }
28827 +
28828 + for(i=0; i < 4; i++)
28829 + {
28830 + if (wd->vtxqHead[i] != wd->vtxqTail[i])
28831 + {
28832 + isEmpty = FALSE;
28833 + goto check_done;
28834 + }
28835 + }
28836 +
28837 +check_done:
28838 + zmw_leave_critical_section(dev);
28839 + return isEmpty;
28840 +}
28841 +
28842 +/************************************************************************/
28843 +/* */
28844 +/* FUNCTION DESCRIPTION zfPutVtxq */
28845 +/* Put Tx buffer to virtual TxQ */
28846 +/* */
28847 +/* INPUTS */
28848 +/* dev : device pointer */
28849 +/* buf : Tx buffer pointer */
28850 +/* */
28851 +/* OUTPUTS */
28852 +/* ZM_SUCCESS or error code */
28853 +/* */
28854 +/* AUTHOR */
28855 +/* Stephen Chen ZyDAS Technology Corporation 2006.6 */
28856 +/* */
28857 +/************************************************************************/
28858 +u16_t zfPutVtxq(zdev_t* dev, zbuf_t* buf)
28859 +{
28860 + u8_t ac;
28861 + u8_t up;
28862 + u16_t fragOff;
28863 +#ifdef ZM_AGG_TALLY
28864 + struct aggTally *agg_tal;
28865 +#endif
28866 +#ifdef ZM_ENABLE_AGGREGATION
28867 + #ifndef ZM_BYPASS_AGGR_SCHEDULING
28868 + u16_t ret;
28869 + u16_t tid;
28870 + #endif
28871 +#endif
28872 +
28873 + zmw_get_wlan_dev(dev);
28874 +
28875 + zmw_declare_for_critical_section();
28876 +
28877 + zfTxGetIpTosAndFrag(dev, buf, &up, &fragOff);
28878 +
28879 + if ( wd->zfcbClassifyTxPacket != NULL )
28880 + {
28881 + ac = wd->zfcbClassifyTxPacket(dev, buf);
28882 + }
28883 + else
28884 + {
28885 + ac = zcUpToAc[up&0x7] & 0x3;
28886 + }
28887 +
28888 + /*
28889 + * add by honda
28890 + * main A-MPDU aggregation function
28891 + */
28892 +#ifdef ZM_AGG_TALLY
28893 + agg_tal = &wd->agg_tal;
28894 + agg_tal->got_packets_sum++;
28895 +
28896 +#endif
28897 +
28898 +#ifdef ZM_ENABLE_AGGREGATION
28899 + #ifndef ZM_BYPASS_AGGR_SCHEDULING
28900 + tid = up&0x7;
28901 + if(wd->enableAggregation==0)
28902 + {
28903 + if( (wd->wlanMode == ZM_MODE_AP) ||
28904 + (wd->wlanMode == ZM_MODE_INFRASTRUCTURE && wd->sta.EnableHT) ||
28905 + (wd->wlanMode == ZM_MODE_PSEUDO) ) {
28906 + // (infrastructure_mode && connect_to_11n_ap) || (ap_mode && is_11n_ap)
28907 + //ret = zfAggPutVtxq(dev, buf);
28908 +
28909 +
28910 + ret = zfAggTx(dev, buf, tid);
28911 + if (ZM_SUCCESS == ret)
28912 + {
28913 + //zfwBufFree(dev, buf, ZM_SUCCESS);
28914 +
28915 + return ZM_SUCCESS;
28916 + }
28917 + if (ZM_ERR_EXCEED_PRIORITY_THRESHOLD == ret)
28918 + {
28919 + wd->commTally.txQosDropCount[ac]++;
28920 + zfwBufFree(dev, buf, ZM_SUCCESS);
28921 +
28922 + zm_msg1_tx(ZM_LV_1, "Packet discarded, VTXQ full, ac=", ac);
28923 +
28924 + return ZM_ERR_EXCEED_PRIORITY_THRESHOLD;
28925 + }
28926 + if (ZM_ERR_TX_BUFFER_UNAVAILABLE == ret)
28927 + {
28928 + /*
28929 + * do nothing
28930 + * continue following procession, put into VTXQ
28931 + * return ZM_SUCCESS;
28932 + */
28933 + }
28934 + }
28935 + }
28936 + #endif
28937 +#endif
28938 + /*
28939 + * end of add by honda
28940 + */
28941 +
28942 + /* First Ip frag */
28943 + if ((fragOff & 0xff3f) == 0x0020)
28944 + {
28945 + /* Don't let ip frag in if VTXQ unable to hold */
28946 + /* whole ip frag burst(assume 20 frag) */
28947 + zmw_enter_critical_section(dev);
28948 + if (((wd->vtxqHead[ac] - wd->vtxqTail[ac])& ZM_VTXQ_SIZE_MASK)
28949 + > (ZM_VTXQ_SIZE-20))
28950 + {
28951 + wd->qosDropIpFrag[ac] = 1;
28952 + }
28953 + else
28954 + {
28955 + wd->qosDropIpFrag[ac] = 0;
28956 + }
28957 + zmw_leave_critical_section(dev);
28958 +
28959 + if (wd->qosDropIpFrag[ac] == 1)
28960 + {
28961 + //zm_debug_msg2("vtQ full, drop buf = ", buf);
28962 + wd->commTally.txQosDropCount[ac]++;
28963 + zfwBufFree(dev, buf, ZM_SUCCESS);
28964 + zm_msg1_tx(ZM_LV_1, "Packet discarded, first ip frag, ac=", ac);
28965 + //VTXQ[] can not hold whold ip frag burst(assume 20 frags)
28966 + return ZM_ERR_EXCEED_PRIORITY_THRESHOLD;
28967 + }
28968 + }
28969 + else if ((fragOff & 0xff3f) == 0)
28970 + {
28971 + wd->qosDropIpFrag[ac] = 0;
28972 + }
28973 +
28974 + if (((fragOff &= 0xff1f) != 0) && (wd->qosDropIpFrag[ac] == 1))
28975 + {
28976 + wd->commTally.txQosDropCount[ac]++;
28977 + zfwBufFree(dev, buf, ZM_SUCCESS);
28978 + zm_msg1_tx(ZM_LV_1, "Packet discarded, ip frag, ac=", ac);
28979 + //Discard following ip frags
28980 + return ZM_ERR_EXCEED_PRIORITY_THRESHOLD;
28981 + }
28982 +
28983 + zmw_enter_critical_section(dev);
28984 + if (((wd->vtxqHead[ac] + 1) & ZM_VTXQ_SIZE_MASK) != wd->vtxqTail[ac])
28985 + {
28986 + wd->vtxq[ac][wd->vtxqHead[ac]] = buf;
28987 + wd->vtxqHead[ac] = ((wd->vtxqHead[ac] + 1) & ZM_VTXQ_SIZE_MASK);
28988 + zmw_leave_critical_section(dev);
28989 + return ZM_SUCCESS;
28990 + }
28991 + else
28992 + {
28993 + zmw_leave_critical_section(dev);
28994 +
28995 + wd->commTally.txQosDropCount[ac]++;
28996 + zfwBufFree(dev, buf, ZM_SUCCESS);
28997 + zm_msg1_tx(ZM_LV_1, "Packet discarded, VTXQ full, ac=", ac);
28998 + return ZM_ERR_EXCEED_PRIORITY_THRESHOLD; //VTXQ[] Full
28999 + }
29000 +}
29001 +
29002 +
29003 +/************************************************************************/
29004 +/* */
29005 +/* FUNCTION DESCRIPTION zfGetVtxq */
29006 +/* Get Tx buffer from virtual TxQ */
29007 +/* */
29008 +/* INPUTS */
29009 +/* dev : device pointer */
29010 +/* */
29011 +/* OUTPUTS */
29012 +/* Tx buffer pointer */
29013 +/* */
29014 +/* AUTHOR */
29015 +/* Stephen Chen ZyDAS Technology Corporation 2006.6 */
29016 +/* */
29017 +/************************************************************************/
29018 +zbuf_t* zfGetVtxq(zdev_t* dev, u8_t ac)
29019 +{
29020 + zbuf_t* buf;
29021 +
29022 + zmw_get_wlan_dev(dev);
29023 +
29024 + zmw_declare_for_critical_section();
29025 +
29026 + ac &= 0x3;
29027 + zmw_enter_critical_section(dev);
29028 + if (wd->vtxqHead[ac] != wd->vtxqTail[ac])
29029 + {
29030 + buf = wd->vtxq[ac][wd->vtxqTail[ac]];
29031 + wd->vtxqTail[ac] = ((wd->vtxqTail[ac] + 1) & ZM_VTXQ_SIZE_MASK);
29032 + zmw_leave_critical_section(dev);
29033 + return buf;
29034 + }
29035 + else
29036 + {
29037 + zmw_leave_critical_section(dev);
29038 + return 0; //VTXQ[] empty
29039 + }
29040 +}
29041 +
29042 +/************************************************************************/
29043 +/* */
29044 +/* FUNCTION DESCRIPTION zfPutVmmq */
29045 +/* Put Tx buffer to virtual MmQ */
29046 +/* */
29047 +/* INPUTS */
29048 +/* dev : device pointer */
29049 +/* buf : Tx buffer pointer */
29050 +/* */
29051 +/* OUTPUTS */
29052 +/* ZM_SUCCESS or error code */
29053 +/* */
29054 +/* AUTHOR */
29055 +/* Stephen Chen ZyDAS Technology Corporation 2006.12 */
29056 +/* */
29057 +/************************************************************************/
29058 +u16_t zfPutVmmq(zdev_t* dev, zbuf_t* buf)
29059 +{
29060 + zmw_get_wlan_dev(dev);
29061 + zmw_declare_for_critical_section();
29062 +
29063 + zmw_enter_critical_section(dev);
29064 + if (((wd->vmmqHead + 1) & ZM_VMMQ_SIZE_MASK) != wd->vmmqTail)
29065 + {
29066 + wd->vmmq[wd->vmmqHead] = buf;
29067 + wd->vmmqHead = ((wd->vmmqHead + 1) & ZM_VMMQ_SIZE_MASK);
29068 + zmw_leave_critical_section(dev);
29069 + return ZM_SUCCESS;
29070 + }
29071 + else
29072 + {
29073 + zmw_leave_critical_section(dev);
29074 +
29075 + zfwBufFree(dev, buf, ZM_SUCCESS);
29076 + zm_msg0_mm(ZM_LV_0, "Packet discarded, VMmQ full");
29077 + return ZM_ERR_VMMQ_FULL; //VTXQ[] Full
29078 + }
29079 +}
29080 +
29081 +
29082 +/************************************************************************/
29083 +/* */
29084 +/* FUNCTION DESCRIPTION zfGetVmmq */
29085 +/* Get Tx buffer from virtual MmQ */
29086 +/* */
29087 +/* INPUTS */
29088 +/* dev : device pointer */
29089 +/* */
29090 +/* OUTPUTS */
29091 +/* Tx buffer pointer */
29092 +/* */
29093 +/* AUTHOR */
29094 +/* Stephen Chen ZyDAS Technology Corporation 2006.12 */
29095 +/* */
29096 +/************************************************************************/
29097 +zbuf_t* zfGetVmmq(zdev_t* dev)
29098 +{
29099 + zbuf_t* buf;
29100 + zmw_get_wlan_dev(dev);
29101 + zmw_declare_for_critical_section();
29102 +
29103 + zmw_enter_critical_section(dev);
29104 + if (wd->vmmqHead != wd->vmmqTail)
29105 + {
29106 + buf = wd->vmmq[wd->vmmqTail];
29107 + wd->vmmqTail = ((wd->vmmqTail + 1) & ZM_VMMQ_SIZE_MASK);
29108 + zmw_leave_critical_section(dev);
29109 + return buf;
29110 + }
29111 + else
29112 + {
29113 + zmw_leave_critical_section(dev);
29114 + return 0; //VTXQ[] empty
29115 + }
29116 +}
29117 +
29118 +/************************************************************************/
29119 +/* */
29120 +/* FUNCTION DESCRIPTION zfPushVtxq */
29121 +/* Service Virtual TxQ (weighted round robin) */
29122 +/* Get Tx buffer form virtual TxQ and put to hardware TxD queue */
29123 +/* */
29124 +/* INPUTS */
29125 +/* dev : device pointer */
29126 +/* */
29127 +/* OUTPUTS */
29128 +/* None */
29129 +/* */
29130 +/* AUTHOR */
29131 +/* Stephen Chen ZyDAS Technology Corporation 2006.6 */
29132 +/* */
29133 +/************************************************************************/
29134 +void zfPushVtxq(zdev_t* dev)
29135 +{
29136 + zbuf_t* buf;
29137 + u16_t i;
29138 + u16_t txed;
29139 + u32_t freeTxd;
29140 + u16_t err;
29141 + u16_t skipFlag = 0;
29142 + zmw_get_wlan_dev(dev);
29143 + zmw_declare_for_critical_section();
29144 +
29145 +
29146 +
29147 + //zm_debug_msg1("zfHpGetFreeTxdCount = ", zfHpGetFreeTxdCount(dev));
29148 +
29149 + if (wd->halState == ZM_HAL_STATE_INIT)
29150 + {
29151 + if (!wd->modeMDKEnable)
29152 + {
29153 + zm_debug_msg0("HAL is not ready for Tx");
29154 + }
29155 + return;
29156 + }
29157 + else if (wd->sta.DFSDisableTx)
29158 + {
29159 + zm_debug_msg0("return because 802.11h DFS Disable Tx");
29160 + return;
29161 + }
29162 + else if (wd->sta.flagFreqChanging != 0)
29163 + {
29164 + //Hold until RF frequency changed
29165 + return;
29166 + }
29167 + else if (( wd->sta.flagKeyChanging ) && ( wd->wlanMode != ZM_MODE_AP ))
29168 + {
29169 + return;
29170 + }
29171 +#ifdef ZM_ENABLE_POWER_SAVE
29172 + else if ( zfPowerSavingMgrIsSleeping(dev) )
29173 + {
29174 + //zm_debug_msg0("Packets queued since the MAC is in power-saving mode\n");
29175 + return;
29176 + }
29177 +#endif
29178 +
29179 + zmw_enter_critical_section(dev);
29180 + if (wd->vtxqPushing != 0)
29181 + {
29182 + skipFlag = 1;
29183 + }
29184 + else
29185 + {
29186 + wd->vtxqPushing = 1;
29187 + }
29188 + zmw_leave_critical_section(dev);
29189 +
29190 + if (skipFlag == 1)
29191 + {
29192 + return;
29193 + }
29194 +
29195 + while (1)
29196 + {
29197 + txed = 0;
29198 +
29199 + /* 2006.12.20, Serve Management queue */
29200 + while( zfHpGetFreeTxdCount(dev) > 0 )
29201 + {
29202 + if ((buf = zfGetVmmq(dev)) != 0)
29203 + {
29204 + txed = 1;
29205 + //zm_debug_msg2("send buf = ", buf);
29206 + if ((err = zfHpSend(dev, NULL, 0, NULL, 0, NULL, 0, buf, 0,
29207 + ZM_INTERNAL_ALLOC_BUF, 0, 0xff)) != ZM_SUCCESS)
29208 + {
29209 + zfwBufFree(dev, buf, 0);
29210 + }
29211 + }
29212 + else
29213 + {
29214 + break;
29215 + }
29216 + }
29217 + if ((wd->sta.bScheduleScan) || ((wd->sta.bChannelScan == TRUE) && (zfStaIsConnected(dev))))
29218 + {
29219 + //Hold until Scan Stop
29220 + wd->vtxqPushing = 0;
29221 + return;
29222 + }
29223 +
29224 +#ifdef ZM_ENABLE_AGGREGATION
29225 + #ifndef ZM_BYPASS_AGGR_SCHEDULING
29226 + if( (wd->wlanMode == ZM_MODE_AP) ||
29227 + (wd->wlanMode == ZM_MODE_INFRASTRUCTURE && wd->sta.EnableHT) ||
29228 + (wd->wlanMode == ZM_MODE_PSEUDO) ) {
29229 +
29230 + zfAggTxScheduler(dev, 0);
29231 +
29232 + if (txed == 0) {
29233 + wd->vtxqPushing = 0;
29234 + return;
29235 + }
29236 + else {
29237 + continue;
29238 + }
29239 + }
29240 + #endif
29241 +#endif
29242 +
29243 + /* Service VTxQ[3] */
29244 + for (i=0; i<4; i++)
29245 + {
29246 + if ((freeTxd = zfHpGetFreeTxdCount(dev)) >= 3)
29247 + {
29248 + if ((buf = zfGetVtxq(dev, 3)) != 0)
29249 + {
29250 + txed = 1;
29251 + //zm_debug_msg2("send buf = ", buf);
29252 + zfTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0);
29253 + ZM_PERFORMANCE_TX_MPDU(dev, wd->tick);
29254 + }
29255 + }
29256 + else
29257 + {
29258 + break;
29259 + }
29260 + }
29261 +
29262 + /* Service VTxQ[2] */
29263 + for (i=0; i<3; i++)
29264 + {
29265 + if ((freeTxd = zfHpGetFreeTxdCount(dev)) >= (zfHpGetMaxTxdCount(dev)*1/4))
29266 + {
29267 + if ((buf = zfGetVtxq(dev, 2)) != 0)
29268 + {
29269 + txed = 1;
29270 + zfTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0);
29271 + ZM_PERFORMANCE_TX_MPDU(dev, wd->tick);
29272 + }
29273 + if (wd->sta.ac0PriorityHigherThanAc2 == 1)
29274 + {
29275 + if ((buf = zfGetVtxq(dev, 0)) != 0)
29276 + {
29277 + txed = 1;
29278 + zfTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0);
29279 + ZM_PERFORMANCE_TX_MPDU(dev, wd->tick);
29280 + }
29281 + }
29282 + }
29283 + else
29284 + {
29285 + break;
29286 + }
29287 + }
29288 +
29289 + /* Service VTxQ[0] */
29290 + for (i=0; i<2; i++)
29291 + {
29292 + if ((freeTxd = zfHpGetFreeTxdCount(dev)) >= (zfHpGetMaxTxdCount(dev)*2/4))
29293 + {
29294 + if ((buf = zfGetVtxq(dev, 0)) != 0)
29295 + {
29296 + txed = 1;
29297 + zfTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0);
29298 + ZM_PERFORMANCE_TX_MPDU(dev, wd->tick);
29299 + }
29300 + }
29301 + else
29302 + {
29303 + break;
29304 + }
29305 +
29306 + }
29307 +
29308 + /* Service VTxQ[1] */
29309 + if ((freeTxd = zfHpGetFreeTxdCount(dev)) >= (zfHpGetMaxTxdCount(dev)*3/4))
29310 + {
29311 + if ((buf = zfGetVtxq(dev, 1)) != 0)
29312 + {
29313 + txed = 1;
29314 + zfTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0);
29315 + ZM_PERFORMANCE_TX_MPDU(dev, wd->tick);
29316 + }
29317 + }
29318 +
29319 + /* All VTxQs are either empty or exceed their threshold */
29320 + if (txed == 0)
29321 + {
29322 + wd->vtxqPushing = 0;
29323 + return;
29324 + }
29325 + } //while (1)
29326 +}
29327 +
29328 +
29329 +/************************************************************************/
29330 +/* */
29331 +/* FUNCTION DESCRIPTION zfFlushVtxq */
29332 +/* Flush Virtual TxQ and MmQ */
29333 +/* */
29334 +/* INPUTS */
29335 +/* dev : device pointer */
29336 +/* */
29337 +/* OUTPUTS */
29338 +/* None */
29339 +/* */
29340 +/* AUTHOR */
29341 +/* Stephen Chen Atheros Communications, INC. 2007.1 */
29342 +/* */
29343 +/************************************************************************/
29344 +void zfFlushVtxq(zdev_t* dev)
29345 +{
29346 + zbuf_t* buf;
29347 + u8_t i;
29348 + zmw_get_wlan_dev(dev);
29349 +
29350 + /* Flush MmQ */
29351 + while ((buf = zfGetVmmq(dev)) != 0)
29352 + {
29353 + zfwBufFree(dev, buf, 0);
29354 + zm_debug_msg0("zfFlushVtxq: [Vmmq]");
29355 + wd->queueFlushed |= 0x10;
29356 + }
29357 +
29358 + /* Flush VTxQ */
29359 + for (i=0; i<4; i++)
29360 + {
29361 + while ((buf = zfGetVtxq(dev, i)) != 0)
29362 + {
29363 + zfwBufFree(dev, buf, 0);
29364 + zm_debug_msg1("zfFlushVtxq: [zfGetVtxq]- ", i);
29365 + wd->queueFlushed |= (1<<i);
29366 + }
29367 + }
29368 +}
29369 +
29370 +void zf80211FrameSend(zdev_t* dev, zbuf_t* buf, u16_t* header, u16_t snapLen,
29371 + u16_t* da, u16_t* sa, u8_t up, u16_t headerLen, u16_t* snap,
29372 + u16_t* tail, u16_t tailLen, u16_t offset, u16_t bufType,
29373 + u8_t ac, u8_t keyIdx)
29374 +{
29375 + u16_t err;
29376 + u16_t fragLen;
29377 +
29378 + zmw_get_wlan_dev(dev);
29379 +
29380 + fragLen = zfwBufGetSize(dev, buf);
29381 + if ((da[0]&0x1) == 0)
29382 + {
29383 + wd->commTally.txUnicastFrm++;
29384 + wd->commTally.txUnicastOctets += (fragLen+snapLen);
29385 + }
29386 + else if (da[0] == 0xffff)
29387 + {
29388 + wd->commTally.txBroadcastFrm++;
29389 + wd->commTally.txBroadcastOctets += (fragLen+snapLen);
29390 + }
29391 + else
29392 + {
29393 + wd->commTally.txMulticastFrm++;
29394 + wd->commTally.txMulticastOctets += (fragLen+snapLen);
29395 + }
29396 + wd->ledStruct.txTraffic++;
29397 +
29398 + if ((err = zfHpSend(dev, header, headerLen, snap, snapLen,
29399 + tail, tailLen, buf, offset,
29400 + bufType, ac, keyIdx)) != ZM_SUCCESS)
29401 + {
29402 + if (bufType == ZM_EXTERNAL_ALLOC_BUF)
29403 + {
29404 + zfwBufFree(dev, buf, err);
29405 + }
29406 + else if (bufType == ZM_INTERNAL_ALLOC_BUF)
29407 + {
29408 + zfwBufFree(dev, buf, 0);
29409 + }
29410 + else
29411 + {
29412 + zm_assert(0);
29413 + }
29414 + }
29415 +}
29416 +
29417 +void zfCheckIsRIFSFrame(zdev_t* dev, zbuf_t* buf, u16_t frameSubtype)
29418 +{
29419 + zmw_get_wlan_dev(dev);
29420 +
29421 + /* #2 Record the sequence number to determine whether the unicast frame is separated by RIFS or not */
29422 + if (frameSubtype & 0x80)
29423 + { //QoS data frame
29424 + u16_t sequenceNum;
29425 + u16_t qosControlField;
29426 +
29427 + sequenceNum = ( zmw_buf_readh(dev, buf, 22) >> 4 ); // Discard fragment number !
29428 + qosControlField = zmw_buf_readh(dev, buf, 24); // Don't consider WDS (Wireless Distribution System)
29429 + //DbgPrint("The QoS Control Field : %d", qosControlField);
29430 + //DbgPrint("The RIFS Count : %d", wd->sta.rifsCount);
29431 +
29432 + if( qosControlField & ZM_BIT_5 )
29433 + {// ACK policy is "No ACK"
29434 + /* RIFS-Like frame */
29435 + wd->sta.rifsLikeFrameSequence[wd->sta.rifsLikeFrameCnt] = sequenceNum;
29436 +
29437 + if( wd->sta.rifsState == ZM_RIFS_STATE_DETECTING )
29438 + {
29439 + if( wd->sta.rifsLikeFrameSequence[2] != 0 )
29440 + {// RIFS-like Pattern collected
29441 + if( ( wd->sta.rifsLikeFrameSequence[2] - wd->sta.rifsLikeFrameSequence[1] == 2 ) &&
29442 + ( wd->sta.rifsLikeFrameSequence[1] - wd->sta.rifsLikeFrameSequence[0] == 2 ) )
29443 + {
29444 + /* RIFS pattern matched */
29445 +
29446 + /* #3 Enable RIFS function if the RIFS pattern matched */
29447 + zfHpEnableRifs(dev, ((wd->sta.currentFrequency<3000)?1:0), wd->sta.EnableHT, wd->sta.HT2040);
29448 +
29449 + // Set RIFS timer
29450 + wd->sta.rifsTimer = wd->tick;
29451 +
29452 + wd->sta.rifsCount++;
29453 +
29454 + // Set state to be Detected
29455 + wd->sta.rifsState = ZM_RIFS_STATE_DETECTED;
29456 + }
29457 + }
29458 + }
29459 + else
29460 + {// state = Detected
29461 + // Reset RIFS timer
29462 + if( (wd->tick - wd->sta.rifsTimer) < ZM_RIFS_TIMER_TIMEOUT )
29463 + wd->sta.rifsTimer = wd->tick;
29464 + }
29465 +
29466 + //DbgPrint("SN1 = %d, SN2 = %d, SN3 = %d\n", wd->sta.rifsLikeFrameSequence[0],
29467 + // wd->sta.rifsLikeFrameSequence[1],
29468 + // wd->sta.rifsLikeFrameSequence[2]);
29469 +
29470 + // Update RIFS-like sequence number
29471 + if( wd->sta.rifsLikeFrameSequence[2] != 0 )
29472 + {
29473 + wd->sta.rifsLikeFrameSequence[0] = wd->sta.rifsLikeFrameSequence[1];
29474 + wd->sta.rifsLikeFrameSequence[1] = wd->sta.rifsLikeFrameSequence[2];
29475 + wd->sta.rifsLikeFrameSequence[2] = 0;
29476 + }
29477 +
29478 + // Only record three adjacent frame
29479 + if( wd->sta.rifsLikeFrameCnt < 2 )
29480 + wd->sta.rifsLikeFrameCnt++;
29481 + }
29482 + }
29483 +
29484 + /* #4 Disable RIFS function if the timer TIMEOUT */
29485 + if( wd->sta.rifsState == ZM_RIFS_STATE_DETECTED )
29486 + {
29487 + if( ( wd->tick - wd->sta.rifsTimer ) > ZM_RIFS_TIMER_TIMEOUT )
29488 + {// TIMEOUT
29489 + // Disable RIFS
29490 + zfHpDisableRifs(dev);
29491 +
29492 + // Reset RIFS-like sequence number FIFO
29493 + wd->sta.rifsLikeFrameSequence[0] = 0;
29494 + wd->sta.rifsLikeFrameSequence[1] = 0;
29495 + wd->sta.rifsLikeFrameSequence[2] = 0;
29496 + wd->sta.rifsLikeFrameCnt = 0;
29497 +
29498 + // Set state to be Detecting
29499 + wd->sta.rifsState = ZM_RIFS_STATE_DETECTING;
29500 + }
29501 + }
29502 +}
29503 --- /dev/null
29504 +++ b/drivers/staging/otus/80211core/cwep.c
29505 @@ -0,0 +1,299 @@
29506 +/*
29507 + * Copyright (c) 2007-2008 Atheros Communications Inc.
29508 + *
29509 + * Permission to use, copy, modify, and/or distribute this software for any
29510 + * purpose with or without fee is hereby granted, provided that the above
29511 + * copyright notice and this permission notice appear in all copies.
29512 + *
29513 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
29514 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
29515 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
29516 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
29517 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
29518 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
29519 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
29520 + */
29521 +/* */
29522 +/* Module Name : cwep.c */
29523 +/* */
29524 +/* Abstract */
29525 +/* This module contains Tx and Rx functions. */
29526 +/* */
29527 +/* NOTES */
29528 +/* None */
29529 +/* */
29530 +/************************************************************************/
29531 +#include "cprecomp.h"
29532 +
29533 +u32_t crc32_tab[] =
29534 +{
29535 + 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
29536 + 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
29537 + 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
29538 + 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
29539 + 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
29540 + 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
29541 + 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
29542 + 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
29543 + 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
29544 + 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
29545 + 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
29546 + 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
29547 + 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
29548 + 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
29549 + 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
29550 + 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
29551 + 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
29552 + 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
29553 + 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
29554 + 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
29555 + 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
29556 + 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
29557 + 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
29558 + 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
29559 + 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
29560 + 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
29561 + 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
29562 + 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
29563 + 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
29564 + 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
29565 + 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
29566 + 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
29567 + 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
29568 + 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
29569 + 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
29570 + 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
29571 + 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
29572 + 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
29573 + 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
29574 + 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
29575 + 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
29576 + 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
29577 + 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
29578 + 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
29579 + 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
29580 + 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
29581 + 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
29582 + 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
29583 + 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
29584 + 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
29585 + 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
29586 + 0x2d02ef8dL
29587 +};
29588 +
29589 +void zfWEPEncrypt(zdev_t *dev, zbuf_t *buf, u8_t *snap, u16_t snapLen, u16_t offset, u8_t keyLen, u8_t* WepKey, u8_t *iv)
29590 +{
29591 + u8_t S[256],S2[256];
29592 + u16_t ui;
29593 + u16_t i;
29594 + u16_t j;
29595 + u8_t temp;
29596 + u8_t K;
29597 + u32_t ltemp;
29598 + u16_t len;
29599 + u32_t icv;
29600 + u8_t key[32];
29601 +
29602 + key[0] = iv[0];
29603 + key[1] = iv[1];
29604 + key[2] = iv[2];
29605 +
29606 + /* Append Wep Key after IV */
29607 + zfMemoryCopy(&key[3], WepKey, keyLen);
29608 +
29609 + keyLen += 3;
29610 +
29611 + for(i = 0; i < 256; i++)
29612 + {
29613 + S[i] = (u8_t)i;
29614 + S2[i] = key[i&(keyLen-1)];
29615 + }
29616 +
29617 + j = 0;
29618 + for(i = 0; i < 256; i++)
29619 + {
29620 + j = (j + S[i] + S2[i]) ;
29621 + j&=255 ;
29622 +
29623 + // Swap S[i] and S[j]
29624 + temp = S[i];
29625 + S[i] = S[j];
29626 + S[j] = temp;
29627 + }
29628 +
29629 + i = j = 0;
29630 + icv = -1;
29631 +
29632 + /* For Snap Header */
29633 + for (ui = 0; ui < snapLen; ui++)
29634 + {
29635 + u8_t In;
29636 +
29637 + i++;
29638 + i &= 255;
29639 + j += S[i];
29640 + j &= 255;
29641 +
29642 + // Swap S[i] and S[j]
29643 + temp = S[i];
29644 + S[i] = S[j];
29645 + S[j] = temp;
29646 +// temp = (S[i] + temp) & 255;
29647 + temp += S[i];
29648 + temp &=255;
29649 + K = S[temp]; // Key used to Xor with input data
29650 +
29651 + In = snap[ui];
29652 + icv = (icv>>8) ^ crc32_tab[(icv^In)&0xff];
29653 +
29654 + snap[ui] = In ^ K;
29655 + //zmw_tx_buf_writeb(dev, buf, ui, In ^ K);
29656 + }
29657 +
29658 + len = zfwBufGetSize(dev, buf);
29659 +
29660 + for (ui = offset; ui < len; ui++)
29661 + {
29662 + u8_t In;
29663 +
29664 + i++;
29665 + i &= 255;
29666 + j += S[i];
29667 + j &= 255;
29668 +
29669 + // Swap S[i] and S[j]
29670 + temp = S[i];
29671 + S[i] = S[j];
29672 + S[j] = temp;
29673 +// temp = (S[i] + temp) & 255;
29674 + temp += S[i];
29675 + temp &=255;
29676 + K = S[temp]; // Key used to Xor with input data
29677 +
29678 + In = zmw_tx_buf_readb(dev, buf, ui);
29679 + icv = (icv>>8) ^ crc32_tab[(icv^In)&0xff];
29680 +
29681 + zmw_tx_buf_writeb(dev, buf, ui, In ^ K);
29682 + } //End of for (ui = 0; ui < Num_Bytes; ui++)
29683 +
29684 + icv = ~(icv);
29685 + ltemp = (u32_t) icv;
29686 +
29687 + for (ui = 0; ui < 4; ui++)
29688 + {
29689 + i ++;
29690 + i &= 255;
29691 + j += S[i];
29692 + j &= 255;
29693 +
29694 + // Swap S[i] and S[j]
29695 + temp = S[i];
29696 + S[i] = S[j];
29697 + S[j] = temp;
29698 + temp += S[i];
29699 + temp &= 255;
29700 + K = S[temp]; // Key used to Xor with input data
29701 +
29702 + //*Out++ = (u8_t)(ltemp ^ K)&0xff;
29703 + zmw_tx_buf_writeb(dev, buf, len+ui, (u8_t)(ltemp ^ K)&0xff);
29704 + ltemp >>= 8;
29705 + }
29706 +
29707 + zfwBufSetSize(dev, buf, len+4);
29708 +}
29709 +
29710 +u16_t zfWEPDecrypt(zdev_t *dev, zbuf_t *buf, u16_t offset, u8_t keyLen, u8_t* WepKey, u8_t *iv)
29711 +{
29712 + u8_t S[256];
29713 + u8_t S2[256];
29714 + u16_t ui;
29715 + u16_t i;
29716 + u16_t j;
29717 + u32_t icv_tmp;
29718 + u32_t *icv;
29719 + u32_t rxbuf_icv;
29720 + u8_t temp;
29721 + u8_t K;
29722 + u16_t len;
29723 + u8_t key[32];
29724 +
29725 + /* Retrieve IV */
29726 + key[0] = iv[0];
29727 + key[1] = iv[1];
29728 + key[2] = iv[2];
29729 +
29730 + /* Append Wep Key after IV */
29731 + zfMemoryCopy(&key[3], WepKey, keyLen);
29732 +
29733 + keyLen += 3;
29734 +
29735 + for(i = 0; i < 256; i++)
29736 + {
29737 + S[i] = (u8_t)i;
29738 + S2[i] = key[i&(keyLen-1)];
29739 + }
29740 +
29741 + j = 0;
29742 + for(i = 0; i < 256; i++)
29743 + {
29744 + j = (j + S[i] + S2[i]);
29745 + j&=255 ;
29746 +
29747 + // Swap S[i] and S[j]
29748 + temp = S[i];
29749 + S[i] = S[j];
29750 + S[j] = temp;
29751 + }
29752 +
29753 + i = j = 0;
29754 +
29755 + len = zfwBufGetSize(dev, buf);
29756 +
29757 + for (ui = offset; ui < len; ui++)
29758 + {
29759 + u8_t In;
29760 +
29761 + i++;
29762 + i &= 255;
29763 + j += S[i];
29764 + j &= 255;
29765 +
29766 + // Swap S[i] and S[j]
29767 + temp = S[i];
29768 + S[i] = S[j];
29769 + S[j] = temp;
29770 +// temp = (S[i] + temp) & 255;
29771 + temp += S[i];
29772 + temp &=255;
29773 + K = S[temp]; // Key used to Xor with input data
29774 +
29775 + In = zmw_rx_buf_readb(dev, buf, ui);
29776 +
29777 + zmw_rx_buf_writeb(dev, buf, ui, In ^ K);
29778 + } //End of for (ui = 0; ui < Num_Bytes; ui++)
29779 +
29780 + icv = &icv_tmp;
29781 + *icv = -1;
29782 +
29783 + for (ui = offset; ui < len - 4; ui++)
29784 + {
29785 + u8_t In;
29786 +
29787 + In = zmw_rx_buf_readb(dev, buf, ui);
29788 + *icv = (*icv>>8) ^ crc32_tab[(*icv^In)&0xff];
29789 + }
29790 +
29791 + *icv = ~*icv;
29792 +
29793 + rxbuf_icv = (zmw_rx_buf_readb(dev, buf, len-4) |
29794 + zmw_rx_buf_readb(dev, buf, len-3) << 8 |
29795 + zmw_rx_buf_readb(dev, buf, len-2) << 16 |
29796 + zmw_rx_buf_readb(dev, buf, len-1) << 24);
29797 +
29798 + if (*icv != rxbuf_icv)
29799 + {
29800 + return ZM_ICV_FAILURE;
29801 + }
29802 +
29803 + return ZM_ICV_SUCCESS;
29804 +}
29805 --- /dev/null
29806 +++ b/drivers/staging/otus/80211core/cwm.c
29807 @@ -0,0 +1,131 @@
29808 +/*
29809 + * Copyright (c) 2007-2008 Atheros Communications Inc.
29810 + *
29811 + * Permission to use, copy, modify, and/or distribute this software for any
29812 + * purpose with or without fee is hereby granted, provided that the above
29813 + * copyright notice and this permission notice appear in all copies.
29814 + *
29815 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
29816 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
29817 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
29818 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
29819 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
29820 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
29821 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
29822 + */
29823 +/* */
29824 +/* Module Name : cwm.c */
29825 +/* */
29826 +/* Abstract */
29827 +/* This module contains channel width related functions. */
29828 +/* */
29829 +/* NOTES */
29830 +/* None */
29831 +/* */
29832 +/************************************************************************/
29833 +
29834 +#include "cprecomp.h"
29835 +
29836 +
29837 +
29838 +void zfCwmInit(zdev_t* dev) {
29839 + //u16_t i;
29840 + zmw_get_wlan_dev(dev);
29841 +
29842 + switch (wd->wlanMode) {
29843 + case ZM_MODE_AP:
29844 + wd->cwm.cw_mode = CWM_MODE2040;
29845 + wd->cwm.cw_width = CWM_WIDTH40;
29846 + wd->cwm.cw_enable = 1;
29847 + break;
29848 + case ZM_MODE_INFRASTRUCTURE:
29849 + case ZM_MODE_PSEUDO:
29850 + case ZM_MODE_IBSS:
29851 + default:
29852 + wd->cwm.cw_mode = CWM_MODE2040;
29853 + wd->cwm.cw_width = CWM_WIDTH20;
29854 + wd->cwm.cw_enable = 1;
29855 + break;
29856 + }
29857 +}
29858 +
29859 +
29860 +void zfCoreCwmBusy(zdev_t* dev, u16_t busy)
29861 +{
29862 +
29863 + zmw_get_wlan_dev(dev);
29864 +
29865 + zm_msg1_mm(ZM_LV_0, "CwmBusy=", busy);
29866 +
29867 + if(wd->cwm.cw_mode == CWM_MODE20) {
29868 + wd->cwm.cw_width = CWM_WIDTH20;
29869 + return;
29870 + }
29871 +
29872 + if(wd->cwm.cw_mode == CWM_MODE40) {
29873 + wd->cwm.cw_width = CWM_WIDTH40;
29874 + return;
29875 + }
29876 +
29877 + if (busy) {
29878 + wd->cwm.cw_width = CWM_WIDTH20;
29879 + return;
29880 + }
29881 +
29882 +
29883 + if((wd->wlanMode == ZM_MODE_INFRASTRUCTURE || wd->wlanMode == ZM_MODE_PSEUDO ||
29884 + wd->wlanMode == ZM_MODE_IBSS)) {
29885 + if (wd->sta.ie.HtCap.HtCapInfo && HTCAP_SupChannelWidthSet != 0 &&
29886 + wd->sta.ie.HtInfo.ChannelInfo && ExtHtCap_RecomTxWidthSet != 0 &&
29887 + (wd->sta.ie.HtInfo.ChannelInfo && ExtHtCap_ExtChannelOffsetAbove) == 1) {
29888 +
29889 + wd->cwm.cw_width = CWM_WIDTH40;
29890 + }
29891 + else {
29892 + wd->cwm.cw_width = CWM_WIDTH20;
29893 + }
29894 +
29895 + return;
29896 + }
29897 +
29898 + if(wd->wlanMode == ZM_MODE_AP) {
29899 + wd->cwm.cw_width = CWM_WIDTH40;
29900 + }
29901 +
29902 +}
29903 +
29904 +
29905 +
29906 +
29907 +u16_t zfCwmIsExtChanBusy(u32_t ctlBusy, u32_t extBusy)
29908 +{
29909 + u32_t busy; /* percentage */
29910 + u32_t cycleTime, ctlClear;
29911 +
29912 + cycleTime = 1280000; //1.28 seconds
29913 +
29914 + if (cycleTime > ctlBusy) {
29915 + ctlClear = cycleTime - ctlBusy;
29916 + }
29917 + else
29918 + {
29919 + ctlClear = 0;
29920 + }
29921 +
29922 + /* Compute ratio of extension channel busy to control channel clear
29923 + * as an approximation to extension channel cleanliness.
29924 + *
29925 + * According to the hardware folks, ext rxclear is undefined
29926 + * if the ctrl rxclear is de-asserted (i.e. busy)
29927 + */
29928 + if (ctlClear) {
29929 + busy = (extBusy * 100) / ctlClear;
29930 + } else {
29931 + busy = 0;
29932 + }
29933 + if (busy > ATH_CWM_EXTCH_BUSY_THRESHOLD) {
29934 + return TRUE;
29935 + }
29936 +
29937 + return FALSE;
29938 +}
29939 --- /dev/null
29940 +++ b/drivers/staging/otus/80211core/cwm.h
29941 @@ -0,0 +1,45 @@
29942 +/*
29943 + * Copyright (c) 2007-2008 Atheros Communications Inc.
29944 + *
29945 + * Permission to use, copy, modify, and/or distribute this software for any
29946 + * purpose with or without fee is hereby granted, provided that the above
29947 + * copyright notice and this permission notice appear in all copies.
29948 + *
29949 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
29950 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
29951 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
29952 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
29953 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
29954 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
29955 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
29956 + */
29957 +/* */
29958 +/* Module Name : cwm.h */
29959 +/* */
29960 +/* Abstract */
29961 +/* This module contains channel width relatived functions. */
29962 +/* */
29963 +/* NOTES */
29964 +/* None */
29965 +/* */
29966 +/****************************************************************************/
29967 +/*Revision History: */
29968 +/* Who When What */
29969 +/* -------- -------- ----------------------------------------------*/
29970 +/* */
29971 +/* Honda 3-19-07 created */
29972 +/* */
29973 +/****************************************************************************/
29974 +
29975 +#ifndef _CWM_H
29976 +#define _CWM_H
29977 +
29978 +#define ATH_CWM_EXTCH_BUSY_THRESHOLD 30 /* Extension Channel Busy Threshold (0-100%) */
29979 +
29980 +void zfCwmInit(zdev_t* dev);
29981 +void zfCoreCwmBusy(zdev_t* dev, u16_t busy);
29982 +u16_t zfCwmIsExtChanBusy(u32_t ctlBusy, u32_t extBusy);
29983 +
29984 +
29985 +
29986 +#endif /* #ifndef _CWM_H */
29987 --- /dev/null
29988 +++ b/drivers/staging/otus/80211core/freqctrl.c
29989 @@ -0,0 +1,259 @@
29990 +/*
29991 + * Copyright (c) 2007-2008 Atheros Communications Inc.
29992 + *
29993 + * Permission to use, copy, modify, and/or distribute this software for any
29994 + * purpose with or without fee is hereby granted, provided that the above
29995 + * copyright notice and this permission notice appear in all copies.
29996 + *
29997 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
29998 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
29999 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
30000 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
30001 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
30002 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
30003 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
30004 + */
30005 +
30006 +#include "cprecomp.h"
30007 +
30008 +/* zfAddFreqChangeReq should be called inside the critical section */
30009 +static void zfAddFreqChangeReq(zdev_t* dev, u16_t frequency, u8_t bw40,
30010 + u8_t extOffset, zfpFreqChangeCompleteCb cb)
30011 +{
30012 + zmw_get_wlan_dev(dev);
30013 +
30014 +//printk("zfAddFreqChangeReq freqReqQueueTail%d\n", wd->freqCtrl.freqReqQueueTail);
30015 + wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueTail] = frequency;
30016 + wd->freqCtrl.freqReqBw40[wd->freqCtrl.freqReqQueueTail] = bw40;
30017 + wd->freqCtrl.freqReqExtOffset[wd->freqCtrl.freqReqQueueTail] = extOffset;
30018 + wd->freqCtrl.freqChangeCompCb[wd->freqCtrl.freqReqQueueTail] = cb;
30019 + wd->freqCtrl.freqReqQueueTail++;
30020 + if ( wd->freqCtrl.freqReqQueueTail >= ZM_MAX_FREQ_REQ_QUEUE )
30021 + {
30022 + wd->freqCtrl.freqReqQueueTail = 0;
30023 + }
30024 +}
30025 +
30026 +void zfCoreSetFrequencyV2(zdev_t* dev, u16_t frequency, zfpFreqChangeCompleteCb cb)
30027 +{
30028 + zfCoreSetFrequencyEx(dev, frequency, 0, 0, cb);
30029 +}
30030 +
30031 +void zfCoreSetFrequencyExV2(zdev_t* dev, u16_t frequency, u8_t bw40,
30032 + u8_t extOffset, zfpFreqChangeCompleteCb cb, u8_t forceSetFreq)
30033 +{
30034 + u8_t setFreqImmed = 0;
30035 + u8_t initRF = 0;
30036 + zmw_get_wlan_dev(dev);
30037 + zmw_declare_for_critical_section();
30038 +
30039 + zm_msg1_scan(ZM_LV_1, "Freq=", frequency);
30040 +
30041 + zmw_enter_critical_section(dev);
30042 + if ((wd->sta.currentFrequency == frequency)
30043 + && (wd->sta.currentBw40 == bw40)
30044 + && (wd->sta.currentExtOffset == extOffset))
30045 + {
30046 + if ( forceSetFreq == 0 && wd->sta.flagFreqChanging == 0 )
30047 + {
30048 + goto done;
30049 + }
30050 + }
30051 +#ifdef ZM_FB50
30052 + /*if(frequency!=2437) {
30053 + zmw_leave_critical_section(dev);
30054 + return;
30055 + }*/
30056 +#endif
30057 +
30058 + zfAddFreqChangeReq(dev, frequency, bw40, extOffset, cb);
30059 +
30060 +// zm_assert( wd->sta.flagFreqChanging == 0 );
30061 + //wd->sta.flagFreqChanging = 1;
30062 + if ( wd->sta.flagFreqChanging == 0 )
30063 + {
30064 + if ((wd->sta.currentBw40 != bw40) || (wd->sta.currentExtOffset != extOffset))
30065 + {
30066 + initRF = 1;
30067 + }
30068 + wd->sta.currentFrequency = frequency;
30069 + wd->sta.currentBw40 = bw40;
30070 + wd->sta.currentExtOffset = extOffset;
30071 + setFreqImmed = 1;
30072 + }
30073 + wd->sta.flagFreqChanging++;
30074 +
30075 + zmw_leave_critical_section(dev);
30076 +
30077 + if ( setFreqImmed )
30078 + {
30079 + //zfHpSetFrequency(dev, frequency, 0);
30080 + if ( forceSetFreq )
30081 + { // Cold reset to reset the frequency after scanning !
30082 + zm_debug_msg0("#6_1 20070917");
30083 + zm_debug_msg0("It is happen!!! No error message");
30084 + zfHpSetFrequencyEx(dev, frequency, bw40, extOffset, 2);
30085 + }
30086 + else
30087 + {
30088 + zfHpSetFrequencyEx(dev, frequency, bw40, extOffset, initRF);
30089 + }
30090 +
30091 + if ( zfStaIsConnected(dev)
30092 + && (frequency == wd->frequency)) {
30093 + wd->sta.connPowerInHalfDbm = zfHpGetTransmitPower(dev);
30094 + }
30095 + }
30096 + return;
30097 +
30098 +done:
30099 + zmw_leave_critical_section(dev);
30100 +
30101 + if ( cb != NULL )
30102 + {
30103 + cb(dev);
30104 + }
30105 + zfPushVtxq(dev);
30106 + return;
30107 +}
30108 +
30109 +void zfCoreSetFrequencyEx(zdev_t* dev, u16_t frequency, u8_t bw40,
30110 + u8_t extOffset, zfpFreqChangeCompleteCb cb)
30111 +{
30112 + zfCoreSetFrequencyExV2(dev, frequency, bw40, extOffset, cb, 0);
30113 +}
30114 +
30115 +void zfCoreSetFrequency(zdev_t* dev, u16_t frequency)
30116 +{
30117 + zfCoreSetFrequencyV2(dev, frequency, NULL);
30118 +}
30119 +
30120 +/* zfRemoveFreqChangeReq SHOULD NOT be called inside the critical section */
30121 +static void zfRemoveFreqChangeReq(zdev_t* dev)
30122 +{
30123 + zfpFreqChangeCompleteCb cb = NULL;
30124 + u16_t frequency;
30125 + u8_t bw40;
30126 + u8_t extOffset;
30127 + u16_t compFreq = 0;
30128 + u8_t compBw40 = 0;
30129 + u8_t compExtOffset = 0;
30130 +
30131 + zmw_get_wlan_dev(dev);
30132 + zmw_declare_for_critical_section();
30133 +
30134 + zmw_enter_critical_section(dev);
30135 +
30136 + if (wd->freqCtrl.freqReqQueueHead != wd->freqCtrl.freqReqQueueTail)
30137 + {
30138 + zm_msg1_scan(ZM_LV_1, "Freq=",
30139 + wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead]);
30140 + compFreq = wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead];
30141 + compBw40 = wd->freqCtrl.freqReqBw40[wd->freqCtrl.freqReqQueueHead];
30142 + compExtOffset = wd->freqCtrl.freqReqExtOffset[wd->freqCtrl.freqReqQueueHead];
30143 +
30144 + wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead] = 0;
30145 + cb = wd->freqCtrl.freqChangeCompCb[wd->freqCtrl.freqReqQueueHead];
30146 + wd->freqCtrl.freqReqQueueHead++;
30147 + if ( wd->freqCtrl.freqReqQueueHead >= ZM_MAX_FREQ_REQ_QUEUE )
30148 + {
30149 + wd->freqCtrl.freqReqQueueHead = 0;
30150 + }
30151 + }
30152 + zmw_leave_critical_section(dev);
30153 +
30154 + if ( cb != NULL )
30155 + {
30156 + cb(dev);
30157 + }
30158 +
30159 + zmw_enter_critical_section(dev);
30160 + while (wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead] != 0)
30161 + {
30162 + frequency = wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead];
30163 + bw40 = wd->freqCtrl.freqReqBw40[wd->freqCtrl.freqReqQueueHead];
30164 + extOffset=wd->freqCtrl.freqReqExtOffset[wd->freqCtrl.freqReqQueueHead];
30165 + if ((compFreq == frequency)
30166 + && (compBw40 == bw40)
30167 + && (compExtOffset == extOffset))
30168 + {
30169 + /* Duplicated frequency command */
30170 + zm_msg1_scan(ZM_LV_1, "Duplicated Freq=", frequency);
30171 +
30172 + cb = wd->freqCtrl.freqChangeCompCb[wd->freqCtrl.freqReqQueueHead];
30173 + wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead] = 0;
30174 + wd->freqCtrl.freqReqQueueHead++;
30175 +
30176 + if ( wd->freqCtrl.freqReqQueueHead >= ZM_MAX_FREQ_REQ_QUEUE )
30177 + {
30178 + wd->freqCtrl.freqReqQueueHead = 0;
30179 + }
30180 +
30181 + if ( wd->sta.flagFreqChanging != 0 )
30182 + {
30183 + wd->sta.flagFreqChanging--;
30184 + }
30185 +
30186 + zmw_leave_critical_section(dev);
30187 + if ( cb != NULL )
30188 + {
30189 + cb(dev);
30190 + }
30191 + zmw_enter_critical_section(dev);
30192 + }
30193 + else
30194 + {
30195 + u8_t initRF = 0;
30196 + if ((wd->sta.currentBw40 != bw40) || (wd->sta.currentExtOffset != extOffset))
30197 + {
30198 + initRF = 1;
30199 + }
30200 + wd->sta.currentFrequency = frequency;
30201 + wd->sta.currentBw40 = bw40;
30202 + wd->sta.currentExtOffset = extOffset;
30203 + zmw_leave_critical_section(dev);
30204 +
30205 + zfHpSetFrequencyEx(dev, frequency, bw40, extOffset, initRF);
30206 + if ( zfStaIsConnected(dev)
30207 + && (frequency == wd->frequency)) {
30208 + wd->sta.connPowerInHalfDbm = zfHpGetTransmitPower(dev);
30209 + }
30210 +
30211 + return;
30212 + }
30213 + }
30214 + zmw_leave_critical_section(dev);
30215 +
30216 + return;
30217 +}
30218 +
30219 +void zfCoreSetFrequencyComplete(zdev_t* dev)
30220 +{
30221 + zmw_get_wlan_dev(dev);
30222 + zmw_declare_for_critical_section();
30223 +
30224 + zm_msg1_scan(ZM_LV_1, "flagFreqChanging=", wd->sta.flagFreqChanging);
30225 +
30226 + zmw_enter_critical_section(dev);
30227 + //wd->sta.flagFreqChanging = 0;
30228 + if ( wd->sta.flagFreqChanging != 0 )
30229 + {
30230 + wd->sta.flagFreqChanging--;
30231 + }
30232 +
30233 + zmw_leave_critical_section(dev);
30234 +
30235 + zfRemoveFreqChangeReq(dev);
30236 +
30237 + zfPushVtxq(dev);
30238 + return;
30239 +}
30240 +
30241 +void zfReSetCurrentFrequency(zdev_t* dev)
30242 +{
30243 + zmw_get_wlan_dev(dev);
30244 +
30245 + zm_debug_msg0("It is happen!!! No error message");
30246 +
30247 + zfCoreSetFrequencyExV2(dev, wd->frequency, 0, 0, NULL, 1);
30248 +}
30249 --- /dev/null
30250 +++ b/drivers/staging/otus/80211core/ledmgr.c
30251 @@ -0,0 +1,557 @@
30252 +/*
30253 + * Copyright (c) 2007-2008 Atheros Communications Inc.
30254 + *
30255 + * Permission to use, copy, modify, and/or distribute this software for any
30256 + * purpose with or without fee is hereby granted, provided that the above
30257 + * copyright notice and this permission notice appear in all copies.
30258 + *
30259 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
30260 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
30261 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
30262 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
30263 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
30264 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
30265 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
30266 + */
30267 +
30268 +#include "cprecomp.h"
30269 +
30270 +/************************************************************************/
30271 +/* */
30272 +/* FUNCTION DESCRIPTION zfLedCtrlType1 */
30273 +/* Traditional single-LED state */
30274 +/* */
30275 +/* INPUTS */
30276 +/* dev : device pointer */
30277 +/* */
30278 +/* OUTPUTS */
30279 +/* None */
30280 +/* */
30281 +/* AUTHOR */
30282 +/* Stephen Chen Atheros Communications, INC. 2007.6 */
30283 +/* */
30284 +/************************************************************************/
30285 +// bit 15-12 : Toff for Scan state
30286 +// 11-8 : Ton for Scan state
30287 +// 7 : Reserved
30288 +// 6 : mode
30289 +//--------------------------------------
30290 +// bit 6 = 0
30291 +// 5-4 : Connect state
30292 +// 00 => always off
30293 +// 01 => always on
30294 +// 10 => Idle off, acitve on
30295 +// 11 => Idle on, active off
30296 +//--------------------------------------
30297 +// bit 6 = 1
30298 +// 5-4 : freq
30299 +// 00 => 1Hz
30300 +// 01 => 0.5Hz
30301 +// 10 => 0.25Hz
30302 +// 11 => 0.125Hz
30303 +//--------------------------------------
30304 +// 3 : Power save state
30305 +// 0 => always off in power save state
30306 +// 1 => works as connect state
30307 +// 2 : Disable state
30308 +// 1 : Reserved
30309 +// 0 : Power-on state
30310 +void zfLedCtrlType1(zdev_t* dev)
30311 +{
30312 + u16_t i;
30313 + u32_t ton, toff, tmp, period;
30314 + zmw_get_wlan_dev(dev);
30315 +
30316 + for (i=0; i<ZM_MAX_LED_NUMBER; i++)
30317 + {
30318 + if (zfStaIsConnected(dev) != TRUE)
30319 + {
30320 + //Scan state
30321 + ton = ((wd->ledStruct.ledMode[i] & 0xf00) >> 8) * 5;
30322 + toff = ((wd->ledStruct.ledMode[i] & 0xf000) >> 12) * 5;
30323 +
30324 + if ((ton + toff) != 0)
30325 + {
30326 + tmp = wd->ledStruct.counter / (ton+toff);
30327 + tmp = wd->ledStruct.counter - (tmp * (ton+toff));
30328 + if (tmp < ton)
30329 + {
30330 + zfHpLedCtrl(dev, i, 1);
30331 + }
30332 + else
30333 + {
30334 + zfHpLedCtrl(dev, i, 0);
30335 + }
30336 + }
30337 + }
30338 + else
30339 + {
30340 + if ((zfPowerSavingMgrIsSleeping(dev)) && ((wd->ledStruct.ledMode[i] & 0x8) == 0))
30341 + {
30342 + zfHpLedCtrl(dev, i, 0);
30343 + }
30344 + else
30345 + {
30346 + //Connect state
30347 + if ((wd->ledStruct.ledMode[i] & 0x40) == 0)
30348 + {
30349 + if ((wd->ledStruct.counter & 1) == 0)
30350 + {
30351 + zfHpLedCtrl(dev, i, (wd->ledStruct.ledMode[i] & 0x10) >> 4);
30352 + }
30353 + else
30354 + {
30355 + if ((wd->ledStruct.txTraffic > 0) || (wd->ledStruct.rxTraffic > 0))
30356 + {
30357 + wd->ledStruct.txTraffic = wd->ledStruct.rxTraffic = 0;
30358 + if ((wd->ledStruct.ledMode[i] & 0x20) != 0)
30359 + {
30360 + zfHpLedCtrl(dev, i, ((wd->ledStruct.ledMode[i] & 0x10) >> 4)^1);
30361 + }
30362 + }
30363 + }
30364 + }// if ((wd->ledStruct.ledMode[i] & 0x40) == 0)
30365 + else
30366 + {
30367 + period = 5 * (1 << ((wd->ledStruct.ledMode[i] & 0x30) >> 4));
30368 + tmp = wd->ledStruct.counter / (period*2);
30369 + tmp = wd->ledStruct.counter - (tmp * (period*2));
30370 + if (tmp < period)
30371 + {
30372 + if ((wd->ledStruct.counter & 1) == 0)
30373 + {
30374 + zfHpLedCtrl(dev, i, 0);
30375 + }
30376 + else
30377 + {
30378 + if ((wd->ledStruct.txTraffic > 0) || (wd->ledStruct.rxTraffic > 0))
30379 + {
30380 + wd->ledStruct.txTraffic = wd->ledStruct.rxTraffic = 0;
30381 + zfHpLedCtrl(dev, i, 1);
30382 + }
30383 + }
30384 + }
30385 + else
30386 + {
30387 + if ((wd->ledStruct.counter & 1) == 0)
30388 + {
30389 + zfHpLedCtrl(dev, i, 1);
30390 + }
30391 + else
30392 + {
30393 + if ((wd->ledStruct.txTraffic > 0) || (wd->ledStruct.rxTraffic > 0))
30394 + {
30395 + wd->ledStruct.txTraffic = wd->ledStruct.rxTraffic = 0;
30396 + zfHpLedCtrl(dev, i, 0);
30397 + }
30398 + }
30399 + }
30400 + } //else, if ((wd->ledStruct.ledMode[i] & 0x40) == 0)
30401 + } //else, if (zfPowerSavingMgrIsSleeping(dev))
30402 + } //else : if (zfStaIsConnected(dev) != TRUE)
30403 + } //for (i=0; i<ZM_MAX_LED_NUMBER; i++)
30404 +}
30405 +
30406 +/******************************************************************************/
30407 +/* */
30408 +/* FUNCTION DESCRIPTION zfLedCtrlType2 */
30409 +/* Customize for Netgear Dual-LED state ((bug#31292)) */
30410 +/* */
30411 +/* 1. Status: When dongle does not connect to 2.4G or 5G but in site */
30412 +/* survey/association */
30413 +/* LED status: Slow blinking, Amber then Blue per 500ms */
30414 +/* 2. Status: Connection at 2.4G in site survey/association */
30415 +/* LED status: Slow blinking, Amber/off per 500ms */
30416 +/* 3. Status: Connection at 5G in site survey/association */
30417 +/* LED status: Slow blinking, Blue/off per 500ms */
30418 +/* 4. Status: When transfer the packet */
30419 +/* LED status: Blink per packet, including TX and RX */
30420 +/* 5. Status: When linking is established but no traffic */
30421 +/* LED status: Always on */
30422 +/* 6. Status: When linking is dropped but no re-connection */
30423 +/* LED status: Always off */
30424 +/* 7. Status: From one connection(2.4G or 5G) to change to another band */
30425 +/* LED status: Amber/Blue =>Slow blinking, Amber then Blue per 500ms */
30426 +/* */
30427 +/* INPUTS */
30428 +/* dev : device pointer */
30429 +/* */
30430 +/* OUTPUTS */
30431 +/* None */
30432 +/* */
30433 +/* AUTHOR */
30434 +/* Shang-Chun Liu Atheros Communications, INC. 2007.11 */
30435 +/* */
30436 +/******************************************************************************/
30437 +void zfLedCtrlType2_scan(zdev_t* dev);
30438 +
30439 +void zfLedCtrlType2(zdev_t* dev)
30440 +{
30441 + u32_t ton, toff, tmp, period;
30442 + u16_t OperateLED;
30443 + zmw_get_wlan_dev(dev);
30444 +
30445 + if (zfStaIsConnected(dev) != TRUE)
30446 + {
30447 + // Disconnect state
30448 + if(wd->ledStruct.counter % 4 != 0)
30449 + {
30450 + // Update LED each 400ms(4*100)
30451 + // Prevent this situation
30452 + // _______ ___
30453 + // LED[0] ON | | | x |
30454 + // ------ OFF->+-+-+-+-+-+-+-+-+-+-+-+->>>...
30455 + // LED[1] ON
30456 + //
30457 + return;
30458 + }
30459 +
30460 + if (((wd->state == ZM_WLAN_STATE_DISABLED) && (wd->sta.bChannelScan))
30461 + || ((wd->state != ZM_WLAN_STATE_DISABLED) && (wd->sta.bAutoReconnect)))
30462 + {
30463 + // Scan/AutoReconnect state
30464 + zfLedCtrlType2_scan(dev);
30465 + }
30466 + else
30467 + {
30468 + // Neither Connected nor Scan
30469 + zfHpLedCtrl(dev, 0, 0);
30470 + zfHpLedCtrl(dev, 1, 0);
30471 + }
30472 + }
30473 + else
30474 + {
30475 + if( wd->sta.bChannelScan )
30476 + {
30477 + // Scan state
30478 + if(wd->ledStruct.counter % 4 != 0)
30479 + return;
30480 + zfLedCtrlType2_scan(dev);
30481 + return;
30482 + }
30483 +
30484 + if(wd->frequency < 3000)
30485 + {
30486 + OperateLED = 0; // LED[0]: work on 2.4G (b/g band)
30487 + zfHpLedCtrl(dev, 1, 0);
30488 + }
30489 + else
30490 + {
30491 + OperateLED = 1; // LED[1]: work on 5G (a band)
30492 + zfHpLedCtrl(dev, 0, 0);
30493 + }
30494 +
30495 + if ((zfPowerSavingMgrIsSleeping(dev)) && ((wd->ledStruct.ledMode[OperateLED] & 0x8) == 0))
30496 + {
30497 + // If Sleeping, turn OFF
30498 + zfHpLedCtrl(dev, OperateLED, 0);
30499 + }
30500 + else
30501 + {
30502 + //Connect state
30503 + if ((wd->ledStruct.counter & 1) == 0) // even
30504 + {
30505 + // No traffic, always ON
30506 + zfHpLedCtrl(dev, OperateLED, 1);
30507 + }
30508 + else // odd
30509 + {
30510 + if ((wd->ledStruct.txTraffic > 0) || (wd->ledStruct.rxTraffic > 0))
30511 + {
30512 + // If have traffic, turn OFF
30513 + // _____ _ _ _ _____
30514 + // LED[Operate] ON | | | | | | | |
30515 + // ------------ OFF->-+-+-+-+-+-+-+-+-+-+-+-+-+->>>...
30516 + //
30517 + wd->ledStruct.txTraffic = wd->ledStruct.rxTraffic = 0;
30518 + zfHpLedCtrl(dev, OperateLED, 0);
30519 + }
30520 + }
30521 + }
30522 + }
30523 +}
30524 +
30525 +void zfLedCtrlType2_scan(zdev_t* dev)
30526 +{
30527 + zmw_get_wlan_dev(dev);
30528 +
30529 + // When doing scan, blink(Amber/Blue) and off per 500ms (about 400ms in our driver)
30530 + // _______ _______
30531 + // LED[0] ON | | 8 12 | |
30532 + // ------ OFF->-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+->>>...
30533 + // LED[1] ON 0 4 |_______| 0 3
30534 + //
30535 +
30536 + switch(wd->ledStruct.counter % 16)
30537 + {
30538 + case 0: // case 0~3, LED[0] on
30539 + if(wd->supportMode & ZM_WIRELESS_MODE_24)
30540 + {
30541 + zfHpLedCtrl(dev, 0, 1);
30542 + zfHpLedCtrl(dev, 1, 0);
30543 + }
30544 + else
30545 + {
30546 + zfHpLedCtrl(dev, 1, 1);
30547 + zfHpLedCtrl(dev, 0, 0);
30548 + }
30549 + break;
30550 +
30551 + case 8: // case 8~11, LED[1] on
30552 + if(wd->supportMode & ZM_WIRELESS_MODE_5)
30553 + {
30554 + zfHpLedCtrl(dev, 1, 1);
30555 + zfHpLedCtrl(dev, 0, 0);
30556 + }
30557 + else
30558 + {
30559 + zfHpLedCtrl(dev, 0, 1);
30560 + zfHpLedCtrl(dev, 1, 0);
30561 + }
30562 + break;
30563 +
30564 + default: // others, all off
30565 + zfHpLedCtrl(dev, 0, 0);
30566 + zfHpLedCtrl(dev, 1, 0);
30567 + break;
30568 + }
30569 +}
30570 +
30571 +/**********************************************************************************/
30572 +/* */
30573 +/* FUNCTION DESCRIPTION zfLedCtrlType3 */
30574 +/* Customize for Netgear Single-LED state ((bug#32243)) */
30575 +/* */
30576 +/* ¡EOff: when the adapter is disabled or hasn't started to associate with AP */
30577 +/* yet. */
30578 +/* ¡EOn: Once adpater associate with AP successfully */
30579 +/* ¡ESlow blinking: whenever adapters do site-survey or try to associate with AP */
30580 +/* - If there is a connection already, and adapters do site-survey or */
30581 +/* re-associate action, the LED should keep LED backgraoud as ON, thus */
30582 +/* the blinking behavior SHOULD be OFF (200ms) - ON (800ms) and continue this*/
30583 +/* cycle. */
30584 +/* - If there is no connection yet, and adapters start to do site-survey or */
30585 +/* associate action, the LED should keep LED background as OFF, thus the */
30586 +/* blinking behavior SHOULD be ON (200ms) - OFF (800ms) and continue this */
30587 +/* cycle. */
30588 +/* - For the case that associate fail, adpater should keep associating, and the*/
30589 +/* LED should also keep slow blinking. */
30590 +/* ¡EQuick blinking: to blink OFF-ON cycle for each time that traffic packet is */
30591 +/* received or is transmitted. */
30592 +/* */
30593 +/* INPUTS */
30594 +/* dev : device pointer */
30595 +/* */
30596 +/* OUTPUTS */
30597 +/* None */
30598 +/* */
30599 +/* AUTHOR */
30600 +/* Shang-Chun Liu Atheros Communications, INC. 2008.01 */
30601 +/* */
30602 +/**********************************************************************************/
30603 +void zfLedCtrlType3_scan(zdev_t* dev, u16_t isConnect);
30604 +
30605 +void zfLedCtrlType3(zdev_t* dev)
30606 +{
30607 + zmw_get_wlan_dev(dev);
30608 +
30609 + if (zfStaIsConnected(dev) != TRUE)
30610 + {
30611 + // Disconnect state
30612 + if(wd->ledStruct.counter % 2 != 0)
30613 + {
30614 + // Update LED each 200ms(2*100)
30615 + // Prevent this situation
30616 + // ___ _
30617 + // LED[0] ON | | |x|
30618 + // ------ OFF->+-+-+-+-+-+-+->>>...
30619 + //
30620 + return;
30621 + }
30622 +
30623 + if (((wd->state == ZM_WLAN_STATE_DISABLED) && (wd->sta.bChannelScan))
30624 + || ((wd->state != ZM_WLAN_STATE_DISABLED) && (wd->sta.bAutoReconnect)))
30625 + {
30626 + // Scan/AutoReconnect state
30627 + zfLedCtrlType3_scan(dev, 0);
30628 + }
30629 + else
30630 + {
30631 + // Neither Connected nor Scan
30632 + zfHpLedCtrl(dev, 0, 0);
30633 + zfHpLedCtrl(dev, 1, 0);
30634 + }
30635 + }
30636 + else
30637 + {
30638 + if( wd->sta.bChannelScan )
30639 + {
30640 + // Scan state
30641 + if(wd->ledStruct.counter % 2 != 0)
30642 + return;
30643 + zfLedCtrlType3_scan(dev, 1);
30644 + return;
30645 + }
30646 +
30647 + if ((zfPowerSavingMgrIsSleeping(dev)) && ((wd->ledStruct.ledMode[0] & 0x8) == 0))
30648 + {
30649 + // If Sleeping, turn OFF
30650 + zfHpLedCtrl(dev, 0, 0);
30651 + zfHpLedCtrl(dev, 1, 0);
30652 + }
30653 + else
30654 + {
30655 + //Connect state
30656 + if ((wd->ledStruct.counter & 1) == 0) // even
30657 + {
30658 + // No traffic, always ON
30659 + zfHpLedCtrl(dev, 0, 1);
30660 + zfHpLedCtrl(dev, 1, 1);
30661 + }
30662 + else // odd
30663 + {
30664 + if ((wd->ledStruct.txTraffic > 0) || (wd->ledStruct.rxTraffic > 0))
30665 + {
30666 + // If have traffic, turn OFF
30667 + // _____ _ _ _ _____
30668 + // LED[Operate] ON | | | | | | | |
30669 + // ------------ OFF->-+-+-+-+-+-+-+-+-+-+-+-+-+->>>...
30670 + //
30671 + wd->ledStruct.txTraffic = wd->ledStruct.rxTraffic = 0;
30672 + zfHpLedCtrl(dev, 0, 0);
30673 + zfHpLedCtrl(dev, 1, 0);
30674 + }
30675 + }
30676 + }
30677 + }
30678 +}
30679 +
30680 +void zfLedCtrlType3_scan(zdev_t* dev, u16_t isConnect)
30681 +{
30682 + u32_t ton, toff, tmp;
30683 + zmw_get_wlan_dev(dev);
30684 +
30685 + // Doing scan when :
30686 + // 1. Disconnected: ON (200ms) - OFF (800ms) (200ms-600ms in our driver)
30687 + // ___ ___ ___
30688 + // LED[0] ON | | | | | |
30689 + // ------ OFF->-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+->>>...
30690 + // 0 2 4 6 8 10 12 14 16
30691 + // 2. Connected: ON (800ms) - OFF (200ms) (600ms-200ms in our driver)
30692 + // ___________ ___________ ______
30693 + // LED[0] ON | | | | |
30694 + // ------ OFF->-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+->>>...
30695 + // 0 2 4 6 8 10 12 14 16
30696 +
30697 + //Scan state
30698 + if(!isConnect)
30699 + ton = 2, toff = 6;
30700 + else
30701 + ton = 6, toff = 2;
30702 +
30703 + if ((ton + toff) != 0)
30704 + {
30705 + tmp = wd->ledStruct.counter % (ton+toff);
30706 + if (tmp < ton)
30707 + {
30708 + zfHpLedCtrl(dev, 0, 1);
30709 + zfHpLedCtrl(dev, 1, 1);
30710 + }
30711 + else
30712 + {
30713 + zfHpLedCtrl(dev, 0, 0);
30714 + zfHpLedCtrl(dev, 1, 0);
30715 + }
30716 + }
30717 +}
30718 +
30719 +/******************************************************************************/
30720 +/* */
30721 +/* FUNCTION DESCRIPTION zfLedCtrl_BlinkWhenScan_Alpha */
30722 +/* Customize for Alpha/DLink LED */
30723 +/* - Blink LED 12 times within 3 seconds when doing Active Scan */
30724 +/* ___ ___ ___ ___ */
30725 +/* LED[0] ON | | | | | | | | */
30726 +/* -------OFF->-+-+-+-+-+-+-+-+-+-+-+-+-+--+-->>>... */
30727 +/* */
30728 +/* INPUTS */
30729 +/* dev : device pointer */
30730 +/* */
30731 +/* OUTPUTS */
30732 +/* None */
30733 +/* */
30734 +/* AUTHOR */
30735 +/* Shang-Chun Liu Atheros Communications, INC. 2007.11 */
30736 +/* */
30737 +/******************************************************************************/
30738 +void zfLedCtrl_BlinkWhenScan_Alpha(zdev_t* dev)
30739 +{
30740 + static u32_t counter = 0;
30741 + zmw_get_wlan_dev(dev);
30742 +
30743 + if(counter > 34) // counter for 3 sec
30744 + {
30745 + wd->ledStruct.LEDCtrlFlag &= ~(u8_t)ZM_LED_CTRL_FLAG_ALPHA;
30746 + counter = 0;
30747 + }
30748 +
30749 + if( (counter % 3) < 2)
30750 + zfHpLedCtrl(dev, 0, 1);
30751 + else
30752 + zfHpLedCtrl(dev, 0, 0);
30753 +
30754 + counter++;
30755 +}
30756 +
30757 +
30758 +/************************************************************************/
30759 +/* */
30760 +/* FUNCTION DESCRIPTION zfLed100msCtrl */
30761 +/* LED 100 milliseconds timer. */
30762 +/* */
30763 +/* INPUTS */
30764 +/* dev : device pointer */
30765 +/* */
30766 +/* OUTPUTS */
30767 +/* None */
30768 +/* */
30769 +/* AUTHOR */
30770 +/* Stephen Chen Atheros Communications, INC. 2007.6 */
30771 +/* */
30772 +/************************************************************************/
30773 +void zfLed100msCtrl(zdev_t* dev)
30774 +{
30775 + zmw_get_wlan_dev(dev);
30776 +
30777 + wd->ledStruct.counter++;
30778 +
30779 + if(wd->ledStruct.LEDCtrlFlag)
30780 + {
30781 + switch(wd->ledStruct.LEDCtrlFlag) {
30782 + case ZM_LED_CTRL_FLAG_ALPHA:
30783 + zfLedCtrl_BlinkWhenScan_Alpha(dev);
30784 + break;
30785 + }
30786 + }
30787 + else
30788 + {
30789 + switch(wd->ledStruct.LEDCtrlType) {
30790 + case 1: // Traditional 1 LED
30791 + zfLedCtrlType1(dev);
30792 + break;
30793 +
30794 + case 2: // Dual-LEDs for Netgear
30795 + zfLedCtrlType2(dev);
30796 + break;
30797 +
30798 + case 3: // Single-LED for Netgear (WN111v2)
30799 + zfLedCtrlType3(dev);
30800 + break;
30801 +
30802 + default:
30803 + zfLedCtrlType1(dev);
30804 + break;
30805 + }
30806 + }
30807 +}
30808 +
30809 --- /dev/null
30810 +++ b/drivers/staging/otus/80211core/performance.c
30811 @@ -0,0 +1,431 @@
30812 +/*
30813 + * Copyright (c) 2007-2008 Atheros Communications Inc.
30814 + *
30815 + * Permission to use, copy, modify, and/or distribute this software for any
30816 + * purpose with or without fee is hereby granted, provided that the above
30817 + * copyright notice and this permission notice appear in all copies.
30818 + *
30819 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
30820 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
30821 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
30822 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
30823 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
30824 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
30825 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
30826 + */
30827 +/* */
30828 +/* Module Name : performance.c */
30829 +/* */
30830 +/* Abstract */
30831 +/* This module performance evaluation functions. */
30832 +/* */
30833 +/* NOTES */
30834 +/* None */
30835 +/* */
30836 +/************************************************************************/
30837 +#include "cprecomp.h"
30838 +#ifdef ZM_ENABLE_PERFORMANCE_EVALUATION
30839 +
30840 +#define ZM_TP_SIZE 50
30841 +struct zsSummary zm_summary;
30842 +struct zsVariation zm_var;
30843 +struct zsThroughput zm_tp;
30844 +
30845 +void zfiPerformanceInit(zdev_t* dev)
30846 +{
30847 + u16_t i;
30848 +
30849 + zmw_get_wlan_dev(dev);
30850 +
30851 + zm_summary.tick_base = wd->tick;
30852 + zm_summary.tx_msdu_count = 0;
30853 + zm_summary.tx_mpdu_count = 0;
30854 + zm_summary.rx_msdu_count = 0;
30855 + zm_summary.rx_mpdu_count = 0;
30856 + zm_summary.rx_broken_seq = 0;
30857 + zm_summary.rx_broken_sum = 0;
30858 + zm_summary.rx_seq_base = 0;
30859 + zm_summary.rx_broken_seq_dis = 0;
30860 + zm_summary.rx_duplicate_seq = 0;
30861 + zm_summary.rx_old_seq = 0;
30862 + zm_summary.reset_count = 0;
30863 + zm_summary.reset_sum = 0;
30864 + zm_summary.rx_lost_sum = 0;
30865 + zm_summary.rx_duplicate_error = 0;
30866 + zm_summary.rx_free = 0;
30867 + zm_summary.rx_amsdu_len = 0;
30868 + zm_summary.rx_flush = 0;
30869 + zm_summary.rx_clear = 0;
30870 + zm_summary.rx_reorder = 0;
30871 +
30872 + for (i=0; i<100; i++)
30873 + {
30874 + zm_var.tx_msdu_tick[i] = zm_var.tx_mpdu_tick[i] = 0;
30875 + zm_var.rx_msdu_tick[i] = zm_var.rx_mpdu_tick[i] = 0;
30876 + }
30877 +
30878 + zfTimerSchedule(dev, ZM_EVENT_TIMEOUT_PERFORMANCE, 100);
30879 +
30880 + zm_tp.size = ZM_TP_SIZE;
30881 + zm_tp.head = zm_tp.size - 1;
30882 + zm_tp.tail = 0;
30883 + for (i=0; i<zm_tp.size; i++)
30884 + {
30885 + zm_tp.tx[i]=0;
30886 + zm_tp.rx[i]=0;
30887 + }
30888 +}
30889 +
30890 +void zfiPerformanceGraph(zdev_t* dev)
30891 +{
30892 + s16_t i,j;
30893 + u8_t s[ZM_TP_SIZE+5];
30894 + zmw_get_wlan_dev(dev);
30895 +
30896 + for (i=0; i<(zm_tp.size-1); i++)
30897 + {
30898 + zm_tp.tx[i] = zm_tp.tx[i+1];
30899 + zm_tp.rx[i] = zm_tp.rx[i+1];
30900 + }
30901 + zm_tp.tx[zm_tp.size-1] = zm_summary.tx_mpdu_count*1500*8/1000000;
30902 + zm_tp.rx[zm_tp.size-1] = zm_summary.rx_msdu_count*1500*8/1000000;
30903 +
30904 + for (i=15; i>0; i--)
30905 + {
30906 + s[0] = (i/10) + '0';
30907 + s[1] = (i%10) + '0';
30908 + s[2] = '0';
30909 + s[3] = '|';
30910 + for (j=0; j<zm_tp.size; j++)
30911 + {
30912 + if ((zm_tp.tx[j]/10 == i) && (zm_tp.rx[j]/10 == i))
30913 + {
30914 + s[4+j] = 'X';
30915 + }
30916 + else if (zm_tp.tx[j]/10 == i)
30917 + {
30918 + s[4+j] = 'T';
30919 + }
30920 + else if (zm_tp.rx[j]/10 == i)
30921 + {
30922 + s[4+j] = 'R';
30923 + }
30924 + else
30925 + {
30926 + s[4+j] = ' ';
30927 + }
30928 + }
30929 + s[zm_tp.size+4] = '\0';
30930 + DbgPrint("%s",s);
30931 + }
30932 + DbgPrint("000|__________________________________________________");
30933 +
30934 +}
30935 +
30936 +
30937 +void zfiPerformanceRefresh(zdev_t* dev)
30938 +{
30939 + u16_t i;
30940 +
30941 + zmw_get_wlan_dev(dev);
30942 +
30943 + zfiDbgReadReg(dev, 0x11772c);
30944 +
30945 + zm_var.tx_msdu_mean = zm_summary.tx_msdu_count / 100;
30946 + zm_var.tx_mpdu_mean = zm_summary.tx_mpdu_count / 100;
30947 + zm_var.rx_msdu_mean = zm_summary.rx_msdu_count / 100;
30948 + zm_var.rx_mpdu_mean = zm_summary.rx_mpdu_count / 100;
30949 +
30950 + zm_var.tx_msdu_sum = zm_var.tx_mpdu_sum = 0;
30951 + zm_var.rx_msdu_sum = zm_var.rx_mpdu_sum = 0;
30952 + zm_summary.tx_idle_count = zm_summary.rx_idle_count = 0;
30953 + for (i=0; i<100; i++)
30954 + {
30955 + zm_var.tx_msdu_sum += (zm_var.tx_msdu_tick[i] * zm_var.tx_msdu_tick[i]);
30956 + zm_var.tx_mpdu_sum += (zm_var.tx_mpdu_tick[i] * zm_var.tx_mpdu_tick[i]);
30957 + zm_var.rx_msdu_sum += (zm_var.rx_msdu_tick[i] * zm_var.rx_msdu_tick[i]);
30958 + zm_var.rx_mpdu_sum += (zm_var.rx_mpdu_tick[i] * zm_var.rx_mpdu_tick[i]);
30959 +
30960 + if (!zm_var.tx_mpdu_tick[i]) zm_summary.tx_idle_count++;
30961 + if (!zm_var.rx_mpdu_tick[i]) zm_summary.rx_idle_count++;
30962 + }
30963 + zm_var.tx_msdu_var = (zm_var.tx_msdu_sum / 100) - (zm_var.tx_msdu_mean * zm_var.tx_msdu_mean);
30964 + zm_var.tx_mpdu_var = (zm_var.tx_mpdu_sum / 100) - (zm_var.tx_mpdu_mean * zm_var.tx_mpdu_mean);
30965 + zm_var.rx_msdu_var = (zm_var.rx_msdu_sum / 100) - (zm_var.rx_msdu_mean * zm_var.rx_msdu_mean);
30966 + zm_var.rx_mpdu_var = (zm_var.rx_mpdu_sum / 100) - (zm_var.rx_mpdu_mean * zm_var.rx_mpdu_mean);
30967 +
30968 + zm_summary.tick_base = wd->tick;
30969 + zm_summary.rx_broken_sum += zm_summary.rx_broken_seq;
30970 + zm_summary.rx_lost_sum += (zm_summary.rx_broken_seq - zm_summary.rx_duplicate_seq - zm_summary.rx_old_seq);
30971 +
30972 + zfiPerformanceGraph(dev);
30973 +
30974 + DbgPrint("******************************************************\n");
30975 + DbgPrint("* TX: MSDU=%5d, VAR=%5d; MPDU=%5d, VAR=%5d\n", zm_summary.tx_msdu_count,
30976 + zm_var.tx_msdu_var, zm_summary.tx_mpdu_count, zm_var.tx_mpdu_var);
30977 + DbgPrint("* TX: idle=%5d,TxRate=%3d, PER=%5d\n", zm_summary.tx_idle_count,
30978 + wd->CurrentTxRateKbps/1000,
30979 + (u16_t)wd->PER[wd->sta.oppositeInfo[0].rcCell.currentRate]);
30980 + DbgPrint("* RX: MSDU=%5d, VAR=%5d; MPDU=%5d, VAR=%5d\n", zm_summary.rx_msdu_count,
30981 + zm_var.rx_msdu_var, zm_summary.rx_mpdu_count, zm_var.rx_mpdu_var);
30982 + DbgPrint("* RX: idle=%5d,RxRate=%3d,AMSDU=%5d\n", zm_summary.rx_idle_count,
30983 + wd->CurrentRxRateKbps/1000, zm_summary.rx_amsdu_len);
30984 + DbgPrint("* RX broken seq=%4d, distances=%4d, duplicates=%4d\n", zm_summary.rx_broken_seq,
30985 + zm_summary.rx_broken_seq_dis, zm_summary.rx_duplicate_seq);
30986 + DbgPrint("* RX old seq=%4d, lost=%4d, broken sum=%4d\n", zm_summary.rx_old_seq,
30987 + (zm_summary.rx_broken_seq - zm_summary.rx_duplicate_seq - zm_summary.rx_old_seq),
30988 + zm_summary.rx_broken_sum);
30989 + DbgPrint("* Rx lost sum=%4d,dup. error=%4d, free count=%4d\n", zm_summary.rx_lost_sum,
30990 + zm_summary.rx_duplicate_error, zm_summary.rx_free);
30991 + DbgPrint("* Rx flush sum=%4d, clear sum=%4d, reorder=%7d\n", zm_summary.rx_flush,
30992 + zm_summary.rx_clear, zm_summary.rx_reorder);
30993 + DbgPrint("* Firmware reset=%3d, reset sum=%4d\n", zm_summary.reset_count,
30994 + zm_summary.reset_sum);
30995 + DbgPrint("******************************************************\n\n");
30996 + //reset count 11772c
30997 + zm_summary.tx_msdu_count = 0;
30998 + zm_summary.tx_mpdu_count = 0;
30999 + zm_summary.rx_msdu_count = 0;
31000 + zm_summary.rx_mpdu_count = 0;
31001 + zm_summary.rx_broken_seq = 0;
31002 + zm_summary.rx_broken_seq_dis = 0;
31003 + zm_summary.rx_duplicate_seq = 0;
31004 + zm_summary.rx_old_seq = 0;
31005 + zm_summary.reset_count = 0;
31006 + zm_summary.rx_amsdu_len = 0;
31007 +
31008 + for (i=0; i<100; i++)
31009 + {
31010 + zm_var.tx_msdu_tick[i] = zm_var.tx_mpdu_tick[i] = 0;
31011 + zm_var.rx_msdu_tick[i] = zm_var.rx_mpdu_tick[i] = 0;
31012 + }
31013 +
31014 + zfTimerSchedule(dev, ZM_EVENT_TIMEOUT_PERFORMANCE, 100);
31015 +}
31016 +
31017 +void zfiTxPerformanceMSDU(zdev_t* dev, u32_t tick)
31018 +{
31019 + u32_t index;
31020 + zm_summary.tx_msdu_count++;
31021 +
31022 + index = tick - zm_summary.tick_base;
31023 +
31024 + if (index < 100)
31025 + {
31026 + zm_var.tx_msdu_tick[index]++;
31027 + }
31028 + else
31029 + {
31030 + //DbgPrint("wd->tick exceeded tick_base+100!\n");
31031 + }
31032 +}
31033 +
31034 +void zfiRxPerformanceMSDU(zdev_t* dev, u32_t tick)
31035 +{
31036 + u32_t index;
31037 + zm_summary.rx_msdu_count++;
31038 +
31039 + index = tick - zm_summary.tick_base;
31040 +
31041 + if (index < 100)
31042 + {
31043 + zm_var.rx_msdu_tick[index]++;
31044 + }
31045 + else
31046 + {
31047 + //DbgPrint("wd->tick exceeded tick_base+100!\n");
31048 + }
31049 +}
31050 +
31051 +void zfiTxPerformanceMPDU(zdev_t* dev, u32_t tick)
31052 +{
31053 + u32_t index;
31054 + zm_summary.tx_mpdu_count++;
31055 +
31056 + index = tick - zm_summary.tick_base;
31057 +
31058 + if (index < 100)
31059 + {
31060 + zm_var.tx_mpdu_tick[index]++;
31061 + }
31062 + else
31063 + {
31064 + //DbgPrint("wd->tick exceeded tick_base+100!\n");
31065 + }
31066 +}
31067 +
31068 +#ifndef ZM_INT_USE_EP2_HEADER_SIZE
31069 +#define ZM_INT_USE_EP2_HEADER_SIZE 12
31070 +#endif
31071 +void zfiRxPerformanceMPDU(zdev_t* dev, zbuf_t* buf)
31072 +{
31073 + u32_t index;
31074 + u16_t frameType;
31075 + u16_t frameCtrl;
31076 + u8_t mpduInd;
31077 + u16_t plcpHdrLen;
31078 + u16_t len;
31079 +
31080 + zmw_get_wlan_dev(dev);
31081 +
31082 + len = zfwBufGetSize(dev, buf);
31083 + mpduInd = zmw_rx_buf_readb(dev, buf, len-1);
31084 + /* First MPDU or Single MPDU */
31085 + if(((mpduInd & 0x30) == 0x00) || ((mpduInd & 0x30) == 0x20))
31086 + //if ((mpduInd & 0x10) == 0x00)
31087 + {
31088 + plcpHdrLen = 12; // PLCP header length
31089 + }
31090 + else
31091 + {
31092 + if (zmw_rx_buf_readh(dev, buf, 4) == wd->macAddr[0] &&
31093 + zmw_rx_buf_readh(dev, buf, 6) == wd->macAddr[1] &&
31094 + zmw_rx_buf_readh(dev, buf, 8) == wd->macAddr[2]) {
31095 + plcpHdrLen = 0;
31096 + }
31097 + else if (zmw_rx_buf_readh(dev, buf, 16) == wd->macAddr[0] &&
31098 + zmw_rx_buf_readh(dev, buf, 18) == wd->macAddr[1] &&
31099 + zmw_rx_buf_readh(dev, buf, 20) == wd->macAddr[2]){
31100 + plcpHdrLen = 12;
31101 + }
31102 + else {
31103 + plcpHdrLen = 0;
31104 + }
31105 + }
31106 +
31107 + frameCtrl = zmw_rx_buf_readb(dev, buf, plcpHdrLen + 0);
31108 + frameType = frameCtrl & 0xf;
31109 +
31110 + if (frameType != ZM_WLAN_DATA_FRAME)
31111 + {
31112 + return;
31113 + }
31114 +
31115 + zm_summary.rx_mpdu_count++;
31116 +
31117 + index = wd->tick - zm_summary.tick_base;
31118 +
31119 + if (index < 100)
31120 + {
31121 + zm_var.rx_mpdu_tick[index]++;
31122 + }
31123 + else
31124 + {
31125 + //DbgPrint("wd->tick exceeded tick_base+100!\n");
31126 + }
31127 +}
31128 +
31129 +void zfiRxPerformanceSeq(zdev_t* dev, zbuf_t* buf)
31130 +{
31131 + u16_t seq_no;
31132 + u16_t offset = 0;
31133 + u16_t old_dis = zm_summary.rx_broken_seq_dis;
31134 + //sys_time = KeQueryPerformanceCounter(&freq);
31135 +
31136 + seq_no = zmw_rx_buf_readh(dev, buf, offset+22) >> 4;
31137 +
31138 + ZM_SEQ_DEBUG("Out %5d\n", seq_no);
31139 +
31140 + if (seq_no < zm_summary.rx_seq_base)
31141 + {
31142 + if (seq_no == 0)
31143 + {
31144 + if (zm_summary.rx_seq_base != 4095)
31145 + {
31146 + zm_summary.rx_broken_seq++;
31147 + ZM_SEQ_DEBUG("Broken seq");
31148 + zm_summary.rx_broken_seq_dis+=(4096 - zm_summary.rx_seq_base);
31149 + }
31150 + }
31151 + else if ((seq_no < 300) && (zm_summary.rx_seq_base > 3800))
31152 + {
31153 + zm_summary.rx_broken_seq++;
31154 + ZM_SEQ_DEBUG("Broken seq");
31155 + zm_summary.rx_broken_seq_dis+=(4096 - zm_summary.rx_seq_base + seq_no);
31156 + }
31157 + else
31158 + {
31159 + zm_summary.rx_broken_seq++;
31160 + ZM_SEQ_DEBUG("Broken seq");
31161 + zm_summary.rx_broken_seq_dis+=(zm_summary.rx_seq_base - seq_no);
31162 + zm_summary.rx_old_seq++;
31163 + }
31164 + }
31165 + else
31166 + {
31167 + if (seq_no != (zm_summary.rx_seq_base + 1))
31168 + {
31169 + if ((seq_no > 3800) && (zm_summary.rx_seq_base < 300))
31170 + {
31171 + zm_summary.rx_broken_seq++;
31172 + ZM_SEQ_DEBUG("Broken seq");
31173 + zm_summary.rx_broken_seq_dis+=(4096 - seq_no + zm_summary.rx_seq_base);
31174 + zm_summary.rx_old_seq++;
31175 + }
31176 + else
31177 + {
31178 + zm_summary.rx_broken_seq++;
31179 + ZM_SEQ_DEBUG("Broken seq");
31180 + zm_summary.rx_broken_seq_dis+=(seq_no - zm_summary.rx_seq_base);
31181 + }
31182 + }
31183 + }
31184 + if (seq_no == zm_summary.rx_seq_base)
31185 + {
31186 + zm_summary.rx_duplicate_seq++;
31187 + }
31188 +
31189 + if ((zm_summary.rx_broken_seq_dis - old_dis) > 100)
31190 + {
31191 + DbgPrint("* seq_no=%4d, base_seq=%4d, dis_diff=%4d", seq_no,
31192 + zm_summary.rx_seq_base, zm_summary.rx_broken_seq_dis - old_dis);
31193 + }
31194 + zm_summary.rx_seq_base = seq_no;
31195 +}
31196 +
31197 +void zfiRxPerformanceReg(zdev_t* dev, u32_t reg, u32_t rsp)
31198 +{
31199 + zm_summary.reset_count = (u16_t)rsp - zm_summary.reset_sum;
31200 + zm_summary.reset_sum = (u16_t)rsp;
31201 +}
31202 +
31203 +void zfiRxPerformanceDup(zdev_t* dev, zbuf_t* buf1, zbuf_t* buf2)
31204 +{
31205 + u16_t seq_no1, seq_no2;
31206 +
31207 + seq_no1 = zmw_rx_buf_readh(dev, buf1, 22) >> 4;
31208 + seq_no2 = zmw_rx_buf_readh(dev, buf2, 22) >> 4;
31209 + if (seq_no1 != seq_no2)
31210 + {
31211 + zm_summary.rx_duplicate_error++;
31212 + }
31213 +}
31214 +
31215 +void zfiRxPerformanceFree(zdev_t* dev, zbuf_t* buf)
31216 +{
31217 + zm_summary.rx_free++;
31218 +}
31219 +
31220 +void zfiRxPerformanceAMSDU(zdev_t* dev, zbuf_t* buf, u16_t len)
31221 +{
31222 + if (zm_summary.rx_amsdu_len < len)
31223 + {
31224 + zm_summary.rx_amsdu_len = len;
31225 + }
31226 +}
31227 +void zfiRxPerformanceFlush(zdev_t* dev)
31228 +{
31229 + zm_summary.rx_flush++;
31230 +}
31231 +
31232 +void zfiRxPerformanceClear(zdev_t* dev)
31233 +{
31234 + zm_summary.rx_clear++;
31235 + ZM_SEQ_DEBUG("RxClear");
31236 +}
31237 +
31238 +void zfiRxPerformanceReorder(zdev_t* dev)
31239 +{
31240 + zm_summary.rx_reorder++;
31241 +}
31242 +#endif /* end of ZM_ENABLE_PERFORMANCE_EVALUATION */
31243 --- /dev/null
31244 +++ b/drivers/staging/otus/80211core/performance.h
31245 @@ -0,0 +1,97 @@
31246 +/*
31247 + * Copyright (c) 2007-2008 Atheros Communications Inc.
31248 + *
31249 + * Permission to use, copy, modify, and/or distribute this software for any
31250 + * purpose with or without fee is hereby granted, provided that the above
31251 + * copyright notice and this permission notice appear in all copies.
31252 + *
31253 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
31254 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
31255 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
31256 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
31257 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
31258 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
31259 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
31260 + */
31261 +#ifndef _PERFORMANCE_H
31262 +#define _PERFORMANCE_H
31263 +
31264 +#ifdef ZM_ENABLE_PERFORMANCE_EVALUATION
31265 +
31266 +struct zsSummary
31267 +{
31268 + u32_t tx_msdu_count;
31269 + u32_t tx_mpdu_count;
31270 + u32_t rx_msdu_count;
31271 + u32_t rx_mpdu_count;
31272 + u32_t tick_base;
31273 + u16_t rx_seq_base;
31274 + u16_t rx_broken_seq;
31275 + u16_t rx_broken_sum;
31276 + u16_t rx_broken_seq_dis;
31277 + u16_t rx_duplicate_seq;
31278 + u16_t rx_duplicate_error;
31279 + u16_t rx_old_seq;
31280 + u16_t rx_lost_sum;
31281 + u16_t tx_idle_count;
31282 + u16_t rx_idle_count;
31283 + u16_t reset_count;
31284 + u16_t reset_sum;
31285 + u16_t rx_free;
31286 + u16_t rx_amsdu_len;
31287 + u16_t rx_flush;
31288 + u16_t rx_clear;
31289 + u32_t rx_reorder;
31290 +};
31291 +
31292 +struct zsVariation
31293 +{
31294 + u32_t tx_msdu_tick[100];
31295 + u32_t tx_mpdu_tick[100];
31296 + u32_t rx_msdu_tick[100];
31297 + u32_t rx_mpdu_tick[100];
31298 +
31299 + u32_t tx_msdu_mean;
31300 + u32_t tx_mpdu_mean;
31301 + u32_t rx_msdu_mean;
31302 + u32_t rx_mpdu_mean;
31303 +
31304 + u32_t tx_msdu_sum;
31305 + u32_t tx_mpdu_sum;
31306 + u32_t rx_msdu_sum;
31307 + u32_t rx_mpdu_sum;
31308 +
31309 + u32_t tx_msdu_var;
31310 + u32_t tx_mpdu_var;
31311 + u32_t rx_msdu_var;
31312 + u32_t rx_mpdu_var;
31313 +};
31314 +
31315 +struct zsThroughput
31316 +{
31317 + u32_t tx[50];
31318 + u32_t rx[50];
31319 + u16_t head;
31320 + u16_t tail;
31321 + u16_t size;
31322 + LARGE_INTEGER sys_time;
31323 + LARGE_INTEGER freq;
31324 +};
31325 +
31326 +void zfiPerformanceInit(zdev_t* dev);
31327 +void zfiPerformanceRefresh(zdev_t* dev);
31328 +
31329 +void zfiTxPerformanceMSDU(zdev_t* dev, u32_t tick);
31330 +void zfiRxPerformanceMSDU(zdev_t* dev, u32_t tick);
31331 +void zfiTxPerformanceMPDU(zdev_t* dev, u32_t tick);
31332 +void zfiRxPerformanceMPDU(zdev_t* dev, zbuf_t* buf);
31333 +void zfiRxPerformanceSeq(zdev_t* dev, zbuf_t* buf);
31334 +void zfiRxPerformanceReg(zdev_t* dev, u32_t reg, u32_t rsp);
31335 +void zfiRxPerformanceDup(zdev_t* dev, zbuf_t* buf1, zbuf_t* buf2);
31336 +void zfiRxPerformanceFree(zdev_t* dev, zbuf_t* buf);
31337 +void zfiRxPerformanceAMSDU(zdev_t* dev, zbuf_t* buf, u16_t len);
31338 +void zfiRxPerformanceFlush(zdev_t* dev);
31339 +void zfiRxPerformanceClear(zdev_t* dev);
31340 +void zfiRxPerformanceReorder(zdev_t* dev);
31341 +#endif /* end of ZM_ENABLE_PERFORMANCE_EVALUATION */
31342 +#endif /* end of _PERFORMANCE_H */
31343 --- /dev/null
31344 +++ b/drivers/staging/otus/80211core/pub_usb.h
31345 @@ -0,0 +1,102 @@
31346 +/*
31347 + * Copyright (c) 2007-2008 Atheros Communications Inc.
31348 + *
31349 + * Permission to use, copy, modify, and/or distribute this software for any
31350 + * purpose with or without fee is hereby granted, provided that the above
31351 + * copyright notice and this permission notice appear in all copies.
31352 + *
31353 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
31354 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
31355 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
31356 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
31357 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
31358 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
31359 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
31360 + */
31361 +
31362 +#ifndef _PUB_USB_H
31363 +#define _PUB_USB_H
31364 +
31365 +#include "../oal_dt.h"
31366 +
31367 +#define ZM_HAL_80211_MODE_AP 0
31368 +#define ZM_HAL_80211_MODE_STA 1
31369 +#define ZM_HAL_80211_MODE_IBSS_GENERAL 2
31370 +#define ZM_HAL_80211_MODE_IBSS_WPA2PSK 3
31371 +
31372 +/* USB module description */
31373 +/* Queue Management */
31374 +/* 80211core requires OAL to implement a transmission queue in OAL's */
31375 +/* USB module. Because there is only limited on-chip memory, so USB */
31376 +/* data transfer may be pending until on-chip memory is available. */
31377 +/* 80211core also requires OAL's USB module to provide two functions */
31378 +/* zfwUsbGetFreeTxQSize() and zfwUsbGetMaxTxQSize() for 80211core to */
31379 +/* query the status of this transmission queue. The main purpose of */
31380 +/* this queue is for QoS/WMM. Though there are hardware priority */
31381 +/* queues on the chip, and also software priority queues in the */
31382 +/* 80211core. There is still one and only one USB channel. So */
31383 +/* 80211core will use the information that zfwUsbGetFreeTxQSize() */
31384 +/* returned to schedule the traffic from the software priority */
31385 +/* queues to the hardware priority queues. For example, if 80211core */
31386 +/* found that USB transmission queue is going to be full, it will */
31387 +/* not allow packets with lower priority to enter the USB channel. */
31388 +
31389 +
31390 +/* Structure for USB call back functions */
31391 +struct zfCbUsbFuncTbl {
31392 + void (*zfcbUsbRecv)(zdev_t *dev, zbuf_t *buf);
31393 + void (*zfcbUsbRegIn)(zdev_t* dev, u32_t* rsp, u16_t rspLen);
31394 + void (*zfcbUsbOutComplete)(zdev_t* dev, zbuf_t *buf, u8_t status, u8_t *hdr);
31395 + void (*zfcbUsbRegOutComplete)(zdev_t* dev);
31396 +};
31397 +
31398 +/* Call back functions */
31399 +/* Below are the functions that should be called by the OAL */
31400 +
31401 +/* When data is available in endpoint 3, OAL shall embed the data in */
31402 +/* zbuf_t and supply to 80211core by calling this function */
31403 +/* void (*zfcbUsbRecv)(zdev_t *dev, zbuf_t *buf); */
31404 +
31405 +/* When data is available in endpoint 2, OAL shall call this function */
31406 +/* void (*zfcbUsbRegIn)(zdev_t* dev, u32_t* rsp, u16_t rspLen); */
31407 +
31408 +/* When USB data transfer completed in endpoint 1, OAL shall call this function */
31409 +/* void (*zfcbUsbOutComplete)(zdev_t* dev, zbuf_t *buf, u8_t status, u8_t *hdr); */
31410 +
31411 +
31412 +/* Call out functions */
31413 +/* Below are the functions that supply by the OAL for 80211core to */
31414 +/* manipulate the USB */
31415 +
31416 +/* Return OAL's USB TxQ size */
31417 +extern u32_t zfwUsbGetMaxTxQSize(zdev_t* dev);
31418 +
31419 +/* Return OAL's TxQ available size */
31420 +extern u32_t zfwUsbGetFreeTxQSize(zdev_t* dev);
31421 +
31422 +/* Register call back function */
31423 +extern void zfwUsbRegisterCallBack(zdev_t* dev, struct zfCbUsbFuncTbl *zfUsbFunc);
31424 +
31425 +/* Enable USB interrupt endpoint */
31426 +extern u32_t zfwUsbEnableIntEpt(zdev_t *dev, u8_t endpt);
31427 +
31428 +/* Enable USB Rx endpoint */
31429 +extern int zfwUsbEnableRxEpt(zdev_t* dev, u8_t endpt);
31430 +
31431 +/* 80211core call this function to send a USB request over endpoint 0 */
31432 +extern u32_t zfwUsbSubmitControl(zdev_t* dev, u8_t req, u16_t value,
31433 + u16_t index, void *data, u32_t size);
31434 +extern u32_t zfwUsbSubmitControlIo(zdev_t* dev, u8_t req, u8_t reqtype,
31435 + u16_t value, u16_t index, void *data, u32_t size);
31436 +
31437 +/* 80211core call this function to transfer data out over endpoint 1 */
31438 +extern void zfwUsbCmd(zdev_t* dev, u8_t endpt, u32_t* cmd, u16_t cmdLen);
31439 +
31440 +/* 80211core call this function to transfer data out over endpoint 4 */
31441 +extern u32_t zfwUsbSend(zdev_t* dev, u8_t endpt, u8_t *hdr, u16_t hdrlen, u8_t *snap, u16_t snapLen,
31442 + u8_t *tail, u16_t tailLen, zbuf_t *buf, u16_t offset);
31443 +
31444 +/* 80211core call this function to set USB configuration */
31445 +extern u32_t zfwUsbSetConfiguration(zdev_t *dev, u16_t value);
31446 +
31447 +#endif
31448 --- /dev/null
31449 +++ b/drivers/staging/otus/80211core/pub_zfi.h
31450 @@ -0,0 +1,821 @@
31451 +/*
31452 + * Copyright (c) 2007-2008 Atheros Communications Inc.
31453 + *
31454 + * Permission to use, copy, modify, and/or distribute this software for any
31455 + * purpose with or without fee is hereby granted, provided that the above
31456 + * copyright notice and this permission notice appear in all copies.
31457 + *
31458 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
31459 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
31460 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
31461 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
31462 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
31463 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
31464 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
31465 + */
31466 +
31467 +#ifndef _PUB_DEFS_H
31468 +#define _PUB_DEFS_H
31469 +
31470 +#include "../oal_dt.h"
31471 +
31472 +/***** Section 1 : Tunable Parameters *****/
31473 +/* The defintions in this section are tunabel parameters */
31474 +
31475 +/* Maximum number of BSS that could be scaned */
31476 +#define ZM_MAX_BSS 128
31477 +
31478 +/* Maximum number of WPA2 PMKID that supported */
31479 +#define ZM_PMKID_MAX_BSS_CNT 8
31480 +
31481 +/* Enable aggregation and deaggregation */
31482 +#define ZM_ENABLE_AGGREGATION
31483 +
31484 +#ifdef ZM_ENABLE_AGGREGATION
31485 + /* Enable BA failed retransmission in firmware */
31486 + #define ZM_ENABLE_FW_BA_RETRANSMISSION
31487 + #define ZM_BYPASS_AGGR_SCHEDULING
31488 + //#define ZM_AGGR_BIT_ON
31489 +#endif
31490 +
31491 +
31492 +#ifndef ZM_FB50
31493 +//#define ZM_FB50
31494 +#endif
31495 +
31496 +#ifndef ZM_AP_DEBUG
31497 +//#define ZM_AP_DEBUG
31498 +#endif
31499 +
31500 +//#define ZM_ENABLE_BA_RATECTRL
31501 +
31502 +/***** End of section 1 *****/
31503 +
31504 +
31505 +/***** Section 2 : Public Definitions, data structures and prototypes *****/
31506 +/* function return status */
31507 +#define ZM_STATUS_SUCCESS 0
31508 +#define ZM_STATUS_FAILURE 1
31509 +
31510 +// media connect status
31511 +#define ZM_STATUS_MEDIA_CONNECT 0x00
31512 +#define ZM_STATUS_MEDIA_DISCONNECT 0x01
31513 +#define ZM_STATUS_MEDIA_DISCONNECT_NOT_FOUND 0x02
31514 +#define ZM_STATUS_MEDIA_DISABLED 0x03
31515 +#define ZM_STATUS_MEDIA_CONNECTION_DISABLED 0x04
31516 +#define ZM_STATUS_MEDIA_CONNECTION_RESET 0x05
31517 +#define ZM_STATUS_MEDIA_RESET 0x06
31518 +#define ZM_STATUS_MEDIA_DISCONNECT_DEAUTH 0x07
31519 +#define ZM_STATUS_MEDIA_DISCONNECT_DISASOC 0x08
31520 +#define ZM_STATUS_MEDIA_DISCONNECT_TIMEOUT 0x09
31521 +#define ZM_STATUS_MEDIA_DISCONNECT_AUTH_FAILED 0x0a
31522 +#define ZM_STATUS_MEDIA_DISCONNECT_ASOC_FAILED 0x0b
31523 +#define ZM_STATUS_MEDIA_DISCONNECT_MIC_FAIL 0x0c
31524 +#define ZM_STATUS_MEDIA_DISCONNECT_UNREACHABLE 0x0d
31525 +#define ZM_STATUS_MEDIA_DISCONNECT_BEACON_MISS 0x0e
31526 +
31527 +// Packet Filter
31528 +#define ZM_PACKET_TYPE_DIRECTED 0x00000001
31529 +#define ZM_PACKET_TYPE_MULTICAST 0x00000002
31530 +#define ZM_PACKET_TYPE_ALL_MULTICAST 0x00000004
31531 +#define ZM_PACKET_TYPE_BROADCAST 0x00000008
31532 +#define ZM_PACKET_TYPE_PROMISCUOUS 0x00000020
31533 +
31534 +/* BSS mode definition */
31535 +/* TODO : The definitions here are coupled with XP's NDIS OID. */
31536 +/* We can't be changed them freely, need to disarm this mine */
31537 +#define ZM_MODE_IBSS 0
31538 +#define ZM_MODE_INFRASTRUCTURE 1
31539 +#define ZM_MODE_UNKNOWN 2
31540 +#define ZM_MODE_INFRASTRUCTURE_MAX 3
31541 +#define ZM_MODE_AP 4
31542 +#define ZM_MODE_PSEUDO 5
31543 +
31544 +
31545 +/* Authentication mode */
31546 +#define ZM_AUTH_MODE_OPEN 0
31547 +#define ZM_AUTH_MODE_SHARED_KEY 1
31548 +#define ZM_AUTH_MODE_AUTO 2
31549 +#define ZM_AUTH_MODE_WPA 3
31550 +#define ZM_AUTH_MODE_WPAPSK 4
31551 +#define ZM_AUTH_MODE_WPA_NONE 5
31552 +#define ZM_AUTH_MODE_WPA2 6
31553 +#define ZM_AUTH_MODE_WPA2PSK 7
31554 +#ifdef ZM_ENABLE_CENC
31555 +#define ZM_AUTH_MODE_CENC 8
31556 +#endif //ZM_ENABLE_CENC
31557 +#define ZM_AUTH_MODE_WPA_AUTO 9
31558 +#define ZM_AUTH_MODE_WPAPSK_AUTO 10
31559 +
31560 +// Encryption mode
31561 +#define ZM_NO_WEP 0x0
31562 +#define ZM_AES 0x4
31563 +#define ZM_TKIP 0x2
31564 +#define ZM_WEP64 0x1
31565 +#define ZM_WEP128 0x5
31566 +#define ZM_WEP256 0x6
31567 +#ifdef ZM_ENABLE_CENC
31568 +#define ZM_CENC 0x7
31569 +#endif //ZM_ENABLE_CENC
31570 +
31571 +/* Encryption type for wep status */
31572 +#define ZM_ENCRYPTION_WEP_DISABLED 0
31573 +#define ZM_ENCRYPTION_WEP_ENABLED 1
31574 +#define ZM_ENCRYPTION_WEP_KEY_ABSENT 2
31575 +#define ZM_ENCRYPTION_NOT_SUPPORTED 3
31576 +#define ZM_ENCRYPTION_TKIP 4
31577 +#define ZM_ENCRYPTION_TKIP_KEY_ABSENT 5
31578 +#define ZM_ENCRYPTION_AES 6
31579 +#define ZM_ENCRYPTION_AES_KEY_ABSENT 7
31580 +
31581 +#ifdef ZM_ENABLE_CENC
31582 +#define ZM_ENCRYPTION_CENC 8
31583 +#endif //ZM_ENABLE_CENC
31584 +
31585 +/* security type */
31586 +#define ZM_SECURITY_TYPE_NONE 0
31587 +#define ZM_SECURITY_TYPE_WEP 1
31588 +#define ZM_SECURITY_TYPE_WPA 2
31589 +
31590 +#ifdef ZM_ENABLE_CENC
31591 +#define ZM_SECURITY_TYPE_CENC 3
31592 +#endif //ZM_ENABLE_CENC
31593 +
31594 +/* Encryption Exemption Action Type */
31595 +#define ZM_ENCRYPTION_EXEMPT_NO_EXEMPTION 0
31596 +#define ZM_ENCRYPTION_EXEMPT_ALWAYS 1
31597 +
31598 +/* MIC failure */
31599 +#define ZM_MIC_PAIRWISE_ERROR 0x06
31600 +#define ZM_MIC_GROUP_ERROR 0x0E
31601 +
31602 +
31603 +/* power save mode */
31604 +#define ZM_STA_PS_NONE 0
31605 +#define ZM_STA_PS_MAX 1
31606 +#define ZM_STA_PS_FAST 2
31607 +#define ZM_STA_PS_LIGHT 3
31608 +
31609 +/* WME AC Type */
31610 +#define ZM_WME_AC_BK 0 /* Background AC */
31611 +#define ZM_WME_AC_BE 1 /* Best-effort AC */
31612 +#define ZM_WME_AC_VIDEO 2 /* Video AC */
31613 +#define ZM_WME_AC_VOICE 3 /* Voice AC */
31614 +
31615 +/* Preamble type */
31616 +#define ZM_PREAMBLE_TYPE_AUTO 0
31617 +#define ZM_PREAMBLE_TYPE_LONG 1
31618 +#define ZM_PREAMBLE_TYPE_SHORT 2
31619 +
31620 +/* wireless modes constants */
31621 +#define ZM_WIRELESS_MODE_5_54 0x01 ///< 5 GHz 54 Mbps
31622 +#define ZM_WIRELESS_MODE_5_108 0x02 ///< 5 GHz 108 Mbps
31623 +#define ZM_WIRELESS_MODE_24_11 0x04 ///< 2.4 GHz 11 Mbps
31624 +#define ZM_WIRELESS_MODE_24_54 0x08 ///< 2.4 GHz 54 Mbps
31625 +#define ZM_WIRELESS_MODE_24_108 0x10 ///< 2.4 GHz 108 Mbps
31626 +#define ZM_WIRELESS_MODE_49_13 0x100 ///< 4.9 GHz 13.5 Mbps, quarter rate chn-bandwidth = 5
31627 +#define ZM_WIRELESS_MODE_49_27 0x200 ///< 4.9 GHz 27 Mbps, half rate chn-bandwidth = 10
31628 +#define ZM_WIRELESS_MODE_49_54 0x400 ///< 4.9 GHz 54 Mbps, full rate chn-bandwidth = 20
31629 +#define ZM_WIRELESS_MODE_5_300 0x1000 ///< 5 GHz 300 Mbps
31630 +#define ZM_WIRELESS_MODE_24_300 0x2000 ///< 2.4 GHz 300 Mbps
31631 +#define ZM_WIRELESS_MODE_5_130 0x4000 ///< 5 GHz 130 Mbps
31632 +#define ZM_WIRELESS_MODE_24_130 0x8000 ///< 2.4 GHz 130 Mbps
31633 +
31634 +#define ZM_WIRELESS_MODE_24_N (ZM_WIRELESS_MODE_24_130|ZM_WIRELESS_MODE_24_300)
31635 +#define ZM_WIRELESS_MODE_5_N (ZM_WIRELESS_MODE_5_130|ZM_WIRELESS_MODE_5_300)
31636 +#define ZM_WIRELESS_MODE_24 (ZM_WIRELESS_MODE_24_11|ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)
31637 +#define ZM_WIRELESS_MODE_5 (ZM_WIRELESS_MODE_5_54|ZM_WIRELESS_MODE_5_N)
31638 +
31639 +/* AdHoc Mode with different band */
31640 +#define ZM_ADHOCBAND_A 1
31641 +#define ZM_ADHOCBAND_B 2
31642 +#define ZM_ADHOCBAND_G 3
31643 +#define ZM_ADHOCBAND_BG 4
31644 +#define ZM_ADHOCBAND_ABG 5
31645 +
31646 +/* Authentication algorithm in the field algNo of authentication frames */
31647 +#define ZM_AUTH_ALGO_OPEN_SYSTEM 0x10000 /* Open system */
31648 +#define ZM_AUTH_ALGO_SHARED_KEY 0x10001 /* Shared Key */
31649 +#define ZM_AUTH_ALGO_LEAP 0x10080 /* Leap */
31650 +
31651 +struct zsScanResult
31652 +{
31653 + u32_t reserved;
31654 +};
31655 +
31656 +
31657 +struct zsStastics
31658 +{
31659 + u32_t reserved;
31660 +};
31661 +
31662 +#define ZM_MAX_SUPP_RATES_IE_SIZE 12
31663 +#define ZM_MAX_IE_SIZE 50 //100
31664 +#define ZM_MAX_WPS_IE_SIZE 150
31665 +#define ZM_MAX_PROBE_FRAME_BODY_SIZE 512//300
31666 +#define ZM_MAX_COUNTRY_INFO_SIZE 20
31667 +
31668 +#define ZM_MAX_SSID_LENGTH 32
31669 +struct zsBssInfo
31670 +{
31671 + u8_t macaddr[6];
31672 + u8_t bssid[6];
31673 + u8_t beaconInterval[2];
31674 + u8_t capability[2];
31675 + u8_t timeStamp[8];
31676 + u8_t ssid[ZM_MAX_SSID_LENGTH + 2]; // EID(1) + Length(1) + SSID(32)
31677 + u8_t supportedRates[ZM_MAX_SUPP_RATES_IE_SIZE + 2]; // EID(1) + Length(1) + supported rates [12]
31678 + u8_t channel;
31679 + u16_t frequency;
31680 + u16_t atimWindow;
31681 + u8_t erp;
31682 + u8_t extSupportedRates[ZM_MAX_SUPP_RATES_IE_SIZE + 2]; // EID(1) + Length(1) + extended supported rates [12]
31683 + u8_t wpaIe[ZM_MAX_IE_SIZE + 2];
31684 + u8_t wscIe[ZM_MAX_WPS_IE_SIZE + 2];
31685 + u8_t rsnIe[ZM_MAX_IE_SIZE + 2];
31686 +#ifdef ZM_ENABLE_CENC
31687 + u8_t cencIe[ZM_MAX_IE_SIZE + 2]; /* CENC */ /* half size because of memory exceed 64k boundary */
31688 +#endif //ZM_ENABLE_CENC
31689 + u8_t securityType;
31690 + u8_t signalStrength;
31691 + u8_t signalQuality;
31692 + u16_t sortValue;
31693 + u8_t wmeSupport;
31694 + u8_t flag;
31695 + u8_t EnableHT;
31696 + u8_t enableHT40;
31697 + u8_t SG40;
31698 + u8_t extChOffset;
31699 + u8_t apCap; // bit0:11N AP
31700 + u16_t frameBodysize;
31701 + u8_t frameBody[ZM_MAX_PROBE_FRAME_BODY_SIZE];
31702 + u8_t countryInfo[ZM_MAX_COUNTRY_INFO_SIZE + 2];
31703 + u16_t athOwlAp;
31704 + u16_t marvelAp;
31705 + u16_t broadcomHTAp;
31706 + u32_t tick;
31707 + struct zsBssInfo* next;
31708 +};
31709 +
31710 +struct zsBssList
31711 +{
31712 + u8_t bssCount;
31713 + struct zsBssInfo* head;
31714 + struct zsBssInfo* tail;
31715 +};
31716 +
31717 +struct zsBssListV1
31718 +{
31719 + u8_t bssCount;
31720 + struct zsBssInfo bssInfo[ZM_MAX_BSS];
31721 +};
31722 +
31723 +#define ZM_KEY_FLAG_GK 0x0001
31724 +#define ZM_KEY_FLAG_PK 0X0002
31725 +#define ZM_KEY_FLAG_AUTHENTICATOR 0x0004
31726 +#define ZM_KEY_FLAG_INIT_IV 0x0008
31727 +#define ZM_KEY_FLAG_DEFAULT_KEY 0x0010
31728 +
31729 +#ifdef ZM_ENABLE_CENC
31730 +#define ZM_KEY_FLAG_CENC 0x0020
31731 +#endif //ZM_ENABLE_CENC
31732 +
31733 +// Comment: For TKIP, key[0]~key[15] => TKIP key
31734 +// key[16]~key[23] => Tx MIC key
31735 +// key[24]~key[31] => Rx MIC key
31736 +struct zsKeyInfo
31737 +{
31738 + u8_t* key;
31739 + u8_t keyLength;
31740 + u8_t keyIndex;
31741 + u8_t* initIv;
31742 + u16_t flag;
31743 + u8_t vapId;
31744 + u16_t vapAddr[3];
31745 + u16_t* macAddr;
31746 +};
31747 +
31748 +
31749 +
31750 +/*
31751 + * Channels are specified by frequency.
31752 + */
31753 +typedef struct {
31754 + u16_t channel; /* setting in Mhz */
31755 + u32_t channelFlags; /* see below */
31756 + u8_t privFlags;
31757 + s8_t maxRegTxPower; /* max regulatory tx power in dBm */
31758 + s8_t maxTxPower; /* max true tx power in 0.25 dBm */
31759 + s8_t minTxPower; /* min true tx power in 0.25 dBm */
31760 +} ZM_HAL_CHANNEL;
31761 +
31762 +struct zsRegulationTable
31763 +{
31764 + u16_t regionCode;
31765 + u16_t CurChIndex;
31766 + u16_t allowChannelCnt;
31767 + ZM_HAL_CHANNEL allowChannel[60]; /* 2.4GHz: 14 channels, 5 GHz: 31 channels */
31768 +};
31769 +
31770 +struct zsPartnerNotifyEvent
31771 +{
31772 + u8_t bssid[6]; // The BSSID of IBSS
31773 + u8_t peerMacAddr[6]; // The MAC address of peer station
31774 +};
31775 +
31776 +#define ZM_RC_TRAINED_BIT 0x1
31777 +struct zsRcCell
31778 +{
31779 + u32_t txCount;
31780 + u32_t failCount;
31781 + u8_t currentRate;
31782 + u8_t currentRateIndex;
31783 + u32_t probingTime;
31784 + u8_t operationRateSet[24];
31785 + u8_t operationRateCount;
31786 + u16_t rxRssi;
31787 + u8_t flag;
31788 + u32_t lasttxCount;
31789 + u32_t lastTime;
31790 +};
31791 +
31792 +struct zsOppositeInfo
31793 +{
31794 + u8_t macAddr[6];
31795 + struct zsRcCell rcCell;
31796 + u8_t valid; // This indicate if this opposite is still valid
31797 + u8_t aliveCounter;
31798 + u8_t pkInstalled;
31799 +
31800 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
31801 + /* For WPA2PSK ! */
31802 + u8_t wpaState;
31803 + u8_t camIdx;
31804 + u8_t encryMode;
31805 + u16_t iv16;
31806 + u32_t iv32;
31807 +#endif
31808 +};
31809 +
31810 +typedef void (*zfpIBSSIteratePeerStationCb)(
31811 + zdev_t* dev, struct zsOppositeInfo *peerInfo, void *ctx, u8_t index);
31812 +
31813 +typedef u16_t (*zfpStaRxSecurityCheckCb)(zdev_t* dev, zbuf_t* buf);
31814 +
31815 +
31816 +/* Communication Tally data structure */
31817 +struct zsCommTally
31818 +{
31819 + u32_t txUnicastFrm; // 0 txUnicastFrames
31820 + u32_t txMulticastFrm; // 1 txMulticastFrames
31821 + u32_t txUnicastOctets; // 2 txUniOctets byte size
31822 + u32_t txMulticastOctets; // 3 txMultiOctets byte size
31823 + u32_t txFrmUpperNDIS; // 4
31824 + u32_t txFrmDrvMgt; // 5
31825 + u32_t RetryFailCnt; // 6
31826 + u32_t Hw_TotalTxFrm; // 7 Hardware total Tx Frame
31827 + u32_t Hw_RetryCnt; // 8 txMultipleRetriesFrames
31828 + u32_t Hw_UnderrunCnt; // 9
31829 +
31830 + u32_t DriverRxFrmCnt; // 10
31831 + u32_t rxUnicastFrm; // 11 rxUnicastFrames
31832 + u32_t rxMulticastFrm; // 12rxMulticastFrames
31833 +
31834 + u32_t NotifyNDISRxFrmCnt; // 14
31835 + u32_t rxUnicastOctets; // 15 rxUniOctets byte size
31836 + u32_t rxMulticastOctets; // 16 rxMultiOctets byte size
31837 + u32_t DriverDiscardedFrm; // 17 Discard by ValidateFrame
31838 + u32_t LessThanDataMinLen; // 18
31839 + u32_t GreaterThanMaxLen; // 19
31840 + u32_t DriverDiscardedFrmCauseByMulticastList;
31841 + u32_t DriverDiscardedFrmCauseByFrmCtrl;
31842 + u32_t rxNeedFrgFrm; // 22 need more frg frm
31843 + u32_t DriverRxMgtFrmCnt;
31844 + u32_t rxBroadcastFrm; // 24 Receive broadcast frame count
31845 + u32_t rxBroadcastOctets; // 25 Receive broadcast frame byte size
31846 + u32_t rx11bDataFrame; // 26 Measured quality 11b data frame count
31847 + u32_t rxOFDMDataFrame; // 27 Measured quality 11g data frame count
31848 +
31849 +
31850 + u32_t Hw_TotalRxFrm; // 28
31851 + u32_t Hw_CRC16Cnt; // 29 rxPLCPCRCErrCnt
31852 + u32_t Hw_CRC32Cnt; // 30 rxCRC32ErrCnt
31853 + u32_t Hw_DecrypErr_UNI; // 31
31854 + u32_t Hw_DecrypErr_Mul; // 32
31855 +
31856 + u32_t Hw_RxFIFOOverrun; // 34
31857 + u32_t Hw_RxTimeOut; // 35
31858 + u32_t LossAP; // 36
31859 +
31860 + u32_t Tx_MPDU; // 37
31861 + u32_t BA_Fail; // 38
31862 + u32_t Hw_Tx_AMPDU; // 39
31863 + u32_t Hw_Tx_MPDU; // 40
31864 +
31865 + u32_t RateCtrlTxMPDU;
31866 + u32_t RateCtrlBAFail;
31867 +
31868 + u32_t txQosDropCount[5]; //41 42 43 44 45
31869 +
31870 + u32_t Hw_RxMPDU; // 46
31871 + u32_t Hw_RxDropMPDU; // 47
31872 + u32_t Hw_RxDelMPDU; // 48
31873 +
31874 + u32_t Hw_RxPhyMiscError; // 49
31875 + u32_t Hw_RxPhyXRError; // 50
31876 + u32_t Hw_RxPhyOFDMError; // 51
31877 + u32_t Hw_RxPhyCCKError; // 52
31878 + u32_t Hw_RxPhyHTError; // 53
31879 + u32_t Hw_RxPhyTotalCount; // 54
31880 +
31881 + u32_t swRxFragmentCount; // 55
31882 + u32_t swRxUnicastMicFailCount; // 56
31883 + u32_t swRxMulticastMicFailCount; // 57
31884 + u32_t swRxDropUnencryptedCount; // 58
31885 +
31886 + u32_t txBroadcastFrm;
31887 + u32_t txBroadcastOctets;
31888 +};
31889 +
31890 +/* Traffic Monitor Tally data structure */
31891 +struct zsTrafTally
31892 +{
31893 + u32_t rxDuplicate;
31894 + u32_t rxSrcIsOwnMac;
31895 + //u32_t rxDataFrameCount;
31896 + //u32_t rxDataByteCount;
31897 + //u32_t rxDataBytesIn1000ms;
31898 + //u32_t rxDataTmpFor1000ms;
31899 + //u32_t rxDataBytesIn2000ms;
31900 + //u32_t rxDataTmpFor2000ms;
31901 +
31902 + //u32_t txDataFrameCount;
31903 + //u32_t txDataByteCount;
31904 + //u32_t txDataBytesIn1000ms;
31905 + //u32_t txDataTmpFor1000ms;
31906 + u32_t txDataBytesIn2000ms;
31907 + u32_t txDataTmpFor2000ms;
31908 +};
31909 +
31910 +/* Hal rx packet moniter information */
31911 +struct zsMonHalRxInfo
31912 +{
31913 + u32_t currentRSSI[7];
31914 + u32_t currentRxEVM[14];
31915 + u32_t currentRxDataMT;
31916 + u32_t currentRxDataMCS;
31917 + u32_t currentRxDataBW;
31918 + u32_t currentRxDataSG;
31919 +};
31920 +
31921 +struct zsTail
31922 +{
31923 + u8_t SignalStrength1;
31924 + u8_t SignalStrength2;
31925 + u8_t SignalStrength3;
31926 + u8_t SignalQuality;
31927 + u8_t SAIndex;
31928 + u8_t DAIndex;
31929 + u8_t ErrorIndication;
31930 + u8_t RxMacStatus;
31931 +};
31932 +
31933 +union zuTail
31934 +{
31935 + struct zsTail Data;
31936 + u8_t Byte[8];
31937 +};
31938 +
31939 +struct zsAdditionInfo
31940 +{
31941 + u8_t PlcpHeader[12];
31942 + union zuTail Tail;
31943 +};
31944 +
31945 +
31946 +struct zsPmkidBssidInfo
31947 +{
31948 + u16_t bssid[3];
31949 + u8_t pmkid[16];
31950 +};
31951 +
31952 +struct zsPmkidInfo
31953 +{
31954 + u32_t bssidCount;
31955 + struct zsPmkidBssidInfo bssidInfo[ZM_PMKID_MAX_BSS_CNT];
31956 +};
31957 +
31958 +
31959 +struct zsCbFuncTbl
31960 +{
31961 + u16_t (*zfcbAuthNotify)(zdev_t* dev, u16_t* macAddr);
31962 + u16_t (*zfcbAsocNotify)(zdev_t* dev, u16_t* macAddr, u8_t* body,
31963 + u16_t bodySize, u16_t port);
31964 + u16_t (*zfcbDisAsocNotify)(zdev_t* dev, u8_t* macAddr, u16_t port);
31965 + u16_t (*zfcbApConnectNotify)(zdev_t* dev, u8_t* macAddr, u16_t port);
31966 + void (*zfcbConnectNotify)(zdev_t* dev, u16_t status, u16_t* bssid);
31967 + void (*zfcbScanNotify)(zdev_t* dev, struct zsScanResult* result);
31968 + void (*zfcbMicFailureNotify)(zdev_t* dev, u16_t* addr, u16_t status);
31969 + void (*zfcbApMicFailureNotify)(zdev_t* dev, u8_t* addr, zbuf_t* buf);
31970 + void (*zfcbIbssPartnerNotify)(zdev_t* dev, u16_t status,
31971 + struct zsPartnerNotifyEvent *event);
31972 + void (*zfcbMacAddressNotify)(zdev_t* dev, u8_t* addr);
31973 + void (*zfcbSendCompleteIndication)(zdev_t* dev, zbuf_t* buf);
31974 + void (*zfcbRecvEth)(zdev_t* dev, zbuf_t* buf, u16_t port);
31975 + void (*zfcbRecv80211)(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo);
31976 + void (*zfcbRestoreBufData)(zdev_t* dev, zbuf_t* buf);
31977 +#ifdef ZM_ENABLE_CENC
31978 + u16_t (*zfcbCencAsocNotify)(zdev_t* dev, u16_t* macAddr, u8_t* body,
31979 + u16_t bodySize, u16_t port);
31980 +#endif //ZM_ENABLE_CENC
31981 + u8_t (*zfcbClassifyTxPacket)(zdev_t* dev, zbuf_t* buf);
31982 +
31983 + void (*zfcbHwWatchDogNotify)(zdev_t* dev);
31984 +};
31985 +
31986 +extern void zfZeroMemory(u8_t* va, u16_t length);
31987 +#define ZM_INIT_CB_FUNC_TABLE(p) zfZeroMemory((u8_t *)p, sizeof(struct zsCbFuncTbl));
31988 +
31989 +//extern struct zsWlanDev zgWlanDev;
31990 +
31991 +/* Initialize WLAN hardware and software, resource will be allocated */
31992 +/* for WLAN operation, must be called first before other function. */
31993 +extern u16_t zfiWlanOpen(zdev_t* dev, struct zsCbFuncTbl* cbFuncTbl);
31994 +
31995 +/* WLAN hardware will be shutdown and all resource will be release */
31996 +extern u16_t zfiWlanClose(zdev_t* dev);
31997 +
31998 +/* Enable/disable Wlan operation */
31999 +extern u16_t zfiWlanEnable(zdev_t* dev);
32000 +extern u16_t zfiWlanDisable(zdev_t* dev, u8_t ResetKeyCache);
32001 +extern u16_t zfiWlanResume(zdev_t* dev, u8_t doReconn);
32002 +extern u16_t zfiWlanSuspend(zdev_t* dev);
32003 +
32004 +/* Enable/disable ISR interrupt */
32005 +extern u16_t zfiWlanInterruptEnable(zdev_t* dev);
32006 +extern u16_t zfiWlanInterruptDisable(zdev_t* dev);
32007 +
32008 +/* Do WLAN site survey */
32009 +extern u16_t zfiWlanScan(zdev_t* dev);
32010 +
32011 +/* Get WLAN stastics */
32012 +extern u16_t zfiWlanGetStatistics(zdev_t* dev);
32013 +
32014 +/* Reset WLAN */
32015 +extern u16_t zfiWlanReset(zdev_t* dev);
32016 +
32017 +/* Deauthenticate a STA */
32018 +extern u16_t zfiWlanDeauth(zdev_t* dev, u16_t* macAddr, u16_t reason);
32019 +
32020 +extern u16_t zfiTxSendEth(zdev_t* dev, zbuf_t* buf, u16_t port);
32021 +extern u8_t zfiIsTxQueueFull(zdev_t* dev);
32022 +extern u16_t zfiTxSend80211Mgmt(zdev_t* dev, zbuf_t* buf, u16_t port);
32023 +
32024 +extern void zfiIsrPci(zdev_t* dev);
32025 +
32026 +extern u8_t zfiWlanIBSSGetPeerStationsCount(zdev_t* dev);
32027 +extern u8_t zfiWlanIBSSIteratePeerStations(zdev_t* dev, u8_t numToIterate, zfpIBSSIteratePeerStationCb callback, void *ctx);
32028 +extern void zfiWlanFlushAllQueuedBuffers(zdev_t* dev);
32029 +
32030 +/* coid.c */
32031 +extern void zfiWlanQueryMacAddress(zdev_t* dev, u8_t* addr);
32032 +
32033 +extern u16_t zfiGlobalDataSize(zdev_t* dev);
32034 +
32035 +extern void zfiHeartBeat(zdev_t* dev);
32036 +
32037 +extern void zfiWlanSetWlanMode(zdev_t* dev, u8_t wlanMode);
32038 +extern void zfiWlanSetAuthenticationMode(zdev_t* dev, u8_t authMode);
32039 +extern void zfiWlanSetWepStatus(zdev_t* dev, u8_t wepStatus);
32040 +extern void zfiWlanSetSSID(zdev_t* dev, u8_t* ssid, u8_t ssidLength);
32041 +extern void zfiWlanSetFragThreshold(zdev_t* dev, u16_t fragThreshold);
32042 +extern void zfiWlanSetRtsThreshold(zdev_t* dev, u16_t rtsThreshold);
32043 +extern void zfiWlanSetFrequency(zdev_t* dev, u32_t frequency, u8_t bImmediate);
32044 +extern void zfiWlanSetBssid(zdev_t* dev, u8_t* bssid);
32045 +extern void zfiWlanSetBeaconInterval(zdev_t* dev, u16_t beaconInterval,
32046 + u8_t bImmediate);
32047 +extern void zfiWlanSetDtimCount(zdev_t* dev, u8_t dtim);
32048 +extern void zfiWlanSetAtimWindow(zdev_t* dev, u16_t atimWindow, u8_t bImmediate);
32049 +extern void zfiWlanSetEncryMode(zdev_t* dev, u8_t encryMode);
32050 +extern u8_t zfiWlanSetKey(zdev_t* dev, struct zsKeyInfo keyInfo);
32051 +extern u8_t zfiWlanPSEUDOSetKey(zdev_t* dev, struct zsKeyInfo keyInfo);
32052 +extern void zfiWlanSetPowerSaveMode(zdev_t* dev, u8_t mode);
32053 +extern void zfiWlanQueryBssListV1(zdev_t* dev, struct zsBssListV1* bssListV1);
32054 +extern void zfiWlanQueryBssList(zdev_t* dev, struct zsBssList* pBssList);
32055 +extern void zfiWlanSetProtectionMode(zdev_t* dev, u8_t mode);
32056 +extern void zfiWlanFlushBssList(zdev_t* dev);
32057 +
32058 +void zfiWlanDisableDfsChannel(zdev_t* dev, u8_t disableFlag);
32059 +
32060 +extern u8_t zfiWlanQueryWlanMode(zdev_t* dev);
32061 +extern u16_t zfiWlanChannelToFrequency(zdev_t* dev, u8_t channel);
32062 +extern u8_t zfiWlanFrequencyToChannel(zdev_t* dev, u16_t freq);
32063 +
32064 +#define ZM_WLAN_STATE_OPENED 0
32065 +#define ZM_WLAN_STATE_ENABLED 1
32066 +#define ZM_WLAN_STATE_DISABLED 2
32067 +#define ZM_WLAN_STATE_CLOSEDED 3
32068 +extern u8_t zfiWlanQueryAdapterState(zdev_t* dev);
32069 +extern u8_t zfiWlanQueryAuthenticationMode(zdev_t* dev, u8_t bWrapper);
32070 +extern u8_t zfiWlanQueryWepStatus(zdev_t* dev, u8_t bWrapper);
32071 +extern void zfiWlanQuerySSID(zdev_t* dev, u8_t* ssid, u8_t* pSsidLength);
32072 +extern u16_t zfiWlanQueryFragThreshold(zdev_t* dev);
32073 +extern u16_t zfiWlanQueryRtsThreshold(zdev_t* dev);
32074 +extern u32_t zfiWlanQueryFrequency(zdev_t* dev);
32075 +extern u32_t zfiWlanQueryCurrentFrequency(zdev_t* dev, u8_t qmode);
32076 +extern u32_t zfiWlanQueryFrequencyAttribute(zdev_t* dev, u32_t frequency);
32077 +extern void zfiWlanQueryFrequencyHT(zdev_t* dev, u32_t *bandWidth, u32_t *extOffset);
32078 +extern u8_t zfiWlanQueryCWMode(zdev_t* dev);
32079 +extern u32_t zfiWlanQueryCWEnable(zdev_t* dev);
32080 +extern void zfiWlanQueryBssid(zdev_t* dev, u8_t* bssid);
32081 +extern u16_t zfiWlanQueryBeaconInterval(zdev_t* dev);
32082 +extern u32_t zfiWlanQueryRxBeaconTotal(zdev_t* dev);
32083 +extern u16_t zfiWlanQueryAtimWindow(zdev_t* dev);
32084 +extern u8_t zfiWlanQueryEncryMode(zdev_t* dev);
32085 +extern u16_t zfiWlanQueryCapability(zdev_t* dev);
32086 +extern u16_t zfiWlanQueryAid(zdev_t* dev);
32087 +extern void zfiWlanQuerySupportRate(zdev_t* dev, u8_t* rateArray, u8_t* pLength);
32088 +extern void zfiWlanQueryExtSupportRate(zdev_t* dev, u8_t* rateArray, u8_t* pLength);
32089 +extern void zfiWlanQueryRsnIe(zdev_t* dev, u8_t* ie, u8_t* pLength);
32090 +extern void zfiWlanQueryWpaIe(zdev_t* dev, u8_t* ie, u8_t* pLength);
32091 +extern u8_t zfiWlanQueryHTMode(zdev_t* dev);
32092 +extern u8_t zfiWlanQueryBandWidth40(zdev_t* dev);
32093 +extern u8_t zfiWlanQueryMulticastCipherAlgo(zdev_t *dev);
32094 +extern u16_t zfiWlanQueryRegionCode(zdev_t* dev);
32095 +extern void zfiWlanSetWpaIe(zdev_t* dev, u8_t* ie, u8_t Length);
32096 +extern void zfiWlanSetWpaSupport(zdev_t* dev, u8_t WpaSupport);
32097 +extern void zfiWlanCheckStaWpaIe(zdev_t* dev);
32098 +extern void zfiWlanSetBasicRate(zdev_t* dev, u8_t bRateSet, u8_t gRateSet,
32099 + u32_t nRateSet);
32100 +extern void zfiWlanSetBGMode(zdev_t* dev, u8_t mode);
32101 +extern void zfiWlanSetpreambleType(zdev_t* dev, u8_t type);
32102 +extern u8_t zfiWlanQuerypreambleType(zdev_t* dev);
32103 +extern u8_t zfiWlanQueryPowerSaveMode(zdev_t* dev);
32104 +extern void zfiWlanSetMacAddress(zdev_t* dev, u16_t* mac);
32105 +extern u16_t zfiWlanSetTxRate(zdev_t* dev, u16_t rate);
32106 +extern u32_t zfiWlanQueryTxRate(zdev_t* dev);
32107 +extern void zfWlanUpdateRxRate(zdev_t* dev, struct zsAdditionInfo* addInfo);
32108 +extern u32_t zfiWlanQueryRxRate(zdev_t* dev);
32109 +extern u8_t zfiWlanSetPmkidInfo(zdev_t* dev, u16_t* bssid, u8_t* pmkid);
32110 +extern u32_t zfiWlanQueryPmkidInfo(zdev_t* dev, u8_t* buf, u32_t len);
32111 +extern void zfiWlanSetAllMulticast(zdev_t* dev, u32_t setting);
32112 +extern void zfiWlanSetHTCtrl(zdev_t* dev, u32_t *setting, u32_t forceTxTPC);
32113 +extern void zfiWlanQueryHTCtrl(zdev_t* dev, u32_t *setting, u32_t *forceTxTPC);
32114 +extern void zfiWlanDbg(zdev_t* dev, u8_t setting);
32115 +
32116 +extern void zfiWlanResetTally(zdev_t* dev);
32117 +extern void zfiWlanQueryTally(zdev_t* dev, struct zsCommTally *tally);
32118 +extern void zfiWlanQueryTrafTally(zdev_t* dev, struct zsTrafTally *tally);
32119 +extern void zfiWlanQueryMonHalRxInfo(zdev_t* dev, struct zsMonHalRxInfo *halRxInfo);
32120 +
32121 +extern u32_t zfiFWConfig(zdev_t* dev, u32_t size);
32122 +
32123 +extern void zfiDKEnable(zdev_t* dev, u32_t enable);
32124 +
32125 +extern void zfiWlanSetMulticastList(zdev_t* dev, u8_t size, u8_t* pList);
32126 +extern void zfiWlanRemoveKey(zdev_t* dev, u8_t keyType, u8_t keyId);
32127 +extern u8_t zfiWlanQueryIsPKInstalled(zdev_t *dev, u8_t *staMacAddr);
32128 +extern u32_t zfiWlanQueryPacketTypePromiscuous(zdev_t* dev);
32129 +extern void zfiWlanSetPacketTypePromiscuous(zdev_t* dev, u32_t setValue);
32130 +extern void zfiSetChannelManagement(zdev_t* dev, u32_t setting);
32131 +extern void zfiSetRifs(zdev_t* dev, u16_t setting);
32132 +extern void zfiCheckRifs(zdev_t* dev);
32133 +extern void zfiSetReorder(zdev_t* dev, u16_t value);
32134 +extern void zfiSetSeqDebug(zdev_t* dev, u16_t value);
32135 +
32136 +extern u16_t zfiConfigWdsPort(zdev_t* dev, u8_t wdsPortId, u16_t flag, u16_t* wdsAddr,
32137 + u16_t encType, u32_t* wdsKey);
32138 +extern void zfiWlanQueryRegulationTable(zdev_t* dev, struct zsRegulationTable* pEntry);
32139 +extern void zfiWlanSetScanTimerPerChannel(zdev_t* dev, u16_t time);
32140 +extern void zfiWlanSetAutoReconnect(zdev_t* dev, u8_t enable);
32141 +extern u32_t zfiDebugCmd(zdev_t* dev, u32_t cmd, u32_t value);
32142 +extern void zfiWlanSetProbingHiddenSsid(zdev_t* dev, u8_t* ssid, u8_t ssidLen,
32143 + u16_t entry);
32144 +extern void zfiWlanSetDropUnencryptedPackets(zdev_t* dev, u8_t enable);
32145 +extern void zfiWlanSetIBSSJoinOnly(zdev_t* dev, u8_t joinOnly);
32146 +extern void zfiWlanSetDefaultKeyId(zdev_t* dev, u8_t keyId);
32147 +extern void zfiWlanSetDisableProbingWithSsid(zdev_t* dev, u8_t mode);
32148 +extern void zfiWlanQueryGSN(zdev_t* dev, u8_t *gsn, u16_t vapId);
32149 +extern u16_t zfiStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType);
32150 +extern u8_t zfiWlanSetDot11DMode(zdev_t* dev, u8_t mode);
32151 +extern u8_t zfiWlanSetDot11HDFSMode(zdev_t* dev, u8_t mode);
32152 +extern u8_t zfiWlanSetDot11HTPCMode(zdev_t* dev, u8_t mode);
32153 +extern u8_t zfiWlanSetAniMode(zdev_t* dev, u8_t mode);
32154 +extern void zfiWlanSetStaWme(zdev_t* dev, u8_t enable, u8_t uapsdInfo);
32155 +extern void zfiWlanSetApWme(zdev_t* dev, u8_t enable);
32156 +extern u8_t zfiWlanQuerywmeEnable(zdev_t* dev);
32157 +#ifdef ZM_OS_LINUX_FUNC
32158 +extern void zfiWlanShowTally(zdev_t* dev);
32159 +#endif
32160 +#ifdef ZM_ENABLE_CENC
32161 +/* CENC */
32162 +extern u8_t zfiWlanSetCencPairwiseKey(zdev_t* dev, u8_t keyid, u32_t *txiv, u32_t *rxiv,
32163 + u8_t *key, u8_t *mic);
32164 +extern u8_t zfiWlanSetCencGroupKey(zdev_t* dev, u8_t keyid, u32_t *rxiv,
32165 + u8_t *key, u8_t *mic);
32166 +#endif //ZM_ENABLE_CENC
32167 +extern void zfiWlanQuerySignalInfo(zdev_t* dev, u8_t *buffer);
32168 +extern void zfiWlanQueryAdHocCreatedBssDesc(zdev_t* dev, struct zsBssInfo *pBssInfo);
32169 +extern u8_t zfiWlanQueryAdHocIsCreator(zdev_t* dev);
32170 +extern u32_t zfiWlanQuerySupportMode(zdev_t* dev);
32171 +extern u32_t zfiWlanQueryTransmitPower(zdev_t* dev);
32172 +extern void zfiWlanEnableLeapConfig(zdev_t* dev, u8_t leapEnabled);
32173 +
32174 +/* returned buffer allocated by driver core */
32175 +extern void zfiRecvEthComplete(zdev_t* dev, zbuf_t* buf);
32176 +
32177 +extern void zfiRecv80211(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo);
32178 +
32179 +extern void zfiWlanSetMaxTxPower(zdev_t* dev, u8_t power2, u8_t power5);
32180 +extern void zfiWlanQueryMaxTxPower(zdev_t* dev, u8_t *power2, u8_t *power5);
32181 +extern void zfiWlanSetConnectMode(zdev_t* dev, u8_t mode);
32182 +extern void zfiWlanSetSupportMode(zdev_t* dev, u32_t mode);
32183 +extern void zfiWlanSetAdhocMode(zdev_t* dev, u32_t mode);
32184 +extern u32_t zfiWlanQueryAdhocMode(zdev_t* dev, u8_t bWrapper);
32185 +extern u8_t zfiWlanSetCountryIsoName(zdev_t* dev, u8_t *countryIsoName, u8_t length);
32186 +extern const char* zfiWlanQueryCountryIsoName(zdev_t* dev);
32187 +extern u8_t zfiWlanQueryregulatoryDomain(zdev_t* dev);
32188 +extern u8_t zfiWlanQueryCCS(zdev_t* dev);
32189 +extern void zfiWlanSetCCS(zdev_t* dev, u8_t mode);
32190 +extern void zfiWlanSetRegulatory(zdev_t* dev, u8_t CCS, u16_t Code, u8_t bfirstChannel);
32191 +extern const char* zfiHpGetisoNamefromregionCode(zdev_t* dev, u16_t regionCode);
32192 +extern void zfiWlanSetLEDCtrlParam(zdev_t* dev, u8_t type, u8_t flag);
32193 +extern u32_t zfiWlanQueryReceivedPacket(zdev_t* dev);
32194 +extern void zfiWlanCheckSWEncryption(zdev_t* dev);
32195 +extern u16_t zfiWlanQueryAllowChannels(zdev_t *dev, u16_t *channels);
32196 +extern u16_t zfiWlanGetMulticastAddressCount(zdev_t* dev);
32197 +extern void zfiWlanGetMulticastList(zdev_t* dev, u8_t* pMCList);
32198 +extern void zfiWlanSetPacketFilter(zdev_t* dev, u32_t PacketFilter);
32199 +extern u8_t zfiCompareWithMulticastListAddress(zdev_t* dev, u16_t* dstMacAddr);
32200 +extern void zfiWlanSetSafeModeEnabled(zdev_t* dev, u8_t safeMode);
32201 +extern void zfiWlanSetIBSSAdditionalIELength(zdev_t* dev, u32_t ibssAdditionalIESize, u8_t* ibssAdditionalIE);
32202 +extern void zfiWlanSetXLinkMode(zdev_t* dev, u32_t setValue);
32203 +
32204 +/* hprw.c */
32205 +extern u32_t zfiDbgWriteFlash(zdev_t* dev, u32_t addr, u32_t val);
32206 +extern u32_t zfiDbgWriteReg(zdev_t* dev, u32_t addr, u32_t val);
32207 +extern u32_t zfiDbgReadReg(zdev_t* dev, u32_t addr);
32208 +
32209 +extern u32_t zfiDbgWriteEeprom(zdev_t* dev, u32_t addr, u32_t val);
32210 +extern u32_t zfiDbgBlockWriteEeprom(zdev_t* dev, u32_t addr, u32_t* buf);
32211 +extern u32_t zfiDbgBlockWriteEeprom_v2(zdev_t* dev, u32_t addr, u32_t* buf, u32_t wrlen);
32212 +
32213 +extern u16_t zfiDbgChipEraseFlash(zdev_t *dev);
32214 +extern u16_t zfiDbgProgramFlash(zdev_t *dev, u32_t offset, u32_t len, u32_t *data);
32215 +extern u32_t zfiDbgGetFlashCheckSum(zdev_t *dev, u32_t addr, u32_t len);
32216 +extern u32_t zfiDbgReadFlash(zdev_t *dev, u32_t addr, u32_t len);
32217 +extern u32_t zfiDownloadFwSet(zdev_t *dev);
32218 +
32219 +extern u32_t zfiDbgDelayWriteReg(zdev_t* dev, u32_t addr, u32_t val);
32220 +extern u32_t zfiDbgFlushDelayWrite(zdev_t* dev);
32221 +
32222 +extern u32_t zfiDbgSetIFSynthesizer(zdev_t* dev, u32_t value);
32223 +extern u32_t zfiDbgReadTally(zdev_t* dev);
32224 +
32225 +extern u32_t zfiDbgQueryHwTxBusy(zdev_t* dev);
32226 +
32227 +extern u8_t zfiWlanGetDestAddrFromBuf(zdev_t *dev, zbuf_t *buf, u16_t *macAddr);
32228 +
32229 +extern u32_t zfiWlanQueryHwCapability(zdev_t* dev);
32230 +
32231 +extern void zfiWlanSetDynamicSIFSParam(zdev_t* dev, u8_t val);
32232 +
32233 +/***** End of section 2 *****/
32234 +
32235 +/***** section 3 performace evaluation *****/
32236 +#ifdef ZM_ENABLE_PERFORMANCE_EVALUATION
32237 +extern void zfiTxPerformanceMSDU(zdev_t* dev, u32_t tick);
32238 +extern void zfiRxPerformanceMPDU(zdev_t* dev, zbuf_t* buf);
32239 +extern void zfiRxPerformanceReg(zdev_t* dev, u32_t reg, u32_t rsp);
32240 +#define ZM_PERFORMANCE_INIT(dev) zfiPerformanceInit(dev);
32241 +#define ZM_PERFORMANCE_TX_MSDU(dev, tick) zfiTxPerformanceMSDU(dev, tick);
32242 +#define ZM_PERFORMANCE_RX_MSDU(dev, tick) zfiRxPerformanceMSDU(dev, tick);
32243 +#define ZM_PERFORMANCE_TX_MPDU(dev, tick) zfiTxPerformanceMPDU(dev, tick);
32244 +#define ZM_PERFORMANCE_RX_MPDU(dev, buf) zfiRxPerformanceMPDU(dev, buf);
32245 +#define ZM_PERFORMANCE_RX_SEQ(dev, buf) zfiRxPerformanceSeq(dev, buf);
32246 +#define ZM_PERFORMANCE_REG(dev, reg, rsp) {if(cmd[1] == reg) zfiRxPerformanceReg(dev, reg, rsp);}
32247 +#define ZM_PERFORMANCE_DUP(dev, buf1, buf2) zfiRxPerformanceDup(dev, buf1, buf2);
32248 +#define ZM_PERFORMANCE_FREE(dev, buf) zfiRxPerformanceFree(dev, buf);
32249 +#define ZM_PERFORMANCE_RX_AMSDU(dev, buf, len) zfiRxPerformanceAMSDU(dev, buf, len);
32250 +#define ZM_PERFORMANCE_RX_FLUSH(dev) zfiRxPerformanceFlush(dev);
32251 +#define ZM_PERFORMANCE_RX_CLEAR(dev) zfiRxPerformanceClear(dev);
32252 +#define ZM_SEQ_DEBUG if (wd->seq_debug) DbgPrint
32253 +#define ZM_PERFORMANCE_RX_REORDER(dev) zfiRxPerformanceReorder(dev);
32254 +#else
32255 +#define ZM_PERFORMANCE_INIT(dev)
32256 +#define ZM_PERFORMANCE_TX_MSDU(dev, tick)
32257 +#define ZM_PERFORMANCE_RX_MSDU(dev, tick)
32258 +#define ZM_PERFORMANCE_TX_MPDU(dev, tick)
32259 +#define ZM_PERFORMANCE_RX_MPDU(dev, buf)
32260 +#define ZM_PERFORMANCE_RX_SEQ(dev, buf)
32261 +#define ZM_PERFORMANCE_REG(dev, reg, rsp)
32262 +#define ZM_PERFORMANCE_DUP(dev, buf1, buf2)
32263 +#define ZM_PERFORMANCE_FREE(dev, buf)
32264 +#define ZM_PERFORMANCE_RX_AMSDU(dev, buf, len)
32265 +#define ZM_PERFORMANCE_RX_FLUSH(dev)
32266 +#define ZM_PERFORMANCE_RX_CLEAR(dev)
32267 +#define ZM_SEQ_DEBUG
32268 +#define ZM_PERFORMANCE_RX_REORDER(dev)
32269 +#endif
32270 +/***** End of section 3 *****/
32271 +#endif
32272 --- /dev/null
32273 +++ b/drivers/staging/otus/80211core/pub_zfw.h
32274 @@ -0,0 +1,93 @@
32275 +/*
32276 + * Copyright (c) 2007-2008 Atheros Communications Inc.
32277 + *
32278 + * Permission to use, copy, modify, and/or distribute this software for any
32279 + * purpose with or without fee is hereby granted, provided that the above
32280 + * copyright notice and this permission notice appear in all copies.
32281 + *
32282 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
32283 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
32284 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
32285 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
32286 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
32287 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
32288 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
32289 + */
32290 +
32291 +#ifndef _PUB_ZFW_H
32292 +#define _PUB_ZFW_H
32293 +
32294 +#include "../oal_dt.h"
32295 +
32296 +
32297 +/* Buffer management */
32298 +#ifdef ZM_ENABLE_BUFFER_DEBUG
32299 +extern zbuf_t* zfwBufAllocateWithContext(zdev_t* dev, u16_t len, u8_t *functionName, ULONG line);
32300 +#define zfwBufAllocate(dev, len) zfwBufAllocateWithContext(dev, len, (u8_t *)__FUNCTION__, __LINE__)
32301 +#else
32302 +extern zbuf_t* zfwBufAllocate(zdev_t* dev, u16_t len);
32303 +#endif
32304 +extern void zfwBufFree(zdev_t* dev, zbuf_t* buf, u16_t errCode);
32305 +extern u16_t zfwBufChain(zdev_t* dev, zbuf_t** head, zbuf_t* tail);
32306 +extern u16_t zfwBufCopy(zdev_t* dev, zbuf_t* dst, zbuf_t* src);
32307 +extern u16_t zfwBufSetSize(zdev_t* dev, zbuf_t* buf, u16_t size);
32308 +extern u16_t zfwBufRemoveHead(zdev_t* dev, zbuf_t* buf, u16_t size);
32309 +extern u16_t zfwBufGetSize(zdev_t* dev, zbuf_t* buf);
32310 +extern void zfwCopyBufContext(zdev_t* dev, zbuf_t* source, zbuf_t* dest);
32311 +
32312 +/* Memory management */
32313 +extern void* zfwMemAllocate(zdev_t* dev, u32_t size);
32314 +extern void zfwMemFree(zdev_t* dev, void* mem, u32_t size);
32315 +extern void zfwMemoryCopy(u8_t* dst, u8_t* src, u16_t length);
32316 +extern void zfwMemoryMove(u8_t* dst, u8_t* src, u16_t length);
32317 +extern void zfwZeroMemory(u8_t* va, u16_t length);
32318 +extern u8_t zfwMemoryIsEqual(u8_t* m1, u8_t* m2, u16_t length);
32319 +
32320 +/* Others */
32321 +extern void zfwSleep(zdev_t* dev, u32_t ms);
32322 +extern u16_t zfwGetVapId(zdev_t* dev);
32323 +extern u16_t zfwStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType);
32324 +extern u32_t zfwWaitForEvent(zdev_t *dev, u32_t event, u32_t timeout);
32325 +extern void zfwSendEvent(zdev_t* dev);
32326 +extern void zfwGetActiveScanDur(zdev_t* dev, u8_t* Dur );
32327 +extern void zfwGetShowZeroLengthSSID(zdev_t* dev, u8_t* Dur );
32328 +/* For debugging */
32329 +extern void zfwDumpBuf(zdev_t* dev, zbuf_t* buf);
32330 +extern void zfwDbgReadRegDone(zdev_t* dev, u32_t addr, u32_t val);
32331 +/* For Evl */
32332 +extern void zfwDbgDownloadFwInitDone(zdev_t* dev);
32333 +extern void zfwDbgReadFlashDone(zdev_t* dev, u32_t addr, u32_t* rspdata, u32_t datalen);
32334 +extern void zfwDbgGetFlashChkSumDone(zdev_t* dev, u32_t* rspdata);
32335 +extern void zfwDbgProgrameFlashDone(zdev_t* dev);
32336 +extern void zfwDbgProgrameFlashChkDone(zdev_t* dev);
32337 +extern void zfwDbgWriteRegDone(zdev_t* dev, u32_t addr, u32_t val);
32338 +extern void zfwDbgWriteEepromDone(zdev_t* dev, u32_t addr, u32_t val);
32339 +extern void zfwDbgReadTallyDone(zdev_t* dev);
32340 +extern void zfwWlanReadRegDone(zdev_t* dev, u32_t addr, u32_t val);
32341 +extern void zfwWlanWriteRegDone(zdev_t* dev, u32_t addr, u32_t val);
32342 +extern void zfwWlanReadTallyDone(zdev_t* dev);
32343 +extern void zfwDbgQueryHwTxBusyDone(zdev_t* dev, u32_t val);
32344 +extern u32_t zfwReadReg(zdev_t* dev, u32_t offset);
32345 +extern u32_t zfwReadEeprom(zdev_t* dev, u32_t addr);
32346 +
32347 +/* Reserved for Vista, please return 0 */
32348 +extern u8_t zfwGetPktEncExemptionActionType(zdev_t* dev, zbuf_t* buf);
32349 +
32350 +#ifdef ZM_ENABLE_CENC
32351 +/* Reserved for CENC, please return 0 */
32352 +extern u8_t zfwCencHandleBeaconProbrespon(zdev_t* dev, u8_t *pWIEc,
32353 + u8_t *pPeerSSIDc, u8_t *pPeerAddrc);
32354 +#endif //ZM_ENABLE_CENC
32355 +
32356 +#ifdef ZM_HALPLUS_LOCK
32357 +extern asmlinkage struct zsWlanDev *zfwGetWlanDev(zdev_t* dev);
32358 +extern asmlinkage void zfwEnterCriticalSection(zdev_t* dev);
32359 +extern asmlinkage void zfwLeaveCriticalSection(zdev_t* dev);
32360 +extern asmlinkage u8_t zfwBufReadByte(zdev_t* dev, zbuf_t* buf, u16_t offset);
32361 +extern asmlinkage u16_t zfwBufReadHalfWord(zdev_t* dev, zbuf_t* buf, u16_t offset);
32362 +extern asmlinkage void zfwBufWriteByte(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t value);
32363 +extern asmlinkage void zfwBufWriteHalfWord(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t value);
32364 +extern asmlinkage u8_t *zfwGetBuffer(zdev_t* dev, zbuf_t* buf);
32365 +#endif
32366 +
32367 +#endif //_PUB_ZFW_H
32368 --- /dev/null
32369 +++ b/drivers/staging/otus/80211core/queue.c
32370 @@ -0,0 +1,303 @@
32371 +/*
32372 + * Copyright (c) 2007-2008 Atheros Communications Inc.
32373 + *
32374 + * Permission to use, copy, modify, and/or distribute this software for any
32375 + * purpose with or without fee is hereby granted, provided that the above
32376 + * copyright notice and this permission notice appear in all copies.
32377 + *
32378 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
32379 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
32380 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
32381 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
32382 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
32383 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
32384 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
32385 + */
32386 +/* */
32387 +/* Module Name : queue.c */
32388 +/* */
32389 +/* Abstract */
32390 +/* This module contains queue management functions. */
32391 +/* */
32392 +/* NOTES */
32393 +/* None */
32394 +/* */
32395 +/************************************************************************/
32396 +#include "cprecomp.h"
32397 +#include "queue.h"
32398 +
32399 +
32400 +struct zsQueue* zfQueueCreate(zdev_t* dev, u16_t size)
32401 +{
32402 + struct zsQueue* q;
32403 +
32404 + if ((q = (struct zsQueue*)zfwMemAllocate(dev, sizeof(struct zsQueue)
32405 + + (sizeof(struct zsQueueCell)*(size-1)))) != NULL)
32406 + {
32407 + q->size = size;
32408 + q->sizeMask = size-1;
32409 + q->head = 0;
32410 + q->tail = 0;
32411 + }
32412 + return q;
32413 +}
32414 +
32415 +void zfQueueDestroy(zdev_t* dev, struct zsQueue* q)
32416 +{
32417 + u16_t size = sizeof(struct zsQueue) + (sizeof(struct zsQueueCell)*(q->size-1));
32418 +
32419 + zfQueueFlush(dev, q);
32420 + zfwMemFree(dev, q, size);
32421 +
32422 + return;
32423 +}
32424 +
32425 +u16_t zfQueuePutNcs(zdev_t* dev, struct zsQueue* q, zbuf_t* buf, u32_t tick)
32426 +{
32427 + u16_t ret = ZM_ERR_QUEUE_FULL;
32428 +
32429 + zm_msg0_mm(ZM_LV_1, "zfQueuePutNcs()");
32430 +
32431 + if (((q->tail+1)&q->sizeMask) != q->head)
32432 + {
32433 + q->cell[q->tail].buf = buf;
32434 + q->cell[q->tail].tick = tick;
32435 + q->tail = (q->tail+1) & q->sizeMask;
32436 + ret = ZM_SUCCESS;
32437 + }
32438 +
32439 + return ret;
32440 +}
32441 +
32442 +u16_t zfQueuePut(zdev_t* dev, struct zsQueue* q, zbuf_t* buf, u32_t tick)
32443 +{
32444 + u16_t ret;
32445 + zmw_declare_for_critical_section();
32446 +
32447 + zmw_enter_critical_section(dev);
32448 +
32449 + ret = zfQueuePutNcs(dev, q, buf, tick);
32450 +
32451 + zmw_leave_critical_section(dev);
32452 +
32453 + return ret;
32454 +}
32455 +
32456 +zbuf_t* zfQueueGet(zdev_t* dev, struct zsQueue* q)
32457 +{
32458 + zbuf_t* buf = NULL;
32459 + zmw_declare_for_critical_section();
32460 +
32461 + zmw_enter_critical_section(dev);
32462 +
32463 + if (q->head != q->tail)
32464 + {
32465 + buf = q->cell[q->head].buf;
32466 + q->head = (q->head+1) & q->sizeMask;
32467 + }
32468 +
32469 + zmw_leave_critical_section(dev);
32470 +
32471 + return buf;
32472 +}
32473 +
32474 +u16_t zfCompareDstwithBuf(zdev_t* dev, zbuf_t* buf, u8_t* addr)
32475 +{
32476 + u16_t i;
32477 + u8_t dst[6];
32478 +
32479 + for (i=0; i<6; i++)
32480 + {
32481 + dst[i] = zmw_buf_readb(dev, buf, i);
32482 + if (dst[i] != addr[i])
32483 + {
32484 + return 1+i;
32485 + }
32486 + }
32487 +
32488 + return 0;
32489 +}
32490 +
32491 +
32492 +zbuf_t* zfQueueGetWithMac(zdev_t* dev, struct zsQueue* q, u8_t* addr, u8_t* mb)
32493 +{
32494 + zbuf_t* buf;
32495 + zbuf_t* retBuf = NULL;
32496 + u16_t index, next;
32497 + zmw_declare_for_critical_section();
32498 +
32499 + *mb = 0;
32500 +
32501 + zmw_enter_critical_section(dev);
32502 +
32503 + index = q->head;
32504 +
32505 + while (1)
32506 + {
32507 + if (index != q->tail)
32508 + {
32509 + buf = q->cell[index].buf;
32510 +
32511 + //if buf's detination address == input addr
32512 + if (zfCompareDstwithBuf(dev, buf, addr) == 0)
32513 + {
32514 + retBuf = buf;
32515 + //Get it, and trace the whole queue to calculate more bit
32516 + while ((next =((index+1)&q->sizeMask)) != q->tail)
32517 + {
32518 + q->cell[index].buf = q->cell[next].buf;
32519 + q->cell[index].tick = q->cell[next].tick;
32520 +
32521 + if ((*mb == 0) && (zfCompareDstwithBuf(dev,
32522 + q->cell[next].buf, addr) == 0))
32523 + {
32524 + *mb = 1;
32525 + }
32526 +
32527 + index = next;
32528 + }
32529 + q->tail = (q->tail-1) & q->sizeMask;
32530 +
32531 + zmw_leave_critical_section(dev);
32532 + return retBuf;
32533 + }
32534 + index = (index + 1) & q->sizeMask;
32535 + } //if (index != q->tail)
32536 + else
32537 + {
32538 + break;
32539 + }
32540 + }
32541 +
32542 + zmw_leave_critical_section(dev);
32543 +
32544 + return retBuf;
32545 +
32546 +}
32547 +
32548 +void zfQueueFlush(zdev_t* dev, struct zsQueue* q)
32549 +{
32550 + zbuf_t* buf;
32551 +
32552 + while ((buf = zfQueueGet(dev, q)) != NULL)
32553 + {
32554 + zfwBufFree(dev, buf, 0);
32555 + }
32556 +
32557 + return;
32558 +}
32559 +
32560 +void zfQueueAge(zdev_t* dev, struct zsQueue* q, u32_t tick, u32_t msAge)
32561 +{
32562 + zbuf_t* buf;
32563 + u32_t buftick;
32564 + zmw_declare_for_critical_section();
32565 +
32566 + while (1)
32567 + {
32568 + buf = NULL;
32569 + zmw_enter_critical_section(dev);
32570 +
32571 + if (q->head != q->tail)
32572 + {
32573 + buftick = q->cell[q->head].tick;
32574 + if (((tick - buftick)*ZM_MS_PER_TICK) > msAge)
32575 + {
32576 + buf = q->cell[q->head].buf;
32577 + q->head = (q->head+1) & q->sizeMask;
32578 + }
32579 + }
32580 +
32581 + zmw_leave_critical_section(dev);
32582 +
32583 + if (buf != NULL)
32584 + {
32585 + zm_msg0_mm(ZM_LV_0, "Age frame in queue!");
32586 + zfwBufFree(dev, buf, 0);
32587 + }
32588 + else
32589 + {
32590 + break;
32591 + }
32592 + }
32593 + return;
32594 +}
32595 +
32596 +
32597 +u8_t zfQueueRemovewithIndex(zdev_t* dev, struct zsQueue* q, u16_t index, u8_t* addr)
32598 +{
32599 + u16_t next;
32600 + u8_t mb = 0;
32601 +
32602 + //trace the whole queue to calculate more bit
32603 + while ((next =((index+1)&q->sizeMask)) != q->tail)
32604 + {
32605 + q->cell[index].buf = q->cell[next].buf;
32606 + q->cell[index].tick = q->cell[next].tick;
32607 +
32608 + if ((mb == 0) && (zfCompareDstwithBuf(dev,
32609 + q->cell[next].buf, addr) == 0))
32610 + {
32611 + mb = 1;
32612 + }
32613 +
32614 + index = next;
32615 + }
32616 + q->tail = (q->tail-1) & q->sizeMask;
32617 +
32618 + return mb;
32619 +
32620 +}
32621 +
32622 +void zfQueueGenerateUapsdTim(zdev_t* dev, struct zsQueue* q,
32623 + u8_t* uniBitMap, u16_t* highestByte)
32624 +{
32625 + zbuf_t* psBuf;
32626 + u8_t dst[6];
32627 + u16_t id, aid, index, i;
32628 + u16_t bitPosition;
32629 + u16_t bytePosition;
32630 + zmw_get_wlan_dev(dev);
32631 + zmw_declare_for_critical_section();
32632 +
32633 + zmw_enter_critical_section(dev);
32634 +
32635 + index = q->head;
32636 +
32637 + while (index != q->tail)
32638 + {
32639 + psBuf = q->cell[index].buf;
32640 + for (i=0; i<6; i++)
32641 + {
32642 + dst[i] = zmw_buf_readb(dev, psBuf, i);
32643 + }
32644 + /* TODO : use u8_t* fot MAC address */
32645 + if (((id = zfApFindSta(dev, (u16_t*)dst)) != 0xffff)
32646 + && (wd->ap.staTable[id].psMode != 0))
32647 + {
32648 + /* Calculate PVB only when all AC are delivery-enabled */
32649 + if ((wd->ap.staTable[id].qosInfo & 0xf) == 0xf)
32650 + {
32651 + aid = id + 1;
32652 + bitPosition = (1 << (aid & 0x7));
32653 + bytePosition = (aid >> 3);
32654 + uniBitMap[bytePosition] |= bitPosition;
32655 +
32656 + if (bytePosition>*highestByte)
32657 + {
32658 + *highestByte = bytePosition;
32659 + }
32660 + }
32661 + index = (index+1) & q->sizeMask;
32662 + }
32663 + else
32664 + {
32665 + /* Free garbage UAPSD frame */
32666 + zfQueueRemovewithIndex(dev, q, index, dst);
32667 + zfwBufFree(dev, psBuf, 0);
32668 + }
32669 + }
32670 + zmw_leave_critical_section(dev);
32671 +
32672 + return;
32673 +}
32674 --- /dev/null
32675 +++ b/drivers/staging/otus/80211core/queue.h
32676 @@ -0,0 +1,37 @@
32677 +/*
32678 + * Copyright (c) 2007-2008 Atheros Communications Inc.
32679 + *
32680 + * Permission to use, copy, modify, and/or distribute this software for any
32681 + * purpose with or without fee is hereby granted, provided that the above
32682 + * copyright notice and this permission notice appear in all copies.
32683 + *
32684 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
32685 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
32686 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
32687 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
32688 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
32689 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
32690 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
32691 + */
32692 +
32693 +#ifndef _QUEUE_H
32694 +#define _QUEUE_H
32695 +
32696 +#include "../oal_dt.h"
32697 +
32698 +struct zsQueueCell
32699 +{
32700 + u32_t tick;
32701 + zbuf_t* buf;
32702 +};
32703 +
32704 +struct zsQueue
32705 +{
32706 + u16_t size;
32707 + u16_t sizeMask;
32708 + u16_t head;
32709 + u16_t tail;
32710 + struct zsQueueCell cell[1];
32711 +};
32712 +
32713 +#endif //#ifndef _QUEUE_H
32714 --- /dev/null
32715 +++ b/drivers/staging/otus/80211core/ratectrl.c
32716 @@ -0,0 +1,874 @@
32717 +/*
32718 + * Copyright (c) 2007-2008 Atheros Communications Inc.
32719 + *
32720 + * Permission to use, copy, modify, and/or distribute this software for any
32721 + * purpose with or without fee is hereby granted, provided that the above
32722 + * copyright notice and this permission notice appear in all copies.
32723 + *
32724 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
32725 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
32726 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
32727 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
32728 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
32729 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
32730 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
32731 + */
32732 +
32733 +#include "cprecomp.h"
32734 +#include "ratectrl.h"
32735 +
32736 +const u32_t zcRateToPhyCtrl[] =
32737 + {
32738 + /* 1M, 2M, 5M, 11M , 0 1 2 3*/
32739 + 0x00000, 0x10000, 0x20000, 0x30000,
32740 + /* 6M 9M 12M 18M , 4 5 6 7*/
32741 + 0xb0001, 0xf0001, 0xa0001, 0xe0001,
32742 + /* 24M 36M 48M 54M , 8 9 10 11*/
32743 + 0x90001, 0xd0001, 0x80001, 0xc0001,
32744 + /* MCS0 MCS1 MCS2 MCS3, 12 13 14 15*/
32745 + 0x00002, 0x10002, 0x20002, 0x30002,
32746 + /* MCS4 MCS5 MCS6 MCS7, 16 17 18 19*/
32747 + 0x40002, 0x50002, 0x60002, 0x70002,
32748 + /* MCS8 MCS9 MCS10 MCS11, 20 21 22 23*/
32749 + 0x80002, 0x90002, 0xa0002, 0xb0002,
32750 + /* MCS12 MCS13 MCS14 MCS15, 24 25 26 27*/
32751 + 0xc0002, 0xd0002, 0xe0002, 0xf0002,
32752 + /* MCS14SG, MCS15SG MCS7SG , 28 29, 30*/
32753 + 0x800e0002, 0x800f0002, 0x80070002
32754 + };
32755 +
32756 +
32757 +const u8_t zcHtRateTable[15][4] =
32758 + { /*[5G 20MHz] [5G 40MHz] [2.4G 20MHz] [2.4G 40MHz]*/
32759 + { 4, 4, 0, 0}, /*OFDM6M OFDM6M CCK1M CCK1M */
32760 + { 5, 5, 1, 1}, /*OFDM9M OFDM9M CCK2M CCK2M */
32761 + { 13, 12, 2, 2}, /*MCS1 MCS0 CCK5M CCK5M */
32762 + { 14, 13, 3, 3}, /*MCS2 MCS1 CCK11M CCK11M */
32763 + { 15, 14, 13, 12}, /*MCS3 MCS2 MCS1 MCS0 */
32764 + { 16, 15, 14, 13}, /*MCS4 MCS3 MCS2 MCS1 */
32765 + { 23, 16, 15, 14}, /*MCS11 MCS4 MCS3 MCS2 */
32766 + { 24, 23, 16, 15}, /*MCS12 MCS11 MCS4 MCS3 */
32767 + { 25, 24, 23, 16}, /*MCS13 MCS12 MCS11 MCS4 */
32768 + { 26, 25, 24, 23}, /*MCS14 MCS13 MCS12 MCS11 */
32769 + { 27, 26, 25, 24}, /*MCS15 MCS14 MCS13 MCS12 */
32770 + { 0, 27, 26, 25}, /*0 MCS15 MCS14 MCS13 */
32771 + { 0, 29, 27, 26}, /*0 MCS15SG MCS15 MCS14 */
32772 + { 0, 0, 0, 28}, /*0 0 0 MCS14SG*/
32773 + { 0, 0, 0, 29} /*0 0 0 MCS15SG*/
32774 + };
32775 +
32776 +const u8_t zcHtOneTxStreamRateTable[15][4] =
32777 + { /*[5G 20MHz] [5G 40MHz] [2.4G 20MHz] [2.4G 40MHz]*/
32778 + { 4, 4, 0, 0}, /*OFDM6M OFDM6M CCK1M CCK1M */
32779 + { 5, 5, 1, 1}, /*OFDM9M OFDM9M CCK2M CCK2M */
32780 + { 13, 12, 2, 2}, /*MCS1 MCS0 CCK5M CCK5M */
32781 + { 14, 13, 3, 3}, /*MCS2 MCS1 CCK11M CCK11M */
32782 + { 15, 14, 13, 12}, /*MCS3 MCS2 MCS1 MCS0 */
32783 + { 16, 15, 14, 13}, /*MCS4 MCS3 MCS2 MCS1 */
32784 + { 17, 16, 15, 14}, /*MCS5 MCS4 MCS3 MCS2 */
32785 + { 18, 17, 16, 15}, /*MCS6 MCS5 MCS4 MCS3 */
32786 + { 19, 18, 17, 16}, /*MCS7 MCS6 MCS5 MCS4 */
32787 + { 0, 19, 18, 17}, /*0 MCS7 MCS6 MCS5 */
32788 + { 0, 30, 19, 18}, /*0 MCS7SG MCS7 MCS6 */
32789 + { 0, 0, 0, 19}, /*0 0 0 MCS7 */
32790 + { 0, 0, 0, 30}, /*0 0 0 MCS7SG */
32791 + { 0, 0, 0, 0 }, /*0 0 0 0 */
32792 + { 0, 0, 0, 0 } /*0 0 0 0 */
32793 + };
32794 +
32795 +const u16_t zcRate[] =
32796 + {
32797 + 1, 2, 5, 11, /* 1M, 2M, 5M, 11M , 0 1 2 3*/
32798 + 6, 9, 12, 18, /* 6M 9M 12M 18M , 4 5 6 7*/
32799 + 24, 36, 48, 54, /* 24M 36M 48M 54M , 8 9 10 11*/
32800 + 13, 27, 40, 54, /* MCS0 MCS1 MCS2 MCS3 , 12 13 14 15*/
32801 + 81, 108, 121, 135, /* MCS4 MCS5 MCS6 MCS7 , 16 17 18 19*/
32802 + 27, 54, 81, 108, /* MCS8 MCS9 MCS10 MCS11 , 20 21 22 23*/
32803 + 162, 216, 243, 270, /* MCS12 MCS13 MCS14 MCS15 , 24 25 26 27*/
32804 + 270, 300, 150 /* MCS14SG, MCS15SG, MCS7SG , 28 29 30*/
32805 + };
32806 +
32807 +const u16_t PERThreshold[] =
32808 + {
32809 + 100, 50, 50, 50, /* 1M, 2M, 5M, 11M , 0 1 2 3*/
32810 + 50, 50, 30, 30, /* 6M 9M 12M 18M , 4 5 6 7*/
32811 + 25, 25, 25, 20, /* 24M 36M 48M 54M , 8 9 10 11*/
32812 + 50, 50, 50, 40, /* MCS0 MCS1 MCS2 MCS3 , 12 13 14 15*/
32813 + 30, 30, 30, 30, /* MCS4 MCS5 MCS6 MCS7 , 16 17 18 19*/
32814 + 30, 30, 25, 25, /* MCS8 MCS9 MCS10 MCS11 , 20 21 22 23*/
32815 + 25, 25, 15, 15, /* MCS12 MCS13 MCS14 MCS15 , 24 25 26 27*/
32816 + 15, 15, 10 /* MCS14SG, MCS15SG , 28 29*/
32817 + };
32818 +
32819 +const u16_t FailDiff[] =
32820 + {
32821 + 40, 46, 40, 0, /* 1M, 2M, 5M, 11M , 0 1 2 3*/
32822 + 24, 17, 22, 16, /* 6M 9M 12M 18M , 4 5 6 7*/
32823 + 19, 13, 5, 0, /* 24M 36M 48M 54M , 8 9 10 11*/
32824 + 36, 22, 15, 19, /* MCS0 MCS1 MCS2 MCS3 , 12 13 14 15*/
32825 + 12, 5, 4, 7, /* MCS4 MCS5 MCS6 MCS7 , 16 17 18 19*/
32826 + 0, 0, 0, 0, /* MCS8 MCS9 MCS10 MCS11 , 20 21 22 23*/
32827 + 9, 4, 3, 3, /* MCS12 MCS13 MCS14 MCS15 , 24 25 26 27*/
32828 + 3, 0, 0 /* MCS14SG, MCS15SG , 28 29*/
32829 + };
32830 +
32831 +
32832 +#ifdef ZM_ENABLE_BA_RATECTRL
32833 +u32_t TxMPDU[29];
32834 +u32_t BAFail[29];
32835 +u32_t BAPER[29];
32836 +const u16_t BADiff[] =
32837 + {
32838 + 0, 0, 0, 0,
32839 + 0, 0, 0, 0,
32840 + 0, 0, 0, 0,
32841 + 361, 220, 151, 187,
32842 + 122, 48, 41, 65,
32843 + 0, 0, 0, 0,
32844 + 88, 33, 27, 25,
32845 + 0
32846 + };
32847 +#endif
32848 +
32849 +/************************************************************************/
32850 +/* */
32851 +/* FUNCTION DESCRIPTION zfRateCtrlInitCell */
32852 +/* Initialize rate control cell. */
32853 +/* */
32854 +/* INPUTS */
32855 +/* dev : device pointer */
32856 +/* type : 0=>11b, 1=>11a/g, 2=>11n, 3=>11n one Tx stream */
32857 +/* gBand : 1=>2.4G, 0=>5G */
32858 +/* */
32859 +/* OUTPUTS */
32860 +/* None */
32861 +/* */
32862 +/* AUTHOR */
32863 +/* Stephen Chen Atheros Communications, INC. 2007.2 */
32864 +/* */
32865 +/************************************************************************/
32866 +void zfRateCtrlInitCell(zdev_t* dev, struct zsRcCell* rcCell, u8_t type,
32867 + u8_t gBand, u8_t SG40)
32868 +{
32869 + u8_t i;
32870 + u8_t maxrate;
32871 + zmw_get_wlan_dev(dev);
32872 +
32873 + if (SG40) SG40 = 1;
32874 +
32875 + if (gBand != 0)
32876 + {
32877 + if (type == 1) //11g
32878 + {
32879 + for (i=0; i<4; i++) //1M 2M 5M 11M
32880 + {
32881 + rcCell->operationRateSet[i] = (u8_t)i;
32882 + }
32883 + for (i=4; i<10; i++) //12M 18M 24M 36M 48M 54M
32884 + {
32885 + rcCell->operationRateSet[i] = 2+i;
32886 + }
32887 + rcCell->operationRateCount = 10;
32888 + rcCell->currentRateIndex = 5; //18M
32889 + }
32890 + else if (type == 2) //11ng
32891 + {
32892 + if (wd->wlanMode == ZM_MODE_AP) //AP 11ng 40M
32893 + {
32894 + for (i=0; i<15; i++)
32895 + {
32896 + rcCell->operationRateSet[i] = zcHtRateTable[i][3];
32897 + }
32898 + if(!SG40) rcCell->operationRateSet[13] = 27;
32899 + rcCell->operationRateCount = 14+SG40;
32900 + rcCell->currentRateIndex = 10;
32901 + }
32902 + else //STA
32903 + {
32904 + if (wd->sta.htCtrlBandwidth == ZM_BANDWIDTH_40MHZ) //11ng 40M
32905 + {
32906 + for (i=0; i<15; i++)
32907 + {
32908 + rcCell->operationRateSet[i] = zcHtRateTable[i][3];
32909 + }
32910 + if(!SG40) rcCell->operationRateSet[13] = 27;
32911 + rcCell->operationRateCount = 14+SG40;
32912 + rcCell->currentRateIndex = 10;
32913 + }
32914 + else //11ng 20M
32915 + {
32916 + for (i=0; i<13; i++)
32917 + {
32918 + rcCell->operationRateSet[i] = zcHtRateTable[i][2];
32919 + }
32920 + rcCell->operationRateCount = 13;
32921 + rcCell->currentRateIndex = 9;
32922 + }
32923 + }
32924 + }
32925 + else if (type == 3) //11ng one Tx stream
32926 + {
32927 + if (wd->sta.htCtrlBandwidth == ZM_BANDWIDTH_40MHZ) //11ng 40M one Tx stream
32928 + {
32929 + if(SG40 != 0)
32930 + {
32931 + maxrate = 13;
32932 + }
32933 + else
32934 + {
32935 + maxrate = 12;
32936 + }
32937 + for (i=0; i<maxrate; i++)
32938 + {
32939 + rcCell->operationRateSet[i] = zcHtOneTxStreamRateTable[i][3];
32940 + }
32941 + rcCell->operationRateCount = i;
32942 + rcCell->currentRateIndex = ((i+1)*3)/4;
32943 + }
32944 + else //11ng 20M
32945 + {
32946 + for (i=0; i<11; i++)
32947 + {
32948 + rcCell->operationRateSet[i] = zcHtOneTxStreamRateTable[i][2];
32949 + }
32950 + rcCell->operationRateCount = i;
32951 + rcCell->currentRateIndex = ((i+1)*3)/4;
32952 + }
32953 + }
32954 + else //if (type == 0) //11b
32955 + {
32956 + for (i=0; i<4; i++)
32957 + {
32958 + rcCell->operationRateSet[i] = (u8_t)i;
32959 + }
32960 + rcCell->operationRateCount = 4;
32961 + rcCell->currentRateIndex = rcCell->operationRateCount-1;
32962 + }
32963 + }
32964 + else
32965 + {
32966 + if (type == 2) //11na
32967 + {
32968 + if (wd->wlanMode == ZM_MODE_AP) //AP 11na 40M
32969 + {
32970 + for (i=0; i<(12+SG40); i++)
32971 + {
32972 + rcCell->operationRateSet[i] = zcHtRateTable[i][1];
32973 + }
32974 + rcCell->operationRateCount = 12+SG40;
32975 + rcCell->currentRateIndex = 8;
32976 + }
32977 + else //STA
32978 + {
32979 + if (wd->sta.htCtrlBandwidth == ZM_BANDWIDTH_40MHZ) //11na 40M
32980 + {
32981 + for (i=0; i<(12+SG40); i++)
32982 + {
32983 + rcCell->operationRateSet[i] = zcHtRateTable[i][1];
32984 + }
32985 + rcCell->operationRateCount = 12+SG40;
32986 + rcCell->currentRateIndex = 8;
32987 + }
32988 + else //11na 20M
32989 + {
32990 + for (i=0; i<11; i++)
32991 + {
32992 + rcCell->operationRateSet[i] = zcHtRateTable[i][0];
32993 + }
32994 + rcCell->operationRateCount = 11;
32995 + rcCell->currentRateIndex = 7;
32996 + }
32997 + }
32998 + }
32999 + else if (type == 3) //11na one Tx stream
33000 + {
33001 + if (wd->sta.htCtrlBandwidth == ZM_BANDWIDTH_40MHZ) //11na 40M one Tx stream
33002 + {
33003 + if(SG40 != 0)
33004 + {
33005 + maxrate = 11;
33006 + }
33007 + else
33008 + {
33009 + maxrate = 10;
33010 + }
33011 + for (i=0; i<maxrate; i++)
33012 + {
33013 + rcCell->operationRateSet[i] = zcHtOneTxStreamRateTable[i][1];
33014 + }
33015 + rcCell->operationRateCount = i;
33016 + rcCell->currentRateIndex = ((i+1)*3)/4;
33017 + }
33018 + else //11ng 20M
33019 + {
33020 + for (i=0; i<9; i++)
33021 + {
33022 + rcCell->operationRateSet[i] = zcHtOneTxStreamRateTable[i][0];
33023 + }
33024 + rcCell->operationRateCount = i;
33025 + rcCell->currentRateIndex = ((i+1)*3)/4;
33026 + }
33027 + }
33028 + else //if (type == 1) //11a
33029 + {
33030 + for (i=0; i<8; i++) //6M 9M 12M 18M 24M 36M 48M 54M
33031 + {
33032 + rcCell->operationRateSet[i] = i+4;
33033 + }
33034 + rcCell->operationRateCount = 8;
33035 + rcCell->currentRateIndex = 4; //24M
33036 + }
33037 + }
33038 +
33039 + rcCell->flag = 0;
33040 + rcCell->txCount = 0;
33041 + rcCell->failCount = 0;
33042 + rcCell->currentRate = rcCell->operationRateSet[rcCell->currentRateIndex];
33043 + rcCell->lasttxCount = 0;
33044 + rcCell->lastTime = wd->tick;
33045 + rcCell->probingTime = wd->tick;
33046 + for (i=0; i<ZM_RATE_TABLE_SIZE; i++) {
33047 + wd->PER[i] = 0;
33048 + wd->txMPDU[i] = wd->txFail[i] = 0;
33049 + }
33050 + wd->probeCount = 0;
33051 + wd->probeInterval = 0;
33052 +#ifdef ZM_ENABLE_BA_RATECTRL
33053 + for (i=0; i<29; i++) {
33054 + TxMPDU[i]=0;
33055 + BAFail[i]=0;
33056 + BAPER[i]=0;
33057 + }
33058 +#endif
33059 + return;
33060 +}
33061 +
33062 +
33063 +/************************************************************************/
33064 +/* */
33065 +/* FUNCTION DESCRIPTION zfRateCtrlGetHigherRate */
33066 +/* Get a higher rate. */
33067 +/* */
33068 +/* INPUTS */
33069 +/* rcCell : rate control cell */
33070 +/* */
33071 +/* OUTPUTS */
33072 +/* rate */
33073 +/* */
33074 +/* AUTHOR */
33075 +/* Stephen Chen Atheros Communications, INC. 2007.2 */
33076 +/* */
33077 +/************************************************************************/
33078 +u8_t zfRateCtrlGetHigherRate(struct zsRcCell* rcCell)
33079 +{
33080 + u8_t rateIndex;
33081 +
33082 + rateIndex = rcCell->currentRateIndex
33083 + + (((rcCell->currentRateIndex+1) < rcCell->operationRateCount)?1:0);
33084 + return rcCell->operationRateSet[rateIndex];
33085 +}
33086 +
33087 +
33088 +/************************************************************************/
33089 +/* */
33090 +/* FUNCTION DESCRIPTION zfRateCtrlNextLowerRate */
33091 +/* Get a lower rate. */
33092 +/* */
33093 +/* INPUTS */
33094 +/* rcCell : rate control cell */
33095 +/* */
33096 +/* OUTPUTS */
33097 +/* rate */
33098 +/* */
33099 +/* AUTHOR */
33100 +/* Stephen Chen Atheros Communications, INC. 2007.2 */
33101 +/* */
33102 +/************************************************************************/
33103 +u8_t zfRateCtrlNextLowerRate(zdev_t* dev, struct zsRcCell* rcCell)
33104 +{
33105 + zmw_get_wlan_dev(dev);
33106 + if (rcCell->currentRateIndex > 0)
33107 + {
33108 + rcCell->currentRateIndex--;
33109 + rcCell->currentRate = rcCell->operationRateSet[rcCell->currentRateIndex];
33110 + }
33111 + zm_msg1_tx(ZM_LV_0, "Lower Tx Rate=", rcCell->currentRate);
33112 + //DbgPrint("Lower Tx Rate=%d", rcCell->currentRate);
33113 + rcCell->failCount = rcCell->txCount = 0;
33114 + rcCell->lasttxCount = 0;
33115 + rcCell->lastTime = wd->tick;
33116 + return rcCell->currentRate;
33117 +}
33118 +
33119 +
33120 +/************************************************************************/
33121 +/* */
33122 +/* FUNCTION DESCRIPTION zfRateCtrlRateDiff */
33123 +/* Rate difference. */
33124 +/* */
33125 +/* INPUTS */
33126 +/* rcCell : rate control cell */
33127 +/* retryRate : retry rate */
33128 +/* */
33129 +/* OUTPUTS */
33130 +/* rate difference */
33131 +/* */
33132 +/* AUTHOR */
33133 +/* Stephen Chen Atheros Communications, INC. 2007.2 */
33134 +/* */
33135 +/************************************************************************/
33136 +u8_t zfRateCtrlRateDiff(struct zsRcCell* rcCell, u8_t retryRate)
33137 +{
33138 + u16_t i;
33139 +
33140 + /* Find retryRate in operationRateSet[] */
33141 + for (i=0; i<rcCell->operationRateCount; i++)
33142 + {
33143 + if (retryRate == rcCell->operationRateSet[i])
33144 + {
33145 + if (i < rcCell->currentRateIndex)
33146 + {
33147 + return ((rcCell->currentRateIndex - i)+1)>>1;
33148 + }
33149 + else if (i == rcCell->currentRateIndex == 0)
33150 + {
33151 + return 1;
33152 + }
33153 + else
33154 + {
33155 + return 0;
33156 + }
33157 + }
33158 + }
33159 + /* TODO : retry rate not in operation rate set */
33160 + zm_msg1_tx(ZM_LV_0, "Not in operation rate set:", retryRate);
33161 + return 1;
33162 +
33163 +}
33164 +
33165 +u32_t zfRateCtrlUDPTP(zdev_t* dev, u16_t Rate, u32_t PER) {
33166 + if ((PER < 100) && (Rate > 0) && PER)
33167 + return 1168000/(((12304/Rate)+197)*(100+100*PER/(100-PER)));
33168 + else
33169 + return 0;
33170 +}
33171 +
33172 +u8_t zfRateCtrlFindMaxUDPTP(zdev_t* dev, struct zsRcCell* rcCell) {
33173 + u8_t i, maxIndex=0, rateIndex;
33174 + u32_t max=0, UDPThroughput;
33175 +
33176 + zmw_get_wlan_dev(dev);
33177 +
33178 + rateIndex = zm_agg_min(rcCell->currentRateIndex+3, rcCell->operationRateCount-1);
33179 + for (i=rcCell->currentRateIndex; i < rateIndex; i++) {
33180 + UDPThroughput = zfRateCtrlUDPTP(dev, zcRate[rcCell->operationRateSet[i]],
33181 + wd->PER[rcCell->operationRateSet[i]]);
33182 + if (max < UDPThroughput) {
33183 + max = UDPThroughput;
33184 + maxIndex = i;
33185 + }
33186 + }
33187 +
33188 + return rcCell->operationRateSet[maxIndex];
33189 +}
33190 +/************************************************************************/
33191 +/* */
33192 +/* FUNCTION DESCRIPTION zfRateCtrlGetTxRate */
33193 +/* Get transmission rate. */
33194 +/* */
33195 +/* INPUTS */
33196 +/* dev : device pointer */
33197 +/* rcCell : rate control cell */
33198 +/* probing : rate probing flag */
33199 +/* */
33200 +/* OUTPUTS */
33201 +/* Tx rate */
33202 +/* */
33203 +/* AUTHOR */
33204 +/* Stephen Chen Atheros Communications, INC. 2007.2 */
33205 +/* */
33206 +/************************************************************************/
33207 +u16_t zfRateCtrlGetTxRate(zdev_t* dev, struct zsRcCell* rcCell, u16_t* probing)
33208 +{
33209 + u8_t newRate, highRate;
33210 + zmw_get_wlan_dev(dev);
33211 +
33212 + zm_msg1_tx(ZM_LV_3, "txCount=", rcCell->txCount);
33213 + zm_msg1_tx(ZM_LV_3, "probingTime=", rcCell->probingTime);
33214 + zm_msg1_tx(ZM_LV_3, "tick=", wd->tick);
33215 + *probing = 0;
33216 + newRate = rcCell->currentRate;
33217 +
33218 + if (wd->probeCount && (wd->probeCount < wd->success_probing))
33219 + {
33220 + if (wd->probeInterval < 50)
33221 + {
33222 + wd->probeInterval++;
33223 + }
33224 + else
33225 + {
33226 + wd->probeInterval++;
33227 + if (wd->probeInterval > 52) //probe 51, 52, 53 three packets every 50 packets
33228 + {
33229 + wd->probeInterval = 0;
33230 + }
33231 + newRate=zfRateCtrlGetHigherRate(rcCell);
33232 + *probing = 1;
33233 + wd->probeCount++;
33234 + rcCell->probingTime = wd->tick;
33235 + }
33236 + }
33237 + /* Accumulate at least 1000ms and 8 packets or Accumulate over 1K packets */
33238 + else if ((((wd->tick - rcCell->probingTime) > (ZM_RATE_CTRL_PROBING_INTERVAL_MS/ZM_MS_PER_TICK))
33239 + && (rcCell->txCount >= ZM_RATE_CTRL_MIN_PROBING_PACKET))
33240 + || (rcCell->txCount >= 1000))
33241 + {
33242 +#ifndef ZM_DISABLE_RATE_CTRL
33243 + /* PER = fail/total */
33244 + wd->probeCount = 0;
33245 + wd->probeSuccessCount = 0;
33246 + if (wd->txMPDU[rcCell->currentRate] != 0) {
33247 + wd->PER[rcCell->currentRate] = zm_agg_min(100,
33248 + (wd->txFail[rcCell->currentRate]*100)/wd->txMPDU[rcCell->currentRate]);
33249 + if (!wd->PER[rcCell->currentRate]) wd->PER[rcCell->currentRate] ++;
33250 + }
33251 +
33252 + /* if PER < threshold, do rate probing, return probing rate */
33253 + if ((wd->PER[rcCell->currentRate] <= (ZM_RATE_PROBING_THRESHOLD+15)) ||
33254 + ((rcCell->currentRate <= 16) &&
33255 + ((wd->PER[rcCell->currentRate]/2) <= ZM_RATE_PROBING_THRESHOLD)))
33256 + {
33257 + if ((newRate=zfRateCtrlGetHigherRate(rcCell)) != rcCell->currentRate)
33258 + {
33259 + *probing = 1;
33260 + wd->probeCount++;
33261 + wd->probeInterval = 0;
33262 + wd->success_probing =
33263 + (rcCell->currentRate <= 16)? (ZM_RATE_SUCCESS_PROBING/2) : ZM_RATE_SUCCESS_PROBING;
33264 + //DbgPrint("Start Probing");
33265 + zm_msg1_tx(ZM_LV_0, "Probing Rate=", newRate);
33266 + }
33267 + }
33268 +#endif
33269 +
33270 + zm_msg0_tx(ZM_LV_1, "Diminish counter");
33271 + rcCell->failCount = rcCell->failCount>>1;
33272 + rcCell->txCount = rcCell->txCount>>1;
33273 + wd->txFail[rcCell->currentRate] = wd->txFail[rcCell->currentRate] >> 1;
33274 + wd->txMPDU[rcCell->currentRate] = wd->txMPDU[rcCell->currentRate] >> 1;
33275 +
33276 +
33277 + if (rcCell->currentRate > 15) {
33278 + highRate = zfRateCtrlGetHigherRate(rcCell);
33279 + if ((highRate != rcCell->currentRate) && wd->PER[highRate] &&
33280 + ((wd->PER[rcCell->currentRate] + FailDiff[rcCell->currentRate]) >
33281 + wd->PER[highRate])) {
33282 + //DbgPrint("PER compare force raise rate to %d", highRate);
33283 + wd->probeSuccessCount = wd->probeCount = ZM_RATE_SUCCESS_PROBING;
33284 + zfRateCtrlTxSuccessEvent(dev, rcCell, highRate);
33285 + }
33286 + }
33287 + else {
33288 + highRate = zfRateCtrlFindMaxUDPTP(dev, rcCell);
33289 + if (rcCell->currentRate < highRate) {
33290 + //DbgPrint("UDP Throughput compare force raise rate to %d", highRate);
33291 + wd->probeSuccessCount = wd->probeCount = ZM_RATE_SUCCESS_PROBING;
33292 + zfRateCtrlTxSuccessEvent(dev, rcCell, highRate);
33293 + }
33294 + }
33295 + rcCell->probingTime = wd->tick;
33296 + }
33297 +
33298 + if( (wd->tick > 1000)
33299 + && ((wd->tick - rcCell->lastTime) > 3840) )
33300 + {
33301 + if (rcCell->lasttxCount < 70)
33302 + {
33303 + rcCell->failCount = rcCell->failCount>>1;
33304 + rcCell->txCount = rcCell->txCount>>1;
33305 + wd->txFail[rcCell->currentRate] = wd->txFail[rcCell->currentRate] >> 1;
33306 + wd->txMPDU[rcCell->currentRate] = wd->txMPDU[rcCell->currentRate] >> 1;
33307 +
33308 + rcCell->failCount = (rcCell->failCount < rcCell->txCount)?
33309 + rcCell->failCount : rcCell->txCount;
33310 + wd->txFail[rcCell->currentRate] = (wd->txFail[rcCell->currentRate] < wd->txMPDU[rcCell->currentRate])?
33311 + wd->txFail[rcCell->currentRate] : wd->txMPDU[rcCell->currentRate];
33312 + }
33313 +
33314 + rcCell->lastTime = wd->tick;
33315 + rcCell->lasttxCount = 0;
33316 + }
33317 +
33318 + rcCell->txCount++;
33319 + rcCell->lasttxCount++;
33320 + wd->txMPDU[rcCell->currentRate]++;
33321 + zm_msg1_tx(ZM_LV_1, "Get Tx Rate=", newRate);
33322 + return newRate;
33323 +}
33324 +
33325 +
33326 +/************************************************************************/
33327 +/* */
33328 +/* FUNCTION DESCRIPTION zfRateCtrlTxFailEvent */
33329 +/* Tx fail event. Calculate PER and lower Tx rate if under */
33330 +/* PER under threshold. */
33331 +/* */
33332 +/* INPUTS */
33333 +/* rcCell : rate control cell */
33334 +/* retryRate : retry rate */
33335 +/* */
33336 +/* OUTPUTS */
33337 +/* None */
33338 +/* */
33339 +/* AUTHOR */
33340 +/* Stephen Chen Atheros Communications, INC. 2007.2 */
33341 +/* */
33342 +/************************************************************************/
33343 +void zfRateCtrlTxFailEvent(zdev_t* dev, struct zsRcCell* rcCell, u8_t aggRate, u32_t retryRate)
33344 +{
33345 + zmw_get_wlan_dev(dev);
33346 +
33347 + zmw_declare_for_critical_section();
33348 +
33349 +#ifndef ZM_DISABLE_RATE_CTRL
33350 + //DbgPrint("aggRate=%d, retryRate=%d", aggRate, retryRate);
33351 + if (aggRate && (aggRate != rcCell->currentRate)) {
33352 + wd->txFail[aggRate] += retryRate;
33353 + return;
33354 + }
33355 +
33356 + if (!aggRate) {
33357 + retryRate = (zfRateCtrlRateDiff(rcCell, (u8_t)retryRate)+1)>>1;
33358 + if (rcCell->currentRate <12) //legacy rate
33359 + {
33360 + retryRate*=2;
33361 + }
33362 + }
33363 + rcCell->failCount += retryRate;
33364 + wd->txFail[rcCell->currentRate] += retryRate;
33365 +
33366 + //DbgPrint("failCount=%d", rcCell->failCount);
33367 + if (rcCell->failCount > ZM_MIN_RATE_FAIL_COUNT)
33368 + {
33369 + if (wd->txMPDU[rcCell->currentRate] != 0) {
33370 + wd->PER[rcCell->currentRate] = zm_agg_min(100,
33371 + (wd->txFail[rcCell->currentRate]*100)/wd->txMPDU[rcCell->currentRate]);
33372 + if (!wd->PER[rcCell->currentRate]) wd->PER[rcCell->currentRate] ++;
33373 + }
33374 + //zm_msg1_tx(ZM_LV_1, "PER=", per);
33375 + //DbgPrint("PER=%d, txFail=%d, txMPDU=%d", wd->PER[rcCell->currentRate], wd->txFail[rcCell->currentRate], wd->txMPDU[rcCell->currentRate]);
33376 + if (wd->PER[rcCell->currentRate] > PERThreshold[rcCell->currentRate])
33377 + {
33378 + /* Lower Tx Rate if PER < THRESHOLD */
33379 + zfRateCtrlNextLowerRate(dev, rcCell);
33380 + rcCell->flag |= ZM_RC_TRAINED_BIT;
33381 +
33382 + // Resolve compatibility problem with Marvell
33383 + if(rcCell->currentRate == 15)
33384 + {
33385 + zmw_leave_critical_section(dev);
33386 + zfHpSetAggPktNum(dev, 8);
33387 + zmw_enter_critical_section(dev);
33388 + }
33389 +
33390 + wd->txFail[rcCell->currentRate] = wd->txFail[rcCell->currentRate] >> 1;
33391 + wd->txMPDU[rcCell->currentRate] = wd->txMPDU[rcCell->currentRate] >> 1;
33392 +
33393 + wd->probeCount = wd->probeSuccessCount = 0;
33394 + }
33395 + }
33396 +
33397 +#endif
33398 + return;
33399 +}
33400 +
33401 +
33402 +/************************************************************************/
33403 +/* */
33404 +/* FUNCTION DESCRIPTION zfRateCtrlTxSuccessEvent */
33405 +/* Tx success event. Raise Tx rate because rate probing success. */
33406 +/* */
33407 +/* INPUTS */
33408 +/* rcCell : rate control cell */
33409 +/* successRate : success rate */
33410 +/* */
33411 +/* OUTPUTS */
33412 +/* None */
33413 +/* */
33414 +/* AUTHOR */
33415 +/* Stephen Chen Atheros Communications, INC. 2007.2 */
33416 +/* */
33417 +/************************************************************************/
33418 +void zfRateCtrlTxSuccessEvent(zdev_t* dev, struct zsRcCell* rcCell, u8_t successRate)
33419 +{
33420 + /* Raise Tx Rate */
33421 + u16_t i, PERProbe;
33422 + u16_t pcount;
33423 + zmw_get_wlan_dev(dev);
33424 +
33425 + zmw_declare_for_critical_section();
33426 +
33427 + //DbgPrint("Probing successRate=%d", successRate);
33428 + /* Find successRate in operationRateSet[] */
33429 + wd->probeSuccessCount++;
33430 + if (wd->probeCount < wd->success_probing)
33431 + {
33432 + return;
33433 + }
33434 +
33435 + pcount = wd->probeCount;
33436 + if (pcount != 0)
33437 + {
33438 + PERProbe = wd->probeSuccessCount * 100 / pcount;
33439 + }
33440 + else
33441 + {
33442 + PERProbe = 1;
33443 + }
33444 +
33445 + if (PERProbe < ((rcCell->currentRate < 16)? 80:100))
33446 + {
33447 + return;
33448 + }
33449 + //DbgPrint("wd->probeCount=%d, wd->probeSuccessCount=%d", wd->probeCount, wd->probeSuccessCount);
33450 + wd->probeCount = wd->probeSuccessCount = 0;
33451 + for (i=0; i<rcCell->operationRateCount; i++)
33452 + {
33453 + if (successRate == rcCell->operationRateSet[i])
33454 + {
33455 + if (i > rcCell->currentRateIndex)
33456 + {
33457 + /* Raise current Tx rate */
33458 + zm_msg1_tx(ZM_LV_0, "Raise Tx Rate=", successRate);
33459 + //DbgPrint("Raise Tx Rate=%d", successRate);
33460 +
33461 + // Resolve compatibility problem with Marvell
33462 + if((rcCell->currentRate <= 15) && (successRate > 15))
33463 + {
33464 + zmw_leave_critical_section(dev);
33465 + zfHpSetAggPktNum(dev, 16);
33466 + zmw_enter_critical_section(dev);
33467 + }
33468 +
33469 + rcCell->currentRate = successRate;
33470 + rcCell->currentRateIndex = (u8_t)i;
33471 + rcCell->failCount = rcCell->txCount = 0;
33472 + rcCell->lasttxCount = 0;
33473 + rcCell->lastTime = wd->tick;
33474 + wd->txFail[rcCell->currentRate] = wd->txFail[rcCell->currentRate] >> 1;
33475 + wd->txMPDU[rcCell->currentRate] = wd->txMPDU[rcCell->currentRate] >> 1;
33476 + }
33477 + }
33478 + }
33479 +
33480 + return;
33481 +}
33482 +
33483 +
33484 +/************************************************************************/
33485 +/* */
33486 +/* FUNCTION DESCRIPTION zfRateCtrlRxRssiEvent */
33487 +/* Rx RSSI event. Calculate RSSI moving average, accelarate */
33488 +/* rate probing if RSSI variation over threshold. */
33489 +/* */
33490 +/* INPUTS */
33491 +/* rcCell : rate control cell */
33492 +/* successRate : success rate */
33493 +/* */
33494 +/* OUTPUTS */
33495 +/* None */
33496 +/* */
33497 +/* AUTHOR */
33498 +/* Stephen Chen Atheros Communications, INC. 2007.2 */
33499 +/* */
33500 +/************************************************************************/
33501 +void zfRateCtrlRxRssiEvent(struct zsRcCell* rcCell, u16_t rxRssi)
33502 +{
33503 + /* if delta(rcCell->rxRssi, rxRssi) > ZM_RATE_CTRL_RSSI_VARIATION */
33504 + if ((rcCell->rxRssi - rxRssi) > ZM_RATE_CTRL_RSSI_VARIATION)
33505 + {
33506 + /* Accelerate rate probing via decreaing rcCell->probingTime */
33507 + rcCell->probingTime -= ZM_RATE_CTRL_PROBING_INTERVAL_MS/ZM_MS_PER_TICK;
33508 + }
33509 +
33510 + /* Update RSSI moving average */
33511 + rcCell->rxRssi = (((rcCell->rxRssi*7) + rxRssi)+4) >> 3;
33512 + return;
33513 +}
33514 +
33515 +
33516 +#ifdef ZM_ENABLE_BA_RATECTRL
33517 +u8_t HigherRate(u8_t Rate) {
33518 + if (Rate < 28) Rate++; //28=MCS15SG, 27=MCS15, 26=MCS14, 25=MCS13
33519 + if (Rate > 28) Rate = 28;
33520 + while ((Rate >= 20) && (Rate <= 23)) {
33521 + Rate ++;
33522 + }
33523 + return Rate;
33524 +}
33525 +
33526 +u8_t LowerRate(u8_t Rate) {
33527 + if (Rate > 1) Rate--;
33528 + while ((Rate >= 20) && (Rate <= 23)) {
33529 + Rate --;
33530 + }
33531 + return Rate;
33532 +}
33533 +
33534 +u8_t RateMapToRateIndex(u8_t Rate, struct zsRcCell* rcCell) {
33535 + u8_t i;
33536 + for (i=0; i<rcCell->operationRateCount; i++) {
33537 + if (Rate == rcCell->operationRateSet[i]) {
33538 + return i;
33539 + }
33540 + }
33541 + return 0;
33542 +}
33543 +
33544 +void zfRateCtrlAggrSta(zdev_t* dev) {
33545 + u8_t RateIndex, Rate;
33546 + u8_t HRate;
33547 + u8_t LRate;
33548 + u32_t RateCtrlTxMPDU, RateCtrlBAFail;
33549 + zmw_get_wlan_dev(dev);
33550 +
33551 + RateIndex = wd->sta.oppositeInfo[0].rcCell.currentRateIndex;
33552 + Rate = wd->sta.oppositeInfo[0].rcCell.operationRateSet[RateIndex];
33553 +
33554 + TxMPDU[Rate] = (TxMPDU[Rate] / 5) + (wd->commTally.RateCtrlTxMPDU * 4 / 5);
33555 + BAFail[Rate] = (BAFail[Rate] / 5) + (wd->commTally.RateCtrlBAFail * 4 / 5);
33556 + RateCtrlTxMPDU = wd->commTally.RateCtrlTxMPDU;
33557 + RateCtrlBAFail = wd->commTally.RateCtrlBAFail;
33558 + wd->commTally.RateCtrlTxMPDU = 0;
33559 + wd->commTally.RateCtrlBAFail = 0;
33560 + if (TxMPDU[Rate] > 0) {
33561 + BAPER[Rate] = BAFail[Rate] * 1000 / TxMPDU[Rate]; //PER*1000
33562 + BAPER[Rate] = (BAPER[Rate]>0)? BAPER[Rate]:1;
33563 + }
33564 + else {
33565 + return;
33566 + }
33567 +
33568 + HRate = HigherRate(Rate);
33569 + LRate = LowerRate(Rate);
33570 + if (BAPER[Rate]>200) {
33571 + if ((RateCtrlTxMPDU > 100) && (BAPER[Rate]<300) && (HRate != Rate) && BAPER[HRate] &&
33572 + (BAPER[HRate] < BAPER[Rate] + BADiff[Rate])) {
33573 + Rate = HRate;
33574 + //DbgPrint("Rate improved to %d", Rate);
33575 + }
33576 + else {
33577 + Rate = LRate;
33578 + //DbgPrint("Rate decreased to %d", Rate);
33579 + }
33580 + }
33581 + else if (BAPER[Rate] && BAPER[Rate]<100) {
33582 + if (RateCtrlTxMPDU > 100) {
33583 + Rate = HRate;
33584 + //DbgPrint("Rate improved to %d", Rate);
33585 + }
33586 + }
33587 + wd->sta.oppositeInfo[0].rcCell.currentRate = Rate;
33588 + wd->sta.oppositeInfo[0].rcCell.currentRateIndex = RateMapToRateIndex(Rate, &wd->sta.oppositeInfo[0].rcCell);
33589 +}
33590 +#endif
33591 --- /dev/null
33592 +++ b/drivers/staging/otus/80211core/ratectrl.h
33593 @@ -0,0 +1,37 @@
33594 +/*
33595 + * Copyright (c) 2007-2008 Atheros Communications Inc.
33596 + *
33597 + * Permission to use, copy, modify, and/or distribute this software for any
33598 + * purpose with or without fee is hereby granted, provided that the above
33599 + * copyright notice and this permission notice appear in all copies.
33600 + *
33601 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
33602 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
33603 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
33604 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
33605 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
33606 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
33607 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
33608 + */
33609 +
33610 +#ifndef _RATECTRL_H
33611 +#define _RATECTRL_H
33612 +
33613 +#define ZM_RATE_CTRL_PROBING_INTERVAL_MS 1000 //1000ms
33614 +#define ZM_RATE_CTRL_MIN_PROBING_PACKET 8
33615 +
33616 +#define ZM_MIN_RATE_FAIL_COUNT 20
33617 +
33618 +#define ZM_RATE_PROBING_THRESHOLD 15 //6%
33619 +#define ZM_RATE_SUCCESS_PROBING 10
33620 +
33621 +#define ZM_RATE_CTRL_RSSI_VARIATION 5 //TBD
33622 +
33623 +extern const u32_t zcRateToPhyCtrl[];
33624 +
33625 +extern void zfRateCtrlInitCell(zdev_t* dev, struct zsRcCell* rcCell, u8_t type, u8_t gBand, u8_t SG40);
33626 +extern u16_t zfRateCtrlGetTxRate(zdev_t* dev, struct zsRcCell* rcCell, u16_t* probing);
33627 +extern void zfRateCtrlTxFailEvent(zdev_t* dev, struct zsRcCell* rcCell, u8_t aggRate, u32_t retryRate);
33628 +extern void zfRateCtrlTxSuccessEvent(zdev_t* dev, struct zsRcCell* rcCell, u8_t successRate);
33629 +extern void zfRateCtrlAggrSta(zdev_t* dev);
33630 +#endif
33631 --- /dev/null
33632 +++ b/drivers/staging/otus/80211core/struct.h
33633 @@ -0,0 +1,1315 @@
33634 +/*
33635 + * Copyright (c) 2007-2008 Atheros Communications Inc.
33636 + *
33637 + * Permission to use, copy, modify, and/or distribute this software for any
33638 + * purpose with or without fee is hereby granted, provided that the above
33639 + * copyright notice and this permission notice appear in all copies.
33640 + *
33641 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
33642 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
33643 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
33644 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
33645 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
33646 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
33647 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
33648 + */
33649 +
33650 +#ifndef _STRUCT_H
33651 +#define _STRUCT_H
33652 +
33653 +#include "../oal_marc.h"
33654 +
33655 +#define ZM_SW_LOOP_BACK 0 /* 1=>enable, 0=>disable */
33656 +#define ZM_PCI_LOOP_BACK 0 /* 1=>enable, 0=>disable */
33657 +#define ZM_PROTOCOL_RESPONSE_SIMULATION 0
33658 +
33659 +#define ZM_RX_FRAME_SIZE 1600
33660 +
33661 +extern const u8_t zg11bRateTbl[4];
33662 +extern const u8_t zg11gRateTbl[8];
33663 +
33664 +#define ZM_DRIVER_CORE_MAJOR_VERSION 1
33665 +#define ZM_DRIVER_CORE_MINOR_VERSION 1
33666 +#define ZM_DRIVER_CORE_BRANCH_MAJOR_VERSION 3
33667 +#define ZM_DRIVER_CORE_BRANCH_MINOR_VERSION 39
33668 +
33669 +#ifndef ZM_VTXQ_SIZE
33670 +#define ZM_VTXQ_SIZE 1024 //2^N
33671 +#endif
33672 +
33673 +#define ZM_VTXQ_SIZE_MASK (ZM_VTXQ_SIZE-1)
33674 +#define ZM_VMMQ_SIZE 8 //2^N
33675 +#define ZM_VMMQ_SIZE_MASK (ZM_VMMQ_SIZE-1)
33676 +
33677 +#include "cagg.h"
33678 +
33679 +#define ZM_AGG_POOL_SIZE 20
33680 +#define ZM_RATE_TABLE_SIZE 32
33681 +
33682 +#define ZM_MAX_BUF_DISCRETE_NUMBER 5
33683 +
33684 +
33685 +
33686 +
33687 +
33688 +
33689 +
33690 +
33691 +
33692 +/**********************************************************************************/
33693 +/* IBSS macros */
33694 +/**********************************************************************************/
33695 +#define ZM_IBSS_PEER_ALIVE_COUNTER 4
33696 +
33697 +/**********************************************************************************/
33698 +/* BIT mapping related macros */
33699 +/**********************************************************************************/
33700 +
33701 +#define ZM_BIT_0 0x1
33702 +#define ZM_BIT_1 0x2
33703 +#define ZM_BIT_2 0x4
33704 +#define ZM_BIT_3 0x8
33705 +#define ZM_BIT_4 0x10
33706 +#define ZM_BIT_5 0x20
33707 +#define ZM_BIT_6 0x40
33708 +#define ZM_BIT_7 0x80
33709 +#define ZM_BIT_8 0x100
33710 +#define ZM_BIT_9 0x200
33711 +#define ZM_BIT_10 0x400
33712 +#define ZM_BIT_11 0x800
33713 +#define ZM_BIT_12 0x1000
33714 +#define ZM_BIT_13 0x2000
33715 +#define ZM_BIT_14 0x4000
33716 +#define ZM_BIT_15 0x8000
33717 +#define ZM_BIT_16 0x10000
33718 +#define ZM_BIT_17 0x20000
33719 +#define ZM_BIT_18 0x40000
33720 +#define ZM_BIT_19 0x80000
33721 +#define ZM_BIT_20 0x100000
33722 +#define ZM_BIT_21 0x200000
33723 +#define ZM_BIT_22 0x400000
33724 +#define ZM_BIT_23 0x800000
33725 +#define ZM_BIT_24 0x1000000
33726 +#define ZM_BIT_25 0x2000000
33727 +#define ZM_BIT_26 0x4000000
33728 +#define ZM_BIT_27 0x8000000
33729 +#define ZM_BIT_28 0x10000000
33730 +#define ZM_BIT_29 0x20000000 //WPA support
33731 +#define ZM_BIT_30 0x40000000
33732 +#define ZM_BIT_31 0x80000000
33733 +
33734 +
33735 +/**********************************************************************************/
33736 +/* MAC address related macros */
33737 +/**********************************************************************************/
33738 +#define ZM_MAC_BYTE_TO_WORD(macb, macw) macw[0] = macb[0] + (macb[1] << 8); \
33739 + macw[1] = macb[2] + (macb[3] << 8); \
33740 + macw[2] = macb[4] + (macb[5] << 8);
33741 +
33742 +#define ZM_MAC_WORD_TO_BYTE(macw, macb) macb[0] = (u8_t) (macw[0] & 0xff); \
33743 + macb[1] = (u8_t) (macw[0] >> 8); \
33744 + macb[2] = (u8_t) (macw[1] & 0xff); \
33745 + macb[3] = (u8_t) (macw[1] >> 8); \
33746 + macb[4] = (u8_t) (macw[2] & 0xff); \
33747 + macb[5] = (u8_t) (macw[2] >> 8);
33748 +
33749 +#define ZM_MAC_0(macw) ((u8_t)(macw[0] & 0xff))
33750 +#define ZM_MAC_1(macw) ((u8_t)(macw[0] >> 8))
33751 +#define ZM_MAC_2(macw) ((u8_t)(macw[1] & 0xff))
33752 +#define ZM_MAC_3(macw) ((u8_t)(macw[1] >> 8))
33753 +#define ZM_MAC_4(macw) ((u8_t)(macw[2] & 0xff))
33754 +#define ZM_MAC_5(macw) ((u8_t)(macw[2] >> 8))
33755 +
33756 +#define ZM_IS_MULTICAST_OR_BROADCAST(mac) (mac[0] & 0x01)
33757 +#define ZM_IS_MULTICAST(mac) ((mac[0] & 0x01) && (((u8_t)mac[0]) != 0xFF))
33758 +
33759 +#define ZM_MAC_EQUAL(mac1, mac2) ((mac1[0]==mac2[0])&&(mac1[1]==mac2[1])&&(mac1[2]==mac2[2]))
33760 +#define ZM_MAC_NOT_EQUAL(mac1, mac2) ((mac1[0]!=mac2[0])||(mac1[1]!=mac2[1])||(mac1[2]!=mac2[2]))
33761 +/**********************************************************************************/
33762 +/* MAC address related mac'ros (end) */
33763 +/**********************************************************************************/
33764 +#define ZM_BYTE_TO_WORD(A, B) ((A<<8)+B)
33765 +#define ZM_ROL32( A, n ) \
33766 + ( ((A) << (n)) | ( ((A)>>(32-(n))) & ( (1UL << (n)) - 1 ) ) )
33767 +#define ZM_ROR32( A, n ) ZM_ROL32( (A), 32-(n) )
33768 +#define ZM_LO8(v16) ((u8_t)((v16) & 0xFF))
33769 +#define ZM_HI8(v16) ((u8_t)(((v16)>>8)&0xFF))
33770 +
33771 +#ifdef ZM_ENABLE_BUFFER_TRACE
33772 +extern void zfwBufTrace(zdev_t* dev, zbuf_t *buf, u8_t *functionName);
33773 +#define ZM_BUFFER_TRACE(dev, buf) zfwBufTrace(dev, buf, __FUNCTION__);
33774 +#else
33775 +#define ZM_BUFFER_TRACE(dev, buf)
33776 +#endif
33777 +
33778 +/* notification events to heart beat function */
33779 +#define ZM_BSSID_LIST_SCAN 0x01
33780 +
33781 +/* CAM mode */
33782 +#define ZM_CAM_AP 0x1
33783 +#define ZM_CAM_STA 0x2
33784 +#define ZM_CAM_HOST 0x4
33785 +
33786 +/* finite state machine for adapter */
33787 +#define ZM_STA_STATE_DISCONNECT 1
33788 +#define ZM_STA_STATE_CONNECTING 2
33789 +#define ZM_STA_STATE_CONNECTED 3
33790 +
33791 +/* Event definitions for finite state machine */
33792 +#define ZM_EVENT_TIMEOUT_SCAN 0x0000
33793 +#define ZM_EVENT_TIMEOUT_BG_SCAN 0x0001
33794 +#define ZN_EVENT_TIMEOUT_RECONNECT 0x0002
33795 +#define ZM_EVENT_TIMEOUT_INIT_SCAN 0x0003
33796 +#define ZM_EVENT_TIMEOUT_AUTH 0x0004
33797 +#define ZM_EVENT_TIMEOUT_ASSO 0x0005
33798 +#define ZM_EVENT_TIMEOUT_AUTO_SCAN 0x0006
33799 +#define ZM_EVENT_TIMEOUT_MIC_FAIL 0x0007
33800 +#define ZM_EVENT_TIMEOUT_CHECK_AP 0x0008
33801 +#define ZM_EVENT_CONNECT 0x0009
33802 +#define ZM_EVENT_INIT_SCAN 0x000a
33803 +#define ZM_EVENT_SCAN 0x000b
33804 +#define ZM_EVENT_BG_SCAN 0x000c
33805 +#define ZM_EVENT_DISCONNECT 0x000d
33806 +#define ZM_EVENT_WPA_MIC_FAIL 0x000e
33807 +#define ZM_EVENT_AP_ALIVE 0x000f
33808 +#define ZM_EVENT_CHANGE_TO_AP 0x0010
33809 +#define ZM_EVENT_CHANGE_TO_STA 0x0011
33810 +#define ZM_EVENT_IDLE 0x0012
33811 +#define ZM_EVENT_AUTH 0x0013
33812 +#define ZM_EVENT_ASSO_RSP 0x0014
33813 +#define ZM_EVENT_WPA_PK_OK 0x0015
33814 +#define ZM_EVENT_WPA_GK_OK 0x0016
33815 +#define ZM_EVENT_RCV_BEACON 0x0017
33816 +#define ZM_EVENT_RCV_PROBE_RSP 0x0018
33817 +#define ZM_EVENT_SEND_DATA 0x0019
33818 +#define ZM_EVENT_AUTO_SCAN 0x001a
33819 +#define ZM_EVENT_MIC_FAIL1 0x001d
33820 +#define ZM_EVENT_MIC_FAIL2 0x001e
33821 +#define ZM_EVENT_IBSS_MONITOR 0x001f
33822 +#define ZM_EVENT_IN_SCAN 0x0020
33823 +#define ZM_EVENT_CM_TIMER 0x0021
33824 +#define ZM_EVENT_CM_DISCONNECT 0x0022
33825 +#define ZM_EVENT_CM_BLOCK_TIMER 0x0023
33826 +#define ZM_EVENT_TIMEOUT_ADDBA 0x0024
33827 +#define ZM_EVENT_TIMEOUT_PERFORMANCE 0x0025
33828 +#define ZM_EVENT_SKIP_COUNTERMEASURE 0x0026
33829 +#define ZM_EVENT_NONE 0xffff
33830 +
33831 +/* Actions after call finite state machine */
33832 +#define ZM_ACTION_NONE 0x0000
33833 +#define ZM_ACTION_QUEUE_DATA 0x0001
33834 +#define ZM_ACTION_DROP_DATA 0x0002
33835 +
33836 +/* Timers for finite state machine */
33837 +#define ZM_TICK_ZERO 0
33838 +#define ZM_TICK_INIT_SCAN_END 8
33839 +#define ZM_TICK_NEXT_BG_SCAN 50
33840 +#define ZM_TICK_BG_SCAN_END 8
33841 +#define ZM_TICK_AUTH_TIMEOUT 4
33842 +#define ZM_TICK_ASSO_TIMEOUT 4
33843 +#define ZM_TICK_AUTO_SCAN 300
33844 +#define ZM_TICK_MIC_FAIL_TIMEOUT 6000
33845 +#define ZM_TICK_CHECK_AP1 150
33846 +#define ZM_TICK_CHECK_AP2 350
33847 +#define ZM_TICK_CHECK_AP3 250
33848 +#define ZM_TICK_IBSS_MONITOR 160
33849 +#define ZM_TICK_IN_SCAN 4
33850 +#define ZM_TICK_CM_TIMEOUT 6000
33851 +#define ZM_TICK_CM_DISCONNECT 200
33852 +#define ZM_TICK_CM_BLOCK_TIMEOUT 6000
33853 +
33854 +/* Fix bug#33338 Counter Measure Issur */
33855 +#ifdef NDIS_CM_FOR_XP
33856 +#define ZM_TICK_CM_TIMEOUT_OFFSET 2160
33857 +#define ZM_TICK_CM_DISCONNECT_OFFSET 72
33858 +#define ZM_TICK_CM_BLOCK_TIMEOUT_OFFSET 2160
33859 +#else
33860 +#define ZM_TICK_CM_TIMEOUT_OFFSET 0
33861 +#define ZM_TICK_CM_DISCONNECT_OFFSET 0
33862 +#define ZM_TICK_CM_BLOCK_TIMEOUT_OFFSET 0
33863 +#endif
33864 +
33865 +#define ZM_TIME_ACTIVE_SCAN 30 //ms
33866 +#define ZM_TIME_PASSIVE_SCAN 110 //ms
33867 +
33868 +/* finite state machine for BSS connect */
33869 +#define ZM_STA_CONN_STATE_NONE 0
33870 +#define ZM_STA_CONN_STATE_AUTH_OPEN 1
33871 +#define ZM_STA_CONN_STATE_AUTH_SHARE_1 2
33872 +#define ZM_STA_CONN_STATE_AUTH_SHARE_2 3
33873 +#define ZM_STA_CONN_STATE_ASSOCIATE 4
33874 +#define ZM_STA_CONN_STATE_SSID_NOT_FOUND 5
33875 +#define ZM_STA_CONN_STATE_AUTH_COMPLETED 6
33876 +
33877 +/* finite state machine for WPA handshaking */
33878 +#define ZM_STA_WPA_STATE_INIT 0
33879 +#define ZM_STA_WPA_STATE_PK_OK 1
33880 +#define ZM_STA_WPA_STATE_GK_OK 2
33881 +
33882 +/* various timers */
33883 +#define ZM_INTERVAL_CONNECT_TIMEOUT 20 /* 200 milisecond */
33884 +
33885 +/* IBSS definitions */
33886 +#define ZM_IBSS_PARTNER_LOST 0
33887 +#define ZM_IBSS_PARTNER_ALIVE 1
33888 +#define ZM_IBSS_PARTNER_CHECK 2
33889 +
33890 +#define ZM_BCMC_ARRAY_SIZE 16 /* Must be 2^N */
33891 +#define ZM_UNI_ARRAY_SIZE 16 /* Must be 2^N */
33892 +
33893 +#define ZM_MAX_DEFRAG_ENTRIES 4 /* 2^N */
33894 +#define ZM_DEFRAG_AGING_TIME_SEC 5 /* 5 seconds */
33895 +
33896 +#define ZM_MAX_WPAIE_SIZE 128
33897 +/* WEP related definitions */
33898 +#define ZM_USER_KEY_DEFAULT 64
33899 +#define ZM_USER_KEY_PK 0 /* Pairwise Key */
33900 +#define ZM_USER_KEY_GK 1 /* Group Key */
33901 +/* AP WLAN Type */
33902 +#define ZM_WLAN_TYPE_PURE_B 2
33903 +#define ZM_WLAN_TYPE_PURE_G 1
33904 +#define ZM_WLAN_TYPE_MIXED 0
33905 +
33906 +/* HAL State */
33907 +#define ZM_HAL_STATE_INIT 0
33908 +#define ZM_HAL_STATE_RUNNING 1
33909 +
33910 +/* AP Capability */
33911 +#define ZM_All11N_AP 0x01
33912 +#define ZM_XR_AP 0x02
33913 +#define ZM_SuperG_AP 0x04
33914 +
33915 +/* MPDU Density */
33916 +#define ZM_MPDU_DENSITY_NONE 0
33917 +#define ZM_MPDU_DENSITY_1_8US 1
33918 +#define ZM_MPDU_DENSITY_1_4US 2
33919 +#define ZM_MPDU_DENSITY_1_2US 3
33920 +#define ZM_MPDU_DENSITY_1US 4
33921 +#define ZM_MPDU_DENSITY_2US 5
33922 +#define ZM_MPDU_DENSITY_4US 6
33923 +#define ZM_MPDU_DENSITY_8US 7
33924 +
33925 +/* Software Encryption */
33926 +#define ZM_SW_TKIP_ENCRY_EN 0x01
33927 +#define ZM_SW_TKIP_DECRY_EN 0x02
33928 +#define ZM_SW_WEP_ENCRY_EN 0x04
33929 +#define ZM_SW_WEP_DECRY_EN 0x08
33930 +
33931 +/* Default Support Rate */
33932 +#define ZM_DEFAULT_SUPPORT_RATE_ZERO 0x0
33933 +#define ZM_DEFAULT_SUPPORT_RATE_DISCONNECT 0x1
33934 +#define ZM_DEFAULT_SUPPORT_RATE_IBSS_B 0x2
33935 +#define ZM_DEFAULT_SUPPORT_RATE_IBSS_AG 0x3
33936 +
33937 +/* security related definitions */
33938 +struct zsTkipSeed
33939 +{
33940 + u8_t tk[32]; /* key */
33941 + u8_t ta[6];
33942 + u16_t ttak[5];
33943 + u16_t ppk[6];
33944 + u16_t iv16,iv16tmp;
33945 + u32_t iv32,iv32tmp;
33946 +};
33947 +
33948 +struct zsMicVar
33949 +{
33950 + u32_t k0, k1; // Key
33951 + u32_t left, right; // Current state
33952 + u32_t m; // Message accumulator (single word)
33953 + u16_t nBytes; // # bytes in M
33954 +};
33955 +
33956 +struct zsDefragEntry
33957 +{
33958 + u8_t fragCount;
33959 + u8_t addr[6];
33960 + u16_t seqNum;
33961 + zbuf_t* fragment[8];
33962 + u32_t tick;
33963 +};
33964 +
33965 +struct zsDefragList
33966 +{
33967 + struct zsDefragEntry defragEntry[ZM_MAX_DEFRAG_ENTRIES];
33968 + u8_t replaceNum;
33969 +};
33970 +
33971 +#define ZM_MAX_OPPOSITE_COUNT 16
33972 +#define ZM_MAX_TX_SAMPLES 15
33973 +#define ZM_TX_RATE_DOWN_CRITERIA 80
33974 +#define ZM_TX_RATE_UP_CRITERIA 200
33975 +
33976 +
33977 +#define ZM_MAX_PROBE_HIDDEN_SSID_SIZE 2
33978 +struct zsSsidList
33979 +{
33980 + u8_t ssid[32];
33981 + u8_t ssidLen;
33982 +};
33983 +
33984 +struct zsWrapperSetting
33985 +{
33986 + u8_t bDesiredBssid;
33987 + u8_t desiredBssid[6];
33988 + u16_t bssid[3];
33989 + u8_t ssid[32];
33990 + u8_t ssidLen;
33991 + u8_t authMode;
33992 + u8_t wepStatus;
33993 + u8_t encryMode;
33994 + u8_t wlanMode;
33995 + u16_t frequency;
33996 + u16_t beaconInterval;
33997 + u8_t dtim;
33998 + u8_t preambleType;
33999 + u16_t atimWindow;
34000 +
34001 + struct zsSsidList probingSsidList[ZM_MAX_PROBE_HIDDEN_SSID_SIZE];
34002 +
34003 + u8_t dropUnencryptedPkts;
34004 + u8_t ibssJoinOnly;
34005 + u32_t adhocMode;
34006 + u8_t countryIsoName[4];
34007 + u16_t autoSetFrequency;
34008 +
34009 + /* AP */
34010 + u8_t bRateBasic;
34011 + u8_t gRateBasic;
34012 + u32_t nRateBasic;
34013 + u8_t bgMode;
34014 +
34015 + /* Common */
34016 + u8_t staWmeEnabled;
34017 + u8_t staWmeQosInfo;
34018 + u8_t apWmeEnabled;
34019 +
34020 +
34021 + /* rate information: added in the future */
34022 +};
34023 +
34024 +struct zsWrapperFeatureCtrl
34025 +{
34026 + u8_t bIbssGMode;
34027 +};
34028 +
34029 +#define ZM_MAX_PS_STA 16
34030 +#define ZM_PS_QUEUE_SIZE 32
34031 +
34032 +struct zsStaPSEntity
34033 +{
34034 + u8_t bUsed;
34035 + u8_t macAddr[6];
34036 + u8_t bDataQueued;
34037 +};
34038 +
34039 +struct zsStaPSList
34040 +{
34041 + u8_t count;
34042 + struct zsStaPSEntity entity[ZM_MAX_PS_STA];
34043 +};
34044 +
34045 +#define ZM_MAX_TIMER_COUNT 32
34046 +
34047 +/* double linked list */
34048 +struct zsTimerEntry
34049 +{
34050 + u16_t event;
34051 + u32_t timer;
34052 + struct zsTimerEntry *pre;
34053 + struct zsTimerEntry *next;
34054 +};
34055 +
34056 +struct zsTimerList
34057 +{
34058 + u8_t freeCount;
34059 + struct zsTimerEntry list[ZM_MAX_TIMER_COUNT];
34060 + struct zsTimerEntry *head;
34061 + struct zsTimerEntry *tail;
34062 +};
34063 +
34064 +/* Multicast list */
34065 +#define ZM_MAX_MULTICAST_LIST_SIZE 64
34066 +
34067 +struct zsMulticastAddr
34068 +{
34069 + u8_t addr[6];
34070 +};
34071 +
34072 +struct zsMulticastList
34073 +{
34074 + u8_t size;
34075 + struct zsMulticastAddr macAddr[ZM_MAX_MULTICAST_LIST_SIZE];
34076 +};
34077 +
34078 +enum ieee80211_cwm_mode {
34079 + CWM_MODE20,
34080 + CWM_MODE2040,
34081 + CWM_MODE40,
34082 + CWM_MODEMAX
34083 +
34084 +};
34085 +
34086 +enum ieee80211_cwm_extprotspacing {
34087 + CWM_EXTPROTSPACING20,
34088 + CWM_EXTPROTSPACING25,
34089 + CWM_EXTPROTSPACINGMAX
34090 +};
34091 +
34092 +enum ieee80211_cwm_width {
34093 + CWM_WIDTH20,
34094 + CWM_WIDTH40
34095 +};
34096 +
34097 +enum ieee80211_cwm_extprotmode {
34098 + CWM_EXTPROTNONE, /* no protection */
34099 + CWM_EXTPROTCTSONLY, /* CTS to self */
34100 + CWM_EXTPROTRTSCTS, /* RTS-CTS */
34101 + CWM_EXTPROTMAX
34102 +};
34103 +
34104 +struct ieee80211_cwm {
34105 +
34106 + /* Configuration */
34107 + enum ieee80211_cwm_mode cw_mode; /* CWM mode */
34108 + u8_t cw_extoffset; /* CWM Extension Channel Offset */
34109 + enum ieee80211_cwm_extprotmode cw_extprotmode; /* CWM Extension Channel Protection Mode */
34110 + enum ieee80211_cwm_extprotspacing cw_extprotspacing;/* CWM Extension Channel Protection Spacing */
34111 + u32_t cw_enable; /* CWM State Machine Enabled */
34112 + u32_t cw_extbusythreshold;/* CWM Extension Channel Busy Threshold */
34113 +
34114 + /* State */
34115 + enum ieee80211_cwm_width cw_width; /* CWM channel width */
34116 +};
34117 +
34118 +
34119 +/* AP : STA database structure */
34120 +struct zsStaTable
34121 +{
34122 + u32_t time; /* tick time */
34123 + //u32_t phyCtrl; /* Tx PHY CTRL */
34124 + u16_t addr[3]; /* STA MAC address */
34125 + u16_t state; /* aut/asoc */
34126 + //u16_t retry; /* Retry count */
34127 + struct zsRcCell rcCell;
34128 +
34129 + u8_t valid; /* Valid flag : 1=>valid */
34130 + u8_t psMode; /* STA power saving mode */
34131 + u8_t staType; /* 0=>11b, 1=>11g, 2=>11n */
34132 + u8_t qosType; /* 0=>Legacy, 1=>WME */
34133 + u8_t qosInfo; /* WME QoS info */
34134 + u8_t vap; /* Virtual AP ID */
34135 + u8_t encryMode; /* Encryption type for this STA */
34136 + u8_t keyIdx;
34137 + struct zsMicVar txMicKey;
34138 + struct zsMicVar rxMicKey;
34139 + u16_t iv16;
34140 + u32_t iv32;
34141 +#ifdef ZM_ENABLE_CENC
34142 + /* CENC */
34143 + u8_t cencKeyIdx;
34144 + u32_t txiv[4];
34145 + u32_t rxiv[4];
34146 +#endif //ZM_ENABLE_CENC
34147 +};
34148 +
34149 +struct zdStructWds
34150 +{
34151 + u8_t wdsBitmap; /* Set bit-N to 1 to enable WDS */
34152 + u8_t encryMode[ZM_MAX_WDS_SUPPORT]; /* WDS encryption mode */
34153 + u16_t macAddr[ZM_MAX_WDS_SUPPORT][3]; /* WDS neighbor MAC address */
34154 +};
34155 +
34156 + // htcapinfo 16bits
34157 +#define HTCAP_AdvCodingCap 0x0001
34158 +#define HTCAP_SupChannelWidthSet 0x0002
34159 +#define HTCAP_DynamicSMPS 0x0004
34160 +#define HTCAP_SMEnabled 0x000C
34161 +#define HTCAP_GreenField 0x0010
34162 +#define HTCAP_ShortGIfor20MHz 0x0020
34163 +#define HTCAP_ShortGIfor40MHz 0x0040
34164 +#define HTCAP_TxSTBC 0x0080
34165 +#define HTCAP_RxOneStream 0x0100
34166 +#define HTCAP_RxTwoStream 0x0200
34167 +#define HTCAP_RxThreeStream 0x0300
34168 +#define HTCAP_DelayedBlockACK 0x0400
34169 +#define HTCAP_MaxAMSDULength 0x0800
34170 +#define HTCAP_DSSSandCCKin40MHz 0x1000
34171 +#define HTCAP_PSMPSup 0x2000
34172 +#define HTCAP_STBCControlFrameSup 0x4000
34173 +#define HTCAP_LSIGTXOPProtectionSUP 0x8000
34174 + // Ampdu HT Parameter Info 8bits
34175 +#define HTCAP_MaxRxAMPDU0 0x00
34176 +#define HTCAP_MaxRxAMPDU1 0x01
34177 +#define HTCAP_MaxRxAMPDU2 0x02
34178 +#define HTCAP_MaxRxAMPDU3 0x03
34179 + // PCO 8bits
34180 +#define HTCAP_PCO 0x01
34181 +#define HTCAP_TransmissionTime1 0x02
34182 +#define HTCAP_TransmissionTime2 0x04
34183 +#define HTCAP_TransmissionTime3 0x06
34184 + // MCS FeedBack 8bits
34185 +#define HTCAP_PlusHTCSupport 0x04
34186 +#define HTCAP_RDResponder 0x08
34187 + // TX Beamforming 0 8bits
34188 +#define HTCAP_TxBFCapable 0x01
34189 +#define HTCAP_RxStaggeredSoundCap 0x02
34190 +#define HTCAP_TxStaggeredSoundCap 0x04
34191 +#define HTCAP_RxZLFCapable 0x08
34192 +#define HTCAP_TxZLFCapable 0x10
34193 +#define HTCAP_ImplicitTxBFCapable 0x20
34194 + // Tx Beamforming 1 8bits
34195 +#define HTCAP_ExplicitCSITxBFCap 0x01
34196 +#define HTCAP_ExpUncompSteerMatrCap 0x02
34197 + // Antenna Selection Capabilities 8bits
34198 +#define HTCAP_AntennaSelectionCap 0x01
34199 +#define HTCAP_ExplicitCSITxASCap 0x02
34200 +#define HTCAP_AntennaIndFeeTxASCap 0x04
34201 +#define HTCAP_ExplicitCSIFeedbackCap 0x08
34202 +#define HTCAP_AntennaIndFeedbackCap 0x10
34203 +#define HTCAP_RxASCap 0x20
34204 +#define HTCAP_TxSoundPPDUsCap 0x40
34205 +
34206 +
34207 +
34208 +struct zsHTCapability
34209 +{
34210 + u8_t ElementID;
34211 + u8_t Length;
34212 + // HT Capability Info
34213 + u16_t HtCapInfo;
34214 + u8_t AMPDUParam;
34215 + u8_t MCSSet[16]; //16 bytes
34216 + // Extended HT Capability Info
34217 + u8_t PCO;
34218 + u8_t MCSFeedBack;
34219 +
34220 + u8_t TxBFCap[4];
34221 + u8_t AselCap;
34222 +};
34223 +
34224 +union zuHTCapability
34225 +{
34226 + struct zsHTCapability Data;
34227 + u8_t Byte[28];
34228 +};
34229 +
34230 + //channelinfo 8bits
34231 +#define ExtHtCap_ExtChannelOffsetAbove 0x01
34232 +#define ExtHtCap_ExtChannelOffsetBelow 0x03
34233 +#define ExtHtCap_RecomTxWidthSet 0x04
34234 +#define ExtHtCap_RIFSMode 0x08
34235 +#define ExtHtCap_ControlAccessOnly 0x10
34236 + //operatinginfo 16bits
34237 +#define ExtHtCap_NonGFDevicePresent 0x0004
34238 + //beaconinfo 16bits
34239 +#define ExtHtCap_DualBeacon 0x0040
34240 +#define ExtHtCap_DualSTBCProtection 0x0080
34241 +#define ExtHtCap_SecondaryBeacon 0x0100
34242 +#define ExtHtCap_LSIGTXOPProtectFullSup 0x0200
34243 +#define ExtHtCap_PCOActive 0x0400
34244 +#define ExtHtCap_PCOPhase 0x0800
34245 +
34246 +
34247 +struct zsExtHTCapability
34248 +{
34249 + u8_t ElementID;
34250 + u8_t Length;
34251 + u8_t ControlChannel;
34252 + u8_t ChannelInfo;
34253 + u16_t OperatingInfo;
34254 + u16_t BeaconInfo;
34255 + // Supported MCS Set
34256 + u8_t MCSSet[16];
34257 +};
34258 +
34259 +union zuExtHTCapability
34260 +{
34261 + struct zsExtHTCapability Data;
34262 + u8_t Byte[24];
34263 +};
34264 +
34265 +struct InformationElementSta {
34266 + struct zsHTCapability HtCap;
34267 + struct zsExtHTCapability HtInfo;
34268 +};
34269 +
34270 +struct InformationElementAp {
34271 + struct zsHTCapability HtCap;
34272 +};
34273 +
34274 +#define ZM_MAX_FREQ_REQ_QUEUE 32
34275 +typedef void (*zfpFreqChangeCompleteCb)(zdev_t* dev);
34276 +
34277 +struct zsWlanDevFreqControl
34278 +{
34279 + u16_t freqReqQueue[ZM_MAX_FREQ_REQ_QUEUE];
34280 + u8_t freqReqBw40[ZM_MAX_FREQ_REQ_QUEUE];
34281 + u8_t freqReqExtOffset[ZM_MAX_FREQ_REQ_QUEUE];
34282 + zfpFreqChangeCompleteCb freqChangeCompCb[ZM_MAX_FREQ_REQ_QUEUE];
34283 + u8_t freqReqQueueHead;
34284 + u8_t freqReqQueueTail;
34285 +};
34286 +
34287 +struct zsWlanDevAp
34288 +{
34289 + u16_t protectedObss; /* protected overlap BSS */
34290 + u16_t staAgingTimeSec; /* in second, STA will be deathed if it does not */
34291 + /* active for this long time */
34292 + u16_t staProbingTimeSec;/* in second, STA will be probed if it does not */
34293 + /* active for this long time */
34294 + u8_t authSharing; /* authentication on going*/
34295 + u8_t bStaAssociated; /* 11b STA associated */
34296 + u8_t gStaAssociated; /* 11g STA associated */
34297 + u8_t nStaAssociated; /* 11n STA associated */
34298 + u16_t protectionMode; /* AP protection mode flag */
34299 + u16_t staPowerSaving; /* Set associated power saving STA count */
34300 +
34301 +
34302 +
34303 + zbuf_t* uniArray[ZM_UNI_ARRAY_SIZE]; /* array to store unicast frames */
34304 + u16_t uniHead;
34305 + u16_t uniTail;
34306 +
34307 + /* HT Capability Info */
34308 + union zuHTCapability HTCap; //CWYang(+)
34309 +
34310 + /* Extended HT Capability Info */
34311 + union zuExtHTCapability ExtHTCap; //CWYang(+)
34312 +
34313 + /* STA table */
34314 + struct zsStaTable staTable[ZM_MAX_STA_SUPPORT];
34315 +
34316 + /* WDS */
34317 + struct zdStructWds wds;
34318 + /* WPA */
34319 + u8_t wpaIe[ZM_MAX_AP_SUPPORT][ZM_MAX_WPAIE_SIZE];
34320 + u8_t wpaLen[ZM_MAX_AP_SUPPORT];
34321 + u8_t stawpaIe[ZM_MAX_AP_SUPPORT][ZM_MAX_WPAIE_SIZE];
34322 + u8_t stawpaLen[ZM_MAX_AP_SUPPORT];
34323 + u8_t wpaSupport[ZM_MAX_AP_SUPPORT];
34324 +
34325 + //struct zsTkipSeed bcSeed;
34326 + u8_t bcKeyIndex[ZM_MAX_AP_SUPPORT];
34327 + u8_t bcHalKeyIdx[ZM_MAX_AP_SUPPORT];
34328 + struct zsMicVar bcMicKey[ZM_MAX_AP_SUPPORT];
34329 + u16_t iv16[ZM_MAX_AP_SUPPORT];
34330 + u32_t iv32[ZM_MAX_AP_SUPPORT];
34331 +
34332 +#ifdef ZM_ENABLE_CENC
34333 + /* CENC */
34334 + u32_t txiv[ZM_MAX_AP_SUPPORT][4];
34335 +#endif //ZM_ENABLE_CENC
34336 +
34337 + /* Virtual AP */
34338 + u8_t beaconCounter;
34339 + u8_t vapNumber;
34340 + u8_t apBitmap; /* Set bit-N to 1 to enable VAP */
34341 + u8_t hideSsid[ZM_MAX_AP_SUPPORT];
34342 + u8_t authAlgo[ZM_MAX_AP_SUPPORT];
34343 + u8_t ssid[ZM_MAX_AP_SUPPORT][32]; /* SSID */
34344 + u8_t ssidLen[ZM_MAX_AP_SUPPORT]; /* SSID length */
34345 + u8_t encryMode[ZM_MAX_AP_SUPPORT];
34346 + u8_t wepStatus[ZM_MAX_AP_SUPPORT];
34347 + u16_t capab[ZM_MAX_AP_SUPPORT]; /* Capability */
34348 + u8_t timBcmcBit[ZM_MAX_AP_SUPPORT]; /* BMCM bit of TIM */
34349 + u8_t wlanType[ZM_MAX_AP_SUPPORT];
34350 +
34351 + /* Array to store BC or MC frames */
34352 + zbuf_t* bcmcArray[ZM_MAX_AP_SUPPORT][ZM_BCMC_ARRAY_SIZE];
34353 + u16_t bcmcHead[ZM_MAX_AP_SUPPORT];
34354 + u16_t bcmcTail[ZM_MAX_AP_SUPPORT];
34355 +
34356 + u8_t qosMode; /* 1=>WME */
34357 + u8_t uapsdEnabled;
34358 + struct zsQueue* uapsdQ;
34359 +
34360 + u8_t challengeText[128];
34361 +
34362 + struct InformationElementAp ie[ZM_MAX_STA_SUPPORT];
34363 +
34364 +
34365 +};
34366 +
34367 +#define ZM_MAX_BLOCKING_AP_LIST_SIZE 4 /* 2^N */
34368 +struct zsBlockingAp
34369 +{
34370 + u8_t addr[6];
34371 + u8_t weight;
34372 +};
34373 +
34374 +#define ZM_SCAN_MGR_SCAN_NONE 0
34375 +#define ZM_SCAN_MGR_SCAN_INTERNAL 1
34376 +#define ZM_SCAN_MGR_SCAN_EXTERNAL 2
34377 +
34378 +struct zsWlanDevStaScanMgr
34379 +{
34380 + u8_t scanReqs[2];
34381 + u8_t currScanType;
34382 + u8_t scanStartDelay;
34383 +};
34384 +
34385 +#define ZM_PS_MSG_STATE_ACTIVE 0
34386 +#define ZM_PS_MSG_STATE_SLEEP 1
34387 +#define ZM_PS_MSG_STATE_T1 2
34388 +#define ZM_PS_MSG_STATE_T2 3
34389 +#define ZM_PS_MSG_STATE_S1 4
34390 +
34391 +#define ZM_PS_MAX_SLEEP_PERIODS 3 // The number of beacon periods
34392 +
34393 +struct zsWlanDevStaPSMgr
34394 +{
34395 + u8_t state;
34396 + u8_t isSleepAllowed;
34397 + u8_t maxSleepPeriods;
34398 + u8_t ticks;
34399 + u32_t lastTxUnicastFrm;
34400 + u32_t lastTxMulticastFrm;
34401 + u32_t lastTxBroadcastFrm;
34402 + u8_t tempWakeUp; /*enable when wake up but still in ps mode */
34403 + u16_t sleepAllowedtick;
34404 +};
34405 +
34406 +struct zsWlanDevSta
34407 +{
34408 + u32_t beaconTxCnt; /* Transmitted beacon counter (in IBSS) */
34409 + u8_t txBeaconInd; /* In IBSS mode, true means that we just transmit a beacon during
34410 + last beacon period.
34411 + */
34412 + u16_t beaconCnt; /* receive beacon count, will be perodically reset */
34413 + u16_t bssid[3]; /* BSSID of connected AP */
34414 + u8_t ssid[32]; /* SSID */
34415 + u8_t ssidLen; /* SSID length */
34416 + u8_t mTxRate; /* Tx rate for multicast */
34417 + u8_t uTxRate; /* Tx rate for unicast */
34418 + u8_t mmTxRate; /* Tx rate for management frame */
34419 + u8_t bChannelScan;
34420 + u8_t bScheduleScan;
34421 +
34422 + u8_t InternalScanReq;
34423 + u16_t activescanTickPerChannel;
34424 + u16_t passiveScanTickPerChannel;
34425 + u16_t scanFrequency;
34426 + u32_t connPowerInHalfDbm;
34427 +
34428 + u16_t currentFrequency;
34429 + u16_t currentBw40;
34430 + u16_t currentExtOffset;
34431 +
34432 + u8_t bPassiveScan;
34433 +
34434 + struct zsBlockingAp blockingApList[ZM_MAX_BLOCKING_AP_LIST_SIZE];
34435 +
34436 + //struct zsBssInfo bssInfoPool[ZM_MAX_BSS];
34437 + struct zsBssInfo* bssInfoArray[ZM_MAX_BSS];
34438 + struct zsBssList bssList;
34439 + u8_t bssInfoArrayHead;
34440 + u8_t bssInfoArrayTail;
34441 + u8_t bssInfoFreeCount;
34442 +
34443 + u8_t authMode;
34444 + u8_t currentAuthMode;
34445 + u8_t wepStatus;
34446 + u8_t encryMode;
34447 + u8_t keyId;
34448 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
34449 + u8_t ibssWpa2Psk;
34450 +#endif
34451 +#ifdef ZM_ENABLE_CENC
34452 + u8_t cencKeyId; //CENC
34453 +#endif //ZM_ENABLE_CENC
34454 + u8_t dropUnencryptedPkts;
34455 + u8_t ibssJoinOnly;
34456 + u8_t adapterState;
34457 + u8_t oldAdapterState;
34458 + u8_t connectState;
34459 + u8_t connectRetry;
34460 + u8_t wpaState;
34461 + u8_t wpaIe[ZM_MAX_IE_SIZE + 2];
34462 + u8_t rsnIe[ZM_MAX_IE_SIZE + 2];
34463 + u8_t challengeText[255+2];
34464 + u8_t capability[2];
34465 + //u8_t connectingHiddenAP;
34466 + //u8_t scanWithSSID;
34467 + u16_t aid;
34468 + u32_t mgtFrameCount;
34469 + u8_t bProtectionMode;
34470 + u32_t NonNAPcount;
34471 + u8_t RTSInAGGMode;
34472 + u32_t connectTimer;
34473 + u16_t atimWindow;
34474 + u8_t desiredBssid[6];
34475 + u8_t bDesiredBssid;
34476 + struct zsTkipSeed txSeed;
34477 + struct zsTkipSeed rxSeed[4];
34478 + struct zsMicVar txMicKey;
34479 + struct zsMicVar rxMicKey[4];
34480 + u16_t iv16;
34481 + u32_t iv32;
34482 + struct zsOppositeInfo oppositeInfo[ZM_MAX_OPPOSITE_COUNT];
34483 + u8_t oppositeCount;
34484 + u8_t bssNotFoundCount; /* sitesurvey for search desired ISBB threshold */
34485 + u16_t rxBeaconCount;
34486 + u8_t beaconMissState;
34487 + u32_t rxBeaconTotal;
34488 + u8_t bIsSharedKey;
34489 + u8_t connectTimeoutCount;
34490 +
34491 + u8_t recvAtim;
34492 +
34493 + /* ScanMgr Control block */
34494 + struct zsWlanDevStaScanMgr scanMgr;
34495 + struct zsWlanDevStaPSMgr psMgr;
34496 +
34497 + // The callback would be called if receiving an unencrypted packets but
34498 + // the station is in encrypted mode. The wrapper could decide whether
34499 + // to drop the packet by its OS setting.
34500 + zfpStaRxSecurityCheckCb pStaRxSecurityCheckCb;
34501 +
34502 + /* WME */
34503 + u8_t apWmeCapability; //bit-0 => a WME AP
34504 + //bit-7 => a UAPSD AP
34505 + u8_t wmeParameterSetCount;
34506 +
34507 + u8_t wmeEnabled;
34508 + #define ZM_STA_WME_ENABLE_BIT 0x1
34509 + #define ZM_STA_UAPSD_ENABLE_BIT 0x2
34510 + u8_t wmeQosInfo;
34511 +
34512 + u8_t wmeConnected;
34513 + u8_t qosInfo;
34514 + struct zsQueue* uapsdQ;
34515 +
34516 + /* countermeasures */
34517 + u8_t cmMicFailureCount;
34518 + u8_t cmDisallowSsidLength;
34519 + u8_t cmDisallowSsid[32];
34520 +
34521 + /* power-saving mode */
34522 + u8_t powerSaveMode;
34523 + zbuf_t* staPSDataQueue[ZM_PS_QUEUE_SIZE];
34524 + u8_t staPSDataCount;
34525 +
34526 + /* IBSS power-saving mode */
34527 + /* record the STA which has entered the PS mode */
34528 + struct zsStaPSList staPSList;
34529 + /* queue the data of the PS STAs */
34530 + zbuf_t* ibssPSDataQueue[ZM_PS_QUEUE_SIZE];
34531 + u8_t ibssPSDataCount;
34532 + u8_t ibssPrevPSDataCount;
34533 + u8_t bIbssPSEnable;
34534 + /* BIT_15: ON/OFF, BIT_0~14: Atim Timer */
34535 + u16_t ibssAtimTimer;
34536 +
34537 + /* WPA2 */
34538 + struct zsPmkidInfo pmkidInfo;
34539 +
34540 + /* Multicast list related objects */
34541 + struct zsMulticastList multicastList;
34542 +
34543 + /* XP packet filter feature : */
34544 + /* 1=>enable: All multicast address packets, not just the ones enumerated in the multicast address list. */
34545 + /* 0=>disable */
34546 + u8_t bAllMulticast;
34547 +
34548 + /* reassociation flag */
34549 + u8_t connectByReasso;
34550 + u8_t failCntOfReasso;
34551 +
34552 + /* for HT configure control setting */
34553 + u8_t preambleTypeHT; /* HT: 0 Mixed mode 1 Green field */
34554 + u8_t htCtrlBandwidth;
34555 + u8_t htCtrlSTBC;
34556 + u8_t htCtrlSG;
34557 + u8_t defaultTA;
34558 +
34559 + u8_t connection_11b;
34560 +
34561 + u8_t EnableHT;
34562 + u8_t SG40;
34563 + u8_t HT2040;
34564 + /* for WPA setting */
34565 + u8_t wpaSupport;
34566 + u8_t wpaLen;
34567 +
34568 + /* IBSS related objects */
34569 + u8_t ibssDelayedInd;
34570 + struct zsPartnerNotifyEvent ibssDelayedIndEvent;
34571 + u8_t ibssPartnerStatus;
34572 +
34573 + u8_t bAutoReconnect;
34574 +
34575 + u8_t flagFreqChanging;
34576 + u8_t flagKeyChanging;
34577 + struct zsBssInfo ibssBssDesc;
34578 + u8_t ibssBssIsCreator;
34579 + u16_t ibssReceiveBeaconCount;
34580 + u8_t ibssSiteSurveyStatus;
34581 +
34582 + u8_t disableProbingWithSsid;
34583 +#ifdef ZM_ENABLE_CENC
34584 + /* CENC */
34585 + u8_t cencIe[ZM_MAX_IE_SIZE + 2];
34586 +#endif //ZM_ENABLE_CENC
34587 + u32_t txiv[4]; //Tx PN Sequence
34588 + u32_t rxiv[4]; //Rx PN Sequence
34589 + u32_t rxivGK[4];//Broadcast Rx PN Sequence
34590 + u8_t wepKey[4][32]; // For Software WEP
34591 + u8_t SWEncryMode[4];
34592 +
34593 + /* 802.11d */
34594 + u8_t b802_11D;
34595 +
34596 + /* 802.11h */
34597 + u8_t TPCEnable;
34598 + u8_t DFSEnable;
34599 + u8_t DFSDisableTx;
34600 +
34601 + /* Owl AP */
34602 + u8_t athOwlAp;
34603 +
34604 + /* Enable BA response in driver */
34605 + u8_t enableDrvBA;
34606 +
34607 + /* HT Capability Info */
34608 + union zuHTCapability HTCap; //CWYang(+)
34609 +
34610 + /* Extended HT Capability Info */
34611 + union zuExtHTCapability ExtHTCap; //CWYang(+)
34612 +
34613 + struct InformationElementSta ie;
34614 +
34615 +#define ZM_CACHED_FRAMEBODY_SIZE 200
34616 + u8_t asocReqFrameBody[ZM_CACHED_FRAMEBODY_SIZE];
34617 + u16_t asocReqFrameBodySize;
34618 + u8_t asocRspFrameBody[ZM_CACHED_FRAMEBODY_SIZE];
34619 + u16_t asocRspFrameBodySize;
34620 + u8_t beaconFrameBody[ZM_CACHED_FRAMEBODY_SIZE];
34621 + u16_t beaconFrameBodySize;
34622 +
34623 + u8_t ac0PriorityHigherThanAc2;
34624 + u8_t SWEncryptEnable;
34625 +
34626 + u8_t leapEnabled;
34627 +
34628 + u32_t TotalNumberOfReceivePackets;
34629 + u32_t TotalNumberOfReceiveBytes;
34630 + u32_t avgSizeOfReceivePackets;
34631 +
34632 + u32_t ReceivedPacketRateCounter;
34633 + u32_t ReceivedPktRatePerSecond;
34634 +
34635 + /* #2 Record the sequence number to determine whether the unicast frame is separated by RIFS or not */
34636 +#define ZM_RIFS_STATE_DETECTING 0
34637 +#define ZM_RIFS_STATE_DETECTED 1
34638 +#define ZM_RIFS_TIMER_TIMEOUT 4480 // <Driver time>4480ms <Real time>7s
34639 + u8_t rifsState;
34640 + u8_t rifsLikeFrameCnt;
34641 + u16_t rifsLikeFrameSequence[3];
34642 + u32_t rifsTimer;
34643 + u32_t rifsCount;
34644 +
34645 + /* RX filter desired by upper layers. Note this contains some bits which must be filtered
34646 + by sw since the hw supports only a subset of possible filter actions.= */
34647 + u32_t osRxFilter;
34648 +
34649 + u8_t bSafeMode;
34650 +
34651 + u32_t ibssAdditionalIESize;
34652 + u8_t ibssAdditionalIE[256];
34653 +}; //struct zsWlanDevSta
34654 +
34655 +#define ZM_CMD_QUEUE_SIZE 256 //Roger Check, test 64 when ready
34656 +
34657 +#define ZM_OID_READ 1
34658 +#define ZM_OID_WRITE 2
34659 +#define ZM_OID_INTERNAL_WRITE 3
34660 +#define ZM_CMD_SET_FREQUENCY 4
34661 +#define ZM_CMD_SET_KEY 5
34662 +#define ZM_CWM_READ 6
34663 +#define ZM_MAC_READ 7
34664 +#define ZM_ANI_READ 8
34665 +#define ZM_EEPROM_READ 9
34666 +#define ZM_EEPROM_WRITE 0x0A
34667 +#define ZM_OID_CHAN 0x30
34668 +#define ZM_OID_SYNTH 0x32
34669 +#define ZM_OID_TALLY 0x81
34670 +#define ZM_OID_TALLY_APD 0x82
34671 +
34672 +#define ZM_OID_DKTX_STATUS 0x92
34673 +#define ZM_OID_FLASH_CHKSUM 0xD0
34674 +#define ZM_OID_FLASH_READ 0xD1
34675 +#define ZM_OID_FLASH_PROGRAM 0xD2
34676 +#define ZM_OID_FW_DL_INIT 0xD3
34677 +
34678 +/* Driver to Firmware OID */
34679 +#define ZM_CMD_ECHO 0x80
34680 +#define ZM_CMD_TALLY 0x81
34681 +#define ZM_CMD_TALLY_APD 0x82
34682 +#define ZM_CMD_CONFIG 0x83
34683 +#define ZM_CMD_RREG 0x00
34684 +#define ZM_CMD_WREG 0x01
34685 +#define ZM_CMD_RMEM 0x02
34686 +#define ZM_CMD_WMEM 0x03
34687 +#define ZM_CMD_BITAND 0x04
34688 +#define ZM_CMD_BITOR 0x05
34689 +#define ZM_CMD_EKEY 0x28
34690 +#define ZM_CMD_DKEY 0x29
34691 +#define ZM_CMD_FREQUENCY 0x30
34692 +#define ZM_CMD_RF_INIT 0x31
34693 +#define ZM_CMD_SYNTH 0x32
34694 +#define ZM_CMD_FREQ_STRAT 0x33
34695 +#define ZM_CMD_RESET 0x90
34696 +#define ZM_CMD_DKRESET 0x91
34697 +#define ZM_CMD_DKTX_STATUS 0x92
34698 +#define ZM_CMD_FDC 0xA0
34699 +#define ZM_CMD_WREEPROM 0xB0
34700 +#define ZM_CMD_WFLASH 0xB0
34701 +#define ZM_CMD_FLASH_ERASE 0xB1
34702 +#define ZM_CMD_FLASH_PROG 0xB2
34703 +#define ZM_CMD_FLASH_CHKSUM 0xB3
34704 +#define ZM_CMD_FLASH_READ 0xB4
34705 +#define ZM_CMD_FW_DL_INIT 0xB5
34706 +#define ZM_CMD_MEM_WREEPROM 0xBB
34707 +
34708 +
34709 +/* duplicate filter table column */
34710 +#define ZM_FILTER_TABLE_COL 2 /* 2^n */
34711 +/* duplicate filter table Row */
34712 +#define ZM_FILTER_TABLE_ROW 8 /* 2^n */
34713 +
34714 +/* duplicate filter table structure */
34715 +struct zsRxFilter
34716 +{
34717 + u16_t addr[3];
34718 + u16_t seq;
34719 + u8_t up;
34720 +};
34721 +
34722 +struct zsWlanDev
34723 +{
34724 + /* AP global variables */
34725 + struct zsWlanDevAp ap;
34726 + /* STA global variables */
34727 + struct zsWlanDevSta sta;
34728 + /* save wrapper setting */
34729 + struct zsWrapperSetting ws;
34730 + /* features determined by wrapper (vendor) */
34731 + struct zsWrapperFeatureCtrl wfc;
34732 + /* Traffic Monitor tally */
34733 + struct zsTrafTally trafTally;
34734 + /* Communication tally */
34735 + struct zsCommTally commTally;
34736 + /* Duplicate frame filter table */
34737 + struct zsRxFilter rxFilterTbl[ZM_FILTER_TABLE_COL][ZM_FILTER_TABLE_ROW];
34738 + /* Regulatory table */
34739 + struct zsRegulationTable regulationTable;
34740 +
34741 + /* */
34742 + struct zsWlanDevFreqControl freqCtrl;
34743 +
34744 + enum devState state;
34745 +
34746 + u8_t halState;
34747 + u8_t wlanMode; /* AP/INFRASTRUCTURE/IBSS/PSEUDO */
34748 + u16_t macAddr[3]; /* MAC address */
34749 + u16_t beaconInterval; /* beacon Interval */
34750 + u8_t dtim; /* DTIM period */
34751 + u8_t CurrentDtimCount;
34752 + u8_t preambleType;
34753 + u8_t preambleTypeInUsed;
34754 + u8_t maxTxPower2; /* 2.4 GHz Max Tx power (Unit: 0.5 dBm) */
34755 + u8_t maxTxPower5; /* 5 GHz Max Tx power (Unit: 0.5 dBm) */
34756 + u8_t connectMode;
34757 + u32_t supportMode;
34758 +
34759 + u8_t bRate; /* 11b Support Rate bit map */
34760 + u8_t bRateBasic; /* 11b Basic Rate bit map */
34761 + u8_t gRate; /* 11g Support Rate bit map */
34762 + u8_t gRateBasic; /* 11g Basic Rate bit map */
34763 + /* channel index point to the item in regulation table */
34764 + u8_t channelIndex;
34765 +
34766 + /* channel management */
34767 + u8_t BandWidth40;
34768 + u8_t ExtOffset; //1 above, 3 below, 0 not present
34769 + u16_t frequency; /* operation frequency */
34770 +
34771 + u8_t erpElement; /* ERP information element data */
34772 +
34773 + u8_t disableSelfCts; /* set to 1 to disable Self-CTS */
34774 + u8_t bgMode;
34775 +
34776 + /* private test flag */
34777 + u32_t enableProtectionMode; /* force enable/disable self cts */
34778 + u32_t checksumTest; /* OTUS checksum test 1=>zero checksum 0=>normal */
34779 + u32_t rxPacketDump; /* rx packet dump */
34780 +
34781 + u8_t enableAggregation; /* force enable/disable A-MSPU */
34782 + u8_t enableWDS; /* force enable/disable WDS testing */
34783 + u8_t enableTxPathMode; /* OTUS special testing mode 1=>diable, 0=>enable: ZM_SYSTEM_TEST_MODE */
34784 + u8_t enableHALDbgInfo; /* */
34785 +
34786 + u32_t forceTxTPC; /* force tx packet send TPC */
34787 +
34788 + u16_t seq[4];
34789 + u16_t mmseq;
34790 +
34791 + /* driver core time tick */
34792 + u32_t tick;
34793 + u16_t tickIbssSendBeacon;
34794 + u16_t tickIbssReceiveBeacon;
34795 +
34796 + /* RTS threshold */
34797 + u16_t rtsThreshold;
34798 +
34799 + /* fragmentation threshold, 256 <= value <= 2346, 0=disabled */
34800 + u16_t fragThreshold;
34801 +
34802 + /* Tx Rate */
34803 + u16_t txMCS;
34804 + u16_t txMT;
34805 + u32_t CurrentTxRateKbps; //CWYang(+)
34806 + /* Rx Rate */
34807 + u32_t CurrentRxRateKbps; //Janet(+)
34808 + u8_t CurrentRxRateUpdated;
34809 + u8_t modulationType;
34810 + u8_t rxInfo;
34811 + u16_t rateField;
34812 +
34813 + /* timer related objects */
34814 + struct zsTimerList timerList;
34815 + u8_t bTimerReady;
34816 +
34817 + /* for defragmentation */
34818 + struct zsDefragList defragTable;
34819 +
34820 + /* Data struct for Interface Dependent Layer */
34821 + //struct zsIdlStruct idlStruct;
34822 +
34823 + /* Signal Strength/Quality Related Parameters */
34824 + u8_t SignalStrength; //CWYang(+)
34825 + u8_t SignalQuality; //CWYang(+)
34826 +
34827 +
34828 +
34829 + /* QoS */
34830 + zbuf_t* vtxq[4][ZM_VTXQ_SIZE];
34831 + u16_t vtxqHead[4];
34832 + u16_t vtxqTail[4];
34833 + u16_t qosDropIpFrag[4];
34834 +
34835 + /* Management Tx queue */
34836 + zbuf_t* vmmq[ZM_VMMQ_SIZE];
34837 + u16_t vmmqHead;
34838 + u16_t vmmqTail;
34839 +
34840 + u8_t vtxqPushing;
34841 +
34842 + /*
34843 + * add by honda
34844 + * 1. Aggregate queues
34845 + * 2. STA's associated information and queue number
34846 + * 3. rx aggregation re-ordering queue
34847 + */
34848 + struct aggQueue *aggQPool[ZM_AGG_POOL_SIZE];
34849 + u8_t aggInitiated;
34850 + u8_t addbaComplete;
34851 + u8_t addbaCount;
34852 + u8_t aggState;
34853 + u8_t destLock;
34854 + struct aggSta aggSta[ZM_MAX_STA_SUPPORT];
34855 + struct agg_tid_rx *tid_rx[ZM_AGG_POOL_SIZE];
34856 + struct aggTally agg_tal;
34857 + struct destQ destQ;
34858 + struct baw_enabler *baw_enabler;
34859 + struct ieee80211_cwm cwm;
34860 + u16_t reorder;
34861 + u16_t seq_debug;
34862 + /* rate control */
34863 + u32_t txMPDU[ZM_RATE_TABLE_SIZE];
34864 + u32_t txFail[ZM_RATE_TABLE_SIZE];
34865 + u32_t PER[ZM_RATE_TABLE_SIZE];
34866 + u16_t probeCount;
34867 + u16_t probeSuccessCount;
34868 + u16_t probeInterval;
34869 + u16_t success_probing;
34870 + /*
34871 + * end of add by honda
34872 + */
34873 +
34874 + /* airopeek sniffer mode for upper sw */
34875 + u32_t swSniffer; /* window: airoPeek */
34876 + u32_t XLinkMode;
34877 +
34878 + /* MDK mode */
34879 + /* init by 0=>normal driver 1=>MDK driver */
34880 + u32_t modeMDKEnable;
34881 +
34882 + u32_t heartBeatNotification;
34883 +
34884 + /* pointer for HAL Plus private memory */
34885 + void* hpPrivate;
34886 +
34887 + /* for WPA setting */
34888 + //u8_t wpaSupport[ZM_MAX_AP_SUPPORT];
34889 + //u8_t wpaLen[ZM_MAX_AP_SUPPORT];
34890 + //u8_t wpaIe[ZM_MAX_AP_SUPPORT][ZM_MAX_IE_SIZE];
34891 +
34892 + struct zsLedStruct ledStruct;
34893 +
34894 + /* ani flag */
34895 + u8_t aniEnable;
34896 + u16_t txq_threshold;
34897 +
34898 + //Skip Mic Error Check
34899 + u8_t TKIP_Group_KeyChanging;
34900 +
34901 + u8_t dynamicSIFSEnable;
34902 +
34903 + u8_t queueFlushed;
34904 +
34905 + u16_t (*zfcbAuthNotify)(zdev_t* dev, u16_t* macAddr);
34906 + u16_t (*zfcbAsocNotify)(zdev_t* dev, u16_t* macAddr, u8_t* body, u16_t bodySize, u16_t port);
34907 + u16_t (*zfcbDisAsocNotify)(zdev_t* dev, u8_t* macAddr, u16_t port);
34908 + u16_t (*zfcbApConnectNotify)(zdev_t* dev, u8_t* macAddr, u16_t port);
34909 + void (*zfcbConnectNotify)(zdev_t* dev, u16_t status, u16_t* bssid);
34910 + void (*zfcbScanNotify)(zdev_t* dev, struct zsScanResult* result);
34911 + void (*zfcbMicFailureNotify)(zdev_t* dev, u16_t* addr, u16_t status);
34912 + void (*zfcbApMicFailureNotify)(zdev_t* dev, u8_t* addr, zbuf_t* buf);
34913 + void (*zfcbIbssPartnerNotify)(zdev_t* dev, u16_t status, struct zsPartnerNotifyEvent *event);
34914 + void (*zfcbMacAddressNotify)(zdev_t* dev, u8_t* addr);
34915 + void (*zfcbSendCompleteIndication)(zdev_t* dev, zbuf_t* buf);
34916 + void (*zfcbRecvEth)(zdev_t* dev, zbuf_t* buf, u16_t port);
34917 + void (*zfcbRecv80211)(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo);
34918 + void (*zfcbRestoreBufData)(zdev_t* dev, zbuf_t* buf);
34919 +#ifdef ZM_ENABLE_CENC
34920 + u16_t (*zfcbCencAsocNotify)(zdev_t* dev, u16_t* macAddr, u8_t* body,
34921 + u16_t bodySize, u16_t port);
34922 +#endif //ZM_ENABLE_CENC
34923 + u8_t (*zfcbClassifyTxPacket)(zdev_t* dev, zbuf_t* buf);
34924 + void (*zfcbHwWatchDogNotify)(zdev_t* dev);
34925 +};
34926 +
34927 +
34928 +struct zsWlanKey
34929 +{
34930 + u8_t key;
34931 +};
34932 +
34933 +
34934 +/* These macros are defined here for backward compatibility */
34935 +/* Please leave them alone */
34936 +/* For Tx packet allocated in upper layer layer */
34937 +#define zmw_tx_buf_readb(dev, buf, offset) zmw_buf_readb(dev, buf, offset)
34938 +#define zmw_tx_buf_readh(dev, buf, offset) zmw_buf_readh(dev, buf, offset)
34939 +#define zmw_tx_buf_writeb(dev, buf, offset, value) zmw_buf_writeb(dev, buf, offset, value)
34940 +#define zmw_tx_buf_writeh(dev, buf, offset, value) zmw_buf_writeh(dev, buf, offset, value)
34941 +
34942 +/* For Rx packet allocated in driver */
34943 +#define zmw_rx_buf_readb(dev, buf, offset) zmw_buf_readb(dev, buf, offset)
34944 +#define zmw_rx_buf_readh(dev, buf, offset) zmw_buf_readh(dev, buf, offset)
34945 +#define zmw_rx_buf_writeb(dev, buf, offset, value) zmw_buf_writeb(dev, buf, offset, value)
34946 +#define zmw_rx_buf_writeh(dev, buf, offset, value) zmw_buf_writeh(dev, buf, offset, value)
34947 +
34948 +#endif /* #ifndef _STRUCT_H */
34949 --- /dev/null
34950 +++ b/drivers/staging/otus/80211core/wlan.h
34951 @@ -0,0 +1,595 @@
34952 +/*
34953 + * Copyright (c) 2007-2008 Atheros Communications Inc.
34954 + *
34955 + * Permission to use, copy, modify, and/or distribute this software for any
34956 + * purpose with or without fee is hereby granted, provided that the above
34957 + * copyright notice and this permission notice appear in all copies.
34958 + *
34959 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
34960 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
34961 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
34962 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
34963 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
34964 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
34965 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
34966 + */
34967 +/* */
34968 +/* Module Name : wlan_defs.h */
34969 +/* */
34970 +/* Abstract */
34971 +/* This module contains WLAN definitions. */
34972 +/* */
34973 +/* NOTES */
34974 +/* None */
34975 +/* */
34976 +/************************************************************************/
34977 +
34978 +#ifndef _WLAN_H
34979 +#define _WLAN_H
34980 +
34981 +
34982 +#define ZM_EXTERNAL_ALLOC_BUF 0
34983 +#define ZM_INTERNAL_ALLOC_BUF 1
34984 +
34985 +#define ZM_SIZE_OF_CTRL_SET 8
34986 +#define ZM_SIZE_OF_IV 4
34987 +#define ZM_SIZE_OF_EXT_IV 4
34988 +#define ZM_SIZE_OF_MIC 8
34989 +#define ZM_SIZE_OF_CCX_MIC 8
34990 +#define ZM_SIZE_OF_WLAN_DATA_HEADER 24
34991 +#define ZM_SIZE_OF_QOS_CTRL 2
34992 +
34993 +/* Header definition */
34994 +#define ZM_SIZE_OF_WLAN_WDS_HEADER 32
34995 +#define ZM_SIZE_OF_SNAP_HEADER 8
34996 +
34997 +#define ZM_WLAN_HEADER_A1_OFFSET 4
34998 +#define ZM_WLAN_HEADER_A2_OFFSET 10
34999 +#define ZM_WLAN_HEADER_A3_OFFSET 16
35000 +#define ZM_WLAN_HEADER_A4_OFFSET 24
35001 +#define ZM_WLAN_HEADER_IV_OFFSET 24
35002 +#define ZM_SIZE_OF_WLAN_DATA_HEADER 24
35003 +
35004 +/* Port definition */
35005 +#define ZM_PORT_DISABLED 0
35006 +#define ZM_PORT_ENABLED 1
35007 +
35008 +/* Frame Type */
35009 +#define ZM_WLAN_MANAGEMENT_FRAME 0x0
35010 +#define ZM_WLAN_CONTROL_FRAME 0x4
35011 +#define ZM_WLAN_DATA_FRAME 0x8
35012 +
35013 +/* Frame Subtype */
35014 +#define ZM_WLAN_FRAME_TYPE_ASOCREQ 0x00
35015 +#define ZM_WLAN_FRAME_TYPE_ASOCRSP 0x10
35016 +#define ZM_WLAN_FRAME_TYPE_REASOCREQ 0x20
35017 +#define ZM_WLAN_FRAME_TYPE_REASOCRSP 0x30
35018 +#define ZM_WLAN_FRAME_TYPE_PROBEREQ 0x40
35019 +#define ZM_WLAN_FRAME_TYPE_PROBERSP 0x50
35020 +/* 0x60, 0x70 => Reserved */
35021 +#define ZM_WLAN_FRAME_TYPE_BEACON 0x80
35022 +#define ZM_WLAN_FRAME_TYPE_ATIM 0x90
35023 +#define ZM_WLAN_FRAME_TYPE_DISASOC 0xA0
35024 +#define ZM_WLAN_FRAME_TYPE_AUTH 0xB0
35025 +#define ZM_WLAN_FRAME_TYPE_DEAUTH 0xC0
35026 +#define ZM_WLAN_FRAME_TYPE_ACTION 0xD0
35027 +
35028 +/* Frame type and subtype */
35029 +#define ZM_WLAN_FRAME_TYPE_NULL 0x48
35030 +#define ZM_WLAN_FRAME_TYPE_BAR 0x84
35031 +#define ZM_WLAN_FRAME_TYPE_BA 0x94
35032 +#define ZM_WLAN_FRAME_TYPE_PSPOLL 0xA4
35033 +#define ZM_WLAN_FRAME_TYPE_RTS 0xB4
35034 +#define ZM_WLAN_FRAME_TYPE_CTS 0xC4
35035 +#define ZM_WLAN_FRAME_TYPE_QOS_NULL 0xC8
35036 +
35037 +/* action frame */
35038 +#define ZM_WLAN_SPECTRUM_MANAGEMENT_ACTION_FRAME 0
35039 +#define ZM_WLAN_QOS_ACTION_FRAME 1
35040 +#define ZM_WLAN_DLS_ACTION_FRAME 2
35041 +#define ZM_WLAN_BLOCK_ACK_ACTION_FRAME 3
35042 +/* block ack action frame*/
35043 +#define ZM_WLAN_ADDBA_REQUEST_FRAME 0
35044 +#define ZM_WLAN_ADDBA_RESPONSE_FRAME 1
35045 +#define ZM_WLAN_DELBA_FRAME 2
35046 +
35047 +/* Element ID */
35048 +#define ZM_WLAN_EID_SSID 0
35049 +#define ZM_WLAN_EID_SUPPORT_RATE 1
35050 +#define ZM_WLAN_EID_FH 2
35051 +#define ZM_WLAN_EID_DS 3
35052 +#define ZM_WLAN_EID_CFS 4
35053 +#define ZM_WLAN_EID_TIM 5
35054 +#define ZM_WLAN_EID_IBSS 6
35055 +#define ZM_WLAN_EID_COUNTRY 7
35056 +/* reserved 8-15 */
35057 +#define ZM_WLAN_EID_CHALLENGE 16
35058 +/* reserved 17-31 */
35059 +#define ZM_WLAN_EID_POWER_CONSTRAINT 32
35060 +#define ZM_WLAN_EID_POWER_CAPABILITY 33
35061 +#define ZM_WLAN_EID_TPC_REQUEST 34
35062 +#define ZM_WLAN_EID_TPC_REPORT 35
35063 +#define ZM_WLAN_EID_SUPPORTED_CHANNELS 36
35064 +#define ZM_WLAN_EID_CHANNEL_SWITCH_ANNOUNCE 37
35065 +#define ZM_WLAN_EID_MEASUREMENT_REQUEST 38
35066 +#define ZM_WLAN_EID_MEASUREMENT_REPORT 39
35067 +#define ZM_WLAN_EID_QUIET 40
35068 +#define ZM_WLAN_EID_IBSS_DFS 41
35069 +#define ZM_WLAN_EID_ERP 42
35070 +#define ZM_WLAN_PREN2_EID_HTCAPABILITY 45
35071 +#define ZM_WLAN_EID_RSN_IE 48
35072 +#define ZM_WLAN_EID_EXTENDED_RATE 50
35073 +#define ZM_WLAN_EID_HT_CAPABILITY 51
35074 +#define ZM_WLAN_EID_EXTENDED_HT_CAPABILITY 52
35075 +#define ZM_WLAN_EID_NEW_EXT_CHANNEL_OFFSET 53
35076 +#define ZM_WLAN_PREN2_EID_HTINFORMATION 61
35077 +#define ZM_WLAN_PREN2_EID_SECONDCHOFFSET 62
35078 +#ifdef ZM_ENABLE_CENC
35079 +#define ZM_WLAN_EID_CENC_IE 68
35080 +#endif //ZM_ENABLE_CENC
35081 +#define ZM_WLAN_EID_VENDOR_PRIVATE 221 /* Vendor private space; must demux OUI */
35082 +#define ZM_WLAN_EID_WPA_IE 221
35083 +#define ZM_WLAN_EID_WPS_IE 221
35084 +#define ZM_WLAN_EID_WIFI_IE 221
35085 +
35086 +/* ERP information element */
35087 +#define ZM_WLAN_NON_ERP_PRESENT_BIT 0x1
35088 +#define ZM_WLAN_USE_PROTECTION_BIT 0x2
35089 +#define ZM_WLAN_BARKER_PREAMBLE_MODE_BIT 0x4
35090 +
35091 +/* Channel frequency, in MHz */
35092 +#define ZM_CH_G_1 2412
35093 +#define ZM_CH_G_2 2417
35094 +#define ZM_CH_G_3 2422
35095 +#define ZM_CH_G_4 2427
35096 +#define ZM_CH_G_5 2432
35097 +#define ZM_CH_G_6 2437
35098 +#define ZM_CH_G_7 2442
35099 +#define ZM_CH_G_8 2447
35100 +#define ZM_CH_G_9 2452
35101 +#define ZM_CH_G_10 2457
35102 +#define ZM_CH_G_11 2462
35103 +#define ZM_CH_G_12 2467
35104 +#define ZM_CH_G_13 2472
35105 +#define ZM_CH_G_14 2484
35106 +#define ZM_CH_A_184 4920
35107 +#define ZM_CH_A_188 4940
35108 +#define ZM_CH_A_192 4960
35109 +#define ZM_CH_A_196 4980
35110 +#define ZM_CH_A_8 5040
35111 +#define ZM_CH_A_12 5060
35112 +#define ZM_CH_A_16 5080
35113 +#define ZM_CH_A_36 5180
35114 +#define ZM_CH_A_40 5200
35115 +#define ZM_CH_A_44 5220
35116 +#define ZM_CH_A_48 5240
35117 +#define ZM_CH_A_52 5260
35118 +#define ZM_CH_A_56 5280
35119 +#define ZM_CH_A_60 5300
35120 +#define ZM_CH_A_64 5320
35121 +#define ZM_CH_A_100 5500
35122 +#define ZM_CH_A_104 5520
35123 +#define ZM_CH_A_108 5540
35124 +#define ZM_CH_A_112 5560
35125 +#define ZM_CH_A_116 5580
35126 +#define ZM_CH_A_120 5600
35127 +#define ZM_CH_A_124 5620
35128 +#define ZM_CH_A_128 5640
35129 +#define ZM_CH_A_132 5660
35130 +#define ZM_CH_A_136 5680
35131 +#define ZM_CH_A_140 5700
35132 +#define ZM_CH_A_149 5745
35133 +#define ZM_CH_A_153 5765
35134 +#define ZM_CH_A_157 5785
35135 +#define ZM_CH_A_161 5805
35136 +#define ZM_CH_A_165 5825
35137 +
35138 +
35139 +/* AP : STA table => STA Type */
35140 +#define ZM_11B_STA 0x0
35141 +#define ZM_11G_STA 0x2
35142 +#define ZM_11N_STA 0x4
35143 +
35144 +/* AP : timeout */
35145 +#define ZM_MS_PER_TICK 10
35146 +#define ZM_TICK_PER_SECOND (1000/ZM_MS_PER_TICK)
35147 +#define ZM_TICK_PER_MINUTE (60*1000/ZM_MS_PER_TICK)
35148 +#define ZM_PREAUTH_TIMEOUT_MS 1000 /* 1 sec */
35149 +#define ZM_AUTH_TIMEOUT_MS 1000 /* 1 sec */
35150 +
35151 +/* Error code */
35152 +#define ZM_SUCCESS 0
35153 +#define ZM_ERR_TX_PORT_DISABLED 1
35154 +#define ZM_ERR_BUFFER_DMA_ADDR 2
35155 +#define ZM_ERR_FREE_TXD_EXHAUSTED 3
35156 +#define ZM_ERR_TX_BUFFER_UNAVAILABLE 4
35157 +#define ZM_ERR_BCMC_PS_BUFFER_UNAVAILABLE 5
35158 +#define ZM_ERR_UNI_PS_BUFFER_UNAVAILABLE 6
35159 +#define ZM_ERR_EXCEED_PRIORITY_THRESHOLD 7
35160 +#define ZM_ERR_VMMQ_FULL 8
35161 +#define ZM_ERR_FLUSH_PS_QUEUE 9
35162 +#define ZM_ERR_CMD_INT_MISSED 15 /* Polling cmd int timeout*/
35163 +/* Rx */
35164 +#define ZM_ERR_RX_FRAME_TYPE 20
35165 +#define ZM_ERR_MIN_RX_ENCRYPT_FRAME_LENGTH 21
35166 +#define ZM_ERR_MIN_RX_FRAME_LENGTH 22
35167 +#define ZM_ERR_MAX_RX_FRAME_LENGTH 23
35168 +#define ZM_ERR_RX_DUPLICATE 24
35169 +#define ZM_ERR_RX_SRC_ADDR_IS_OWN_MAC 25
35170 +#define ZM_ERR_MIN_RX_PROTOCOL_VERSION 26
35171 +#define ZM_ERR_WPA_GK_NOT_INSTALLED 27
35172 +#define ZM_ERR_STA_NOT_ASSOCIATED 28
35173 +#define ZM_ERR_DATA_BEFORE_CONNECTED 29
35174 +#define ZM_ERR_DATA_NOT_ENCRYPTED 30
35175 +#define ZM_ERR_DATA_BSSID_NOT_MATCHED 31
35176 +#define ZM_ERR_RX_BAR_FRAME 32
35177 +#define ZM_ERR_OUT_OF_ORDER_NULL_DATA 33
35178 +
35179 +/* ZFI */
35180 +#define ZM_ERR_INVALID_TX_RATE 40
35181 +#define ZM_ERR_WDS_PORT_ID 41
35182 +
35183 +/* QUEUE */
35184 +#define ZM_ERR_QUEUE_FULL 50
35185 +#define ZM_ERR_STA_UAPSD_QUEUE_FULL 51
35186 +#define ZM_ERR_AP_UAPSD_QUEUE_FULL 52
35187 +
35188 +/* Maximum Rx frame length */
35189 +#if ZM_LARGEPAYLOAD_TEST == 1
35190 +#define ZM_WLAN_MAX_RX_SIZE 16384
35191 +#else
35192 +#define ZM_WLAN_MAX_RX_SIZE 8192
35193 +#endif
35194 +
35195 +/* PCI DMA test error code */
35196 +#define ZM_ERR_INTERRUPT_MISSED 100
35197 +#define ZM_ERR_OWN_BIT_NOT_CLEARED 101
35198 +#define ZM_ERR_RX_SEQ_NUMBER 102
35199 +#define ZM_ERR_RX_LENGTH 103
35200 +#define ZM_ERR_RX_DATA 104
35201 +#define ZM_ERR_RX_DESCRIPTOR_NUM 105
35202 +/* Common register test error code */
35203 +#define ZM_ERR_REGISTER_ACCESS 110 /* Register R/W test fail*/
35204 +#define ZM_ERR_CLEAR_INTERRUPT_FLAG 111
35205 +#define ZM_ERR_COMMAND_RESPONSE 112
35206 +#define ZM_ERR_INTERRUPT_GENERATE 113
35207 +#define ZM_ERR_INTERRUPT_ACK 114
35208 +#define ZM_ERR_SCRATCH_ACCESS 115
35209 +#define ZM_ERR_INTERRUPT_MASK_ACCESS 116
35210 +#define ZM_ERR_SHARE_MEMORY_PCI_ACCESS 117
35211 +#define ZM_ERR_SHARE_MEMORY_FW_ACCESS 118
35212 +#define ZM_ERR_SHARE_MEMORY_DISABLE 119
35213 +#define ZM_ERR_SHARE_MEMORY_TEST_RESPONSE 120
35214 +
35215 +/* Firmware Download error code */
35216 +#define ZM_ERR_FIRMWARE_DOWNLOAD_TIMEOUT 150
35217 +#define ZM_ERR_FIRMWARE_DOWNLOAD_INT_FLAG 151
35218 +#define ZM_ERR_FIRMWARE_READY_TIMEOUT 152
35219 +#define ZM_ERR_FIRMWARE_WRONG_TYPE 153
35220 +
35221 +/* Debug */
35222 +#define ZM_LV_0 0//Debug level 0, Disable debug message
35223 +#define ZM_LV_1 1//Debug level 1, Show minimum information
35224 +#define ZM_LV_2 2//Debug level 2, Show medium message
35225 +#define ZM_LV_3 3//Debug level 3, Show all
35226 +
35227 +#define ZM_SCANMSG_LEV ZM_LV_1
35228 +#define ZM_TXMSG_LEV ZM_LV_0//ZM_LV_0
35229 +#define ZM_RXMSG_LEV ZM_LV_0
35230 +#define ZM_MMMSG_LEV ZM_LV_0
35231 +#define ZM_DESMSG_LEV ZM_LV_0//ZM_LV_0
35232 +#define ZM_BUFMSG_LEV ZM_LV_0//ZM_LV_1
35233 +#define ZM_INITMSG_LEV ZM_LV_0
35234 +
35235 +#define zm_msg0_scan(lv, msg) if (ZM_SCANMSG_LEV >= lv) \
35236 + {zm_debug_msg0(msg);}
35237 +#define zm_msg1_scan(lv, msg, val) if (ZM_SCANMSG_LEV >= lv) \
35238 + {zm_debug_msg1(msg, val);}
35239 +#define zm_msg2_scan(lv, msg, val) if (ZM_SCANMSG_LEV >= lv) \
35240 + {zm_debug_msg2(msg, val);}
35241 +
35242 +#define zm_msg0_tx(lv, msg) if (ZM_TXMSG_LEV >= lv) \
35243 + {zm_debug_msg0(msg);}
35244 +#define zm_msg1_tx(lv, msg, val) if (ZM_TXMSG_LEV >= lv) \
35245 + {zm_debug_msg1(msg, val);}
35246 +#define zm_msg2_tx(lv, msg, val) if (ZM_TXMSG_LEV >= lv) \
35247 + {zm_debug_msg2(msg, val);}
35248 +
35249 +#define zm_msg0_rx(lv, msg) if (ZM_RXMSG_LEV >= lv) \
35250 + {zm_debug_msg0(msg);}
35251 +#define zm_msg1_rx(lv, msg, val) if (ZM_RXMSG_LEV >= lv) \
35252 + {zm_debug_msg1(msg, val);}
35253 +#define zm_msg2_rx(lv, msg, val) if (ZM_RXMSG_LEV >= lv) \
35254 + {zm_debug_msg2(msg, val);}
35255 +
35256 +#define zm_msg0_mm(lv, msg) if (ZM_MMMSG_LEV >= lv) \
35257 + {zm_debug_msg0(msg);}
35258 +#define zm_msg1_mm(lv, msg, val) if (ZM_MMMSG_LEV >= lv) \
35259 + {zm_debug_msg1(msg, val);}
35260 +#define zm_msg2_mm(lv, msg, val) if (ZM_MMMSG_LEV >= lv) \
35261 + {zm_debug_msg2(msg, val);}
35262 +
35263 +#define zm_msg0_des(lv, msg) if (ZM_DESMSG_LEV >= lv) \
35264 + {zm_debug_msg0(msg);}
35265 +#define zm_msg1_des(lv, msg, val) if (ZM_DESMSG_LEV >= lv) \
35266 + {zm_debug_msg1(msg, val);}
35267 +#define zm_msg2_des(lv, msg, val) if (ZM_DESMSG_LEV >= lv) \
35268 + {zm_debug_msg2(msg, val);}
35269 +
35270 +#define zm_msg0_buf(lv, msg) if (ZM_BUFMSG_LEV >= lv) \
35271 + {zm_debug_msg0(msg);}
35272 +#define zm_msg1_buf(lv, msg, val) if (ZM_BUFMSG_LEV >= lv) \
35273 + {zm_debug_msg1(msg, val);}
35274 +#define zm_msg2_buf(lv, msg, val) if (ZM_BUFMSG_LEV >= lv) \
35275 + {zm_debug_msg2(msg, val);}
35276 +
35277 +#define zm_msg0_init(lv, msg) if (ZM_INITMSG_LEV >= lv) \
35278 + {zm_debug_msg0(msg);}
35279 +#define zm_msg1_init(lv, msg, val) if (ZM_INITMSG_LEV >= lv) \
35280 + {zm_debug_msg1(msg, val);}
35281 +#define zm_msg2_init(lv, msg, val) if (ZM_INITMSG_LEV >= lv) \
35282 + {zm_debug_msg2(msg, val);}
35283 +
35284 +#define ZM_MAX_AP_SUPPORT 2 /* Must <= 8 */
35285 +#define ZM_MAX_WDS_SUPPORT 6 /* Must <= 6 */
35286 +#define ZM_MAX_STA_SUPPORT 16 /* Must <= 64 */
35287 +
35288 +/* STA table state */
35289 +#define ZM_STATE_AUTH 1
35290 +#define ZM_STATE_PREAUTH 2
35291 +#define ZM_STATE_ASOC 3
35292 +
35293 +/* Rate set */
35294 +#define ZM_RATE_SET_CCK 0
35295 +#define ZM_RATE_SET_OFDM 1
35296 +
35297 +/* HT PT */
35298 +#define ZM_PREAMBLE_TYPE_MIXED_MODE 0
35299 +#define ZM_PREAMBLE_TYPE_GREEN_FIELD 1
35300 +
35301 +/* HT bandwidth */
35302 +#define ZM_BANDWIDTH_20MHZ 0
35303 +#define ZM_BANDWIDTH_40MHZ 1
35304 +
35305 +/* MIC status */
35306 +#define ZM_MIC_SUCCESS 0
35307 +#define ZM_MIC_FAILURE 1
35308 +
35309 +/* ICV status */
35310 +#define ZM_ICV_SUCCESS 0
35311 +#define ZM_ICV_FAILURE 1
35312 +
35313 +/* definition check */
35314 +#if (ZM_MAX_AP_SUPPORT > 8)
35315 +definition error, ZM_MAX_AP_SUPPORT > 8
35316 +#endif
35317 +#if (ZM_MAX_AP_SUPPORT > 64)
35318 +definition error, ZM_MAX_STA_SUPPORT > 64
35319 +#endif
35320 +
35321 +/* Transmission Rate information */
35322 +
35323 +/* WLAN frame format */
35324 +#define ZM_PLCP_HEADER_SIZE 5
35325 +#define ZM_ETHERNET_ADDRESS_LENGTH 6
35326 +#define ZM_TIMESTAMP_OFFSET 0
35327 +#define ZM_BEACON_INTERVAL_OFFSET 8
35328 +#define ZM_CAPABILITY_OFFSET 10
35329 +
35330 +/* Reason Code */
35331 +/* An unsolicited notification management frame of */
35332 +/* type Disassocation or Deauthentication was generated. */
35333 +#ifdef ZM_REASON_CODE
35334 +#define ZM_WLAN_REASON_CODE_UNSPECIFIED 1
35335 +#define ZM_WLAN_FRAME_DISASOC_DEAUTH_REASON_CODE 24
35336 +#endif
35337 +
35338 +struct zsWlanManagementFrameHeader
35339 +{
35340 + //u8_t plcpHdr[ZM_PLCP_HEADER_SIZE];
35341 + u8_t frameCtrl[2];
35342 + u8_t duration[2];
35343 + u8_t da[ZM_ETHERNET_ADDRESS_LENGTH];
35344 + u8_t sa[ZM_ETHERNET_ADDRESS_LENGTH];
35345 + u8_t bssid[ZM_ETHERNET_ADDRESS_LENGTH];
35346 + u8_t seqCtrl[2];
35347 + u8_t body[1];
35348 +};
35349 +
35350 +struct zsWlanProbeRspFrameHeader
35351 +{
35352 + //u8_t plcpHdr[ZM_PLCP_HEADER_SIZE];
35353 + u8_t frameCtrl[2];
35354 + u8_t duration[2];
35355 + u8_t da[ZM_ETHERNET_ADDRESS_LENGTH];
35356 + u8_t sa[ZM_ETHERNET_ADDRESS_LENGTH];
35357 + u8_t bssid[ZM_ETHERNET_ADDRESS_LENGTH];
35358 + u8_t seqCtrl[2];
35359 + u8_t timeStamp[8];
35360 + u8_t beaconInterval[2];
35361 + u8_t capability[2];
35362 + u8_t ssid[ZM_MAX_SSID_LENGTH + 2]; // EID(1) + Length(1) + SSID(32)
35363 +} ;
35364 +
35365 +#define zsWlanBeaconFrameHeader zsWlanProbeRspFrameHeader
35366 +
35367 +struct zsWlanAuthFrameHeader
35368 +{
35369 + //u8_t plcpHdr[ZM_PLCP_HEADER_SIZE];
35370 + u8_t frameCtrl[2];
35371 + u8_t duration[2];
35372 + u8_t address1[ZM_ETHERNET_ADDRESS_LENGTH];
35373 + u8_t address2[ZM_ETHERNET_ADDRESS_LENGTH];
35374 + u8_t address3[ZM_ETHERNET_ADDRESS_LENGTH];
35375 + u8_t seqCtrl[2];
35376 + u16_t algo;
35377 + u16_t seq;
35378 + u16_t status;
35379 + u8_t challengeText[255]; // the first 2 bytes are information ID, length
35380 +};
35381 +
35382 +struct zsWlanAssoFrameHeader
35383 +{
35384 + //u8_t plcpHdr[PLCP_HEADER_SIZE];
35385 + u8_t frameCtrl[2];
35386 + u8_t duration[2];
35387 + u8_t address1[ZM_ETHERNET_ADDRESS_LENGTH];
35388 + u8_t address2[ZM_ETHERNET_ADDRESS_LENGTH];
35389 + u8_t address3[ZM_ETHERNET_ADDRESS_LENGTH];
35390 + u8_t seqCtrl[2];
35391 + u8_t capability[2];
35392 + u16_t status;
35393 + u16_t aid;
35394 + //u8_t supportedRates[10];
35395 +};
35396 +
35397 +struct zsFrag
35398 +{
35399 + zbuf_t* buf[16];
35400 + u16_t bufType[16];
35401 + u16_t seq[16];
35402 + u8_t flag[16];
35403 +
35404 +};
35405 +
35406 +//================================
35407 +// Hardware related definitions
35408 +//================================
35409 +#define ZM_MAC_REG_BASE 0x1c3000
35410 +
35411 +#define ZM_MAC_REG_ATIM_WINDOW (ZM_MAC_REG_BASE + 0x51C)
35412 +#define ZM_MAC_REG_BCN_PERIOD (ZM_MAC_REG_BASE + 0x520)
35413 +#define ZM_MAC_REG_PRETBTT (ZM_MAC_REG_BASE + 0x524)
35414 +
35415 +#define ZM_MAC_REG_MAC_ADDR_L (ZM_MAC_REG_BASE + 0x610)
35416 +#define ZM_MAC_REG_MAC_ADDR_H (ZM_MAC_REG_BASE + 0x614)
35417 +
35418 +#define ZM_MAC_REG_GROUP_HASH_TBL_L (ZM_MAC_REG_BASE + 0x624)
35419 +#define ZM_MAC_REG_GROUP_HASH_TBL_H (ZM_MAC_REG_BASE + 0x628)
35420 +
35421 +#define ZM_MAC_REG_BASIC_RATE (ZM_MAC_REG_BASE + 0x630)
35422 +#define ZM_MAC_REG_MANDATORY_RATE (ZM_MAC_REG_BASE + 0x634)
35423 +#define ZM_MAC_REG_RTS_CTS_RATE (ZM_MAC_REG_BASE + 0x638)
35424 +#define ZM_MAC_REG_BACKOFF_PROTECT (ZM_MAC_REG_BASE + 0x63c)
35425 +#define ZM_MAC_REG_RX_THRESHOLD (ZM_MAC_REG_BASE + 0x640)
35426 +#define ZM_MAC_REG_RX_PE_DELAY (ZM_MAC_REG_BASE + 0x64C)
35427 +
35428 +#define ZM_MAC_REG_DYNAMIC_SIFS_ACK (ZM_MAC_REG_BASE + 0x658)
35429 +#define ZM_MAC_REG_SNIFFER (ZM_MAC_REG_BASE + 0x674)
35430 +#define ZM_MAC_REG_TX_UNDERRUN (ZM_MAC_REG_BASE + 0x688)
35431 +#define ZM_MAC_REG_RX_TOTAL (ZM_MAC_REG_BASE + 0x6A0)
35432 +#define ZM_MAC_REG_RX_CRC32 (ZM_MAC_REG_BASE + 0x6A4)
35433 +#define ZM_MAC_REG_RX_CRC16 (ZM_MAC_REG_BASE + 0x6A8)
35434 +#define ZM_MAC_REG_RX_ERR_UNI (ZM_MAC_REG_BASE + 0x6AC)
35435 +#define ZM_MAC_REG_RX_OVERRUN (ZM_MAC_REG_BASE + 0x6B0)
35436 +#define ZM_MAC_REG_RX_ERR_MUL (ZM_MAC_REG_BASE + 0x6BC)
35437 +#define ZM_MAC_REG_TX_RETRY (ZM_MAC_REG_BASE + 0x6CC)
35438 +#define ZM_MAC_REG_TX_TOTAL (ZM_MAC_REG_BASE + 0x6F4)
35439 +
35440 +
35441 +#define ZM_MAC_REG_ACK_EXTENSION (ZM_MAC_REG_BASE + 0x690)
35442 +#define ZM_MAC_REG_EIFS_AND_SIFS (ZM_MAC_REG_BASE + 0x698)
35443 +
35444 +#define ZM_MAC_REG_SLOT_TIME (ZM_MAC_REG_BASE + 0x6F0)
35445 +
35446 +#define ZM_MAC_REG_ROLL_CALL_TBL_L (ZM_MAC_REG_BASE + 0x704)
35447 +#define ZM_MAC_REG_ROLL_CALL_TBL_H (ZM_MAC_REG_BASE + 0x708)
35448 +
35449 +#define ZM_MAC_REG_AC0_CW (ZM_MAC_REG_BASE + 0xB00)
35450 +#define ZM_MAC_REG_AC1_CW (ZM_MAC_REG_BASE + 0xB04)
35451 +#define ZM_MAC_REG_AC2_CW (ZM_MAC_REG_BASE + 0xB08)
35452 +#define ZM_MAC_REG_AC3_CW (ZM_MAC_REG_BASE + 0xB0C)
35453 +#define ZM_MAC_REG_AC4_CW (ZM_MAC_REG_BASE + 0xB10)
35454 +#define ZM_MAC_REG_AC1_AC0_AIFS (ZM_MAC_REG_BASE + 0xB14)
35455 +#define ZM_MAC_REG_AC3_AC2_AIFS (ZM_MAC_REG_BASE + 0xB18)
35456 +
35457 +#define ZM_MAC_REG_RETRY_MAX (ZM_MAC_REG_BASE + 0xB28)
35458 +
35459 +#define ZM_MAC_REG_TXOP_NOT_ENOUGH_INDICATION (ZM_MAC_REG_BASE + 0xB30)
35460 +
35461 +#define ZM_MAC_REG_AC1_AC0_TXOP (ZM_MAC_REG_BASE + 0xB44)
35462 +#define ZM_MAC_REG_AC3_AC2_TXOP (ZM_MAC_REG_BASE + 0xB48)
35463 +
35464 +#define ZM_MAC_REG_ACK_TABLE (ZM_MAC_REG_BASE + 0xC00)
35465 +
35466 +#define ZM_MAC_REG_BCN_ADDR (ZM_MAC_REG_BASE + 0xD84)
35467 +#define ZM_MAC_REG_BCN_LENGTH (ZM_MAC_REG_BASE + 0xD88)
35468 +
35469 +#define ZM_MAC_REG_BCN_PLCP (ZM_MAC_REG_BASE + 0xD90)
35470 +#define ZM_MAC_REG_BCN_CTRL (ZM_MAC_REG_BASE + 0xD94)
35471 +
35472 +#define ZM_MAC_REG_BCN_HT1 (ZM_MAC_REG_BASE + 0xDA0)
35473 +#define ZM_MAC_REG_BCN_HT2 (ZM_MAC_REG_BASE + 0xDA4)
35474 +
35475 +
35476 +#define ZM_RX_STATUS_IS_MIC_FAIL(rxStatus) rxStatus->Tail.Data.ErrorIndication & ZM_BIT_6
35477 +
35478 +//================================
35479 +//================================
35480 +
35481 +#ifdef ZM_ENABLE_NATIVE_WIFI
35482 +#define ZM_80211_FRAME_HEADER_LEN 24
35483 +#define ZM_80211_FRAME_TYPE_OFFSET 30 // ZM_80211_FRAME_HEADER_LEN + SNAP
35484 +#define ZM_80211_FRAME_IP_OFFSET 32 // ZM_80211_FRAME_HEADER_LEN + SNAP + TYPE
35485 +#else
35486 +#define ZM_80211_FRAME_HEADER_LEN 14
35487 +#define ZM_80211_FRAME_TYPE_OFFSET 12 // ZM_80211_FRAME_HEADER_LEN + SNAP
35488 +#define ZM_80211_FRAME_IP_OFFSET 14 // ZM_80211_FRAME_HEADER_LEN + SNAP + TYPE
35489 +#endif
35490 +
35491 +#define ZM_BSS_INFO_VALID_BIT 0x01
35492 +#define ZM_BSS_INFO_UPDATED_BIT 0x02
35493 +
35494 +
35495 +
35496 +
35497 +
35498 +#define ZM_ERROR_INDICATION_RX_TIMEOUT 0x01
35499 +#define ZM_ERROR_INDICATION_OVERRUN 0x02
35500 +#define ZM_ERROR_INDICATION_DECRYPT_ERROR 0x04
35501 +#define ZM_ERROR_INDICATION_CRC32_ERROR 0x08
35502 +#define ZM_ERROR_INDICATION_ADDR_NOT_MATCH 0x10
35503 +#define ZM_ERROR_INDICATION_CRC16_ERROR 0x20
35504 +#define ZM_ERROR_INDICATION_MIC_ERROR 0x40
35505 +
35506 +#define ZM_RXMAC_STATUS_MOD_TYPE_CCK 0x00
35507 +#define ZM_RXMAC_STATUS_MOD_TYPE_OFDM 0x01
35508 +#define ZM_RXMAC_STATUS_MOD_TYPE_HT_OFDM 0x02
35509 +#define ZM_RXMAC_STATUS_MOD_TYPE_DL_OFDM 0x03
35510 +#define ZM_RXMAC_STATUS_TOTAL_ERROR 0x80
35511 +
35512 +
35513 +
35514 +
35515 +
35516 +#define ZM_MAX_LED_NUMBER 2
35517 +
35518 +#define ZM_LED_DISABLE_MODE 0x0
35519 +#define ZM_LED_LINK_MODE 0x1
35520 +#define ZM_LED_LINK_TR_MODE 0x2
35521 +#define ZM_LED_TR_ON_MODE 0x3
35522 +#define ZM_LED_TR_OFF_MODE 0x4
35523 +
35524 +#define ZM_LED_CTRL_FLAG_ALPHA 0x1
35525 +
35526 +struct zsLedStruct
35527 +{
35528 + u32_t counter;
35529 + u32_t counter100ms;
35530 + u16_t ledLinkState;
35531 + u16_t ledMode[ZM_MAX_LED_NUMBER];
35532 + u32_t txTraffic;
35533 + u32_t rxTraffic;
35534 + u8_t LEDCtrlType;
35535 + u8_t LEDCtrlFlag; // Control Flag for vendors
35536 + u8_t LEDCtrlFlagFromReg; // Control Flag for vendors in registry
35537 +};
35538 +
35539 +
35540 +//HAL+ capability bits definition
35541 +#define ZM_HP_CAP_11N 0x1
35542 +#define ZM_HP_CAP_11N_ONE_TX_STREAM 0x2
35543 +#define ZM_HP_CAP_2G 0x4
35544 +#define ZM_HP_CAP_5G 0x8
35545 +
35546 +#endif /* #ifndef _WLAN_H */
35547 --- /dev/null
35548 +++ b/drivers/staging/otus/apdbg.c
35549 @@ -0,0 +1,457 @@
35550 +/*
35551 + * Copyright (c) 2007-2008 Atheros Communications Inc.
35552 + *
35553 + * Permission to use, copy, modify, and/or distribute this software for any
35554 + * purpose with or without fee is hereby granted, provided that the above
35555 + * copyright notice and this permission notice appear in all copies.
35556 + *
35557 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
35558 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
35559 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
35560 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
35561 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
35562 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
35563 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
35564 + */
35565 +/* */
35566 +/* Module Name : apdbg.c */
35567 +/* */
35568 +/* Abstract */
35569 +/* Debug tools */
35570 +/* */
35571 +/* NOTES */
35572 +/* None */
35573 +/* */
35574 +/************************************************************************/
35575 +
35576 +#include <stdio.h>
35577 +#include <stdlib.h>
35578 +#include <unistd.h>
35579 +#include <string.h>
35580 +#include <errno.h>
35581 +#include <ctype.h>
35582 +#include <sys/types.h>
35583 +#include <sys/socket.h>
35584 +#include <sys/ioctl.h>
35585 +#include <net/if.h>
35586 +#include <netinet/in.h>
35587 +
35588 +#include <linux/sockios.h>
35589 +
35590 +#define ZM_IOCTL_REG_READ 0x01
35591 +#define ZM_IOCTL_REG_WRITE 0x02
35592 +#define ZM_IOCTL_MEM_DUMP 0x03
35593 +#define ZM_IOCTL_REG_DUMP 0x05
35594 +#define ZM_IOCTL_TXD_DUMP 0x06
35595 +#define ZM_IOCTL_RXD_DUMP 0x07
35596 +#define ZM_IOCTL_MEM_READ 0x0B
35597 +#define ZM_IOCTL_MEM_WRITE 0x0C
35598 +#define ZM_IOCTL_DMA_TEST 0x10
35599 +#define ZM_IOCTL_REG_TEST 0x11
35600 +#define ZM_IOCTL_TEST 0x80
35601 +#define ZM_IOCTL_TALLY 0x81 //CWYang(+)
35602 +#define ZM_IOCTL_RTS 0xA0
35603 +#define ZM_IOCTL_MIX_MODE 0xA1
35604 +#define ZM_IOCTL_FRAG 0xA2
35605 +#define ZM_IOCTL_SCAN 0xA3
35606 +#define ZM_IOCTL_KEY 0xA4
35607 +#define ZM_IOCTL_RATE 0xA5
35608 +#define ZM_IOCTL_ENCRYPTION_MODE 0xA6
35609 +#define ZM_IOCTL_GET_TXCNT 0xA7
35610 +#define ZM_IOCTL_GET_DEAGG_CNT 0xA8
35611 +#define ZM_IOCTL_DURATION_MODE 0xA9
35612 +#define ZM_IOCTL_SET_AES_KEY 0xAA
35613 +#define ZM_IOCTL_SET_AES_MODE 0xAB
35614 +#define ZM_IOCTL_SIGNAL_STRENGTH 0xAC //CWYang(+)
35615 +#define ZM_IOCTL_SIGNAL_QUALITY 0xAD //CWYang(+)
35616 +#define ZM_IOCTL_SET_PIBSS_MODE 0xAE
35617 +#define ZDAPIOCTL SIOCDEVPRIVATE
35618 +
35619 +struct zdap_ioctl {
35620 + unsigned short cmd; /* Command to run */
35621 + unsigned int addr; /* Length of the data buffer */
35622 + unsigned int value; /* Pointer to the data buffer */
35623 + unsigned char data[0x100];
35624 +};
35625 +
35626 +/* Declaration of macro and function for handling WEP Keys */
35627 +
35628 +#if 0
35629 +
35630 +#define SKIP_ELEM { \
35631 + while(isxdigit(*p)) \
35632 + p++; \
35633 +}
35634 +
35635 +#define SKIP_DELIMETER { \
35636 + if(*p == ':' || *p == ' ') \
35637 + p++; \
35638 +}
35639 +
35640 +#endif
35641 +
35642 +char hex(char);
35643 +unsigned char asctohex(char *str);
35644 +
35645 +char *prgname;
35646 +
35647 +int set_ioctl(int sock, struct ifreq *req)
35648 +{
35649 + if (ioctl(sock, ZDAPIOCTL, req) < 0) {
35650 + fprintf(stderr, "%s: ioctl(SIOCGIFMAP): %s\n",
35651 + prgname, strerror(errno));
35652 + return -1;
35653 + }
35654 +
35655 + return 0;
35656 +}
35657 +
35658 +
35659 +int read_reg(int sock, struct ifreq *req)
35660 +{
35661 + struct zdap_ioctl *zdreq = 0;
35662 +
35663 + if (!set_ioctl(sock, req))
35664 + return -1;
35665 +
35666 + //zdreq = (struct zdap_ioctl *)req->ifr_data;
35667 + //printf( "reg = %4x, value = %4x\n", zdreq->addr, zdreq->value);
35668 +
35669 + return 0;
35670 +}
35671 +
35672 +
35673 +int read_mem(int sock, struct ifreq *req)
35674 +{
35675 + struct zdap_ioctl *zdreq = 0;
35676 + int i;
35677 +
35678 + if (!set_ioctl(sock, req))
35679 + return -1;
35680 +
35681 + /*zdreq = (struct zdap_ioctl *)req->ifr_data;
35682 + printf( "dump mem from %x, length = %x\n", zdreq->addr, zdreq->value);
35683 +
35684 + for (i=0; i<zdreq->value; i++) {
35685 + printf("%02x", zdreq->data[i]);
35686 + printf(" ");
35687 +
35688 + if ((i>0) && ((i+1)%16 == 0))
35689 + printf("\n");
35690 + }*/
35691 +
35692 + return 0;
35693 +}
35694 +
35695 +
35696 +int main(int argc, char **argv)
35697 +{
35698 + int sock;
35699 + int addr, value;
35700 + struct ifreq req;
35701 + char *action = NULL;
35702 + struct zdap_ioctl zdreq;
35703 +
35704 + prgname = argv[0];
35705 +
35706 + if (argc < 3) {
35707 + fprintf(stderr,"%s: usage is \"%s <ifname> <operation> [<address>] [<value>]\"\n",
35708 + prgname, prgname);
35709 + fprintf(stderr,"valid operation: read, write, mem, reg,\n");
35710 + fprintf(stderr," : txd, rxd, rmem, wmem\n");
35711 + fprintf(stderr," : dmat, regt, test\n");
35712 +
35713 + fprintf(stderr," scan, Channel Scan\n");
35714 + fprintf(stderr," rts <decimal>, Set RTS Threshold\n");
35715 + fprintf(stderr," frag <decimal>, Set Fragment Threshold\n");
35716 + fprintf(stderr," rate <0-28>, 0:AUTO, 1-4:CCK, 5-12:OFDM, 13-28:HT\n");
35717 + fprintf(stderr," TBD mix <0 or 1>, Set 1 to enable mixed mode\n");
35718 + fprintf(stderr," enc, <0-3>, 0=>OPEN, 1=>WEP64, 2=>WEP128, 3=>WEP256\n");
35719 + fprintf(stderr," skey <key>, Set WEP key\n");
35720 + fprintf(stderr," txcnt, Get TxQ Cnt\n");
35721 + fprintf(stderr," dagcnt, Get Deaggregate Cnt\n");
35722 + fprintf(stderr," durmode <mode>, Set Duration Mode 0=>HW, 1=>SW\n");
35723 + fprintf(stderr," aeskey <user> <key>\n");
35724 + fprintf(stderr," aesmode <mode>\n");
35725 + fprintf(stderr," wlanmode <0,1> 0:Station mode, 1:PIBSS mode\n");
35726 + fprintf(stderr," tal <0,1>, Get Current Tally Info, 0=>read, 1=>read and reset\n");
35727 +
35728 + exit(1);
35729 + }
35730 +
35731 + strcpy(req.ifr_name, argv[1]);
35732 + zdreq.addr = 0;
35733 + zdreq.value = 0;
35734 +
35735 + /* a silly raw socket just for ioctl()ling it */
35736 + sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
35737 + if (sock < 0) {
35738 + fprintf(stderr, "%s: socket(): %s\n", argv[0], strerror(errno));
35739 + exit(1);
35740 + }
35741 +
35742 + if (argc >= 4)
35743 + {
35744 + sscanf(argv[3], "%x", &addr);
35745 + }
35746 +
35747 + if (argc >= 5)
35748 + {
35749 + sscanf(argv[4], "%x", &value);
35750 + }
35751 +
35752 + zdreq.addr = addr;
35753 + zdreq.value = value;
35754 +
35755 + if (!strcmp(argv[2], "read"))
35756 + {
35757 + zdreq.cmd = ZM_IOCTL_REG_READ;
35758 + }
35759 + else if (!strcmp(argv[2], "mem"))
35760 + {
35761 + zdreq.cmd = ZM_IOCTL_MEM_DUMP;
35762 + }
35763 + else if (!strcmp(argv[2], "write"))
35764 + {
35765 + zdreq.cmd = ZM_IOCTL_REG_WRITE;
35766 + }
35767 + else if (!strcmp(argv[2], "reg"))
35768 + {
35769 + zdreq.cmd = ZM_IOCTL_REG_DUMP;
35770 + }
35771 + else if (!strcmp(argv[2], "txd"))
35772 + {
35773 + zdreq.cmd = ZM_IOCTL_TXD_DUMP;
35774 + }
35775 + else if (!strcmp(argv[2], "rxd"))
35776 + {
35777 + zdreq.cmd = ZM_IOCTL_RXD_DUMP;
35778 + }
35779 + else if (!strcmp(argv[2], "rmem"))
35780 + {
35781 + zdreq.cmd = ZM_IOCTL_MEM_READ;
35782 + }
35783 + else if (!strcmp(argv[2], "wmem"))
35784 + {
35785 + zdreq.cmd = ZM_IOCTL_MEM_WRITE;
35786 + }
35787 + else if (!strcmp(argv[2], "dmat"))
35788 + {
35789 + zdreq.cmd = ZM_IOCTL_DMA_TEST;
35790 + }
35791 + else if (!strcmp(argv[2], "regt"))
35792 + {
35793 + zdreq.cmd = ZM_IOCTL_REG_TEST;
35794 + }
35795 + else if (!strcmp(argv[2], "test"))
35796 + {
35797 + zdreq.cmd = ZM_IOCTL_TEST;
35798 + }
35799 + else if (!strcmp(argv[2], "tal"))
35800 + {
35801 + sscanf(argv[3], "%d", &addr);
35802 + zdreq.addr = addr;
35803 + zdreq.cmd = ZM_IOCTL_TALLY;
35804 + }
35805 + else if (!strcmp(argv[2], "rts"))
35806 + {
35807 + sscanf(argv[3], "%d", &addr);
35808 + zdreq.addr = addr;
35809 + zdreq.cmd = ZM_IOCTL_RTS;
35810 + }
35811 + else if (!strcmp(argv[2], "mix"))
35812 + {
35813 + zdreq.cmd = ZM_IOCTL_MIX_MODE;
35814 + }
35815 + else if (!strcmp(argv[2], "frag"))
35816 + {
35817 + sscanf(argv[3], "%d", &addr);
35818 + zdreq.addr = addr;
35819 + zdreq.cmd = ZM_IOCTL_FRAG;
35820 + }
35821 + else if (!strcmp(argv[2], "scan"))
35822 + {
35823 + zdreq.cmd = ZM_IOCTL_SCAN;
35824 + }
35825 + else if (!strcmp(argv[2], "skey"))
35826 + {
35827 + zdreq.cmd = ZM_IOCTL_KEY;
35828 +
35829 + if (argc >= 4)
35830 + {
35831 + unsigned char temp[29];
35832 + int i;
35833 + int keyLen;
35834 + int encType;
35835 +
35836 + keyLen = strlen(argv[3]);
35837 +
35838 + if (keyLen == 10)
35839 + {
35840 + sscanf(argv[3], "%02x%02x%02x%02x%02x", &temp[0], &temp[1],
35841 + &temp[2], &temp[3], &temp[4]);
35842 + }
35843 + else if (keyLen == 26)
35844 + {
35845 + sscanf(argv[3], "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
35846 + &temp[0], &temp[1], &temp[2], &temp[3], &temp[4],
35847 + &temp[5], &temp[6], &temp[7], &temp[8], &temp[9],
35848 + &temp[10], &temp[11], &temp[12]);
35849 + }
35850 + else if (keyLen == 58)
35851 + {
35852 + sscanf(argv[3], "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
35853 + &temp[0], &temp[1], &temp[2], &temp[3], &temp[4],
35854 + &temp[5], &temp[6], &temp[7], &temp[8], &temp[9],
35855 + &temp[10], &temp[11], &temp[12], &temp[13], &temp[14],
35856 + &temp[15], &temp[16], &temp[17], &temp[18], &temp[19],
35857 + &temp[20], &temp[21], &temp[22], &temp[23], &temp[24],
35858 + &temp[25], &temp[26], &temp[27], &temp[28]);
35859 + }
35860 + else
35861 + {
35862 + fprintf(stderr, "Invalid key length\n");
35863 + exit(1);
35864 + }
35865 + zdreq.addr = keyLen/2;
35866 +
35867 + for(i=0; i<zdreq.addr; i++)
35868 + {
35869 + zdreq.data[i] = temp[i];
35870 + }
35871 + }
35872 + else
35873 + {
35874 + printf("Error : Key required!\n");
35875 + }
35876 + }
35877 + else if (!strcmp(argv[2], "rate"))
35878 + {
35879 + sscanf(argv[3], "%d", &addr);
35880 +
35881 + if (addr > 28)
35882 + {
35883 + fprintf(stderr, "Invalid rate, range:0~28\n");
35884 + exit(1);
35885 + }
35886 + zdreq.addr = addr;
35887 + zdreq.cmd = ZM_IOCTL_RATE;
35888 + }
35889 + else if (!strcmp(argv[2], "enc"))
35890 + {
35891 + sscanf(argv[3], "%d", &addr);
35892 +
35893 + if (addr > 3)
35894 + {
35895 + fprintf(stderr, "Invalid encryption mode, range:0~3\n");
35896 + exit(1);
35897 + }
35898 +
35899 + if (addr == 2)
35900 + {
35901 + addr = 5;
35902 + }
35903 + else if (addr == 3)
35904 + {
35905 + addr = 6;
35906 + }
35907 +
35908 + zdreq.addr = addr;
35909 + zdreq.cmd = ZM_IOCTL_ENCRYPTION_MODE;
35910 + }
35911 + else if (!strcmp(argv[2], "txcnt"))
35912 + {
35913 + zdreq.cmd = ZM_IOCTL_GET_TXCNT;
35914 + }
35915 + else if (!strcmp(argv[2], "dagcnt"))
35916 + {
35917 + sscanf(argv[3], "%d", &addr);
35918 +
35919 + if (addr != 0 && addr != 1)
35920 + {
35921 + fprintf(stderr, "The value should be 0 or 1\n");
35922 + exit(0);
35923 + }
35924 +
35925 + zdreq.addr = addr;
35926 + zdreq.cmd = ZM_IOCTL_GET_DEAGG_CNT;
35927 + }
35928 + else if (!strcmp(argv[2], "durmode"))
35929 + {
35930 + sscanf(argv[3], "%d", &addr);
35931 +
35932 + if (addr != 0 && addr != 1)
35933 + {
35934 + fprintf(stderr, "The Duration mode should be 0 or 1\n");
35935 + exit(0);
35936 + }
35937 +
35938 + zdreq.addr = addr;
35939 + zdreq.cmd = ZM_IOCTL_DURATION_MODE;
35940 + }
35941 + else if (!strcmp(argv[2], "aeskey"))
35942 + {
35943 + unsigned char temp[16];
35944 + int i;
35945 +
35946 + sscanf(argv[3], "%d", &addr);
35947 +
35948 + sscanf(argv[4], "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", &temp[0], &temp[1], &temp[2], &temp[3], &temp[4], &temp[5], &temp[6], &temp[7], &temp[8], &temp[9], &temp[10], &temp[11], &temp[12], &temp[13], &temp[14], &temp[15]);
35949 +
35950 + for(i = 0; i < 16; i++)
35951 + {
35952 + zdreq.data[i] = temp[i];
35953 + }
35954 +
35955 + zdreq.addr = addr;
35956 + zdreq.cmd = ZM_IOCTL_SET_AES_KEY;
35957 + }
35958 + else if (!strcmp(argv[2], "aesmode"))
35959 + {
35960 + sscanf(argv[3], "%d", &addr);
35961 +
35962 + zdreq.addr = addr;
35963 + zdreq.cmd = ZM_IOCTL_SET_AES_MODE;
35964 + }
35965 + else if (!strcmp(argv[2], "wlanmode"))
35966 + {
35967 + sscanf(argv[3], "%d", &addr);
35968 +
35969 + zdreq.addr = addr;
35970 + zdreq.cmd = ZM_IOCTL_SET_PIBSS_MODE;
35971 + }
35972 + else
35973 + {
35974 + fprintf(stderr, "error action\n");
35975 + exit(1);
35976 + }
35977 +
35978 + req.ifr_data = (char *)&zdreq;
35979 + set_ioctl(sock, &req);
35980 +
35981 +fail:
35982 + exit(0);
35983 +}
35984 +
35985 +unsigned char asctohex(char *str)
35986 +{
35987 + unsigned char value;
35988 +
35989 + value = hex(*str) & 0x0f;
35990 + value = value << 4;
35991 + str++;
35992 + value |= hex(*str) & 0x0f;
35993 +
35994 + return value;
35995 +}
35996 +
35997 +char hex(char v)
35998 +{
35999 + if(isdigit(v))
36000 + return v - '0';
36001 + else if(isxdigit(v))
36002 + return (tolower(v) - 'a' + 10);
36003 + else
36004 + return 0;
36005 +}
36006 +
36007 --- /dev/null
36008 +++ b/drivers/staging/otus/athr_common.h
36009 @@ -0,0 +1,141 @@
36010 +/*
36011 + * Copyright (c) 2007-2008 Atheros Communications Inc.
36012 + *
36013 + * Permission to use, copy, modify, and/or distribute this software for any
36014 + * purpose with or without fee is hereby granted, provided that the above
36015 + * copyright notice and this permission notice appear in all copies.
36016 + *
36017 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
36018 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
36019 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
36020 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
36021 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
36022 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
36023 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
36024 + */
36025 +/* Module Name : athr_common.h */
36026 +/* */
36027 +/* Abstract */
36028 +/* WPA related function and data structure definitions. */
36029 +/* */
36030 +/* NOTES */
36031 +/* Platform dependent. */
36032 +/* */
36033 +/************************************************************************/
36034 +
36035 +#ifndef _ATHR_COMMON_H
36036 +#define _ATHR_COMMON_H
36037 +
36038 +#define ZD_IOCTL_WPA (SIOCDEVPRIVATE + 1)
36039 +#define ZD_IOCTL_PARAM (SIOCDEVPRIVATE + 2)
36040 +#define ZD_IOCTL_GETWPAIE (SIOCDEVPRIVATE + 3)
36041 +#define ZD_PARAM_ROAMING 0x0001
36042 +#define ZD_PARAM_PRIVACY 0x0002
36043 +#define ZD_PARAM_WPA 0x0003
36044 +#define ZD_PARAM_COUNTERMEASURES 0x0004
36045 +#define ZD_PARAM_DROPUNENCRYPTED 0x0005
36046 +#define ZD_PARAM_AUTH_ALGS 0x0006
36047 +
36048 +#define ZD_CMD_SET_ENCRYPT_KEY 0x0001
36049 +#define ZD_CMD_SET_MLME 0x0002
36050 +#define ZD_CMD_SCAN_REQ 0x0003
36051 +#define ZD_CMD_SET_GENERIC_ELEMENT 0x0004
36052 +#define ZD_CMD_GET_TSC 0x0005
36053 +
36054 +#define ZD_FLAG_SET_TX_KEY 0x0001
36055 +
36056 +#define ZD_GENERIC_ELEMENT_HDR_LEN \
36057 +((int) (&((struct athr_wlan_param *) 0)->u.generic_elem.data))
36058 +
36059 +#define ZD_CRYPT_ALG_NAME_LEN 16
36060 +#define ZD_MAX_KEY_SIZE 32
36061 +#define ZD_MAX_GENERIC_SIZE 64
36062 +
36063 +#define IEEE80211_ADDR_LEN 6
36064 +#define IEEE80211_MAX_IE_SIZE 256
36065 +
36066 +#ifdef ZM_ENALBE_WAPI
36067 +#define ZM_CMD_WAPI_SETWAPI 0x0001
36068 +#define ZM_CMD_WAPI_GETWAPI 0x0002
36069 +#define ZM_CMD_WAPI_SETKEY 0x0003
36070 +#define ZM_CMD_WAPI_GETKEY 0x0004
36071 +#define ZM_CMD_WAPI_REKEY 0x0005
36072 +
36073 +#define ZM_WAPI_WAI_REQUEST 0x00f1
36074 +#define ZM_WAPI_UNICAST_REKEY 0x00f2
36075 +#define ZM_WAPI_STA_AGING 0x00f3
36076 +#define ZM_WAPI_MULTI_REKEY 0x00f4
36077 +
36078 +#define ZM_WAPI_KEY_SIZE 32
36079 +#define ZM_WAPI_IV_LEN 16
36080 +#endif //ZM_ENALBE_WAPI
36081 +/* structure definition */
36082 +
36083 +struct athr_wlan_param {
36084 + u32 cmd;
36085 + u8 sta_addr[ETH_ALEN];
36086 + union {
36087 + struct {
36088 + u8 alg[ZD_CRYPT_ALG_NAME_LEN];
36089 + u32 flags;
36090 + u32 err;
36091 + u8 idx;
36092 + u8 seq[8]; /* sequence counter (set: RX, get: TX) */
36093 + u16 key_len;
36094 + u8 key[ZD_MAX_KEY_SIZE];
36095 + } crypt;
36096 + struct {
36097 + u32 flags_and;
36098 + u32 flags_or;
36099 + } set_flags_sta;
36100 + struct {
36101 + u8 len;
36102 + u8 data[ZD_MAX_GENERIC_SIZE];
36103 + } generic_elem;
36104 + struct {
36105 +#define MLME_STA_DEAUTH 0
36106 +#define MLME_STA_DISASSOC 1
36107 + u16 cmd;
36108 + u16 reason_code;
36109 + } mlme;
36110 + struct {
36111 + u8 ssid_len;
36112 + u8 ssid[32];
36113 + } scan_req;
36114 + } u;
36115 +};
36116 +
36117 +struct ieee80211req_wpaie {
36118 + u8 wpa_macaddr[IEEE80211_ADDR_LEN];
36119 + u8 wpa_ie[IEEE80211_MAX_IE_SIZE];
36120 +};
36121 +
36122 +#ifdef ZM_ENALBE_WAPI
36123 +struct athr_wapi_param {
36124 + u16 cmd;
36125 + u16 len;
36126 +
36127 + union {
36128 + struct {
36129 + u8 sta_addr[ETH_ALEN];
36130 + u8 reserved;
36131 + u8 keyid;
36132 + u8 key[ZM_WAPI_KEY_SIZE];
36133 + } crypt;
36134 + struct {
36135 + u8 wapi_policy;
36136 + } info;
36137 + } u;
36138 +};
36139 +
36140 +struct athr_wapi_sta_info
36141 +{
36142 + u16 msg_type;
36143 + u16 datalen;
36144 + u8 sta_mac[ETH_ALEN];
36145 + u8 reserve_data[2];
36146 + u8 gsn[ZM_WAPI_IV_LEN];
36147 + u8 wie[256];
36148 +};
36149 +#endif //ZM_ENALBE_WAPI
36150 +#endif
36151 --- /dev/null
36152 +++ b/drivers/staging/otus/hal/hpani.c
36153 @@ -0,0 +1,732 @@
36154 +/*
36155 + * Copyright (c) 2007-2008 Atheros Communications Inc.
36156 + *
36157 + * Permission to use, copy, modify, and/or distribute this software for any
36158 + * purpose with or without fee is hereby granted, provided that the above
36159 + * copyright notice and this permission notice appear in all copies.
36160 + *
36161 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
36162 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
36163 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
36164 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
36165 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
36166 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
36167 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
36168 + */
36169 +#include "../80211core/cprecomp.h"
36170 +#include "hpani.h"
36171 +#include "hpusb.h"
36172 +
36173 +
36174 +extern u16_t zfDelayWriteInternalReg(zdev_t* dev, u32_t addr, u32_t val);
36175 +extern u16_t zfFlushDelayWrite(zdev_t* dev);
36176 +
36177 +/*
36178 + * Anti noise immunity support. We track phy errors and react
36179 + * to excessive errors by adjusting the noise immunity parameters.
36180 + */
36181 +
36182 +/******************************************************************************
36183 + *
36184 + * New Ani Algorithm for Station side only
36185 + *
36186 + *****************************************************************************/
36187 +
36188 +#define ZM_HAL_NOISE_IMMUNE_MAX 4 /* Max noise immunity level */
36189 +#define ZM_HAL_SPUR_IMMUNE_MAX 7 /* Max spur immunity level */
36190 +#define ZM_HAL_FIRST_STEP_MAX 2 /* Max first step level */
36191 +
36192 +#define ZM_HAL_ANI_OFDM_TRIG_HIGH 500
36193 +#define ZM_HAL_ANI_OFDM_TRIG_LOW 200
36194 +#define ZM_HAL_ANI_CCK_TRIG_HIGH 200
36195 +#define ZM_HAL_ANI_CCK_TRIG_LOW 100
36196 +#define ZM_HAL_ANI_NOISE_IMMUNE_LVL 4
36197 +#define ZM_HAL_ANI_USE_OFDM_WEAK_SIG TRUE
36198 +#define ZM_HAL_ANI_CCK_WEAK_SIG_THR FALSE
36199 +#define ZM_HAL_ANI_SPUR_IMMUNE_LVL 7
36200 +#define ZM_HAL_ANI_FIRSTEP_LVL 0
36201 +#define ZM_HAL_ANI_RSSI_THR_HIGH 40
36202 +#define ZM_HAL_ANI_RSSI_THR_LOW 7
36203 +#define ZM_HAL_ANI_PERIOD 100
36204 +
36205 +#define ZM_HAL_EP_RND(x, mul) \
36206 + ((((x)%(mul)) >= ((mul)/2)) ? ((x) + ((mul) - 1)) / (mul) : (x)/(mul))
36207 +
36208 +s32_t BEACON_RSSI(zdev_t* dev)
36209 +{
36210 + s32_t rssi;
36211 +
36212 + zmw_get_wlan_dev(dev);
36213 +
36214 + struct zsHpPriv *HpPriv = (struct zsHpPriv*)wd->hpPrivate;
36215 +
36216 + rssi = ZM_HAL_EP_RND(HpPriv->stats.ast_nodestats.ns_avgbrssi, ZM_HAL_RSSI_EP_MULTIPLIER);
36217 +
36218 + return rssi;
36219 +}
36220 +
36221 +/*
36222 + * Setup ANI handling. Sets all thresholds and levels to default level AND
36223 + * resets the channel statistics
36224 + */
36225 +
36226 +void zfHpAniAttach(zdev_t* dev)
36227 +{
36228 +#define N(a) (sizeof(a) / sizeof(a[0]))
36229 + u32_t i;
36230 +
36231 + zmw_get_wlan_dev(dev);
36232 +
36233 + struct zsHpPriv *HpPriv = (struct zsHpPriv*)wd->hpPrivate;
36234 +
36235 + const int totalSizeDesired[] = { -55, -55, -55, -55, -62 };
36236 + const int coarseHigh[] = { -14, -14, -14, -14, -12 };
36237 + const int coarseLow[] = { -64, -64, -64, -64, -70 };
36238 + const int firpwr[] = { -78, -78, -78, -78, -80 };
36239 +
36240 + for (i = 0; i < 5; i++)
36241 + {
36242 + HpPriv->totalSizeDesired[i] = totalSizeDesired[i];
36243 + HpPriv->coarseHigh[i] = coarseHigh[i];
36244 + HpPriv->coarseLow[i] = coarseLow[i];
36245 + HpPriv->firpwr[i] = firpwr[i];
36246 + }
36247 +
36248 + /* owl has phy counters */
36249 + HpPriv->hasHwPhyCounters = 1;
36250 +
36251 + memset((char *)&HpPriv->ani, 0, sizeof(HpPriv->ani));
36252 + for (i = 0; i < N(wd->regulationTable.allowChannel); i++)
36253 + {
36254 + /* New ANI stuff */
36255 + HpPriv->ani[i].ofdmTrigHigh = ZM_HAL_ANI_OFDM_TRIG_HIGH;
36256 + HpPriv->ani[i].ofdmTrigLow = ZM_HAL_ANI_OFDM_TRIG_LOW;
36257 + HpPriv->ani[i].cckTrigHigh = ZM_HAL_ANI_CCK_TRIG_HIGH;
36258 + HpPriv->ani[i].cckTrigLow = ZM_HAL_ANI_CCK_TRIG_LOW;
36259 + HpPriv->ani[i].rssiThrHigh = ZM_HAL_ANI_RSSI_THR_HIGH;
36260 + HpPriv->ani[i].rssiThrLow = ZM_HAL_ANI_RSSI_THR_LOW;
36261 + HpPriv->ani[i].ofdmWeakSigDetectOff = !ZM_HAL_ANI_USE_OFDM_WEAK_SIG;
36262 + HpPriv->ani[i].cckWeakSigThreshold = ZM_HAL_ANI_CCK_WEAK_SIG_THR;
36263 + HpPriv->ani[i].spurImmunityLevel = ZM_HAL_ANI_SPUR_IMMUNE_LVL;
36264 + HpPriv->ani[i].firstepLevel = ZM_HAL_ANI_FIRSTEP_LVL;
36265 + if (HpPriv->hasHwPhyCounters)
36266 + {
36267 + HpPriv->ani[i].ofdmPhyErrBase = 0;//AR_PHY_COUNTMAX - ZM_HAL_ANI_OFDM_TRIG_HIGH;
36268 + HpPriv->ani[i].cckPhyErrBase = 0;//AR_PHY_COUNTMAX - ZM_HAL_ANI_CCK_TRIG_HIGH;
36269 + }
36270 + }
36271 + if (HpPriv->hasHwPhyCounters)
36272 + {
36273 + //zm_debug_msg2("Setting OfdmErrBase = 0x", HpPriv->ani[0].ofdmPhyErrBase);
36274 + //zm_debug_msg2("Setting cckErrBase = 0x", HpPriv->ani[0].cckPhyErrBase);
36275 + //OS_REG_WRITE(ah, AR_PHY_ERR_1, HpPriv->ani[0].ofdmPhyErrBase);
36276 + //OS_REG_WRITE(ah, AR_PHY_ERR_2, HpPriv->ani[0].cckPhyErrBase);
36277 + }
36278 + HpPriv->aniPeriod = ZM_HAL_ANI_PERIOD;
36279 + //if (ath_hal_enableANI)
36280 + HpPriv->procPhyErr |= ZM_HAL_PROCESS_ANI;
36281 +
36282 + HpPriv->stats.ast_nodestats.ns_avgbrssi = ZM_RSSI_DUMMY_MARKER;
36283 + HpPriv->stats.ast_nodestats.ns_avgrssi = ZM_RSSI_DUMMY_MARKER;
36284 + HpPriv->stats.ast_nodestats.ns_avgtxrssi = ZM_RSSI_DUMMY_MARKER;
36285 +#undef N
36286 +}
36287 +
36288 +/*
36289 + * Control Adaptive Noise Immunity Parameters
36290 + */
36291 +u8_t zfHpAniControl(zdev_t* dev, ZM_HAL_ANI_CMD cmd, int param)
36292 +{
36293 +#define N(a) (sizeof(a)/sizeof(a[0]))
36294 + typedef s32_t TABLE[];
36295 +
36296 + zmw_get_wlan_dev(dev);
36297 +
36298 + struct zsHpPriv *HpPriv = (struct zsHpPriv*)wd->hpPrivate;
36299 +
36300 + struct zsAniState *aniState = HpPriv->curani;
36301 +
36302 + switch (cmd)
36303 + {
36304 + case ZM_HAL_ANI_NOISE_IMMUNITY_LEVEL:
36305 + {
36306 + u32_t level = param;
36307 +
36308 + if (level >= N(HpPriv->totalSizeDesired))
36309 + {
36310 + zm_debug_msg1("level out of range, desired level : ", level);
36311 + zm_debug_msg1("max level : ", N(HpPriv->totalSizeDesired));
36312 + return FALSE;
36313 + }
36314 +
36315 + zfDelayWriteInternalReg(dev, AR_PHY_DESIRED_SZ,
36316 + (HpPriv->regPHYDesiredSZ & ~AR_PHY_DESIRED_SZ_TOT_DES)
36317 + | ((HpPriv->totalSizeDesired[level] << AR_PHY_DESIRED_SZ_TOT_DES_S)
36318 + & AR_PHY_DESIRED_SZ_TOT_DES));
36319 + zfDelayWriteInternalReg(dev, AR_PHY_AGC_CTL1,
36320 + (HpPriv->regPHYAgcCtl1 & ~AR_PHY_AGC_CTL1_COARSE_LOW)
36321 + | ((HpPriv->coarseLow[level] << AR_PHY_AGC_CTL1_COARSE_LOW_S)
36322 + & AR_PHY_AGC_CTL1_COARSE_LOW));
36323 + zfDelayWriteInternalReg(dev, AR_PHY_AGC_CTL1,
36324 + (HpPriv->regPHYAgcCtl1 & ~AR_PHY_AGC_CTL1_COARSE_HIGH)
36325 + | ((HpPriv->coarseHigh[level] << AR_PHY_AGC_CTL1_COARSE_HIGH_S)
36326 + & AR_PHY_AGC_CTL1_COARSE_HIGH));
36327 + zfDelayWriteInternalReg(dev, AR_PHY_FIND_SIG,
36328 + (HpPriv->regPHYFindSig & ~AR_PHY_FIND_SIG_FIRPWR)
36329 + | ((HpPriv->firpwr[level] << AR_PHY_FIND_SIG_FIRPWR_S)
36330 + & AR_PHY_FIND_SIG_FIRPWR));
36331 + zfFlushDelayWrite(dev);
36332 +
36333 + if (level > aniState->noiseImmunityLevel)
36334 + HpPriv->stats.ast_ani_niup++;
36335 + else if (level < aniState->noiseImmunityLevel)
36336 + HpPriv->stats.ast_ani_nidown++;
36337 + aniState->noiseImmunityLevel = (u8_t)level;
36338 + break;
36339 + }
36340 + case ZM_HAL_ANI_OFDM_WEAK_SIGNAL_DETECTION:
36341 + {
36342 + const TABLE m1ThreshLow = { 127, 50 };
36343 + const TABLE m2ThreshLow = { 127, 40 };
36344 + const TABLE m1Thresh = { 127, 0x4d };
36345 + const TABLE m2Thresh = { 127, 0x40 };
36346 + const TABLE m2CountThr = { 31, 16 };
36347 + const TABLE m2CountThrLow = { 63, 48 };
36348 + u32_t on = param ? 1 : 0;
36349 +
36350 + zfDelayWriteInternalReg(dev, AR_PHY_SFCORR_LOW,
36351 + (HpPriv->regPHYSfcorrLow & ~AR_PHY_SFCORR_LOW_M1_THRESH_LOW)
36352 + | ((m1ThreshLow[on] << AR_PHY_SFCORR_LOW_M1_THRESH_LOW_S)
36353 + & AR_PHY_SFCORR_LOW_M1_THRESH_LOW));
36354 + zfDelayWriteInternalReg(dev, AR_PHY_SFCORR_LOW,
36355 + (HpPriv->regPHYSfcorrLow & ~AR_PHY_SFCORR_LOW_M2_THRESH_LOW)
36356 + | ((m2ThreshLow[on] << AR_PHY_SFCORR_LOW_M2_THRESH_LOW_S)
36357 + & AR_PHY_SFCORR_LOW_M2_THRESH_LOW));
36358 + zfDelayWriteInternalReg(dev, AR_PHY_SFCORR,
36359 + (HpPriv->regPHYSfcorr & ~AR_PHY_SFCORR_M1_THRESH)
36360 + | ((m1Thresh[on] << AR_PHY_SFCORR_M1_THRESH_S)
36361 + & AR_PHY_SFCORR_M1_THRESH));
36362 + zfDelayWriteInternalReg(dev, AR_PHY_SFCORR,
36363 + (HpPriv->regPHYSfcorr & ~AR_PHY_SFCORR_M2_THRESH)
36364 + | ((m2Thresh[on] << AR_PHY_SFCORR_M2_THRESH_S)
36365 + & AR_PHY_SFCORR_M2_THRESH));
36366 + zfDelayWriteInternalReg(dev, AR_PHY_SFCORR,
36367 + (HpPriv->regPHYSfcorr & ~AR_PHY_SFCORR_M2COUNT_THR)
36368 + | ((m2CountThr[on] << AR_PHY_SFCORR_M2COUNT_THR_S)
36369 + & AR_PHY_SFCORR_M2COUNT_THR));
36370 + zfDelayWriteInternalReg(dev, AR_PHY_SFCORR_LOW,
36371 + (HpPriv->regPHYSfcorrLow & ~AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW)
36372 + | ((m2CountThrLow[on] << AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW_S)
36373 + & AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW));
36374 +
36375 + if (on)
36376 + {
36377 + zfDelayWriteInternalReg(dev, AR_PHY_SFCORR_LOW,
36378 + HpPriv->regPHYSfcorrLow | AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW);
36379 + }
36380 + else
36381 + {
36382 + zfDelayWriteInternalReg(dev, AR_PHY_SFCORR_LOW,
36383 + HpPriv->regPHYSfcorrLow & ~AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW);
36384 + }
36385 + zfFlushDelayWrite(dev);
36386 + if (!on != aniState->ofdmWeakSigDetectOff)
36387 + {
36388 + if (on)
36389 + HpPriv->stats.ast_ani_ofdmon++;
36390 + else
36391 + HpPriv->stats.ast_ani_ofdmoff++;
36392 + aniState->ofdmWeakSigDetectOff = !on;
36393 + }
36394 + break;
36395 + }
36396 + case ZM_HAL_ANI_CCK_WEAK_SIGNAL_THR:
36397 + {
36398 + const TABLE weakSigThrCck = { 8, 6 };
36399 + u32_t high = param ? 1 : 0;
36400 +
36401 + zfDelayWriteInternalReg(dev, AR_PHY_CCK_DETECT,
36402 + (HpPriv->regPHYCckDetect & ~AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK)
36403 + | ((weakSigThrCck[high] << AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK_S)
36404 + & AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK));
36405 + zfFlushDelayWrite(dev);
36406 + if (high != aniState->cckWeakSigThreshold)
36407 + {
36408 + if (high)
36409 + HpPriv->stats.ast_ani_cckhigh++;
36410 + else
36411 + HpPriv->stats.ast_ani_ccklow++;
36412 + aniState->cckWeakSigThreshold = (u8_t)high;
36413 + }
36414 + break;
36415 + }
36416 + case ZM_HAL_ANI_FIRSTEP_LEVEL:
36417 + {
36418 + const TABLE firstep = { 0, 4, 8 };
36419 + u32_t level = param;
36420 +
36421 + if (level >= N(firstep))
36422 + {
36423 + zm_debug_msg1("level out of range, desired level : ", level);
36424 + zm_debug_msg1("max level : ", N(firstep));
36425 + return FALSE;
36426 + }
36427 + zfDelayWriteInternalReg(dev, AR_PHY_FIND_SIG,
36428 + (HpPriv->regPHYFindSig & ~AR_PHY_FIND_SIG_FIRSTEP)
36429 + | ((firstep[level] << AR_PHY_FIND_SIG_FIRSTEP_S)
36430 + & AR_PHY_FIND_SIG_FIRSTEP));
36431 + zfFlushDelayWrite(dev);
36432 + if (level > aniState->firstepLevel)
36433 + HpPriv->stats.ast_ani_stepup++;
36434 + else if (level < aniState->firstepLevel)
36435 + HpPriv->stats.ast_ani_stepdown++;
36436 + aniState->firstepLevel = (u8_t)level;
36437 + break;
36438 + }
36439 + case ZM_HAL_ANI_SPUR_IMMUNITY_LEVEL:
36440 + {
36441 + const TABLE cycpwrThr1 = { 2, 4, 6, 8, 10, 12, 14, 16 };
36442 + u32_t level = param;
36443 +
36444 + if (level >= N(cycpwrThr1))
36445 + {
36446 + zm_debug_msg1("level out of range, desired level : ", level);
36447 + zm_debug_msg1("max level : ", N(cycpwrThr1));
36448 + return FALSE;
36449 + }
36450 + zfDelayWriteInternalReg(dev, AR_PHY_TIMING5,
36451 + (HpPriv->regPHYTiming5 & ~AR_PHY_TIMING5_CYCPWR_THR1)
36452 + | ((cycpwrThr1[level] << AR_PHY_TIMING5_CYCPWR_THR1_S)
36453 + & AR_PHY_TIMING5_CYCPWR_THR1));
36454 + zfFlushDelayWrite(dev);
36455 + if (level > aniState->spurImmunityLevel)
36456 + HpPriv->stats.ast_ani_spurup++;
36457 + else if (level < aniState->spurImmunityLevel)
36458 + HpPriv->stats.ast_ani_spurdown++;
36459 + aniState->spurImmunityLevel = (u8_t)level;
36460 + break;
36461 + }
36462 + case ZM_HAL_ANI_PRESENT:
36463 + break;
36464 +#ifdef AH_PRIVATE_DIAG
36465 + case ZM_HAL_ANI_MODE:
36466 + if (param == 0)
36467 + {
36468 + HpPriv->procPhyErr &= ~ZM_HAL_PROCESS_ANI;
36469 + /* Turn off HW counters if we have them */
36470 + zfHpAniDetach(dev);
36471 + //zfHpSetRxFilter(dev, zfHpGetRxFilter(dev) &~ HAL_RX_FILTER_PHYERR);
36472 + }
36473 + else
36474 + { /* normal/auto mode */
36475 + HpPriv->procPhyErr |= ZM_HAL_PROCESS_ANI;
36476 + if (HpPriv->hasHwPhyCounters)
36477 + {
36478 + //zfHpSetRxFilter(dev, zfHpGetRxFilter(dev) &~ HAL_RX_FILTER_PHYERR);
36479 + }
36480 + else
36481 + {
36482 + //zfHpSetRxFilter(dev, zfHpGetRxFilter(dev) | HAL_RX_FILTER_PHYERR);
36483 + }
36484 + }
36485 + break;
36486 + case ZM_HAL_ANI_PHYERR_RESET:
36487 + HpPriv->stats.ast_ani_ofdmerrs = 0;
36488 + HpPriv->stats.ast_ani_cckerrs = 0;
36489 + break;
36490 +#endif /* AH_PRIVATE_DIAG */
36491 + default:
36492 + zm_debug_msg1("invalid cmd ", cmd);
36493 + return FALSE;
36494 + }
36495 + return TRUE;
36496 +#undef N
36497 +}
36498 +
36499 +void zfHpAniRestart(zdev_t* dev)
36500 +{
36501 + struct zsAniState *aniState;
36502 +
36503 + zmw_get_wlan_dev(dev);
36504 +
36505 + struct zsHpPriv *HpPriv = (struct zsHpPriv*)wd->hpPrivate;
36506 +
36507 + aniState = HpPriv->curani;
36508 +
36509 + aniState->listenTime = 0;
36510 + if (HpPriv->hasHwPhyCounters)
36511 + {
36512 + //if (aniState->ofdmTrigHigh > AR_PHY_COUNTMAX)
36513 + //{
36514 + // aniState->ofdmPhyErrBase = 0;
36515 + // zm_debug_msg0("OFDM Trigger is too high for hw counters");
36516 + //}
36517 + //else
36518 + // aniState->ofdmPhyErrBase = AR_PHY_COUNTMAX - aniState->ofdmTrigHigh;
36519 + //if (aniState->cckTrigHigh > AR_PHY_COUNTMAX)
36520 + //{
36521 + // aniState->cckPhyErrBase = 0;
36522 + // zm_debug_msg0("CCK Trigger is too high for hw counters");
36523 + //}
36524 + //else
36525 + // aniState->cckPhyErrBase = AR_PHY_COUNTMAX - aniState->cckTrigHigh;
36526 + //zm_debug_msg2("Writing ofdmbase = 0x", aniState->ofdmPhyErrBase);
36527 + //zm_debug_msg2("Writing cckbase = 0x", aniState->cckPhyErrBase);
36528 + //OS_REG_WRITE(ah, AR_PHY_ERR_1, aniState->ofdmPhyErrBase);
36529 + //OS_REG_WRITE(ah, AR_PHY_ERR_2, aniState->cckPhyErrBase);
36530 + //OS_REG_WRITE(ah, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING);
36531 + //OS_REG_WRITE(ah, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING);
36532 + aniState->ofdmPhyErrBase = 0;
36533 + aniState->cckPhyErrBase = 0;
36534 + }
36535 + aniState->ofdmPhyErrCount = 0;
36536 + aniState->cckPhyErrCount = 0;
36537 +}
36538 +
36539 +void zfHpAniOfdmErrTrigger(zdev_t* dev)
36540 +{
36541 + struct zsAniState *aniState;
36542 + s32_t rssi;
36543 +
36544 + zmw_get_wlan_dev(dev);
36545 +
36546 + struct zsHpPriv *HpPriv = (struct zsHpPriv*)wd->hpPrivate;
36547 +
36548 + //HALASSERT(chan != NULL);
36549 +
36550 + if ((HpPriv->procPhyErr & ZM_HAL_PROCESS_ANI) == 0)
36551 + return;
36552 +
36553 + aniState = HpPriv->curani;
36554 + /* First, raise noise immunity level, up to max */
36555 + if (aniState->noiseImmunityLevel < ZM_HAL_NOISE_IMMUNE_MAX)
36556 + {
36557 + zfHpAniControl(dev, ZM_HAL_ANI_NOISE_IMMUNITY_LEVEL, aniState->noiseImmunityLevel + 1);
36558 + return;
36559 + }
36560 + /* then, raise spur immunity level, up to max */
36561 + if (aniState->spurImmunityLevel < ZM_HAL_SPUR_IMMUNE_MAX)
36562 + {
36563 + zfHpAniControl(dev, ZM_HAL_ANI_SPUR_IMMUNITY_LEVEL, aniState->spurImmunityLevel + 1);
36564 + return;
36565 + }
36566 + rssi = BEACON_RSSI(dev);
36567 + if (rssi > aniState->rssiThrHigh)
36568 + {
36569 + /*
36570 + * Beacon rssi is high, can turn off ofdm weak sig detect.
36571 + */
36572 + if (!aniState->ofdmWeakSigDetectOff)
36573 + {
36574 + zfHpAniControl(dev, ZM_HAL_ANI_OFDM_WEAK_SIGNAL_DETECTION, FALSE);
36575 + zfHpAniControl(dev, ZM_HAL_ANI_SPUR_IMMUNITY_LEVEL, 0);
36576 + return;
36577 + }
36578 + /*
36579 + * If weak sig detect is already off, as last resort, raise
36580 + * first step level
36581 + */
36582 + if (aniState->firstepLevel < ZM_HAL_FIRST_STEP_MAX)
36583 + {
36584 + zfHpAniControl(dev, ZM_HAL_ANI_FIRSTEP_LEVEL, aniState->firstepLevel + 1);
36585 + return;
36586 + }
36587 + }
36588 + else if (rssi > aniState->rssiThrLow)
36589 + {
36590 + /*
36591 + * Beacon rssi in mid range, need ofdm weak signal detect,
36592 + * but we can raise firststepLevel
36593 + */
36594 + if (aniState->ofdmWeakSigDetectOff)
36595 + zfHpAniControl(dev, ZM_HAL_ANI_OFDM_WEAK_SIGNAL_DETECTION, TRUE);
36596 + if (aniState->firstepLevel < ZM_HAL_FIRST_STEP_MAX)
36597 + zfHpAniControl(dev, ZM_HAL_ANI_FIRSTEP_LEVEL, aniState->firstepLevel + 1);
36598 + return;
36599 + }
36600 + else
36601 + {
36602 + /*
36603 + * Beacon rssi is low, if in 11b/g mode, turn off ofdm
36604 + * weak sign detction and zero firstepLevel to maximize
36605 + * CCK sensitivity
36606 + */
36607 + if (wd->frequency < 3000)
36608 + {
36609 + if (!aniState->ofdmWeakSigDetectOff)
36610 + zfHpAniControl(dev, ZM_HAL_ANI_OFDM_WEAK_SIGNAL_DETECTION, FALSE);
36611 + if (aniState->firstepLevel > 0)
36612 + zfHpAniControl(dev, ZM_HAL_ANI_FIRSTEP_LEVEL, 0);
36613 + return;
36614 + }
36615 + }
36616 +}
36617 +
36618 +void zfHpAniCckErrTrigger(zdev_t* dev)
36619 +{
36620 + struct zsAniState *aniState;
36621 + s32_t rssi;
36622 +
36623 + zmw_get_wlan_dev(dev);
36624 +
36625 + struct zsHpPriv *HpPriv = (struct zsHpPriv*)wd->hpPrivate;
36626 +
36627 + //HALASSERT(chan != NULL);
36628 +
36629 + if ((HpPriv->procPhyErr & ZM_HAL_PROCESS_ANI) == 0)
36630 + return;
36631 +
36632 + /* first, raise noise immunity level, up to max */
36633 + aniState = HpPriv->curani;
36634 + if (aniState->noiseImmunityLevel < ZM_HAL_NOISE_IMMUNE_MAX)
36635 + {
36636 + zfHpAniControl(dev, ZM_HAL_ANI_NOISE_IMMUNITY_LEVEL,
36637 + aniState->noiseImmunityLevel + 1);
36638 + return;
36639 + }
36640 + rssi = BEACON_RSSI(dev);
36641 + if (rssi > aniState->rssiThrLow)
36642 + {
36643 + /*
36644 + * Beacon signal in mid and high range, raise firsteplevel.
36645 + */
36646 + if (aniState->firstepLevel < ZM_HAL_FIRST_STEP_MAX)
36647 + zfHpAniControl(dev, ZM_HAL_ANI_FIRSTEP_LEVEL, aniState->firstepLevel + 1);
36648 + }
36649 + else
36650 + {
36651 + /*
36652 + * Beacon rssi is low, zero firstepLevel to maximize
36653 + * CCK sensitivity.
36654 + */
36655 + if (wd->frequency < 3000)
36656 + {
36657 + if (aniState->firstepLevel > 0)
36658 + zfHpAniControl(dev, ZM_HAL_ANI_FIRSTEP_LEVEL, 0);
36659 + }
36660 + }
36661 +}
36662 +
36663 +void zfHpAniLowerImmunity(zdev_t* dev)
36664 +{
36665 + struct zsAniState *aniState;
36666 + s32_t rssi;
36667 +
36668 + zmw_get_wlan_dev(dev);
36669 +
36670 + struct zsHpPriv *HpPriv = (struct zsHpPriv*)wd->hpPrivate;
36671 +
36672 + aniState = HpPriv->curani;
36673 +
36674 + rssi = BEACON_RSSI(dev);
36675 + if (rssi > aniState->rssiThrHigh)
36676 + {
36677 + /*
36678 + * Beacon signal is high, leave ofdm weak signal detection off
36679 + * or it may oscillate. Let it fall through.
36680 + */
36681 + }
36682 + else if (rssi > aniState->rssiThrLow)
36683 + {
36684 + /*
36685 + * Beacon rssi in mid range, turn on ofdm weak signal
36686 + * detection or lower first step level.
36687 + */
36688 + if (aniState->ofdmWeakSigDetectOff)
36689 + {
36690 + zfHpAniControl(dev, ZM_HAL_ANI_OFDM_WEAK_SIGNAL_DETECTION, TRUE);
36691 + return;
36692 + }
36693 + if (aniState->firstepLevel > 0)
36694 + {
36695 + zfHpAniControl(dev, ZM_HAL_ANI_FIRSTEP_LEVEL, aniState->firstepLevel - 1);
36696 + return;
36697 + }
36698 + }
36699 + else
36700 + {
36701 + /*
36702 + * Beacon rssi is low, reduce first step level.
36703 + */
36704 + if (aniState->firstepLevel > 0)
36705 + {
36706 + zfHpAniControl(dev, ZM_HAL_ANI_FIRSTEP_LEVEL, aniState->firstepLevel - 1);
36707 + return;
36708 + }
36709 + }
36710 + /* then lower spur immunity level, down to zero */
36711 + if (aniState->spurImmunityLevel > 0)
36712 + {
36713 + zfHpAniControl(dev, ZM_HAL_ANI_SPUR_IMMUNITY_LEVEL, aniState->spurImmunityLevel - 1);
36714 + return;
36715 + }
36716 + /*
36717 + * if all else fails, lower noise immunity level down to a min value
36718 + * zero for now
36719 + */
36720 + if (aniState->noiseImmunityLevel > 0)
36721 + {
36722 + zfHpAniControl(dev, ZM_HAL_ANI_NOISE_IMMUNITY_LEVEL, aniState->noiseImmunityLevel - 1);
36723 + return;
36724 + }
36725 +}
36726 +
36727 +#define CLOCK_RATE 44000 /* XXX use mac_usec or similar */
36728 +/* convert HW counter values to ms using 11g clock rate, goo9d enough
36729 + for 11a and Turbo */
36730 +
36731 +/*
36732 + * Return an approximation of the time spent ``listening'' by
36733 + * deducting the cycles spent tx'ing and rx'ing from the total
36734 + * cycle count since our last call. A return value <0 indicates
36735 + * an invalid/inconsistent time.
36736 + */
36737 +s32_t zfHpAniGetListenTime(zdev_t* dev)
36738 +{
36739 + struct zsAniState *aniState;
36740 + u32_t txFrameCount, rxFrameCount, cycleCount;
36741 + s32_t listenTime;
36742 +
36743 + zmw_get_wlan_dev(dev);
36744 +
36745 + struct zsHpPriv *HpPriv = (struct zsHpPriv*)wd->hpPrivate;
36746 +
36747 + txFrameCount = 0;//OS_REG_READ(ah, AR_TFCNT);
36748 + rxFrameCount = 0;//OS_REG_READ(ah, AR_RFCNT);
36749 + cycleCount = 0;//OS_REG_READ(ah, AR_CCCNT);
36750 +
36751 + aniState = HpPriv->curani;
36752 + if (aniState->cycleCount == 0 || aniState->cycleCount > cycleCount)
36753 + {
36754 + /*
36755 + * Cycle counter wrap (or initial call); it's not possible
36756 + * to accurately calculate a value because the registers
36757 + * right shift rather than wrap--so punt and return 0.
36758 + */
36759 + listenTime = 0;
36760 + HpPriv->stats.ast_ani_lzero++;
36761 + }
36762 + else
36763 + {
36764 + s32_t ccdelta = cycleCount - aniState->cycleCount;
36765 + s32_t rfdelta = rxFrameCount - aniState->rxFrameCount;
36766 + s32_t tfdelta = txFrameCount - aniState->txFrameCount;
36767 + listenTime = (ccdelta - rfdelta - tfdelta) / CLOCK_RATE;
36768 + }
36769 + aniState->cycleCount = cycleCount;
36770 + aniState->txFrameCount = txFrameCount;
36771 + aniState->rxFrameCount = rxFrameCount;
36772 + return listenTime;
36773 +}
36774 +
36775 +/*
36776 + * Do periodic processing. This routine is called from the
36777 + * driver's rx interrupt handler after processing frames.
36778 + */
36779 +void zfHpAniArPoll(zdev_t* dev, u32_t listenTime, u32_t phyCnt1, u32_t phyCnt2)
36780 +{
36781 + struct zsAniState *aniState;
36782 + //s32_t listenTime;
36783 +
36784 + zmw_get_wlan_dev(dev);
36785 +
36786 + struct zsHpPriv *HpPriv = (struct zsHpPriv*)wd->hpPrivate;
36787 +
36788 + /*
36789 + * Since we're called from end of rx tasklet, we also check for
36790 + * AR processing now
36791 + */
36792 +
36793 + aniState = HpPriv->curani;
36794 + //HpPriv->stats.ast_nodestats = *stats; /* XXX optimize? */
36795 +
36796 + //listenTime = zfHpAniGetListenTime(dev);
36797 + //if (listenTime < 0)
36798 + //{
36799 + // HpPriv->stats.ast_ani_lneg++;
36800 + // /* restart ANI period if listenTime is invalid */
36801 + // zfHpAniRestart(dev);
36802 + // return;
36803 + //}
36804 + /* XXX beware of overflow? */
36805 + aniState->listenTime += listenTime;
36806 +
36807 + if (HpPriv->hasHwPhyCounters)
36808 + {
36809 + //u32_t phyCnt1, phyCnt2;
36810 + u32_t ofdmPhyErrCnt, cckPhyErrCnt;
36811 +
36812 + /* NB: these are not reset-on-read */
36813 + //phyCnt1 = 0;//OS_REG_READ(ah, AR_PHY_ERR_1);
36814 + //phyCnt2 = 0;//OS_REG_READ(ah, AR_PHY_ERR_2);
36815 + /* XXX sometimes zero, why? */
36816 + //if (phyCnt1 < aniState->ofdmPhyErrBase ||
36817 + // phyCnt2 < aniState->cckPhyErrBase)
36818 + //{
36819 + // if (phyCnt1 < aniState->ofdmPhyErrBase)
36820 + // {
36821 + // zm_debug_msg2("phyCnt1 = 0x", phyCnt1);
36822 + // zm_debug_msg2("resetting counter value to 0x", aniState->ofdmPhyErrBase);
36823 + // //OS_REG_WRITE(ah, AR_PHY_ERR_1, aniState->ofdmPhyErrBase);
36824 + // //OS_REG_WRITE(ah, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING);
36825 + // }
36826 + // if (phyCnt2 < aniState->cckPhyErrBase)
36827 + // {
36828 + // zm_debug_msg2("phyCnt2 = 0x", phyCnt2);
36829 + // zm_debug_msg2("resetting counter value to 0x", aniState->cckPhyErrBase);
36830 + // //OS_REG_WRITE(ah, AR_PHY_ERR_2, aniState->cckPhyErrBase);
36831 + // //OS_REG_WRITE(ah, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING);
36832 + // }
36833 + // return; /* XXX */
36834 + //}
36835 + /* NB: only use ast_ani_*errs with AH_PRIVATE_DIAG */
36836 + //ofdmPhyErrCnt = phyCnt1 - aniState->ofdmPhyErrBase;
36837 + //HpPriv->stats.ast_ani_ofdmerrs += ofdmPhyErrCnt - aniState->ofdmPhyErrCount;
36838 + //aniState->ofdmPhyErrCount = ofdmPhyErrCnt;
36839 + ofdmPhyErrCnt = phyCnt1;
36840 + HpPriv->stats.ast_ani_ofdmerrs += ofdmPhyErrCnt;
36841 + aniState->ofdmPhyErrCount += ofdmPhyErrCnt;
36842 +
36843 + //cckPhyErrCnt = phyCnt2 - aniState->cckPhyErrBase;
36844 + //HpPriv->stats.ast_ani_cckerrs += cckPhyErrCnt - aniState->cckPhyErrCount;
36845 + //aniState->cckPhyErrCount = cckPhyErrCnt;
36846 + cckPhyErrCnt = phyCnt2;
36847 + HpPriv->stats.ast_ani_cckerrs += cckPhyErrCnt;
36848 + aniState->cckPhyErrCount += cckPhyErrCnt;
36849 + }
36850 + /*
36851 + * If ani is not enabled, return after we've collected
36852 + * statistics
36853 + */
36854 + if ((HpPriv->procPhyErr & ZM_HAL_PROCESS_ANI) == 0)
36855 + return;
36856 + if (aniState->listenTime > 5 * HpPriv->aniPeriod)
36857 + {
36858 + /*
36859 + * Check to see if need to lower immunity if
36860 + * 5 aniPeriods have passed
36861 + */
36862 + if (aniState->ofdmPhyErrCount <= aniState->listenTime *
36863 + aniState->ofdmTrigLow/1000 &&
36864 + aniState->cckPhyErrCount <= aniState->listenTime *
36865 + aniState->cckTrigLow/1000)
36866 + zfHpAniLowerImmunity(dev);
36867 + zfHpAniRestart(dev);
36868 + }
36869 + else if (aniState->listenTime > HpPriv->aniPeriod)
36870 + {
36871 + /* check to see if need to raise immunity */
36872 + if (aniState->ofdmPhyErrCount > aniState->listenTime *
36873 + aniState->ofdmTrigHigh / 1000)
36874 + {
36875 + zfHpAniOfdmErrTrigger(dev);
36876 + zfHpAniRestart(dev);
36877 + }
36878 + else if (aniState->cckPhyErrCount > aniState->listenTime *
36879 + aniState->cckTrigHigh / 1000)
36880 + {
36881 + zfHpAniCckErrTrigger(dev);
36882 + zfHpAniRestart(dev);
36883 + }
36884 + }
36885 +}
36886 --- /dev/null
36887 +++ b/drivers/staging/otus/hal/hpani.h
36888 @@ -0,0 +1,420 @@
36889 +/*
36890 + * Copyright (c) 2007-2008 Atheros Communications Inc.
36891 + *
36892 + * Permission to use, copy, modify, and/or distribute this software for any
36893 + * purpose with or without fee is hereby granted, provided that the above
36894 + * copyright notice and this permission notice appear in all copies.
36895 + *
36896 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
36897 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
36898 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
36899 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
36900 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
36901 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
36902 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
36903 + */
36904 +#include "../80211core/cprecomp.h"
36905 +
36906 +typedef struct {
36907 + u32_t ackrcv_bad;
36908 + u32_t rts_bad;
36909 + u32_t rts_good;
36910 + u32_t fcs_bad;
36911 + u32_t beacons;
36912 +} ZM_HAL_MIB_STATS;
36913 +
36914 +/*
36915 + * Per-node statistics maintained by the driver for use in
36916 + * optimizing signal quality and other operational aspects.
36917 + */
36918 +typedef struct {
36919 + u32_t ns_avgbrssi; /* average beacon rssi */
36920 + u32_t ns_avgrssi; /* average data rssi */
36921 + u32_t ns_avgtxrssi; /* average tx rssi */
36922 +} ZM_HAL_NODE_STATS;
36923 +
36924 +#define ZM_HAL_RSSI_EP_MULTIPLIER (1<<7) /* pow2 to optimize out * and / */
36925 +
36926 +struct zsAniStats {
36927 + u32_t ast_ani_niup; /* ANI increased noise immunity */
36928 + u32_t ast_ani_nidown; /* ANI decreased noise immunity */
36929 + u32_t ast_ani_spurup; /* ANI increased spur immunity */
36930 + u32_t ast_ani_spurdown;/* ANI descreased spur immunity */
36931 + u32_t ast_ani_ofdmon; /* ANI OFDM weak signal detect on */
36932 + u32_t ast_ani_ofdmoff;/* ANI OFDM weak signal detect off */
36933 + u32_t ast_ani_cckhigh;/* ANI CCK weak signal threshold high */
36934 + u32_t ast_ani_ccklow; /* ANI CCK weak signal threshold low */
36935 + u32_t ast_ani_stepup; /* ANI increased first step level */
36936 + u32_t ast_ani_stepdown;/* ANI decreased first step level */
36937 + u32_t ast_ani_ofdmerrs;/* ANI cumulative ofdm phy err count */
36938 + u32_t ast_ani_cckerrs;/* ANI cumulative cck phy err count */
36939 + u32_t ast_ani_reset; /* ANI parameters zero'd for non-STA */
36940 + u32_t ast_ani_lzero; /* ANI listen time forced to zero */
36941 + u32_t ast_ani_lneg; /* ANI listen time calculated < 0 */
36942 + ZM_HAL_MIB_STATS ast_mibstats; /* MIB counter stats */
36943 + ZM_HAL_NODE_STATS ast_nodestats; /* Latest rssi stats from driver */
36944 +};
36945 +
36946 +/*
36947 + * Per-channel ANI state private to the driver.
36948 + */
36949 +struct zsAniState {
36950 + ZM_HAL_CHANNEL c;
36951 + u8_t noiseImmunityLevel;
36952 + u8_t spurImmunityLevel;
36953 + u8_t firstepLevel;
36954 + u8_t ofdmWeakSigDetectOff;
36955 + u8_t cckWeakSigThreshold;
36956 +
36957 + /* Thresholds */
36958 + u32_t listenTime;
36959 + u32_t ofdmTrigHigh;
36960 + u32_t ofdmTrigLow;
36961 + s32_t cckTrigHigh;
36962 + s32_t cckTrigLow;
36963 + s32_t rssiThrLow;
36964 + s32_t rssiThrHigh;
36965 +
36966 + u32_t noiseFloor; /* The current noise floor */
36967 + u32_t txFrameCount; /* Last txFrameCount */
36968 + u32_t rxFrameCount; /* Last rx Frame count */
36969 + u32_t cycleCount; /* Last cycleCount (can detect wrap-around) */
36970 + u32_t ofdmPhyErrCount;/* OFDM err count since last reset */
36971 + u32_t cckPhyErrCount; /* CCK err count since last reset */
36972 + u32_t ofdmPhyErrBase; /* Base value for ofdm err counter */
36973 + u32_t cckPhyErrBase; /* Base value for cck err counters */
36974 + s16_t pktRssi[2]; /* Average rssi of pkts for 2 antennas */
36975 + s16_t ofdmErrRssi[2]; /* Average rssi of ofdm phy errs for 2 ant */
36976 + s16_t cckErrRssi[2]; /* Average rssi of cck phy errs for 2 ant */
36977 +};
36978 +
36979 +typedef enum {
36980 + ZM_HAL_ANI_PRESENT, /* is ANI support present */
36981 + ZM_HAL_ANI_NOISE_IMMUNITY_LEVEL, /* set level */
36982 + ZM_HAL_ANI_OFDM_WEAK_SIGNAL_DETECTION, /* enable/disable */
36983 + ZM_HAL_ANI_CCK_WEAK_SIGNAL_THR, /* enable/disable */
36984 + ZM_HAL_ANI_FIRSTEP_LEVEL, /* set level */
36985 + ZM_HAL_ANI_SPUR_IMMUNITY_LEVEL, /* set level */
36986 + ZM_HAL_ANI_MODE, /* 0 => manual, 1 => auto */
36987 + ZM_HAL_ANI_PHYERR_RESET, /* reset phy error stats */
36988 +} ZM_HAL_ANI_CMD;
36989 +
36990 +#define AR_PHY_COUNTMAX (3 << 22) // Max counted before intr
36991 +#define ZM_HAL_PROCESS_ANI 0x00000001 /* ANI state setup */
36992 +#define ZM_RSSI_DUMMY_MARKER 0x127
36993 +
36994 +/* PHY registers in ar5416, related base and register offsets
36995 + may need to be changed in otus BB */
36996 +#define AR_PHY_BASE 0x1C5800 /* base address of phy regs */
36997 +#define AR_PHY(_n) (AR_PHY_BASE + ((_n)<<2))
36998 +
36999 +#define AR_PHY_TEST 0x1C5800 /* PHY test control */
37000 +#define PHY_AGC_CLR 0x10000000 /* disable AGC to A2 */
37001 +#define RFSILENT_BB 0x00002000 /* shush bb */
37002 +
37003 +#define AR_PHY_TURBO 0x1C5804 /* frame control register */
37004 +#define AR_PHY_FC_TURBO_MODE 0x00000001 /* Set turbo mode bits */
37005 +#define AR_PHY_FC_TURBO_SHORT 0x00000002 /* Set short symbols to turbo mode setting */
37006 +#define AR_PHY_FC_DYN2040_EN 0x00000004 /* Enable dyn 20/40 mode */
37007 +#define AR_PHY_FC_DYN2040_PRI_ONLY 0x00000008 /* dyn 20/40 - primary only */
37008 +#define AR_PHY_FC_DYN2040_PRI_CH 0x00000010 /* dyn 20/40 - primary ch offset (0=+10MHz, 1=-10MHz)*/
37009 +#define AR_PHY_FC_DYN2040_EXT_CH 0x00000020 /* dyn 20/40 - ext ch spacing (0=20MHz/ 1=25MHz) */
37010 +#define AR_PHY_FC_HT_EN 0x00000040 /* ht enable */
37011 +#define AR_PHY_FC_SHORT_GI_40 0x00000080 /* allow short GI for HT 40 */
37012 +#define AR_PHY_FC_WALSH 0x00000100 /* walsh spatial spreading for 2 chains,2 streams TX */
37013 +#define AR_PHY_FC_SINGLE_HT_LTF1 0x00000200 /* single length (4us) 1st HT long training symbol */
37014 +
37015 +#define AR_PHY_TIMING2 0x1C5810 /* Timing Control 2 */
37016 +#define AR_PHY_TIMING2_USE_FORCE 0x00001000
37017 +#define AR_PHY_TIMING2_FORCE_VAL 0x00000fff
37018 +
37019 +#define AR_PHY_TIMING3 0x1C5814 /* Timing control 3 */
37020 +#define AR_PHY_TIMING3_DSC_MAN 0xFFFE0000
37021 +#define AR_PHY_TIMING3_DSC_MAN_S 17
37022 +#define AR_PHY_TIMING3_DSC_EXP 0x0001E000
37023 +#define AR_PHY_TIMING3_DSC_EXP_S 13
37024 +
37025 +#define AR_PHY_CHIP_ID 0x1C5818 /* PHY chip revision ID */
37026 +#define AR_PHY_CHIP_ID_REV_0 0x80 /* 5416 Rev 0 (owl 1.0) BB */
37027 +#define AR_PHY_CHIP_ID_REV_1 0x81 /* 5416 Rev 1 (owl 2.0) BB */
37028 +
37029 +#define AR_PHY_ACTIVE 0x1C581C /* activation register */
37030 +#define AR_PHY_ACTIVE_EN 0x00000001 /* Activate PHY chips */
37031 +#define AR_PHY_ACTIVE_DIS 0x00000000 /* Deactivate PHY chips */
37032 +
37033 +#define AR_PHY_RF_CTL2 0x1C5824
37034 +#define AR_PHY_TX_END_DATA_START 0x000000FF
37035 +#define AR_PHY_TX_END_DATA_START_S 0
37036 +#define AR_PHY_TX_END_PA_ON 0x0000FF00
37037 +#define AR_PHY_TX_END_PA_ON_S 8
37038 +
37039 +
37040 +#define AR_PHY_RF_CTL3 0x1C5828
37041 +#define AR_PHY_TX_END_TO_A2_RX_ON 0x00FF0000
37042 +#define AR_PHY_TX_END_TO_A2_RX_ON_S 16
37043 +
37044 +#define AR_PHY_ADC_CTL 0x1C582C
37045 +#define AR_PHY_ADC_CTL_OFF_INBUFGAIN 0x00000003
37046 +#define AR_PHY_ADC_CTL_OFF_INBUFGAIN_S 0
37047 +#define AR_PHY_ADC_CTL_OFF_PWDDAC 0x00002000
37048 +#define AR_PHY_ADC_CTL_OFF_PWDBANDGAP 0x00004000 /* BB Rev 4.2+ only */
37049 +#define AR_PHY_ADC_CTL_OFF_PWDADC 0x00008000 /* BB Rev 4.2+ only */
37050 +#define AR_PHY_ADC_CTL_ON_INBUFGAIN 0x00030000
37051 +#define AR_PHY_ADC_CTL_ON_INBUFGAIN_S 16
37052 +
37053 +#define AR_PHY_ADC_SERIAL_CTL 0x1C5830
37054 +#define AR_PHY_SEL_INTERNAL_ADDAC 0x00000000
37055 +#define AR_PHY_SEL_EXTERNAL_RADIO 0x00000001
37056 +
37057 +#define AR_PHY_RF_CTL4 0x1C5834
37058 +#define AR_PHY_RF_CTL4_TX_END_XPAB_OFF 0xFF000000
37059 +#define AR_PHY_RF_CTL4_TX_END_XPAB_OFF_S 24
37060 +#define AR_PHY_RF_CTL4_TX_END_XPAA_OFF 0x00FF0000
37061 +#define AR_PHY_RF_CTL4_TX_END_XPAA_OFF_S 16
37062 +#define AR_PHY_RF_CTL4_FRAME_XPAB_ON 0x0000FF00
37063 +#define AR_PHY_RF_CTL4_FRAME_XPAB_ON_S 8
37064 +#define AR_PHY_RF_CTL4_FRAME_XPAA_ON 0x000000FF
37065 +#define AR_PHY_RF_CTL4_FRAME_XPAA_ON_S 0
37066 +
37067 +#define AR_PHY_SETTLING 0x1C5844
37068 +#define AR_PHY_SETTLING_SWITCH 0x00003F80
37069 +#define AR_PHY_SETTLING_SWITCH_S 7
37070 +
37071 +#define AR_PHY_RXGAIN 0x1C5848
37072 +#define AR_PHY_RXGAIN_TXRX_ATTEN 0x0003F000
37073 +#define AR_PHY_RXGAIN_TXRX_ATTEN_S 12
37074 +#define AR_PHY_RXGAIN_TXRX_RF_MAX 0x007C0000
37075 +#define AR_PHY_RXGAIN_TXRX_RF_MAX_S 18
37076 +
37077 +#define AR_PHY_DESIRED_SZ 0x1C5850
37078 +#define AR_PHY_DESIRED_SZ_ADC 0x000000FF
37079 +#define AR_PHY_DESIRED_SZ_ADC_S 0
37080 +#define AR_PHY_DESIRED_SZ_PGA 0x0000FF00
37081 +#define AR_PHY_DESIRED_SZ_PGA_S 8
37082 +#define AR_PHY_DESIRED_SZ_TOT_DES 0x0FF00000
37083 +#define AR_PHY_DESIRED_SZ_TOT_DES_S 20
37084 +
37085 +#define AR_PHY_FIND_SIG 0x1C5858
37086 +#define AR_PHY_FIND_SIG_FIRSTEP 0x0003F000
37087 +#define AR_PHY_FIND_SIG_FIRSTEP_S 12
37088 +#define AR_PHY_FIND_SIG_FIRPWR 0x03FC0000
37089 +#define AR_PHY_FIND_SIG_FIRPWR_S 18
37090 +
37091 +#define AR_PHY_AGC_CTL1 0x1C585C
37092 +#define AR_PHY_AGC_CTL1_COARSE_LOW 0x00007F80
37093 +#define AR_PHY_AGC_CTL1_COARSE_LOW_S 7
37094 +#define AR_PHY_AGC_CTL1_COARSE_HIGH 0x003F8000
37095 +#define AR_PHY_AGC_CTL1_COARSE_HIGH_S 15
37096 +
37097 +#define AR_PHY_AGC_CONTROL 0x1C5860 /* chip calibration and noise floor setting */
37098 +#define AR_PHY_AGC_CONTROL_CAL 0x00000001 /* do internal calibration */
37099 +#define AR_PHY_AGC_CONTROL_NF 0x00000002 /* do noise-floor calculation */
37100 +
37101 +#define AR_PHY_CCA 0x1C5864
37102 +#define AR_PHY_MINCCA_PWR 0x1FF00000
37103 +#define AR_PHY_MINCCA_PWR_S 19
37104 +#define AR_PHY_CCA_THRESH62 0x0007F000
37105 +#define AR_PHY_CCA_THRESH62_S 12
37106 +
37107 +#define AR_PHY_SFCORR_LOW 0x1C586C
37108 +#define AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW 0x00000001
37109 +#define AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW 0x00003F00
37110 +#define AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW_S 8
37111 +#define AR_PHY_SFCORR_LOW_M1_THRESH_LOW 0x001FC000
37112 +#define AR_PHY_SFCORR_LOW_M1_THRESH_LOW_S 14
37113 +#define AR_PHY_SFCORR_LOW_M2_THRESH_LOW 0x0FE00000
37114 +#define AR_PHY_SFCORR_LOW_M2_THRESH_LOW_S 21
37115 +
37116 +#define AR_PHY_SFCORR 0x1C5868
37117 +#define AR_PHY_SFCORR_M2COUNT_THR 0x0000001F
37118 +#define AR_PHY_SFCORR_M2COUNT_THR_S 0
37119 +#define AR_PHY_SFCORR_M1_THRESH 0x00FE0000
37120 +#define AR_PHY_SFCORR_M1_THRESH_S 17
37121 +#define AR_PHY_SFCORR_M2_THRESH 0x7F000000
37122 +#define AR_PHY_SFCORR_M2_THRESH_S 24
37123 +
37124 +#define AR_PHY_SLEEP_CTR_CONTROL 0x1C5870
37125 +#define AR_PHY_SLEEP_CTR_LIMIT 0x1C5874
37126 +#define AR_PHY_SLEEP_SCAL 0x1C5878
37127 +
37128 +#define AR_PHY_PLL_CTL 0x1C587c /* PLL control register */
37129 +#define AR_PHY_PLL_CTL_40 0xaa /* 40 MHz */
37130 +#define AR_PHY_PLL_CTL_40_5413 0x04
37131 +#define AR_PHY_PLL_CTL_44 0xab /* 44 MHz for 11b, 11g */
37132 +#define AR_PHY_PLL_CTL_44_2133 0xeb /* 44 MHz for 11b, 11g */
37133 +#define AR_PHY_PLL_CTL_40_2133 0xea /* 40 MHz for 11a, turbos */
37134 +
37135 +#define AR_PHY_RX_DELAY 0x1C5914 /* analog pow-on time (100ns) */
37136 +#define AR_PHY_RX_DELAY_DELAY 0x00003FFF /* delay from wakeup to rx ena */
37137 +
37138 +#define AR_PHY_TIMING_CTRL4 0x1C5920 /* timing control */
37139 +#define AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF 0x01F /* Mask for kcos_theta-1 for q correction */
37140 +#define AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF_S 0 /* shift for Q_COFF */
37141 +#define AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF 0x7E0 /* Mask for sin_theta for i correction */
37142 +#define AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF_S 5 /* Shift for sin_theta for i correction */
37143 +#define AR_PHY_TIMING_CTRL4_IQCORR_ENABLE 0x800 /* enable IQ correction */
37144 +#define AR_PHY_TIMING_CTRL4_IQCAL_LOG_COUNT_MAX 0xF000 /* Mask for max number of samples (logarithmic) */
37145 +#define AR_PHY_TIMING_CTRL4_IQCAL_LOG_COUNT_MAX_S 12 /* Shift for max number of samples */
37146 +#define AR_PHY_TIMING_CTRL4_DO_IQCAL 0x10000 /* perform IQ calibration */
37147 +
37148 +#define AR_PHY_TIMING5 0x1C5924
37149 +#define AR_PHY_TIMING5_CYCPWR_THR1 0x000000FE
37150 +#define AR_PHY_TIMING5_CYCPWR_THR1_S 1
37151 +
37152 +#define AR_PHY_POWER_TX_RATE1 0x1C5934
37153 +#define AR_PHY_POWER_TX_RATE2 0x1C5938
37154 +#define AR_PHY_POWER_TX_RATE_MAX 0x1C593c
37155 +#define AR_PHY_POWER_TX_RATE_MAX_TPC_ENABLE 0x00000040
37156 +
37157 +#define AR_PHY_FRAME_CTL 0x1C5944
37158 +#define AR_PHY_FRAME_CTL_TX_CLIP 0x00000038
37159 +#define AR_PHY_FRAME_CTL_TX_CLIP_S 3
37160 +
37161 +#define AR_PHY_TXPWRADJ 0x1C594C /* BB Rev 4.2+ only */
37162 +#define AR_PHY_TXPWRADJ_CCK_GAIN_DELTA 0x00000FC0
37163 +#define AR_PHY_TXPWRADJ_CCK_GAIN_DELTA_S 6
37164 +#define AR_PHY_TXPWRADJ_CCK_PCDAC_INDEX 0x00FC0000
37165 +#define AR_PHY_TXPWRADJ_CCK_PCDAC_INDEX_S 18
37166 +
37167 +#define AR_PHY_RADAR_0 0x1C5954 /* radar detection settings */
37168 +#define AR_PHY_RADAR_0_ENA 0x00000001 /* Enable radar detection */
37169 +#define AR_PHY_RADAR_0_INBAND 0x0000003e /* Inband pulse threshold */
37170 +#define AR_PHY_RADAR_0_INBAND_S 1
37171 +#define AR_PHY_RADAR_0_PRSSI 0x00000FC0 /* Pulse rssi threshold */
37172 +#define AR_PHY_RADAR_0_PRSSI_S 6
37173 +#define AR_PHY_RADAR_0_HEIGHT 0x0003F000 /* Pulse height threshold */
37174 +#define AR_PHY_RADAR_0_HEIGHT_S 12
37175 +#define AR_PHY_RADAR_0_RRSSI 0x00FC0000 /* Radar rssi threshold */
37176 +#define AR_PHY_RADAR_0_RRSSI_S 18
37177 +#define AR_PHY_RADAR_0_FIRPWR 0x7F000000 /* Radar firpwr threshold */
37178 +#define AR_PHY_RADAR_0_FIRPWR_S 24
37179 +
37180 +#define AR_PHY_SWITCH_CHAIN_0 0x1C5960
37181 +#define AR_PHY_SWITCH_COM 0x1C5964
37182 +
37183 +#define AR_PHY_SIGMA_DELTA 0x1C596C /* AR5312 only */
37184 +#define AR_PHY_SIGMA_DELTA_ADC_SEL 0x00000003
37185 +#define AR_PHY_SIGMA_DELTA_ADC_SEL_S 0
37186 +#define AR_PHY_SIGMA_DELTA_FILT2 0x000000F8
37187 +#define AR_PHY_SIGMA_DELTA_FILT2_S 3
37188 +#define AR_PHY_SIGMA_DELTA_FILT1 0x00001F00
37189 +#define AR_PHY_SIGMA_DELTA_FILT1_S 8
37190 +#define AR_PHY_SIGMA_DELTA_ADC_CLIP 0x01FFE000
37191 +#define AR_PHY_SIGMA_DELTA_ADC_CLIP_S 13
37192 +
37193 +#define AR_PHY_RESTART 0x1C5970 /* restart */
37194 +#define AR_PHY_RESTART_DIV_GC 0x001C0000 /* bb_ant_fast_div_gc_limit */
37195 +#define AR_PHY_RESTART_DIV_GC_S 18
37196 +
37197 +#define AR_PHY_RFBUS_REQ 0x1C597C
37198 +#define AR_PHY_RFBUS_REQ_EN 0x00000001
37199 +
37200 +#define AR_PHY_RX_CHAINMASK 0x1C59a4
37201 +
37202 +#define AR_PHY_EXT_CCA 0x1C59bc
37203 +#define AR_PHY_EXT_MINCCA_PWR 0xFF800000
37204 +#define AR_PHY_EXT_MINCCA_PWR_S 23
37205 +
37206 +#define AR_PHY_HALFGI 0x1C59D0 /* Timing control 3 */
37207 +#define AR_PHY_HALFGI_DSC_MAN 0x0007FFF0
37208 +#define AR_PHY_HALFGI_DSC_MAN_S 4
37209 +#define AR_PHY_HALFGI_DSC_EXP 0x0000000F
37210 +#define AR_PHY_HALFGI_DSC_EXP_S 0
37211 +
37212 +#define AR_PHY_HEAVY_CLIP_ENABLE 0x1C59E0
37213 +
37214 +#define AR_PHY_M_SLEEP 0x1C59f0 /* sleep control registers */
37215 +#define AR_PHY_REFCLKDLY 0x1C59f4
37216 +#define AR_PHY_REFCLKPD 0x1C59f8
37217 +
37218 +/* PHY IQ calibration results */
37219 +#define AR_PHY_IQCAL_RES_PWR_MEAS_I 0x1C5C10 /* power measurement for I */
37220 +#define AR_PHY_IQCAL_RES_PWR_MEAS_Q 0x1C5C14 /* power measurement for Q */
37221 +#define AR_PHY_IQCAL_RES_IQ_CORR_MEAS 0x1C5C18 /* IQ correlation measurement */
37222 +
37223 +#define AR_PHY_CURRENT_RSSI 0x1C5C1c /* rssi of current frame rx'd */
37224 +
37225 +#define AR_PHY_RFBUS_GRANT 0x1C5C20
37226 +#define AR_PHY_RFBUS_GRANT_EN 0x00000001
37227 +
37228 +#define AR_PHY_MODE 0x1C6200 /* Mode register */
37229 +#define AR_PHY_MODE_AR2133 0x08 /* AR2133 */
37230 +#define AR_PHY_MODE_AR5111 0x00 /* AR5111/AR2111 */
37231 +#define AR_PHY_MODE_AR5112 0x08 /* AR5112*/
37232 +#define AR_PHY_MODE_DYNAMIC 0x04 /* dynamic CCK/OFDM mode */
37233 +#define AR_PHY_MODE_RF2GHZ 0x02 /* 2.4 GHz */
37234 +#define AR_PHY_MODE_RF5GHZ 0x00 /* 5 GHz */
37235 +#define AR_PHY_MODE_CCK 0x01 /* CCK */
37236 +#define AR_PHY_MODE_OFDM 0x00 /* OFDM */
37237 +
37238 +#define AR_PHY_CCK_TX_CTRL 0x1C6204
37239 +#define AR_PHY_CCK_TX_CTRL_JAPAN 0x00000010
37240 +
37241 +#define AR_PHY_CCK_DETECT 0x1C6208
37242 +#define AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK 0x0000003F
37243 +#define AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK_S 0
37244 +#define AR_PHY_CCK_DETECT_ANT_SWITCH_TIME 0x00001FC0 // [12:6] settling time for antenna switch
37245 +#define AR_PHY_CCK_DETECT_ANT_SWITCH_TIME_S 6
37246 +#define AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV 0x2000
37247 +
37248 +#define AR_PHY_GAIN_2GHZ 0x1C620C
37249 +#define AR_PHY_GAIN_2GHZ_RXTX_MARGIN 0x00FC0000
37250 +#define AR_PHY_GAIN_2GHZ_RXTX_MARGIN_S 18
37251 +#define AR_PHY_GAIN_2GHZ_BSW_MARGIN 0x00003C00
37252 +#define AR_PHY_GAIN_2GHZ_BSW_MARGIN_S 10
37253 +#define AR_PHY_GAIN_2GHZ_BSW_ATTEN 0x0000001F
37254 +#define AR_PHY_GAIN_2GHZ_BSW_ATTEN_S 0
37255 +
37256 +#define AR_PHY_CCK_RXCTRL4 0x1C621C
37257 +#define AR_PHY_CCK_RXCTRL4_FREQ_EST_SHORT 0x01F80000
37258 +#define AR_PHY_CCK_RXCTRL4_FREQ_EST_SHORT_S 19
37259 +
37260 +#define AR_PHY_DAG_CTRLCCK 0x1C6228
37261 +#define AR_PHY_DAG_CTRLCCK_EN_RSSI_THR 0x00000200 /* BB Rev 4.2+ only */
37262 +#define AR_PHY_DAG_CTRLCCK_RSSI_THR 0x0001FC00 /* BB Rev 4.2+ only */
37263 +#define AR_PHY_DAG_CTRLCCK_RSSI_THR_S 10 /* BB Rev 4.2+ only */
37264 +
37265 +#define AR_PHY_POWER_TX_RATE3 0x1C6234
37266 +#define AR_PHY_POWER_TX_RATE4 0x1C6238
37267 +
37268 +#define AR_PHY_SCRM_SEQ_XR 0x1C623C
37269 +#define AR_PHY_HEADER_DETECT_XR 0x1C6240
37270 +#define AR_PHY_CHIRP_DETECTED_XR 0x1C6244
37271 +#define AR_PHY_BLUETOOTH 0x1C6254
37272 +
37273 +#define AR_PHY_TPCRG1 0x1C6258 /* ar2413 power control */
37274 +#define AR_PHY_TPCRG1_NUM_PD_GAIN 0x0000c000
37275 +#define AR_PHY_TPCRG1_NUM_PD_GAIN_S 14
37276 +
37277 +#define AR_PHY_TPCRG1_PD_GAIN_1 0x00030000
37278 +#define AR_PHY_TPCRG1_PD_GAIN_1_S 16
37279 +#define AR_PHY_TPCRG1_PD_GAIN_2 0x000C0000
37280 +#define AR_PHY_TPCRG1_PD_GAIN_2_S 18
37281 +#define AR_PHY_TPCRG1_PD_GAIN_3 0x00300000
37282 +#define AR_PHY_TPCRG1_PD_GAIN_3_S 20
37283 +//
37284 +
37285 +#define AR_PHY_ANALOG_SWAP 0xa268
37286 +#define AR_PHY_SWAP_ALT_CHAIN 0x00000040
37287 +
37288 +#define AR_PHY_TPCRG5 0x1C626C /* ar2413 power control */
37289 +#define AR_PHY_TPCRG5_PD_GAIN_OVERLAP 0x0000000F
37290 +#define AR_PHY_TPCRG5_PD_GAIN_OVERLAP_S 0
37291 +#define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_1 0x000003F0
37292 +#define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_1_S 4
37293 +#define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_2 0x0000FC00
37294 +#define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_2_S 10
37295 +#define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_3 0x003F0000
37296 +#define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_3_S 16
37297 +#define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_4 0x0FC00000
37298 +#define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_4_S 22
37299 +
37300 +#define AR_PHY_POWER_TX_RATE5 0x1C638C
37301 +#define AR_PHY_POWER_TX_RATE6 0x1C6390
37302 +
37303 +#define AR_PHY_CAL_CHAINMASK 0x1C639C
37304 +
37305 +#define AR_PHY_POWER_TX_SUB 0x1C63C8
37306 +#define AR_PHY_POWER_TX_RATE7 0x1C63CC
37307 +#define AR_PHY_POWER_TX_RATE8 0x1C63D0
37308 +#define AR_PHY_POWER_TX_RATE9 0x1C63D4
37309 --- /dev/null
37310 +++ b/drivers/staging/otus/hal/hpDKfwu.c
37311 @@ -0,0 +1,832 @@
37312 +/*
37313 + * Copyright (c) 2007-2008 Atheros Communications Inc.
37314 + *
37315 + * Permission to use, copy, modify, and/or distribute this software for any
37316 + * purpose with or without fee is hereby granted, provided that the above
37317 + * copyright notice and this permission notice appear in all copies.
37318 + *
37319 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
37320 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
37321 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
37322 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
37323 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
37324 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
37325 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
37326 + */
37327 +#include "../80211core/cprecomp.h"
37328 +
37329 +const u32_t zcDKFwImage[] = {
37330 +0x0009000B, 0x4F222FE6, 0xDE3E7FFC, 0xE114D73E,
37331 +0x1E13D43E, 0x1E4C470B, 0x0009B017, 0x956EE600,
37332 +0xC84060E2, 0x2F028F03, 0x8FF93652, 0xD4387601,
37333 +0x4E0BDE38, 0xD4380009, 0x00094E0B, 0x4E0BD437,
37334 +0x7F040009, 0xA0364F26, 0x4F226EF6, 0x410BD134,
37335 +0xD4340009, 0x0009440B, 0x450BD533, 0xD7330009,
37336 +0xD233E1FF, 0x2712611D, 0xD4325029, 0xE1FFCB01,
37337 +0x1209E501, 0x12112212, 0xD52F2452, 0xD22F9740,
37338 +0xE7002572, 0xD42FD12E, 0x2270D62F, 0x2172E201,
37339 +0x26202420, 0xE4FFD62D, 0xE6002641, 0xE104D52C,
37340 +0x6063666D, 0x626D7601, 0x32124000, 0x05458FF8,
37341 +0x000B4F26, 0xEAC80009, 0xDB266AAC, 0xDD27DC26,
37342 +0xD828DE27, 0x4C0BE901, 0x4D0B0009, 0x4E0B0009,
37343 +0x60B20009, 0x89078801, 0x6242D423, 0x890332A6,
37344 +0x6050D522, 0x8BEE8801, 0x2B92D41F, 0x26686642,
37345 +0x480B89E9, 0xD51D0009, 0xAFE4E200, 0x27102520,
37346 +0x00000FA0, 0x001C001C, 0x00200ED4, 0x0000B38E,
37347 +0x00202F90, 0x00201356, 0x00202F9C, 0x00202FB4,
37348 +0x00201314, 0x00201412, 0x00200EF8, 0x001C3510,
37349 +0x001C3624, 0x001E212C, 0x00202F00, 0x00202A9C,
37350 +0x00202F08, 0x00202F14, 0x00202F20, 0x00202F22,
37351 +0x00202F26, 0x001C1028, 0x00201220, 0x0020294C,
37352 +0x00201D10, 0x00201EC8, 0x00203220, 0x00202F24,
37353 +0x2FB62F96, 0x2FD62FC6, 0x4F222FE6, 0xDE947F80,
37354 +0x61E0E024, 0x0F14D493, 0x710161E3, 0xD7926210,
37355 +0x470BE028, 0xD5910F24, 0x0009450B, 0x6D032008,
37356 +0x1F0B8F11, 0xD48FDC8E, 0xDD8F67C0, 0x657C4D0B,
37357 +0xDD8FD18E, 0x6B9C6910, 0x420862B3, 0x32B84208,
37358 +0x3D2C4208, 0xE0281FDB, 0xE58004FC, 0x604C66E2,
37359 +0x3050655C, 0x2D628F13, 0x01FCE024, 0x641CE500,
37360 +0x625DDE84, 0x8B013243, 0x0009A39E, 0x6753655D,
37361 +0x607037EC, 0x39DC6953, 0xAFF27501, 0x20088094,
37362 +0xE0248B13, 0xE50001FC, 0xA009DE7A, 0x655D641C,
37363 +0x32EC6253, 0x6C536B22, 0x3CDC67B2, 0x75041C71,
37364 +0x3243625D, 0xA37F8BF3, 0x88012D10, 0xE0248B16,
37365 +0xE40001FC, 0x671C2D40, 0x624DDE6E, 0x8B013273,
37366 +0x0009A372, 0x6CE3644D, 0x7C046943, 0x39EC6B43,
37367 +0x65923BCC, 0x74086DB2, 0x25D2AFEF, 0x8B198804,
37368 +0x01FCE024, 0x2D70E700, 0x1FD86D1C, 0x627DDE61,
37369 +0x8B0132D3, 0x0009A358, 0x6B73677D, 0x3BEC61E3,
37370 +0x710464B2, 0x3C1C6C73, 0x694265C2, 0x29597708,
37371 +0x2492AFED, 0x8B188805, 0x01FCE024, 0x2D40E400,
37372 +0xDE54671C, 0x3273624D, 0xA33D8B01, 0x644D0009,
37373 +0x6BE36D43, 0x65D23DEC, 0x61437B04, 0x6C1231BC,
37374 +0x74086952, 0xAFED29CB, 0x88312592, 0xDE4A8B20,
37375 +0x65E6DB4A, 0x61E6DC4A, 0x67E2D94A, 0x62E27E04,
37376 +0x1FEC7EE8, 0x7E0464E2, 0x6EE21FED, 0x5BFD2BE0,
37377 +0x60B27B04, 0xC9011FBE, 0x6BB22C00, 0x29B04B09,
37378 +0xDC412F26, 0x66134C0B, 0xE2007F04, 0x2D20A30C,
37379 +0x8B218830, 0xD939DE38, 0xE06465E6, 0x720462E3,
37380 +0x672666E2, 0x6E23DC36, 0x62227EE8, 0x6BE261E6,
37381 +0x29B01FEF, 0x7E040F16, 0xC90160E2, 0x6EE22C00,
37382 +0x4E09DC30, 0x2F262CE0, 0xD130E068, 0x04FE410B,
37383 +0xE2007F04, 0x2D20A2E8, 0x8B058833, 0x4E0BDE2C,
37384 +0xE1000009, 0x2D10A2E0, 0x89018828, 0x0009A106,
37385 +0xE143DE20, 0xE04062E1, 0x3217622D, 0x0FE68F04,
37386 +0x6023E240, 0x262106FE, 0x8B013217, 0x0009A0EF,
37387 +0x02FEE040, 0x8521E401, 0x8B013046, 0x0009A0E7,
37388 +0xE501E040, 0x2D5007FE, 0x6471B2C7, 0x09FEE040,
37389 +0x6291E143, 0x652DE068, 0x8D6B3517, 0xE6400F56,
37390 +0x8B273563, 0xE048E600, 0xE11A0F65, 0x72C0A031,
37391 +0x00117800, 0x00202FB8, 0x00201356, 0x00202480,
37392 +0x00202F1A, 0x00202FBC, 0x002013A2, 0x00202F19,
37393 +0x00202B40, 0x00117804, 0x00117810, 0x00202F15,
37394 +0x00202F16, 0x00202F17, 0x00200B84, 0x00200BD8,
37395 +0x00200BD4, 0x41216153, 0x41214121, 0x41214121,
37396 +0x45214521, 0x60534521, 0x6603C903, 0x0F65E048,
37397 +0xE0077118, 0xE0442209, 0x641D0F25, 0x65F3E04C,
37398 +0x0F46B314, 0x04FDE048, 0x0BFDE044, 0x61BD674D,
37399 +0x41084708, 0x0F16E050, 0xD2936073, 0x420B09FE,
37400 +0x6C07E00F, 0x607329C9, 0xE0400F96, 0x65F30EFE,
37401 +0x6D0D85E2, 0x01FEE050, 0x60D3420B, 0x6073290B,
37402 +0xE04C0F96, 0x04FEB2D9, 0x06FEE040, 0x6261E068,
37403 +0x0F56652D, 0x3563E640, 0xE000894E, 0x602381F8,
37404 +0x4008C903, 0x6B034000, 0xE0546103, 0xE0580FB6,
37405 +0xECFFDD7D, 0x6CCC0FF6, 0x0FD6E06C, 0x4D0B60C3,
37406 +0x42216253, 0x42214221, 0x64234221, 0x324C4200,
37407 +0xE05C6E07, 0x45214200, 0xE0400FE6, 0x0BFE4521,
37408 +0xC9036053, 0x30FC4008, 0x6D037B06, 0x85F81F05,
37409 +0x6C2D1FB7, 0x1FC66E03, 0x0FC6E060, 0x05FEE058,
37410 +0x64C3B2B4, 0x33FCE354, 0x563262D2, 0x22696132,
37411 +0x67B42D22, 0x490B5936, 0x220B607C, 0x05FEE058,
37412 +0x64C32D22, 0x7E01B289, 0xE70662ED, 0x8FE33273,
37413 +0xE0407C01, 0x626106FE, 0x06FEE040, 0x85614200,
37414 +0x302C760C, 0x6103701B, 0x64F3E500, 0x7501E704,
37415 +0x6B5D6966, 0x24923B73, 0x74048FF9, 0xB26C65F3,
37416 +0xE040641D, 0xB20506FE, 0xA1DD6461, 0xD44F0009,
37417 +0xE201D74F, 0x2D20470B, 0x0009A1D6, 0x8B078829,
37418 +0xEC00DE4C, 0x61E22DC0, 0x641DB1D7, 0x0009A1CC,
37419 +0x622CE281, 0x8B013020, 0x0009A118, 0x06FCE028,
37420 +0xE682626C, 0x3260666C, 0xA0EE8B01, 0xE6830009,
37421 +0x3260666C, 0xA0DC8B01, 0xE6900009, 0x3260666C,
37422 +0xA0D08B01, 0xE6910009, 0x3260666C, 0xA0B98B01,
37423 +0xE6B00009, 0x3260666C, 0xA07F8B01, 0xE6BB0009,
37424 +0x3260666C, 0xE6928920, 0x3260666C, 0xE4008B14,
37425 +0xEB04D531, 0x52516652, 0x8B073620, 0x624D7401,
37426 +0x8FF732B7, 0xE6007508, 0x52FBA002, 0xE60152FB,
37427 +0xE6041261, 0x2260A188, 0xD229D428, 0xD4296542,
37428 +0x0009420B, 0x0009A180, 0xE100E670, 0x601336FC,
37429 +0xE0248162, 0x0BFCD21F, 0x6BBC6722, 0x26727BFC,
37430 +0xEB0416B2, 0x06FEE078, 0x3263621D, 0xA16B8B01,
37431 +0xDE1D0009, 0x31EC611D, 0xD41C6E12, 0x410BD114,
37432 +0xE0700009, 0x450BD51A, 0xD41A04FE, 0x420BD210,
37433 +0xD2170009, 0x64E3420B, 0xD60DD417, 0x0009460B,
37434 +0x05FEE070, 0x01FDE074, 0x611DE600, 0x6253351C,
37435 +0x326C666D, 0x22E07601, 0x32B3626D, 0x4E198FF7,
37436 +0xE0747104, 0x0F15AFCE, 0x002029F8, 0x00202FDC,
37437 +0x00201356, 0x00117804, 0x00202B10, 0x00117800,
37438 +0x002013A2, 0x00203014, 0x00117808, 0x00202FF4,
37439 +0x0020139A, 0x00203008, 0x00203010, 0x02FCE024,
37440 +0x672CE07C, 0xEC000F76, 0xE07CEB04, 0x62CD07FE,
37441 +0x8B013273, 0x0009A118, 0x6CCDD7B9, 0x357C65C3,
37442 +0x62C37704, 0xD4B7327C, 0x6D52D7B7, 0x6E22470B,
37443 +0x470BD7B6, 0xD4B664D3, 0x420BD2B3, 0xD2B30009,
37444 +0x64E3420B, 0xD6B0D4B3, 0x0009460B, 0x67D3E600,
37445 +0x376C666D, 0x626D7601, 0x27E032B3, 0x4E198FF7,
37446 +0x7C08AFD3, 0x6212D1A6, 0x2228622C, 0xD2AA8B04,
37447 +0x0009420B, 0x0009A003, 0x420BD2A8, 0x56FB0009,
37448 +0xA0E1E200, 0xB1A62620, 0x56FB0009, 0xA0DBE200,
37449 +0x52FB2620, 0xE500D69A, 0x65622250, 0x7604D2A0,
37450 +0x62622252, 0xA0CFD69F, 0x56FB2620, 0x2610E124,
37451 +0x5217D19D, 0x52181621, 0x52191622, 0x521A1623,
37452 +0x551B1624, 0x1655E200, 0x1656551C, 0x1657551D,
37453 +0x1658551E, 0x1659551F, 0x11281127, 0x112A1129,
37454 +0x112C112B, 0x112E112D, 0x112FA0AE, 0xD68FD18E,
37455 +0x6262E040, 0x76046512, 0x2152352C, 0x55116266,
37456 +0x1151352C, 0x62626563, 0x75085612, 0x1162362C,
37457 +0x56136252, 0x362C75EC, 0x62521163, 0x75105614,
37458 +0x1164362C, 0x62526653, 0x76105515, 0x1155352C,
37459 +0x56166262, 0x362CD57E, 0x62561166, 0x362C5617,
37460 +0x66531167, 0x55186252, 0x352C7604, 0x62661158,
37461 +0x352C5519, 0x65631159, 0x561A6262, 0x362C7504,
37462 +0x6252116A, 0x7504561B, 0x116B362C, 0x561C6256,
37463 +0x116C362C, 0x561D6256, 0x116D362C, 0x62526653,
37464 +0x7604551E, 0x115E352C, 0x561F6262, 0x362CD569,
37465 +0x6252116F, 0x7594061E, 0x0166362C, 0x6653E044,
37466 +0x051E6252, 0x352C7644, 0xE0480156, 0x061E6262,
37467 +0x0166362C, 0xE054D660, 0x051E6262, 0x352C4229,
37468 +0x76040156, 0xE0586262, 0x4229061E, 0x0166362C,
37469 +0xE23856FB, 0xE0442620, 0xE048021E, 0x62121621,
37470 +0x55111622, 0x1653E200, 0x16545512, 0x16555515,
37471 +0x16565513, 0x16575516, 0xE040051E, 0x051E1658,
37472 +0x1659E050, 0x165A5514, 0xE04C051E, 0x051E165B,
37473 +0x165CE054, 0xE058051E, 0x051E165D, 0x165EE044,
37474 +0xE0480126, 0x11212122, 0x11251122, 0x11261123,
37475 +0xE0400126, 0xE0500126, 0x01261124, 0x0126E04C,
37476 +0x0126E054, 0x0126E058, 0x3F3C9358, 0x6EF64F26,
37477 +0x6CF66DF6, 0x000B6BF6, 0x4F2269F6, 0xE240614D,
37478 +0x89143123, 0x3127E21F, 0x8B09D734, 0xD434614D,
37479 +0xE00171E0, 0x5671440B, 0x26596507, 0x1761A007,
37480 +0xE001D42F, 0x6672440B, 0x26596507, 0x4F262762,
37481 +0x0009000B, 0x614D4F22, 0x3123E240, 0xE21F8912,
37482 +0xD7263127, 0x614D8B08, 0x5671D225, 0x420B71E0,
37483 +0x260BE001, 0x1761A006, 0x6672D221, 0xE001420B,
37484 +0x2762260B, 0x000B4F26, 0xE6400009, 0x46284618,
37485 +0x6252D51C, 0x89FC2268, 0x0009000B, 0x4618E680,
37486 +0xD5184628, 0x22686252, 0x000B89FC, 0xA0010009,
37487 +0x7201E200, 0x8BFC3242, 0x0009000B, 0x00000080,
37488 +0x00117804, 0x00202FF4, 0x00201356, 0x0020139A,
37489 +0x00203008, 0x00203010, 0x00200C38, 0x00200C12,
37490 +0x00202F00, 0x00202F14, 0x00202AA4, 0x001C36A0,
37491 +0x001C3CA0, 0x001C36F4, 0x001C3B88, 0x001C3704,
37492 +0x002029F8, 0x001C373C, 0x4618E680, 0xD52F4628,
37493 +0x22686252, 0x000B8BFC, 0x2FE60009, 0x7FFC4F22,
37494 +0xBFF16E53, 0x61E22F42, 0xE280D629, 0x54E11615,
37495 +0x16464218, 0x422855E2, 0x57E31657, 0x16786EF2,
37496 +0x26E22E2B, 0x4F267F04, 0x6EF6AFA8, 0x2FD62FC6,
37497 +0x4F222FE6, 0x6C53DD1E, 0x6E43BFD6, 0x2DE2BF95,
37498 +0x0009BFD2, 0x2C1251D5, 0x1C4154D6, 0x1C5255D7,
37499 +0x1C6356D8, 0x6EF64F26, 0x000B6DF6, 0x61636CF6,
37500 +0xA004E600, 0x62564109, 0x24227601, 0x36127404,
37501 +0x000B8BF9, 0x4F220009, 0xD10FD40E, 0x0009410B,
37502 +0xD40FD20E, 0xE5056022, 0x2202CB20, 0xD50D2452,
37503 +0x450BE700, 0xD70C2472, 0x0009470B, 0xE601D10B,
37504 +0x2162D20B, 0x4F264618, 0x2262000B, 0x001C3700,
37505 +0x001C370C, 0x00203028, 0x00201356, 0x001C3500,
37506 +0x001D4004, 0x002013CC, 0x00200EF8, 0x001E212C,
37507 +0x001C3D30, 0x0009A1A9, 0x2FE62FD6, 0xDD8F4F22,
37508 +0xA0049EA7, 0xD48E0009, 0x420BD28E, 0x62D265D2,
37509 +0x8BF822E8, 0x0009A004, 0xD28AD48B, 0x55D1420B,
37510 +0x22E852D1, 0xA0048BF8, 0xD4880009, 0x420BD285,
37511 +0x52D255D2, 0x8BF822E8, 0x0009A004, 0xD281D484,
37512 +0x55D3420B, 0x22E852D3, 0xA0048BF8, 0xD4810009,
37513 +0x420BD27C, 0x52D455D4, 0x8BF822E8, 0x6EF64F26,
37514 +0x6DF6000B, 0x2FD62FC6, 0x4F222FE6, 0x6E636D73,
37515 +0x6C53B018, 0x64C357F4, 0xB05465E3, 0xB06A66D3,
37516 +0xB09A0009, 0xB09E0009, 0xB0A20009, 0xB0BE0009,
37517 +0xB0C10009, 0xB1240009, 0x4F260009, 0x6DF66EF6,
37518 +0x6CF6A023, 0x3412D16C, 0xD66C0529, 0x2650D76C,
37519 +0x2742000B, 0x0009A014, 0x2FD62FC6, 0x4F222FE6,
37520 +0x6E636D73, 0x6C53BFEE, 0x64C357F4, 0xB02A65E3,
37521 +0xB10666D3, 0x4F260009, 0x6DF66EF6, 0x6CF6A005,
37522 +0xE603D260, 0x000B4618, 0xD25E2262, 0x000BE600,
37523 +0x4F222262, 0xE40ABF7E, 0x0009BF7E, 0xE104D25A,
37524 +0xE5004118, 0x2212E40A, 0x2252BF74, 0x6072D757,
37525 +0x4F26CB20, 0x2702000B, 0xD1554F22, 0xE400410B,
37526 +0x452BD554, 0x2FE64F26, 0x6E63D153, 0x44186612,
37527 +0x45289210, 0x26294408, 0x44084500, 0x4400265B,
37528 +0x4708264B, 0x47082162, 0x27EBD14C, 0x000B2172,
37529 +0x03F06EF6, 0x2FE61FFF, 0xDE494F22, 0xE40AE101,
37530 +0x2E12BF48, 0x726C62E3, 0xE401E100, 0x22122212,
37531 +0x22122212, 0x22122212, 0xE7302242, 0xE40AE503,
37532 +0x22122212, 0x22122212, 0x22122212, 0x22122212,
37533 +0x22122212, 0x22122212, 0x22522272, 0x22122212,
37534 +0x22122212, 0x22122212, 0x22122212, 0x121ABF22,
37535 +0x2E62E600, 0x000B4F26, 0xD2326EF6, 0xE441E101,
37536 +0x000B2212, 0xD1302242, 0xE605D430, 0x000B2162,
37537 +0xD52F2462, 0x6050D22F, 0x8B0E8801, 0x6040D42E,
37538 +0x8B078801, 0x9626D52D, 0x88016050, 0x96238B0C,
37539 +0x0009A00A, 0xA0079621, 0xE6000009, 0x2262D426,
37540 +0x88016040, 0xE6048B00, 0xAEF3E40A, 0xD2242262,
37541 +0xE40AE601, 0x2262AEEE, 0x2FC62FB6, 0x2FE62FD6,
37542 +0xDC204F22, 0x60C2ED00, 0xCB01EB64, 0x60C22C02,
37543 +0xA041C901, 0x03C46E03, 0x034003D4, 0x001C3B88,
37544 +0x0020302C, 0x002013A2, 0x00203034, 0x0020303C,
37545 +0x00203044, 0x0020304C, 0x0025E720, 0x0020321C,
37546 +0x00202F04, 0x001C5968, 0x001D4004, 0x001C3500,
37547 +0x00201154, 0x00201180, 0x001C5814, 0x001C59D0,
37548 +0x001C5830, 0x001C6268, 0x001C59A4, 0x001C639C,
37549 +0x00202F16, 0x001C5804, 0x00202F15, 0x00202F17,
37550 +0x001C581C, 0x001C5860, 0x89073DB2, 0xE40A60C2,
37551 +0xBE9FC901, 0x7D016E03, 0x8BF52EE8, 0x8B033DB2,
37552 +0xD23ED43D, 0x0009420B, 0x4F26E40A, 0x6DF66EF6,
37553 +0xAE8F6CF6, 0x44116BF6, 0x604B8F01, 0x000B6043,
37554 +0x2FB60009, 0x2FD62FC6, 0x4F222FE6, 0xDC347FFC,
37555 +0x60C2ED00, 0xCB02EB64, 0x60C22C02, 0xC9022F02,
37556 +0x6E03A009, 0x89083DB3, 0xE40A60C2, 0xC9022F02,
37557 +0x6E03BE70, 0x2EE87D01, 0x3DB38BF4, 0xD4298B08,
37558 +0x7F04D226, 0x6EF64F26, 0x6CF66DF6, 0x6BF6422B,
37559 +0x4F267F04, 0x6DF66EF6, 0x000B6CF6, 0xD5226BF6,
37560 +0x60525651, 0x000B4628, 0x2FB6306C, 0x2FD62FC6,
37561 +0x4F222FE6, 0x4F024F12, 0x6E43BFF1, 0xDC1B6B03,
37562 +0xBFECDD1B, 0x30B80009, 0x060A3C05, 0x46094609,
37563 +0x3D654601, 0x4209020A, 0x42094209, 0x8BF032E2,
37564 +0x4F164F06, 0x6EF64F26, 0x6CF66DF6, 0x6BF6000B,
37565 +0x4F222FE6, 0xE102DE0F, 0xE403E500, 0xBFD42E12,
37566 +0xE6062E52, 0xE7004618, 0x2E62E403, 0x4F262E72,
37567 +0x6EF6AFCB, 0x0009000B, 0x00203054, 0x00201356,
37568 +0x001C5860, 0x0020306C, 0x001C1040, 0xCCCCCCCD,
37569 +0x10624DD3, 0x001D4004, 0x2F962F86, 0x2FB62FA6,
37570 +0x2FD62FC6, 0x4F222FE6, 0xE5007FDC, 0x6453E110,
37571 +0x6C534128, 0xED096E53, 0x6653655D, 0x365C4608,
37572 +0x75014608, 0x6043361C, 0x0F66675D, 0xEB0060C3,
37573 +0x26C137D3, 0x81628161, 0x16B28163, 0x16B416E3,
37574 +0x74048FEA, 0xD9A668F2, 0x1981DAA6, 0x59F12982,
37575 +0x1A91D1A5, 0x5AF22A92, 0x5DF45BF3, 0x54F65EF5,
37576 +0x21A211A1, 0x11B211B3, 0x11D411D5, 0x11E611E7,
37577 +0x11481149, 0x55F7EE00, 0x57F8DD9C, 0x64E3D29C,
37578 +0xDB9DD99C, 0xE845EAB8, 0x2D521D51, 0x6AAC2272,
37579 +0x6EED4808, 0x4D086DE3, 0x3DEC65E3, 0x4D084508,
37580 +0x3D9C35EC, 0x450860C3, 0x81D12DC1, 0x4508E050,
37581 +0x45084008, 0x60C381D2, 0xE60035BC, 0x81D334A2,
37582 +0x1D531DD2, 0x8D01D489, 0xD4861D64, 0xB05C65D3,
37583 +0x64ED7E01, 0x8BDC3482, 0xDB88D182, 0xD2806812,
37584 +0x1B814829, 0x2FD26412, 0x2B92694D, 0xD97F6722,
37585 +0x1B734729, 0xD77C6822, 0x1BA26A8D, 0xD2806B72,
37586 +0x22B2D57B, 0xE0035D72, 0x5E7412D2, 0x12E44018,
37587 +0xD67C5176, 0x54781216, 0x1248E103, 0xD4796792,
37588 +0x6852127A, 0x28C1E7FF, 0x81916952, 0x6A52E050,
37589 +0x81A24008, 0x60C36B52, 0x6C5281B3, 0x6E521CC2,
37590 +0x62521E63, 0x1264E600, 0x46086563, 0x7501364C,
37591 +0x665D2672, 0x8BF83613, 0x4F267F24, 0x6DF66EF6,
37592 +0x6BF66CF6, 0x69F66AF6, 0x68F6000B, 0x60616642,
37593 +0x8D04C803, 0x6061E500, 0x8802C903, 0x52628B03,
37594 +0x51246563, 0x000B2412, 0x2FD66053, 0x4F222FE6,
37595 +0x6E537FEC, 0xE5506253, 0xE4006D43, 0xA0014508,
37596 +0x5224E101, 0x22116043, 0x81238121, 0x81226053,
37597 +0x362056E2, 0xD2548BF5, 0x64F316E4, 0x420BE614,
37598 +0x65E165E3, 0x2549E4FC, 0x61F12E51, 0x214965F3,
37599 +0x54D12F11, 0x410BD14C, 0x57D1E614, 0xCB016071,
37600 +0x1DE12701, 0x4F267F14, 0x000B6EF6, 0x2FD66DF6,
37601 +0x4F222FE6, 0x6E537FEC, 0xE5FC6653, 0x60616D43,
37602 +0xCB012059, 0x52E22601, 0x8B063260, 0x51E212E4,
37603 +0x8B0431E0, 0xA00252D1, 0xAFF01E22, 0xD23A5664,
37604 +0xE61464F3, 0x65E3420B, 0xE1FC67E1, 0x2E712719,
37605 +0x54D167F1, 0xD1342719, 0xE61465F3, 0x2F71410B,
37606 +0x602152D1, 0x2201CB01, 0x7F141DE1, 0x6EF64F26,
37607 +0x6DF6000B, 0x4F222FE6, 0xDE23624C, 0x42004208,
37608 +0x3E2CA005, 0xD41F5252, 0xBF8E5624, 0x65E22E62,
37609 +0x352052E1, 0xD6228BF6, 0x4F262622, 0x6EF6000B,
37610 +0x2FC62FB6, 0x2FE62FD6, 0xDC184F22, 0x52C1DB1F,
37611 +0x362066C2, 0x6061891C, 0x8801C903, 0xDE138918,
37612 +0xBF63DD1B, 0x650364E3, 0x66B28503, 0x3262620D,
37613 +0xD40B8907, 0x0009BF9B, 0x4D0BD416, 0xAFE60009,
37614 +0xBF620009, 0xD41464E3, 0x00094D0B, 0x0009AFDF,
37615 +0x2262D212, 0x6EF64F26, 0x6CF66DF6, 0x6BF6000B,
37616 +0x00202B00, 0x00202B08, 0x00202B10, 0x00202B38,
37617 +0x00202F1C, 0x001000B4, 0x00101680, 0x001E2108,
37618 +0x001C3D00, 0x00117880, 0x00200A9E, 0x00202F00,
37619 +0x00201356, 0x00203088, 0x0020308C, 0x001C3D28,
37620 +0x2FC62FB6, 0x2FE62FD6, 0x7FFC4F22, 0x6022D22B,
37621 +0x8D41C803, 0xDE2A2F01, 0xDB2BDC2A, 0xED01A017,
37622 +0xC9036051, 0x89168801, 0xD128D426, 0x0009410B,
37623 +0x61035503, 0xC8208551, 0xE0508903, 0x720102BE,
37624 +0xD2230B26, 0x420B64E3, 0xD6226513, 0x52C126D2,
37625 +0x352065C2, 0xDE208BE4, 0xDB21DD20, 0x52D1DC21,
37626 +0x352065D2, 0x60518918, 0x8801C903, 0xD41B8914,
37627 +0x460BD616, 0x57030009, 0x8F0437E0, 0xE2016503,
37628 +0xAFEC2B20, 0xD4182C52, 0x420BD218, 0xD6110009,
37629 +0x4118E101, 0x2612AFE3, 0xC80460F1, 0xD2148907,
37630 +0x4F267F04, 0x6DF66EF6, 0x422B6CF6, 0x7F046BF6,
37631 +0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, 0x001E2100,
37632 +0x00202B10, 0x00202B08, 0x00202AA4, 0x0020106C,
37633 +0x002010EE, 0x001C3D30, 0x00117880, 0x00202B00,
37634 +0x00202F20, 0x00202F1C, 0x00202B38, 0x0020108A,
37635 +0x00200170, 0xE601D203, 0x1265D503, 0x000B2252,
37636 +0x00001266, 0x001C1010, 0x0000C34F, 0x0009000B,
37637 +0x2FD62FC6, 0x4F222FE6, 0x6D436C53, 0xEE00A004,
37638 +0x7E0164D4, 0x644CBFF2, 0x8BF93EC2, 0x6EF64F26,
37639 +0x000B6DF6, 0xE5006CF6, 0x6643A002, 0x76017501,
37640 +0x22286260, 0xAFE38BFA, 0x2FE60009, 0x75076253,
37641 +0xE1086753, 0x6043EE0A, 0x4409C90F, 0x650330E2,
37642 +0x8D014409, 0xE630E637, 0x4110365C, 0x8FF22760,
37643 +0xE00077FF, 0x000B8028, 0x000B6EF6, 0x000BE000,
37644 +0x2FE6E000, 0x7FEC4F22, 0x6E436253, 0xBFDC65F3,
37645 +0xBFD06423, 0xBFCE64E3, 0xD40364F3, 0x0009BFCB,
37646 +0x4F267F14, 0x6EF6000B, 0x00203090, 0xE4FDD59A,
37647 +0xD69A6152, 0x25122149, 0x74016052, 0x2502CB01,
37648 +0xD1976752, 0x25722749, 0xC8406010, 0x60628902,
37649 +0x2602CB04, 0xE5016062, 0x2602CB08, 0xE4026062,
37650 +0x2602C9CF, 0x45186062, 0x2602CB03, 0x000B1642,
37651 +0xD58C1653, 0xD28DD78C, 0xE100D48D, 0x2511E600,
37652 +0x22102711, 0x2461AFD2, 0xD28A664C, 0x362C4600,
37653 +0xCB106060, 0x2600000B, 0xD286654C, 0x352C4500,
37654 +0xE1EF6650, 0x000B2619, 0x664C2560, 0x4600D282,
37655 +0x6060362C, 0x000BCB10, 0x654C2600, 0x4500D27E,
37656 +0x6650352C, 0x2619E1EF, 0x2560000B, 0xD279664C,
37657 +0x362C4600, 0xCB086060, 0x2600000B, 0xD275654C,
37658 +0x352C4500, 0xE1F76650, 0x000B2619, 0x664C2560,
37659 +0x4600D271, 0x6060362C, 0x000BCB08, 0x654C2600,
37660 +0x4500D26D, 0x6650352C, 0x2619E1F7, 0x2560000B,
37661 +0xD668624C, 0x326C4200, 0xC9086020, 0x40214021,
37662 +0x000B4021, 0x624C600C, 0x4200D663, 0x6020326C,
37663 +0x4021C908, 0x40214021, 0x600C000B, 0x644CD15F,
37664 +0x6240341C, 0x602C000B, 0x644CD15D, 0x6240341C,
37665 +0x602C000B, 0x4F222FE6, 0x645C6E43, 0x3467E60A,
37666 +0xBFEB8914, 0x640C0009, 0x880160EC, 0xE00F8B02,
37667 +0x2409A002, 0x44094409, 0xE60A624C, 0x89053263,
37668 +0x644CBFE2, 0x6023620C, 0x8B00C880, 0x6023E200,
37669 +0x000B4F26, 0x4F226EF6, 0x6062D64A, 0x8B038801,
37670 +0x0009B246, 0x0009A003, 0xE640D247, 0xD6472260,
37671 +0x4F26E200, 0x2622000B, 0xD6424F22, 0x88026062,
37672 +0xB28F8B01, 0xD6410009, 0x4F26E200, 0x2622000B,
37673 +0xD43DD53C, 0xE701E100, 0x000B2512, 0xD23A2470,
37674 +0x000BE604, 0x4F222260, 0xD13AD439, 0x0009410B,
37675 +0xE1FDD539, 0xD2396650, 0xE7002619, 0x4F262560,
37676 +0x2270000B, 0xD4364F22, 0x410BD132, 0xD5320009,
37677 +0x6650E7FB, 0x4F262679, 0x2560000B, 0xD4314F22,
37678 +0x410BD12C, 0xD52C0009, 0x6650E7F7, 0x4F262679,
37679 +0x2560000B, 0x942DD528, 0x22496250, 0x2520000B,
37680 +0xE4BFD525, 0x22496250, 0x2520000B, 0xD2264F22,
37681 +0x600D8522, 0x89112008, 0x89138801, 0x89158803,
37682 +0x89438805, 0x89498806, 0x894F8808, 0x89558809,
37683 +0x895B880A, 0x8961880B, 0x0009A068, 0x0009B06A,
37684 +0x600CA065, 0x0009B078, 0x600CA061, 0x0009B081,
37685 +0x600CA05D, 0x0000FF7F, 0x001E2148, 0x001E1108,
37686 +0x001E1000, 0x00202F60, 0x00202F62, 0x00202F81,
37687 +0x00202F44, 0x001E103F, 0x001E105F, 0x001E102F,
37688 +0x001E1090, 0x00202F68, 0x001E100B, 0x00202F64,
37689 +0x00203094, 0x00201356, 0x001E1028, 0x00202F80,
37690 +0x002030A0, 0x002030B0, 0x00202F38, 0x6260D684,
37691 +0x8B2B2228, 0x0009B061, 0x600CA029, 0x6260D680,
37692 +0x8B232228, 0x0009B069, 0x600CA021, 0x6260D67C,
37693 +0x8B1B2228, 0x0009B0C7, 0x600CA019, 0x6260D678,
37694 +0x8B132228, 0x0009B0CD, 0x600CA011, 0x6260D674,
37695 +0x8B0B2228, 0x0009B125, 0x600CA009, 0x6260D670,
37696 +0x8B032228, 0x0009B13D, 0x600CA001, 0x4F26E000,
37697 +0x0009000B, 0xD26CD16B, 0xD56C8412, 0x4000C90F,
37698 +0xD76B012D, 0xE403D66B, 0xE20F611C, 0x2540E001,
37699 +0x25202712, 0x2602000B, 0xE601D262, 0x30668523,
37700 +0xE0008D05, 0xD663D260, 0xE0018122, 0x000B2602,
37701 +0xD25C0009, 0x600D8523, 0x89052008, 0x8B0A8801,
37702 +0x6060D65D, 0x2600CB01, 0xD457D65A, 0xE001E101,
37703 +0x000B2612, 0x000B8142, 0xD152E000, 0x8513E501,
37704 +0x640D4518, 0x66033453, 0xE0008D05, 0xD551D253,
37705 +0x2260E001, 0x000B2502, 0x4F220009, 0x8513D149,
37706 +0x6453650D, 0x62494419, 0x227D672E, 0x8801602C,
37707 +0x88028909, 0x88038910, 0x8806891A, 0x88078935,
37708 +0xA04C893B, 0xD5460009, 0x6652D746, 0x2762D446,
37709 +0x622C6261, 0x2421A038, 0x2228625C, 0xD4438B3F,
37710 +0x6642D540, 0x2562D440, 0x24018561, 0x6203A02C,
37711 +0x2008605C, 0x88108907, 0x88208908, 0x88308909,
37712 +0xA02C890A, 0xD23A0009, 0x6222A008, 0xA005D239,
37713 +0xD2396222, 0x6222A002, 0x6262D638, 0xD432D531,
37714 +0x66212522, 0xA00F626C, 0xD6352421, 0x6261D52D,
37715 +0x622CD42D, 0xA0072562, 0xD6322421, 0x8561D529,
37716 +0x2562D429, 0x62032401, 0x662D8515, 0x3617610D,
37717 +0x65038F01, 0xB0CB2451, 0xA0010009, 0xE000E001,
37718 +0x000B4F26, 0xD6190009, 0xD427E101, 0x65412610,
37719 +0xD118D717, 0xE20F655D, 0x2752E001, 0x000B2620,
37720 +0x2FE62102, 0xD20F4F22, 0x640C8523, 0x8B082448,
37721 +0xD511D61D, 0x2621E200, 0x940F8451, 0xA0482049,
37722 +0xDE0D8051, 0xC84060E0, 0xE2018D32, 0x89443427,
37723 +0xD216D615, 0x2641420B, 0x0009A030, 0x0000FF7F,
37724 +0x00202F81, 0x00202F38, 0x00202F44, 0x001E1100,
37725 +0x001E100C, 0x00202F64, 0x001E1000, 0x001E1001,
37726 +0x00202F6C, 0x00202F4C, 0x00202F50, 0x00202F54,
37727 +0x00202F70, 0x00202F74, 0x00202F78, 0x00202F7C,
37728 +0x00203280, 0x0020328A, 0x00202F5E, 0x0020225A,
37729 +0x89123427, 0xD294D693, 0x2641420B, 0xCB8084E1,
37730 +0x80E1B0F5, 0xD69160E0, 0x2E00CB04, 0xC93F6060,
37731 +0xD68F2600, 0xA001E001, 0xE0002602, 0x000B4F26,
37732 +0xD68C6EF6, 0xC8806060, 0xD2868919, 0x88016021,
37733 +0xD2898B15, 0x8524E501, 0x89103056, 0xE203D187,
37734 +0x2120D487, 0xE00B6541, 0x0656655D, 0xE40FD585,
37735 +0x2140E702, 0xD77E2571, 0x000BE001, 0x000B2702,
37736 +0x2FE6E000, 0xDE804F22, 0xC88084E1, 0xD57A892C,
37737 +0x20088554, 0x61038F28, 0x8553D77C, 0x64036672,
37738 +0x8566650C, 0x3520620C, 0xD6798B1E, 0x651CD774,
37739 +0x2651644C, 0x60E02741, 0x8904C840, 0x420BD275,
37740 +0xA0030009, 0xD2680009, 0x0009420B, 0x0009B09F,
37741 +0xE201D167, 0x60E02122, 0xCB04D464, 0x60402E00,
37742 +0x2400C93F, 0x6023A001, 0x4F26E000, 0x6EF6000B,
37743 +0x2FB62FA6, 0x2FD62FC6, 0xDA622FE6, 0x66A1E240,
37744 +0x3622DC5E, 0x62638900, 0x6ED36D2C, 0x4E2136D8,
37745 +0x4E212A61, 0xDB61D460, 0xE700A00F, 0x770162B2,
37746 +0x71026123, 0x66212B12, 0x71026213, 0x61212B12,
37747 +0x651D666D, 0x356C4528, 0x627C2452, 0x8BED32E3,
37748 +0xC90360D3, 0x8B108803, 0x617367B2, 0x2B127102,
37749 +0x71026E13, 0x2B126571, 0x655D6DE1, 0x422862DD,
37750 +0x325CE107, 0xA00C2C10, 0x88022422, 0xA0038B01,
37751 +0x8801E203, 0xE2018B05, 0x66B22C20, 0x655D6561,
37752 +0xE60F2452, 0x67A12C60, 0x8B052778, 0xDD38DC44,
37753 +0xEB01EA00, 0x2DB22CA2, 0x6DF66EF6, 0x6BF66CF6,
37754 +0x6AF6000B, 0x2FE62FD6, 0xE240DD36, 0x362266D1,
37755 +0x62638900, 0x3678672C, 0x7703DE38, 0x47212D61,
37756 +0x64E2D635, 0xA00E4721, 0x6562E100, 0x62537101,
37757 +0x74012450, 0x24204219, 0x45297401, 0x74012450,
37758 +0x24504519, 0x621C7401, 0x8BEE3273, 0x66E24200,
37759 +0x420061D1, 0x2118362C, 0x2E628F06, 0xDD1CD728,
37760 +0xE501E400, 0x2D522742, 0x000B6EF6, 0x2FD66DF6,
37761 +0x4F222FE6, 0xED0AEE01, 0x64E3BC96, 0xBC9B64E3,
37762 +0x62EC7E01, 0x8BF732D7, 0xBC9EEE01, 0x64E364E3,
37763 +0x7E01BCA3, 0x32D762EC, 0x4F268BF7, 0x000B6EF6,
37764 +0xD1186DF6, 0xD418920D, 0x72122122, 0x2422D617,
37765 +0xD7177204, 0x72202622, 0x2722D116, 0x000B7230,
37766 +0x137A2122, 0x00202F5E, 0x00202366, 0x001E1015,
37767 +0x00202F64, 0x001E1001, 0x00202F38, 0x001E1100,
37768 +0x00202F62, 0x00202F50, 0x001E1000, 0x00202F54,
37769 +0x00202F60, 0x0020225A, 0x001E100C, 0x00202F4C,
37770 +0x00202F68, 0x00202F6C, 0x00202F70, 0x00202F74,
37771 +0x00202F78, 0x00202F7C, 0x4F222FE6, 0xD6507FFC,
37772 +0x88016060, 0xE2018951, 0x2620BFBB, 0xD54ED14D,
37773 +0xDE4E6010, 0x64E36552, 0x7402C840, 0x8D22D14C,
37774 +0xD24C7502, 0xE601D74C, 0xE7042722, 0x76016255,
37775 +0x626C2421, 0x8FF93273, 0xD4437402, 0x6242E601,
37776 +0x640D8528, 0x67494419, 0x275D657E, 0x81E4607C,
37777 +0xE417D542, 0x67557601, 0x3243626C, 0x8FF92171,
37778 +0xA0207102, 0xD23E0009, 0xE601D73B, 0xE7042722,
37779 +0x76016255, 0x626C2421, 0x8FF93273, 0xD4327402,
37780 +0x6242E601, 0x640D8528, 0x67494419, 0x275D657E,
37781 +0x81E4607C, 0xE417D533, 0x67557601, 0x3243626C,
37782 +0x8FF92171, 0x924A7102, 0xD2262E21, 0x5E23D72E,
37783 +0x64F22FE2, 0x604365F2, 0x2700C980, 0xC9606043,
37784 +0x80716103, 0xC9036043, 0x80724519, 0x65F2605C,
37785 +0x817266F2, 0x46194629, 0x606C4529, 0x4018645C,
37786 +0x8173304C, 0x21185E23, 0x64F22FE2, 0x6E4C62F2,
37787 +0x602C4219, 0x66F262F2, 0x46294018, 0x461930EC,
37788 +0x42298174, 0x652C606C, 0x305C4018, 0x81758F07,
37789 +0x0009BC9C, 0x2228620C, 0xA00A8908, 0x60130009,
37790 +0x8B038840, 0x0009B009, 0x0009A003, 0xE202D60F,
37791 +0x7F042622, 0x000B4F26, 0x000B6EF6, 0x060A0009,
37792 +0x00202F80, 0x001E1000, 0x00202F6C, 0x00203280,
37793 +0x0020328C, 0x00203224, 0x00202F54, 0x00203254,
37794 +0x00203252, 0x00203226, 0x00202F38, 0x00202F64,
37795 +0x4F222FE6, 0xDE937FFC, 0x200884E9, 0x2F008D06,
37796 +0xD692D491, 0x0009460B, 0x64F0B194, 0x6620D290,
37797 +0x89022668, 0xC9BF60E0, 0x7F042E00, 0x000B4F26,
37798 +0x000B6EF6, 0x2FE60009, 0xDE8A4F22, 0x60E0D68A,
37799 +0xCBC0D48A, 0x62602E00, 0xC803602C, 0x40218904,
37800 +0x70014021, 0x6603A002, 0x66034009, 0xD684616D,
37801 +0xE500A004, 0x75016262, 0x74042422, 0x3213625D,
37802 +0xD2808BF8, 0x0009420B, 0xC9BF84E2, 0x4F2680E2,
37803 +0x6EF6000B, 0x2FE62FD6, 0x7FFC4F22, 0x6260D67A,
37804 +0x89442228, 0xD56FE100, 0x60502610, 0xCB40D477,
37805 +0x2500440B, 0x8D052008, 0x62E06E03, 0x7104612C,
37806 +0x2F11A006, 0xD472D66A, 0xDD726760, 0x657C4D0B,
37807 +0xE23C6D1D, 0x8B033D27, 0xD264D46F, 0x0009420B,
37808 +0x4D214D21, 0xA005D76D, 0x66E6E400, 0x357C4508,
37809 +0x74012562, 0x35D3654D, 0xD7698BF7, 0x6172E003,
37810 +0x81114018, 0x6E7260F1, 0x81E2700C, 0xD4656172,
37811 +0xDD658113, 0x4D0BDE65, 0xE2016572, 0xD4642E22,
37812 +0x420BD252, 0xD6530009, 0xC93F6060, 0x7F042600,
37813 +0x6EF64F26, 0x6DF6000B, 0x2FC62FB6, 0x2FE62FD6,
37814 +0xD25C4F22, 0x6B436E73, 0x420B6C53, 0x20086D63,
37815 +0x61038F08, 0xD245D458, 0x6EF64F26, 0x6CF66DF6,
37816 +0x6BF6422B, 0x21B060C3, 0x60D38011, 0xE5008111,
37817 +0x64BCA007, 0x6053655D, 0x665300EC, 0x7501361C,
37818 +0x625D8064, 0x8BF53243, 0x6060D636, 0x2600C9BF,
37819 +0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, 0x7FC44F22,
37820 +0x720262F3, 0x22512F41, 0x45297202, 0x60632251,
37821 +0xE5C4E682, 0x67F38121, 0x655C666C, 0xE408BFBC,
37822 +0x4F267F3C, 0x0009000B, 0x2F962F86, 0x2FB62FA6,
37823 +0x2FD62FC6, 0x4F222FE6, 0xE1007FC4, 0x6513ECFF,
37824 +0x6B136CCD, 0xDE36D735, 0xEDFF64F3, 0xD835EA04,
37825 +0x6053655C, 0x027D4000, 0x32C0622D, 0x66038D0D,
37826 +0x09ED6063, 0x2491027D, 0x24217402, 0x698202ED,
37827 +0x3928622D, 0x74022892, 0x75017104, 0x6063625C,
37828 +0x07D532A2, 0x0EB58FE4, 0x2448641C, 0xE6808905,
37829 +0x67F3E5C5, 0xBF7F666C, 0x7F3C655C, 0x6EF64F26,
37830 +0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, 0xD11E68F6,
37831 +0x6012D21E, 0xCB20E405, 0x2102E500, 0x000B2242,
37832 +0x00002252, 0x001E1017, 0x002030BC, 0x00201356,
37833 +0x00202F1A, 0x001E1015, 0x001E10BF, 0x00117800,
37834 +0x001E10FC, 0x00200170, 0x00202F20, 0x002024BE,
37835 +0x002030C0, 0x002013A2, 0x002030DC, 0x0011788C,
37836 +0x00202F1C, 0x00202B00, 0x002010EE, 0x001E2130,
37837 +0x002030E4, 0x00202480, 0x002030E8, 0x00202F26,
37838 +0x00202F2E, 0x00203220, 0x001C3500, 0x001D4004,
37839 +0xD565D164, 0xE400D765, 0x2142E20F, 0x17411154,
37840 +0xD5632722, 0x9669D763, 0x15412572, 0x96661562,
37841 +0xE6011565, 0xD5601165, 0x666CE6F8, 0x25422542,
37842 +0x25422542, 0x25422542, 0x25622542, 0x7601E727,
37843 +0x67632572, 0x25627797, 0xE7042572, 0x2572E248,
37844 +0xE2192522, 0xE2702522, 0x25422542, 0x25422542,
37845 +0x25222542, 0x2522E20C, 0x25422542, 0x25422542,
37846 +0x25422542, 0x25422542, 0x000B154A, 0xE2081145,
37847 +0x0009422B, 0x2FE62FD6, 0x7FFC4F22, 0xC8206043,
37848 +0x6E438D02, 0x0009BE6D, 0xC81060E3, 0xBE6A8901,
37849 +0x60E30009, 0x8901C840, 0x0009BE8C, 0xC80160E3,
37850 +0xDD3E8938, 0xC80260D0, 0x2F008D03, 0x460BD63C,
37851 +0x60F00009, 0x8902C804, 0x460BD63A, 0x62F00009,
37852 +0xC8806023, 0x60D08902, 0x2D00C97F, 0xC8016023,
37853 +0xD6358906, 0x0009460B, 0x0009A007, 0x51630601,
37854 +0x8902C808, 0x460BD631, 0x60F00009, 0x8902C810,
37855 +0x420BD22F, 0xD52F0009, 0x88026052, 0xD22E8B03,
37856 +0xA005E604, 0x88012260, 0xD22B8B02, 0x2260E601,
37857 +0x2522E200, 0xC88060E3, 0xD628892E, 0x60E36E60,
37858 +0x8902C880, 0x420BD226, 0x60E30009, 0x8902C840,
37859 +0x420BD224, 0x60E30009, 0x8902C802, 0x420BD222,
37860 +0x60E30009, 0x890EC804, 0x410BD120, 0xBF0E0009,
37861 +0xBF4D0009, 0xD51E0009, 0x6050D41E, 0xC908D71E,
37862 +0xBF842500, 0x60E32472, 0x8905C808, 0x7F04D21B,
37863 +0x6EF64F26, 0x6DF6422B, 0x4F267F04, 0x000B6EF6,
37864 +0x00006DF6, 0x001C581C, 0xA000A000, 0x001D0100,
37865 +0x001D4000, 0x00040021, 0x001C589C, 0x001E1021,
37866 +0x00201536, 0x00201558, 0x00201B98, 0x00201570,
37867 +0x0020157E, 0x00202F64, 0x001E100B, 0x001E1028,
37868 +0x002015D4, 0x002015E0, 0x00201586, 0x002015A4,
37869 +0x001E1000, 0x0010F100, 0x12345678, 0x002015BC,
37870 +0x644CD6A7, 0x000B346C, 0xD6A62450, 0x346C644C,
37871 +0x2450000B, 0x644CD6A4, 0x000B346C, 0x625C2450,
37872 +0x4208616D, 0x42084119, 0x42006019, 0x670E614C,
37873 +0xD49E321C, 0x4200207D, 0x324CC90F, 0x2200000B,
37874 +0x4208625C, 0x42004208, 0x324C644C, 0x4200D498,
37875 +0x000B324C, 0x2FE62260, 0x614C4F12, 0x4100D493,
37876 +0x6710314C, 0xE29F666D, 0x27294619, 0x6E536269,
37877 +0x672E6573, 0x4221227D, 0x42214221, 0x7601662C,
37878 +0xE4014608, 0x34E84608, 0x644C4600, 0x071A0467,
37879 +0x2150257B, 0x000B4F16, 0x4F226EF6, 0xD2857FE8,
37880 +0x88016021, 0xD2848B7B, 0x26686621, 0xD2838B77,
37881 +0x26686621, 0xE50F8B73, 0xE401BFA2, 0xBFA4E501,
37882 +0xE586E400, 0xE400655C, 0x2F50BFA4, 0xBFA1E401,
37883 +0xE602E506, 0x60634618, 0x81F2E401, 0x6543BF9F,
37884 +0xE40185F2, 0xBFAB6543, 0x85F26603, 0x6543E401,
37885 +0x6603BFB1, 0xE40265F0, 0x6053756C, 0x80F8BF80,
37886 +0xBF82E402, 0x84F8E512, 0x7090E402, 0x6503BF82,
37887 +0x4618E602, 0x81F66063, 0xBF80E402, 0x85F6E500,
37888 +0x6603E402, 0xE500BF8C, 0xE40285F6, 0xBF926603,
37889 +0xE5FEE500, 0xE010655C, 0xBF61E403, 0xE5130F54,
37890 +0xE40EBF63, 0x05FCE010, 0xBF63E40E, 0xE5007585,
37891 +0xBF64E403, 0xE500E640, 0xBF71E403, 0xE500E640,
37892 +0xBF78E403, 0xE5FFE640, 0xE014655C, 0xBF47E404,
37893 +0xE40F0F54, 0xE504BF49, 0x05FCE014, 0xBF49E40F,
37894 +0xE5017584, 0xBF4AE640, 0xE501E404, 0xBF57E640,
37895 +0xE501E404, 0xE404E640, 0xAF5C7F18, 0x7F184F26,
37896 +0x000B4F26, 0x4F220009, 0xD2427FF0, 0x88016021,
37897 +0xD2418B71, 0x26686621, 0xD2408B6D, 0x26686621,
37898 +0xE50F8B69, 0xE401BF1C, 0xBF1EE501, 0xE586E400,
37899 +0xE400655C, 0x2F50BF1E, 0xBF1BE401, 0xE401E506,
37900 +0xBF1C6543, 0xE401E640, 0xBF296543, 0xE401E640,
37901 +0xBF306543, 0x65F0E640, 0x756CE402, 0xBEFF6053,
37902 +0xE40280F4, 0xE512BF01, 0xE40284F4, 0xBF017090,
37903 +0xE6406503, 0xBF02E402, 0xE640E500, 0xBF0FE402,
37904 +0xE640E500, 0xBF16E402, 0xE5FEE500, 0x6053655C,
37905 +0xBEE5E403, 0xE51380F8, 0xE40EBEE7, 0xE40E84F8,
37906 +0xBEE77085, 0xE5006503, 0xBEE8E640, 0xE500E403,
37907 +0xBEF5E640, 0xE500E403, 0xBEFCE640, 0xE5FFE403,
37908 +0x6053655C, 0xBECBE404, 0xE40F80FC, 0xE504BECD,
37909 +0xE40F84FC, 0xBECD7083, 0xE5016503, 0xBECEE640,
37910 +0xE501E404, 0xBEDBE640, 0xE501E404, 0xE404E640,
37911 +0xAEE07F10, 0x7F104F26, 0x000B4F26, 0x00000009,
37912 +0x001E102F, 0x001E1080, 0x001E1090, 0x001E103F,
37913 +0x001E103E, 0x00202F5E, 0x00202F60, 0x00202F62,
37914 +0xD21DD11C, 0x66206010, 0x676C7001, 0x3700C90F,
37915 +0xE5008D13, 0x67106210, 0x7701622C, 0x64232170,
37916 +0xD6166010, 0x44084408, 0x3428C90F, 0x62602100,
37917 +0x7201D513, 0x44082620, 0x000B354C, 0xD10F6053,
37918 +0x25586510, 0xE6008D13, 0xD60DD40B, 0x655C6540,
37919 +0x47086753, 0x37584708, 0x47086540, 0x24507501,
37920 +0x367C6040, 0x2400C90F, 0x72FF6210, 0x000B2120,
37921 +0x00006063, 0x00202F19, 0x00202F18, 0x00202F1A,
37922 +0x00202B40, 0x7FFC4F22, 0xE680D1A8, 0x666C6212,
37923 +0xD2A72F22, 0x67F36563, 0x420B7542, 0x7F04E404,
37924 +0x000B4F26, 0xE6800009, 0xD2A1666C, 0xE7006563,
37925 +0x422B7540, 0xE6806473, 0xD29D666C, 0xE7006563,
37926 +0x422B7543, 0x2FB66473, 0x2FD62FC6, 0x4F222FE6,
37927 +0x4D18ED01, 0xDB98DC97, 0x65C252C1, 0x89203520,
37928 +0xC9036051, 0x891C8801, 0xD194DE92, 0x64E3410B,
37929 +0x85036503, 0x670D66B2, 0x89073762, 0xD291D490,
37930 +0x0009420B, 0xE701D190, 0x2172AFE6, 0xDE8F64E3,
37931 +0x00094E0B, 0xD48FD68E, 0x410BD18F, 0xAFDB26D2,
37932 +0x4F260009, 0x6DF66EF6, 0x000B6CF6, 0x4F226BF6,
37933 +0x85467FF4, 0x2F01E681, 0x666C8547, 0x854881F1,
37934 +0x81F2D27B, 0x67F38542, 0x854381F3, 0x81F4E40C,
37935 +0x65636053, 0x420B81F5, 0x7F0C7540, 0x000B4F26,
37936 +0x2F860009, 0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6,
37937 +0x7FEC4F22, 0xE000D176, 0xD4782F12, 0x81F26103,
37938 +0xDC771F42, 0xD6776B13, 0xE0014B08, 0x460BDE76,
37939 +0x3BEC4B00, 0x66C21F03, 0x362052C1, 0xA1818B01,
37940 +0x60610009, 0x8801C903, 0xA17B8B01, 0x85610009,
37941 +0x8B01C801, 0x0009A080, 0x85D25D63, 0xC9036603,
37942 +0x85D36403, 0x6053650D, 0x40214021, 0x4500C93F,
37943 +0x322A6103, 0x6053252D, 0xC901E510, 0xD95E3153,
37944 +0x6E038D21, 0x4408D761, 0x44086870, 0x44006213,
37945 +0x28884200, 0x342C8F0E, 0x6043D25D, 0x60E3072D,
37946 +0x4A196A7D, 0x658E68A9, 0x285D8801, 0x6A7C8F0B,
37947 +0x6A13A009, 0x6043D257, 0x61ED0E2D, 0x68194119,
37948 +0x287D678E, 0xD1546AEC, 0x22286210, 0xEAFF8901,
37949 +0xEEFF6AAC, 0x6EEC65AD, 0x8B0F35E0, 0x4D0BDD3F,
37950 +0x540364C3, 0xBF72E502, 0xD44C6D03, 0x410BD13F,
37951 +0xD74B65D3, 0xD44BEE01, 0x27E2A025, 0x2679E7FC,
37952 +0x81D26063, 0x946085D3, 0x61032049, 0x4508268B,
37953 +0x251B6063, 0x605381D2, 0x85D481D3, 0x4118E108,
37954 +0x81D4201B, 0xEE0262C2, 0x20798521, 0x64C28121,
37955 +0x6041678D, 0xCB0137E3, 0x24018D04, 0xEEE785D2,
37956 +0x81D220E9, 0x490BD438, 0x60C20009, 0x52F366F2,
37957 +0x2B02CB01, 0x2622AF6F, 0xD2208561, 0x8F02C802,
37958 +0xA0D264C3, 0x420B0009, 0xD9300009, 0x5E036503,
37959 +0x079EE04C, 0x7701DD2E, 0x69D20976, 0x7901D626,
37960 +0x6D602D92, 0x89062DD8, 0xD218D424, 0xED01420B,
37961 +0xA0B3D723, 0x625127D2, 0x4118E10F, 0x2219E402,
37962 +0x32404418, 0x85518B46, 0x20D9EDFC, 0x60518151,
37963 +0xCB017DE3, 0x85E12501, 0x20D9D60A, 0x460B81E1,
37964 +0x69F264C3, 0xA09957F3, 0x7E032972, 0x001C3D9C,
37965 +0x00201E38, 0x00202B38, 0x00202F00, 0x0020106C,
37966 +0x00202B00, 0x002010EE, 0x001E2130, 0x0020108A,
37967 +0x001C3D30, 0x00203200, 0x00201356, 0x0020320C,
37968 +0x00202B10, 0x002029F8, 0x001C3D00, 0x0020321C,
37969 +0x00203100, 0x00203180, 0x00202F14, 0x00202B08,
37970 +0x001E212C, 0x00203204, 0x00203208, 0x00202AA4,
37971 +0x00203220, 0x6DDD6D51, 0x6DD94D19, 0x2D6D66DE,
37972 +0x60DC7D01, 0x41186103, 0x8F458801, 0xD65B2511,
37973 +0x74016462, 0x85E32642, 0x6063660D, 0x40214021,
37974 +0x4600C93F, 0x322A6D03, 0x6063262D, 0xD154C801,
37975 +0x8901D954, 0x2D6B96A1, 0xE010E600, 0x64DD0F64,
37976 +0x07FCE010, 0x4000607C, 0x622D021D, 0x8D123240,
37977 +0x60636603, 0xE7FF021D, 0x8B013270, 0x01D5A00B,
37978 +0x02FCE010, 0x7201E604, 0x622C0F24, 0x8BE73262,
37979 +0x666C06FC, 0x60634600, 0x7101019D, 0xD1420915,
37980 +0x697D6711, 0x89073940, 0x602D6211, 0x890388FF,
37981 +0xDD3E21D1, 0x2D20E201, 0xEDFC8551, 0x815120D9,
37982 +0xD23B6051, 0x64C3CB01, 0x2501420B, 0x02FCE010,
37983 +0x612CD438, 0x440BE001, 0x270267F2, 0xD23685EF,
37984 +0x420B54F2, 0xAE96650D, 0x420B0009, 0x54030009,
37985 +0x85446E03, 0x4D18ED08, 0x30D020D9, 0xBE568B03,
37986 +0xA007E501, 0x85410009, 0x620DDD2C, 0x890122D8,
37987 +0xE500BE4D, 0xD22BD42A, 0x65E3420B, 0xED01D72A,
37988 +0x27D2AE79, 0xEE0485F2, 0x610D7001, 0x81F231E7,
37989 +0x7C088D02, 0x0009AE66, 0x4F267F14, 0x6DF66EF6,
37990 +0x6BF66CF6, 0x69F66AF6, 0x68F6000B, 0x4F222FE6,
37991 +0x6E22D21E, 0xC84060E3, 0x22E28D02, 0x0009BDD2,
37992 +0x4218E240, 0x89012E28, 0x0009BDDD, 0xC81060E3,
37993 +0xD4178905, 0x420BD217, 0xBDDC0009, 0x60E30009,
37994 +0x8901C805, 0x0009BE2D, 0xC80260E3, 0x4F268902,
37995 +0x6EF6ADD9, 0x000B4F26, 0x80006EF6, 0x00203220,
37996 +0x00202F26, 0x00202F2E, 0x00202F22, 0x00202F24,
37997 +0x002010EE, 0x002029F8, 0x002013A2, 0x00008000,
37998 +0x00202B08, 0x0020108A, 0x001E212C, 0x001C3510,
37999 +0x00203214, 0x00201356, 0x080A0C0E, 0x00020406,
38000 +0x1A1C1E20, 0x12141618, 0x2E303234, 0x26282A2C,
38001 +0x3A3C3E40, 0x6C625648, 0x41112F26, 0xE2208F18,
38002 +0x890B3123, 0x321CD204, 0xD1026220, 0x412B312C,
38003 +0x00090009, 0x00202A22, 0x002029D8, 0x000BE000,
38004 +0x400062F6, 0x40004000, 0x40004000, 0x40004000,
38005 +0x62F6000B, 0x40004000, 0x40004000, 0x40004000,
38006 +0x40184000, 0x62F6000B, 0x40004000, 0x40004000,
38007 +0x40004000, 0x40284000, 0x62F6000B, 0x40004000,
38008 +0x40184000, 0x000B4028, 0xC90F62F6, 0x40054005,
38009 +0x40054005, 0x62F6000B, 0x4005C907, 0x40054005,
38010 +0x62F6000B, 0x4005C903, 0x000B4005, 0xC90162F6,
38011 +0x000B4005, 0x000062F6, 0x00000000, 0x00000000,
38012 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38013 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38014 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38015 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38016 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38017 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38018 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38019 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38020 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38021 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38022 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38023 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38024 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38025 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38026 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38027 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38028 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38029 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38030 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38031 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38032 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38033 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38034 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38035 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38036 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38037 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38038 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38039 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38040 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38041 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38042 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38043 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38044 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38045 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38046 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38047 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38048 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38049 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38050 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38051 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38052 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38053 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38054 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38055 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38056 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38057 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38058 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38059 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38060 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38061 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38062 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38063 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38064 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38065 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38066 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38067 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38068 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38069 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38070 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38071 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38072 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38073 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38074 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38075 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38076 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38077 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38078 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38079 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38080 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38081 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38082 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38083 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38084 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38085 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38086 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38087 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38088 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38089 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38090 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38091 +0x544F0D0A, 0x46205355, 0x00003A57, 0x20636544,
38092 +0x32203231, 0x20373030, 0x333A3132, 0x34323A36,
38093 +0x00000000, 0x00000D0A, 0x00000043, 0x42707372,
38094 +0x3D206675, 0x554E203D, 0x202C4C4C, 0x6E49677A,
38095 +0x4E497274, 0x6D754E51, 0x0000003D, 0x61766E49,
38096 +0x2064696C, 0x72657375, 0x20726F20, 0x2079656B,
38097 +0x00214449, 0x52504545, 0x57204D4F, 0x65746972,
38098 +0x6461202C, 0x003D7264, 0x6C617620, 0x0000003D,
38099 +0x00000A0D, 0x6E6B6E55, 0x206E776F, 0x6D6D6F63,
38100 +0x3D646E61, 0x00000000, 0x000A0D52, 0x203A3051,
38101 +0x00000020, 0x203A3151, 0x00000020, 0x203A3251,
38102 +0x00000020, 0x203A3351, 0x00000020, 0x203A3451,
38103 +0x00000020, 0x61437748, 0x7262696C, 0x6F697461,
38104 +0x6620206E, 0x0A6C6961, 0x0000000D, 0x73696F4E,
38105 +0x61432065, 0x7262696C, 0x6F697461, 0x6166206E,
38106 +0x21216C69, 0x00000D0A, 0x00000072, 0x00205220,
38107 +0x00000D0A, 0x62735576, 0x7473725F, 0x00000A0D,
38108 +0x62735576, 0x7375735F, 0x646E6570, 0x00000A0D,
38109 +0x62735576, 0x7365725F, 0x000A0D6D, 0x00000042,
38110 +0x72746E49, 0x6D652051, 0x2C797470, 0x49677A20,
38111 +0x4972746E, 0x754E514E, 0x00003D6D, 0x654C7245,
38112 +0x0000006E, 0x00000049, 0x20746F4E, 0x756F6E65,
38113 +0x49206867, 0x4220514E, 0x0A0D6675, 0x00000000,
38114 +0x000000FF, 0x00020001, 0x00FF00FF, 0x00FF00FF,
38115 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
38116 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
38117 +0x010E010D, 0x00020003, 0x01090108, 0x0002010A,
38118 +0x02000003, 0x02020201, 0x02040203, 0x02060205,
38119 +0x02020200, 0x02040203, 0x020C0207, 0x020E020D,
38120 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
38121 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
38122 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
38123 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
38124 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
38125 +0x010E010D, 0x00FF010F, 0x01090108, 0x010B010A,
38126 +0x020000FF, 0x02020201, 0x02040203, 0x02060205,
38127 +0x02020200, 0x02040203, 0x020C020B, 0x020E020D,
38128 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
38129 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
38130 +0x00205220, 0x00000046, 0x00000059, 0x73204142,
38131 +0x003D7165, 0x49544120, 0x0000204D, 0x00000000,
38132 +0x00000000, 0x002E0209, 0x80000101, 0x000409FA,
38133 +0x00FF0400, 0x05070000, 0x02000201, 0x82050700,
38134 +0x00020002, 0x03830507, 0x07010040, 0x40020405,
38135 +0x02090000, 0x0101002E, 0x09FA8000, 0x04000004,
38136 +0x000000FF, 0x02010507, 0x07000040, 0x40028205,
38137 +0x05070000, 0x00400383, 0x04050701, 0x00004002,
38138 +0x00000000, 0x00000000, 0x07090000, 0x00000000,
38139 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38140 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
38141 +0x00000000, 0x00000000, 0x00000000, };
38142 +
38143 +const u32_t zcDKFwImageSize=12988;
38144 --- /dev/null
38145 +++ b/drivers/staging/otus/hal/hpfw2.c
38146 @@ -0,0 +1,1018 @@
38147 +/*
38148 + * Copyright (c) 2007-2008 Atheros Communications Inc.
38149 + *
38150 + * Permission to use, copy, modify, and/or distribute this software for any
38151 + * purpose with or without fee is hereby granted, provided that the above
38152 + * copyright notice and this permission notice appear in all copies.
38153 + *
38154 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
38155 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
38156 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
38157 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
38158 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
38159 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
38160 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
38161 + */
38162 +#include "../80211core/cprecomp.h"
38163 +
38164 +const u32_t zcP2FwImage[] = {
38165 +0x0009000B, 0x4F222FE6, 0xDE947FFC, 0xE114D594,
38166 +0x1E13D494, 0x67521E4C, 0xD494D693, 0x37402769,
38167 +0x62528F06, 0x7201D692, 0x60602522, 0x2600C93F,
38168 +0xD7906152, 0x2512611D, 0x264B6652, 0x2562470B,
38169 +0x0009B00D, 0xE60095AC, 0xC84060E2, 0x2F028F03,
38170 +0x8FF93652, 0x7F047601, 0xA05A4F26, 0x4F226EF6,
38171 +0x410BD185, 0xD4850009, 0x0009440B, 0x450BD584,
38172 +0xD7840009, 0xD284E1FF, 0x2712611D, 0xD4835029,
38173 +0xE1FFCB01, 0x1209E501, 0x12112212, 0xE7202452,
38174 +0x4718D57F, 0x2572D27F, 0xD17FE700, 0xD680D47F,
38175 +0xE2012270, 0x24702172, 0xD67E2620, 0x2641E4FF,
38176 +0xD57DE600, 0x666DE104, 0x76016063, 0x4000626D,
38177 +0x8FF83212, 0xD5790545, 0x2520E201, 0xD279D778,
38178 +0x2710E100, 0xE5802212, 0x655C6613, 0x666DD476,
38179 +0x76046763, 0x374C626D, 0x8FF83253, 0xD4732712,
38180 +0xD573E101, 0xD6732410, 0x2542E400, 0xE03AE501,
38181 +0xD272D771, 0xE0390654, 0x27110654, 0x000B4F26,
38182 +0x7FC82211, 0xD76FD16E, 0xDC70DB6F, 0xD271DE70,
38183 +0xD572D471, 0x1F12D672, 0x1F76710C, 0x1FB877FC,
38184 +0x1FEA1FC9, 0x72041F2B, 0xDE6FDC6E, 0x1F13EB10,
38185 +0x1F511F44, 0x1F771F65, 0xD86C1F2C, 0xDD6DD96C,
38186 +0xD26DEA00, 0x89003A22, 0xD1587A01, 0x88016010,
38187 +0x56F98B03, 0x4218E201, 0xD1682622, 0x0009410B,
38188 +0x440BD467, 0xD5670009, 0x0009450B, 0x6010D14C,
38189 +0x8B108801, 0xE650D14B, 0x46186212, 0x8B083266,
38190 +0x56FAD147, 0x2120E200, 0xCB016062, 0x2602A003,
38191 +0x72012710, 0x60822122, 0x89098801, 0xE2C8D15A,
38192 +0x622C6612, 0x89033626, 0x6010D158, 0x8BC88801,
38193 +0x51F76792, 0x217252F6, 0xD6555191, 0x55FB2212,
38194 +0x52FC6462, 0x55612542, 0x2252E400, 0x61436643,
38195 +0x05DE6013, 0x36CC4608, 0x02DE2652, 0xC9036021,
38196 +0x8B028801, 0x720162E2, 0x74012E22, 0x36B3664C,
38197 +0x71048FEE, 0x66C2D147, 0x45286512, 0x265B4518,
38198 +0x60822C62, 0x89018801, 0x0009A168, 0x6272D742,
38199 +0x8B132228, 0xD726D541, 0x6552D441, 0x51436672,
38200 +0x316C365C, 0x27622668, 0x14138D05, 0x6262D63D,
38201 +0xB1A57201, 0xD61E2622, 0x2622E200, 0x52916692,
38202 +0x8B013620, 0x0009A144, 0x6061A06E, 0x001C001C,
38203 +0x001D4020, 0x0000B38E, 0xFFFF0000, 0x12340000,
38204 +0x001E1015, 0x00201278, 0x002018A0, 0x00201922,
38205 +0x0020128C, 0x001C3510, 0x001C3624, 0x001E212C,
38206 +0x0020397C, 0x00203514, 0x00203984, 0x00203990,
38207 +0x0020399C, 0x002039F8, 0x002039FC, 0x002039A4,
38208 +0x002039A5, 0x002039A8, 0x00117700, 0x00203A12,
38209 +0x00203578, 0x001142D8, 0x00203A14, 0x00203A16,
38210 +0x001C3D30, 0x00117718, 0x001C3D00, 0x001C1000,
38211 +0x001C36F8, 0x00117734, 0x001C3684, 0x00117710,
38212 +0x001C3520, 0x00117600, 0x00117740, 0x001C1028,
38213 +0x0020358C, 0x002039AC, 0x7FFFFFFF, 0x00201734,
38214 +0x002032BE, 0x002022E8, 0x00203DC0, 0x002039FA,
38215 +0x00203584, 0x002039EC, 0x001C3D2C, 0x001C36B0,
38216 +0x0020351C, 0x0011775C, 0x8801C90F, 0xA0CF8901,
38217 +0xD17C0009, 0x36206212, 0xD47B8904, 0x2421E200,
38218 +0x2162A0CC, 0x6211D179, 0x89012228, 0x0009A0C3,
38219 +0xE202D775, 0x75016571, 0x3123615D, 0x27518D02,
38220 +0x0009A0BC, 0xD27255F2, 0x62226052, 0x40094019,
38221 +0xC90F4009, 0x8F19880A, 0x52F31F2D, 0x40196022,
38222 +0x40094009, 0x8808C90F, 0xA0A78901, 0x60630009,
38223 +0x51F255F8, 0xE701CB01, 0x2502D263, 0xE1002172,
38224 +0x2211D564, 0x74016452, 0x2542A098, 0x8B3F8805,
38225 +0x602252F3, 0x40094019, 0xC90F4009, 0x8B168802,
38226 +0xE5FFD45D, 0x655D6742, 0x8B102758, 0x6272D75B,
38227 +0x8B0C3260, 0x55F257F8, 0x2762E101, 0xD5522512,
38228 +0xD757E400, 0x62722541, 0xA0777201, 0x52F32722,
38229 +0x40196022, 0x40094009, 0x8805C90F, 0x31B38B6E,
38230 +0xD5508B6C, 0x615257F4, 0x7101E240, 0x64722512,
38231 +0x1F4DD14D, 0x42182419, 0x8B033420, 0x6262D64B,
38232 +0x26227201, 0xE200D640, 0x2621B0AA, 0x0009A056,
38233 +0x3123E220, 0x88038B52, 0x52F38B1E, 0x40196022,
38234 +0x40094009, 0x8803C90F, 0xD7418B16, 0x647251F4,
38235 +0x7401D23D, 0x65122742, 0x1F5DE640, 0x46182529,
38236 +0x8B033560, 0x6262D63B, 0x26227201, 0xE200D62E,
38237 +0x2621B086, 0x0009A010, 0xD738D137, 0xD22A6412,
38238 +0xE5007401, 0x21423A76, 0x22518F06, 0xEA00D634,
38239 +0x72016262, 0x2622B074, 0x2FB2D532, 0x95406652,
38240 +0xD4305BF1, 0x36205241, 0x60618910, 0x8B01C803,
38241 +0x2B22E201, 0x8FF54510, 0x57F15664, 0x6272E1F0,
38242 +0x41284118, 0x2722221B, 0x6BF2A008, 0x6BF2A006,
38243 +0xE200D615, 0xD1152621, 0x2121E200, 0xE20256F5,
38244 +0x42186662, 0x26284228, 0x1F6D8D0C, 0xD61FD11E,
38245 +0x460B6511, 0x2008645D, 0x57F58904, 0x6272D11C,
38246 +0x27222219, 0xD11BE201, 0x66122822, 0x8B012668,
38247 +0x0009AE17, 0x450BD518, 0xD1180009, 0xAE10E600,
38248 +0x07D12160, 0x00203A0C, 0x00203A10, 0x00203A18,
38249 +0x001C3DC0, 0x0011772C, 0x001C3B88, 0x002039F4,
38250 +0x0011773C, 0x00117744, 0x0000F000, 0x00117764,
38251 +0x00117748, 0x00117768, 0x0011776C, 0x01FFFFFF,
38252 +0x0011774C, 0x00203584, 0x001142D8, 0x00114774,
38253 +0xFDFFFFFF, 0x00203DC0, 0x0020246C, 0x002039FA,
38254 +0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6,
38255 +0xD11F7FF4, 0x6212DE1F, 0x67E25411, 0xD41E1F41,
38256 +0x1F722F22, 0x6743D51D, 0x7794D21D, 0x5A425841,
38257 +0x6C726942, 0x6D225B16, 0xE6006052, 0x2502CB20,
38258 +0x7601E540, 0x3253626D, 0x62F28BFB, 0x212255F1,
38259 +0x55F21151, 0x2E52D613, 0x14A21481, 0xD4122492,
38260 +0x11B627C2, 0x674226D2, 0xD911DA10, 0x2A72E801,
38261 +0x1A8C490B, 0x4218E201, 0x7F0C1A2C, 0x6EF64F26,
38262 +0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, 0x000068F6,
38263 +0x001C3B9C, 0x001C3D98, 0x001C3700, 0x001C3500,
38264 +0x001C5960, 0x001C8960, 0x0020358C, 0x001C3D00,
38265 +0x00201610, 0x2F962F86, 0x2FC62FA6, 0x2FE62FD6,
38266 +0x4F124F22, 0x7F884F02, 0xE018DEB2, 0xD4B261E0,
38267 +0x61E30F14, 0x62107101, 0x440BE01C, 0x20080F24,
38268 +0x8F126D03, 0xD4AD1F08, 0x6740DDAD, 0x657CD4AD,
38269 +0x470BD7AD, 0xD2AD0009, 0x621C6120, 0x46086623,
38270 +0x36284608, 0x3D6C4608, 0xE01C1FD8, 0xE58004FC,
38271 +0x604C66E2, 0x3050655C, 0x2D628F17, 0x01FCE018,
38272 +0xDEA3E500, 0x641CA008, 0x6753655D, 0x607037EC,
38273 +0x31DC6153, 0x80147501, 0x3243625D, 0xD49D8BF4,
38274 +0xE200D59D, 0xA27F2421, 0x20082521, 0xE0188B13,
38275 +0xE50001FC, 0xA009DE96, 0x655D641C, 0x32EC6253,
38276 +0x62536722, 0x32DC6672, 0x75041261, 0x3243625D,
38277 +0xA2698BF3, 0x88012D10, 0xE0188B16, 0xE40001FC,
38278 +0x671C2D40, 0x624DDE8A, 0x8B013273, 0x0009A25C,
38279 +0x6DE3644D, 0x7D046243, 0x32EC6643, 0x652236DC,
38280 +0x74086162, 0x2512AFEF, 0x8B198804, 0x01FCE018,
38281 +0x2D70E700, 0x1FD56D1C, 0x627DDE7D, 0x8B0132D3,
38282 +0x0009A242, 0x6173677D, 0x31EC65E3, 0x75046412,
38283 +0x365C6673, 0x61426262, 0x21297708, 0x2412AFED,
38284 +0x8B198805, 0x01FCE018, 0x2D70E700, 0x1FD46D1C,
38285 +0x627DDE6F, 0x8B0132D3, 0x0009A226, 0x6173677D,
38286 +0x31EC65E3, 0x75046412, 0x365C6673, 0x61426262,
38287 +0x212B7708, 0x2412AFED, 0x8B598831, 0x61E6DE67,
38288 +0x61E31F19, 0x64E27104, 0x1F4A6216, 0x1F2B6416,
38289 +0x75E46513, 0x66536712, 0x1F4C7604, 0x64521F7D,
38290 +0xD75F6E66, 0x27E0D25F, 0xDE5F6062, 0xC9013245,
38291 +0x65622E00, 0x4609060A, 0x4609D15C, 0x46094509,
38292 +0x21501F4E, 0xB2B0646D, 0x620D1F6F, 0x8B012228,
38293 +0x0009A1EA, 0xD756DE55, 0x661C61E0, 0x6410D150,
38294 +0x470B654C, 0x7FFC54FF, 0x2FE25EFE, 0x51FE7FFC,
38295 +0x2F12E040, 0x55FBD14F, 0x57FD56FC, 0x04FE410B,
38296 +0xD24D7F08, 0xE11C640D, 0x1D412D10, 0xD44B6522,
38297 +0x67421D52, 0x1D73DE4A, 0xD24A65E2, 0x67221D54,
38298 +0x1D75D249, 0xD2496E22, 0x66221DE6, 0x1D67A1BC,
38299 +0x89018830, 0x0009A08E, 0xE340D538, 0x33FC6156,
38300 +0x23126456, 0x71046153, 0x67521341, 0x13726416,
38301 +0x7EE46E13, 0x65E66212, 0x66E3D731, 0x13246EE2,
38302 +0x760427E0, 0x6062D22F, 0x3255DE2F, 0x2E00C901,
38303 +0x060A6E62, 0xD12D4609, 0x4E094609, 0x13434609,
38304 +0x646D21E0, 0xB2501F5E, 0x620D1F6F, 0x8B012228,
38305 +0x0009A18A, 0xDE25D522, 0x61E06450, 0xD724654C,
38306 +0x470B54FF, 0x7FFC661C, 0x06FEE054, 0x7FFC2F62,
38307 +0xEE4001FE, 0x2F123EFC, 0x55E2D125, 0x57E456E3,
38308 +0x64E2410B, 0xD21C7F08, 0xE11C640D, 0x1D412D10,
38309 +0xD61A6522, 0x67621D52, 0x1D73DE19, 0xD2196EE2,
38310 +0x62221DE4, 0xD2181D25, 0x1D266222, 0x6222D217,
38311 +0x1D27A15A, 0x00117800, 0x00202A18, 0x00203996,
38312 +0x002035BC, 0x00203A7C, 0x002018D0, 0x00203995,
38313 +0x00117804, 0x00203A14, 0x00203A16, 0x00117810,
38314 +0x00203991, 0x10624DD3, 0x00203992, 0x00203993,
38315 +0x00114AA4, 0x00200F68, 0x001C5864, 0x001C6864,
38316 +0x001C7864, 0x001C59BC, 0x001C69BC, 0x001C79BC,
38317 +0x00200FC0, 0x8B048833, 0x470BD7A2, 0xA123EE00,
38318 +0x88282DE0, 0xA0D38901, 0xDE9F0009, 0x62E1E143,
38319 +0x3216E054, 0x0FE68F02, 0x2E21E240, 0x622D62E1,
38320 +0x8B013217, 0x0009A0BC, 0xE50185E1, 0x8B013056,
38321 +0x0009A0B6, 0x2D10E101, 0x64E1B111, 0x06FEE054,
38322 +0x6261E143, 0x3517652D, 0xE6408945, 0x8B0C3563,
38323 +0xE058E41A, 0xE5000F45, 0x72C0E05C, 0x60230F55,
38324 +0x6703C907, 0xA014E060, 0x66530F75, 0x46214621,
38325 +0x46214621, 0x45214621, 0xE0587618, 0x0F654521,
38326 +0xE0034521, 0xE05C2509, 0xE0070F55, 0xE0602209,
38327 +0xE8540F25, 0x858238FC, 0x640D65F3, 0x1844B170,
38328 +0xDD7A8584, 0x85866C0D, 0x610D4C08, 0x410860C3,
38329 +0xE00F0EFE, 0x18154D0B, 0x2E296207, 0x668260C3,
38330 +0x85620FE6, 0x4D0B5185, 0x2E0B600D, 0x548460C3,
38331 +0xB13C0FE6, 0xE05465F3, 0xE5400EFE, 0xE06C62E1,
38332 +0x3653662D, 0x0F668D41, 0xC9036023, 0x40004008,
38333 +0x61036403, 0xD965E070, 0x0F46E5FF, 0xE074655C,
38334 +0x60530F96, 0x6263490B, 0x42214221, 0x42214221,
38335 +0x42006723, 0x4200327C, 0x6C074621, 0x4621E054,
38336 +0x606309FE, 0x4008C903, 0x790630FC, 0x6A036D2D,
38337 +0x65F3E800, 0x64D3B124, 0xE0706EA2, 0x2AE22EC9,
38338 +0x01FE6694, 0x666CE074, 0x470B07FE, 0x2E0B6063,
38339 +0x65F32AE2, 0xB0FA64D3, 0x628D7801, 0x32E3EE06,
38340 +0x7D018FE7, 0x0EFEE054, 0xE05462E1, 0x420006FE,
38341 +0x760C8561, 0x701B302C, 0xE4006103, 0xE70465F3,
38342 +0x68667401, 0x3973694D, 0x8FF92582, 0x65F37504,
38343 +0x641DB0DD, 0x0EFEE054, 0x64E1B09C, 0x0009A054,
38344 +0xD43B56F8, 0xEA01D23B, 0x26A0420B, 0x0009A04C,
38345 +0x06FCE01C, 0x8829606C, 0x5CF88B08, 0xE200D636,
38346 +0x52612C20, 0x642DB04B, 0x0009A03E, 0x666CE681,
38347 +0x8B043060, 0x420BD231, 0xA03554F8, 0xE6820009,
38348 +0x3060666C, 0xD22E8B04, 0x54F8420B, 0x0009A02C,
38349 +0x666CE683, 0x8B0A3060, 0xDA2755F8, 0x2590E900,
38350 +0xD82855A1, 0x2852D628, 0xA01D52A2, 0xE6922620,
38351 +0x3060666C, 0xD2208B08, 0x5C21D824, 0x6CCC52F8,
38352 +0x28C1E600, 0x2260A010, 0x666CE693, 0x8B063060,
38353 +0xD61F59F8, 0xE201EA00, 0xA00529A0, 0xD6162621,
38354 +0xD21DD41C, 0x6562420B, 0x4F067F78, 0x4F264F16,
38355 +0x6DF66EF6, 0x6AF66CF6, 0x000B69F6, 0x4F2268F6,
38356 +0xE240614D, 0x89323123, 0x3127E21F, 0x8B27D713,
38357 +0xD406614D, 0xE00171E0, 0x5671440B, 0x26596507,
38358 +0x1761A025, 0x00200FBC, 0x00117804, 0x00203470,
38359 +0x00203A9C, 0x002018C0, 0x00117800, 0x00115F00,
38360 +0x00116058, 0x0020397C, 0x00203990, 0x00203A1A,
38361 +0x00203A16, 0x00203AB4, 0x002018D0, 0x001C3704,
38362 +0xE001D490, 0x6672440B, 0x26596507, 0x4F262762,
38363 +0x0009000B, 0x614D4F22, 0x3123E240, 0xE21F8912,
38364 +0xD7893127, 0x614D8B08, 0x5671D286, 0x420B71E0,
38365 +0x260BE001, 0x1761A006, 0x6672D282, 0xE001420B,
38366 +0x2762260B, 0x000B4F26, 0xE6400009, 0x46284618,
38367 +0x6252D57E, 0x89FC2268, 0x0009000B, 0x4618E680,
38368 +0xD57A4628, 0x22686252, 0x000B89FC, 0xA0010009,
38369 +0x7201E200, 0x8BFC3242, 0x0009000B, 0x4618E680,
38370 +0xD5734628, 0x22686252, 0x000B8BFC, 0x2FE60009,
38371 +0x7FFC4F22, 0xBFF16E53, 0x61E22F42, 0xE280D66D,
38372 +0x54E11615, 0x16464218, 0x422855E2, 0x57E31657,
38373 +0x16786EF2, 0x26E22E2B, 0x4F267F04, 0x6EF6AFCE,
38374 +0x2FD62FC6, 0x4F222FE6, 0x6C53DD62, 0x6E43BFD6,
38375 +0x2DE2BFBB, 0x0009BFD2, 0x2C1251D5, 0x1C4154D6,
38376 +0x1C5255D7, 0x1C6356D8, 0x6EF64F26, 0x000B6DF6,
38377 +0x61636CF6, 0xA004E600, 0x62564109, 0x24227601,
38378 +0x36127404, 0x000B8BF9, 0xD6530009, 0x8562E500,
38379 +0xA00B674D, 0x655D610D, 0x40006053, 0x305CD44F,
38380 +0x024D4008, 0x3270622D, 0x75018905, 0x3213625D,
38381 +0x000B8BF1, 0x000BE000, 0x2FE6E001, 0x54416743,
38382 +0x4E08EE7F, 0x4E28D246, 0x25E96543, 0x60436E21,
38383 +0x9E7562ED, 0x4529C903, 0xE60032E3, 0x8D456103,
38384 +0x21184509, 0xD23F8B05, 0x002C6053, 0xA08AC93F,
38385 +0x60136603, 0x8B268801, 0x880C6053, 0xD53A8B04,
38386 +0xC93F8453, 0x6603A07F, 0x8B048808, 0x84E2DE36,
38387 +0xA078C93F, 0x880D6603, 0x8B03D633, 0xC93F8461,
38388 +0x6603A071, 0x88096260, 0x622C8F09, 0xE014DE2C,
38389 +0x655C05EC, 0x60233258, 0xA064C93F, 0x60236603,
38390 +0xA060C93F, 0x88026603, 0xE0078B5D, 0x60432509,
38391 +0x8905C810, 0x6053D225, 0xC93F002C, 0x6603A053,
38392 +0x6053DE23, 0xC93F00EC, 0x6603A04D, 0x88016013,
38393 +0x60538B19, 0x8B04880C, 0x8423D21E, 0xA042C93F,
38394 +0x88086603, 0xD51B8B04, 0xC93F8452, 0x6603A03B,
38395 +0xD618880D, 0x84618B03, 0xA034C93F, 0x60606603,
38396 +0xA030C93F, 0x88026603, 0xE0078B2D, 0x60432509,
38397 +0x8923C810, 0x6053DE10, 0xC93F00EC, 0x6603A023,
38398 +0x00000BB8, 0x00203470, 0x001C3704, 0x001C373C,
38399 +0x001C3700, 0x001C370C, 0x00114000, 0x00114008,
38400 +0x001142D8, 0x001142E4, 0x001142E8, 0x001142F5,
38401 +0x001142ED, 0x001142FD, 0x00114309, 0x6053D209,
38402 +0xC93F002C, 0x60136603, 0x8B038802, 0xC8106043,
38403 +0x76028900, 0xC93F6063, 0x40004018, 0x1741240B,
38404 +0x6EF6000B, 0x00114301, 0x0009A16E, 0x2FE62FD6,
38405 +0xDD944F22, 0xA0049EB2, 0xD4930009, 0x420BD293,
38406 +0x62D265D2, 0x8BF822E8, 0x0009A004, 0xD28FD490,
38407 +0x55D1420B, 0x22E852D1, 0xA0048BF8, 0xD48D0009,
38408 +0x420BD28A, 0x52D255D2, 0x8BF822E8, 0x0009A004,
38409 +0xD286D489, 0x55D3420B, 0x22E852D3, 0xA0048BF8,
38410 +0xD4860009, 0x420BD281, 0x52D455D4, 0x8BF822E8,
38411 +0x6EF64F26, 0x6DF6000B, 0x2FD62FC6, 0x4F222FE6,
38412 +0x6E636C73, 0x6D53B01A, 0x64D357F4, 0xB05F65E3,
38413 +0xB07566C3, 0xB0A40009, 0xB0A80009, 0xB0AC0009,
38414 +0xB0AC0009, 0xB0AF0009, 0xB03154F5, 0x6CCD6C03,
38415 +0x4F2660C3, 0x6DF66EF6, 0x6CF6000B, 0x3412D170,
38416 +0xD6700529, 0x2650D770, 0x2742000B, 0x0009A018,
38417 +0x2FD62FC6, 0x4F222FE6, 0x6E636C73, 0x6D53BFEE,
38418 +0x64D357F4, 0xB03365E3, 0xB08D66C3, 0xB00F54F5,
38419 +0x6CCD6C03, 0x4F2660C3, 0x6DF66EF6, 0x6CF6000B,
38420 +0xE503D162, 0xD763D462, 0x21524518, 0x2472000B,
38421 +0xD45FD15E, 0x2162E600, 0x2462000B, 0xBF734F22,
38422 +0xBF73E40A, 0xD25C0009, 0x4118E104, 0xE40AE500,
38423 +0xBF692212, 0xD7592252, 0xCB206072, 0x000B4F26,
38424 +0x4F222702, 0x410BD156, 0xD556E400, 0x4F26452B,
38425 +0xD1552FE6, 0x66126E63, 0x92104418, 0x44084528,
38426 +0x45002629, 0x265B4408, 0x264B4400, 0x21624708,
38427 +0xD14E4708, 0x217227EB, 0x6EF6000B, 0x1FFF03F0,
38428 +0x4F222FE6, 0xE101DE4A, 0xBF3DE40A, 0x67E32E12,
38429 +0xE500776C, 0xE204E130, 0x2752E40A, 0x27522752,
38430 +0x27522752, 0x27522752, 0x27522752, 0x27522752,
38431 +0x27522752, 0x27522752, 0x27522752, 0x27522752,
38432 +0x27222712, 0x27522752, 0x27522752, 0x27522752,
38433 +0x27522752, 0x175ABF18, 0x2E62E600, 0x000B4F26,
38434 +0xD2346EF6, 0xE441E101, 0x000B2212, 0xD1322242,
38435 +0xE605D432, 0x000B2162, 0x000B2462, 0xD2300009,
38436 +0xE40AE601, 0x2262AF00, 0x2FC62FB6, 0x2FE62FD6,
38437 +0x7FFC4F22, 0x6C43DB2B, 0xED0060B2, 0x2B02CB03,
38438 +0xC90360B2, 0x6E03A008, 0x89073DC2, 0xE46460B2,
38439 +0xB07CC903, 0x7D016E03, 0x8BF52EE8, 0x8F043DC2,
38440 +0xD4212FE1, 0x460BD621, 0x62F10009, 0x6023622D,
38441 +0x89FFC801, 0x7F046023, 0x6EF64F26, 0x6CF66DF6,
38442 +0x6BF6000B, 0x001C3B88, 0x00203AC8, 0x002018D0,
38443 +0x00203AD0, 0x00203AD8, 0x00203AE0, 0x00203AE8,
38444 +0x0025E720, 0x00203DBC, 0x00203980, 0x001C5968,
38445 +0x001C3B40, 0x000F8000, 0x001D4004, 0x001C3500,
38446 +0x002015E4, 0x00201610, 0x001C5814, 0x001C59D0,
38447 +0x001C5830, 0x001C6268, 0x001C59A4, 0x001C639C,
38448 +0x001C581C, 0x001C5860, 0x00203AF0, 0x002018C0,
38449 +0x8F014411, 0x6043604B, 0x0009000B, 0x5651D52B,
38450 +0x46286052, 0x306C000B, 0x2FC62FB6, 0x2FE62FD6,
38451 +0x4F124F22, 0xBFF14F02, 0x6B036E43, 0xDD25DC24,
38452 +0x0009BFEC, 0x3C0530B8, 0x4609060A, 0x46014609,
38453 +0x020A3D65, 0x42094209, 0x32E24209, 0x4F068BF0,
38454 +0x4F264F16, 0x6DF66EF6, 0x000B6CF6, 0x2FC66BF6,
38455 +0x2FE62FD6, 0x4F124F22, 0xBFCF4F02, 0x6C036E43,
38456 +0xBFCBDD13, 0x30C80009, 0x060A3D05, 0x46094609,
38457 +0x36E24601, 0x4F068BF5, 0x4F264F16, 0x6DF66EF6,
38458 +0x6CF6000B, 0x4F222FE6, 0xE102DE0B, 0xE403E500,
38459 +0xBFB92E12, 0xE6062E52, 0xE7004618, 0x2E62E403,
38460 +0x4F262E72, 0x6EF6AFB0, 0x0009000B, 0x001C1040,
38461 +0xCCCCCCCD, 0x10624DD3, 0x001D4004, 0x2F962F86,
38462 +0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6, 0xE5007F98,
38463 +0x6453E710, 0x6B534728, 0xEE1ADCBC, 0x6153655D,
38464 +0x315C4108, 0x75014108, 0x6043317C, 0x0F16665D,
38465 +0xED0060B3, 0x21B136E3, 0x81128111, 0x11D28113,
38466 +0x11D411D3, 0x74048FEA, 0xD8B167F2, 0x1871D9B1,
38467 +0x58F12872, 0x1981D1B0, 0x59F22982, 0x5DF45AF3,
38468 +0x54F65EF5, 0x21921191, 0x11A211A3, 0x11D411D5,
38469 +0x11E611E7, 0x11481149, 0xDAA855F7, 0x57F8EE00,
38470 +0x52F9DDA7, 0x64E3D6A7, 0x2A521A51, 0xD8A7D9A6,
38471 +0x2D72EAEF, 0x6AAC2622, 0x6DE36EED, 0x61E34D08,
38472 +0x41083DEC, 0x31EC4D08, 0x60B33D9C, 0x2DB14108,
38473 +0xE05081D1, 0xE79F4108, 0x41084008, 0x81D2677C,
38474 +0x318C60B3, 0x3472E200, 0x1DD281D3, 0xD4931D13,
38475 +0x1D248D01, 0x65D3D48F, 0x7E01B0B2, 0x34A264ED,
38476 +0xDA8C8BDA, 0x68A22FD2, 0x4829DD91, 0x64A22D82,
38477 +0x694D7DFC, 0x2D92D286, 0x4E296E22, 0x2DE27D0C,
38478 +0x6AD36822, 0xD784618D, 0x6D722A16, 0xD583D489,
38479 +0x5E7224D2, 0x14E2D688, 0xEE005174, 0x58761414,
38480 +0x1486D186, 0xE7105978, 0x62521498, 0x142A65E3,
38481 +0x64E326E2, 0x644DE600, 0x48086843, 0x4808384C,
38482 +0x6053381C, 0x28B10C86, 0x60B309CE, 0x60538191,
38483 +0x60430ACE, 0x605381A2, 0x60B30DCE, 0x605381D3,
38484 +0x740108CE, 0x09CE1882, 0x19E3624D, 0x32730ACE,
38485 +0x8FE01A64, 0xD96A7504, 0x6C92E003, 0x2CB14018,
38486 +0xDA6F6D92, 0xE05081D1, 0x40086E92, 0x619281E2,
38487 +0x811360B3, 0xE6006492, 0x67921442, 0x17A3D468,
38488 +0xE1FF6892, 0xE7031864, 0x46086563, 0x7501364C,
38489 +0x665D2612, 0x8BF83673, 0xE003DC5A, 0x40186DC2,
38490 +0x6EC22DB1, 0x81E1D25F, 0xEE0061C2, 0x64C21112,
38491 +0x1423E024, 0xD45B65C2, 0x67C215E4, 0x8172E580,
38492 +0x66E368C2, 0x655C8183, 0x6963666D, 0x6A6D7604,
38493 +0x3A53394C, 0x29E28FF8, 0xDC54DB53, 0x740424B2,
38494 +0x7F6824C2, 0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6,
38495 +0x000B69F6, 0x614268F6, 0xC8036011, 0xE5008F03,
38496 +0x3420D23C, 0x60118B06, 0x8802C903, 0xD2398B06,
38497 +0x8B033420, 0x65135612, 0x24225264, 0x6053000B,
38498 +0x2FE62FD6, 0x7FEC4F22, 0x62536E53, 0x6D43E550,
38499 +0x4508E400, 0xE101A001, 0x60435224, 0x81212211,
38500 +0x60538123, 0x56E28122, 0x8BF53620, 0x16E4D238,
38501 +0xE61464F3, 0x65E3420B, 0xE4FC65E1, 0x2E512549,
38502 +0x65F361F1, 0x2F112149, 0xD13154D1, 0xE614410B,
38503 +0x607157D1, 0x2701CB01, 0x7F141DE1, 0x6EF64F26,
38504 +0x6DF6000B, 0x2FE62FD6, 0x7FEC4F22, 0x66536E53,
38505 +0x6D43E5FC, 0x20596061, 0x2601CB01, 0x326052E2,
38506 +0x12E48B06, 0x31E051E2, 0x52D18B04, 0x1E22A002,
38507 +0x5664AFF0, 0x64F3D21E, 0x420BE614, 0x67E165E3,
38508 +0x2719E1FC, 0x67F12E71, 0x271954D1, 0x65F3D118,
38509 +0x410BE614, 0x52D12F71, 0xCB016021, 0x1DE12201,
38510 +0x4F267F14, 0x000B6EF6, 0x00006DF6, 0x002039AC,
38511 +0x0020357C, 0x00203584, 0x0020358C, 0x002035B4,
38512 +0x00203998, 0x002039A0, 0x00100208, 0x001014C0,
38513 +0x001E210C, 0x001C3D00, 0x002039EC, 0x001000C8,
38514 +0x00117880, 0x00117780, 0x00040020, 0x0026C401,
38515 +0x00200D42, 0x4F222FE6, 0xDE42624C, 0x42004208,
38516 +0x3E2CA005, 0xD4405252, 0xBF695624, 0x65E22E62,
38517 +0x352052E1, 0xD63D8BF6, 0x4F262622, 0x6EF6000B,
38518 +0x2FC62FB6, 0x2FE62FD6, 0xDC394F22, 0x52C1DB39,
38519 +0x362066C2, 0x6061891C, 0x8801C903, 0xDE348918,
38520 +0xBF38DD35, 0x650364E3, 0x66B28503, 0x3262620D,
38521 +0xD4328907, 0x0009BF76, 0x4D0BD431, 0xAFE60009,
38522 +0xBF3D0009, 0xD42F64E3, 0x00094D0B, 0x0009AFDF,
38523 +0x2262D22D, 0x6EF64F26, 0x6CF66DF6, 0x6BF6000B,
38524 +0x2FD62FC6, 0x4F222FE6, 0xDD29DC28, 0x6E4360C2,
38525 +0x04DE4008, 0xE614D127, 0x65E3410B, 0xD127D726,
38526 +0x55E227E2, 0x35E05254, 0x21228F04, 0x400860C2,
38527 +0x122202DE, 0x605365C2, 0x75014008, 0x0DE606DE,
38528 +0xC90F6053, 0x60632C02, 0x6EF64F26, 0x000B6DF6,
38529 +0x85436CF6, 0x650D5643, 0x622D6262, 0x35277204,
38530 +0xE1008F0C, 0x2268960C, 0xD6158B03, 0x72015261,
38531 +0xD6131621, 0x6262E101, 0x26227201, 0x6013000B,
38532 +0x000001FF, 0x0020358C, 0x00203584, 0x001C3D00,
38533 +0x002035B4, 0x0020397C, 0x002018C0, 0x0020357C,
38534 +0x00203B18, 0x00203B1C, 0x001C3D28, 0x002039EC,
38535 +0x002039AC, 0x00200D42, 0x002039F0, 0x002039F4,
38536 +0x00117754, 0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6,
38537 +0x7FF84F22, 0x6C22D241, 0xC80360C3, 0xDE40896E,
38538 +0xDA41DB40, 0x52B1D941, 0x362066B2, 0x60618945,
38539 +0x8801C903, 0xDD3B8941, 0x420BD23D, 0x650364D3,
38540 +0x60A12F02, 0x89328801, 0x85145153, 0x8840600C,
38541 +0x1F118F0C, 0xD5376191, 0x641D450B, 0x8B262008,
38542 +0xD7356691, 0x646D470B, 0x8B202008, 0x420BD233,
38543 +0x51F154F1, 0xC8208511, 0xD1318904, 0x021EE050,
38544 +0x01267201, 0x420BD22F, 0x200864F2, 0x64D38907,
38545 +0x4D0BDD2D, 0xD12D65F2, 0xAFC4E601, 0xD22C2162,
38546 +0x420B65F2, 0xD72B64E3, 0xAFBCE601, 0xD2262762,
38547 +0x420B65F2, 0xAFB664D3, 0xDE270009, 0xDA28DD27,
38548 +0x52D1DB28, 0x362066D2, 0x60618918, 0x8801C903,
38549 +0xD4228914, 0x450BD516, 0x56030009, 0x8F0436E0,
38550 +0xE2016503, 0xAFEC2A20, 0xD41F2B52, 0x420BD216,
38551 +0xD7180009, 0x4118E101, 0x2712AFE3, 0xC80460C3,
38552 +0xD21A8902, 0x0009420B, 0x4F267F08, 0x6DF66EF6,
38553 +0x6BF66CF6, 0x000B6AF6, 0x000069F6, 0x001E2100,
38554 +0x0020358C, 0x00203584, 0x00203A14, 0x001142D8,
38555 +0x002014A6, 0x00115EA2, 0x00114774, 0x00200D8A,
38556 +0x0020351C, 0x002016C2, 0x002014D0, 0x001E212C,
38557 +0x00201534, 0x001C3D30, 0x00117880, 0x0020357C,
38558 +0x0020399C, 0x00203998, 0x002035B4, 0x00200644,
38559 +0xE601D203, 0x1265D503, 0x000B2252, 0x00001266,
38560 +0x001C1010, 0x0000C34F, 0x0009000B, 0x0009000B,
38561 +0x0009000B, 0x0009000B, 0xE000000B, 0xE000000B,
38562 +0x0009000B, 0xE4FDD59D, 0xD69D6152, 0x25122149,
38563 +0x74016052, 0x2502CB01, 0xD19A6752, 0x25722749,
38564 +0xC8406010, 0x60628902, 0x2602CB04, 0xE1F76462,
38565 +0x26422419, 0xE7016062, 0x2602C9CF, 0xE5026062,
38566 +0x2602CB10, 0x47186062, 0x2602CB03, 0x000B1652,
38567 +0xD58D1673, 0xD28ED78D, 0xE100D48E, 0x2511E600,
38568 +0x22102711, 0x2461AFCE, 0xD28B664C, 0x362C4600,
38569 +0xCB106060, 0x2600000B, 0xD287654C, 0x352C4500,
38570 +0xE1EF6650, 0x000B2619, 0x664C2560, 0x4600D283,
38571 +0x6060362C, 0x000BCB10, 0x654C2600, 0x4500D27F,
38572 +0x6650352C, 0x2619E1EF, 0x2560000B, 0xD27A664C,
38573 +0x362C4600, 0xCB086060, 0x2600000B, 0xD276654C,
38574 +0x352C4500, 0xE1F76650, 0x000B2619, 0x664C2560,
38575 +0x4600D272, 0x6060362C, 0x000BCB08, 0x654C2600,
38576 +0x4500D26E, 0x6650352C, 0x2619E1F7, 0x2560000B,
38577 +0xD669624C, 0x326C4200, 0xC9086020, 0x40214021,
38578 +0x000B4021, 0x624C600C, 0x4200D664, 0x6020326C,
38579 +0x4021C908, 0x40214021, 0x600C000B, 0x644CD160,
38580 +0x6240341C, 0x602C000B, 0x644CD15E, 0x6240341C,
38581 +0x602C000B, 0x4F222FE6, 0x645C6E43, 0x3467E60A,
38582 +0xBFEB8914, 0x640C0009, 0x880160EC, 0xE00F8B02,
38583 +0x2409A002, 0x44094409, 0xE60A624C, 0x89053263,
38584 +0x644CBFE2, 0x6023620C, 0x8B00C880, 0x6023E200,
38585 +0x000B4F26, 0x4F226EF6, 0x6062D64B, 0x8B038801,
38586 +0x0009B256, 0x0009A003, 0xE640D248, 0xD6482260,
38587 +0x4F26E200, 0x2622000B, 0xD6434F22, 0x88026062,
38588 +0xB29F8B01, 0xD6420009, 0x4F26E200, 0x2622000B,
38589 +0xD43ED53D, 0xE701E100, 0x000B2512, 0xD23B2470,
38590 +0x000BE604, 0x4F222260, 0xD13BD43A, 0x0009410B,
38591 +0xE1FDD53A, 0xD23A6650, 0xE7002619, 0x4F262560,
38592 +0x2270000B, 0xD5374F22, 0x6152D237, 0x611DD737,
38593 +0x64522512, 0x242BE6FF, 0xD4352542, 0x666DD22E,
38594 +0x2762420B, 0xE1FBD52D, 0x27196750, 0x000B4F26,
38595 +0x4F222570, 0xD128D42F, 0x0009410B, 0xE7F7D527,
38596 +0x26796650, 0x000B4F26, 0xD5242560, 0x62509425,
38597 +0x000B2249, 0xD5212520, 0x6250E4BF, 0x000B2249,
38598 +0x4F222520, 0x8522D224, 0x2008600D, 0x88018911,
38599 +0x88038944, 0x88058946, 0x88068948, 0x8808894E,
38600 +0x88098954, 0x880A895A, 0x880B8960, 0xA06D8966,
38601 +0xB06F0009, 0xA06A0009, 0xFF7F600C, 0x001E2148,
38602 +0x001E1108, 0x001E1000, 0x00203A4C, 0x00203A4E,
38603 +0x00203A6D, 0x00203A30, 0x001E103F, 0x001E105F,
38604 +0x001E102F, 0x001E1090, 0x00203A54, 0x001E100B,
38605 +0x00203A50, 0x00203B20, 0x002018C0, 0x001E1028,
38606 +0x00203A6C, 0x001D4020, 0x98760000, 0x001C1000,
38607 +0x00203B2C, 0x00203B3C, 0x00203A24, 0x0009B04C,
38608 +0x600CA035, 0x0009B055, 0x600CA031, 0x6260D684,
38609 +0x8B2B2228, 0x0009B061, 0x600CA029, 0x6260D680,
38610 +0x8B232228, 0x0009B069, 0x600CA021, 0x6260D67C,
38611 +0x8B1B2228, 0x0009B0C7, 0x600CA019, 0x6260D678,
38612 +0x8B132228, 0x0009B0CD, 0x600CA011, 0x6260D674,
38613 +0x8B0B2228, 0x0009B125, 0x600CA009, 0x6260D670,
38614 +0x8B032228, 0x0009B13D, 0x600CA001, 0x4F26E000,
38615 +0x0009000B, 0xD26CD16B, 0xD56C8412, 0x4000C90F,
38616 +0xD76B012D, 0xE403D66B, 0xE20F611C, 0x2540E001,
38617 +0x25202712, 0x2602000B, 0xE601D262, 0x30668523,
38618 +0xE0008D05, 0xD663D260, 0xE0018122, 0x000B2602,
38619 +0xD25C0009, 0x600D8523, 0x89052008, 0x8B0A8801,
38620 +0x6060D65D, 0x2600CB01, 0xD457D65A, 0xE001E101,
38621 +0x000B2612, 0x000B8142, 0xD152E000, 0x8513E501,
38622 +0x640D4518, 0x66033453, 0xE0008D05, 0xD551D253,
38623 +0x2260E001, 0x000B2502, 0x4F220009, 0x8513D149,
38624 +0x6453650D, 0x62494419, 0x227D672E, 0x8801602C,
38625 +0x88028909, 0x88038910, 0x8806891A, 0x88078935,
38626 +0xA04C893B, 0xD5460009, 0x6652D746, 0x2762D446,
38627 +0x622C6261, 0x2421A038, 0x2228625C, 0xD4438B3F,
38628 +0x6642D540, 0x2562D440, 0x24018561, 0x6203A02C,
38629 +0x2008605C, 0x88108907, 0x88208908, 0x88308909,
38630 +0xA02C890A, 0xD23A0009, 0x6222A008, 0xA005D239,
38631 +0xD2396222, 0x6222A002, 0x6262D638, 0xD432D531,
38632 +0x66212522, 0xA00F626C, 0xD6352421, 0x6261D52D,
38633 +0x622CD42D, 0xA0072562, 0xD6322421, 0x8561D529,
38634 +0x2562D429, 0x62032401, 0x662D8515, 0x3617610D,
38635 +0x65038F01, 0xB0CB2451, 0xA0010009, 0xE000E001,
38636 +0x000B4F26, 0xD6190009, 0xD427E101, 0x65412610,
38637 +0xD118D717, 0xE20F655D, 0x2752E001, 0x000B2620,
38638 +0x2FE62102, 0xD20F4F22, 0x640C8523, 0x8B082448,
38639 +0xD511D61D, 0x2621E200, 0x940F8451, 0xA0482049,
38640 +0xDE0D8051, 0xC84060E0, 0xE2018D32, 0x89443427,
38641 +0xD216D615, 0x2641420B, 0x0009A030, 0x0000FF7F,
38642 +0x00203A6D, 0x00203A24, 0x00203A30, 0x001E1100,
38643 +0x001E100C, 0x00203A50, 0x001E1000, 0x001E1001,
38644 +0x00203A58, 0x00203A38, 0x00203A3C, 0x00203A40,
38645 +0x00203A5C, 0x00203A60, 0x00203A64, 0x00203A68,
38646 +0x00203E20, 0x00203E2A, 0x00203A4A, 0x002027F2,
38647 +0x89123427, 0xD294D693, 0x2641420B, 0xCB8084E1,
38648 +0x80E1B0F5, 0xD69160E0, 0x2E00CB04, 0xC93F6060,
38649 +0xD68F2600, 0xA001E001, 0xE0002602, 0x000B4F26,
38650 +0xD68C6EF6, 0xC8806060, 0xD2868919, 0x88016021,
38651 +0xD2898B15, 0x8524E501, 0x89103056, 0xE203D187,
38652 +0x2120D487, 0xE00B6541, 0x0656655D, 0xE40FD585,
38653 +0x2140E702, 0xD77E2571, 0x000BE001, 0x000B2702,
38654 +0x2FE6E000, 0xDE804F22, 0xC88084E1, 0xD57A892C,
38655 +0x20088554, 0x61038F28, 0x8553D77C, 0x64036672,
38656 +0x8566650C, 0x3520620C, 0xD6798B1E, 0x651CD774,
38657 +0x2651644C, 0x60E02741, 0x8904C840, 0x420BD275,
38658 +0xA0030009, 0xD2680009, 0x0009420B, 0x0009B09F,
38659 +0xE201D167, 0x60E02122, 0xCB04D464, 0x60402E00,
38660 +0x2400C93F, 0x6023A001, 0x4F26E000, 0x6EF6000B,
38661 +0x2FB62FA6, 0x2FD62FC6, 0xDA622FE6, 0x66A1E240,
38662 +0x3622DC5E, 0x62638900, 0x6ED36D2C, 0x4E2136D8,
38663 +0x4E212A61, 0xDB61D460, 0xE700A00F, 0x770162B2,
38664 +0x71026123, 0x66212B12, 0x71026213, 0x61212B12,
38665 +0x651D666D, 0x356C4528, 0x627C2452, 0x8BED32E3,
38666 +0xC90360D3, 0x8B108803, 0x617367B2, 0x2B127102,
38667 +0x71026E13, 0x2B126571, 0x655D6DE1, 0x422862DD,
38668 +0x325CE107, 0xA00C2C10, 0x88022422, 0xA0038B01,
38669 +0x8801E203, 0xE2018B05, 0x66B22C20, 0x655D6561,
38670 +0xE60F2452, 0x67A12C60, 0x8B052778, 0xDD38DC44,
38671 +0xEB01EA00, 0x2DB22CA2, 0x6DF66EF6, 0x6BF66CF6,
38672 +0x6AF6000B, 0x2FE62FD6, 0xE240DD36, 0x362266D1,
38673 +0x62638900, 0x3678672C, 0x7703DE38, 0x47212D61,
38674 +0x64E2D635, 0xA00E4721, 0x6562E100, 0x62537101,
38675 +0x74012450, 0x24204219, 0x45297401, 0x74012450,
38676 +0x24504519, 0x621C7401, 0x8BEE3273, 0x66E24200,
38677 +0x420061D1, 0x2118362C, 0x2E628F06, 0xDD1CD728,
38678 +0xE501E400, 0x2D522742, 0x000B6EF6, 0x2FD66DF6,
38679 +0x4F222FE6, 0xED0AEE01, 0x64E3BC86, 0xBC8B64E3,
38680 +0x62EC7E01, 0x8BF732D7, 0xBC8EEE01, 0x64E364E3,
38681 +0x7E01BC93, 0x32D762EC, 0x4F268BF7, 0x000B6EF6,
38682 +0xD1186DF6, 0xD418920D, 0x72122122, 0x2422D617,
38683 +0xD7177204, 0x72202622, 0x2722D116, 0x000B7230,
38684 +0x137A2122, 0x00203A4A, 0x002028FE, 0x001E1015,
38685 +0x00203A50, 0x001E1001, 0x00203A24, 0x001E1100,
38686 +0x00203A4E, 0x00203A3C, 0x001E1000, 0x00203A40,
38687 +0x00203A4C, 0x002027F2, 0x001E100C, 0x00203A38,
38688 +0x00203A54, 0x00203A58, 0x00203A5C, 0x00203A60,
38689 +0x00203A64, 0x00203A68, 0x4F222FE6, 0xD6707FFC,
38690 +0x88016060, 0xE2018951, 0x2620BFBB, 0xD56ED16D,
38691 +0xDE6E6010, 0x64E36552, 0x7402C840, 0x8D22D16C,
38692 +0xD26C7502, 0xE601D76C, 0xE7042722, 0x76016255,
38693 +0x626C2421, 0x8FF93273, 0xD4637402, 0x6242E601,
38694 +0x640D8528, 0x67494419, 0x275D657E, 0x81E4607C,
38695 +0xE417D562, 0x67557601, 0x3243626C, 0x8FF92171,
38696 +0xA0207102, 0xD25E0009, 0xE601D75B, 0xE7042722,
38697 +0x76016255, 0x626C2421, 0x8FF93273, 0xD4527402,
38698 +0x6242E601, 0x640D8528, 0x67494419, 0x275D657E,
38699 +0x81E4607C, 0xE417D553, 0x67557601, 0x3243626C,
38700 +0x8FF92171, 0x92897102, 0xD2462E21, 0x5E23D74E,
38701 +0x64F22FE2, 0x604365F2, 0x2700C980, 0xC9606043,
38702 +0x80716103, 0xC9036043, 0x80724519, 0x65F2605C,
38703 +0x817266F2, 0x46194629, 0x606C4529, 0x4018645C,
38704 +0x8173304C, 0x21185E23, 0x64F22FE2, 0x6E4C62F2,
38705 +0x602C4219, 0x66F262F2, 0x46294018, 0x461930EC,
38706 +0x42298174, 0x652C606C, 0x305C4018, 0x81758F07,
38707 +0x0009BC97, 0x2228620C, 0xA00A8908, 0x60130009,
38708 +0x8B038840, 0x0009B009, 0x0009A003, 0xE202D62F,
38709 +0x7F042622, 0x000B4F26, 0x4F226EF6, 0x8552D52A,
38710 +0x8830600D, 0x88318903, 0xA0348923, 0x85550009,
38711 +0xD428D727, 0x85532701, 0x610DD627, 0x24124118,
38712 +0x460BD426, 0xD7230009, 0xD226D425, 0x6572420B,
38713 +0xE230D120, 0x42286712, 0x2729E620, 0x37604628,
38714 +0xD6218B03, 0xA016E200, 0xD61F2622, 0xA012E202,
38715 +0xD1182622, 0x6212E530, 0xE6204528, 0x46282259,
38716 +0x89083260, 0xD41AD119, 0xE601D513, 0x2160450B,
38717 +0x472BD718, 0x4F264F26, 0x0009000B, 0x0000060A,
38718 +0x00203A6C, 0x001E1000, 0x00203A58, 0x00203E20,
38719 +0x00203E2C, 0x00203DC4, 0x00203A40, 0x00203DF4,
38720 +0x00203DF2, 0x00203DC6, 0x00203A24, 0x00203A50,
38721 +0x00203A3C, 0x00203A38, 0x002018C0, 0x00203B48,
38722 +0x00203B4C, 0x002018D0, 0x00203A54, 0x001E100B,
38723 +0x00203B60, 0x00114004, 0x4F222FE6, 0x84E9DE86,
38724 +0x2448640C, 0xB17B8901, 0xD2840009, 0x26686620,
38725 +0x60E08902, 0x2E00C9BF, 0x000B4F26, 0x000B6EF6,
38726 +0x2FE60009, 0xDE7E4F22, 0x60E0D67E, 0xCBC0D47E,
38727 +0x62602E00, 0xC803602C, 0x40218904, 0x70014021,
38728 +0x6603A002, 0x66034009, 0xD678616D, 0xE500A004,
38729 +0x75016262, 0x74042422, 0x3213625D, 0xD2748BF8,
38730 +0x0009420B, 0xC9BF84E2, 0x4F2680E2, 0x6EF6000B,
38731 +0x2FE62FD6, 0x7FFC4F22, 0x6260D66E, 0x89402228,
38732 +0xD565E100, 0x60502610, 0xCB40D46B, 0x2500440B,
38733 +0x8D052008, 0x62E06E03, 0x7104612C, 0x2F11A006,
38734 +0xD466D65E, 0xDD666760, 0x657C4D0B, 0xE23C6D1D,
38735 +0x8B033D27, 0xD264D463, 0x0009420B, 0x4D214D21,
38736 +0xA005D762, 0x66E6E400, 0x357C4508, 0x74012562,
38737 +0x35D3654D, 0xD75E8BF7, 0x6E72E003, 0x81E14018,
38738 +0x6E7260F1, 0x81E2700C, 0xD45A6172, 0xDD5A8113,
38739 +0x65724D0B, 0xD64AD259, 0x2212E101, 0xC93F6060,
38740 +0x7F042600, 0x6EF64F26, 0x6DF6000B, 0x2FC62FB6,
38741 +0x2FE62FD6, 0xD2524F22, 0x6B436E73, 0x420B6C53,
38742 +0x20086D63, 0x64038D1C, 0xE50ED13C, 0x32526210,
38743 +0x60C38916, 0x804124B0, 0x814160D3, 0xA007E500,
38744 +0x655D61BC, 0x00EC6053, 0x364C6653, 0x80647501,
38745 +0x3213625D, 0xD6308BF5, 0xC9BF6060, 0x2600A008,
38746 +0xD239D440, 0x6EF64F26, 0x6CF66DF6, 0x6BF6422B,
38747 +0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, 0x2F962F86,
38748 +0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6, 0xE1007FC4,
38749 +0x6513ECFF, 0x6B136CCD, 0xDE34D733, 0xEDFF64F3,
38750 +0xD833EA04, 0x6053655C, 0x027D4000, 0x32C0622D,
38751 +0x66038D0D, 0x09ED6063, 0x2491027D, 0x24217402,
38752 +0x698202ED, 0x3928622D, 0x74022892, 0x75017104,
38753 +0x6063625C, 0x07D532A2, 0x0EB58FE4, 0x2448641C,
38754 +0xE6808905, 0x67F3E5C5, 0xBF8F666C, 0x7F3C655C,
38755 +0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6, 0x000B69F6,
38756 +0xD11C68F6, 0x6012D21C, 0xCB20E405, 0x2102E500,
38757 +0x000B2242, 0x00002252, 0x001E1017, 0x00203996,
38758 +0x001E1015, 0x001E10BF, 0x00117800, 0x001E10FC,
38759 +0x00200644, 0x0020399C, 0x00202A56, 0x00203B64,
38760 +0x002018D0, 0x00203B80, 0x002018C0, 0x0011788C,
38761 +0x00203998, 0x0020357C, 0x00201534, 0x001E2130,
38762 +0x00202A18, 0x00203B88, 0x002039FC, 0x00203A04,
38763 +0x00203DC0, 0x001C3500, 0x001D4004, 0xD564D163,
38764 +0xE400D764, 0x2142E20F, 0x17411154, 0xD5622722,
38765 +0x9669D762, 0x15412572, 0x96661562, 0xE6011565,
38766 +0xD55F1165, 0x666CE6F8, 0x25422542, 0x25422542,
38767 +0x25422542, 0x25622542, 0x7601E727, 0x67632572,
38768 +0x25627797, 0xE7042572, 0x2572E248, 0xE2192522,
38769 +0xE2702522, 0x25422542, 0x25422542, 0x25222542,
38770 +0x2522E20C, 0x25422542, 0x25422542, 0x25422542,
38771 +0x25422542, 0x000B154A, 0xE2081145, 0x0009422B,
38772 +0x2FE62FD6, 0x7FFC4F22, 0xC8206043, 0x6E438D02,
38773 +0x0009BE85, 0xC81060E3, 0xBE828901, 0x60E30009,
38774 +0x8901C840, 0x0009BEA4, 0xC80160E3, 0xDD3D8938,
38775 +0xC80260D0, 0x2F008D03, 0x460BD63B, 0x60F00009,
38776 +0x8902C804, 0x460BD639, 0x62F00009, 0xC8806023,
38777 +0x60D08902, 0x2D00C97F, 0xC8016023, 0xD6348906,
38778 +0x0009460B, 0x0009A007, 0x51630601, 0x8902C808,
38779 +0x460BD630, 0x60F00009, 0x8902C810, 0x420BD22E,
38780 +0xD52E0009, 0x88026052, 0xD22D8B03, 0xA005E604,
38781 +0x88012260, 0xD22A8B02, 0x2260E601, 0x2522E200,
38782 +0xC88060E3, 0xD227892D, 0x60E36E20, 0x8902C880,
38783 +0x420BD225, 0x60E30009, 0x8902C840, 0x420BD223,
38784 +0x60E30009, 0x8902C802, 0x420BD221, 0x60E30009,
38785 +0x890DC804, 0xDD20D11F, 0x0009410B, 0x0009BF11,
38786 +0x0009BF4C, 0xD51ED41D, 0x2470E708, 0x25D2BF85,
38787 +0xC80860E3, 0xD21B8905, 0x4F267F04, 0x422B6EF6,
38788 +0x7F046DF6, 0x6EF64F26, 0x6DF6000B, 0x001C581C,
38789 +0xA000A000, 0x001D0100, 0x001D4000, 0x00040021,
38790 +0x001C589C, 0x001E1021, 0x00201A46, 0x00201A68,
38791 +0x002020C8, 0x00201A80, 0x00201A8E, 0x00203A50,
38792 +0x001E100B, 0x001E1028, 0x00201AFA, 0x00201B06,
38793 +0x00201A96, 0x00201AB4, 0x12345678, 0x001E1000,
38794 +0x0010F100, 0x00201AE2, 0x644CD6A7, 0x000B346C,
38795 +0xD6A62450, 0x346C644C, 0x2450000B, 0x644CD6A4,
38796 +0x000B346C, 0x625C2450, 0x4208616D, 0x42084119,
38797 +0x42006019, 0x670E614C, 0xD49E321C, 0x4200207D,
38798 +0x324CC90F, 0x2200000B, 0x4208625C, 0x42004208,
38799 +0x324C644C, 0x4200D498, 0x000B324C, 0x2FE62260,
38800 +0x614C4F12, 0x4100D493, 0x6710314C, 0xE29F666D,
38801 +0x27294619, 0x6E536269, 0x672E6573, 0x4221227D,
38802 +0x42214221, 0x7601662C, 0xE4014608, 0x34E84608,
38803 +0x644C4600, 0x071A0467, 0x2150257B, 0x000B4F16,
38804 +0x4F226EF6, 0xD2857FE8, 0x88016021, 0xD2848B7B,
38805 +0x26686621, 0xD2838B77, 0x26686621, 0xE50F8B73,
38806 +0xE401BFA2, 0xBFA4E501, 0xE586E400, 0xE400655C,
38807 +0x2F50BFA4, 0xBFA1E401, 0xE602E506, 0x60634618,
38808 +0x81F2E401, 0x6543BF9F, 0xE40185F2, 0xBFAB6543,
38809 +0x85F26603, 0x6543E401, 0x6603BFB1, 0xE40265F0,
38810 +0x6053756C, 0x80F8BF80, 0xBF82E402, 0x84F8E512,
38811 +0x7090E402, 0x6503BF82, 0x4618E602, 0x81F66063,
38812 +0xBF80E402, 0x85F6E500, 0x6603E402, 0xE500BF8C,
38813 +0xE40285F6, 0xBF926603, 0xE5FEE500, 0xE010655C,
38814 +0xBF61E403, 0xE5130F54, 0xE40EBF63, 0x05FCE010,
38815 +0xBF63E40E, 0xE5007585, 0xBF64E403, 0xE500E640,
38816 +0xBF71E403, 0xE500E640, 0xBF78E403, 0xE5FFE640,
38817 +0xE014655C, 0xBF47E404, 0xE40F0F54, 0xE504BF49,
38818 +0x05FCE014, 0xBF49E40F, 0xE5017584, 0xBF4AE640,
38819 +0xE501E404, 0xBF57E640, 0xE501E404, 0xE404E640,
38820 +0xAF5C7F18, 0x7F184F26, 0x000B4F26, 0x4F220009,
38821 +0xD2427FF0, 0x88016021, 0xD2418B71, 0x26686621,
38822 +0xD2408B6D, 0x26686621, 0xE50F8B69, 0xE401BF1C,
38823 +0xBF1EE501, 0xE586E400, 0xE400655C, 0x2F50BF1E,
38824 +0xBF1BE401, 0xE401E506, 0xBF1C6543, 0xE401E640,
38825 +0xBF296543, 0xE401E640, 0xBF306543, 0x65F0E640,
38826 +0x756CE402, 0xBEFF6053, 0xE40280F4, 0xE512BF01,
38827 +0xE40284F4, 0xBF017090, 0xE6406503, 0xBF02E402,
38828 +0xE640E500, 0xBF0FE402, 0xE640E500, 0xBF16E402,
38829 +0xE5FEE500, 0x6053655C, 0xBEE5E403, 0xE51380F8,
38830 +0xE40EBEE7, 0xE40E84F8, 0xBEE77085, 0xE5006503,
38831 +0xBEE8E640, 0xE500E403, 0xBEF5E640, 0xE500E403,
38832 +0xBEFCE640, 0xE5FFE403, 0x6053655C, 0xBECBE404,
38833 +0xE40F80FC, 0xE504BECD, 0xE40F84FC, 0xBECD7083,
38834 +0xE5016503, 0xBECEE640, 0xE501E404, 0xBEDBE640,
38835 +0xE501E404, 0xE404E640, 0xAEE07F10, 0x7F104F26,
38836 +0x000B4F26, 0x00000009, 0x001E102F, 0x001E1080,
38837 +0x001E1090, 0x001E103F, 0x001E103E, 0x00203A4A,
38838 +0x00203A4C, 0x00203A4E, 0xD21DD11C, 0x66206010,
38839 +0x676C7001, 0x3700C90F, 0xE5008D13, 0x67106210,
38840 +0x7701622C, 0x64232170, 0xD6166010, 0x44084408,
38841 +0x3428C90F, 0x62602100, 0x7201D513, 0x44082620,
38842 +0x000B354C, 0xD10F6053, 0x25586510, 0xE6008D13,
38843 +0xD60DD40B, 0x655C6540, 0x47086753, 0x37584708,
38844 +0x47086540, 0x24507501, 0x367C6040, 0x2400C90F,
38845 +0x72FF6210, 0x000B2120, 0x00006063, 0x00203995,
38846 +0x00203994, 0x00203996, 0x002035BC, 0x7FFC4F22,
38847 +0xE680D1A8, 0x666C6212, 0xD2A72F22, 0x67F36563,
38848 +0x420B7542, 0x7F04E404, 0x000B4F26, 0xE6800009,
38849 +0xD2A1666C, 0xE7006563, 0x422B7540, 0xE6806473,
38850 +0xD29D666C, 0xE7006563, 0x422B7543, 0x2F866473,
38851 +0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6, 0x7FC04F22,
38852 +0xDB97D296, 0x72012F22, 0xD1961F21, 0x66125211,
38853 +0x8B013620, 0x0009A0F9, 0xC9036061, 0x8B018801,
38854 +0x0009A0F3, 0xD290DC8F, 0x64C3420B, 0x6503D18F,
38855 +0x60111F02, 0x8B048801, 0x420BD28D, 0xAFE464C3,
38856 +0x54530009, 0x844CEE84, 0x890130E0, 0x0009A0C3,
38857 +0x6610D188, 0x6023626C, 0x8B718801, 0x6210D186,
38858 +0x89662228, 0xDA86D285, 0xE0036122, 0x64221112,
38859 +0x4018D881, 0xDD83E500, 0x814167A3, 0x77042850,
38860 +0x647266A2, 0x6ED3D580, 0x1F457E04, 0x65521F56,
38861 +0x64E368D2, 0x1F8874F8, 0x684369E2, 0x1F637894,
38862 +0x1F991F74, 0x62826142, 0xD779D978, 0x1F2BD679,
38863 +0x67726292, 0x1F1A6062, 0x2602CB20, 0xD176E600,
38864 +0xE5401F57, 0x1F7D1F2C, 0x76011F1E, 0x3253626D,
38865 +0x51F38BFB, 0x52F555F4, 0x25222A12, 0x55F757F6,
38866 +0x27525AF8, 0x5DF92DA2, 0x2ED251FB, 0xD56B5EFA,
38867 +0x54FC24E2, 0x281257FD, 0xD160D869, 0x25722942,
38868 +0x69126782, 0x1974D866, 0xDD666A12, 0x56FE60A1,
38869 +0x2A01CB01, 0xDA646412, 0xE9012842, 0x4A0B2D42,
38870 +0x52FE2692, 0xD661EE01, 0x22E24E18, 0x72016262,
38871 +0x60B22622, 0xCB01D14F, 0x2B02E202, 0x2120A03F,
38872 +0x8B3C2228, 0xE601D55A, 0x2160E700, 0xE01C2572,
38873 +0xC801004C, 0xD8578B0C, 0x1F8FD257, 0xE6002822,
38874 +0x7601E57D, 0x3253626C, 0x56FF8BFB, 0x2622D253,
38875 +0xE2FE69B2, 0x2B922929, 0x0A4CE01E, 0xE01F65F2,
38876 +0x014C25A0, 0x741057F1, 0xEA062710, 0xDD4CE600,
38877 +0x8446DE4C, 0x2D007601, 0x696C6844, 0x2E8039A3,
38878 +0x8FF67E01, 0xDE487D01, 0x2EA0EA94, 0xE1007E01,
38879 +0x7E0F2E10, 0xD12FE205, 0x64102E20, 0x6023624C,
38880 +0x89088801, 0x55F2D22A, 0x64C3420B, 0xEE01D132,
38881 +0xAF1A4E18, 0x55F221E2, 0x8553D13C, 0x620D6612,
38882 +0x89063262, 0xD63BD43A, 0xE801460B, 0xAF0CD73A,
38883 +0xD91F2782, 0x64C3490B, 0xEE01D127, 0xDA38D437,
38884 +0x4A0B4E18, 0xAF0021E2, 0x7F400009, 0x6EF64F26,
38885 +0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, 0x4F2268F6,
38886 +0x85467FF4, 0x2F01E681, 0x666C8547, 0x854881F1,
38887 +0x81F2D209, 0x67F38542, 0x854381F3, 0x81F4E40C,
38888 +0x65636053, 0x420B81F5, 0x7F0C7540, 0x000B4F26,
38889 +0x00000009, 0x001C3D9C, 0x002023FC, 0x0011779A,
38890 +0x001C36F8, 0x002035B4, 0x002014A6, 0x00203A16,
38891 +0x002014D0, 0x002039A5, 0x002039A4, 0x002039A0,
38892 +0x001C3B9C, 0x001C3704, 0x001C3D98, 0x001C3BB4,
38893 +0x001C5960, 0x001C3500, 0x001C3D30, 0x001C8960,
38894 +0x0020358C, 0x001C3D00, 0x00201610, 0x00117730,
38895 +0x002039A8, 0x001C582C, 0x2000A000, 0x0000A000,
38896 +0x0011778C, 0x00117792, 0x00117788, 0x0020397C,
38897 +0x0020357C, 0x00201534, 0x001E2130, 0x00203DA0,
38898 +0x002018C0, 0x2F962F86, 0x2FB62FA6, 0x2FD62FC6,
38899 +0x4F222FE6, 0xD19B7FEC, 0x2F12E000, 0x6103D49A,
38900 +0x1F4281F2, 0xDD9ADA99, 0xD69A6813, 0xE0014808,
38901 +0x460BDE99, 0x38EC4800, 0x65A21F03, 0x352052A1,
38902 +0xA23E8B01, 0x60510009, 0x8801C903, 0xA2388B01,
38903 +0x52530009, 0x32E0DE91, 0xD9918B10, 0x64A3490B,
38904 +0x4B0BDB90, 0xDE906403, 0xD791D690, 0xEC01D591,
38905 +0x2E02E100, 0x271026C0, 0x2502AFDF, 0xC8018551,
38906 +0xA1578B01, 0x62510009, 0x4200622D, 0x5E53366A,
38907 +0x85E2226D, 0xC903642C, 0x85E36603, 0x6053650D,
38908 +0x40214021, 0x4500C93F, 0x322A6703, 0x6053252D,
38909 +0xC901D17F, 0x60106C03, 0x8801D97F, 0xDB7F8B05,
38910 +0x2120E200, 0xCB0160B2, 0xD17D2B02, 0x88016011,
38911 +0x65A28B0A, 0x8D042448, 0x9B9E6251, 0xA00322B9,
38912 +0x919B2521, 0x2521221B, 0x37B3EB10, 0x2448895E,
38913 +0xD4738B07, 0x22286241, 0x60638903, 0xA05781F8,
38914 +0xD5706473, 0x46084608, 0x85E26273, 0x46006B50,
38915 +0x362C4200, 0x2BB8C910, 0x8F1F6463, 0x26686603,
38916 +0xD2698911, 0x062D6043, 0x4119616D, 0x6B0E6019,
38917 +0x81F820BD, 0x880160C3, 0x646C8F2C, 0x880F6073,
38918 +0xA0278B1B, 0xD2610009, 0x052D6043, 0x4119615D,
38919 +0x670E6019, 0x645C207D, 0x81F8A01C, 0x890F2668,
38920 +0x6043D25B, 0x6B5D052D, 0x60B94B19, 0x201D610E,
38921 +0x60C381F8, 0x8F0D8801, 0x6473645C, 0xEC00A00A,
38922 +0x6043D254, 0x625D052D, 0x60294219, 0x207D670E,
38923 +0x81F8645C, 0x880285F8, 0x85E1890A, 0x8D07C820,
38924 +0xE6DC6203, 0x60232269, 0x81E1A002, 0x644CE4FF,
38925 +0x6210D149, 0x89012228, 0x644CE4FF, 0x654DEBFF,
38926 +0x35B06BBC, 0xDB368B2B, 0x64A34B0B, 0x410BD135,
38927 +0x54036403, 0x85446E03, 0xC948DB40, 0xDC408808,
38928 +0xBEAC8B01, 0x64B3E502, 0x65E34C0B, 0xDB3DEC01,
38929 +0xD13D2DC2, 0x621260B2, 0x72017001, 0x21228805,
38930 +0x2B028F08, 0x666CE680, 0x6563D238, 0x7549E700,
38931 +0x6473420B, 0xA030D436, 0x7FFF0009, 0x85E28000,
38932 +0x20B9EBFC, 0x610381E2, 0x942A85E3, 0x62032049,
38933 +0x450885F8, 0x81E2201B, 0xC90160C3, 0x40084018,
38934 +0x40084008, 0x4000225B, 0x6023220B, 0x85E481E3,
38935 +0x4118E108, 0x81E4201B, 0xE40262A2, 0x20B98521,
38936 +0x67A28121, 0xCB016071, 0x85F82701, 0x89033042,
38937 +0xECE785E2, 0x81E220C9, 0x490BD41E, 0xA03B0009,
38938 +0x7E030009, 0x001C3D30, 0x00203DAC, 0x0020358C,
38939 +0x001E212C, 0x00203470, 0x001C3D00, 0x00117780,
38940 +0x002014A6, 0x00201670, 0x0011770C, 0x002039A4,
38941 +0x002039A5, 0x002039A0, 0x002018C0, 0x001C36F8,
38942 +0x00203A1A, 0x00203DBC, 0x00203BA0, 0x00203C20,
38943 +0x00203CA0, 0x00203D20, 0x00203990, 0x00203584,
38944 +0x002014D0, 0x00203A1C, 0x00203A20, 0x002023FC,
38945 +0x00203DA4, 0x00203DA8, 0x602262F2, 0x40094019,
38946 +0xC90F4009, 0x8B0B880A, 0x60E2DE8C, 0x40094019,
38947 +0xC90F4009, 0x8B038808, 0xCB0160A2, 0x2802A006,
38948 +0x65E2DE87, 0x2E527501, 0x286266A2, 0x52F366F2,
38949 +0x2622AE83, 0xD2838551, 0xDE83C802, 0xA0958B01,
38950 +0x420B0009, 0x4E0B64A3, 0x5E036403, 0x85E46503,
38951 +0x4918E908, 0xD77D209B, 0xE04C81E4, 0xDC7C0B7E,
38952 +0x7B01D97C, 0x61C207B6, 0x71016690, 0x8D062668,
38953 +0xD4792C12, 0x420BD279, 0xA070EB01, 0x62512DB2,
38954 +0x4B18EB0F, 0x22B9E102, 0x32104118, 0x85518B0F,
38955 +0x2029E2FC, 0x60518151, 0xCB0172E0, 0x85E12501,
38956 +0x202994A3, 0x85E481E1, 0xA0522049, 0x675181E4,
38957 +0x4719677D, 0x667E6779, 0x7701276D, 0x6903607C,
38958 +0x88014918, 0x25918F3E, 0x6B12D161, 0x21B27B01,
38959 +0x660D85E3, 0x40216063, 0xC93F4021, 0x6C034600,
38960 +0x262D322A, 0xC8016063, 0xDB5ED15D, 0x967D8901,
38961 +0xE6002C6B, 0x666C67CD, 0x40006063, 0x622D021D,
38962 +0x8D0E3270, 0x60436403, 0xE9FF021D, 0x8B013290,
38963 +0x01C5A007, 0x626C7601, 0x3292E904, 0x646C8BEB,
38964 +0x60434400, 0xD15004BD, 0x0B457401, 0x669D6911,
38965 +0x89073670, 0x602D6211, 0x890388FF, 0xE201DB4B,
38966 +0x2B2021C1, 0xECFC8551, 0x815120C9, 0xCB016051,
38967 +0xDC472501, 0x64A34C0B, 0x51F366F2, 0x85EF2612,
38968 +0x54F2D244, 0x650D420B, 0x0009ADE7, 0xE500DC42,
38969 +0x420B2C52, 0x4E0B64A3, 0x54036403, 0x85446E03,
38970 +0x6703E908, 0x65034918, 0x27998541, 0xDB323790,
38971 +0x8F0BD932, 0x6013610D, 0x8B07C820, 0xC9486053,
38972 +0x8B038808, 0xE501BD4B, 0x0009A005, 0x2128D233,
38973 +0xBD448901, 0x64B3E500, 0x490B65E3, 0xADBCEC01,
38974 +0x85F22DC2, 0x7001EE04, 0x31E7610D, 0x8D0281F2,
38975 +0xADA97A08, 0x7F140009, 0x6EF64F26, 0x6CF66DF6,
38976 +0x6AF66BF6, 0x000B69F6, 0xF7FF68F6, 0x2FE68000,
38977 +0xD2234F22, 0x60E36E22, 0x8D02C840, 0xBBE522E2,
38978 +0xE2400009, 0x2E284218, 0xBBF08901, 0x60E30009,
38979 +0x8905C810, 0xD21CD41B, 0x0009420B, 0x0009BBEF,
38980 +0xC80560E3, 0xBD6D8901, 0x60E30009, 0x8902C802,
38981 +0xABEC4F26, 0x4F266EF6, 0x6EF6000B, 0x001C3D3C,
38982 +0x00117760, 0x002014A6, 0x00201670, 0x0020351C,
38983 +0x00203DC0, 0x00203990, 0x00203584, 0x002014D0,
38984 +0x002039FC, 0x00203A04, 0x002039F8, 0x002039FA,
38985 +0x00201534, 0x002018D0, 0x00203A1C, 0x00008000,
38986 +0x001C3510, 0x00203DB4, 0x002018C0, 0x89014F22,
38987 +0x611B600B, 0x611BB00A, 0x000B4F26, 0x600B600B,
38988 +0x611BA004, 0x8DF12107, 0x8BF84011, 0x620D2F26,
38989 +0x8F3E3020, 0x40180019, 0x8B0B3016, 0x31043104,
38990 +0x31043104, 0x31043104, 0x31043104, 0x412462F6,
38991 +0x601C000B, 0x41296219, 0x20084018, 0x31048926,
38992 +0x31043104, 0x31043104, 0x31043104, 0x31043104,
38993 +0x31043104, 0x31043104, 0x31043104, 0x61193104,
38994 +0x3204221D, 0x32043204, 0x32043204, 0x32043204,
38995 +0x32043204, 0x32043204, 0x32043204, 0x32043204,
38996 +0x212D3204, 0x601962F6, 0x4024000B, 0x000BE000,
38997 +0x621362F6, 0x41294228, 0x31044224, 0x31044224,
38998 +0x31044224, 0x31044224, 0x31044224, 0x31044224,
38999 +0x31044224, 0x31044224, 0x31044224, 0x31044224,
39000 +0x31044224, 0x31044224, 0x31044224, 0x31044224,
39001 +0x31044224, 0x31044224, 0x602D4224, 0x62F6000B,
39002 +0x080A0C0E, 0x00020406, 0x1A1C1E20, 0x12141618,
39003 +0x2E303234, 0x26282A2C, 0x3A3C3E40, 0x6C625648,
39004 +0x41112F26, 0xE2208F18, 0x890B3123, 0x321CD204,
39005 +0xD1026220, 0x412B312C, 0x00090009, 0x0020349A,
39006 +0x00203450, 0x000BE000, 0x400062F6, 0x40004000,
39007 +0x40004000, 0x40004000, 0x62F6000B, 0x40004000,
39008 +0x40004000, 0x40004000, 0x40184000, 0x62F6000B,
39009 +0x40004000, 0x40004000, 0x40004000, 0x40284000,
39010 +0x62F6000B, 0x40004000, 0x40184000, 0x000B4028,
39011 +0xC90F62F6, 0x40054005, 0x40054005, 0x62F6000B,
39012 +0x4005C907, 0x40054005, 0x62F6000B, 0x4005C903,
39013 +0x000B4005, 0xC90162F6, 0x000B4005, 0x000062F6,
39014 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39015 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39016 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39017 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39018 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39019 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39020 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39021 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39022 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39023 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39024 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39025 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39026 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39027 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39028 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39029 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39030 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39031 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39032 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39033 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39034 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39035 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39036 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39037 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39038 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39039 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39040 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39041 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39042 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39043 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39044 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39045 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39046 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39047 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39048 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39049 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39050 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39051 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39052 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39053 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39054 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39055 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39056 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39057 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39058 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39059 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39060 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39061 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39062 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39063 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39064 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39065 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39066 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39067 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39068 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39069 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39070 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39071 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39072 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39073 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39074 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39075 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39076 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39077 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39078 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39079 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39080 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39081 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39082 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39083 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39084 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39085 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39086 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39087 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39088 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39089 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39090 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39091 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39092 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39093 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39094 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39095 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39096 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39097 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39098 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39099 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39100 +0x00000000, 0x00000000, 0x00000000, 0x42707372,
39101 +0x3D206675, 0x554E203D, 0x202C4C4C, 0x6E49677A,
39102 +0x4E497274, 0x6D754E51, 0x0000003D, 0x61766E49,
39103 +0x2064696C, 0x72657375, 0x20726F20, 0x2079656B,
39104 +0x00214449, 0x6E6B6E55, 0x206E776F, 0x6D6D6F63,
39105 +0x3D646E61, 0x00000000, 0x203A3051, 0x00000020,
39106 +0x203A3151, 0x00000020, 0x203A3251, 0x00000020,
39107 +0x203A3351, 0x00000020, 0x203A3451, 0x00000020,
39108 +0x2B434741, 0x73696F4E, 0x61432065, 0x7262696C,
39109 +0x6F697461, 0x6166206E, 0x6F206C69, 0x6974206E,
39110 +0x0D0A656D, 0x00000000, 0x00000072, 0x00205220,
39111 +0x62735576, 0x7473725F, 0x00000A0D, 0x62735576,
39112 +0x7375735F, 0x646E6570, 0x00000A0D, 0x62735576,
39113 +0x7365725F, 0x000A0D6D, 0x00000044, 0x44387570,
39114 +0x72637365, 0x6F747069, 0x3D584572, 0x00000000,
39115 +0x00000047, 0x72746E49, 0x6D652051, 0x2C797470,
39116 +0x49677A20, 0x4972746E, 0x754E514E, 0x00003D6D,
39117 +0x654C7245, 0x0000006E, 0x20746F4E, 0x756F6E65,
39118 +0x49206867, 0x4220514E, 0x0A0D6675, 0x00000000,
39119 +0x000000FF, 0x00020001, 0x00FF00FF, 0x00FF00FF,
39120 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
39121 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
39122 +0x010E010D, 0x00020003, 0x01090108, 0x0002010A,
39123 +0x02000003, 0x02020201, 0x02040203, 0x02060205,
39124 +0x02020200, 0x02040203, 0x020C020B, 0x020E020D,
39125 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
39126 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
39127 +0x000000FF, 0x00020001, 0x00FF00FF, 0x00FF00FF,
39128 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
39129 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
39130 +0x010E010D, 0x00020003, 0x01090108, 0x0002010A,
39131 +0x00030003, 0x02020201, 0x02040203, 0x02060205,
39132 +0x02020200, 0x02040203, 0x020C020B, 0x020E020D,
39133 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
39134 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
39135 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
39136 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
39137 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
39138 +0x010E010D, 0x00FF010F, 0x01090108, 0x010B010A,
39139 +0x0200010F, 0x02020201, 0x02040203, 0x02060205,
39140 +0x02020200, 0x02040203, 0x020C020B, 0x020E020D,
39141 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
39142 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
39143 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
39144 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
39145 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
39146 +0x010E010D, 0x00FF010F, 0x01090108, 0x010B010A,
39147 +0x010F010F, 0x02020201, 0x02040203, 0x02060205,
39148 +0x02020200, 0x02040203, 0x020C020B, 0x020E020D,
39149 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
39150 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
39151 +0x00205220, 0x00000046, 0x00000059, 0x73204142,
39152 +0x003D7165, 0x49544120, 0x0000204D, 0x00000000,
39153 +0x00000000, 0x002E0209, 0x80000101, 0x000409FA,
39154 +0x00FF0400, 0x05070000, 0x02000201, 0x82050700,
39155 +0x00020002, 0x03830507, 0x07010040, 0x40030405,
39156 +0x02090100, 0x0101002E, 0x09FA8000, 0x04000004,
39157 +0x000000FF, 0x02010507, 0x07000040, 0x40028205,
39158 +0x05070000, 0x00400383, 0x04050701, 0x00004002,
39159 +0x00000000, 0x00000000, 0x07090000, 0x00000000,
39160 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39161 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
39162 +0x00000000, 0x00000000, 0x00000000, };
39163 +
39164 +const u32_t zcP2FwImageSize=15964;
39165 --- /dev/null
39166 +++ b/drivers/staging/otus/hal/hpfwbu.c
39167 @@ -0,0 +1,5269 @@
39168 +/*
39169 + * Copyright (c) 2007-2008 Atheros Communications Inc.
39170 + *
39171 + * Permission to use, copy, modify, and/or distribute this software for any
39172 + * purpose with or without fee is hereby granted, provided that the above
39173 + * copyright notice and this permission notice appear in all copies.
39174 + *
39175 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
39176 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
39177 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
39178 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
39179 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
39180 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
39181 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
39182 + */
39183 +#include "../80211core/cprecomp.h"
39184 +
39185 +const u32_t zcFwBufImage[] = {
39186 +0x3A4BCF18, 0xF44C076E, 0xF59452EA, 0x451BA755,
39187 +0x140AC87A, 0xC07EE942, 0x3EF978AB, 0xF5B03DC6,
39188 +0xB70080F0, 0xA89064EA, 0x54E2C1D6, 0xEB047DF4,
39189 +0x1798390C, 0x00350624, 0x35B3ECF0, 0x59F2FABF,
39190 +0xAF9D248E, 0xF9BDB9F0, 0xD05C8B47, 0xC08B5A16,
39191 +0x990093C7, 0xD335A160, 0x1C04942C, 0xBF6E7A88,
39192 +0xFD232B0F, 0x5C224387, 0xBF1E156C, 0xF24F2A27,
39193 +0xFF56421D, 0xB213037C, 0x2BA67BA0, 0x4950CF8A,
39194 +0x05F00F25, 0xA5E82085, 0x74168A0C, 0x2F2AB30B,
39195 +0xC80C57EE, 0xB6BDF570, 0x89BC5A99, 0x7F3B5A67,
39196 +0xF6C943B8, 0x0C9C9201, 0xE8383747, 0x0C9A72D6,
39197 +0xE0520704, 0xA66D7F30, 0xE444A434, 0xE0C94AB7,
39198 +0x8DD7751C, 0x1A659464, 0x6C9ABA4F, 0x792F2D2D,
39199 +0x5936F66B, 0x061E580E, 0x59903F6C, 0x1FBFB8A0,
39200 +0xCC822EFE, 0x4B030CAF, 0xB62457C9, 0x27E9BF15,
39201 +0xB113A487, 0xFA0FC915, 0x447B184A, 0x5330CD51,
39202 +0x00BCC622, 0xF30DE149, 0xFF718E1C, 0x7B5D2861,
39203 +0xDBCA573E, 0xFB0D7BF9, 0xE1CFBAAC, 0xF99D4583,
39204 +0x4BA7498A, 0x7CAEA7EB, 0xBA958E32, 0x36C530FF,
39205 +0x8F88CA99, 0xF93CABC2, 0x8E47EF11, 0xFB0EED6F,
39206 +0x5B3668A1, 0x9D63ADDE, 0xA0EEAB8C, 0x084915F1,
39207 +0xFACAAA27, 0x209638FE, 0x1CED9EFF, 0xEEBD2335,
39208 +0x38C6F424, 0x2D1F3D7E, 0x976E8106, 0xBE087AD2,
39209 +0x32194845, 0x756066DB, 0xC70E3165, 0xC568DCB1,
39210 +0x3212E4E1, 0xB5D991AD, 0x07C3CEF8, 0xDB4ABB38,
39211 +0x1574C232, 0xF8C792BC, 0x14E62DBE, 0x5A48E7DC,
39212 +0xEFDC5407, 0xC45B4017, 0x3B814E89, 0xF0936466,
39213 +0x89491B2B, 0x9A359A41, 0x82287675, 0xA0F338D3,
39214 +0x523FDD3C, 0x4E40B795, 0x458ADAA4, 0xED812957,
39215 +0x7ADC73BC, 0x6FD7DB78, 0x2740FC04, 0x6392AEA3,
39216 +0x185ABCEA, 0x6B50ABC3, 0x3681F07F, 0xC840F8CE,
39217 +0x5733E7EC, 0x0805FA71, 0x0B34530A, 0x8CB3D033,
39218 +0x81451551, 0x53B0B4EC, 0x908646D0, 0x10A3E642,
39219 +0xF358DC34, 0xC1FA570C, 0x2B1284B0, 0x592322BB,
39220 +0x9D587783, 0xE7D77988, 0xE1BE5D7B, 0x44B93E23,
39221 +0xF8BE94A2, 0x506DC723, 0x6E0A7D09, 0x3FB1046F,
39222 +0xDB3A166F, 0x9CB7D6A0, 0xE278DE6D, 0x88459334,
39223 +0xB52BA3C9, 0x284740A2, 0x04D30792, 0x944D79CA,
39224 +0x1D050EA9, 0xA404DB1B, 0x99526023, 0xBACE24E7,
39225 +0xB9F20704, 0x284E6432, 0x47A593D1, 0x95F8DFCB,
39226 +0x220C9167, 0x8FAABBBC, 0x93D34E8C, 0xCE077138,
39227 +0x4FC18081, 0xE76DD7E5, 0x67465F6C, 0x7A479D77,
39228 +0x74D61F82, 0x00559214, 0x2F66E42E, 0x8742A96B,
39229 +0x62063950, 0xA2DBFAE5, 0x368B966F, 0xAB5FCCE1,
39230 +0xCB4023B1, 0x1E7AF542, 0x05953E30, 0x8CA51CFC,
39231 +0x2216547D, 0x29D562D4, 0xE9C9F8EE, 0xA90505C9,
39232 +0x088D0EEB, 0xD7A290FA, 0x95E5B567, 0x53FAD3C0,
39233 +0xB89FC625, 0x69A7519B, 0x3687C7EF, 0x7188CB55,
39234 +0xCE5DB97E, 0xA260574A, 0xD453D173, 0x145D970B,
39235 +0x12112CC6, 0x399839E0, 0x29C55BEB, 0xE467C71F,
39236 +0x10B3C9D4, 0x8F1C9662, 0xF207A826, 0xE0245600,
39237 +0x688B1812, 0x5A483031, 0x7048380A, 0x78E3D5BB,
39238 +0x1951533D, 0x8FA5D8E3, 0xC5BE500D, 0x71DB5B2B,
39239 +0xA17AA000, 0x408C9BE8, 0x161E12F5, 0xB1C38C45,
39240 +0x22A88F05, 0xDE3F4405, 0x5078ADBB, 0xCE1BF1A6,
39241 +0xB7A75B04, 0x6B8364E8, 0x0CE32E3E, 0x9BF65504,
39242 +0x28C18157, 0x78359AC6, 0x617BF202, 0x1E76FA09,
39243 +0x0F8E61A8, 0x6D02F0D5, 0x80356459, 0x79CEFAE7,
39244 +0x7D00F155, 0x5C1C0128, 0xC75CA073, 0x32816090,
39245 +0x9FF78DFC, 0x848D269C, 0xF811B314, 0xA86920FC,
39246 +0x6F885D01, 0xACFE6525, 0xC726074D, 0xFED68599,
39247 +0xF1D5C76A, 0x8799E5F5, 0xF85F5171, 0xD8DE2D3B,
39248 +0xE7DD8E75, 0x43F8614A, 0x0684FC8D, 0x9683B8C8,
39249 +0x74BE786B, 0x2514762D, 0x7D866682, 0xE711FE1F,
39250 +0x0DE9E273, 0x12F53167, 0x4FA3A7FE, 0x2A00EB61,
39251 +0xB3984A28, 0x4319F2B0, 0x42BA0CA2, 0x848771B6,
39252 +0x995E945E, 0xD41115F5, 0x43D9834B, 0x54EEDC36,
39253 +0x5C3C5407, 0x671B540E, 0xDCF18948, 0x150ED973,
39254 +0x2D4922DE, 0xF93CA17D, 0xB24A76E5, 0xD1C01C22,
39255 +0xF2963DD6, 0x3B860066, 0x08EF0EA4, 0x609B60CC,
39256 +0xE2E901FA, 0x25BE9B93, 0xDF96D9BC, 0x86D415DF,
39257 +0x75CCF6BB, 0x882D54B2, 0x7976E9AF, 0x88A0B178,
39258 +0x5ADE5A55, 0x8A8C0112, 0xD896755A, 0xCB6789B3,
39259 +0x8B63AE2F, 0x2545036C, 0xE4655B94, 0x20959977,
39260 +0x29DFB4D1, 0xCDAAEBF4, 0x1C07EC05, 0x5A6F607D,
39261 +0x88A9B31D, 0x118C74D2, 0x000BB065, 0x75C46712,
39262 +0xEF1A58BD, 0x50ECA262, 0xCCE393B9, 0x6EDB92E8,
39263 +0x700EF517, 0xBF6CF4AD, 0x57456DC0, 0xF629517C,
39264 +0x40331F8B, 0xC10A454D, 0x6CCB02CF, 0x9BF11B1C,
39265 +0xE0871437, 0x23623585, 0xF519F09C, 0x4DB2AFC8,
39266 +0x88FCBD7B, 0xB512FE8D, 0xDE445894, 0x078AD03C,
39267 +0x44375FB0, 0x0BABEDB1, 0x40D5E8E1, 0x13F20A86,
39268 +0xF1406303, 0x7205C322, 0x3FC43779, 0x7A60D510,
39269 +0x14469E04, 0xF4E77873, 0x2EAD7ECE, 0xA135D6EA,
39270 +0x3F4C4B30, 0x21488077, 0x69F64F1C, 0xEEF4876E,
39271 +0x63610C0B, 0xB7B24C5C, 0x324A76FE, 0x0CF651D3,
39272 +0x9460F0B1, 0x81A83230, 0x0839CFF9, 0x70722F04,
39273 +0xC278FB3B, 0x5DD1BDA4, 0x1E4B3DBA, 0xAE161A93,
39274 +0x9E1033C3, 0xD938FCEC, 0xDA2B2F93, 0x28CD82EA,
39275 +0x14AD1FAF, 0xE4EC9CB8, 0xE770AFDF, 0xEFB12898,
39276 +0x500BE181, 0x602625C5, 0xF160631B, 0x78D3643F,
39277 +0x4E13ED37, 0x647BB223, 0xCF18D75C, 0xF477F94C,
39278 +0x786ECB89, 0xB3ED21F8, 0x1BEF3916, 0x240FB35A,
39279 +0x5C69B7D9, 0x8E96290A, 0xD40DC98C, 0xD1370291,
39280 +0x5870021E, 0x3F7CF23F, 0xFD4A6ADA, 0x36482457,
39281 +0x926600AF, 0xDC8618BC, 0x67D3779F, 0x3422830C,
39282 +0x87A41FBA, 0xCA0AFF53, 0x63BC45F3, 0x520BBBAE,
39283 +0xEDE2E031, 0xB6FA9450, 0x258CA712, 0xD709C4E4,
39284 +0x617709B2, 0xAACE0B41, 0x363DBF55, 0x701D6583,
39285 +0x39F3C885, 0x7CD6297B, 0x078FE13B, 0xA398DABF,
39286 +0xDB97C514, 0x039102E3, 0x5CA545AF, 0x9298BA18,
39287 +0xD18DAF86, 0x3D70EEA2, 0x5266AD68, 0xB04945B5,
39288 +0x402DDA5B, 0x01DC6CD1, 0x93AC5053, 0x08DF9EA9,
39289 +0x485EBE97, 0xA5D05853, 0x6CBEE910, 0xD485F4E2,
39290 +0x8F201D07, 0xEFC384A3, 0x7272AFBE, 0xC0B41FD7,
39291 +0x8E54A971, 0xA7F9E0F7, 0xC21700B4, 0xC24A4ED0,
39292 +0x5419EACF, 0xBC2D8FB1, 0x2C5B5AFF, 0x0345274C,
39293 +0xC41DF47A, 0x37658AFF, 0x24CF3BE7, 0xA3086248,
39294 +0xF82B5928, 0xB49A9B04, 0xD4105AEF, 0x444EBE8D,
39295 +0x348368DF, 0xDC77A7A0, 0x68D37E0D, 0xD2EB54EE,
39296 +0xDDAC8C33, 0xE5C93C79, 0xE4706ABF, 0x17536EFD,
39297 +0x6C2B2B16, 0x038AA806, 0xDAD42458, 0xAE1D76A1,
39298 +0xCC8DE95C, 0x1BA20647, 0x0521068C, 0x306FBE44,
39299 +0x4E29D881, 0xD2A14D53, 0xA155853E, 0x44500CC4,
39300 +0xFC4466B7, 0x5AACD51D, 0x506D3A73, 0x3F61E0FE,
39301 +0x58F11F9D, 0xC92A2CAD, 0xD9A4F86B, 0x1FA747B1,
39302 +0x77DEC5D2, 0xDFAB369A, 0xD471EA01, 0x724502DA,
39303 +0x618CE21A, 0x52388BEB, 0x2E8A4CC5, 0x58332211,
39304 +0x3FCC46E1, 0x501210E2, 0xE9D51D1A, 0x37237B55,
39305 +0x8CE3E2F1, 0x6B2E98CC, 0xB56A11E5, 0x8819036B,
39306 +0xA6AA2F27, 0xB0124A0E, 0x92F17364, 0xD4A89238,
39307 +0x0507E337, 0x8ED95DEC, 0x9C014BA8, 0xBA5B11C6,
39308 +0x9C15D38C, 0x52596C98, 0x9330DD3D, 0xD6147570,
39309 +0x21701F1B, 0x5A2385F1, 0xE2F38C6C, 0xB3E94698,
39310 +0x2F9C63FA, 0x7E0234D8, 0x4CDD3288, 0xE1969B5F,
39311 +0x853B3C1D, 0xF61465A7, 0xF281C419, 0x46C5F072,
39312 +0x9F1722DD, 0x64F2A994, 0x86AEE8A8, 0x55895E17,
39313 +0x6047D1AC, 0x3375A934, 0x336BEACA, 0x90791174,
39314 +0x4DACC4D2, 0x24253860, 0x2A7876FB, 0x9DBDF98D,
39315 +0xD5BCE182, 0x67EB5F70, 0xCC06BA38, 0xE8F78715,
39316 +0xFEB0EB44, 0xE9776E03, 0x892A0898, 0x7A070650,
39317 +0x6D04DDC4, 0x99A5B7EA, 0x3B416BB6, 0xDADCE834,
39318 +0xB3B03278, 0xDB73B70E, 0xB0F0224E, 0x538A4AF9,
39319 +0xD25D6A37, 0x8F627FB0, 0x11ED9387, 0xB8C88457,
39320 +0x0CF320CA, 0xA20E62A2, 0x1DACDD4A, 0xAB84575D,
39321 +0x740DAF75, 0xAB9DB955, 0xFF787314, 0xA680B8E3,
39322 +0xC976D38E, 0x1FD38F4D, 0x0AEB6633, 0xB69A03DF,
39323 +0xB6CA8610, 0x106354C2, 0xC37D48C8, 0x3E5EED54,
39324 +0x534CC9BA, 0xE37DFFAD, 0x9F69EB05, 0xF67217EE,
39325 +0x50180B3D, 0xCC61C127, 0xC3598D73, 0xE5C00F01,
39326 +0xFFE9B111, 0x5E23EA2F, 0xF6C45DCE, 0x44585E39,
39327 +0xB02C6004, 0x37233902, 0x4F374C0D, 0x34288898,
39328 +0xE274937D, 0xC81D472C, 0x17A43151, 0x2638F7D3,
39329 +0x5304E5B5, 0xD5CE5EDE, 0x357FA7B3, 0xFBE27986,
39330 +0x64E65D1F, 0xC28D1237, 0xA73D9AB3, 0x124CA6C8,
39331 +0x770D7415, 0x5788C32C, 0x18DEFC00, 0xB3B2B06A,
39332 +0x55CC86A0, 0x8D929309, 0x84AB381A, 0x9DEFE8DD,
39333 +0x26C742C8, 0x952BAC34, 0x0A3B140F, 0x82A9304B,
39334 +0x52CEC9F4, 0x47DF4D08, 0x15A116D8, 0x7B890B18,
39335 +0xC87BEF1A, 0xB59601B6, 0xD37BFB28, 0x5D9F564D,
39336 +0xFB002F8D, 0xE7602E57, 0xE429C852, 0x9C0A8C75,
39337 +0xE02611DC, 0x8A1C9861, 0x7495D6DE, 0xCA059710,
39338 +0xAE5969B8, 0xE5B2CBDC, 0xA49F6EC1, 0x85D2A553,
39339 +0xE4719B0F, 0x40F68BBC, 0x092E24B5, 0x7B132678,
39340 +0xD70C17E1, 0x309E6AA1, 0xE009657F, 0xA7238C7A,
39341 +0xE0575D78, 0x1D6980E7, 0xEFCDD368, 0x19F08D93,
39342 +0xFAC03B85, 0x51BADA8F, 0x037DF839, 0x8F4D29F4,
39343 +0x1DC8A913, 0x50C55402, 0xDEE578F0, 0x2BA1C091,
39344 +0x9ACA567E, 0xA8FFECFA, 0xA3C05D12, 0xF18C6283,
39345 +0xEAAE6662, 0xB4DC6A79, 0xCEC5E782, 0x93A2E384,
39346 +0x8F8A5E6F, 0xCA8379D5, 0x81BCD49E, 0x5FCE174B,
39347 +0xD1543A5B, 0x845D635F, 0xD53125B9, 0x3B2121AE,
39348 +0xF8ECDD01, 0xF84D2D11, 0x6579BC21, 0x5C2DC220,
39349 +0x9EC1A688, 0x1148D831, 0x6C087799, 0x58944357,
39350 +0x56F79FC6, 0x6B689B55, 0x740B5FD1, 0x9F7BFB5F,
39351 +0x6B2F3E2D, 0x10E09273, 0x2E9E3213, 0xF3436AA0,
39352 +0x14A9F681, 0x9087D3CE, 0x68D0430B, 0x9FAFE3EF,
39353 +0xD45B8C61, 0xB982724A, 0x04448D7F, 0x8712E47A,
39354 +0x2C188D15, 0x9C3F06CC, 0x6343B130, 0x56C6765C,
39355 +0xF657BC9A, 0x15F1E973, 0x47E71181, 0x8639F5D7,
39356 +0xC1F3FDD5, 0xDC522441, 0x56BB2908, 0xAA48AEC6,
39357 +0xEC04087A, 0x8D375875, 0xE2941F88, 0xED31CC72,
39358 +0x09BD8794, 0x4C81D5C1, 0x1CC96D9C, 0x98A89022,
39359 +0xAA362C57, 0x924D583D, 0x270430E6, 0x0FD4040A,
39360 +0xAF561155, 0x38DCD1CF, 0xE861D2AC, 0x24A2EF3C,
39361 +0x2B7E3868, 0x13DA6C12, 0x69202EB6, 0x4A5FEC66,
39362 +0x185417A9, 0x3C92EFF4, 0x949842E6, 0x02115D93,
39363 +0xAD1726FF, 0x4E093D7D, 0xC3E41B9C, 0x27BBC1C1,
39364 +0x4FFA49C7, 0x6C63D24C, 0x84255444, 0x282C3BA2,
39365 +0x3D679D86, 0x03B410B1, 0x64DB454C, 0x535499D4,
39366 +0x25B421A1, 0x7E68C8FE, 0x0477E3B9, 0xCEFB087D,
39367 +0x9E59B89C, 0xBB787559, 0x1A550EE4, 0x078B48AB,
39368 +0x73A865FE, 0xD7227471, 0x3A864049, 0xE5EE3A1D,
39369 +0x201BC19D, 0xEB8DAE2C, 0x0E2AB31D, 0xCDAC2D79,
39370 +0xDAAB08B1, 0x63ECD4F2, 0xC00F9716, 0xD415C6BB,
39371 +0x8C20C39F, 0xDED8F5A2, 0x1D6A4190, 0x3D319167,
39372 +0x56B3A26B, 0x0547BF52, 0xA056924F, 0x4DAA539A,
39373 +0x557241D1, 0x42C9124E, 0x18723323, 0x6AD6E7EC,
39374 +0x8E039337, 0xF6FDDD65, 0x5F3525F9, 0xC0AD9704,
39375 +0x810EF049, 0xCE022EE0, 0x41CE7E52, 0x8E172A44,
39376 +0x648808E2, 0xC7FF6896, 0x2AD0985C, 0x304B9631,
39377 +0xD21EA39B, 0x279F5089, 0xCDB5C390, 0x21716A40,
39378 +0x5E34B278, 0x39475D72, 0xBA4F4DB1, 0x8B25818F,
39379 +0xE6E466F4, 0xC4A09DF8, 0x59F18AC7, 0x887AB5FE,
39380 +0xEEA4BA42, 0x17371DA8, 0xA82193D1, 0x6DC30EF7,
39381 +0xDEB9D349, 0x2B3271D4, 0x1FE83836, 0xEC755A29,
39382 +0x05F07FCD, 0xC331D3AE, 0xC6208B76, 0x497FF280,
39383 +0x4C579C5A, 0x22B71F94, 0x30FD620B, 0x31B71AE3,
39384 +0xDF7D1A41, 0xF041ACA5, 0x9533261B, 0x3262D291,
39385 +0x060E9672, 0x7D191A55, 0x6D0F0945, 0xF8C7777C,
39386 +0x1C173808, 0x78308E77, 0xC1EEAD3B, 0x059CCD9D,
39387 +0xA8FDBE19, 0xE47630FA, 0x88A49DE5, 0x03347DAB,
39388 +0x4F31F969, 0xF9C62B12, 0x93AB126F, 0x8A7A3BFB,
39389 +0x82591545, 0x2A1A2131, 0x1DEBB134, 0x449E28DD,
39390 +0xFA7E0248, 0xC1E3A5BC, 0x1747E097, 0x4C69AA5C,
39391 +0x1FD71B4B, 0xAC64CA6C, 0x5545F9F9, 0x5E5886F2,
39392 +0x243DBA6C, 0x495BE163, 0x4ECF5A6C, 0x430C9019,
39393 +0x89A980FA, 0x528945AE, 0x00CE6936, 0x9F9A73B2,
39394 +0x9E59DC6B, 0xD57740CD, 0x0E0CB735, 0xB1202BE3,
39395 +0xAA26C2A9, 0x267A77A6, 0x3FA12CF0, 0x4587C0AF,
39396 +0x354ED831, 0xFFD8BD8E, 0x56CC0F26, 0x75717AE3,
39397 +0x51B10674, 0x3E33EC26, 0x26CE80DB, 0x5C4A9140,
39398 +0x017F6C2F, 0xF9038D9A, 0x0A22C29F, 0xBA1F7C8D,
39399 +0x125CC934, 0x6CF66BFF, 0x48C13DCD, 0x63FC3D81,
39400 +0x258C181D, 0x1A4C3DDD, 0x2E24BECC, 0x7C86A9ED,
39401 +0x5BD1989C, 0x57CE595C, 0xDF291AFE, 0xEAF00887,
39402 +0xD8DD4259, 0xDF67331E, 0x50D0CE88, 0x1FD090AE,
39403 +0x632DA5F0, 0x95272A5B, 0x31172F25, 0x547FD7DF,
39404 +0xAFBE11D9, 0x97189DFC, 0xC4881191, 0x1C92365D,
39405 +0x843DEFDE, 0xCF0A399B, 0xCF327CAF, 0xDDAF0BCE,
39406 +0x03AA7A2E, 0x411A8664, 0x6CCF7CD9, 0x61097EF5,
39407 +0x07F3941E, 0x5BC3EB75, 0x2791945F, 0xBEBB526E,
39408 +0x18631A34, 0x25FEBF10, 0x419834CF, 0xF642D176,
39409 +0x372FFF10, 0x2A1BEA1B, 0x400FF345, 0x257A234A,
39410 +0x9F15E99D, 0xE06AA1DB, 0x3A0DB315, 0x2BA30D99,
39411 +0x0E9E831E, 0x1B25EE41, 0x8DB30E70, 0x9FBA6D64,
39412 +0xAB8AA5E3, 0x5A96177A, 0x6BE03535, 0x97E37DCE,
39413 +0xACA24F26, 0x5F0096F7, 0x5D02722F, 0xAF8F3EC7,
39414 +0xA6824151, 0x70FAD406, 0xDEBA8513, 0x99C63E34,
39415 +0x1CC4A3DF, 0x7F756508, 0xB7386527, 0x647C7FB8,
39416 +0x43F1F4DF, 0xC7E4EC18, 0x302BA109, 0xD5E9175B,
39417 +0x82856F77, 0x0F6D45D9, 0x95AE28B9, 0xE63385C3,
39418 +0x8FB26619, 0xBD99F298, 0xC884B948, 0x0B596FF1,
39419 +0xE061C3F9, 0xBC2F9A81, 0xC488CD91, 0x372EF590,
39420 +0x3DA1BFE5, 0x10DE037B, 0x7210B4DC, 0x74E4EFF8,
39421 +0x6365AFD2, 0x8CEABC85, 0x1D8FFD43, 0x4DE243F8,
39422 +0xEC976FD9, 0xAD827765, 0xC679F15D, 0xC125EC31,
39423 +0x95D3481C, 0xC4EA6EAC, 0xC8FC014F, 0x1352EB66,
39424 +0x9C400EB5, 0x227BFAB9, 0xB12BF958, 0x85B6D782,
39425 +0x78B6E44D, 0xE2232EEE, 0x4F101711, 0x9ABEBF69,
39426 +0x66ACC682, 0x04AD5F55, 0xE4FC6238, 0xBA3D2266,
39427 +0xA2BA3170, 0x083F39AB, 0xFF2075C4, 0x945C4B05,
39428 +0x41E8C113, 0xEC7CAD67, 0x3653733E, 0x03510C3B,
39429 +0x1E973158, 0xFBE507F3, 0x2CCD8D9A, 0x6EA9442F,
39430 +0x0D48DE95, 0xC517BFAE, 0x04EBB5C9, 0xEFAB1823,
39431 +0xD5FBFC0A, 0x6890F212, 0xA1C00CCD, 0x6DD561E6,
39432 +0x20D39B1C, 0x56113FBA, 0xCF3A7FD7, 0x3AB5A0DB,
39433 +0x3656572E, 0x7BC48CD3, 0x8902AE36, 0xD3E94AFF,
39434 +0xC06EB447, 0xCC513C0C, 0x2544B7DD, 0x6F168877,
39435 +0x53162607, 0x461DCEF0, 0xF47AF2BB, 0x8AF9F3CC,
39436 +0x1EEFF9E6, 0x57CFB6B6, 0x7F712439, 0xAB20C93D,
39437 +0x043F9003, 0x60C808BC, 0x86C2137C, 0x46ADB474,
39438 +0x848B65F2, 0x5544789B, 0x18E9AEC7, 0xC889913E,
39439 +0xFEB79B2F, 0xA3FBE518, 0x67922463, 0x93746398,
39440 +0x968E160F, 0x8CA856A4, 0xA040202E, 0x660C00C6,
39441 +0x8F0A8E62, 0xE2BA54DE, 0x4BD0C117, 0x1A1A3092,
39442 +0x086CAA3A, 0x2BBA5676, 0x89610176, 0x00ED2F97,
39443 +0xC72130C7, 0x5A053880, 0x7298E553, 0xD67971EA,
39444 +0x0D41E477, 0x2FA8285F, 0xB856A190, 0x132DB916,
39445 +0xCDFFDD11, 0xB5519A81, 0x1BC7001B, 0x97C824DC,
39446 +0xBB4C707F, 0x90166DC2, 0x42DFAB7A, 0x90E33184,
39447 +0x6C6B940C, 0xDC553814, 0xC4F5E7AA, 0x99434AE9,
39448 +0x82BB09D4, 0xCB0A7DA3, 0x3A8033AE, 0x054D3481,
39449 +0xE20AF761, 0x25F5F254, 0x7AD3AF3A, 0x23A34C29,
39450 +0xA19C57BC, 0x39B57AD9, 0x55E1EC59, 0x5ECA4198,
39451 +0xDB908BCD, 0x4871C3F4, 0xE7091328, 0x64A9B6EC,
39452 +0x1CCAB2F3, 0xEDB22423, 0xFFB6A717, 0x6FA13548,
39453 +0x361FF711, 0x24664017, 0xCBBF9970, 0x83A7B7DE,
39454 +0x9B704690, 0x01A0B877, 0x95041B60, 0xC048F3E1,
39455 +0xA31625F2, 0xE3DFBE27, 0xF657295B, 0x1F5C3AF5,
39456 +0x60EE1637, 0x575EDFAC, 0x725844FB, 0x242723D0,
39457 +0x04FA46FC, 0x1A8C3F44, 0x0E03A5FE, 0x8778079F,
39458 +0x606E4E1A, 0x7C0AF3D5, 0x9578B266, 0x63BCE765,
39459 +0xA8ED66D9, 0x9242377A, 0x817A5D5E, 0xD0981A98,
39460 +0xC07F2E7F, 0x0E66F84A, 0x3635F854, 0xD7AD8359,
39461 +0xDCF23230, 0xC1B9084C, 0xA7987FE5, 0xC3B27EB4,
39462 +0x1F747061, 0xFD278601, 0xB6ED3B5A, 0x9CEF8AA0,
39463 +0xA5023C46, 0xB49832AF, 0xB12055FD, 0xD85310E1,
39464 +0x2C19ADE6, 0xEFBB17A8, 0xC246A4C7, 0xBE4B2666,
39465 +0x13C2D7F9, 0x50063BA1, 0x9B00E02D, 0x335B9DF8,
39466 +0xD424AF25, 0xBAE40C92, 0xE87BD6B7, 0x384D1EB1,
39467 +0x8B91E8F4, 0x9E3FC6D5, 0x6BB1A51E, 0x21AE5533,
39468 +0xFCB8E713, 0x188B66B1, 0x6572E9ED, 0x98829178,
39469 +0x7BAE8CBF, 0xE00C32B4, 0xDAFC14D5, 0xEA8FC746,
39470 +0x2C8D712E, 0x89A05FC9, 0x9A274641, 0xAC2450AD,
39471 +0x2437784F, 0x3B1B80F0, 0x0B4A31FD, 0x277C0232,
39472 +0xFDDC6829, 0x3F3C606C, 0x0EF62352, 0x3D07D04A,
39473 +0x4E0939E8, 0xD59BF115, 0xA02752E7, 0x42BF7133,
39474 +0x9FA0939E, 0x64764109, 0xD5D03EBA, 0x3D4433A3,
39475 +0x1749B437, 0x137298B1, 0x677BE344, 0xA83CEF7E,
39476 +0x17813A39, 0xBC71823F, 0x2070E9A7, 0x3873AEF8,
39477 +0x5AF1E21B, 0x1F0CC692, 0xB8EFB04D, 0x1A1CC514,
39478 +0xADED6C3D, 0xDF35A8D7, 0x6D93275E, 0x9C362545,
39479 +0x62BF7583, 0xFC56D990, 0x0CD6A324, 0xF12A7939,
39480 +0x52587029, 0xD00D5F16, 0x51622555, 0x1178E887,
39481 +0x81E7BCC8, 0x92BB1C11, 0x097330E4, 0xCF8C5CAF,
39482 +0xD076D6BC, 0xBA292918, 0xF835A829, 0x4280A51E,
39483 +0x09CD7827, 0x11583487, 0xB8BA2CEF, 0xD598AE93,
39484 +0x99F4FD77, 0xEB151110, 0x1571B076, 0x63F2103A,
39485 +0x56C6BF44, 0x9E63B556, 0xFB981238, 0x5D8C978B,
39486 +0x9501D936, 0x82A1E971, 0xE5A4F7E2, 0xC6E3727A,
39487 +0x03329F07, 0x248ACDD6, 0x437E917B, 0x23B02B20,
39488 +0x73F76AA0, 0x75EA06C5, 0xD7C662B3, 0x267777F8,
39489 +0xDC96BF06, 0x54020346, 0xCBDF069B, 0x030133EC,
39490 +0xA7EF1C2E, 0x568959AB, 0x4FC31DE0, 0x3A22890E,
39491 +0x280F8652, 0x1BD8CB24, 0x9A8D92C9, 0x52718DE1,
39492 +0x12033FC7, 0xD48490CC, 0x681ADEE2, 0xF91BF7B8,
39493 +0xB8609B38, 0x34CF4BCA, 0x8F123290, 0x0D0F4FCD,
39494 +0xC4F43323, 0x2FC04F1C, 0x4669B890, 0x1E8D2A7F,
39495 +0x0658CAE6, 0x5489F3A3, 0x9CD362FE, 0xBA5190B1,
39496 +0x06A58820, 0x7A9AF759, 0xDC94E672, 0xEB284B85,
39497 +0xF8EFA022, 0x3837C379, 0x7C9E9A2A, 0xD2ED96BC,
39498 +0x5D1E4C7E, 0x97F2169F, 0xFC3C37C2, 0xE039EDF1,
39499 +0xDBE93909, 0x81FEAC6B, 0xFCD383FC, 0x170B91FB,
39500 +0x05BA3243, 0x8FB2ADE1, 0x52AFB984, 0xE8262E9A,
39501 +0x1E704638, 0x89B8DFD8, 0x18C0C641, 0x2760C7E6,
39502 +0xD3AFF3C9, 0xC4E3543B, 0x0C0B7910, 0x1DEF7792,
39503 +0x483D7194, 0x9AAF5864, 0x08607947, 0x626F0CF3,
39504 +0xC0F6A486, 0xEB4525CE, 0xA8BBA8F8, 0xE450DA14,
39505 +0x2DC4D114, 0xBCA527C9, 0x6682AA4D, 0xCBB48A5F,
39506 +0x1B474C99, 0x7F5B526C, 0xEC435C0C, 0x9E8D3E1A,
39507 +0x67D2EA29, 0xA3B7ADCD, 0x8328590E, 0x7345607B,
39508 +0xB6057588, 0x1A8B034C, 0x5C8CA534, 0x8115DC5F,
39509 +0x189C2ABE, 0xF1B92927, 0x78A3B62F, 0x4B621D49,
39510 +0xDC176A68, 0xCBD3C1DC, 0xD82348BB, 0xEEF05FA7,
39511 +0xC0DD3D83, 0xC1F2A7BF, 0xB2079D00, 0x14B5730E,
39512 +0x73203CD7, 0xA8672433, 0xA171FFED, 0x9F181200,
39513 +0x4E16A5C8, 0x56D8AC31, 0x73803D86, 0xD4685CA4,
39514 +0xE8DE9FE2, 0xA35D2CE8, 0x808CF3E2, 0x198700AE,
39515 +0x0034163F, 0x57BC76FE, 0x271ACF93, 0xAA3AF6D0,
39516 +0x37003A7E, 0x450B74F4, 0x157401CB, 0xB79DDDA8,
39517 +0xD60AB7A4, 0x3A4C8779, 0xB6990FC8, 0xA1668D5A,
39518 +0x05B7965F, 0x7814376D, 0xFA0D2D8A, 0xD97A1142,
39519 +0xE804DE3D, 0x4939089E, 0x78D40CAC, 0x01DEF5EA,
39520 +0x3DD1CADA, 0x96465956, 0x6358CFB6, 0xACE02DE5,
39521 +0xB4C9F6CE, 0xE9C95AFF, 0x70EAD28E, 0x58803693,
39522 +0x89EF9972, 0x58F0273F, 0xDB17A277, 0x0B082B98,
39523 +0xAAB13ABD, 0xE86381EC, 0xC18924D4, 0xE28D4348,
39524 +0xC21895AB, 0xE17073AD, 0x9417539B, 0xA043E5F5,
39525 +0x88FFD026, 0xD972F017, 0xD0C8B8D3, 0xB34F3D67,
39526 +0xC525E4B5, 0x0189A5A1, 0x59224A35, 0xAA18F2D5,
39527 +0xFC9E170C, 0x16D3795A, 0x35DB09FA, 0x1624DB1D,
39528 +0x4A6E059F, 0xC5C88A93, 0x9051D373, 0x4B12B09C,
39529 +0x4088AF39, 0x705394F6, 0x360F2BAC, 0x8A1F2420,
39530 +0x641D4FA5, 0xA78B78F9, 0xA5A5302E, 0x691D2108,
39531 +0x7CFB57FD, 0x1812FE68, 0x8A2BB5E0, 0xF181CA14,
39532 +0x1846848E, 0xDC044F67, 0x17FCCA28, 0x21D7C5AC,
39533 +0x4C43432F, 0xC457E26E, 0xB0C9ADD2, 0x791EE2B4,
39534 +0x620F27BE, 0x229E0B1E, 0x746B4FFC, 0x02038738,
39535 +0x1C7B971B, 0x05193430, 0x8645DBD7, 0x58678F98,
39536 +0x141E912D, 0xD89C587E, 0x9FD7B43F, 0x21851D56,
39537 +0x725311A7, 0x0605B1B2, 0xC18BF2B7, 0xC6F79EA9,
39538 +0xBD84A01B, 0xC9B7F2DA, 0x04E47EE8, 0x1C1A14F5,
39539 +0xBD5B4FF1, 0xE15FBC2E, 0xC4D43F01, 0x5D39AD4A,
39540 +0xBD3BD983, 0xB2314A4B, 0x8DABA67E, 0xB5263B5A,
39541 +0x9912F262, 0x82659C80, 0xC3610181, 0x3F229014,
39542 +0x2685532F, 0xCE4EC210, 0xF46AB09A, 0xFAFA69C8,
39543 +0xD1292944, 0x2EF880D9, 0xD03AAEAB, 0x0E83C435,
39544 +0x842C482C, 0xA70951A1, 0x0E4EA07D, 0xE0332D0C,
39545 +0x3EA27E55, 0x04721425, 0x7C8B56DC, 0x96391312,
39546 +0xF600D78C, 0xC850517C, 0xB3F9F2AE, 0x59A99351,
39547 +0x8D6AA838, 0xF586672E, 0xD81FE525, 0x3CEF31DF,
39548 +0xABDC7079, 0x6E1BB8F6, 0x6B45B87B, 0x9FD2CAC4,
39549 +0x648E357A, 0x6C57D30B, 0x23766B64, 0x8C8BD9C1,
39550 +0x9A29001A, 0x206F47E3, 0x5F423D75, 0x293A32C4,
39551 +0xDCC6432B, 0xA4280954, 0x457790B8, 0x11E84CEF,
39552 +0xAB11D0BF, 0xD04258E3, 0xFB44C0CE, 0xED8231B2,
39553 +0x0277A6B2, 0xD8E5C517, 0xCEDF4C8B, 0x19D90170,
39554 +0x20555532, 0xFCB610B9, 0x88D5F5A9, 0xD35DC77E,
39555 +0xEF5EA686, 0xD866959C, 0xF0886B56, 0x005CFB90,
39556 +0x582AD255, 0x7381289F, 0xC18CED4D, 0x444F0A6B,
39557 +0x9917AE56, 0x505A7BCD, 0xCBDC903B, 0x51EF0F3C,
39558 +0xC4E6AF5A, 0xB148AD2F, 0x609A124A, 0xB5DA89E4,
39559 +0x3A68C7D4, 0x98694F02, 0xE85B1766, 0x754BA5FF,
39560 +0x1296A58E, 0x27736843, 0x9B6280BD, 0x2686032D,
39561 +0xB428AC04, 0xB06DBA5C, 0x625FE034, 0xD4BCB25E,
39562 +0xC91C5B3C, 0x73BB70E5, 0xA26A479A, 0x73173229,
39563 +0x3AA1235C, 0xE16171D1, 0x42D0D42F, 0xFC624752,
39564 +0xF1F5DCC2, 0x1B6F20A9, 0xFF9D626D, 0xDBF052C0,
39565 +0x90E38D23, 0xFB72CC5E, 0x9186519C, 0xF2330093,
39566 +0xE5251385, 0xA0094977, 0xE83FA066, 0x2E389CE2,
39567 +0xD3A62E72, 0xA9422A8B, 0xC61CFD5B, 0x1B3A516A,
39568 +0x58087800, 0x3A47462C, 0x557DDD8B, 0x94FD21D4,
39569 +0xE1AEA942, 0x4B2CC532, 0xB2185B36, 0xDCA15259,
39570 +0x1D044D7D, 0x781317B8, 0x49CB13E7, 0xDAAFFBC6,
39571 +0x30A05644, 0x77B05F37, 0x065A567C, 0x94721C79,
39572 +0x47316C60, 0x58AAC7C9, 0x410081AB, 0x7D4A36FA,
39573 +0xCDF23455, 0x1873EF87, 0x186982B5, 0x7C78D9DA,
39574 +0x3567D966, 0x10FF5E8E, 0xDB88E5B3, 0xFF1D39A1,
39575 +0xB8A345A3, 0x7A7258F3, 0x9706B3CE, 0xB5ADCC26,
39576 +0x4561EF5B, 0xB002FBF6, 0xF3F4C6FA, 0x57EC75AD,
39577 +0xBCF37924, 0xBC05B0AD, 0x2AB19DAA, 0x0EBD25EA,
39578 +0xF335D08C, 0xDFF79E19, 0xDD86D418, 0xECE11951,
39579 +0xC06F4D50, 0xFD698DF8, 0xBA6192EF, 0x365A28CE,
39580 +0x74DEC0B7, 0xE971F67B, 0xBF89DD42, 0x1E683399,
39581 +0x164A7158, 0xA1E48475, 0xBE139E8E, 0xBDEBA7FE,
39582 +0x74E03AEC, 0x88EA9618, 0x9B0048C2, 0x68C1DD20,
39583 +0x8DC9FC85, 0x24B55E3B, 0x51C38BDA, 0x2ECD7B13,
39584 +0x54D66C89, 0x69A3EBC1, 0x4B4E4F13, 0xAD37B7DF,
39585 +0x030A1D8B, 0x85A114D9, 0x403BE495, 0xB5E40331,
39586 +0x316E7310, 0xB36AA494, 0xDBFFCB9A, 0x5C0E5DA5,
39587 +0x099BA9E8, 0x66826E9D, 0x0BC5849B, 0x1A20CBAB,
39588 +0x0744FBE6, 0x2CB52040, 0x8B88533F, 0xA8A44BF1,
39589 +0x62FEB4A8, 0xDB2ABC4D, 0x46F0B676, 0xCBD06470,
39590 +0xDB6D71EF, 0x5DC3551A, 0x71B31A5B, 0x046D4C7F,
39591 +0xC051A998, 0x1EC19FF9, 0xA9E21F9F, 0x7951E081,
39592 +0x78BCBA62, 0x91B623F2, 0x8EF6A81D, 0x1023755E,
39593 +0xCE47F5AA, 0x0EF27527, 0xE9E488D5, 0xD53E4A29,
39594 +0x78A276E1, 0xB2100585, 0x01208E3C, 0xA38BCAFF,
39595 +0x36221FB7, 0xB3C9194E, 0x51BD75D4, 0x9C8C73AC,
39596 +0x7ACA9964, 0x17890C94, 0x9FDA51F4, 0xC4FDF688,
39597 +0x2C8244B2, 0x0D834C74, 0x290973D3, 0x7F134553,
39598 +0x296D2FC2, 0x4E08ED27, 0x1C51E53D, 0x3D892F49,
39599 +0x945F76CC, 0x2E531E63, 0x71EE37E0, 0x9C47F346,
39600 +0x2D8D920C, 0xC3E465BA, 0x3A72D142, 0x5B6AB80D,
39601 +0x364C2AE7, 0x3B18389B, 0xB9442484, 0x5D687BB5,
39602 +0x97C65A4F, 0xC7DBE8BE, 0x0F840061, 0x5A73EA89,
39603 +0xCBBDD954, 0xAFE9CABD, 0x06ABDF95, 0xF139302D,
39604 +0x3804FEA8, 0x7CE6542F, 0xDE47B8ED, 0xD34BE509,
39605 +0x5EB9C9E1, 0xDC582534, 0xE77D7FC8, 0x2BEFED7E,
39606 +0x4EA26DFD, 0x54670B81, 0x665C4531, 0x5B7A7023,
39607 +0xA05D9A2E, 0x71BDDB2E, 0x9D51D8C2, 0xD8A665CC,
39608 +0xA9B87A22, 0x581D28BF, 0xF9D40373, 0xE04D8F63,
39609 +0x117B9842, 0x8868B9BE, 0x8397FAB9, 0xEF5CED75,
39610 +0xF70F90D8, 0xD3DFD3A6, 0x1779F576, 0x3059520D,
39611 +0xC38F4AA9, 0x6B7A6D0A, 0x4E73112A, 0x4FF9DCED,
39612 +0xAEA1383A, 0xBAB0AA93, 0x41DBCBED, 0x266775A6,
39613 +0x8EE0D5D5, 0xB522CB9E, 0xC6E5D0D3, 0x86E4C8FD,
39614 +0xA894642F, 0xF69821A9, 0x88B41798, 0x4585A188,
39615 +0x9D2130FC, 0xC5B18E0D, 0x6B92C9EE, 0x3C9289FB,
39616 +0x1F02CBB6, 0x31FA86DE, 0x1B2295CD, 0x5B4DA19C,
39617 +0x3134D8FC, 0xE5EABC44, 0xDF8C5095, 0xF6571881,
39618 +0x1F2FBD62, 0xE585FE61, 0x020CEDF6, 0xD70ABC83,
39619 +0x5F37746A, 0x6FDA3BF7, 0x5434E503, 0x44CF6915,
39620 +0x561B2393, 0xEA4A2251, 0xA988C080, 0xE47B1791,
39621 +0xD335CFBE, 0xEDA9DEE2, 0x4F70FB22, 0x83A2C29F,
39622 +0xF44FA002, 0x069D25EC, 0x4D5043F5, 0x887464CA,
39623 +0x661D1E9F, 0x98B856AD, 0x81A23FB0, 0x3693BD42,
39624 +0xCE0AEB0B, 0x1F6E8322, 0xCBDF571B, 0x93688909,
39625 +0xFA16A774, 0x25834437, 0xEE77FA98, 0x8DC68C60,
39626 +0x155A8760, 0x22B8FCA3, 0x1B1BB054, 0xCA3AFFCA,
39627 +0xC8EACEA4, 0xC86BADD9, 0x473770AB, 0x41D6E398,
39628 +0x568B397D, 0x065C0BE5, 0x51D38A0D, 0x3BB3A0E1,
39629 +0xBC386DCB, 0x7DCBA6B0, 0x19007254, 0x3F4FC726,
39630 +0xF27DAE85, 0xF7FDA72A, 0x6D0B5C07, 0x64A0ED12,
39631 +0xE26D8878, 0x210E4F6B, 0x65F92C0D, 0x4E4E2CA6,
39632 +0x5E479D49, 0x7B287050, 0xE9A4836C, 0xC3A111A2,
39633 +0x9B90D6FD, 0xA5F362E0, 0xADC9526B, 0x79B736E9,
39634 +0x72A9A57B, 0x181B4E70, 0x5236F32A, 0x5567E3C9,
39635 +0x23EFD063, 0x87113163, 0xCDF6D4F4, 0xF53A8722,
39636 +0xB70CF941, 0x757F40C8, 0x6A652BE7, 0xD71DA5AA,
39637 +0xF87D51C2, 0xB4A68E16, 0x763D8FEB, 0xB6DE5436,
39638 +0x12184DCD, 0x38D1DE90, 0xB39E5209, 0x1600492A,
39639 +0x073AE8F5, 0x0366AC0E, 0x1AD5014F, 0x398E0873,
39640 +0xD653928E, 0x30B5B4DE, 0xAC68A06E, 0x8DAEF4D3,
39641 +0x76A880D8, 0xF3B3BCC5, 0x2B631F58, 0x340914DB,
39642 +0xB4771DCC, 0x7C9D4A43, 0xAFDB1138, 0x014B5A83,
39643 +0x0D44185D, 0x20C89576, 0x994B4367, 0xA84BD792,
39644 +0xB2E17CB1, 0x00CE5214, 0xFB93E54F, 0x03CCA7F1,
39645 +0x956A82E6, 0x22329A71, 0x2A634374, 0xF18B7AD9,
39646 +0x1F168BC4, 0xC2CB1EDC, 0x8E0AF6CD, 0x211AF22A,
39647 +0xAB5DA374, 0x63F1F25E, 0xEC58D4CC, 0x48C65C46,
39648 +0x5A7F7574, 0x7BA60047, 0x279EF299, 0xE0B77F48,
39649 +0x647A03C3, 0xAE7C4D8F, 0xF65149D0, 0xAC9EF228,
39650 +0xCD90B1CD, 0xCEEDA54C, 0xD8FD0A6A, 0x8D7C2291,
39651 +0xB38EF6C1, 0x7F38E676, 0xDADD0A8F, 0x1125713C,
39652 +0xAA78A299, 0x54033F20, 0x199C76C5, 0xCAF82A17,
39653 +0x16F2EE8B, 0x20071D0F, 0x2CA000F8, 0x0178A24B,
39654 +0x0029EE46, 0xA9D8C738, 0x123D2BBD, 0xEF7CAC52,
39655 +0xBD241869, 0x435F8FF7, 0xB573A190, 0x402BFB2F,
39656 +0xFDA3097C, 0xF3765889, 0x68E2C7D5, 0x4C26F858,
39657 +0xD6814D1F, 0x6B043C7B, 0x173DB091, 0x95126C7C,
39658 +0x0FE8E1BE, 0xFDEB233C, 0xB979B0CB, 0x00E00659,
39659 +0x19952E52, 0xA0976F7E, 0x02FB462C, 0x798815C8,
39660 +0xA2504EFE, 0x0F4811AD, 0xBA8F122E, 0x5EE5864F,
39661 +0xD39B6799, 0x5319F6A3, 0xF6A66685, 0x988D106F,
39662 +0x7ABA5220, 0x0320384B, 0x4DE48C79, 0xF5CB36E6,
39663 +0x2B33270F, 0xFF4E6965, 0xD4D843D5, 0x7EEE861C,
39664 +0xA96AE5EE, 0x310E5215, 0x6D20068E, 0xB149AE8B,
39665 +0x0997D9EF, 0x5043FFFA, 0x0516E2B6, 0x3FCCDA32,
39666 +0x8E604A04, 0x23012778, 0x9444A474, 0xB7F5DC24,
39667 +0x3A58E6FB, 0x17B759FB, 0xF29C1EE7, 0x8893D2D1,
39668 +0xC6CD235B, 0xAAB0CBCE, 0x2D84474C, 0x8A0BE027,
39669 +0xFDB87FB5, 0xE6B507BD, 0x19B41927, 0x783FF4DA,
39670 +0x485A1D5D, 0x8ED285C2, 0x25AFC4C5, 0xBF0D662B,
39671 +0xC4238532, 0x4339FCCF, 0x14A784B6, 0x71665819,
39672 +0xED76E473, 0x5F1BAE9E, 0xD0AEC17B, 0x4CE78814,
39673 +0xD3609F61, 0xD4E49EB0, 0xE4E3EFDA, 0x9B7CAD1D,
39674 +0xEF01ABB7, 0xD137BEE9, 0xEE87A81D, 0xD4B204FF,
39675 +0x00B25737, 0x2770FBD1, 0x174AFF7F, 0x0A77A21C,
39676 +0xF1B370E7, 0x9C093CB0, 0x080C1FFA, 0x83CE92D9,
39677 +0x1707470C, 0x3303479F, 0x25F1B6AF, 0xF40EEB7F,
39678 +0xB98A1677, 0xA54A1BA2, 0x43B4144A, 0x2F092A35,
39679 +0x33286A77, 0xA0AB9C93, 0x4F8D70DC, 0x3A47BF6F,
39680 +0xB6209AB5, 0xA4C94557, 0x5E757055, 0x706EAD9F,
39681 +0x467BC02A, 0x6472A857, 0x42055C57, 0x66F2BA60,
39682 +0x33C0536F, 0x3240BFBD, 0x3DD74E6B, 0x1F58A552,
39683 +0x822E9577, 0xF49BFE77, 0x5490DC6D, 0x1D32BBA0,
39684 +0x1C30B072, 0x78A4A5C0, 0x1EE88A57, 0x97CAC3C8,
39685 +0x9912861F, 0xC916BBAF, 0xFC3A7F0E, 0xCA5E1F3A,
39686 +0x630F09CD, 0xF6C8C210, 0xF0A12A72, 0xF3148619,
39687 +0xDF1672E1, 0xFCE5C390, 0x29CAE554, 0xE984A45C,
39688 +0x8A1F0A3A, 0x6A02C707, 0x8CFB3ED6, 0xC0A741BD,
39689 +0x7A871FE5, 0x91021A69, 0x505FB05A, 0x8F85227B,
39690 +0xC300ACF1, 0x0A1B201B, 0x224614B2, 0x54A23576,
39691 +0x5360A5BA, 0xDCD23A31, 0xF98DF638, 0x79FF79D7,
39692 +0xEAC8EAC3, 0x4D22C65D, 0xDFFBF1D9, 0x55FD8848,
39693 +0x4BFD2347, 0xE2A08287, 0xE6A48824, 0x80625EA9,
39694 +0x71AB3F7E, 0x99B84DE5, 0x6512ADBE, 0xFBF24C47,
39695 +0x3EEF2564, 0x23DF9F1B, 0x24BE5199, 0xDEDD72D5,
39696 +0xA2FE063B, 0x4FE520B1, 0x9E4E7BBE, 0xD615BDBE,
39697 +0xC14E8184, 0x40F86FB1, 0xD403A65A, 0xC5AF6386,
39698 +0x412F8434, 0x6D6012B0, 0x4EC57107, 0x3F76AF19,
39699 +0x54A305BD, 0xEA9C4EB2, 0x584E0176, 0x20759805,
39700 +0x1A16C84A, 0x50BB10DB, 0xE610AF45, 0x98CF1EA0,
39701 +0x3F8C7756, 0xF9056BE0, 0xBAA66B7D, 0xF7076DCF,
39702 +0x67F1994D, 0x92BFEB62, 0x86FBDE17, 0x389DB311,
39703 +0x2A171F5A, 0xE14898B1, 0x4D11723F, 0x29889062,
39704 +0xCBF3DD79, 0x2B7468FC, 0x4FB93770, 0xC5FCEFE8,
39705 +0x8FEE6678, 0x9F4ABA9C, 0x6A6B23E1, 0xFEA7077F,
39706 +0xC835F734, 0xCA67807C, 0x1BFBEB49, 0xB8B1E842,
39707 +0x6A850623, 0x001C1E8D, 0x782AC01E, 0xA28A72D8,
39708 +0x6CD66FC1, 0x77EF6F13, 0xFF40D7CF, 0x4A163DFB,
39709 +0xDB21AA89, 0x29D03A9E, 0x3A4D1D57, 0x7A89CDC9,
39710 +0xC5623E10, 0x8A444799, 0x1F620DF4, 0xFF876758,
39711 +0xC9DEEF2E, 0x7F86911E, 0xE3196093, 0xA00EB422,
39712 +0xCDB1743F, 0x4AAD1988, 0x70167700, 0x70595C5F,
39713 +0x8E648013, 0x401D8770, 0xC762F0E7, 0xDB776926,
39714 +0x2BDC55B3, 0x8F4AD2C1, 0x1A2EEB50, 0xBD4BF2A4,
39715 +0xA43FFE90, 0x752935E7, 0xB02C7801, 0xDD4CD3DB,
39716 +0x3815C394, 0xAF427695, 0x7455A8F9, 0xC444C7EC,
39717 +0x9BC9B2C5, 0x08423BA7, 0x5D91ADD8, 0x59D866DB,
39718 +0x0AD32258, 0x7BC397F6, 0x0EF7DB59, 0xC1034320,
39719 +0x79073406, 0x991A12B9, 0x9D6776A0, 0x6348A5EB,
39720 +0xBD98CDC4, 0x81A6C5C5, 0x76A3ABA6, 0xFA9CDF77,
39721 +0x97772B59, 0xD987E42B, 0xA4B893D4, 0x61F78E38,
39722 +0x82567691, 0xCB91CD58, 0xEEFA69AE, 0xF7D51178,
39723 +0xA436C578, 0x99E86E08, 0xA8C3B16B, 0xD609054F,
39724 +0x1E0ADCE8, 0x5DF6EF20, 0xEB3CC45B, 0x9FAEA24F,
39725 +0x97F57F19, 0x66E2713F, 0x42A423C3, 0x2A21B17C,
39726 +0x6A4C6B40, 0xFA0F4F2B, 0xD1F3F64A, 0xD0AAFA50,
39727 +0x767D3AC2, 0x837E626D, 0x3B21279C, 0xCAE18855,
39728 +0xFA8CA385, 0xA91BDE45, 0x1A953327, 0x733948CC,
39729 +0x158B8CD2, 0x904AC43D, 0xA6BC8F82, 0x55F027DA,
39730 +0x95B6BB32, 0x9265FF80, 0x8EEF0D24, 0x28F6796E,
39731 +0x1D736700, 0xB621D4D6, 0xAB2F1A4A, 0xECD7DB83,
39732 +0x35CAD419, 0x60604917, 0x5DE51335, 0xA3D7E122,
39733 +0x685D04D4, 0x494739D4, 0x0060722C, 0x59149718,
39734 +0x03C9F144, 0x43328818, 0xBB1AE189, 0xCA7B9250,
39735 +0xC835666D, 0x83950220, 0xD774405F, 0xF6F4FCCE,
39736 +0x0E38794D, 0xAF184A7E, 0xEF66E15B, 0xA0C2A74F,
39737 +0x876112D5, 0x7D68C9CF, 0x8902011C, 0x6AB0E128,
39738 +0x2A515520, 0xA99D1DA0, 0x9EACEB4D, 0xB669AA8F,
39739 +0x6F96DCE2, 0xCFEB5CDF, 0x46EB36BD, 0xEDDF8317,
39740 +0x4FA30C3E, 0x9541A8A1, 0xA5F75533, 0xEFE1FEF6,
39741 +0x7F21B481, 0xDA11D5EA, 0x64642069, 0x083D2137,
39742 +0xDF508726, 0x8F6CCC4B, 0xC5412D0A, 0x6A9F6BEA,
39743 +0x3E3CC54F, 0x078BBB1E, 0xA6047468, 0xF1FA39C2,
39744 +0x26143435, 0x90132EB3, 0x4216580C, 0xF6773B8C,
39745 +0xA6B188BF, 0xE3B49523, 0x89E4563F, 0xD0B16538,
39746 +0x2D9079FD, 0x69ABDE36, 0x669AC5EB, 0xD0618DD9,
39747 +0x5080BFEF, 0xADC056D6, 0x72402C9C, 0x0AE79E07,
39748 +0x8D6DF48E, 0x0502837E, 0x79BA17AD, 0xE4871C89,
39749 +0xC4554CD5, 0x23FCB2A4, 0x646FA999, 0x212A9DB8,
39750 +0xBD23DF0A, 0x890B5FE6, 0xB5D03292, 0x9FA3FD59,
39751 +0xD612F8B1, 0x611365FB, 0x7E7C9FAB, 0x024194D2,
39752 +0x46C2C617, 0xAEB0FAD9, 0xAE5D3A7E, 0xEA8B0ABB,
39753 +0x760730A4, 0x50443E76, 0xECA64341, 0x538E5256,
39754 +0x8A8505F5, 0xE0E4DC29, 0x105DC564, 0xC73D93D9,
39755 +0xE3F27C90, 0x8CC01FC8, 0x400D0F76, 0xDCD01130,
39756 +0x1E3416D4, 0x4C612E03, 0x0BFE7A5C, 0xFDB15334,
39757 +0x5326A77F, 0x99549BDA, 0xDDE90BAB, 0x920BD872,
39758 +0xC4B4F5DF, 0x7B39BAC2, 0x777C6694, 0xB4971103,
39759 +0x9E7806A1, 0xD3141F2D, 0x2B40BAD0, 0x74AF248F,
39760 +0xD1AEED43, 0x2F453736, 0x1880104E, 0xF9CD502F,
39761 +0x7691FE59, 0x39C3FEC7, 0x72EA7BF2, 0x0C94BAB5,
39762 +0x35D6F509, 0xAE86AC96, 0x0624C181, 0xA69DF699,
39763 +0x5991FCE3, 0xAB20D4F1, 0xF30F1BC9, 0xB094CF62,
39764 +0xA3B5A732, 0x3BC8C32F, 0xE7710370, 0x429A8D96,
39765 +0xD8913A42, 0xCFBD0E4F, 0x710B7078, 0xC6501E93,
39766 +0x241224AF, 0x978D2320, 0x8EF1064B, 0x273FAE07,
39767 +0x316EC02C, 0xB3C16C0B, 0x8249C245, 0x21AD11CB,
39768 +0x6265FE57, 0xA9F1D5FC, 0x0B52F1CD, 0x0381D983,
39769 +0x2931D6B1, 0xD126CD94, 0x69D95197, 0x7CFB6AD0,
39770 +0x46E6D50D, 0xE60BCBD2, 0x72FBB436, 0xC971A4CA,
39771 +0xA580B9B9, 0xBC823514, 0x5D15A840, 0x87A91622,
39772 +0x63490D13, 0x277189A8, 0x22CA2EDC, 0x1C56456D,
39773 +0x1B5EB836, 0xD8BBF2EB, 0x20F56DFB, 0x99321E4B,
39774 +0x9238B783, 0xE5E5D085, 0xC81DAA11, 0xEF8DD032,
39775 +0xCEC28645, 0xFC40AAA5, 0xBFA5FC68, 0x1C2CF7C7,
39776 +0xC0DFD194, 0x5AB730DA, 0xE3FB56A9, 0xA0AD00E9,
39777 +0xB7BA2E2E, 0x579C8722, 0x04AA07FD, 0xF55C6C5C,
39778 +0xE56CD6DD, 0xA7DA5100, 0x2A6BA1E5, 0x9B7E5104,
39779 +0x81410420, 0xDC6130A8, 0x3EC8935B, 0xCC2EC782,
39780 +0x142344EF, 0xF016E0CA, 0xA3ACFA8E, 0x019A7009,
39781 +0xA0DAEC5D, 0xFA503565, 0xC907794E, 0x77AA4E69,
39782 +0xB45B7E54, 0x929A056A, 0x46AA4AE1, 0x55E56EDF,
39783 +0xFDD9D726, 0x35744D5C, 0xD6854700, 0x9A6E1EEE,
39784 +0x0B00F6FB, 0x6BE65BFB, 0x9CF98DE0, 0xD80ACE66,
39785 +0x1E5300E4, 0x745338DD, 0x4CB925DE, 0xB369B0D4,
39786 +0x7A53A606, 0xD2B96E54, 0x88F96B30, 0xB72C3E19,
39787 +0xC2A41177, 0x6206F879, 0xC1F6CD78, 0x879DA74F,
39788 +0x763F9417, 0xD109B779, 0x6A58B34C, 0xDCD7C21A,
39789 +0x1B0A0154, 0x45EE3A9C, 0x62C60161, 0x79E47020,
39790 +0x42250A39, 0x9E2C2C59, 0xCE4F6206, 0xC2970386,
39791 +0x983CC2C3, 0x0DAF0A85, 0x388626DA, 0x06A56D27,
39792 +0x9223203A, 0x96E0148C, 0x22F0D052, 0xD5F1AA88,
39793 +0x394BC8B9, 0x03CF58FA, 0xC0B1073C, 0xC16B35C7,
39794 +0x7B7CF9F8, 0x2E3A24A5, 0xA19089C9, 0x4223FAE9,
39795 +0x7751D977, 0x802E7062, 0x6D3651EF, 0x39E9B52E,
39796 +0x946D07F8, 0x8E2EAEB7, 0xF9279A65, 0x14DEE911,
39797 +0x8B92A149, 0x9611756E, 0x067DD22D, 0x59907967,
39798 +0xB3417E3C, 0x3B72AB7A, 0x825D87C7, 0xCE5FA852,
39799 +0x5D88C5F8, 0xE792BF66, 0x28DB3A4A, 0x118CA3A2,
39800 +0xCC86284E, 0xA0AC4AE8, 0x33394B70, 0x974F96C2,
39801 +0x86ADD3B5, 0xC87295B9, 0x1447D26F, 0xC9ECAE80,
39802 +0x10CA01D7, 0xE04ECC68, 0xAE56597E, 0xAAA1248C,
39803 +0x81C35460, 0x0087CA93, 0x943AABA2, 0x0AFCBFAA,
39804 +0xEA77D5AB, 0x020D36D6, 0xF1CCBBB6, 0x8DF1426F,
39805 +0xAE726D96, 0xA6E4C915, 0x58F15F91, 0x5B696D6F,
39806 +0x00042B30, 0xC6AC90C3, 0xBD8E0187, 0xE73ED2E2,
39807 +0xCEE64CF6, 0x48B56436, 0xA33994CA, 0xB3E3B7AB,
39808 +0x060D5E14, 0xC1B176C6, 0x4A76C391, 0xD7C8DB1D,
39809 +0x333E4998, 0xC20BAC4F, 0x523BE3E0, 0x237E87BC,
39810 +0xE6CDBEC0, 0xC506F19C, 0x262C0039, 0x7F85A4AC,
39811 +0x46160693, 0x2EA1BC36, 0x4CAC0DF2, 0x0066B83F,
39812 +0xBCBC778D, 0x7F4AB507, 0x99CADB2F, 0xC95520D0,
39813 +0xC5CBF067, 0x903ECD68, 0xF5D7B0FC, 0x08198C8F,
39814 +0xA17879EC, 0x18C2723D, 0x5A4D6D37, 0x080198B6,
39815 +0x3525186C, 0xEF8BE144, 0x44B05851, 0x28B5025A,
39816 +0x0FDF085D, 0xDEB1F249, 0xA7C00F42, 0x7614A735,
39817 +0x3BEBF467, 0x7871D305, 0xD4F63809, 0x9D044079,
39818 +0xE585D3D6, 0xA89952F3, 0xF42C2B8E, 0x04179DA4,
39819 +0x00A6CE87, 0x96CA92B8, 0x9DF2B156, 0x3ECF18BC,
39820 +0xDE2509CF, 0x5CD85FCA, 0xF8A7CEEF, 0xCB7DC25E,
39821 +0xF2847474, 0x35B501D1, 0x137BBB3E, 0x451E1BB9,
39822 +0xD360D811, 0x792B3464, 0x4BF89A81, 0xA7E9C450,
39823 +0x628BCB0C, 0x2AF7037D, 0xA45F628E, 0xF0EC875D,
39824 +0x9CE3677D, 0x2CD0EA59, 0xA50A0217, 0x8BA45DD7,
39825 +0x1735ACF1, 0x5804C4D9, 0xE619B352, 0x948F44A8,
39826 +0xA9BF5C7F, 0x614D4F6C, 0x6D9FCA79, 0x29717B0C,
39827 +0x50BF2D5C, 0xD5847B52, 0x0D4FAAA5, 0x1AABCA5D,
39828 +0x779399E0, 0x58A90CD6, 0x37EC2615, 0x61B68C07,
39829 +0xC49F4AEE, 0xFAC4D897, 0x9C68CC6D, 0xBB3352F6,
39830 +0xF933436D, 0xD310078E, 0x2FBFA17A, 0x3D839C4C,
39831 +0x186E69EF, 0xCBE7CC6A, 0x7434231A, 0x80F8130B,
39832 +0x58CD7EA2, 0x2E46D714, 0x367286E2, 0xA6E2044D,
39833 +0xC2ABC50A, 0x6FEDC9C4, 0xE2F26F03, 0x3B030D52,
39834 +0x3674D8E7, 0x9096DF78, 0x90902892, 0x44A32190,
39835 +0xD08D2649, 0xEFE0ED0A, 0xCE1BF4E9, 0x62C19753,
39836 +0xFBF3D1A8, 0xD4AA5390, 0x4B32E77F, 0x9894F05E,
39837 +0x41B9DBBE, 0xE9B09561, 0x46C883A0, 0xADD5D60F,
39838 +0x69CE5BBE, 0xFD29CCF1, 0x2F209371, 0x4C6716E9,
39839 +0x31E9A09F, 0x04089795, 0xB9EF9025, 0x97C6267D,
39840 +0x63823150, 0x3AB346BA, 0xED3E0579, 0x85FC7062,
39841 +0x37B35761, 0x4A32B6CD, 0xC38EB479, 0x203642CC,
39842 +0x568FCAD7, 0x67D92B5D, 0xE51B8C3E, 0x02104078,
39843 +0x026BC607, 0x5A06CDA7, 0xE27435D0, 0xC7C20CE7,
39844 +0xFEA74022, 0x77310076, 0x35C6F953, 0xE1B199C5,
39845 +0x262F139B, 0xFD2FE2C7, 0x3EEE02EB, 0x915A873F,
39846 +0x2DE4AB8E, 0x2421DC15, 0xD1DD0D9E, 0xDE02B5AD,
39847 +0x151C76CF, 0x798B90B7, 0x82EDDF4C, 0x795E18CF,
39848 +0xF09CEC5A, 0x070ADF8F, 0xCDCF5232, 0xD498D43C,
39849 +0xB4FC2662, 0x25678E54, 0x5D200482, 0xC31F21C9,
39850 +0x35E5AF29, 0x8CC0E603, 0x995351AD, 0xD8EB54F6,
39851 +0x564E35D9, 0x0C13E321, 0x34CFA33D, 0x33D1E5F9,
39852 +0x2EAC9748, 0xFFB950D6, 0x2032206F, 0x4F871AE3,
39853 +0xBD464C61, 0x06356EA0, 0xA15A290D, 0xA78456D0,
39854 +0xD2F4EE88, 0x4D835908, 0x15DC87B3, 0x79EDB6C3,
39855 +0xAEAF0F9E, 0x5C3E7EF9, 0x639A099E, 0xD375D8DA,
39856 +0xB718510B, 0x090DF965, 0x9C8A362E, 0x25AD10BB,
39857 +0xF9A42BE9, 0x8ADE3DF0, 0x5527424E, 0x301F0D0F,
39858 +0x2F691C9A, 0x534FE1FC, 0x7D406016, 0xF98820A2,
39859 +0x4D204871, 0xED145173, 0xD67ECE9A, 0x35F9F990,
39860 +0x8ED4D787, 0x1F3F46E1, 0x5A68F171, 0x9A9D28B0,
39861 +0xE726BD5C, 0x8119228D, 0x0ADBA4D2, 0xEA243204,
39862 +0xE523C0D6, 0x261E3664, 0xB2D1211C, 0xB4D9293A,
39863 +0x9C89D924, 0x15A6A3A9, 0x0D8C6C66, 0xEC04AD36,
39864 +0x0CDF0F98, 0x9262C7DF, 0x8EE0E09B, 0x6B929EE9,
39865 +0xDCC713BC, 0x75FD34FF, 0x2784E694, 0x23C23044,
39866 +0xB7B04F09, 0xF10B753E, 0x2EC774DA, 0x470BE72E,
39867 +0x054510E9, 0x9C7DDF10, 0x1466C277, 0x9F52F493,
39868 +0x7F298608, 0xF1BA10D3, 0x8847A319, 0xEE8A63CA,
39869 +0x8E64B34E, 0xEBB66933, 0x575ADB24, 0x041BFD76,
39870 +0x727ED364, 0x00F4A008, 0x8F5EDA92, 0x21477637,
39871 +0x0B360617, 0x56DC8978, 0x27F88944, 0x69B799EF,
39872 +0xEA1E943B, 0x6FDD60B0, 0xCE2AD89F, 0xB98CCF43,
39873 +0x2A3796BF, 0x4DD02535, 0xC6B524EA, 0x6B173341,
39874 +0xDCE0A457, 0x91770646, 0x57A8D138, 0xFC218331,
39875 +0xDC6B712D, 0x14C0B3B9, 0x30CA09AD, 0x759EB942,
39876 +0xBC9634AB, 0x8F92A7E5, 0xF7F85B53, 0x6C831B3B,
39877 +0x56A75B18, 0x43DB9F1C, 0xF81FC212, 0xB8EB9026,
39878 +0x78A74B51, 0x870655E3, 0xA17B536D, 0xBDE866CF,
39879 +0xFC609F11, 0xF34A7016, 0x7C4FD4DD, 0x236312F6,
39880 +0xB50520A8, 0x4BEEA2C3, 0x2B690BA3, 0x18701667,
39881 +0xBD791FA9, 0x236D36CF, 0x49E576CC, 0x316A77E1,
39882 +0x93E9B0BF, 0x52715603, 0x83B9AAF2, 0x0F8F2A80,
39883 +0xA87F764A, 0xD2079BEB, 0x48A24AB6, 0xAC370950,
39884 +0x3077FB2F, 0x4BAFF3F5, 0x1A79926D, 0x8B369956,
39885 +0xAD78F739, 0xED88CE42, 0xB96A7C15, 0xA7BBA2EE,
39886 +0x47CC3233, 0x804DE962, 0xE0B431A3, 0x4A8257B8,
39887 +0xA4B0E8E2, 0x2FFC49B8, 0xF0CDF5E5, 0xF089C32A,
39888 +0x46328288, 0xEACBC054, 0xA48CB5CC, 0x77996530,
39889 +0x83A4E184, 0x3C2F47D9, 0x5106177C, 0x33F1A787,
39890 +0xA2266E7A, 0xEBC426C8, 0xD7E8ADD3, 0x2DF40477,
39891 +0xF9E8D7BD, 0x80BD8EAB, 0xE61CE55F, 0xF6A7EF6F,
39892 +0x5C67E1C0, 0xFBD0088A, 0x7ED37B24, 0xF5BFD58E,
39893 +0xC29CFB0F, 0x61ECE08B, 0xA776CFD8, 0x9E0F3A05,
39894 +0x8FC8B02F, 0xFDF82702, 0x028C2F2C, 0x169D3094,
39895 +0xE4AA3228, 0xF2CD142D, 0x9C70574E, 0x057BFE78,
39896 +0x782B9039, 0x0D01311F, 0x97552050, 0x6A097F2F,
39897 +0x1B3242B8, 0xF43F32FB, 0x96004287, 0xC3DC0939,
39898 +0x4215A0E1, 0xACD1A28A, 0x189932EC, 0x9BBA0475,
39899 +0xFA154E5B, 0x4B4E8D01, 0x4D6B18B1, 0x31545B3C,
39900 +0xC849C52D, 0x60958B9B, 0xE92CF090, 0xAC3E1B58,
39901 +0x251D02A3, 0xFAEE4F8B, 0xB1CF6CCC, 0xC2A0D8B0,
39902 +0x0501DF46, 0xD0369D94, 0xF3E11479, 0x397599F8,
39903 +0xB90064D2, 0x341F6D57, 0x31F0141A, 0x2F899029,
39904 +0xBC9EF6E8, 0x13B47347, 0xB93D59BB, 0x556E990F,
39905 +0x5727BDFC, 0xBA9F5121, 0xD67BE7CA, 0xB167E84D,
39906 +0x2C0ED0FF, 0x251FFD4A, 0xC98719F2, 0xD379D976,
39907 +0x8B3A0A9B, 0x40BA5F66, 0xE40A93E8, 0x2F89FC04,
39908 +0xFCBAFDD4, 0xF2424270, 0x1BDBDD15, 0x7F1459B0,
39909 +0x5ACB6C6A, 0xFA20719F, 0x2F16FFB4, 0x820DDE50,
39910 +0x468AAC15, 0x7816134C, 0x978D9570, 0x6745CD6D,
39911 +0xC1E768C1, 0x15E243B5, 0xBA30AD61, 0x483FB6FE,
39912 +0xCAA17D0F, 0x2F8F0974, 0x34AB68B4, 0xB3E864B0,
39913 +0xC1DA3828, 0x5DAD43B0, 0x72D13B81, 0x01F274AB,
39914 +0x9C0651AD, 0x0FC30C10, 0x0E7AA3CB, 0xDBE6B9D9,
39915 +0xF423B9A7, 0x457B4E32, 0x40E8E269, 0x91DA042A,
39916 +0x9DBF41E9, 0x308C0F2E, 0xCABFAC0D, 0x0E2C86B2,
39917 +0x117BC3C6, 0xEEA538F8, 0xF31585DF, 0x0DF50281,
39918 +0xEAA9601E, 0x8F408AFA, 0xF1144F9A, 0xA2AB2ECD,
39919 +0xACB88685, 0x6F4EFFBD, 0x81EEF886, 0x46B02240,
39920 +0x3C09D916, 0x4F0DAF68, 0x8337B3E3, 0x9A011BA6,
39921 +0x4C63AC66, 0x2FCC669E, 0x0C7D15BB, 0x51279D9F,
39922 +0xC1354779, 0xEFF940AF, 0xA956CB37, 0x0DB797E2,
39923 +0xE665EE55, 0x79AF879D, 0x21BBC902, 0x30B264BF,
39924 +0x411CDC98, 0xE453389F, 0x47C2C197, 0x3E6015F8,
39925 +0xF9E7AA2B, 0xA9302474, 0x04C6888F, 0x4D118BF9,
39926 +0x0DB7AAC0, 0x52A38EDB, 0x4DAB22F2, 0x7DBB6EAB,
39927 +0xD4D17851, 0xFD944314, 0x40C5838C, 0xBA6EB0EF,
39928 +0x9AA287A5, 0xF6D236F0, 0x41D9E2BA, 0x6968D776,
39929 +0x31B1D129, 0x42C3F963, 0x27CCAD30, 0xCD61BF4E,
39930 +0x2C7DABAB, 0xA78A9CC3, 0x7F856B6F, 0xB6D444A5,
39931 +0x90CBB312, 0x95611781, 0x4916D531, 0xC496C30E,
39932 +0x706D0CB7, 0x35D0064B, 0xFE26C36A, 0x6211F14B,
39933 +0x2C2340BA, 0x58633567, 0x06B6BA8E, 0xA7EC3D8D,
39934 +0x1071B0CD, 0x388EEFA8, 0x60D8FB1C, 0x5F99D147,
39935 +0x52CA6EBF, 0xFA73602E, 0x0376C15C, 0x3C91B57D,
39936 +0x9386AF17, 0x14A35A1A, 0xBDB42A39, 0x0E83C257,
39937 +0xD4C5C775, 0xA607FA46, 0x91B9AD40, 0x7623C5D6,
39938 +0xE3D53E6A, 0xA3C663E7, 0x5AD39BCE, 0x03B58394,
39939 +0x38862C7A, 0x01D50B9F, 0xEAAB38EC, 0xAB3DFB8B,
39940 +0x06795385, 0xB17F485E, 0xE2F57914, 0xB79A3BAA,
39941 +0x13DA7886, 0x7136C7EB, 0x5E748AF7, 0xD34F16FC,
39942 +0x968F6701, 0x99C5D7BE, 0x530F7FAC, 0xCDF5D567,
39943 +0xE31DE0D3, 0xCF93BC68, 0x34C578AA, 0xA201F761,
39944 +0x5CB8DC00, 0xCA24DB98, 0xF8AD7E4F, 0x808EC476,
39945 +0x603BA751, 0x489555C6, 0xF2A03FF0, 0xD2461E9A,
39946 +0x102C33BE, 0x7673933C, 0xC11A2424, 0x6A23C8C6,
39947 +0x69499812, 0x19AA8510, 0xC8CDA75F, 0x34B5216A,
39948 +0xD87F7420, 0xC8CEDB53, 0x8DF11BA2, 0xB10911C6,
39949 +0x3F1E5955, 0xF075F4EB, 0x17874FC5, 0x0D55685B,
39950 +0x5EE521E5, 0x46C72924, 0xF8540210, 0x5D5E4C5C,
39951 +0xE87A133C, 0x91633DC9, 0x36B54D5D, 0xA8B5D440,
39952 +0x7DB7D6C4, 0x5FA82C17, 0xAD679039, 0x86B3B839,
39953 +0xDF5121B7, 0xC08B768A, 0x338A512F, 0xCF9A4F9A,
39954 +0x5DEFBB5B, 0x4C9301B2, 0x08023702, 0x5B1D7E28,
39955 +0xEC800505, 0x3A869E80, 0x4C50C8AE, 0xB1AE9064,
39956 +0xAFFA34EB, 0xF2F006B9, 0xD8A9A3D1, 0x2C6C2134,
39957 +0x677EE648, 0xBB6B6D5C, 0xA285136C, 0x6C47BF4C,
39958 +0xAF158DC1, 0x0EF75E2B, 0x5B9C74D5, 0x9B8D4BE3,
39959 +0xE495BE19, 0x5940B228, 0x55E62656, 0x3247E060,
39960 +0xBF7094CD, 0x1C1AB380, 0xECEA2275, 0xB6DD8251,
39961 +0xCCA39DD2, 0xAB85D992, 0x278197D2, 0xFB6C9FD0,
39962 +0xBD53B458, 0x89EFE0EC, 0x52A3DFFD, 0xA6B7FF7B,
39963 +0xFB043649, 0x93C93F79, 0xAEB4CD6D, 0x71DB5C90,
39964 +0x9E8DFE92, 0x0F1A5B91, 0x55C5CF5D, 0x1A1847AC,
39965 +0x8D25CF6C, 0x914FD316, 0x39FCFE20, 0xD8F66A07,
39966 +0x2CDD3DC6, 0xE415AC72, 0x3D1BD09B, 0xA8322C59,
39967 +0xBD3A826A, 0x2A988A40, 0xEBD8B1DD, 0x9F53EEEF,
39968 +0xDF571816, 0xD4FCCDAE, 0xB85A1E50, 0xBE1A571F,
39969 +0x0ED07534, 0x4C1E471A, 0x8B4D36F6, 0x0E388FC6,
39970 +0x9ED2BC4D, 0x3E2D7F72, 0x752ACA15, 0x8960B48E,
39971 +0x5892B3D7, 0x70F6F3CD, 0x26C485EF, 0xC83839B9,
39972 +0xFE6C224B, 0x3547203F, 0xF73ACA84, 0x065DCDBC,
39973 +0x8986EBDC, 0xCD59EA14, 0xC0EF58A8, 0xC5587229,
39974 +0x484FBCEF, 0x9B8BF24D, 0x351CF946, 0xE10AA973,
39975 +0x17919640, 0x95FF7B1C, 0x82AB65E5, 0x070BCC98,
39976 +0x0E7CDB8D, 0x38DB27DE, 0xCA543C2B, 0x0131EB41,
39977 +0x8300996B, 0x88B63D66, 0x03ADAC1D, 0xB205A87B,
39978 +0xD8BDC0C6, 0x443F6071, 0x2CE69D2A, 0x6E1E5A53,
39979 +0x4EFF93AC, 0x70322657, 0x5CCDD146, 0x04C435B6,
39980 +0x5BF3CD69, 0x51E09115, 0x2545DFB2, 0xA52EF448,
39981 +0x8D387046, 0x7C4F1F25, 0x2EFFD8AA, 0xFD6422B0,
39982 +0xB82E26A7, 0xCF01CC45, 0x88899EBE, 0xDB621966,
39983 +0xBBA1822F, 0xB264AAEB, 0x1076EAA5, 0xC24B0CD5,
39984 +0x54D554B0, 0x4ECA7C05, 0xC8C9B053, 0x70A86D97,
39985 +0x4E3265CA, 0xEA24F810, 0x873B172D, 0x79A74D18,
39986 +0xEC3F49D5, 0xD1799602, 0xA21A28B6, 0x3FB99AD1,
39987 +0xC2DB35B3, 0x63EC2E51, 0x17E4489F, 0xE8E19164,
39988 +0x79ADD819, 0x10D66157, 0x5F621A73, 0x1CD063BA,
39989 +0x6665815F, 0xFA0B7081, 0x6E0FA473, 0x0CE3571E,
39990 +0xB5EAEF46, 0xAA04CF54, 0x336680CA, 0xDABBFF11,
39991 +0x2259E797, 0xB57B4470, 0x111EB4BF, 0xC171D42B,
39992 +0x5889A7A4, 0x419CCB3E, 0xBEA1F366, 0x41FE414B,
39993 +0xA65CB898, 0x6C28363A, 0x8F82FC84, 0xDBED5A9C,
39994 +0x4DBF3526, 0xF2F34E66, 0x9D2C9B11, 0x0C0D4DFB,
39995 +0x4DBF79D4, 0xA256E86D, 0x6407376C, 0x3F3E8AFF,
39996 +0x474B3593, 0xE55965C8, 0xCB20D358, 0x0C671A9B,
39997 +0x169F8342, 0xD2E1C9E7, 0xBDDBAAEB, 0x93DF0C75,
39998 +0xF27707F7, 0x5108305B, 0x4FF2C060, 0xEB9C08DE,
39999 +0xDF11020E, 0xD2271046, 0x6D1BFD27, 0xED020CDC,
40000 +0x2C22659B, 0x692050D9, 0xD14BE291, 0x3EBF8E86,
40001 +0x8344B625, 0x7840B91C, 0xB702BD5F, 0x4935D318,
40002 +0x01A22013, 0xF2A20B08, 0x651A1C38, 0x004FE633,
40003 +0xE51DCC06, 0xF5B86138, 0x9FBFF118, 0x6F7B3CD4,
40004 +0x028938B4, 0x071E96AE, 0xDF33DC9E, 0x79001AC7,
40005 +0x7B5D20FC, 0x3F137794, 0x81165B04, 0x973F8FD4,
40006 +0x0AE4CBF5, 0x7C48180B, 0x4A96BC89, 0x58066E74,
40007 +0x86669DC6, 0xDC55A218, 0x858C3130, 0x99AEAC91,
40008 +0x26983FC4, 0xEE4D4F06, 0xD8D6D657, 0x18EF262B,
40009 +0x374A620F, 0x85995F9C, 0xCC814AC1, 0x39F487E0,
40010 +0xC628177B, 0x2FAE2C39, 0x642525A2, 0xC1474F2D,
40011 +0xBC7CD49E, 0xE81E13F7, 0x83F42BDB, 0x8AB7D99A,
40012 +0xA8040B11, 0xD8AA68EC, 0x983B3739, 0xEE42ECDB,
40013 +0xC9513498, 0xCAA06A14, 0xE4784094, 0xE6BEBB9E,
40014 +0x13BE8018, 0x59E3D5D4, 0x0CF1728F, 0x963413BE,
40015 +0x319533B7, 0x14662ABE, 0x3363B45D, 0x59A99687,
40016 +0xBBB0FDA4, 0xCDBB8B21, 0x0240F3B1, 0x226DAC3B,
40017 +0x30E1C49E, 0x76E076D7, 0x4B91C598, 0xB3C46E2F,
40018 +0x4A657CC7, 0x66C3875A, 0xCBC6FC54, 0xF832EBE8,
40019 +0xDD1EAD3D, 0xFEFDAF85, 0x8DE51B88, 0xAEAFD5D3,
40020 +0x3E4CEA82, 0x55F47934, 0x9F8314CA, 0xD0220BC0,
40021 +0x5ACEF81F, 0x71FDD8E9, 0x13A14ED8, 0x6F1FC1E4,
40022 +0x75046A04, 0xC6C4FDAF, 0x4FFFF724, 0xF44FEDD6,
40023 +0x7E1C5CBC, 0x784C6B4C, 0x8D85F220, 0x38B65C3E,
40024 +0x8C992050, 0x2DE34C13, 0x9F2A4547, 0x48E58F65,
40025 +0xA280B689, 0x6F540D8A, 0x10B61B39, 0x1C8A2849,
40026 +0xA7316358, 0xDBFB7862, 0x182C553D, 0x92F04389,
40027 +0x1FE7BADD, 0x6A724CBA, 0x970BE020, 0x93760058,
40028 +0x2DF9E0AD, 0xCFF1F8B1, 0x170D810A, 0x45F4E6A2,
40029 +0x37A0E8FD, 0x86D11C6D, 0x4F3C6A3A, 0x4B144452,
40030 +0xCE9B87A1, 0x7C08C30D, 0x9CB9B0AB, 0xD55F2CC5,
40031 +0xFF95180F, 0xF35505BD, 0xED5BDB96, 0x85CA2E41,
40032 +0x8708B264, 0xD6079734, 0xCA76AB3D, 0xFD6CDF4F,
40033 +0x9AAB840B, 0x92D3A5F7, 0x93A92C38, 0x0419AA7A,
40034 +0x1D50006E, 0x126F48FF, 0xACDA412C, 0x01139454,
40035 +0x8E23C486, 0x01D44F51, 0x7A5F6F10, 0x377D4D5E,
40036 +0xB784E72F, 0xA9AC925F, 0xB9C66C79, 0x057331E6,
40037 +0xCFF040E4, 0x77E8A960, 0x35E31EEC, 0xEB807A44,
40038 +0x8594FFFC, 0xD27629B7, 0x5DDF526E, 0xBCF2F484,
40039 +0x88805013, 0x41047850, 0xB8574ECD, 0x3E15082F,
40040 +0x309C16DC, 0x297B6904, 0x30C39ECB, 0xD20B61AF,
40041 +0x51A578AF, 0x4E0D24A9, 0xC61FBE5F, 0x7A89F4C6,
40042 +0x9432299D, 0xFE261B95, 0xDD1FC4CA, 0x044BFB92,
40043 +0x41BE56CA, 0x0A2B6831, 0xE135D75D, 0xAB2D00A0,
40044 +0xB4374080, 0xFAA6DBD0, 0xA704C4A9, 0xD81385A4,
40045 +0x51533312, 0xED5EDAF7, 0xE4EDFAEB, 0x74B7DAFE,
40046 +0x9D810AA7, 0x40B91827, 0x65219BCB, 0x75431C16,
40047 +0x94D923D3, 0x00B7AA4E, 0xB8A88FDA, 0x927278D7,
40048 +0x7A237697, 0x45B14097, 0x2E3A562F, 0x93003322,
40049 +0x0B88A5FF, 0xD13D4ADD, 0x6D7B7579, 0x72D834C4,
40050 +0x0BCAA361, 0xC02E00B8, 0x15023551, 0x481C5E93,
40051 +0x02E81A16, 0x8A846A33, 0x1239A971, 0x994818B4,
40052 +0xFC3DBB6D, 0x43C8D2F2, 0xE3AE548C, 0x408032F1,
40053 +0x02B05636, 0xE361A60C, 0xFE2CA292, 0x061D2374,
40054 +0xDB285556, 0x70627EA4, 0x7FC64AF0, 0xFE100B6D,
40055 +0x71AEB3F2, 0xA565A412, 0xA698731F, 0x49DD9767,
40056 +0xC3627EBC, 0x75FB2DBF, 0xFDC0E971, 0xF6ED12A6,
40057 +0xA23DC00F, 0x897E917B, 0x7F2031E0, 0x17DCE568,
40058 +0xDF69CAD3, 0xC6FB5B6D, 0x097268B0, 0xE1102444,
40059 +0x86DF9383, 0xBD7B9CC2, 0xBAAF7DCF, 0x985B45D1,
40060 +0x4218E95A, 0xB2455EF4, 0xDB015F9B, 0x54CCCE76,
40061 +0x56EDF561, 0x6F66F95E, 0xF8B1EBD0, 0xF7A39AE0,
40062 +0xF66D8346, 0xA4677007, 0x02C4B3EB, 0x829987B0,
40063 +0x7C0E1919, 0x51F7060B, 0x4B30F1D6, 0x85A4E0CA,
40064 +0xEC049FA0, 0x17CBF1E4, 0x7A1AAD95, 0xEBA4C513,
40065 +0xE8462E78, 0x54CDDA0C, 0xEE7B8378, 0x9858C8C1,
40066 +0xBA33587C, 0x4D6F1B14, 0x7A2C0525, 0x7E6EE4D2,
40067 +0xACA18692, 0xDD186820, 0x41198B03, 0x8AC85AB7,
40068 +0xBD86900B, 0x36E2C354, 0xE65F9115, 0xB10645DA,
40069 +0x7971D230, 0xC83D3583, 0x8C60C81D, 0x94DB5741,
40070 +0x4FCB8934, 0x9A520FE2, 0xCE49446D, 0x8864E641,
40071 +0xF5EF25A5, 0xC1DEED0A, 0xC8057F37, 0xFB305C73,
40072 +0x392E670D, 0xA4D00D2A, 0x356A46F0, 0x2F675567,
40073 +0xB7997CF0, 0x88AF3A4E, 0x56C9D51E, 0xDD746ECD,
40074 +0x40CFA453, 0x5EA740CD, 0xE4DD6BB1, 0xCCB31429,
40075 +0xA2227F3F, 0x18A1EAF0, 0xC155417B, 0x41FE735F,
40076 +0x16D40B00, 0xC9F72AFC, 0x86B1D62D, 0x6A99A82A,
40077 +0x09D33248, 0xEC44639C, 0x9B0AB2B2, 0x6969164C,
40078 +0xEF602BB1, 0x0208FC6F, 0xC1109578, 0x2997AB87,
40079 +0xE5626B14, 0xCDAF48E1, 0x20781633, 0x2EBE0A41,
40080 +0x7379261E, 0xF216F7A1, 0x714D8258, 0x936FE68F,
40081 +0x160856F9, 0x2A4D1416, 0xB558E412, 0x7DB196DF,
40082 +0xDC88CCB2, 0xF37AB612, 0x7423F214, 0xD3B06A43,
40083 +0x25A8012D, 0xC1C69FFA, 0x936F2C18, 0x56D77C19,
40084 +0x774BFC69, 0xF5E85E24, 0xD79158C9, 0xA67C3E15,
40085 +0xB958819E, 0x69F81278, 0xF2B35107, 0xBF2F4085,
40086 +0x1C997A06, 0x6C238C3B, 0xC756D56E, 0xD15C1149,
40087 +0x351E6EC4, 0x2311303F, 0x0621602C, 0xB11B6DD1,
40088 +0xBE8E50B5, 0x34A5F589, 0xE4D308AE, 0x4344B297,
40089 +0xA33AE98D, 0x0A303CDB, 0x388EA17B, 0x0107B5A5,
40090 +0x38B39042, 0xFE678995, 0xB426FE69, 0x221FCF06,
40091 +0xC45926AB, 0x21A430F9, 0x6D192D2E, 0x4168C10B,
40092 +0x5BA6B132, 0x0519ECA7, 0x21127582, 0xF6C447E0,
40093 +0x0C72FC31, 0x0941B3F0, 0x76F23877, 0x86CF0677,
40094 +0xE7785105, 0xA4637864, 0x94C82B45, 0xF60FD6A0,
40095 +0x46941C27, 0x7A33A698, 0xE1DF8BFB, 0x5249970B,
40096 +0xDFE65E1C, 0xF4A4FB22, 0x599639F4, 0xFE0E9722,
40097 +0x7BB48F58, 0x533465E3, 0x9E884B35, 0x2620429C,
40098 +0x2875FFC1, 0xF11EC0CA, 0x663AF5F0, 0xB2C59C38,
40099 +0x03556ED9, 0x271E9E39, 0x8556E062, 0x08207682,
40100 +0xE5797F00, 0x66A362B5, 0x7ED8394D, 0x2922C374,
40101 +0x271657BE, 0xAC15071B, 0xE296691E, 0x0FE2C740,
40102 +0x19120FB5, 0x9ABD888A, 0xA200762C, 0x7837F41C,
40103 +0xC6F4EA19, 0xF286ABF4, 0xFCA8998F, 0x97B0E7D5,
40104 +0x1339C79F, 0xFED05D43, 0xB3392E71, 0xFC2A01EB,
40105 +0xB720CBED, 0x4FA71358, 0x04A57F62, 0x3D558B0A,
40106 +0x1DEB4D40, 0xC9C823F1, 0x470F630A, 0x08F22975,
40107 +0x2BD85107, 0x3288A628, 0xB0C89675, 0x32D957C1,
40108 +0x80B78426, 0x98A46953, 0xA493AF60, 0xC2B84AC4,
40109 +0x486D658F, 0xFE119FF9, 0xB2FE565F, 0xEADB58CD,
40110 +0x1F45F9B4, 0xCEAE62B6, 0x68EC702D, 0xF52ADDF7,
40111 +0x0FFC0715, 0x4129E42C, 0x956AC4D9, 0x0035CD9C,
40112 +0xF8FEBAA1, 0x29C58397, 0x7C2E2E41, 0x7BE74DAF,
40113 +0x2791D34D, 0xB6D67B0D, 0x8F557528, 0x9DDEED5B,
40114 +0xB3AA4BB7, 0x05E22E43, 0x4CDA600D, 0x432E2D32,
40115 +0x405DA5BD, 0xAF23818C, 0x2F73FE09, 0xD4624626,
40116 +0x653EFCB3, 0x77D65D3F, 0x51A3DCB3, 0x767F407C,
40117 +0xC66452E3, 0x10B6842E, 0x93A0840E, 0xE453AD10,
40118 +0xDE58FC3D, 0x6C227215, 0x1EE130EA, 0xB0BF64BE,
40119 +0xA11E5D38, 0x0131B755, 0x191F70D0, 0xDB483959,
40120 +0xAA8D2F9E, 0x5A002AA0, 0xF5A2996D, 0xFD0F95F9,
40121 +0xD6A12864, 0x3AA48B74, 0x50F6679F, 0x0ADF5C49,
40122 +0xE2F8CE68, 0xBF213E67, 0x5E9ACEEA, 0xCACD0EBE,
40123 +0x6DF766A5, 0x33C0A156, 0x720868EA, 0x3112A0DC,
40124 +0xB382350A, 0x369D9C50, 0xE8F890D0, 0x0A121399,
40125 +0x2AB458EA, 0x51C8233D, 0xBF46403C, 0x0728CD55,
40126 +0x23F6774B, 0x2FB59DB0, 0xFA2CF724, 0xB49FA848,
40127 +0x5FFFA125, 0xDE2C0D15, 0x76B78C41, 0x192BA62C,
40128 +0x4C9563E2, 0x8F742507, 0x882104E0, 0x357AD078,
40129 +0x799E25A2, 0xEF3ED021, 0x69D54B46, 0x5EC57870,
40130 +0x0FF418E0, 0x07C5AC7F, 0xC1ACBF9A, 0x80A830D9,
40131 +0x837C7C5A, 0x04C11D86, 0xC14C8BC7, 0x92BA650B,
40132 +0x94D34FA8, 0xDBDD5EDC, 0x9ED2A08F, 0xA1FAE485,
40133 +0x5FD66C3D, 0x4CCB6F9F, 0xB7AA56B0, 0x0FB3C73A,
40134 +0x03AF96E6, 0xDB2D38F9, 0x7AF20D60, 0xB57CBE90,
40135 +0x20EB2D6E, 0xCF934452, 0x82EC26F6, 0x84B3737A,
40136 +0x0972F1B7, 0x39B6DB4D, 0x13E53CC0, 0x67C41D72,
40137 +0x94BAAC78, 0x663A9C6C, 0x36927448, 0xCFBC2610,
40138 +0x980F53BA, 0x7E56C96A, 0x04C62DFB, 0xA471D579,
40139 +0xDF9B2EE1, 0xE12DEBB7, 0x2DB9B042, 0xF0C74B96,
40140 +0x6A3762E9, 0xF4DC39D9, 0x761A5884, 0xFA363D3B,
40141 +0x92766759, 0xF3EAD441, 0x878269ED, 0x1AFFAFE5,
40142 +0xCB432764, 0xFE19475C, 0xCF8776DA, 0x1F0AD906,
40143 +0x7D99AC20, 0xC27317FB, 0x439944A4, 0x65D14C2D,
40144 +0x43E45262, 0xCDE6B3BD, 0xE25C67CD, 0x321AA2E6,
40145 +0x352A2764, 0x5569EF42, 0x005C370D, 0x290801E0,
40146 +0x61883035, 0x2A2DBC48, 0xE2D559FF, 0x01F5DF13,
40147 +0x69B61558, 0xE94BF364, 0x3CA76FCA, 0x2E016483,
40148 +0xDB675F9C, 0x4FA5B6DC, 0x59A6C3EC, 0x56C6E6CF,
40149 +0x24CD59F5, 0x46911834, 0x683B9E39, 0xB5AF6174,
40150 +0x5C31E269, 0x679C9A12, 0x3787D3E6, 0xF1727EE6,
40151 +0xB070882F, 0xFC37EACA, 0xBEE0783F, 0xF6218369,
40152 +0x19372940, 0x3FF7D890, 0x69736919, 0xDD961CB9,
40153 +0x883010F1, 0x6E472D5B, 0x2447E00D, 0xF39E1F0E,
40154 +0x1DBD442F, 0xBE1977E0, 0xC8655F42, 0x37C84253,
40155 +0x3480DAC4, 0x4CFE1DC8, 0xF1521AD5, 0xA45C4F8C,
40156 +0x87FBAEE0, 0x3E41E9E2, 0xF47771E5, 0x16C74CDF,
40157 +0xA33D4035, 0x38513A10, 0xABF3264D, 0xB8D80DF6,
40158 +0xD9AD7256, 0xF78375B8, 0xD7661CF7, 0x1C363AF9,
40159 +0xD425FA32, 0x001D7B98, 0xDB96A1CC, 0xA092E683,
40160 +0x65CF5316, 0x5F282689, 0x9F52F912, 0x8958A1B7,
40161 +0x6457A3F7, 0xAB43FADD, 0x061328C7, 0x9D31B5E3,
40162 +0x75A77F6D, 0x4A764D4A, 0x488CE83E, 0x29887218,
40163 +0x9A04BDD0, 0xEF331070, 0xBCD2F884, 0x6BF66A6F,
40164 +0xB85143CB, 0xFA529278, 0x9EA3A354, 0x4A73BDAF,
40165 +0x0CBB7563, 0xD01AE35F, 0xD2AC3DAA, 0xFC8243B7,
40166 +0xD805D97B, 0xC162A75F, 0x1D49AC67, 0x9E1BC38C,
40167 +0x1D06AAE8, 0xEAF80CD8, 0xCE825DD4, 0xACA3F06A,
40168 +0x83D092EE, 0x3F2BAABC, 0x2482D120, 0xF301680C,
40169 +0x7DAC373F, 0xF5D6178D, 0xB7E9217F, 0xCCFE8C13,
40170 +0x976024E0, 0xA2F39F8C, 0xB6C65734, 0x10AE514A,
40171 +0x696584CF, 0x2542113C, 0x479CB20F, 0x8D3A22E3,
40172 +0xF7C4B88C, 0xF4F7FBE2, 0x2F553308, 0x9EA71E3A,
40173 +0x7B958F48, 0x0927DAAB, 0xF08949B7, 0x7CD46C0E,
40174 +0x7A892BBC, 0x882F32CE, 0x34C490C8, 0x8483ED04,
40175 +0x07EB4EFC, 0x4BEBCD82, 0x83B15EE8, 0x8F3B78AC,
40176 +0xF95EFDA9, 0x816BEBF9, 0x269BDA58, 0xEE373342,
40177 +0xE09FDA9F, 0xC7651AAB, 0xB8D398B2, 0xC7F449B2,
40178 +0x031310F5, 0xC869706F, 0xDA22F127, 0x8C68DF91,
40179 +0xE676068A, 0xB85AAAC7, 0xD32F35BC, 0xE22DF031,
40180 +0xFE142BD9, 0xD4FB2700, 0x2D197707, 0xA3A43A64,
40181 +0x0C02B050, 0xE945AD56, 0x7DEE0A5D, 0x1075DE3E,
40182 +0xD99AD91C, 0x6A7BB71D, 0x1774B3B8, 0x2228B112,
40183 +0x0DEEE844, 0x38074EBE, 0x6DACF57B, 0x7E0094B7,
40184 +0xCE46F8EC, 0x4DAF34F4, 0x5B961907, 0xC8236FF7,
40185 +0xFD380AA7, 0x61EBA84A, 0xAE4892EB, 0x0F1B6365,
40186 +0xB0C4C9A0, 0x04E6012D, 0xA5F90D01, 0xD6C8882E,
40187 +0xBCB9C1EB, 0x0E5E0FEC, 0x53A46889, 0xA2C0FA51,
40188 +0x520DA459, 0x3FD95FA2, 0x6E1D6FE8, 0xBC093220,
40189 +0xAB16390A, 0x163E3D6D, 0x0A63517C, 0x3BF38F3D,
40190 +0x88A1F66D, 0x96263536, 0x412DF008, 0x12FB126D,
40191 +0x44441D7A, 0x31C9F726, 0xF66F60CF, 0xAE1453D4,
40192 +0xDAEAD71B, 0x54EAEE0F, 0x948B73BB, 0x31EA3E74,
40193 +0x355D4FDC, 0x2A1F3A9E, 0x586D08DF, 0x123AC2E8,
40194 +0xF5AC0065, 0x8874ACAB, 0x05B03D63, 0x01BD6A4C,
40195 +0x7A6A9880, 0x2BC16F93, 0xC4112F0C, 0x8287B40D,
40196 +0x48EABF08, 0x29E56860, 0x0F505C84, 0x447DC08B,
40197 +0x1665119C, 0x00347E37, 0x482EF03E, 0x01B15D44,
40198 +0xE6C1B9FF, 0xB165E436, 0x0CF690F7, 0x7FC5BD01,
40199 +0xB784C7F4, 0x9BE04EBB, 0x9F614431, 0x6C37A5A9,
40200 +0x2D0DB87D, 0xF6511369, 0xE115073A, 0xF96C6AB6,
40201 +0x04A13C3C, 0xBF30B2DA, 0x93D18FC6, 0xF67D2E47,
40202 +0xCA089151, 0x51A6BC39, 0x8C1FCA93, 0xFBF2F2BB,
40203 +0xAD0A3F33, 0x82AA2767, 0x81BF2313, 0x758A82B8,
40204 +0xE103788E, 0xC00C4B5C, 0x5F52FF58, 0xABAD38F7,
40205 +0xDA68EE9A, 0x9B6D405D, 0x803449D9, 0x6178B345,
40206 +0x3C785FB4, 0xFEBABE55, 0x0E2458AB, 0x021F0D71,
40207 +0x39201ED1, 0x741B1A7D, 0xE0B0AFF4, 0x45652CFF,
40208 +0x907DA678, 0x313A93B4, 0x0B0D6B0D, 0x42C96E43,
40209 +0xEEE3E7E1, 0xE83C83E9, 0x9052B867, 0xF9514243,
40210 +0x61F20CB2, 0x57E1AC64, 0xC2443123, 0x432C96D4,
40211 +0x616A824F, 0x3C8D1E06, 0x8E64222A, 0x65C1A21D,
40212 +0x8686308A, 0x2A576A2F, 0x1CA0FF20, 0x2C8F9D3A,
40213 +0xC98C9C69, 0x35322A29, 0xDFD33C93, 0x9634F411,
40214 +0x0B4F8FFC, 0x3AED4B01, 0xEBBC7012, 0xED2387EA,
40215 +0x48BF42AF, 0xD60399D6, 0x7A9B8CA9, 0x53886337,
40216 +0x2DBB9429, 0x0A6AF764, 0xDE4D8F78, 0x1EDECEE4,
40217 +0x4F8EE99E, 0xAF23EAFD, 0x929550B1, 0x2CBD8621,
40218 +0x22A8FAA2, 0xBE2A0A8D, 0x06F7E794, 0x16E1F3EC,
40219 +0x093AAEAA, 0x92D429F8, 0xBB79A7E7, 0x43EF89BB,
40220 +0x0E097511, 0x748E68B0, 0x322C00AC, 0xA62EF42A,
40221 +0xD03BB8BC, 0x9FF67810, 0xDE24BF03, 0x140CA6FD,
40222 +0x68F16B41, 0x1B7C68C7, 0x32646342, 0xC5E714F8,
40223 +0xEFFFD2B8, 0x27843628, 0xF8445F51, 0xB9E8519B,
40224 +0x8EB01D04, 0x356FBF2F, 0x32E96BAD, 0x6A629BDE,
40225 +0x52063313, 0x200069B0, 0xE161CF71, 0x84FB7A12,
40226 +0x1805ADC0, 0x80F75012, 0xFE9E629E, 0x93395C33,
40227 +0xFF075A91, 0xB61E46B8, 0xCA9FE7C8, 0x97DCCBCA,
40228 +0xCEFFB6F8, 0x30EE7985, 0x1FABC829, 0x20B3F57B,
40229 +0x27042B07, 0xE12C5151, 0x23482B8A, 0x7B9B8EB2,
40230 +0xC997FEB3, 0x76AB2497, 0xD5CDA590, 0x9EBE90FD,
40231 +0xE3732B18, 0xFF28CEC9, 0xC6582320, 0x6EF106FA,
40232 +0x8ED74023, 0x1A0B69E5, 0x4A95DD91, 0xB41AF82C,
40233 +0x83DF69D3, 0xC548861C, 0x2F60BA93, 0xFC815984,
40234 +0x1A848B67, 0x1EAE87C4, 0xF7479103, 0x8E16DB51,
40235 +0x040B95B9, 0x2A9DB812, 0x987AFCD1, 0x866DF413,
40236 +0xBF9558ED, 0xACF1AF2F, 0xA65305CC, 0x168336F3,
40237 +0x1E59B97F, 0x3F9F447C, 0x3D54B30D, 0xE939D598,
40238 +0x36A40885, 0x02396794, 0xEB0F0A67, 0xCEAEA12F,
40239 +0xC58B4AC8, 0xE6D49760, 0x0F8F2776, 0x66A8F436,
40240 +0x31BACD7D, 0x376993DE, 0x32BD0431, 0x68BDC728,
40241 +0x63EA6748, 0xE6B00E29, 0x7448CABC, 0x42A6517D,
40242 +0xBB1313C4, 0xA04DC8FF, 0x3D402237, 0xA382645F,
40243 +0x52ED55D6, 0x92D7D7B7, 0x541230FF, 0x7AFC0420,
40244 +0x3DC4624F, 0xD9B2193D, 0xA73B9704, 0xBBDE0FF1,
40245 +0x9EB56615, 0x8AB080B6, 0x3C4D8E14, 0x5001B43D,
40246 +0x1EBFAA23, 0xD4AACD27, 0xCFAAB4BB, 0x6FFEE61F,
40247 +0xAE5A7426, 0xDB942949, 0x452C0B16, 0x738E0637,
40248 +0x36A5122D, 0xFF1F7A4E, 0x743D35CF, 0x847D54A9,
40249 +0x42C3EABA, 0xD46728C5, 0x30B2708D, 0x4F6BE0BC,
40250 +0x3C26790D, 0xB0B67C8A, 0xEE07EFDC, 0x9E380611,
40251 +0xEAD6804C, 0x4EF66024, 0x8459AE38, 0x1DEAAFFB,
40252 +0xF76573AE, 0x6CB1C8F0, 0xFFCC267E, 0x26A215F7,
40253 +0x0B1A057C, 0x7DAB9CB7, 0xD40BCBA9, 0xE561F9FE,
40254 +0xA44013A6, 0x7B22C0B9, 0x998A921F, 0xBD25244B,
40255 +0x15E07FED, 0xF15B2E31, 0x54E80016, 0xA12BCE7F,
40256 +0x658A2093, 0xB642C47B, 0xD731FC00, 0xC00E302D,
40257 +0x55B251DC, 0x342939EB, 0x6EADB2F7, 0x0CF93318,
40258 +0x61EBD85A, 0x99B715EF, 0x679C8D3A, 0x9CC1B803,
40259 +0xABEF955E, 0xB8CFF9D4, 0x707A839F, 0xF5D02A7E,
40260 +0x59E0D903, 0x5A425E3B, 0xBB61163C, 0x96ECE9AA,
40261 +0x797B82AA, 0xA9FA6BB6, 0x797C00DC, 0xC1C1FC4C,
40262 +0x8F7FDA66, 0x77902514, 0x6D1B843D, 0x4F881FA4,
40263 +0xC24AD625, 0xBC237A45, 0x9A2E0F44, 0x82FAA3F3,
40264 +0xD70E3489, 0x4F2B3417, 0x65CF65E4, 0xEAAE6A93,
40265 +0x4BEAEC2C, 0x4918723D, 0x7D8F30B4, 0x7706F59A,
40266 +0xCB2A7452, 0x5083D2D6, 0x4724B426, 0x84EB15DC,
40267 +0xBAA2C6CF, 0x71FA984A, 0xDDF7A3DF, 0xB115BF1A,
40268 +0x258AF0E3, 0xA1637D87, 0x03585DF8, 0x5EA4B80D,
40269 +0x8641F318, 0x66EE2F24, 0xC81E505E, 0x5E640639,
40270 +0xDB7739B8, 0x1A3B861F, 0x0F5ECC51, 0xB21C00DD,
40271 +0x680FF30B, 0xDE697468, 0x57A43B33, 0xD7EF6B3B,
40272 +0x4BFC7D25, 0x710F0752, 0xABAA9752, 0xCFCFD84D,
40273 +0x3BCC1CDC, 0x2381C524, 0xB60CAD92, 0xE05BC1AA,
40274 +0x2B887D88, 0xCD4566C5, 0x0D2976E7, 0xCB000A2C,
40275 +0x667BECF6, 0xEFC7F221, 0x7A7584D1, 0xC41D8B2E,
40276 +0xD9BB7D3F, 0x7CEB5626, 0x7D8165A0, 0xEE178F99,
40277 +0x3E8A8CB7, 0x693D4501, 0xB0E228A5, 0xD55B73C1,
40278 +0xAF9043BF, 0x6C627A2C, 0x7B9F490C, 0x7EA61899,
40279 +0x92B980AF, 0x6D13C758, 0x2C007C73, 0x74336E0D,
40280 +0xA39F13AC, 0x533F05D7, 0x75536CFB, 0x9708DE27,
40281 +0xE2A14E87, 0x36673FEF, 0x71BA654F, 0xB98CD2FC,
40282 +0x27F29A6E, 0x82478171, 0x1C2815F0, 0x8A8F4549,
40283 +0x048A8D9B, 0x7CEE51F2, 0xA1648AC3, 0x004F8B8F,
40284 +0xB6FE8EF0, 0x6D10A0A1, 0xAD7A24D8, 0x75039717,
40285 +0x97847786, 0x2791CC05, 0x6937FD6F, 0x60F98115,
40286 +0x5FAB6D35, 0xC0550A70, 0xC0F4D817, 0x7B5BFDDB,
40287 +0xEF63B4D2, 0x6C87C6C5, 0x956D6B87, 0x69179257,
40288 +0x10973C90, 0x8CDBE860, 0xC7C761EE, 0xF823E34E,
40289 +0x6FA2CF3B, 0xA903ABCB, 0xC82C9B01, 0x60FE96E6,
40290 +0xE5EC33C0, 0x73A3011C, 0x2A1B9054, 0xCF16F92D,
40291 +0x4FAF6CC8, 0xD9DD74FE, 0xB3C639ED, 0x3F47AF63,
40292 +0xC8E99D12, 0x92D95986, 0x835ACA6F, 0xD52930A2,
40293 +0xC7DD54A5, 0x617FDD15, 0xE9A6D295, 0xF56C6087,
40294 +0x7813B662, 0x1F8EA244, 0x1CDE3BAD, 0x58FC0F7B,
40295 +0x02E31A5A, 0xA78EAC74, 0x10C06107, 0x22BA3C63,
40296 +0xF84AD224, 0x6A8BF66C, 0x2A5CAAC5, 0x8ADC3FB5,
40297 +0x9683451A, 0x1B52FCB4, 0x95491BA5, 0xFE6C3713,
40298 +0xE9098CEF, 0x73C01EF9, 0x6E85EF1A, 0xEE189743,
40299 +0x2E9E5286, 0xC1FAA665, 0xD861E384, 0x701C834D,
40300 +0xDC5CA5CC, 0x52A3A6C4, 0xF2AF2C43, 0xC37C6465,
40301 +0x6E94AD69, 0x98808AF4, 0xED8A99F2, 0x377257D3,
40302 +0xE60F2096, 0x615EFCB8, 0x67A2BB3A, 0xB4DDD40F,
40303 +0x1D47F918, 0x86F77D6E, 0xFD05D2B8, 0xE18C330C,
40304 +0xA48260A4, 0x5615B83B, 0xBCD7D855, 0xF8073219,
40305 +0x8622BB89, 0xD35CE05B, 0x17162483, 0x137BDB69,
40306 +0xECD0F226, 0x61F8982A, 0x3C10ABD4, 0x2F33ABF4,
40307 +0x9358B547, 0x58B277A7, 0x92456A7C, 0x4384B49A,
40308 +0x5F1FF0EC, 0xA153EA4D, 0xA8E49100, 0xD3A75723,
40309 +0xD1ADC606, 0x76C314B7, 0xBC6AB227, 0x257312AF,
40310 +0x8B6AA1E3, 0xD87FF5E8, 0x2BAED373, 0xC848AB63,
40311 +0xB72B1E5E, 0x730A73D8, 0x4915E5B6, 0xDF7D77AD,
40312 +0xEAE247D7, 0x9556DDA8, 0xDE0C9C47, 0xA4E3296E,
40313 +0x31F5BC94, 0x05258B24, 0x2837374F, 0xC7E4C81B,
40314 +0x5A1AC819, 0x068074AE, 0xDF876732, 0xC0192EF9,
40315 +0x7FFD84D8, 0xFF1CE148, 0x821B4AA3, 0x56674838,
40316 +0xF9A147F4, 0x182EF58B, 0x16E17174, 0xDE27029E,
40317 +0x8BEC55AD, 0x40646F89, 0xDBFF92FC, 0x9F24C017,
40318 +0x711EAD18, 0xA663E1EF, 0xEF92F684, 0x4BD05E67,
40319 +0x7E089B13, 0xCBF619BE, 0xCEBEF231, 0xC947586C,
40320 +0x0F526C47, 0x6672600F, 0xDAAB63DD, 0x950D4FD0,
40321 +0x199C3EC2, 0x0F201C9D, 0x06BCC8D3, 0xA7672C6D,
40322 +0xB39C7D0C, 0xC74B0805, 0xC9BBD249, 0xACDD5396,
40323 +0xAB7BDF8E, 0x12012B8E, 0x67236047, 0x0AE0741B,
40324 +0x1D747E56, 0x7EC6C00C, 0xD08E8341, 0xB0ABDAD6,
40325 +0x4FA4BDF6, 0x90CE8D0E, 0x6E734117, 0x3EF9192E,
40326 +0xACA32DA2, 0xFDB9C58E, 0x256626B5, 0x5EA961B3,
40327 +0xFBC15776, 0x36602B5F, 0xF8D08644, 0x5B693C23,
40328 +0xC62EA3B1, 0xC664C7C3, 0x73BE8859, 0x17F44E8F,
40329 +0xF9B8D923, 0xD168A3A5, 0x6CCD110C, 0xD353181F,
40330 +0xC0E774EC, 0x5F9E127C, 0x6C824511, 0xFDA13494,
40331 +0xCB588BA6, 0x47148694, 0xAB877E87, 0xE97F757B,
40332 +0xF54D0A2A, 0x0FE11891, 0x5D8747FB, 0xE7800C7E,
40333 +0xEF96298F, 0x400F458A, 0xE2D04518, 0x4B4E6EFC,
40334 +0x9B15002C, 0x3CE1B537, 0xF5ACB9B8, 0x67030647,
40335 +0x475FD148, 0x1E03A40A, 0x896C7C05, 0x85F70B68,
40336 +0xC590CA84, 0x53B5440E, 0x1400F78F, 0x3ABE7F8A,
40337 +0x19CA67FF, 0x68B54A34, 0x555988AC, 0x4AB16B4A,
40338 +0x7511FA63, 0x248EC9EC, 0xC25AFE4F, 0x19F578E1,
40339 +0xE92AF03D, 0xAF9DE18F, 0x2798C7A7, 0x6B46990F,
40340 +0x41D45894, 0x74696A0A, 0xC6AAF5F8, 0x72CC10E0,
40341 +0xDB9CA283, 0xD6BBD0F3, 0x58EA4C06, 0xDEA5E8B9,
40342 +0x1908EBDB, 0x95D33DD5, 0x20D7013C, 0xE725C282,
40343 +0xFD48C92F, 0xDBBA7D19, 0xC7BEBEA9, 0xB186B799,
40344 +0xDD0DD17B, 0xD8090A41, 0xF98BC20B, 0xDD7E4B9D,
40345 +0xEBAE4247, 0x4376FDC4, 0x7F3EFAC6, 0xA9B9A951,
40346 +0x4AE390C4, 0x651863AF, 0x2CD42DBC, 0xC2A13962,
40347 +0xEF0FC443, 0xAEE63246, 0x09B83E19, 0xC3C940AB,
40348 +0x00B12826, 0xC0A30412, 0xFCF6ABCC, 0x3CFE721A,
40349 +0x62C1F4C6, 0xE963A359, 0xAE11F3D6, 0xE490D12A,
40350 +0xC45C928B, 0x05CCA78A, 0x1982E93F, 0x577F81CA,
40351 +0x66D50D6E, 0xB4C7030F, 0x93092C3E, 0x118B08FF,
40352 +0x178545B7, 0xEED74838, 0xF7D2CE48, 0x238969BC,
40353 +0xB8EFAEAE, 0x75726A3B, 0xB1E0220F, 0xC4D60EB6,
40354 +0x0EBC0243, 0x5FE0D6CA, 0x35456B45, 0x1F64AC2A,
40355 +0x58484A1F, 0x2A11455D, 0x33BC4403, 0x56E4E62D,
40356 +0x60B41E2B, 0xDB65D3F8, 0x7EC18D34, 0xF575DC85,
40357 +0x6E0B9995, 0x1C14C91E, 0xB2A94718, 0xAEC4A823,
40358 +0x993D374E, 0xF1E4210B, 0x8CFCC03A, 0x99BD1C28,
40359 +0xA928E3F9, 0xBB957D0E, 0x77C865EF, 0x7FF50A45,
40360 +0x4279A638, 0xE628FFA1, 0xBCCA171E, 0x284C9CEC,
40361 +0xA476E346, 0x7E2F9C08, 0xBF65044F, 0x5B7C3D5B,
40362 +0x6E60EE5D, 0xF5C99509, 0xFA352B7E, 0x6FDE8E8A,
40363 +0xF2340FE1, 0xDF542B6C, 0x510CB30B, 0x367E7016,
40364 +0x198A0A95, 0xA4DF508E, 0x593C2338, 0xB12BCDE1,
40365 +0x554AD3C0, 0x4DDAB1C1, 0xD2BD1850, 0xF6E126CA,
40366 +0xF87289C7, 0x86EC92A5, 0x4E033906, 0x52DC5F3F,
40367 +0xCC6E2E59, 0xFF751753, 0xDF8B8BA2, 0xDBF5954A,
40368 +0xBD367488, 0x6A0CDF1F, 0x4103139C, 0xDE49DBB0,
40369 +0x5A8428F4, 0xA26872B1, 0x96BF7203, 0x99D5E78E,
40370 +0x243850A6, 0x389DAD80, 0x6335D33F, 0xEC67B0A5,
40371 +0x029C0CA9, 0xF5F6F6C9, 0xDF574C15, 0xE6D3EC29,
40372 +0x1AA349BA, 0x453E7258, 0x7DB79BE3, 0x51FCA7F6,
40373 +0x2B42FCA5, 0xBF0E4871, 0x58063C40, 0x193580E2,
40374 +0x25605322, 0xBC49C479, 0x0ED70FC4, 0xA78B59A0,
40375 +0xE6CE3E8C, 0x92EE657A, 0x63D12529, 0xF95DAF45,
40376 +0xF92C3BF3, 0x7D514200, 0x694DF84A, 0xEF177E2D,
40377 +0x4E119CCF, 0xA025C55D, 0xF96974D6, 0x26D13E7F,
40378 +0x799ADC27, 0xD7925EC1, 0x8AE60BF7, 0xF9EF1A2E,
40379 +0x89EADD3A, 0x9C28CACF, 0x63377EB7, 0x6D1EF7E5,
40380 +0x6585B16C, 0x9972D115, 0x65F8F5E6, 0xF93DECB4,
40381 +0x6D71605D, 0xC6FDBCB8, 0xD937BA31, 0xCED727EE,
40382 +0xC34C5605, 0x25FA70B6, 0x5C0B7FB0, 0x8F9340F5,
40383 +0xA3376693, 0x4498B66A, 0x2D21F377, 0xC0A4C6EA,
40384 +0x0780736B, 0xF42D7F07, 0xE56D47E5, 0xB48C25D6,
40385 +0xA48DA0DA, 0xFE69693F, 0xF01E19CA, 0x8A0C5C8F,
40386 +0xDF702C23, 0xE18A93F0, 0xD4D5C91E, 0xD2A706F7,
40387 +0x674F9E28, 0xAF0F80C7, 0x648D49E8, 0x6BE8640F,
40388 +0xF5FCFFD5, 0x8EDC391E, 0xE583D8BC, 0x8426C090,
40389 +0xF456A27D, 0x07249BF4, 0x054A2F45, 0xAC46B73B,
40390 +0xB89EEDFB, 0x48EAF867, 0x69B2D7CC, 0xCA0CA0F1,
40391 +0x38CD0428, 0x029808CF, 0x86EE75DC, 0xF4FEE9F0,
40392 +0x6987D5E9, 0x56AB5537, 0x3DDD0940, 0x4742FF89,
40393 +0x2C3B179E, 0xD05B5CB1, 0x3C4E9033, 0x6BCF0141,
40394 +0xF2F6D3E2, 0xAD297B1F, 0xB1CC23D4, 0x5452038B,
40395 +0x1751FCBE, 0x24AA465F, 0x94C62D18, 0xF49B2EC8,
40396 +0x97AC47DF, 0xD66C19B5, 0x09AAB297, 0x89936144,
40397 +0xD15C026B, 0x4CEC8778, 0x94050D61, 0xD812E96F,
40398 +0xB6BD7B12, 0xA5F9BE77, 0x531A5C7A, 0x3605BA71,
40399 +0xD500CE54, 0xE325964C, 0x323432FE, 0x580A9DC8,
40400 +0xD25A3135, 0x089D6C9C, 0x58856F73, 0x7DFCEE30,
40401 +0x7DE2580F, 0xF4E4488B, 0x71821DDF, 0xD194F5DC,
40402 +0x7D070394, 0xBA28BF76, 0xAAF0A38E, 0xD4F6275E,
40403 +0x1B742E66, 0xD9E68EA9, 0x68B0F939, 0x52AF9D7B,
40404 +0x54A39705, 0x20F844C1, 0xE6981DDC, 0x80322E62,
40405 +0x536235B9, 0x7A57F4FC, 0x14EBF376, 0x64BE2E5A,
40406 +0x70A18910, 0x0FE09587, 0x10E9CA78, 0x8F90D3D2,
40407 +0xAE74717D, 0xA544EAED, 0x6746AF3E, 0x430CB3FC,
40408 +0xBC185576, 0xEAA35DC3, 0xDA6309D2, 0x40643F87,
40409 +0x68859117, 0xA17AC84D, 0xD7922CA8, 0xEF7C0BEF,
40410 +0x83337348, 0x9B4B1790, 0x8876A77E, 0xF293C9C7,
40411 +0x20D399CD, 0xA78224BA, 0xFD1279C8, 0x8B7837C1,
40412 +0x0F1DD415, 0xAE3FBD2E, 0xC4F77B52, 0x51E79FB3,
40413 +0x7A856D9D, 0x14BFDAD7, 0x993FB625, 0x667C65EF,
40414 +0x32F83338, 0xAA06EDCE, 0xACE7A099, 0xD26DAE89,
40415 +0xDC6891CE, 0xCD2F6F04, 0x27425FB8, 0x7C301D8D,
40416 +0x1EDEBE1A, 0xBE540AF8, 0x1D356C6A, 0x963E8639,
40417 +0x9920CA55, 0xDEFE5F44, 0x107D5545, 0x3D079BE4,
40418 +0xEF673F66, 0xDB3C2954, 0xDD76D666, 0x1DFBEF59,
40419 +0x8F384B34, 0xBE6F773C, 0x079DD187, 0x2314AC8B,
40420 +0x5FEB0114, 0x59E85CF3, 0x9BFE9190, 0xB360A31B,
40421 +0x4F7EF967, 0xFEB0D561, 0xBFE779F2, 0xF33702B3,
40422 +0xBB263417, 0x09607C65, 0xA877F109, 0xBB43CFF1,
40423 +0x4A190DB2, 0x9B7BD38F, 0xAEB7C449, 0x3DB3A460,
40424 +0x7D928522, 0xD18AC966, 0x187FE766, 0x97629792,
40425 +0xF59D506E, 0x6FBA202C, 0x77035FF3, 0xDA068CDE,
40426 +0xE195779A, 0xAEB92298, 0xD2A44EDD, 0x12577D85,
40427 +0xA3B47B9E, 0x5BD07CB7, 0x4B6AE3FC, 0xBE35B6E2,
40428 +0x9D7F7AF2, 0x9A38EA75, 0xD87FB055, 0x3339F2A3,
40429 +0xD7CB82B4, 0x357721E4, 0xBEF46553, 0x9DE28CA3,
40430 +0x1B1EC2DF, 0xE29B9CC0, 0xEFAE347E, 0xE5864917,
40431 +0xA097B712, 0x6B67041E, 0x5B29542F, 0x01D96EED,
40432 +0xF9A6DC07, 0xC0B5E3F0, 0x21E1899C, 0xE9373A86,
40433 +0xF3176509, 0x950844A2, 0x7D24FFEB, 0x5DC0BCA0,
40434 +0xC442B7C1, 0x37DC6EC1, 0xC65C8BA5, 0x18F0FA85,
40435 +0x2AD80D2D, 0xC68CDCBB, 0x6AE5EC93, 0xE3955DBD,
40436 +0x3E80C4B3, 0x50FED127, 0x743CABC0, 0xD0E91707,
40437 +0x9BF7EB4B, 0x7A632755, 0x9A192482, 0x8F923E9E,
40438 +0xE2E70FE5, 0x5F50AA16, 0x0EC496D1, 0xC6EC4862,
40439 +0x040A0274, 0x2FC951C2, 0xF65D3A80, 0x8D585163,
40440 +0xC6B529D1, 0xD2CAEE6E, 0xE3E112B7, 0x3244312F,
40441 +0x1B393E58, 0x2444D538, 0xBE69AC21, 0xC92A0506,
40442 +0xD1A74434, 0x49C3EA05, 0x0E53B319, 0x3843CE03,
40443 +0x8DB8415E, 0x766B6FC7, 0x515B9E7A, 0x3BA05B32,
40444 +0xBFAFC449, 0x31302A57, 0x1960A211, 0x66A097E0,
40445 +0xBC65A9B4, 0x89E83065, 0x36FDBF2C, 0xDCD4664A,
40446 +0x0ED6CFBF, 0xDD4DC6DC, 0xD76D2F00, 0xB6DA6540,
40447 +0x9A396444, 0x28F185DE, 0xA0FEFA1D, 0xF476E0ED,
40448 +0xEF15505A, 0x183365BF, 0x481FFD90, 0x29ABEE75,
40449 +0x1EC90B07, 0xC10B2657, 0x0DBF6DDB, 0x52AD02B7,
40450 +0xE87DDB54, 0xD3704106, 0xD4E2C592, 0x0CB2DD05,
40451 +0x4BAA2FFB, 0x02611368, 0xD50F8F1C, 0x416FF25C,
40452 +0x9A69782D, 0x268C6474, 0x2ECD4D64, 0x196DE2F5,
40453 +0x47A8561C, 0x8C7CE6C9, 0xD2B1E2D2, 0xA038C165,
40454 +0x3AB8844B, 0x4A699830, 0x0FFC0B17, 0x89B685AA,
40455 +0xDA276D85, 0xE934C4CD, 0xF511226F, 0x9CDD2B1F,
40456 +0x94F75492, 0x55ECEB42, 0x42F0A3D3, 0xD7EB482C,
40457 +0xA78D0373, 0x62F088A6, 0x7ECF4602, 0x7A3404B6,
40458 +0x40B36495, 0x60441DF4, 0x6722F539, 0xCFE76C48,
40459 +0xB6B94C9F, 0x9ADB4B6A, 0x1EBBA65F, 0x5B5081AF,
40460 +0xB764423C, 0xB6F910E3, 0x14AC4B6F, 0x5C811E82,
40461 +0xAA36E5F1, 0x24EC82AF, 0xA2F1C050, 0x0504324C,
40462 +0x304CED0F, 0x01E31DD9, 0xC82EC7E6, 0xD55AFFF9,
40463 +0xFFB3047B, 0x3006F2E9, 0xC725BCD1, 0x7DCC1082,
40464 +0xA9A22CF8, 0x64D5AF9D, 0x389C34AD, 0x7DFF37C6,
40465 +0x41F1509D, 0x1845B3FE, 0x055C23F0, 0xC6291F5F,
40466 +0xCDD3C7DD, 0x5F0356B4, 0x7FD2C387, 0x494A091E,
40467 +0x50C69D3E, 0xFE769A5A, 0x63904701, 0x8960ABF2,
40468 +0xE68EDF3A, 0x0AB57C8E, 0x0B9D0A6C, 0x51888148,
40469 +0x50C5D533, 0xC69038FA, 0x3ACBE661, 0x0CAEB601,
40470 +0x8C14AB6C, 0xBA86D94F, 0x0724056B, 0x0FEFFCBA,
40471 +0x12449DDB, 0xABFFECCE, 0xB12A2BD7, 0x7260A0E8,
40472 +0xBE184A48, 0xCFD3CA3F, 0xDF088660, 0x78EE9B67,
40473 +0xA9EDB113, 0x4FD5D353, 0x8E348CC6, 0xD578C337,
40474 +0xF0493BE9, 0xCCFB54EC, 0x9CEEF85C, 0x0CAAE15E,
40475 +0x371AD12F, 0x9C5B9270, 0x2495F0DE, 0x06DE2DBB,
40476 +0x911AE7EC, 0xEEDE3363, 0x6DD38D6C, 0x2AF7F3D9,
40477 +0x51C8D118, 0xF23818A7, 0x95438AEA, 0x3A8A798F,
40478 +0x230D2BEF, 0x3D16273C, 0x9C36FF83, 0x785C9537,
40479 +0x3E42AF2F, 0x12A16741, 0xE58D0DC4, 0x33EBEFF9,
40480 +0x6F1972DA, 0x128C9BAA, 0x858D6032, 0xDAF185E1,
40481 +0xAE355065, 0xDE0086F3, 0x0F661A65, 0xF4334169,
40482 +0xB1559BA6, 0x3892109A, 0xE903BA00, 0xAE0CBD58,
40483 +0x073C21A0, 0xFCADB299, 0xB4E39AF1, 0x78475459,
40484 +0xB46DC847, 0xDBA97661, 0x15D118F5, 0x01ED48D0,
40485 +0x99F658BC, 0x399FDC8E, 0x44D4A919, 0x7C2CE4B9,
40486 +0xCA0367CC, 0xCC2B9828, 0x16AACAA6, 0x7AA5B6BA,
40487 +0xFEC77C66, 0x231B22F9, 0xC8BE0D04, 0x6FF2788C,
40488 +0x5F9CEBB5, 0x901EAA5D, 0xDE682BBF, 0x998E70D4,
40489 +0xBD9CCCDA, 0x6995441E, 0x5702F360, 0xBC035EED,
40490 +0x20F60B51, 0xD57361D8, 0xC071113B, 0x73CE6CE4,
40491 +0xC6569DC9, 0xD24B89ED, 0xA6052276, 0x8CEE2026,
40492 +0xFBF5B58E, 0xF692DF81, 0x6B7CDD7C, 0xF5B6C04C,
40493 +0xEC1BBA29, 0xD6AC8CDD, 0x320491F8, 0x1D812AC7,
40494 +0x631B0051, 0xD08A4D2A, 0x569746DD, 0xAA653FCF,
40495 +0xA92E8E70, 0xC59A6705, 0x278EA1FF, 0x63E5FA17,
40496 +0x1C20E82D, 0x550F7CE3, 0x55CED415, 0x5F9C4C4A,
40497 +0x7D746311, 0x5B07976A, 0x12477E31, 0xAB8113AA,
40498 +0x796EDCEA, 0x4A90E4B4, 0xB36E6188, 0xEE7D5E0F,
40499 +0x15CEA060, 0xB81AB2CA, 0x296D22B0, 0xFA0753E2,
40500 +0x0D0D15BB, 0xD4AF8BD7, 0x951FA575, 0xCBEBD58A,
40501 +0x0AF5C362, 0x9EF43FB0, 0xD97E5184, 0xA14469BC,
40502 +0xCAE5D55E, 0x93D4CDF9, 0x95B013A8, 0x6998F35C,
40503 +0xF1DDC0B1, 0x476F9FC7, 0xB6472B70, 0x1D55AC5C,
40504 +0xF0E0C0C8, 0x95372BF5, 0x75CCCDBE, 0x9F9D2003,
40505 +0xCAAD0D51, 0xEE54CC2E, 0xE5EBDBF0, 0x9B248BB3,
40506 +0x4BF07D19, 0x542997E9, 0x17447C4B, 0xCF2B2768,
40507 +0x86118A5B, 0x57579F12, 0xC5CD9E74, 0x97ED5724,
40508 +0x01BD2EE4, 0x2A0403A6, 0x01833741, 0xA1E8D364,
40509 +0x4D1A2EEA, 0x62760377, 0xA10D6861, 0x09C68E2F,
40510 +0xAB482850, 0xACD24B74, 0x5038C8CA, 0x71DE3A93,
40511 +0x671D25E4, 0x9EA7AC1A, 0x3E7287F5, 0x9FC963CF,
40512 +0x73F90AB6, 0xC775D840, 0x00B868D9, 0xF6A9BE3D,
40513 +0x17FFB472, 0x5D2389E3, 0x0D42A149, 0x2FAB1235,
40514 +0x90A7998E, 0xD895F6EE, 0x19921013, 0xEE42EA48,
40515 +0xC5D19A17, 0x5507890A, 0x9F893B29, 0x4FF39F19,
40516 +0xD6EF85AD, 0x3FFB1599, 0xF1761017, 0xFC51B90D,
40517 +0x8F6C566B, 0x44BAC7A4, 0x2B2E3755, 0xABECB8DB,
40518 +0x5C4A1629, 0x837CC4F7, 0x3E732B0A, 0x803CE303,
40519 +0x71865D8D, 0x346665AB, 0x58BF809B, 0x100626AA,
40520 +0x9446AB13, 0xD53ADCDA, 0x75C0BFCD, 0x95853304,
40521 +0xF4758E87, 0xD6B64517, 0x13293D0D, 0xEC9368FB,
40522 +0xD449A2CC, 0xAA17B0BE, 0x9D0B85C0, 0x77BEED16,
40523 +0x7699CAE7, 0xC776D10D, 0x962D48CE, 0x838D00BE,
40524 +0x279AEBF9, 0x22EF837B, 0x58E46DAD, 0xB56B6305,
40525 +0x3232D58B, 0x167969DB, 0x5B63F5B5, 0x7E82B175,
40526 +0x05DDB402, 0x5AB29BBA, 0xF3B627D5, 0x97168C85,
40527 +0xAD9EE022, 0x48F0CEEA, 0x84104C22, 0x690FCC19,
40528 +0xCA2F2474, 0x76F95539, 0x9FD2B987, 0x79EFC557,
40529 +0xCEE5DA4D, 0x27EB98F6, 0xA0628916, 0x8E05614F,
40530 +0x8AC89026, 0x7705135E, 0x3F7E42B8, 0x7BCD773B,
40531 +0xF98B9741, 0xCB8A514E, 0x9298220D, 0x5665FA3A,
40532 +0xE66A1FF7, 0xAC4ECB71, 0xA7E56FEF, 0x9D1EF7F8,
40533 +0x23566B64, 0xB4FE822E, 0x1AA53208, 0xF4545E5D,
40534 +0xEA86C879, 0x18F6B7C2, 0xE10A17AC, 0xBD37011F,
40535 +0xFBDF81B8, 0xA978A4EB, 0xD42437A7, 0x474E6A41,
40536 +0xF8885248, 0xF750BAA9, 0xD238EA62, 0xD69BA74D,
40537 +0x266EC6BF, 0xE7EDE077, 0xE8F0A303, 0x8B56A96D,
40538 +0x41380980, 0xDDF0B16C, 0x00E83594, 0xA503EBF5,
40539 +0x960A258E, 0x499827BD, 0x6C8E6F7B, 0x166C845D,
40540 +0xC842C934, 0xBAEFC699, 0xD9846213, 0x832EC19B,
40541 +0x1EAD7599, 0x221E7EE9, 0x8176A313, 0xB28D8E39,
40542 +0xBAC29A96, 0xB964F91F, 0x3F268150, 0xD4BB7011,
40543 +0x347EC445, 0x7FDC9E82, 0xEB70F4C9, 0xA6F38EBF,
40544 +0x398CF137, 0xD7F88CF5, 0xCBDDCB3F, 0xA0DAFA74,
40545 +0xD29D30AD, 0x822B6919, 0xCE059949, 0x3A946183,
40546 +0xDE4C572D, 0xD1E6D844, 0xC43C7DAC, 0xDBBEEDD0,
40547 +0xA656DF6D, 0x454C22A9, 0x9FA48790, 0x69B04531,
40548 +0x99BB305F, 0x80500F71, 0xFE2363C2, 0xB67F538F,
40549 +0x302EC0C3, 0x4A6E3458, 0x57E4CFD4, 0xE65CDAEB,
40550 +0xF31ABB31, 0x62DF98AC, 0x894AE781, 0xB1588AB1,
40551 +0x45D5CC3E, 0x3520F5B0, 0xC72D0CB7, 0xA1D6CBF9,
40552 +0x742FFA63, 0xA0A5224F, 0x5EA1C85A, 0xB81E9F77,
40553 +0x31D76C4F, 0x525257F5, 0xBFF85009, 0x2125B270,
40554 +0x16E47E6E, 0x9128B981, 0x0D5FBE39, 0xF67A418C,
40555 +0xCF3C71CB, 0xAC04ABE1, 0x9B550AAF, 0xB5077F18,
40556 +0xFB7C5EC0, 0x64784DB4, 0x1E668B48, 0x84659836,
40557 +0x604457BF, 0xF6F69C8D, 0x394301DC, 0xED0211BD,
40558 +0x8BAC1A3A, 0xBB752FD2, 0x78B8C036, 0xBCB98E8A,
40559 +0x33C595DE, 0xB3F3C5F8, 0x698666AC, 0xA1F42D7A,
40560 +0x5751ACC8, 0xC069575B, 0x35D50F99, 0xB294BF38,
40561 +0x82A4A331, 0x05147751, 0xCAE18C12, 0x9E89AAF1,
40562 +0x3531C372, 0xB2114A88, 0x41797201, 0xDDDDEC10,
40563 +0x01185F2A, 0xDED50CDC, 0x72156BAD, 0x88F3DB94,
40564 +0x50450DDF, 0x6B1E7ABF, 0x3D317708, 0xFDFF5A15,
40565 +0xDC8B1697, 0xCC2248FD, 0xD9196272, 0x4445195D,
40566 +0x54D90281, 0x7A891C9D, 0x69FF98D5, 0xADE6D74B,
40567 +0x26D27973, 0x0F14734F, 0x3F957FC8, 0x812AC874,
40568 +0xEDC0F9B4, 0xD31D6D75, 0x7A2608C3, 0xD89984B1,
40569 +0xF581081A, 0xEDB9DF6F, 0x16ECC191, 0x6B945724,
40570 +0x1BCE8269, 0x02E6DB68, 0x56362541, 0x9D247CF4,
40571 +0xA5265E72, 0x2C8B9413, 0x1157DB4B, 0x3145CFB2,
40572 +0xFBDEBCF5, 0x1042B117, 0x284DAE18, 0x10575C21,
40573 +0x1DDE578E, 0x80F59EDE, 0xCAB51C04, 0xB594BDA8,
40574 +0x08ACEF85, 0x08C8D4C7, 0x7304D433, 0xE87D3A88,
40575 +0x31CCFED8, 0x1D8E71E5, 0xC5A2F02C, 0xACBF3B5E,
40576 +0xAA161BCA, 0xA10BE577, 0xF9CE41D2, 0x2B86F031,
40577 +0x3D4A8D23, 0xED926DE4, 0x3844E21F, 0xFE57BCD0,
40578 +0x36DC309D, 0x17137409, 0x9F6A8507, 0x14CF12EB,
40579 +0xA770AFB5, 0x7C6DA2E4, 0x856B48B8, 0x2EA235DF,
40580 +0x55BD1164, 0x5BD9FF0C, 0x5228C552, 0x9E719AFA,
40581 +0x3EC3703B, 0xE06A94F3, 0x296FF0D9, 0xE468D9C9,
40582 +0xD2A15CDC, 0x6C4EAAA2, 0x2AF3B8BF, 0x6B6EDC78,
40583 +0x42B78972, 0x4C97A66C, 0x161C30BF, 0xCD2816DC,
40584 +0x431BDA17, 0xD9653022, 0x67D95E39, 0xBCB18342,
40585 +0x227982E7, 0x23C5B11B, 0x514420AB, 0x089F3A5C,
40586 +0x2B2F8244, 0x2F2A80C8, 0xB0A90558, 0x75BAA243,
40587 +0xE2FC4F62, 0xEB0A6104, 0xB7F221B2, 0x4ECD79DF,
40588 +0xB3E08B8B, 0xBA25E1CB, 0xD39F3431, 0xB50202FE,
40589 +0x78F15ECE, 0xEFF61ECF, 0xB3CDDD50, 0x3FD064A8,
40590 +0x96B028BC, 0xB29DD4E1, 0x7E9EC629, 0xC407F4D1,
40591 +0x8C21785B, 0xE11767BA, 0xCFE6DE26, 0x0DA98E22,
40592 +0x33AC5670, 0x0FDBC175, 0xF11F8EF5, 0x60638843,
40593 +0x8B67E55A, 0x3F27F75B, 0x6691FB98, 0x635A35A9,
40594 +0xB317459C, 0xE7419C01, 0x8BAB28D7, 0xE347D791,
40595 +0xEFC019A0, 0x45009041, 0xA6DEB3E8, 0x6F7379FF,
40596 +0x0FF50390, 0x810BEE78, 0xAD13716B, 0xA7DBD7AB,
40597 +0xEF439D4B, 0xDDA744A5, 0x31EDDE8D, 0xA85B71F2,
40598 +0xDF439C70, 0xA7E3DA94, 0x525ED453, 0x3D913C32,
40599 +0xD104CE61, 0x42F5FFED, 0x14C7625A, 0x4E5B314B,
40600 +0xA7EAD1ED, 0xFA01D595, 0xE67BCF06, 0xE63685E2,
40601 +0x3A32E9D3, 0x374C25F0, 0xA8E8A41D, 0xA403AEF5,
40602 +0x901A194C, 0x17605BC9, 0x8522DD12, 0x27096BAA,
40603 +0x017434B7, 0x99C8D2DA, 0x7F96B068, 0x8521CD09,
40604 +0x529B46D6, 0x47852810, 0x021BC8BF, 0x93C98329,
40605 +0x6FE73A78, 0x44DB69A9, 0xC839D490, 0xCAC42AFE,
40606 +0xCF1ECCF4, 0x6F2E5F44, 0x795C8219, 0xA06C667B,
40607 +0x80411F31, 0xB09926E1, 0xC62B6C18, 0x77C6E6DD,
40608 +0x7622FC07, 0x02162DB2, 0x3EA31334, 0x6CC02B4A,
40609 +0xAA6B81C3, 0x4424A9A5, 0x26BD2EF3, 0x334896D6,
40610 +0xADDD2711, 0x76035757, 0x80AA328E, 0x2F39C06E,
40611 +0x357520CB, 0xF62BDF46, 0xC59343C4, 0x7CA4CAE2,
40612 +0x89B03EF3, 0x251A785B, 0xA4755BB9, 0x262D478D,
40613 +0x462E6252, 0x6B5F6BED, 0xCA46E77B, 0xA2CF08AD,
40614 +0x561E19EA, 0xBF31AA15, 0xD376F44C, 0xCC332150,
40615 +0x8C0AEE42, 0xC06D5F91, 0xDADF8613, 0xBE0FA22C,
40616 +0xF50AE482, 0xE3615501, 0xECC8D5AA, 0x58A7FD3E,
40617 +0xD59B8CC9, 0x09DB0987, 0xF1D9753D, 0x9C79E20E,
40618 +0x9A222AEA, 0xC4E58914, 0x6712E0A2, 0x8CD5C80E,
40619 +0xEAB8AA56, 0xDBFA8D9C, 0x3515BD21, 0xB65B9E0C,
40620 +0xF0D27FEE, 0xE33871C1, 0xEE8FE52F, 0x02ACCB3F,
40621 +0xE9197277, 0xB7B70770, 0xA26E3581, 0x82481E7F,
40622 +0x005AF99F, 0x8B970B4B, 0xEC74B662, 0x2F21C5A3,
40623 +0x049DBA83, 0x495B3E1B, 0x112234B8, 0x95B42A5F,
40624 +0x2C8FA833, 0x6D706E30, 0x2AAAEC09, 0xDE7C3377,
40625 +0x06CE9D46, 0x7574EAAB, 0xFCB1A08D, 0x462AFB6C,
40626 +0x192847B2, 0xCC149AC3, 0x427834CE, 0xE90180A0,
40627 +0x946E526E, 0x6018BE4E, 0x20442F52, 0x1D39FA05,
40628 +0x35F690AD, 0x29DB3A53, 0x6360158C, 0x3EC815F8,
40629 +0xDED650AF, 0xFA168B37, 0x233F8A3D, 0x245009CF,
40630 +0x71BB2237, 0x4989A01C, 0xD58AE4F1, 0x62C99EA0,
40631 +0x48E9056E, 0x7E1A786D, 0xBF6CBAAB, 0x22669A6B,
40632 +0x57857590, 0xE4558CE3, 0xBC6C63EC, 0x6AE02A61,
40633 +0xA2ABFBBB, 0xD2B2FE90, 0xDF8BDB43, 0xEC2D59AC,
40634 +0x7B6AFDC3, 0x6B001D5F, 0x3DFEE08F, 0xB9A597D6,
40635 +0x09DEAC68, 0xE42D9E73, 0x2E33507C, 0x6525F051,
40636 +0x0D7143C6, 0x01DD115B, 0x94180279, 0x28FC60D7,
40637 +0xC0900603, 0xED4FBE53, 0xFC0677BD, 0x7DA2A878,
40638 +0xA8D0EC73, 0xF6A09B2A, 0x24A129EE, 0x169BCA2F,
40639 +0xE0BAE526, 0x5C8E2FCB, 0xA218EFFA, 0x842B61FB,
40640 +0x87B860CD, 0x106E9B86, 0x930685F0, 0xC5A72109,
40641 +0xFB977BD5, 0x9D3B4AC6, 0xDA378FE0, 0x0AAF747B,
40642 +0x0408D50D, 0x488785B9, 0x81AE971D, 0x12ADFEF3,
40643 +0xF0B64128, 0x3D4C90BB, 0xC994AAA1, 0xB854400E,
40644 +0x901AE3DD, 0x7A4A0DE7, 0x18E07456, 0x20C38BCD,
40645 +0x94441976, 0xE2E419C2, 0xDBD3C92F, 0x4DD63841,
40646 +0xE2994959, 0xF41F196D, 0x0835431A, 0x93A2E9CF,
40647 +0xB01FABED, 0xD0135535, 0xEBCEA18D, 0xC4F83A1B,
40648 +0x5D72845C, 0x04335E3A, 0x68C4C987, 0x77178710,
40649 +0xC5293A9A, 0x44E40AE1, 0xCE454FDE, 0x71DE89B7,
40650 +0xA373D9D3, 0x6D19E483, 0x812896D6, 0xC3231C14,
40651 +0xE960ABA4, 0xB7FB6F83, 0x1F7C4EB8, 0xD10DBE69,
40652 +0x8575CF6E, 0xC03B15D5, 0x4D7F4EF3, 0xF0615F31,
40653 +0x34E21762, 0x22D5A7A1, 0x729FA3F8, 0x2E1050FB,
40654 +0x8A9F46DC, 0x535EB5A7, 0xD143560E, 0xF8EC3A4B,
40655 +0x2249FD06, 0xE8E2AB08, 0x1E734127, 0xBA5B635A,
40656 +0xD8F419DB, 0x0B5200D0, 0x8110304F, 0x3497DA80,
40657 +0x35CA71CD, 0x0FD8227E, 0x086C74E2, 0xAB68A1AF,
40658 +0xE3BD57EC, 0x83B42D29, 0x3C2D672D, 0x05D85CED,
40659 +0x64F04926, 0x91364A12, 0x7FC73349, 0xEBA1FC77,
40660 +0xECE0D20D, 0xB1DDDB9B, 0xEB6B492B, 0x0FC02BB6,
40661 +0x56201D76, 0xED20F79E, 0xFC6034FB, 0x6A539F1D,
40662 +0x520FECBF, 0x4E3AECF6, 0x76B01C74, 0xEFC421D4,
40663 +0x82AC989A, 0x407A77CD, 0x6D287BFE, 0x26617425,
40664 +0xEA2316C3, 0x8616554E, 0x9F4C4535, 0x88C0C6C1,
40665 +0xEAC4F0F7, 0x32C7DD93, 0x41D9C37E, 0x2A9CBB2E,
40666 +0x0591BAEF, 0x2BE43F21, 0x5E06EE4D, 0xDDDF5525,
40667 +0xEC137DBE, 0xF0AA295C, 0xF2C9FDE2, 0x5DF9D693,
40668 +0x10A6CAC0, 0xC6846D09, 0xF1DDABF3, 0xD56F8BBC,
40669 +0xAA5DCE9D, 0x6F59004F, 0xB8A035BC, 0x61F47282,
40670 +0xC89DAC9E, 0xFC7E5B3D, 0x4C5406DD, 0x54CFD147,
40671 +0xBB44AB2A, 0x791269C0, 0x8CF66B4D, 0xD01A3190,
40672 +0x636F45CA, 0xB32FC209, 0xCB8B9F49, 0xF46D74B9,
40673 +0x5AFC9BD0, 0xC4C716C1, 0xF98C54F3, 0x36AFF013,
40674 +0xB4D6D90B, 0x5F1299B6, 0xA3BFCFA4, 0xEA336AAD,
40675 +0xCCD443DA, 0x74CA40B4, 0x31EF1614, 0x36D3FFEE,
40676 +0x876AE252, 0xC8D62E9F, 0x6424F397, 0x1F730F2D,
40677 +0xB20FDA53, 0xFCFEE60F, 0x676A61C3, 0x26C5E143,
40678 +0xC201573E, 0x4A8C46BE, 0xEF87D0A9, 0xE07E80B4,
40679 +0x34F20109, 0x8B936A70, 0x9F8E0305, 0xF3297CA0,
40680 +0x4E7BF0E9, 0x0F374BB9, 0xCE78A01E, 0x5FE26DD8,
40681 +0xA3826ACF, 0x321F69AB, 0x441AF14E, 0x8AC19CF7,
40682 +0x4BFD1AD6, 0x5951ABD1, 0x098C17F0, 0xA9B75F76,
40683 +0xA462551B, 0x6B703A12, 0xEDCB57B2, 0x8CD4C933,
40684 +0xD338D3D8, 0xE343FC24, 0x9CDD52EB, 0x17A41942,
40685 +0x63A8EF50, 0x215BB11A, 0xE1E25CB6, 0xB62C0A88,
40686 +0xE58CDEC3, 0xC0E6389A, 0x2B7BEE55, 0xA3FCBD07,
40687 +0x7CD451FE, 0xB06F6724, 0x5675A7EA, 0x141D52FC,
40688 +0x05E86E9B, 0x53D75C3A, 0xE799AA2A, 0xE474384C,
40689 +0x8C85E6E6, 0xA477A8D7, 0xA1E6AB0C, 0x9033E7CD,
40690 +0x2F55D504, 0x4DAE81FB, 0xBD229A64, 0x862765C9,
40691 +0x5B6A85F0, 0x95A39328, 0x38826CFB, 0xBF7DEBA4,
40692 +0x42EFAB62, 0x2D0BBA60, 0xB06731AF, 0x16D4C4B0,
40693 +0xCA4B9264, 0x3DF24AE2, 0xFED93848, 0x7CB33B08,
40694 +0xAC9CAE9F, 0xA0F80B61, 0xA66CF713, 0x9364865F,
40695 +0xDFA1E0B3, 0xFE6DF33F, 0x8039A612, 0x119F60BF,
40696 +0xCEEDE309, 0xD28316A8, 0xCD61D2F5, 0x3CBEB015,
40697 +0x85C0BF51, 0x6EDBBC15, 0x79F3D207, 0x485EE4FA,
40698 +0xCEC302EA, 0x59D8B92D, 0x51C1FB36, 0xF4FE8B71,
40699 +0x2DBD5718, 0x84024040, 0xFDD6590F, 0xA1CE9CC9,
40700 +0xC4AEAB72, 0x0A2FE8BF, 0x28C33618, 0xBA4E15FB,
40701 +0xA9C72819, 0xA3EE45D7, 0xD2DC52F1, 0x3FC84A2E,
40702 +0x1C9DF73E, 0x632F9BDE, 0x7E9FBD20, 0x0D689B79,
40703 +0x91E8D5C0, 0x6EE7952C, 0x905F192E, 0x2D79E712,
40704 +0x8670A7A2, 0x1DBFC4D9, 0x64634429, 0xE636043B,
40705 +0x643C6B0F, 0x50AF327B, 0x0E734D61, 0x2D7D6E46,
40706 +0xB877DCD6, 0x7CCF4F1A, 0xDF4D8CF8, 0x0E7FA78E,
40707 +0x0CBC4EC2, 0xAE9B4A22, 0x4F02D49C, 0x48F09C43,
40708 +0x5031B1A0, 0xDCB8A1FC, 0x91C73599, 0xCF00A64D,
40709 +0xDFCE561E, 0x8B18157D, 0xE1ED6A81, 0xCF94EF36,
40710 +0xB412CE1A, 0x602E2076, 0x716B0F3F, 0xADEB32C0,
40711 +0xD4E16094, 0xEC95D41F, 0x75858767, 0x438AD1A1,
40712 +0xE61C5527, 0x0D71FBB2, 0x2A99D070, 0x5C018826,
40713 +0xCCCC27FD, 0x053883D9, 0xF1D30EF5, 0x676AD38A,
40714 +0xDF81AB28, 0x2257FB9D, 0x373313AE, 0x67E1FE8A,
40715 +0xF4F66B02, 0xAFF8C7FA, 0x3B60D94D, 0xD44D0FE2,
40716 +0x5FCDFE4B, 0xC63010B6, 0x06CFCCF4, 0x09D8DD85,
40717 +0xAB79F2BE, 0xD5C0C498, 0x7364E4FD, 0xB295CEDF,
40718 +0xDB89A068, 0x59A6A0C7, 0x0C823207, 0x7380FCFE,
40719 +0x6E33C4B9, 0x0744E4F2, 0xF663BB33, 0x9EE512CE,
40720 +0x870ED35B, 0xB4502654, 0x367CD4FD, 0x5D4238D9,
40721 +0xEAB2B86E, 0x6E8ADDAA, 0xF080EDD6, 0x1DC90F46,
40722 +0xB1FC9127, 0x63771392, 0x96729BF6, 0xD18E1413,
40723 +0x5D85938D, 0xB8CED349, 0xF9B886C1, 0xCA486562,
40724 +0xBAA9ED7A, 0x049718D8, 0x7CF8E67A, 0x1702843C,
40725 +0x6DCDC34E, 0x93C51F83, 0x2415A4F3, 0xA8D77B3A,
40726 +0x0FB823E8, 0x424F03C3, 0x9CAA503C, 0x7AA5433F,
40727 +0x3BDD74FE, 0x99D3332E, 0x1E62231B, 0x90A4E595,
40728 +0x7EDA974D, 0x43E2CD14, 0x27DB9D9F, 0x561F5CC6,
40729 +0xA77EABA6, 0x97867B48, 0xAD6533CE, 0xEB726CF4,
40730 +0x5857B217, 0x2D7DA10B, 0xD939C20E, 0x81F1F073,
40731 +0xF42DEAF2, 0x3AD7780E, 0x88C77661, 0xD2E819B2,
40732 +0xF872F581, 0x999F0C5A, 0x3887ABA4, 0x27F95B6D,
40733 +0x991D9458, 0x9D1BB131, 0x6ECC5298, 0x9E9A7B26,
40734 +0x6E65F271, 0xE90FA04C, 0x7B692AA0, 0x878943D5,
40735 +0x924895E5, 0x041BC73A, 0x448E28B2, 0x61D22D1F,
40736 +0xE7969773, 0xBC8E5980, 0x9A198852, 0xB94415C9,
40737 +0xA02374BA, 0x340BD5F3, 0x27F2A0FF, 0x39BDB33F,
40738 +0xCC042BCF, 0x83D6C135, 0x9C7A8D8E, 0x05823C23,
40739 +0x2D7A3F91, 0xE792BCCA, 0xA2D82177, 0x73C82E7E,
40740 +0xBEBC9613, 0x9F596CB0, 0x6E784AA7, 0x1B7BDA9F,
40741 +0x846391F7, 0x852AD070, 0xF831E8CA, 0x16A78223,
40742 +0xF68F5250, 0xE2554493, 0xD38F2AFB, 0x764BA7A8,
40743 +0x3CAEFC55, 0x6E9B9037, 0xD87D486E, 0x7352AEA9,
40744 +0x11987EE0, 0xDF7E84DA, 0x2838E736, 0xA8C7BAC2,
40745 +0xF49E21EE, 0xFAD106E9, 0x7363AC6F, 0x5E9974CB,
40746 +0xBA008BB0, 0xAF5DB3FC, 0x7AC3CFD7, 0x2D55EDC6,
40747 +0x2C1C9AD7, 0x6A3AA494, 0x5F0E0A3A, 0x37422BFA,
40748 +0x83B4D594, 0xB7ECCF66, 0x82FCCDD0, 0x8ECBFD79,
40749 +0x664B9341, 0x02F178A2, 0x2095C8E0, 0xFC5F17B7,
40750 +0x1810BA9B, 0x964E4CD1, 0xFBAED808, 0xDEE87796,
40751 +0x63DE4F69, 0xC99275DD, 0x65242304, 0x7AB5C28B,
40752 +0x01BB7A3B, 0xC85D7716, 0x32AFB9A3, 0x2ED2CBB1,
40753 +0xB194218F, 0x21FE560D, 0xCB4503A5, 0x5CE0464D,
40754 +0xC4AE9A3C, 0x061530CB, 0xEDA38E6B, 0x4029D3E6,
40755 +0xB0C20336, 0xA37825C0, 0xC68F8B37, 0x9405AD3B,
40756 +0x8B1A8F99, 0xA761DE8B, 0x683B3259, 0xA154C554,
40757 +0x6BD835C9, 0x6DEAE35A, 0xBEAE6D49, 0x21D8B074,
40758 +0x46C01B31, 0xBE9B3A16, 0x1D611EAA, 0x423AB74C,
40759 +0x931F5AF5, 0xBB9E289A, 0xA4101132, 0x4A8BE0D7,
40760 +0x3307E4B2, 0xDE78DB5E, 0x347EB5CE, 0x13EEE999,
40761 +0x2C2D7955, 0xBA893EBA, 0x5DFC2EC1, 0xE7DD7A5F,
40762 +0x5E1C64D8, 0x4552E447, 0x1837D8E4, 0x9711836B,
40763 +0x3219F893, 0x04392C84, 0x3E94848C, 0x15E5F481,
40764 +0x0EC58819, 0x7341D458, 0x4AE63711, 0x85C1FD1F,
40765 +0x97B58BD7, 0xB0550EBE, 0xB9108743, 0x6F53B386,
40766 +0x7A73F31B, 0xE07CF8B9, 0x61FF27C8, 0x06A9A8B4,
40767 +0xEB0F2BB9, 0x46D275FB, 0xCF39B474, 0xC34F3B6D,
40768 +0x52F2F119, 0xD87963BF, 0xC60BF16C, 0x7797D0AD,
40769 +0x7EA4DBF0, 0xD21409C7, 0xF678A927, 0x638E67CD,
40770 +0x93261AED, 0xEA9B25FE, 0x1EBCAFDC, 0x580CC829,
40771 +0x58D1DA1A, 0x658881F8, 0xC48DB682, 0xD42E8CB4,
40772 +0x1DF33D74, 0x31C04F68, 0x7D871E29, 0xAE11FD72,
40773 +0xD7E8F8F6, 0x530D9D9C, 0x580A0715, 0x0F17B1A3,
40774 +0xB863F42F, 0xA6A4DC08, 0x82773E76, 0x9354B309,
40775 +0xE17D0770, 0x04E4DE5B, 0x712EA396, 0x49D37B55,
40776 +0xAE4109BA, 0x03862DC9, 0x7BCF61D2, 0x43CA2017,
40777 +0x23BDD50F, 0x74577459, 0x4E8F4E23, 0xBF924C1A,
40778 +0xE4EC70CE, 0x37FBEC66, 0xA6DA8935, 0xE11F4090,
40779 +0x5C8F9EE3, 0x19D167EC, 0x9EE4F2C5, 0x64A81E6C,
40780 +0xB35642BB, 0x82083A01, 0x001CA1F6, 0xAA69C7E8,
40781 +0x685F24D9, 0xE6868E31, 0x38ADD8F0, 0xA2FDD44E,
40782 +0xEE0C491D, 0xC60B1E9A, 0xF7A89268, 0xFD784F35,
40783 +0xC6B7335C, 0x75EFCEC1, 0xE2D9F7CF, 0xE1C364F8,
40784 +0x7CC63B2C, 0xC179E2AD, 0x56C193A5, 0x5134FB69,
40785 +0x35058BB5, 0x36F4BCD5, 0xDF4A08C2, 0x14AA2330,
40786 +0x760C8CD8, 0x2C562394, 0x0BEB669B, 0x2301973A,
40787 +0xAF5C4FF2, 0x1C770AAB, 0x25DD2087, 0x732AADC4,
40788 +0x59054958, 0x59DDCBE4, 0x74CFC8A8, 0x7C015016,
40789 +0x32A0276E, 0x8F1C2E93, 0x0CE91F71, 0x055C307A,
40790 +0x435D967E, 0xF4C33704, 0x5BDF2AD7, 0x8855099C,
40791 +0x307B2736, 0xBB6B19CB, 0x626349D3, 0x8F52ABFA,
40792 +0x251A1ED6, 0xE0587BC0, 0x12831408, 0xDA83CABF,
40793 +0xAB2C7DFD, 0x6BCF0271, 0x72058DF0, 0x17AFC1DD,
40794 +0xFFC52C30, 0x551401E0, 0x9EED54DF, 0x14E951E4,
40795 +0x14624B3F, 0x4C24650B, 0x5A65F86B, 0xE94F6143,
40796 +0xDC7CE9CF, 0x94D5D8F3, 0x093B0A04, 0x22098D01,
40797 +0xEDF09E7C, 0x165EDB0F, 0xD09CA774, 0xB96AA141,
40798 +0xB5745978, 0x9D820434, 0x42B0E026, 0x96938A25,
40799 +0x72E8634B, 0xBE36EC02, 0x42F3F74B, 0x358FA621,
40800 +0xBD451484, 0xB43A75D1, 0xB0A57F91, 0x701A7C82,
40801 +0x484B3F46, 0x047F78AD, 0x65F7371C, 0xEAC8A954,
40802 +0xE59F6354, 0x3EEEFB4E, 0xF131954B, 0x1C00BAC2,
40803 +0xE3897637, 0x5FEC83AB, 0x58CFA2C4, 0x1F4C0A6A,
40804 +0x97956BC6, 0x63D11D7D, 0xB46179D0, 0x11039A75,
40805 +0x1B50E088, 0x68E9476B, 0xAA68DB55, 0x8A4A051E,
40806 +0xEFA0DDF5, 0x05A2A674, 0xFFE03E72, 0xC5A0295C,
40807 +0x6FD4D834, 0x8E42BB94, 0xF3DFD88E, 0xBA691AD2,
40808 +0x3458473E, 0x6269A348, 0x72962FB6, 0x86D5064B,
40809 +0x8A153740, 0x54AC97D8, 0xED2CE057, 0x68200474,
40810 +0xBBA8E19D, 0xBFDD08F3, 0xB0DF76D1, 0x62F29649,
40811 +0x5AB77030, 0x1EE9A00E, 0x7DAB1C90, 0xAB608FFD,
40812 +0x8506A853, 0x75B9339B, 0x1AE0CCBA, 0xFB60BB79,
40813 +0x8650F92F, 0x4819E1F7, 0x0A7045A8, 0xB5BCE5F1,
40814 +0x77A98B27, 0x03DE21E4, 0x3FE3F132, 0x106827EC,
40815 +0xD4DC1469, 0xAAC82F9B, 0x1D5953A1, 0x8034B369,
40816 +0xD4412B6F, 0x90FB9F25, 0x14279070, 0x6D98AF1C,
40817 +0x3D286F37, 0x8324A732, 0x58123E4E, 0xEB051032,
40818 +0xC15CD557, 0xEB82DE99, 0x6213434E, 0x39F0FC9C,
40819 +0x5EBFE1C5, 0x8CEBF470, 0xFF7D8D8A, 0x740A6A3E,
40820 +0x720D080C, 0xB73B74FA, 0x5173F96E, 0x9FC01794,
40821 +0xDABF1C81, 0xCA813295, 0xBEA2DB8D, 0x4C7E0CE4,
40822 +0x8051BA67, 0xE63399E2, 0x83A15EE4, 0x47F4A718,
40823 +0xD8246E6A, 0x0B4F87BE, 0x031648B8, 0x99E3E3E6,
40824 +0x4ABCC64F, 0x52768181, 0xE708372B, 0x2D0B1D2C,
40825 +0x4DF52402, 0x389BE9F6, 0xDE2F3232, 0x5D43D74E,
40826 +0xD37BB898, 0xE7272645, 0x9B5432DA, 0x9D7A9473,
40827 +0xA69628A5, 0x583555A7, 0x255B08BD, 0xAD68EAE3,
40828 +0x1A79982D, 0xACE09726, 0x15E576AD, 0x260EB406,
40829 +0xA7440B46, 0x66B6D317, 0xBE6ECA3B, 0x3ADEA1C1,
40830 +0xD80399C3, 0x0EF198D0, 0xFAEE2010, 0xEF2E8E56,
40831 +0x5B6CC402, 0x3FD27BE2, 0x970AAB5F, 0x618C17C6,
40832 +0x7F5022FB, 0x552FC1FA, 0x5DD82984, 0x09769539,
40833 +0x98812D1F, 0xBD8B2539, 0xD78AD9A6, 0x1CE41D07,
40834 +0x272A0AB7, 0x5CB7E101, 0x6F42D56A, 0x001D930E,
40835 +0x3C17C305, 0x30AAE354, 0x2A4AABE0, 0x922BCB94,
40836 +0x73F34C1C, 0xE07E1501, 0xCB55A3E1, 0x0CDC3669,
40837 +0xD9C07DE7, 0x2DAB82BF, 0x963EACAA, 0x9B05E0F1,
40838 +0xE2DA0EFA, 0x0613BFE5, 0xDFB605E9, 0x5DCCA8FD,
40839 +0x6D433873, 0x81A9B4C5, 0xD1D1CB14, 0x9B6A9906,
40840 +0xC104767C, 0x30101D37, 0x186FBB79, 0x8F95D488,
40841 +0xA3094F43, 0x7F17C981, 0xFD92B3FE, 0xADAB3AB5,
40842 +0x20D1406C, 0x9462C8E7, 0x5D64819D, 0xB3E85196,
40843 +0x67B854FE, 0x7D039FC6, 0xAD98A85E, 0xF672E041,
40844 +0x30FA19A9, 0x4A276EB8, 0xB7041D2E, 0x57BB21E2,
40845 +0x4E251667, 0x15C5401E, 0xDAB59431, 0xD6C6FD1F,
40846 +0x1726EB70, 0x900F4E84, 0xD327DE33, 0x7A0AE04B,
40847 +0x76B1174E, 0xFD547B94, 0x370832DC, 0xDDE65CDD,
40848 +0x74672C02, 0x164703FE, 0x34CAD31F, 0x3E692DED,
40849 +0x4BC38FA5, 0x143F99E5, 0x61BB640E, 0xB957BC8D,
40850 +0xC9DD9E35, 0x2B5CB310, 0xADD6EAD0, 0x91981D46,
40851 +0xED803D57, 0x61D7737C, 0x92D3AC3E, 0x36A034CB,
40852 +0xE1395DC5, 0x5F2070F8, 0xC5EE9F8A, 0x70546B88,
40853 +0xC9EA230C, 0x58DC3073, 0x57CBBEB7, 0xA0B78CFE,
40854 +0x0B3FE75B, 0x07ADACCD, 0xC292C338, 0xD70CD7E5,
40855 +0x729D8F4E, 0x218FA041, 0x10EC1199, 0xAC1EC51D,
40856 +0x5DECC8D1, 0xBA36230A, 0xBC41F5A5, 0x75864896,
40857 +0xB4403D4A, 0xFEEE8F44, 0x8D94A256, 0x62BA0115,
40858 +0x3A570C61, 0x9221C583, 0xD2981A6B, 0xFD8AAF5A,
40859 +0x2A102D59, 0x64083BDD, 0xBD1AADE6, 0x7E6D1E99,
40860 +0x20568A6D, 0x8DFA704B, 0x87D27122, 0x2EFDAB7D,
40861 +0xF3AF9D39, 0xD8DED0B2, 0x2D4B34B9, 0x12F3E32C,
40862 +0xA6BCBE65, 0x680029A1, 0x094B07B3, 0xDA5918ED,
40863 +0xF7D0A86D, 0x1A7E18C8, 0x9285A97F, 0x2040282C,
40864 +0x5B133531, 0xA48237AC, 0x3557BC1B, 0x7E6ED77B,
40865 +0x436234C7, 0x9B2094DE, 0x5D967593, 0x8867D1C4,
40866 +0x88EC3948, 0xE7F84AD4, 0x1871B3E6, 0xE8E992C6,
40867 +0xA16DC2F8, 0x0DFDF590, 0x9B56238D, 0x329017F5,
40868 +0xBF9BD409, 0x68BD9B1C, 0x4036C4FF, 0x3BF6D93C,
40869 +0xAE100602, 0x90B43508, 0xA85B4013, 0x2C66EA54,
40870 +0x227D32D7, 0x0BA526D1, 0x075213B8, 0x1A3DED07,
40871 +0xD458DFFD, 0xDC8ACD43, 0xAC7809AB, 0x2D25408A,
40872 +0xD8F0C887, 0xAD8CD30D, 0x4054F61E, 0xA9F0CCA3,
40873 +0xBFEBD31D, 0x6D2BAB1E, 0xF8E42D8B, 0x6C94A4E4,
40874 +0x1158D2A3, 0x93F44EFE, 0x8AD05A25, 0x8C229D32,
40875 +0xB213D76E, 0xDFE63822, 0x561986EC, 0x806CA082,
40876 +0x6DB3BF8D, 0x1E850D30, 0x8F7A44C0, 0x75BB3328,
40877 +0x86C7BE12, 0xDE5C44BD, 0xDF4D048E, 0x968712C3,
40878 +0xB1B41CF8, 0xCC194FE9, 0xDA2E1A8D, 0x72A08662,
40879 +0x5ABA2536, 0x223E2013, 0xA5A923A5, 0x7565B5DD,
40880 +0xBCA0A2B0, 0x0C29864B, 0xAAD8CB87, 0xE4C7E559,
40881 +0x77E19E51, 0x194E54ED, 0x54DD1B54, 0x0FAD37A7,
40882 +0x0EF6B0E3, 0x0E3A2FC8, 0xA0063995, 0xE17AE20E,
40883 +0xDC11B7F8, 0x85F1A76D, 0xD97858D4, 0xB763E49C,
40884 +0xB5BE7EC4, 0x3CE924C4, 0x4246019D, 0xD33DBB27,
40885 +0x737863A7, 0x32C26BDD, 0x714897A3, 0x36091018,
40886 +0xF26BC990, 0xDDB640B0, 0x448F5B12, 0xD7A5EB4B,
40887 +0x5614EEA4, 0xCA4912FB, 0x011F9D6C, 0xA4FC90AB,
40888 +0x9FB4982D, 0x20AD146F, 0x4B7AB74E, 0x107A9411,
40889 +0x71DBA90A, 0xD510E3D2, 0x248D0D35, 0xB666229E,
40890 +0x61EE1EEA, 0x702031B5, 0x36992A7B, 0xC90C08CB,
40891 +0x6478995A, 0xE6C2BA7A, 0x8A9179AC, 0xC8EE2956,
40892 +0x27B042C8, 0x48DB81D9, 0xAA39F2CB, 0x5E4D5F3C,
40893 +0x24FFD6B9, 0x5B562C2F, 0x00FD33B6, 0x435F5F52,
40894 +0xF392FFC1, 0x0E927C40, 0x5508CBAB, 0x976AA567,
40895 +0xA13E7C52, 0x532109E9, 0x16B9021F, 0x60C615A1,
40896 +0x1D23C258, 0xFD783147, 0x63600FB1, 0xAAA245F0,
40897 +0x9B3DC1E1, 0x7B270D0D, 0x5B1632CE, 0x8B871F7F,
40898 +0xC535EFF8, 0x73109C6A, 0xEB83D02D, 0xF7AE76FB,
40899 +0x2E39E502, 0xA4128216, 0xF90D57E5, 0xFF0C465E,
40900 +0x02008029, 0xE5CBBA1F, 0x4280FA3C, 0xCDBD75C8,
40901 +0xCB4AF342, 0x17695A4E, 0xAA6162B5, 0x8660A679,
40902 +0xD1A8701C, 0x47694CA7, 0xDA8D43FD, 0x44A4BC1B,
40903 +0xAB34B9AA, 0xE55563DD, 0x08D4142B, 0x81197AC8,
40904 +0x997B1DC2, 0x2E7CC50A, 0x7A326A21, 0xA76419DB,
40905 +0xEA8B5428, 0x65729140, 0x051DAF66, 0x8871BCA9,
40906 +0xA175E5BF, 0x60310C98, 0xB7DE8929, 0x35E2459E,
40907 +0x08EB4547, 0x904D7B2B, 0x29382CC4, 0xCEC8664E,
40908 +0x1E8C9C2C, 0x3B942134, 0x9CEC5D55, 0xDA548376,
40909 +0x2E4EFD61, 0x26F65F09, 0x5A3DD7CA, 0x2FD4E58D,
40910 +0x6B71B8C2, 0x13189115, 0x2B5542BA, 0x1CE85C2C,
40911 +0x5B9FE09D, 0x68704BFE, 0xB15313B9, 0x3EF2729E,
40912 +0x583ECC31, 0xA3DED8CA, 0xFCD27C3D, 0x904DAB39,
40913 +0xFE1069A4, 0xE99A57BA, 0x112EB80C, 0xE1483C74,
40914 +0x8A27B0D7, 0xA58F7325, 0x7CD050A1, 0x626D4F3E,
40915 +0x51643657, 0xA967FC59, 0x5BACBC0B, 0x2CF3E459,
40916 +0x7D8988D9, 0x53913DF8, 0x2381A6FC, 0x64D6D441,
40917 +0x48AE9101, 0x185D9539, 0x1B044AEC, 0xB5ABCEDD,
40918 +0xFA8ECA52, 0x8CCDD142, 0x96FD4442, 0xD865FEDF,
40919 +0xCE4EE2FA, 0xA5160AE9, 0xC91B2B3A, 0xF993F45F,
40920 +0x1509132C, 0x920ECC5F, 0xD813DDC1, 0x834B68E4,
40921 +0xD5E876A0, 0x61DE0E41, 0x4C143913, 0xC7293985,
40922 +0x17E226E7, 0x38830927, 0xDC604DF2, 0x799D1430,
40923 +0x846585AB, 0xE5D21E38, 0x6381D136, 0x1B60633B,
40924 +0x23B7AE14, 0x554E53CC, 0x5807A210, 0x30560866,
40925 +0x12F79E62, 0xE27B5D45, 0x3889C1E5, 0x47F845FF,
40926 +0xFFD9DE98, 0xB10E09D2, 0x4A184A72, 0x083D2971,
40927 +0x8AB7478D, 0x92380377, 0x57A724EC, 0xBBBD5CA6,
40928 +0xE2FB9D32, 0xAB6ADFC6, 0x3916DED4, 0x4E19438F,
40929 +0xE21E15CF, 0x6AF4BCC9, 0x8D08924A, 0x1662BAA9,
40930 +0x3064AD27, 0xB86D7EE4, 0x88624C62, 0x1A0BF3E7,
40931 +0xF3E4A287, 0x6787F006, 0x01375D4B, 0x998BB38F,
40932 +0x6D669A29, 0xD760B093, 0xC4768853, 0xF041100F,
40933 +0x35DE10DD, 0xE06C8BB8, 0x2C79A902, 0x60600DAD,
40934 +0x6E11CF5C, 0x18778777, 0x7CCE406C, 0xE54AF2EA,
40935 +0x7472C475, 0x73DBEE7E, 0xE533DC40, 0xB07407DD,
40936 +0xF6ACA8D3, 0xE71BD7D1, 0x4BD3514D, 0xC5C362CA,
40937 +0x0690E5A1, 0x0FFDC8D8, 0x58188645, 0x8636413C,
40938 +0x3412A033, 0xAF4FC340, 0xA5DFEAB8, 0xB87272E3,
40939 +0xA4A9219F, 0x29696E90, 0x35D2F627, 0x8794DBD7,
40940 +0x5D2D87F8, 0xFA73559D, 0x7D22F440, 0xF50197E9,
40941 +0xEB74B829, 0x8F9649CF, 0x16F47D30, 0x5C7D9870,
40942 +0x36FF6C0B, 0x313A92ED, 0x303B3654, 0xE3E33CCA,
40943 +0x02C26ECC, 0x26949920, 0x4445DF20, 0x01FDBC98,
40944 +0x49138C6F, 0x1B5555E2, 0x122B45D2, 0x4B2E0202,
40945 +0x7B6014D4, 0xFAE0CD09, 0x77E165A0, 0xFBE76980,
40946 +0xF5808BD3, 0xFD110E5E, 0x97450E11, 0x297F9B1F,
40947 +0x607A2C41, 0xE384DFC9, 0x25D9A8DC, 0xF919D955,
40948 +0x5E025993, 0xCC318847, 0x9717D2D5, 0x48F0DD1F,
40949 +0x6CC4A8EB, 0x9BD0F4E1, 0x506F2A93, 0x18B8748E,
40950 +0x16FFBA48, 0x552E4955, 0xB963F64F, 0xA1A34AC8,
40951 +0x62E95CC7, 0x4D87EA89, 0x21E8C031, 0xC1F0ED07,
40952 +0x28B7BB22, 0x0B838D04, 0x6361B440, 0xA653521C,
40953 +0x92DA3F78, 0x4241CFED, 0xFAFCBD41, 0x3EFAB6BC,
40954 +0x25F30607, 0x41BB70DA, 0x9FF3440A, 0x2502039E,
40955 +0x3813EC82, 0xC6A4FD6B, 0xF8537C8C, 0x098ED49F,
40956 +0xE0A0BD6E, 0x6BA2F2B3, 0xC35C9D9D, 0x1256E66A,
40957 +0x790B2490, 0xD5C69889, 0x39E712FE, 0xCF73DE0B,
40958 +0x41B3B614, 0x745ABD73, 0x654C79D8, 0x5B15923D,
40959 +0x8C15F218, 0x585CCCF0, 0x624F7B44, 0x76BDDFDB,
40960 +0x96F26B52, 0xE13058A1, 0x086C950E, 0x29519DEA,
40961 +0xA42CFE04, 0x0D7A190B, 0xD0678C6A, 0xABB78679,
40962 +0xBA48A2E4, 0x5F3DA10A, 0x11F04183, 0xAC720A3F,
40963 +0x6A807781, 0x6F146BFB, 0xE8A67934, 0x54578834,
40964 +0xAA60C8F0, 0x2061A1E6, 0x9E87799B, 0x68D91F86,
40965 +0x8974F540, 0xB1C3F101, 0x99C21E56, 0xB57BA73F,
40966 +0x8B2DAA3E, 0xF1E2D24E, 0x48F7D4EE, 0x7039FDB3,
40967 +0xC666EEDC, 0x251F972E, 0x4D53F6BF, 0x6CC73EE7,
40968 +0xCB07F7B9, 0x69ECB8CA, 0x363FD80C, 0x3B587AB3,
40969 +0x738C1E5C, 0x5C9C1D92, 0xE7B52396, 0xEDE6324B,
40970 +0xFE5B5045, 0xC90D8B3E, 0x371A0128, 0xF2C8DCF8,
40971 +0x5B648CB5, 0x12F8E8FF, 0x5FE4BA71, 0xB925CFBE,
40972 +0x7416E14F, 0x76489FFE, 0x1F4DE367, 0xA400F039,
40973 +0x66390E83, 0x1AE79CEC, 0xDB573E98, 0xB6021F29,
40974 +0xD01615E5, 0x02A2281F, 0xE85019C1, 0x027BB41F,
40975 +0x8D9177C3, 0x79026E78, 0xF158B623, 0xBEFF5858,
40976 +0x7B63518E, 0x8F42C08C, 0xB388227D, 0x940D607A,
40977 +0xA4C79541, 0x9800CC91, 0xA356B535, 0x285BABB9,
40978 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
40979 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
40980 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
40981 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
40982 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
40983 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
40984 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
40985 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
40986 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
40987 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
40988 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
40989 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
40990 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
40991 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
40992 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
40993 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
40994 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
40995 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
40996 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
40997 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
40998 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
40999 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41000 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41001 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41002 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41003 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41004 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41005 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41006 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41007 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41008 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41009 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41010 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41011 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41012 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41013 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41014 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41015 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41016 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41017 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41018 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41019 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41020 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41021 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41022 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41023 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41024 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41025 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41026 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41027 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41028 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41029 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41030 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41031 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41032 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41033 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41034 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41035 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41036 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41037 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41038 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41039 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41040 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41041 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41042 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41043 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41044 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41045 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41046 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41047 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41048 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41049 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41050 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41051 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41052 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41053 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41054 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41055 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41056 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41057 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41058 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41059 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41060 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41061 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41062 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41063 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41064 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41065 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41066 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41067 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41068 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41069 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41070 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41071 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41072 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41073 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41074 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41075 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41076 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41077 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41078 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41079 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41080 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41081 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41082 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41083 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41084 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41085 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41086 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41087 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41088 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41089 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41090 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41091 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41092 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41093 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41094 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41095 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41096 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41097 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41098 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41099 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41100 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41101 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41102 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41103 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41104 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41105 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41106 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41107 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41108 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41109 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41110 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41111 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41112 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41113 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41114 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41115 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41116 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41117 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41118 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41119 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41120 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41121 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41122 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41123 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41124 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41125 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41126 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41127 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41128 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41129 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41130 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41131 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41132 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41133 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41134 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41135 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41136 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41137 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41138 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41139 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41140 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41141 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41142 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41143 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41144 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41145 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41146 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41147 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41148 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41149 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41150 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41151 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41152 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41153 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41154 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41155 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41156 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41157 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41158 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41159 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41160 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41161 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41162 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41163 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41164 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41165 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41166 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41167 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41168 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41169 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41170 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41171 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41172 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41173 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41174 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41175 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41176 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41177 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41178 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41179 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41180 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41181 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41182 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41183 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41184 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41185 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41186 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41187 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41188 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41189 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41190 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41191 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41192 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41193 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41194 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41195 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41196 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41197 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41198 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41199 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41200 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41201 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41202 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41203 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41204 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41205 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41206 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41207 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41208 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41209 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41210 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41211 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41212 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41213 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41214 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41215 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41216 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41217 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41218 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41219 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41220 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41221 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41222 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41223 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41224 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41225 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41226 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41227 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41228 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41229 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41230 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41231 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41232 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41233 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41234 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41235 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41236 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41237 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41238 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41239 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41240 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41241 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41242 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41243 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41244 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41245 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41246 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41247 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41248 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41249 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41250 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41251 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41252 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41253 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41254 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41255 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41256 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41257 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41258 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41259 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41260 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41261 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41262 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41263 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41264 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41265 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41266 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41267 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41268 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41269 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41270 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41271 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41272 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41273 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41274 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41275 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41276 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41277 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41278 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41279 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41280 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41281 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41282 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41283 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41284 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41285 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41286 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41287 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41288 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41289 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41290 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41291 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41292 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41293 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41294 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41295 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41296 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41297 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41298 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41299 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41300 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41301 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41302 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41303 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41304 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41305 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41306 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41307 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41308 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41309 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41310 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41311 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41312 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41313 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41314 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41315 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41316 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41317 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41318 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41319 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41320 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41321 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41322 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41323 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41324 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41325 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41326 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41327 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41328 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41329 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41330 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41331 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41332 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41333 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41334 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41335 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41336 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41337 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41338 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41339 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41340 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41341 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41342 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41343 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41344 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41345 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41346 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41347 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41348 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41349 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41350 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41351 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41352 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41353 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41354 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41355 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41356 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41357 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41358 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41359 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41360 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41361 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41362 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41363 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41364 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41365 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41366 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41367 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41368 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41369 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41370 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41371 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41372 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41373 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41374 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41375 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41376 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41377 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41378 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41379 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41380 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41381 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41382 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41383 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41384 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41385 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41386 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41387 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41388 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41389 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41390 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41391 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41392 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41393 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41394 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41395 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41396 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41397 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41398 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41399 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41400 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41401 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41402 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41403 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41404 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41405 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41406 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41407 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41408 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41409 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41410 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41411 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41412 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41413 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41414 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41415 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41416 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41417 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41418 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41419 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41420 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41421 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41422 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41423 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41424 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41425 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41426 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41427 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41428 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41429 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41430 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41431 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41432 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41433 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41434 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41435 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41436 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41437 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41438 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41439 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41440 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41441 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41442 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41443 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41444 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41445 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41446 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41447 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41448 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41449 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41450 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41451 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41452 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41453 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41454 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41455 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41456 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41457 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41458 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41459 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41460 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41461 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41462 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41463 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41464 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41465 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41466 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41467 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41468 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41469 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41470 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41471 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41472 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41473 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41474 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41475 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41476 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41477 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41478 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41479 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41480 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41481 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41482 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41483 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41484 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41485 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41486 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41487 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41488 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41489 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41490 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41491 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41492 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41493 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41494 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41495 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41496 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41497 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41498 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41499 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41500 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41501 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41502 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41503 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41504 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41505 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41506 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41507 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41508 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41509 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41510 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41511 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41512 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41513 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41514 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41515 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41516 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41517 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41518 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41519 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41520 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41521 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41522 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41523 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41524 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41525 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41526 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41527 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41528 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41529 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41530 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41531 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41532 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41533 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41534 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41535 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41536 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41537 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41538 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41539 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41540 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41541 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41542 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41543 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41544 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41545 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41546 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41547 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41548 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41549 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41550 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41551 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41552 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41553 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41554 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41555 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41556 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41557 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41558 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41559 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41560 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41561 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41562 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41563 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41564 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41565 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41566 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41567 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41568 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41569 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41570 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41571 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41572 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41573 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41574 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41575 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41576 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41577 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41578 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41579 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41580 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41581 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41582 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41583 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41584 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41585 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41586 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41587 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41588 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41589 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41590 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41591 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41592 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41593 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41594 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41595 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41596 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41597 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41598 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41599 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41600 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41601 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41602 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41603 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41604 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41605 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41606 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41607 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41608 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41609 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41610 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41611 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41612 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41613 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41614 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41615 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41616 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41617 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41618 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41619 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41620 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41621 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41622 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41623 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41624 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41625 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41626 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41627 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41628 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41629 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41630 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41631 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41632 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41633 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41634 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41635 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41636 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41637 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41638 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41639 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41640 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41641 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41642 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41643 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41644 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41645 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41646 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41647 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41648 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41649 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41650 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41651 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41652 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41653 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41654 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41655 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41656 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41657 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41658 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41659 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41660 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41661 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41662 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41663 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41664 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41665 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41666 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41667 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41668 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41669 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41670 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41671 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41672 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41673 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41674 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41675 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41676 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41677 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41678 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41679 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41680 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41681 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41682 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41683 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41684 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41685 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41686 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41687 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41688 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41689 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41690 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41691 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41692 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41693 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41694 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41695 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41696 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41697 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41698 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41699 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41700 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41701 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41702 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41703 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41704 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41705 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41706 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41707 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41708 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41709 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41710 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41711 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41712 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41713 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41714 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41715 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41716 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41717 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41718 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41719 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41720 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41721 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41722 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41723 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41724 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41725 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41726 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41727 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41728 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41729 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41730 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41731 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41732 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41733 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41734 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41735 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41736 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41737 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41738 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41739 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41740 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41741 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41742 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41743 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41744 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41745 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41746 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41747 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41748 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41749 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41750 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41751 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41752 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41753 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41754 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41755 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41756 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41757 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41758 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41759 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41760 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41761 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41762 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41763 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41764 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41765 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41766 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41767 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41768 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41769 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41770 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41771 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41772 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41773 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41774 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41775 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41776 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41777 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41778 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41779 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41780 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41781 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41782 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41783 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41784 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41785 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41786 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41787 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41788 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41789 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41790 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41791 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41792 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41793 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41794 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41795 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41796 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41797 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41798 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41799 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41800 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41801 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41802 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41803 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41804 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41805 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41806 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41807 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41808 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41809 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41810 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41811 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41812 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41813 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41814 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41815 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41816 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41817 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41818 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41819 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41820 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41821 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41822 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41823 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41824 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41825 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41826 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41827 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41828 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41829 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41830 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41831 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41832 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41833 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41834 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41835 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41836 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41837 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41838 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41839 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41840 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41841 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41842 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41843 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41844 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41845 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41846 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41847 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41848 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41849 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41850 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41851 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41852 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41853 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41854 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41855 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41856 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41857 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41858 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41859 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41860 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41861 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41862 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41863 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41864 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41865 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41866 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41867 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41868 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41869 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41870 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41871 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41872 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41873 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41874 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41875 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41876 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41877 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41878 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41879 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41880 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41881 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41882 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41883 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41884 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41885 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41886 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41887 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41888 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41889 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41890 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41891 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41892 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41893 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41894 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41895 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41896 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41897 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41898 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41899 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41900 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41901 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41902 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41903 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41904 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41905 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41906 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41907 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41908 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41909 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41910 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41911 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41912 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41913 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41914 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41915 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41916 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41917 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41918 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41919 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41920 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41921 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41922 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41923 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41924 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41925 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41926 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41927 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41928 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41929 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41930 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41931 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41932 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41933 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41934 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41935 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41936 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41937 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41938 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41939 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41940 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41941 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41942 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41943 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41944 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41945 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41946 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41947 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41948 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41949 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41950 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41951 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41952 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41953 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41954 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41955 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41956 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41957 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41958 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41959 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41960 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41961 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41962 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41963 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41964 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41965 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41966 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41967 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41968 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41969 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41970 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41971 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41972 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41973 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41974 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41975 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41976 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41977 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41978 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41979 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41980 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41981 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41982 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41983 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41984 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41985 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41986 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41987 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41988 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41989 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41990 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41991 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41992 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41993 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41994 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41995 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41996 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41997 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41998 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
41999 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42000 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42001 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42002 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42003 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42004 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42005 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42006 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42007 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42008 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42009 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42010 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42011 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42012 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42013 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42014 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42015 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42016 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42017 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42018 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42019 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42020 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42021 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42022 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42023 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42024 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42025 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42026 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42027 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42028 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42029 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42030 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42031 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42032 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42033 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42034 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42035 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42036 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42037 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42038 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42039 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42040 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42041 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42042 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42043 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42044 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42045 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42046 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42047 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42048 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42049 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42050 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42051 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42052 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42053 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42054 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42055 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42056 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42057 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42058 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42059 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42060 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42061 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42062 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42063 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42064 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42065 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42066 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42067 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42068 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42069 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42070 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42071 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42072 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42073 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42074 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42075 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42076 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42077 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42078 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42079 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42080 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42081 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42082 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42083 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42084 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42085 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42086 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42087 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42088 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42089 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42090 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42091 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42092 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42093 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42094 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42095 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42096 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42097 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42098 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42099 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42100 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42101 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42102 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42103 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42104 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42105 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42106 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42107 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42108 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42109 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42110 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42111 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42112 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42113 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42114 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42115 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42116 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42117 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42118 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42119 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42120 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42121 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42122 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42123 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42124 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42125 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42126 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42127 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42128 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42129 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42130 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42131 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42132 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42133 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42134 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42135 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42136 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42137 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42138 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42139 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42140 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42141 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42142 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42143 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42144 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42145 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42146 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42147 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42148 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42149 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42150 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42151 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42152 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42153 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42154 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42155 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42156 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42157 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42158 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42159 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42160 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42161 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42162 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42163 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42164 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42165 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42166 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42167 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42168 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42169 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42170 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42171 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42172 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42173 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42174 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42175 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42176 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42177 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42178 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42179 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42180 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42181 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42182 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42183 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42184 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42185 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42186 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42187 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42188 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42189 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42190 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42191 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42192 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42193 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42194 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42195 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42196 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42197 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42198 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42199 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42200 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42201 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42202 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42203 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42204 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42205 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42206 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42207 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42208 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42209 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42210 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42211 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42212 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42213 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42214 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42215 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42216 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42217 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42218 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42219 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42220 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42221 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42222 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42223 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42224 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42225 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42226 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42227 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42228 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42229 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42230 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42231 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42232 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42233 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42234 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42235 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42236 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42237 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42238 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42239 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42240 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42241 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42242 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42243 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42244 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42245 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42246 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42247 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42248 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42249 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42250 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42251 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42252 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42253 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42254 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42255 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42256 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42257 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42258 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42259 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42260 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42261 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42262 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42263 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42264 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42265 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42266 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42267 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42268 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42269 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42270 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42271 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42272 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42273 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42274 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42275 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42276 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42277 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42278 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42279 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42280 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42281 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42282 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42283 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42284 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42285 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42286 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42287 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42288 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42289 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42290 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42291 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42292 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42293 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42294 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42295 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42296 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42297 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42298 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42299 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42300 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42301 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42302 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42303 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42304 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42305 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42306 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42307 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42308 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42309 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42310 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42311 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42312 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42313 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42314 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42315 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42316 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42317 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42318 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42319 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42320 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42321 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42322 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42323 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42324 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42325 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42326 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42327 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42328 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42329 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42330 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42331 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42332 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42333 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42334 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42335 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42336 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42337 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42338 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42339 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42340 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42341 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42342 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42343 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42344 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42345 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42346 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42347 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42348 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42349 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42350 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42351 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42352 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42353 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42354 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42355 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42356 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42357 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42358 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42359 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42360 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42361 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42362 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42363 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42364 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42365 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42366 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42367 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42368 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42369 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42370 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42371 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42372 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42373 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42374 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42375 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42376 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42377 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42378 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42379 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42380 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42381 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42382 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42383 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42384 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42385 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42386 +0xE411E520, 0xA0024528, 0x442B4428, 0x96070009,
42387 +0x46106246, 0x8FFB2522, 0xD4027504, 0x0009AFF5,
42388 +0x00000FB3, 0x00200004, 0x00000000, 0x00000000,
42389 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42390 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42391 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42392 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42393 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42394 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42395 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42396 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42397 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42398 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42399 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42400 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42401 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42402 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42403 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42404 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42405 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42406 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42407 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42408 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42409 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42410 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42411 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42412 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42413 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42414 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42415 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42416 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42417 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42418 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42419 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42420 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42421 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42422 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42423 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42424 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42425 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42426 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42427 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42428 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42429 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42430 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42431 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42432 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42433 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42434 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42435 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42436 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42437 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42438 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42439 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42440 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42441 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42442 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42443 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42444 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42445 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42446 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42447 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42448 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42449 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42450 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42451 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42452 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42453 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42454 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42455 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42456 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42457 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42458 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42459 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42460 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42461 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42462 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42463 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42464 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42465 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42466 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42467 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42468 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42469 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42470 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42471 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42472 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42473 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42474 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42475 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42476 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42477 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42478 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42479 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42480 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42481 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42482 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42483 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42484 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42485 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42486 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42487 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42488 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42489 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42490 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42491 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42492 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42493 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42494 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42495 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42496 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42497 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42498 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42499 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42500 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42501 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42502 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42503 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42504 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42505 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42506 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42507 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42508 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42509 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42510 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42511 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42512 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42513 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42514 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42515 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42516 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42517 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42518 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42519 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42520 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42521 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42522 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42523 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42524 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42525 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42526 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42527 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42528 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42529 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42530 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42531 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42532 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42533 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42534 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42535 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42536 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42537 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42538 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42539 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42540 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42541 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42542 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42543 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42544 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42545 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42546 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42547 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42548 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42549 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42550 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42551 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42552 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42553 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42554 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42555 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42556 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42557 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42558 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42559 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42560 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42561 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42562 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42563 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42564 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42565 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42566 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42567 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42568 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42569 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42570 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42571 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42572 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42573 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42574 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42575 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42576 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42577 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42578 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42579 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42580 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42581 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42582 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42583 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42584 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42585 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42586 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42587 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42588 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42589 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42590 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42591 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42592 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42593 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42594 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42595 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42596 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42597 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42598 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42599 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42600 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42601 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42602 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42603 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42604 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42605 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42606 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42607 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42608 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42609 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42610 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42611 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42612 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42613 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42614 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42615 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42616 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42617 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42618 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42619 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42620 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42621 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42622 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42623 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42624 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42625 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42626 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42627 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42628 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42629 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42630 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42631 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42632 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42633 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42634 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42635 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42636 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42637 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42638 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42639 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42640 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
42641 +0x00000000, 0x00000000, 0x00000000, 0x16D49357,
42642 +0x0009000B, 0x4F222FE6, 0xDE947FFC, 0xE114D594,
42643 +0x1E13D494, 0x67521E4C, 0xD494D693, 0x37402769,
42644 +0x62528F06, 0x7201D692, 0x60602522, 0x2600C93F,
42645 +0xD7906152, 0x2512611D, 0x264B6652, 0x2562470B,
42646 +0x0009B00D, 0xE60095AC, 0xC84060E2, 0x2F028F03,
42647 +0x8FF93652, 0x7F047601, 0xA05A4F26, 0x4F226EF6,
42648 +0x410BD185, 0xD4850009, 0x0009440B, 0x450BD584,
42649 +0xD7840009, 0xD284E1FF, 0x2712611D, 0xD4835029,
42650 +0xE1FFCB01, 0x1209E501, 0x12112212, 0xE7202452,
42651 +0x4718D57F, 0x2572D27F, 0xD17FE700, 0xD680D47F,
42652 +0xE2012270, 0x24702172, 0xD67E2620, 0x2641E4FF,
42653 +0xD57DE600, 0x666DE104, 0x76016063, 0x4000626D,
42654 +0x8FF83212, 0xD5790545, 0x2520E201, 0xD279D778,
42655 +0x2710E100, 0xE5802212, 0x655C6613, 0x666DD476,
42656 +0x76046763, 0x374C626D, 0x8FF83253, 0xD4732712,
42657 +0xD573E101, 0xD6732410, 0x2542E400, 0xE03AE501,
42658 +0xD272D771, 0xE0390654, 0x27110654, 0x000B4F26,
42659 +0x7FC82211, 0xD76FD16E, 0xDC70DB6F, 0xD271DE70,
42660 +0xD572D471, 0x1F12D672, 0x1F76710C, 0x1FB877FC,
42661 +0x1FEA1FC9, 0x72041F2B, 0xDE6FDC6E, 0x1F13EB10,
42662 +0x1F511F44, 0x1F771F65, 0xD86C1F2C, 0xDD6DD96C,
42663 +0xD26DEA00, 0x89003A22, 0xD1587A01, 0x88016010,
42664 +0x56F98B03, 0x4218E201, 0xD1682622, 0x0009410B,
42665 +0x440BD467, 0xD5670009, 0x0009450B, 0x6010D14C,
42666 +0x8B108801, 0xE650D14B, 0x46186212, 0x8B083266,
42667 +0x56FAD147, 0x2120E200, 0xCB016062, 0x2602A003,
42668 +0x72012710, 0x60822122, 0x89098801, 0xE2C8D15A,
42669 +0x622C6612, 0x89033626, 0x6010D158, 0x8BC88801,
42670 +0x51F76792, 0x217252F6, 0xD6555191, 0x55FB2212,
42671 +0x52FC6462, 0x55612542, 0x2252E400, 0x61436643,
42672 +0x05DE6013, 0x36CC4608, 0x02DE2652, 0xC9036021,
42673 +0x8B028801, 0x720162E2, 0x74012E22, 0x36B3664C,
42674 +0x71048FEE, 0x66C2D147, 0x45286512, 0x265B4518,
42675 +0x60822C62, 0x89018801, 0x0009A168, 0x6272D742,
42676 +0x8B132228, 0xD726D541, 0x6552D441, 0x51436672,
42677 +0x316C365C, 0x27622668, 0x14138D05, 0x6262D63D,
42678 +0xB1A57201, 0xD61E2622, 0x2622E200, 0x52916692,
42679 +0x8B013620, 0x0009A144, 0x6061A06E, 0x001C001C,
42680 +0x001D4020, 0x0000B38E, 0xFFFF0000, 0x12340000,
42681 +0x001E1015, 0x00201278, 0x002018A0, 0x00201922,
42682 +0x0020128C, 0x001C3510, 0x001C3624, 0x001E212C,
42683 +0x0020397C, 0x00203514, 0x00203984, 0x00203990,
42684 +0x0020399C, 0x002039F8, 0x002039FC, 0x002039A4,
42685 +0x002039A5, 0x002039A8, 0x00117700, 0x00203A12,
42686 +0x00203578, 0x001142D8, 0x00203A14, 0x00203A16,
42687 +0x001C3D30, 0x00117718, 0x001C3D00, 0x001C1000,
42688 +0x001C36F8, 0x00117734, 0x001C3684, 0x00117710,
42689 +0x001C3520, 0x00117600, 0x00117740, 0x001C1028,
42690 +0x0020358C, 0x002039AC, 0x7FFFFFFF, 0x00201734,
42691 +0x002032BE, 0x002022E8, 0x00203DC0, 0x002039FA,
42692 +0x00203584, 0x002039EC, 0x001C3D2C, 0x001C36B0,
42693 +0x0020351C, 0x0011775C, 0x8801C90F, 0xA0CF8901,
42694 +0xD17C0009, 0x36206212, 0xD47B8904, 0x2421E200,
42695 +0x2162A0CC, 0x6211D179, 0x89012228, 0x0009A0C3,
42696 +0xE202D775, 0x75016571, 0x3123615D, 0x27518D02,
42697 +0x0009A0BC, 0xD27255F2, 0x62226052, 0x40094019,
42698 +0xC90F4009, 0x8F19880A, 0x52F31F2D, 0x40196022,
42699 +0x40094009, 0x8808C90F, 0xA0A78901, 0x60630009,
42700 +0x51F255F8, 0xE701CB01, 0x2502D263, 0xE1002172,
42701 +0x2211D564, 0x74016452, 0x2542A098, 0x8B3F8805,
42702 +0x602252F3, 0x40094019, 0xC90F4009, 0x8B168802,
42703 +0xE5FFD45D, 0x655D6742, 0x8B102758, 0x6272D75B,
42704 +0x8B0C3260, 0x55F257F8, 0x2762E101, 0xD5522512,
42705 +0xD757E400, 0x62722541, 0xA0777201, 0x52F32722,
42706 +0x40196022, 0x40094009, 0x8805C90F, 0x31B38B6E,
42707 +0xD5508B6C, 0x615257F4, 0x7101E240, 0x64722512,
42708 +0x1F4DD14D, 0x42182419, 0x8B033420, 0x6262D64B,
42709 +0x26227201, 0xE200D640, 0x2621B0AA, 0x0009A056,
42710 +0x3123E220, 0x88038B52, 0x52F38B1E, 0x40196022,
42711 +0x40094009, 0x8803C90F, 0xD7418B16, 0x647251F4,
42712 +0x7401D23D, 0x65122742, 0x1F5DE640, 0x46182529,
42713 +0x8B033560, 0x6262D63B, 0x26227201, 0xE200D62E,
42714 +0x2621B086, 0x0009A010, 0xD738D137, 0xD22A6412,
42715 +0xE5007401, 0x21423A76, 0x22518F06, 0xEA00D634,
42716 +0x72016262, 0x2622B074, 0x2FB2D532, 0x95406652,
42717 +0xD4305BF1, 0x36205241, 0x60618910, 0x8B01C803,
42718 +0x2B22E201, 0x8FF54510, 0x57F15664, 0x6272E1F0,
42719 +0x41284118, 0x2722221B, 0x6BF2A008, 0x6BF2A006,
42720 +0xE200D615, 0xD1152621, 0x2121E200, 0xE20256F5,
42721 +0x42186662, 0x26284228, 0x1F6D8D0C, 0xD61FD11E,
42722 +0x460B6511, 0x2008645D, 0x57F58904, 0x6272D11C,
42723 +0x27222219, 0xD11BE201, 0x66122822, 0x8B012668,
42724 +0x0009AE17, 0x450BD518, 0xD1180009, 0xAE10E600,
42725 +0x07D12160, 0x00203A0C, 0x00203A10, 0x00203A18,
42726 +0x001C3DC0, 0x0011772C, 0x001C3B88, 0x002039F4,
42727 +0x0011773C, 0x00117744, 0x0000F000, 0x00117764,
42728 +0x00117748, 0x00117768, 0x0011776C, 0x01FFFFFF,
42729 +0x0011774C, 0x00203584, 0x001142D8, 0x00114774,
42730 +0xFDFFFFFF, 0x00203DC0, 0x0020246C, 0x002039FA,
42731 +0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6,
42732 +0xD11F7FF4, 0x6212DE1F, 0x67E25411, 0xD41E1F41,
42733 +0x1F722F22, 0x6743D51D, 0x7794D21D, 0x5A425841,
42734 +0x6C726942, 0x6D225B16, 0xE6006052, 0x2502CB20,
42735 +0x7601E540, 0x3253626D, 0x62F28BFB, 0x212255F1,
42736 +0x55F21151, 0x2E52D613, 0x14A21481, 0xD4122492,
42737 +0x11B627C2, 0x674226D2, 0xD911DA10, 0x2A72E801,
42738 +0x1A8C490B, 0x4218E201, 0x7F0C1A2C, 0x6EF64F26,
42739 +0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, 0x000068F6,
42740 +0x001C3B9C, 0x001C3D98, 0x001C3700, 0x001C3500,
42741 +0x001C5960, 0x001C8960, 0x0020358C, 0x001C3D00,
42742 +0x00201610, 0x2F962F86, 0x2FC62FA6, 0x2FE62FD6,
42743 +0x4F124F22, 0x7F884F02, 0xE018DEB2, 0xD4B261E0,
42744 +0x61E30F14, 0x62107101, 0x440BE01C, 0x20080F24,
42745 +0x8F126D03, 0xD4AD1F08, 0x6740DDAD, 0x657CD4AD,
42746 +0x470BD7AD, 0xD2AD0009, 0x621C6120, 0x46086623,
42747 +0x36284608, 0x3D6C4608, 0xE01C1FD8, 0xE58004FC,
42748 +0x604C66E2, 0x3050655C, 0x2D628F17, 0x01FCE018,
42749 +0xDEA3E500, 0x641CA008, 0x6753655D, 0x607037EC,
42750 +0x31DC6153, 0x80147501, 0x3243625D, 0xD49D8BF4,
42751 +0xE200D59D, 0xA27F2421, 0x20082521, 0xE0188B13,
42752 +0xE50001FC, 0xA009DE96, 0x655D641C, 0x32EC6253,
42753 +0x62536722, 0x32DC6672, 0x75041261, 0x3243625D,
42754 +0xA2698BF3, 0x88012D10, 0xE0188B16, 0xE40001FC,
42755 +0x671C2D40, 0x624DDE8A, 0x8B013273, 0x0009A25C,
42756 +0x6DE3644D, 0x7D046243, 0x32EC6643, 0x652236DC,
42757 +0x74086162, 0x2512AFEF, 0x8B198804, 0x01FCE018,
42758 +0x2D70E700, 0x1FD56D1C, 0x627DDE7D, 0x8B0132D3,
42759 +0x0009A242, 0x6173677D, 0x31EC65E3, 0x75046412,
42760 +0x365C6673, 0x61426262, 0x21297708, 0x2412AFED,
42761 +0x8B198805, 0x01FCE018, 0x2D70E700, 0x1FD46D1C,
42762 +0x627DDE6F, 0x8B0132D3, 0x0009A226, 0x6173677D,
42763 +0x31EC65E3, 0x75046412, 0x365C6673, 0x61426262,
42764 +0x212B7708, 0x2412AFED, 0x8B598831, 0x61E6DE67,
42765 +0x61E31F19, 0x64E27104, 0x1F4A6216, 0x1F2B6416,
42766 +0x75E46513, 0x66536712, 0x1F4C7604, 0x64521F7D,
42767 +0xD75F6E66, 0x27E0D25F, 0xDE5F6062, 0xC9013245,
42768 +0x65622E00, 0x4609060A, 0x4609D15C, 0x46094509,
42769 +0x21501F4E, 0xB2B0646D, 0x620D1F6F, 0x8B012228,
42770 +0x0009A1EA, 0xD756DE55, 0x661C61E0, 0x6410D150,
42771 +0x470B654C, 0x7FFC54FF, 0x2FE25EFE, 0x51FE7FFC,
42772 +0x2F12E040, 0x55FBD14F, 0x57FD56FC, 0x04FE410B,
42773 +0xD24D7F08, 0xE11C640D, 0x1D412D10, 0xD44B6522,
42774 +0x67421D52, 0x1D73DE4A, 0xD24A65E2, 0x67221D54,
42775 +0x1D75D249, 0xD2496E22, 0x66221DE6, 0x1D67A1BC,
42776 +0x89018830, 0x0009A08E, 0xE340D538, 0x33FC6156,
42777 +0x23126456, 0x71046153, 0x67521341, 0x13726416,
42778 +0x7EE46E13, 0x65E66212, 0x66E3D731, 0x13246EE2,
42779 +0x760427E0, 0x6062D22F, 0x3255DE2F, 0x2E00C901,
42780 +0x060A6E62, 0xD12D4609, 0x4E094609, 0x13434609,
42781 +0x646D21E0, 0xB2501F5E, 0x620D1F6F, 0x8B012228,
42782 +0x0009A18A, 0xDE25D522, 0x61E06450, 0xD724654C,
42783 +0x470B54FF, 0x7FFC661C, 0x06FEE054, 0x7FFC2F62,
42784 +0xEE4001FE, 0x2F123EFC, 0x55E2D125, 0x57E456E3,
42785 +0x64E2410B, 0xD21C7F08, 0xE11C640D, 0x1D412D10,
42786 +0xD61A6522, 0x67621D52, 0x1D73DE19, 0xD2196EE2,
42787 +0x62221DE4, 0xD2181D25, 0x1D266222, 0x6222D217,
42788 +0x1D27A15A, 0x00117800, 0x00202A18, 0x00203996,
42789 +0x002035BC, 0x00203A7C, 0x002018D0, 0x00203995,
42790 +0x00117804, 0x00203A14, 0x00203A16, 0x00117810,
42791 +0x00203991, 0x10624DD3, 0x00203992, 0x00203993,
42792 +0x00114AA4, 0x00200F68, 0x001C5864, 0x001C6864,
42793 +0x001C7864, 0x001C59BC, 0x001C69BC, 0x001C79BC,
42794 +0x00200FC0, 0x8B048833, 0x470BD7A2, 0xA123EE00,
42795 +0x88282DE0, 0xA0D38901, 0xDE9F0009, 0x62E1E143,
42796 +0x3216E054, 0x0FE68F02, 0x2E21E240, 0x622D62E1,
42797 +0x8B013217, 0x0009A0BC, 0xE50185E1, 0x8B013056,
42798 +0x0009A0B6, 0x2D10E101, 0x64E1B111, 0x06FEE054,
42799 +0x6261E143, 0x3517652D, 0xE6408945, 0x8B0C3563,
42800 +0xE058E41A, 0xE5000F45, 0x72C0E05C, 0x60230F55,
42801 +0x6703C907, 0xA014E060, 0x66530F75, 0x46214621,
42802 +0x46214621, 0x45214621, 0xE0587618, 0x0F654521,
42803 +0xE0034521, 0xE05C2509, 0xE0070F55, 0xE0602209,
42804 +0xE8540F25, 0x858238FC, 0x640D65F3, 0x1844B170,
42805 +0xDD7A8584, 0x85866C0D, 0x610D4C08, 0x410860C3,
42806 +0xE00F0EFE, 0x18154D0B, 0x2E296207, 0x668260C3,
42807 +0x85620FE6, 0x4D0B5185, 0x2E0B600D, 0x548460C3,
42808 +0xB13C0FE6, 0xE05465F3, 0xE5400EFE, 0xE06C62E1,
42809 +0x3653662D, 0x0F668D41, 0xC9036023, 0x40004008,
42810 +0x61036403, 0xD965E070, 0x0F46E5FF, 0xE074655C,
42811 +0x60530F96, 0x6263490B, 0x42214221, 0x42214221,
42812 +0x42006723, 0x4200327C, 0x6C074621, 0x4621E054,
42813 +0x606309FE, 0x4008C903, 0x790630FC, 0x6A036D2D,
42814 +0x65F3E800, 0x64D3B124, 0xE0706EA2, 0x2AE22EC9,
42815 +0x01FE6694, 0x666CE074, 0x470B07FE, 0x2E0B6063,
42816 +0x65F32AE2, 0xB0FA64D3, 0x628D7801, 0x32E3EE06,
42817 +0x7D018FE7, 0x0EFEE054, 0xE05462E1, 0x420006FE,
42818 +0x760C8561, 0x701B302C, 0xE4006103, 0xE70465F3,
42819 +0x68667401, 0x3973694D, 0x8FF92582, 0x65F37504,
42820 +0x641DB0DD, 0x0EFEE054, 0x64E1B09C, 0x0009A054,
42821 +0xD43B56F8, 0xEA01D23B, 0x26A0420B, 0x0009A04C,
42822 +0x06FCE01C, 0x8829606C, 0x5CF88B08, 0xE200D636,
42823 +0x52612C20, 0x642DB04B, 0x0009A03E, 0x666CE681,
42824 +0x8B043060, 0x420BD231, 0xA03554F8, 0xE6820009,
42825 +0x3060666C, 0xD22E8B04, 0x54F8420B, 0x0009A02C,
42826 +0x666CE683, 0x8B0A3060, 0xDA2755F8, 0x2590E900,
42827 +0xD82855A1, 0x2852D628, 0xA01D52A2, 0xE6922620,
42828 +0x3060666C, 0xD2208B08, 0x5C21D824, 0x6CCC52F8,
42829 +0x28C1E600, 0x2260A010, 0x666CE693, 0x8B063060,
42830 +0xD61F59F8, 0xE201EA00, 0xA00529A0, 0xD6162621,
42831 +0xD21DD41C, 0x6562420B, 0x4F067F78, 0x4F264F16,
42832 +0x6DF66EF6, 0x6AF66CF6, 0x000B69F6, 0x4F2268F6,
42833 +0xE240614D, 0x89323123, 0x3127E21F, 0x8B27D713,
42834 +0xD406614D, 0xE00171E0, 0x5671440B, 0x26596507,
42835 +0x1761A025, 0x00200FBC, 0x00117804, 0x00203470,
42836 +0x00203A9C, 0x002018C0, 0x00117800, 0x00115F00,
42837 +0x00116058, 0x0020397C, 0x00203990, 0x00203A1A,
42838 +0x00203A16, 0x00203AB4, 0x002018D0, 0x001C3704,
42839 +0xE001D490, 0x6672440B, 0x26596507, 0x4F262762,
42840 +0x0009000B, 0x614D4F22, 0x3123E240, 0xE21F8912,
42841 +0xD7893127, 0x614D8B08, 0x5671D286, 0x420B71E0,
42842 +0x260BE001, 0x1761A006, 0x6672D282, 0xE001420B,
42843 +0x2762260B, 0x000B4F26, 0xE6400009, 0x46284618,
42844 +0x6252D57E, 0x89FC2268, 0x0009000B, 0x4618E680,
42845 +0xD57A4628, 0x22686252, 0x000B89FC, 0xA0010009,
42846 +0x7201E200, 0x8BFC3242, 0x0009000B, 0x4618E680,
42847 +0xD5734628, 0x22686252, 0x000B8BFC, 0x2FE60009,
42848 +0x7FFC4F22, 0xBFF16E53, 0x61E22F42, 0xE280D66D,
42849 +0x54E11615, 0x16464218, 0x422855E2, 0x57E31657,
42850 +0x16786EF2, 0x26E22E2B, 0x4F267F04, 0x6EF6AFCE,
42851 +0x2FD62FC6, 0x4F222FE6, 0x6C53DD62, 0x6E43BFD6,
42852 +0x2DE2BFBB, 0x0009BFD2, 0x2C1251D5, 0x1C4154D6,
42853 +0x1C5255D7, 0x1C6356D8, 0x6EF64F26, 0x000B6DF6,
42854 +0x61636CF6, 0xA004E600, 0x62564109, 0x24227601,
42855 +0x36127404, 0x000B8BF9, 0xD6530009, 0x8562E500,
42856 +0xA00B674D, 0x655D610D, 0x40006053, 0x305CD44F,
42857 +0x024D4008, 0x3270622D, 0x75018905, 0x3213625D,
42858 +0x000B8BF1, 0x000BE000, 0x2FE6E001, 0x54416743,
42859 +0x4E08EE7F, 0x4E28D246, 0x25E96543, 0x60436E21,
42860 +0x9E7562ED, 0x4529C903, 0xE60032E3, 0x8D456103,
42861 +0x21184509, 0xD23F8B05, 0x002C6053, 0xA08AC93F,
42862 +0x60136603, 0x8B268801, 0x880C6053, 0xD53A8B04,
42863 +0xC93F8453, 0x6603A07F, 0x8B048808, 0x84E2DE36,
42864 +0xA078C93F, 0x880D6603, 0x8B03D633, 0xC93F8461,
42865 +0x6603A071, 0x88096260, 0x622C8F09, 0xE014DE2C,
42866 +0x655C05EC, 0x60233258, 0xA064C93F, 0x60236603,
42867 +0xA060C93F, 0x88026603, 0xE0078B5D, 0x60432509,
42868 +0x8905C810, 0x6053D225, 0xC93F002C, 0x6603A053,
42869 +0x6053DE23, 0xC93F00EC, 0x6603A04D, 0x88016013,
42870 +0x60538B19, 0x8B04880C, 0x8423D21E, 0xA042C93F,
42871 +0x88086603, 0xD51B8B04, 0xC93F8452, 0x6603A03B,
42872 +0xD618880D, 0x84618B03, 0xA034C93F, 0x60606603,
42873 +0xA030C93F, 0x88026603, 0xE0078B2D, 0x60432509,
42874 +0x8923C810, 0x6053DE10, 0xC93F00EC, 0x6603A023,
42875 +0x00000BB8, 0x00203470, 0x001C3704, 0x001C373C,
42876 +0x001C3700, 0x001C370C, 0x00114000, 0x00114008,
42877 +0x001142D8, 0x001142E4, 0x001142E8, 0x001142F5,
42878 +0x001142ED, 0x001142FD, 0x00114309, 0x6053D209,
42879 +0xC93F002C, 0x60136603, 0x8B038802, 0xC8106043,
42880 +0x76028900, 0xC93F6063, 0x40004018, 0x1741240B,
42881 +0x6EF6000B, 0x00114301, 0x0009A16E, 0x2FE62FD6,
42882 +0xDD944F22, 0xA0049EB2, 0xD4930009, 0x420BD293,
42883 +0x62D265D2, 0x8BF822E8, 0x0009A004, 0xD28FD490,
42884 +0x55D1420B, 0x22E852D1, 0xA0048BF8, 0xD48D0009,
42885 +0x420BD28A, 0x52D255D2, 0x8BF822E8, 0x0009A004,
42886 +0xD286D489, 0x55D3420B, 0x22E852D3, 0xA0048BF8,
42887 +0xD4860009, 0x420BD281, 0x52D455D4, 0x8BF822E8,
42888 +0x6EF64F26, 0x6DF6000B, 0x2FD62FC6, 0x4F222FE6,
42889 +0x6E636C73, 0x6D53B01A, 0x64D357F4, 0xB05F65E3,
42890 +0xB07566C3, 0xB0A40009, 0xB0A80009, 0xB0AC0009,
42891 +0xB0AC0009, 0xB0AF0009, 0xB03154F5, 0x6CCD6C03,
42892 +0x4F2660C3, 0x6DF66EF6, 0x6CF6000B, 0x3412D170,
42893 +0xD6700529, 0x2650D770, 0x2742000B, 0x0009A018,
42894 +0x2FD62FC6, 0x4F222FE6, 0x6E636C73, 0x6D53BFEE,
42895 +0x64D357F4, 0xB03365E3, 0xB08D66C3, 0xB00F54F5,
42896 +0x6CCD6C03, 0x4F2660C3, 0x6DF66EF6, 0x6CF6000B,
42897 +0xE503D162, 0xD763D462, 0x21524518, 0x2472000B,
42898 +0xD45FD15E, 0x2162E600, 0x2462000B, 0xBF734F22,
42899 +0xBF73E40A, 0xD25C0009, 0x4118E104, 0xE40AE500,
42900 +0xBF692212, 0xD7592252, 0xCB206072, 0x000B4F26,
42901 +0x4F222702, 0x410BD156, 0xD556E400, 0x4F26452B,
42902 +0xD1552FE6, 0x66126E63, 0x92104418, 0x44084528,
42903 +0x45002629, 0x265B4408, 0x264B4400, 0x21624708,
42904 +0xD14E4708, 0x217227EB, 0x6EF6000B, 0x1FFF03F0,
42905 +0x4F222FE6, 0xE101DE4A, 0xBF3DE40A, 0x67E32E12,
42906 +0xE500776C, 0xE204E130, 0x2752E40A, 0x27522752,
42907 +0x27522752, 0x27522752, 0x27522752, 0x27522752,
42908 +0x27522752, 0x27522752, 0x27522752, 0x27522752,
42909 +0x27222712, 0x27522752, 0x27522752, 0x27522752,
42910 +0x27522752, 0x175ABF18, 0x2E62E600, 0x000B4F26,
42911 +0xD2346EF6, 0xE441E101, 0x000B2212, 0xD1322242,
42912 +0xE605D432, 0x000B2162, 0x000B2462, 0xD2300009,
42913 +0xE40AE601, 0x2262AF00, 0x2FC62FB6, 0x2FE62FD6,
42914 +0x7FFC4F22, 0x6C43DB2B, 0xED0060B2, 0x2B02CB03,
42915 +0xC90360B2, 0x6E03A008, 0x89073DC2, 0xE46460B2,
42916 +0xB07CC903, 0x7D016E03, 0x8BF52EE8, 0x8F043DC2,
42917 +0xD4212FE1, 0x460BD621, 0x62F10009, 0x6023622D,
42918 +0x89FFC801, 0x7F046023, 0x6EF64F26, 0x6CF66DF6,
42919 +0x6BF6000B, 0x001C3B88, 0x00203AC8, 0x002018D0,
42920 +0x00203AD0, 0x00203AD8, 0x00203AE0, 0x00203AE8,
42921 +0x0025E720, 0x00203DBC, 0x00203980, 0x001C5968,
42922 +0x001C3B40, 0x000F8000, 0x001D4004, 0x001C3500,
42923 +0x002015E4, 0x00201610, 0x001C5814, 0x001C59D0,
42924 +0x001C5830, 0x001C6268, 0x001C59A4, 0x001C639C,
42925 +0x001C581C, 0x001C5860, 0x00203AF0, 0x002018C0,
42926 +0x8F014411, 0x6043604B, 0x0009000B, 0x5651D52B,
42927 +0x46286052, 0x306C000B, 0x2FC62FB6, 0x2FE62FD6,
42928 +0x4F124F22, 0xBFF14F02, 0x6B036E43, 0xDD25DC24,
42929 +0x0009BFEC, 0x3C0530B8, 0x4609060A, 0x46014609,
42930 +0x020A3D65, 0x42094209, 0x32E24209, 0x4F068BF0,
42931 +0x4F264F16, 0x6DF66EF6, 0x000B6CF6, 0x2FC66BF6,
42932 +0x2FE62FD6, 0x4F124F22, 0xBFCF4F02, 0x6C036E43,
42933 +0xBFCBDD13, 0x30C80009, 0x060A3D05, 0x46094609,
42934 +0x36E24601, 0x4F068BF5, 0x4F264F16, 0x6DF66EF6,
42935 +0x6CF6000B, 0x4F222FE6, 0xE102DE0B, 0xE403E500,
42936 +0xBFB92E12, 0xE6062E52, 0xE7004618, 0x2E62E403,
42937 +0x4F262E72, 0x6EF6AFB0, 0x0009000B, 0x001C1040,
42938 +0xCCCCCCCD, 0x10624DD3, 0x001D4004, 0x2F962F86,
42939 +0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6, 0xE5007F98,
42940 +0x6453E710, 0x6B534728, 0xEE1ADCBC, 0x6153655D,
42941 +0x315C4108, 0x75014108, 0x6043317C, 0x0F16665D,
42942 +0xED0060B3, 0x21B136E3, 0x81128111, 0x11D28113,
42943 +0x11D411D3, 0x74048FEA, 0xD8B167F2, 0x1871D9B1,
42944 +0x58F12872, 0x1981D1B0, 0x59F22982, 0x5DF45AF3,
42945 +0x54F65EF5, 0x21921191, 0x11A211A3, 0x11D411D5,
42946 +0x11E611E7, 0x11481149, 0xDAA855F7, 0x57F8EE00,
42947 +0x52F9DDA7, 0x64E3D6A7, 0x2A521A51, 0xD8A7D9A6,
42948 +0x2D72EAEF, 0x6AAC2622, 0x6DE36EED, 0x61E34D08,
42949 +0x41083DEC, 0x31EC4D08, 0x60B33D9C, 0x2DB14108,
42950 +0xE05081D1, 0xE79F4108, 0x41084008, 0x81D2677C,
42951 +0x318C60B3, 0x3472E200, 0x1DD281D3, 0xD4931D13,
42952 +0x1D248D01, 0x65D3D48F, 0x7E01B0B2, 0x34A264ED,
42953 +0xDA8C8BDA, 0x68A22FD2, 0x4829DD91, 0x64A22D82,
42954 +0x694D7DFC, 0x2D92D286, 0x4E296E22, 0x2DE27D0C,
42955 +0x6AD36822, 0xD784618D, 0x6D722A16, 0xD583D489,
42956 +0x5E7224D2, 0x14E2D688, 0xEE005174, 0x58761414,
42957 +0x1486D186, 0xE7105978, 0x62521498, 0x142A65E3,
42958 +0x64E326E2, 0x644DE600, 0x48086843, 0x4808384C,
42959 +0x6053381C, 0x28B10C86, 0x60B309CE, 0x60538191,
42960 +0x60430ACE, 0x605381A2, 0x60B30DCE, 0x605381D3,
42961 +0x740108CE, 0x09CE1882, 0x19E3624D, 0x32730ACE,
42962 +0x8FE01A64, 0xD96A7504, 0x6C92E003, 0x2CB14018,
42963 +0xDA6F6D92, 0xE05081D1, 0x40086E92, 0x619281E2,
42964 +0x811360B3, 0xE6006492, 0x67921442, 0x17A3D468,
42965 +0xE1FF6892, 0xE7031864, 0x46086563, 0x7501364C,
42966 +0x665D2612, 0x8BF83673, 0xE003DC5A, 0x40186DC2,
42967 +0x6EC22DB1, 0x81E1D25F, 0xEE0061C2, 0x64C21112,
42968 +0x1423E024, 0xD45B65C2, 0x67C215E4, 0x8172E580,
42969 +0x66E368C2, 0x655C8183, 0x6963666D, 0x6A6D7604,
42970 +0x3A53394C, 0x29E28FF8, 0xDC54DB53, 0x740424B2,
42971 +0x7F6824C2, 0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6,
42972 +0x000B69F6, 0x614268F6, 0xC8036011, 0xE5008F03,
42973 +0x3420D23C, 0x60118B06, 0x8802C903, 0xD2398B06,
42974 +0x8B033420, 0x65135612, 0x24225264, 0x6053000B,
42975 +0x2FE62FD6, 0x7FEC4F22, 0x62536E53, 0x6D43E550,
42976 +0x4508E400, 0xE101A001, 0x60435224, 0x81212211,
42977 +0x60538123, 0x56E28122, 0x8BF53620, 0x16E4D238,
42978 +0xE61464F3, 0x65E3420B, 0xE4FC65E1, 0x2E512549,
42979 +0x65F361F1, 0x2F112149, 0xD13154D1, 0xE614410B,
42980 +0x607157D1, 0x2701CB01, 0x7F141DE1, 0x6EF64F26,
42981 +0x6DF6000B, 0x2FE62FD6, 0x7FEC4F22, 0x66536E53,
42982 +0x6D43E5FC, 0x20596061, 0x2601CB01, 0x326052E2,
42983 +0x12E48B06, 0x31E051E2, 0x52D18B04, 0x1E22A002,
42984 +0x5664AFF0, 0x64F3D21E, 0x420BE614, 0x67E165E3,
42985 +0x2719E1FC, 0x67F12E71, 0x271954D1, 0x65F3D118,
42986 +0x410BE614, 0x52D12F71, 0xCB016021, 0x1DE12201,
42987 +0x4F267F14, 0x000B6EF6, 0x00006DF6, 0x002039AC,
42988 +0x0020357C, 0x00203584, 0x0020358C, 0x002035B4,
42989 +0x00203998, 0x002039A0, 0x00100208, 0x001014C0,
42990 +0x001E210C, 0x001C3D00, 0x002039EC, 0x001000C8,
42991 +0x00117880, 0x00117780, 0x00040020, 0x0026C401,
42992 +0x00200D42, 0x4F222FE6, 0xDE42624C, 0x42004208,
42993 +0x3E2CA005, 0xD4405252, 0xBF695624, 0x65E22E62,
42994 +0x352052E1, 0xD63D8BF6, 0x4F262622, 0x6EF6000B,
42995 +0x2FC62FB6, 0x2FE62FD6, 0xDC394F22, 0x52C1DB39,
42996 +0x362066C2, 0x6061891C, 0x8801C903, 0xDE348918,
42997 +0xBF38DD35, 0x650364E3, 0x66B28503, 0x3262620D,
42998 +0xD4328907, 0x0009BF76, 0x4D0BD431, 0xAFE60009,
42999 +0xBF3D0009, 0xD42F64E3, 0x00094D0B, 0x0009AFDF,
43000 +0x2262D22D, 0x6EF64F26, 0x6CF66DF6, 0x6BF6000B,
43001 +0x2FD62FC6, 0x4F222FE6, 0xDD29DC28, 0x6E4360C2,
43002 +0x04DE4008, 0xE614D127, 0x65E3410B, 0xD127D726,
43003 +0x55E227E2, 0x35E05254, 0x21228F04, 0x400860C2,
43004 +0x122202DE, 0x605365C2, 0x75014008, 0x0DE606DE,
43005 +0xC90F6053, 0x60632C02, 0x6EF64F26, 0x000B6DF6,
43006 +0x85436CF6, 0x650D5643, 0x622D6262, 0x35277204,
43007 +0xE1008F0C, 0x2268960C, 0xD6158B03, 0x72015261,
43008 +0xD6131621, 0x6262E101, 0x26227201, 0x6013000B,
43009 +0x000001FF, 0x0020358C, 0x00203584, 0x001C3D00,
43010 +0x002035B4, 0x0020397C, 0x002018C0, 0x0020357C,
43011 +0x00203B18, 0x00203B1C, 0x001C3D28, 0x002039EC,
43012 +0x002039AC, 0x00200D42, 0x002039F0, 0x002039F4,
43013 +0x00117754, 0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6,
43014 +0x7FF84F22, 0x6C22D241, 0xC80360C3, 0xDE40896E,
43015 +0xDA41DB40, 0x52B1D941, 0x362066B2, 0x60618945,
43016 +0x8801C903, 0xDD3B8941, 0x420BD23D, 0x650364D3,
43017 +0x60A12F02, 0x89328801, 0x85145153, 0x8840600C,
43018 +0x1F118F0C, 0xD5376191, 0x641D450B, 0x8B262008,
43019 +0xD7356691, 0x646D470B, 0x8B202008, 0x420BD233,
43020 +0x51F154F1, 0xC8208511, 0xD1318904, 0x021EE050,
43021 +0x01267201, 0x420BD22F, 0x200864F2, 0x64D38907,
43022 +0x4D0BDD2D, 0xD12D65F2, 0xAFC4E601, 0xD22C2162,
43023 +0x420B65F2, 0xD72B64E3, 0xAFBCE601, 0xD2262762,
43024 +0x420B65F2, 0xAFB664D3, 0xDE270009, 0xDA28DD27,
43025 +0x52D1DB28, 0x362066D2, 0x60618918, 0x8801C903,
43026 +0xD4228914, 0x450BD516, 0x56030009, 0x8F0436E0,
43027 +0xE2016503, 0xAFEC2A20, 0xD41F2B52, 0x420BD216,
43028 +0xD7180009, 0x4118E101, 0x2712AFE3, 0xC80460C3,
43029 +0xD21A8902, 0x0009420B, 0x4F267F08, 0x6DF66EF6,
43030 +0x6BF66CF6, 0x000B6AF6, 0x000069F6, 0x001E2100,
43031 +0x0020358C, 0x00203584, 0x00203A14, 0x001142D8,
43032 +0x002014A6, 0x00115EA2, 0x00114774, 0x00200D8A,
43033 +0x0020351C, 0x002016C2, 0x002014D0, 0x001E212C,
43034 +0x00201534, 0x001C3D30, 0x00117880, 0x0020357C,
43035 +0x0020399C, 0x00203998, 0x002035B4, 0x00200644,
43036 +0xE601D203, 0x1265D503, 0x000B2252, 0x00001266,
43037 +0x001C1010, 0x0000C34F, 0x0009000B, 0x0009000B,
43038 +0x0009000B, 0x0009000B, 0xE000000B, 0xE000000B,
43039 +0x0009000B, 0xE4FDD59D, 0xD69D6152, 0x25122149,
43040 +0x74016052, 0x2502CB01, 0xD19A6752, 0x25722749,
43041 +0xC8406010, 0x60628902, 0x2602CB04, 0xE1F76462,
43042 +0x26422419, 0xE7016062, 0x2602C9CF, 0xE5026062,
43043 +0x2602CB10, 0x47186062, 0x2602CB03, 0x000B1652,
43044 +0xD58D1673, 0xD28ED78D, 0xE100D48E, 0x2511E600,
43045 +0x22102711, 0x2461AFCE, 0xD28B664C, 0x362C4600,
43046 +0xCB106060, 0x2600000B, 0xD287654C, 0x352C4500,
43047 +0xE1EF6650, 0x000B2619, 0x664C2560, 0x4600D283,
43048 +0x6060362C, 0x000BCB10, 0x654C2600, 0x4500D27F,
43049 +0x6650352C, 0x2619E1EF, 0x2560000B, 0xD27A664C,
43050 +0x362C4600, 0xCB086060, 0x2600000B, 0xD276654C,
43051 +0x352C4500, 0xE1F76650, 0x000B2619, 0x664C2560,
43052 +0x4600D272, 0x6060362C, 0x000BCB08, 0x654C2600,
43053 +0x4500D26E, 0x6650352C, 0x2619E1F7, 0x2560000B,
43054 +0xD669624C, 0x326C4200, 0xC9086020, 0x40214021,
43055 +0x000B4021, 0x624C600C, 0x4200D664, 0x6020326C,
43056 +0x4021C908, 0x40214021, 0x600C000B, 0x644CD160,
43057 +0x6240341C, 0x602C000B, 0x644CD15E, 0x6240341C,
43058 +0x602C000B, 0x4F222FE6, 0x645C6E43, 0x3467E60A,
43059 +0xBFEB8914, 0x640C0009, 0x880160EC, 0xE00F8B02,
43060 +0x2409A002, 0x44094409, 0xE60A624C, 0x89053263,
43061 +0x644CBFE2, 0x6023620C, 0x8B00C880, 0x6023E200,
43062 +0x000B4F26, 0x4F226EF6, 0x6062D64B, 0x8B038801,
43063 +0x0009B256, 0x0009A003, 0xE640D248, 0xD6482260,
43064 +0x4F26E200, 0x2622000B, 0xD6434F22, 0x88026062,
43065 +0xB29F8B01, 0xD6420009, 0x4F26E200, 0x2622000B,
43066 +0xD43ED53D, 0xE701E100, 0x000B2512, 0xD23B2470,
43067 +0x000BE604, 0x4F222260, 0xD13BD43A, 0x0009410B,
43068 +0xE1FDD53A, 0xD23A6650, 0xE7002619, 0x4F262560,
43069 +0x2270000B, 0xD5374F22, 0x6152D237, 0x611DD737,
43070 +0x64522512, 0x242BE6FF, 0xD4352542, 0x666DD22E,
43071 +0x2762420B, 0xE1FBD52D, 0x27196750, 0x000B4F26,
43072 +0x4F222570, 0xD128D42F, 0x0009410B, 0xE7F7D527,
43073 +0x26796650, 0x000B4F26, 0xD5242560, 0x62509425,
43074 +0x000B2249, 0xD5212520, 0x6250E4BF, 0x000B2249,
43075 +0x4F222520, 0x8522D224, 0x2008600D, 0x88018911,
43076 +0x88038944, 0x88058946, 0x88068948, 0x8808894E,
43077 +0x88098954, 0x880A895A, 0x880B8960, 0xA06D8966,
43078 +0xB06F0009, 0xA06A0009, 0xFF7F600C, 0x001E2148,
43079 +0x001E1108, 0x001E1000, 0x00203A4C, 0x00203A4E,
43080 +0x00203A6D, 0x00203A30, 0x001E103F, 0x001E105F,
43081 +0x001E102F, 0x001E1090, 0x00203A54, 0x001E100B,
43082 +0x00203A50, 0x00203B20, 0x002018C0, 0x001E1028,
43083 +0x00203A6C, 0x001D4020, 0x98760000, 0x001C1000,
43084 +0x00203B2C, 0x00203B3C, 0x00203A24, 0x0009B04C,
43085 +0x600CA035, 0x0009B055, 0x600CA031, 0x6260D684,
43086 +0x8B2B2228, 0x0009B061, 0x600CA029, 0x6260D680,
43087 +0x8B232228, 0x0009B069, 0x600CA021, 0x6260D67C,
43088 +0x8B1B2228, 0x0009B0C7, 0x600CA019, 0x6260D678,
43089 +0x8B132228, 0x0009B0CD, 0x600CA011, 0x6260D674,
43090 +0x8B0B2228, 0x0009B125, 0x600CA009, 0x6260D670,
43091 +0x8B032228, 0x0009B13D, 0x600CA001, 0x4F26E000,
43092 +0x0009000B, 0xD26CD16B, 0xD56C8412, 0x4000C90F,
43093 +0xD76B012D, 0xE403D66B, 0xE20F611C, 0x2540E001,
43094 +0x25202712, 0x2602000B, 0xE601D262, 0x30668523,
43095 +0xE0008D05, 0xD663D260, 0xE0018122, 0x000B2602,
43096 +0xD25C0009, 0x600D8523, 0x89052008, 0x8B0A8801,
43097 +0x6060D65D, 0x2600CB01, 0xD457D65A, 0xE001E101,
43098 +0x000B2612, 0x000B8142, 0xD152E000, 0x8513E501,
43099 +0x640D4518, 0x66033453, 0xE0008D05, 0xD551D253,
43100 +0x2260E001, 0x000B2502, 0x4F220009, 0x8513D149,
43101 +0x6453650D, 0x62494419, 0x227D672E, 0x8801602C,
43102 +0x88028909, 0x88038910, 0x8806891A, 0x88078935,
43103 +0xA04C893B, 0xD5460009, 0x6652D746, 0x2762D446,
43104 +0x622C6261, 0x2421A038, 0x2228625C, 0xD4438B3F,
43105 +0x6642D540, 0x2562D440, 0x24018561, 0x6203A02C,
43106 +0x2008605C, 0x88108907, 0x88208908, 0x88308909,
43107 +0xA02C890A, 0xD23A0009, 0x6222A008, 0xA005D239,
43108 +0xD2396222, 0x6222A002, 0x6262D638, 0xD432D531,
43109 +0x66212522, 0xA00F626C, 0xD6352421, 0x6261D52D,
43110 +0x622CD42D, 0xA0072562, 0xD6322421, 0x8561D529,
43111 +0x2562D429, 0x62032401, 0x662D8515, 0x3617610D,
43112 +0x65038F01, 0xB0CB2451, 0xA0010009, 0xE000E001,
43113 +0x000B4F26, 0xD6190009, 0xD427E101, 0x65412610,
43114 +0xD118D717, 0xE20F655D, 0x2752E001, 0x000B2620,
43115 +0x2FE62102, 0xD20F4F22, 0x640C8523, 0x8B082448,
43116 +0xD511D61D, 0x2621E200, 0x940F8451, 0xA0482049,
43117 +0xDE0D8051, 0xC84060E0, 0xE2018D32, 0x89443427,
43118 +0xD216D615, 0x2641420B, 0x0009A030, 0x0000FF7F,
43119 +0x00203A6D, 0x00203A24, 0x00203A30, 0x001E1100,
43120 +0x001E100C, 0x00203A50, 0x001E1000, 0x001E1001,
43121 +0x00203A58, 0x00203A38, 0x00203A3C, 0x00203A40,
43122 +0x00203A5C, 0x00203A60, 0x00203A64, 0x00203A68,
43123 +0x00203E20, 0x00203E2A, 0x00203A4A, 0x002027F2,
43124 +0x89123427, 0xD294D693, 0x2641420B, 0xCB8084E1,
43125 +0x80E1B0F5, 0xD69160E0, 0x2E00CB04, 0xC93F6060,
43126 +0xD68F2600, 0xA001E001, 0xE0002602, 0x000B4F26,
43127 +0xD68C6EF6, 0xC8806060, 0xD2868919, 0x88016021,
43128 +0xD2898B15, 0x8524E501, 0x89103056, 0xE203D187,
43129 +0x2120D487, 0xE00B6541, 0x0656655D, 0xE40FD585,
43130 +0x2140E702, 0xD77E2571, 0x000BE001, 0x000B2702,
43131 +0x2FE6E000, 0xDE804F22, 0xC88084E1, 0xD57A892C,
43132 +0x20088554, 0x61038F28, 0x8553D77C, 0x64036672,
43133 +0x8566650C, 0x3520620C, 0xD6798B1E, 0x651CD774,
43134 +0x2651644C, 0x60E02741, 0x8904C840, 0x420BD275,
43135 +0xA0030009, 0xD2680009, 0x0009420B, 0x0009B09F,
43136 +0xE201D167, 0x60E02122, 0xCB04D464, 0x60402E00,
43137 +0x2400C93F, 0x6023A001, 0x4F26E000, 0x6EF6000B,
43138 +0x2FB62FA6, 0x2FD62FC6, 0xDA622FE6, 0x66A1E240,
43139 +0x3622DC5E, 0x62638900, 0x6ED36D2C, 0x4E2136D8,
43140 +0x4E212A61, 0xDB61D460, 0xE700A00F, 0x770162B2,
43141 +0x71026123, 0x66212B12, 0x71026213, 0x61212B12,
43142 +0x651D666D, 0x356C4528, 0x627C2452, 0x8BED32E3,
43143 +0xC90360D3, 0x8B108803, 0x617367B2, 0x2B127102,
43144 +0x71026E13, 0x2B126571, 0x655D6DE1, 0x422862DD,
43145 +0x325CE107, 0xA00C2C10, 0x88022422, 0xA0038B01,
43146 +0x8801E203, 0xE2018B05, 0x66B22C20, 0x655D6561,
43147 +0xE60F2452, 0x67A12C60, 0x8B052778, 0xDD38DC44,
43148 +0xEB01EA00, 0x2DB22CA2, 0x6DF66EF6, 0x6BF66CF6,
43149 +0x6AF6000B, 0x2FE62FD6, 0xE240DD36, 0x362266D1,
43150 +0x62638900, 0x3678672C, 0x7703DE38, 0x47212D61,
43151 +0x64E2D635, 0xA00E4721, 0x6562E100, 0x62537101,
43152 +0x74012450, 0x24204219, 0x45297401, 0x74012450,
43153 +0x24504519, 0x621C7401, 0x8BEE3273, 0x66E24200,
43154 +0x420061D1, 0x2118362C, 0x2E628F06, 0xDD1CD728,
43155 +0xE501E400, 0x2D522742, 0x000B6EF6, 0x2FD66DF6,
43156 +0x4F222FE6, 0xED0AEE01, 0x64E3BC86, 0xBC8B64E3,
43157 +0x62EC7E01, 0x8BF732D7, 0xBC8EEE01, 0x64E364E3,
43158 +0x7E01BC93, 0x32D762EC, 0x4F268BF7, 0x000B6EF6,
43159 +0xD1186DF6, 0xD418920D, 0x72122122, 0x2422D617,
43160 +0xD7177204, 0x72202622, 0x2722D116, 0x000B7230,
43161 +0x137A2122, 0x00203A4A, 0x002028FE, 0x001E1015,
43162 +0x00203A50, 0x001E1001, 0x00203A24, 0x001E1100,
43163 +0x00203A4E, 0x00203A3C, 0x001E1000, 0x00203A40,
43164 +0x00203A4C, 0x002027F2, 0x001E100C, 0x00203A38,
43165 +0x00203A54, 0x00203A58, 0x00203A5C, 0x00203A60,
43166 +0x00203A64, 0x00203A68, 0x4F222FE6, 0xD6707FFC,
43167 +0x88016060, 0xE2018951, 0x2620BFBB, 0xD56ED16D,
43168 +0xDE6E6010, 0x64E36552, 0x7402C840, 0x8D22D16C,
43169 +0xD26C7502, 0xE601D76C, 0xE7042722, 0x76016255,
43170 +0x626C2421, 0x8FF93273, 0xD4637402, 0x6242E601,
43171 +0x640D8528, 0x67494419, 0x275D657E, 0x81E4607C,
43172 +0xE417D562, 0x67557601, 0x3243626C, 0x8FF92171,
43173 +0xA0207102, 0xD25E0009, 0xE601D75B, 0xE7042722,
43174 +0x76016255, 0x626C2421, 0x8FF93273, 0xD4527402,
43175 +0x6242E601, 0x640D8528, 0x67494419, 0x275D657E,
43176 +0x81E4607C, 0xE417D553, 0x67557601, 0x3243626C,
43177 +0x8FF92171, 0x92897102, 0xD2462E21, 0x5E23D74E,
43178 +0x64F22FE2, 0x604365F2, 0x2700C980, 0xC9606043,
43179 +0x80716103, 0xC9036043, 0x80724519, 0x65F2605C,
43180 +0x817266F2, 0x46194629, 0x606C4529, 0x4018645C,
43181 +0x8173304C, 0x21185E23, 0x64F22FE2, 0x6E4C62F2,
43182 +0x602C4219, 0x66F262F2, 0x46294018, 0x461930EC,
43183 +0x42298174, 0x652C606C, 0x305C4018, 0x81758F07,
43184 +0x0009BC97, 0x2228620C, 0xA00A8908, 0x60130009,
43185 +0x8B038840, 0x0009B009, 0x0009A003, 0xE202D62F,
43186 +0x7F042622, 0x000B4F26, 0x4F226EF6, 0x8552D52A,
43187 +0x8830600D, 0x88318903, 0xA0348923, 0x85550009,
43188 +0xD428D727, 0x85532701, 0x610DD627, 0x24124118,
43189 +0x460BD426, 0xD7230009, 0xD226D425, 0x6572420B,
43190 +0xE230D120, 0x42286712, 0x2729E620, 0x37604628,
43191 +0xD6218B03, 0xA016E200, 0xD61F2622, 0xA012E202,
43192 +0xD1182622, 0x6212E530, 0xE6204528, 0x46282259,
43193 +0x89083260, 0xD41AD119, 0xE601D513, 0x2160450B,
43194 +0x472BD718, 0x4F264F26, 0x0009000B, 0x0000060A,
43195 +0x00203A6C, 0x001E1000, 0x00203A58, 0x00203E20,
43196 +0x00203E2C, 0x00203DC4, 0x00203A40, 0x00203DF4,
43197 +0x00203DF2, 0x00203DC6, 0x00203A24, 0x00203A50,
43198 +0x00203A3C, 0x00203A38, 0x002018C0, 0x00203B48,
43199 +0x00203B4C, 0x002018D0, 0x00203A54, 0x001E100B,
43200 +0x00203B60, 0x00114004, 0x4F222FE6, 0x84E9DE86,
43201 +0x2448640C, 0xB17B8901, 0xD2840009, 0x26686620,
43202 +0x60E08902, 0x2E00C9BF, 0x000B4F26, 0x000B6EF6,
43203 +0x2FE60009, 0xDE7E4F22, 0x60E0D67E, 0xCBC0D47E,
43204 +0x62602E00, 0xC803602C, 0x40218904, 0x70014021,
43205 +0x6603A002, 0x66034009, 0xD678616D, 0xE500A004,
43206 +0x75016262, 0x74042422, 0x3213625D, 0xD2748BF8,
43207 +0x0009420B, 0xC9BF84E2, 0x4F2680E2, 0x6EF6000B,
43208 +0x2FE62FD6, 0x7FFC4F22, 0x6260D66E, 0x89402228,
43209 +0xD565E100, 0x60502610, 0xCB40D46B, 0x2500440B,
43210 +0x8D052008, 0x62E06E03, 0x7104612C, 0x2F11A006,
43211 +0xD466D65E, 0xDD666760, 0x657C4D0B, 0xE23C6D1D,
43212 +0x8B033D27, 0xD264D463, 0x0009420B, 0x4D214D21,
43213 +0xA005D762, 0x66E6E400, 0x357C4508, 0x74012562,
43214 +0x35D3654D, 0xD75E8BF7, 0x6E72E003, 0x81E14018,
43215 +0x6E7260F1, 0x81E2700C, 0xD45A6172, 0xDD5A8113,
43216 +0x65724D0B, 0xD64AD259, 0x2212E101, 0xC93F6060,
43217 +0x7F042600, 0x6EF64F26, 0x6DF6000B, 0x2FC62FB6,
43218 +0x2FE62FD6, 0xD2524F22, 0x6B436E73, 0x420B6C53,
43219 +0x20086D63, 0x64038D1C, 0xE50ED13C, 0x32526210,
43220 +0x60C38916, 0x804124B0, 0x814160D3, 0xA007E500,
43221 +0x655D61BC, 0x00EC6053, 0x364C6653, 0x80647501,
43222 +0x3213625D, 0xD6308BF5, 0xC9BF6060, 0x2600A008,
43223 +0xD239D440, 0x6EF64F26, 0x6CF66DF6, 0x6BF6422B,
43224 +0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, 0x2F962F86,
43225 +0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6, 0xE1007FC4,
43226 +0x6513ECFF, 0x6B136CCD, 0xDE34D733, 0xEDFF64F3,
43227 +0xD833EA04, 0x6053655C, 0x027D4000, 0x32C0622D,
43228 +0x66038D0D, 0x09ED6063, 0x2491027D, 0x24217402,
43229 +0x698202ED, 0x3928622D, 0x74022892, 0x75017104,
43230 +0x6063625C, 0x07D532A2, 0x0EB58FE4, 0x2448641C,
43231 +0xE6808905, 0x67F3E5C5, 0xBF8F666C, 0x7F3C655C,
43232 +0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6, 0x000B69F6,
43233 +0xD11C68F6, 0x6012D21C, 0xCB20E405, 0x2102E500,
43234 +0x000B2242, 0x00002252, 0x001E1017, 0x00203996,
43235 +0x001E1015, 0x001E10BF, 0x00117800, 0x001E10FC,
43236 +0x00200644, 0x0020399C, 0x00202A56, 0x00203B64,
43237 +0x002018D0, 0x00203B80, 0x002018C0, 0x0011788C,
43238 +0x00203998, 0x0020357C, 0x00201534, 0x001E2130,
43239 +0x00202A18, 0x00203B88, 0x002039FC, 0x00203A04,
43240 +0x00203DC0, 0x001C3500, 0x001D4004, 0xD564D163,
43241 +0xE400D764, 0x2142E20F, 0x17411154, 0xD5622722,
43242 +0x9669D762, 0x15412572, 0x96661562, 0xE6011565,
43243 +0xD55F1165, 0x666CE6F8, 0x25422542, 0x25422542,
43244 +0x25422542, 0x25622542, 0x7601E727, 0x67632572,
43245 +0x25627797, 0xE7042572, 0x2572E248, 0xE2192522,
43246 +0xE2702522, 0x25422542, 0x25422542, 0x25222542,
43247 +0x2522E20C, 0x25422542, 0x25422542, 0x25422542,
43248 +0x25422542, 0x000B154A, 0xE2081145, 0x0009422B,
43249 +0x2FE62FD6, 0x7FFC4F22, 0xC8206043, 0x6E438D02,
43250 +0x0009BE85, 0xC81060E3, 0xBE828901, 0x60E30009,
43251 +0x8901C840, 0x0009BEA4, 0xC80160E3, 0xDD3D8938,
43252 +0xC80260D0, 0x2F008D03, 0x460BD63B, 0x60F00009,
43253 +0x8902C804, 0x460BD639, 0x62F00009, 0xC8806023,
43254 +0x60D08902, 0x2D00C97F, 0xC8016023, 0xD6348906,
43255 +0x0009460B, 0x0009A007, 0x51630601, 0x8902C808,
43256 +0x460BD630, 0x60F00009, 0x8902C810, 0x420BD22E,
43257 +0xD52E0009, 0x88026052, 0xD22D8B03, 0xA005E604,
43258 +0x88012260, 0xD22A8B02, 0x2260E601, 0x2522E200,
43259 +0xC88060E3, 0xD227892D, 0x60E36E20, 0x8902C880,
43260 +0x420BD225, 0x60E30009, 0x8902C840, 0x420BD223,
43261 +0x60E30009, 0x8902C802, 0x420BD221, 0x60E30009,
43262 +0x890DC804, 0xDD20D11F, 0x0009410B, 0x0009BF11,
43263 +0x0009BF4C, 0xD51ED41D, 0x2470E708, 0x25D2BF85,
43264 +0xC80860E3, 0xD21B8905, 0x4F267F04, 0x422B6EF6,
43265 +0x7F046DF6, 0x6EF64F26, 0x6DF6000B, 0x001C581C,
43266 +0xA000A000, 0x001D0100, 0x001D4000, 0x00040021,
43267 +0x001C589C, 0x001E1021, 0x00201A46, 0x00201A68,
43268 +0x002020C8, 0x00201A80, 0x00201A8E, 0x00203A50,
43269 +0x001E100B, 0x001E1028, 0x00201AFA, 0x00201B06,
43270 +0x00201A96, 0x00201AB4, 0x12345678, 0x001E1000,
43271 +0x0010F100, 0x00201AE2, 0x644CD6A7, 0x000B346C,
43272 +0xD6A62450, 0x346C644C, 0x2450000B, 0x644CD6A4,
43273 +0x000B346C, 0x625C2450, 0x4208616D, 0x42084119,
43274 +0x42006019, 0x670E614C, 0xD49E321C, 0x4200207D,
43275 +0x324CC90F, 0x2200000B, 0x4208625C, 0x42004208,
43276 +0x324C644C, 0x4200D498, 0x000B324C, 0x2FE62260,
43277 +0x614C4F12, 0x4100D493, 0x6710314C, 0xE29F666D,
43278 +0x27294619, 0x6E536269, 0x672E6573, 0x4221227D,
43279 +0x42214221, 0x7601662C, 0xE4014608, 0x34E84608,
43280 +0x644C4600, 0x071A0467, 0x2150257B, 0x000B4F16,
43281 +0x4F226EF6, 0xD2857FE8, 0x88016021, 0xD2848B7B,
43282 +0x26686621, 0xD2838B77, 0x26686621, 0xE50F8B73,
43283 +0xE401BFA2, 0xBFA4E501, 0xE586E400, 0xE400655C,
43284 +0x2F50BFA4, 0xBFA1E401, 0xE602E506, 0x60634618,
43285 +0x81F2E401, 0x6543BF9F, 0xE40185F2, 0xBFAB6543,
43286 +0x85F26603, 0x6543E401, 0x6603BFB1, 0xE40265F0,
43287 +0x6053756C, 0x80F8BF80, 0xBF82E402, 0x84F8E512,
43288 +0x7090E402, 0x6503BF82, 0x4618E602, 0x81F66063,
43289 +0xBF80E402, 0x85F6E500, 0x6603E402, 0xE500BF8C,
43290 +0xE40285F6, 0xBF926603, 0xE5FEE500, 0xE010655C,
43291 +0xBF61E403, 0xE5130F54, 0xE40EBF63, 0x05FCE010,
43292 +0xBF63E40E, 0xE5007585, 0xBF64E403, 0xE500E640,
43293 +0xBF71E403, 0xE500E640, 0xBF78E403, 0xE5FFE640,
43294 +0xE014655C, 0xBF47E404, 0xE40F0F54, 0xE504BF49,
43295 +0x05FCE014, 0xBF49E40F, 0xE5017584, 0xBF4AE640,
43296 +0xE501E404, 0xBF57E640, 0xE501E404, 0xE404E640,
43297 +0xAF5C7F18, 0x7F184F26, 0x000B4F26, 0x4F220009,
43298 +0xD2427FF0, 0x88016021, 0xD2418B71, 0x26686621,
43299 +0xD2408B6D, 0x26686621, 0xE50F8B69, 0xE401BF1C,
43300 +0xBF1EE501, 0xE586E400, 0xE400655C, 0x2F50BF1E,
43301 +0xBF1BE401, 0xE401E506, 0xBF1C6543, 0xE401E640,
43302 +0xBF296543, 0xE401E640, 0xBF306543, 0x65F0E640,
43303 +0x756CE402, 0xBEFF6053, 0xE40280F4, 0xE512BF01,
43304 +0xE40284F4, 0xBF017090, 0xE6406503, 0xBF02E402,
43305 +0xE640E500, 0xBF0FE402, 0xE640E500, 0xBF16E402,
43306 +0xE5FEE500, 0x6053655C, 0xBEE5E403, 0xE51380F8,
43307 +0xE40EBEE7, 0xE40E84F8, 0xBEE77085, 0xE5006503,
43308 +0xBEE8E640, 0xE500E403, 0xBEF5E640, 0xE500E403,
43309 +0xBEFCE640, 0xE5FFE403, 0x6053655C, 0xBECBE404,
43310 +0xE40F80FC, 0xE504BECD, 0xE40F84FC, 0xBECD7083,
43311 +0xE5016503, 0xBECEE640, 0xE501E404, 0xBEDBE640,
43312 +0xE501E404, 0xE404E640, 0xAEE07F10, 0x7F104F26,
43313 +0x000B4F26, 0x00000009, 0x001E102F, 0x001E1080,
43314 +0x001E1090, 0x001E103F, 0x001E103E, 0x00203A4A,
43315 +0x00203A4C, 0x00203A4E, 0xD21DD11C, 0x66206010,
43316 +0x676C7001, 0x3700C90F, 0xE5008D13, 0x67106210,
43317 +0x7701622C, 0x64232170, 0xD6166010, 0x44084408,
43318 +0x3428C90F, 0x62602100, 0x7201D513, 0x44082620,
43319 +0x000B354C, 0xD10F6053, 0x25586510, 0xE6008D13,
43320 +0xD60DD40B, 0x655C6540, 0x47086753, 0x37584708,
43321 +0x47086540, 0x24507501, 0x367C6040, 0x2400C90F,
43322 +0x72FF6210, 0x000B2120, 0x00006063, 0x00203995,
43323 +0x00203994, 0x00203996, 0x002035BC, 0x7FFC4F22,
43324 +0xE680D1A8, 0x666C6212, 0xD2A72F22, 0x67F36563,
43325 +0x420B7542, 0x7F04E404, 0x000B4F26, 0xE6800009,
43326 +0xD2A1666C, 0xE7006563, 0x422B7540, 0xE6806473,
43327 +0xD29D666C, 0xE7006563, 0x422B7543, 0x2F866473,
43328 +0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6, 0x7FC04F22,
43329 +0xDB97D296, 0x72012F22, 0xD1961F21, 0x66125211,
43330 +0x8B013620, 0x0009A0F9, 0xC9036061, 0x8B018801,
43331 +0x0009A0F3, 0xD290DC8F, 0x64C3420B, 0x6503D18F,
43332 +0x60111F02, 0x8B048801, 0x420BD28D, 0xAFE464C3,
43333 +0x54530009, 0x844CEE84, 0x890130E0, 0x0009A0C3,
43334 +0x6610D188, 0x6023626C, 0x8B718801, 0x6210D186,
43335 +0x89662228, 0xDA86D285, 0xE0036122, 0x64221112,
43336 +0x4018D881, 0xDD83E500, 0x814167A3, 0x77042850,
43337 +0x647266A2, 0x6ED3D580, 0x1F457E04, 0x65521F56,
43338 +0x64E368D2, 0x1F8874F8, 0x684369E2, 0x1F637894,
43339 +0x1F991F74, 0x62826142, 0xD779D978, 0x1F2BD679,
43340 +0x67726292, 0x1F1A6062, 0x2602CB20, 0xD176E600,
43341 +0xE5401F57, 0x1F7D1F2C, 0x76011F1E, 0x3253626D,
43342 +0x51F38BFB, 0x52F555F4, 0x25222A12, 0x55F757F6,
43343 +0x27525AF8, 0x5DF92DA2, 0x2ED251FB, 0xD56B5EFA,
43344 +0x54FC24E2, 0x281257FD, 0xD160D869, 0x25722942,
43345 +0x69126782, 0x1974D866, 0xDD666A12, 0x56FE60A1,
43346 +0x2A01CB01, 0xDA646412, 0xE9012842, 0x4A0B2D42,
43347 +0x52FE2692, 0xD661EE01, 0x22E24E18, 0x72016262,
43348 +0x60B22622, 0xCB01D14F, 0x2B02E202, 0x2120A03F,
43349 +0x8B3C2228, 0xE601D55A, 0x2160E700, 0xE01C2572,
43350 +0xC801004C, 0xD8578B0C, 0x1F8FD257, 0xE6002822,
43351 +0x7601E57D, 0x3253626C, 0x56FF8BFB, 0x2622D253,
43352 +0xE2FE69B2, 0x2B922929, 0x0A4CE01E, 0xE01F65F2,
43353 +0x014C25A0, 0x741057F1, 0xEA062710, 0xDD4CE600,
43354 +0x8446DE4C, 0x2D007601, 0x696C6844, 0x2E8039A3,
43355 +0x8FF67E01, 0xDE487D01, 0x2EA0EA94, 0xE1007E01,
43356 +0x7E0F2E10, 0xD12FE205, 0x64102E20, 0x6023624C,
43357 +0x89088801, 0x55F2D22A, 0x64C3420B, 0xEE01D132,
43358 +0xAF1A4E18, 0x55F221E2, 0x8553D13C, 0x620D6612,
43359 +0x89063262, 0xD63BD43A, 0xE801460B, 0xAF0CD73A,
43360 +0xD91F2782, 0x64C3490B, 0xEE01D127, 0xDA38D437,
43361 +0x4A0B4E18, 0xAF0021E2, 0x7F400009, 0x6EF64F26,
43362 +0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, 0x4F2268F6,
43363 +0x85467FF4, 0x2F01E681, 0x666C8547, 0x854881F1,
43364 +0x81F2D209, 0x67F38542, 0x854381F3, 0x81F4E40C,
43365 +0x65636053, 0x420B81F5, 0x7F0C7540, 0x000B4F26,
43366 +0x00000009, 0x001C3D9C, 0x002023FC, 0x0011779A,
43367 +0x001C36F8, 0x002035B4, 0x002014A6, 0x00203A16,
43368 +0x002014D0, 0x002039A5, 0x002039A4, 0x002039A0,
43369 +0x001C3B9C, 0x001C3704, 0x001C3D98, 0x001C3BB4,
43370 +0x001C5960, 0x001C3500, 0x001C3D30, 0x001C8960,
43371 +0x0020358C, 0x001C3D00, 0x00201610, 0x00117730,
43372 +0x002039A8, 0x001C582C, 0x2000A000, 0x0000A000,
43373 +0x0011778C, 0x00117792, 0x00117788, 0x0020397C,
43374 +0x0020357C, 0x00201534, 0x001E2130, 0x00203DA0,
43375 +0x002018C0, 0x2F962F86, 0x2FB62FA6, 0x2FD62FC6,
43376 +0x4F222FE6, 0xD19B7FEC, 0x2F12E000, 0x6103D49A,
43377 +0x1F4281F2, 0xDD9ADA99, 0xD69A6813, 0xE0014808,
43378 +0x460BDE99, 0x38EC4800, 0x65A21F03, 0x352052A1,
43379 +0xA23E8B01, 0x60510009, 0x8801C903, 0xA2388B01,
43380 +0x52530009, 0x32E0DE91, 0xD9918B10, 0x64A3490B,
43381 +0x4B0BDB90, 0xDE906403, 0xD791D690, 0xEC01D591,
43382 +0x2E02E100, 0x271026C0, 0x2502AFDF, 0xC8018551,
43383 +0xA1578B01, 0x62510009, 0x4200622D, 0x5E53366A,
43384 +0x85E2226D, 0xC903642C, 0x85E36603, 0x6053650D,
43385 +0x40214021, 0x4500C93F, 0x322A6703, 0x6053252D,
43386 +0xC901D17F, 0x60106C03, 0x8801D97F, 0xDB7F8B05,
43387 +0x2120E200, 0xCB0160B2, 0xD17D2B02, 0x88016011,
43388 +0x65A28B0A, 0x8D042448, 0x9B9E6251, 0xA00322B9,
43389 +0x919B2521, 0x2521221B, 0x37B3EB10, 0x2448895E,
43390 +0xD4738B07, 0x22286241, 0x60638903, 0xA05781F8,
43391 +0xD5706473, 0x46084608, 0x85E26273, 0x46006B50,
43392 +0x362C4200, 0x2BB8C910, 0x8F1F6463, 0x26686603,
43393 +0xD2698911, 0x062D6043, 0x4119616D, 0x6B0E6019,
43394 +0x81F820BD, 0x880160C3, 0x646C8F2C, 0x880F6073,
43395 +0xA0278B1B, 0xD2610009, 0x052D6043, 0x4119615D,
43396 +0x670E6019, 0x645C207D, 0x81F8A01C, 0x890F2668,
43397 +0x6043D25B, 0x6B5D052D, 0x60B94B19, 0x201D610E,
43398 +0x60C381F8, 0x8F0D8801, 0x6473645C, 0xEC00A00A,
43399 +0x6043D254, 0x625D052D, 0x60294219, 0x207D670E,
43400 +0x81F8645C, 0x880285F8, 0x85E1890A, 0x8D07C820,
43401 +0xE6DC6203, 0x60232269, 0x81E1A002, 0x644CE4FF,
43402 +0x6210D149, 0x89012228, 0x644CE4FF, 0x654DEBFF,
43403 +0x35B06BBC, 0xDB368B2B, 0x64A34B0B, 0x410BD135,
43404 +0x54036403, 0x85446E03, 0xC948DB40, 0xDC408808,
43405 +0xBEAC8B01, 0x64B3E502, 0x65E34C0B, 0xDB3DEC01,
43406 +0xD13D2DC2, 0x621260B2, 0x72017001, 0x21228805,
43407 +0x2B028F08, 0x666CE680, 0x6563D238, 0x7549E700,
43408 +0x6473420B, 0xA030D436, 0x7FFF0009, 0x85E28000,
43409 +0x20B9EBFC, 0x610381E2, 0x942A85E3, 0x62032049,
43410 +0x450885F8, 0x81E2201B, 0xC90160C3, 0x40084018,
43411 +0x40084008, 0x4000225B, 0x6023220B, 0x85E481E3,
43412 +0x4118E108, 0x81E4201B, 0xE40262A2, 0x20B98521,
43413 +0x67A28121, 0xCB016071, 0x85F82701, 0x89033042,
43414 +0xECE785E2, 0x81E220C9, 0x490BD41E, 0xA03B0009,
43415 +0x7E030009, 0x001C3D30, 0x00203DAC, 0x0020358C,
43416 +0x001E212C, 0x00203470, 0x001C3D00, 0x00117780,
43417 +0x002014A6, 0x00201670, 0x0011770C, 0x002039A4,
43418 +0x002039A5, 0x002039A0, 0x002018C0, 0x001C36F8,
43419 +0x00203A1A, 0x00203DBC, 0x00203BA0, 0x00203C20,
43420 +0x00203CA0, 0x00203D20, 0x00203990, 0x00203584,
43421 +0x002014D0, 0x00203A1C, 0x00203A20, 0x002023FC,
43422 +0x00203DA4, 0x00203DA8, 0x602262F2, 0x40094019,
43423 +0xC90F4009, 0x8B0B880A, 0x60E2DE8C, 0x40094019,
43424 +0xC90F4009, 0x8B038808, 0xCB0160A2, 0x2802A006,
43425 +0x65E2DE87, 0x2E527501, 0x286266A2, 0x52F366F2,
43426 +0x2622AE83, 0xD2838551, 0xDE83C802, 0xA0958B01,
43427 +0x420B0009, 0x4E0B64A3, 0x5E036403, 0x85E46503,
43428 +0x4918E908, 0xD77D209B, 0xE04C81E4, 0xDC7C0B7E,
43429 +0x7B01D97C, 0x61C207B6, 0x71016690, 0x8D062668,
43430 +0xD4792C12, 0x420BD279, 0xA070EB01, 0x62512DB2,
43431 +0x4B18EB0F, 0x22B9E102, 0x32104118, 0x85518B0F,
43432 +0x2029E2FC, 0x60518151, 0xCB0172E0, 0x85E12501,
43433 +0x202994A3, 0x85E481E1, 0xA0522049, 0x675181E4,
43434 +0x4719677D, 0x667E6779, 0x7701276D, 0x6903607C,
43435 +0x88014918, 0x25918F3E, 0x6B12D161, 0x21B27B01,
43436 +0x660D85E3, 0x40216063, 0xC93F4021, 0x6C034600,
43437 +0x262D322A, 0xC8016063, 0xDB5ED15D, 0x967D8901,
43438 +0xE6002C6B, 0x666C67CD, 0x40006063, 0x622D021D,
43439 +0x8D0E3270, 0x60436403, 0xE9FF021D, 0x8B013290,
43440 +0x01C5A007, 0x626C7601, 0x3292E904, 0x646C8BEB,
43441 +0x60434400, 0xD15004BD, 0x0B457401, 0x669D6911,
43442 +0x89073670, 0x602D6211, 0x890388FF, 0xE201DB4B,
43443 +0x2B2021C1, 0xECFC8551, 0x815120C9, 0xCB016051,
43444 +0xDC472501, 0x64A34C0B, 0x51F366F2, 0x85EF2612,
43445 +0x54F2D244, 0x650D420B, 0x0009ADE7, 0xE500DC42,
43446 +0x420B2C52, 0x4E0B64A3, 0x54036403, 0x85446E03,
43447 +0x6703E908, 0x65034918, 0x27998541, 0xDB323790,
43448 +0x8F0BD932, 0x6013610D, 0x8B07C820, 0xC9486053,
43449 +0x8B038808, 0xE501BD4B, 0x0009A005, 0x2128D233,
43450 +0xBD448901, 0x64B3E500, 0x490B65E3, 0xADBCEC01,
43451 +0x85F22DC2, 0x7001EE04, 0x31E7610D, 0x8D0281F2,
43452 +0xADA97A08, 0x7F140009, 0x6EF64F26, 0x6CF66DF6,
43453 +0x6AF66BF6, 0x000B69F6, 0xF7FF68F6, 0x2FE68000,
43454 +0xD2234F22, 0x60E36E22, 0x8D02C840, 0xBBE522E2,
43455 +0xE2400009, 0x2E284218, 0xBBF08901, 0x60E30009,
43456 +0x8905C810, 0xD21CD41B, 0x0009420B, 0x0009BBEF,
43457 +0xC80560E3, 0xBD6D8901, 0x60E30009, 0x8902C802,
43458 +0xABEC4F26, 0x4F266EF6, 0x6EF6000B, 0x001C3D3C,
43459 +0x00117760, 0x002014A6, 0x00201670, 0x0020351C,
43460 +0x00203DC0, 0x00203990, 0x00203584, 0x002014D0,
43461 +0x002039FC, 0x00203A04, 0x002039F8, 0x002039FA,
43462 +0x00201534, 0x002018D0, 0x00203A1C, 0x00008000,
43463 +0x001C3510, 0x00203DB4, 0x002018C0, 0x89014F22,
43464 +0x611B600B, 0x611BB00A, 0x000B4F26, 0x600B600B,
43465 +0x611BA004, 0x8DF12107, 0x8BF84011, 0x620D2F26,
43466 +0x8F3E3020, 0x40180019, 0x8B0B3016, 0x31043104,
43467 +0x31043104, 0x31043104, 0x31043104, 0x412462F6,
43468 +0x601C000B, 0x41296219, 0x20084018, 0x31048926,
43469 +0x31043104, 0x31043104, 0x31043104, 0x31043104,
43470 +0x31043104, 0x31043104, 0x31043104, 0x61193104,
43471 +0x3204221D, 0x32043204, 0x32043204, 0x32043204,
43472 +0x32043204, 0x32043204, 0x32043204, 0x32043204,
43473 +0x212D3204, 0x601962F6, 0x4024000B, 0x000BE000,
43474 +0x621362F6, 0x41294228, 0x31044224, 0x31044224,
43475 +0x31044224, 0x31044224, 0x31044224, 0x31044224,
43476 +0x31044224, 0x31044224, 0x31044224, 0x31044224,
43477 +0x31044224, 0x31044224, 0x31044224, 0x31044224,
43478 +0x31044224, 0x31044224, 0x602D4224, 0x62F6000B,
43479 +0x080A0C0E, 0x00020406, 0x1A1C1E20, 0x12141618,
43480 +0x2E303234, 0x26282A2C, 0x3A3C3E40, 0x6C625648,
43481 +0x41112F26, 0xE2208F18, 0x890B3123, 0x321CD204,
43482 +0xD1026220, 0x412B312C, 0x00090009, 0x0020349A,
43483 +0x00203450, 0x000BE000, 0x400062F6, 0x40004000,
43484 +0x40004000, 0x40004000, 0x62F6000B, 0x40004000,
43485 +0x40004000, 0x40004000, 0x40184000, 0x62F6000B,
43486 +0x40004000, 0x40004000, 0x40004000, 0x40284000,
43487 +0x62F6000B, 0x40004000, 0x40184000, 0x000B4028,
43488 +0xC90F62F6, 0x40054005, 0x40054005, 0x62F6000B,
43489 +0x4005C907, 0x40054005, 0x62F6000B, 0x4005C903,
43490 +0x000B4005, 0xC90162F6, 0x000B4005, 0x000062F6,
43491 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43492 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43493 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43494 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43495 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43496 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43497 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43498 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43499 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43500 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43501 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43502 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43503 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43504 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43505 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43506 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43507 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43508 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43509 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43510 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43511 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43512 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43513 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43514 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43515 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43516 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43517 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43518 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43519 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43520 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43521 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43522 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43523 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43524 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43525 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43526 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43527 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43528 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43529 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43530 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43531 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43532 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43533 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43534 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43535 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43536 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43537 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43538 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43539 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43540 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43541 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43542 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43543 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43544 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43545 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43546 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43547 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43548 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43549 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43550 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43551 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43552 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43553 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43554 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43555 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43556 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43557 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43558 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43559 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43560 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43561 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43562 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43563 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43564 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43565 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43566 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43567 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43568 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43569 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43570 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43571 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43572 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43573 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43574 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43575 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43576 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43577 +0x00000000, 0x00000000, 0x00000000, 0x42707372,
43578 +0x3D206675, 0x554E203D, 0x202C4C4C, 0x6E49677A,
43579 +0x4E497274, 0x6D754E51, 0x0000003D, 0x61766E49,
43580 +0x2064696C, 0x72657375, 0x20726F20, 0x2079656B,
43581 +0x00214449, 0x6E6B6E55, 0x206E776F, 0x6D6D6F63,
43582 +0x3D646E61, 0x00000000, 0x203A3051, 0x00000020,
43583 +0x203A3151, 0x00000020, 0x203A3251, 0x00000020,
43584 +0x203A3351, 0x00000020, 0x203A3451, 0x00000020,
43585 +0x2B434741, 0x73696F4E, 0x61432065, 0x7262696C,
43586 +0x6F697461, 0x6166206E, 0x6F206C69, 0x6974206E,
43587 +0x0D0A656D, 0x00000000, 0x00000072, 0x00205220,
43588 +0x62735576, 0x7473725F, 0x00000A0D, 0x62735576,
43589 +0x7375735F, 0x646E6570, 0x00000A0D, 0x62735576,
43590 +0x7365725F, 0x000A0D6D, 0x00000044, 0x44387570,
43591 +0x72637365, 0x6F747069, 0x3D584572, 0x00000000,
43592 +0x00000047, 0x72746E49, 0x6D652051, 0x2C797470,
43593 +0x49677A20, 0x4972746E, 0x754E514E, 0x00003D6D,
43594 +0x654C7245, 0x0000006E, 0x20746F4E, 0x756F6E65,
43595 +0x49206867, 0x4220514E, 0x0A0D6675, 0x00000000,
43596 +0x000000FF, 0x00020001, 0x00FF00FF, 0x00FF00FF,
43597 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
43598 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
43599 +0x010E010D, 0x00020003, 0x01090108, 0x0002010A,
43600 +0x02000003, 0x02020201, 0x02040203, 0x02060205,
43601 +0x02020200, 0x02040203, 0x020C020B, 0x020E020D,
43602 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
43603 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
43604 +0x000000FF, 0x00020001, 0x00FF00FF, 0x00FF00FF,
43605 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
43606 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
43607 +0x010E010D, 0x00020003, 0x01090108, 0x0002010A,
43608 +0x00030003, 0x02020201, 0x02040203, 0x02060205,
43609 +0x02020200, 0x02040203, 0x020C020B, 0x020E020D,
43610 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
43611 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
43612 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
43613 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
43614 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
43615 +0x010E010D, 0x00FF010F, 0x01090108, 0x010B010A,
43616 +0x0200010F, 0x02020201, 0x02040203, 0x02060205,
43617 +0x02020200, 0x02040203, 0x020C020B, 0x020E020D,
43618 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
43619 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
43620 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
43621 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
43622 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
43623 +0x010E010D, 0x00FF010F, 0x01090108, 0x010B010A,
43624 +0x010F010F, 0x02020201, 0x02040203, 0x02060205,
43625 +0x02020200, 0x02040203, 0x020C020B, 0x020E020D,
43626 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
43627 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
43628 +0x00205220, 0x00000046, 0x00000059, 0x73204142,
43629 +0x003D7165, 0x49544120, 0x0000204D, 0x00000000,
43630 +0x00000000, 0x002E0209, 0x80000101, 0x000409FA,
43631 +0x00FF0400, 0x05070000, 0x02000201, 0x82050700,
43632 +0x00020002, 0x03830507, 0x07010040, 0x40030405,
43633 +0x02090100, 0x0101002E, 0x09FA8000, 0x04000004,
43634 +0x000000FF, 0x02010507, 0x07000040, 0x40028205,
43635 +0x05070000, 0x00400383, 0x04050701, 0x00004002,
43636 +0x00000000, 0x00000000, 0x07090000, 0x00000000,
43637 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43638 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43639 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43640 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43641 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43642 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43643 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43644 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43645 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43646 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43647 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43648 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43649 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43650 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43651 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43652 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43653 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43654 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43655 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43656 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43657 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43658 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43659 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43660 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43661 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43662 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43663 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43664 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43665 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43666 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43667 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43668 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43669 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43670 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43671 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43672 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43673 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43674 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43675 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43676 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43677 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43678 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43679 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43680 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43681 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43682 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43683 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43684 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43685 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43686 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43687 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43688 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43689 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43690 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43691 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43692 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43693 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43694 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43695 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43696 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43697 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43698 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43699 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43700 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43701 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43702 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43703 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43704 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43705 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43706 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43707 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43708 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43709 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43710 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43711 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43712 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43713 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43714 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43715 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43716 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43717 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43718 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43719 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43720 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43721 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43722 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43723 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43724 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43725 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43726 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43727 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43728 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43729 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
43730 +0x6621D2A8, 0x2008606D, 0xA1B18B01, 0x88100009,
43731 +0x88118922, 0x88128920, 0x8813891E, 0x8821891C,
43732 +0x8822891A, 0x883A8918, 0x883B8916, 0xE6448914,
43733 +0x30604608, 0xE6488910, 0x30604608, 0xE658890C,
43734 +0x30604608, 0x963D8908, 0x89053060, 0x3060963B,
43735 +0x96398902, 0x8B013060, 0xE010000B, 0x8B018820,
43736 +0xE020000B, 0x892B8837, 0x89298832, 0x89278835,
43737 +0x89258836, 0x89238830, 0x89218838, 0x891F8839,
43738 +0x891D8834, 0x891B8833, 0x4608E64C, 0x89173060,
43739 +0x3060961B, 0x96198914, 0x89113060, 0x30609617,
43740 +0x9615890E, 0x890B3060, 0x30609613, 0x96118908,
43741 +0x89053060, 0x3060960F, 0x960D8902, 0x8B0C3060,
43742 +0xE030000B, 0x05100165, 0x02300A10, 0x04300330,
43743 +0x06300530, 0x0B300A30, 0x88400C30, 0xA1428B01,
43744 +0x88410009, 0xA13E8B01, 0x88430009, 0xA13A8B01,
43745 +0x88480009, 0xA1368B01, 0x884A0009, 0xA1328B01,
43746 +0x884B0009, 0xA12E8B01, 0x884C0009, 0xA12A8B01,
43747 +0xE6800009, 0x3060666C, 0xA1248B01, 0xE6810009,
43748 +0x3060666C, 0xA11E8B01, 0xE6820009, 0x3060666C,
43749 +0xA1188B01, 0xE6830009, 0x3060666C, 0xA1128B01,
43750 +0xE6840009, 0x3060666C, 0xA10C8B01, 0xE6850009,
43751 +0x3060666C, 0xA1068B01, 0xE6860009, 0x3060666C,
43752 +0xA1008B01, 0xE6870009, 0x3060666C, 0xA0FA8B01,
43753 +0xE6880009, 0x3060666C, 0xA0F48B01, 0xE6890009,
43754 +0x3060666C, 0xA0EE8B01, 0xE68A0009, 0x3060666C,
43755 +0xA0E88B01, 0xE68B0009, 0x3060666C, 0xA0E28B01,
43756 +0xE68C0009, 0x3060666C, 0xA0DC8B01, 0xE68D0009,
43757 +0x3060666C, 0xA0D68B01, 0xE68E0009, 0x3060666C,
43758 +0xA0D08B01, 0xE68F0009, 0x3060666C, 0xA0CA8B01,
43759 +0xE6900009, 0x3060666C, 0xA0C48B01, 0xE6910009,
43760 +0x3060666C, 0xA0BE8B01, 0xE6F80009, 0x3060666C,
43761 +0xA0B88B01, 0xE6F90009, 0x3060666C, 0xA0B28B01,
43762 +0xE6FA0009, 0x3060666C, 0xA0AC8B01, 0xE6FB0009,
43763 +0x3060666C, 0xA0A68B01, 0xE6FC0009, 0x3060666C,
43764 +0xA0A08B01, 0xE6FD0009, 0x3060666C, 0xA09A8B01,
43765 +0xE6FE0009, 0x3060666C, 0xA0948B01, 0xE6FF0009,
43766 +0x3060666C, 0xA08E8B01, 0xE6D00009, 0x3060666C,
43767 +0xA0888B01, 0xE6D10009, 0x3060666C, 0xA0828B01,
43768 +0xE6D20009, 0x3060666C, 0xA07C8B01, 0xE6D30009,
43769 +0x3060666C, 0xE6D48977, 0x3060666C, 0xE6D58973,
43770 +0x3060666C, 0xE6D6896F, 0x3060666C, 0xE6D7896B,
43771 +0x3060666C, 0xE6D88967, 0x3060666C, 0xA0038963,
43772 +0x00000009, 0x00114000, 0x666CE6D9, 0x895A3060,
43773 +0x666CE6DA, 0x89563060, 0x666CE6DB, 0x89523060,
43774 +0x666CE6DC, 0x894E3060, 0x666CE6DD, 0x894A3060,
43775 +0x666CE6F0, 0x89463060, 0x666CE6F1, 0x89423060,
43776 +0x666CE6F2, 0x893E3060, 0x666CE6F3, 0x893A3060,
43777 +0x666CE6F4, 0x89363060, 0x666CE6F5, 0x89323060,
43778 +0x666CE6F6, 0x892E3060, 0x666CE6F7, 0x892A3060,
43779 +0x4608E650, 0x89263060, 0x3060969A, 0x96988923,
43780 +0x89203060, 0x30609696, 0x9694891D, 0x891A3060,
43781 +0x30609692, 0x96908917, 0x89143060, 0x3060968E,
43782 +0x968C8911, 0x890E3060, 0x3060968A, 0x9688890B,
43783 +0x89083060, 0x30609686, 0x96848905, 0x89023060,
43784 +0x30609682, 0x000B8B01, 0xE0FFE040, 0x600C000B,
43785 +0xE000000B, 0x6243D157, 0xE4028512, 0x662D670D,
43786 +0xE500A00E, 0x6053655D, 0x305C4000, 0x4008D152,
43787 +0x622D021D, 0x8B023260, 0xA0047108, 0x7501041C,
43788 +0x3273625D, 0x60438BEE, 0xC90A000B, 0x674C76FE,
43789 +0x025C606C, 0x3723622C, 0x20088906, 0x70FF8902,
43790 +0x6603AFF6, 0xE000000B, 0x0009000B, 0x4F124F22,
43791 +0x326052F2, 0x34508910, 0x3470890E, 0x3750890D,
43792 +0x3268890A, 0x04273458, 0x60733758, 0x440BD43B,
43793 +0x306C011A, 0x6203A001, 0x4F166263, 0x000B4F26,
43794 +0x2FE66023, 0x4F124F22, 0x6E434F02, 0x614C54F4,
43795 +0x2F164118, 0x666C677C, 0x64EC655C, 0x46184718,
43796 +0xBFD34518, 0x65034418, 0x60537F04, 0xC980E702,
43797 +0x6E034718, 0x37ED4728, 0x62594519, 0x010A652E,
43798 +0x312C225D, 0x4F06601C, 0x4F264F16, 0x6EF6000B,
43799 +0x03400240, 0x05400440, 0x07400640, 0x09400840,
43800 +0x11400B40, 0x0A401240, 0x4F220A50, 0x614C8451,
43801 +0x3127620C, 0xA00C8901, 0x8452E400, 0x3127620C,
43802 +0xA0068901, 0x8453E401, 0x3127620C, 0xE4038D01,
43803 +0x6263E402, 0x60437201, 0x677C072C, 0x62532F76,
43804 +0x072C7201, 0x055C066C, 0x666C677C, 0xBFA8655C,
43805 +0x7F046413, 0x000B4F26, 0x605C600C, 0x8F068801,
43806 +0x606C6243, 0x8B018801, 0x720AA001, 0x000B72F6,
43807 +0x00006023, 0x00114000, 0x00114008, 0x00203374,
43808 +0xE040D690, 0x056E614C, 0x9274D78F, 0x352C357C,
43809 +0xE400E718, 0x626C6650, 0x89043120, 0x624C7401,
43810 +0x8FF73273, 0x000B7501, 0xE2FF6043, 0x622C644C,
43811 +0x890D3420, 0x8801605C, 0x965D8B03, 0xA005346C,
43812 +0x62436243, 0x324C4208, 0x326C9657, 0x6023000B,
43813 +0x6043000B, 0x2F962F86, 0x2FB62FA6, 0x2FD62FC6,
43814 +0x4F222FE6, 0x92497FF4, 0x6B533526, 0x00296943,
43815 +0xE13FCA01, 0x6E03EAFF, 0x6AAC2F10, 0x6D43EC00,
43816 +0x62D0E808, 0x34A0642C, 0xBFCE8939, 0x3B0065E3,
43817 +0x6CCC8F0A, 0x420062C3, 0x362C6693, 0x1FC18461,
43818 +0x4109610C, 0x2F10A02D, 0x891C2CC8, 0x65E364D0,
43819 +0x644CBFBB, 0x89163B02, 0x70FF60C3, 0x049C4000,
43820 +0x644C65E3, 0x1F02BFB1, 0x8D1A30B2, 0x56F21FC1,
43821 +0x356C6593, 0xC9038451, 0x89122008, 0x660C8451,
43822 +0xA00E4609, 0x7C012F60, 0x328362CC, 0x8FC87D02,
43823 +0xA0061F21, 0x06250009, 0x12C008FC, 0x62CC09B4,
43824 +0x50F11F21, 0x8B128808, 0x7CFF6CCC, 0x60C34C00,
43825 +0x65E3049C, 0x644CBF89, 0x8B083B06, 0x849139CC,
43826 +0x2008C903, 0x84918903, 0x4209620C, 0x60F02F20,
43827 +0x4F267F0C, 0x6DF66EF6, 0x6BF66CF6, 0x69F66AF6,
43828 +0x68F6000B, 0x2F962F86, 0x2FB62FA6, 0x2FD62FC6,
43829 +0x4F222FE6, 0x92727FFC, 0x3426E100, 0x6B436953,
43830 +0x2F12666C, 0xCA010029, 0x8D032668, 0xE2F06E03,
43831 +0x2F22622C, 0x6AACEAFF, 0x6C93ED00, 0x66C0E808,
43832 +0x34A0646C, 0xBF508913, 0x3B0065E3, 0x6DDC8B0A,
43833 +0x39DC4D00, 0xC9038491, 0x8B082008, 0xCB0F60F2,
43834 +0x2F02A005, 0x62DC7D01, 0x8FE83283, 0x60F27C02,
43835 +0x4F267F04, 0x6DF66EF6, 0x6BF66CF6, 0x69F66AF6,
43836 +0x68F6000B, 0x2F962F86, 0x2FB62FA6, 0x2FD62FC6,
43837 +0x4F222FE6, 0x4F024F12, 0x3F3C9332, 0x4308E35B,
43838 +0x605333FC, 0x80341351, 0xE7606063, 0x80381362,
43839 +0x4708E012, 0xE03F8136, 0xD11237FC, 0x27008138,
43840 +0x80788074, 0xE9166053, 0x60638012, 0x21414918,
43841 +0x6B938013, 0xEDFF6AB4, 0x6AAC61B0, 0x6C1C4A18,
43842 +0x68C82CAB, 0x6DDD688D, 0x234238D0, 0x8B131398,
43843 +0xD207D406, 0x0009420B, 0x432BD306, 0x09B40009,
43844 +0x0000FE10, 0x001142D8, 0x000DDD00, 0x001160B0,
43845 +0x002018C0, 0x00115E88, 0x342292E3, 0x8F02E100,
43846 +0xA1616593, 0x92DD0009, 0x352CE7FF, 0xEE04677C,
43847 +0x622C6250, 0x89043270, 0x621C7101, 0x8FF732E3,
43848 +0xE8FC7501, 0x3488688C, 0x9ACBE064, 0x40086893,
43849 +0x0F4438AC, 0x661C6583, 0x644CBE18, 0x64E36E0C,
43850 +0x65E37401, 0x45086643, 0x35EC4608, 0x4508364C,
43851 +0x45004608, 0x369C4600, 0x61A39AB5, 0xE0656763,
43852 +0x400837AC, 0x62637114, 0x321C0F76, 0x94AB7004,
43853 +0x61430F26, 0x359C6263, 0x7004324C, 0x0F267114,
43854 +0x7004361C, 0x0F666753, 0x700437AC, 0x7A140F76,
43855 +0x37AC6753, 0x66537004, 0x364C0F76, 0x74147004,
43856 +0x354C0F66, 0x0F567004, 0x395C958F, 0xED006A93,
43857 +0x6BD3E956, 0xEC054908, 0x4008E065, 0x60B302FE,
43858 +0x644C042C, 0x60E32F46, 0xE06A07AC, 0x01FE4008,
43859 +0x061C60B3, 0x058C60E3, 0x4008E065, 0x677C01FC,
43860 +0x655C666C, 0x641CBDED, 0x7F046403, 0x60D36DDC,
43861 +0xE0660F44, 0x04FE4008, 0x054C60B3, 0x2F56655C,
43862 +0x07AC60E3, 0x4008E06B, 0x60B301FE, 0x60E3061C,
43863 +0xE065058C, 0x01FC4008, 0x666C677C, 0xBDD0655C,
43864 +0x6403641C, 0x65F37F04, 0x60D37510, 0xE0650544,
43865 +0x07FE4008, 0x057C60C3, 0x2F56655C, 0x07AC60E3,
43866 +0x4008E06A, 0x60C301FE, 0x60E3061C, 0xE065058C,
43867 +0x01FC4008, 0x666C677C, 0xBDB2655C, 0x6403641C,
43868 +0x61F37F04, 0x60D37120, 0xE0660144, 0x02FE4008,
43869 +0x052C60C3, 0x2F56655C, 0x07AC60E3, 0x4008E06B,
43870 +0x60C301FE, 0x60E3061C, 0xE065058C, 0x01FC4008,
43871 +0x666C677C, 0xBD94655C, 0x6503641C, 0x64F37F04,
43872 +0x60D3349C, 0xE0670454, 0x07FE4008, 0x057C60B3,
43873 +0x2F56655C, 0x07AC60E3, 0x4008E06C, 0xA00501FE,
43874 +0x0BB860B3, 0x03C2013E, 0x013F0462, 0x60E3061C,
43875 +0xE065058C, 0x01FC4008, 0x666C677C, 0xBD70655C,
43876 +0x6203641C, 0xE1B87F04, 0x64F3611C, 0x60D3341C,
43877 +0xE0680424, 0x05FE4008, 0x075C60B3, 0x2F76677C,
43878 +0x07AC60E3, 0x4008E06D, 0x60B301FE, 0x60E3061C,
43879 +0xE065058C, 0x02FC4008, 0x666C677C, 0xBD50655C,
43880 +0x6703642C, 0xE2C07F04, 0x66F3622C, 0x60D3362C,
43881 +0xE0670674, 0x07FE4008, 0x027C60C3, 0x2F26622C,
43882 +0x07AC60E3, 0x4008E06C, 0x60C302FE, 0x60E3062C,
43883 +0xE065058C, 0x02FC4008, 0x666C677C, 0xBD30655C,
43884 +0x6203642C, 0xE7C87F04, 0x66F3677C, 0x60D3367C,
43885 +0xE0680624, 0x06FE4008, 0x026C60C3, 0x2F26622C,
43886 +0x07AC60E3, 0x4008E06D, 0x60C302FE, 0x60E3062C,
43887 +0xE065058C, 0x02FC4008, 0x666C677C, 0xBD10655C,
43888 +0x6103642C, 0x66937F04, 0x62F37608, 0x60D3326C,
43889 +0x02147D01, 0xE60562DC, 0x7C013263, 0x7B018D02,
43890 +0x0009AEFA, 0x0009A17B, 0xE7FF9BD5, 0x677C35BC,
43891 +0x6250EE08, 0x3270622C, 0x71018904, 0x32E3621C,
43892 +0x75018FF7, 0xDDD89CC8, 0x3D4534C8, 0x4008E064,
43893 +0x4E090E0A, 0x0FE46593, 0x702435BC, 0x64EC661C,
43894 +0x0F56BCB4, 0x64E36E0C, 0x65E37401, 0x45086243,
43895 +0x35EC4208, 0x4508324C, 0x45004208, 0x329C4200,
43896 +0x61B37B0C, 0x38BC6823, 0x7114E06E, 0x40086B23,
43897 +0x91A23B1C, 0x70040F86, 0x68236413, 0x0FB6359C,
43898 +0x7004381C, 0x0F867414, 0x7004342C, 0x67539896,
43899 +0x0F466253, 0x7004378C, 0x6B537814, 0x7114321C,
43900 +0x3B8C0F76, 0x351C7004, 0x0FB69789, 0x397C7004,
43901 +0x70040F26, 0xED006893, 0x0F56EC05, 0x6AD3E956,
43902 +0xE06E4908, 0x02FE4008, 0x012C60A3, 0x2F16611C,
43903 +0x078C60E3, 0x4008E073, 0x60A304FE, 0xE06E064C,
43904 +0x0BFE4008, 0x05BC60E3, 0x4008E065, 0x677C01FC,
43905 +0x655C666C, 0x641CBC85, 0x7F046403, 0x60D36DDC,
43906 +0xE06F0F44, 0x04FE4008, 0x054C60A3, 0x2F56655C,
43907 +0x078C60E3, 0x4008E074, 0x60A30BFE, 0xE06E06BC,
43908 +0x0BFE4008, 0x05BC60E3, 0x4008E065, 0x677C01FC,
43909 +0x655C666C, 0x641CBC65, 0x7F046403, 0x751065F3,
43910 +0x054460D3, 0x4008E06E, 0x60C307FE, 0x655C057C,
43911 +0x60E32F56, 0xE073078C, 0x0BFE4008, 0x06BC60C3,
43912 +0x4008E06E, 0x60E301FE, 0xE065051C, 0x0BFC4008,
43913 +0x666C677C, 0xBC44655C, 0x610364BC, 0x6BF37F04,
43914 +0x60D37B20, 0xE06F0B14, 0x01FE4008, 0x041C60C3,
43915 +0x2F46644C, 0x078C60E3, 0x4008E074, 0x60C301FE,
43916 +0xE06E061C, 0x0BFE4008, 0x05BC60E3, 0x4008E065,
43917 +0xA00501FC, 0x0136677C, 0x028212C0, 0x01370142,
43918 +0x655C666C, 0x641CBC1D, 0x7F046203, 0x349C64F3,
43919 +0x042460D3, 0x4008E070, 0x60A304FE, 0x655C054C,
43920 +0x60E32F56, 0xE075078C, 0x0BFE4008, 0x06BC60A3,
43921 +0x4008E06E, 0x60E301FE, 0xE065051C, 0x0BFC4008,
43922 +0x666C677C, 0xBBFC655C, 0x610364BC, 0xEBB87F04,
43923 +0x65F36BBC, 0x60D335BC, 0xE0710514, 0x07FE4008,
43924 +0x047C60A3, 0x2F46644C, 0x078C60E3, 0x4008E076,
43925 +0x60A30BFE, 0xE06E06BC, 0x01FE4008, 0x051C60E3,
43926 +0x4008E065, 0x677C0BFC, 0x655C666C, 0x64BCBBD9,
43927 +0x7F046103, 0x622CE2C0, 0x3B2C6BF3, 0x0B1460D3,
43928 +0x4008E070, 0x60C302FE, 0x677C072C, 0x60E32F76,
43929 +0xE075078C, 0x02FE4008, 0x062C60C3, 0x4008E06E,
43930 +0x60E302FE, 0xE065052C, 0x02FC4008, 0x666C677C,
43931 +0xBBB6655C, 0x6703642C, 0xEBC87F04, 0x66F36BBC,
43932 +0x60D336BC, 0xE0710674, 0x06FE4008, 0x026C60C3,
43933 +0x2F26622C, 0x078C60E3, 0x4008E076, 0x60C302FE,
43934 +0xE06E062C, 0x02FE4008, 0x052C60E3, 0x4008E065,
43935 +0x677C02FC, 0x655C666C, 0x642CBB93, 0x7F046103,
43936 +0x72086293, 0x362C66F3, 0x7D0160D3, 0x62DC0614,
43937 +0x3263E605, 0x8D027C01, 0xAEE27A01, 0x6EF30009,
43938 +0xE2B068F3, 0x6AF3E05A, 0x389C7E18, 0x69F3622C,
43939 +0x7A084008, 0x67F36DF3, 0x392C61F3, 0x6CA30FE6,
43940 +0x77207D10, 0xE4007128, 0xEB0565F3, 0x604C6654,
43941 +0x66D4626C, 0x2E604221, 0x048C6674, 0x626C2C20,
43942 +0x09444221, 0x21207001, 0x32B3620C, 0x71016403,
43943 +0x8FEB7E01, 0xE05A7C01, 0x6EF34008, 0x7E300BFE,
43944 +0xEC19ED00, 0x66B365A3, 0xBB7E64DC, 0x62DC7D01,
43945 +0x2E0032C3, 0x7E018FF6, 0x666CE6B0, 0x6BF36EF3,
43946 +0x7B283E6C, 0xEC4CA010, 0xCCCCCCCD, 0x64D36DDC,
43947 +0x644C74F4, 0xBB6865B3, 0x67F366E3, 0x77306503,
43948 +0x075460D3, 0x62DC7D01, 0x8BEF32C3, 0x7B306BF3,
43949 +0x61B367B3, 0xED8064B3, 0x71027701, 0x6DDC7403,
43950 +0xDC37E500, 0x605CDE37, 0x091C084C, 0x0A7C668C,
43951 +0x699C4628, 0x49284618, 0x05BC6AAC, 0x4A18269B,
43952 +0x70046803, 0x655C26AB, 0x620C38CC, 0x38EC265B,
43953 +0x286232D3, 0x65038FE7, 0x644CE4B8, 0x3C4C6CF3,
43954 +0x6EF37408, 0xE2B0E658, 0x3E4C6AF3, 0x74086BF3,
43955 +0x460861F3, 0x622C68F3, 0x7A0869F3, 0x314C7B18,
43956 +0x386C64F3, 0x6DA3392C, 0x742867B3, 0x66C4E500,
43957 +0x626C605C, 0x422166E4, 0x66142760, 0x2D20058C,
43958 +0x4221626C, 0x70010954, 0x620C2420, 0x3263E605,
43959 +0x74016503, 0x8FEA7701, 0xE05E7D01, 0x02FD4008,
43960 +0x6D2DE9D0, 0x699C7D07, 0xEE00A00B, 0x66B365A3,
43961 +0x64ECBAFB, 0x620367F3, 0x60EC379C, 0x70010724,
43962 +0x62EC6E03, 0x8BF132D3, 0x4008E05F, 0xEAB008FD,
43963 +0x6DF36AAC, 0x6BF36C8D, 0x7C0D3DAC, 0x7B28A012,
43964 +0x0000A280, 0x001BC000, 0x64E36EEC, 0x644C74F4,
43965 +0xBADA65B3, 0x62F366D3, 0x329C6103, 0x7E0160E3,
43966 +0x62EC0214, 0x8BEF32C3, 0x3D9C6DF3, 0x67D36ED3,
43967 +0xEC8061D3, 0x77027E01, 0x6CCC7103, 0xDBB9E400,
43968 +0x604CDAB9, 0x067C041C, 0x08EC654C, 0x666C4528,
43969 +0x46284518, 0x09DC688C, 0x4818256B, 0x70046603,
43970 +0x699C258B, 0x620C36BC, 0x36AC259B, 0x265232C3,
43971 +0x64038FE7, 0x4008E064, 0x70E007FC, 0x706C0CFC,
43972 +0x0F8668CC, 0x0DFC7098, 0x6ADC706C, 0x708C0FA6,
43973 +0x9BBF0EFE, 0xE2543EB2, 0x697CE100, 0x42088F02,
43974 +0x0009A163, 0x4008E063, 0x6EF305FE, 0x3E2C96B3,
43975 +0x64E3356C, 0xEDFFE703, 0x32D06250, 0x622C8D07,
43976 +0x681C7101, 0x24203873, 0x8FF57505, 0xE0647401,
43977 +0x0AFC4008, 0x64AC65E3, 0x661CBA18, 0xE063670C,
43978 +0x62734008, 0x42080BFE, 0x7701327C, 0x3A2C6AB3,
43979 +0x48086873, 0x948F6EA3, 0x3E4C387C, 0x3B8C74FF,
43980 +0x38283A4C, 0xEC003B4C, 0x6083DD88, 0x655C05EC,
43981 +0xE0652F56, 0x67B04008, 0x65A066E4, 0x677C01FC,
43982 +0x655C666C, 0x641CBA1D, 0x7C017F04, 0xE40462CC,
43983 +0x2D003243, 0x7D018FE9, 0xE063E554, 0x67F34508,
43984 +0x375C4008, 0x966805FE, 0x356CEDFF, 0x6DDC6473,
43985 +0xEE04E100, 0x666C6650, 0x890636D0, 0x621C7101,
43986 +0x246032E3, 0x8FF57505, 0xE0647401, 0x02FC4008,
43987 +0x642C6573, 0x661CB9CA, 0x6E23620C, 0xE0634E08,
43988 +0x72013E2C, 0x0BFE4008, 0x47086723, 0x6AB3372C,
43989 +0x68733AEC, 0x6EA338E8, 0x3E1C9140, 0x3B7C71FF,
43990 +0x3B1C3A1C, 0x0F96704C, 0xEC00E904, 0x6083DD60,
43991 +0x644C04EC, 0xE0652F46, 0x67B04008, 0x65A066E4,
43992 +0x677C01FC, 0x655C666C, 0x641CB9CB, 0x7C017F04,
43993 +0x329362CC, 0x8FEA2D00, 0xE0767D01, 0x09FE4008,
43994 +0x70B4E454, 0x67F34408, 0x374C05FE, 0xEDFF9617,
43995 +0x356C6473, 0xE1006DDC, 0x6650EE04, 0x36D0666C,
43996 +0x71018906, 0x32E3621C, 0x75092460, 0x74018FF5,
43997 +0xE064A006, 0x05BA0BB8, 0x05C905BB, 0x05DD05CA,
43998 +0x65734008, 0x661C07FC, 0x647CB970, 0x6623620C,
43999 +0x4608E063, 0x46004008, 0x362C0BFE, 0x68237201,
44000 +0x3A6C6AB3, 0x48004808, 0x91676EA3, 0x3E1C382C,
44001 +0x3B8C71FF, 0x38683A1C, 0xEC003B1C, 0x6083DD35,
44002 +0x644C04EC, 0xE0652F46, 0x67B04008, 0x65A066E4,
44003 +0x677C01FC, 0x655C666C, 0x641CB973, 0x7C017F04,
44004 +0xE50862CC, 0x2D003253, 0x7D018FE9, 0x4008E063,
44005 +0x05FEE654, 0x64F34608, 0xECFF9741, 0x357C346C,
44006 +0xEE006CCC, 0x6250ED04, 0x32C0622C, 0x7E018906,
44007 +0x38D368EC, 0x75092420, 0x74018FF5, 0x4008E077,
44008 +0x700405FE, 0x649306FE, 0xEA54B9A7, 0x65F34A08,
44009 +0x640C35AC, 0x66ECB91A, 0x6613610C, 0x4608E063,
44010 +0x46004008, 0x361C0BFE, 0x68137101, 0x3A6C6AB3,
44011 +0x48004808, 0x92136EA3, 0x3E2C381C, 0x3B8C72FF,
44012 +0x38683A2C, 0xEC003B2C, 0xE077DD0B, 0x05FE4008,
44013 +0x06FE7004, 0x6493B981, 0x0009A010, 0x060105DE,
44014 +0x00000602, 0x0000B280, 0x001BC000, 0x001142E4,
44015 +0x001142E8, 0x001142ED, 0x001142F5, 0x60836403,
44016 +0x677C07EC, 0x67B02F76, 0x65A066E4, 0x666C677C,
44017 +0xB906655C, 0x7F04644C, 0x61CC7C01, 0x3123E208,
44018 +0x8FD22D00, 0xA0FC7D01, 0xE0630009, 0x05FE4008,
44019 +0x96D067F3, 0x356C372C, 0xEEFF6473, 0x32E06250,
44020 +0x622C8D08, 0x681C7101, 0x3863E608, 0x75052420,
44021 +0x74018FF4, 0x4008E064, 0x657302FC, 0xB8B5642C,
44022 +0x650C661C, 0x4008E063, 0x0BFE6253, 0x325C4208,
44023 +0x6AB37501, 0x68533A2C, 0x6EA34808, 0x385C94AC,
44024 +0x74FF3E4C, 0x3A4C3B8C, 0x3B4C3828, 0xDD96EC00,
44025 +0x06EC6083, 0x2F66666C, 0x4008E065, 0x66E467B0,
44026 +0x01FC65A0, 0x666C677C, 0xB8BA655C, 0x7F04641C,
44027 +0x62CC7C01, 0x3243E404, 0x8FE92D00, 0xE5547D01,
44028 +0x4508E063, 0x400867F3, 0x05FE375C, 0xEEFF9685,
44029 +0x6473356C, 0xE1006EEC, 0x666C6650, 0x890736E0,
44030 +0x621C7101, 0x3283E808, 0x75092460, 0x74018FF4,
44031 +0x4008E064, 0x65730AFC, 0xB86764AC, 0x620C661C,
44032 +0xE0636623, 0x40084608, 0x0BFE4600, 0x7201362C,
44033 +0x6AB36823, 0x48083A6C, 0x6EA34800, 0x382C915E,
44034 +0x71FF3E1C, 0x3A1C3B8C, 0x3B1C3868, 0xDD6FEC00,
44035 +0x04EC6083, 0x2F46644C, 0x4008E065, 0x66E467B0,
44036 +0x01FC65A0, 0x666C677C, 0xB86A655C, 0x7F04641C,
44037 +0x62CC7C01, 0x3253E508, 0x8FE92D00, 0xE0637D01,
44038 +0xE6544008, 0x460805FE, 0x973864F3, 0x346CECFF,
44039 +0x6CCC357C, 0xED08EE00, 0x666C6650, 0x890636C0,
44040 +0x62EC7E01, 0x246032D3, 0x8FF57509, 0xE0777401,
44041 +0x05FE4008, 0x06FE7004, 0xB89E6493, 0x4808E854,
44042 +0x358C65F3, 0xB811640C, 0x610C66EC, 0xE0636613,
44043 +0x40084608, 0x0BFE4600, 0x7101361C, 0x6AB36813,
44044 +0x48083A6C, 0x6EA34800, 0x381C920A, 0x72FF3E2C,
44045 +0xA0063B8C, 0x05023A2C, 0x052A0503, 0x0572052B,
44046 +0x38680573, 0xEC003B2C, 0xE077DD41, 0x05FE4008,
44047 +0x06FE7004, 0x6493B871, 0x60836403, 0x677C07EC,
44048 +0x67B02F76, 0x65A066E4, 0x666C677C, 0xB808655C,
44049 +0x7F04644C, 0x61CC7C01, 0x3123E208, 0x8FE42D00,
44050 +0xD3347D01, 0x0009430B, 0xE079620C, 0x0F244008,
44051 +0x88306023, 0xA24D8B01, 0x88400009, 0xA2498B01,
44052 +0x22280009, 0xA2458B01, 0xE5FF0009, 0x655CD42A,
44053 +0xE03AE601, 0x8F043250, 0xE0790464, 0x4008E210,
44054 +0xE05B0F24, 0x05FE4008, 0x3566963B, 0xA1498B01,
44055 +0x60230009, 0x640CCB01, 0x6E23B842, 0xE118660C,
44056 +0x890F3613, 0x4008E063, 0x04FE4608, 0x97294608,
44057 +0x460070E0, 0x05FE347C, 0x346CB85C, 0xE0606203,
44058 +0x0F244008, 0xCB0260E3, 0x640CB82A, 0xE118660C,
44059 +0x890F3613, 0x4008E063, 0x04FE4608, 0x91114608,
44060 +0x460070E0, 0x05FE341C, 0x346CB844, 0xE0616203,
44061 +0x0F244008, 0xCB0560E3, 0x640CB812, 0xA00D660C,
44062 +0x09B4E07A, 0x0000064D, 0x001142FD, 0x00114301,
44063 +0x00114309, 0x00114400, 0x001142D8, 0x4008E118,
44064 +0x8F043613, 0xE0610F64, 0xA0104008, 0xE07A0DFC,
44065 +0x06FC4008, 0x626C70A4, 0x04FE4208, 0x97B44208,
44066 +0x420070E0, 0x05FE347C, 0x342CB814, 0xE0796D03,
44067 +0x00FC4008, 0xCB07DB8E, 0x430BD38E, 0x610C640C,
44068 +0x4008E07A, 0x709C0F14, 0xE61802FC, 0x8D1C3163,
44069 +0xE05D682C, 0x01FC4008, 0x09FC70FC, 0x04FE70FC,
44070 +0xD385661C, 0x659C430B, 0xE07A6503, 0x01FC4008,
44071 +0x611C70A4, 0x04FE4108, 0x97864108, 0x347C4100,
44072 +0x430BD37E, 0xA003341C, 0xE0616C03, 0x0CFC4008,
44073 +0xE500D67B, 0x640D8562, 0x4008E05B, 0x0AFEA036,
44074 +0x6053655C, 0x305C4000, 0x4008D676, 0x622D026D,
44075 +0x8F2A32A0, 0xD3746E03, 0x64AD430B, 0x2228620D,
44076 +0xD6728927, 0x066C60E3, 0x4008E060, 0x460002FC,
44077 +0x3E676E2C, 0x62638B00, 0x4008E060, 0x0F243867,
44078 +0x62638D03, 0x4008E061, 0xE06102FC, 0x400861DC,
44079 +0x0F243167, 0x8F01682C, 0x626362D3, 0x346764CC,
44080 +0x6D238D01, 0xA00466C3, 0x75016C63, 0x3243625C,
44081 +0xE0608BC6, 0x07FC4008, 0x617CE400, 0xE904D55C,
44082 +0x666C6650, 0x8B013617, 0x6673677C, 0x624C7401,
44083 +0x25603293, 0x75018FF4, 0xE03AD656, 0xE400056C,
44084 +0x8D012558, 0xE2026243, 0x4008E061, 0x67830EFC,
44085 +0x3E283828, 0x9119E500, 0x6053655C, 0x3A1002BC,
44086 +0x622C8D0B, 0x3A609613, 0x32778907, 0xE0618B02,
44087 +0x02FC4008, 0xA01D6053, 0x25580B24, 0x32878908,
44088 +0x62838B00, 0xA0156053, 0x064D0B24, 0x099E096C,
44089 +0x8F083277, 0xE07B6623, 0x0F164008, 0x02FC7098,
44090 +0x01FE7068, 0x626C662C, 0x32876053, 0x0B648F02,
44091 +0x646336E8, 0x625C7501, 0x8BCD3293, 0xE014D635,
44092 +0xE4000644, 0xD53461DC, 0x6250E708, 0x3217622C,
44093 +0x6DDC8B01, 0x740162D3, 0x3673664C, 0x8FF42520,
44094 +0xE4007501, 0xD52D61CC, 0x622C6250, 0x8B013217,
44095 +0x62C36CCC, 0x664C7401, 0x25203673, 0x75018FF4,
44096 +0x0009A0EC, 0x4008E079, 0x642C02FC, 0x430BD319,
44097 +0x660C6E43, 0x3653E518, 0xE0638910, 0x46084008,
44098 +0x460804FE, 0x70E09722, 0x347C4600, 0xD31305FE,
44099 +0x346C430B, 0xE0626203, 0x0F244008, 0xCB0660E3,
44100 +0x430BD30C, 0x660C6403, 0x3653E518, 0xE0638928,
44101 +0x46084008, 0x460804FE, 0x70E09708, 0x347C4600,
44102 +0xD30605FE, 0x346C430B, 0x6C03A01D, 0x0000064D,
44103 +0x001142E8, 0x001148E0, 0x001148BA, 0x00114934,
44104 +0x00114000, 0x00114008, 0x00114774, 0x00114011,
44105 +0x001142E4, 0x001142D8, 0x001142ED, 0x001142F5,
44106 +0x4008E062, 0x60E30CFC, 0xD39CCB08, 0x6403430B,
44107 +0xE07A610C, 0x4008E618, 0x8D1C3163, 0xE05D0F14,
44108 +0x07FC4008, 0x09FC70FC, 0x04FE70FC, 0xD394667C,
44109 +0x659C430B, 0xE07A6503, 0x01FC4008, 0x611C70A4,
44110 +0x04FE4108, 0x9D744108, 0x34DC4100, 0x430BD38D,
44111 +0xA003341C, 0xE0626D03, 0x0DFC4008, 0xE500D68A,
44112 +0x640D8562, 0x4008E05B, 0x01FEA02C, 0x6053655C,
44113 +0x305C4000, 0x4008D685, 0x622D026D, 0x8F203210,
44114 +0xD3836E03, 0x641D430B, 0x2228620D, 0xD681891D,
44115 +0x066C60E3, 0x4008E062, 0x460002FC, 0x3167612C,
44116 +0x62638B00, 0x64CCE062, 0x34674008, 0x8F010F24,
44117 +0x626362C3, 0x356765DC, 0x6C238D01, 0xA00466D3,
44118 +0x75016D63, 0x3243625C, 0xE0628BD0, 0x07FC4008,
44119 +0x617CE400, 0xE904D570, 0x622C6250, 0x8B013217,
44120 +0x6273677C, 0x664C7401, 0x25203693, 0x75018FF4,
44121 +0x61CCE400, 0xE708D569, 0x666C6650, 0x8B013617,
44122 +0x66C36CCC, 0x624C7401, 0x25603273, 0x75018FF4,
44123 +0x61DCE400, 0x6650D562, 0x3617666C, 0x6DDC8B01,
44124 +0x740166D3, 0x3273624C, 0x8FF42560, 0xA0057501,
44125 +0x064D0009, 0xE200D65B, 0x0624E03A, 0xE03AD659,
44126 +0x2228026C, 0xE039894B, 0x2228026C, 0xE05B8947,
44127 +0x0EFE4008, 0x3E669690, 0xE0798941, 0x00FC4008,
44128 +0x8D023E66, 0xCB02640C, 0xD344640C, 0x0009430B,
44129 +0xE05C660C, 0x07FC4008, 0x4608701C, 0x617C05FE,
44130 +0x977A4608, 0x357C4600, 0x6613356C, 0x430BD346,
44131 +0xD54464E3, 0x62032008, 0x0029150F, 0x6603CA01,
44132 +0x2668E03B, 0x05648D20, 0xC8F06023, 0xD53F8909,
44133 +0x76FF6650, 0x84512560, 0x805170FF, 0x70FF8452,
44134 +0x60238052, 0x890FC80F, 0x6260D639, 0x26207201,
44135 +0x70018461, 0x84628061, 0xA0057001, 0xD6318062,
44136 +0xE03BE200, 0x162F0624, 0x4008E05B, 0x964302FE,
44137 +0x8B653266, 0xD72BD428, 0xD52E6040, 0x4028C93F,
44138 +0x40084008, 0x50726203, 0xC802D12B, 0xE604891A,
44139 +0x46284618, 0x2522226B, 0xE2086040, 0x6503C93F,
44140 +0x66034508, 0x45004508, 0x46284218, 0x6263252B,
44141 +0x42084208, 0x252B4200, 0x4218E208, 0x252B4228,
44142 +0x2152A062, 0x4618E614, 0x226B4628, 0x60402522,
44143 +0xC93FE428, 0x45086503, 0x45084028, 0x45004008,
44144 +0x40084418, 0x254BE728, 0x47184000, 0x4728250B,
44145 +0xD412257B, 0x2152A044, 0x064D09B4, 0x001148E0,
44146 +0x001148BA, 0x00114934, 0x00114000, 0x00114008,
44147 +0x00114774, 0x00114011, 0x001142FD, 0x00114301,
44148 +0x00114309, 0x001142D8, 0x00114A24, 0x001142F5,
44149 +0x001142ED, 0x001C3694, 0x001C3BB4, 0x001142E8,
44150 +0xE214D429, 0x42186040, 0x4028C93F, 0x40084008,
44151 +0xD6264228, 0x2602202B, 0xE7286040, 0x6503C93F,
44152 +0x45084508, 0x45004028, 0x40084718, 0x4008257B,
44153 +0x4000E728, 0x250B4718, 0xD21D4728, 0x2252257B,
44154 +0xD71C6240, 0x0724E044, 0x3F3C932C, 0x4F164F06,
44155 +0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6, 0x000B69F6,
44156 +0x2FE668F6, 0x6243D114, 0xE4028512, 0x6E2D670D,
44157 +0xE500A00F, 0x6053655D, 0x305C4000, 0x4008D10F,
44158 +0x622D021D, 0x8B0332E0, 0x041C7108, 0x644CA004,
44159 +0x625D7501, 0x8BED3273, 0x4618E602, 0x604D2469,
44160 +0x6EF6000B, 0x000001F0, 0x001142E8, 0x001C3694,
44161 +0x001C3BB4, 0x001142D8, 0x00114000, 0x00114008,
44162 +0xD766D565, 0x62725151, 0x321CE340, 0x51522722,
44163 +0x337C5271, 0x1721321C, 0x52725153, 0x321C644C,
44164 +0x1722D15F, 0x66125255, 0x2162362C, 0x316C5173,
44165 +0x61521713, 0xD65B5274, 0x1724321C, 0x52755154,
44166 +0x1725321C, 0x52765158, 0x1726321C, 0x51776262,
44167 +0x1717312C, 0x51785261, 0x1718312C, 0x51795262,
44168 +0x1719312C, 0x517A5263, 0x171A312C, 0x517B5264,
44169 +0x171B312C, 0x517C5265, 0x171C312C, 0x517D5266,
44170 +0x171D312C, 0x517E5267, 0x171E312C, 0x527F5168,
44171 +0x321CD645, 0x6262172F, 0x76946132, 0x2312312C,
44172 +0x52316162, 0x321CD641, 0x515C1321, 0x351C5532,
44173 +0x61621352, 0x41295235, 0x1325321C, 0x56365561,
44174 +0x365C4529, 0x1366E538, 0x55312450, 0x71046143,
44175 +0x66722152, 0x75086543, 0x56712562, 0x750C6543,
44176 +0x56722562, 0x75106543, 0x56752562, 0x75146543,
44177 +0x56732562, 0x75186543, 0x56762562, 0x751C6543,
44178 +0x56322562, 0x75206543, 0x66322562, 0x75246543,
44179 +0x56742562, 0x75286543, 0x56342562, 0x752C6543,
44180 +0x55332562, 0x72306243, 0x55352252, 0x72346243,
44181 +0x56362252, 0x24627438, 0x1341E400, 0x17412742,
44182 +0x17451742, 0x17461743, 0x23421342, 0x13441744,
44183 +0x13451343, 0x1346000B, 0xD510E124, 0x51572410,
44184 +0x52581411, 0x57591422, 0x515A1473, 0x525B1414,
44185 +0x575C1425, 0x525D1476, 0x1427E700, 0x1468565E,
44186 +0x1469565F, 0x15781577, 0x157A1579, 0x157C157B,
44187 +0x157E157D, 0x157F000B, 0x001C369C, 0x0020351C,
44188 +0x00203578, 0x001C3CA0, 0x001C36F4, 0x001C3B88,
44189 +0x6E726157, 0x21676E69, 0x69685420, 0x6F642073,
44190 +0x656C676E, 0x746F6E20, 0x65656220, 0x6163206E,
44191 +0x7262696C, 0x64657461, 0x0000000A, 0x00000000,
44192 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44193 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44194 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44195 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44196 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44197 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44198 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44199 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44200 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44201 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44202 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44203 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44204 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44205 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44206 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44207 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44208 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44209 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44210 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44211 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44212 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44213 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44214 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44215 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44216 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44217 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44218 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44219 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44220 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44221 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44222 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44223 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44224 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44225 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44226 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44227 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44228 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44229 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44230 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44231 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44232 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44233 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44234 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44235 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44236 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44237 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44238 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44239 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44240 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44241 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44242 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44243 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44244 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44245 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44246 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44247 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44248 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44249 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44250 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44251 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44252 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44253 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44254 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44255 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44256 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44257 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44258 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44259 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44260 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44261 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44262 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44263 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44264 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44265 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44266 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44267 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44268 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44269 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44270 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44271 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44272 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44273 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44274 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44275 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44276 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44277 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44278 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44279 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44280 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44281 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44282 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44283 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44284 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44285 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44286 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44287 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44288 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44289 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44290 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44291 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44292 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44293 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44294 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44295 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44296 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44297 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44298 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44299 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44300 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44301 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44302 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44303 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44304 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44305 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44306 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44307 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44308 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44309 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44310 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44311 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44312 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44313 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44314 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44315 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44316 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44317 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44318 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44319 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44320 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44321 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44322 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44323 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44324 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44325 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44326 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44327 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44328 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44329 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44330 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44331 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44332 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44333 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44334 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44335 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44336 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44337 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44338 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44339 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44340 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44341 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44342 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44343 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44344 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44345 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44346 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44347 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44348 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44349 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44350 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44351 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44352 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44353 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44354 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44355 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44356 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44357 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44358 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44359 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44360 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44361 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44362 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44363 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44364 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44365 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44366 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44367 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44368 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44369 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44370 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44371 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44372 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44373 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44374 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44375 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44376 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44377 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44378 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44379 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44380 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44381 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44382 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44383 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44384 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44385 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44386 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44387 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44388 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44389 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44390 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44391 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44392 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44393 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44394 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44395 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44396 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44397 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44398 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44399 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44400 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44401 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44402 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44403 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44404 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44405 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44406 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44407 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44408 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44409 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44410 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44411 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44412 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44413 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44414 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44415 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44416 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44417 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44418 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44419 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44420 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44421 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44422 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44423 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44424 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44425 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44426 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44427 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44428 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44429 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44430 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44431 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44432 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44433 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44434 +};
44435 +
44436 +const u32_t zcFwBufImageSize=83968;
44437 --- /dev/null
44438 +++ b/drivers/staging/otus/hal/hpfwspiu.c
44439 @@ -0,0 +1,655 @@
44440 +/*
44441 + * Copyright (c) 2007-2008 Atheros Communications Inc.
44442 + *
44443 + * Permission to use, copy, modify, and/or distribute this software for any
44444 + * purpose with or without fee is hereby granted, provided that the above
44445 + * copyright notice and this permission notice appear in all copies.
44446 + *
44447 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
44448 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
44449 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
44450 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
44451 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
44452 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
44453 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
44454 + */
44455 +#include "../80211core/cprecomp.h"
44456 +
44457 +const u32_t zcFwImageSPI[]={
44458 +0x0009000B, 0x4F222FE6, 0xB0187FFC, 0xE6000009,
44459 +0x943DD520, 0xC8406052, 0x2F028F03, 0x8FF93642,
44460 +0xD41D7601, 0x4E0BDE1D, 0xD41D0009, 0x00094E0B,
44461 +0x4E0BD41C, 0x7F040009, 0xA0214F26, 0x4F226EF6,
44462 +0xE205D119, 0x2122E400, 0x92222142, 0x8BFD4210,
44463 +0x450BD516, 0xD6160009, 0x0009460B, 0xE5FFD715,
44464 +0x2752655D, 0xE1FFD714, 0xD4145079, 0x1709CB01,
44465 +0x17112712, 0x2412E101, 0x4F26D411, 0x2410000B,
44466 +0xDE11DD10, 0x00094D0B, 0x00094E0B, 0x0009AFFA,
44467 +0x03E82710, 0x001C001C, 0x00116594, 0x00114EBE,
44468 +0x001165A4, 0x001165BC, 0x001D4004, 0x00114FA0,
44469 +0x00114378, 0x001C3510, 0x001C3624, 0x001E212C,
44470 +0x001164FC, 0x00114700, 0x0011589C, 0x2FA62F96,
44471 +0x2FC62FB6, 0x2FE62FD6, 0x7FC84F22, 0xD28DDD8C,
44472 +0x61D360D0, 0x80F47101, 0x420B6010, 0x200880F8,
44473 +0x6E038F10, 0xDB89D488, 0xD4896A40, 0x4B0BDC89,
44474 +0x67C065AC, 0x697CDE88, 0x41086193, 0x31984108,
44475 +0x3E1C4108, 0x66D284F8, 0x2008600C, 0x2E628F13,
44476 +0xE40084F4, 0xDA81670C, 0x3273624D, 0xA0D38B01,
44477 +0x644D0009, 0x35AC6543, 0x69436652, 0x39EC6B62,
44478 +0xAFF119B1, 0x88017404, 0x84F48B15, 0x2E70E700,
44479 +0xDA766E0C, 0x32E3627D, 0xA0C48B01, 0x677D0009,
44480 +0x6C7366A3, 0x65737604, 0x356C3CAC, 0x6D5264C2,
44481 +0xAFEF7708, 0xE2B024D2, 0x3020622C, 0x84F48B30,
44482 +0x650CEC00, 0xDA691F53, 0x55F3E904, 0x325362CD,
44483 +0xA0A88B01, 0x6CCD0009, 0x67C36EA3, 0x6BC37E04,
44484 +0x3BEC37AC, 0x6EB26D72, 0xDB62D461, 0x00094B0B,
44485 +0x410BD161, 0xD46164D3, 0x00094B0B, 0x450BD55E,
44486 +0xD45F64E3, 0x00094B0B, 0x61D3E600, 0x316C666D,
44487 +0x646D7601, 0x21E03493, 0x4E198FF7, 0x7C08AFD5,
44488 +0x622CE2B1, 0x8B113020, 0xD552D456, 0xDA56DC4F,
44489 +0x0009450B, 0x4A0BE400, 0xD75467C2, 0x470BDB52,
44490 +0x4B0B0009, 0xE900E403, 0x2E90A06D, 0x622CE2B2,
44491 +0x89683020, 0x622CE2B3, 0x8B1D3020, 0xDA45D44C,
44492 +0x4A0BD942, 0x65960009, 0x6792D44A, 0x1F74DD3B,
44493 +0x1F5D4D0B, 0xD639D448, 0x460BDB48, 0x55F455F4,
44494 +0x4B0BD936, 0xD44654FD, 0x490B6503, 0x5DF51F05,
44495 +0x1ED1EC04, 0x2EC0A047, 0x622CE2B4, 0x8B3E3020,
44496 +0xDA34D440, 0x4A0BDD31, 0x84F40009, 0x600C6CD2,
44497 +0x1F072F02, 0x1FC6C903, 0xE6001F08, 0xD73AE030,
44498 +0x6CF2DB3A, 0x1F790F65, 0xA0211FBA, 0x51F6E904,
44499 +0x6D63666D, 0x4C1536EC, 0xD2353D1C, 0x1F6B8F05,
44500 +0x89023C93, 0xA00264D3, 0xE50455F8, 0x420B64D3,
44501 +0x5BFB0009, 0xD61954FA, 0x460B65D3, 0x54F91B01,
44502 +0xDA1655B1, 0x7CFC4A0B, 0x06FDE030, 0x0F657604,
44503 +0x626D55F7, 0x8BDA3253, 0xA00484F4, 0xD4252E00,
44504 +0x420BD20E, 0x7F3865D2, 0x6EF64F26, 0x6CF66DF6,
44505 +0x6AF66BF6, 0x69F6000B, 0xE6006163, 0x4109A004,
44506 +0x76016256, 0x74042422, 0x8BF93612, 0x0009000B,
44507 +0x00117800, 0x00115FF0, 0x001164F6, 0x00114F2C,
44508 +0x001165C0, 0x001164F5, 0x0011611C, 0x00117804,
44509 +0x001165E0, 0x00114EBE, 0x00114F02, 0x001165F4,
44510 +0x001165FC, 0x00116600, 0x00114BF0, 0x001148FC,
44511 +0x00116618, 0x00116634, 0x00116640, 0x00114E56,
44512 +0x0011664C, 0x00116658, 0x0011667C, 0x00116670,
44513 +0x00114BC4, 0x00116688, 0x2F962F86, 0x2FB62FA6,
44514 +0x2FD62FC6, 0x4F222FE6, 0xE5007FD8, 0x6453E110,
44515 +0x6C534128, 0x655DEE0A, 0x46086653, 0x4608365C,
44516 +0x361C7501, 0x675D6043, 0x60C30F66, 0x37E3ED00,
44517 +0x816126C1, 0x81638162, 0x16D316D2, 0x8FEA16D4,
44518 +0x68F27404, 0xDAB3D9B2, 0x29821981, 0xD1B259F1,
44519 +0x2A921A91, 0x5BF35AF2, 0x5EF55DF4, 0x11A154F6,
44520 +0x11B321A2, 0x11D511B2, 0x11E711D4, 0x114911E6,
44521 +0x55F71148, 0xEE00DBA9, 0xDDA957F8, 0xD6A952F9,
44522 +0x1B5164E3, 0xDBA82B52, 0xEAB8D8A8, 0x2D72E945,
44523 +0x6AAC2622, 0x6EED4908, 0x4D086DE3, 0x3DEC61E3,
44524 +0x4D084108, 0x3DBC31EC, 0x410860C3, 0x81D12DC1,
44525 +0x4108E050, 0x41084008, 0x60C381D2, 0xE500318C,
44526 +0x81D334A2, 0x1D131DD2, 0x8D01D494, 0xD4911D54,
44527 +0xB08165D3, 0x64ED7E01, 0x8BDC3492, 0xDB94D18D,
44528 +0xD28B6812, 0x1B814829, 0x2FD26412, 0x2B92694D,
44529 +0xD98A6722, 0x1B734729, 0xD7876822, 0x1BA26A8D,
44530 +0xD28C6B72, 0x22B2D586, 0xE0035D72, 0x5E7412D2,
44531 +0x12E44018, 0xD6885176, 0x54781216, 0x1248E1FF,
44532 +0xD4856792, 0x6852127A, 0x28C1E703, 0x81916952,
44533 +0x6A52E050, 0x81A24008, 0x60C36B52, 0x6D5281B3,
44534 +0x6E521DD2, 0x62521E63, 0x1264E600, 0x46086563,
44535 +0x7501364C, 0x665D2612, 0x8BF83673, 0xE003D471,
44536 +0x40186542, 0x674225C1, 0x8171D274, 0xEE006842,
44537 +0x69421882, 0x1923E024, 0xE5806A42, 0x6B421AE4,
44538 +0x81B266E3, 0xD46D6C42, 0x655C81C3, 0x6D63666D,
44539 +0x616D7604, 0x31533D4C, 0x2DE28FF8, 0xD569D268,
44540 +0x74042422, 0x7F282452, 0x6EF64F26, 0x6CF66DF6,
44541 +0x6AF66BF6, 0x000B69F6, 0x664268F6, 0xC8036061,
44542 +0xE5008D04, 0xC9036061, 0x8B038802, 0x65635262,
44543 +0x24125124, 0x6053000B, 0x2FE62FD6, 0x7FEC4F22,
44544 +0x62536E53, 0x6D43E550, 0x4508E400, 0xE101A001,
44545 +0x60435224, 0x81212211, 0x60538123, 0x56E28122,
44546 +0x8BF53620, 0x16E4D250, 0xE61464F3, 0x65E3420B,
44547 +0xE4FC65E1, 0x2E512549, 0x65F361F1, 0x2F112149,
44548 +0xD14954D1, 0xE614410B, 0x607157D1, 0x2701CB01,
44549 +0x7F141DE1, 0x6EF64F26, 0x6DF6000B, 0x2FE62FD6,
44550 +0x7FEC4F22, 0x66536E53, 0x6D43E5FC, 0x20596061,
44551 +0x2601CB01, 0x326052E2, 0x12E48B06, 0x31E051E2,
44552 +0x52D18B04, 0x1E22A002, 0x5664AFF0, 0x64F3D236,
44553 +0x420BE614, 0x67E165E3, 0x2719E1FC, 0x67F12E71,
44554 +0x271954D1, 0x65F3D130, 0x410BE614, 0x52D12F71,
44555 +0xCB016021, 0x1DE12201, 0x4F267F14, 0x000B6EF6,
44556 +0x2FE66DF6, 0x624C4F22, 0x4208DE1B, 0xA0054200,
44557 +0x52523E2C, 0x5624D417, 0x2E62BF8E, 0x52E165E2,
44558 +0x8BF63520, 0x2622D61B, 0x000B4F26, 0x2FB66EF6,
44559 +0x2FD62FC6, 0x4F222FE6, 0xDB1CDC10, 0x66C252C1,
44560 +0x89403620, 0xC9036061, 0x893C8801, 0xDD18DE0B,
44561 +0x64E3BF63, 0x85036503, 0x620D66B2, 0x892B3262,
44562 +0xBF9BD403, 0xD4130009, 0x00094D0B, 0x0009AFE6,
44563 +0x001160DC, 0x001160E4, 0x001160EC, 0x00116114,
44564 +0x001164F8, 0x00116500, 0x001000C8, 0x00101680,
44565 +0x001E2108, 0x001C3D00, 0x00117880, 0x00117780,
44566 +0x00040020, 0x0026C401, 0x001142F8, 0x001164DC,
44567 +0x00114EBE, 0x0011669C, 0x64E3BF3E, 0x4D0BD406,
44568 +0xAFBB0009, 0xD2050009, 0x4F262262, 0x6DF66EF6,
44569 +0x000B6CF6, 0x00006BF6, 0x001166A0, 0x001C3D28,
44570 +0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6,
44571 +0xD23C7FFC, 0xC8036022, 0x2F018F3D, 0x0009A061,
44572 +0xC9036061, 0x893B8801, 0xD238D837, 0x420BD938,
44573 +0xE4006483, 0x6A036D03, 0x5C02490B, 0xD236DB35,
44574 +0x56D385D2, 0x650D6422, 0x4B0BE740, 0xD1326E03,
44575 +0x64126EED, 0x214234EC, 0x3DC05DD4, 0x85D28BEF,
44576 +0x70FF56D3, 0xE740650D, 0x6C034B0B, 0x490BDB2A,
44577 +0x66B2E403, 0x36CC6CCD, 0xE700D928, 0x2B62E5C8,
44578 +0x6473E650, 0x490BDC26, 0x6483655C, 0x65A34C0B,
44579 +0xEE01D124, 0xD11C21E2, 0x66125211, 0x8BBF3620,
44580 +0xDD22DE21, 0xDC23DB22, 0x65D252D1, 0x89183520,
44581 +0xC9036051, 0x89148801, 0xD114D41C, 0x0009410B,
44582 +0x36E05603, 0x65038F04, 0x2B20E201, 0x2C52AFEC,
44583 +0xD213D419, 0x0009420B, 0xE101D618, 0xAFE34118,
44584 +0x60F12612, 0x8902C804, 0x420BD215, 0x7F040009,
44585 +0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6, 0x000B69F6,
44586 +0x000068F6, 0x001E2100, 0x001160E4, 0x0011453A,
44587 +0x00114BF0, 0x00114E0C, 0x00116714, 0x001159B0,
44588 +0x00114558, 0x001E212C, 0x00117880, 0x001160DC,
44589 +0x001164FC, 0x001164F8, 0x00116114, 0x001C3D30,
44590 +0x001140CC, 0xD6C2D5C1, 0x26226252, 0xC8016060,
44591 +0x000B8BFA, 0x2FE60009, 0xBFF34F22, 0xD2BD0009,
44592 +0xE405E100, 0x22402212, 0x6422DEB8, 0xE700D5B8,
44593 +0x25721E42, 0xC98F8451, 0xC9F0CB10, 0x8051CB02,
44594 +0xCB026050, 0x62522500, 0x2E22BFDC, 0xD6B250E4,
44595 +0x4F262602, 0x6EF6000B, 0x4F222FD6, 0x0009BFDB,
44596 +0x620CDDAE, 0x60D02D22, 0x8906C801, 0x0009BFD3,
44597 +0x2D22620C, 0xC80160D0, 0x4F268BF8, 0x6DF6000B,
44598 +0x4F222FE6, 0x6E43BFE8, 0xE100D2A2, 0x22E02212,
44599 +0x6422D59E, 0xE600DE9E, 0x2E621542, 0xC9F084E1,
44600 +0x80E1CB01, 0xCB0260E0, 0x67E22E00, 0x4F262572,
44601 +0x6EF6AFA8, 0xE406AFE4, 0xE404AFE2, 0xBFF94F22,
44602 +0xE4C70009, 0x644CBFDC, 0x4F26AFF6, 0xE406AFD8,
44603 +0xE404AFD6, 0x4F222FE6, 0x6E43BFF8, 0xD58DD28D,
44604 +0xE401E100, 0x221260E3, 0x80512240, 0x6622D187,
44605 +0xE700DE87, 0x2E721162, 0xC9F084E1, 0x80E1CB02,
44606 +0xCB0260E0, 0x62E22E00, 0x2122BF7C, 0xAFDF4F26,
44607 +0x2FD66EF6, 0x4F222FE6, 0xBFCB6D53, 0xBF9B6E43,
44608 +0xD27C0009, 0x22E061D3, 0x6022DE7D, 0x411821E9,
44609 +0x201BC9FF, 0x2202D577, 0xD6768453, 0x60D38051,
44610 +0xD4728053, 0xD1726762, 0x1472ED00, 0x841121D2,
44611 +0xCB04C9F0, 0x60108011, 0x2100CB02, 0xBF516212,
44612 +0x4F262422, 0xAFA76EF6, 0x65436DF6, 0xAFD0E4D8,
44613 +0x6543644C, 0xAFCCE4D8, 0x2FC6644C, 0x2FE62FD6,
44614 +0x6E534F22, 0xBF676D43, 0xD7626C63, 0x27D0D264,
44615 +0x61E36072, 0x41182129, 0x201BC9FF, 0x2702D45D,
44616 +0xD15B8443, 0x60E38041, 0xDE588043, 0xE6006472,
44617 +0x21621E42, 0x65DC8411, 0x60C36203, 0x4008C907,
44618 +0x67034008, 0xE29F6023, 0x622CC98F, 0x3520207B,
44619 +0x80118D18, 0x7C048411, 0x60C36603, 0x6203C90F,
44620 +0xC9F06063, 0x8011202B, 0x880B6053, 0x84118B14,
44621 +0xC90F6603, 0xC90F7001, 0x60636203, 0x202BC9F0,
44622 +0x8011A00A, 0x7C018411, 0x60C36603, 0x6203C90F,
44623 +0xC9F06063, 0x8011202B, 0xCB026010, 0x62122100,
44624 +0x2E22BEF0, 0xD63C50E4, 0x4F262602, 0x6DF66EF6,
44625 +0x6CF6000B, 0x2FC62FB6, 0x2FE62FD6, 0x6C634F22,
44626 +0x6E436D53, 0x6B73BF36, 0x0009BF06, 0x61D3D231,
44627 +0xDE3322E0, 0x21E96022, 0xC9FF4118, 0xD42D201B,
44628 +0x84432202, 0x8041D72F, 0x804360D3, 0x6622D427,
44629 +0x1462D127, 0x14C327C2, 0x21C2EC00, 0x7B048411,
44630 +0x60B36D03, 0x6503C90F, 0xC9F060D3, 0x8011205B,
44631 +0xCB026010, 0x62122100, 0x4F262422, 0x6DF66EF6,
44632 +0xAEAF6CF6, 0x2FB66BF6, 0x2FD62FC6, 0x4F222FE6,
44633 +0x6C536D63, 0xBEFD6E43, 0xBECD6B73, 0xD2150009,
44634 +0x22E061C3, 0x6022DE16, 0x411821E9, 0x201BC9FF,
44635 +0x2202D110, 0xD60F8413, 0x60C38011, 0xDE0B8013,
44636 +0xD40B6762, 0xEC006BBD, 0x1EB51E72, 0x844124C2,
44637 +0xC9F04B21, 0x8041CB04, 0xE1406040, 0x2400CB06,
44638 +0xE5006242, 0x4B212E22, 0x4128A014, 0x001D1200,
44639 +0x00116528, 0x00116530, 0x00116538, 0x00116544,
44640 +0x00FFFFFF, 0x00116534, 0x6053655D, 0x06DE4008,
44641 +0x21627501, 0x32B3625D, 0x4F268BF6, 0x6DF66EF6,
44642 +0xAE5F6CF6, 0x4F226BF6, 0xBF73677C, 0xAEB3644C,
44643 +0x4F224F26, 0xBFA6677D, 0xAEAD644C, 0x4F224F26,
44644 +0xE500E49F, 0xBF08E603, 0x4F26644C, 0x600C000B,
44645 +0xE49F4F22, 0xE603E500, 0x644CBEFF, 0x4F264019,
44646 +0x600D000B, 0x6543665C, 0xE403AEF7, 0x6543665C,
44647 +0xE40BAEF3, 0xD175D674, 0x60436262, 0xC8012122,
44648 +0x8F016010, 0xC9EFCB10, 0x62122100, 0x2622000B,
44649 +0x4F222FE6, 0xE0004F13, 0xBE2C401E, 0xD56C6E43,
44650 +0x2522620C, 0xE401BFE6, 0x6063D669, 0x60ECCF80,
44651 +0x89072008, 0x89098801, 0x890D8802, 0x89118803,
44652 +0x0009A013, 0xC9E36060, 0x2600A00F, 0xCB106060,
44653 +0xCB04C9F7, 0x2600A009, 0xCB106060, 0xCB08C9FB,
44654 +0x2600A003, 0xCB1C6060, 0xD5592600, 0xBE616252,
44655 +0xE400642C, 0x4F264F17, 0x6EF6AFBC, 0x2F962F86,
44656 +0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6, 0x60C36C7C,
44657 +0x6A638802, 0x69538F09, 0x65436290, 0x662CE4AF,
44658 +0xBEF7E701, 0xA00A644C, 0x2CC80009, 0x88018901,
44659 +0x65438B05, 0xE600E4AF, 0xBEEBE701, 0xBDD1644C,
44660 +0xED010009, 0xDE43EBAF, 0xE800A02C, 0x0009BDF4,
44661 +0x60C3D141, 0x8802E200, 0xD5402122, 0x21B08D06,
44662 +0x89082CC8, 0x890A8801, 0x0009A00C, 0x009C60D3,
44663 +0xA007D639, 0xD2388061, 0xA0036083, 0xD2368021,
44664 +0x802160D3, 0xD1356412, 0x1E42E600, 0x84512162,
44665 +0xC9F07D01, 0x8051CB02, 0xCB026050, 0x67122500,
44666 +0x2E72BDA0, 0x8BD13DA2, 0x0009BDF6, 0x0009BDA3,
44667 +0x620CD627, 0x4F262622, 0x6DF66EF6, 0x6BF66CF6,
44668 +0x69F66AF6, 0x68F6000B, 0xE702AF98, 0x2F962F86,
44669 +0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6, 0x3F3C9331,
44670 +0x0F569030, 0xE8FF70FC, 0x688C0F46, 0xE900A049,
44671 +0x4018E010, 0xE50404FE, 0xBF33349C, 0x88FF6A43,
44672 +0x901F893E, 0xE1100CFE, 0x41183C98, 0x8B033C16,
44673 +0x64A3BE1B, 0x0009A031, 0x4018E010, 0xED000BFE,
44674 +0xA0073BCC, 0x64D36EF3, 0xBF1F34BC, 0x2E00E501,
44675 +0x7E017D01, 0x8BF63DC2, 0x64A3BE07, 0xA01AED00,
44676 +0xEFF86EF3, 0x00001004, 0x001D1204, 0x0011652C,
44677 +0x00116544, 0x001D1200, 0x00116530, 0x00116528,
44678 +0x666C66E0, 0x89043680, 0x35BC65D3, 0xBE51E701,
44679 +0x7D01E402, 0x3DC27E01, 0xE1108BF2, 0x391C4118,
44680 +0x90547904, 0x391201FE, 0x93518BB2, 0x4F263F3C,
44681 +0x6DF66EF6, 0x6BF66CF6, 0x69F66AF6, 0x68F6000B,
44682 +0x676D6253, 0x66236543, 0xE402AEC3, 0x2FA62F96,
44683 +0x2FC62FB6, 0x2FE62FD6, 0x697D4F22, 0x4A216A93,
44684 +0x4A084A21, 0x6C436D63, 0xA0086B73, 0x64C36E53,
44685 +0x669365D3, 0x6BBDBFE4, 0x3DAC3CBC, 0x6EEF3EB8,
44686 +0x8BF42EE8, 0x4F26E000, 0x6DF66EF6, 0x6BF66CF6,
44687 +0x000B6AF6, 0x2FA669F6, 0x2FC62FB6, 0x2FE62FD6,
44688 +0xEC004F22, 0x6B536EC3, 0xA0066D43, 0x64D3EA01,
44689 +0x65A3BEA8, 0x7D013C0C, 0x3EB27E01, 0x60C38BF7,
44690 +0x6EF64F26, 0x6CF66DF6, 0x000B6BF6, 0x10046AF6,
44691 +0x00001008, 0x0009000B, 0x2FD62FC6, 0x4F222FE6,
44692 +0x6D436C53, 0xEE00A004, 0x7E0164D4, 0x644CBFF2,
44693 +0x8BF93EC2, 0x6EF64F26, 0x000B6DF6, 0xE5006CF6,
44694 +0x6643A002, 0x76017501, 0x22286260, 0xAFE38BFA,
44695 +0x2FE60009, 0x75076253, 0xE1086753, 0x6043EE0A,
44696 +0x4409C90F, 0x650330E2, 0x8D014409, 0xE630E637,
44697 +0x4110365C, 0x8FF22760, 0xE00077FF, 0x000B8028,
44698 +0x4F226EF6, 0xBFE47FEC, 0xBFD865F3, 0x7F1464F3,
44699 +0x000B4F26, 0x4F22E000, 0xBFDA7FEC, 0x64F365F3,
44700 +0x7406BFCD, 0x4F267F14, 0xE000000B, 0x4F222FE6,
44701 +0x62537FEC, 0x65F36E43, 0x6423BFCB, 0x64E3BFBF,
44702 +0x64F3BFBD, 0xBFBAD403, 0x7F140009, 0x000B4F26,
44703 +0x00006EF6, 0x001166A4, 0xE4FDD29A, 0xD79A6122,
44704 +0x22122149, 0x74016022, 0x2202CB01, 0xD5976622,
44705 +0x22622649, 0xC8406070, 0x60528902, 0x2502CB04,
44706 +0xE1F76452, 0x25422419, 0xE7016052, 0x2502C9CF,
44707 +0xE6026052, 0x2502CB03, 0x15624718, 0x1573000B,
44708 +0xD78CD58B, 0xD48DD28C, 0xE600E100, 0x27112511,
44709 +0xAFD12210, 0x664C2461, 0x4600D289, 0x6060362C,
44710 +0x000BCB10, 0x654C2600, 0x4500D285, 0x6650352C,
44711 +0x2619E1EF, 0x2560000B, 0xD282664C, 0x362C4600,
44712 +0xCB106060, 0x2600000B, 0xD27E654C, 0x352C4500,
44713 +0xE1EF6650, 0x000B2619, 0x664C2560, 0x4600D278,
44714 +0x6060362C, 0x000BCB08, 0x654C2600, 0x4500D274,
44715 +0x6650352C, 0x2619E1F7, 0x2560000B, 0xD271664C,
44716 +0x362C4600, 0xCB086060, 0x2600000B, 0xD26D654C,
44717 +0x352C4500, 0xE1F76650, 0x000B2619, 0x624C2560,
44718 +0x4200D667, 0x6020326C, 0x4021C908, 0x40214021,
44719 +0x600C000B, 0xD663624C, 0x326C4200, 0xC9086020,
44720 +0x40214021, 0x000B4021, 0xD15F600C, 0x341C644C,
44721 +0x000B6240, 0xD15D602C, 0x341C644C, 0x000B6240,
44722 +0x2FE6602C, 0x6E434F22, 0xE60A645C, 0x89143467,
44723 +0x0009BFEB, 0x60EC640C, 0x8B028801, 0xA002E00F,
44724 +0x44092409, 0x624C4409, 0x3263E60A, 0xBFE28905,
44725 +0x620C644C, 0xC8806023, 0xE2008B00, 0x4F266023,
44726 +0x6EF6000B, 0xD64A4F22, 0x88016062, 0xB2458B03,
44727 +0xA0030009, 0xD2470009, 0x2260E640, 0xE200D646,
44728 +0x000B4F26, 0x4F222622, 0x6062D641, 0x8B018802,
44729 +0x0009B28E, 0xE200D640, 0x000B4F26, 0xD53C2622,
44730 +0xE100D43C, 0x2512E701, 0x2470000B, 0xE604D239,
44731 +0x2260000B, 0xD4394F22, 0x410BD139, 0xD5390009,
44732 +0x6650E1FD, 0x2619D238, 0x2560E700, 0x000B4F26,
44733 +0x4F222270, 0xD132D435, 0x0009410B, 0xE7FBD531,
44734 +0x26796650, 0x000B4F26, 0x4F222560, 0xD12CD430,
44735 +0x0009410B, 0xE7F7D52B, 0x26796650, 0x000B4F26,
44736 +0xD5282560, 0x6250942D, 0x000B2249, 0xD5252520,
44737 +0x6250E4BF, 0x000B2249, 0x4F222520, 0x8522D225,
44738 +0x2008600D, 0x88018911, 0x88038913, 0x88058915,
44739 +0x88068942, 0x88088948, 0x8809894E, 0x880A8954,
44740 +0x880B895A, 0xA0678960, 0xB0690009, 0xA0640009,
44741 +0xB077600C, 0xA0600009, 0xB080600C, 0xA05C0009,
44742 +0xFF7F600C, 0x001E2148, 0x001E1000, 0x001E1108,
44743 +0x00116570, 0x00116572, 0x00116591, 0x00116554,
44744 +0x001E103F, 0x001E105F, 0x001E102F, 0x001E1090,
44745 +0x00116578, 0x001E100B, 0x00116574, 0x001166A8,
44746 +0x00114EBE, 0x001E1028, 0x00116590, 0x001166B4,
44747 +0x001166C4, 0x00116548, 0x6260D684, 0x8B2B2228,
44748 +0x0009B061, 0x600CA029, 0x6260D680, 0x8B232228,
44749 +0x0009B069, 0x600CA021, 0x6260D67C, 0x8B1B2228,
44750 +0x0009B0C7, 0x600CA019, 0x6260D678, 0x8B132228,
44751 +0x0009B0CD, 0x600CA011, 0x6260D674, 0x8B0B2228,
44752 +0x0009B125, 0x600CA009, 0x6260D670, 0x8B032228,
44753 +0x0009B13D, 0x600CA001, 0x4F26E000, 0x0009000B,
44754 +0xD26CD16B, 0xD56C8412, 0x4000C90F, 0xD76B012D,
44755 +0xE403D66B, 0xE20F611C, 0x2540E001, 0x25202712,
44756 +0x2602000B, 0xE601D262, 0x30668523, 0xE0008D05,
44757 +0xD663D260, 0xE0018122, 0x000B2602, 0xD25C0009,
44758 +0x600D8523, 0x89052008, 0x8B0A8801, 0x6060D65D,
44759 +0x2600CB01, 0xD457D65A, 0xE001E101, 0x000B2612,
44760 +0x000B8142, 0xD152E000, 0x8513E501, 0x640D4518,
44761 +0x66033453, 0xE0008D05, 0xD551D253, 0x2260E001,
44762 +0x000B2502, 0x4F220009, 0x8513D149, 0x6453650D,
44763 +0x62494419, 0x227D672E, 0x8801602C, 0x88028909,
44764 +0x88038910, 0x8806891A, 0x88078935, 0xA04C893B,
44765 +0xD5460009, 0x6652D746, 0x2762D446, 0x622C6261,
44766 +0x2421A038, 0x2228625C, 0xD4438B3F, 0x6642D540,
44767 +0x2562D440, 0x24018561, 0x6203A02C, 0x2008605C,
44768 +0x88108907, 0x88208908, 0x88308909, 0xA02C890A,
44769 +0xD23A0009, 0x6222A008, 0xA005D239, 0xD2396222,
44770 +0x6222A002, 0x6262D638, 0xD432D531, 0x66212522,
44771 +0xA00F626C, 0xD6352421, 0x6261D52D, 0x622CD42D,
44772 +0xA0072562, 0xD6322421, 0x8561D529, 0x2562D429,
44773 +0x62032401, 0x662D8515, 0x3617610D, 0x65038F01,
44774 +0xB0CB2451, 0xA0010009, 0xE000E001, 0x000B4F26,
44775 +0xD6190009, 0xD427E101, 0x65412610, 0xD118D717,
44776 +0xE20F655D, 0x2752E001, 0x000B2620, 0x2FE62102,
44777 +0xD20F4F22, 0x640C8523, 0x8B082448, 0xD511D61D,
44778 +0x2621E200, 0x940F8451, 0xA0482049, 0xDE0D8051,
44779 +0xC84060E0, 0xE2018D32, 0x89443427, 0xD216D615,
44780 +0x2641420B, 0x0009A030, 0x0000FF7F, 0x00116591,
44781 +0x00116548, 0x00116554, 0x001E1100, 0x001E100C,
44782 +0x00116574, 0x001E1000, 0x001E1001, 0x0011657C,
44783 +0x0011655C, 0x00116560, 0x00116564, 0x00116580,
44784 +0x00116584, 0x00116588, 0x0011658C, 0x00116774,
44785 +0x0011677E, 0x0011656E, 0x00115DCA, 0x89123427,
44786 +0xD294D693, 0x2641420B, 0xCB8084E1, 0x80E1B0F5,
44787 +0xD69160E0, 0x2E00CB04, 0xC93F6060, 0xD68F2600,
44788 +0xA001E001, 0xE0002602, 0x000B4F26, 0xD68C6EF6,
44789 +0xC8806060, 0xD2868919, 0x88016021, 0xD2898B15,
44790 +0x8524E501, 0x89103056, 0xE203D187, 0x2120D487,
44791 +0xE00B6541, 0x0656655D, 0xE40FD585, 0x2140E702,
44792 +0xD77E2571, 0x000BE001, 0x000B2702, 0x2FE6E000,
44793 +0xDE804F22, 0xC88084E1, 0xD57A892C, 0x20088554,
44794 +0x61038F28, 0x8553D77C, 0x64036672, 0x8566650C,
44795 +0x3520620C, 0xD6798B1E, 0x651CD774, 0x2651644C,
44796 +0x60E02741, 0x8904C840, 0x420BD275, 0xA0030009,
44797 +0xD2680009, 0x0009420B, 0x0009B09F, 0xE201D167,
44798 +0x60E02122, 0xCB04D464, 0x60402E00, 0x2400C93F,
44799 +0x6023A001, 0x4F26E000, 0x6EF6000B, 0x2FB62FA6,
44800 +0x2FD62FC6, 0xDA622FE6, 0x66A1E240, 0x3622DC5E,
44801 +0x62638900, 0x6ED36D2C, 0x4E2136D8, 0x4E212A61,
44802 +0xDB61D460, 0xE700A00F, 0x770162B2, 0x71026123,
44803 +0x66212B12, 0x71026213, 0x61212B12, 0x651D666D,
44804 +0x356C4528, 0x627C2452, 0x8BED32E3, 0xC90360D3,
44805 +0x8B108803, 0x617367B2, 0x2B127102, 0x71026E13,
44806 +0x2B126571, 0x655D6DE1, 0x422862DD, 0x325CE107,
44807 +0xA00C2C10, 0x88022422, 0xA0038B01, 0x8801E203,
44808 +0xE2018B05, 0x66B22C20, 0x655D6561, 0xE60F2452,
44809 +0x67A12C60, 0x8B052778, 0xDD38DC44, 0xEB01EA00,
44810 +0x2DB22CA2, 0x6DF66EF6, 0x6BF66CF6, 0x6AF6000B,
44811 +0x2FE62FD6, 0xE240DD36, 0x362266D1, 0x62638900,
44812 +0x3678672C, 0x7703DE38, 0x47212D61, 0x64E2D635,
44813 +0xA00E4721, 0x6562E100, 0x62537101, 0x74012450,
44814 +0x24204219, 0x45297401, 0x74012450, 0x24504519,
44815 +0x621C7401, 0x8BEE3273, 0x66E24200, 0x420061D1,
44816 +0x2118362C, 0x2E628F06, 0xDD1CD728, 0xE501E400,
44817 +0x2D522742, 0x000B6EF6, 0x2FD66DF6, 0x4F222FE6,
44818 +0xED0AEE01, 0x64E3BC97, 0xBC9C64E3, 0x62EC7E01,
44819 +0x8BF732D7, 0xBC9FEE01, 0x64E364E3, 0x7E01BCA4,
44820 +0x32D762EC, 0x4F268BF7, 0x000B6EF6, 0xD1186DF6,
44821 +0xD418920D, 0x72122122, 0x2422D617, 0xD7177204,
44822 +0x72202622, 0x2722D116, 0x000B7230, 0x137A2122,
44823 +0x0011656E, 0x00115ED6, 0x001E1015, 0x00116574,
44824 +0x001E1001, 0x00116548, 0x001E1100, 0x00116572,
44825 +0x00116560, 0x001E1000, 0x00116564, 0x00116570,
44826 +0x00115DCA, 0x001E100C, 0x0011655C, 0x00116578,
44827 +0x0011657C, 0x00116580, 0x00116584, 0x00116588,
44828 +0x0011658C, 0x4F222FE6, 0xD6507FFC, 0x88016060,
44829 +0xE2018951, 0x2620BFBB, 0xD54ED14D, 0xDE4E6010,
44830 +0x64E36552, 0x7402C840, 0x8D22D14C, 0xD24C7502,
44831 +0xE601D74C, 0xE7042722, 0x76016255, 0x626C2421,
44832 +0x8FF93273, 0xD4437402, 0x6242E601, 0x640D8528,
44833 +0x67494419, 0x275D657E, 0x81E4607C, 0xE417D542,
44834 +0x67557601, 0x3243626C, 0x8FF92171, 0xA0207102,
44835 +0xD23E0009, 0xE601D73B, 0xE7042722, 0x76016255,
44836 +0x626C2421, 0x8FF93273, 0xD4327402, 0x6242E601,
44837 +0x640D8528, 0x67494419, 0x275D657E, 0x81E4607C,
44838 +0xE417D533, 0x67557601, 0x3243626C, 0x8FF92171,
44839 +0x924A7102, 0xD2262E21, 0x5E23D72E, 0x64F22FE2,
44840 +0x604365F2, 0x2700C980, 0xC9606043, 0x80716103,
44841 +0xC9036043, 0x80724519, 0x65F2605C, 0x817266F2,
44842 +0x46194629, 0x606C4529, 0x4018645C, 0x8173304C,
44843 +0x21185E23, 0x64F22FE2, 0x6E4C62F2, 0x602C4219,
44844 +0x66F262F2, 0x46294018, 0x461930EC, 0x42298174,
44845 +0x652C606C, 0x305C4018, 0x81758F07, 0x0009BC9D,
44846 +0x2228620C, 0xA00A8908, 0x60130009, 0x8B038840,
44847 +0x0009B009, 0x0009A003, 0xE202D60F, 0x7F042622,
44848 +0x000B4F26, 0x000B6EF6, 0x060A0009, 0x00116590,
44849 +0x001E1000, 0x0011657C, 0x00116774, 0x00116780,
44850 +0x00116718, 0x00116564, 0x00116748, 0x00116746,
44851 +0x0011671A, 0x00116548, 0x00116574, 0x4F222FE6,
44852 +0x84E9DE8E, 0x2448640C, 0xB18B8901, 0xD28C0009,
44853 +0x26686620, 0x60E08902, 0x2E00C9BF, 0x000B4F26,
44854 +0x000B6EF6, 0x2FE60009, 0xDE864F22, 0x60E0D686,
44855 +0xCBC0D486, 0x62602E00, 0xC803602C, 0x40218904,
44856 +0x70014021, 0x6603A002, 0x66034009, 0xD680616D,
44857 +0xE500A004, 0x75016262, 0x74042422, 0x3213625D,
44858 +0xD27C8BF8, 0x0009420B, 0xC9BF84E2, 0x4F2680E2,
44859 +0x6EF6000B, 0x2FE62FD6, 0x7FFC4F22, 0x6260D676,
44860 +0x89402228, 0xD56DE100, 0x60502610, 0xCB40D473,
44861 +0x2500440B, 0x8D052008, 0x62E06E03, 0x7104612C,
44862 +0x2F11A006, 0xD46ED666, 0xDD6E6760, 0x657C4D0B,
44863 +0xE23C6D1D, 0x8B033D27, 0xD26CD46B, 0x0009420B,
44864 +0x4D214D21, 0xA005D76A, 0x66E6E400, 0x357C4508,
44865 +0x74012562, 0x35D3654D, 0xD7668BF7, 0x6E72E003,
44866 +0x81E14018, 0x6E7260F1, 0x81E2700C, 0xD4626172,
44867 +0xDD628113, 0x65724D0B, 0xD652D261, 0x2212E101,
44868 +0xC93F6060, 0x7F042600, 0x6EF64F26, 0x6DF6000B,
44869 +0x2FC62FB6, 0x2FE62FD6, 0xD25A4F22, 0x6B436E73,
44870 +0x420B6C53, 0x20086D63, 0x61038F08, 0xD24FD456,
44871 +0x6EF64F26, 0x6CF66DF6, 0x6BF6422B, 0x21B060C3,
44872 +0x60D38011, 0xE5008111, 0x64BCA007, 0x6053655D,
44873 +0x665300EC, 0x7501361C, 0x625D8064, 0x8BF53243,
44874 +0x6060D636, 0x2600C9BF, 0x6EF64F26, 0x6CF66DF6,
44875 +0x6BF6000B, 0x7FC44F22, 0x720262F3, 0x22512F41,
44876 +0x45297202, 0x60632251, 0xE5C4E682, 0x67F38121,
44877 +0x655C666C, 0xE408BFBC, 0x4F267F3C, 0x0009000B,
44878 +0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6,
44879 +0xE1007FC4, 0x6513ECFF, 0x6B136CCD, 0xDE34D733,
44880 +0xEDFF64F3, 0xD833EA04, 0x6053655C, 0x027D4000,
44881 +0x32C0622D, 0x66038D0D, 0x09ED6063, 0x2491027D,
44882 +0x24217402, 0x698202ED, 0x3928622D, 0x74022892,
44883 +0x75017104, 0x6063625C, 0x07D532A2, 0x0EB58FE4,
44884 +0x2448641C, 0xE6808905, 0x67F3E5C5, 0xBF7F666C,
44885 +0x7F3C655C, 0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6,
44886 +0x000B69F6, 0xD11C68F6, 0x6012D21C, 0xCB20E405,
44887 +0x2102E500, 0x000B2242, 0x00002252, 0x001E1017,
44888 +0x001164F6, 0x001E1015, 0x001E10BF, 0x00117800,
44889 +0x001E10FC, 0x001140CC, 0x001164FC, 0x0011602E,
44890 +0x001166D0, 0x00114F2C, 0x001166EC, 0x00114EBE,
44891 +0x0011788C, 0x001164F8, 0x001160DC, 0x001145BC,
44892 +0x001E2130, 0x00115FF0, 0x001166F4, 0x00116510,
44893 +0x00116518, 0x00116710, 0x001C3500, 0x001D4004,
44894 +0xD565D164, 0xE400D765, 0x2142E20F, 0x17411154,
44895 +0xD5632722, 0x9669D763, 0x15412572, 0x96661562,
44896 +0xE6011565, 0xD5601165, 0x666CE6F8, 0x25422542,
44897 +0x25422542, 0x25422542, 0x25622542, 0x7601E727,
44898 +0x67632572, 0x25627797, 0xE7042572, 0x2572E248,
44899 +0xE2192522, 0xE2702522, 0x25422542, 0x25422542,
44900 +0x25222542, 0x2522E20C, 0x25422542, 0x25422542,
44901 +0x25422542, 0x25422542, 0x000B154A, 0xE2081145,
44902 +0x0009422B, 0x2FE62FD6, 0x7FFC4F22, 0xC8206043,
44903 +0x6E438D02, 0x0009BE75, 0xC81060E3, 0xBE728901,
44904 +0x60E30009, 0x8901C840, 0x0009BE94, 0xC80160E3,
44905 +0xDD3E8938, 0xC80260D0, 0x2F008D03, 0x460BD63C,
44906 +0x60F00009, 0x8902C804, 0x460BD63A, 0x62F00009,
44907 +0xC8806023, 0x60D08902, 0x2D00C97F, 0xC8016023,
44908 +0xD6358906, 0x0009460B, 0x0009A007, 0x51630601,
44909 +0x8902C808, 0x460BD631, 0x60F00009, 0x8902C810,
44910 +0x420BD22F, 0xD52F0009, 0x88026052, 0xD22E8B03,
44911 +0xA005E604, 0x88012260, 0xD22B8B02, 0x2260E601,
44912 +0x2522E200, 0xC88060E3, 0xD628892E, 0x60E36E60,
44913 +0x8902C880, 0x420BD226, 0x60E30009, 0x8902C840,
44914 +0x420BD224, 0x60E30009, 0x8902C802, 0x420BD222,
44915 +0x60E30009, 0x890EC804, 0x410BD120, 0xBF120009,
44916 +0xBF4D0009, 0xD51E0009, 0x6050D41E, 0xC908D71E,
44917 +0xBF842500, 0x60E32472, 0x8905C808, 0x7F04D21B,
44918 +0x6EF64F26, 0x6DF6422B, 0x4F267F04, 0x000B6EF6,
44919 +0x00006DF6, 0x001C581C, 0xA000A000, 0x001D0100,
44920 +0x001D4000, 0x00040021, 0x001C589C, 0x001E1021,
44921 +0x001150C4, 0x001150E6, 0x00115724, 0x001150FE,
44922 +0x0011510C, 0x00116574, 0x001E100B, 0x001E1028,
44923 +0x00115162, 0x0011516E, 0x00115114, 0x00115132,
44924 +0x001E1000, 0x0010F100, 0x12345678, 0x0011514A,
44925 +0x644CD6A7, 0x000B346C, 0xD6A62450, 0x346C644C,
44926 +0x2450000B, 0x644CD6A4, 0x000B346C, 0x625C2450,
44927 +0x4208616D, 0x42084119, 0x42006019, 0x670E614C,
44928 +0xD49E321C, 0x4200207D, 0x324CC90F, 0x2200000B,
44929 +0x4208625C, 0x42004208, 0x324C644C, 0x4200D498,
44930 +0x000B324C, 0x2FE62260, 0x614C4F12, 0x4100D493,
44931 +0x6710314C, 0xE29F666D, 0x27294619, 0x6E536269,
44932 +0x672E6573, 0x4221227D, 0x42214221, 0x7601662C,
44933 +0xE4014608, 0x34E84608, 0x644C4600, 0x071A0467,
44934 +0x2150257B, 0x000B4F16, 0x4F226EF6, 0xD2857FE8,
44935 +0x88016021, 0xD2848B7B, 0x26686621, 0xD2838B77,
44936 +0x26686621, 0xE50F8B73, 0xE401BFA2, 0xBFA4E501,
44937 +0xE586E400, 0xE400655C, 0x2F50BFA4, 0xBFA1E401,
44938 +0xE602E506, 0x60634618, 0x81F2E401, 0x6543BF9F,
44939 +0xE40185F2, 0xBFAB6543, 0x85F26603, 0x6543E401,
44940 +0x6603BFB1, 0xE40265F0, 0x6053756C, 0x80F8BF80,
44941 +0xBF82E402, 0x84F8E512, 0x7090E402, 0x6503BF82,
44942 +0x4618E602, 0x81F66063, 0xBF80E402, 0x85F6E500,
44943 +0x6603E402, 0xE500BF8C, 0xE40285F6, 0xBF926603,
44944 +0xE5FEE500, 0xE010655C, 0xBF61E403, 0xE5130F54,
44945 +0xE40EBF63, 0x05FCE010, 0xBF63E40E, 0xE5007585,
44946 +0xBF64E403, 0xE500E640, 0xBF71E403, 0xE500E640,
44947 +0xBF78E403, 0xE5FFE640, 0xE014655C, 0xBF47E404,
44948 +0xE40F0F54, 0xE504BF49, 0x05FCE014, 0xBF49E40F,
44949 +0xE5017584, 0xBF4AE640, 0xE501E404, 0xBF57E640,
44950 +0xE501E404, 0xE404E640, 0xAF5C7F18, 0x7F184F26,
44951 +0x000B4F26, 0x4F220009, 0xD2427FF0, 0x88016021,
44952 +0xD2418B71, 0x26686621, 0xD2408B6D, 0x26686621,
44953 +0xE50F8B69, 0xE401BF1C, 0xBF1EE501, 0xE586E400,
44954 +0xE400655C, 0x2F50BF1E, 0xBF1BE401, 0xE401E506,
44955 +0xBF1C6543, 0xE401E640, 0xBF296543, 0xE401E640,
44956 +0xBF306543, 0x65F0E640, 0x756CE402, 0xBEFF6053,
44957 +0xE40280F4, 0xE512BF01, 0xE40284F4, 0xBF017090,
44958 +0xE6406503, 0xBF02E402, 0xE640E500, 0xBF0FE402,
44959 +0xE640E500, 0xBF16E402, 0xE5FEE500, 0x6053655C,
44960 +0xBEE5E403, 0xE51380F8, 0xE40EBEE7, 0xE40E84F8,
44961 +0xBEE77085, 0xE5006503, 0xBEE8E640, 0xE500E403,
44962 +0xBEF5E640, 0xE500E403, 0xBEFCE640, 0xE5FFE403,
44963 +0x6053655C, 0xBECBE404, 0xE40F80FC, 0xE504BECD,
44964 +0xE40F84FC, 0xBECD7083, 0xE5016503, 0xBECEE640,
44965 +0xE501E404, 0xBEDBE640, 0xE501E404, 0xE404E640,
44966 +0xAEE07F10, 0x7F104F26, 0x000B4F26, 0x00000009,
44967 +0x001E102F, 0x001E1080, 0x001E1090, 0x001E103F,
44968 +0x001E103E, 0x0011656E, 0x00116570, 0x00116572,
44969 +0xD21DD11C, 0x66206010, 0x676C7001, 0x3700C90F,
44970 +0xE5008D13, 0x67106210, 0x7701622C, 0x64232170,
44971 +0xD6166010, 0x44084408, 0x3428C90F, 0x62602100,
44972 +0x7201D513, 0x44082620, 0x000B354C, 0xD10F6053,
44973 +0x25586510, 0xE6008D13, 0xD60DD40B, 0x655C6540,
44974 +0x47086753, 0x37584708, 0x47086540, 0x24507501,
44975 +0x367C6040, 0x2400C90F, 0x72FF6210, 0x000B2120,
44976 +0x00006063, 0x001164F5, 0x001164F4, 0x001164F6,
44977 +0x0011611C, 0x00000000, 0x00000000, 0x00000000,
44978 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44979 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44980 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44981 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44982 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44983 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44984 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44985 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44986 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44987 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44988 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44989 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44990 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44991 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44992 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44993 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44994 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44995 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44996 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44997 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44998 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
44999 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45000 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45001 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45002 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45003 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45004 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45005 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45006 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45007 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45008 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45009 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45010 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45011 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45012 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45013 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45014 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45015 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45016 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45017 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45018 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45019 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45020 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45021 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45022 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45023 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45024 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45025 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45026 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45027 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45028 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45029 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45030 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45031 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45032 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45033 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45034 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45035 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45036 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45037 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45038 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45039 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45040 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45041 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45042 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45043 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45044 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45045 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45046 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45047 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45048 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45049 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45050 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45051 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45052 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45053 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45054 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45055 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45056 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45057 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45058 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45059 +0x00000000, 0x544F0D0A, 0x53205355, 0x46204950,
45060 +0x00003A57, 0x2074634F, 0x32203220, 0x20373030,
45061 +0x333A3831, 0x36343A32, 0x00000000, 0x00000D0A,
45062 +0x42707372, 0x3D206675, 0x554E203D, 0x202C4C4C,
45063 +0x6E49677A, 0x4E497274, 0x6D754E51, 0x0000003D,
45064 +0x52504545, 0x57204D4F, 0x65746972, 0x6461202C,
45065 +0x003D7264, 0x6C617620, 0x0000003D, 0x00000A0D,
45066 +0x5A205746, 0x4D435F4D, 0x4C465F44, 0x5F485341,
45067 +0x53415245, 0x000A0D45, 0x5A205746, 0x4D435F4D,
45068 +0x4C465F44, 0x5F485341, 0x534B4843, 0x0A0D4D55,
45069 +0x00000000, 0x2D495053, 0x72646461, 0x0000003D,
45070 +0x2D495053, 0x676E656C, 0x003D6874, 0x2D495053,
45071 +0x736B6863, 0x003D6D75, 0x5A205746, 0x4D435F4D,
45072 +0x4C465F44, 0x5F485341, 0x44414552, 0x00000A0D,
45073 +0x61202072, 0x3D726464, 0x00000000, 0x72202020,
45074 +0x75427073, 0x00003D66, 0x6E6B6E55, 0x206E776F,
45075 +0x6D6D6F63, 0x3D646E61, 0x00000000, 0x00000072,
45076 +0x00205220, 0x00000D0A, 0x62735576, 0x7473725F,
45077 +0x00000A0D, 0x62735576, 0x7375735F, 0x646E6570,
45078 +0x00000A0D, 0x62735576, 0x7365725F, 0x000A0D6D,
45079 +0x72746E49, 0x6D652051, 0x2C797470, 0x49677A20,
45080 +0x4972746E, 0x754E514E, 0x00003D6D, 0x654C7245,
45081 +0x0000006E, 0x20746F4E, 0x756F6E65, 0x49206867,
45082 +0x4220514E, 0x0A0D6675, 0x00000000, 0x00000000,
45083 +0x00000000, 0x00000000, 0x002E0209, 0x80000101,
45084 +0x000409FA, 0x00FF0400, 0x05070000, 0x02000201,
45085 +0x82050700, 0x00020002, 0x03830507, 0x07010040,
45086 +0x40020405, 0x02090000, 0x0101002E, 0x09FA8000,
45087 +0x04000004, 0x000000FF, 0x02010507, 0x07000040,
45088 +0x40028205, 0x05070000, 0x00400383, 0x04050701,
45089 +0x00004002, 0x00000000, 0x00000000, 0x07090000,
45090 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45091 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45092 +0x00000000, 0x00000000, 0x00000000, };
45093 +
45094 +const u32_t zcFwImageSPISize=10156;
45095 --- /dev/null
45096 +++ b/drivers/staging/otus/hal/hpfwu_2k.c
45097 @@ -0,0 +1,1016 @@
45098 +/*
45099 + * Copyright (c) 2007-2008 Atheros Communications Inc.
45100 + *
45101 + * Permission to use, copy, modify, and/or distribute this software for any
45102 + * purpose with or without fee is hereby granted, provided that the above
45103 + * copyright notice and this permission notice appear in all copies.
45104 + *
45105 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
45106 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
45107 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
45108 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
45109 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
45110 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
45111 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
45112 + */
45113 +#include "cprecomp.h"
45114 +
45115 +const u32_t zcFwImage[] = {
45116 +0x0009000B, 0x4F222FE6, 0xDE947FFC, 0xE114D594,
45117 +0x1E13D494, 0x67521E4C, 0xD494D693, 0x37402769,
45118 +0x62528F06, 0x7201D692, 0x60602522, 0x2600C93F,
45119 +0xD7906152, 0x2512611D, 0x264B6652, 0x2562470B,
45120 +0x0009B017, 0xE60095AC, 0xC84060E2, 0x2F028F03,
45121 +0x8FF93652, 0xD4887601, 0x4E0BDE88, 0xD4880009,
45122 +0x00094E0B, 0x4E0BD487, 0x7F040009, 0xA0524F26,
45123 +0x4F226EF6, 0x410BD184, 0xD4840009, 0x0009440B,
45124 +0x450BD583, 0xD7830009, 0xD283E1FF, 0x2712611D,
45125 +0xD4825029, 0xE1FFCB01, 0x1209E501, 0x12112212,
45126 +0xE7202452, 0x4718D57E, 0x2572D27E, 0xD17EE700,
45127 +0xD67FD47E, 0xE2012270, 0x24702172, 0xD67D2620,
45128 +0x2641E4FF, 0xD57CE600, 0x666DE104, 0x76016063,
45129 +0x4000626D, 0x8FF83212, 0xD5780545, 0x2520E201,
45130 +0xD278D777, 0xE480E100, 0x22122710, 0x6613D576,
45131 +0x666D644C, 0x76046763, 0x375C626D, 0x8FF83243,
45132 +0xD5722712, 0xD273D772, 0xE400E101, 0x27102511,
45133 +0x000B4F26, 0x7FCC2242, 0xD170D56F, 0xD271DB70,
45134 +0x1F51D471, 0xD6717508, 0x1F12D771, 0x1F55710C,
45135 +0x1FB975FC, 0x72041F2A, 0x1F13EB10, 0x1F561F44,
45136 +0x1F781F67, 0xD86B1F2B, 0xDD6CD96B, 0xDC6CEA00,
45137 +0xD26DDE6C, 0x89003A22, 0xD15D7A01, 0x88016010,
45138 +0x56F88B03, 0x4218E201, 0xD1682622, 0x0009410B,
45139 +0x440BD467, 0xD5670009, 0x0009450B, 0x6010D150,
45140 +0x8B108801, 0xE650D14F, 0x46186212, 0x8B083266,
45141 +0x56F9D14B, 0x2120E200, 0xCB016062, 0x2602A003,
45142 +0x72012710, 0x60822122, 0x89098801, 0xE2C8D15A,
45143 +0x622C6612, 0x89033626, 0x6010D158, 0x8BC88801,
45144 +0x51F66792, 0x217252F5, 0xD6555191, 0x55FA2212,
45145 +0x52FB6462, 0x55612542, 0x2252E400, 0x61436643,
45146 +0x05DE6013, 0x36CC4608, 0x07DE2652, 0xC9036071,
45147 +0x8B028801, 0x720162E2, 0x74012E22, 0x36B3664C,
45148 +0x71048FEE, 0x66C2D147, 0x45286512, 0x265B4518,
45149 +0x60822C62, 0x89018801, 0x0009A168, 0x6272D742,
45150 +0x8B132228, 0xD42BD741, 0x6772D541, 0x51536242,
45151 +0x312C327C, 0x24222228, 0x15138D05, 0x6262D63D,
45152 +0xB1627201, 0xD6232622, 0x2622E200, 0x52916692,
45153 +0x8B013620, 0x0009A144, 0x6061A06E, 0x001C001C,
45154 +0x001D4020, 0x0000B38E, 0xFFFF0000, 0x12340000,
45155 +0x001E1015, 0x00201274, 0x002039EC, 0x002018A2,
45156 +0x002039F8, 0x00203A10, 0x00201860, 0x00201964,
45157 +0x00201288, 0x001C3510, 0x001C3624, 0x001E212C,
45158 +0x002038EC, 0x00203484, 0x002038F4, 0x00203900,
45159 +0x0020390C, 0x00203968, 0x0020396C, 0x00203914,
45160 +0x00203915, 0x00203918, 0x00117700, 0x00203984,
45161 +0x00203982, 0x002034E8, 0x00117710, 0x001C3D30,
45162 +0x001C36F8, 0x00117734, 0x001C3684, 0x001C3D00,
45163 +0x001C1000, 0x001C1028, 0x002034FC, 0x0020391C,
45164 +0x00117600, 0x00117740, 0x7FFFFFFF, 0x00201730,
45165 +0x00203322, 0x0020232C, 0x00203D9C, 0x0020396A,
45166 +0x002034F4, 0x0020395C, 0x001C3D2C, 0x001C36B0,
45167 +0x0020348C, 0x0011775C, 0x8801C90F, 0xA0CF8901,
45168 +0xD1960009, 0x36206212, 0xD4958904, 0x2421E200,
45169 +0x2162A0CC, 0x6211D193, 0x89012228, 0x0009A0C3,
45170 +0xE202D78F, 0x75016571, 0x3123615D, 0x27518D02,
45171 +0x0009A0BC, 0xD28C57F2, 0x62226072, 0x40094019,
45172 +0xC90F4009, 0x8F19880A, 0x52F31F2C, 0x40196022,
45173 +0x40094009, 0x8808C90F, 0xA0A78901, 0x60630009,
45174 +0xCB0154F7, 0xD27E55F2, 0xE7012402, 0xD47FE100,
45175 +0x22112572, 0x72016242, 0x2422A098, 0x8B3F8805,
45176 +0x602252F3, 0x40094019, 0xC90F4009, 0x8B168802,
45177 +0xE4FFD577, 0x644D6752, 0x8B102748, 0x6272D775,
45178 +0x8B0C3260, 0x51F255F7, 0xD26DE701, 0x21722562,
45179 +0xD571E100, 0x64522211, 0xA0777401, 0x52F32542,
45180 +0x40196022, 0x40094009, 0x8805C90F, 0x31B38B6E,
45181 +0xD26A8B6C, 0x672254F4, 0x7701D569, 0x61422272,
45182 +0x1F1CE640, 0x46182159, 0x8B033160, 0x6262D665,
45183 +0x26227201, 0xE200D65A, 0x2621B067, 0x0009A056,
45184 +0x3123E220, 0x88038B52, 0x52F38B1E, 0x40196022,
45185 +0x40094009, 0x8803C90F, 0xD25B8B16, 0x672254F4,
45186 +0x7701D557, 0x61422272, 0x1F1CE640, 0x46182159,
45187 +0x8B033160, 0x6262D655, 0x26227201, 0xE200D648,
45188 +0x2621B043, 0x0009A010, 0xD452D551, 0xD2446752,
45189 +0xE1007701, 0x25723A46, 0x22118F06, 0xEA00D64E,
45190 +0x72016262, 0x2622B031, 0x2FB2D54C, 0x95736652,
45191 +0xD44A5BF1, 0x36205241, 0x60618910, 0x8B01C803,
45192 +0x2B22E201, 0x8FF54510, 0x57F15664, 0x6272E1F0,
45193 +0x41284118, 0x2722221B, 0x6BF2A008, 0x6BF2A006,
45194 +0xE200D62F, 0xD12F2621, 0x2121E200, 0xD13CE201,
45195 +0x66122822, 0x8B012668, 0x0009AE2B, 0x450BD539,
45196 +0xD1390009, 0xAE24E600, 0x2F862160, 0x2FA62F96,
45197 +0x2FC62FB6, 0x2FE62FD6, 0x7FF44F22, 0xDE34D133,
45198 +0x54116212, 0x1F4167E2, 0x2F22D432, 0xD5321F72,
45199 +0xD2326743, 0x58417794, 0x69425A42, 0x5B166C72,
45200 +0x60526D22, 0xCB20E600, 0xE5402502, 0x626D7601,
45201 +0x8BFB3253, 0x55F162F2, 0x11512122, 0xD62855F2,
45202 +0x14812E52, 0x249214A2, 0x27C2D426, 0x26D211B6,
45203 +0xDA256742, 0xE801D925, 0x490B2A72, 0xE2011A8C,
45204 +0x1A2C4218, 0x4F267F0C, 0x6DF66EF6, 0x6BF66CF6,
45205 +0x69F66AF6, 0x68F6000B, 0x000007D1, 0x0020397C,
45206 +0x00203980, 0x00203986, 0x001C3DC0, 0x0011772C,
45207 +0x001C3B88, 0x00203964, 0x0011773C, 0x00117744,
45208 +0x0000F000, 0x00117764, 0x00117748, 0x00117768,
45209 +0x0011776C, 0x01FFFFFF, 0x0011774C, 0x002034F4,
45210 +0x00203D9C, 0x002024F0, 0x0020396A, 0x001C3B9C,
45211 +0x001C3D98, 0x001C3700, 0x001C3500, 0x001C5960,
45212 +0x001C8960, 0x002034FC, 0x001C3D00, 0x0020160C,
45213 +0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6,
45214 +0xDE957FAC, 0x61E0E014, 0x0F14D494, 0x710161E3,
45215 +0xE0186210, 0xD2920F24, 0x0009420B, 0x450BD591,
45216 +0x20080009, 0x8F126D03, 0xD28F1F07, 0x6720D48F,
45217 +0x657CDD8F, 0x470BD78F, 0xD18F0009, 0x619C6910,
45218 +0x46086613, 0x36184608, 0x3D6C4608, 0xE0181FD7,
45219 +0xE58004FC, 0x604C66E2, 0x3050655C, 0x2D628F15,
45220 +0x01FCE014, 0xDE85E500, 0x641CA008, 0x6753655D,
45221 +0x607037EC, 0x39DC6953, 0x80947501, 0x3243625D,
45222 +0xD67F8BF4, 0xA34EE200, 0x20082621, 0xE0148B13,
45223 +0xE40001FC, 0xA009DE79, 0x644D671C, 0x35EC6543,
45224 +0x69436652, 0x39DC6262, 0x74041921, 0x3273624D,
45225 +0xA3388BF3, 0x88012D10, 0xE0148B17, 0xE70001FC,
45226 +0x6D1C2D70, 0xDE6D1FD4, 0x32D3627D, 0xA32A8B01,
45227 +0x677D0009, 0x667365E3, 0x61737504, 0x315C36EC,
45228 +0x69126462, 0xAFEF7708, 0x88042492, 0xE0148B18,
45229 +0xE40001FC, 0x671C2D40, 0x624DDE60, 0x8B013273,
45230 +0x0009A311, 0x6943644D, 0x39EC62E3, 0x72046592,
45231 +0x3D2C6D43, 0x615266D2, 0x21697408, 0x2512AFED,
45232 +0x8B188805, 0x01FCE014, 0x2D40E400, 0xDE53671C,
45233 +0x3273624D, 0xA2F68B01, 0x644D0009, 0x62E36943,
45234 +0x659239EC, 0x6D437204, 0x66D23D2C, 0x74086152,
45235 +0xAFED216B, 0x88312512, 0xD44A8B3A, 0x6146D94A,
45236 +0x75046543, 0x67566442, 0x6E531F48, 0x65527E04,
45237 +0x7EE462E2, 0x7E0464E2, 0x6EE21FE9, 0x5EF929E0,
45238 +0x7E04D942, 0x1FEA60E2, 0x2900C901, 0xD9406EE2,
45239 +0x29E04E09, 0x2F562F26, 0x56FAD93E, 0x6513490B,
45240 +0xD13D7F08, 0xE71C6E0D, 0x1DE12D70, 0xDE3B6912,
45241 +0x64E21D92, 0x1D43D13A, 0xD23A6512, 0x67221D54,
45242 +0x1D75D239, 0x1D666622, 0x6262D638, 0x1D27A2AB,
45243 +0x8B398830, 0x6596D92B, 0x67926696, 0x61967904,
45244 +0x74E46493, 0x6E436992, 0x1F9B7E04, 0x1FEC6442,
45245 +0xD9256EE2, 0x5EFC29E0, 0x7E04D924, 0x1FED60E2,
45246 +0x2900C901, 0xD9226EE2, 0x29E04E09, 0x59FC7FFC,
45247 +0xDE272F92, 0x2F164E0B, 0xD41F7F08, 0xE21C610D,
45248 +0x1D112D20, 0xD2206442, 0xD41C1D42, 0x1D536542,
45249 +0x6752D51B, 0xD71B1D74, 0x1D156172, 0x1D666622,
45250 +0x6262D61A, 0x1D27A26F, 0x8B358833, 0x490BD919,
45251 +0xA268EE00, 0x00002DE0, 0x00117800, 0x00203A14,
45252 +0x002018A2, 0x00202AA4, 0x00203906, 0x00203A18,
45253 +0x0020352C, 0x002018EE, 0x00203905, 0x00117804,
45254 +0x00203984, 0x00117810, 0x00203901, 0x00203902,
45255 +0x00203903, 0x00200F64, 0x001C5864, 0x001C6864,
45256 +0x001C7864, 0x001C59BC, 0x001C69BC, 0x001C79BC,
45257 +0x00200FBC, 0x00200FB8, 0x89018828, 0x0009A0C0,
45258 +0xE643DEB5, 0x326662E1, 0x1FEE8F02, 0x2E21E240,
45259 +0x622D62E1, 0x8B013267, 0x0009A0AA, 0xE50185E1,
45260 +0x8B013056, 0x0009A0A4, 0x2D10E101, 0x64E1B225,
45261 +0xE64357FE, 0x652D6271, 0x89443567, 0x3563E640,
45262 +0xE6008B05, 0x0F65E040, 0xA00FE11A, 0x615372C0,
45263 +0x41214121, 0x41214121, 0x45214121, 0x45214521,
45264 +0xC9036053, 0xE0406603, 0x71180F65, 0x2209E007,
45265 +0x0F25E03C, 0xE044641D, 0xB2A365F3, 0xE33C0F46,
45266 +0x853233FC, 0x620DDE95, 0x42086031, 0x6023610D,
45267 +0x1323E944, 0x06FE4108, 0xE00F39FC, 0x13144E0B,
45268 +0x67075D91, 0x60D32679, 0x0F6654FE, 0x51928542,
45269 +0x600D4E0B, 0x60D3260B, 0x0F666492, 0x65F3B237,
45270 +0x696156FE, 0xE640659D, 0x89383563, 0xD78359FE,
45271 +0x79066591, 0xC9036053, 0x40004008, 0x61036203,
45272 +0x0F26E050, 0x470BE0FF, 0x6C07600C, 0x6603605D,
45273 +0x46214621, 0x46214621, 0x42006263, 0x4200326C,
45274 +0x40214021, 0x4008C903, 0x6D2D30FC, 0xE8006A03,
45275 +0xB25765F3, 0x6EA264D3, 0x2EC9E050, 0x66942AE2,
45276 +0xD76E01FE, 0x606C470B, 0x2AE22E0B, 0x64D365F3,
45277 +0x7801B1FD, 0xEE06628D, 0x8FE932E3, 0x5EFE7D01,
45278 +0x61E1E400, 0x410085E1, 0x66E3310C, 0x760C711B,
45279 +0xE70465F3, 0x68667401, 0x3A736A4D, 0x8FF92582,
45280 +0x65F37504, 0x641DB1E3, 0x64E1B1A4, 0x0009A17B,
45281 +0xD45B56F7, 0xEC01D25B, 0x26C0420B, 0x0009A173,
45282 +0x06FCE018, 0x8829606C, 0x58F78B08, 0xE400D252,
45283 +0x66222840, 0x646DB171, 0x0009A165, 0x666CE681,
45284 +0x89013060, 0x0009A0AC, 0xD550D14F, 0x62126A56,
45285 +0x212232AC, 0x54116C56, 0x34CC6253, 0x64521141,
45286 +0x72085812, 0xD44A384C, 0x68221182, 0x5A136C42,
45287 +0x3ACC3C8C, 0x11A324C2, 0x6C2272EC, 0x72105814,
45288 +0x118438CC, 0x5A156822, 0x11A53A8C, 0x6A227210,
45289 +0xD6405816, 0x118638AC, 0x52176C62, 0x112732CC,
45290 +0x5A185861, 0x11A83A8C, 0x5C195A62, 0x11C93CAC,
45291 +0x521A5C63, 0x112A32CC, 0x5A1B5864, 0x11AB3A8C,
45292 +0x5C1C5A65, 0x11CC3CAC, 0x521D5C66, 0x112D32CC,
45293 +0x5A1E5867, 0x11AE3A8C, 0x561F5A68, 0x36ACE840,
45294 +0x116FDA2D, 0x6CA2381C, 0x7A946682, 0x286236CC,
45295 +0x5C8162A2, 0x18C13C2C, 0x62A27A44, 0x362C5682,
45296 +0xD6261862, 0x5A856262, 0x3A2C4229, 0x760418A5,
45297 +0x56866262, 0x362C4229, 0x56F71866, 0x2620E238,
45298 +0x16C15C81, 0x16226212, 0xE2005C11, 0x551216C3,
45299 +0x55151654, 0x55131655, 0x55161656, 0x55821657,
45300 +0x65821658, 0x55141659, 0x5584165A, 0x5583165B,
45301 +0x5585165C, 0x5586165D, 0x1821165E, 0x11212122,
45302 +0x11251122, 0x11261123, 0x28221822, 0x18241124,
45303 +0x18251823, 0x1826A0C7, 0x00117804, 0x002033E0,
45304 +0x00203A38, 0x002018A2, 0x0020348C, 0x001C36A0,
45305 +0x002034E8, 0x001C3CA0, 0x001C36F4, 0x001C3B88,
45306 +0x666CE682, 0x8B203060, 0xEA2456F7, 0x26A0D194,
45307 +0x16C15C17, 0x16225218, 0x16835819, 0x16A45A1A,
45308 +0x16C55C1B, 0x1626521C, 0xE200581D, 0x551E1687,
45309 +0x551F1658, 0x11271659, 0x11291128, 0x112B112A,
45310 +0x112D112C, 0xA08E112E, 0xE683112F, 0x3060666C,
45311 +0x52F78B0B, 0xEA00D883, 0x658222A0, 0x7804DC82,
45312 +0x62822C52, 0xA07ED681, 0xE6902620, 0x3060666C,
45313 +0xDA7F8B06, 0x00094A0B, 0xE20056F7, 0x2620A073,
45314 +0x666CE691, 0x8B103060, 0x6222D276, 0x2228622C,
45315 +0xD2788904, 0x0009420B, 0x0009A003, 0x420BD276,
45316 +0x56F70009, 0xA05EE200, 0xE6922620, 0x3060666C,
45317 +0xE0188951, 0xE6B00BFC, 0x666C62BC, 0x8B2A3260,
45318 +0x02FCE014, 0x682CEA00, 0x62ADE904, 0x894A3283,
45319 +0x6AADDD64, 0x3CDC6CA3, 0x7D046EC2, 0xDB68D467,
45320 +0x32DC62A3, 0x4B0BDC67, 0x4C0B6D22, 0xD46664E3,
45321 +0x00094B0B, 0x64D34C0B, 0x4B0BD464, 0xE6000009,
45322 +0x666D6BE3, 0x76013B6C, 0x3293626D, 0x8FF72BD0,
45323 +0xAFDA4D19, 0xE6B57A08, 0x3260666C, 0xD45C8B13,
45324 +0x4B0BDB57, 0xD25B0009, 0x6022DB5B, 0xCB20E6FF,
45325 +0x2202666D, 0xDB592B62, 0xE014E200, 0x56F72B20,
45326 +0xA01002FC, 0xD4562620, 0x6542D256, 0x420BD456,
45327 +0xA0080009, 0xDB520009, 0x52B1E600, 0x622CDB53,
45328 +0x52F72B21, 0x7F542260, 0x6EF64F26, 0x6CF66DF6,
45329 +0x6AF66BF6, 0x000B69F6, 0x4F2268F6, 0xE240614D,
45330 +0x89143123, 0x3127E21F, 0x8B09D749, 0xD449614D,
45331 +0xE00171E0, 0x5671440B, 0x26596507, 0x1761A007,
45332 +0xE001D444, 0x6672440B, 0x26596507, 0x4F262762,
45333 +0x0009000B, 0x614D4F22, 0x3123E240, 0xE21F8912,
45334 +0xD73B3127, 0x614D8B08, 0x5671D23A, 0x420B71E0,
45335 +0x260BE001, 0x1761A006, 0x6672D236, 0xE001420B,
45336 +0x2762260B, 0x000B4F26, 0xE6400009, 0x46284618,
45337 +0x6252D531, 0x89FC2268, 0x0009000B, 0x4618E680,
45338 +0xD52D4628, 0x22686252, 0x000B89FC, 0xA0010009,
45339 +0x7201E200, 0x8BFC3242, 0x0009000B, 0x4618E680,
45340 +0xD5264628, 0x22686252, 0x000B8BFC, 0x2FE60009,
45341 +0x7FFC4F22, 0xBFF16E53, 0x61E22F42, 0xE280D620,
45342 +0x54E11615, 0x16464218, 0x422855E2, 0x57E31657,
45343 +0x16786EF2, 0x26E22E2B, 0x4F267F04, 0x6EF6AFCE,
45344 +0x0020348C, 0x00117804, 0x002038EC, 0x00203900,
45345 +0x0020050A, 0x00201008, 0x0020102E, 0x00203A50,
45346 +0x002018A2, 0x002018E6, 0x00203A64, 0x00203A6C,
45347 +0x00203A70, 0x001C3500, 0x001C1000, 0x00203982,
45348 +0x00117800, 0x002018EE, 0x00203A84, 0x00203988,
45349 +0x001C3704, 0x002033E0, 0x001C373C, 0x001C3700,
45350 +0x001C370C, 0x2FD62FC6, 0x4F222FE6, 0x6C53DD10,
45351 +0x6E43BFA4, 0x2DE2BF89, 0x0009BFA0, 0x2C1251D5,
45352 +0x1C4154D6, 0x1C5255D7, 0x1C6356D8, 0x6EF64F26,
45353 +0x000B6DF6, 0x61636CF6, 0xA004E600, 0x62564109,
45354 +0x24227601, 0x36127404, 0x000B8BF9, 0x00000009,
45355 +0x001C370C, 0x0009A16E, 0x2FE62FD6, 0xDD944F22,
45356 +0xA0049EB2, 0xD4930009, 0x420BD293, 0x62D265D2,
45357 +0x8BF822E8, 0x0009A004, 0xD28FD490, 0x55D1420B,
45358 +0x22E852D1, 0xA0048BF8, 0xD48D0009, 0x420BD28A,
45359 +0x52D255D2, 0x8BF822E8, 0x0009A004, 0xD286D489,
45360 +0x55D3420B, 0x22E852D3, 0xA0048BF8, 0xD4860009,
45361 +0x420BD281, 0x52D455D4, 0x8BF822E8, 0x6EF64F26,
45362 +0x6DF6000B, 0x2FD62FC6, 0x4F222FE6, 0x6E636C73,
45363 +0x6D53B01A, 0x64D357F4, 0xB05F65E3, 0xB07566C3,
45364 +0xB0A40009, 0xB0A80009, 0xB0AC0009, 0xB0AC0009,
45365 +0xB0AF0009, 0xB03154F5, 0x6CCD6C03, 0x4F2660C3,
45366 +0x6DF66EF6, 0x6CF6000B, 0x3412D170, 0xD6700529,
45367 +0x2650D770, 0x2742000B, 0x0009A018, 0x2FD62FC6,
45368 +0x4F222FE6, 0x6E636C73, 0x6D53BFEE, 0x64D357F4,
45369 +0xB03365E3, 0xB08D66C3, 0xB00F54F5, 0x6CCD6C03,
45370 +0x4F2660C3, 0x6DF66EF6, 0x6CF6000B, 0xE503D162,
45371 +0xD763D462, 0x21524518, 0x2472000B, 0xD45FD15E,
45372 +0x2162E600, 0x2462000B, 0xBF734F22, 0xBF73E40A,
45373 +0xD25C0009, 0x4118E104, 0xE40AE500, 0xBF692212,
45374 +0xD7592252, 0xCB206072, 0x000B4F26, 0x4F222702,
45375 +0x410BD156, 0xD556E400, 0x4F26452B, 0xD1552FE6,
45376 +0x66126E63, 0x92104418, 0x44084528, 0x45002629,
45377 +0x265B4408, 0x264B4400, 0x21624708, 0xD14E4708,
45378 +0x217227EB, 0x6EF6000B, 0x1FFF03F0, 0x4F222FE6,
45379 +0xE101DE4A, 0xBF3DE40A, 0x67E32E12, 0xE500776C,
45380 +0xE204E130, 0x2752E40A, 0x27522752, 0x27522752,
45381 +0x27522752, 0x27522752, 0x27522752, 0x27522752,
45382 +0x27522752, 0x27522752, 0x27522752, 0x27222712,
45383 +0x27522752, 0x27522752, 0x27522752, 0x27522752,
45384 +0x175ABF18, 0x2E62E600, 0x000B4F26, 0xD2346EF6,
45385 +0xE441E101, 0x000B2212, 0xD1322242, 0xE605D432,
45386 +0x000B2162, 0x000B2462, 0xD2300009, 0xE40AE601,
45387 +0x2262AF00, 0x2FC62FB6, 0x2FE62FD6, 0x7FFC4F22,
45388 +0x6C43DB2B, 0xED0060B2, 0x2B02CB03, 0xC90360B2,
45389 +0x6E03A008, 0x89073DC2, 0xE46460B2, 0xB07CC903,
45390 +0x7D016E03, 0x8BF52EE8, 0x8F043DC2, 0xD4212FE1,
45391 +0x460BD621, 0x62F10009, 0x6023622D, 0x89FFC801,
45392 +0x7F046023, 0x6EF64F26, 0x6CF66DF6, 0x6BF6000B,
45393 +0x001C3B88, 0x00203A98, 0x002018EE, 0x00203AA0,
45394 +0x00203AA8, 0x00203AB0, 0x00203AB8, 0x0025E720,
45395 +0x00203D98, 0x002038F0, 0x001C5968, 0x001C3B40,
45396 +0x000F8000, 0x001D4004, 0x001C3500, 0x002015E0,
45397 +0x0020160C, 0x001C5814, 0x001C59D0, 0x001C5830,
45398 +0x001C6268, 0x001C59A4, 0x001C639C, 0x001C581C,
45399 +0x001C5860, 0x00203AC0, 0x002018A2, 0x8F014411,
45400 +0x6043604B, 0x0009000B, 0x5651D52B, 0x46286052,
45401 +0x306C000B, 0x2FC62FB6, 0x2FE62FD6, 0x4F124F22,
45402 +0xBFF14F02, 0x6B036E43, 0xDD25DC24, 0x0009BFEC,
45403 +0x3C0530B8, 0x4609060A, 0x46014609, 0x020A3D65,
45404 +0x42094209, 0x32E24209, 0x4F068BF0, 0x4F264F16,
45405 +0x6DF66EF6, 0x000B6CF6, 0x2FC66BF6, 0x2FE62FD6,
45406 +0x4F124F22, 0xBFCF4F02, 0x6C036E43, 0xBFCBDD13,
45407 +0x30C80009, 0x060A3D05, 0x46094609, 0x36E24601,
45408 +0x4F068BF5, 0x4F264F16, 0x6DF66EF6, 0x6CF6000B,
45409 +0x4F222FE6, 0xE102DE0B, 0xE403E500, 0xBFB92E12,
45410 +0xE6062E52, 0xE7004618, 0x2E62E403, 0x4F262E72,
45411 +0x6EF6AFB0, 0x0009000B, 0x001C1040, 0xCCCCCCCD,
45412 +0x10624DD3, 0x001D4004, 0x2F962F86, 0x2FB62FA6,
45413 +0x2FD62FC6, 0x4F222FE6, 0xE5007F98, 0x6453E710,
45414 +0x6B534728, 0xEE1ADCBC, 0x6153655D, 0x315C4108,
45415 +0x75014108, 0x6043317C, 0x0F16665D, 0xED0060B3,
45416 +0x21B136E3, 0x81128111, 0x11D28113, 0x11D411D3,
45417 +0x74048FEA, 0xD8B167F2, 0x1871D9B1, 0x58F12872,
45418 +0x1981D1B0, 0x59F22982, 0x5DF45AF3, 0x54F65EF5,
45419 +0x21921191, 0x11A211A3, 0x11D411D5, 0x11E611E7,
45420 +0x11481149, 0xDAA855F7, 0x57F8EE00, 0x52F9DDA7,
45421 +0x64E3D6A7, 0x2A521A51, 0xD8A7D9A6, 0x2D729AD5,
45422 +0x6EED2622, 0x4D086DE3, 0x3DEC61E3, 0x4D084108,
45423 +0x3D9C31EC, 0x410860B3, 0x81D12DB1, 0x4108E050,
45424 +0x4008E7B7, 0x677C4108, 0x60B381D2, 0xE200318C,
45425 +0x81D33472, 0x1D131DD2, 0x8D01D493, 0xD4901D24,
45426 +0xB0B365D3, 0x64ED7E01, 0x8BDA34A2, 0x2FD2DA8C,
45427 +0xDD9268A2, 0x2D824829, 0x7DFC64A2, 0xD287694D,
45428 +0x6E222D92, 0x7D0C4E29, 0x68222DE2, 0x618D6AD3,
45429 +0x2A16D784, 0xD48A6D72, 0x24D2D583, 0xD6895E72,
45430 +0x517414E2, 0x1414EE00, 0xD1875876, 0x59781486,
45431 +0x1498E710, 0x65E36252, 0x26E2142A, 0xE60064E3,
45432 +0x6843644D, 0x384C4808, 0x381C4808, 0x0C866053,
45433 +0x09CE28B1, 0x819160B3, 0x0ACE6053, 0x81A26043,
45434 +0x0DCE6053, 0x81D360B3, 0x08CE6053, 0x18827401,
45435 +0x624D09CE, 0x0ACE19E3, 0x1A643273, 0x75048FE0,
45436 +0xE003D96A, 0x40186C92, 0x6D922CB1, 0x81D1DA6F,
45437 +0x6E92E050, 0x81E24008, 0x60B36192, 0x64928113,
45438 +0x1442E600, 0xD4696792, 0x689217A3, 0x1864E1FF,
45439 +0x6563E703, 0x364C4608, 0x26127501, 0x3673665D,
45440 +0xDC5B8BF8, 0x6DC2E003, 0x2DB14018, 0xD2606EC2,
45441 +0x61C281E1, 0x1112EE00, 0xE02464C2, 0x65C21423,
45442 +0x15E4D45B, 0xE58067C2, 0x68C28172, 0x818366E3,
45443 +0x666D655C, 0x76046963, 0x394C6A6D, 0x8FF83A53,
45444 +0xDB5429E2, 0x24B2DC54, 0x24C27404, 0x4F267F68,
45445 +0x6DF66EF6, 0x6BF66CF6, 0x69F66AF6, 0x68F6000B,
45446 +0x60116142, 0x8F03C803, 0xD23DE500, 0x8B063420,
45447 +0xC9036011, 0x8B068802, 0x3420D239, 0x56128B03,
45448 +0x52646513, 0x000B2422, 0x01136053, 0x2FE62FD6,
45449 +0x7FEC4F22, 0x62536E53, 0x6D43E550, 0x4508E400,
45450 +0xE101A001, 0x60435224, 0x81212211, 0x60538123,
45451 +0x56E28122, 0x8BF53620, 0x16E4D238, 0xE61464F3,
45452 +0x65E3420B, 0xE4FC65E1, 0x2E512549, 0x65F361F1,
45453 +0x2F112149, 0xD13154D1, 0xE614410B, 0x607157D1,
45454 +0x2701CB01, 0x7F141DE1, 0x6EF64F26, 0x6DF6000B,
45455 +0x2FE62FD6, 0x7FEC4F22, 0x66536E53, 0x6D43E5FC,
45456 +0x20596061, 0x2601CB01, 0x326052E2, 0x12E48B06,
45457 +0x31E051E2, 0x52D18B04, 0x1E22A002, 0x5664AFF0,
45458 +0x64F3D21E, 0x420BE614, 0x67E165E3, 0x2719E1FC,
45459 +0x67F12E71, 0x271954D1, 0x65F3D118, 0x410BE614,
45460 +0x52D12F71, 0xCB016021, 0x1DE12201, 0x4F267F14,
45461 +0x000B6EF6, 0x00006DF6, 0x0020391C, 0x002034EC,
45462 +0x002034F4, 0x002034FC, 0x00203524, 0x00203908,
45463 +0x00203910, 0x00100208, 0x001017C0, 0x001E210C,
45464 +0x001C3D00, 0x0020395C, 0x001000C8, 0x00117880,
45465 +0x00117780, 0x00040020, 0x0026C401, 0x00200ED6,
45466 +0x4F222FE6, 0xDE42624C, 0x42004208, 0x3E2CA005,
45467 +0xD4405252, 0xBF695624, 0x65E22E62, 0x352052E1,
45468 +0xD63D8BF6, 0x4F262622, 0x6EF6000B, 0x2FC62FB6,
45469 +0x2FE62FD6, 0xDC394F22, 0x52C1DB39, 0x362066C2,
45470 +0x6061891C, 0x8801C903, 0xDE348918, 0xBF37DD35,
45471 +0x650364E3, 0x66B28503, 0x3262620D, 0xD4328907,
45472 +0x0009BF76, 0x4D0BD431, 0xAFE60009, 0xBF3D0009,
45473 +0xD42F64E3, 0x00094D0B, 0x0009AFDF, 0x2262D22D,
45474 +0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, 0x2FD62FC6,
45475 +0x4F222FE6, 0xDD29DC28, 0x6E4360C2, 0x04DE4008,
45476 +0xE614D127, 0x65E3410B, 0xD127D726, 0x55E227E2,
45477 +0x35E05254, 0x21228F04, 0x400860C2, 0x122202DE,
45478 +0x605365C2, 0x75014008, 0x0DE606DE, 0xC90F6053,
45479 +0x60632C02, 0x6EF64F26, 0x000B6DF6, 0x85436CF6,
45480 +0x650D5643, 0x622D6262, 0x35277204, 0xE1008F0C,
45481 +0x2268960C, 0xD6158B03, 0x72015261, 0xD6131621,
45482 +0x6262E101, 0x26227201, 0x6013000B, 0x000001FF,
45483 +0x002034FC, 0x002034F4, 0x001C3D00, 0x00203524,
45484 +0x002038EC, 0x002018A2, 0x002034EC, 0x00203AE8,
45485 +0x00203AEC, 0x001C3D28, 0x0020395C, 0x0020391C,
45486 +0x00200ED6, 0x00203960, 0x00203964, 0x00117754,
45487 +0x2FC62FB6, 0x2FE62FD6, 0x7FF84F22, 0x6022D237,
45488 +0x8D58C803, 0xDE362F01, 0xDB37DC36, 0x66C252C1,
45489 +0x892F3620, 0xC9036061, 0x892B8801, 0xD233DD31,
45490 +0x64D3420B, 0x1F016503, 0x880160B1, 0xD2308B04,
45491 +0x64D3420B, 0x0009AFEA, 0x85615653, 0x8904C820,
45492 +0xE050D72C, 0x7201027E, 0xD22B0726, 0x6453420B,
45493 +0x89072008, 0x55F1D126, 0x64D3410B, 0xE601D727,
45494 +0x2762AFD4, 0x55F1D226, 0x64E3420B, 0xE601D125,
45495 +0x2162AFCC, 0xDD25DE24, 0xDC26DB25, 0x66D252D1,
45496 +0x89183620, 0xC9036061, 0x89148801, 0xD117D41F,
45497 +0x0009410B, 0x36E05603, 0x65038F04, 0x2B20E201,
45498 +0x2C52AFEC, 0xD712D41C, 0x0009470B, 0xE601D115,
45499 +0xAFE34618, 0x60F12162, 0x8907C804, 0x7F08D217,
45500 +0x6EF64F26, 0x6CF66DF6, 0x6BF6422B, 0x4F267F08,
45501 +0x6DF66EF6, 0x000B6CF6, 0x00006BF6, 0x001E2100,
45502 +0x002034FC, 0x002034F4, 0x00203984, 0x002014A0,
45503 +0x002014CC, 0x0020348C, 0x002016BE, 0x001E212C,
45504 +0x00201530, 0x001C3D30, 0x00117880, 0x002034EC,
45505 +0x0020390C, 0x00203908, 0x00203524, 0x00200610,
45506 +0xE601D203, 0x1265D503, 0x000B2252, 0x00001266,
45507 +0x001C1010, 0x0000C34F, 0x0009000B, 0x2FD62FC6,
45508 +0x4F222FE6, 0x6D436C53, 0xEE00A004, 0x7E0164D4,
45509 +0x644CBFF2, 0x8BF93EC2, 0x6EF64F26, 0x000B6DF6,
45510 +0xE5006CF6, 0x6643A002, 0x76017501, 0x22286260,
45511 +0xAFE38BFA, 0x2FE60009, 0x75076253, 0xE1086753,
45512 +0x6043EE0A, 0x4409C90F, 0x650330E2, 0x8D014409,
45513 +0xE630E637, 0x4110365C, 0x8FF22760, 0xE00077FF,
45514 +0x000B8028, 0x000B6EF6, 0x000BE000, 0x2FE6E000,
45515 +0x7FEC4F22, 0x6E436253, 0xBFDC65F3, 0xBFD06423,
45516 +0xBFCE64E3, 0xD40364F3, 0x0009BFCB, 0x4F267F14,
45517 +0x6EF6000B, 0x00203AF0, 0xE4FDD29D, 0xD79D6122,
45518 +0x22122149, 0x74016022, 0x2202CB01, 0xD59A6622,
45519 +0x22622649, 0xC8406070, 0x60528902, 0x2502CB04,
45520 +0xE6016052, 0x2502CB08, 0xE4026052, 0x2502C9CF,
45521 +0x46186052, 0x2502CB10, 0xCB036052, 0x15422502,
45522 +0x1563000B, 0xD78ED58D, 0xD48FD28E, 0xE600E100,
45523 +0x27112511, 0xAFCF2210, 0x664C2461, 0x4600D28B,
45524 +0x6060362C, 0x000BCB10, 0x654C2600, 0x4500D287,
45525 +0x6650352C, 0x2619E1EF, 0x2560000B, 0xD284664C,
45526 +0x362C4600, 0xCB106060, 0x2600000B, 0xD280654C,
45527 +0x352C4500, 0xE1EF6650, 0x000B2619, 0x664C2560,
45528 +0x4600D27A, 0x6060362C, 0x000BCB08, 0x654C2600,
45529 +0x4500D276, 0x6650352C, 0x2619E1F7, 0x2560000B,
45530 +0xD273664C, 0x362C4600, 0xCB086060, 0x2600000B,
45531 +0xD26F654C, 0x352C4500, 0xE1F76650, 0x000B2619,
45532 +0x624C2560, 0x4200D669, 0x6020326C, 0x4021C908,
45533 +0x40214021, 0x600C000B, 0xD665624C, 0x326C4200,
45534 +0xC9086020, 0x40214021, 0x000B4021, 0xD161600C,
45535 +0x341C644C, 0x000B6240, 0xD15F602C, 0x341C644C,
45536 +0x000B6240, 0x2FE6602C, 0x6E434F22, 0xE60A645C,
45537 +0x89143467, 0x0009BFEB, 0x60EC640C, 0x8B028801,
45538 +0xA002E00F, 0x44092409, 0x624C4409, 0x3263E60A,
45539 +0xBFE28905, 0x620C644C, 0xC8806023, 0xE2008B00,
45540 +0x4F266023, 0x6EF6000B, 0xD64C4F22, 0x88016062,
45541 +0xB2578B03, 0xA0030009, 0xD2490009, 0x2260E640,
45542 +0xE200D648, 0x000B4F26, 0x4F222622, 0x6062D643,
45543 +0x8B018802, 0x0009B2A0, 0xE200D642, 0x000B4F26,
45544 +0xD53E2622, 0xE100D43E, 0x2512E701, 0x2470000B,
45545 +0xE604D23B, 0x2260000B, 0xD43B4F22, 0x410BD13B,
45546 +0xD53B0009, 0x6650E1FD, 0x2619D23A, 0x2560E700,
45547 +0x000B4F26, 0x4F222270, 0xD238D537, 0xD7386152,
45548 +0x2512611D, 0xE6FF6452, 0x2542242B, 0xD22FD435,
45549 +0x420B666D, 0xD52E2762, 0x6750E1FB, 0x4F262719,
45550 +0x2570000B, 0xD4304F22, 0x410BD128, 0xD5280009,
45551 +0x6650E7F7, 0x4F262679, 0x2560000B, 0x9425D524,
45552 +0x22496250, 0x2520000B, 0xE4BFD521, 0x22496250,
45553 +0x2520000B, 0xD2254F22, 0x600D8522, 0x89112008,
45554 +0x89458801, 0x89478803, 0x89498805, 0x894F8806,
45555 +0x89558808, 0x895B8809, 0x8961880A, 0x8967880B,
45556 +0x0009A06E, 0x0009B070, 0x600CA06B, 0x0000FF7F,
45557 +0x001E2148, 0x001E1000, 0x001E1108, 0x002039BC,
45558 +0x002039BE, 0x002039DD, 0x002039A0, 0x001E103F,
45559 +0x001E105F, 0x001E102F, 0x001E1090, 0x002039C4,
45560 +0x001E100B, 0x002039C0, 0x00203AF4, 0x002018A2,
45561 +0x001E1028, 0x002039DC, 0x001D4020, 0x98760000,
45562 +0x001C1000, 0x00203B00, 0x00203B10, 0x00203994,
45563 +0x0009B04C, 0x600CA035, 0x0009B055, 0x600CA031,
45564 +0x6260D684, 0x8B2B2228, 0x0009B061, 0x600CA029,
45565 +0x6260D680, 0x8B232228, 0x0009B069, 0x600CA021,
45566 +0x6260D67C, 0x8B1B2228, 0x0009B0C7, 0x600CA019,
45567 +0x6260D678, 0x8B132228, 0x0009B0CD, 0x600CA011,
45568 +0x6260D674, 0x8B0B2228, 0x0009B125, 0x600CA009,
45569 +0x6260D670, 0x8B032228, 0x0009B13D, 0x600CA001,
45570 +0x4F26E000, 0x0009000B, 0xD26CD16B, 0xD56C8412,
45571 +0x4000C90F, 0xD76B012D, 0xE403D66B, 0xE20F611C,
45572 +0x2540E001, 0x25202712, 0x2602000B, 0xE601D262,
45573 +0x30668523, 0xE0008D05, 0xD663D260, 0xE0018122,
45574 +0x000B2602, 0xD25C0009, 0x600D8523, 0x89052008,
45575 +0x8B0A8801, 0x6060D65D, 0x2600CB01, 0xD457D65A,
45576 +0xE001E101, 0x000B2612, 0x000B8142, 0xD152E000,
45577 +0x8513E501, 0x640D4518, 0x66033453, 0xE0008D05,
45578 +0xD551D253, 0x2260E001, 0x000B2502, 0x4F220009,
45579 +0x8513D149, 0x6453650D, 0x62494419, 0x227D672E,
45580 +0x8801602C, 0x88028909, 0x88038910, 0x8806891A,
45581 +0x88078935, 0xA04C893B, 0xD5460009, 0x6652D746,
45582 +0x2762D446, 0x622C6261, 0x2421A038, 0x2228625C,
45583 +0xD4438B3F, 0x6642D540, 0x2562D440, 0x24018561,
45584 +0x6203A02C, 0x2008605C, 0x88108907, 0x88208908,
45585 +0x88308909, 0xA02C890A, 0xD23A0009, 0x6222A008,
45586 +0xA005D239, 0xD2396222, 0x6222A002, 0x6262D638,
45587 +0xD432D531, 0x66212522, 0xA00F626C, 0xD6352421,
45588 +0x6261D52D, 0x622CD42D, 0xA0072562, 0xD6322421,
45589 +0x8561D529, 0x2562D429, 0x62032401, 0x662D8515,
45590 +0x3617610D, 0x65038F01, 0xB0CB2451, 0xA0010009,
45591 +0xE000E001, 0x000B4F26, 0xD6190009, 0xD427E101,
45592 +0x65412610, 0xD118D717, 0xE20F655D, 0x2752E001,
45593 +0x000B2620, 0x2FE62102, 0xD20F4F22, 0x640C8523,
45594 +0x8B082448, 0xD511D61D, 0x2621E200, 0x940F8451,
45595 +0xA0482049, 0xDE0D8051, 0xC84060E0, 0xE2018D32,
45596 +0x89443427, 0xD216D615, 0x2641420B, 0x0009A030,
45597 +0x0000FF7F, 0x002039DD, 0x00203994, 0x002039A0,
45598 +0x001E1100, 0x001E100C, 0x002039C0, 0x001E1000,
45599 +0x001E1001, 0x002039C8, 0x002039A8, 0x002039AC,
45600 +0x002039B0, 0x002039CC, 0x002039D0, 0x002039D4,
45601 +0x002039D8, 0x00203DFC, 0x00203E06, 0x002039BA,
45602 +0x0020287E, 0x89123427, 0xD294D693, 0x2641420B,
45603 +0xCB8084E1, 0x80E1B0F5, 0xD69160E0, 0x2E00CB04,
45604 +0xC93F6060, 0xD68F2600, 0xA001E001, 0xE0002602,
45605 +0x000B4F26, 0xD68C6EF6, 0xC8806060, 0xD2868919,
45606 +0x88016021, 0xD2898B15, 0x8524E501, 0x89103056,
45607 +0xE203D187, 0x2120D487, 0xE00B6541, 0x0656655D,
45608 +0xE40FD585, 0x2140E702, 0xD77E2571, 0x000BE001,
45609 +0x000B2702, 0x2FE6E000, 0xDE804F22, 0xC88084E1,
45610 +0xD57A892C, 0x20088554, 0x61038F28, 0x8553D77C,
45611 +0x64036672, 0x8566650C, 0x3520620C, 0xD6798B1E,
45612 +0x651CD774, 0x2651644C, 0x60E02741, 0x8904C840,
45613 +0x420BD275, 0xA0030009, 0xD2680009, 0x0009420B,
45614 +0x0009B09F, 0xE201D167, 0x60E02122, 0xCB04D464,
45615 +0x60402E00, 0x2400C93F, 0x6023A001, 0x4F26E000,
45616 +0x6EF6000B, 0x2FB62FA6, 0x2FD62FC6, 0xDA622FE6,
45617 +0x66A1E240, 0x3622DC5E, 0x62638900, 0x6ED36D2C,
45618 +0x4E2136D8, 0x4E212A61, 0xDB61D460, 0xE700A00F,
45619 +0x770162B2, 0x71026123, 0x66212B12, 0x71026213,
45620 +0x61212B12, 0x651D666D, 0x356C4528, 0x627C2452,
45621 +0x8BED32E3, 0xC90360D3, 0x8B108803, 0x617367B2,
45622 +0x2B127102, 0x71026E13, 0x2B126571, 0x655D6DE1,
45623 +0x422862DD, 0x325CE107, 0xA00C2C10, 0x88022422,
45624 +0xA0038B01, 0x8801E203, 0xE2018B05, 0x66B22C20,
45625 +0x655D6561, 0xE60F2452, 0x67A12C60, 0x8B052778,
45626 +0xDD38DC44, 0xEB01EA00, 0x2DB22CA2, 0x6DF66EF6,
45627 +0x6BF66CF6, 0x6AF6000B, 0x2FE62FD6, 0xE240DD36,
45628 +0x362266D1, 0x62638900, 0x3678672C, 0x7703DE38,
45629 +0x47212D61, 0x64E2D635, 0xA00E4721, 0x6562E100,
45630 +0x62537101, 0x74012450, 0x24204219, 0x45297401,
45631 +0x74012450, 0x24504519, 0x621C7401, 0x8BEE3273,
45632 +0x66E24200, 0x420061D1, 0x2118362C, 0x2E628F06,
45633 +0xDD1CD728, 0xE501E400, 0x2D522742, 0x000B6EF6,
45634 +0x2FD66DF6, 0x4F222FE6, 0xED0AEE01, 0x64E3BC85,
45635 +0xBC8A64E3, 0x62EC7E01, 0x8BF732D7, 0xBC8DEE01,
45636 +0x64E364E3, 0x7E01BC92, 0x32D762EC, 0x4F268BF7,
45637 +0x000B6EF6, 0xD1186DF6, 0xD418920D, 0x72122122,
45638 +0x2422D617, 0xD7177204, 0x72202622, 0x2722D116,
45639 +0x000B7230, 0x137A2122, 0x002039BA, 0x0020298A,
45640 +0x001E1015, 0x002039C0, 0x001E1001, 0x00203994,
45641 +0x001E1100, 0x002039BE, 0x002039AC, 0x001E1000,
45642 +0x002039B0, 0x002039BC, 0x0020287E, 0x001E100C,
45643 +0x002039A8, 0x002039C4, 0x002039C8, 0x002039CC,
45644 +0x002039D0, 0x002039D4, 0x002039D8, 0x4F222FE6,
45645 +0xD6707FFC, 0x88016060, 0xE2018951, 0x2620BFBB,
45646 +0xD56ED16D, 0xDE6E6010, 0x64E36552, 0x7402C840,
45647 +0x8D22D16C, 0xD26C7502, 0xE601D76C, 0xE7042722,
45648 +0x76016255, 0x626C2421, 0x8FF93273, 0xD4637402,
45649 +0x6242E601, 0x640D8528, 0x67494419, 0x275D657E,
45650 +0x81E4607C, 0xE417D562, 0x67557601, 0x3243626C,
45651 +0x8FF92171, 0xA0207102, 0xD25E0009, 0xE601D75B,
45652 +0xE7042722, 0x76016255, 0x626C2421, 0x8FF93273,
45653 +0xD4527402, 0x6242E601, 0x640D8528, 0x67494419,
45654 +0x275D657E, 0x81E4607C, 0xE417D553, 0x67557601,
45655 +0x3243626C, 0x8FF92171, 0x92897102, 0xD2462E21,
45656 +0x5E23D74E, 0x64F22FE2, 0x604365F2, 0x2700C980,
45657 +0xC9606043, 0x80716103, 0xC9036043, 0x80724519,
45658 +0x65F2605C, 0x817266F2, 0x46194629, 0x606C4529,
45659 +0x4018645C, 0x8173304C, 0x21185E23, 0x64F22FE2,
45660 +0x6E4C62F2, 0x602C4219, 0x66F262F2, 0x46294018,
45661 +0x461930EC, 0x42298174, 0x652C606C, 0x305C4018,
45662 +0x81758F07, 0x0009BC96, 0x2228620C, 0xA00A8908,
45663 +0x60130009, 0x8B038840, 0x0009B009, 0x0009A003,
45664 +0xE202D62F, 0x7F042622, 0x000B4F26, 0x4F226EF6,
45665 +0x8552D52A, 0x8830600D, 0x88318903, 0xA0348923,
45666 +0x85550009, 0xD428D727, 0x85532701, 0x610DD627,
45667 +0x24124118, 0x460BD426, 0xD7230009, 0xD226D425,
45668 +0x6572420B, 0xE230D120, 0x42286712, 0x2729E620,
45669 +0x37604628, 0xD6218B03, 0xA016E200, 0xD61F2622,
45670 +0xA012E202, 0xD1182622, 0x6212E530, 0xE6204528,
45671 +0x46282259, 0x89083260, 0xD41AD119, 0xE601D513,
45672 +0x2160450B, 0x472BD718, 0x4F264F26, 0x0009000B,
45673 +0x0000060A, 0x002039DC, 0x001E1000, 0x002039C8,
45674 +0x00203DFC, 0x00203E08, 0x00203DA0, 0x002039B0,
45675 +0x00203DD0, 0x00203DCE, 0x00203DA2, 0x00203994,
45676 +0x002039C0, 0x002039AC, 0x002039A8, 0x002018A2,
45677 +0x00203B1C, 0x00203B20, 0x002018EE, 0x002039C4,
45678 +0x001E100B, 0x00203B34, 0x00114004, 0x4F222FE6,
45679 +0xDE967FFC, 0x200884E9, 0x2F008D06, 0xD695D494,
45680 +0x0009460B, 0x64F0B19A, 0x6620D293, 0x89022668,
45681 +0xC9BF60E0, 0x7F042E00, 0x000B4F26, 0x000B6EF6,
45682 +0x2FE60009, 0xDE8D4F22, 0x60E0D68D, 0xCBC0D48D,
45683 +0x62602E00, 0xC803602C, 0x40218904, 0x70014021,
45684 +0x6603A002, 0x66034009, 0xD687616D, 0xE500A004,
45685 +0x75016262, 0x74042422, 0x3213625D, 0xD2838BF8,
45686 +0x0009420B, 0xC9BF84E2, 0x4F2680E2, 0x6EF6000B,
45687 +0x2FE62FD6, 0x7FFC4F22, 0x6260D67D, 0x89442228,
45688 +0xD572E100, 0x60502610, 0xCB40D47A, 0x2500440B,
45689 +0x8D052008, 0x62E06E03, 0x7104612C, 0x2F11A006,
45690 +0xD475D66D, 0xDD756760, 0x657C4D0B, 0xE23C6D1D,
45691 +0x8B033D27, 0xD267D472, 0x0009420B, 0x4D214D21,
45692 +0xA005D770, 0x66E6E400, 0x357C4508, 0x74012562,
45693 +0x35D3654D, 0xD76C8BF7, 0x6172E003, 0x81114018,
45694 +0x6E7260F1, 0x81E2700C, 0xD4686172, 0xDD688113,
45695 +0x4D0BDE68, 0xE2016572, 0xD4672E22, 0x420BD255,
45696 +0xD6560009, 0xC93F6060, 0x7F042600, 0x6EF64F26,
45697 +0x6DF6000B, 0x2FC62FB6, 0x2FE62FD6, 0xD25F4F22,
45698 +0x6B436E73, 0x420B6C53, 0x20086D63, 0x64038D1C,
45699 +0xE50ED149, 0x32526210, 0x60C38916, 0x804124B0,
45700 +0x814160D3, 0xA007E500, 0x655D61BC, 0x00EC6053,
45701 +0x364C6653, 0x80647501, 0x3213625D, 0xD63B8BF5,
45702 +0xC9BF6060, 0x2600A008, 0xD23AD44D, 0x6EF64F26,
45703 +0x6CF66DF6, 0x6BF6422B, 0x6EF64F26, 0x6CF66DF6,
45704 +0x6BF6000B, 0x7FC44F22, 0x720262F3, 0x22512F41,
45705 +0x45297202, 0x60632251, 0xE5C4E682, 0x67F38121,
45706 +0x655C666C, 0xE408BFB6, 0x4F267F3C, 0x0009000B,
45707 +0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6,
45708 +0xE1007FC4, 0x6513ECFF, 0x6B136CCD, 0xDE36D735,
45709 +0xEDFF64F3, 0xD835EA04, 0x6053655C, 0x027D4000,
45710 +0x32C0622D, 0x66038D0D, 0x09ED6063, 0x2491027D,
45711 +0x24217402, 0x698202ED, 0x3928622D, 0x74022892,
45712 +0x75017104, 0x6063625C, 0x07D532A2, 0x0EB58FE4,
45713 +0x2448641C, 0xE6808905, 0x67F3E5C5, 0xBF79666C,
45714 +0x7F3C655C, 0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6,
45715 +0x000B69F6, 0xD11E68F6, 0x6012D21E, 0xCB20E405,
45716 +0x2102E500, 0x000B2242, 0x00002252, 0x001E1017,
45717 +0x00203B38, 0x002018A2, 0x00203906, 0x001E1015,
45718 +0x001E10BF, 0x00117800, 0x001E10FC, 0x00200610,
45719 +0x0020390C, 0x00202AE2, 0x00203B3C, 0x002018EE,
45720 +0x00203B58, 0x0011788C, 0x00203908, 0x002034EC,
45721 +0x00201530, 0x001E2130, 0x00203B60, 0x00202AA4,
45722 +0x00203B64, 0x0020396C, 0x00203974, 0x00203D9C,
45723 +0x001C3500, 0x001D4004, 0xD564D163, 0xE400D764,
45724 +0x2142E20F, 0x17411154, 0xD5622722, 0x9669D762,
45725 +0x15412572, 0x96661562, 0xE6011565, 0xD55F1165,
45726 +0x666CE6F8, 0x25422542, 0x25422542, 0x25422542,
45727 +0x25622542, 0x7601E727, 0x67632572, 0x25627797,
45728 +0xE7042572, 0x2572E248, 0xE2192522, 0xE2702522,
45729 +0x25422542, 0x25422542, 0x25222542, 0x2522E20C,
45730 +0x25422542, 0x25422542, 0x25422542, 0x25422542,
45731 +0x000B154A, 0xE2081145, 0x0009422B, 0x2FE62FD6,
45732 +0x7FFC4F22, 0xC8206043, 0x6E438D02, 0x0009BE67,
45733 +0xC81060E3, 0xBE648901, 0x60E30009, 0x8901C840,
45734 +0x0009BE86, 0xC80160E3, 0xDD3D8938, 0xC80260D0,
45735 +0x2F008D03, 0x460BD63B, 0x60F00009, 0x8902C804,
45736 +0x460BD639, 0x62F00009, 0xC8806023, 0x60D08902,
45737 +0x2D00C97F, 0xC8016023, 0xD6348906, 0x0009460B,
45738 +0x0009A007, 0x51630601, 0x8902C808, 0x460BD630,
45739 +0x60F00009, 0x8902C810, 0x420BD22E, 0xD52E0009,
45740 +0x88026052, 0xD22D8B03, 0xA005E604, 0x88012260,
45741 +0xD22A8B02, 0x2260E601, 0x2522E200, 0xC88060E3,
45742 +0xD227892D, 0x60E36E20, 0x8902C880, 0x420BD225,
45743 +0x60E30009, 0x8902C840, 0x420BD223, 0x60E30009,
45744 +0x8902C802, 0x420BD221, 0x60E30009, 0x890DC804,
45745 +0xDD20D11F, 0x0009410B, 0x0009BF0D, 0x0009BF4C,
45746 +0xD51ED41D, 0x2470E708, 0x25D2BF85, 0xC80860E3,
45747 +0xD21B8905, 0x4F267F04, 0x422B6EF6, 0x7F046DF6,
45748 +0x6EF64F26, 0x6DF6000B, 0x001C581C, 0xA000A000,
45749 +0x001D0100, 0x001D4000, 0x00040021, 0x001C589C,
45750 +0x001E1021, 0x00201A88, 0x00201AAA, 0x0020210C,
45751 +0x00201AC2, 0x00201AD0, 0x002039C0, 0x001E100B,
45752 +0x001E1028, 0x00201B3C, 0x00201B48, 0x00201AD8,
45753 +0x00201AF6, 0x12345678, 0x001E1000, 0x0010F100,
45754 +0x00201B24, 0x644CD6A7, 0x000B346C, 0xD6A62450,
45755 +0x346C644C, 0x2450000B, 0x644CD6A4, 0x000B346C,
45756 +0x625C2450, 0x4208616D, 0x42084119, 0x42006019,
45757 +0x670E614C, 0xD49E321C, 0x4200207D, 0x324CC90F,
45758 +0x2200000B, 0x4208625C, 0x42004208, 0x324C644C,
45759 +0x4200D498, 0x000B324C, 0x2FE62260, 0x614C4F12,
45760 +0x4100D493, 0x6710314C, 0xE29F666D, 0x27294619,
45761 +0x6E536269, 0x672E6573, 0x4221227D, 0x42214221,
45762 +0x7601662C, 0xE4014608, 0x34E84608, 0x644C4600,
45763 +0x071A0467, 0x2150257B, 0x000B4F16, 0x4F226EF6,
45764 +0xD2857FE8, 0x88016021, 0xD2848B7B, 0x26686621,
45765 +0xD2838B77, 0x26686621, 0xE50F8B73, 0xE401BFA2,
45766 +0xBFA4E501, 0xE586E400, 0xE400655C, 0x2F50BFA4,
45767 +0xBFA1E401, 0xE602E506, 0x60634618, 0x81F2E401,
45768 +0x6543BF9F, 0xE40185F2, 0xBFAB6543, 0x85F26603,
45769 +0x6543E401, 0x6603BFB1, 0xE40265F0, 0x6053756C,
45770 +0x80F8BF80, 0xBF82E402, 0x84F8E512, 0x7090E402,
45771 +0x6503BF82, 0x4618E602, 0x81F66063, 0xBF80E402,
45772 +0x85F6E500, 0x6603E402, 0xE500BF8C, 0xE40285F6,
45773 +0xBF926603, 0xE5FEE500, 0xE010655C, 0xBF61E403,
45774 +0xE5130F54, 0xE40EBF63, 0x05FCE010, 0xBF63E40E,
45775 +0xE5007585, 0xBF64E403, 0xE500E640, 0xBF71E403,
45776 +0xE500E640, 0xBF78E403, 0xE5FFE640, 0xE014655C,
45777 +0xBF47E404, 0xE40F0F54, 0xE504BF49, 0x05FCE014,
45778 +0xBF49E40F, 0xE5017584, 0xBF4AE640, 0xE501E404,
45779 +0xBF57E640, 0xE501E404, 0xE404E640, 0xAF5C7F18,
45780 +0x7F184F26, 0x000B4F26, 0x4F220009, 0xD2427FF0,
45781 +0x88016021, 0xD2418B71, 0x26686621, 0xD2408B6D,
45782 +0x26686621, 0xE50F8B69, 0xE401BF1C, 0xBF1EE501,
45783 +0xE586E400, 0xE400655C, 0x2F50BF1E, 0xBF1BE401,
45784 +0xE401E506, 0xBF1C6543, 0xE401E640, 0xBF296543,
45785 +0xE401E640, 0xBF306543, 0x65F0E640, 0x756CE402,
45786 +0xBEFF6053, 0xE40280F4, 0xE512BF01, 0xE40284F4,
45787 +0xBF017090, 0xE6406503, 0xBF02E402, 0xE640E500,
45788 +0xBF0FE402, 0xE640E500, 0xBF16E402, 0xE5FEE500,
45789 +0x6053655C, 0xBEE5E403, 0xE51380F8, 0xE40EBEE7,
45790 +0xE40E84F8, 0xBEE77085, 0xE5006503, 0xBEE8E640,
45791 +0xE500E403, 0xBEF5E640, 0xE500E403, 0xBEFCE640,
45792 +0xE5FFE403, 0x6053655C, 0xBECBE404, 0xE40F80FC,
45793 +0xE504BECD, 0xE40F84FC, 0xBECD7083, 0xE5016503,
45794 +0xBECEE640, 0xE501E404, 0xBEDBE640, 0xE501E404,
45795 +0xE404E640, 0xAEE07F10, 0x7F104F26, 0x000B4F26,
45796 +0x00000009, 0x001E102F, 0x001E1080, 0x001E1090,
45797 +0x001E103F, 0x001E103E, 0x002039BA, 0x002039BC,
45798 +0x002039BE, 0xD21DD11C, 0x66206010, 0x676C7001,
45799 +0x3700C90F, 0xE5008D13, 0x67106210, 0x7701622C,
45800 +0x64232170, 0xD6166010, 0x44084408, 0x3428C90F,
45801 +0x62602100, 0x7201D513, 0x44082620, 0x000B354C,
45802 +0xD10F6053, 0x25586510, 0xE6008D13, 0xD60DD40B,
45803 +0x655C6540, 0x47086753, 0x37584708, 0x47086540,
45804 +0x24507501, 0x367C6040, 0x2400C90F, 0x72FF6210,
45805 +0x000B2120, 0x00006063, 0x00203905, 0x00203904,
45806 +0x00203906, 0x0020352C, 0x7FFC4F22, 0xE680D19F,
45807 +0x666C6212, 0xD29E2F22, 0x67F36563, 0x420B7542,
45808 +0x7F04E404, 0x000B4F26, 0xE6800009, 0xD298666C,
45809 +0xE7006563, 0x422B7540, 0xE6806473, 0xD294666C,
45810 +0xE7006563, 0x422B7543, 0x2F866473, 0x2FA62F96,
45811 +0x2FC62FB6, 0x2FE62FD6, 0x7FCC4F22, 0xDC8ED28D,
45812 +0x72011F21, 0xDB8D1F22, 0xD18EDE8D, 0x66125211,
45813 +0x8B013620, 0x0009A0E5, 0xC9036061, 0x8B018801,
45814 +0x0009A0DF, 0xD288D487, 0xED84420B, 0x2F025503,
45815 +0x30D0845C, 0xA0B88901, 0xD1840009, 0x626C6610,
45816 +0x88016023, 0xD1828B68, 0x62101FC3, 0x895B2228,
45817 +0xE003D480, 0x40186742, 0x68421772, 0xD57EE900,
45818 +0x81816DB3, 0x7D042190, 0x67D26AB2, 0x64E26852,
45819 +0x1F491F57, 0x740464E3, 0x1FA46542, 0x65431F5A,
45820 +0x625275F8, 0x1F761FD5, 0x6D531F2B, 0xDA74D773,
45821 +0x7D94D274, 0x68D21F88, 0x6AA26972, 0xD1726022,
45822 +0x2202CB20, 0xE1401F1C, 0x7601E600, 0x3213626D,
45823 +0x56F48BFB, 0x52F651F5, 0x21222B62, 0x52F851F7,
45824 +0x212256F9, 0x2E6251FA, 0x51FB2412, 0x2D822512,
45825 +0xD9662792, 0x29A2DD5F, 0x6AD2D965, 0xD9646892,
45826 +0x68D21A84, 0x6081DA63, 0x2801CB01, 0xD86266D2,
45827 +0x2A622962, 0xED015AFC, 0x2AD2480B, 0x2AD24D18,
45828 +0x62D2DD5E, 0x2D227201, 0xD15056F3, 0xE2026062,
45829 +0x2602CB01, 0x2120A03D, 0x8B3A2228, 0xE401DD58,
45830 +0x2140E600, 0xE01C2D62, 0xC801005C, 0xD4558B0A,
45831 +0xE600D755, 0xED7D2472, 0x626C7601, 0x8BFB32D3,
45832 +0x24D2DD52, 0xE2FE68C2, 0x2C822829, 0x095CE01E,
45833 +0xE01F5DF1, 0x0A5C2D90, 0x751051F2, 0xED0621A0,
45834 +0xD74BE600, 0x8456D44B, 0x27007601, 0x696C6854,
45835 +0x248039D3, 0x8FF67401, 0xDA477701, 0x2A10E194,
45836 +0xE2007A01, 0x7A0F2A20, 0xD130E805, 0x66102A80,
45837 +0x6023626C, 0x89088801, 0xD240D42A, 0x420B65F2,
45838 +0xD131ED01, 0xAF304D18, 0x65F221D2, 0x8553D43C,
45839 +0x620D6642, 0x89073262, 0xD13BD43A, 0x0009410B,
45840 +0xE601D73A, 0x2762AF1A, 0xD134D41E, 0x410B65F2,
45841 +0xD125ED01, 0xD637D436, 0x460B4D18, 0xAF0D21D2,
45842 +0x7F340009, 0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6,
45843 +0x000B69F6, 0x4F2268F6, 0x85467FF4, 0x2F01E681,
45844 +0x666C8547, 0x854881F1, 0x81F2D209, 0x67F38542,
45845 +0x854381F3, 0x81F4E40C, 0x65636053, 0x420B81F5,
45846 +0x7F0C7540, 0x000B4F26, 0x00000009, 0x001C3D9C,
45847 +0x00202454, 0x0011779A, 0x001C36F8, 0x001C3B9C,
45848 +0x001C3704, 0x00203524, 0x002014A0, 0x00203915,
45849 +0x00203914, 0x00203910, 0x001C3D98, 0x001C3BB4,
45850 +0x001C5960, 0x001C3500, 0x001C3D30, 0x001C8960,
45851 +0x002034FC, 0x001C3D00, 0x0020160C, 0x00117730,
45852 +0x00203918, 0x001C582C, 0x2000A000, 0x0000A000,
45853 +0x0011778C, 0x00117792, 0x00117788, 0x002014CC,
45854 +0x002038EC, 0x002034EC, 0x00201530, 0x001E2130,
45855 +0x00203D7C, 0x002018A2, 0x2F962F86, 0x2FB62FA6,
45856 +0x2FD62FC6, 0x4F222FE6, 0xD19B7FEC, 0x2F12E000,
45857 +0x6103D49A, 0x1F4281F2, 0xDD9ADA99, 0xD69A6813,
45858 +0xE0014808, 0x460BDE99, 0x38EC4800, 0x65A21F03,
45859 +0x352052A1, 0xA23E8B01, 0x60510009, 0x8801C903,
45860 +0xA2388B01, 0x52530009, 0x32E0DE91, 0xD9918B10,
45861 +0x64A3490B, 0x4B0BDB90, 0xDE906403, 0xD791D690,
45862 +0xEC01D591, 0x2E02E100, 0x271026C0, 0x2502AFDF,
45863 +0xC8018551, 0xA1578B01, 0x62510009, 0x4200622D,
45864 +0x5E53366A, 0x85E2226D, 0xC903642C, 0x85E36603,
45865 +0x6053650D, 0x40214021, 0x4500C93F, 0x322A6703,
45866 +0x6053252D, 0xC901D17F, 0x60106C03, 0x8801D97F,
45867 +0xDB7F8B05, 0x2120E200, 0xCB0160B2, 0xD17D2B02,
45868 +0x88016011, 0x65A28B0A, 0x8D042448, 0x9B9E6251,
45869 +0xA00322B9, 0x919B2521, 0x2521221B, 0x37B3EB10,
45870 +0x2448895E, 0xD4738B07, 0x22286241, 0x60638903,
45871 +0xA05781F8, 0xD5706473, 0x46084608, 0x85E26273,
45872 +0x46006B50, 0x362C4200, 0x2BB8C910, 0x8F1F6463,
45873 +0x26686603, 0xD2698911, 0x062D6043, 0x4119616D,
45874 +0x6B0E6019, 0x81F820BD, 0x880160C3, 0x646C8F2C,
45875 +0x880F6073, 0xA0278B1B, 0xD2610009, 0x052D6043,
45876 +0x4119615D, 0x670E6019, 0x645C207D, 0x81F8A01C,
45877 +0x890F2668, 0x6043D25B, 0x6B5D052D, 0x60B94B19,
45878 +0x201D610E, 0x60C381F8, 0x8F0D8801, 0x6473645C,
45879 +0xEC00A00A, 0x6043D254, 0x625D052D, 0x60294219,
45880 +0x207D670E, 0x81F8645C, 0x880285F8, 0x85E1890A,
45881 +0x8D07C820, 0xE6DC6203, 0x60232269, 0x81E1A002,
45882 +0x644CE4FF, 0x6210D149, 0x89012228, 0x644CE4FF,
45883 +0x654DEBFF, 0x35B06BBC, 0xDB368B2B, 0x64A34B0B,
45884 +0x410BD135, 0x54036403, 0x85446E03, 0xC948DB40,
45885 +0xDC408808, 0xBEAE8B01, 0x64B3E502, 0x65E34C0B,
45886 +0xDB3DEC01, 0xD13D2DC2, 0x621260B2, 0x72017001,
45887 +0x21228805, 0x2B028F08, 0x666CE680, 0x6563D238,
45888 +0x7549E700, 0x6473420B, 0xA030D436, 0x7FFF0009,
45889 +0x85E28000, 0x20B9EBFC, 0x610381E2, 0x942A85E3,
45890 +0x62032049, 0x450885F8, 0x81E2201B, 0xC90160C3,
45891 +0x40084018, 0x40084008, 0x4000225B, 0x6023220B,
45892 +0x85E481E3, 0x4118E108, 0x81E4201B, 0xE40262A2,
45893 +0x20B98521, 0x67A28121, 0xCB016071, 0x85F82701,
45894 +0x89033042, 0xECE785E2, 0x81E220C9, 0x490BD41E,
45895 +0xA03B0009, 0x7E030009, 0x001C3D30, 0x00203D88,
45896 +0x002034FC, 0x001E212C, 0x002033E0, 0x001C3D00,
45897 +0x00117780, 0x002014A0, 0x0020166C, 0x0011770C,
45898 +0x00203914, 0x00203915, 0x00203910, 0x002018A2,
45899 +0x001C36F8, 0x00203988, 0x00203D98, 0x00203B7C,
45900 +0x00203BFC, 0x00203C7C, 0x00203CFC, 0x00203900,
45901 +0x002034F4, 0x002014CC, 0x0020398C, 0x00203990,
45902 +0x00202454, 0x00203D80, 0x00203D84, 0x602262F2,
45903 +0x40094019, 0xC90F4009, 0x8B0B880A, 0x60E2DE8C,
45904 +0x40094019, 0xC90F4009, 0x8B038808, 0xCB0160A2,
45905 +0x2802A006, 0x65E2DE87, 0x2E527501, 0x286266A2,
45906 +0x52F366F2, 0x2622AE83, 0xD2838551, 0xDE83C802,
45907 +0xA0958B01, 0x420B0009, 0x4E0B64A3, 0x5E036403,
45908 +0x85E46503, 0x4918E908, 0xD77D209B, 0xE04C81E4,
45909 +0xDC7C0B7E, 0x7B01D97C, 0x61C207B6, 0x71016690,
45910 +0x8D062668, 0xD4792C12, 0x420BD279, 0xA070EB01,
45911 +0x62512DB2, 0x4B18EB0F, 0x22B9E102, 0x32104118,
45912 +0x85518B0F, 0x2029E2FC, 0x60518151, 0xCB0172E0,
45913 +0x85E12501, 0x202994A3, 0x85E481E1, 0xA0522049,
45914 +0x675181E4, 0x4719677D, 0x667E6779, 0x7701276D,
45915 +0x6903607C, 0x88014918, 0x25918F3E, 0x6B12D161,
45916 +0x21B27B01, 0x660D85E3, 0x40216063, 0xC93F4021,
45917 +0x6C034600, 0x262D322A, 0xC8016063, 0xDB5ED15D,
45918 +0x967D8901, 0xE6002C6B, 0x666C67CD, 0x40006063,
45919 +0x622D021D, 0x8D0E3270, 0x60436403, 0xE9FF021D,
45920 +0x8B013290, 0x01C5A007, 0x626C7601, 0x3292E904,
45921 +0x646C8BEB, 0x60434400, 0xD15004BD, 0x0B457401,
45922 +0x669D6911, 0x89073670, 0x602D6211, 0x890388FF,
45923 +0xE201DB4B, 0x2B2021C1, 0xECFC8551, 0x815120C9,
45924 +0xCB016051, 0xDC472501, 0x64A34C0B, 0x51F366F2,
45925 +0x85EF2612, 0x54F2D244, 0x650D420B, 0x0009ADE7,
45926 +0xE500DC42, 0x420B2C52, 0x4E0B64A3, 0x54036403,
45927 +0x85446E03, 0x6703E908, 0x65034918, 0x27998541,
45928 +0xDB323790, 0x8F0BD932, 0x6013610D, 0x8B07C820,
45929 +0xC9486053, 0x8B038808, 0xE501BD4D, 0x0009A005,
45930 +0x2128D233, 0xBD468901, 0x64B3E500, 0x490B65E3,
45931 +0xADBCEC01, 0x85F22DC2, 0x7001EE04, 0x31E7610D,
45932 +0x8D0281F2, 0xADA97A08, 0x7F140009, 0x6EF64F26,
45933 +0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, 0xF7FF68F6,
45934 +0x2FE68000, 0xD2234F22, 0x60E36E22, 0x8D02C840,
45935 +0xBBF922E2, 0xE2400009, 0x2E284218, 0xBC048901,
45936 +0x60E30009, 0x8905C810, 0xD21CD41B, 0x0009420B,
45937 +0x0009BC03, 0xC80560E3, 0xBD6D8901, 0x60E30009,
45938 +0x8902C802, 0xAC004F26, 0x4F266EF6, 0x6EF6000B,
45939 +0x001C3D3C, 0x00117760, 0x002014A0, 0x0020166C,
45940 +0x0020348C, 0x00203D9C, 0x00203900, 0x002034F4,
45941 +0x002014CC, 0x0020396C, 0x00203974, 0x00203968,
45942 +0x0020396A, 0x00201530, 0x002018EE, 0x0020398C,
45943 +0x00008000, 0x001C3510, 0x00203D90, 0x002018A2,
45944 +0x080A0C0E, 0x00020406, 0x1A1C1E20, 0x12141618,
45945 +0x2E303234, 0x26282A2C, 0x3A3C3E40, 0x6C625648,
45946 +0x41112F26, 0xE2208F18, 0x890B3123, 0x321CD204,
45947 +0xD1026220, 0x412B312C, 0x00090009, 0x0020340A,
45948 +0x002033C0, 0x000BE000, 0x400062F6, 0x40004000,
45949 +0x40004000, 0x40004000, 0x62F6000B, 0x40004000,
45950 +0x40004000, 0x40004000, 0x40184000, 0x62F6000B,
45951 +0x40004000, 0x40004000, 0x40004000, 0x40284000,
45952 +0x62F6000B, 0x40004000, 0x40184000, 0x000B4028,
45953 +0xC90F62F6, 0x40054005, 0x40054005, 0x62F6000B,
45954 +0x4005C907, 0x40054005, 0x62F6000B, 0x4005C903,
45955 +0x000B4005, 0xC90162F6, 0x000B4005, 0x000062F6,
45956 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45957 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45958 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45959 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45960 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45961 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45962 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45963 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45964 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45965 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45966 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45967 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45968 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45969 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45970 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45971 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45972 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45973 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45974 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45975 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45976 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45977 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45978 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45979 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45980 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45981 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45982 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45983 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45984 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45985 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45986 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45987 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45988 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45989 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45990 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45991 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45992 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45993 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45994 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45995 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45996 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45997 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45998 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
45999 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46000 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46001 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46002 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46003 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46004 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46005 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46006 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46007 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46008 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46009 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46010 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46011 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46012 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46013 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46014 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46015 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46016 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46017 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46018 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46019 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46020 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46021 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46022 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46023 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46024 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46025 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46026 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46027 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46028 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46029 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46030 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46031 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46032 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46033 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46034 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46035 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46036 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46037 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46038 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46039 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46040 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46041 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46042 +0x00000000, 0x00000000, 0x00000000, 0x544F0D0A,
46043 +0x46205355, 0x00003A57, 0x206C754A, 0x32203120,
46044 +0x20383030, 0x323A3132, 0x32313A37, 0x00000000,
46045 +0x00000D0A, 0x00000043, 0x42707372, 0x3D206675,
46046 +0x554E203D, 0x202C4C4C, 0x6E49677A, 0x4E497274,
46047 +0x6D754E51, 0x0000003D, 0x61766E49, 0x2064696C,
46048 +0x72657375, 0x20726F20, 0x2079656B, 0x00214449,
46049 +0x52504545, 0x57204D4F, 0x65746972, 0x6461202C,
46050 +0x003D7264, 0x6C617620, 0x0000003D, 0x00000A0D,
46051 +0x435F4D5A, 0x465F444D, 0x4C445F57, 0x494E495F,
46052 +0x00000054, 0x6E6B6E55, 0x206E776F, 0x6D6D6F63,
46053 +0x3D646E61, 0x00000000, 0x203A3051, 0x00000020,
46054 +0x203A3151, 0x00000020, 0x203A3251, 0x00000020,
46055 +0x203A3351, 0x00000020, 0x203A3451, 0x00000020,
46056 +0x2B434741, 0x73696F4E, 0x61432065, 0x7262696C,
46057 +0x6F697461, 0x6166206E, 0x6F206C69, 0x6974206E,
46058 +0x0D0A656D, 0x00000000, 0x00000072, 0x00205220,
46059 +0x00000D0A, 0x62735576, 0x7473725F, 0x00000A0D,
46060 +0x62735576, 0x7375735F, 0x646E6570, 0x00000A0D,
46061 +0x62735576, 0x7365725F, 0x000A0D6D, 0x00000044,
46062 +0x44387570, 0x72637365, 0x6F747069, 0x3D584572,
46063 +0x00000000, 0x00000047, 0x00000042, 0x72746E49,
46064 +0x6D652051, 0x2C797470, 0x49677A20, 0x4972746E,
46065 +0x754E514E, 0x00003D6D, 0x654C7245, 0x0000006E,
46066 +0x00000049, 0x20746F4E, 0x756F6E65, 0x49206867,
46067 +0x4220514E, 0x0A0D6675, 0x00000000, 0x000000FF,
46068 +0x00020001, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
46069 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
46070 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x010E010D,
46071 +0x00020003, 0x01090108, 0x0002010A, 0x02000003,
46072 +0x02020201, 0x02040203, 0x02060205, 0x02020200,
46073 +0x02040203, 0x020C020B, 0x020E020D, 0x00FF00FF,
46074 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
46075 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x000000FF,
46076 +0x00020001, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
46077 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
46078 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x010E010D,
46079 +0x00020003, 0x01090108, 0x0002010A, 0x00030003,
46080 +0x02020201, 0x02040203, 0x02060205, 0x02020200,
46081 +0x02040203, 0x020C020B, 0x020E020D, 0x00FF00FF,
46082 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
46083 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
46084 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
46085 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
46086 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x010E010D,
46087 +0x00FF010F, 0x01090108, 0x010B010A, 0x0200010F,
46088 +0x02020201, 0x02040203, 0x02060205, 0x02020200,
46089 +0x02040203, 0x020C020B, 0x020E020D, 0x00FF00FF,
46090 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
46091 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
46092 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
46093 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
46094 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x010E010D,
46095 +0x00FF010F, 0x01090108, 0x010B010A, 0x010F010F,
46096 +0x02020201, 0x02040203, 0x02060205, 0x02020200,
46097 +0x02040203, 0x020C020B, 0x020E020D, 0x00FF00FF,
46098 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
46099 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00205220,
46100 +0x00000046, 0x00000059, 0x73204142, 0x003D7165,
46101 +0x49544120, 0x0000204D, 0x00000000, 0x00000000,
46102 +0x002E0209, 0x80000101, 0x000409FA, 0x00FF0400,
46103 +0x05070000, 0x02000201, 0x82050700, 0x00020002,
46104 +0x03830507, 0x07010040, 0x40030405, 0x02090100,
46105 +0x0101002E, 0x09FA8000, 0x04000004, 0x000000FF,
46106 +0x02010507, 0x07000040, 0x40028205, 0x05070000,
46107 +0x00400383, 0x04050701, 0x00004002, 0x00000000,
46108 +0x00000000, 0x07090000, 0x00000000, 0x00000000,
46109 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46110 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46111 +0x00000000, 0x00000000, };
46112 +
46113 +const u32_t zcFwImageSize=15928;
46114 --- /dev/null
46115 +++ b/drivers/staging/otus/hal/hpfwu_BA.c
46116 @@ -0,0 +1,874 @@
46117 +/*
46118 + * Copyright (c) 2007-2008 Atheros Communications Inc.
46119 + *
46120 + * Permission to use, copy, modify, and/or distribute this software for any
46121 + * purpose with or without fee is hereby granted, provided that the above
46122 + * copyright notice and this permission notice appear in all copies.
46123 + *
46124 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
46125 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
46126 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
46127 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
46128 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
46129 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
46130 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
46131 + */
46132 +#include "cprecomp.h"
46133 +
46134 +const u32_t zcFwImage[] = {
46135 +0x0009000B, 0x4F222FE6, 0xDE917FFC, 0xE114D791,
46136 +0x1E13D491, 0x1E4C470B, 0x0009B017, 0x95C2E600,
46137 +0xC84060E2, 0x2F028F03, 0x8FF93652, 0xD48B7601,
46138 +0x4E0BDE8B, 0xD48B0009, 0x00094E0B, 0x4E0BD48A,
46139 +0x7F040009, 0xA0474F26, 0x4F226EF6, 0x410BD187,
46140 +0xD4870009, 0x0009440B, 0x450BD586, 0xD7860009,
46141 +0x611DE1FF, 0xD1852712, 0x6012E2FF, 0xCB01D484,
46142 +0x71DC2102, 0x71042122, 0x2122E501, 0xD5812452,
46143 +0xD2819792, 0xE7002572, 0xD481D180, 0x2270D681,
46144 +0x2172E201, 0x26202470, 0xE4FFD67F, 0xE6002641,
46145 +0xE104D57E, 0x6063666D, 0x626D7601, 0x32124000,
46146 +0x05458FF8, 0xE501D27A, 0xD17A2250, 0xD57BD47A,
46147 +0xE700E600, 0x25722470, 0x11622162, 0x11691166,
46148 +0x4F26116A, 0x116E000B, 0xD1757FC4, 0x2F12D875,
46149 +0xD476D175, 0xD577D676, 0x1F87D777, 0xD97778FC,
46150 +0x1F1BD277, 0x1F417104, 0x1F647404, 0x1F887604,
46151 +0x71F41F1C, 0x1F42E8C8, 0x1F651F53, 0x1F991F76,
46152 +0x1F1D1F2A, 0xDD6F688C, 0xDA70DE6F, 0xDC71DB70,
46153 +0x00094A0B, 0x00094B0B, 0x00094C0B, 0x6010D15E,
46154 +0x8B0F8801, 0xE950D15D, 0x49186212, 0x8B073296,
46155 +0x56FAD159, 0x2120E200, 0xCB016062, 0x2602A002,
46156 +0x21227201, 0x880160D2, 0xD1638907, 0x32866212,
46157 +0xD1628903, 0x88016010, 0x64E28BDA, 0x52F751F8,
46158 +0x55E12142, 0x2252D15E, 0x661254FB, 0x246259FC,
46159 +0x29725711, 0x880160D2, 0x66E28B53, 0x362052E1,
46160 +0x6061894C, 0x8801C90F, 0xD1568B48, 0x36206212,
46161 +0xA0438903, 0x27102162, 0xD5530FA0, 0x6651E710,
46162 +0x626D7601, 0x8F3C3273, 0x65F22561, 0x695251F2,
46163 +0x54F359F1, 0x679252F4, 0x61426512, 0x56F66922,
46164 +0x642252F5, 0xCB206062, 0xE6002602, 0x76011F1E,
46165 +0x626DE110, 0x32134118, 0x51FE8FF8, 0x267256F1,
46166 +0x56F457F2, 0x55F32752, 0x251257F5, 0x27422692,
46167 +0x51F969E2, 0x2192D43D, 0xE90161F2, 0x2192440B,
46168 +0x491865F2, 0xD9382592, 0xE200D539, 0x62512921,
46169 +0x720154FD, 0x622D2521, 0x2422A003, 0xE200D932,
46170 +0xE9012921, 0x2D92D12C, 0x26686612, 0xAF6F8B01,
46171 +0xD6300009, 0x0009460B, 0xE700D128, 0x2170AF68,
46172 +0x001C001C, 0x00200F7C, 0x0000B38E, 0x0020322C,
46173 +0x0020145E, 0x00203238, 0x00203250, 0x0020141C,
46174 +0x0020151C, 0x00200FA0, 0x001C3510, 0x001C3648,
46175 +0x001E212C, 0x00203188, 0x00202D24, 0x00203190,
46176 +0x0020319C, 0x002031A8, 0x002031B8, 0x002031BC,
46177 +0x002031B0, 0x00117708, 0x002031B1, 0x002031B4,
46178 +0x001C3D30, 0x00117718, 0x00117734, 0x001C3B9C,
46179 +0x001C3704, 0x001C3D98, 0x001C3500, 0x001C3D00,
46180 +0x001C36F8, 0x001C1028, 0x00202D98, 0x00201328,
46181 +0x00202C04, 0x00201E18, 0x002034BC, 0x002031BA,
46182 +0x00202D90, 0x002031CC, 0x002031D0, 0x00201276,
46183 +0x002031D2, 0x00201FD0, 0x2FB62F96, 0x2FD62FC6,
46184 +0x4F222FE6, 0xDE947F8C, 0x61E0E024, 0x0F14D493,
46185 +0x710161E3, 0xD7926210, 0x470BE028, 0xD5910F24,
46186 +0x0009450B, 0x6D032008, 0x1F0B8F11, 0xD48FDC8E,
46187 +0xDD8F67C0, 0x657C4D0B, 0xDD8FD18E, 0x6B9C6910,
46188 +0x420862B3, 0x32B84208, 0x3D2C4208, 0xE0281FDB,
46189 +0xE58004FC, 0x604C66E2, 0x3050655C, 0x2D628F13,
46190 +0x01FCE024, 0x641CE500, 0x625DDE84, 0x8B013243,
46191 +0x0009A33D, 0x6753655D, 0x607037EC, 0x39DC6953,
46192 +0xAFF27501, 0x20088094, 0xE0248B13, 0xE50001FC,
46193 +0xA009DE7A, 0x655D641C, 0x32EC6253, 0x6C536B22,
46194 +0x3CDC67B2, 0x75041C71, 0x3243625D, 0xA31E8BF3,
46195 +0x88012D10, 0xE0248B16, 0xE40001FC, 0x671C2D40,
46196 +0x624DDE6E, 0x8B013273, 0x0009A311, 0x6CE3644D,
46197 +0x7C046943, 0x39EC6B43, 0x65923BCC, 0x74086DB2,
46198 +0x25D2AFEF, 0x8B198804, 0x01FCE024, 0x2D70E700,
46199 +0x1FD86D1C, 0x627DDE61, 0x8B0132D3, 0x0009A2F7,
46200 +0x6B73677D, 0x3BEC61E3, 0x710464B2, 0x3C1C6C73,
46201 +0x694265C2, 0x29597708, 0x2492AFED, 0x8B188805,
46202 +0x01FCE024, 0x2D40E400, 0xDE54671C, 0x3273624D,
46203 +0xA2DC8B01, 0x644D0009, 0x6BE36D43, 0x65D23DEC,
46204 +0x61437B04, 0x6C1231BC, 0x74086952, 0xAFED29CB,
46205 +0x88312592, 0xDE4A8B20, 0x65E6DB4A, 0x61E6DC4A,
46206 +0x67E2D94A, 0x62E27E04, 0x1FEC7EE8, 0x7E0464E2,
46207 +0x6EE21FED, 0x5BFD2BE0, 0x60B27B04, 0xC9011FBE,
46208 +0x6BB22C00, 0x29B04B09, 0xDC412F26, 0x66134C0B,
46209 +0xE2007F04, 0x2D20A2AB, 0x8B218830, 0xD939DE38,
46210 +0xE06465E6, 0x720462E3, 0x672666E2, 0x6E23DC36,
46211 +0x62227EE8, 0x6BE261E6, 0x29B01FEF, 0x7E040F16,
46212 +0xC90160E2, 0x6EE22C00, 0x4E09DC30, 0x2F262CE0,
46213 +0xD130E068, 0x04FE410B, 0xE2007F04, 0x2D20A287,
46214 +0x8B058833, 0x4E0BDE2C, 0xE1000009, 0x2D10A27F,
46215 +0x89018828, 0x0009A106, 0xE143DE20, 0xE04062E1,
46216 +0x3217622D, 0x0FE68F04, 0x6023E240, 0x262106FE,
46217 +0x8B013217, 0x0009A0EF, 0x02FEE040, 0x8521E401,
46218 +0x8B013046, 0x0009A0E7, 0xE501E040, 0x2D5007FE,
46219 +0x6471B265, 0x09FEE040, 0x6291E143, 0x652DE068,
46220 +0x8D6B3517, 0xE6400F56, 0x8B273563, 0xE048E600,
46221 +0xE11A0F65, 0x72C0A031, 0x00117800, 0x00203254,
46222 +0x0020145E, 0x00202588, 0x002031A2, 0x00203258,
46223 +0x002014AA, 0x002031A1, 0x00202DC8, 0x00117804,
46224 +0x00117810, 0x0020319D, 0x0020319E, 0x0020319F,
46225 +0x00200C2C, 0x00200C80, 0x00200C7C, 0x41216153,
46226 +0x41214121, 0x41214121, 0x45214521, 0x60534521,
46227 +0x6603C903, 0x0F65E048, 0xE0077118, 0xE0442209,
46228 +0x641D0F25, 0x65F3E04C, 0x0F46B28C, 0x04FDE048,
46229 +0x0BFDE044, 0x61BD674D, 0x41084708, 0x0F16E050,
46230 +0xD29B6073, 0x420B09FE, 0x6C07E00F, 0x607329C9,
46231 +0xE0400F96, 0x65F30EFE, 0x6D0D85E2, 0x01FEE050,
46232 +0x60D3420B, 0x6073290B, 0xE04C0F96, 0x04FEB251,
46233 +0x06FEE040, 0x6261E068, 0x0F56652D, 0x3563E640,
46234 +0xE000894E, 0x602381F8, 0x4008C903, 0x6B034000,
46235 +0xE0546103, 0xE0580FB6, 0xECFFDD85, 0x6CCC0FF6,
46236 +0x0FD6E06C, 0x4D0B60C3, 0x42216253, 0x42214221,
46237 +0x64234221, 0x324C4200, 0xE05C6E07, 0x45214200,
46238 +0xE0400FE6, 0x0BFE4521, 0xC9036053, 0x30FC4008,
46239 +0x6D037B06, 0x85F81F05, 0x6C2D1FB7, 0x1FC66E03,
46240 +0x0FC6E060, 0x05FEE058, 0x64C3B22C, 0x33FCE354,
46241 +0x563262D2, 0x22696132, 0x67B42D22, 0x490B5936,
46242 +0x220B607C, 0x05FEE058, 0x64C32D22, 0x7E01B201,
46243 +0xE70662ED, 0x8FE33273, 0xE0407C01, 0x626106FE,
46244 +0x06FEE040, 0x85614200, 0x302C760C, 0x6103701B,
46245 +0x64F3E500, 0x7501E704, 0x6B5D6966, 0x24923B73,
46246 +0x74048FF9, 0xB1E465F3, 0xE040641D, 0xB1A306FE,
46247 +0xA17C6461, 0xD4570009, 0xE201D757, 0x2D20470B,
46248 +0x0009A175, 0x8B078829, 0xEC00DE54, 0x61E22DC0,
46249 +0x641DB175, 0x0009A16B, 0x622CE281, 0x8B013020,
46250 +0x0009A0B6, 0x06FCE028, 0xE682626C, 0x3260666C,
46251 +0x56FB8B20, 0x2610E124, 0x5217D149, 0x52181621,
46252 +0x52191622, 0x521A1623, 0x551B1624, 0x1655E200,
46253 +0x1656551C, 0x1657551D, 0x1658551E, 0x1659551F,
46254 +0x11281127, 0x112A1129, 0x112C112B, 0x112E112D,
46255 +0x112FA13D, 0x666CE683, 0x8B0B3260, 0xD63752FB,
46256 +0x2250E500, 0xD2376562, 0x22527604, 0xD6366262,
46257 +0x2620A12D, 0x666CE690, 0x8B033260, 0x0009B1C7,
46258 +0x0009A011, 0x666CE691, 0x8B103260, 0x6252D52B,
46259 +0x2228622C, 0xD22D8904, 0x0009420B, 0x0009A003,
46260 +0x420BD22B, 0x56FB0009, 0xA110E200, 0xE6B02620,
46261 +0x3260666C, 0xE0248B34, 0xE07002FC, 0x0F16612C,
46262 +0xEB04EC00, 0x01FEE070, 0x321362CD, 0xA0FE8B01,
46263 +0xD21A0009, 0x6DC36CCD, 0x72043D2C, 0x312C61C3,
46264 +0x6D126ED2, 0xD114D41B, 0x0009410B, 0x410BD11A,
46265 +0xD41A64E3, 0x420BD210, 0xD2170009, 0x64D3420B,
46266 +0xD60DD417, 0x0009460B, 0x61E3E600, 0x316C666D,
46267 +0x626D7601, 0x21D032B3, 0x4D198FF7, 0x7C08AFD2,
46268 +0xD211D410, 0xD4116542, 0x0009420B, 0x0009A0CF,
46269 +0x00202C80, 0x00203278, 0x0020145E, 0x00117804,
46270 +0x00202D2C, 0x00203188, 0x0020319C, 0x00200CBA,
46271 +0x00200CE0, 0x00203290, 0x002014A2, 0x002032A4,
46272 +0x002032AC, 0x00117800, 0x002014AA, 0x002032B0,
46273 +0xD5B5D1B4, 0x6252E040, 0x75046612, 0x2162362C,
46274 +0x56116256, 0x1161362C, 0x62526653, 0x76085512,
46275 +0x1152352C, 0x55136262, 0x352C76EC, 0x65631153,
46276 +0x56146262, 0x362C7510, 0x66531164, 0x55156252,
46277 +0x352C7610, 0x62621155, 0x362C5616, 0xD6A31166,
46278 +0x55176262, 0x352C7604, 0x62661157, 0x352C5518,
46279 +0x65631158, 0x56196262, 0x362C7504, 0x62561169,
46280 +0x362C561A, 0x6256116A, 0x362C561B, 0x6653116B,
46281 +0x551C6252, 0x352C7604, 0x6266115C, 0x352C551D,
46282 +0x6263115D, 0x551E6662, 0x356C7204, 0x6622115E,
46283 +0xD58F521F, 0x112F326C, 0x061E6252, 0x362C7594,
46284 +0xE0440166, 0x62526653, 0x7644051E, 0x0156352C,
46285 +0x6262E048, 0x362C061E, 0xD6860166, 0x6262E054,
46286 +0x4229051E, 0x0156352C, 0x62627604, 0x061EE058,
46287 +0x362C4229, 0x56FB0166, 0x2620E238, 0x021EE044,
46288 +0x1621E048, 0x16226212, 0x16235211, 0xE2005512,
46289 +0x55151654, 0x55131655, 0x55161656, 0x051E1657,
46290 +0x1658E040, 0xE050051E, 0x55141659, 0x051E165A,
46291 +0x165BE04C, 0xE054051E, 0x051E165C, 0x165DE058,
46292 +0xE044051E, 0x0126165E, 0x2122E048, 0x11221121,
46293 +0x11231125, 0x01261126, 0x0126E040, 0x1124E050,
46294 +0xE04C0126, 0xE0540126, 0xE0580126, 0x7F740126,
46295 +0x6EF64F26, 0x6CF66DF6, 0x000B6BF6, 0x4F2269F6,
46296 +0xE240614D, 0x89143123, 0x3127E21F, 0x8B09D75A,
46297 +0xD45A614D, 0xE00171E0, 0x5671440B, 0x26596507,
46298 +0x1761A007, 0xE001D455, 0x6672440B, 0x26596507,
46299 +0x4F262762, 0x0009000B, 0x614D4F22, 0x3123E240,
46300 +0xE21F8912, 0xD74C3127, 0x614D8B08, 0x5671D24B,
46301 +0x420B71E0, 0x260BE001, 0x1761A006, 0x6672D247,
46302 +0xE001420B, 0x2762260B, 0x000B4F26, 0xE6400009,
46303 +0x46284618, 0x6252D542, 0x89FC2268, 0x0009000B,
46304 +0x4618E680, 0xD53E4628, 0x22686252, 0x000B89FC,
46305 +0xA0010009, 0x7201E200, 0x8BFC3242, 0x0009000B,
46306 +0x4618E680, 0xD5374628, 0x22686252, 0x000B8BFC,
46307 +0x2FE60009, 0x7FFC4F22, 0xBFF16E53, 0x61E22F42,
46308 +0xE280D631, 0x54E11615, 0x16464218, 0x422855E2,
46309 +0x57E31657, 0x16786EF2, 0x26E22E2B, 0x4F267F04,
46310 +0x6EF6AFCE, 0x2FD62FC6, 0x4F222FE6, 0x6C53DD26,
46311 +0x6E43BFD6, 0x2DE2BFBB, 0x0009BFD2, 0x2C1251D5,
46312 +0x1C4154D6, 0x1C5255D7, 0x1C6356D8, 0x6EF64F26,
46313 +0x000B6DF6, 0x61636CF6, 0xA004E600, 0x62564109,
46314 +0x24227601, 0x36127404, 0x000B8BF9, 0x4F220009,
46315 +0xD117D416, 0x0009410B, 0xD417D216, 0xE5056022,
46316 +0x2202CB20, 0xD5152452, 0x450BE700, 0xD7142472,
46317 +0x0009470B, 0xE601D113, 0x2162D213, 0x4F264618,
46318 +0x2262000B, 0x00202D2C, 0x001C36A0, 0x001C3CA0,
46319 +0x001C36F4, 0x001C3B88, 0x001C3704, 0x00202C80,
46320 +0x001C373C, 0x001C3700, 0x001C370C, 0x002032C4,
46321 +0x0020145E, 0x001C3500, 0x001D4004, 0x002014D4,
46322 +0x00200FA0, 0x001E212C, 0x001C3D30, 0x0009A1A9,
46323 +0x2FE62FD6, 0xDD8F4F22, 0xA0049EA7, 0xD48E0009,
46324 +0x420BD28E, 0x62D265D2, 0x8BF822E8, 0x0009A004,
46325 +0xD28AD48B, 0x55D1420B, 0x22E852D1, 0xA0048BF8,
46326 +0xD4880009, 0x420BD285, 0x52D255D2, 0x8BF822E8,
46327 +0x0009A004, 0xD281D484, 0x55D3420B, 0x22E852D3,
46328 +0xA0048BF8, 0xD4810009, 0x420BD27C, 0x52D455D4,
46329 +0x8BF822E8, 0x6EF64F26, 0x6DF6000B, 0x2FD62FC6,
46330 +0x4F222FE6, 0x6E636D73, 0x6C53B018, 0x64C357F4,
46331 +0xB05465E3, 0xB06A66D3, 0xB09A0009, 0xB09E0009,
46332 +0xB0A20009, 0xB0BE0009, 0xB0C10009, 0xB1240009,
46333 +0x4F260009, 0x6DF66EF6, 0x6CF6A023, 0x3412D16C,
46334 +0xD66C0529, 0x2650D76C, 0x2742000B, 0x0009A014,
46335 +0x2FD62FC6, 0x4F222FE6, 0x6E636D73, 0x6C53BFEE,
46336 +0x64C357F4, 0xB02A65E3, 0xB10666D3, 0x4F260009,
46337 +0x6DF66EF6, 0x6CF6A005, 0xE603D260, 0x000B4618,
46338 +0xD25E2262, 0x000BE600, 0x4F222262, 0xE40ABF7E,
46339 +0x0009BF7E, 0xE104D25A, 0xE5004118, 0x2212E40A,
46340 +0x2252BF74, 0x6072D757, 0x4F26CB20, 0x2702000B,
46341 +0xD1554F22, 0xE400410B, 0x452BD554, 0x2FE64F26,
46342 +0x6E63D153, 0x44186612, 0x45289210, 0x26294408,
46343 +0x44084500, 0x4400265B, 0x4708264B, 0x47082162,
46344 +0x27EBD14C, 0x000B2172, 0x03F06EF6, 0x2FE61FFF,
46345 +0xDE494F22, 0xE40AE101, 0x2E12BF48, 0x726C62E3,
46346 +0xE401E100, 0x22122212, 0x22122212, 0x22122212,
46347 +0xE7302242, 0xE40AE503, 0x22122212, 0x22122212,
46348 +0x22122212, 0x22122212, 0x22122212, 0x22122212,
46349 +0x22522272, 0x22122212, 0x22122212, 0x22122212,
46350 +0x22122212, 0x121ABF22, 0x2E62E600, 0x000B4F26,
46351 +0xD2326EF6, 0xE441E101, 0x000B2212, 0xD1302242,
46352 +0xE605D430, 0x000B2162, 0xD52F2462, 0x6050D22F,
46353 +0x8B0E8801, 0x6040D42E, 0x8B078801, 0x9626D52D,
46354 +0x88016050, 0x96238B0C, 0x0009A00A, 0xA0079621,
46355 +0xE6000009, 0x2262D426, 0x88016040, 0xE6048B00,
46356 +0xAEF3E40A, 0xD2242262, 0xE40AE601, 0x2262AEEE,
46357 +0x2FC62FB6, 0x2FE62FD6, 0xDC204F22, 0x60C2ED00,
46358 +0xCB01EB64, 0x60C22C02, 0xA041C901, 0x03C46E03,
46359 +0x034003D4, 0x001C3B88, 0x002032C8, 0x002014AA,
46360 +0x002032D0, 0x002032D8, 0x002032E0, 0x002032E8,
46361 +0x0025E720, 0x002034B8, 0x0020318C, 0x001C5968,
46362 +0x001D4004, 0x001C3500, 0x0020124A, 0x00201276,
46363 +0x001C5814, 0x001C59D0, 0x001C5830, 0x001C6268,
46364 +0x001C59A4, 0x001C639C, 0x0020319E, 0x001C5804,
46365 +0x0020319D, 0x0020319F, 0x001C581C, 0x001C5860,
46366 +0x89073DB2, 0xE40A60C2, 0xBE9FC901, 0x7D016E03,
46367 +0x8BF52EE8, 0x8B033DB2, 0xD23ED43D, 0x0009420B,
46368 +0x4F26E40A, 0x6DF66EF6, 0xAE8F6CF6, 0x44116BF6,
46369 +0x604B8F01, 0x000B6043, 0x2FB60009, 0x2FD62FC6,
46370 +0x4F222FE6, 0xDC347FFC, 0x60C2ED00, 0xCB02EB64,
46371 +0x60C22C02, 0xC9022F02, 0x6E03A009, 0x89083DB3,
46372 +0xE40A60C2, 0xC9022F02, 0x6E03BE70, 0x2EE87D01,
46373 +0x3DB38BF4, 0xD4298B08, 0x7F04D226, 0x6EF64F26,
46374 +0x6CF66DF6, 0x6BF6422B, 0x4F267F04, 0x6DF66EF6,
46375 +0x000B6CF6, 0xD5226BF6, 0x60525651, 0x000B4628,
46376 +0x2FB6306C, 0x2FD62FC6, 0x4F222FE6, 0x4F024F12,
46377 +0x6E43BFF1, 0xDC1B6B03, 0xBFECDD1B, 0x30B80009,
46378 +0x060A3C05, 0x46094609, 0x3D654601, 0x4209020A,
46379 +0x42094209, 0x8BF032E2, 0x4F164F06, 0x6EF64F26,
46380 +0x6CF66DF6, 0x6BF6000B, 0x4F222FE6, 0xE102DE0F,
46381 +0xE403E500, 0xBFD42E12, 0xE6062E52, 0xE7004618,
46382 +0x2E62E403, 0x4F262E72, 0x6EF6AFCB, 0x0009000B,
46383 +0x002032F0, 0x0020145E, 0x001C5860, 0x00203308,
46384 +0x001C1040, 0xCCCCCCCD, 0x10624DD3, 0x001D4004,
46385 +0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6,
46386 +0xE5007FD8, 0x6453E110, 0x6C534128, 0x655DEE0A,
46387 +0x46086653, 0x4608365C, 0x361C7501, 0x675D6043,
46388 +0x60C30F66, 0x37E3ED00, 0x816126C1, 0x81638162,
46389 +0x16D316D2, 0x8FEA16D4, 0x68F27404, 0xDAB3D9B2,
46390 +0x29821981, 0xD1B259F1, 0x2A921A91, 0x5BF35AF2,
46391 +0x5EF55DF4, 0x11A154F6, 0x11B321A2, 0x11D511B2,
46392 +0x11E711D4, 0x114911E6, 0x55F71148, 0xEE00DBA9,
46393 +0xDDA957F8, 0xD6A952F9, 0x1B5164E3, 0xDBA82B52,
46394 +0xEAB8D8A8, 0x2D72E945, 0x6AAC2622, 0x6EED4908,
46395 +0x4D086DE3, 0x3DEC61E3, 0x4D084108, 0x3DBC31EC,
46396 +0x410860C3, 0x81D12DC1, 0x4108E050, 0x41084008,
46397 +0x60C381D2, 0xE500318C, 0x81D334A2, 0x1D131DD2,
46398 +0x8D01D494, 0xD4911D54, 0xB08165D3, 0x64ED7E01,
46399 +0x8BDC3492, 0xDB94D18D, 0xD28B6812, 0x1B814829,
46400 +0x2FD26412, 0x2B92694D, 0xD98A6722, 0x1B734729,
46401 +0xD7876822, 0x1BA26A8D, 0xD28C6B72, 0x22B2D586,
46402 +0xE0035D72, 0x5E7412D2, 0x12E44018, 0xD6885176,
46403 +0x54781216, 0x1248E1FF, 0xD4856792, 0x6852127A,
46404 +0x28C1E703, 0x81916952, 0x6A52E050, 0x81A24008,
46405 +0x60C36B52, 0x6D5281B3, 0x6E521DD2, 0x62521E63,
46406 +0x1264E600, 0x46086563, 0x7501364C, 0x665D2612,
46407 +0x8BF83673, 0xE003D471, 0x40186542, 0x674225C1,
46408 +0x8171D274, 0xEE006842, 0x69421882, 0x1923E024,
46409 +0xE5806A42, 0x6B421AE4, 0x81B266E3, 0xD46D6C42,
46410 +0x655C81C3, 0x6D63666D, 0x616D7604, 0x31533D4C,
46411 +0x2DE28FF8, 0xD569D268, 0x74042422, 0x7F282452,
46412 +0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6, 0x000B69F6,
46413 +0x664268F6, 0xC8036061, 0xE5008D04, 0xC9036061,
46414 +0x8B038802, 0x65635262, 0x24125124, 0x6053000B,
46415 +0x2FE62FD6, 0x7FEC4F22, 0x62536E53, 0x6D43E550,
46416 +0x4508E400, 0xE101A001, 0x60435224, 0x81212211,
46417 +0x60538123, 0x56E28122, 0x8BF53620, 0x16E4D250,
46418 +0xE61464F3, 0x65E3420B, 0xE4FC65E1, 0x2E512549,
46419 +0x65F361F1, 0x2F112149, 0xD14954D1, 0xE614410B,
46420 +0x607157D1, 0x2701CB01, 0x7F141DE1, 0x6EF64F26,
46421 +0x6DF6000B, 0x2FE62FD6, 0x7FEC4F22, 0x66536E53,
46422 +0x6D43E5FC, 0x20596061, 0x2601CB01, 0x326052E2,
46423 +0x12E48B06, 0x31E051E2, 0x52D18B04, 0x1E22A002,
46424 +0x5664AFF0, 0x64F3D236, 0x420BE614, 0x67E165E3,
46425 +0x2719E1FC, 0x67F12E71, 0x271954D1, 0x65F3D130,
46426 +0x410BE614, 0x52D12F71, 0xCB016021, 0x1DE12201,
46427 +0x4F267F14, 0x000B6EF6, 0x2FE66DF6, 0x624C4F22,
46428 +0x4208DE1B, 0xA0054200, 0x52523E2C, 0x5624D417,
46429 +0x2E62BF8E, 0x52E165E2, 0x8BF63520, 0x2622D61B,
46430 +0x000B4F26, 0x2FB66EF6, 0x2FD62FC6, 0x4F222FE6,
46431 +0xDB1CDC10, 0x66C252C1, 0x89403620, 0xC9036061,
46432 +0x893C8801, 0xDD18DE0B, 0x64E3BF63, 0x85036503,
46433 +0x620D66B2, 0x892B3262, 0xBF9BD403, 0xD4130009,
46434 +0x00094D0B, 0x0009AFE6, 0x00202D88, 0x00202D90,
46435 +0x00202D98, 0x00202DC0, 0x002031A4, 0x002031AC,
46436 +0x001000C8, 0x00101680, 0x001E2108, 0x001C3D00,
46437 +0x00117880, 0x00117780, 0x00040020, 0x0026C401,
46438 +0x00200B26, 0x00203188, 0x0020145E, 0x00203324,
46439 +0x64E3BF3E, 0x4D0BD406, 0xAFBB0009, 0xD2050009,
46440 +0x4F262262, 0x6DF66EF6, 0x000B6CF6, 0x00006BF6,
46441 +0x00203328, 0x001C3D28, 0x2FC62FB6, 0x2FE62FD6,
46442 +0x7FFC4F22, 0x6022D22B, 0x8D41C803, 0xDE2A2F01,
46443 +0xDB2BDC2A, 0xED01A017, 0xC9036051, 0x89168801,
46444 +0xD128D426, 0x0009410B, 0x61035503, 0xC8208551,
46445 +0xE0508903, 0x720102BE, 0xD2230B26, 0x420B64E3,
46446 +0xD6226513, 0x52C126D2, 0x352065C2, 0xDE208BE4,
46447 +0xDB21DD20, 0x52D1DC21, 0x352065D2, 0x60518918,
46448 +0x8801C903, 0xD41B8914, 0x460BD616, 0x57030009,
46449 +0x8F0437E0, 0xE2016503, 0xAFEC2B20, 0xD4182C52,
46450 +0x420BD218, 0xD6110009, 0x4118E101, 0x2612AFE3,
46451 +0xC80460F1, 0xD2148907, 0x4F267F04, 0x6DF66EF6,
46452 +0x422B6CF6, 0x7F046BF6, 0x6EF64F26, 0x6CF66DF6,
46453 +0x6BF6000B, 0x001E2100, 0x00202D98, 0x00202D90,
46454 +0x00202D2C, 0x00201162, 0x002011E4, 0x001C3D30,
46455 +0x00117880, 0x00202D88, 0x002031A8, 0x002031A4,
46456 +0x00202DC0, 0x00201180, 0x00200308, 0xE601D203,
46457 +0x1265D503, 0x000B2252, 0x00001266, 0x001C1010,
46458 +0x0000C34F, 0x0009000B, 0x2FD62FC6, 0x4F222FE6,
46459 +0x6D436C53, 0xEE00A004, 0x7E0164D4, 0x644CBFF2,
46460 +0x8BF93EC2, 0x6EF64F26, 0x000B6DF6, 0xE5006CF6,
46461 +0x6643A002, 0x76017501, 0x22286260, 0xAFE38BFA,
46462 +0x2FE60009, 0x75076253, 0xE1086753, 0x6043EE0A,
46463 +0x4409C90F, 0x650330E2, 0x8D014409, 0xE630E637,
46464 +0x4110365C, 0x8FF22760, 0xE00077FF, 0x000B8028,
46465 +0x000B6EF6, 0x000BE000, 0x2FE6E000, 0x7FEC4F22,
46466 +0x6E436253, 0xBFDC65F3, 0xBFD06423, 0xBFCE64E3,
46467 +0xD40364F3, 0x0009BFCB, 0x4F267F14, 0x6EF6000B,
46468 +0x0020332C, 0xE4FDD29A, 0xD79A6122, 0x22122149,
46469 +0x74016022, 0x2202CB01, 0xD5976622, 0x22622649,
46470 +0xC8406070, 0x60528902, 0x2502CB04, 0xE1F76452,
46471 +0x25422419, 0xE7016052, 0x2502C9CF, 0xE6026052,
46472 +0x2502CB03, 0x15624718, 0x1573000B, 0xD78CD58B,
46473 +0xD48DD28C, 0xE600E100, 0x27112511, 0xAFD12210,
46474 +0x664C2461, 0x4600D289, 0x6060362C, 0x000BCB10,
46475 +0x654C2600, 0x4500D285, 0x6650352C, 0x2619E1EF,
46476 +0x2560000B, 0xD282664C, 0x362C4600, 0xCB106060,
46477 +0x2600000B, 0xD27E654C, 0x352C4500, 0xE1EF6650,
46478 +0x000B2619, 0x664C2560, 0x4600D278, 0x6060362C,
46479 +0x000BCB08, 0x654C2600, 0x4500D274, 0x6650352C,
46480 +0x2619E1F7, 0x2560000B, 0xD271664C, 0x362C4600,
46481 +0xCB086060, 0x2600000B, 0xD26D654C, 0x352C4500,
46482 +0xE1F76650, 0x000B2619, 0x624C2560, 0x4200D667,
46483 +0x6020326C, 0x4021C908, 0x40214021, 0x600C000B,
46484 +0xD663624C, 0x326C4200, 0xC9086020, 0x40214021,
46485 +0x000B4021, 0xD15F600C, 0x341C644C, 0x000B6240,
46486 +0xD15D602C, 0x341C644C, 0x000B6240, 0x2FE6602C,
46487 +0x6E434F22, 0xE60A645C, 0x89143467, 0x0009BFEB,
46488 +0x60EC640C, 0x8B028801, 0xA002E00F, 0x44092409,
46489 +0x624C4409, 0x3263E60A, 0xBFE28905, 0x620C644C,
46490 +0xC8806023, 0xE2008B00, 0x4F266023, 0x6EF6000B,
46491 +0xD64A4F22, 0x88016062, 0xB2458B03, 0xA0030009,
46492 +0xD2470009, 0x2260E640, 0xE200D646, 0x000B4F26,
46493 +0x4F222622, 0x6062D641, 0x8B018802, 0x0009B28E,
46494 +0xE200D640, 0x000B4F26, 0xD53C2622, 0xE100D43C,
46495 +0x2512E701, 0x2470000B, 0xE604D239, 0x2260000B,
46496 +0xD4394F22, 0x410BD139, 0xD5390009, 0x6650E1FD,
46497 +0x2619D238, 0x2560E700, 0x000B4F26, 0x4F222270,
46498 +0xD132D435, 0x0009410B, 0xE7FBD531, 0x26796650,
46499 +0x000B4F26, 0x4F222560, 0xD12CD430, 0x0009410B,
46500 +0xE7F7D52B, 0x26796650, 0x000B4F26, 0xD5282560,
46501 +0x6250942D, 0x000B2249, 0xD5252520, 0x6250E4BF,
46502 +0x000B2249, 0x4F222520, 0x8522D225, 0x2008600D,
46503 +0x88018911, 0x88038913, 0x88058915, 0x88068942,
46504 +0x88088948, 0x8809894E, 0x880A8954, 0x880B895A,
46505 +0xA0678960, 0xB0690009, 0xA0640009, 0xB077600C,
46506 +0xA0600009, 0xB080600C, 0xA05C0009, 0xFF7F600C,
46507 +0x001E2148, 0x001E1000, 0x001E1108, 0x002031FC,
46508 +0x002031FE, 0x0020321D, 0x002031E0, 0x001E103F,
46509 +0x001E105F, 0x001E102F, 0x001E1090, 0x00203204,
46510 +0x001E100B, 0x00203200, 0x00203330, 0x0020145E,
46511 +0x001E1028, 0x0020321C, 0x0020333C, 0x0020334C,
46512 +0x002031D4, 0x6260D684, 0x8B2B2228, 0x0009B061,
46513 +0x600CA029, 0x6260D680, 0x8B232228, 0x0009B069,
46514 +0x600CA021, 0x6260D67C, 0x8B1B2228, 0x0009B0C7,
46515 +0x600CA019, 0x6260D678, 0x8B132228, 0x0009B0CD,
46516 +0x600CA011, 0x6260D674, 0x8B0B2228, 0x0009B125,
46517 +0x600CA009, 0x6260D670, 0x8B032228, 0x0009B13D,
46518 +0x600CA001, 0x4F26E000, 0x0009000B, 0xD26CD16B,
46519 +0xD56C8412, 0x4000C90F, 0xD76B012D, 0xE403D66B,
46520 +0xE20F611C, 0x2540E001, 0x25202712, 0x2602000B,
46521 +0xE601D262, 0x30668523, 0xE0008D05, 0xD663D260,
46522 +0xE0018122, 0x000B2602, 0xD25C0009, 0x600D8523,
46523 +0x89052008, 0x8B0A8801, 0x6060D65D, 0x2600CB01,
46524 +0xD457D65A, 0xE001E101, 0x000B2612, 0x000B8142,
46525 +0xD152E000, 0x8513E501, 0x640D4518, 0x66033453,
46526 +0xE0008D05, 0xD551D253, 0x2260E001, 0x000B2502,
46527 +0x4F220009, 0x8513D149, 0x6453650D, 0x62494419,
46528 +0x227D672E, 0x8801602C, 0x88028909, 0x88038910,
46529 +0x8806891A, 0x88078935, 0xA04C893B, 0xD5460009,
46530 +0x6652D746, 0x2762D446, 0x622C6261, 0x2421A038,
46531 +0x2228625C, 0xD4438B3F, 0x6642D540, 0x2562D440,
46532 +0x24018561, 0x6203A02C, 0x2008605C, 0x88108907,
46533 +0x88208908, 0x88308909, 0xA02C890A, 0xD23A0009,
46534 +0x6222A008, 0xA005D239, 0xD2396222, 0x6222A002,
46535 +0x6262D638, 0xD432D531, 0x66212522, 0xA00F626C,
46536 +0xD6352421, 0x6261D52D, 0x622CD42D, 0xA0072562,
46537 +0xD6322421, 0x8561D529, 0x2562D429, 0x62032401,
46538 +0x662D8515, 0x3617610D, 0x65038F01, 0xB0CB2451,
46539 +0xA0010009, 0xE000E001, 0x000B4F26, 0xD6190009,
46540 +0xD427E101, 0x65412610, 0xD118D717, 0xE20F655D,
46541 +0x2752E001, 0x000B2620, 0x2FE62102, 0xD20F4F22,
46542 +0x640C8523, 0x8B082448, 0xD511D61D, 0x2621E200,
46543 +0x940F8451, 0xA0482049, 0xDE0D8051, 0xC84060E0,
46544 +0xE2018D32, 0x89443427, 0xD216D615, 0x2641420B,
46545 +0x0009A030, 0x0000FF7F, 0x0020321D, 0x002031D4,
46546 +0x002031E0, 0x001E1100, 0x001E100C, 0x00203200,
46547 +0x001E1000, 0x001E1001, 0x00203208, 0x002031E8,
46548 +0x002031EC, 0x002031F0, 0x0020320C, 0x00203210,
46549 +0x00203214, 0x00203218, 0x0020351C, 0x00203526,
46550 +0x002031FA, 0x00202362, 0x89123427, 0xD294D693,
46551 +0x2641420B, 0xCB8084E1, 0x80E1B0F5, 0xD69160E0,
46552 +0x2E00CB04, 0xC93F6060, 0xD68F2600, 0xA001E001,
46553 +0xE0002602, 0x000B4F26, 0xD68C6EF6, 0xC8806060,
46554 +0xD2868919, 0x88016021, 0xD2898B15, 0x8524E501,
46555 +0x89103056, 0xE203D187, 0x2120D487, 0xE00B6541,
46556 +0x0656655D, 0xE40FD585, 0x2140E702, 0xD77E2571,
46557 +0x000BE001, 0x000B2702, 0x2FE6E000, 0xDE804F22,
46558 +0xC88084E1, 0xD57A892C, 0x20088554, 0x61038F28,
46559 +0x8553D77C, 0x64036672, 0x8566650C, 0x3520620C,
46560 +0xD6798B1E, 0x651CD774, 0x2651644C, 0x60E02741,
46561 +0x8904C840, 0x420BD275, 0xA0030009, 0xD2680009,
46562 +0x0009420B, 0x0009B09F, 0xE201D167, 0x60E02122,
46563 +0xCB04D464, 0x60402E00, 0x2400C93F, 0x6023A001,
46564 +0x4F26E000, 0x6EF6000B, 0x2FB62FA6, 0x2FD62FC6,
46565 +0xDA622FE6, 0x66A1E240, 0x3622DC5E, 0x62638900,
46566 +0x6ED36D2C, 0x4E2136D8, 0x4E212A61, 0xDB61D460,
46567 +0xE700A00F, 0x770162B2, 0x71026123, 0x66212B12,
46568 +0x71026213, 0x61212B12, 0x651D666D, 0x356C4528,
46569 +0x627C2452, 0x8BED32E3, 0xC90360D3, 0x8B108803,
46570 +0x617367B2, 0x2B127102, 0x71026E13, 0x2B126571,
46571 +0x655D6DE1, 0x422862DD, 0x325CE107, 0xA00C2C10,
46572 +0x88022422, 0xA0038B01, 0x8801E203, 0xE2018B05,
46573 +0x66B22C20, 0x655D6561, 0xE60F2452, 0x67A12C60,
46574 +0x8B052778, 0xDD38DC44, 0xEB01EA00, 0x2DB22CA2,
46575 +0x6DF66EF6, 0x6BF66CF6, 0x6AF6000B, 0x2FE62FD6,
46576 +0xE240DD36, 0x362266D1, 0x62638900, 0x3678672C,
46577 +0x7703DE38, 0x47212D61, 0x64E2D635, 0xA00E4721,
46578 +0x6562E100, 0x62537101, 0x74012450, 0x24204219,
46579 +0x45297401, 0x74012450, 0x24504519, 0x621C7401,
46580 +0x8BEE3273, 0x66E24200, 0x420061D1, 0x2118362C,
46581 +0x2E628F06, 0xDD1CD728, 0xE501E400, 0x2D522742,
46582 +0x000B6EF6, 0x2FD66DF6, 0x4F222FE6, 0xED0AEE01,
46583 +0x64E3BC97, 0xBC9C64E3, 0x62EC7E01, 0x8BF732D7,
46584 +0xBC9FEE01, 0x64E364E3, 0x7E01BCA4, 0x32D762EC,
46585 +0x4F268BF7, 0x000B6EF6, 0xD1186DF6, 0xD418920D,
46586 +0x72122122, 0x2422D617, 0xD7177204, 0x72202622,
46587 +0x2722D116, 0x000B7230, 0x137A2122, 0x002031FA,
46588 +0x0020246E, 0x001E1015, 0x00203200, 0x001E1001,
46589 +0x002031D4, 0x001E1100, 0x002031FE, 0x002031EC,
46590 +0x001E1000, 0x002031F0, 0x002031FC, 0x00202362,
46591 +0x001E100C, 0x002031E8, 0x00203204, 0x00203208,
46592 +0x0020320C, 0x00203210, 0x00203214, 0x00203218,
46593 +0x4F222FE6, 0xD6507FFC, 0x88016060, 0xE2018951,
46594 +0x2620BFBB, 0xD54ED14D, 0xDE4E6010, 0x64E36552,
46595 +0x7402C840, 0x8D22D14C, 0xD24C7502, 0xE601D74C,
46596 +0xE7042722, 0x76016255, 0x626C2421, 0x8FF93273,
46597 +0xD4437402, 0x6242E601, 0x640D8528, 0x67494419,
46598 +0x275D657E, 0x81E4607C, 0xE417D542, 0x67557601,
46599 +0x3243626C, 0x8FF92171, 0xA0207102, 0xD23E0009,
46600 +0xE601D73B, 0xE7042722, 0x76016255, 0x626C2421,
46601 +0x8FF93273, 0xD4327402, 0x6242E601, 0x640D8528,
46602 +0x67494419, 0x275D657E, 0x81E4607C, 0xE417D533,
46603 +0x67557601, 0x3243626C, 0x8FF92171, 0x924A7102,
46604 +0xD2262E21, 0x5E23D72E, 0x64F22FE2, 0x604365F2,
46605 +0x2700C980, 0xC9606043, 0x80716103, 0xC9036043,
46606 +0x80724519, 0x65F2605C, 0x817266F2, 0x46194629,
46607 +0x606C4529, 0x4018645C, 0x8173304C, 0x21185E23,
46608 +0x64F22FE2, 0x6E4C62F2, 0x602C4219, 0x66F262F2,
46609 +0x46294018, 0x461930EC, 0x42298174, 0x652C606C,
46610 +0x305C4018, 0x81758F07, 0x0009BC9D, 0x2228620C,
46611 +0xA00A8908, 0x60130009, 0x8B038840, 0x0009B009,
46612 +0x0009A003, 0xE202D60F, 0x7F042622, 0x000B4F26,
46613 +0x000B6EF6, 0x060A0009, 0x0020321C, 0x001E1000,
46614 +0x00203208, 0x0020351C, 0x00203528, 0x002034C0,
46615 +0x002031F0, 0x002034F0, 0x002034EE, 0x002034C2,
46616 +0x002031D4, 0x00203200, 0x4F222FE6, 0xDE937FFC,
46617 +0x200884E9, 0x2F008D06, 0xD692D491, 0x0009460B,
46618 +0x64F0B194, 0x6620D290, 0x89022668, 0xC9BF60E0,
46619 +0x7F042E00, 0x000B4F26, 0x000B6EF6, 0x2FE60009,
46620 +0xDE8A4F22, 0x60E0D68A, 0xCBC0D48A, 0x62602E00,
46621 +0xC803602C, 0x40218904, 0x70014021, 0x6603A002,
46622 +0x66034009, 0xD684616D, 0xE500A004, 0x75016262,
46623 +0x74042422, 0x3213625D, 0xD2808BF8, 0x0009420B,
46624 +0xC9BF84E2, 0x4F2680E2, 0x6EF6000B, 0x2FE62FD6,
46625 +0x7FFC4F22, 0x6260D67A, 0x89442228, 0xD56FE100,
46626 +0x60502610, 0xCB40D477, 0x2500440B, 0x8D052008,
46627 +0x62E06E03, 0x7104612C, 0x2F11A006, 0xD472D66A,
46628 +0xDD726760, 0x657C4D0B, 0xE23C6D1D, 0x8B033D27,
46629 +0xD264D46F, 0x0009420B, 0x4D214D21, 0xA005D76D,
46630 +0x66E6E400, 0x357C4508, 0x74012562, 0x35D3654D,
46631 +0xD7698BF7, 0x6172E003, 0x81114018, 0x6E7260F1,
46632 +0x81E2700C, 0xD4656172, 0xDD658113, 0x4D0BDE65,
46633 +0xE2016572, 0xD4642E22, 0x420BD252, 0xD6530009,
46634 +0xC93F6060, 0x7F042600, 0x6EF64F26, 0x6DF6000B,
46635 +0x2FC62FB6, 0x2FE62FD6, 0xD25C4F22, 0x6B436E73,
46636 +0x420B6C53, 0x20086D63, 0x61038F08, 0xD245D458,
46637 +0x6EF64F26, 0x6CF66DF6, 0x6BF6422B, 0x21B060C3,
46638 +0x60D38011, 0xE5008111, 0x64BCA007, 0x6053655D,
46639 +0x665300EC, 0x7501361C, 0x625D8064, 0x8BF53243,
46640 +0x6060D636, 0x2600C9BF, 0x6EF64F26, 0x6CF66DF6,
46641 +0x6BF6000B, 0x7FC44F22, 0x720262F3, 0x22512F41,
46642 +0x45297202, 0x60632251, 0xE5C4E682, 0x67F38121,
46643 +0x655C666C, 0xE408BFBC, 0x4F267F3C, 0x0009000B,
46644 +0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6,
46645 +0xE1007FC4, 0x6513ECFF, 0x6B136CCD, 0xDE36D735,
46646 +0xEDFF64F3, 0xD835EA04, 0x6053655C, 0x027D4000,
46647 +0x32C0622D, 0x66038D0D, 0x09ED6063, 0x2491027D,
46648 +0x24217402, 0x698202ED, 0x3928622D, 0x74022892,
46649 +0x75017104, 0x6063625C, 0x07D532A2, 0x0EB58FE4,
46650 +0x2448641C, 0xE6808905, 0x67F3E5C5, 0xBF7F666C,
46651 +0x7F3C655C, 0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6,
46652 +0x000B69F6, 0xD11E68F6, 0x6012D21E, 0xCB20E405,
46653 +0x2102E500, 0x000B2242, 0x00002252, 0x001E1017,
46654 +0x00203358, 0x0020145E, 0x002031A2, 0x001E1015,
46655 +0x001E10BF, 0x00117800, 0x001E10FC, 0x00200308,
46656 +0x002031A8, 0x002025C6, 0x0020335C, 0x002014AA,
46657 +0x00203378, 0x0011788C, 0x002031A4, 0x00202D88,
46658 +0x002011E4, 0x001E2130, 0x00203380, 0x00202588,
46659 +0x00203384, 0x002031BC, 0x002031C4, 0x002034BC,
46660 +0x001C3500, 0x001D4004, 0xD565D164, 0xE400D765,
46661 +0x2142E20F, 0x17411154, 0xD5632722, 0x9669D763,
46662 +0x15412572, 0x96661562, 0xE6011565, 0xD5601165,
46663 +0x666CE6F8, 0x25422542, 0x25422542, 0x25422542,
46664 +0x25622542, 0x7601E727, 0x67632572, 0x25627797,
46665 +0xE7042572, 0x2572E248, 0xE2192522, 0xE2702522,
46666 +0x25422542, 0x25422542, 0x25222542, 0x2522E20C,
46667 +0x25422542, 0x25422542, 0x25422542, 0x25422542,
46668 +0x000B154A, 0xE2081145, 0x0009422B, 0x2FE62FD6,
46669 +0x7FFC4F22, 0xC8206043, 0x6E438D02, 0x0009BE6D,
46670 +0xC81060E3, 0xBE6A8901, 0x60E30009, 0x8901C840,
46671 +0x0009BE8C, 0xC80160E3, 0xDD3E8938, 0xC80260D0,
46672 +0x2F008D03, 0x460BD63C, 0x60F00009, 0x8902C804,
46673 +0x460BD63A, 0x62F00009, 0xC8806023, 0x60D08902,
46674 +0x2D00C97F, 0xC8016023, 0xD6358906, 0x0009460B,
46675 +0x0009A007, 0x51630601, 0x8902C808, 0x460BD631,
46676 +0x60F00009, 0x8902C810, 0x420BD22F, 0xD52F0009,
46677 +0x88026052, 0xD22E8B03, 0xA005E604, 0x88012260,
46678 +0xD22B8B02, 0x2260E601, 0x2522E200, 0xC88060E3,
46679 +0xD628892E, 0x60E36E60, 0x8902C880, 0x420BD226,
46680 +0x60E30009, 0x8902C840, 0x420BD224, 0x60E30009,
46681 +0x8902C802, 0x420BD222, 0x60E30009, 0x890EC804,
46682 +0x410BD120, 0xBF0E0009, 0xBF4D0009, 0xD51E0009,
46683 +0x6050D41E, 0xC908D71E, 0xBF842500, 0x60E32472,
46684 +0x8905C808, 0x7F04D21B, 0x6EF64F26, 0x6DF6422B,
46685 +0x4F267F04, 0x000B6EF6, 0x00006DF6, 0x001C581C,
46686 +0xA000A000, 0x001D0100, 0x001D4000, 0x00040021,
46687 +0x001C589C, 0x001E1021, 0x00201640, 0x00201662,
46688 +0x00201CA0, 0x0020167A, 0x00201688, 0x00203200,
46689 +0x001E100B, 0x001E1028, 0x002016DE, 0x002016EA,
46690 +0x00201690, 0x002016AE, 0x001E1000, 0x0010F100,
46691 +0x12345678, 0x002016C6, 0x644CD6A7, 0x000B346C,
46692 +0xD6A62450, 0x346C644C, 0x2450000B, 0x644CD6A4,
46693 +0x000B346C, 0x625C2450, 0x4208616D, 0x42084119,
46694 +0x42006019, 0x670E614C, 0xD49E321C, 0x4200207D,
46695 +0x324CC90F, 0x2200000B, 0x4208625C, 0x42004208,
46696 +0x324C644C, 0x4200D498, 0x000B324C, 0x2FE62260,
46697 +0x614C4F12, 0x4100D493, 0x6710314C, 0xE29F666D,
46698 +0x27294619, 0x6E536269, 0x672E6573, 0x4221227D,
46699 +0x42214221, 0x7601662C, 0xE4014608, 0x34E84608,
46700 +0x644C4600, 0x071A0467, 0x2150257B, 0x000B4F16,
46701 +0x4F226EF6, 0xD2857FE8, 0x88016021, 0xD2848B7B,
46702 +0x26686621, 0xD2838B77, 0x26686621, 0xE50F8B73,
46703 +0xE401BFA2, 0xBFA4E501, 0xE586E400, 0xE400655C,
46704 +0x2F50BFA4, 0xBFA1E401, 0xE602E506, 0x60634618,
46705 +0x81F2E401, 0x6543BF9F, 0xE40185F2, 0xBFAB6543,
46706 +0x85F26603, 0x6543E401, 0x6603BFB1, 0xE40265F0,
46707 +0x6053756C, 0x80F8BF80, 0xBF82E402, 0x84F8E512,
46708 +0x7090E402, 0x6503BF82, 0x4618E602, 0x81F66063,
46709 +0xBF80E402, 0x85F6E500, 0x6603E402, 0xE500BF8C,
46710 +0xE40285F6, 0xBF926603, 0xE5FEE500, 0xE010655C,
46711 +0xBF61E403, 0xE5130F54, 0xE40EBF63, 0x05FCE010,
46712 +0xBF63E40E, 0xE5007585, 0xBF64E403, 0xE500E640,
46713 +0xBF71E403, 0xE500E640, 0xBF78E403, 0xE5FFE640,
46714 +0xE014655C, 0xBF47E404, 0xE40F0F54, 0xE504BF49,
46715 +0x05FCE014, 0xBF49E40F, 0xE5017584, 0xBF4AE640,
46716 +0xE501E404, 0xBF57E640, 0xE501E404, 0xE404E640,
46717 +0xAF5C7F18, 0x7F184F26, 0x000B4F26, 0x4F220009,
46718 +0xD2427FF0, 0x88016021, 0xD2418B71, 0x26686621,
46719 +0xD2408B6D, 0x26686621, 0xE50F8B69, 0xE401BF1C,
46720 +0xBF1EE501, 0xE586E400, 0xE400655C, 0x2F50BF1E,
46721 +0xBF1BE401, 0xE401E506, 0xBF1C6543, 0xE401E640,
46722 +0xBF296543, 0xE401E640, 0xBF306543, 0x65F0E640,
46723 +0x756CE402, 0xBEFF6053, 0xE40280F4, 0xE512BF01,
46724 +0xE40284F4, 0xBF017090, 0xE6406503, 0xBF02E402,
46725 +0xE640E500, 0xBF0FE402, 0xE640E500, 0xBF16E402,
46726 +0xE5FEE500, 0x6053655C, 0xBEE5E403, 0xE51380F8,
46727 +0xE40EBEE7, 0xE40E84F8, 0xBEE77085, 0xE5006503,
46728 +0xBEE8E640, 0xE500E403, 0xBEF5E640, 0xE500E403,
46729 +0xBEFCE640, 0xE5FFE403, 0x6053655C, 0xBECBE404,
46730 +0xE40F80FC, 0xE504BECD, 0xE40F84FC, 0xBECD7083,
46731 +0xE5016503, 0xBECEE640, 0xE501E404, 0xBEDBE640,
46732 +0xE501E404, 0xE404E640, 0xAEE07F10, 0x7F104F26,
46733 +0x000B4F26, 0x00000009, 0x001E102F, 0x001E1080,
46734 +0x001E1090, 0x001E103F, 0x001E103E, 0x002031FA,
46735 +0x002031FC, 0x002031FE, 0xD21DD11C, 0x66206010,
46736 +0x676C7001, 0x3700C90F, 0xE5008D13, 0x67106210,
46737 +0x7701622C, 0x64232170, 0xD6166010, 0x44084408,
46738 +0x3428C90F, 0x62602100, 0x7201D513, 0x44082620,
46739 +0x000B354C, 0xD10F6053, 0x25586510, 0xE6008D13,
46740 +0xD60DD40B, 0x655C6540, 0x47086753, 0x37584708,
46741 +0x47086540, 0x24507501, 0x367C6040, 0x2400C90F,
46742 +0x72FF6210, 0x000B2120, 0x00006063, 0x002031A1,
46743 +0x002031A0, 0x002031A2, 0x00202DC8, 0x7FFC4F22,
46744 +0xE680D19D, 0x666C6212, 0xD29C2F22, 0x67F36563,
46745 +0x420B7542, 0x7F04E404, 0x000B4F26, 0xE6800009,
46746 +0xD296666C, 0xE7006563, 0x422B7540, 0xE6806473,
46747 +0xD292666C, 0xE7006563, 0x422B7543, 0x2F866473,
46748 +0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6, 0x7FF44F22,
46749 +0xDD8CD28B, 0x72011F21, 0xDB8B1F22, 0x6AF2E840,
46750 +0x5211D18A, 0x36206612, 0xA0A78B01, 0x60610009,
46751 +0x8801C903, 0xA0A18B01, 0xD9840009, 0x420BD284,
46752 +0x55036493, 0x845C6A03, 0x30E0EE84, 0xD1818B79,
46753 +0x606C6610, 0x8B3D8801, 0x6210D17F, 0x892F2228,
46754 +0xD57EE701, 0x64522B72, 0x1442E003, 0xD57C6252,
46755 +0xE6004018, 0x21608121, 0xD17A6453, 0x6E527404,
46756 +0x60126742, 0xCB20DC78, 0x76012102, 0x3283626D,
46757 +0x25E28BFB, 0x2472DE71, 0x62E267C2, 0x1274D173,
46758 +0x604164E2, 0x2401CB01, 0xEE0066E2, 0xDC702C62,
46759 +0xEC012C62, 0x2DC2410B, 0x4C18EC01, 0x2BE22DC2,
46760 +0xD764DE6C, 0xD16C60E2, 0xCB01E202, 0x27202E02,
46761 +0x2122A02F, 0x8B2C2008, 0xE701DE68, 0xD466EC00,
46762 +0x2170D264, 0xEE012EC2, 0x612224E2, 0x2169E6FE,
46763 +0xE01E2212, 0x54F10C5C, 0x24C0E01F, 0x56F2025C,
46764 +0x26207510, 0xD75EE600, 0xEE06D45E, 0x76018456,
46765 +0x6C542700, 0x31E3616C, 0x740124C0, 0x77018FF6,
46766 +0xE494D259, 0x72012240, 0x2250E500, 0xE605720F,
46767 +0xD2562260, 0x65A36493, 0xEE01420B, 0xAF6F4E18,
46768 +0x2FA22DE2, 0xD45265F2, 0x66428553, 0x3262620D,
46769 +0xD4508907, 0x410BD150, 0xD7500009, 0xAF57E601,
46770 +0xD43A2762, 0xDD37D149, 0x65F2410B, 0xD44CEE01,
46771 +0x4E18D64C, 0x2DE2460B, 0x0009AF4A, 0x7F0C2FA2,
46772 +0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6, 0x000B69F6,
46773 +0x4F2268F6, 0x85467FF4, 0x2F01E681, 0x666C8547,
46774 +0x854881F1, 0x81F2D225, 0x67F38542, 0x854381F3,
46775 +0x81F4E40C, 0x65636053, 0x420B81F5, 0x7F0C7540,
46776 +0x000B4F26, 0x2F860009, 0x2FA62F96, 0x2FC62FB6,
46777 +0x2FE62FD6, 0x7FEC4F22, 0xE800D11A, 0xD4322F12,
46778 +0x1F416183, 0x6A13DB20, 0x4A08D630, 0xDE20E001,
46779 +0x4A00460B, 0x1F023AEC, 0x52B166B2, 0x8B013620,
46780 +0x0009A19B, 0xC9036061, 0x8B018801, 0x0009A195,
46781 +0xDE275263, 0x8B4F32E0, 0x420BD20D, 0xDE2564B3,
46782 +0xD70DD50E, 0xED01DC0B, 0x2E02E100, 0x27D02502,
46783 +0xAFE12C10, 0x00002E16, 0x001C3D9C, 0x00201F40,
46784 +0x0011779A, 0x001C3D30, 0x001D0104, 0x00202DC0,
46785 +0x00201162, 0x002031B1, 0x002031B0, 0x002031AC,
46786 +0x001C3B9C, 0x001C3500, 0x00202D98, 0x00201276,
46787 +0x001C3D00, 0x001C36F8, 0x00117708, 0x002031B4,
46788 +0x0011778C, 0x00117792, 0x00117788, 0x00201180,
46789 +0x00203188, 0x00202D88, 0x002011E4, 0x001E2130,
46790 +0x0020349C, 0x0020145E, 0x002034A8, 0x00202C80,
46791 +0x00117780, 0x0011770C, 0xC8018561, 0x5C63897A,
46792 +0x660385C2, 0x6403C903, 0x650D85C3, 0x40216053,
46793 +0xC93F4021, 0x6E034500, 0x252D322A, 0xE2106053,
46794 +0x3E23C901, 0x6D038D23, 0x4408D79D, 0x44086570,
46795 +0x440062E3, 0x25584200, 0x342C8F0F, 0x6043D299,
46796 +0x697D072D, 0x60994919, 0x201D610E, 0x60D381F6,
46797 +0x8F0C8801, 0xA00A697C, 0xD29369E3, 0x052D6043,
46798 +0x4219625D, 0x670E6029, 0x81F6207D, 0xD18F695C,
46799 +0x22286210, 0xE9FF8901, 0xEEFF699C, 0x6EEC659D,
46800 +0x8B0F35E0, 0x4C0BDC8A, 0x540364B3, 0xBF20E502,
46801 +0xD4886E03, 0x410BD188, 0xD78865E3, 0xD488ED01,
46802 +0x27D2A01E, 0x26E9EEFC, 0x81C26063, 0x97C585C3,
46803 +0x62032079, 0x450885F6, 0x6063260B, 0x81C2252B,
46804 +0x81C36053, 0xE10885C4, 0x201B4118, 0x62B281C4,
46805 +0x20E98521, 0x64B28121, 0xCB016041, 0xD4792401,
46806 +0x450BD579, 0x60B20009, 0x57F266F2, 0x2A02CB01,
46807 +0x2672AF22, 0xD26E8561, 0x8F02C802, 0xA09F64B3,
46808 +0x420B0009, 0xDC710009, 0x5E036503, 0x07CEE04C,
46809 +0x7701DD6F, 0x6CD20C76, 0x7C01D664, 0x6D602DC2,
46810 +0x89062DD8, 0xD264D463, 0xED01420B, 0xA07ED763,
46811 +0x625127D2, 0x4118E10F, 0x2219E402, 0x32404418,
46812 +0x85518B11, 0x20D9EDFC, 0x60518151, 0xCB017DE3,
46813 +0x85E12501, 0x20D9D65F, 0x460B81E1, 0x6CF264B3,
46814 +0xA06457F2, 0x6D512C72, 0x4D196DDD, 0x66DE6DD9,
46815 +0x7D012D6D, 0x610360DC, 0x88014118, 0x25118F45,
46816 +0x6462D653, 0x26427401, 0x660D85E3, 0x40216063,
46817 +0xC93F4021, 0x6D034600, 0x262D322A, 0xC8016063,
46818 +0xDC4ED14D, 0x964A8901, 0xE6002D6B, 0x0F64E010,
46819 +0xE01064DD, 0x607C07FC, 0x021D4000, 0x3240622D,
46820 +0x66038D12, 0x021D6063, 0x3270E7FF, 0xA00B8B01,
46821 +0xE01001D5, 0xE60402FC, 0x0F247201, 0x3262622C,
46822 +0x06FC8BE7, 0x4600666C, 0x01CD6063, 0x0C157101,
46823 +0x6711D13B, 0x3C406C7D, 0x62118907, 0x88FF602D,
46824 +0x21D18903, 0xE201DD37, 0x85512D20, 0x20D9EDFC,
46825 +0x60518151, 0xCB01D22F, 0x420B64B3, 0xE0102501,
46826 +0xD43102FC, 0xE001612C, 0x67F2440B, 0x85EF2702,
46827 +0x54F1D22E, 0x650D420B, 0x0009AE7E, 0x80007E03,
46828 +0x0009420B, 0x6E035403, 0xED088544, 0x20D94D18,
46829 +0x8B0330D0, 0xE501BE3D, 0x0009A007, 0xDD248541,
46830 +0x22D8620D, 0xBE348901, 0xD412E500, 0x420BD212,
46831 +0xD71265E3, 0xAE5FED01, 0x780127D2, 0xEE04618D,
46832 +0x8D0231E7, 0xAE4E7B08, 0x7F140009, 0x6EF64F26,
46833 +0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, 0x000068F6,
46834 +0x002034B8, 0x0020339C, 0x0020341C, 0x0020319C,
46835 +0x00201162, 0x00202D90, 0x00201180, 0x001E212C,
46836 +0x002034A0, 0x002034A4, 0x0020145E, 0x00202D2C,
46837 +0x002034BC, 0x002011E4, 0x002031BC, 0x002031C4,
46838 +0x002031B8, 0x002031BA, 0x00202C80, 0x002014AA,
46839 +0x00008000, 0x4F222FE6, 0x6E22D212, 0xC84060E3,
46840 +0x22E28D02, 0x0009BCFA, 0x4218E240, 0x89012E28,
46841 +0x0009BD05, 0xC81060E3, 0xD40B8905, 0x420BD20B,
46842 +0xBD040009, 0x60E30009, 0x8901C805, 0x0009BDEB,
46843 +0xC80260E3, 0x4F268902, 0x6EF6AD01, 0x000B4F26,
46844 +0x00006EF6, 0x001C3510, 0x002034B0, 0x0020145E,
46845 +0x080A0C0E, 0x00020406, 0x1A1C1E20, 0x12141618,
46846 +0x2E303234, 0x26282A2C, 0x3A3C3E40, 0x6C625648,
46847 +0x41112F26, 0xE2208F18, 0x890B3123, 0x321CD204,
46848 +0xD1026220, 0x412B312C, 0x00090009, 0x00202CAA,
46849 +0x00202C60, 0x000BE000, 0x400062F6, 0x40004000,
46850 +0x40004000, 0x40004000, 0x62F6000B, 0x40004000,
46851 +0x40004000, 0x40004000, 0x40184000, 0x62F6000B,
46852 +0x40004000, 0x40004000, 0x40004000, 0x40284000,
46853 +0x62F6000B, 0x40004000, 0x40184000, 0x000B4028,
46854 +0xC90F62F6, 0x40054005, 0x40054005, 0x62F6000B,
46855 +0x4005C907, 0x40054005, 0x62F6000B, 0x4005C903,
46856 +0x000B4005, 0xC90162F6, 0x000B4005, 0x000062F6,
46857 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46858 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46859 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46860 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46861 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46862 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46863 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46864 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46865 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46866 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46867 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46868 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46869 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46870 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46871 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46872 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46873 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46874 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46875 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46876 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46877 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46878 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46879 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46880 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46881 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46882 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46883 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46884 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46885 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46886 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46887 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46888 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46889 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46890 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46891 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46892 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46893 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46894 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46895 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46896 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46897 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46898 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46899 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46900 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46901 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46902 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46903 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46904 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46905 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46906 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46907 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46908 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46909 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46910 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46911 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46912 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46913 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46914 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46915 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46916 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46917 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46918 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46919 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46920 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46921 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46922 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46923 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46924 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46925 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46926 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46927 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46928 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46929 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46930 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46931 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46932 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46933 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46934 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46935 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46936 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46937 +0x00000000, 0x00000000, 0x00000000, 0x544F0D0A,
46938 +0x46205355, 0x00003A57, 0x206C754A, 0x32203532,
46939 +0x20373030, 0x313A3132, 0x37323A32, 0x00000000,
46940 +0x00000D0A, 0x00000043, 0x42707372, 0x3D206675,
46941 +0x554E203D, 0x202C4C4C, 0x6E49677A, 0x4E497274,
46942 +0x6D754E51, 0x0000003D, 0x61766E49, 0x2064696C,
46943 +0x72657375, 0x20726F20, 0x2079656B, 0x00214449,
46944 +0x52504545, 0x57204D4F, 0x65746972, 0x6461202C,
46945 +0x003D7264, 0x6C617620, 0x0000003D, 0x00000A0D,
46946 +0x6E6B6E55, 0x206E776F, 0x6D6D6F63, 0x3D646E61,
46947 +0x00000000, 0x000A0D52, 0x203A3051, 0x00000020,
46948 +0x203A3151, 0x00000020, 0x203A3251, 0x00000020,
46949 +0x203A3351, 0x00000020, 0x203A3451, 0x00000020,
46950 +0x61437748, 0x7262696C, 0x6F697461, 0x6620206E,
46951 +0x0A6C6961, 0x0000000D, 0x73696F4E, 0x61432065,
46952 +0x7262696C, 0x6F697461, 0x6166206E, 0x21216C69,
46953 +0x00000D0A, 0x00000072, 0x00205220, 0x00000D0A,
46954 +0x62735576, 0x7473725F, 0x00000A0D, 0x62735576,
46955 +0x7375735F, 0x646E6570, 0x00000A0D, 0x62735576,
46956 +0x7365725F, 0x000A0D6D, 0x00000042, 0x72746E49,
46957 +0x6D652051, 0x2C797470, 0x49677A20, 0x4972746E,
46958 +0x754E514E, 0x00003D6D, 0x654C7245, 0x0000006E,
46959 +0x00000049, 0x20746F4E, 0x756F6E65, 0x49206867,
46960 +0x4220514E, 0x0A0D6675, 0x00000000, 0x000000FF,
46961 +0x00020001, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
46962 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
46963 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x010E010D,
46964 +0x00020003, 0x01090108, 0x0002010A, 0x02000003,
46965 +0x02020201, 0x02040203, 0x02060205, 0x02020200,
46966 +0x02040203, 0x020C0207, 0x020E020D, 0x00FF00FF,
46967 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
46968 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
46969 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
46970 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
46971 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x010E010D,
46972 +0x00FF010F, 0x01090108, 0x010B010A, 0x020000FF,
46973 +0x02020201, 0x02040203, 0x02060205, 0x02020200,
46974 +0x02040203, 0x020C020B, 0x020E020D, 0x00FF00FF,
46975 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
46976 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00205220,
46977 +0x00000046, 0x00000059, 0x73204142, 0x003D7165,
46978 +0x49544120, 0x0000204D, 0x00000000, 0x00000000,
46979 +0x002E0209, 0x80000101, 0x000409FA, 0x00FF0400,
46980 +0x05070000, 0x02000201, 0x82050700, 0x00020002,
46981 +0x03830507, 0x07010040, 0x40020405, 0x02090000,
46982 +0x0101002E, 0x09FA8000, 0x04000004, 0x000000FF,
46983 +0x02010507, 0x07000040, 0x40028205, 0x05070000,
46984 +0x00400383, 0x04050701, 0x00004002, 0x00000000,
46985 +0x00000000, 0x07090000, 0x00000000, 0x00000000,
46986 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46987 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
46988 +0x00000000, 0x00000000, };
46989 +
46990 +const u32_t zcFwImageSize=13656;
46991 --- /dev/null
46992 +++ b/drivers/staging/otus/hal/hpfwu.c
46993 @@ -0,0 +1,1017 @@
46994 +/*
46995 + * Copyright (c) 2007-2008 Atheros Communications Inc.
46996 + *
46997 + * Permission to use, copy, modify, and/or distribute this software for any
46998 + * purpose with or without fee is hereby granted, provided that the above
46999 + * copyright notice and this permission notice appear in all copies.
47000 + *
47001 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
47002 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
47003 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
47004 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
47005 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
47006 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
47007 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
47008 + */
47009 +#include "cprecomp.h"
47010 +
47011 +const u32_t zcFwImage[] = {
47012 +0x0009000B, 0x4F222FE6, 0xDE947FFC, 0xE114D594,
47013 +0x1E13D494, 0x67521E4C, 0xD494D693, 0x37402769,
47014 +0x62528F06, 0x7201D692, 0x60602522, 0x2600C93F,
47015 +0xD7906152, 0x2512611D, 0x264B6652, 0x2562470B,
47016 +0x0009B017, 0xE60095AC, 0xC84060E2, 0x2F028F03,
47017 +0x8FF93652, 0xD4887601, 0x4E0BDE88, 0xD4880009,
47018 +0x00094E0B, 0x4E0BD487, 0x7F040009, 0xA0524F26,
47019 +0x4F226EF6, 0x410BD184, 0xD4840009, 0x0009440B,
47020 +0x450BD583, 0xD7830009, 0xD283E1FF, 0x2712611D,
47021 +0xD4825029, 0xE1FFCB01, 0x1209E501, 0x12112212,
47022 +0xE7202452, 0x4718D57E, 0x2572D27E, 0xD17EE700,
47023 +0xD67FD47E, 0xE2012270, 0x24702172, 0xD67D2620,
47024 +0x2641E4FF, 0xD57CE600, 0x666DE104, 0x76016063,
47025 +0x4000626D, 0x8FF83212, 0xD5780545, 0x2520E201,
47026 +0xD278D777, 0xE480E100, 0x22122710, 0x6613D576,
47027 +0x666D644C, 0x76046763, 0x375C626D, 0x8FF83243,
47028 +0xD5722712, 0xD273D772, 0xE400E101, 0x27102511,
47029 +0x000B4F26, 0x7FCC2242, 0xD170D56F, 0xD271DB70,
47030 +0x1F51D471, 0xD6717508, 0x1F12D771, 0x1F55710C,
47031 +0x1FB975FC, 0x72041F2A, 0x1F13EB10, 0x1F561F44,
47032 +0x1F781F67, 0xD86B1F2B, 0xDD6CD96B, 0xDC6CEA00,
47033 +0xD26DDE6C, 0x89003A22, 0xD15D7A01, 0x88016010,
47034 +0x56F88B03, 0x4218E201, 0xD1682622, 0x0009410B,
47035 +0x440BD467, 0xD5670009, 0x0009450B, 0x6010D150,
47036 +0x8B108801, 0xE650D14F, 0x46186212, 0x8B083266,
47037 +0x56F9D14B, 0x2120E200, 0xCB016062, 0x2602A003,
47038 +0x72012710, 0x60822122, 0x89098801, 0xE2C8D15A,
47039 +0x622C6612, 0x89033626, 0x6010D158, 0x8BC88801,
47040 +0x51F66792, 0x217252F5, 0xD6555191, 0x55FA2212,
47041 +0x52FB6462, 0x55612542, 0x2252E400, 0x61436643,
47042 +0x05DE6013, 0x36CC4608, 0x07DE2652, 0xC9036071,
47043 +0x8B028801, 0x720162E2, 0x74012E22, 0x36B3664C,
47044 +0x71048FEE, 0x66C2D147, 0x45286512, 0x265B4518,
47045 +0x60822C62, 0x89018801, 0x0009A168, 0x6272D742,
47046 +0x8B132228, 0xD42BD741, 0x6772D541, 0x51536242,
47047 +0x312C327C, 0x24222228, 0x15138D05, 0x6262D63D,
47048 +0xB1627201, 0xD6232622, 0x2622E200, 0x52916692,
47049 +0x8B013620, 0x0009A144, 0x6061A06E, 0x001C001C,
47050 +0x001D4020, 0x0000B38E, 0xFFFF0000, 0x12340000,
47051 +0x001E1015, 0x00201274, 0x002039F4, 0x002018A2,
47052 +0x00203A00, 0x00203A18, 0x00201860, 0x0020196C,
47053 +0x00201288, 0x001C3510, 0x001C3624, 0x001E212C,
47054 +0x002038F4, 0x0020348C, 0x002038FC, 0x00203908,
47055 +0x00203914, 0x00203970, 0x00203974, 0x0020391C,
47056 +0x0020391D, 0x00203920, 0x00117700, 0x0020398C,
47057 +0x0020398A, 0x002034F0, 0x00117710, 0x001C3D30,
47058 +0x001C36F8, 0x00117734, 0x001C3684, 0x001C3D00,
47059 +0x001C1000, 0x001C1028, 0x00203504, 0x00203924,
47060 +0x00117600, 0x00117740, 0x7FFFFFFF, 0x00201730,
47061 +0x0020332A, 0x00202334, 0x00203DA4, 0x00203972,
47062 +0x002034FC, 0x00203964, 0x001C3D2C, 0x001C36B0,
47063 +0x00203494, 0x0011775C, 0x8801C90F, 0xA0CF8901,
47064 +0xD1960009, 0x36206212, 0xD4958904, 0x2421E200,
47065 +0x2162A0CC, 0x6211D193, 0x89012228, 0x0009A0C3,
47066 +0xE202D78F, 0x75016571, 0x3123615D, 0x27518D02,
47067 +0x0009A0BC, 0xD28C57F2, 0x62226072, 0x40094019,
47068 +0xC90F4009, 0x8F19880A, 0x52F31F2C, 0x40196022,
47069 +0x40094009, 0x8808C90F, 0xA0A78901, 0x60630009,
47070 +0xCB0154F7, 0xD27E55F2, 0xE7012402, 0xD47FE100,
47071 +0x22112572, 0x72016242, 0x2422A098, 0x8B3F8805,
47072 +0x602252F3, 0x40094019, 0xC90F4009, 0x8B168802,
47073 +0xE4FFD577, 0x644D6752, 0x8B102748, 0x6272D775,
47074 +0x8B0C3260, 0x51F255F7, 0xD26DE701, 0x21722562,
47075 +0xD571E100, 0x64522211, 0xA0777401, 0x52F32542,
47076 +0x40196022, 0x40094009, 0x8805C90F, 0x31B38B6E,
47077 +0xD26A8B6C, 0x672254F4, 0x7701D569, 0x61422272,
47078 +0x1F1CE640, 0x46182159, 0x8B033160, 0x6262D665,
47079 +0x26227201, 0xE200D65A, 0x2621B067, 0x0009A056,
47080 +0x3123E220, 0x88038B52, 0x52F38B1E, 0x40196022,
47081 +0x40094009, 0x8803C90F, 0xD25B8B16, 0x672254F4,
47082 +0x7701D557, 0x61422272, 0x1F1CE640, 0x46182159,
47083 +0x8B033160, 0x6262D655, 0x26227201, 0xE200D648,
47084 +0x2621B043, 0x0009A010, 0xD452D551, 0xD2446752,
47085 +0xE1007701, 0x25723A46, 0x22118F06, 0xEA00D64E,
47086 +0x72016262, 0x2622B031, 0x2FB2D54C, 0x95736652,
47087 +0xD44A5BF1, 0x36205241, 0x60618910, 0x8B01C803,
47088 +0x2B22E201, 0x8FF54510, 0x57F15664, 0x6272E1F0,
47089 +0x41284118, 0x2722221B, 0x6BF2A008, 0x6BF2A006,
47090 +0xE200D62F, 0xD12F2621, 0x2121E200, 0xD13CE201,
47091 +0x66122822, 0x8B012668, 0x0009AE2B, 0x450BD539,
47092 +0xD1390009, 0xAE24E600, 0x2F862160, 0x2FA62F96,
47093 +0x2FC62FB6, 0x2FE62FD6, 0x7FF44F22, 0xDE34D133,
47094 +0x54116212, 0x1F4167E2, 0x2F22D432, 0xD5321F72,
47095 +0xD2326743, 0x58417794, 0x69425A42, 0x5B166C72,
47096 +0x60526D22, 0xCB20E600, 0xE5402502, 0x626D7601,
47097 +0x8BFB3253, 0x55F162F2, 0x11512122, 0xD62855F2,
47098 +0x14812E52, 0x249214A2, 0x27C2D426, 0x26D211B6,
47099 +0xDA256742, 0xE801D925, 0x490B2A72, 0xE2011A8C,
47100 +0x1A2C4218, 0x4F267F0C, 0x6DF66EF6, 0x6BF66CF6,
47101 +0x69F66AF6, 0x68F6000B, 0x000007D1, 0x00203984,
47102 +0x00203988, 0x0020398E, 0x001C3DC0, 0x0011772C,
47103 +0x001C3B88, 0x0020396C, 0x0011773C, 0x00117744,
47104 +0x0000F000, 0x00117764, 0x00117748, 0x00117768,
47105 +0x0011776C, 0x01FFFFFF, 0x0011774C, 0x002034FC,
47106 +0x00203DA4, 0x002024F8, 0x00203972, 0x001C3B9C,
47107 +0x001C3D98, 0x001C3700, 0x001C3500, 0x001C5960,
47108 +0x001C8960, 0x00203504, 0x001C3D00, 0x0020160C,
47109 +0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6,
47110 +0xDE957FAC, 0x61E0E014, 0x0F14D494, 0x710161E3,
47111 +0xE0186210, 0xD2920F24, 0x0009420B, 0x450BD591,
47112 +0x20080009, 0x8F126D03, 0xD28F1F07, 0x6720D48F,
47113 +0x657CDD8F, 0x470BD78F, 0xD18F0009, 0x619C6910,
47114 +0x46086613, 0x36184608, 0x3D6C4608, 0xE0181FD7,
47115 +0xE58004FC, 0x604C66E2, 0x3050655C, 0x2D628F15,
47116 +0x01FCE014, 0xDE85E500, 0x641CA008, 0x6753655D,
47117 +0x607037EC, 0x39DC6953, 0x80947501, 0x3243625D,
47118 +0xD67F8BF4, 0xA34EE200, 0x20082621, 0xE0148B13,
47119 +0xE40001FC, 0xA009DE79, 0x644D671C, 0x35EC6543,
47120 +0x69436652, 0x39DC6262, 0x74041921, 0x3273624D,
47121 +0xA3388BF3, 0x88012D10, 0xE0148B17, 0xE70001FC,
47122 +0x6D1C2D70, 0xDE6D1FD4, 0x32D3627D, 0xA32A8B01,
47123 +0x677D0009, 0x667365E3, 0x61737504, 0x315C36EC,
47124 +0x69126462, 0xAFEF7708, 0x88042492, 0xE0148B18,
47125 +0xE40001FC, 0x671C2D40, 0x624DDE60, 0x8B013273,
47126 +0x0009A311, 0x6943644D, 0x39EC62E3, 0x72046592,
47127 +0x3D2C6D43, 0x615266D2, 0x21697408, 0x2512AFED,
47128 +0x8B188805, 0x01FCE014, 0x2D40E400, 0xDE53671C,
47129 +0x3273624D, 0xA2F68B01, 0x644D0009, 0x62E36943,
47130 +0x659239EC, 0x6D437204, 0x66D23D2C, 0x74086152,
47131 +0xAFED216B, 0x88312512, 0xD44A8B3A, 0x6146D94A,
47132 +0x75046543, 0x67566442, 0x6E531F48, 0x65527E04,
47133 +0x7EE462E2, 0x7E0464E2, 0x6EE21FE9, 0x5EF929E0,
47134 +0x7E04D942, 0x1FEA60E2, 0x2900C901, 0xD9406EE2,
47135 +0x29E04E09, 0x2F562F26, 0x56FAD93E, 0x6513490B,
47136 +0xD13D7F08, 0xE71C6E0D, 0x1DE12D70, 0xDE3B6912,
47137 +0x64E21D92, 0x1D43D13A, 0xD23A6512, 0x67221D54,
47138 +0x1D75D239, 0x1D666622, 0x6262D638, 0x1D27A2AB,
47139 +0x8B398830, 0x6596D92B, 0x67926696, 0x61967904,
47140 +0x74E46493, 0x6E436992, 0x1F9B7E04, 0x1FEC6442,
47141 +0xD9256EE2, 0x5EFC29E0, 0x7E04D924, 0x1FED60E2,
47142 +0x2900C901, 0xD9226EE2, 0x29E04E09, 0x59FC7FFC,
47143 +0xDE272F92, 0x2F164E0B, 0xD41F7F08, 0xE21C610D,
47144 +0x1D112D20, 0xD2206442, 0xD41C1D42, 0x1D536542,
47145 +0x6752D51B, 0xD71B1D74, 0x1D156172, 0x1D666622,
47146 +0x6262D61A, 0x1D27A26F, 0x8B358833, 0x490BD919,
47147 +0xA268EE00, 0x00002DE0, 0x00117800, 0x00203A1C,
47148 +0x002018A2, 0x00202AAC, 0x0020390E, 0x00203A20,
47149 +0x00203534, 0x002018EE, 0x0020390D, 0x00117804,
47150 +0x0020398C, 0x00117810, 0x00203909, 0x0020390A,
47151 +0x0020390B, 0x00200F64, 0x001C5864, 0x001C6864,
47152 +0x001C7864, 0x001C59BC, 0x001C69BC, 0x001C79BC,
47153 +0x00200FBC, 0x00200FB8, 0x89018828, 0x0009A0C0,
47154 +0xE643DEB5, 0x326662E1, 0x1FEE8F02, 0x2E21E240,
47155 +0x622D62E1, 0x8B013267, 0x0009A0AA, 0xE50185E1,
47156 +0x8B013056, 0x0009A0A4, 0x2D10E101, 0x64E1B225,
47157 +0xE64357FE, 0x652D6271, 0x89443567, 0x3563E640,
47158 +0xE6008B05, 0x0F65E040, 0xA00FE11A, 0x615372C0,
47159 +0x41214121, 0x41214121, 0x45214121, 0x45214521,
47160 +0xC9036053, 0xE0406603, 0x71180F65, 0x2209E007,
47161 +0x0F25E03C, 0xE044641D, 0xB2A365F3, 0xE33C0F46,
47162 +0x853233FC, 0x620DDE95, 0x42086031, 0x6023610D,
47163 +0x1323E944, 0x06FE4108, 0xE00F39FC, 0x13144E0B,
47164 +0x67075D91, 0x60D32679, 0x0F6654FE, 0x51928542,
47165 +0x600D4E0B, 0x60D3260B, 0x0F666492, 0x65F3B237,
47166 +0x696156FE, 0xE640659D, 0x89383563, 0xD78359FE,
47167 +0x79066591, 0xC9036053, 0x40004008, 0x61036203,
47168 +0x0F26E050, 0x470BE0FF, 0x6C07600C, 0x6603605D,
47169 +0x46214621, 0x46214621, 0x42006263, 0x4200326C,
47170 +0x40214021, 0x4008C903, 0x6D2D30FC, 0xE8006A03,
47171 +0xB25765F3, 0x6EA264D3, 0x2EC9E050, 0x66942AE2,
47172 +0xD76E01FE, 0x606C470B, 0x2AE22E0B, 0x64D365F3,
47173 +0x7801B1FD, 0xEE06628D, 0x8FE932E3, 0x5EFE7D01,
47174 +0x61E1E400, 0x410085E1, 0x66E3310C, 0x760C711B,
47175 +0xE70465F3, 0x68667401, 0x3A736A4D, 0x8FF92582,
47176 +0x65F37504, 0x641DB1E3, 0x64E1B1A4, 0x0009A17B,
47177 +0xD45B56F7, 0xEC01D25B, 0x26C0420B, 0x0009A173,
47178 +0x06FCE018, 0x8829606C, 0x58F78B08, 0xE400D252,
47179 +0x66222840, 0x646DB171, 0x0009A165, 0x666CE681,
47180 +0x89013060, 0x0009A0AC, 0xD550D14F, 0x62126A56,
47181 +0x212232AC, 0x54116C56, 0x34CC6253, 0x64521141,
47182 +0x72085812, 0xD44A384C, 0x68221182, 0x5A136C42,
47183 +0x3ACC3C8C, 0x11A324C2, 0x6C2272EC, 0x72105814,
47184 +0x118438CC, 0x5A156822, 0x11A53A8C, 0x6A227210,
47185 +0xD6405816, 0x118638AC, 0x52176C62, 0x112732CC,
47186 +0x5A185861, 0x11A83A8C, 0x5C195A62, 0x11C93CAC,
47187 +0x521A5C63, 0x112A32CC, 0x5A1B5864, 0x11AB3A8C,
47188 +0x5C1C5A65, 0x11CC3CAC, 0x521D5C66, 0x112D32CC,
47189 +0x5A1E5867, 0x11AE3A8C, 0x561F5A68, 0x36ACE840,
47190 +0x116FDA2D, 0x6CA2381C, 0x7A946682, 0x286236CC,
47191 +0x5C8162A2, 0x18C13C2C, 0x62A27A44, 0x362C5682,
47192 +0xD6261862, 0x5A856262, 0x3A2C4229, 0x760418A5,
47193 +0x56866262, 0x362C4229, 0x56F71866, 0x2620E238,
47194 +0x16C15C81, 0x16226212, 0xE2005C11, 0x551216C3,
47195 +0x55151654, 0x55131655, 0x55161656, 0x55821657,
47196 +0x65821658, 0x55141659, 0x5584165A, 0x5583165B,
47197 +0x5585165C, 0x5586165D, 0x1821165E, 0x11212122,
47198 +0x11251122, 0x11261123, 0x28221822, 0x18241124,
47199 +0x18251823, 0x1826A0C7, 0x00117804, 0x002033E8,
47200 +0x00203A40, 0x002018A2, 0x00203494, 0x001C36A0,
47201 +0x002034F0, 0x001C3CA0, 0x001C36F4, 0x001C3B88,
47202 +0x666CE682, 0x8B203060, 0xEA2456F7, 0x26A0D194,
47203 +0x16C15C17, 0x16225218, 0x16835819, 0x16A45A1A,
47204 +0x16C55C1B, 0x1626521C, 0xE200581D, 0x551E1687,
47205 +0x551F1658, 0x11271659, 0x11291128, 0x112B112A,
47206 +0x112D112C, 0xA08E112E, 0xE683112F, 0x3060666C,
47207 +0x52F78B0B, 0xEA00D883, 0x658222A0, 0x7804DC82,
47208 +0x62822C52, 0xA07ED681, 0xE6902620, 0x3060666C,
47209 +0xDA7F8B06, 0x00094A0B, 0xE20056F7, 0x2620A073,
47210 +0x666CE691, 0x8B103060, 0x6222D276, 0x2228622C,
47211 +0xD2788904, 0x0009420B, 0x0009A003, 0x420BD276,
47212 +0x56F70009, 0xA05EE200, 0xE6922620, 0x3060666C,
47213 +0xE0188951, 0xE6B00BFC, 0x666C62BC, 0x8B2A3260,
47214 +0x02FCE014, 0x682CEA00, 0x62ADE904, 0x894A3283,
47215 +0x6AADDD64, 0x3CDC6CA3, 0x7D046EC2, 0xDB68D467,
47216 +0x32DC62A3, 0x4B0BDC67, 0x4C0B6D22, 0xD46664E3,
47217 +0x00094B0B, 0x64D34C0B, 0x4B0BD464, 0xE6000009,
47218 +0x666D6BE3, 0x76013B6C, 0x3293626D, 0x8FF72BD0,
47219 +0xAFDA4D19, 0xE6B57A08, 0x3260666C, 0xD45C8B13,
47220 +0x4B0BDB57, 0xD25B0009, 0x6022DB5B, 0xCB20E6FF,
47221 +0x2202666D, 0xDB592B62, 0xE014E200, 0x56F72B20,
47222 +0xA01002FC, 0xD4562620, 0x6542D256, 0x420BD456,
47223 +0xA0080009, 0xDB520009, 0x52B1E600, 0x622CDB53,
47224 +0x52F72B21, 0x7F542260, 0x6EF64F26, 0x6CF66DF6,
47225 +0x6AF66BF6, 0x000B69F6, 0x4F2268F6, 0xE240614D,
47226 +0x89143123, 0x3127E21F, 0x8B09D749, 0xD449614D,
47227 +0xE00171E0, 0x5671440B, 0x26596507, 0x1761A007,
47228 +0xE001D444, 0x6672440B, 0x26596507, 0x4F262762,
47229 +0x0009000B, 0x614D4F22, 0x3123E240, 0xE21F8912,
47230 +0xD73B3127, 0x614D8B08, 0x5671D23A, 0x420B71E0,
47231 +0x260BE001, 0x1761A006, 0x6672D236, 0xE001420B,
47232 +0x2762260B, 0x000B4F26, 0xE6400009, 0x46284618,
47233 +0x6252D531, 0x89FC2268, 0x0009000B, 0x4618E680,
47234 +0xD52D4628, 0x22686252, 0x000B89FC, 0xA0010009,
47235 +0x7201E200, 0x8BFC3242, 0x0009000B, 0x4618E680,
47236 +0xD5264628, 0x22686252, 0x000B8BFC, 0x2FE60009,
47237 +0x7FFC4F22, 0xBFF16E53, 0x61E22F42, 0xE280D620,
47238 +0x54E11615, 0x16464218, 0x422855E2, 0x57E31657,
47239 +0x16786EF2, 0x26E22E2B, 0x4F267F04, 0x6EF6AFCE,
47240 +0x00203494, 0x00117804, 0x002038F4, 0x00203908,
47241 +0x0020050A, 0x00201008, 0x0020102E, 0x00203A58,
47242 +0x002018A2, 0x002018E6, 0x00203A6C, 0x00203A74,
47243 +0x00203A78, 0x001C3500, 0x001C1000, 0x0020398A,
47244 +0x00117800, 0x002018EE, 0x00203A8C, 0x00203990,
47245 +0x001C3704, 0x002033E8, 0x001C373C, 0x001C3700,
47246 +0x001C370C, 0x2FD62FC6, 0x4F222FE6, 0x6C53DD10,
47247 +0x6E43BFA4, 0x2DE2BF89, 0x0009BFA0, 0x2C1251D5,
47248 +0x1C4154D6, 0x1C5255D7, 0x1C6356D8, 0x6EF64F26,
47249 +0x000B6DF6, 0x61636CF6, 0xA004E600, 0x62564109,
47250 +0x24227601, 0x36127404, 0x000B8BF9, 0x00000009,
47251 +0x001C370C, 0x0009A16E, 0x2FE62FD6, 0xDD944F22,
47252 +0xA0049EB2, 0xD4930009, 0x420BD293, 0x62D265D2,
47253 +0x8BF822E8, 0x0009A004, 0xD28FD490, 0x55D1420B,
47254 +0x22E852D1, 0xA0048BF8, 0xD48D0009, 0x420BD28A,
47255 +0x52D255D2, 0x8BF822E8, 0x0009A004, 0xD286D489,
47256 +0x55D3420B, 0x22E852D3, 0xA0048BF8, 0xD4860009,
47257 +0x420BD281, 0x52D455D4, 0x8BF822E8, 0x6EF64F26,
47258 +0x6DF6000B, 0x2FD62FC6, 0x4F222FE6, 0x6E636C73,
47259 +0x6D53B01A, 0x64D357F4, 0xB05F65E3, 0xB07566C3,
47260 +0xB0A40009, 0xB0A80009, 0xB0AC0009, 0xB0AC0009,
47261 +0xB0AF0009, 0xB03154F5, 0x6CCD6C03, 0x4F2660C3,
47262 +0x6DF66EF6, 0x6CF6000B, 0x3412D170, 0xD6700529,
47263 +0x2650D770, 0x2742000B, 0x0009A018, 0x2FD62FC6,
47264 +0x4F222FE6, 0x6E636C73, 0x6D53BFEE, 0x64D357F4,
47265 +0xB03365E3, 0xB08D66C3, 0xB00F54F5, 0x6CCD6C03,
47266 +0x4F2660C3, 0x6DF66EF6, 0x6CF6000B, 0xE503D162,
47267 +0xD763D462, 0x21524518, 0x2472000B, 0xD45FD15E,
47268 +0x2162E600, 0x2462000B, 0xBF734F22, 0xBF73E40A,
47269 +0xD25C0009, 0x4118E104, 0xE40AE500, 0xBF692212,
47270 +0xD7592252, 0xCB206072, 0x000B4F26, 0x4F222702,
47271 +0x410BD156, 0xD556E400, 0x4F26452B, 0xD1552FE6,
47272 +0x66126E63, 0x92104418, 0x44084528, 0x45002629,
47273 +0x265B4408, 0x264B4400, 0x21624708, 0xD14E4708,
47274 +0x217227EB, 0x6EF6000B, 0x1FFF03F0, 0x4F222FE6,
47275 +0xE101DE4A, 0xBF3DE40A, 0x67E32E12, 0xE500776C,
47276 +0xE204E130, 0x2752E40A, 0x27522752, 0x27522752,
47277 +0x27522752, 0x27522752, 0x27522752, 0x27522752,
47278 +0x27522752, 0x27522752, 0x27522752, 0x27222712,
47279 +0x27522752, 0x27522752, 0x27522752, 0x27522752,
47280 +0x175ABF18, 0x2E62E600, 0x000B4F26, 0xD2346EF6,
47281 +0xE441E101, 0x000B2212, 0xD1322242, 0xE605D432,
47282 +0x000B2162, 0x000B2462, 0xD2300009, 0xE40AE601,
47283 +0x2262AF00, 0x2FC62FB6, 0x2FE62FD6, 0x7FFC4F22,
47284 +0x6C43DB2B, 0xED0060B2, 0x2B02CB03, 0xC90360B2,
47285 +0x6E03A008, 0x89073DC2, 0xE46460B2, 0xB07CC903,
47286 +0x7D016E03, 0x8BF52EE8, 0x8F043DC2, 0xD4212FE1,
47287 +0x460BD621, 0x62F10009, 0x6023622D, 0x89FFC801,
47288 +0x7F046023, 0x6EF64F26, 0x6CF66DF6, 0x6BF6000B,
47289 +0x001C3B88, 0x00203AA0, 0x002018EE, 0x00203AA8,
47290 +0x00203AB0, 0x00203AB8, 0x00203AC0, 0x0025E720,
47291 +0x00203DA0, 0x002038F8, 0x001C5968, 0x001C3B40,
47292 +0x000F8000, 0x001D4004, 0x001C3500, 0x002015E0,
47293 +0x0020160C, 0x001C5814, 0x001C59D0, 0x001C5830,
47294 +0x001C6268, 0x001C59A4, 0x001C639C, 0x001C581C,
47295 +0x001C5860, 0x00203AC8, 0x002018A2, 0x8F014411,
47296 +0x6043604B, 0x0009000B, 0x5651D52B, 0x46286052,
47297 +0x306C000B, 0x2FC62FB6, 0x2FE62FD6, 0x4F124F22,
47298 +0xBFF14F02, 0x6B036E43, 0xDD25DC24, 0x0009BFEC,
47299 +0x3C0530B8, 0x4609060A, 0x46014609, 0x020A3D65,
47300 +0x42094209, 0x32E24209, 0x4F068BF0, 0x4F264F16,
47301 +0x6DF66EF6, 0x000B6CF6, 0x2FC66BF6, 0x2FE62FD6,
47302 +0x4F124F22, 0xBFCF4F02, 0x6C036E43, 0xBFCBDD13,
47303 +0x30C80009, 0x060A3D05, 0x46094609, 0x36E24601,
47304 +0x4F068BF5, 0x4F264F16, 0x6DF66EF6, 0x6CF6000B,
47305 +0x4F222FE6, 0xE102DE0B, 0xE403E500, 0xBFB92E12,
47306 +0xE6062E52, 0xE7004618, 0x2E62E403, 0x4F262E72,
47307 +0x6EF6AFB0, 0x0009000B, 0x001C1040, 0xCCCCCCCD,
47308 +0x10624DD3, 0x001D4004, 0x2F962F86, 0x2FB62FA6,
47309 +0x2FD62FC6, 0x4F222FE6, 0xE5007F98, 0x6453E710,
47310 +0x6B534728, 0xEE1ADCBC, 0x6153655D, 0x315C4108,
47311 +0x75014108, 0x6043317C, 0x0F16665D, 0xED0060B3,
47312 +0x21B136E3, 0x81128111, 0x11D28113, 0x11D411D3,
47313 +0x74048FEA, 0xD8B167F2, 0x1871D9B1, 0x58F12872,
47314 +0x1981D1B0, 0x59F22982, 0x5DF45AF3, 0x54F65EF5,
47315 +0x21921191, 0x11A211A3, 0x11D411D5, 0x11E611E7,
47316 +0x11481149, 0xDAA855F7, 0x57F8EE00, 0x52F9DDA7,
47317 +0x64E3D6A7, 0x2A521A51, 0xD8A7D9A6, 0x2D729AD5,
47318 +0x6EED2622, 0x4D086DE3, 0x3DEC61E3, 0x4D084108,
47319 +0x3D9C31EC, 0x410860B3, 0x81D12DB1, 0x4108E050,
47320 +0x4008E7B7, 0x677C4108, 0x60B381D2, 0xE200318C,
47321 +0x81D33472, 0x1D131DD2, 0x8D01D493, 0xD4901D24,
47322 +0xB0B365D3, 0x64ED7E01, 0x8BDA34A2, 0x2FD2DA8C,
47323 +0xDD9268A2, 0x2D824829, 0x7DFC64A2, 0xD287694D,
47324 +0x6E222D92, 0x7D0C4E29, 0x68222DE2, 0x618D6AD3,
47325 +0x2A16D784, 0xD48A6D72, 0x24D2D583, 0xD6895E72,
47326 +0x517414E2, 0x1414EE00, 0xD1875876, 0x59781486,
47327 +0x1498E710, 0x65E36252, 0x26E2142A, 0xE60064E3,
47328 +0x6843644D, 0x384C4808, 0x381C4808, 0x0C866053,
47329 +0x09CE28B1, 0x819160B3, 0x0ACE6053, 0x81A26043,
47330 +0x0DCE6053, 0x81D360B3, 0x08CE6053, 0x18827401,
47331 +0x624D09CE, 0x0ACE19E3, 0x1A643273, 0x75048FE0,
47332 +0xE003D96A, 0x40186C92, 0x6D922CB1, 0x81D1DA6F,
47333 +0x6E92E050, 0x81E24008, 0x60B36192, 0x64928113,
47334 +0x1442E600, 0xD4696792, 0x689217A3, 0x1864E1FF,
47335 +0x6563E703, 0x364C4608, 0x26127501, 0x3673665D,
47336 +0xDC5B8BF8, 0x6DC2E003, 0x2DB14018, 0xD2606EC2,
47337 +0x61C281E1, 0x1112EE00, 0xE02464C2, 0x65C21423,
47338 +0x15E4D45B, 0xE58067C2, 0x68C28172, 0x818366E3,
47339 +0x666D655C, 0x76046963, 0x394C6A6D, 0x8FF83A53,
47340 +0xDB5429E2, 0x24B2DC54, 0x24C27404, 0x4F267F68,
47341 +0x6DF66EF6, 0x6BF66CF6, 0x69F66AF6, 0x68F6000B,
47342 +0x60116142, 0x8F03C803, 0xD23DE500, 0x8B063420,
47343 +0xC9036011, 0x8B068802, 0x3420D239, 0x56128B03,
47344 +0x52646513, 0x000B2422, 0x01136053, 0x2FE62FD6,
47345 +0x7FEC4F22, 0x62536E53, 0x6D43E550, 0x4508E400,
47346 +0xE101A001, 0x60435224, 0x81212211, 0x60538123,
47347 +0x56E28122, 0x8BF53620, 0x16E4D238, 0xE61464F3,
47348 +0x65E3420B, 0xE4FC65E1, 0x2E512549, 0x65F361F1,
47349 +0x2F112149, 0xD13154D1, 0xE614410B, 0x607157D1,
47350 +0x2701CB01, 0x7F141DE1, 0x6EF64F26, 0x6DF6000B,
47351 +0x2FE62FD6, 0x7FEC4F22, 0x66536E53, 0x6D43E5FC,
47352 +0x20596061, 0x2601CB01, 0x326052E2, 0x12E48B06,
47353 +0x31E051E2, 0x52D18B04, 0x1E22A002, 0x5664AFF0,
47354 +0x64F3D21E, 0x420BE614, 0x67E165E3, 0x2719E1FC,
47355 +0x67F12E71, 0x271954D1, 0x65F3D118, 0x410BE614,
47356 +0x52D12F71, 0xCB016021, 0x1DE12201, 0x4F267F14,
47357 +0x000B6EF6, 0x00006DF6, 0x00203924, 0x002034F4,
47358 +0x002034FC, 0x00203504, 0x0020352C, 0x00203910,
47359 +0x00203918, 0x00100208, 0x001017C0, 0x001E210C,
47360 +0x001C3D00, 0x00203964, 0x001000C8, 0x00117880,
47361 +0x00117780, 0x00040020, 0x0026C401, 0x00200ED6,
47362 +0x4F222FE6, 0xDE42624C, 0x42004208, 0x3E2CA005,
47363 +0xD4405252, 0xBF695624, 0x65E22E62, 0x352052E1,
47364 +0xD63D8BF6, 0x4F262622, 0x6EF6000B, 0x2FC62FB6,
47365 +0x2FE62FD6, 0xDC394F22, 0x52C1DB39, 0x362066C2,
47366 +0x6061891C, 0x8801C903, 0xDE348918, 0xBF37DD35,
47367 +0x650364E3, 0x66B28503, 0x3262620D, 0xD4328907,
47368 +0x0009BF76, 0x4D0BD431, 0xAFE60009, 0xBF3D0009,
47369 +0xD42F64E3, 0x00094D0B, 0x0009AFDF, 0x2262D22D,
47370 +0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, 0x2FD62FC6,
47371 +0x4F222FE6, 0xDD29DC28, 0x6E4360C2, 0x04DE4008,
47372 +0xE614D127, 0x65E3410B, 0xD127D726, 0x55E227E2,
47373 +0x35E05254, 0x21228F04, 0x400860C2, 0x122202DE,
47374 +0x605365C2, 0x75014008, 0x0DE606DE, 0xC90F6053,
47375 +0x60632C02, 0x6EF64F26, 0x000B6DF6, 0x85436CF6,
47376 +0x650D5643, 0x622D6262, 0x35277204, 0xE1008F0C,
47377 +0x2268960C, 0xD6158B03, 0x72015261, 0xD6131621,
47378 +0x6262E101, 0x26227201, 0x6013000B, 0x000001FF,
47379 +0x00203504, 0x002034FC, 0x001C3D00, 0x0020352C,
47380 +0x002038F4, 0x002018A2, 0x002034F4, 0x00203AF0,
47381 +0x00203AF4, 0x001C3D28, 0x00203964, 0x00203924,
47382 +0x00200ED6, 0x00203968, 0x0020396C, 0x00117754,
47383 +0x2FC62FB6, 0x2FE62FD6, 0x7FF84F22, 0x6022D237,
47384 +0x8D58C803, 0xDE362F01, 0xDB37DC36, 0x66C252C1,
47385 +0x892F3620, 0xC9036061, 0x892B8801, 0xD233DD31,
47386 +0x64D3420B, 0x1F016503, 0x880160B1, 0xD2308B04,
47387 +0x64D3420B, 0x0009AFEA, 0x85615653, 0x8904C820,
47388 +0xE050D72C, 0x7201027E, 0xD22B0726, 0x6453420B,
47389 +0x89072008, 0x55F1D126, 0x64D3410B, 0xE601D727,
47390 +0x2762AFD4, 0x55F1D226, 0x64E3420B, 0xE601D125,
47391 +0x2162AFCC, 0xDD25DE24, 0xDC26DB25, 0x66D252D1,
47392 +0x89183620, 0xC9036061, 0x89148801, 0xD117D41F,
47393 +0x0009410B, 0x36E05603, 0x65038F04, 0x2B20E201,
47394 +0x2C52AFEC, 0xD712D41C, 0x0009470B, 0xE601D115,
47395 +0xAFE34618, 0x60F12162, 0x8907C804, 0x7F08D217,
47396 +0x6EF64F26, 0x6CF66DF6, 0x6BF6422B, 0x4F267F08,
47397 +0x6DF66EF6, 0x000B6CF6, 0x00006BF6, 0x001E2100,
47398 +0x00203504, 0x002034FC, 0x0020398C, 0x002014A0,
47399 +0x002014CC, 0x00203494, 0x002016BE, 0x001E212C,
47400 +0x00201530, 0x001C3D30, 0x00117880, 0x002034F4,
47401 +0x00203914, 0x00203910, 0x0020352C, 0x00200610,
47402 +0xE601D203, 0x1265D503, 0x000B2252, 0x00001266,
47403 +0x001C1010, 0x0000C34F, 0x0009000B, 0x2FD62FC6,
47404 +0x4F222FE6, 0x6D436C53, 0xEE00A004, 0x7E0164D4,
47405 +0x644CBFF2, 0x8BF93EC2, 0x6EF64F26, 0x000B6DF6,
47406 +0xE5006CF6, 0x6643A002, 0x76017501, 0x22286260,
47407 +0xAFE38BFA, 0x2FE60009, 0x75076253, 0xE1086753,
47408 +0x6043EE0A, 0x4409C90F, 0x650330E2, 0x8D014409,
47409 +0xE630E637, 0x4110365C, 0x8FF22760, 0xE00077FF,
47410 +0x000B8028, 0x000B6EF6, 0x000BE000, 0x2FE6E000,
47411 +0x7FEC4F22, 0x6E436253, 0xBFDC65F3, 0xBFD06423,
47412 +0xBFCE64E3, 0xD40364F3, 0x0009BFCB, 0x4F267F14,
47413 +0x6EF6000B, 0x00203AF8, 0xE4FDD29F, 0xD79F6122,
47414 +0x22122149, 0x74016022, 0x2202CB01, 0xD59C6622,
47415 +0x22622649, 0xC8406070, 0x60528902, 0x2502CB04,
47416 +0xE1F76452, 0x25422419, 0xE7016052, 0x2502CB40,
47417 +0xE6026052, 0x2502C9CF, 0x47186052, 0x2502CB10,
47418 +0xCB036052, 0x15622502, 0x1573000B, 0xD78ED58D,
47419 +0xD48FD28E, 0xE600E100, 0x27112511, 0xAFCB2210,
47420 +0x664C2461, 0x4600D28B, 0x6060362C, 0x000BCB10,
47421 +0x654C2600, 0x4500D287, 0x6650352C, 0x2619E1EF,
47422 +0x2560000B, 0xD284664C, 0x362C4600, 0xCB106060,
47423 +0x2600000B, 0xD280654C, 0x352C4500, 0xE1EF6650,
47424 +0x000B2619, 0x664C2560, 0x4600D27A, 0x6060362C,
47425 +0x000BCB08, 0x654C2600, 0x4500D276, 0x6650352C,
47426 +0x2619E1F7, 0x2560000B, 0xD273664C, 0x362C4600,
47427 +0xCB086060, 0x2600000B, 0xD26F654C, 0x352C4500,
47428 +0xE1F76650, 0x000B2619, 0x624C2560, 0x4200D669,
47429 +0x6020326C, 0x4021C908, 0x40214021, 0x600C000B,
47430 +0xD665624C, 0x326C4200, 0xC9086020, 0x40214021,
47431 +0x000B4021, 0xD161600C, 0x341C644C, 0x000B6240,
47432 +0xD15F602C, 0x341C644C, 0x000B6240, 0x2FE6602C,
47433 +0x6E434F22, 0xE60A645C, 0x89143467, 0x0009BFEB,
47434 +0x60EC640C, 0x8B028801, 0xA002E00F, 0x44092409,
47435 +0x624C4409, 0x3263E60A, 0xBFE28905, 0x620C644C,
47436 +0xC8806023, 0xE2008B00, 0x4F266023, 0x6EF6000B,
47437 +0xD64C4F22, 0x88016062, 0xB2578B03, 0xA0030009,
47438 +0xD2490009, 0x2260E640, 0xE200D648, 0x000B4F26,
47439 +0x4F222622, 0x6062D643, 0x8B018802, 0x0009B2A0,
47440 +0xE200D642, 0x000B4F26, 0xD53E2622, 0xE100D43E,
47441 +0x2512E701, 0x2470000B, 0xE604D23B, 0x2260000B,
47442 +0xD43B4F22, 0x410BD13B, 0xD53B0009, 0x6650E1FD,
47443 +0x2619D23A, 0x2560E700, 0x000B4F26, 0x4F222270,
47444 +0xD238D537, 0xD7386152, 0x2512611D, 0xE6FF6452,
47445 +0x2542242B, 0xD22FD435, 0x420B666D, 0xD52E2762,
47446 +0x6750E1FB, 0x4F262719, 0x2570000B, 0xD4304F22,
47447 +0x410BD128, 0xD5280009, 0x6650E7F7, 0x4F262679,
47448 +0x2560000B, 0x9425D524, 0x22496250, 0x2520000B,
47449 +0xE4BFD521, 0x22496250, 0x2520000B, 0xD2254F22,
47450 +0x600D8522, 0x89112008, 0x89458801, 0x89478803,
47451 +0x89498805, 0x894F8806, 0x89558808, 0x895B8809,
47452 +0x8961880A, 0x8967880B, 0x0009A06E, 0x0009B070,
47453 +0x600CA06B, 0x0000FF7F, 0x001E2148, 0x001E1000,
47454 +0x001E1108, 0x002039C4, 0x002039C6, 0x002039E5,
47455 +0x002039A8, 0x001E103F, 0x001E105F, 0x001E102F,
47456 +0x001E1090, 0x002039CC, 0x001E100B, 0x002039C8,
47457 +0x00203AFC, 0x002018A2, 0x001E1028, 0x002039E4,
47458 +0x001D4020, 0x98760000, 0x001C1000, 0x00203B08,
47459 +0x00203B18, 0x0020399C, 0x0009B04C, 0x600CA035,
47460 +0x0009B055, 0x600CA031, 0x6260D684, 0x8B2B2228,
47461 +0x0009B061, 0x600CA029, 0x6260D680, 0x8B232228,
47462 +0x0009B069, 0x600CA021, 0x6260D67C, 0x8B1B2228,
47463 +0x0009B0C7, 0x600CA019, 0x6260D678, 0x8B132228,
47464 +0x0009B0CD, 0x600CA011, 0x6260D674, 0x8B0B2228,
47465 +0x0009B125, 0x600CA009, 0x6260D670, 0x8B032228,
47466 +0x0009B13D, 0x600CA001, 0x4F26E000, 0x0009000B,
47467 +0xD26CD16B, 0xD56C8412, 0x4000C90F, 0xD76B012D,
47468 +0xE403D66B, 0xE20F611C, 0x2540E001, 0x25202712,
47469 +0x2602000B, 0xE601D262, 0x30668523, 0xE0008D05,
47470 +0xD663D260, 0xE0018122, 0x000B2602, 0xD25C0009,
47471 +0x600D8523, 0x89052008, 0x8B0A8801, 0x6060D65D,
47472 +0x2600CB01, 0xD457D65A, 0xE001E101, 0x000B2612,
47473 +0x000B8142, 0xD152E000, 0x8513E501, 0x640D4518,
47474 +0x66033453, 0xE0008D05, 0xD551D253, 0x2260E001,
47475 +0x000B2502, 0x4F220009, 0x8513D149, 0x6453650D,
47476 +0x62494419, 0x227D672E, 0x8801602C, 0x88028909,
47477 +0x88038910, 0x8806891A, 0x88078935, 0xA04C893B,
47478 +0xD5460009, 0x6652D746, 0x2762D446, 0x622C6261,
47479 +0x2421A038, 0x2228625C, 0xD4438B3F, 0x6642D540,
47480 +0x2562D440, 0x24018561, 0x6203A02C, 0x2008605C,
47481 +0x88108907, 0x88208908, 0x88308909, 0xA02C890A,
47482 +0xD23A0009, 0x6222A008, 0xA005D239, 0xD2396222,
47483 +0x6222A002, 0x6262D638, 0xD432D531, 0x66212522,
47484 +0xA00F626C, 0xD6352421, 0x6261D52D, 0x622CD42D,
47485 +0xA0072562, 0xD6322421, 0x8561D529, 0x2562D429,
47486 +0x62032401, 0x662D8515, 0x3617610D, 0x65038F01,
47487 +0xB0CB2451, 0xA0010009, 0xE000E001, 0x000B4F26,
47488 +0xD6190009, 0xD427E101, 0x65412610, 0xD118D717,
47489 +0xE20F655D, 0x2752E001, 0x000B2620, 0x2FE62102,
47490 +0xD20F4F22, 0x640C8523, 0x8B082448, 0xD511D61D,
47491 +0x2621E200, 0x940F8451, 0xA0482049, 0xDE0D8051,
47492 +0xC84060E0, 0xE2018D32, 0x89443427, 0xD216D615,
47493 +0x2641420B, 0x0009A030, 0x0000FF7F, 0x002039E5,
47494 +0x0020399C, 0x002039A8, 0x001E1100, 0x001E100C,
47495 +0x002039C8, 0x001E1000, 0x001E1001, 0x002039D0,
47496 +0x002039B0, 0x002039B4, 0x002039B8, 0x002039D4,
47497 +0x002039D8, 0x002039DC, 0x002039E0, 0x00203E04,
47498 +0x00203E0E, 0x002039C2, 0x00202886, 0x89123427,
47499 +0xD294D693, 0x2641420B, 0xCB8084E1, 0x80E1B0F5,
47500 +0xD69160E0, 0x2E00CB04, 0xC93F6060, 0xD68F2600,
47501 +0xA001E001, 0xE0002602, 0x000B4F26, 0xD68C6EF6,
47502 +0xC8806060, 0xD2868919, 0x88016021, 0xD2898B15,
47503 +0x8524E501, 0x89103056, 0xE203D187, 0x2120D487,
47504 +0xE00B6541, 0x0656655D, 0xE40FD585, 0x2140E702,
47505 +0xD77E2571, 0x000BE001, 0x000B2702, 0x2FE6E000,
47506 +0xDE804F22, 0xC88084E1, 0xD57A892C, 0x20088554,
47507 +0x61038F28, 0x8553D77C, 0x64036672, 0x8566650C,
47508 +0x3520620C, 0xD6798B1E, 0x651CD774, 0x2651644C,
47509 +0x60E02741, 0x8904C840, 0x420BD275, 0xA0030009,
47510 +0xD2680009, 0x0009420B, 0x0009B09F, 0xE201D167,
47511 +0x60E02122, 0xCB04D464, 0x60402E00, 0x2400C93F,
47512 +0x6023A001, 0x4F26E000, 0x6EF6000B, 0x2FB62FA6,
47513 +0x2FD62FC6, 0xDA622FE6, 0x66A1E240, 0x3622DC5E,
47514 +0x62638900, 0x6ED36D2C, 0x4E2136D8, 0x4E212A61,
47515 +0xDB61D460, 0xE700A00F, 0x770162B2, 0x71026123,
47516 +0x66212B12, 0x71026213, 0x61212B12, 0x651D666D,
47517 +0x356C4528, 0x627C2452, 0x8BED32E3, 0xC90360D3,
47518 +0x8B108803, 0x617367B2, 0x2B127102, 0x71026E13,
47519 +0x2B126571, 0x655D6DE1, 0x422862DD, 0x325CE107,
47520 +0xA00C2C10, 0x88022422, 0xA0038B01, 0x8801E203,
47521 +0xE2018B05, 0x66B22C20, 0x655D6561, 0xE60F2452,
47522 +0x67A12C60, 0x8B052778, 0xDD38DC44, 0xEB01EA00,
47523 +0x2DB22CA2, 0x6DF66EF6, 0x6BF66CF6, 0x6AF6000B,
47524 +0x2FE62FD6, 0xE240DD36, 0x362266D1, 0x62638900,
47525 +0x3678672C, 0x7703DE38, 0x47212D61, 0x64E2D635,
47526 +0xA00E4721, 0x6562E100, 0x62537101, 0x74012450,
47527 +0x24204219, 0x45297401, 0x74012450, 0x24504519,
47528 +0x621C7401, 0x8BEE3273, 0x66E24200, 0x420061D1,
47529 +0x2118362C, 0x2E628F06, 0xDD1CD728, 0xE501E400,
47530 +0x2D522742, 0x000B6EF6, 0x2FD66DF6, 0x4F222FE6,
47531 +0xED0AEE01, 0x64E3BC85, 0xBC8A64E3, 0x62EC7E01,
47532 +0x8BF732D7, 0xBC8DEE01, 0x64E364E3, 0x7E01BC92,
47533 +0x32D762EC, 0x4F268BF7, 0x000B6EF6, 0xD1186DF6,
47534 +0xD418920D, 0x72122122, 0x2422D617, 0xD7177204,
47535 +0x72202622, 0x2722D116, 0x000B7230, 0x137A2122,
47536 +0x002039C2, 0x00202992, 0x001E1015, 0x002039C8,
47537 +0x001E1001, 0x0020399C, 0x001E1100, 0x002039C6,
47538 +0x002039B4, 0x001E1000, 0x002039B8, 0x002039C4,
47539 +0x00202886, 0x001E100C, 0x002039B0, 0x002039CC,
47540 +0x002039D0, 0x002039D4, 0x002039D8, 0x002039DC,
47541 +0x002039E0, 0x4F222FE6, 0xD6707FFC, 0x88016060,
47542 +0xE2018951, 0x2620BFBB, 0xD56ED16D, 0xDE6E6010,
47543 +0x64E36552, 0x7402C840, 0x8D22D16C, 0xD26C7502,
47544 +0xE601D76C, 0xE7042722, 0x76016255, 0x626C2421,
47545 +0x8FF93273, 0xD4637402, 0x6242E601, 0x640D8528,
47546 +0x67494419, 0x275D657E, 0x81E4607C, 0xE417D562,
47547 +0x67557601, 0x3243626C, 0x8FF92171, 0xA0207102,
47548 +0xD25E0009, 0xE601D75B, 0xE7042722, 0x76016255,
47549 +0x626C2421, 0x8FF93273, 0xD4527402, 0x6242E601,
47550 +0x640D8528, 0x67494419, 0x275D657E, 0x81E4607C,
47551 +0xE417D553, 0x67557601, 0x3243626C, 0x8FF92171,
47552 +0x92897102, 0xD2462E21, 0x5E23D74E, 0x64F22FE2,
47553 +0x604365F2, 0x2700C980, 0xC9606043, 0x80716103,
47554 +0xC9036043, 0x80724519, 0x65F2605C, 0x817266F2,
47555 +0x46194629, 0x606C4529, 0x4018645C, 0x8173304C,
47556 +0x21185E23, 0x64F22FE2, 0x6E4C62F2, 0x602C4219,
47557 +0x66F262F2, 0x46294018, 0x461930EC, 0x42298174,
47558 +0x652C606C, 0x305C4018, 0x81758F07, 0x0009BC96,
47559 +0x2228620C, 0xA00A8908, 0x60130009, 0x8B038840,
47560 +0x0009B009, 0x0009A003, 0xE202D62F, 0x7F042622,
47561 +0x000B4F26, 0x4F226EF6, 0x8552D52A, 0x8830600D,
47562 +0x88318903, 0xA0348923, 0x85550009, 0xD428D727,
47563 +0x85532701, 0x610DD627, 0x24124118, 0x460BD426,
47564 +0xD7230009, 0xD226D425, 0x6572420B, 0xE230D120,
47565 +0x42286712, 0x2729E620, 0x37604628, 0xD6218B03,
47566 +0xA016E200, 0xD61F2622, 0xA012E202, 0xD1182622,
47567 +0x6212E530, 0xE6204528, 0x46282259, 0x89083260,
47568 +0xD41AD119, 0xE601D513, 0x2160450B, 0x472BD718,
47569 +0x4F264F26, 0x0009000B, 0x0000060A, 0x002039E4,
47570 +0x001E1000, 0x002039D0, 0x00203E04, 0x00203E10,
47571 +0x00203DA8, 0x002039B8, 0x00203DD8, 0x00203DD6,
47572 +0x00203DAA, 0x0020399C, 0x002039C8, 0x002039B4,
47573 +0x002039B0, 0x002018A2, 0x00203B24, 0x00203B28,
47574 +0x002018EE, 0x002039CC, 0x001E100B, 0x00203B3C,
47575 +0x00114004, 0x4F222FE6, 0xDE967FFC, 0x200884E9,
47576 +0x2F008D06, 0xD695D494, 0x0009460B, 0x64F0B19A,
47577 +0x6620D293, 0x89022668, 0xC9BF60E0, 0x7F042E00,
47578 +0x000B4F26, 0x000B6EF6, 0x2FE60009, 0xDE8D4F22,
47579 +0x60E0D68D, 0xCBC0D48D, 0x62602E00, 0xC803602C,
47580 +0x40218904, 0x70014021, 0x6603A002, 0x66034009,
47581 +0xD687616D, 0xE500A004, 0x75016262, 0x74042422,
47582 +0x3213625D, 0xD2838BF8, 0x0009420B, 0xC9BF84E2,
47583 +0x4F2680E2, 0x6EF6000B, 0x2FE62FD6, 0x7FFC4F22,
47584 +0x6260D67D, 0x89442228, 0xD572E100, 0x60502610,
47585 +0xCB40D47A, 0x2500440B, 0x8D052008, 0x62E06E03,
47586 +0x7104612C, 0x2F11A006, 0xD475D66D, 0xDD756760,
47587 +0x657C4D0B, 0xE23C6D1D, 0x8B033D27, 0xD267D472,
47588 +0x0009420B, 0x4D214D21, 0xA005D770, 0x66E6E400,
47589 +0x357C4508, 0x74012562, 0x35D3654D, 0xD76C8BF7,
47590 +0x6172E003, 0x81114018, 0x6E7260F1, 0x81E2700C,
47591 +0xD4686172, 0xDD688113, 0x4D0BDE68, 0xE2016572,
47592 +0xD4672E22, 0x420BD255, 0xD6560009, 0xC93F6060,
47593 +0x7F042600, 0x6EF64F26, 0x6DF6000B, 0x2FC62FB6,
47594 +0x2FE62FD6, 0xD25F4F22, 0x6B436E73, 0x420B6C53,
47595 +0x20086D63, 0x64038D1C, 0xE50ED149, 0x32526210,
47596 +0x60C38916, 0x804124B0, 0x814160D3, 0xA007E500,
47597 +0x655D61BC, 0x00EC6053, 0x364C6653, 0x80647501,
47598 +0x3213625D, 0xD63B8BF5, 0xC9BF6060, 0x2600A008,
47599 +0xD23AD44D, 0x6EF64F26, 0x6CF66DF6, 0x6BF6422B,
47600 +0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, 0x7FC44F22,
47601 +0x720262F3, 0x22512F41, 0x45297202, 0x60632251,
47602 +0xE5C4E682, 0x67F38121, 0x655C666C, 0xE408BFB6,
47603 +0x4F267F3C, 0x0009000B, 0x2F962F86, 0x2FB62FA6,
47604 +0x2FD62FC6, 0x4F222FE6, 0xE1007FC4, 0x6513ECFF,
47605 +0x6B136CCD, 0xDE36D735, 0xEDFF64F3, 0xD835EA04,
47606 +0x6053655C, 0x027D4000, 0x32C0622D, 0x66038D0D,
47607 +0x09ED6063, 0x2491027D, 0x24217402, 0x698202ED,
47608 +0x3928622D, 0x74022892, 0x75017104, 0x6063625C,
47609 +0x07D532A2, 0x0EB58FE4, 0x2448641C, 0xE6808905,
47610 +0x67F3E5C5, 0xBF79666C, 0x7F3C655C, 0x6EF64F26,
47611 +0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, 0xD11E68F6,
47612 +0x6012D21E, 0xCB20E405, 0x2102E500, 0x000B2242,
47613 +0x00002252, 0x001E1017, 0x00203B40, 0x002018A2,
47614 +0x0020390E, 0x001E1015, 0x001E10BF, 0x00117800,
47615 +0x001E10FC, 0x00200610, 0x00203914, 0x00202AEA,
47616 +0x00203B44, 0x002018EE, 0x00203B60, 0x0011788C,
47617 +0x00203910, 0x002034F4, 0x00201530, 0x001E2130,
47618 +0x00203B68, 0x00202AAC, 0x00203B6C, 0x00203974,
47619 +0x0020397C, 0x00203DA4, 0x001C3500, 0x001D4004,
47620 +0xD564D163, 0xE400D764, 0x2142E20F, 0x17411154,
47621 +0xD5622722, 0x9669D762, 0x15412572, 0x96661562,
47622 +0xE6011565, 0xD55F1165, 0x666CE6F8, 0x25422542,
47623 +0x25422542, 0x25422542, 0x25622542, 0x7601E727,
47624 +0x67632572, 0x25627797, 0xE7042572, 0x2572E248,
47625 +0xE2192522, 0xE2702522, 0x25422542, 0x25422542,
47626 +0x25222542, 0x2522E20C, 0x25422542, 0x25422542,
47627 +0x25422542, 0x25422542, 0x000B154A, 0xE2081145,
47628 +0x0009422B, 0x2FE62FD6, 0x7FFC4F22, 0xC8206043,
47629 +0x6E438D02, 0x0009BE67, 0xC81060E3, 0xBE648901,
47630 +0x60E30009, 0x8901C840, 0x0009BE86, 0xC80160E3,
47631 +0xDD3D8938, 0xC80260D0, 0x2F008D03, 0x460BD63B,
47632 +0x60F00009, 0x8902C804, 0x460BD639, 0x62F00009,
47633 +0xC8806023, 0x60D08902, 0x2D00C97F, 0xC8016023,
47634 +0xD6348906, 0x0009460B, 0x0009A007, 0x51630601,
47635 +0x8902C808, 0x460BD630, 0x60F00009, 0x8902C810,
47636 +0x420BD22E, 0xD52E0009, 0x88026052, 0xD22D8B03,
47637 +0xA005E604, 0x88012260, 0xD22A8B02, 0x2260E601,
47638 +0x2522E200, 0xC88060E3, 0xD227892D, 0x60E36E20,
47639 +0x8902C880, 0x420BD225, 0x60E30009, 0x8902C840,
47640 +0x420BD223, 0x60E30009, 0x8902C802, 0x420BD221,
47641 +0x60E30009, 0x890DC804, 0xDD20D11F, 0x0009410B,
47642 +0x0009BF0D, 0x0009BF4C, 0xD51ED41D, 0x2470E708,
47643 +0x25D2BF85, 0xC80860E3, 0xD21B8905, 0x4F267F04,
47644 +0x422B6EF6, 0x7F046DF6, 0x6EF64F26, 0x6DF6000B,
47645 +0x001C581C, 0xA000A000, 0x001D0100, 0x001D4000,
47646 +0x00040021, 0x001C589C, 0x001E1021, 0x00201A90,
47647 +0x00201AB2, 0x00202114, 0x00201ACA, 0x00201AD8,
47648 +0x002039C8, 0x001E100B, 0x001E1028, 0x00201B44,
47649 +0x00201B50, 0x00201AE0, 0x00201AFE, 0x12345678,
47650 +0x001E1000, 0x0010F100, 0x00201B2C, 0x644CD6A7,
47651 +0x000B346C, 0xD6A62450, 0x346C644C, 0x2450000B,
47652 +0x644CD6A4, 0x000B346C, 0x625C2450, 0x4208616D,
47653 +0x42084119, 0x42006019, 0x670E614C, 0xD49E321C,
47654 +0x4200207D, 0x324CC90F, 0x2200000B, 0x4208625C,
47655 +0x42004208, 0x324C644C, 0x4200D498, 0x000B324C,
47656 +0x2FE62260, 0x614C4F12, 0x4100D493, 0x6710314C,
47657 +0xE29F666D, 0x27294619, 0x6E536269, 0x672E6573,
47658 +0x4221227D, 0x42214221, 0x7601662C, 0xE4014608,
47659 +0x34E84608, 0x644C4600, 0x071A0467, 0x2150257B,
47660 +0x000B4F16, 0x4F226EF6, 0xD2857FE8, 0x88016021,
47661 +0xD2848B7B, 0x26686621, 0xD2838B77, 0x26686621,
47662 +0xE50F8B73, 0xE401BFA2, 0xBFA4E501, 0xE586E400,
47663 +0xE400655C, 0x2F50BFA4, 0xBFA1E401, 0xE602E506,
47664 +0x60634618, 0x81F2E401, 0x6543BF9F, 0xE40185F2,
47665 +0xBFAB6543, 0x85F26603, 0x6543E401, 0x6603BFB1,
47666 +0xE40265F0, 0x6053756C, 0x80F8BF80, 0xBF82E402,
47667 +0x84F8E512, 0x7090E402, 0x6503BF82, 0x4618E602,
47668 +0x81F66063, 0xBF80E402, 0x85F6E500, 0x6603E402,
47669 +0xE500BF8C, 0xE40285F6, 0xBF926603, 0xE5FEE500,
47670 +0xE010655C, 0xBF61E403, 0xE5130F54, 0xE40EBF63,
47671 +0x05FCE010, 0xBF63E40E, 0xE5007585, 0xBF64E403,
47672 +0xE500E640, 0xBF71E403, 0xE500E640, 0xBF78E403,
47673 +0xE5FFE640, 0xE014655C, 0xBF47E404, 0xE40F0F54,
47674 +0xE504BF49, 0x05FCE014, 0xBF49E40F, 0xE5017584,
47675 +0xBF4AE640, 0xE501E404, 0xBF57E640, 0xE501E404,
47676 +0xE404E640, 0xAF5C7F18, 0x7F184F26, 0x000B4F26,
47677 +0x4F220009, 0xD2427FF0, 0x88016021, 0xD2418B71,
47678 +0x26686621, 0xD2408B6D, 0x26686621, 0xE50F8B69,
47679 +0xE401BF1C, 0xBF1EE501, 0xE586E400, 0xE400655C,
47680 +0x2F50BF1E, 0xBF1BE401, 0xE401E506, 0xBF1C6543,
47681 +0xE401E640, 0xBF296543, 0xE401E640, 0xBF306543,
47682 +0x65F0E640, 0x756CE402, 0xBEFF6053, 0xE40280F4,
47683 +0xE512BF01, 0xE40284F4, 0xBF017090, 0xE6406503,
47684 +0xBF02E402, 0xE640E500, 0xBF0FE402, 0xE640E500,
47685 +0xBF16E402, 0xE5FEE500, 0x6053655C, 0xBEE5E403,
47686 +0xE51380F8, 0xE40EBEE7, 0xE40E84F8, 0xBEE77085,
47687 +0xE5006503, 0xBEE8E640, 0xE500E403, 0xBEF5E640,
47688 +0xE500E403, 0xBEFCE640, 0xE5FFE403, 0x6053655C,
47689 +0xBECBE404, 0xE40F80FC, 0xE504BECD, 0xE40F84FC,
47690 +0xBECD7083, 0xE5016503, 0xBECEE640, 0xE501E404,
47691 +0xBEDBE640, 0xE501E404, 0xE404E640, 0xAEE07F10,
47692 +0x7F104F26, 0x000B4F26, 0x00000009, 0x001E102F,
47693 +0x001E1080, 0x001E1090, 0x001E103F, 0x001E103E,
47694 +0x002039C2, 0x002039C4, 0x002039C6, 0xD21DD11C,
47695 +0x66206010, 0x676C7001, 0x3700C90F, 0xE5008D13,
47696 +0x67106210, 0x7701622C, 0x64232170, 0xD6166010,
47697 +0x44084408, 0x3428C90F, 0x62602100, 0x7201D513,
47698 +0x44082620, 0x000B354C, 0xD10F6053, 0x25586510,
47699 +0xE6008D13, 0xD60DD40B, 0x655C6540, 0x47086753,
47700 +0x37584708, 0x47086540, 0x24507501, 0x367C6040,
47701 +0x2400C90F, 0x72FF6210, 0x000B2120, 0x00006063,
47702 +0x0020390D, 0x0020390C, 0x0020390E, 0x00203534,
47703 +0x7FFC4F22, 0xE680D19F, 0x666C6212, 0xD29E2F22,
47704 +0x67F36563, 0x420B7542, 0x7F04E404, 0x000B4F26,
47705 +0xE6800009, 0xD298666C, 0xE7006563, 0x422B7540,
47706 +0xE6806473, 0xD294666C, 0xE7006563, 0x422B7543,
47707 +0x2F866473, 0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6,
47708 +0x7FCC4F22, 0xDC8ED28D, 0x72011F21, 0xDB8D1F22,
47709 +0xD18EDE8D, 0x66125211, 0x8B013620, 0x0009A0E5,
47710 +0xC9036061, 0x8B018801, 0x0009A0DF, 0xD288D487,
47711 +0xED84420B, 0x2F025503, 0x30D0845C, 0xA0B88901,
47712 +0xD1840009, 0x626C6610, 0x88016023, 0xD1828B68,
47713 +0x62101FC3, 0x895B2228, 0xE003D480, 0x40186742,
47714 +0x68421772, 0xD57EE900, 0x81816DB3, 0x7D042190,
47715 +0x67D26AB2, 0x64E26852, 0x1F491F57, 0x740464E3,
47716 +0x1FA46542, 0x65431F5A, 0x625275F8, 0x1F761FD5,
47717 +0x6D531F2B, 0xDA74D773, 0x7D94D274, 0x68D21F88,
47718 +0x6AA26972, 0xD1726022, 0x2202CB20, 0xE1401F1C,
47719 +0x7601E600, 0x3213626D, 0x56F48BFB, 0x52F651F5,
47720 +0x21222B62, 0x52F851F7, 0x212256F9, 0x2E6251FA,
47721 +0x51FB2412, 0x2D822512, 0xD9662792, 0x29A2DD5F,
47722 +0x6AD2D965, 0xD9646892, 0x68D21A84, 0x6081DA63,
47723 +0x2801CB01, 0xD86266D2, 0x2A622962, 0xED015AFC,
47724 +0x2AD2480B, 0x2AD24D18, 0x62D2DD5E, 0x2D227201,
47725 +0xD15056F3, 0xE2026062, 0x2602CB01, 0x2120A03D,
47726 +0x8B3A2228, 0xE401DD58, 0x2140E600, 0xE01C2D62,
47727 +0xC801005C, 0xD4558B0A, 0xE600D755, 0xED7D2472,
47728 +0x626C7601, 0x8BFB32D3, 0x24D2DD52, 0xE2FE68C2,
47729 +0x2C822829, 0x095CE01E, 0xE01F5DF1, 0x0A5C2D90,
47730 +0x751051F2, 0xED0621A0, 0xD74BE600, 0x8456D44B,
47731 +0x27007601, 0x696C6854, 0x248039D3, 0x8FF67401,
47732 +0xDA477701, 0x2A10E194, 0xE2007A01, 0x7A0F2A20,
47733 +0xD130E805, 0x66102A80, 0x6023626C, 0x89088801,
47734 +0xD240D42A, 0x420B65F2, 0xD131ED01, 0xAF304D18,
47735 +0x65F221D2, 0x8553D43C, 0x620D6642, 0x89073262,
47736 +0xD13BD43A, 0x0009410B, 0xE601D73A, 0x2762AF1A,
47737 +0xD134D41E, 0x410B65F2, 0xD125ED01, 0xD637D436,
47738 +0x460B4D18, 0xAF0D21D2, 0x7F340009, 0x6EF64F26,
47739 +0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, 0x4F2268F6,
47740 +0x85467FF4, 0x2F01E681, 0x666C8547, 0x854881F1,
47741 +0x81F2D209, 0x67F38542, 0x854381F3, 0x81F4E40C,
47742 +0x65636053, 0x420B81F5, 0x7F0C7540, 0x000B4F26,
47743 +0x00000009, 0x001C3D9C, 0x0020245C, 0x0011779A,
47744 +0x001C36F8, 0x001C3B9C, 0x001C3704, 0x0020352C,
47745 +0x002014A0, 0x0020391D, 0x0020391C, 0x00203918,
47746 +0x001C3D98, 0x001C3BB4, 0x001C5960, 0x001C3500,
47747 +0x001C3D30, 0x001C8960, 0x00203504, 0x001C3D00,
47748 +0x0020160C, 0x00117730, 0x00203920, 0x001C582C,
47749 +0x2000A000, 0x0000A000, 0x0011778C, 0x00117792,
47750 +0x00117788, 0x002014CC, 0x002038F4, 0x002034F4,
47751 +0x00201530, 0x001E2130, 0x00203D84, 0x002018A2,
47752 +0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6,
47753 +0xD19B7FEC, 0x2F12E000, 0x6103D49A, 0x1F4281F2,
47754 +0xDD9ADA99, 0xD69A6813, 0xE0014808, 0x460BDE99,
47755 +0x38EC4800, 0x65A21F03, 0x352052A1, 0xA23E8B01,
47756 +0x60510009, 0x8801C903, 0xA2388B01, 0x52530009,
47757 +0x32E0DE91, 0xD9918B10, 0x64A3490B, 0x4B0BDB90,
47758 +0xDE906403, 0xD791D690, 0xEC01D591, 0x2E02E100,
47759 +0x271026C0, 0x2502AFDF, 0xC8018551, 0xA1578B01,
47760 +0x62510009, 0x4200622D, 0x5E53366A, 0x85E2226D,
47761 +0xC903642C, 0x85E36603, 0x6053650D, 0x40214021,
47762 +0x4500C93F, 0x322A6703, 0x6053252D, 0xC901D17F,
47763 +0x60106C03, 0x8801D97F, 0xDB7F8B05, 0x2120E200,
47764 +0xCB0160B2, 0xD17D2B02, 0x88016011, 0x65A28B0A,
47765 +0x8D042448, 0x9B9E6251, 0xA00322B9, 0x919B2521,
47766 +0x2521221B, 0x37B3EB10, 0x2448895E, 0xD4738B07,
47767 +0x22286241, 0x60638903, 0xA05781F8, 0xD5706473,
47768 +0x46084608, 0x85E26273, 0x46006B50, 0x362C4200,
47769 +0x2BB8C910, 0x8F1F6463, 0x26686603, 0xD2698911,
47770 +0x062D6043, 0x4119616D, 0x6B0E6019, 0x81F820BD,
47771 +0x880160C3, 0x646C8F2C, 0x880F6073, 0xA0278B1B,
47772 +0xD2610009, 0x052D6043, 0x4119615D, 0x670E6019,
47773 +0x645C207D, 0x81F8A01C, 0x890F2668, 0x6043D25B,
47774 +0x6B5D052D, 0x60B94B19, 0x201D610E, 0x60C381F8,
47775 +0x8F0D8801, 0x6473645C, 0xEC00A00A, 0x6043D254,
47776 +0x625D052D, 0x60294219, 0x207D670E, 0x81F8645C,
47777 +0x880285F8, 0x85E1890A, 0x8D07C820, 0xE6DC6203,
47778 +0x60232269, 0x81E1A002, 0x644CE4FF, 0x6210D149,
47779 +0x89012228, 0x644CE4FF, 0x654DEBFF, 0x35B06BBC,
47780 +0xDB368B2B, 0x64A34B0B, 0x410BD135, 0x54036403,
47781 +0x85446E03, 0xC948DB40, 0xDC408808, 0xBEAE8B01,
47782 +0x64B3E502, 0x65E34C0B, 0xDB3DEC01, 0xD13D2DC2,
47783 +0x621260B2, 0x72017001, 0x21228805, 0x2B028F08,
47784 +0x666CE680, 0x6563D238, 0x7549E700, 0x6473420B,
47785 +0xA030D436, 0x7FFF0009, 0x85E28000, 0x20B9EBFC,
47786 +0x610381E2, 0x942A85E3, 0x62032049, 0x450885F8,
47787 +0x81E2201B, 0xC90160C3, 0x40084018, 0x40084008,
47788 +0x4000225B, 0x6023220B, 0x85E481E3, 0x4118E108,
47789 +0x81E4201B, 0xE40262A2, 0x20B98521, 0x67A28121,
47790 +0xCB016071, 0x85F82701, 0x89033042, 0xECE785E2,
47791 +0x81E220C9, 0x490BD41E, 0xA03B0009, 0x7E030009,
47792 +0x001C3D30, 0x00203D90, 0x00203504, 0x001E212C,
47793 +0x002033E8, 0x001C3D00, 0x00117780, 0x002014A0,
47794 +0x0020166C, 0x0011770C, 0x0020391C, 0x0020391D,
47795 +0x00203918, 0x002018A2, 0x001C36F8, 0x00203990,
47796 +0x00203DA0, 0x00203B84, 0x00203C04, 0x00203C84,
47797 +0x00203D04, 0x00203908, 0x002034FC, 0x002014CC,
47798 +0x00203994, 0x00203998, 0x0020245C, 0x00203D88,
47799 +0x00203D8C, 0x602262F2, 0x40094019, 0xC90F4009,
47800 +0x8B0B880A, 0x60E2DE8C, 0x40094019, 0xC90F4009,
47801 +0x8B038808, 0xCB0160A2, 0x2802A006, 0x65E2DE87,
47802 +0x2E527501, 0x286266A2, 0x52F366F2, 0x2622AE83,
47803 +0xD2838551, 0xDE83C802, 0xA0958B01, 0x420B0009,
47804 +0x4E0B64A3, 0x5E036403, 0x85E46503, 0x4918E908,
47805 +0xD77D209B, 0xE04C81E4, 0xDC7C0B7E, 0x7B01D97C,
47806 +0x61C207B6, 0x71016690, 0x8D062668, 0xD4792C12,
47807 +0x420BD279, 0xA070EB01, 0x62512DB2, 0x4B18EB0F,
47808 +0x22B9E102, 0x32104118, 0x85518B0F, 0x2029E2FC,
47809 +0x60518151, 0xCB0172E0, 0x85E12501, 0x202994A3,
47810 +0x85E481E1, 0xA0522049, 0x675181E4, 0x4719677D,
47811 +0x667E6779, 0x7701276D, 0x6903607C, 0x88014918,
47812 +0x25918F3E, 0x6B12D161, 0x21B27B01, 0x660D85E3,
47813 +0x40216063, 0xC93F4021, 0x6C034600, 0x262D322A,
47814 +0xC8016063, 0xDB5ED15D, 0x967D8901, 0xE6002C6B,
47815 +0x666C67CD, 0x40006063, 0x622D021D, 0x8D0E3270,
47816 +0x60436403, 0xE9FF021D, 0x8B013290, 0x01C5A007,
47817 +0x626C7601, 0x3292E904, 0x646C8BEB, 0x60434400,
47818 +0xD15004BD, 0x0B457401, 0x669D6911, 0x89073670,
47819 +0x602D6211, 0x890388FF, 0xE201DB4B, 0x2B2021C1,
47820 +0xECFC8551, 0x815120C9, 0xCB016051, 0xDC472501,
47821 +0x64A34C0B, 0x51F366F2, 0x85EF2612, 0x54F2D244,
47822 +0x650D420B, 0x0009ADE7, 0xE500DC42, 0x420B2C52,
47823 +0x4E0B64A3, 0x54036403, 0x85446E03, 0x6703E908,
47824 +0x65034918, 0x27998541, 0xDB323790, 0x8F0BD932,
47825 +0x6013610D, 0x8B07C820, 0xC9486053, 0x8B038808,
47826 +0xE501BD4D, 0x0009A005, 0x2128D233, 0xBD468901,
47827 +0x64B3E500, 0x490B65E3, 0xADBCEC01, 0x85F22DC2,
47828 +0x7001EE04, 0x31E7610D, 0x8D0281F2, 0xADA97A08,
47829 +0x7F140009, 0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6,
47830 +0x000B69F6, 0xF7FF68F6, 0x2FE68000, 0xD2234F22,
47831 +0x60E36E22, 0x8D02C840, 0xBBF922E2, 0xE2400009,
47832 +0x2E284218, 0xBC048901, 0x60E30009, 0x8905C810,
47833 +0xD21CD41B, 0x0009420B, 0x0009BC03, 0xC80560E3,
47834 +0xBD6D8901, 0x60E30009, 0x8902C802, 0xAC004F26,
47835 +0x4F266EF6, 0x6EF6000B, 0x001C3D3C, 0x00117760,
47836 +0x002014A0, 0x0020166C, 0x00203494, 0x00203DA4,
47837 +0x00203908, 0x002034FC, 0x002014CC, 0x00203974,
47838 +0x0020397C, 0x00203970, 0x00203972, 0x00201530,
47839 +0x002018EE, 0x00203994, 0x00008000, 0x001C3510,
47840 +0x00203D98, 0x002018A2, 0x080A0C0E, 0x00020406,
47841 +0x1A1C1E20, 0x12141618, 0x2E303234, 0x26282A2C,
47842 +0x3A3C3E40, 0x6C625648, 0x41112F26, 0xE2208F18,
47843 +0x890B3123, 0x321CD204, 0xD1026220, 0x412B312C,
47844 +0x00090009, 0x00203412, 0x002033C8, 0x000BE000,
47845 +0x400062F6, 0x40004000, 0x40004000, 0x40004000,
47846 +0x62F6000B, 0x40004000, 0x40004000, 0x40004000,
47847 +0x40184000, 0x62F6000B, 0x40004000, 0x40004000,
47848 +0x40004000, 0x40284000, 0x62F6000B, 0x40004000,
47849 +0x40184000, 0x000B4028, 0xC90F62F6, 0x40054005,
47850 +0x40054005, 0x62F6000B, 0x4005C907, 0x40054005,
47851 +0x62F6000B, 0x4005C903, 0x000B4005, 0xC90162F6,
47852 +0x000B4005, 0x000062F6, 0x00000000, 0x00000000,
47853 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47854 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47855 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47856 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47857 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47858 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47859 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47860 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47861 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47862 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47863 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47864 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47865 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47866 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47867 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47868 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47869 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47870 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47871 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47872 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47873 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47874 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47875 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47876 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47877 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47878 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47879 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47880 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47881 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47882 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47883 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47884 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47885 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47886 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47887 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47888 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47889 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47890 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47891 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47892 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47893 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47894 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47895 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47896 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47897 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47898 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47899 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47900 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47901 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47902 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47903 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47904 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47905 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47906 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47907 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47908 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47909 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47910 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47911 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47912 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47913 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47914 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47915 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47916 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47917 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47918 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47919 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47920 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47921 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47922 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47923 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47924 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47925 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47926 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47927 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47928 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47929 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47930 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47931 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47932 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47933 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47934 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47935 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47936 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47937 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47938 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
47939 +0x00000000, 0x544F0D0A, 0x46205355, 0x00003A57,
47940 +0x206C754A, 0x32203120, 0x20383030, 0x323A3132,
47941 +0x34333A38, 0x00000000, 0x00000D0A, 0x00000043,
47942 +0x42707372, 0x3D206675, 0x554E203D, 0x202C4C4C,
47943 +0x6E49677A, 0x4E497274, 0x6D754E51, 0x0000003D,
47944 +0x61766E49, 0x2064696C, 0x72657375, 0x20726F20,
47945 +0x2079656B, 0x00214449, 0x52504545, 0x57204D4F,
47946 +0x65746972, 0x6461202C, 0x003D7264, 0x6C617620,
47947 +0x0000003D, 0x00000A0D, 0x435F4D5A, 0x465F444D,
47948 +0x4C445F57, 0x494E495F, 0x00000054, 0x6E6B6E55,
47949 +0x206E776F, 0x6D6D6F63, 0x3D646E61, 0x00000000,
47950 +0x203A3051, 0x00000020, 0x203A3151, 0x00000020,
47951 +0x203A3251, 0x00000020, 0x203A3351, 0x00000020,
47952 +0x203A3451, 0x00000020, 0x2B434741, 0x73696F4E,
47953 +0x61432065, 0x7262696C, 0x6F697461, 0x6166206E,
47954 +0x6F206C69, 0x6974206E, 0x0D0A656D, 0x00000000,
47955 +0x00000072, 0x00205220, 0x00000D0A, 0x62735576,
47956 +0x7473725F, 0x00000A0D, 0x62735576, 0x7375735F,
47957 +0x646E6570, 0x00000A0D, 0x62735576, 0x7365725F,
47958 +0x000A0D6D, 0x00000044, 0x44387570, 0x72637365,
47959 +0x6F747069, 0x3D584572, 0x00000000, 0x00000047,
47960 +0x00000042, 0x72746E49, 0x6D652051, 0x2C797470,
47961 +0x49677A20, 0x4972746E, 0x754E514E, 0x00003D6D,
47962 +0x654C7245, 0x0000006E, 0x00000049, 0x20746F4E,
47963 +0x756F6E65, 0x49206867, 0x4220514E, 0x0A0D6675,
47964 +0x00000000, 0x000000FF, 0x00020001, 0x00FF00FF,
47965 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
47966 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
47967 +0x00FF00FF, 0x010E010D, 0x00020003, 0x01090108,
47968 +0x0002010A, 0x02000003, 0x02020201, 0x02040203,
47969 +0x02060205, 0x02020200, 0x02040203, 0x020C020B,
47970 +0x020E020D, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
47971 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
47972 +0x00FF00FF, 0x000000FF, 0x00020001, 0x00FF00FF,
47973 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
47974 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
47975 +0x00FF00FF, 0x010E010D, 0x00020003, 0x01090108,
47976 +0x0002010A, 0x00030003, 0x02020201, 0x02040203,
47977 +0x02060205, 0x02020200, 0x02040203, 0x020C020B,
47978 +0x020E020D, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
47979 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
47980 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
47981 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
47982 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
47983 +0x00FF00FF, 0x010E010D, 0x00FF010F, 0x01090108,
47984 +0x010B010A, 0x0200010F, 0x02020201, 0x02040203,
47985 +0x02060205, 0x02020200, 0x02040203, 0x020C020B,
47986 +0x020E020D, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
47987 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
47988 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
47989 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
47990 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
47991 +0x00FF00FF, 0x010E010D, 0x00FF010F, 0x01090108,
47992 +0x010B010A, 0x010F010F, 0x02020201, 0x02040203,
47993 +0x02060205, 0x02020200, 0x02040203, 0x020C020B,
47994 +0x020E020D, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
47995 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
47996 +0x00FF00FF, 0x00205220, 0x00000046, 0x00000059,
47997 +0x73204142, 0x003D7165, 0x49544120, 0x0000204D,
47998 +0x00000000, 0x00000000, 0x002E0209, 0x80000101,
47999 +0x000409FA, 0x00FF0400, 0x05070000, 0x02000201,
48000 +0x82050700, 0x00020002, 0x03830507, 0x07010040,
48001 +0x40030405, 0x02090100, 0x0101002E, 0x09FA8000,
48002 +0x04000004, 0x000000FF, 0x02010507, 0x07000040,
48003 +0x40028205, 0x05070000, 0x00400383, 0x04050701,
48004 +0x00004002, 0x00000000, 0x00000000, 0x07090000,
48005 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48006 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48007 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48008 +};
48009 +
48010 +const u32_t zcFwImageSize=15936;
48011 --- /dev/null
48012 +++ b/drivers/staging/otus/hal/hpfwu.c.drv_ba_resend
48013 @@ -0,0 +1,742 @@
48014 +/*
48015 + * Copyright (c) 2007-2008 Atheros Communications Inc.
48016 + *
48017 + * Permission to use, copy, modify, and/or distribute this software for any
48018 + * purpose with or without fee is hereby granted, provided that the above
48019 + * copyright notice and this permission notice appear in all copies.
48020 + *
48021 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
48022 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
48023 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
48024 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
48025 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
48026 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
48027 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
48028 + */
48029 +#include "cprecomp.h"
48030 +
48031 +const u32_t zcFwImage[] = {
48032 +0x0009000B, 0x4F222FE6, 0xDE297FFC, 0xE114D729,
48033 +0x1E13D429, 0x1E4C470B, 0x0009B018, 0xA0039545,
48034 +0x3652E600, 0x76018D04, 0xC84060E2, 0x2F028DF9,
48035 +0xDE23D422, 0x00094E0B, 0x4E0BD422, 0xD4220009,
48036 +0x00094E0B, 0x4F267F04, 0x6EF6A024, 0xD11F4F22,
48037 +0x0009410B, 0x440BD41E, 0xD51E0009, 0x0009450B,
48038 +0xE1FFD71D, 0xD21D611D, 0x50292712, 0xCB01D41C,
48039 +0xE501E1FF, 0x22121209, 0x24521211, 0xD61AD519,
48040 +0xE2009714, 0xD4192572, 0xD6192620, 0x4F262422,
48041 +0x2622000B, 0xDD18DC17, 0x4C0BDE18, 0x4D0B0009,
48042 +0x4E0B0009, 0xAFF80009, 0x27100009, 0x00000640,
48043 +0x001C001C, 0x00200BC4, 0x0000B38E, 0x002029F8,
48044 +0x00200F72, 0x00202A04, 0x00202A1C, 0x00200F20,
48045 +0x00201056, 0x00200C1C, 0x001C3510, 0x001C3624,
48046 +0x001E212C, 0x00202994, 0x00202530, 0x0020299C,
48047 +0x002029A8, 0x00200E50, 0x002023E6, 0x00201920,
48048 +0x2FC62F96, 0x2FE62FD6, 0x7F904F22, 0xE020DE8D,
48049 +0xD48D61E0, 0x61E30F14, 0x62107101, 0xE024D78B,
48050 +0x0F24470B, 0x450BD58A, 0x20080009, 0x8F116D03,
48051 +0xDD881F0A, 0x67D0D488, 0x410BD188, 0xD288657C,
48052 +0x6920DD88, 0x66C36C9C, 0x46084608, 0x460836C8,
48053 +0x1FDA3D6C, 0x04FCE024, 0x66E2E580, 0x655C604C,
48054 +0x8F163050, 0xE0202D62, 0xE50001FC, 0xDE7E641C,
48055 +0x3243625D, 0xA32C8B01, 0x655D0009, 0x36EC6653,
48056 +0xE02C6760, 0x69530F74, 0x39DC607E, 0xAFEF8094,
48057 +0x20087501, 0xE0208B14, 0xE50001FC, 0xA00ADE72,
48058 +0x655D641C, 0x39EC6953, 0x67536C92, 0x37DC62C2,
48059 +0x75041721, 0x625D1F2C, 0x8BF23243, 0x2D10A309,
48060 +0x8B178801, 0x01FCE020, 0x2D70E700, 0x1FD76D1C,
48061 +0x627DDE65, 0x8B0132D3, 0x0009A2FB, 0x65E3677D,
48062 +0x75046673, 0x36EC6C73, 0x64623C5C, 0x770869C2,
48063 +0x2492AFEF, 0x8B188804, 0x01FCE020, 0x2D40E400,
48064 +0xDE59671C, 0x3273624D, 0xA2E28B01, 0x644D0009,
48065 +0x6CE36D43, 0x65D23DEC, 0x61437C04, 0x621231CC,
48066 +0x74086952, 0xAFED2929, 0x88052592, 0xE0208B18,
48067 +0xE40001FC, 0x671C2D40, 0x624DDE4B, 0x8B013273,
48068 +0x0009A2C7, 0x6943644D, 0x39EC61E3, 0x71046592,
48069 +0x3C1C6C43, 0x6D5262C2, 0x2D2B7408, 0x25D2AFED,
48070 +0x8B1B8831, 0xD942D241, 0x72046422, 0x72046622,
48071 +0x72046722, 0x72E86C22, 0x1F2E1F4D, 0x72046422,
48072 +0x72046E22, 0x652229E0, 0x2950D93A, 0xDE3A2FC6,
48073 +0x55FE4E0B, 0xE2007F04, 0x2D20A29B, 0x8B1D8830,
48074 +0xDE33D232, 0x72046522, 0x72046122, 0x72046722,
48075 +0x72E86922, 0x72046422, 0x72046C22, 0x6E222EC0,
48076 +0x1F9FD62C, 0x7FFC26E0, 0x09FEE040, 0x2F92DC2B,
48077 +0x66134C0B, 0xE2007F04, 0x2D20A27B, 0x89018828,
48078 +0x0009A109, 0xE143DE20, 0xE04062E1, 0x3617662D,
48079 +0x0FE68F03, 0x660302FE, 0x36172201, 0xA0F38B01,
48080 +0xE0400009, 0xE50104FE, 0x30568541, 0xA0EB8B01,
48081 +0xE0400009, 0x09FEE701, 0xB2612D70, 0xE0406491,
48082 +0xE1430CFE, 0xE06862C1, 0x3517652D, 0x0F568D68,
48083 +0x3563E640, 0xE6008B24, 0x0F65E048, 0xA02EE11A,
48084 +0x000072C0, 0x00117800, 0x00202A20, 0x00200F72,
48085 +0x00201FDC, 0x002029B0, 0x00202A24, 0x00200FBC,
48086 +0x002029AF, 0x002025D4, 0x00117804, 0x00117810,
48087 +0x002029AC, 0x002029AD, 0x00200948, 0x00200994,
48088 +0x41216153, 0x41214121, 0x41214121, 0x45214521,
48089 +0x60534521, 0x6603C903, 0x0F65E048, 0xE0077118,
48090 +0xE0442209, 0x641D0F25, 0x65F3E04C, 0x0F46B291,
48091 +0x0EFDE048, 0x0DFDE044, 0x61DD67ED, 0x41084708,
48092 +0x0F16E050, 0xDD946073, 0x4D0B06FE, 0x6E07E00F,
48093 +0x607326E9, 0xE0400F66, 0x65F30CFE, 0x690D85C2,
48094 +0x01FEE050, 0x60934D0B, 0x6073260B, 0xE04C0F66,
48095 +0x04FEB256, 0x07FEE040, 0x6271E068, 0x0F56652D,
48096 +0x3563E640, 0xED008954, 0x0FD5E064, 0xC9036023,
48097 +0x40004008, 0x61036903, 0x0F96E054, 0xDE7EE058,
48098 +0x0FF6ECFF, 0xE06C6CCC, 0x60C30FE6, 0x62534E0B,
48099 +0x42214221, 0x42214221, 0x42006723, 0x6107327C,
48100 +0x4200E05C, 0x0F164521, 0x4521E040, 0x60530CFE,
48101 +0x4008C903, 0x7C0630FC, 0x6E031FC6, 0x1FD56D2D,
48102 +0x1F04A01E, 0x0FD6E060, 0x05FEE058, 0x64D3B231,
48103 +0x62E2E05C, 0xE05409FE, 0x2E222299, 0x64D361C4,
48104 +0x01FE661C, 0x07FEE06C, 0x6063470B, 0xE058220B,
48105 +0xB20505FE, 0xE0642E22, 0x7D0102FD, 0x0F257201,
48106 +0x02FDE064, 0x3262E606, 0xE0408BDC, 0x626106FE,
48107 +0x05FEE040, 0x85514200, 0x302C750C, 0x6103701B,
48108 +0x64F3E600, 0xE704A004, 0x76016256, 0x74042422,
48109 +0x3273626D, 0x65F38BF8, 0x641DB1E2, 0x06FEE040,
48110 +0x6461B19E, 0x0009A175, 0xD74DD44C, 0x470BE201,
48111 +0xA16E2D20, 0x88290009, 0xDE4A8B07, 0x2D20E200,
48112 +0xB16D66E2, 0xA164646D, 0xE2810009, 0x3020622C,
48113 +0xA0A78B01, 0xE0240009, 0x626C06FC, 0x666CE682,
48114 +0x8B213260, 0xE42452FA, 0xD43F2240, 0x12615647,
48115 +0x12625648, 0x12635649, 0x1264564A, 0x1265564B,
48116 +0x1266564C, 0x1267564D, 0x1268564E, 0x1269564F,
48117 +0x1427E200, 0x14291428, 0x142B142A, 0x142D142C,
48118 +0x142F142E, 0x1F6CA135, 0x666CE683, 0x8B073260,
48119 +0xE60052FA, 0xD22B2260, 0x6222D62C, 0x2622A129,
48120 +0x666CE690, 0x8B183260, 0xE60052FA, 0xD2282260,
48121 +0x6022E605, 0x2202CB20, 0x2262D226, 0x2262E600,
48122 +0x460BD625, 0xD2250009, 0x0009420B, 0xE601D224,
48123 +0xD2242262, 0xA10C4618, 0xE6B02262, 0x3260666C,
48124 +0xD5188B22, 0xD216D420, 0x75046D52, 0x6E52420B,
48125 +0x420BD21E, 0xD41E64D3, 0x450BD511, 0xD21B0009,
48126 +0x64E3420B, 0xD60ED41B, 0x0009460B, 0xE600E504,
48127 +0x3253626D, 0xA0EC8B01, 0x666D0009, 0x326C62D3,
48128 +0x22E07601, 0x4E19AFF4, 0xD214D413, 0xD4146542,
48129 +0x0009420B, 0x0009A0DD, 0x0020248C, 0x00202A44,
48130 +0x00200F72, 0x00117804, 0x00202538, 0x00202994,
48131 +0x001C3500, 0x001D4004, 0x00201056, 0x00200C1C,
48132 +0x001E212C, 0x001C3D30, 0x00202A5C, 0x00200FB4,
48133 +0x00202A70, 0x00202A78, 0x00117800, 0x00200FBC,
48134 +0x00202A7C, 0xD6AED4AD, 0x6262E040, 0x76046542,
48135 +0x2452352C, 0x62626563, 0x75045641, 0x1461362C,
48136 +0x62526653, 0x76085542, 0x1452352C, 0x55436262,
48137 +0x352C76EC, 0x65631453, 0x56446262, 0x362C7510,
48138 +0x66531464, 0x55456252, 0x352C7610, 0x65621455,
48139 +0xD69C5246, 0x1426325C, 0x55476262, 0x352C7604,
48140 +0x62621457, 0x76045548, 0x1458352C, 0x62626563,
48141 +0x75045649, 0x1469362C, 0x564A6252, 0x362C7504,
48142 +0x6653146A, 0x554B6252, 0x352C7604, 0x6262145B,
48143 +0x7604554C, 0x145C352C, 0x62626563, 0x7504564D,
48144 +0x146D362C, 0x62526653, 0x7604554E, 0x145E352C,
48145 +0x524F6562, 0x325CD684, 0x6262142F, 0x7694054E,
48146 +0x0456352C, 0x6263E044, 0x054E6662, 0x356C7244,
48147 +0xE0480456, 0x054E6622, 0xD67C356C, 0x62620456,
48148 +0x054EE054, 0x352C4229, 0x76040456, 0xE0586262,
48149 +0x4229064E, 0x52FA362C, 0xE6380466, 0xE0442260,
48150 +0xE048064E, 0x66421261, 0x56411262, 0x56421263,
48151 +0x56451264, 0x56431265, 0x56461266, 0x064E1267,
48152 +0x1268E040, 0xE050064E, 0x56441269, 0x064E126A,
48153 +0x126BE04C, 0xE054064E, 0x064E126C, 0x126DE058,
48154 +0xE044064E, 0xE200126E, 0xE0480426, 0x14212422,
48155 +0x14251422, 0x14261423, 0xE0400426, 0xE0500426,
48156 +0x04261424, 0x0426E04C, 0x0426E054, 0x0426E058,
48157 +0x7F701F6C, 0x6EF64F26, 0x6CF66DF6, 0x69F6000B,
48158 +0x614D4F22, 0x3123E240, 0xE21F8917, 0x89083127,
48159 +0xD550D44F, 0x450BE001, 0x67076642, 0xA00C2679,
48160 +0xE23F2462, 0x89083127, 0xD64AD749, 0xE00171E0,
48161 +0x5571460B, 0x25296207, 0x4F261751, 0x0009000B,
48162 +0x614D4F22, 0x3123E240, 0xE21F8915, 0x89073127,
48163 +0xD240D43F, 0x420B6642, 0x260BE001, 0x2462A00B,
48164 +0x3127E23F, 0xD73A8907, 0x5571D63A, 0x460B71E0,
48165 +0x250BE001, 0x4F261751, 0x0009000B, 0x4618E640,
48166 +0xD5354628, 0x22686252, 0x000B89FC, 0xE6800009,
48167 +0x46284618, 0x6252D530, 0x89FC2268, 0x0009000B,
48168 +0xE200A001, 0x32427201, 0x000B8BFC, 0xE6800009,
48169 +0x46284618, 0x6252D529, 0x8BFC2268, 0x0009000B,
48170 +0x4F222FE6, 0x6E537FFC, 0x2F42BFF1, 0xD62461E2,
48171 +0x1615E280, 0x421854E1, 0x55E21646, 0x16574228,
48172 +0x6EF257E3, 0x2E2B1678, 0x7F0426E2, 0xAFCE4F26,
48173 +0x2FC66EF6, 0x2FE62FD6, 0xDD194F22, 0xBFD66C53,
48174 +0xBFBB6E43, 0xBFD22DE2, 0x51D50009, 0x54D62C12,
48175 +0x55D71C41, 0x56D81C52, 0x4F261C63, 0x6DF66EF6,
48176 +0x6CF6000B, 0xE6006163, 0x4109A004, 0x76016256,
48177 +0x74042422, 0x8BF93612, 0x0009000B, 0x00202538,
48178 +0x001C36A0, 0x001C3CA0, 0x001C36F4, 0x001C3B88,
48179 +0x001C3704, 0x0020248C, 0x001C373C, 0x001C3700,
48180 +0x001C370C, 0x0009A109, 0x2FD62FC6, 0x4F222FE6,
48181 +0x6E636D73, 0x6C53B016, 0x64C357F4, 0xB02965E3,
48182 +0xB03D66D3, 0xB06D0009, 0xB0710009, 0xB0750009,
48183 +0xB08A0009, 0xB08D0009, 0x4F260009, 0x6DF66EF6,
48184 +0x6CF6A0B4, 0x3412D190, 0xD6900529, 0x2650D790,
48185 +0x2742000B, 0x2FD62FC6, 0x4F222FE6, 0x6E636D73,
48186 +0x6C53BFF0, 0x64C357F4, 0x66D365E3, 0x6EF64F26,
48187 +0x6CF66DF6, 0xD1872FE6, 0x66126E63, 0x92BC4418,
48188 +0x44084528, 0x45002629, 0x265B4408, 0x264B4400,
48189 +0x21624708, 0xD1804708, 0x217227EB, 0x6EF6000B,
48190 +0x4F222FE6, 0xE101DE7D, 0xBFABE40A, 0x62E32E12,
48191 +0xE100726C, 0x2212E401, 0x22122212, 0x22122212,
48192 +0x22422212, 0xE503E730, 0x2212E40A, 0x22122212,
48193 +0x22122212, 0x22122212, 0x22122212, 0x22122212,
48194 +0x22722212, 0x22122252, 0x22122212, 0x22122212,
48195 +0x22122212, 0xBF852212, 0xE600121A, 0x4F262E62,
48196 +0x6EF6000B, 0xE101D266, 0x2212E441, 0x2242000B,
48197 +0xD465D164, 0x2162E605, 0x2462000B, 0xD264D563,
48198 +0x88016050, 0xD4638B07, 0x60409668, 0x8B098801,
48199 +0xA0079665, 0xE6000009, 0x2262D45E, 0x88016040,
48200 +0xE6048B00, 0xAF5DE40A, 0xD25B2262, 0xE40AE601,
48201 +0x2262AF58, 0x2FC62FB6, 0x2FE62FD6, 0xDC574F22,
48202 +0x60C2ED00, 0xCB01EB64, 0x60C22C02, 0xA008C901,
48203 +0x3DB26E03, 0x60C28907, 0xC901E40A, 0x6E03BF42,
48204 +0x2EE87D01, 0x3DB28BF5, 0xD44D8B03, 0x420BD24D,
48205 +0xE40A0009, 0x6EF64F26, 0x6CF66DF6, 0x6BF6AF32,
48206 +0x8F014411, 0x6043604B, 0x0009000B, 0x2FC62FB6,
48207 +0x2FE62FD6, 0x7FFC4F22, 0xED00DC40, 0xEB6460C2,
48208 +0x2C02CB02, 0x2F0260C2, 0xA009C902, 0x3DB36E03,
48209 +0x60C28908, 0x2F02E40A, 0xBF13C902, 0x7D016E03,
48210 +0x8BF42EE8, 0x8B0B3DB3, 0xD236D437, 0x4F267F04,
48211 +0x6DF66EF6, 0x422B6CF6, 0x1FFF6BF6, 0x03C40340,
48212 +0x4F267F04, 0x6DF66EF6, 0x000B6CF6, 0xD52F6BF6,
48213 +0x60525651, 0x000B4628, 0x2FB6306C, 0x2FD62FC6,
48214 +0x4F222FE6, 0x4F024F12, 0x6E43BFF1, 0xDC286B03,
48215 +0xBFECDD28, 0x30B80009, 0x060A3C05, 0x46094609,
48216 +0x3D654601, 0x4209020A, 0x42094209, 0x8BF032E2,
48217 +0x4F164F06, 0x6EF64F26, 0x6CF66DF6, 0x6BF6000B,
48218 +0x4F222FE6, 0xE102DE1C, 0xE403E500, 0xBFD42E12,
48219 +0xE6062E52, 0xE7004618, 0x2E62E403, 0x4F262E72,
48220 +0x6EF6AFCB, 0x0009000B, 0x0025E720, 0x00202C3C,
48221 +0x00202998, 0x001C5814, 0x001C59D0, 0x001C5830,
48222 +0x001C6268, 0x001C59A4, 0x001C639C, 0x002029AD,
48223 +0x001C5804, 0x002029AC, 0x001C581C, 0x001C5860,
48224 +0x00202A90, 0x00200F72, 0x00202AA8, 0x001C1040,
48225 +0xCCCCCCCD, 0x10624DD3, 0x001D4004, 0x2F962F86,
48226 +0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6, 0xE4007FE0,
48227 +0x4528E510, 0x67436C43, 0xE108A00F, 0x6043644D,
48228 +0x0F564008, 0xEE0060C3, 0x815125C1, 0x81538152,
48229 +0x157315E2, 0x751415E4, 0x624D7401, 0x8BED3213,
48230 +0xDA7251F1, 0x1A1154F2, 0xD1712A12, 0x56F455F3,
48231 +0x58F657F5, 0x21421141, 0x11521153, 0x11641165,
48232 +0x11761177, 0x11881189, 0xD96A6DF2, 0xDB6A52F7,
48233 +0x29D219D1, 0x2B221B21, 0xD868EB45, 0xE9B8EA50,
48234 +0x4A084B08, 0xA020699C, 0x6EEDEE00, 0x61E36DE3,
48235 +0x41084D08, 0x31EC3DEC, 0x41084D08, 0x60C33D8C,
48236 +0xD75F4108, 0x81D12DC1, 0x410860A3, 0x60C381D2,
48237 +0xE200317C, 0x81D33492, 0x1D131DD2, 0x8D01D456,
48238 +0xD4521D24, 0x65D3B03C, 0x64ED7E01, 0x8BDC34B2,
48239 +0xDB54D14E, 0xD24F6512, 0x1B514529, 0xD14C6412,
48240 +0x2B72674D, 0xD6506722, 0x1B734729, 0x2FD26922,
48241 +0x1B82689D, 0x26926912, 0x16A25A12, 0xDA465B14,
48242 +0x5C1616B4, 0x5D1816C6, 0x6EA216D8, 0x7F2016EA,
48243 +0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6, 0x000B69F6,
48244 +0x664268F6, 0xC8036061, 0xE5008D04, 0xC9036061,
48245 +0x8B038802, 0x65635262, 0x24125124, 0x6053000B,
48246 +0x2FE62FD6, 0x7FEC4F22, 0x62536E53, 0x6D43E550,
48247 +0x4508E400, 0xE101A001, 0x60435224, 0x81212211,
48248 +0x60538123, 0x56E28122, 0x8BF53620, 0x16E4D22F,
48249 +0xE61464F3, 0x65E3420B, 0xE4FC65E1, 0x2E512549,
48250 +0x65F361F1, 0x2F112149, 0xD12854D1, 0xE614410B,
48251 +0x607157D1, 0x2701CB01, 0x7F141DE1, 0x6EF64F26,
48252 +0x6DF6000B, 0x2FE62FD6, 0x7FEC4F22, 0x66536E53,
48253 +0x6D43E5FC, 0x20596061, 0x2601CB01, 0x326052E2,
48254 +0x12E48B06, 0x31E051E2, 0x52D18B04, 0x1E22A002,
48255 +0x5664AFF0, 0x64F3D215, 0x420BE614, 0x67E165E3,
48256 +0x2719E1FC, 0x67F12E71, 0x271954D1, 0x65F3D10F,
48257 +0x410BE614, 0x52D12F71, 0xCB016021, 0x1DE12201,
48258 +0x4F267F14, 0x000B6EF6, 0x00006DF6, 0x0020259C,
48259 +0x002025A4, 0x00202594, 0x002025CC, 0x001000A0,
48260 +0x00101640, 0x001E2108, 0x001C3D00, 0x00200904,
48261 +0x2FC62FB6, 0x2FE62FD6, 0x7FFC4F22, 0x6022D225,
48262 +0x8D35C803, 0xDE242F01, 0xDB25DC24, 0xED01A016,
48263 +0xC9036061, 0x89158801, 0xD122D420, 0x0009410B,
48264 +0x65035603, 0xC8208561, 0xE0508903, 0x720102BE,
48265 +0xD21D0B26, 0x64E3420B, 0x21D2D11C, 0x66C252C1,
48266 +0x8BE53620, 0xDD1AEE01, 0x4E18A00E, 0xC9036061,
48267 +0x890D8801, 0xD713D416, 0x470BDB16, 0xD4160009,
48268 +0x65034B0B, 0x21E2D111, 0x66D252D1, 0x8BED3620,
48269 +0xC80460F1, 0xD2118907, 0x4F267F04, 0x6DF66EF6,
48270 +0x422B6CF6, 0x7F046BF6, 0x6EF64F26, 0x6CF66DF6,
48271 +0x6BF6000B, 0x001E2100, 0x002025A4, 0x0020259C,
48272 +0x00202538, 0x00200D42, 0x00200DC4, 0x001C3D30,
48273 +0x00202594, 0x00200D60, 0x002025CC, 0x00200100,
48274 +0xE601D203, 0x1265D503, 0x000B2252, 0x00001266,
48275 +0x001C1010, 0x0000C34F, 0xD62A7FFC, 0x2642644C,
48276 +0xC8205066, 0x2F028DFC, 0x7F04000B, 0x2FD62FC6,
48277 +0x4F222FE6, 0x6D436C53, 0xEE00A004, 0x7E0164D4,
48278 +0x644CBFEA, 0x8BF93EC2, 0x6EF64F26, 0x000B6DF6,
48279 +0xA0016CF6, 0x76016643, 0x22286260, 0x36488BFB,
48280 +0x6563AFE4, 0x62532FE6, 0x67537507, 0xEE0AE108,
48281 +0xC90F6043, 0x30E24409, 0x44096503, 0xE6378D01,
48282 +0x365CE630, 0x27604110, 0x77FF8FF2, 0x8028E000,
48283 +0x6EF6000B, 0xE000000B, 0xE000000B, 0x4F222FE6,
48284 +0x62537FEC, 0x65F36E43, 0x6423BFDC, 0x64E3BFD1,
48285 +0x64F3BFCF, 0xBFCCD404, 0x7F140009, 0x000B4F26,
48286 +0x00006EF6, 0x001C0004, 0x00202AC4, 0xE110D5A1,
48287 +0xE6406050, 0x2500C9FD, 0xE0FF75E9, 0x80516453,
48288 +0x80538052, 0x80568055, 0x251075EF, 0xE1EF6250,
48289 +0x2219E001, 0xE7202520, 0x24608052, 0x2570000B,
48290 +0xE4FDD595, 0xE7026152, 0x25122149, 0x74016052,
48291 +0x2502CB01, 0xD1916652, 0x25622649, 0x92C46012,
48292 +0x2102CB08, 0xC9CF6012, 0x60122102, 0x2102CB03,
48293 +0x000B1172, 0x4F221123, 0xD78AD589, 0xD48BD28A,
48294 +0xE600E100, 0x27112511, 0xBFBF2210, 0xAFD72461,
48295 +0x664C4F26, 0x4600D286, 0x6060362C, 0x000BCB10,
48296 +0x654C2600, 0x4500D282, 0x6650352C, 0x2619E1EF,
48297 +0x2560000B, 0xD27F664C, 0x362C4600, 0xCB106060,
48298 +0x2600000B, 0xD27B654C, 0x352C4500, 0xE1EF6650,
48299 +0x000B2619, 0x664C2560, 0x4600D275, 0x6060362C,
48300 +0x000BCB08, 0x654C2600, 0x4500D271, 0x6650352C,
48301 +0x2619E1F7, 0x2560000B, 0xD26E664C, 0x362C4600,
48302 +0xCB086060, 0x2600000B, 0xD26A654C, 0x352C4500,
48303 +0xE1F76650, 0x000B2619, 0x624C2560, 0x4200D664,
48304 +0x6020326C, 0x4021C908, 0x40214021, 0x600C000B,
48305 +0xD660624C, 0x326C4200, 0xC9086020, 0x40214021,
48306 +0x000B4021, 0x644C600C, 0x74FFD15B, 0x6240341C,
48307 +0x602C000B, 0x644CD159, 0x6240341C, 0x602C000B,
48308 +0x4F222FE6, 0xE60A655C, 0x8D153567, 0xBFEA6E43,
48309 +0x640C6453, 0x880160EC, 0xE00F8B02, 0x2409A002,
48310 +0x44094409, 0xE60A624C, 0x89053263, 0x644CBFE2,
48311 +0x6023620C, 0x8B00C880, 0x6023E200, 0x000B4F26,
48312 +0x4F226EF6, 0x6062D646, 0x8B038801, 0x0009B241,
48313 +0x0009A003, 0xE640D243, 0xD6432260, 0x4F26E200,
48314 +0x2622000B, 0xD63E4F22, 0x88026062, 0xB28B8B01,
48315 +0xD63D0009, 0x4F26E200, 0x2622000B, 0xD439D538,
48316 +0xE701E100, 0x000B2512, 0x0FFF2470, 0xE604D235,
48317 +0x2260000B, 0xD4354F22, 0x410BD135, 0xD5250009,
48318 +0x6650E1FD, 0x2619D233, 0x2560E700, 0x000B4F26,
48319 +0x4F222270, 0xD12ED430, 0x0009410B, 0xE7FBD51D,
48320 +0x26796650, 0x000B4F26, 0x4F222560, 0xD128D42B,
48321 +0x0009410B, 0xE7F7D517, 0x26796650, 0x000B4F26,
48322 +0xD5142560, 0x62509425, 0x000B2249, 0xD5112520,
48323 +0x6250E4BF, 0x000B2249, 0x4F222520, 0x8522D220,
48324 +0x2008600D, 0x88018911, 0x8803893C, 0x8805893E,
48325 +0x88068940, 0x88088946, 0x8809894C, 0x880A8952,
48326 +0x880B8958, 0xA065895E, 0xB0670009, 0xA0620009,
48327 +0xFF7F600C, 0x001E1028, 0x001E2148, 0x001E1108,
48328 +0x002029DC, 0x002029DE, 0x002029E9, 0x002029C0,
48329 +0x001E103F, 0x001E105F, 0x001E1030, 0x001E1090,
48330 +0x002029E4, 0x001E100B, 0x002029E0, 0x00202AC8,
48331 +0x00200F72, 0x002029E8, 0x00202AD4, 0x00202AE4,
48332 +0x002029B4, 0x0009B04C, 0x600CA035, 0x0009B056,
48333 +0x600CA031, 0x6260D67C, 0x8B2B2228, 0x0009B062,
48334 +0x600CA029, 0x6260D678, 0x8B232228, 0x0009B06A,
48335 +0x600CA021, 0x6260D674, 0x8B1B2228, 0x0009B0B4,
48336 +0x600CA019, 0x6260D670, 0x8B132228, 0x0009B0BA,
48337 +0x600CA011, 0x6260D66C, 0x8B0B2228, 0x0009B11A,
48338 +0x600CA009, 0x6260D668, 0x8B032228, 0x0009B132,
48339 +0x600CA001, 0x4F26E000, 0x0009000B, 0xD264D163,
48340 +0xD5648412, 0x4000C90F, 0xD763012D, 0x611CE403,
48341 +0xD662E20F, 0x27122540, 0xE0012520, 0x2602000B,
48342 +0xE601D25A, 0x30668523, 0xE0008D06, 0xE000D258,
48343 +0x8122D65A, 0x2602E001, 0x0009000B, 0x8523D253,
48344 +0x2008600D, 0x88018905, 0xD6558B0A, 0xCB016060,
48345 +0xD6522600, 0xE101D44E, 0x2612E001, 0x8142000B,
48346 +0xE000000B, 0xE501D149, 0x45188513, 0x3453640D,
48347 +0x8D056603, 0xD24BE000, 0xE001D548, 0x25022260,
48348 +0x0009000B, 0xD1414F22, 0x650D8513, 0x44196453,
48349 +0x672E6249, 0x602C227D, 0x89098801, 0x890C8802,
48350 +0x89108803, 0x89268806, 0x89298807, 0x0009A038,
48351 +0xD63ED53D, 0xA027E212, 0x625C2652, 0x8B2F2228,
48352 +0xA01ED63B, 0x605C6262, 0x89052008, 0x89088810,
48353 +0x890B8820, 0x0009A024, 0xD634D436, 0xA013E204,
48354 +0xD7352642, 0xE20CD631, 0x2672A00E, 0xD62FD533,
48355 +0xA009E218, 0xD4322652, 0xE20AD62C, 0x2642A004,
48356 +0xD62AD230, 0xE22E2622, 0xD42F8515, 0x3277670D,
48357 +0x8F012421, 0x24516503, 0x0009B0DB, 0xE001A001,
48358 +0x4F26E000, 0x0009000B, 0xE101D61A, 0x2610D427,
48359 +0xD7196541, 0x655DD119, 0xE001E20F, 0x26202752,
48360 +0x2102000B, 0x4F222FE6, 0x8523D210, 0x2448640C,
48361 +0xD61E8B08, 0xE200D512, 0x84512621, 0x20499412,
48362 +0x8051A050, 0x60E0DE0E, 0x8D35C840, 0x3427E201,
48363 +0xD116894C, 0x420BD216, 0xD5162141, 0xCB046052,
48364 +0x2502A035, 0x0000FF7F, 0x002029E9, 0x002029B4,
48365 +0x002029C0, 0x001E1100, 0x001E100C, 0x002029E0,
48366 +0x001E1000, 0x001E1001, 0x00202C40, 0x002029C8,
48367 +0x002029D0, 0x00202CAE, 0x00202CB2, 0x00202CBE,
48368 +0x00202CD6, 0x00202CE0, 0x002029CC, 0x002029DA,
48369 +0x00201DB6, 0x001E1108, 0x89173427, 0xD794D293,
48370 +0x2241470B, 0xE5FBD693, 0x21596162, 0x84E12612,
48371 +0xB0FFCB80, 0x60E080E1, 0xCB04D68F, 0x60602E00,
48372 +0x2600C93F, 0xE001D68D, 0x2602A001, 0x4F26E000,
48373 +0x6EF6000B, 0x6060D68A, 0x8919C880, 0x6021D283,
48374 +0x8B158801, 0xE501D287, 0x30568524, 0xD1868910,
48375 +0xD486E203, 0x65412120, 0x655DE00B, 0xD5840656,
48376 +0xE702E40F, 0x25712140, 0xE001D77C, 0x2702000B,
48377 +0xE000000B, 0x4F222FE6, 0x84E1DE7E, 0x8934C880,
48378 +0x8554D578, 0x8F302008, 0xD77B6103, 0x66728553,
48379 +0x650C6403, 0x620C8566, 0x8B263520, 0xD773D677,
48380 +0x644C651C, 0x27412651, 0xC84060E0, 0xD2748907,
48381 +0x0009420B, 0x6062D667, 0xA008CB04, 0xD1642602,
48382 +0x0009410B, 0xE5FBD663, 0x24596462, 0xB0A12642,
48383 +0xD5620009, 0x2522E201, 0xD75F60E0, 0x2E00CB04,
48384 +0xC93F6070, 0xA0012700, 0xE0006023, 0x000B4F26,
48385 +0x2FA66EF6, 0x2FC62FB6, 0x2FE62FD6, 0xE240DA5C,
48386 +0xDC5966A1, 0x3123616D, 0x62638900, 0x6ED36D2C,
48387 +0x4E2136D8, 0x4E212A61, 0xDB5BD45A, 0xE700A00F,
48388 +0x770166B2, 0x71026163, 0x65612B12, 0x71026613,
48389 +0x62612B12, 0x622D655D, 0x325C4228, 0x627C2422,
48390 +0x8BED32E3, 0xC90360D3, 0x8B108803, 0xED076EB2,
48391 +0x710261E3, 0x67132B12, 0x62E17102, 0x65712B12,
48392 +0x655D622D, 0x352C4528, 0xA00C2CD0, 0x88022452,
48393 +0xA0038B01, 0x8801E203, 0xE2018B05, 0x66B22C20,
48394 +0x677D6761, 0xEB0F2472, 0x6DA12CB0, 0x8B052DD8,
48395 +0xD432D23E, 0xE101EE00, 0x241222E2, 0x6DF66EF6,
48396 +0x6BF66CF6, 0x6AF6000B, 0x2FE62FD6, 0xE240DD30,
48397 +0x616D66D1, 0x89003123, 0x672C6263, 0xDE323678,
48398 +0x2D617703, 0xD62F4721, 0x472164E2, 0xE100A00E,
48399 +0x71016562, 0x24506253, 0x42197401, 0x74012420,
48400 +0x24504529, 0x45197401, 0x74012450, 0x3273621C,
48401 +0x42008BEE, 0x64D166E2, 0x362C4200, 0x8F062448,
48402 +0xDD222E62, 0xE500DE15, 0x2D52E701, 0x6EF62E72,
48403 +0x6DF6000B, 0x2FE62FD6, 0xEE014F22, 0xED0AA005,
48404 +0x64E3BC97, 0x64E3BC9D, 0x62EC7E01, 0x8BF732D7,
48405 +0xEE01A005, 0x64E3BC9E, 0x64E3BCA4, 0x62EC7E01,
48406 +0x8BF732D7, 0x6EF64F26, 0x6DF6000B, 0x002029DA,
48407 +0x00201EC2, 0x001E1108, 0x001E1015, 0x002029E0,
48408 +0x001E1001, 0x002029B4, 0x001E1100, 0x002029DE,
48409 +0x002029CC, 0x001E1000, 0x002029D0, 0x002029DC,
48410 +0x00201DB6, 0x001E100C, 0x002029C8, 0x002029E4,
48411 +0x2FE62FD6, 0x7FFC4F22, 0x6060D64C, 0x89488801,
48412 +0xE101D44B, 0xD74B8548, 0x650D2610, 0x45196070,
48413 +0x6659DD49, 0x61D3626E, 0xC840262D, 0x74027102,
48414 +0x8D1AD746, 0xD246666C, 0xE501DE46, 0xA0042E22,
48415 +0x6245EE04, 0x21217501, 0x625C7102, 0x8BF832E3,
48416 +0x81D46063, 0xD540E601, 0x626CE417, 0x891E3243,
48417 +0x76016255, 0xAFF82721, 0xD23C7702, 0xE501DE39,
48418 +0xA0042E22, 0x6245EE04, 0x21217501, 0x625C7102,
48419 +0x8BF832E3, 0x81D46063, 0xD535E601, 0xE417A004,
48420 +0x76016255, 0x77022721, 0x3243626C, 0x924B8BF8,
48421 +0xD4302D21, 0x6142D730, 0x65F22F12, 0x60536DF2,
48422 +0x2700C980, 0xC9606053, 0x80716103, 0x6EF26053,
48423 +0xC90365F2, 0x45294D19, 0x60DC8072, 0x81724519,
48424 +0x605C4E29, 0x401862EC, 0x8173302C, 0x21186D42,
48425 +0x6EF22FD2, 0x66F262F2, 0x46294219, 0x66F2656C,
48426 +0x64EC602C, 0x46294018, 0x4619304C, 0x606C8174,
48427 +0x305C4018, 0x81758F07, 0x0009BCBF, 0x2228620C,
48428 +0xA00A8908, 0x60130009, 0x8B038840, 0x0009B00A,
48429 +0x0009A003, 0xE202D611, 0x7F042622, 0x6EF64F26,
48430 +0x6DF6000B, 0x0009000B, 0x0000060A, 0x002029E8,
48431 +0x00202C40, 0x001E1000, 0x00202CD6, 0x00202CE2,
48432 +0x00202C52, 0x002029D0, 0x00202C82, 0x00202C80,
48433 +0x00202C54, 0x001E100C, 0x002029B4, 0x002029E0,
48434 +0x4F222FE6, 0xDE907FFC, 0x200884E9, 0x2F008D06,
48435 +0xD68FD48E, 0x0009460B, 0x64F0B146, 0x6620D28D,
48436 +0x89022668, 0xC9BF60E0, 0x7F042E00, 0x000B4F26,
48437 +0x000B6EF6, 0x2FE60009, 0xDE874F22, 0x60E0D687,
48438 +0xCBC0D487, 0x62602E00, 0xC803602C, 0x40218904,
48439 +0x70014021, 0x6603A002, 0x66034009, 0xD681616D,
48440 +0xE500A004, 0x75016262, 0x74042422, 0x3213625D,
48441 +0xD27D8BF8, 0x0009420B, 0xC9BF84E2, 0x4F2680E2,
48442 +0x6EF6000B, 0x2FD62FC6, 0x4F222FE6, 0xDC727FFC,
48443 +0x84C2D276, 0xCB40DD76, 0x80C2420B, 0x8D042008,
48444 +0x62E06E03, 0xA006642C, 0xD66A7404, 0x6160D471,
48445 +0x470BD771, 0x644D651C, 0x45216543, 0xA0044521,
48446 +0x62E6E600, 0x2F227601, 0x626D2D22, 0x8BF83253,
48447 +0xC9036043, 0x89122008, 0x89058803, 0x89068802,
48448 +0x89078801, 0x0009A008, 0xA005E007, 0xE00380D8,
48449 +0x80D8A002, 0x80D8E001, 0x2F2262E2, 0xE00F2D22,
48450 +0x80D8D65E, 0xCB086060, 0x60C02600, 0x2C00C93F,
48451 +0x4F267F04, 0x6DF66EF6, 0x6CF6000B, 0x2FC62FB6,
48452 +0x2FE62FD6, 0xD2564F22, 0x6E436D73, 0x420B6B53,
48453 +0x20086C63, 0x64038F08, 0xD245D452, 0x6EF64F26,
48454 +0x6CF66DF6, 0x6BF6422B, 0x24E060B3, 0x60C38041,
48455 +0xA0078141, 0x655DE500, 0x00DC6053, 0x324C6253,
48456 +0x80247501, 0x6EEC625D, 0x8BF432E3, 0x6060D636,
48457 +0x2600C9BF, 0x6EF64F26, 0x6CF66DF6, 0x6BF6000B,
48458 +0x7FC44F22, 0x720262F3, 0x22512F41, 0x45297202,
48459 +0x60632251, 0xE5C4E682, 0x67F38121, 0x655C666C,
48460 +0xE408BFBC, 0x4F267F3C, 0x0009000B, 0xD237D136,
48461 +0xE4056012, 0xE500CB20, 0x22422102, 0x2252000B,
48462 +0xD534D133, 0xE400D734, 0x2142E20F, 0x17411154,
48463 +0xD5322722, 0x9635D732, 0x15412572, 0x96321562,
48464 +0xE6011565, 0xD52F1165, 0x666CE6F8, 0x25422542,
48465 +0x25422542, 0x25422542, 0x25622542, 0x7601E727,
48466 +0x67632572, 0x25627797, 0xE7042572, 0x2572E248,
48467 +0xE2192522, 0xE2702522, 0x25422542, 0x25422542,
48468 +0x25222542, 0x2522E20C, 0x25422542, 0x25422542,
48469 +0x25422542, 0x25422542, 0x000B154A, 0xE2081145,
48470 +0x0009422B, 0x51630601, 0x001E1017, 0x00202AF0,
48471 +0x00200F72, 0x002029B0, 0x001E1015, 0x001E10BF,
48472 +0x00117800, 0x001E10FC, 0x00200100, 0x0020201A,
48473 +0x001E10F8, 0x00202AF4, 0x00200FBC, 0x001E10AE,
48474 +0x00201FDC, 0x00202B10, 0x001C3500, 0x001D4004,
48475 +0x001C581C, 0xA000A000, 0x001D0100, 0x001D4000,
48476 +0x00040021, 0x001C589C, 0x2FE62FD6, 0x7FFC4F22,
48477 +0xC8206043, 0x6E438D02, 0x0009BEBB, 0xC81060E3,
48478 +0xBEB88901, 0x60E30009, 0x8901C840, 0x0009BEDA,
48479 +0xC80160E3, 0xDD378936, 0xC80260D0, 0x2F008D03,
48480 +0x460BD635, 0x60F00009, 0x8902C804, 0x460BD633,
48481 +0x62F00009, 0xC8806023, 0x60D08902, 0x2D00C97F,
48482 +0xC8016023, 0xD62E8904, 0x0009460B, 0x0009A005,
48483 +0x8902C808, 0x460BD62B, 0x60F00009, 0x8902C810,
48484 +0x420BD229, 0xD5290009, 0x88026052, 0xD2288B03,
48485 +0xA005E604, 0x88012260, 0xD2258B02, 0x2260E601,
48486 +0x2522E200, 0xC88060E3, 0xD622892E, 0x60E36E60,
48487 +0x8902C880, 0x420BD220, 0x60E30009, 0x8902C840,
48488 +0x420BD21E, 0x60E30009, 0x8902C802, 0x420BD21C,
48489 +0x60E30009, 0x890EC804, 0x410BD11A, 0xBF150009,
48490 +0xBF1D0009, 0xD5180009, 0x6050D418, 0xC908D718,
48491 +0xBF542500, 0x60E32472, 0x8905C808, 0x7F04D215,
48492 +0x6EF64F26, 0x6DF6422B, 0x4F267F04, 0x000B6EF6,
48493 +0x00006DF6, 0x001E1021, 0x00201182, 0x002011A4,
48494 +0x002017B0, 0x002011BC, 0x002011CC, 0x002029E0,
48495 +0x001E100B, 0x001E1028, 0x00201222, 0x0020122E,
48496 +0x002011D4, 0x002011F2, 0x001E1000, 0x0010F100,
48497 +0x12345678, 0x0020120A, 0xD6A8644C, 0x346C74FF,
48498 +0x2450000B, 0x644CD6A6, 0x000B346C, 0xD6A52450,
48499 +0x346C644C, 0x2450000B, 0x616D625C, 0x41194208,
48500 +0x60194208, 0x644C4200, 0x324C670E, 0x207DD19E,
48501 +0xC90F4200, 0x000B321C, 0x67632200, 0x4208625C,
48502 +0x42004208, 0x324C644C, 0x4200D198, 0x000B321C,
48503 +0x2FE62270, 0x614C4F12, 0x4100D493, 0x6710314C,
48504 +0x2729E29F, 0x65736E53, 0x4719676D, 0x672E6279,
48505 +0x4221227D, 0x42214221, 0x7601662C, 0xE4014608,
48506 +0x34E84608, 0x644C4600, 0x0E1A0467, 0x215025EB,
48507 +0x000B4F16, 0x4F226EF6, 0xD2857FE8, 0x88016021,
48508 +0xD2848B7B, 0x26686621, 0xD2838B77, 0x26686621,
48509 +0xE50F8B73, 0xE401BFA0, 0xBFA3E501, 0xE586E400,
48510 +0xE400655C, 0x2F50BFA3, 0xBFA0E401, 0xE602E506,
48511 +0x60634618, 0x81F2E401, 0x6543BF9E, 0xE40185F2,
48512 +0xBFAA6543, 0x85F26603, 0x6543E401, 0x6603BFB1,
48513 +0xE40265F0, 0x6053756C, 0x80F8BF7E, 0xBF81E402,
48514 +0x84F8E512, 0x7090E402, 0x6503BF81, 0x4618E602,
48515 +0x81F66063, 0xBF7FE402, 0x85F6E500, 0x6603E402,
48516 +0xE500BF8B, 0xE40285F6, 0xBF926603, 0xE5FEE500,
48517 +0xE010655C, 0xBF5FE403, 0xE5130F54, 0xE40EBF62,
48518 +0x05FCE010, 0xBF62E40E, 0xE5007585, 0xBF63E403,
48519 +0xE500E640, 0xBF70E403, 0xE500E640, 0xBF78E403,
48520 +0xE5FFE640, 0xE014655C, 0xBF45E404, 0xE40F0F54,
48521 +0xE504BF48, 0x05FCE014, 0xBF48E40F, 0xE5017584,
48522 +0xBF49E640, 0xE501E404, 0xBF56E640, 0xE501E404,
48523 +0xE404E640, 0xAF5C7F18, 0x7F184F26, 0x000B4F26,
48524 +0x4F220009, 0xD2427FF0, 0x88016021, 0xD2418B71,
48525 +0x26686621, 0xD2408B6D, 0x26686621, 0xE50F8B69,
48526 +0xE401BF1A, 0xBF1DE501, 0xE586E400, 0xE400655C,
48527 +0x2F50BF1D, 0xBF1AE401, 0xE401E506, 0xBF1B6543,
48528 +0xE401E640, 0xBF286543, 0xE401E640, 0xBF306543,
48529 +0x65F0E640, 0x756CE402, 0xBEFD6053, 0xE40280F4,
48530 +0xE512BF00, 0xE40284F4, 0xBF007090, 0xE6406503,
48531 +0xBF01E402, 0xE640E500, 0xBF0EE402, 0xE640E500,
48532 +0xBF16E402, 0xE5FEE500, 0x6053655C, 0xBEE3E403,
48533 +0xE51380F8, 0xE40EBEE6, 0xE40E84F8, 0xBEE67085,
48534 +0xE5006503, 0xBEE7E640, 0xE500E403, 0xBEF4E640,
48535 +0xE500E403, 0xBEFCE640, 0xE5FFE403, 0x6053655C,
48536 +0xBEC9E404, 0xE40F80FC, 0xE504BECC, 0xE40F84FC,
48537 +0xBECC7083, 0xE5016503, 0xBECDE640, 0xE501E404,
48538 +0xBEDAE640, 0xE501E404, 0xE404E640, 0xAEE07F10,
48539 +0x7F104F26, 0x000B4F26, 0x00000009, 0x001E1030,
48540 +0x001E1080, 0x001E1090, 0x001E103F, 0x001E103E,
48541 +0x002029DA, 0x002029DC, 0x002029DE, 0xD21DD11C,
48542 +0x66206010, 0x676C7001, 0x3700C90F, 0xE5008D13,
48543 +0x67106210, 0x7701622C, 0x64232170, 0xD6166010,
48544 +0x44084408, 0x3428C90F, 0x62602100, 0x7201D513,
48545 +0x44082620, 0x000B354C, 0xD10F6053, 0x25586510,
48546 +0xE6008D13, 0xD60DD40B, 0x655C6540, 0x47086753,
48547 +0x37584708, 0x47086540, 0x24507501, 0x367C6040,
48548 +0x2400C90F, 0x72FF6210, 0x000B2120, 0x00006063,
48549 +0x002029AF, 0x002029AE, 0x002029B0, 0x002025D4,
48550 +0x7FFC4F22, 0xE680D19D, 0x666C6212, 0xD29C2F22,
48551 +0x67F36563, 0x420B7542, 0x7F04E404, 0x000B4F26,
48552 +0xE6800009, 0xD296666C, 0xE7006563, 0x422B7540,
48553 +0xE6806473, 0xD292666C, 0xE7006563, 0x422B7543,
48554 +0x2FB66473, 0x2FD62FC6, 0x4F222FE6, 0x4D18ED01,
48555 +0xDB8DDC8C, 0x65C252C1, 0x89203520, 0xC9036051,
48556 +0x891C8801, 0xD189DE87, 0x64E3410B, 0x85036503,
48557 +0x670D66B2, 0x89073762, 0xD286D485, 0x0009420B,
48558 +0xE701D185, 0x2172AFE6, 0xDE8464E3, 0x00094E0B,
48559 +0xD484D683, 0x410BD184, 0xAFDB26D2, 0x4F260009,
48560 +0x6DF66EF6, 0x000B6CF6, 0x4F226BF6, 0x85467FF4,
48561 +0x2F01E681, 0x666C8547, 0x854881F1, 0x81F2D270,
48562 +0x67F38542, 0x854381F3, 0x81F4E40C, 0x65636053,
48563 +0x420B81F5, 0x7F0C7540, 0x000B4F26, 0x2F860009,
48564 +0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6, 0x7FF44F22,
48565 +0xDC6EE200, 0x2F21A136, 0xDD6D6A13, 0xE0014A08,
48566 +0x4D0BD96C, 0x3A9C4A00, 0x1F917930, 0x66C21F02,
48567 +0x362052C1, 0xA1218B01, 0x60610009, 0x8801C903,
48568 +0xA11B8B01, 0x85610009, 0x8977C801, 0x85D25D63,
48569 +0xC9036603, 0x85D36403, 0x6053650D, 0x40214021,
48570 +0x4500C93F, 0x322A6103, 0x6053252D, 0xC901E210,
48571 +0xD9553123, 0x6E038D21, 0x4408D757, 0x44086570,
48572 +0x44006213, 0x25584200, 0x342C8F0E, 0x6043D253,
48573 +0x60E3072D, 0x4B196B7D, 0x658E68B9, 0x285D8801,
48574 +0x6B7C8F0B, 0x6B13A009, 0x6043D24D, 0x61ED0E2D,
48575 +0x68194119, 0x287D678E, 0xD14A6BEC, 0x22286212,
48576 +0xEBFF8901, 0xEEFF6BBC, 0x6EEC65BD, 0x8B0F35E0,
48577 +0x4D0BDD36, 0x540364C3, 0xBF76E502, 0xD4426D03,
48578 +0x410BD136, 0xD74165D3, 0xD441EE01, 0x27E2A01D,
48579 +0x26E9EEFC, 0x81D26063, 0x914E85D3, 0x81D32019,
48580 +0x450885D2, 0x81D2208B, 0xE20885D3, 0x81D3205B,
48581 +0x421885D4, 0x81D4202B, 0x854164C2, 0x814120E9,
48582 +0xD43465C2, 0xCB016051, 0x490B2501, 0x60C20009,
48583 +0x52F256F1, 0x2A02CB01, 0x2622AF79, 0x420BD21B,
48584 +0x5E0364C3, 0x85E16D03, 0x6053650D, 0x897BC820,
48585 +0x6210D129, 0x8B112228, 0xD72785EF, 0x4221620D,
48586 +0x42214221, 0xE501D625, 0x27504221, 0xD725D924,
48587 +0x2621D425, 0x2960E600, 0x24612762, 0x852162C2,
48588 +0x8B43C802, 0xD912D71E, 0xE0016270, 0x612C490B,
48589 +0x6692D91C, 0xA03E260B, 0x7E032962, 0x001C3D9C,
48590 +0x00201A3C, 0x002025CC, 0x00202994, 0x00200D42,
48591 +0x00202594, 0x00200DC4, 0x001E2130, 0x00200D60,
48592 +0x001C3D30, 0x00202C28, 0x00200F72, 0x002025A4,
48593 +0x0020248C, 0x001C3D00, 0x00202C3C, 0x00202B28,
48594 +0x00202BA8, 0x002029A8, 0x0020259C, 0x001E212C,
48595 +0x00202C2C, 0x00202C30, 0x00202D10, 0x002029EE,
48596 +0x002029EC, 0x002029F0, 0x002029F4, 0xE04CD139,
48597 +0x7201021E, 0xD9380126, 0x6290D438, 0x72016541,
48598 +0x29207501, 0x85E12451, 0x4618E640, 0x891D2068,
48599 +0xD934D733, 0x665D6171, 0x6592D733, 0x641D470B,
48600 +0xE200DE32, 0x2E20A012, 0xE90885E4, 0x49186203,
48601 +0x32902299, 0xE5018B04, 0x64E3BEB7, 0x0009A006,
48602 +0x2598D92B, 0xE5008902, 0x64E3BEAF, 0xD22AD429,
48603 +0x65D3420B, 0xEE01D729, 0x27E2AED9, 0x7C0862F1,
48604 +0x2F217201, 0xEE0462F1, 0x31E7612D, 0xAEC38901,
48605 +0x7F0C0009, 0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6,
48606 +0x000B69F6, 0x2FE668F6, 0xD21D4F22, 0x60E36E22,
48607 +0x8D02C840, 0xBE3322E2, 0xE2400009, 0x2E284218,
48608 +0xBE3E8901, 0x60E30009, 0x8905C810, 0xD216D415,
48609 +0x0009420B, 0x0009BE3D, 0xC80560E3, 0xBE8E8901,
48610 +0x60E30009, 0x8902C802, 0xAE3A4F26, 0x4F266EF6,
48611 +0x6EF6000B, 0x00202538, 0x002029EC, 0x002029F4,
48612 +0x002029EE, 0x002029F0, 0x00201AA0, 0x00202D10,
48613 +0x00008000, 0x0020259C, 0x00200D60, 0x001E212C,
48614 +0x001C3510, 0x00202C34, 0x00200F72, 0x080A0C0E,
48615 +0x00020406, 0x1A1C1E20, 0x12141618, 0x2E303234,
48616 +0x26282A2C, 0x3A3C3E40, 0x6C625648, 0x41112F26,
48617 +0xE2208F18, 0x890B3123, 0x321CD204, 0xD1026220,
48618 +0x412B312C, 0x00090009, 0x002024B6, 0x0020246C,
48619 +0x000BE000, 0x400062F6, 0x40004000, 0x40004000,
48620 +0x40004000, 0x62F6000B, 0x40004000, 0x40004000,
48621 +0x40004000, 0x40184000, 0x62F6000B, 0x40004000,
48622 +0x40004000, 0x40004000, 0x40284000, 0x62F6000B,
48623 +0x40004000, 0x40184000, 0x000B4028, 0xC90F62F6,
48624 +0x40054005, 0x40054005, 0x62F6000B, 0x4005C907,
48625 +0x40054005, 0x62F6000B, 0x4005C903, 0x000B4005,
48626 +0xC90162F6, 0x000B4005, 0x000062F6, 0x00000000,
48627 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48628 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48629 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48630 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48631 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48632 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48633 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48634 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48635 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48636 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48637 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48638 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48639 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48640 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48641 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48642 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48643 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48644 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48645 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48646 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48647 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48648 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48649 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48650 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48651 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48652 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48653 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48654 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48655 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48656 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48657 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48658 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48659 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48660 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48661 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48662 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48663 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48664 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48665 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48666 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48667 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48668 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48669 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48670 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48671 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48672 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48673 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48674 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48675 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48676 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48677 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48678 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48679 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48680 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48681 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48682 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48683 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48684 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48685 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48686 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48687 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48688 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48689 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48690 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48691 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48692 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48693 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48694 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48695 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48696 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48697 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48698 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48699 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48700 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48701 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48702 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48703 +0x00000000, 0x00000000, 0x544F0D0A, 0x46205355,
48704 +0x00003A57, 0x2079614D, 0x32203033, 0x20373030,
48705 +0x333A3231, 0x38313A37, 0x00000000, 0x00000D0A,
48706 +0x00000043, 0x42707372, 0x3D206675, 0x554E203D,
48707 +0x202C4C4C, 0x6E49677A, 0x4E497274, 0x6D754E51,
48708 +0x0000003D, 0x61766E49, 0x2064696C, 0x72657375,
48709 +0x20726F20, 0x2079656B, 0x00214449, 0x52504545,
48710 +0x57204D4F, 0x65746972, 0x6461202C, 0x003D7264,
48711 +0x6C617620, 0x0000003D, 0x00000A0D, 0x6E6B6E55,
48712 +0x206E776F, 0x6D6D6F63, 0x3D646E61, 0x00000000,
48713 +0x61437748, 0x7262696C, 0x6F697461, 0x6620206E,
48714 +0x0A6C6961, 0x0000000D, 0x73696F4E, 0x61432065,
48715 +0x7262696C, 0x6F697461, 0x6166206E, 0x21216C69,
48716 +0x00000D0A, 0x00000D0A, 0x62735576, 0x7473725F,
48717 +0x00000A0D, 0x62735576, 0x7375735F, 0x646E6570,
48718 +0x00000A0D, 0x62735576, 0x7365725F, 0x000A0D6D,
48719 +0x00000042, 0x72746E49, 0x6D652051, 0x2C797470,
48720 +0x49677A20, 0x4972746E, 0x754E514E, 0x00003D6D,
48721 +0x20746F4E, 0x756F6E65, 0x49206867, 0x4220514E,
48722 +0x0A0D6675, 0x00000000, 0x000000FF, 0x00020001,
48723 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
48724 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
48725 +0x00FF00FF, 0x00FF00FF, 0x010E010D, 0x00020003,
48726 +0x01090108, 0x0002010A, 0x00030002, 0x02020201,
48727 +0x02040203, 0x02060205, 0x02080207, 0x020A0209,
48728 +0x020C020B, 0x020E020D, 0x00FF00FF, 0x00FF00FF,
48729 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
48730 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
48731 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
48732 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
48733 +0x00FF00FF, 0x00FF00FF, 0x010E010D, 0x00FF010F,
48734 +0x01090108, 0x010B010A, 0x00030002, 0x02020201,
48735 +0x02040203, 0x02060205, 0x02080207, 0x020A0209,
48736 +0x020C020B, 0x020E020D, 0x00FF00FF, 0x00FF00FF,
48737 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
48738 +0x00FF00FF, 0x00FF00FF, 0x00205220, 0x00000046,
48739 +0x00000059, 0x49544120, 0x0000204D, 0x00000000,
48740 +0x02000112, 0x40FFFFFF, 0x91700CF3, 0x20104890,
48741 +0x02090100, 0x0101002E, 0x09FA8000, 0x04000004,
48742 +0x000000FF, 0x02010507, 0x07000200, 0x00028205,
48743 +0x05070002, 0x00400383, 0x04050701, 0x01004003,
48744 +0x002E0209, 0x80000101, 0x000409FA, 0x00FF0400,
48745 +0x05070000, 0x00400201, 0x82050700, 0x00004002,
48746 +0x03830507, 0x07010040, 0x40030405, 0x03040100,
48747 +0x030C0409, 0x0079005A, 0x00410044, 0x03180053,
48748 +0x00530055, 0x00320042, 0x0030002E, 0x00570020,
48749 +0x0041004C, 0x0000004E, 0x00000000, 0x00000000,
48750 +0x00000709, 0x00000000, 0x00000000, 0x00000000,
48751 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48752 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
48753 +0x00000000, };
48754 +
48755 +const u32_t zcFwImageSize=11540;
48756 --- /dev/null
48757 +++ b/drivers/staging/otus/hal/hpfwu_FB50_mdk.c
48758 @@ -0,0 +1,721 @@
48759 +/*
48760 + * Copyright (c) 2007-2008 Atheros Communications Inc.
48761 + *
48762 + * Permission to use, copy, modify, and/or distribute this software for any
48763 + * purpose with or without fee is hereby granted, provided that the above
48764 + * copyright notice and this permission notice appear in all copies.
48765 + *
48766 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
48767 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
48768 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
48769 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
48770 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
48771 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
48772 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
48773 + */
48774 +#include "cprecomp.h"
48775 +
48776 +const u32_t zcFwImage[] = {
48777 +0x0009000B, 0x4F222FE6, 0xD2287FFC, 0x0009420B,
48778 +0x0009B019, 0x9446D526, 0xE600A003, 0x8D043642,
48779 +0x60527601, 0x8DF9C840, 0xD4222F02, 0x4E0BDE22,
48780 +0xD4220009, 0x00094E0B, 0x4E0BD421, 0x7F040009,
48781 +0xA0254F26, 0x4F226EF6, 0x410BD11E, 0xD41E0009,
48782 +0x0009440B, 0x450BD51D, 0xD71D0009, 0x611DE1FF,
48783 +0x2712D21C, 0xD41C5029, 0xE1FFCB01, 0x1209E501,
48784 +0x12112212, 0xD5192452, 0xD6199716, 0xE7002572,
48785 +0x2670D218, 0x2272D618, 0x4F26E201, 0x2622000B,
48786 +0xDD17DC16, 0x4C0BDE17, 0x4D0B0009, 0x4E0B0009,
48787 +0xAFF80009, 0x27100009, 0x00000640, 0x0020095A,
48788 +0x001C001C, 0x00202940, 0x00200E2A, 0x0020294C,
48789 +0x00202964, 0x00200CF0, 0x00200F26, 0x002009C4,
48790 +0x001C3510, 0x001C3624, 0x001E212C, 0x002028EC,
48791 +0x00202850, 0x002028F4, 0x00202900, 0x00200BEC,
48792 +0x00201FD4, 0x002017B8, 0x2FD62FC6, 0x4F222FE6,
48793 +0xDEA17FA4, 0x61E0E01C, 0x7D016DE3, 0x61D00F14,
48794 +0xD59FD49E, 0x450BE020, 0xE0200F14, 0xE78004FC,
48795 +0x604C66E2, 0x7D7F677C, 0x1F693070, 0x2D628F17,
48796 +0x01FCE01C, 0x641CE500, 0xD797DE96, 0x3243625D,
48797 +0xA21A8B01, 0x655D0009, 0x31EC6153, 0xE0286C10,
48798 +0x6D530FC4, 0x3D7C62CE, 0xAFEF2D20, 0x20087501,
48799 +0xE01C8B15, 0xE50001FC, 0xD78BDE8A, 0x641CA00A,
48800 +0x6C53655D, 0x66C23CEC, 0x66626253, 0x2262327C,
48801 +0x1F697504, 0x3243625D, 0xA1F68BF2, 0x88012D10,
48802 +0xE01C8B16, 0xE40001FC, 0x671C2D40, 0x624DDE7D,
48803 +0x8B013273, 0x0009A1E9, 0x62E3644D, 0x72046D43,
48804 +0x3DEC6143, 0x65D2312C, 0x74086C12, 0x25C2AFEF,
48805 +0x8B188804, 0x01FCE01C, 0x2D40E400, 0xDE71671C,
48806 +0x3273624D, 0xA1D08B01, 0x644D0009, 0x62E36D43,
48807 +0x65D23DEC, 0x61437204, 0x6612312C, 0x74086C52,
48808 +0xAFED2C69, 0x880525C2, 0xE01C8B18, 0xE40001FC,
48809 +0x671C2D40, 0x624DDE63, 0x8B013273, 0x0009A1B5,
48810 +0x6C43644D, 0x3CEC62E3, 0x720465C2, 0x3D2C6D43,
48811 +0x615266D2, 0x216B7408, 0x2512AFED, 0x8B138830,
48812 +0xE200DE58, 0x64E22D20, 0x8B042448, 0x420BD257,
48813 +0xA19A0009, 0x55E10009, 0x57E356E2, 0xDD545CE4,
48814 +0x2FC64D0B, 0x7F04A191, 0x89018828, 0x0009A0EA,
48815 +0xE143DE4C, 0x622D62E1, 0x8F033217, 0x56FB1FEB,
48816 +0x2621E240, 0x8B013217, 0x0009A0D5, 0xE1015EFB,
48817 +0x301685E1, 0xA0CE8B01, 0xE4010009, 0x2D4055FB,
48818 +0x6451B179, 0xE14357FB, 0xE0546271, 0x3517652D,
48819 +0x0F568D41, 0x3563E640, 0xE6008B05, 0x0F65E034,
48820 +0xA00FE11A, 0x615372C0, 0x41214121, 0x41214121,
48821 +0x45214121, 0x45214521, 0xC9036053, 0xE0346603,
48822 +0x71180F65, 0x2209E007, 0x641DE030, 0x0F2565F3,
48823 +0x1F4EB1F1, 0x04FDE034, 0x674DE030, 0x47080CFD,
48824 +0x607361CD, 0x4108D22B, 0xE00F0CFE, 0x1F1F420B,
48825 +0x2CD96D07, 0x5EFB6073, 0x85E20FC6, 0x420B51FF,
48826 +0x2C0B600D, 0x54FE6073, 0xB1BB0FC6, 0xE05465F3,
48827 +0x652D62E1, 0xE6400F56, 0x89623563, 0xE050E100,
48828 +0x60230F15, 0x4008C903, 0x6D034000, 0xE0406103,
48829 +0xE0440FD6, 0xD217EEFF, 0x6EEC0FF6, 0x0F26E058,
48830 +0x60E3420B, 0x42216253, 0x42214221, 0x66234221,
48831 +0x326C4200, 0x45214200, 0xE0486707, 0x0F764521,
48832 +0xC9036053, 0x40085CFB, 0x7C0630FC, 0x6E036D2D,
48833 +0x1FD51FC6, 0x1F04A02E, 0x00117D00, 0x00202968,
48834 +0x00200E2A, 0x00117D04, 0x00117D84, 0x00200700,
48835 +0x0020074C, 0x00202034, 0x0FD6E04C, 0x05FEE044,
48836 +0x64D3B189, 0x64E2E048, 0xE04006FE, 0x2E422469,
48837 +0x01FE67C4, 0x667CE058, 0x420B02FE, 0x240B6063,
48838 +0x05FEE044, 0xB15D2E42, 0xE05064D3, 0x7D0101FD,
48839 +0x0F157101, 0x02FDE050, 0x3262E606, 0x56FB8BDC,
48840 +0x55FB6261, 0x85514200, 0x302C750C, 0x6103701B,
48841 +0x64F3E600, 0xE704A004, 0x76016256, 0x74042422,
48842 +0x3273626D, 0x65F38BF8, 0x641DB13C, 0xB0D256FB,
48843 +0xA0AA6461, 0xD4880009, 0xE201D588, 0x2D20450B,
48844 +0x0009A0A3, 0x8B078829, 0xE200DE85, 0x66E22D20,
48845 +0x646DB0A1, 0x0009A099, 0x622CE281, 0x8B3D3020,
48846 +0xD680E738, 0xE0442D70, 0xE0480C6E, 0x6E621DC1,
48847 +0x51611DE2, 0x54621D13, 0x55651D44, 0x57631D55,
48848 +0x5C661D76, 0x0E6E1DC7, 0x1DE8E040, 0xE050016E,
48849 +0x54641D19, 0x056E1D4A, 0x1D5BE04C, 0xE054076E,
48850 +0x0C6E1D7C, 0x1DCDE058, 0xE044026E, 0xED001D2E,
48851 +0xE04806D6, 0x16D126D2, 0x16D516D2, 0x16D616D3,
48852 +0xE04006D6, 0xE05006D6, 0x06D616D4, 0x06D6E04C,
48853 +0x06D6E054, 0x06D6E058, 0x1F29A057, 0x622CE282,
48854 +0x89313020, 0x05FCE020, 0x625CE683, 0x3260666C,
48855 +0xD65D8B07, 0x2650E500, 0x52617680, 0xA044D65B,
48856 +0xE6902622, 0x3260666C, 0xD2578B16, 0xE500D658,
48857 +0x60622250, 0xCB20D257, 0xE6052602, 0xD6562262,
48858 +0x2252460B, 0x420BD255, 0xD2550009, 0x2262E601,
48859 +0x4618D254, 0x2262A029, 0xD254D453, 0xD4546542,
48860 +0x0009420B, 0x0009A021, 0xE524D647, 0xD5452650,
48861 +0x16215257, 0x16225258, 0x16235259, 0x1624525A,
48862 +0x1625525B, 0x1626525C, 0x1627525D, 0x1628525E,
48863 +0x1F29525F, 0xE2001629, 0x15281527, 0x152A1529,
48864 +0x152C152B, 0x152E152D, 0x7F5C152F, 0x6EF64F26,
48865 +0x000B6DF6, 0x4F226CF6, 0xE240614D, 0x89173123,
48866 +0x3127E21F, 0xD43B8908, 0xE001D53B, 0x6642450B,
48867 +0x26796707, 0x2462A00C, 0x3127E23F, 0xD7358908,
48868 +0x71E0D635, 0x460BE001, 0x62075571, 0x17512529,
48869 +0x000B4F26, 0x4F220009, 0xE240614D, 0x89153123,
48870 +0x3127E21F, 0xD42B8907, 0x6642D22B, 0xE001420B,
48871 +0xA00B260B, 0xE23F2462, 0x89073127, 0xD626D725,
48872 +0x71E05571, 0xE001460B, 0x1751250B, 0x000B4F26,
48873 +0xE6400009, 0x46284618, 0x6252D520, 0x89FC2268,
48874 +0x0009000B, 0x4618E680, 0xD51C4628, 0x22686252,
48875 +0x000B89FC, 0xA0010009, 0x7201E200, 0x8BFC3242,
48876 +0x0009000B, 0x4618E680, 0xD5154628, 0x22686252,
48877 +0x000B8BFC, 0x00000009, 0x0020296C, 0x00200E2A,
48878 +0x00117D04, 0x00202858, 0x00117D80, 0x002028EC,
48879 +0x001C3500, 0x001D4004, 0x00200F26, 0x002009C4,
48880 +0x001E212C, 0x001C3D28, 0x00117D00, 0x00200E8A,
48881 +0x00202984, 0x001C3704, 0x00202034, 0x001C373C,
48882 +0x001C3700, 0x4F222FE6, 0x6E537FFC, 0x2F42BFCA,
48883 +0xD61561E2, 0x1615E280, 0x421854E1, 0x55E21646,
48884 +0x16574228, 0x6EF257E3, 0x2E2B1678, 0x7F0426E2,
48885 +0xAFA74F26, 0x2FC66EF6, 0x2FE62FD6, 0xDD0A4F22,
48886 +0xBFAF6C53, 0xBF946E43, 0xBFAB2DE2, 0x51D50009,
48887 +0x54D62C12, 0x55D71C41, 0x56D81C52, 0x4F261C63,
48888 +0x6DF66EF6, 0x6CF6000B, 0x001C370C, 0x0009A0F8,
48889 +0xD19B4F22, 0xD49B9299, 0x2122B00D, 0x9795E605,
48890 +0xB0229595, 0xB0366463, 0xB03A0009, 0xB03D0009,
48891 +0xA06C0009, 0x4F124F26, 0xD1934F02, 0x94873145,
48892 +0x4609060A, 0x46094609, 0x00293646, 0xD78CD58F,
48893 +0x2500CA01, 0x4F062762, 0x4F16000B, 0xBFEA4F22,
48894 +0xB0230009, 0xA0520009, 0x2FE64F26, 0x6E63D188,
48895 +0x44186612, 0x4528926D, 0x26294408, 0x44084500,
48896 +0x4400265B, 0x4708264B, 0x47082162, 0x27EBD181,
48897 +0x000B2172, 0xD1806EF6, 0xE603D480, 0x000B2162,
48898 +0xD27F2462, 0xE40A9656, 0x2262AFB0, 0x2FC62FB6,
48899 +0x2FE62FD6, 0xDC7B4F22, 0x2C22E201, 0xBFA5E40A,
48900 +0x60C27C44, 0xCB01ED00, 0x60C22C02, 0xC901EB64,
48901 +0x6E03A008, 0x89073DB2, 0xE40160C2, 0xBF95C901,
48902 +0x7D016E03, 0x8BF52EE8, 0x8B033DB2, 0xD26FD46E,
48903 +0x0009420B, 0x4F26E40A, 0x6DF66EF6, 0xAF856CF6,
48904 +0x44116BF6, 0x604B8F01, 0x000B6043, 0x2F860009,
48905 +0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6, 0x7FFC4F22,
48906 +0x6DA3EA00, 0xDC626BA3, 0x9914E864, 0x8B4E2BB8,
48907 +0x3AE3EE0A, 0x60C2894B, 0xCB02ED00, 0x62C22C02,
48908 +0x2F0260C2, 0xA010C902, 0x096C6E03, 0x5BB45288,
48909 +0x1FFF09B4, 0x01FF03C4, 0x89083D83, 0xE46460C2,
48910 +0xC9022F02, 0x6E03BF52, 0x2EE87D01, 0xD1518BF4,
48911 +0x54C1D551, 0x66526412, 0x6269EE01, 0x4220622F,
48912 +0x622F4219, 0x4E182299, 0x8D0322E8, 0xE4FF6423,
48913 +0x3428229A, 0x6572D749, 0x622F6259, 0x42194220,
48914 +0x2299622F, 0x8D0322E8, 0xE6FF6623, 0x3628229A,
48915 +0x3468BFA7, 0x30E2EE02, 0xAFB78901, 0xD240EB01,
48916 +0x6EECEEE6, 0xBF21E40A, 0xAFAF22E2, 0xEE0A7A01,
48917 +0x89013AE3, 0x8B033D83, 0xD234D43A, 0x0009420B,
48918 +0x4F267F04, 0x6DF66EF6, 0x6BF66CF6, 0x69F66AF6,
48919 +0x68F6000B, 0x5651D534, 0x46286052, 0x306C000B,
48920 +0x2FC62FB6, 0x2FE62FD6, 0x4F124F22, 0xBFF14F02,
48921 +0x6B036E43, 0xDD1CDC2D, 0x0009BFEC, 0x3C0530B8,
48922 +0x4609060A, 0x46014609, 0x020A3D65, 0x42094209,
48923 +0x32E24209, 0x4F068BF0, 0x4F264F16, 0x6DF66EF6,
48924 +0x000B6CF6, 0x2FE66BF6, 0xDE214F22, 0xE500E102,
48925 +0x2E12E403, 0x2E52BFD4, 0x4618E606, 0xE403E700,
48926 +0x2E722E62, 0xAFCB4F26, 0x4F226EF6, 0x0009BFEB,
48927 +0xE6E6D213, 0xE40A666C, 0x2262BFC2, 0x4F26AFE3,
48928 +0x002028F0, 0x0024CDE0, 0x10624DD3, 0x00202AF0,
48929 +0x001C5814, 0x001C59D0, 0x001C59A4, 0x001C639C,
48930 +0x001C5804, 0x001C581C, 0x00202998, 0x00200E2A,
48931 +0x001C5860, 0x001C6864, 0x001C59BC, 0x001C69BC,
48932 +0x001C947C, 0x002029B0, 0x001C1040, 0xCCCCCCCD,
48933 +0x001D4004, 0x2F962F86, 0x2FB62FA6, 0x2FD62FC6,
48934 +0x4F222FE6, 0xE4007FE4, 0x4528E510, 0x67436C43,
48935 +0xE107A00F, 0x6043644D, 0x0F564008, 0xEE0060C3,
48936 +0x815125C1, 0x81538152, 0x157315E2, 0x751415E4,
48937 +0x624D7401, 0x8BED3213, 0xDA6F51F1, 0x1A1154F2,
48938 +0xD16E2A12, 0x57F455F3, 0x6DF258F5, 0x1141D96C,
48939 +0x11532142, 0x11751152, 0x11871174, 0x52F61186,
48940 +0x19D1D668, 0xD86829D2, 0xDA68E950, 0x1621EBB4,
48941 +0x6BBC2622, 0xA0214908, 0x6EEDEE00, 0x61E36DE3,
48942 +0x41084D08, 0x31EC3DEC, 0x41084D08, 0x60C33D8C,
48943 +0xE7904108, 0x81D12DC1, 0x41086093, 0x81D2677C,
48944 +0x31AC60C3, 0x3472E200, 0x1DD281D3, 0xD4551D13,
48945 +0x1D248D01, 0xB03AD450, 0x7E0165D3, 0x34B264ED,
48946 +0xD14D8BDB, 0x6512DB52, 0x4529D24D, 0x64121B51,
48947 +0x674DD14A, 0x67222B72, 0x4729D64E, 0x69221B73,
48948 +0x689D2FD2, 0x69121B82, 0x5A122692, 0x5B1416A2,
48949 +0x16B4DA44, 0x16C65C16, 0x16EA6EA2, 0x4F267F1C,
48950 +0x6DF66EF6, 0x6BF66CF6, 0x69F66AF6, 0x68F6000B,
48951 +0x60616642, 0x8D04C803, 0x6061E500, 0x8802C903,
48952 +0x52628B03, 0x51246563, 0x000B2412, 0x2FD66053,
48953 +0x4F222FE6, 0x6E537FEC, 0xE5506253, 0xE4006D43,
48954 +0xA0014508, 0x5224E101, 0x22116043, 0x81238121,
48955 +0x81226053, 0x362056E2, 0xD22F8BF5, 0x64F316E4,
48956 +0x420BE614, 0x65E165E3, 0x2549E4FC, 0x61F12E51,
48957 +0x214965F3, 0x54D12F11, 0x410BD127, 0x57D1E614,
48958 +0xCB016071, 0x1DE12701, 0x4F267F14, 0x000B6EF6,
48959 +0x2FD66DF6, 0x4F222FE6, 0x6E537FEC, 0xE5FC6653,
48960 +0x60616D43, 0xCB012059, 0x52E22601, 0x8B063260,
48961 +0x51E212E4, 0x8B0431E0, 0xA00252D1, 0xAFF01E22,
48962 +0xD2155664, 0xE61464F3, 0x65E3420B, 0xE1FC67E1,
48963 +0x2E712719, 0x54D167F1, 0xD10F2719, 0xE61465F3,
48964 +0x2F71410B, 0x602152D1, 0x2201CB01, 0x7F141DE1,
48965 +0x6EF64F26, 0x6DF6000B, 0x002028BC, 0x002028C4,
48966 +0x002028B4, 0x002028E4, 0x0010008C, 0x00100EC0,
48967 +0x001E2108, 0x001C3D00, 0x00202194, 0x2FC62FB6,
48968 +0x2FE62FD6, 0xD6314F22, 0x60D36D62, 0x894DC803,
48969 +0xDB30DC2F, 0x0009A02C, 0xC9036061, 0x892B8801,
48970 +0xD22DD42B, 0x0009420B, 0x65035603, 0xC8208561,
48971 +0xE0508903, 0x720102BE, 0x85620B26, 0x4000600D,
48972 +0x4000366A, 0x40004624, 0x206D4624, 0xD423C903,
48973 +0x40086E03, 0xD1224000, 0x340C410B, 0x61E3D521,
48974 +0xD721E001, 0x450BD221, 0x64E37E30, 0x2702420B,
48975 +0x66C252C1, 0x8BCF3620, 0x4E18EE01, 0xA011DB1C,
48976 +0x6061EC75, 0x8801C903, 0xD4198910, 0x460BD612,
48977 +0xD4180009, 0x470BD718, 0xD2136503, 0x64C3D113,
48978 +0x22E2410B, 0x66B252B1, 0x8BEA3620, 0xC80460D3,
48979 +0xD2128906, 0x6EF64F26, 0x6CF66DF6, 0x6BF6422B,
48980 +0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, 0x001E2100,
48981 +0x002028BC, 0x00202858, 0x00200AE0, 0x002028C4,
48982 +0x00200B62, 0x00202034, 0x001C3D30, 0x00200DF0,
48983 +0x002028B4, 0x002028E4, 0x00200AFE, 0x002000F8,
48984 +0xE601D237, 0x1265D537, 0x000B2252, 0xD6361266,
48985 +0x88016062, 0xE1018B62, 0xD5342612, 0x5451D134,
48986 +0xE0406212, 0x2122324C, 0x54115752, 0x1141347C,
48987 +0x57125453, 0x1172374C, 0x52135755, 0x1123327C,
48988 +0x56146452, 0x1164364C, 0x54155754, 0x1145347C,
48989 +0x56165458, 0x1166364C, 0x6762D626, 0x327C5217,
48990 +0x57611127, 0x327C5218, 0x57621128, 0x327C5219,
48991 +0x57631129, 0x347C541A, 0x5764114A, 0x347C541B,
48992 +0x5765114B, 0x347C541C, 0x5266114C, 0x372C571D,
48993 +0x5267117D, 0x342C541E, 0x5268114E, 0x362C561F,
48994 +0xD615116F, 0x041E6262, 0x342C7694, 0xE0440146,
48995 +0x061E6262, 0x0166362C, 0x525CE048, 0xD60F051E,
48996 +0x0156352C, 0xE0546262, 0x4229051E, 0x0156352C,
48997 +0xE0585561, 0x4529061E, 0x0166365C, 0x0009000B,
48998 +0x001C1010, 0x0000C34F, 0x001C1028, 0x001C369C,
48999 +0x00202858, 0x001C3CA0, 0x001C36F4, 0x001C3B88,
49000 +0xD62F7FFC, 0x2642644C, 0xC8205066, 0x2F028DFC,
49001 +0x7F04000B, 0x2FD62FC6, 0x4F222FE6, 0x6D436C53,
49002 +0xEE00A004, 0x7E0164D4, 0x644CBFEA, 0x8BF93EC2,
49003 +0x6EF64F26, 0x000B6DF6, 0xA0016CF6, 0x76016643,
49004 +0x22286260, 0x36488BFB, 0x6563AFE4, 0x2FB62F96,
49005 +0x2FD62FC6, 0x4F222FE6, 0xEC1CED08, 0xDB196E53,
49006 +0x61C3E90A, 0x60434B0B, 0x3092C90F, 0x66038D02,
49007 +0x7630A001, 0x4D107637, 0x7E012E60, 0x7CFC8FF1,
49008 +0x8058E000, 0x6EF64F26, 0x6CF66DF6, 0x000B6BF6,
49009 +0x000B69F6, 0x000BE000, 0x2FE6E000, 0x7FEC4F22,
49010 +0x6E436253, 0xBFD165F3, 0xBFC66423, 0xBFC464E3,
49011 +0xD40564F3, 0x0009BFC1, 0x4F267F14, 0x6EF6000B,
49012 +0x001C0004, 0x002020F4, 0x002029CC, 0xE110D59C,
49013 +0xE6406050, 0x2500C9FD, 0xE0FF75E9, 0x80516453,
49014 +0x80538052, 0x80568055, 0x251075EF, 0xE1EF6250,
49015 +0x2219E001, 0xE7202520, 0x24608052, 0x2570000B,
49016 +0xE4FDD590, 0xE7026152, 0x25122149, 0x74016052,
49017 +0x2502CB01, 0xD18C6652, 0x25622649, 0x92C26012,
49018 +0x2102CB08, 0xC9CF6012, 0x60122102, 0x2102CB03,
49019 +0x000B1172, 0x4F221123, 0xE100D484, 0xD285D784,
49020 +0xD5852410, 0x2711D485, 0x2211E700, 0xBFBD2511,
49021 +0xD5832471, 0x2560E600, 0x4F26AFD2, 0xD281664C,
49022 +0x362C4600, 0xCB106060, 0x2600000B, 0xD27D654C,
49023 +0x352C4500, 0xE1EF6650, 0x000B2619, 0x664C2560,
49024 +0x4600D279, 0x6060362C, 0x000BCB10, 0x654C2600,
49025 +0x4500D275, 0x6650352C, 0x2619E1EF, 0x2560000B,
49026 +0xD270664C, 0x362C4600, 0xCB086060, 0x2600000B,
49027 +0xD26C654C, 0x352C4500, 0xE1F76650, 0x000B2619,
49028 +0x664C2560, 0x4600D268, 0x6060362C, 0x000BCB08,
49029 +0x654C2600, 0x4500D264, 0x6650352C, 0x2619E1F7,
49030 +0x2560000B, 0xD65F624C, 0x326C4200, 0xC9086020,
49031 +0x40214021, 0x000B4021, 0x624C600C, 0x4200D65A,
49032 +0x6020326C, 0x4021C908, 0x40214021, 0x600C000B,
49033 +0xD156644C, 0x341C74FF, 0x000B6240, 0xD154602C,
49034 +0x341C644C, 0x000B6240, 0x2FE6602C, 0x655C4F22,
49035 +0x3567E60A, 0x6E438D15, 0x6453BFEA, 0x60EC640C,
49036 +0x8B028801, 0xA002E00F, 0x44092409, 0x624C4409,
49037 +0x3263E60A, 0xBFE28905, 0x620C644C, 0xC8806023,
49038 +0xE2008B00, 0x4F266023, 0x6EF6000B, 0xD6414F22,
49039 +0x88016062, 0xB2228B03, 0xA0030009, 0xD23E0009,
49040 +0x2260E640, 0xE200D63D, 0x000B4F26, 0x4F222622,
49041 +0x6062D638, 0x8B018802, 0x0009B26C, 0xE200D637,
49042 +0x000B4F26, 0x0FFF2622, 0xD433D532, 0xE701E100,
49043 +0x000B2512, 0xD2302470, 0x000BE604, 0xD5202260,
49044 +0x6150E4FD, 0x2149D62E, 0x2510E700, 0x2670000B,
49045 +0xE4FBD51B, 0x22496250, 0x2520000B, 0xE4F7D518,
49046 +0x22496250, 0x2520000B, 0xD2264F22, 0x600D8522,
49047 +0x89112008, 0x89138801, 0x89158803, 0x89178805,
49048 +0x89418806, 0x89478808, 0x894D8809, 0x8953880A,
49049 +0x8959880B, 0x0009A060, 0x0009B062, 0x600CA05D,
49050 +0x0009B070, 0x600CA059, 0x0009B07A, 0x600CA055,
49051 +0x6260D606, 0x8B4F2228, 0x0009B086, 0x600CA04D,
49052 +0x001E1028, 0x001E2148, 0x001E1108, 0x0020293D,
49053 +0x0020292C, 0x0020292E, 0x00202930, 0x00202910,
49054 +0x001E1008, 0x001E103F, 0x001E105F, 0x001E1030,
49055 +0x001E1090, 0x00202938, 0x001E100B, 0x00202934,
49056 +0x0020293C, 0x00202904, 0x6260D687, 0x8B232228,
49057 +0x0009B06A, 0x600CA021, 0x6260D683, 0x8B1B2228,
49058 +0x0009B0B4, 0x600CA019, 0x6260D67F, 0x8B132228,
49059 +0x0009B0BA, 0x600CA011, 0x6260D67B, 0x8B0B2228,
49060 +0x0009B11E, 0x600CA009, 0x6260D677, 0x8B032228,
49061 +0x0009B136, 0x600CA001, 0x4F26E000, 0x0009000B,
49062 +0xD273D172, 0xD5738412, 0x4000C90F, 0xD772012D,
49063 +0x611CE403, 0xD671E20F, 0x27122540, 0xE0012520,
49064 +0x2602000B, 0xE601D269, 0x30668523, 0xE0008D06,
49065 +0xE000D267, 0x8122D669, 0x2602E001, 0x0009000B,
49066 +0x8523D262, 0x2008600D, 0x88018905, 0xD6648B0A,
49067 +0xCB016060, 0xD6612600, 0xE101D45D, 0x2612E001,
49068 +0x8142000B, 0xE000000B, 0xE501D158, 0x45188513,
49069 +0x3453640D, 0x8D056603, 0xD25AE000, 0xE001D557,
49070 +0x25022260, 0x0009000B, 0xD1504F22, 0x650D8513,
49071 +0x44196453, 0x672E6249, 0x602C227D, 0x89098801,
49072 +0x890C8802, 0x89108803, 0x89268806, 0x89298807,
49073 +0x0009A038, 0xD64DD54C, 0xA027E212, 0x625C2652,
49074 +0x8B2F2228, 0xA01ED64A, 0x605C6262, 0x89052008,
49075 +0x89088810, 0x890B8820, 0x0009A024, 0xD643D445,
49076 +0xA013E204, 0xD7442642, 0xE20CD640, 0x2672A00E,
49077 +0xD63ED542, 0xA009E218, 0xD4412652, 0xE20AD63B,
49078 +0x2642A004, 0xD639D23F, 0xE22E2622, 0xD43E8515,
49079 +0x3277670D, 0x8F012421, 0x24516503, 0x0009B0DF,
49080 +0xE001A001, 0x4F26E000, 0x0009000B, 0xE101D629,
49081 +0x2610D436, 0xD7286541, 0x655DD128, 0xE001E20F,
49082 +0x26202752, 0x2102000B, 0x4F222FE6, 0x8523D21F,
49083 +0x2448640C, 0xD62D8B08, 0xE200D521, 0x84512621,
49084 +0x20499430, 0x8051A026, 0x60E0DE1D, 0x8D0BC840,
49085 +0x3427E201, 0xD1258922, 0x420BD225, 0xD5252141,
49086 +0xCB046052, 0x2502A00B, 0x89173427, 0xD722D21F,
49087 +0x2241470B, 0xE5FBD61F, 0x21596162, 0x84E12612,
49088 +0xB12DCB80, 0x60E080E1, 0xCB04D61C, 0x60602E00,
49089 +0x2600C93F, 0xE001D609, 0x2602A001, 0x4F26E000,
49090 +0x6EF6000B, 0x0000FF7F, 0x0020293D, 0x00202904,
49091 +0x00202910, 0x001E1100, 0x001E100C, 0x00202934,
49092 +0x001E1000, 0x001E1001, 0x00202AF4, 0x00202918,
49093 +0x00202920, 0x00202B62, 0x00202B66, 0x00202B72,
49094 +0x00202B8A, 0x00202B94, 0x0020291C, 0x0020292A,
49095 +0x00201AB6, 0x001E1108, 0x00201BC2, 0x001E1015,
49096 +0x6060D696, 0x8919C880, 0x6021D295, 0x8B158801,
49097 +0xE501D294, 0x30568524, 0xD1938910, 0xD493E203,
49098 +0x65412120, 0x655DE00B, 0xD5910656, 0xE702E40F,
49099 +0x25712140, 0xE001D78F, 0x2702000B, 0xE000000B,
49100 +0x4F222FE6, 0x84E1DE8C, 0x8934C880, 0x8554D585,
49101 +0x8F302008, 0xD7896103, 0x66728553, 0x650C6403,
49102 +0x620C8566, 0x8B263520, 0xD780D685, 0x644C651C,
49103 +0x27412651, 0xC84060E0, 0xD2828907, 0x0009420B,
49104 +0x6062D681, 0xA008CB04, 0xD1802602, 0x0009410B,
49105 +0xE5FBD67D, 0x24596462, 0xB0A12642, 0xD5750009,
49106 +0x2522E201, 0xD77A60E0, 0x2E00CB04, 0xC93F6070,
49107 +0xA0012700, 0xE0006023, 0x000B4F26, 0x2FA66EF6,
49108 +0x2FC62FB6, 0x2FE62FD6, 0xE240DA69, 0xDC6666A1,
49109 +0x3123616D, 0x62638900, 0x6ED36D2C, 0x4E2136D8,
49110 +0x4E212A61, 0xDB6CD46B, 0xE700A00F, 0x770166B2,
49111 +0x71026163, 0x65612B12, 0x71026613, 0x62612B12,
49112 +0x622D655D, 0x325C4228, 0x627C2422, 0x8BED32E3,
49113 +0xC90360D3, 0x8B108803, 0xED076EB2, 0x710261E3,
49114 +0x67132B12, 0x62E17102, 0x65712B12, 0x655D622D,
49115 +0x352C4528, 0xA00C2CD0, 0x88022452, 0xA0038B01,
49116 +0x8801E203, 0xE2018B05, 0x66B22C20, 0x677D6761,
49117 +0xEB0F2472, 0x6DA12CB0, 0x8B052DD8, 0xD445D24F,
49118 +0xE101EE00, 0x241222E2, 0x6DF66EF6, 0x6BF66CF6,
49119 +0x6AF6000B, 0x2FE62FD6, 0xE240DD3D, 0x616D66D1,
49120 +0x89003123, 0x672C6263, 0xDE433678, 0x2D617703,
49121 +0xD6404721, 0x472164E2, 0xE100A00E, 0x71016562,
49122 +0x24506253, 0x42197401, 0x74012420, 0x24504529,
49123 +0x45197401, 0x74012450, 0x3273621C, 0x42008BEE,
49124 +0x64D166E2, 0x362C4200, 0x8F062448, 0xDD332E62,
49125 +0xE500DE28, 0x2D52E701, 0x6EF62E72, 0x6DF6000B,
49126 +0x2FE62FD6, 0xEE014F22, 0xED0AA005, 0x64E3BCB6,
49127 +0x64E3BCBC, 0x62EC7E01, 0x8BF732D7, 0xEE01A005,
49128 +0x64E3BCBD, 0x64E3BCC3, 0x62EC7E01, 0x8BF732D7,
49129 +0x6EF64F26, 0x6DF6000B, 0x2FE62FD6, 0x7FFC4F22,
49130 +0x6060D61F, 0x89758801, 0xE101D41E, 0xD7128548,
49131 +0x650D2610, 0x45196070, 0x6659DD1B, 0x61D3626E,
49132 +0xC840262D, 0x74027102, 0x8D47D718, 0xD218666C,
49133 +0xE501DE0A, 0xA0312E22, 0x0000EE04, 0x001E1001,
49134 +0x0020292A, 0x00202904, 0x001E1100, 0x0020292E,
49135 +0x0020291C, 0x00202934, 0x001E1000, 0x00202920,
49136 +0x0020292C, 0x00201AB6, 0x001E1108, 0x00201BC2,
49137 +0x001E1015, 0x001E100C, 0x00202918, 0x00202938,
49138 +0x0020293C, 0x00202AF4, 0x00202B8A, 0x00202B96,
49139 +0x00202B06, 0x75016245, 0x71022121, 0x32E3625C,
49140 +0x60638BF8, 0xE60181D4, 0xE417D538, 0x3243626C,
49141 +0x6255891E, 0x27217601, 0x7702AFF8, 0xDE35D234,
49142 +0x2E22E501, 0xEE04A004, 0x75016245, 0x71022121,
49143 +0x32E3625C, 0x60638BF8, 0xE60181D4, 0xA004D52E,
49144 +0x6255E417, 0x27217601, 0x626C7702, 0x8BF83243,
49145 +0x2D21924B, 0xD72AD429, 0x2F126142, 0x6DF265F2,
49146 +0xC9806053, 0x60532700, 0x6103C960, 0x60538071,
49147 +0x65F26EF2, 0x4D19C903, 0x80724529, 0x451960DC,
49148 +0x4E298172, 0x62EC605C, 0x302C4018, 0x6D428173,
49149 +0x2FD22118, 0x62F26EF2, 0x421966F2, 0x656C4629,
49150 +0x602C66F2, 0x401864EC, 0x304C4629, 0x81744619,
49151 +0x4018606C, 0x8F07305C, 0xBCB58175, 0x620C0009,
49152 +0x89082228, 0x0009A00A, 0x88406013, 0xB00A8B03,
49153 +0xA0030009, 0xD60B0009, 0x2622E202, 0x4F267F04,
49154 +0x000B6EF6, 0x000B6DF6, 0x060A0009, 0x00202B36,
49155 +0x00202B34, 0x00202920, 0x00202B08, 0x001E100C,
49156 +0x00202904, 0x00202934, 0x7FFC4F22, 0x6620D27E,
49157 +0x8D082668, 0xD47D2F60, 0x420BD27D, 0x64F00009,
49158 +0xA0907F04, 0x7F044F26, 0x000B4F26, 0x000B0009,
49159 +0x2FE60009, 0xDE774F22, 0x60E0D677, 0xCBC0D477,
49160 +0x62602E00, 0xC803602C, 0x40218904, 0x70014021,
49161 +0x6603A002, 0x66034009, 0xD671616D, 0xE500A004,
49162 +0x75016262, 0x74042422, 0x3213625D, 0xD16D8BF8,
49163 +0x0009410B, 0xE401D66C, 0x84E22641, 0x80E2C9BF,
49164 +0x000B4F26, 0x2FE66EF6, 0xD5687FFC, 0x6250DE61,
49165 +0x642C84E2, 0xCB407404, 0x80E2614D, 0x44216413,
49166 +0xD7634421, 0xE600A004, 0x76016256, 0x27222F22,
49167 +0x3243626D, 0x60138BF8, 0x2008C903, 0x88038912,
49168 +0x88028905, 0x88018906, 0xA0088907, 0xE0070009,
49169 +0x8078A005, 0xA002E003, 0xE0018078, 0x62528078,
49170 +0x27222F22, 0xD650E00F, 0x60618078, 0x8B018801,
49171 +0x2621E200, 0x6060D64F, 0x2600CB08, 0xC93F60E0,
49172 +0x7F042E00, 0x6EF6000B, 0x6021D247, 0x8D188801,
49173 +0xD2466143, 0x22106053, 0x60638021, 0xD4468121,
49174 +0xE500A007, 0x027C605D, 0x364C6603, 0x26207001,
49175 +0x625D6503, 0x3213611C, 0xD6408BF4, 0xC9BF6060,
49176 +0x000B2600, 0x2FD60009, 0x4F222FE6, 0x60437FFC,
49177 +0x8D02C820, 0xBF6A6E43, 0x60E30009, 0x8901C810,
49178 +0x0009BF67, 0xC84060E3, 0xBF8C8901, 0x60E30009,
49179 +0x8929C801, 0x60D0DD32, 0x8D03C802, 0xD6312F00,
49180 +0x0009460B, 0xC80460F0, 0xD62F8902, 0x0009460B,
49181 +0x602362F0, 0x8902C880, 0xC97F60D0, 0x60232D00,
49182 +0x8902C801, 0x420BD229, 0xD5290009, 0x88026052,
49183 +0xD2288B03, 0xA005E604, 0x88012260, 0xD2258B02,
49184 +0x2260E601, 0x2522E200, 0xC88060E3, 0xD2228916,
49185 +0x60E36E20, 0x8902C802, 0x420BD220, 0x60E30009,
49186 +0x8902C804, 0x420BD21E, 0x60E30009, 0x8905C808,
49187 +0x7F04D21C, 0x6EF64F26, 0x6DF6422B, 0x4F267F04,
49188 +0x000B6EF6, 0x00006DF6, 0x001E1020, 0x002029D0,
49189 +0x00200E2A, 0x001E1015, 0x001E10BF, 0x00117D00,
49190 +0x001E10FC, 0x002000F8, 0x00202930, 0x00117D80,
49191 +0x001E10F8, 0x001E10AE, 0x00117D84, 0x001E1017,
49192 +0x001E1021, 0x0020105C, 0x0020107E, 0x00201608,
49193 +0x00202934, 0x001E100B, 0x001E1028, 0x002010AE,
49194 +0x002010C0, 0x002010CC, 0xD6A8644C, 0x346C74FF,
49195 +0x2450000B, 0x644CD6A6, 0x000B346C, 0xD6A52450,
49196 +0x346C644C, 0x2450000B, 0x616D625C, 0x41194208,
49197 +0x60194208, 0x644C4200, 0x324C670E, 0x207DD19E,
49198 +0xC90F4200, 0x000B321C, 0x67632200, 0x4208625C,
49199 +0x42004208, 0x324C644C, 0x4200D198, 0x000B321C,
49200 +0x2FE62270, 0x614C4F12, 0x4100D493, 0x6710314C,
49201 +0x2729E29F, 0x65736E53, 0x4719676D, 0x672E6279,
49202 +0x4221227D, 0x42214221, 0x7601662C, 0xE4014608,
49203 +0x34E84608, 0x644C4600, 0x0E1A0467, 0x215025EB,
49204 +0x000B4F16, 0x4F226EF6, 0xD2857FE8, 0x88016021,
49205 +0xD2848B7B, 0x26686621, 0xD2838B77, 0x26686621,
49206 +0xE50F8B73, 0xE401BFA0, 0xBFA3E501, 0xE586E400,
49207 +0xE400655C, 0x2F50BFA3, 0xBFA0E401, 0xE602E506,
49208 +0x60634618, 0x81F2E401, 0x6543BF9E, 0xE40185F2,
49209 +0xBFAA6543, 0x85F26603, 0x6543E401, 0x6603BFB1,
49210 +0xE40265F0, 0x6053756C, 0x80F8BF7E, 0xBF81E402,
49211 +0x84F8E512, 0x7090E402, 0x6503BF81, 0x4618E602,
49212 +0x81F66063, 0xBF7FE402, 0x85F6E500, 0x6603E402,
49213 +0xE500BF8B, 0xE40285F6, 0xBF926603, 0xE5FEE500,
49214 +0xE010655C, 0xBF5FE403, 0xE5130F54, 0xE40EBF62,
49215 +0x05FCE010, 0xBF62E40E, 0xE5007585, 0xBF63E403,
49216 +0xE500E640, 0xBF70E403, 0xE500E640, 0xBF78E403,
49217 +0xE5FFE640, 0xE014655C, 0xBF45E404, 0xE40F0F54,
49218 +0xE504BF48, 0x05FCE014, 0xBF48E40F, 0xE5017584,
49219 +0xBF49E640, 0xE501E404, 0xBF56E640, 0xE501E404,
49220 +0xE404E640, 0xAF5C7F18, 0x7F184F26, 0x000B4F26,
49221 +0x4F220009, 0xD2427FF0, 0x88016021, 0xD2418B71,
49222 +0x26686621, 0xD2408B6D, 0x26686621, 0xE50F8B69,
49223 +0xE401BF1A, 0xBF1DE501, 0xE586E400, 0xE400655C,
49224 +0x2F50BF1D, 0xBF1AE401, 0xE401E506, 0xBF1B6543,
49225 +0xE401E640, 0xBF286543, 0xE401E640, 0xBF306543,
49226 +0x65F0E640, 0x756CE402, 0xBEFD6053, 0xE40280F4,
49227 +0xE512BF00, 0xE40284F4, 0xBF007090, 0xE6406503,
49228 +0xBF01E402, 0xE640E500, 0xBF0EE402, 0xE640E500,
49229 +0xBF16E402, 0xE5FEE500, 0x6053655C, 0xBEE3E403,
49230 +0xE51380F8, 0xE40EBEE6, 0xE40E84F8, 0xBEE67085,
49231 +0xE5006503, 0xBEE7E640, 0xE500E403, 0xBEF4E640,
49232 +0xE500E403, 0xBEFCE640, 0xE5FFE403, 0x6053655C,
49233 +0xBEC9E404, 0xE40F80FC, 0xE504BECC, 0xE40F84FC,
49234 +0xBECC7083, 0xE5016503, 0xBECDE640, 0xE501E404,
49235 +0xBEDAE640, 0xE501E404, 0xE404E640, 0xAEE07F10,
49236 +0x7F104F26, 0x000B4F26, 0x00000009, 0x001E1030,
49237 +0x001E1080, 0x001E1090, 0x001E103F, 0x001E103E,
49238 +0x0020292A, 0x0020292C, 0x0020292E, 0x0009000B,
49239 +0x666CE680, 0x6563D2A0, 0x7540E700, 0x6473422B,
49240 +0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6, 0x4C18EC01,
49241 +0xDA9BDB9A, 0x65B252B1, 0x89223520, 0xC9036051,
49242 +0x891E8801, 0xD197DE95, 0x64E3410B, 0x85036503,
49243 +0x670D66A2, 0xDD943762, 0xD494890A, 0x420BD294,
49244 +0xD1940009, 0xE701D494, 0x21724D0B, 0x0009AFE2,
49245 +0x420BD292, 0xD69264E3, 0x4D0BD492, 0xAFD926C2,
49246 +0x4F260009, 0x6DF66EF6, 0x6BF66CF6, 0x6AF6000B,
49247 +0x7FF44F22, 0xE6818546, 0x85472F01, 0x81F1666C,
49248 +0xD27D8548, 0x854281F2, 0x81F367F3, 0xE40C8543,
49249 +0x605381F4, 0x81F56563, 0x7540420B, 0x4F267F0C,
49250 +0x0009000B, 0x2F962F86, 0x2FB62FA6, 0x2FD62FC6,
49251 +0x4F222FE6, 0xE2007FEC, 0xA0CBDB7B, 0x6A132F21,
49252 +0x4A08D27A, 0xDE7AE001, 0x4A00420B, 0x7E303AEC,
49253 +0x1F021FE1, 0x66B2DD77, 0x362052B1, 0xA0B58B01,
49254 +0x60610009, 0x8801C903, 0xA0AF8B01, 0x85610009,
49255 +0x8974C801, 0xEE105163, 0xDC638512, 0xC9036603,
49256 +0x85136403, 0x4021600D, 0xC93F4021, 0x8D2030E3,
49257 +0xD7696503, 0x62704408, 0x44004408, 0x22284500,
49258 +0x345C8F0C, 0x6043D265, 0x625D052D, 0x60294219,
49259 +0x207D670E, 0x605C81F6, 0x81F8A00B, 0x6043D260,
49260 +0x685D052D, 0x60894819, 0x209D690E, 0x605C81F6,
49261 +0xD75C81F8, 0x22286272, 0xE0FF8902, 0x81F8600C,
49262 +0xEEFF85F8, 0x6EEC650D, 0x8B0F35E0, 0x4E0BDE45,
49263 +0x540364B3, 0xBF7BE502, 0xD4536803, 0x410BD147,
49264 +0xD7526583, 0xD452E901, 0x2792A020, 0x26E9EEFC,
49265 +0x81126063, 0x946E8513, 0x81132049, 0x45088512,
49266 +0x62036953, 0xE50885F6, 0x8112202B, 0x45188513,
49267 +0x8113209B, 0xD4478514, 0x8114205B, 0x851161B2,
49268 +0x811120E9, 0x602162B2, 0x2201CB01, 0x00094C0B,
49269 +0x56F160B2, 0xCB0152F2, 0xAF7C2A02, 0x85612622,
49270 +0xC802DC3A, 0xD938D227, 0x8D0FD82C, 0x420B64B3,
49271 +0x65030009, 0x480B6493, 0xE8015E03, 0x85EF2C82,
49272 +0x650DD635, 0x64D3460B, 0x0009AF65, 0x0009420B,
49273 +0x6E035403, 0xE5088544, 0x45186103, 0x31502159,
49274 +0xBF258B03, 0xA007E501, 0x85410009, 0x620DD52B,
49275 +0x89012258, 0xE500BF1C, 0x480B6493, 0xD42865E3,
49276 +0xE801D611, 0x2C82460B, 0x0009AF45, 0x7B0862F1,
49277 +0x2F217201, 0xEE0362F1, 0x31E7612D, 0xAF2E8901,
49278 +0x7F140009, 0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6,
49279 +0x000B69F6, 0xFE0368F6, 0x002018B8, 0x002028E4,
49280 +0x002028EC, 0x00200AE0, 0x00200E2A, 0x002028B4,
49281 +0x00200B62, 0x001E2130, 0x00202AD4, 0x00200AFE,
49282 +0x001C3D30, 0x00202AD8, 0x002028C4, 0x00202034,
49283 +0x001C3D00, 0x00202AE4, 0x00202AF0, 0x002029D4,
49284 +0x00202A54, 0x00202900, 0x002028BC, 0x001E212C,
49285 +0x00202ADC, 0x00202AE0, 0x00200E8A, 0x00008000,
49286 +0x00202AEC, 0x4F222FE6, 0x6E22D20D, 0xC84060E3,
49287 +0x22E28D02, 0x0009BE7A, 0x4218E240, 0x89012E28,
49288 +0x0009BE76, 0xC80560E3, 0xBECB8901, 0x60E30009,
49289 +0x8902C802, 0xAE734F26, 0x4F266EF6, 0x6EF6000B,
49290 +0x001C3510, 0x080A0C0E, 0x00020406, 0x1A1C1E20,
49291 +0x12141618, 0x2E303234, 0x26282A2C, 0x3A3C3E40,
49292 +0x6C625648, 0x41112F26, 0xE2208F18, 0x890B3123,
49293 +0x321CD204, 0xD1026220, 0x412B312C, 0x00090009,
49294 +0x0020205E, 0x00202014, 0x000BE000, 0x400062F6,
49295 +0x40004000, 0x40004000, 0x40004000, 0x62F6000B,
49296 +0x40004000, 0x40004000, 0x40004000, 0x40184000,
49297 +0x62F6000B, 0x40004000, 0x40004000, 0x40004000,
49298 +0x40284000, 0x62F6000B, 0x40004000, 0x40184000,
49299 +0x000B4028, 0xC90F62F6, 0x40054005, 0x40054005,
49300 +0x62F6000B, 0x4005C907, 0x40054005, 0x62F6000B,
49301 +0x4005C903, 0x000B4005, 0xC90162F6, 0x000B4005,
49302 +0x000062F6, 0x080A0C0E, 0x00020406, 0x1A1C1E20,
49303 +0x12141618, 0x2E303234, 0x26282A2C, 0x3A3C3E40,
49304 +0x6C625648, 0x41112F26, 0xE2208F18, 0x890B3123,
49305 +0x321CD204, 0xD1026220, 0x412B312C, 0x00090009,
49306 +0x0020211E, 0x002020D4, 0x000BE000, 0x400162F6,
49307 +0x40014001, 0x40014001, 0x40014001, 0x62F6000B,
49308 +0x40014001, 0x40014001, 0x40014001, 0x40194001,
49309 +0x62F6000B, 0x40014001, 0x40014001, 0x40014001,
49310 +0x40294001, 0x62F6000B, 0x40014001, 0x40194001,
49311 +0x000B4029, 0x400462F6, 0x40044004, 0xC90F4004,
49312 +0x62F6000B, 0x40044004, 0xC9074004, 0x62F6000B,
49313 +0x40044004, 0x000BC903, 0x400462F6, 0x000BC901,
49314 +0x000062F6, 0x3622E218, 0x67438F12, 0x0009A004,
49315 +0x76FF6254, 0x74012420, 0xC8036053, 0x60438BF8,
49316 +0x8902C803, 0x422BD22B, 0xD22B0009, 0x0009422B,
49317 +0x2FE66473, 0x8D4A3450, 0x27786763, 0x62438947,
49318 +0x227B225B, 0xC9016023, 0x8D203452, 0x2EE86E03,
49319 +0x60238B15, 0x8B08C803, 0x47096643, 0x47106256,
49320 +0x8FFB2622, 0xA0327604, 0x47010009, 0x61436673,
49321 +0x46106255, 0x8FFB2121, 0xA0287102, 0x66430009,
49322 +0x47106254, 0x8FFB2620, 0xA0207601, 0x61430009,
49323 +0x2EE8357C, 0x8F15317C, 0x60236653, 0x8B07C803,
49324 +0x76FC4709, 0x47106262, 0x21268FFB, 0x0009A00F,
49325 +0x65634701, 0x75FE6673, 0x46106251, 0x21258FFB,
49326 +0x0009A005, 0x626076FF, 0x8FFB4710, 0x60432124,
49327 +0x6EF6000B, 0x00202306, 0x002027B2, 0xE21E2FE6,
49328 +0x67633626, 0x8D1B6153, 0x3E106E43, 0x3E128916,
49329 +0x65E38908, 0x3672E600, 0x62148910, 0x25207601,
49330 +0x7501AFF9, 0x317C64E3, 0x6513347C, 0xE600A004,
49331 +0x625075FF, 0x24247601, 0x8BF93672, 0x60E3A011,
49332 +0x890831E2, 0x327C6213, 0x8B0432E6, 0x651364E3,
49333 +0xA0086673, 0xD28F6EF6, 0x651364E3, 0x422B6673,
49334 +0x000B6EF6, 0xE2046EF6, 0x67433622, 0x8F10356C,
49335 +0xA004346C, 0x75FF0009, 0x76FF6250, 0x60532424,
49336 +0x8BF8C803, 0xC8036043, 0xA1058901, 0xA2770009,
49337 +0xA2990009, 0x2FB60009, 0x2FD62FC6, 0x7FE42FE6,
49338 +0x6C636043, 0x66521F62, 0xC9037504, 0x1F516E53,
49339 +0x45086503, 0xE1FC6D43, 0x2D194500, 0x1F732558,
49340 +0x1F651F44, 0x2FD28D0B, 0x88086053, 0x88108923,
49341 +0x8818895B, 0xA0898B01, 0xA0BD0009, 0x62630009,
49342 +0x2D22E600, 0x7CFC7D04, 0xEB10A00D, 0xE60064E6,
49343 +0x7CF065E6, 0x62E261E6, 0x1D512D42, 0x1D231D12,
49344 +0x7E047D10, 0x3CB21FE1, 0x1F6589F0, 0x2FD21FC2,
49345 +0xA0A11FE6, 0x64D21FD4, 0x44286263, 0x44294418,
49346 +0x42184419, 0x4629242B, 0x2D424619, 0x65637D04,
49347 +0xA0217CFD, 0x67E6EB10, 0x62E67CF0, 0x64E66673,
49348 +0x256B4618, 0x2D5261E2, 0x65234729, 0x45184719,
49349 +0x4229275B, 0x42191D71, 0x47186743, 0x4429227B,
49350 +0x44196713, 0x247B4718, 0x1D431D22, 0x41194129,
49351 +0x65137D10, 0x1FE17E04, 0x89DC3CB2, 0x1FE67EFF,
49352 +0x1FC21F55, 0xA0672FD2, 0x6CF21FD4, 0x66C257F5,
49353 +0x46286273, 0x42284629, 0x2C62262B, 0x7C045DF2,
49354 +0x7DFE4729, 0xA01CEB10, 0x65E65EF1, 0x66E66273,
49355 +0x47286753, 0x6763227B, 0x452961E6, 0x257B4728,
49356 +0x2C2264E6, 0x65131C51, 0x45284629, 0x1C62265B,
49357 +0x41296643, 0x216B4628, 0x44291C13, 0x67437C10,
49358 +0x3DB27DF0, 0x1FD289E1, 0x7EFEA034, 0x51F56CF2,
49359 +0x621366C2, 0x42284618, 0x42184619, 0x2C62262B,
49360 +0x7C045DF2, 0x7DFF4119, 0xA01FEB10, 0x65E65EF1,
49361 +0x64E67DF0, 0x42286253, 0x421867E6, 0x66E6212B,
49362 +0x61432C12, 0x45194128, 0x251B4118, 0x65731C51,
49363 +0x44194528, 0x245B4518, 0x64631C42, 0x47194428,
49364 +0x274B4418, 0x46191C73, 0x61637C10, 0x89DE3DB2,
49365 +0x7EFD1FD2, 0x1FC41FE6, 0x5DF2E704, 0xA00D5EF6,
49366 +0x62E451F4, 0x66E47DFC, 0x65E464E4, 0x71012120,
49367 +0x71012160, 0x71012140, 0x71012150, 0x89F03D72,
49368 +0x66D357F3, 0x641365E3, 0x6EF67F1C, 0x6CF66DF6,
49369 +0x6BF6A190, 0x00202194, 0x2FC62FB6, 0x2FE62FD6,
49370 +0x60437FE4, 0x6C63C903, 0x66031F62, 0x460875FC,
49371 +0x61526E43, 0x4600E2FC, 0x26682E29, 0x1F441F73,
49372 +0x1F516D53, 0x8D0B1F15, 0x60632FE2, 0x891F8808,
49373 +0x89538810, 0x8B018818, 0x0009A081, 0x0009A0B9,
49374 +0xEB10A00D, 0x52D37DF0, 0x54D156D2, 0x2E1665D2,
49375 +0x2E662E26, 0x2E427EFC, 0x1FD16153, 0x3CB27CF0,
49376 +0x7D0489F0, 0x1F151FD6, 0x2FE21FC2, 0x1FE4A0A1,
49377 +0x621366E2, 0x42294619, 0x42194618, 0x2E62262B,
49378 +0x7CFF4118, 0xEB10A021, 0x54D37DF0, 0x624357D2,
49379 +0x42194229, 0x55D1212B, 0x2E1666D2, 0x41296173,
49380 +0x41194418, 0x2E46241B, 0x44296453, 0x44194718,
49381 +0x2E76274B, 0x47296763, 0x47194518, 0x257B7EFC,
49382 +0x46182E52, 0x1FD16163, 0x3CB27CF0, 0x7D0389DC,
49383 +0x1F151FD6, 0x2FE21FC2, 0x1FE4A06B, 0x57F56EF2,
49384 +0x627366E2, 0x46284629, 0x262B4229, 0x2E625CF2,
49385 +0x7CFE4728, 0xA01BEB10, 0x7DF05DF1, 0x55D251D3,
49386 +0x46296613, 0x54D1276B, 0x2E7662D2, 0x41286753,
49387 +0x217B4729, 0x61432E16, 0x41294528, 0x2E56251B,
49388 +0x44286523, 0x245B4529, 0x42282E46, 0x7CF06723,
49389 +0x89E23CB2, 0x1FD67D02, 0xA03A1FC2, 0x67F21FE4,
49390 +0x657251F5, 0x45296213, 0x45284519, 0x42194518,
49391 +0x5CF2252B, 0x41282752, 0x7CFD4118, 0xA022EB10,
49392 +0x7DF05DF1, 0x54D256D3, 0x45196563, 0x52D14628,
49393 +0x4618215B, 0x6ED26543, 0x45192716, 0x265B4428,
49394 +0x65436163, 0x45186423, 0x42284419, 0x4218254B,
49395 +0x271664E3, 0x44196623, 0x264B2756, 0x4E282766,
49396 +0x61E34E18, 0x3CB27CF0, 0x7D0189DB, 0x1FC21FD6,
49397 +0xE7041F74, 0x51F45DF2, 0x5EF6A00D, 0x84E27EFC,
49398 +0x620364E0, 0x7DFC84E1, 0x84E36503, 0x21646603,
49399 +0x21542124, 0x3D722144, 0x57F389F0, 0x641366D3,
49400 +0x7F1C65E3, 0x6DF66EF6, 0xA09D6CF6, 0x2F866BF6,
49401 +0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6, 0x614374E0,
49402 +0x6A636873, 0x6B56E920, 0x6C567AE0, 0x6D567120,
49403 +0x6E563A92, 0x64566756, 0x62566656, 0x11C121B2,
49404 +0x11E311D2, 0x11451174, 0x8DEC1166, 0x71201127,
49405 +0x6613A004, 0x7AFF6254, 0x76012620, 0x8BF92AA8,
49406 +0x6EF66083, 0x6CF66DF6, 0x6AF66BF6, 0x000B69F6,
49407 +0x2F8668F6, 0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6,
49408 +0x6A636873, 0x75E0E920, 0x56565257, 0x57545155,
49409 +0x5D525E53, 0x6B525C51, 0x24662426, 0x24762416,
49410 +0x7AE024E6, 0x24C624D6, 0x8DEC3A92, 0x66A324B6,
49411 +0x6EF66783, 0x6CF66DF6, 0x6AF66BF6, 0xA04369F6,
49412 +0x2FE668F6, 0xC8046063, 0x8D046E63, 0x62166153,
49413 +0x24227EFC, 0x60E37404, 0x8908C818, 0x71046513,
49414 +0x62526616, 0x24227EF8, 0xAFF41461, 0xE2047408,
49415 +0x65133E22, 0x66E38D02, 0x6EF6A01C, 0x6EF6AF87,
49416 +0xC8046063, 0x61638D04, 0x625275FC, 0x242671FC,
49417 +0xC8186013, 0x75F88906, 0x66525251, 0x24662426,
49418 +0x71F8AFF6, 0x3122E204, 0x66138F02, 0x0009AFA1,
49419 +0x0009A00A, 0x0009A004, 0x76FF6254, 0x74012420,
49420 +0x8BF92668, 0x6073000B, 0x0009A004, 0x625075FF,
49421 +0x242476FF, 0x8BF92668, 0x6073000B, 0x00000000,
49422 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
49423 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
49424 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
49425 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
49426 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
49427 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
49428 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
49429 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
49430 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
49431 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
49432 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
49433 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
49434 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
49435 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
49436 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
49437 +0x544F0D0A, 0x46205355, 0x00003A57, 0x2072614D,
49438 +0x32203232, 0x20373030, 0x353A3731, 0x37333A32,
49439 +0x00000000, 0x00000D0A, 0x00000043, 0x61766E49,
49440 +0x2064696C, 0x72657375, 0x20726F20, 0x2079656B,
49441 +0x00214449, 0x6E6B6E55, 0x206E776F, 0x6D6D6F63,
49442 +0x3D646E61, 0x00000000, 0x61437748, 0x7262696C,
49443 +0x6F697461, 0x6620206E, 0x0A6C6961, 0x0000000D,
49444 +0x73696F4E, 0x61432065, 0x7262696C, 0x6F697461,
49445 +0x6166206E, 0x21216C69, 0x00000D0A, 0x00000D0A,
49446 +0x00000042, 0x000000FF, 0x00020001, 0x00FF00FF,
49447 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
49448 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
49449 +0x00FF00FF, 0x010E010D, 0x00020003, 0x01090108,
49450 +0x0002010A, 0x00030002, 0x02020201, 0x02040203,
49451 +0x02060205, 0x02080207, 0x020A0209, 0x020C020B,
49452 +0x020E020D, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
49453 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
49454 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
49455 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
49456 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
49457 +0x00FF00FF, 0x010E010D, 0x00FF010F, 0x01090108,
49458 +0x010B010A, 0x00030002, 0x02020201, 0x02040203,
49459 +0x02060205, 0x02080207, 0x020A0209, 0x020C020B,
49460 +0x020E020D, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
49461 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
49462 +0x00FF00FF, 0x00000072, 0x00205220, 0x00000046,
49463 +0x00000059, 0x73204142, 0x003D7165, 0x00000074,
49464 +0x00000000, 0x02000112, 0x40FFFFFF, 0x12210ACE,
49465 +0x20104890, 0x02090100, 0x0101002E, 0x09FA8000,
49466 +0x04000004, 0x000000FF, 0x02010507, 0x07000200,
49467 +0x00028205, 0x05070002, 0x00400383, 0x04050701,
49468 +0x01004003, 0x002E0209, 0x80000101, 0x000409FA,
49469 +0x00FF0400, 0x05070000, 0x00400201, 0x82050700,
49470 +0x00004002, 0x03830507, 0x07010040, 0x40030405,
49471 +0x03040100, 0x030C0409, 0x0079005A, 0x00410044,
49472 +0x03180053, 0x00530055, 0x00320042, 0x0030002E,
49473 +0x00570020, 0x0041004C, 0x0000004E, 0x00000000,
49474 +0x00000000, 0x00000709, 0x00000000, 0x00000000,
49475 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
49476 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
49477 +0x00000000, };
49478 +
49479 +const u32_t zcFwImageSize=11204;
49480 --- /dev/null
49481 +++ b/drivers/staging/otus/hal/hpfwuinit.c
49482 @@ -0,0 +1,240 @@
49483 +/*
49484 + * Copyright (c) 2007-2008 Atheros Communications Inc.
49485 + *
49486 + * Permission to use, copy, modify, and/or distribute this software for any
49487 + * purpose with or without fee is hereby granted, provided that the above
49488 + * copyright notice and this permission notice appear in all copies.
49489 + *
49490 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
49491 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
49492 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
49493 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
49494 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
49495 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
49496 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
49497 + */
49498 +#include "../80211core/cprecomp.h"
49499 +
49500 +const u32_t zcFwImage[] = {
49501 +0x0009000B, 0x7FFC4F22, 0xD695D494, 0x0009460B,
49502 +0xD494E570, 0x4518B01E, 0x89042008, 0xD690D492,
49503 +0x462B7F04, 0xB0124F26, 0xD2900009, 0x420BD490,
49504 +0xE6000009, 0x949AD58F, 0xC8406052, 0x2F028F03,
49505 +0x8FF93642, 0x7F047601, 0x000B4F26, 0xD28A0009,
49506 +0x0009422B, 0x2FD62FC6, 0x4F222FE6, 0xD6877FEC,
49507 +0x626061F3, 0x2F208461, 0x846280F1, 0x80F27110,
49508 +0x6D438463, 0x846480F3, 0x80F46413, 0x6C538465,
49509 +0x846680F5, 0x80F6E500, 0xD77D8467, 0x846880F7,
49510 +0x80F8EE04, 0x80F98469, 0x80FA846A, 0x80FB846B,
49511 +0x80FC846C, 0x80FD846D, 0x80FE846E, 0x80FF846F,
49512 +0x6653655C, 0x7501367C, 0x665C6260, 0x242036E3,
49513 +0x74018FF6, 0x66F32F16, 0xE7107604, 0xB00D65C3,
49514 +0x6E0364D3, 0xD46B7F04, 0x420BD26B, 0x60E36503,
49515 +0x4F267F14, 0x6DF66EF6, 0x6CF6000B, 0x2FB62FA6,
49516 +0x2FD62FC6, 0x4F222FE6, 0x3F3C933A, 0x4108E141,
49517 +0x31FCE200, 0x11733526, 0x21521162, 0x11418D02,
49518 +0xE0FFA098, 0x4A18EA01, 0x262066F3, 0x32A27201,
49519 +0x76018FFB, 0x6BE3EE00, 0xE0446CF3, 0x00FE4008,
49520 +0x450BD556, 0x660361B3, 0x4008E043, 0x6DC004FE,
49521 +0x014C6063, 0x31EC3EDC, 0x60E36E1C, 0x7B0107FC,
49522 +0x2C703BA2, 0x8FE80FD4, 0xE0427C01, 0xEB004008,
49523 +0x70FC07FE, 0x6EB36CB3, 0xA0200AFE, 0x2710EDFF,
49524 +0x7C01FEE0, 0x60C36CCC, 0x657002FC, 0x6BBC3B2C,
49525 +0x01FC60B3, 0x0F1460C3, 0x0F2460B3, 0x04FC60C3,
49526 +0x342C7E01, 0x01FC604C, 0x251A62D3, 0xD43C225A,
49527 +0x2750602C, 0x064E4008, 0x2D6A4D19, 0x3EA27701,
49528 +0x66D78BDF, 0x4018E001, 0x0F646563, 0x70014519,
49529 +0x0F544629, 0x0F647001, 0x70014619, 0x90420F64,
49530 +0xE0450EFE, 0xEA014008, 0xE0460FF6, 0x4A184008,
49531 +0xED0067F3, 0x0FF637AC, 0x0FF67004, 0xE345E104,
49532 +0x7C014308, 0x6CCC33FC, 0x60C36432, 0x5531024C,
49533 +0x6BBC3B2C, 0x045C60B3, 0x60C35A32, 0x60B30A44,
49534 +0x60C30F24, 0x6A7006FC, 0x606C362C, 0x66E005FC,
49535 +0x6A5C64AC, 0x626C24AA, 0x89053420, 0x4D084D08,
49536 +0xCB0460D3, 0x600BA006, 0x7D014110, 0x8FD67701,
49537 +0xE0007E01, 0x3F3C9308, 0x6EF64F26, 0x6CF66DF6,
49538 +0x000B6BF6, 0x01386AF6, 0x00000120, 0x00200D54,
49539 +0x002002BE, 0x00102800, 0x00200D64, 0x0010F00A,
49540 +0x0010F000, 0x001C001C, 0x00103252, 0x00200DA0,
49541 +0x0010FFFC, 0x00200D7C, 0x0020032C, 0x00200370,
49542 +0x00200954, 0x0009000B, 0x2FD62FC6, 0x4F222FE6,
49543 +0x6D436C53, 0xEE00A004, 0x7E0164D4, 0x644CBFF2,
49544 +0x8BF93EC2, 0x6EF64F26, 0x000B6DF6, 0xE5006CF6,
49545 +0x6643A002, 0x76017501, 0x22286260, 0xAFE38BFA,
49546 +0x2FE60009, 0x75076253, 0xE1086753, 0x6043EE0A,
49547 +0x4409C90F, 0x650330E2, 0x8D014409, 0xE630E637,
49548 +0x4110365C, 0x8FF22760, 0xE00077FF, 0x000B8028,
49549 +0x4F226EF6, 0xBFE47FEC, 0xBFD865F3, 0x7F1464F3,
49550 +0x000B4F26, 0x4F22E000, 0xBFDA7FEC, 0x64F365F3,
49551 +0x7406BFCD, 0x4F267F14, 0xE000000B, 0x4F222FE6,
49552 +0x62537FEC, 0x65F36E43, 0x6423BFCB, 0x64E3BFBF,
49553 +0x64F3BFBD, 0xBFBAD403, 0x7F140009, 0x000B4F26,
49554 +0x00006EF6, 0x00200DB0, 0x89004011, 0x4111600B,
49555 +0x4F228906, 0x611BB004, 0x000B4F26, 0x0009600B,
49556 +0x620D2F26, 0x8F413020, 0x40180019, 0x8B0D3016,
49557 +0x31043104, 0x31043104, 0x31043104, 0x31043104,
49558 +0x890062F6, 0x4119310C, 0x6013000B, 0x41296219,
49559 +0x20084018, 0x31048927, 0x31043104, 0x31043104,
49560 +0x31043104, 0x31043104, 0x31043104, 0x31043104,
49561 +0x31043104, 0x61193104, 0x3204221D, 0x32043204,
49562 +0x32043204, 0x32043204, 0x32043204, 0x32043204,
49563 +0x32043204, 0x32043204, 0x89003204, 0x4229320C,
49564 +0x000B6023, 0xE00062F6, 0x62F6000B, 0x42286213,
49565 +0x42244129, 0x42243104, 0x42243104, 0x42243104,
49566 +0x42243104, 0x42243104, 0x42243104, 0x42243104,
49567 +0x42243104, 0x42243104, 0x42243104, 0x42243104,
49568 +0x42243104, 0x42243104, 0x42243104, 0x42243104,
49569 +0x89003104, 0x6013310C, 0x62F6000B, 0x2F262F16,
49570 +0x51F552F3, 0x52F22129, 0x52F41210, 0x212951F6,
49571 +0x121152F2, 0x000B62F6, 0x000061F6, 0x51F32F16,
49572 +0x310050F1, 0x51F48B02, 0x310050F2, 0x000B0029,
49573 +0x000061F6, 0x51F32F16, 0x310050F1, 0x51F48B06,
49574 +0x310050F2, 0xCA010029, 0x61F6000B, 0x000BE001,
49575 +0x000061F6, 0x50F0000B, 0x2F262F16, 0xE10052F2,
49576 +0x12001211, 0x000B62F6, 0x000061F6, 0x2F162F06,
49577 +0x8B264115, 0x3103E040, 0x2F26892B, 0x52F62F36,
49578 +0xE02053F5, 0x8B053103, 0xE3006233, 0x89093100,
49579 +0x3108A002, 0x8B0F2338, 0xD0064F22, 0x6023400B,
49580 +0x4F266203, 0x112151F4, 0x63F61130, 0x61F662F6,
49581 +0x60F6000B, 0x002007F4, 0x4100C709, 0x0123011D,
49582 +0x51F20009, 0x110150F4, 0x110050F3, 0x000B61F6,
49583 +0x51F260F6, 0x1101E000, 0x61F61100, 0x60F6000B,
49584 +0x01300000, 0x0128012C, 0x01200124, 0x0118011C,
49585 +0x0106010A, 0x00FE0102, 0x00E200E6, 0x00DA00DE,
49586 +0x00CC00D0, 0x00C400C8, 0x00A800AC, 0x00A000A4,
49587 +0x008C0090, 0x00840088, 0x0066006A, 0x005E0062,
49588 +0x42244300, 0x42244300, 0x42244300, 0x43286133,
49589 +0x43084318, 0x42284308, 0x42084218, 0x41094208,
49590 +0xAFAF4109, 0x4300221B, 0x43004224, 0x43004224,
49591 +0x61334224, 0x43184328, 0x42184228, 0xAFA14119,
49592 +0x4300221B, 0x43004224, 0x43004224, 0x61334224,
49593 +0x43084328, 0x42284308, 0x42084208, 0x41094119,
49594 +0xAF8F4109, 0x4300221B, 0x43004224, 0x43004224,
49595 +0x61334224, 0x212D4328, 0x6213AF84, 0x42244300,
49596 +0x42244300, 0x42244300, 0x43186133, 0x43084308,
49597 +0x42084218, 0x41294208, 0x41094109, 0x221BAF72,
49598 +0x42244300, 0x42244300, 0x42244300, 0x43186133,
49599 +0x41294218, 0xAF654119, 0x4300221B, 0x43004224,
49600 +0x43004224, 0x43004224, 0x43004224, 0x43004224,
49601 +0x43004224, 0x4224AF56, 0x2F162F06, 0x8B264115,
49602 +0x3103E040, 0x2F26892B, 0x52F62F36, 0xE02053F5,
49603 +0x8B053103, 0xE2006323, 0x89093100, 0x3108A002,
49604 +0x8B0F2228, 0xD0064F22, 0x6033400B, 0x4F266303,
49605 +0x112151F4, 0x63F61130, 0x61F662F6, 0x60F6000B,
49606 +0x002008B4, 0x4100C709, 0x0123011D, 0x51F20009,
49607 +0x110150F4, 0x110050F3, 0x000B61F6, 0x51F260F6,
49608 +0x1101E000, 0x61F61100, 0x60F6000B, 0x012E0000,
49609 +0x0126012A, 0x011E0122, 0x0116011A, 0x01040108,
49610 +0x00FC0100, 0x00E000E4, 0x00D800DC, 0x00CC00D0,
49611 +0x00C400C8, 0x00A800AC, 0x00A000A4, 0x008C0090,
49612 +0x00840088, 0x0066006A, 0x005E0062, 0x43254201,
49613 +0x43254201, 0x43254201, 0x42296123, 0x42094219,
49614 +0x43294209, 0x43094319, 0x41084309, 0xAFAF4108,
49615 +0x4201231B, 0x42014325, 0x42014325, 0x61234325,
49616 +0x42194229, 0x43194329, 0xAFA14118, 0x4201231B,
49617 +0x42014325, 0x42014325, 0x61234325, 0x42094229,
49618 +0x43294209, 0x43094309, 0x41084118, 0xAF8F4108,
49619 +0x4201231B, 0x42014325, 0x42014325, 0x61234325,
49620 +0xAF854229, 0x4201231D, 0x42014325, 0x42014325,
49621 +0x61234325, 0x42094219, 0x43194209, 0x43094309,
49622 +0x41084128, 0xAF734108, 0x4201231B, 0x42014325,
49623 +0x42014325, 0x61234325, 0x43194219, 0x41184128,
49624 +0x231BAF66, 0x43254201, 0x43254201, 0x43254201,
49625 +0x43254201, 0x43254201, 0x43254201, 0xAF574201,
49626 +0x00004325, 0x080A0C0E, 0x00020406, 0x1A1C1E20,
49627 +0x12141618, 0x2E303234, 0x26282A2C, 0x3A3C3E40,
49628 +0x6C625648, 0x41112F26, 0xE2208F18, 0x890B3123,
49629 +0x321CD204, 0xD1026220, 0x412B312C, 0x00090009,
49630 +0x0020081E, 0x002007D4, 0x000BE000, 0x400062F6,
49631 +0x40004000, 0x40004000, 0x40004000, 0x62F6000B,
49632 +0x40004000, 0x40004000, 0x40004000, 0x40184000,
49633 +0x62F6000B, 0x40004000, 0x40004000, 0x40004000,
49634 +0x40284000, 0x62F6000B, 0x40004000, 0x40184000,
49635 +0x000B4028, 0xC90F62F6, 0x40054005, 0x40054005,
49636 +0x62F6000B, 0x4005C907, 0x40054005, 0x62F6000B,
49637 +0x4005C903, 0x000B4005, 0xC90162F6, 0x000B4005,
49638 +0x000062F6, 0x080A0C0E, 0x00020406, 0x1A1C1E20,
49639 +0x12141618, 0x2E303234, 0x26282A2C, 0x3A3C3E40,
49640 +0x6C625648, 0x41112F26, 0xE2208F18, 0x890B3123,
49641 +0x321CD204, 0xD1026220, 0x412B312C, 0x00090009,
49642 +0x002008DE, 0x00200894, 0x000BE000, 0x400162F6,
49643 +0x40014001, 0x40014001, 0x40014001, 0x62F6000B,
49644 +0x40014001, 0x40014001, 0x40014001, 0x40194001,
49645 +0x62F6000B, 0x40014001, 0x40014001, 0x40014001,
49646 +0x40294001, 0x62F6000B, 0x40014001, 0x40194001,
49647 +0x000B4029, 0x400462F6, 0x40044004, 0xC90F4004,
49648 +0x62F6000B, 0x40044004, 0xC9074004, 0x62F6000B,
49649 +0x40044004, 0x000BC903, 0x400462F6, 0x000BC901,
49650 +0x000062F6, 0x00000000, 0x77073096, 0xEE0E612C,
49651 +0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535,
49652 +0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E,
49653 +0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07,
49654 +0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148,
49655 +0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551,
49656 +0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A,
49657 +0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63,
49658 +0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4,
49659 +0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD,
49660 +0xA50AB56B, 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6,
49661 +0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF,
49662 +0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180,
49663 +0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599,
49664 +0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2,
49665 +0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB,
49666 +0xB6662D3D, 0x76DC4190, 0x01DB7106, 0x98D220BC,
49667 +0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5,
49668 +0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E,
49669 +0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97,
49670 +0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8,
49671 +0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1,
49672 +0xF50FC457, 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA,
49673 +0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3,
49674 +0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074,
49675 +0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D,
49676 +0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846,
49677 +0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F,
49678 +0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010,
49679 +0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409,
49680 +0xCE61E49F, 0x5EDEF90E, 0x29D9C998, 0xB0D09822,
49681 +0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B,
49682 +0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C,
49683 +0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615,
49684 +0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E,
49685 +0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27,
49686 +0x7D079EB1, 0xF00F9344, 0x8708A3D2, 0x1E01F268,
49687 +0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671,
49688 +0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A,
49689 +0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43,
49690 +0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4,
49691 +0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD,
49692 +0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6,
49693 +0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF,
49694 +0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0,
49695 +0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9,
49696 +0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92,
49697 +0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B,
49698 +0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C,
49699 +0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785,
49700 +0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE,
49701 +0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7,
49702 +0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8,
49703 +0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1,
49704 +0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA,
49705 +0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3,
49706 +0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354,
49707 +0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D,
49708 +0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66,
49709 +0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F,
49710 +0x30B5FFE9, 0xBDBDF21C, 0xCABAC28A, 0x53B39330,
49711 +0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729,
49712 +0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02,
49713 +0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B,
49714 +0x2D02EF8D, 0x544F0D0A, 0x50205355, 0x20312D48,
49715 +0x003A5746, 0x72636564, 0x69747079, 0x65206E6F,
49716 +0x726F7272, 0x0A0D2121, 0x00000000, 0x6564667A,
49717 +0x70797263, 0x65725F74, 0x616C7567, 0x79726F74,
49718 +0x6261745F, 0x7220656C, 0x203D7465, 0x00000000,
49719 +0x45485441, 0x38731652, 0x89ACFF91, 0xEE55D178,
49720 +0xEE000D0A, };
49721 +
49722 +const u32_t zcFwImageSize=3508;
49723 --- /dev/null
49724 +++ b/drivers/staging/otus/hal/hpfwu_OTUS_RC.c
49725 @@ -0,0 +1,715 @@
49726 +/*
49727 + * Copyright (c) 2007-2008 Atheros Communications Inc.
49728 + *
49729 + * Permission to use, copy, modify, and/or distribute this software for any
49730 + * purpose with or without fee is hereby granted, provided that the above
49731 + * copyright notice and this permission notice appear in all copies.
49732 + *
49733 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
49734 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
49735 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
49736 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
49737 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
49738 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
49739 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
49740 + */
49741 +#include "cprecomp.h"
49742 +
49743 +const u32_t zcFwImage[] = {
49744 +0x0009000B, 0x4F222FE6, 0xDE287FFC, 0xE114D728,
49745 +0x1E13D428, 0x1E4C470B, 0x0009B018, 0xA0039543,
49746 +0x3652E600, 0x76018D04, 0xC84060E2, 0x2F028DF9,
49747 +0xDE22D421, 0x00094E0B, 0x4E0BD421, 0xD4210009,
49748 +0x00094E0B, 0x4F267F04, 0x6EF6A022, 0xD11E4F22,
49749 +0x0009410B, 0x440BD41D, 0xD51D0009, 0x0009450B,
49750 +0xE1FFD71C, 0xD21C611D, 0x50292712, 0xCB01E1FF,
49751 +0xD61BD41A, 0x22121209, 0xE5011211, 0x2452E200,
49752 +0xD5182622, 0x970FD618, 0x4F262572, 0x2620000B,
49753 +0xDD17DC16, 0x4C0BDE17, 0x4D0B0009, 0x4E0B0009,
49754 +0xAFF80009, 0x27100009, 0x00000640, 0x001C001C,
49755 +0x002008EA, 0x0000B38E, 0x002028DC, 0x00200DA6,
49756 +0x002028E8, 0x00202900, 0x00200C6C, 0x00200EA2,
49757 +0x00200940, 0x001C3510, 0x001C3624, 0x001E212C,
49758 +0x00202894, 0x0020288C, 0x002027F0, 0x00200B68,
49759 +0x00201F74, 0x00201734, 0x2FD62FC6, 0x4F222FE6,
49760 +0xDEA17FA4, 0x61E0E01C, 0x7D016DE3, 0x61D00F14,
49761 +0xD59FD49E, 0x450BE020, 0xE0200F14, 0xE78004FC,
49762 +0x604C66E2, 0x7D7F677C, 0x1F693070, 0x2D628F17,
49763 +0x01FCE01C, 0x641CE500, 0xD797DE96, 0x3243625D,
49764 +0xA21A8B01, 0x655D0009, 0x31EC6153, 0xE0286C10,
49765 +0x6D530FC4, 0x3D7C62CE, 0xAFEF2D20, 0x20087501,
49766 +0xE01C8B15, 0xE50001FC, 0xD78BDE8A, 0x641CA00A,
49767 +0x6C53655D, 0x66C23CEC, 0x66626253, 0x2262327C,
49768 +0x1F697504, 0x3243625D, 0xA1F68BF2, 0x88012D10,
49769 +0xE01C8B16, 0xE40001FC, 0x671C2D40, 0x624DDE7D,
49770 +0x8B013273, 0x0009A1E9, 0x62E3644D, 0x72046D43,
49771 +0x3DEC6143, 0x65D2312C, 0x74086C12, 0x25C2AFEF,
49772 +0x8B188804, 0x01FCE01C, 0x2D40E400, 0xDE71671C,
49773 +0x3273624D, 0xA1D08B01, 0x644D0009, 0x62E36D43,
49774 +0x65D23DEC, 0x61437204, 0x6612312C, 0x74086C52,
49775 +0xAFED2C69, 0x880525C2, 0xE01C8B18, 0xE40001FC,
49776 +0x671C2D40, 0x624DDE63, 0x8B013273, 0x0009A1B5,
49777 +0x6C43644D, 0x3CEC62E3, 0x720465C2, 0x3D2C6D43,
49778 +0x615266D2, 0x216B7408, 0x2512AFED, 0x8B138830,
49779 +0xE200DE58, 0x64E22D20, 0x8B042448, 0x420BD257,
49780 +0xA19A0009, 0x55E10009, 0x57E356E2, 0xDD545CE4,
49781 +0x2FC64D0B, 0x7F04A191, 0x89018828, 0x0009A0EA,
49782 +0xE143DE4C, 0x622D62E1, 0x8F033217, 0x56FB1FEB,
49783 +0x2621E240, 0x8B013217, 0x0009A0D5, 0xE1015EFB,
49784 +0x301685E1, 0xA0CE8B01, 0xE4010009, 0x2D4055FB,
49785 +0x6451B179, 0xE14357FB, 0xE0546271, 0x3517652D,
49786 +0x0F568D41, 0x3563E640, 0xE6008B05, 0x0F65E034,
49787 +0xA00FE11A, 0x615372C0, 0x41214121, 0x41214121,
49788 +0x45214121, 0x45214521, 0xC9036053, 0xE0346603,
49789 +0x71180F65, 0x2209E007, 0x641DE030, 0x0F2565F3,
49790 +0x1F4EB1F1, 0x04FDE034, 0x674DE030, 0x47080CFD,
49791 +0x607361CD, 0x4108D22B, 0xE00F0CFE, 0x1F1F420B,
49792 +0x2CD96D07, 0x5EFB6073, 0x85E20FC6, 0x420B51FF,
49793 +0x2C0B600D, 0x54FE6073, 0xB1BB0FC6, 0xE05465F3,
49794 +0x652D62E1, 0xE6400F56, 0x89623563, 0xE050E100,
49795 +0x60230F15, 0x4008C903, 0x6D034000, 0xE0406103,
49796 +0xE0440FD6, 0xD217EEFF, 0x6EEC0FF6, 0x0F26E058,
49797 +0x60E3420B, 0x42216253, 0x42214221, 0x66234221,
49798 +0x326C4200, 0x45214200, 0xE0486707, 0x0F764521,
49799 +0xC9036053, 0x40085CFB, 0x7C0630FC, 0x6E036D2D,
49800 +0x1FD51FC6, 0x1F04A02E, 0x00117D00, 0x00202904,
49801 +0x00200DA6, 0x00117D04, 0x00117D84, 0x00200700,
49802 +0x0020074C, 0x00201FD4, 0x0FD6E04C, 0x05FEE044,
49803 +0x64D3B189, 0x64E2E048, 0xE04006FE, 0x2E422469,
49804 +0x01FE67C4, 0x667CE058, 0x420B02FE, 0x240B6063,
49805 +0x05FEE044, 0xB15D2E42, 0xE05064D3, 0x7D0101FD,
49806 +0x0F157101, 0x02FDE050, 0x3262E606, 0x56FB8BDC,
49807 +0x55FB6261, 0x85514200, 0x302C750C, 0x6103701B,
49808 +0x64F3E600, 0xE704A004, 0x76016256, 0x74042422,
49809 +0x3273626D, 0x65F38BF8, 0x641DB13C, 0xB0D256FB,
49810 +0xA0AA6461, 0xD4880009, 0xE201D588, 0x2D20450B,
49811 +0x0009A0A3, 0x8B078829, 0xE200DE85, 0x66E22D20,
49812 +0x646DB0A1, 0x0009A099, 0x622CE281, 0x8B3D3020,
49813 +0xD680E738, 0xE0442D70, 0xE0480C6E, 0x6E621DC1,
49814 +0x51611DE2, 0x54621D13, 0x55651D44, 0x57631D55,
49815 +0x5C661D76, 0x0E6E1DC7, 0x1DE8E040, 0xE050016E,
49816 +0x54641D19, 0x056E1D4A, 0x1D5BE04C, 0xE054076E,
49817 +0x0C6E1D7C, 0x1DCDE058, 0xE044026E, 0xED001D2E,
49818 +0xE04806D6, 0x16D126D2, 0x16D516D2, 0x16D616D3,
49819 +0xE04006D6, 0xE05006D6, 0x06D616D4, 0x06D6E04C,
49820 +0x06D6E054, 0x06D6E058, 0x1F29A057, 0x622CE282,
49821 +0x89313020, 0x05FCE020, 0x625CE683, 0x3260666C,
49822 +0xD65D8B07, 0x2650E500, 0x52617680, 0xA044D65B,
49823 +0xE6902622, 0x3260666C, 0xD2578B16, 0xE500D658,
49824 +0x60622250, 0xCB20D257, 0xE6052602, 0xD6562262,
49825 +0x2252460B, 0x420BD255, 0xD2550009, 0x2262E601,
49826 +0x4618D254, 0x2262A029, 0xD254D453, 0xD4546542,
49827 +0x0009420B, 0x0009A021, 0xE524D647, 0xD5452650,
49828 +0x16215257, 0x16225258, 0x16235259, 0x1624525A,
49829 +0x1625525B, 0x1626525C, 0x1627525D, 0x1628525E,
49830 +0x1F29525F, 0xE2001629, 0x15281527, 0x152A1529,
49831 +0x152C152B, 0x152E152D, 0x7F5C152F, 0x6EF64F26,
49832 +0x000B6DF6, 0x4F226CF6, 0xE240614D, 0x89173123,
49833 +0x3127E21F, 0xD43B8908, 0xE001D53B, 0x6642450B,
49834 +0x26796707, 0x2462A00C, 0x3127E23F, 0xD7358908,
49835 +0x71E0D635, 0x460BE001, 0x62075571, 0x17512529,
49836 +0x000B4F26, 0x4F220009, 0xE240614D, 0x89153123,
49837 +0x3127E21F, 0xD42B8907, 0x6642D22B, 0xE001420B,
49838 +0xA00B260B, 0xE23F2462, 0x89073127, 0xD626D725,
49839 +0x71E05571, 0xE001460B, 0x1751250B, 0x000B4F26,
49840 +0xE6400009, 0x46284618, 0x6252D520, 0x89FC2268,
49841 +0x0009000B, 0x4618E680, 0xD51C4628, 0x22686252,
49842 +0x000B89FC, 0xA0010009, 0x7201E200, 0x8BFC3242,
49843 +0x0009000B, 0x4618E680, 0xD5154628, 0x22686252,
49844 +0x000B8BFC, 0x00000009, 0x00202908, 0x00200DA6,
49845 +0x00117D04, 0x002027F8, 0x00117D80, 0x0020288C,
49846 +0x001C3500, 0x001D4004, 0x00200EA2, 0x00200940,
49847 +0x001E212C, 0x001C3D28, 0x00117D00, 0x00200E06,
49848 +0x00202920, 0x001C3704, 0x00201FD4, 0x001C373C,
49849 +0x001C3700, 0x4F222FE6, 0x6E537FFC, 0x2F42BFCA,
49850 +0xD61561E2, 0x1615E280, 0x421854E1, 0x55E21646,
49851 +0x16574228, 0x6EF257E3, 0x2E2B1678, 0x7F0426E2,
49852 +0xAFA74F26, 0x2FC66EF6, 0x2FE62FD6, 0xDD0A4F22,
49853 +0xBFAF6C53, 0xBF946E43, 0xBFAB2DE2, 0x51D50009,
49854 +0x54D62C12, 0x55D71C41, 0x56D81C52, 0x4F261C63,
49855 +0x6DF66EF6, 0x6CF6000B, 0x001C370C, 0x0009A0C0,
49856 +0xD17B4F22, 0xD47B92B6, 0x2122B00D, 0x97B2E605,
49857 +0xB02295B2, 0xB0366463, 0xB0360009, 0xB0390009,
49858 +0xA0680009, 0x4F124F26, 0xD1734F02, 0x94A43145,
49859 +0x4609060A, 0x46094609, 0x00293646, 0xD76CD56F,
49860 +0x2500CA01, 0x4F062762, 0x4F16000B, 0xBFEA4F22,
49861 +0xB01F0009, 0xA04E0009, 0x2FE64F26, 0x6E63D168,
49862 +0x44186612, 0x4528928A, 0x26294408, 0x44084500,
49863 +0x4400265B, 0x4708264B, 0x47082162, 0x27EBD161,
49864 +0x000B2172, 0x000B6EF6, 0xD25F0009, 0xE40A9677,
49865 +0x2262AFB4, 0x2FC62FB6, 0x2FE62FD6, 0xDC5B4F22,
49866 +0x2C22E201, 0xBFA9E40A, 0x60C27C44, 0xCB01ED00,
49867 +0x60C22C02, 0xC901EB64, 0x6E03A008, 0x89073DB2,
49868 +0xE40160C2, 0xBF99C901, 0x7D016E03, 0x8BF52EE8,
49869 +0x8B033DB2, 0xD24FD44E, 0x0009420B, 0x4F26E40A,
49870 +0x6DF66EF6, 0xAF896CF6, 0x44116BF6, 0x604B8F01,
49871 +0x000B6043, 0x2FB60009, 0x2FD62FC6, 0x4F222FE6,
49872 +0xDC457FFC, 0x60C2ED00, 0xCB02EB64, 0x60C22C02,
49873 +0xC9022F02, 0x6E03A009, 0x89083DB3, 0xE46460C2,
49874 +0xC9022F02, 0x6E03BF6A, 0x2EE87D01, 0xD73B8BF4,
49875 +0x617251C1, 0xDE3BDC3A, 0xD23CD13B, 0x64C23DB3,
49876 +0x651264E2, 0x65228F09, 0xD232D439, 0x4F267F04,
49877 +0x6DF66EF6, 0x422B6CF6, 0x7F046BF6, 0x6EF64F26,
49878 +0x6CF66DF6, 0x6BF6000B, 0x5651D532, 0x46286052,
49879 +0x306C000B, 0x5288096C, 0x09B45BB4, 0x03C41FFF,
49880 +0x2FC62FB6, 0x2FE62FD6, 0x4F124F22, 0xBFEB4F02,
49881 +0x6B036E43, 0xDD18DC28, 0x0009BFE6, 0x3C0530B8,
49882 +0x4609060A, 0x46014609, 0x020A3D65, 0x42094209,
49883 +0x32E24209, 0x4F068BF0, 0x4F264F16, 0x6DF66EF6,
49884 +0x000B6CF6, 0x2FE66BF6, 0xDE1C4F22, 0xE500E102,
49885 +0x2E12E403, 0x2E52BFD4, 0x4618E606, 0xE403E700,
49886 +0x2E722E62, 0xAFCB4F26, 0x000B6EF6, 0x00000009,
49887 +0x00202890, 0x0024CDE0, 0x10624DD3, 0x00202A8C,
49888 +0x001C5814, 0x001C59D0, 0x001C5804, 0x001C581C,
49889 +0x00202934, 0x00200DA6, 0x001C5860, 0x001C6864,
49890 +0x001C7864, 0x001C59BC, 0x001C69BC, 0x001C79BC,
49891 +0x0020294C, 0x001C1040, 0xCCCCCCCD, 0x001D4004,
49892 +0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6,
49893 +0xE4007FE4, 0x4528E510, 0x67436C43, 0xE107A00F,
49894 +0x6043644D, 0x0F564008, 0xEE0060C3, 0x815125C1,
49895 +0x81538152, 0x157315E2, 0x751415E4, 0x624D7401,
49896 +0x8BED3213, 0xDA6F51F1, 0x1A1154F2, 0xD16E2A12,
49897 +0x57F455F3, 0x6DF258F5, 0x1141D96C, 0x11532142,
49898 +0x11751152, 0x11871174, 0x52F61186, 0x19D1D668,
49899 +0xD86829D2, 0xDA68E950, 0x1621EBB4, 0x6BBC2622,
49900 +0xA0214908, 0x6EEDEE00, 0x61E36DE3, 0x41084D08,
49901 +0x31EC3DEC, 0x41084D08, 0x60C33D8C, 0xE7904108,
49902 +0x81D12DC1, 0x41086093, 0x81D2677C, 0x31AC60C3,
49903 +0x3472E200, 0x1DD281D3, 0xD4551D13, 0x1D248D01,
49904 +0xB03AD450, 0x7E0165D3, 0x34B264ED, 0xD14D8BDB,
49905 +0x6512DB52, 0x4529D24D, 0x64121B51, 0x674DD14A,
49906 +0x67222B72, 0x4729D64E, 0x69221B73, 0x689D2FD2,
49907 +0x69121B82, 0x5A122692, 0x5B1416A2, 0x16B4DA44,
49908 +0x16C65C16, 0x16EA6EA2, 0x4F267F1C, 0x6DF66EF6,
49909 +0x6BF66CF6, 0x69F66AF6, 0x68F6000B, 0x60616642,
49910 +0x8D04C803, 0x6061E500, 0x8802C903, 0x52628B03,
49911 +0x51246563, 0x000B2412, 0x2FD66053, 0x4F222FE6,
49912 +0x6E537FEC, 0xE5506253, 0xE4006D43, 0xA0014508,
49913 +0x5224E101, 0x22116043, 0x81238121, 0x81226053,
49914 +0x362056E2, 0xD22F8BF5, 0x64F316E4, 0x420BE614,
49915 +0x65E165E3, 0x2549E4FC, 0x61F12E51, 0x214965F3,
49916 +0x54D12F11, 0x410BD127, 0x57D1E614, 0xCB016071,
49917 +0x1DE12701, 0x4F267F14, 0x000B6EF6, 0x2FD66DF6,
49918 +0x4F222FE6, 0x6E537FEC, 0xE5FC6653, 0x60616D43,
49919 +0xCB012059, 0x52E22601, 0x8B063260, 0x51E212E4,
49920 +0x8B0431E0, 0xA00252D1, 0xAFF01E22, 0xD2155664,
49921 +0xE61464F3, 0x65E3420B, 0xE1FC67E1, 0x2E712719,
49922 +0x54D167F1, 0xD10F2719, 0xE61465F3, 0x2F71410B,
49923 +0x602152D1, 0x2201CB01, 0x7F141DE1, 0x6EF64F26,
49924 +0x6DF6000B, 0x0020285C, 0x00202864, 0x00202854,
49925 +0x00202884, 0x0010008C, 0x00100EC0, 0x001E2108,
49926 +0x001C3D00, 0x00202134, 0x2FC62FB6, 0x2FE62FD6,
49927 +0xD6314F22, 0x60D36D62, 0x894DC803, 0xDB30DC2F,
49928 +0x0009A02C, 0xC9036061, 0x892B8801, 0xD22DD42B,
49929 +0x0009420B, 0x65035603, 0xC8208561, 0xE0508903,
49930 +0x720102BE, 0x85620B26, 0x4000600D, 0x4000366A,
49931 +0x40004624, 0x206D4624, 0xD423C903, 0x40086E03,
49932 +0xD1224000, 0x340C410B, 0x61E3D521, 0xD721E001,
49933 +0x450BD221, 0x64E37E30, 0x2702420B, 0x66C252C1,
49934 +0x8BCF3620, 0x4E18EE01, 0xA011DB1C, 0x6061EC75,
49935 +0x8801C903, 0xD4198910, 0x460BD612, 0xD4180009,
49936 +0x470BD718, 0xD2136503, 0x64C3D113, 0x22E2410B,
49937 +0x66B252B1, 0x8BEA3620, 0xC80460D3, 0xD2128906,
49938 +0x6EF64F26, 0x6CF66DF6, 0x6BF6422B, 0x6EF64F26,
49939 +0x6CF66DF6, 0x6BF6000B, 0x001E2100, 0x0020285C,
49940 +0x002027F8, 0x00200A5C, 0x00202864, 0x00200ADE,
49941 +0x00201FD4, 0x001C3D30, 0x00200D6C, 0x00202854,
49942 +0x00202884, 0x00200A7A, 0x002000F8, 0xE601D237,
49943 +0x1265D537, 0x000B2252, 0xD6361266, 0x88016062,
49944 +0xE1018B62, 0xD5342612, 0x5451D134, 0xE0406212,
49945 +0x2122324C, 0x54115752, 0x1141347C, 0x57125453,
49946 +0x1172374C, 0x52135755, 0x1123327C, 0x56146452,
49947 +0x1164364C, 0x54155754, 0x1145347C, 0x56165458,
49948 +0x1166364C, 0x6762D626, 0x327C5217, 0x57611127,
49949 +0x327C5218, 0x57621128, 0x327C5219, 0x57631129,
49950 +0x347C541A, 0x5764114A, 0x347C541B, 0x5765114B,
49951 +0x347C541C, 0x5266114C, 0x372C571D, 0x5267117D,
49952 +0x342C541E, 0x5268114E, 0x362C561F, 0xD615116F,
49953 +0x041E6262, 0x342C7694, 0xE0440146, 0x061E6262,
49954 +0x0166362C, 0x525CE048, 0xD60F051E, 0x0156352C,
49955 +0xE0546262, 0x4229051E, 0x0156352C, 0xE0585561,
49956 +0x4529061E, 0x0166365C, 0x0009000B, 0x001C1010,
49957 +0x0000C34F, 0x001C1028, 0x001C369C, 0x002027F8,
49958 +0x001C3CA0, 0x001C36F4, 0x001C3B88, 0xD62F7FFC,
49959 +0x2642644C, 0xC8205066, 0x2F028DFC, 0x7F04000B,
49960 +0x2FD62FC6, 0x4F222FE6, 0x6D436C53, 0xEE00A004,
49961 +0x7E0164D4, 0x644CBFEA, 0x8BF93EC2, 0x6EF64F26,
49962 +0x000B6DF6, 0xA0016CF6, 0x76016643, 0x22286260,
49963 +0x36488BFB, 0x6563AFE4, 0x2FB62F96, 0x2FD62FC6,
49964 +0x4F222FE6, 0xEC1CED08, 0xDB196E53, 0x61C3E90A,
49965 +0x60434B0B, 0x3092C90F, 0x66038D02, 0x7630A001,
49966 +0x4D107637, 0x7E012E60, 0x7CFC8FF1, 0x8058E000,
49967 +0x6EF64F26, 0x6CF66DF6, 0x000B6BF6, 0x000B69F6,
49968 +0x000BE000, 0x2FE6E000, 0x7FEC4F22, 0x6E436253,
49969 +0xBFD165F3, 0xBFC66423, 0xBFC464E3, 0xD40564F3,
49970 +0x0009BFC1, 0x4F267F14, 0x6EF6000B, 0x001C0004,
49971 +0x00202094, 0x00202968, 0xE110D59C, 0xE6406050,
49972 +0x2500C9FD, 0xE0FF75E9, 0x80516453, 0x80538052,
49973 +0x80568055, 0x251075EF, 0xE1EF6250, 0x2219E001,
49974 +0xE7202520, 0x24608052, 0x2570000B, 0xE4FDD590,
49975 +0xE7026152, 0x25122149, 0x74016052, 0x2502CB01,
49976 +0xD18C6652, 0x25622649, 0x92C26012, 0x2102CB08,
49977 +0xC9CF6012, 0x60122102, 0x2102CB03, 0x000B1172,
49978 +0x4F221123, 0xE100D484, 0xD285D784, 0xD5852410,
49979 +0x2711D485, 0x2211E700, 0xBFBD2511, 0xD5832471,
49980 +0x2560E600, 0x4F26AFD2, 0xD281664C, 0x362C4600,
49981 +0xCB106060, 0x2600000B, 0xD27D654C, 0x352C4500,
49982 +0xE1EF6650, 0x000B2619, 0x664C2560, 0x4600D279,
49983 +0x6060362C, 0x000BCB10, 0x654C2600, 0x4500D275,
49984 +0x6650352C, 0x2619E1EF, 0x2560000B, 0xD270664C,
49985 +0x362C4600, 0xCB086060, 0x2600000B, 0xD26C654C,
49986 +0x352C4500, 0xE1F76650, 0x000B2619, 0x664C2560,
49987 +0x4600D268, 0x6060362C, 0x000BCB08, 0x654C2600,
49988 +0x4500D264, 0x6650352C, 0x2619E1F7, 0x2560000B,
49989 +0xD65F624C, 0x326C4200, 0xC9086020, 0x40214021,
49990 +0x000B4021, 0x624C600C, 0x4200D65A, 0x6020326C,
49991 +0x4021C908, 0x40214021, 0x600C000B, 0xD156644C,
49992 +0x341C74FF, 0x000B6240, 0xD154602C, 0x341C644C,
49993 +0x000B6240, 0x2FE6602C, 0x655C4F22, 0x3567E60A,
49994 +0x6E438D15, 0x6453BFEA, 0x60EC640C, 0x8B028801,
49995 +0xA002E00F, 0x44092409, 0x624C4409, 0x3263E60A,
49996 +0xBFE28905, 0x620C644C, 0xC8806023, 0xE2008B00,
49997 +0x4F266023, 0x6EF6000B, 0xD6414F22, 0x88016062,
49998 +0xB2228B03, 0xA0030009, 0xD23E0009, 0x2260E640,
49999 +0xE200D63D, 0x000B4F26, 0x4F222622, 0x6062D638,
50000 +0x8B018802, 0x0009B26C, 0xE200D637, 0x000B4F26,
50001 +0x0FFF2622, 0xD433D532, 0xE701E100, 0x000B2512,
50002 +0xD2302470, 0x000BE604, 0xD5202260, 0x6150E4FD,
50003 +0x2149D62E, 0x2510E700, 0x2670000B, 0xE4FBD51B,
50004 +0x22496250, 0x2520000B, 0xE4F7D518, 0x22496250,
50005 +0x2520000B, 0xD2264F22, 0x600D8522, 0x89112008,
50006 +0x89138801, 0x89158803, 0x89178805, 0x89418806,
50007 +0x89478808, 0x894D8809, 0x8953880A, 0x8959880B,
50008 +0x0009A060, 0x0009B062, 0x600CA05D, 0x0009B070,
50009 +0x600CA059, 0x0009B07A, 0x600CA055, 0x6260D606,
50010 +0x8B4F2228, 0x0009B086, 0x600CA04D, 0x001E1028,
50011 +0x001E2148, 0x001E1108, 0x002028D9, 0x002028C8,
50012 +0x002028CA, 0x002028CC, 0x002028AC, 0x001E1008,
50013 +0x001E103F, 0x001E105F, 0x001E1030, 0x001E1090,
50014 +0x002028D4, 0x001E100B, 0x002028D0, 0x002028D8,
50015 +0x002028A0, 0x6260D687, 0x8B232228, 0x0009B06A,
50016 +0x600CA021, 0x6260D683, 0x8B1B2228, 0x0009B0B4,
50017 +0x600CA019, 0x6260D67F, 0x8B132228, 0x0009B0BA,
50018 +0x600CA011, 0x6260D67B, 0x8B0B2228, 0x0009B11E,
50019 +0x600CA009, 0x6260D677, 0x8B032228, 0x0009B136,
50020 +0x600CA001, 0x4F26E000, 0x0009000B, 0xD273D172,
50021 +0xD5738412, 0x4000C90F, 0xD772012D, 0x611CE403,
50022 +0xD671E20F, 0x27122540, 0xE0012520, 0x2602000B,
50023 +0xE601D269, 0x30668523, 0xE0008D06, 0xE000D267,
50024 +0x8122D669, 0x2602E001, 0x0009000B, 0x8523D262,
50025 +0x2008600D, 0x88018905, 0xD6648B0A, 0xCB016060,
50026 +0xD6612600, 0xE101D45D, 0x2612E001, 0x8142000B,
50027 +0xE000000B, 0xE501D158, 0x45188513, 0x3453640D,
50028 +0x8D056603, 0xD25AE000, 0xE001D557, 0x25022260,
50029 +0x0009000B, 0xD1504F22, 0x650D8513, 0x44196453,
50030 +0x672E6249, 0x602C227D, 0x89098801, 0x890C8802,
50031 +0x89108803, 0x89268806, 0x89298807, 0x0009A038,
50032 +0xD64DD54C, 0xA027E212, 0x625C2652, 0x8B2F2228,
50033 +0xA01ED64A, 0x605C6262, 0x89052008, 0x89088810,
50034 +0x890B8820, 0x0009A024, 0xD643D445, 0xA013E204,
50035 +0xD7442642, 0xE20CD640, 0x2672A00E, 0xD63ED542,
50036 +0xA009E218, 0xD4412652, 0xE20AD63B, 0x2642A004,
50037 +0xD639D23F, 0xE22E2622, 0xD43E8515, 0x3277670D,
50038 +0x8F012421, 0x24516503, 0x0009B0DF, 0xE001A001,
50039 +0x4F26E000, 0x0009000B, 0xE101D629, 0x2610D436,
50040 +0xD7286541, 0x655DD128, 0xE001E20F, 0x26202752,
50041 +0x2102000B, 0x4F222FE6, 0x8523D21F, 0x2448640C,
50042 +0xD62D8B08, 0xE200D521, 0x84512621, 0x20499430,
50043 +0x8051A026, 0x60E0DE1D, 0x8D0BC840, 0x3427E201,
50044 +0xD1258922, 0x420BD225, 0xD5252141, 0xCB046052,
50045 +0x2502A00B, 0x89173427, 0xD722D21F, 0x2241470B,
50046 +0xE5FBD61F, 0x21596162, 0x84E12612, 0xB12DCB80,
50047 +0x60E080E1, 0xCB04D61C, 0x60602E00, 0x2600C93F,
50048 +0xE001D609, 0x2602A001, 0x4F26E000, 0x6EF6000B,
50049 +0x0000FF7F, 0x002028D9, 0x002028A0, 0x002028AC,
50050 +0x001E1100, 0x001E100C, 0x002028D0, 0x001E1000,
50051 +0x001E1001, 0x00202A90, 0x002028B4, 0x002028BC,
50052 +0x00202AFE, 0x00202B02, 0x00202B0E, 0x00202B26,
50053 +0x00202B30, 0x002028B8, 0x002028C6, 0x00201A32,
50054 +0x001E1108, 0x00201B3E, 0x001E1015, 0x6060D696,
50055 +0x8919C880, 0x6021D295, 0x8B158801, 0xE501D294,
50056 +0x30568524, 0xD1938910, 0xD493E203, 0x65412120,
50057 +0x655DE00B, 0xD5910656, 0xE702E40F, 0x25712140,
50058 +0xE001D78F, 0x2702000B, 0xE000000B, 0x4F222FE6,
50059 +0x84E1DE8C, 0x8934C880, 0x8554D585, 0x8F302008,
50060 +0xD7896103, 0x66728553, 0x650C6403, 0x620C8566,
50061 +0x8B263520, 0xD780D685, 0x644C651C, 0x27412651,
50062 +0xC84060E0, 0xD2828907, 0x0009420B, 0x6062D681,
50063 +0xA008CB04, 0xD1802602, 0x0009410B, 0xE5FBD67D,
50064 +0x24596462, 0xB0A12642, 0xD5750009, 0x2522E201,
50065 +0xD77A60E0, 0x2E00CB04, 0xC93F6070, 0xA0012700,
50066 +0xE0006023, 0x000B4F26, 0x2FA66EF6, 0x2FC62FB6,
50067 +0x2FE62FD6, 0xE240DA69, 0xDC6666A1, 0x3123616D,
50068 +0x62638900, 0x6ED36D2C, 0x4E2136D8, 0x4E212A61,
50069 +0xDB6CD46B, 0xE700A00F, 0x770166B2, 0x71026163,
50070 +0x65612B12, 0x71026613, 0x62612B12, 0x622D655D,
50071 +0x325C4228, 0x627C2422, 0x8BED32E3, 0xC90360D3,
50072 +0x8B108803, 0xED076EB2, 0x710261E3, 0x67132B12,
50073 +0x62E17102, 0x65712B12, 0x655D622D, 0x352C4528,
50074 +0xA00C2CD0, 0x88022452, 0xA0038B01, 0x8801E203,
50075 +0xE2018B05, 0x66B22C20, 0x677D6761, 0xEB0F2472,
50076 +0x6DA12CB0, 0x8B052DD8, 0xD445D24F, 0xE101EE00,
50077 +0x241222E2, 0x6DF66EF6, 0x6BF66CF6, 0x6AF6000B,
50078 +0x2FE62FD6, 0xE240DD3D, 0x616D66D1, 0x89003123,
50079 +0x672C6263, 0xDE433678, 0x2D617703, 0xD6404721,
50080 +0x472164E2, 0xE100A00E, 0x71016562, 0x24506253,
50081 +0x42197401, 0x74012420, 0x24504529, 0x45197401,
50082 +0x74012450, 0x3273621C, 0x42008BEE, 0x64D166E2,
50083 +0x362C4200, 0x8F062448, 0xDD332E62, 0xE500DE28,
50084 +0x2D52E701, 0x6EF62E72, 0x6DF6000B, 0x2FE62FD6,
50085 +0xEE014F22, 0xED0AA005, 0x64E3BCB6, 0x64E3BCBC,
50086 +0x62EC7E01, 0x8BF732D7, 0xEE01A005, 0x64E3BCBD,
50087 +0x64E3BCC3, 0x62EC7E01, 0x8BF732D7, 0x6EF64F26,
50088 +0x6DF6000B, 0x2FE62FD6, 0x7FFC4F22, 0x6060D61F,
50089 +0x89758801, 0xE101D41E, 0xD7128548, 0x650D2610,
50090 +0x45196070, 0x6659DD1B, 0x61D3626E, 0xC840262D,
50091 +0x74027102, 0x8D47D718, 0xD218666C, 0xE501DE0A,
50092 +0xA0312E22, 0x0000EE04, 0x001E1001, 0x002028C6,
50093 +0x002028A0, 0x001E1100, 0x002028CA, 0x002028B8,
50094 +0x002028D0, 0x001E1000, 0x002028BC, 0x002028C8,
50095 +0x00201A32, 0x001E1108, 0x00201B3E, 0x001E1015,
50096 +0x001E100C, 0x002028B4, 0x002028D4, 0x002028D8,
50097 +0x00202A90, 0x00202B26, 0x00202B32, 0x00202AA2,
50098 +0x75016245, 0x71022121, 0x32E3625C, 0x60638BF8,
50099 +0xE60181D4, 0xE417D538, 0x3243626C, 0x6255891E,
50100 +0x27217601, 0x7702AFF8, 0xDE35D234, 0x2E22E501,
50101 +0xEE04A004, 0x75016245, 0x71022121, 0x32E3625C,
50102 +0x60638BF8, 0xE60181D4, 0xA004D52E, 0x6255E417,
50103 +0x27217601, 0x626C7702, 0x8BF83243, 0x2D21924B,
50104 +0xD72AD429, 0x2F126142, 0x6DF265F2, 0xC9806053,
50105 +0x60532700, 0x6103C960, 0x60538071, 0x65F26EF2,
50106 +0x4D19C903, 0x80724529, 0x451960DC, 0x4E298172,
50107 +0x62EC605C, 0x302C4018, 0x6D428173, 0x2FD22118,
50108 +0x62F26EF2, 0x421966F2, 0x656C4629, 0x602C66F2,
50109 +0x401864EC, 0x304C4629, 0x81744619, 0x4018606C,
50110 +0x8F07305C, 0xBCB58175, 0x620C0009, 0x89082228,
50111 +0x0009A00A, 0x88406013, 0xB00A8B03, 0xA0030009,
50112 +0xD60B0009, 0x2622E202, 0x4F267F04, 0x000B6EF6,
50113 +0x000B6DF6, 0x060A0009, 0x00202AD2, 0x00202AD0,
50114 +0x002028BC, 0x00202AA4, 0x001E100C, 0x002028A0,
50115 +0x002028D0, 0x7FFC4F22, 0x6620D27E, 0x8D082668,
50116 +0xD47D2F60, 0x420BD27D, 0x64F00009, 0xA0907F04,
50117 +0x7F044F26, 0x000B4F26, 0x000B0009, 0x2FE60009,
50118 +0xDE774F22, 0x60E0D677, 0xCBC0D477, 0x62602E00,
50119 +0xC803602C, 0x40218904, 0x70014021, 0x6603A002,
50120 +0x66034009, 0xD671616D, 0xE500A004, 0x75016262,
50121 +0x74042422, 0x3213625D, 0xD16D8BF8, 0x0009410B,
50122 +0xE401D66C, 0x84E22641, 0x80E2C9BF, 0x000B4F26,
50123 +0x2FE66EF6, 0xD5687FFC, 0x6250DE61, 0x642C84E2,
50124 +0xCB407404, 0x80E2614D, 0x44216413, 0xD7634421,
50125 +0xE600A004, 0x76016256, 0x27222F22, 0x3243626D,
50126 +0x60138BF8, 0x2008C903, 0x88038912, 0x88028905,
50127 +0x88018906, 0xA0088907, 0xE0070009, 0x8078A005,
50128 +0xA002E003, 0xE0018078, 0x62528078, 0x27222F22,
50129 +0xD650E00F, 0x60618078, 0x8B018801, 0x2621E200,
50130 +0x6060D64F, 0x2600CB08, 0xC93F60E0, 0x7F042E00,
50131 +0x6EF6000B, 0x6021D247, 0x8D188801, 0xD2466143,
50132 +0x22106053, 0x60638021, 0xD4468121, 0xE500A007,
50133 +0x027C605D, 0x364C6603, 0x26207001, 0x625D6503,
50134 +0x3213611C, 0xD6408BF4, 0xC9BF6060, 0x000B2600,
50135 +0x2FD60009, 0x4F222FE6, 0x60437FFC, 0x8D02C820,
50136 +0xBF6A6E43, 0x60E30009, 0x8901C810, 0x0009BF67,
50137 +0xC84060E3, 0xBF8C8901, 0x60E30009, 0x8929C801,
50138 +0x60D0DD32, 0x8D03C802, 0xD6312F00, 0x0009460B,
50139 +0xC80460F0, 0xD62F8902, 0x0009460B, 0x602362F0,
50140 +0x8902C880, 0xC97F60D0, 0x60232D00, 0x8902C801,
50141 +0x420BD229, 0xD5290009, 0x88026052, 0xD2288B03,
50142 +0xA005E604, 0x88012260, 0xD2258B02, 0x2260E601,
50143 +0x2522E200, 0xC88060E3, 0xD2228916, 0x60E36E20,
50144 +0x8902C802, 0x420BD220, 0x60E30009, 0x8902C804,
50145 +0x420BD21E, 0x60E30009, 0x8905C808, 0x7F04D21C,
50146 +0x6EF64F26, 0x6DF6422B, 0x4F267F04, 0x000B6EF6,
50147 +0x00006DF6, 0x001E1020, 0x0020296C, 0x00200DA6,
50148 +0x001E1015, 0x001E10BF, 0x00117D00, 0x001E10FC,
50149 +0x002000F8, 0x002028CC, 0x00117D80, 0x001E10F8,
50150 +0x001E10AE, 0x00117D84, 0x001E1017, 0x001E1021,
50151 +0x00200FD8, 0x00200FFA, 0x00201584, 0x002028D0,
50152 +0x001E100B, 0x001E1028, 0x0020102A, 0x0020103C,
50153 +0x00201048, 0xD6A8644C, 0x346C74FF, 0x2450000B,
50154 +0x644CD6A6, 0x000B346C, 0xD6A52450, 0x346C644C,
50155 +0x2450000B, 0x616D625C, 0x41194208, 0x60194208,
50156 +0x644C4200, 0x324C670E, 0x207DD19E, 0xC90F4200,
50157 +0x000B321C, 0x67632200, 0x4208625C, 0x42004208,
50158 +0x324C644C, 0x4200D198, 0x000B321C, 0x2FE62270,
50159 +0x614C4F12, 0x4100D493, 0x6710314C, 0x2729E29F,
50160 +0x65736E53, 0x4719676D, 0x672E6279, 0x4221227D,
50161 +0x42214221, 0x7601662C, 0xE4014608, 0x34E84608,
50162 +0x644C4600, 0x0E1A0467, 0x215025EB, 0x000B4F16,
50163 +0x4F226EF6, 0xD2857FE8, 0x88016021, 0xD2848B7B,
50164 +0x26686621, 0xD2838B77, 0x26686621, 0xE50F8B73,
50165 +0xE401BFA0, 0xBFA3E501, 0xE586E400, 0xE400655C,
50166 +0x2F50BFA3, 0xBFA0E401, 0xE602E506, 0x60634618,
50167 +0x81F2E401, 0x6543BF9E, 0xE40185F2, 0xBFAA6543,
50168 +0x85F26603, 0x6543E401, 0x6603BFB1, 0xE40265F0,
50169 +0x6053756C, 0x80F8BF7E, 0xBF81E402, 0x84F8E512,
50170 +0x7090E402, 0x6503BF81, 0x4618E602, 0x81F66063,
50171 +0xBF7FE402, 0x85F6E500, 0x6603E402, 0xE500BF8B,
50172 +0xE40285F6, 0xBF926603, 0xE5FEE500, 0xE010655C,
50173 +0xBF5FE403, 0xE5130F54, 0xE40EBF62, 0x05FCE010,
50174 +0xBF62E40E, 0xE5007585, 0xBF63E403, 0xE500E640,
50175 +0xBF70E403, 0xE500E640, 0xBF78E403, 0xE5FFE640,
50176 +0xE014655C, 0xBF45E404, 0xE40F0F54, 0xE504BF48,
50177 +0x05FCE014, 0xBF48E40F, 0xE5017584, 0xBF49E640,
50178 +0xE501E404, 0xBF56E640, 0xE501E404, 0xE404E640,
50179 +0xAF5C7F18, 0x7F184F26, 0x000B4F26, 0x4F220009,
50180 +0xD2427FF0, 0x88016021, 0xD2418B71, 0x26686621,
50181 +0xD2408B6D, 0x26686621, 0xE50F8B69, 0xE401BF1A,
50182 +0xBF1DE501, 0xE586E400, 0xE400655C, 0x2F50BF1D,
50183 +0xBF1AE401, 0xE401E506, 0xBF1B6543, 0xE401E640,
50184 +0xBF286543, 0xE401E640, 0xBF306543, 0x65F0E640,
50185 +0x756CE402, 0xBEFD6053, 0xE40280F4, 0xE512BF00,
50186 +0xE40284F4, 0xBF007090, 0xE6406503, 0xBF01E402,
50187 +0xE640E500, 0xBF0EE402, 0xE640E500, 0xBF16E402,
50188 +0xE5FEE500, 0x6053655C, 0xBEE3E403, 0xE51380F8,
50189 +0xE40EBEE6, 0xE40E84F8, 0xBEE67085, 0xE5006503,
50190 +0xBEE7E640, 0xE500E403, 0xBEF4E640, 0xE500E403,
50191 +0xBEFCE640, 0xE5FFE403, 0x6053655C, 0xBEC9E404,
50192 +0xE40F80FC, 0xE504BECC, 0xE40F84FC, 0xBECC7083,
50193 +0xE5016503, 0xBECDE640, 0xE501E404, 0xBEDAE640,
50194 +0xE501E404, 0xE404E640, 0xAEE07F10, 0x7F104F26,
50195 +0x000B4F26, 0x00000009, 0x001E1030, 0x001E1080,
50196 +0x001E1090, 0x001E103F, 0x001E103E, 0x002028C6,
50197 +0x002028C8, 0x002028CA, 0x0009000B, 0x666CE680,
50198 +0x6563D2A8, 0x7540E700, 0x6473422B, 0x2FB62FA6,
50199 +0x2FD62FC6, 0x4F222FE6, 0x4C18EC01, 0xDAA3DBA2,
50200 +0x65B252B1, 0x89223520, 0xC9036051, 0x891E8801,
50201 +0xD19FDE9D, 0x64E3410B, 0x85036503, 0x670D66A2,
50202 +0xDD9C3762, 0xD49C890A, 0x420BD29C, 0xD19C0009,
50203 +0xE701D49C, 0x21724D0B, 0x0009AFE2, 0x420BD29A,
50204 +0xD69A64E3, 0x4D0BD49A, 0xAFD926C2, 0x4F260009,
50205 +0x6DF66EF6, 0x6BF66CF6, 0x6AF6000B, 0x7FF44F22,
50206 +0xE6818546, 0x85472F01, 0x81F1666C, 0xD2858548,
50207 +0x854281F2, 0x81F367F3, 0xE40C8543, 0x605381F4,
50208 +0x81F56563, 0x7540420B, 0x4F267F0C, 0x0009000B,
50209 +0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6,
50210 +0xDC847FF0, 0xE800A0DD, 0xD2836B13, 0xE0014B08,
50211 +0x4B00420B, 0x1F03DE81, 0x3BEC85F2, 0x2F827E30,
50212 +0x1FE26803, 0x66C2DD7E, 0x362052C1, 0xA0C38B01,
50213 +0x60610009, 0x8801C903, 0xA0BD8B01, 0x85610009,
50214 +0x8965C801, 0xEE105163, 0xDA6A8512, 0xC9036603,
50215 +0x85136403, 0x4021600D, 0xC93F4021, 0x8D1C30E3,
50216 +0xD7706503, 0x62704408, 0x44004408, 0x22284500,
50217 +0x345C8F0A, 0x6043D26C, 0x697D072D, 0x68994919,
50218 +0x697C6E8E, 0x28EDA009, 0x6043D268, 0x697D072D,
50219 +0x68994919, 0x697C6E8E, 0xEEFF28ED, 0x6EEC629D,
50220 +0x8B0F32E0, 0x410BD152, 0x540364C3, 0xBF85E502,
50221 +0xD45F6E03, 0x460BD654, 0xD75E65E3, 0xD45EEE01,
50222 +0x27E2A01D, 0x26E9EEFC, 0x81126063, 0x97888513,
50223 +0x20794208, 0x85128113, 0x8112208B, 0x202B8513,
50224 +0x85148113, 0x4218E208, 0x8114202B, 0x854164C2,
50225 +0x814120E9, 0xD45165C2, 0xCB016051, 0x4A0B2501,
50226 +0x60C20009, 0x52F356F2, 0x2B02CB01, 0x2622AF8B,
50227 +0xD2378561, 0x8D2EC802, 0x420B64C3, 0xD6480009,
50228 +0x5E036503, 0x076EE04C, 0x7701D146, 0x60120676,
50229 +0x8B058801, 0xEA0C85E1, 0x20AB4A18, 0x81E1A007,
50230 +0x88026012, 0x85E18B03, 0x20A9EADF, 0x855181E1,
50231 +0x20A9EAFC, 0x60518151, 0xCB01DA28, 0x4A0B64C3,
50232 +0x56F22501, 0xD73851F3, 0x85EF2612, 0x470B64D3,
50233 +0xAF58650D, 0x420B0009, 0x54030009, 0x85446E03,
50234 +0x4A18EA08, 0x30A020A9, 0x8B03DA1A, 0xE501BF16,
50235 +0x0009A007, 0xD62D8541, 0x2268620D, 0xBF0D8901,
50236 +0xD423E500, 0x420BD218, 0xD72265E3, 0xEE01D428,
50237 +0x27E24A0B, 0x0009AF37, 0x68F26083, 0x780181F2,
50238 +0x618D7C08, 0x31E7EE03, 0xAF1D8901, 0x7F100009,
50239 +0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6, 0x000B69F6,
50240 +0xFE0368F6, 0x00201834, 0x00202884, 0x0020288C,
50241 +0x00200A5C, 0x00200DA6, 0x00202854, 0x00200ADE,
50242 +0x001E2130, 0x00202A70, 0x00200A7A, 0x001C3D30,
50243 +0x00202A74, 0x00202864, 0x00201FD4, 0x001C3D00,
50244 +0x00202A80, 0x00202A8C, 0x00202970, 0x002029F0,
50245 +0x0020285C, 0x001E212C, 0x00202A78, 0x00202A7C,
50246 +0x002027F8, 0x002027F4, 0x00200E06, 0x00008000,
50247 +0x00202A88, 0x4F222FE6, 0x6E22D20D, 0xC84060E3,
50248 +0x22E28D02, 0x0009BE68, 0x4218E240, 0x89012E28,
50249 +0x0009BE64, 0xC80560E3, 0xBEB98901, 0x60E30009,
50250 +0x8902C802, 0xAE614F26, 0x4F266EF6, 0x6EF6000B,
50251 +0x001C3510, 0x080A0C0E, 0x00020406, 0x1A1C1E20,
50252 +0x12141618, 0x2E303234, 0x26282A2C, 0x3A3C3E40,
50253 +0x6C625648, 0x41112F26, 0xE2208F18, 0x890B3123,
50254 +0x321CD204, 0xD1026220, 0x412B312C, 0x00090009,
50255 +0x00201FFE, 0x00201FB4, 0x000BE000, 0x400062F6,
50256 +0x40004000, 0x40004000, 0x40004000, 0x62F6000B,
50257 +0x40004000, 0x40004000, 0x40004000, 0x40184000,
50258 +0x62F6000B, 0x40004000, 0x40004000, 0x40004000,
50259 +0x40284000, 0x62F6000B, 0x40004000, 0x40184000,
50260 +0x000B4028, 0xC90F62F6, 0x40054005, 0x40054005,
50261 +0x62F6000B, 0x4005C907, 0x40054005, 0x62F6000B,
50262 +0x4005C903, 0x000B4005, 0xC90162F6, 0x000B4005,
50263 +0x000062F6, 0x080A0C0E, 0x00020406, 0x1A1C1E20,
50264 +0x12141618, 0x2E303234, 0x26282A2C, 0x3A3C3E40,
50265 +0x6C625648, 0x41112F26, 0xE2208F18, 0x890B3123,
50266 +0x321CD204, 0xD1026220, 0x412B312C, 0x00090009,
50267 +0x002020BE, 0x00202074, 0x000BE000, 0x400162F6,
50268 +0x40014001, 0x40014001, 0x40014001, 0x62F6000B,
50269 +0x40014001, 0x40014001, 0x40014001, 0x40194001,
50270 +0x62F6000B, 0x40014001, 0x40014001, 0x40014001,
50271 +0x40294001, 0x62F6000B, 0x40014001, 0x40194001,
50272 +0x000B4029, 0x400462F6, 0x40044004, 0xC90F4004,
50273 +0x62F6000B, 0x40044004, 0xC9074004, 0x62F6000B,
50274 +0x40044004, 0x000BC903, 0x400462F6, 0x000BC901,
50275 +0x000062F6, 0x3622E218, 0x67438F12, 0x0009A004,
50276 +0x76FF6254, 0x74012420, 0xC8036053, 0x60438BF8,
50277 +0x8902C803, 0x422BD22B, 0xD22B0009, 0x0009422B,
50278 +0x2FE66473, 0x8D4A3450, 0x27786763, 0x62438947,
50279 +0x227B225B, 0xC9016023, 0x8D203452, 0x2EE86E03,
50280 +0x60238B15, 0x8B08C803, 0x47096643, 0x47106256,
50281 +0x8FFB2622, 0xA0327604, 0x47010009, 0x61436673,
50282 +0x46106255, 0x8FFB2121, 0xA0287102, 0x66430009,
50283 +0x47106254, 0x8FFB2620, 0xA0207601, 0x61430009,
50284 +0x2EE8357C, 0x8F15317C, 0x60236653, 0x8B07C803,
50285 +0x76FC4709, 0x47106262, 0x21268FFB, 0x0009A00F,
50286 +0x65634701, 0x75FE6673, 0x46106251, 0x21258FFB,
50287 +0x0009A005, 0x626076FF, 0x8FFB4710, 0x60432124,
50288 +0x6EF6000B, 0x002022A6, 0x00202752, 0xE21E2FE6,
50289 +0x67633626, 0x8D1B6153, 0x3E106E43, 0x3E128916,
50290 +0x65E38908, 0x3672E600, 0x62148910, 0x25207601,
50291 +0x7501AFF9, 0x317C64E3, 0x6513347C, 0xE600A004,
50292 +0x625075FF, 0x24247601, 0x8BF93672, 0x60E3A011,
50293 +0x890831E2, 0x327C6213, 0x8B0432E6, 0x651364E3,
50294 +0xA0086673, 0xD28F6EF6, 0x651364E3, 0x422B6673,
50295 +0x000B6EF6, 0xE2046EF6, 0x67433622, 0x8F10356C,
50296 +0xA004346C, 0x75FF0009, 0x76FF6250, 0x60532424,
50297 +0x8BF8C803, 0xC8036043, 0xA1058901, 0xA2770009,
50298 +0xA2990009, 0x2FB60009, 0x2FD62FC6, 0x7FE42FE6,
50299 +0x6C636043, 0x66521F62, 0xC9037504, 0x1F516E53,
50300 +0x45086503, 0xE1FC6D43, 0x2D194500, 0x1F732558,
50301 +0x1F651F44, 0x2FD28D0B, 0x88086053, 0x88108923,
50302 +0x8818895B, 0xA0898B01, 0xA0BD0009, 0x62630009,
50303 +0x2D22E600, 0x7CFC7D04, 0xEB10A00D, 0xE60064E6,
50304 +0x7CF065E6, 0x62E261E6, 0x1D512D42, 0x1D231D12,
50305 +0x7E047D10, 0x3CB21FE1, 0x1F6589F0, 0x2FD21FC2,
50306 +0xA0A11FE6, 0x64D21FD4, 0x44286263, 0x44294418,
50307 +0x42184419, 0x4629242B, 0x2D424619, 0x65637D04,
50308 +0xA0217CFD, 0x67E6EB10, 0x62E67CF0, 0x64E66673,
50309 +0x256B4618, 0x2D5261E2, 0x65234729, 0x45184719,
50310 +0x4229275B, 0x42191D71, 0x47186743, 0x4429227B,
50311 +0x44196713, 0x247B4718, 0x1D431D22, 0x41194129,
50312 +0x65137D10, 0x1FE17E04, 0x89DC3CB2, 0x1FE67EFF,
50313 +0x1FC21F55, 0xA0672FD2, 0x6CF21FD4, 0x66C257F5,
50314 +0x46286273, 0x42284629, 0x2C62262B, 0x7C045DF2,
50315 +0x7DFE4729, 0xA01CEB10, 0x65E65EF1, 0x66E66273,
50316 +0x47286753, 0x6763227B, 0x452961E6, 0x257B4728,
50317 +0x2C2264E6, 0x65131C51, 0x45284629, 0x1C62265B,
50318 +0x41296643, 0x216B4628, 0x44291C13, 0x67437C10,
50319 +0x3DB27DF0, 0x1FD289E1, 0x7EFEA034, 0x51F56CF2,
50320 +0x621366C2, 0x42284618, 0x42184619, 0x2C62262B,
50321 +0x7C045DF2, 0x7DFF4119, 0xA01FEB10, 0x65E65EF1,
50322 +0x64E67DF0, 0x42286253, 0x421867E6, 0x66E6212B,
50323 +0x61432C12, 0x45194128, 0x251B4118, 0x65731C51,
50324 +0x44194528, 0x245B4518, 0x64631C42, 0x47194428,
50325 +0x274B4418, 0x46191C73, 0x61637C10, 0x89DE3DB2,
50326 +0x7EFD1FD2, 0x1FC41FE6, 0x5DF2E704, 0xA00D5EF6,
50327 +0x62E451F4, 0x66E47DFC, 0x65E464E4, 0x71012120,
50328 +0x71012160, 0x71012140, 0x71012150, 0x89F03D72,
50329 +0x66D357F3, 0x641365E3, 0x6EF67F1C, 0x6CF66DF6,
50330 +0x6BF6A190, 0x00202134, 0x2FC62FB6, 0x2FE62FD6,
50331 +0x60437FE4, 0x6C63C903, 0x66031F62, 0x460875FC,
50332 +0x61526E43, 0x4600E2FC, 0x26682E29, 0x1F441F73,
50333 +0x1F516D53, 0x8D0B1F15, 0x60632FE2, 0x891F8808,
50334 +0x89538810, 0x8B018818, 0x0009A081, 0x0009A0B9,
50335 +0xEB10A00D, 0x52D37DF0, 0x54D156D2, 0x2E1665D2,
50336 +0x2E662E26, 0x2E427EFC, 0x1FD16153, 0x3CB27CF0,
50337 +0x7D0489F0, 0x1F151FD6, 0x2FE21FC2, 0x1FE4A0A1,
50338 +0x621366E2, 0x42294619, 0x42194618, 0x2E62262B,
50339 +0x7CFF4118, 0xEB10A021, 0x54D37DF0, 0x624357D2,
50340 +0x42194229, 0x55D1212B, 0x2E1666D2, 0x41296173,
50341 +0x41194418, 0x2E46241B, 0x44296453, 0x44194718,
50342 +0x2E76274B, 0x47296763, 0x47194518, 0x257B7EFC,
50343 +0x46182E52, 0x1FD16163, 0x3CB27CF0, 0x7D0389DC,
50344 +0x1F151FD6, 0x2FE21FC2, 0x1FE4A06B, 0x57F56EF2,
50345 +0x627366E2, 0x46284629, 0x262B4229, 0x2E625CF2,
50346 +0x7CFE4728, 0xA01BEB10, 0x7DF05DF1, 0x55D251D3,
50347 +0x46296613, 0x54D1276B, 0x2E7662D2, 0x41286753,
50348 +0x217B4729, 0x61432E16, 0x41294528, 0x2E56251B,
50349 +0x44286523, 0x245B4529, 0x42282E46, 0x7CF06723,
50350 +0x89E23CB2, 0x1FD67D02, 0xA03A1FC2, 0x67F21FE4,
50351 +0x657251F5, 0x45296213, 0x45284519, 0x42194518,
50352 +0x5CF2252B, 0x41282752, 0x7CFD4118, 0xA022EB10,
50353 +0x7DF05DF1, 0x54D256D3, 0x45196563, 0x52D14628,
50354 +0x4618215B, 0x6ED26543, 0x45192716, 0x265B4428,
50355 +0x65436163, 0x45186423, 0x42284419, 0x4218254B,
50356 +0x271664E3, 0x44196623, 0x264B2756, 0x4E282766,
50357 +0x61E34E18, 0x3CB27CF0, 0x7D0189DB, 0x1FC21FD6,
50358 +0xE7041F74, 0x51F45DF2, 0x5EF6A00D, 0x84E27EFC,
50359 +0x620364E0, 0x7DFC84E1, 0x84E36503, 0x21646603,
50360 +0x21542124, 0x3D722144, 0x57F389F0, 0x641366D3,
50361 +0x7F1C65E3, 0x6DF66EF6, 0xA09D6CF6, 0x2F866BF6,
50362 +0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6, 0x614374E0,
50363 +0x6A636873, 0x6B56E920, 0x6C567AE0, 0x6D567120,
50364 +0x6E563A92, 0x64566756, 0x62566656, 0x11C121B2,
50365 +0x11E311D2, 0x11451174, 0x8DEC1166, 0x71201127,
50366 +0x6613A004, 0x7AFF6254, 0x76012620, 0x8BF92AA8,
50367 +0x6EF66083, 0x6CF66DF6, 0x6AF66BF6, 0x000B69F6,
50368 +0x2F8668F6, 0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6,
50369 +0x6A636873, 0x75E0E920, 0x56565257, 0x57545155,
50370 +0x5D525E53, 0x6B525C51, 0x24662426, 0x24762416,
50371 +0x7AE024E6, 0x24C624D6, 0x8DEC3A92, 0x66A324B6,
50372 +0x6EF66783, 0x6CF66DF6, 0x6AF66BF6, 0xA04369F6,
50373 +0x2FE668F6, 0xC8046063, 0x8D046E63, 0x62166153,
50374 +0x24227EFC, 0x60E37404, 0x8908C818, 0x71046513,
50375 +0x62526616, 0x24227EF8, 0xAFF41461, 0xE2047408,
50376 +0x65133E22, 0x66E38D02, 0x6EF6A01C, 0x6EF6AF87,
50377 +0xC8046063, 0x61638D04, 0x625275FC, 0x242671FC,
50378 +0xC8186013, 0x75F88906, 0x66525251, 0x24662426,
50379 +0x71F8AFF6, 0x3122E204, 0x66138F02, 0x0009AFA1,
50380 +0x0009A00A, 0x0009A004, 0x76FF6254, 0x74012420,
50381 +0x8BF92668, 0x6073000B, 0x0009A004, 0x625075FF,
50382 +0x242476FF, 0x8BF92668, 0x6073000B, 0x00000000,
50383 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
50384 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
50385 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
50386 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
50387 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
50388 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
50389 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
50390 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
50391 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
50392 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
50393 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
50394 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
50395 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
50396 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
50397 +0x00000000, 0x00000000, 0x00000000, 0x544F0D0A,
50398 +0x46205355, 0x00003A57, 0x2072614D, 0x32203232,
50399 +0x20373030, 0x353A3431, 0x33353A34, 0x00000000,
50400 +0x00000D0A, 0x00000043, 0x61766E49, 0x2064696C,
50401 +0x72657375, 0x20726F20, 0x2079656B, 0x00214449,
50402 +0x6E6B6E55, 0x206E776F, 0x6D6D6F63, 0x3D646E61,
50403 +0x00000000, 0x61437748, 0x7262696C, 0x6F697461,
50404 +0x6620206E, 0x0A6C6961, 0x0000000D, 0x73696F4E,
50405 +0x61432065, 0x7262696C, 0x6F697461, 0x6166206E,
50406 +0x21216C69, 0x00000D0A, 0x00000D0A, 0x00000042,
50407 +0x000000FF, 0x00020001, 0x00FF00FF, 0x00FF00FF,
50408 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
50409 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
50410 +0x010E010D, 0x00020003, 0x01090108, 0x0002010A,
50411 +0x00030002, 0x02020201, 0x02040203, 0x02060205,
50412 +0x02080207, 0x020A0209, 0x020C020B, 0x020E020D,
50413 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
50414 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
50415 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
50416 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
50417 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
50418 +0x010E010D, 0x00FF010F, 0x01090108, 0x010B010A,
50419 +0x00030002, 0x02020201, 0x02040203, 0x02060205,
50420 +0x02080207, 0x020A0209, 0x020C020B, 0x020E020D,
50421 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
50422 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
50423 +0x00000072, 0x00205220, 0x00000046, 0x00000059,
50424 +0x73204142, 0x003D7165, 0x00000074, 0x00000000,
50425 +0x02000112, 0x40FFFFFF, 0x12210ACE, 0x20104890,
50426 +0x02090100, 0x0101002E, 0x09FA8000, 0x04000004,
50427 +0x000000FF, 0x02010507, 0x07000200, 0x00028205,
50428 +0x05070002, 0x00400383, 0x04050701, 0x01004003,
50429 +0x002E0209, 0x80000101, 0x000409FA, 0x00FF0400,
50430 +0x05070000, 0x00400201, 0x82050700, 0x00004002,
50431 +0x03830507, 0x07010040, 0x40030405, 0x03040100,
50432 +0x030C0409, 0x0079005A, 0x00410044, 0x03180053,
50433 +0x00530055, 0x00320042, 0x0030002E, 0x00570020,
50434 +0x0041004C, 0x0000004E, 0x00000000, 0x00000000,
50435 +0x00000709, 0x00000000, 0x00000000, 0x00000000,
50436 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
50437 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
50438 +};
50439 +
50440 +const u32_t zcFwImageSize=11104;
50441 --- /dev/null
50442 +++ b/drivers/staging/otus/hal/hpfwu_txstream.c
50443 @@ -0,0 +1,1017 @@
50444 +/*
50445 + * Copyright (c) 2007-2008 Atheros Communications Inc.
50446 + *
50447 + * Permission to use, copy, modify, and/or distribute this software for any
50448 + * purpose with or without fee is hereby granted, provided that the above
50449 + * copyright notice and this permission notice appear in all copies.
50450 + *
50451 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
50452 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
50453 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
50454 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
50455 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
50456 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
50457 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
50458 + */
50459 +#include "cprecomp.h"
50460 +
50461 +const u32_t zcFwImage[] = {
50462 +0x0009000B, 0x4F222FE6, 0xDE947FFC, 0xE114D594,
50463 +0x1E13D494, 0x67521E4C, 0xD494D693, 0x37402769,
50464 +0x62528F06, 0x7201D692, 0x60602522, 0x2600C93F,
50465 +0xD7906152, 0x2512611D, 0x264B6652, 0x2562470B,
50466 +0x0009B017, 0xE60095AC, 0xC84060E2, 0x2F028F03,
50467 +0x8FF93652, 0xD4887601, 0x4E0BDE88, 0xD4880009,
50468 +0x00094E0B, 0x4E0BD487, 0x7F040009, 0xA0524F26,
50469 +0x4F226EF6, 0x410BD184, 0xD4840009, 0x0009440B,
50470 +0x450BD583, 0xD7830009, 0xD283E1FF, 0x2712611D,
50471 +0xD4825029, 0xE1FFCB01, 0x1209E501, 0x12112212,
50472 +0xE7202452, 0x4718D57E, 0x2572D27E, 0xD17EE700,
50473 +0xD67FD47E, 0xE2012270, 0x24702172, 0xD67D2620,
50474 +0x2641E4FF, 0xD57CE600, 0x666DE104, 0x76016063,
50475 +0x4000626D, 0x8FF83212, 0xD5780545, 0x2520E201,
50476 +0xD278D777, 0xE480E100, 0x22122710, 0x6613D576,
50477 +0x666D644C, 0x76046763, 0x375C626D, 0x8FF83243,
50478 +0xD5722712, 0xD273D772, 0xE400E101, 0x27102511,
50479 +0x000B4F26, 0x7FCC2242, 0xD170D56F, 0xD271DB70,
50480 +0x1F51D471, 0xD6717508, 0x1F12D771, 0x1F55710C,
50481 +0x1FB975FC, 0x72041F2A, 0x1F13EB10, 0x1F561F44,
50482 +0x1F781F67, 0xD86B1F2B, 0xDD6CD96B, 0xDC6CEA00,
50483 +0xD26DDE6C, 0x89003A22, 0xD15D7A01, 0x88016010,
50484 +0x56F88B03, 0x4218E201, 0xD1682622, 0x0009410B,
50485 +0x440BD467, 0xD5670009, 0x0009450B, 0x6010D150,
50486 +0x8B108801, 0xE650D14F, 0x46186212, 0x8B083266,
50487 +0x56F9D14B, 0x2120E200, 0xCB016062, 0x2602A003,
50488 +0x72012710, 0x60822122, 0x89098801, 0xE2C8D15A,
50489 +0x622C6612, 0x89033626, 0x6010D158, 0x8BC88801,
50490 +0x51F66792, 0x217252F5, 0xD6555191, 0x55FA2212,
50491 +0x52FB6462, 0x55612542, 0x2252E400, 0x61436643,
50492 +0x05DE6013, 0x36CC4608, 0x07DE2652, 0xC9036071,
50493 +0x8B028801, 0x720162E2, 0x74012E22, 0x36B3664C,
50494 +0x71048FEE, 0x66C2D147, 0x45286512, 0x265B4518,
50495 +0x60822C62, 0x89018801, 0x0009A168, 0x6272D742,
50496 +0x8B132228, 0xD42BD741, 0x6772D541, 0x51536242,
50497 +0x312C327C, 0x24222228, 0x15138D05, 0x6262D63D,
50498 +0xB1627201, 0xD6232622, 0x2622E200, 0x52916692,
50499 +0x8B013620, 0x0009A144, 0x6061A06E, 0x001C001C,
50500 +0x001D4020, 0x0000B38E, 0xFFFF0000, 0x12340000,
50501 +0x001E1015, 0x00201274, 0x002039F4, 0x002018A2,
50502 +0x00203A00, 0x00203A18, 0x00201860, 0x0020196C,
50503 +0x00201288, 0x001C3510, 0x001C3624, 0x001E212C,
50504 +0x002038F4, 0x0020348C, 0x002038FC, 0x00203908,
50505 +0x00203914, 0x00203970, 0x00203974, 0x0020391C,
50506 +0x0020391D, 0x00203920, 0x00117700, 0x0020398C,
50507 +0x0020398A, 0x002034F0, 0x00117710, 0x001C3D30,
50508 +0x001C36F8, 0x00117734, 0x001C3684, 0x001C3D00,
50509 +0x001C1000, 0x001C1028, 0x00203504, 0x00203924,
50510 +0x00117600, 0x00117740, 0x7FFFFFFF, 0x00201730,
50511 +0x0020332A, 0x00202334, 0x00203DA4, 0x00203972,
50512 +0x002034FC, 0x00203964, 0x001C3D2C, 0x001C36B0,
50513 +0x00203494, 0x0011775C, 0x8801C90F, 0xA0CF8901,
50514 +0xD1960009, 0x36206212, 0xD4958904, 0x2421E200,
50515 +0x2162A0CC, 0x6211D193, 0x89012228, 0x0009A0C3,
50516 +0xE202D78F, 0x75016571, 0x3123615D, 0x27518D02,
50517 +0x0009A0BC, 0xD28C57F2, 0x62226072, 0x40094019,
50518 +0xC90F4009, 0x8F19880A, 0x52F31F2C, 0x40196022,
50519 +0x40094009, 0x8808C90F, 0xA0A78901, 0x60630009,
50520 +0xCB0154F7, 0xD27E55F2, 0xE7012402, 0xD47FE100,
50521 +0x22112572, 0x72016242, 0x2422A098, 0x8B3F8805,
50522 +0x602252F3, 0x40094019, 0xC90F4009, 0x8B168802,
50523 +0xE4FFD577, 0x644D6752, 0x8B102748, 0x6272D775,
50524 +0x8B0C3260, 0x51F255F7, 0xD26DE701, 0x21722562,
50525 +0xD571E100, 0x64522211, 0xA0777401, 0x52F32542,
50526 +0x40196022, 0x40094009, 0x8805C90F, 0x31B38B6E,
50527 +0xD26A8B6C, 0x672254F4, 0x7701D569, 0x61422272,
50528 +0x1F1CE640, 0x46182159, 0x8B033160, 0x6262D665,
50529 +0x26227201, 0xE200D65A, 0x2621B067, 0x0009A056,
50530 +0x3123E220, 0x88038B52, 0x52F38B1E, 0x40196022,
50531 +0x40094009, 0x8803C90F, 0xD25B8B16, 0x672254F4,
50532 +0x7701D557, 0x61422272, 0x1F1CE640, 0x46182159,
50533 +0x8B033160, 0x6262D655, 0x26227201, 0xE200D648,
50534 +0x2621B043, 0x0009A010, 0xD452D551, 0xD2446752,
50535 +0xE1007701, 0x25723A46, 0x22118F06, 0xEA00D64E,
50536 +0x72016262, 0x2622B031, 0x2FB2D54C, 0x95736652,
50537 +0xD44A5BF1, 0x36205241, 0x60618910, 0x8B01C803,
50538 +0x2B22E201, 0x8FF54510, 0x57F15664, 0x6272E1F0,
50539 +0x41284118, 0x2722221B, 0x6BF2A008, 0x6BF2A006,
50540 +0xE200D62F, 0xD12F2621, 0x2121E200, 0xD13CE201,
50541 +0x66122822, 0x8B012668, 0x0009AE2B, 0x450BD539,
50542 +0xD1390009, 0xAE24E600, 0x2F862160, 0x2FA62F96,
50543 +0x2FC62FB6, 0x2FE62FD6, 0x7FF44F22, 0xDE34D133,
50544 +0x54116212, 0x1F4167E2, 0x2F22D432, 0xD5321F72,
50545 +0xD2326743, 0x58417794, 0x69425A42, 0x5B166C72,
50546 +0x60526D22, 0xCB20E600, 0xE5402502, 0x626D7601,
50547 +0x8BFB3253, 0x55F162F2, 0x11512122, 0xD62855F2,
50548 +0x14812E52, 0x249214A2, 0x27C2D426, 0x26D211B6,
50549 +0xDA256742, 0xE801D925, 0x490B2A72, 0xE2011A8C,
50550 +0x1A2C4218, 0x4F267F0C, 0x6DF66EF6, 0x6BF66CF6,
50551 +0x69F66AF6, 0x68F6000B, 0x000007D1, 0x00203984,
50552 +0x00203988, 0x0020398E, 0x001C3DC0, 0x0011772C,
50553 +0x001C3B88, 0x0020396C, 0x0011773C, 0x00117744,
50554 +0x0000F000, 0x00117764, 0x00117748, 0x00117768,
50555 +0x0011776C, 0x01FFFFFF, 0x0011774C, 0x002034FC,
50556 +0x00203DA4, 0x002024F8, 0x00203972, 0x001C3B9C,
50557 +0x001C3D98, 0x001C3700, 0x001C3500, 0x001C5960,
50558 +0x001C8960, 0x00203504, 0x001C3D00, 0x0020160C,
50559 +0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6,
50560 +0xDE957FAC, 0x61E0E014, 0x0F14D494, 0x710161E3,
50561 +0xE0186210, 0xD2920F24, 0x0009420B, 0x450BD591,
50562 +0x20080009, 0x8F126D03, 0xD28F1F07, 0x6720D48F,
50563 +0x657CDD8F, 0x470BD78F, 0xD18F0009, 0x619C6910,
50564 +0x46086613, 0x36184608, 0x3D6C4608, 0xE0181FD7,
50565 +0xE58004FC, 0x604C66E2, 0x3050655C, 0x2D628F15,
50566 +0x01FCE014, 0xDE85E500, 0x641CA008, 0x6753655D,
50567 +0x607037EC, 0x39DC6953, 0x80947501, 0x3243625D,
50568 +0xD67F8BF4, 0xA34EE200, 0x20082621, 0xE0148B13,
50569 +0xE40001FC, 0xA009DE79, 0x644D671C, 0x35EC6543,
50570 +0x69436652, 0x39DC6262, 0x74041921, 0x3273624D,
50571 +0xA3388BF3, 0x88012D10, 0xE0148B17, 0xE70001FC,
50572 +0x6D1C2D70, 0xDE6D1FD4, 0x32D3627D, 0xA32A8B01,
50573 +0x677D0009, 0x667365E3, 0x61737504, 0x315C36EC,
50574 +0x69126462, 0xAFEF7708, 0x88042492, 0xE0148B18,
50575 +0xE40001FC, 0x671C2D40, 0x624DDE60, 0x8B013273,
50576 +0x0009A311, 0x6943644D, 0x39EC62E3, 0x72046592,
50577 +0x3D2C6D43, 0x615266D2, 0x21697408, 0x2512AFED,
50578 +0x8B188805, 0x01FCE014, 0x2D40E400, 0xDE53671C,
50579 +0x3273624D, 0xA2F68B01, 0x644D0009, 0x62E36943,
50580 +0x659239EC, 0x6D437204, 0x66D23D2C, 0x74086152,
50581 +0xAFED216B, 0x88312512, 0xD44A8B3A, 0x6146D94A,
50582 +0x75046543, 0x67566442, 0x6E531F48, 0x65527E04,
50583 +0x7EE462E2, 0x7E0464E2, 0x6EE21FE9, 0x5EF929E0,
50584 +0x7E04D942, 0x1FEA60E2, 0x2900C901, 0xD9406EE2,
50585 +0x29E04E09, 0x2F562F26, 0x56FAD93E, 0x6513490B,
50586 +0xD13D7F08, 0xE71C6E0D, 0x1DE12D70, 0xDE3B6912,
50587 +0x64E21D92, 0x1D43D13A, 0xD23A6512, 0x67221D54,
50588 +0x1D75D239, 0x1D666622, 0x6262D638, 0x1D27A2AB,
50589 +0x8B398830, 0x6596D92B, 0x67926696, 0x61967904,
50590 +0x74E46493, 0x6E436992, 0x1F9B7E04, 0x1FEC6442,
50591 +0xD9256EE2, 0x5EFC29E0, 0x7E04D924, 0x1FED60E2,
50592 +0x2900C901, 0xD9226EE2, 0x29E04E09, 0x59FC7FFC,
50593 +0xDE272F92, 0x2F164E0B, 0xD41F7F08, 0xE21C610D,
50594 +0x1D112D20, 0xD2206442, 0xD41C1D42, 0x1D536542,
50595 +0x6752D51B, 0xD71B1D74, 0x1D156172, 0x1D666622,
50596 +0x6262D61A, 0x1D27A26F, 0x8B358833, 0x490BD919,
50597 +0xA268EE00, 0x00002DE0, 0x00117800, 0x00203A1C,
50598 +0x002018A2, 0x00202AAC, 0x0020390E, 0x00203A20,
50599 +0x00203534, 0x002018EE, 0x0020390D, 0x00117804,
50600 +0x0020398C, 0x00117810, 0x00203909, 0x0020390A,
50601 +0x0020390B, 0x00200F64, 0x001C5864, 0x001C6864,
50602 +0x001C7864, 0x001C59BC, 0x001C69BC, 0x001C79BC,
50603 +0x00200FBC, 0x00200FB8, 0x89018828, 0x0009A0C0,
50604 +0xE643DEB5, 0x326662E1, 0x1FEE8F02, 0x2E21E240,
50605 +0x622D62E1, 0x8B013267, 0x0009A0AA, 0xE50185E1,
50606 +0x8B013056, 0x0009A0A4, 0x2D10E101, 0x64E1B225,
50607 +0xE64357FE, 0x652D6271, 0x89443567, 0x3563E640,
50608 +0xE6008B05, 0x0F65E040, 0xA00FE11A, 0x615372C0,
50609 +0x41214121, 0x41214121, 0x45214121, 0x45214521,
50610 +0xC9036053, 0xE0406603, 0x71180F65, 0x2209E007,
50611 +0x0F25E03C, 0xE044641D, 0xB2A365F3, 0xE33C0F46,
50612 +0x853233FC, 0x620DDE95, 0x42086031, 0x6023610D,
50613 +0x1323E944, 0x06FE4108, 0xE00F39FC, 0x13144E0B,
50614 +0x67075D91, 0x60D32679, 0x0F6654FE, 0x51928542,
50615 +0x600D4E0B, 0x60D3260B, 0x0F666492, 0x65F3B237,
50616 +0x696156FE, 0xE640659D, 0x89383563, 0xD78359FE,
50617 +0x79066591, 0xC9036053, 0x40004008, 0x61036203,
50618 +0x0F26E050, 0x470BE0FF, 0x6C07600C, 0x6603605D,
50619 +0x46214621, 0x46214621, 0x42006263, 0x4200326C,
50620 +0x40214021, 0x4008C903, 0x6D2D30FC, 0xE8006A03,
50621 +0xB25765F3, 0x6EA264D3, 0x2EC9E050, 0x66942AE2,
50622 +0xD76E01FE, 0x606C470B, 0x2AE22E0B, 0x64D365F3,
50623 +0x7801B1FD, 0xEE06628D, 0x8FE932E3, 0x5EFE7D01,
50624 +0x61E1E400, 0x410085E1, 0x66E3310C, 0x760C711B,
50625 +0xE70465F3, 0x68667401, 0x3A736A4D, 0x8FF92582,
50626 +0x65F37504, 0x641DB1E3, 0x64E1B1A4, 0x0009A17B,
50627 +0xD45B56F7, 0xEC01D25B, 0x26C0420B, 0x0009A173,
50628 +0x06FCE018, 0x8829606C, 0x58F78B08, 0xE400D252,
50629 +0x66222840, 0x646DB171, 0x0009A165, 0x666CE681,
50630 +0x89013060, 0x0009A0AC, 0xD550D14F, 0x62126A56,
50631 +0x212232AC, 0x54116C56, 0x34CC6253, 0x64521141,
50632 +0x72085812, 0xD44A384C, 0x68221182, 0x5A136C42,
50633 +0x3ACC3C8C, 0x11A324C2, 0x6C2272EC, 0x72105814,
50634 +0x118438CC, 0x5A156822, 0x11A53A8C, 0x6A227210,
50635 +0xD6405816, 0x118638AC, 0x52176C62, 0x112732CC,
50636 +0x5A185861, 0x11A83A8C, 0x5C195A62, 0x11C93CAC,
50637 +0x521A5C63, 0x112A32CC, 0x5A1B5864, 0x11AB3A8C,
50638 +0x5C1C5A65, 0x11CC3CAC, 0x521D5C66, 0x112D32CC,
50639 +0x5A1E5867, 0x11AE3A8C, 0x561F5A68, 0x36ACE840,
50640 +0x116FDA2D, 0x6CA2381C, 0x7A946682, 0x286236CC,
50641 +0x5C8162A2, 0x18C13C2C, 0x62A27A44, 0x362C5682,
50642 +0xD6261862, 0x5A856262, 0x3A2C4229, 0x760418A5,
50643 +0x56866262, 0x362C4229, 0x56F71866, 0x2620E238,
50644 +0x16C15C81, 0x16226212, 0xE2005C11, 0x551216C3,
50645 +0x55151654, 0x55131655, 0x55161656, 0x55821657,
50646 +0x65821658, 0x55141659, 0x5584165A, 0x5583165B,
50647 +0x5585165C, 0x5586165D, 0x1821165E, 0x11212122,
50648 +0x11251122, 0x11261123, 0x28221822, 0x18241124,
50649 +0x18251823, 0x1826A0C7, 0x00117804, 0x002033E8,
50650 +0x00203A40, 0x002018A2, 0x00203494, 0x001C36A0,
50651 +0x002034F0, 0x001C3CA0, 0x001C36F4, 0x001C3B88,
50652 +0x666CE682, 0x8B203060, 0xEA2456F7, 0x26A0D194,
50653 +0x16C15C17, 0x16225218, 0x16835819, 0x16A45A1A,
50654 +0x16C55C1B, 0x1626521C, 0xE200581D, 0x551E1687,
50655 +0x551F1658, 0x11271659, 0x11291128, 0x112B112A,
50656 +0x112D112C, 0xA08E112E, 0xE683112F, 0x3060666C,
50657 +0x52F78B0B, 0xEA00D883, 0x658222A0, 0x7804DC82,
50658 +0x62822C52, 0xA07ED681, 0xE6902620, 0x3060666C,
50659 +0xDA7F8B06, 0x00094A0B, 0xE20056F7, 0x2620A073,
50660 +0x666CE691, 0x8B103060, 0x6222D276, 0x2228622C,
50661 +0xD2788904, 0x0009420B, 0x0009A003, 0x420BD276,
50662 +0x56F70009, 0xA05EE200, 0xE6922620, 0x3060666C,
50663 +0xE0188951, 0xE6B00BFC, 0x666C62BC, 0x8B2A3260,
50664 +0x02FCE014, 0x682CEA00, 0x62ADE904, 0x894A3283,
50665 +0x6AADDD64, 0x3CDC6CA3, 0x7D046EC2, 0xDB68D467,
50666 +0x32DC62A3, 0x4B0BDC67, 0x4C0B6D22, 0xD46664E3,
50667 +0x00094B0B, 0x64D34C0B, 0x4B0BD464, 0xE6000009,
50668 +0x666D6BE3, 0x76013B6C, 0x3293626D, 0x8FF72BD0,
50669 +0xAFDA4D19, 0xE6B57A08, 0x3260666C, 0xD45C8B13,
50670 +0x4B0BDB57, 0xD25B0009, 0x6022DB5B, 0xCB20E6FF,
50671 +0x2202666D, 0xDB592B62, 0xE014E200, 0x56F72B20,
50672 +0xA01002FC, 0xD4562620, 0x6542D256, 0x420BD456,
50673 +0xA0080009, 0xDB520009, 0x52B1E600, 0x622CDB53,
50674 +0x52F72B21, 0x7F542260, 0x6EF64F26, 0x6CF66DF6,
50675 +0x6AF66BF6, 0x000B69F6, 0x4F2268F6, 0xE240614D,
50676 +0x89143123, 0x3127E21F, 0x8B09D749, 0xD449614D,
50677 +0xE00171E0, 0x5671440B, 0x26596507, 0x1761A007,
50678 +0xE001D444, 0x6672440B, 0x26596507, 0x4F262762,
50679 +0x0009000B, 0x614D4F22, 0x3123E240, 0xE21F8912,
50680 +0xD73B3127, 0x614D8B08, 0x5671D23A, 0x420B71E0,
50681 +0x260BE001, 0x1761A006, 0x6672D236, 0xE001420B,
50682 +0x2762260B, 0x000B4F26, 0xE6400009, 0x46284618,
50683 +0x6252D531, 0x89FC2268, 0x0009000B, 0x4618E680,
50684 +0xD52D4628, 0x22686252, 0x000B89FC, 0xA0010009,
50685 +0x7201E200, 0x8BFC3242, 0x0009000B, 0x4618E680,
50686 +0xD5264628, 0x22686252, 0x000B8BFC, 0x2FE60009,
50687 +0x7FFC4F22, 0xBFF16E53, 0x61E22F42, 0xE280D620,
50688 +0x54E11615, 0x16464218, 0x422855E2, 0x57E31657,
50689 +0x16786EF2, 0x26E22E2B, 0x4F267F04, 0x6EF6AFCE,
50690 +0x00203494, 0x00117804, 0x002038F4, 0x00203908,
50691 +0x0020050A, 0x00201008, 0x0020102E, 0x00203A58,
50692 +0x002018A2, 0x002018E6, 0x00203A6C, 0x00203A74,
50693 +0x00203A78, 0x001C3500, 0x001C1000, 0x0020398A,
50694 +0x00117800, 0x002018EE, 0x00203A8C, 0x00203990,
50695 +0x001C3704, 0x002033E8, 0x001C373C, 0x001C3700,
50696 +0x001C370C, 0x2FD62FC6, 0x4F222FE6, 0x6C53DD10,
50697 +0x6E43BFA4, 0x2DE2BF89, 0x0009BFA0, 0x2C1251D5,
50698 +0x1C4154D6, 0x1C5255D7, 0x1C6356D8, 0x6EF64F26,
50699 +0x000B6DF6, 0x61636CF6, 0xA004E600, 0x62564109,
50700 +0x24227601, 0x36127404, 0x000B8BF9, 0x00000009,
50701 +0x001C370C, 0x0009A16E, 0x2FE62FD6, 0xDD944F22,
50702 +0xA0049EB2, 0xD4930009, 0x420BD293, 0x62D265D2,
50703 +0x8BF822E8, 0x0009A004, 0xD28FD490, 0x55D1420B,
50704 +0x22E852D1, 0xA0048BF8, 0xD48D0009, 0x420BD28A,
50705 +0x52D255D2, 0x8BF822E8, 0x0009A004, 0xD286D489,
50706 +0x55D3420B, 0x22E852D3, 0xA0048BF8, 0xD4860009,
50707 +0x420BD281, 0x52D455D4, 0x8BF822E8, 0x6EF64F26,
50708 +0x6DF6000B, 0x2FD62FC6, 0x4F222FE6, 0x6E636C73,
50709 +0x6D53B01A, 0x64D357F4, 0xB05F65E3, 0xB07566C3,
50710 +0xB0A40009, 0xB0A80009, 0xB0AC0009, 0xB0AC0009,
50711 +0xB0AF0009, 0xB03154F5, 0x6CCD6C03, 0x4F2660C3,
50712 +0x6DF66EF6, 0x6CF6000B, 0x3412D170, 0xD6700529,
50713 +0x2650D770, 0x2742000B, 0x0009A018, 0x2FD62FC6,
50714 +0x4F222FE6, 0x6E636C73, 0x6D53BFEE, 0x64D357F4,
50715 +0xB03365E3, 0xB08D66C3, 0xB00F54F5, 0x6CCD6C03,
50716 +0x4F2660C3, 0x6DF66EF6, 0x6CF6000B, 0xE503D162,
50717 +0xD763D462, 0x21524518, 0x2472000B, 0xD45FD15E,
50718 +0x2162E600, 0x2462000B, 0xBF734F22, 0xBF73E40A,
50719 +0xD25C0009, 0x4118E104, 0xE40AE500, 0xBF692212,
50720 +0xD7592252, 0xCB206072, 0x000B4F26, 0x4F222702,
50721 +0x410BD156, 0xD556E400, 0x4F26452B, 0xD1552FE6,
50722 +0x66126E63, 0x92104418, 0x44084528, 0x45002629,
50723 +0x265B4408, 0x264B4400, 0x21624708, 0xD14E4708,
50724 +0x217227EB, 0x6EF6000B, 0x1FFF03F0, 0x4F222FE6,
50725 +0xE101DE4A, 0xBF3DE40A, 0x67E32E12, 0xE500776C,
50726 +0xE204E130, 0x2752E40A, 0x27522752, 0x27522752,
50727 +0x27522752, 0x27522752, 0x27522752, 0x27522752,
50728 +0x27522752, 0x27522752, 0x27522752, 0x27222712,
50729 +0x27522752, 0x27522752, 0x27522752, 0x27522752,
50730 +0x175ABF18, 0x2E62E600, 0x000B4F26, 0xD2346EF6,
50731 +0xE441E101, 0x000B2212, 0xD1322242, 0xE605D432,
50732 +0x000B2162, 0x000B2462, 0xD2300009, 0xE40AE601,
50733 +0x2262AF00, 0x2FC62FB6, 0x2FE62FD6, 0x7FFC4F22,
50734 +0x6C43DB2B, 0xED0060B2, 0x2B02CB03, 0xC90360B2,
50735 +0x6E03A008, 0x89073DC2, 0xE46460B2, 0xB07CC903,
50736 +0x7D016E03, 0x8BF52EE8, 0x8F043DC2, 0xD4212FE1,
50737 +0x460BD621, 0x62F10009, 0x6023622D, 0x89FFC801,
50738 +0x7F046023, 0x6EF64F26, 0x6CF66DF6, 0x6BF6000B,
50739 +0x001C3B88, 0x00203AA0, 0x002018EE, 0x00203AA8,
50740 +0x00203AB0, 0x00203AB8, 0x00203AC0, 0x0025E720,
50741 +0x00203DA0, 0x002038F8, 0x001C5968, 0x001C3B40,
50742 +0x000F8000, 0x001D4004, 0x001C3500, 0x002015E0,
50743 +0x0020160C, 0x001C5814, 0x001C59D0, 0x001C5830,
50744 +0x001C6268, 0x001C59A4, 0x001C639C, 0x001C581C,
50745 +0x001C5860, 0x00203AC8, 0x002018A2, 0x8F014411,
50746 +0x6043604B, 0x0009000B, 0x5651D52B, 0x46286052,
50747 +0x306C000B, 0x2FC62FB6, 0x2FE62FD6, 0x4F124F22,
50748 +0xBFF14F02, 0x6B036E43, 0xDD25DC24, 0x0009BFEC,
50749 +0x3C0530B8, 0x4609060A, 0x46014609, 0x020A3D65,
50750 +0x42094209, 0x32E24209, 0x4F068BF0, 0x4F264F16,
50751 +0x6DF66EF6, 0x000B6CF6, 0x2FC66BF6, 0x2FE62FD6,
50752 +0x4F124F22, 0xBFCF4F02, 0x6C036E43, 0xBFCBDD13,
50753 +0x30C80009, 0x060A3D05, 0x46094609, 0x36E24601,
50754 +0x4F068BF5, 0x4F264F16, 0x6DF66EF6, 0x6CF6000B,
50755 +0x4F222FE6, 0xE102DE0B, 0xE403E500, 0xBFB92E12,
50756 +0xE6062E52, 0xE7004618, 0x2E62E403, 0x4F262E72,
50757 +0x6EF6AFB0, 0x0009000B, 0x001C1040, 0xCCCCCCCD,
50758 +0x10624DD3, 0x001D4004, 0x2F962F86, 0x2FB62FA6,
50759 +0x2FD62FC6, 0x4F222FE6, 0xE5007F98, 0x6453E710,
50760 +0x6B534728, 0xEE1ADCBC, 0x6153655D, 0x315C4108,
50761 +0x75014108, 0x6043317C, 0x0F16665D, 0xED0060B3,
50762 +0x21B136E3, 0x81128111, 0x11D28113, 0x11D411D3,
50763 +0x74048FEA, 0xD8B167F2, 0x1871D9B1, 0x58F12872,
50764 +0x1981D1B0, 0x59F22982, 0x5DF45AF3, 0x54F65EF5,
50765 +0x21921191, 0x11A211A3, 0x11D411D5, 0x11E611E7,
50766 +0x11481149, 0xDAA855F7, 0x57F8EE00, 0x52F9DDA7,
50767 +0x64E3D6A7, 0x2A521A51, 0xD8A7D9A6, 0x2D729AD5,
50768 +0x6EED2622, 0x4D086DE3, 0x3DEC61E3, 0x4D084108,
50769 +0x3D9C31EC, 0x410860B3, 0x81D12DB1, 0x4108E050,
50770 +0x4008E7B7, 0x677C4108, 0x60B381D2, 0xE200318C,
50771 +0x81D33472, 0x1D131DD2, 0x8D01D493, 0xD4901D24,
50772 +0xB0B365D3, 0x64ED7E01, 0x8BDA34A2, 0x2FD2DA8C,
50773 +0xDD9268A2, 0x2D824829, 0x7DFC64A2, 0xD287694D,
50774 +0x6E222D92, 0x7D0C4E29, 0x68222DE2, 0x618D6AD3,
50775 +0x2A16D784, 0xD48A6D72, 0x24D2D583, 0xD6895E72,
50776 +0x517414E2, 0x1414EE00, 0xD1875876, 0x59781486,
50777 +0x1498E710, 0x65E36252, 0x26E2142A, 0xE60064E3,
50778 +0x6843644D, 0x384C4808, 0x381C4808, 0x0C866053,
50779 +0x09CE28B1, 0x819160B3, 0x0ACE6053, 0x81A26043,
50780 +0x0DCE6053, 0x81D360B3, 0x08CE6053, 0x18827401,
50781 +0x624D09CE, 0x0ACE19E3, 0x1A643273, 0x75048FE0,
50782 +0xE003D96A, 0x40186C92, 0x6D922CB1, 0x81D1DA6F,
50783 +0x6E92E050, 0x81E24008, 0x60B36192, 0x64928113,
50784 +0x1442E600, 0xD4696792, 0x689217A3, 0x1864E1FF,
50785 +0x6563E703, 0x364C4608, 0x26127501, 0x3673665D,
50786 +0xDC5B8BF8, 0x6DC2E003, 0x2DB14018, 0xD2606EC2,
50787 +0x61C281E1, 0x1112EE00, 0xE02464C2, 0x65C21423,
50788 +0x15E4D45B, 0xE58067C2, 0x68C28172, 0x818366E3,
50789 +0x666D655C, 0x76046963, 0x394C6A6D, 0x8FF83A53,
50790 +0xDB5429E2, 0x24B2DC54, 0x24C27404, 0x4F267F68,
50791 +0x6DF66EF6, 0x6BF66CF6, 0x69F66AF6, 0x68F6000B,
50792 +0x60116142, 0x8F03C803, 0xD23DE500, 0x8B063420,
50793 +0xC9036011, 0x8B068802, 0x3420D239, 0x56128B03,
50794 +0x52646513, 0x000B2422, 0x01136053, 0x2FE62FD6,
50795 +0x7FEC4F22, 0x62536E53, 0x6D43E550, 0x4508E400,
50796 +0xE101A001, 0x60435224, 0x81212211, 0x60538123,
50797 +0x56E28122, 0x8BF53620, 0x16E4D238, 0xE61464F3,
50798 +0x65E3420B, 0xE4FC65E1, 0x2E512549, 0x65F361F1,
50799 +0x2F112149, 0xD13154D1, 0xE614410B, 0x607157D1,
50800 +0x2701CB01, 0x7F141DE1, 0x6EF64F26, 0x6DF6000B,
50801 +0x2FE62FD6, 0x7FEC4F22, 0x66536E53, 0x6D43E5FC,
50802 +0x20596061, 0x2601CB01, 0x326052E2, 0x12E48B06,
50803 +0x31E051E2, 0x52D18B04, 0x1E22A002, 0x5664AFF0,
50804 +0x64F3D21E, 0x420BE614, 0x67E165E3, 0x2719E1FC,
50805 +0x67F12E71, 0x271954D1, 0x65F3D118, 0x410BE614,
50806 +0x52D12F71, 0xCB016021, 0x1DE12201, 0x4F267F14,
50807 +0x000B6EF6, 0x00006DF6, 0x00203924, 0x002034F4,
50808 +0x002034FC, 0x00203504, 0x0020352C, 0x00203910,
50809 +0x00203918, 0x00100208, 0x001017C0, 0x001E210C,
50810 +0x001C3D00, 0x00203964, 0x001000C8, 0x00117880,
50811 +0x00117780, 0x00040020, 0x0026C401, 0x00200ED6,
50812 +0x4F222FE6, 0xDE42624C, 0x42004208, 0x3E2CA005,
50813 +0xD4405252, 0xBF695624, 0x65E22E62, 0x352052E1,
50814 +0xD63D8BF6, 0x4F262622, 0x6EF6000B, 0x2FC62FB6,
50815 +0x2FE62FD6, 0xDC394F22, 0x52C1DB39, 0x362066C2,
50816 +0x6061891C, 0x8801C903, 0xDE348918, 0xBF37DD35,
50817 +0x650364E3, 0x66B28503, 0x3262620D, 0xD4328907,
50818 +0x0009BF76, 0x4D0BD431, 0xAFE60009, 0xBF3D0009,
50819 +0xD42F64E3, 0x00094D0B, 0x0009AFDF, 0x2262D22D,
50820 +0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, 0x2FD62FC6,
50821 +0x4F222FE6, 0xDD29DC28, 0x6E4360C2, 0x04DE4008,
50822 +0xE614D127, 0x65E3410B, 0xD127D726, 0x55E227E2,
50823 +0x35E05254, 0x21228F04, 0x400860C2, 0x122202DE,
50824 +0x605365C2, 0x75014008, 0x0DE606DE, 0xC90F6053,
50825 +0x60632C02, 0x6EF64F26, 0x000B6DF6, 0x85436CF6,
50826 +0x650D5643, 0x622D6262, 0x35277204, 0xE1008F0C,
50827 +0x2268960C, 0xD6158B03, 0x72015261, 0xD6131621,
50828 +0x6262E101, 0x26227201, 0x6013000B, 0x000001FF,
50829 +0x00203504, 0x002034FC, 0x001C3D00, 0x0020352C,
50830 +0x002038F4, 0x002018A2, 0x002034F4, 0x00203AF0,
50831 +0x00203AF4, 0x001C3D28, 0x00203964, 0x00203924,
50832 +0x00200ED6, 0x00203968, 0x0020396C, 0x00117754,
50833 +0x2FC62FB6, 0x2FE62FD6, 0x7FF84F22, 0x6022D237,
50834 +0x8D58C803, 0xDE362F01, 0xDB37DC36, 0x66C252C1,
50835 +0x892F3620, 0xC9036061, 0x892B8801, 0xD233DD31,
50836 +0x64D3420B, 0x1F016503, 0x880160B1, 0xD2308B04,
50837 +0x64D3420B, 0x0009AFEA, 0x85615653, 0x8904C820,
50838 +0xE050D72C, 0x7201027E, 0xD22B0726, 0x6453420B,
50839 +0x89072008, 0x55F1D126, 0x64D3410B, 0xE601D727,
50840 +0x2762AFD4, 0x55F1D226, 0x64E3420B, 0xE601D125,
50841 +0x2162AFCC, 0xDD25DE24, 0xDC26DB25, 0x66D252D1,
50842 +0x89183620, 0xC9036061, 0x89148801, 0xD117D41F,
50843 +0x0009410B, 0x36E05603, 0x65038F04, 0x2B20E201,
50844 +0x2C52AFEC, 0xD712D41C, 0x0009470B, 0xE601D115,
50845 +0xAFE34618, 0x60F12162, 0x8907C804, 0x7F08D217,
50846 +0x6EF64F26, 0x6CF66DF6, 0x6BF6422B, 0x4F267F08,
50847 +0x6DF66EF6, 0x000B6CF6, 0x00006BF6, 0x001E2100,
50848 +0x00203504, 0x002034FC, 0x0020398C, 0x002014A0,
50849 +0x002014CC, 0x00203494, 0x002016BE, 0x001E212C,
50850 +0x00201530, 0x001C3D30, 0x00117880, 0x002034F4,
50851 +0x00203914, 0x00203910, 0x0020352C, 0x00200610,
50852 +0xE601D203, 0x1265D503, 0x000B2252, 0x00001266,
50853 +0x001C1010, 0x0000C34F, 0x0009000B, 0x2FD62FC6,
50854 +0x4F222FE6, 0x6D436C53, 0xEE00A004, 0x7E0164D4,
50855 +0x644CBFF2, 0x8BF93EC2, 0x6EF64F26, 0x000B6DF6,
50856 +0xE5006CF6, 0x6643A002, 0x76017501, 0x22286260,
50857 +0xAFE38BFA, 0x2FE60009, 0x75076253, 0xE1086753,
50858 +0x6043EE0A, 0x4409C90F, 0x650330E2, 0x8D014409,
50859 +0xE630E637, 0x4110365C, 0x8FF22760, 0xE00077FF,
50860 +0x000B8028, 0x000B6EF6, 0x000BE000, 0x2FE6E000,
50861 +0x7FEC4F22, 0x6E436253, 0xBFDC65F3, 0xBFD06423,
50862 +0xBFCE64E3, 0xD40364F3, 0x0009BFCB, 0x4F267F14,
50863 +0x6EF6000B, 0x00203AF8, 0xE4FDD29F, 0xD79F6122,
50864 +0x22122149, 0x74016022, 0x2202CB01, 0xD59C6622,
50865 +0x22622649, 0xC8406070, 0x60528902, 0x2502CB04,
50866 +0xE1F76452, 0x25422419, 0xE7016052, 0x2502CB40,
50867 +0xE6026052, 0x2502C9CF, 0x47186052, 0x2502CB10,
50868 +0xCB036052, 0x15622502, 0x1573000B, 0xD78ED58D,
50869 +0xD48FD28E, 0xE600E100, 0x27112511, 0xAFCB2210,
50870 +0x664C2461, 0x4600D28B, 0x6060362C, 0x000BCB10,
50871 +0x654C2600, 0x4500D287, 0x6650352C, 0x2619E1EF,
50872 +0x2560000B, 0xD284664C, 0x362C4600, 0xCB106060,
50873 +0x2600000B, 0xD280654C, 0x352C4500, 0xE1EF6650,
50874 +0x000B2619, 0x664C2560, 0x4600D27A, 0x6060362C,
50875 +0x000BCB08, 0x654C2600, 0x4500D276, 0x6650352C,
50876 +0x2619E1F7, 0x2560000B, 0xD273664C, 0x362C4600,
50877 +0xCB086060, 0x2600000B, 0xD26F654C, 0x352C4500,
50878 +0xE1F76650, 0x000B2619, 0x624C2560, 0x4200D669,
50879 +0x6020326C, 0x4021C908, 0x40214021, 0x600C000B,
50880 +0xD665624C, 0x326C4200, 0xC9086020, 0x40214021,
50881 +0x000B4021, 0xD161600C, 0x341C644C, 0x000B6240,
50882 +0xD15F602C, 0x341C644C, 0x000B6240, 0x2FE6602C,
50883 +0x6E434F22, 0xE60A645C, 0x89143467, 0x0009BFEB,
50884 +0x60EC640C, 0x8B028801, 0xA002E00F, 0x44092409,
50885 +0x624C4409, 0x3263E60A, 0xBFE28905, 0x620C644C,
50886 +0xC8806023, 0xE2008B00, 0x4F266023, 0x6EF6000B,
50887 +0xD64C4F22, 0x88016062, 0xB2578B03, 0xA0030009,
50888 +0xD2490009, 0x2260E640, 0xE200D648, 0x000B4F26,
50889 +0x4F222622, 0x6062D643, 0x8B018802, 0x0009B2A0,
50890 +0xE200D642, 0x000B4F26, 0xD53E2622, 0xE100D43E,
50891 +0x2512E701, 0x2470000B, 0xE604D23B, 0x2260000B,
50892 +0xD43B4F22, 0x410BD13B, 0xD53B0009, 0x6650E1FD,
50893 +0x2619D23A, 0x2560E700, 0x000B4F26, 0x4F222270,
50894 +0xD238D537, 0xD7386152, 0x2512611D, 0xE6FF6452,
50895 +0x2542242B, 0xD22FD435, 0x420B666D, 0xD52E2762,
50896 +0x6750E1FB, 0x4F262719, 0x2570000B, 0xD4304F22,
50897 +0x410BD128, 0xD5280009, 0x6650E7F7, 0x4F262679,
50898 +0x2560000B, 0x9425D524, 0x22496250, 0x2520000B,
50899 +0xE4BFD521, 0x22496250, 0x2520000B, 0xD2254F22,
50900 +0x600D8522, 0x89112008, 0x89458801, 0x89478803,
50901 +0x89498805, 0x894F8806, 0x89558808, 0x895B8809,
50902 +0x8961880A, 0x8967880B, 0x0009A06E, 0x0009B070,
50903 +0x600CA06B, 0x0000FF7F, 0x001E2148, 0x001E1000,
50904 +0x001E1108, 0x002039C4, 0x002039C6, 0x002039E5,
50905 +0x002039A8, 0x001E103F, 0x001E105F, 0x001E102F,
50906 +0x001E1090, 0x002039CC, 0x001E100B, 0x002039C8,
50907 +0x00203AFC, 0x002018A2, 0x001E1028, 0x002039E4,
50908 +0x001D4020, 0x98760000, 0x001C1000, 0x00203B08,
50909 +0x00203B18, 0x0020399C, 0x0009B04C, 0x600CA035,
50910 +0x0009B055, 0x600CA031, 0x6260D684, 0x8B2B2228,
50911 +0x0009B061, 0x600CA029, 0x6260D680, 0x8B232228,
50912 +0x0009B069, 0x600CA021, 0x6260D67C, 0x8B1B2228,
50913 +0x0009B0C7, 0x600CA019, 0x6260D678, 0x8B132228,
50914 +0x0009B0CD, 0x600CA011, 0x6260D674, 0x8B0B2228,
50915 +0x0009B125, 0x600CA009, 0x6260D670, 0x8B032228,
50916 +0x0009B13D, 0x600CA001, 0x4F26E000, 0x0009000B,
50917 +0xD26CD16B, 0xD56C8412, 0x4000C90F, 0xD76B012D,
50918 +0xE403D66B, 0xE20F611C, 0x2540E001, 0x25202712,
50919 +0x2602000B, 0xE601D262, 0x30668523, 0xE0008D05,
50920 +0xD663D260, 0xE0018122, 0x000B2602, 0xD25C0009,
50921 +0x600D8523, 0x89052008, 0x8B0A8801, 0x6060D65D,
50922 +0x2600CB01, 0xD457D65A, 0xE001E101, 0x000B2612,
50923 +0x000B8142, 0xD152E000, 0x8513E501, 0x640D4518,
50924 +0x66033453, 0xE0008D05, 0xD551D253, 0x2260E001,
50925 +0x000B2502, 0x4F220009, 0x8513D149, 0x6453650D,
50926 +0x62494419, 0x227D672E, 0x8801602C, 0x88028909,
50927 +0x88038910, 0x8806891A, 0x88078935, 0xA04C893B,
50928 +0xD5460009, 0x6652D746, 0x2762D446, 0x622C6261,
50929 +0x2421A038, 0x2228625C, 0xD4438B3F, 0x6642D540,
50930 +0x2562D440, 0x24018561, 0x6203A02C, 0x2008605C,
50931 +0x88108907, 0x88208908, 0x88308909, 0xA02C890A,
50932 +0xD23A0009, 0x6222A008, 0xA005D239, 0xD2396222,
50933 +0x6222A002, 0x6262D638, 0xD432D531, 0x66212522,
50934 +0xA00F626C, 0xD6352421, 0x6261D52D, 0x622CD42D,
50935 +0xA0072562, 0xD6322421, 0x8561D529, 0x2562D429,
50936 +0x62032401, 0x662D8515, 0x3617610D, 0x65038F01,
50937 +0xB0CB2451, 0xA0010009, 0xE000E001, 0x000B4F26,
50938 +0xD6190009, 0xD427E101, 0x65412610, 0xD118D717,
50939 +0xE20F655D, 0x2752E001, 0x000B2620, 0x2FE62102,
50940 +0xD20F4F22, 0x640C8523, 0x8B082448, 0xD511D61D,
50941 +0x2621E200, 0x940F8451, 0xA0482049, 0xDE0D8051,
50942 +0xC84060E0, 0xE2018D32, 0x89443427, 0xD216D615,
50943 +0x2641420B, 0x0009A030, 0x0000FF7F, 0x002039E5,
50944 +0x0020399C, 0x002039A8, 0x001E1100, 0x001E100C,
50945 +0x002039C8, 0x001E1000, 0x001E1001, 0x002039D0,
50946 +0x002039B0, 0x002039B4, 0x002039B8, 0x002039D4,
50947 +0x002039D8, 0x002039DC, 0x002039E0, 0x00203E04,
50948 +0x00203E0E, 0x002039C2, 0x00202886, 0x89123427,
50949 +0xD294D693, 0x2641420B, 0xCB8084E1, 0x80E1B0F5,
50950 +0xD69160E0, 0x2E00CB04, 0xC93F6060, 0xD68F2600,
50951 +0xA001E001, 0xE0002602, 0x000B4F26, 0xD68C6EF6,
50952 +0xC8806060, 0xD2868919, 0x88016021, 0xD2898B15,
50953 +0x8524E501, 0x89103056, 0xE203D187, 0x2120D487,
50954 +0xE00B6541, 0x0656655D, 0xE40FD585, 0x2140E702,
50955 +0xD77E2571, 0x000BE001, 0x000B2702, 0x2FE6E000,
50956 +0xDE804F22, 0xC88084E1, 0xD57A892C, 0x20088554,
50957 +0x61038F28, 0x8553D77C, 0x64036672, 0x8566650C,
50958 +0x3520620C, 0xD6798B1E, 0x651CD774, 0x2651644C,
50959 +0x60E02741, 0x8904C840, 0x420BD275, 0xA0030009,
50960 +0xD2680009, 0x0009420B, 0x0009B09F, 0xE201D167,
50961 +0x60E02122, 0xCB04D464, 0x60402E00, 0x2400C93F,
50962 +0x6023A001, 0x4F26E000, 0x6EF6000B, 0x2FB62FA6,
50963 +0x2FD62FC6, 0xDA622FE6, 0x66A1E240, 0x3622DC5E,
50964 +0x62638900, 0x6ED36D2C, 0x4E2136D8, 0x4E212A61,
50965 +0xDB61D460, 0xE700A00F, 0x770162B2, 0x71026123,
50966 +0x66212B12, 0x71026213, 0x61212B12, 0x651D666D,
50967 +0x356C4528, 0x627C2452, 0x8BED32E3, 0xC90360D3,
50968 +0x8B108803, 0x617367B2, 0x2B127102, 0x71026E13,
50969 +0x2B126571, 0x655D6DE1, 0x422862DD, 0x325CE107,
50970 +0xA00C2C10, 0x88022422, 0xA0038B01, 0x8801E203,
50971 +0xE2018B05, 0x66B22C20, 0x655D6561, 0xE60F2452,
50972 +0x67A12C60, 0x8B052778, 0xDD38DC44, 0xEB01EA00,
50973 +0x2DB22CA2, 0x6DF66EF6, 0x6BF66CF6, 0x6AF6000B,
50974 +0x2FE62FD6, 0xE240DD36, 0x362266D1, 0x62638900,
50975 +0x3678672C, 0x7703DE38, 0x47212D61, 0x64E2D635,
50976 +0xA00E4721, 0x6562E100, 0x62537101, 0x74012450,
50977 +0x24204219, 0x45297401, 0x74012450, 0x24504519,
50978 +0x621C7401, 0x8BEE3273, 0x66E24200, 0x420061D1,
50979 +0x2118362C, 0x2E628F06, 0xDD1CD728, 0xE501E400,
50980 +0x2D522742, 0x000B6EF6, 0x2FD66DF6, 0x4F222FE6,
50981 +0xED0AEE01, 0x64E3BC85, 0xBC8A64E3, 0x62EC7E01,
50982 +0x8BF732D7, 0xBC8DEE01, 0x64E364E3, 0x7E01BC92,
50983 +0x32D762EC, 0x4F268BF7, 0x000B6EF6, 0xD1186DF6,
50984 +0xD418920D, 0x72122122, 0x2422D617, 0xD7177204,
50985 +0x72202622, 0x2722D116, 0x000B7230, 0x137A2122,
50986 +0x002039C2, 0x00202992, 0x001E1015, 0x002039C8,
50987 +0x001E1001, 0x0020399C, 0x001E1100, 0x002039C6,
50988 +0x002039B4, 0x001E1000, 0x002039B8, 0x002039C4,
50989 +0x00202886, 0x001E100C, 0x002039B0, 0x002039CC,
50990 +0x002039D0, 0x002039D4, 0x002039D8, 0x002039DC,
50991 +0x002039E0, 0x4F222FE6, 0xD6707FFC, 0x88016060,
50992 +0xE2018951, 0x2620BFBB, 0xD56ED16D, 0xDE6E6010,
50993 +0x64E36552, 0x7402C840, 0x8D22D16C, 0xD26C7502,
50994 +0xE601D76C, 0xE7042722, 0x76016255, 0x626C2421,
50995 +0x8FF93273, 0xD4637402, 0x6242E601, 0x640D8528,
50996 +0x67494419, 0x275D657E, 0x81E4607C, 0xE417D562,
50997 +0x67557601, 0x3243626C, 0x8FF92171, 0xA0207102,
50998 +0xD25E0009, 0xE601D75B, 0xE7042722, 0x76016255,
50999 +0x626C2421, 0x8FF93273, 0xD4527402, 0x6242E601,
51000 +0x640D8528, 0x67494419, 0x275D657E, 0x81E4607C,
51001 +0xE417D553, 0x67557601, 0x3243626C, 0x8FF92171,
51002 +0x92897102, 0xD2462E21, 0x5E23D74E, 0x64F22FE2,
51003 +0x604365F2, 0x2700C980, 0xC9606043, 0x80716103,
51004 +0xC9036043, 0x80724519, 0x65F2605C, 0x817266F2,
51005 +0x46194629, 0x606C4529, 0x4018645C, 0x8173304C,
51006 +0x21185E23, 0x64F22FE2, 0x6E4C62F2, 0x602C4219,
51007 +0x66F262F2, 0x46294018, 0x461930EC, 0x42298174,
51008 +0x652C606C, 0x305C4018, 0x81758F07, 0x0009BC96,
51009 +0x2228620C, 0xA00A8908, 0x60130009, 0x8B038840,
51010 +0x0009B009, 0x0009A003, 0xE202D62F, 0x7F042622,
51011 +0x000B4F26, 0x4F226EF6, 0x8552D52A, 0x8830600D,
51012 +0x88318903, 0xA0348923, 0x85550009, 0xD428D727,
51013 +0x85532701, 0x610DD627, 0x24124118, 0x460BD426,
51014 +0xD7230009, 0xD226D425, 0x6572420B, 0xE230D120,
51015 +0x42286712, 0x2729E620, 0x37604628, 0xD6218B03,
51016 +0xA016E200, 0xD61F2622, 0xA012E202, 0xD1182622,
51017 +0x6212E530, 0xE6204528, 0x46282259, 0x89083260,
51018 +0xD41AD119, 0xE601D513, 0x2160450B, 0x472BD718,
51019 +0x4F264F26, 0x0009000B, 0x0000060A, 0x002039E4,
51020 +0x001E1000, 0x002039D0, 0x00203E04, 0x00203E10,
51021 +0x00203DA8, 0x002039B8, 0x00203DD8, 0x00203DD6,
51022 +0x00203DAA, 0x0020399C, 0x002039C8, 0x002039B4,
51023 +0x002039B0, 0x002018A2, 0x00203B24, 0x00203B28,
51024 +0x002018EE, 0x002039CC, 0x001E100B, 0x00203B3C,
51025 +0x00114004, 0x4F222FE6, 0xDE967FFC, 0x200884E9,
51026 +0x2F008D06, 0xD695D494, 0x0009460B, 0x64F0B19A,
51027 +0x6620D293, 0x89022668, 0xC9BF60E0, 0x7F042E00,
51028 +0x000B4F26, 0x000B6EF6, 0x2FE60009, 0xDE8D4F22,
51029 +0x60E0D68D, 0xCBC0D48D, 0x62602E00, 0xC803602C,
51030 +0x40218904, 0x70014021, 0x6603A002, 0x66034009,
51031 +0xD687616D, 0xE500A004, 0x75016262, 0x74042422,
51032 +0x3213625D, 0xD2838BF8, 0x0009420B, 0xC9BF84E2,
51033 +0x4F2680E2, 0x6EF6000B, 0x2FE62FD6, 0x7FFC4F22,
51034 +0x6260D67D, 0x89442228, 0xD572E100, 0x60502610,
51035 +0xCB40D47A, 0x2500440B, 0x8D052008, 0x62E06E03,
51036 +0x7104612C, 0x2F11A006, 0xD475D66D, 0xDD756760,
51037 +0x657C4D0B, 0xE23C6D1D, 0x8B033D27, 0xD267D472,
51038 +0x0009420B, 0x4D214D21, 0xA005D770, 0x66E6E400,
51039 +0x357C4508, 0x74012562, 0x35D3654D, 0xD76C8BF7,
51040 +0x6172E003, 0x81114018, 0x6E7260F1, 0x81E2700C,
51041 +0xD4686172, 0xDD688113, 0x4D0BDE68, 0xE2016572,
51042 +0xD4672E22, 0x420BD255, 0xD6560009, 0xC93F6060,
51043 +0x7F042600, 0x6EF64F26, 0x6DF6000B, 0x2FC62FB6,
51044 +0x2FE62FD6, 0xD25F4F22, 0x6B436E73, 0x420B6C53,
51045 +0x20086D63, 0x64038D1C, 0xE50ED149, 0x32526210,
51046 +0x60C38916, 0x804124B0, 0x814160D3, 0xA007E500,
51047 +0x655D61BC, 0x00EC6053, 0x364C6653, 0x80647501,
51048 +0x3213625D, 0xD63B8BF5, 0xC9BF6060, 0x2600A008,
51049 +0xD23AD44D, 0x6EF64F26, 0x6CF66DF6, 0x6BF6422B,
51050 +0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, 0x7FC44F22,
51051 +0x720262F3, 0x22512F41, 0x45297202, 0x60632251,
51052 +0xE5C4E682, 0x67F38121, 0x655C666C, 0xE408BFB6,
51053 +0x4F267F3C, 0x0009000B, 0x2F962F86, 0x2FB62FA6,
51054 +0x2FD62FC6, 0x4F222FE6, 0xE1007FC4, 0x6513ECFF,
51055 +0x6B136CCD, 0xDE36D735, 0xEDFF64F3, 0xD835EA04,
51056 +0x6053655C, 0x027D4000, 0x32C0622D, 0x66038D0D,
51057 +0x09ED6063, 0x2491027D, 0x24217402, 0x698202ED,
51058 +0x3928622D, 0x74022892, 0x75017104, 0x6063625C,
51059 +0x07D532A2, 0x0EB58FE4, 0x2448641C, 0xE6808905,
51060 +0x67F3E5C5, 0xBF79666C, 0x7F3C655C, 0x6EF64F26,
51061 +0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, 0xD11E68F6,
51062 +0x6012D21E, 0xCB20E405, 0x2102E500, 0x000B2242,
51063 +0x00002252, 0x001E1017, 0x00203B40, 0x002018A2,
51064 +0x0020390E, 0x001E1015, 0x001E10BF, 0x00117800,
51065 +0x001E10FC, 0x00200610, 0x00203914, 0x00202AEA,
51066 +0x00203B44, 0x002018EE, 0x00203B60, 0x0011788C,
51067 +0x00203910, 0x002034F4, 0x00201530, 0x001E2130,
51068 +0x00203B68, 0x00202AAC, 0x00203B6C, 0x00203974,
51069 +0x0020397C, 0x00203DA4, 0x001C3500, 0x001D4004,
51070 +0xD564D163, 0xE400D764, 0x2142E20F, 0x17411154,
51071 +0xD5622722, 0x9669D762, 0x15412572, 0x96661562,
51072 +0xE6011565, 0xD55F1165, 0x666CE6F8, 0x25422542,
51073 +0x25422542, 0x25422542, 0x25622542, 0x7601E727,
51074 +0x67632572, 0x25627797, 0xE7042572, 0x2572E248,
51075 +0xE2192522, 0xE2702522, 0x25422542, 0x25422542,
51076 +0x25222542, 0x2522E20C, 0x25422542, 0x25422542,
51077 +0x25422542, 0x25422542, 0x000B154A, 0xE2081145,
51078 +0x0009422B, 0x2FE62FD6, 0x7FFC4F22, 0xC8206043,
51079 +0x6E438D02, 0x0009BE67, 0xC81060E3, 0xBE648901,
51080 +0x60E30009, 0x8901C840, 0x0009BE86, 0xC80160E3,
51081 +0xDD3D8938, 0xC80260D0, 0x2F008D03, 0x460BD63B,
51082 +0x60F00009, 0x8902C804, 0x460BD639, 0x62F00009,
51083 +0xC8806023, 0x60D08902, 0x2D00C97F, 0xC8016023,
51084 +0xD6348906, 0x0009460B, 0x0009A007, 0x51630601,
51085 +0x8902C808, 0x460BD630, 0x60F00009, 0x8902C810,
51086 +0x420BD22E, 0xD52E0009, 0x88026052, 0xD22D8B03,
51087 +0xA005E604, 0x88012260, 0xD22A8B02, 0x2260E601,
51088 +0x2522E200, 0xC88060E3, 0xD227892D, 0x60E36E20,
51089 +0x8902C880, 0x420BD225, 0x60E30009, 0x8902C840,
51090 +0x420BD223, 0x60E30009, 0x8902C802, 0x420BD221,
51091 +0x60E30009, 0x890DC804, 0xDD20D11F, 0x0009410B,
51092 +0x0009BF0D, 0x0009BF4C, 0xD51ED41D, 0x2470E708,
51093 +0x25D2BF85, 0xC80860E3, 0xD21B8905, 0x4F267F04,
51094 +0x422B6EF6, 0x7F046DF6, 0x6EF64F26, 0x6DF6000B,
51095 +0x001C581C, 0xA000A000, 0x001D0100, 0x001D4000,
51096 +0x00040021, 0x001C589C, 0x001E1021, 0x00201A90,
51097 +0x00201AB2, 0x00202114, 0x00201ACA, 0x00201AD8,
51098 +0x002039C8, 0x001E100B, 0x001E1028, 0x00201B44,
51099 +0x00201B50, 0x00201AE0, 0x00201AFE, 0x12345678,
51100 +0x001E1000, 0x0010F100, 0x00201B2C, 0x644CD6A7,
51101 +0x000B346C, 0xD6A62450, 0x346C644C, 0x2450000B,
51102 +0x644CD6A4, 0x000B346C, 0x625C2450, 0x4208616D,
51103 +0x42084119, 0x42006019, 0x670E614C, 0xD49E321C,
51104 +0x4200207D, 0x324CC90F, 0x2200000B, 0x4208625C,
51105 +0x42004208, 0x324C644C, 0x4200D498, 0x000B324C,
51106 +0x2FE62260, 0x614C4F12, 0x4100D493, 0x6710314C,
51107 +0xE29F666D, 0x27294619, 0x6E536269, 0x672E6573,
51108 +0x4221227D, 0x42214221, 0x7601662C, 0xE4014608,
51109 +0x34E84608, 0x644C4600, 0x071A0467, 0x2150257B,
51110 +0x000B4F16, 0x4F226EF6, 0xD2857FE8, 0x88016021,
51111 +0xD2848B7B, 0x26686621, 0xD2838B77, 0x26686621,
51112 +0xE50F8B73, 0xE401BFA2, 0xBFA4E501, 0xE586E400,
51113 +0xE400655C, 0x2F50BFA4, 0xBFA1E401, 0xE602E506,
51114 +0x60634618, 0x81F2E401, 0x6543BF9F, 0xE40185F2,
51115 +0xBFAB6543, 0x85F26603, 0x6543E401, 0x6603BFB1,
51116 +0xE40265F0, 0x6053756C, 0x80F8BF80, 0xBF82E402,
51117 +0x84F8E512, 0x7090E402, 0x6503BF82, 0x4618E602,
51118 +0x81F66063, 0xBF80E402, 0x85F6E500, 0x6603E402,
51119 +0xE500BF8C, 0xE40285F6, 0xBF926603, 0xE5FEE500,
51120 +0xE010655C, 0xBF61E403, 0xE5130F54, 0xE40EBF63,
51121 +0x05FCE010, 0xBF63E40E, 0xE5007585, 0xBF64E403,
51122 +0xE500E640, 0xBF71E403, 0xE500E640, 0xBF78E403,
51123 +0xE5FFE640, 0xE014655C, 0xBF47E404, 0xE40F0F54,
51124 +0xE504BF49, 0x05FCE014, 0xBF49E40F, 0xE5017584,
51125 +0xBF4AE640, 0xE501E404, 0xBF57E640, 0xE501E404,
51126 +0xE404E640, 0xAF5C7F18, 0x7F184F26, 0x000B4F26,
51127 +0x4F220009, 0xD2427FF0, 0x88016021, 0xD2418B71,
51128 +0x26686621, 0xD2408B6D, 0x26686621, 0xE50F8B69,
51129 +0xE401BF1C, 0xBF1EE501, 0xE586E400, 0xE400655C,
51130 +0x2F50BF1E, 0xBF1BE401, 0xE401E506, 0xBF1C6543,
51131 +0xE401E640, 0xBF296543, 0xE401E640, 0xBF306543,
51132 +0x65F0E640, 0x756CE402, 0xBEFF6053, 0xE40280F4,
51133 +0xE512BF01, 0xE40284F4, 0xBF017090, 0xE6406503,
51134 +0xBF02E402, 0xE640E500, 0xBF0FE402, 0xE640E500,
51135 +0xBF16E402, 0xE5FEE500, 0x6053655C, 0xBEE5E403,
51136 +0xE51380F8, 0xE40EBEE7, 0xE40E84F8, 0xBEE77085,
51137 +0xE5006503, 0xBEE8E640, 0xE500E403, 0xBEF5E640,
51138 +0xE500E403, 0xBEFCE640, 0xE5FFE403, 0x6053655C,
51139 +0xBECBE404, 0xE40F80FC, 0xE504BECD, 0xE40F84FC,
51140 +0xBECD7083, 0xE5016503, 0xBECEE640, 0xE501E404,
51141 +0xBEDBE640, 0xE501E404, 0xE404E640, 0xAEE07F10,
51142 +0x7F104F26, 0x000B4F26, 0x00000009, 0x001E102F,
51143 +0x001E1080, 0x001E1090, 0x001E103F, 0x001E103E,
51144 +0x002039C2, 0x002039C4, 0x002039C6, 0xD21DD11C,
51145 +0x66206010, 0x676C7001, 0x3700C90F, 0xE5008D13,
51146 +0x67106210, 0x7701622C, 0x64232170, 0xD6166010,
51147 +0x44084408, 0x3428C90F, 0x62602100, 0x7201D513,
51148 +0x44082620, 0x000B354C, 0xD10F6053, 0x25586510,
51149 +0xE6008D13, 0xD60DD40B, 0x655C6540, 0x47086753,
51150 +0x37584708, 0x47086540, 0x24507501, 0x367C6040,
51151 +0x2400C90F, 0x72FF6210, 0x000B2120, 0x00006063,
51152 +0x0020390D, 0x0020390C, 0x0020390E, 0x00203534,
51153 +0x7FFC4F22, 0xE680D19F, 0x666C6212, 0xD29E2F22,
51154 +0x67F36563, 0x420B7542, 0x7F04E404, 0x000B4F26,
51155 +0xE6800009, 0xD298666C, 0xE7006563, 0x422B7540,
51156 +0xE6806473, 0xD294666C, 0xE7006563, 0x422B7543,
51157 +0x2F866473, 0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6,
51158 +0x7FCC4F22, 0xDC8ED28D, 0x72011F21, 0xDB8D1F22,
51159 +0xD18EDE8D, 0x66125211, 0x8B013620, 0x0009A0E5,
51160 +0xC9036061, 0x8B018801, 0x0009A0DF, 0xD288D487,
51161 +0xED84420B, 0x2F025503, 0x30D0845C, 0xA0B88901,
51162 +0xD1840009, 0x626C6610, 0x88016023, 0xD1828B68,
51163 +0x62101FC3, 0x895B2228, 0xE003D480, 0x40186742,
51164 +0x68421772, 0xD57EE900, 0x81816DB3, 0x7D042190,
51165 +0x67D26AB2, 0x64E26852, 0x1F491F57, 0x740464E3,
51166 +0x1FA46542, 0x65431F5A, 0x625275F8, 0x1F761FD5,
51167 +0x6D531F2B, 0xDA74D773, 0x7D94D274, 0x68D21F88,
51168 +0x6AA26972, 0xD1726022, 0x2202CB20, 0xE1401F1C,
51169 +0x7601E600, 0x3213626D, 0x56F48BFB, 0x52F651F5,
51170 +0x21222B62, 0x52F851F7, 0x212256F9, 0x2E6251FA,
51171 +0x51FB2412, 0x2D822512, 0xD9662792, 0x29A2DD5F,
51172 +0x6AD2D965, 0xD9646892, 0x68D21A84, 0x6081DA63,
51173 +0x2801CB01, 0xD86266D2, 0x2A622962, 0xED015AFC,
51174 +0x2AD2480B, 0x2AD24D18, 0x62D2DD5E, 0x2D227201,
51175 +0xD15056F3, 0xE2026062, 0x2602CB01, 0x2120A03D,
51176 +0x8B3A2228, 0xE401DD58, 0x2140E600, 0xE01C2D62,
51177 +0xC801005C, 0xD4558B0A, 0xE600D755, 0xED7D2472,
51178 +0x626C7601, 0x8BFB32D3, 0x24D2DD52, 0xE2FE68C2,
51179 +0x2C822829, 0x095CE01E, 0xE01F5DF1, 0x0A5C2D90,
51180 +0x751051F2, 0xED0621A0, 0xD74BE600, 0x8456D44B,
51181 +0x27007601, 0x696C6854, 0x248039D3, 0x8FF67401,
51182 +0xDA477701, 0x2A10E194, 0xE2007A01, 0x7A0F2A20,
51183 +0xD130E805, 0x66102A80, 0x6023626C, 0x89088801,
51184 +0xD240D42A, 0x420B65F2, 0xD131ED01, 0xAF304D18,
51185 +0x65F221D2, 0x8553D43C, 0x620D6642, 0x89073262,
51186 +0xD13BD43A, 0x0009410B, 0xE601D73A, 0x2762AF1A,
51187 +0xD134D41E, 0x410B65F2, 0xD125ED01, 0xD637D436,
51188 +0x460B4D18, 0xAF0D21D2, 0x7F340009, 0x6EF64F26,
51189 +0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, 0x4F2268F6,
51190 +0x85467FF4, 0x2F01E681, 0x666C8547, 0x854881F1,
51191 +0x81F2D209, 0x67F38542, 0x854381F3, 0x81F4E40C,
51192 +0x65636053, 0x420B81F5, 0x7F0C7540, 0x000B4F26,
51193 +0x00000009, 0x001C3D9C, 0x0020245C, 0x0011779A,
51194 +0x001C36F8, 0x001C3B9C, 0x001C3704, 0x0020352C,
51195 +0x002014A0, 0x0020391D, 0x0020391C, 0x00203918,
51196 +0x001C3D98, 0x001C3BB4, 0x001C5960, 0x001C3500,
51197 +0x001C3D30, 0x001C8960, 0x00203504, 0x001C3D00,
51198 +0x0020160C, 0x00117730, 0x00203920, 0x001C582C,
51199 +0x2000A000, 0x0000A000, 0x0011778C, 0x00117792,
51200 +0x00117788, 0x002014CC, 0x002038F4, 0x002034F4,
51201 +0x00201530, 0x001E2130, 0x00203D84, 0x002018A2,
51202 +0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6,
51203 +0xD19B7FEC, 0x2F12E000, 0x6103D49A, 0x1F4281F2,
51204 +0xDD9ADA99, 0xD69A6813, 0xE0014808, 0x460BDE99,
51205 +0x38EC4800, 0x65A21F03, 0x352052A1, 0xA23E8B01,
51206 +0x60510009, 0x8801C903, 0xA2388B01, 0x52530009,
51207 +0x32E0DE91, 0xD9918B10, 0x64A3490B, 0x4B0BDB90,
51208 +0xDE906403, 0xD791D690, 0xEC01D591, 0x2E02E100,
51209 +0x271026C0, 0x2502AFDF, 0xC8018551, 0xA1578B01,
51210 +0x62510009, 0x4200622D, 0x5E53366A, 0x85E2226D,
51211 +0xC903642C, 0x85E36603, 0x6053650D, 0x40214021,
51212 +0x4500C93F, 0x322A6703, 0x6053252D, 0xC901D17F,
51213 +0x60106C03, 0x8801D97F, 0xDB7F8B05, 0x2120E200,
51214 +0xCB0160B2, 0xD17D2B02, 0x88016011, 0x65A28B0A,
51215 +0x8D042448, 0x9B9E6251, 0xA00322B9, 0x919B2521,
51216 +0x2521221B, 0x37B3EB10, 0x2448895E, 0xD4738B07,
51217 +0x22286241, 0x60638903, 0xA05781F8, 0xD5706473,
51218 +0x46084608, 0x85E26273, 0x46006B50, 0x362C4200,
51219 +0x2BB8C910, 0x8F1F6463, 0x26686603, 0xD2698911,
51220 +0x062D6043, 0x4119616D, 0x6B0E6019, 0x81F820BD,
51221 +0x880160C3, 0x646C8F2C, 0x880F6073, 0xA0278B1B,
51222 +0xD2610009, 0x052D6043, 0x4119615D, 0x670E6019,
51223 +0x645C207D, 0x81F8A01C, 0x890F2668, 0x6043D25B,
51224 +0x6B5D052D, 0x60B94B19, 0x201D610E, 0x60C381F8,
51225 +0x8F0D8801, 0x6473645C, 0xEC00A00A, 0x6043D254,
51226 +0x625D052D, 0x60294219, 0x207D670E, 0x81F8645C,
51227 +0x880285F8, 0x85E1890A, 0x8D07C820, 0xE6DC6203,
51228 +0x60232269, 0x81E1A002, 0x644CE4FF, 0x6210D149,
51229 +0x89012228, 0x644CE4FF, 0x654DEBFF, 0x35B06BBC,
51230 +0xDB368B2B, 0x64A34B0B, 0x410BD135, 0x54036403,
51231 +0x85446E03, 0xC948DB40, 0xDC408808, 0xBEAE8B01,
51232 +0x64B3E502, 0x65E34C0B, 0xDB3DEC01, 0xD13D2DC2,
51233 +0x621260B2, 0x72017001, 0x21228805, 0x2B028F08,
51234 +0x666CE680, 0x6563D238, 0x7549E700, 0x6473420B,
51235 +0xA030D436, 0x7FFF0009, 0x85E28000, 0x20B9EBFC,
51236 +0x610381E2, 0x942A85E3, 0x62032049, 0x450885F8,
51237 +0x81E2201B, 0xC90160C3, 0x40084018, 0x40084008,
51238 +0x4000225B, 0x6023220B, 0x85E481E3, 0x4118E108,
51239 +0x81E4201B, 0xE40262A2, 0x20B98521, 0x67A28121,
51240 +0xCB016071, 0x85F82701, 0x89033042, 0xECE785E2,
51241 +0x81E220C9, 0x490BD41E, 0xA03B0009, 0x7E030009,
51242 +0x001C3D30, 0x00203D90, 0x00203504, 0x001E212C,
51243 +0x002033E8, 0x001C3D00, 0x00117780, 0x002014A0,
51244 +0x0020166C, 0x0011770C, 0x0020391C, 0x0020391D,
51245 +0x00203918, 0x002018A2, 0x001C36F8, 0x00203990,
51246 +0x00203DA0, 0x00203B84, 0x00203C04, 0x00203C84,
51247 +0x00203D04, 0x00203908, 0x002034FC, 0x002014CC,
51248 +0x00203994, 0x00203998, 0x0020245C, 0x00203D88,
51249 +0x00203D8C, 0x602262F2, 0x40094019, 0xC90F4009,
51250 +0x8B0B880A, 0x60E2DE8C, 0x40094019, 0xC90F4009,
51251 +0x8B038808, 0xCB0160A2, 0x2802A006, 0x65E2DE87,
51252 +0x2E527501, 0x286266A2, 0x52F366F2, 0x2622AE83,
51253 +0xD2838551, 0xDE83C802, 0xA0958B01, 0x420B0009,
51254 +0x4E0B64A3, 0x5E036403, 0x85E46503, 0x4918E908,
51255 +0xD77D209B, 0xE04C81E4, 0xDC7C0B7E, 0x7B01D97C,
51256 +0x61C207B6, 0x71016690, 0x8D062668, 0xD4792C12,
51257 +0x420BD279, 0xA070EB01, 0x62512DB2, 0x4B18EB0F,
51258 +0x22B9E102, 0x32104118, 0x85518B0F, 0x2029E2FC,
51259 +0x60518151, 0xCB0172E0, 0x85E12501, 0x202994A3,
51260 +0x85E481E1, 0xA0522049, 0x675181E4, 0x4719677D,
51261 +0x667E6779, 0x7701276D, 0x6903607C, 0x88014918,
51262 +0x25918F3E, 0x6B12D161, 0x21B27B01, 0x660D85E3,
51263 +0x40216063, 0xC93F4021, 0x6C034600, 0x262D322A,
51264 +0xC8016063, 0xDB5ED15D, 0x967D8901, 0xE6002C6B,
51265 +0x666C67CD, 0x40006063, 0x622D021D, 0x8D0E3270,
51266 +0x60436403, 0xE9FF021D, 0x8B013290, 0x01C5A007,
51267 +0x626C7601, 0x3292E904, 0x646C8BEB, 0x60434400,
51268 +0xD15004BD, 0x0B457401, 0x669D6911, 0x89073670,
51269 +0x602D6211, 0x890388FF, 0xE201DB4B, 0x2B2021C1,
51270 +0xECFC8551, 0x815120C9, 0xCB016051, 0xDC472501,
51271 +0x64A34C0B, 0x51F366F2, 0x85EF2612, 0x54F2D244,
51272 +0x650D420B, 0x0009ADE7, 0xE500DC42, 0x420B2C52,
51273 +0x4E0B64A3, 0x54036403, 0x85446E03, 0x6703E908,
51274 +0x65034918, 0x27998541, 0xDB323790, 0x8F0BD932,
51275 +0x6013610D, 0x8B07C820, 0xC9486053, 0x8B038808,
51276 +0xE501BD4D, 0x0009A005, 0x2128D233, 0xBD468901,
51277 +0x64B3E500, 0x490B65E3, 0xADBCEC01, 0x85F22DC2,
51278 +0x7001EE04, 0x31E7610D, 0x8D0281F2, 0xADA97A08,
51279 +0x7F140009, 0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6,
51280 +0x000B69F6, 0xF7FF68F6, 0x2FE68000, 0xD2234F22,
51281 +0x60E36E22, 0x8D02C840, 0xBBF922E2, 0xE2400009,
51282 +0x2E284218, 0xBC048901, 0x60E30009, 0x8905C810,
51283 +0xD21CD41B, 0x0009420B, 0x0009BC03, 0xC80560E3,
51284 +0xBD6D8901, 0x60E30009, 0x8902C802, 0xAC004F26,
51285 +0x4F266EF6, 0x6EF6000B, 0x001C3D3C, 0x00117760,
51286 +0x002014A0, 0x0020166C, 0x00203494, 0x00203DA4,
51287 +0x00203908, 0x002034FC, 0x002014CC, 0x00203974,
51288 +0x0020397C, 0x00203970, 0x00203972, 0x00201530,
51289 +0x002018EE, 0x00203994, 0x00008000, 0x001C3510,
51290 +0x00203D98, 0x002018A2, 0x080A0C0E, 0x00020406,
51291 +0x1A1C1E20, 0x12141618, 0x2E303234, 0x26282A2C,
51292 +0x3A3C3E40, 0x6C625648, 0x41112F26, 0xE2208F18,
51293 +0x890B3123, 0x321CD204, 0xD1026220, 0x412B312C,
51294 +0x00090009, 0x00203412, 0x002033C8, 0x000BE000,
51295 +0x400062F6, 0x40004000, 0x40004000, 0x40004000,
51296 +0x62F6000B, 0x40004000, 0x40004000, 0x40004000,
51297 +0x40184000, 0x62F6000B, 0x40004000, 0x40004000,
51298 +0x40004000, 0x40284000, 0x62F6000B, 0x40004000,
51299 +0x40184000, 0x000B4028, 0xC90F62F6, 0x40054005,
51300 +0x40054005, 0x62F6000B, 0x4005C907, 0x40054005,
51301 +0x62F6000B, 0x4005C903, 0x000B4005, 0xC90162F6,
51302 +0x000B4005, 0x000062F6, 0x00000000, 0x00000000,
51303 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51304 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51305 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51306 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51307 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51308 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51309 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51310 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51311 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51312 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51313 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51314 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51315 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51316 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51317 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51318 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51319 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51320 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51321 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51322 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51323 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51324 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51325 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51326 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51327 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51328 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51329 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51330 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51331 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51332 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51333 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51334 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51335 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51336 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51337 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51338 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51339 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51340 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51341 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51342 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51343 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51344 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51345 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51346 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51347 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51348 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51349 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51350 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51351 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51352 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51353 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51354 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51355 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51356 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51357 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51358 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51359 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51360 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51361 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51362 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51363 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51364 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51365 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51366 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51367 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51368 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51369 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51370 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51371 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51372 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51373 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51374 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51375 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51376 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51377 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51378 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51379 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51380 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51381 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51382 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51383 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51384 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51385 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51386 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51387 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51388 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51389 +0x00000000, 0x544F0D0A, 0x46205355, 0x00003A57,
51390 +0x206C754A, 0x32203120, 0x20383030, 0x323A3132,
51391 +0x34333A38, 0x00000000, 0x00000D0A, 0x00000043,
51392 +0x42707372, 0x3D206675, 0x554E203D, 0x202C4C4C,
51393 +0x6E49677A, 0x4E497274, 0x6D754E51, 0x0000003D,
51394 +0x61766E49, 0x2064696C, 0x72657375, 0x20726F20,
51395 +0x2079656B, 0x00214449, 0x52504545, 0x57204D4F,
51396 +0x65746972, 0x6461202C, 0x003D7264, 0x6C617620,
51397 +0x0000003D, 0x00000A0D, 0x435F4D5A, 0x465F444D,
51398 +0x4C445F57, 0x494E495F, 0x00000054, 0x6E6B6E55,
51399 +0x206E776F, 0x6D6D6F63, 0x3D646E61, 0x00000000,
51400 +0x203A3051, 0x00000020, 0x203A3151, 0x00000020,
51401 +0x203A3251, 0x00000020, 0x203A3351, 0x00000020,
51402 +0x203A3451, 0x00000020, 0x2B434741, 0x73696F4E,
51403 +0x61432065, 0x7262696C, 0x6F697461, 0x6166206E,
51404 +0x6F206C69, 0x6974206E, 0x0D0A656D, 0x00000000,
51405 +0x00000072, 0x00205220, 0x00000D0A, 0x62735576,
51406 +0x7473725F, 0x00000A0D, 0x62735576, 0x7375735F,
51407 +0x646E6570, 0x00000A0D, 0x62735576, 0x7365725F,
51408 +0x000A0D6D, 0x00000044, 0x44387570, 0x72637365,
51409 +0x6F747069, 0x3D584572, 0x00000000, 0x00000047,
51410 +0x00000042, 0x72746E49, 0x6D652051, 0x2C797470,
51411 +0x49677A20, 0x4972746E, 0x754E514E, 0x00003D6D,
51412 +0x654C7245, 0x0000006E, 0x00000049, 0x20746F4E,
51413 +0x756F6E65, 0x49206867, 0x4220514E, 0x0A0D6675,
51414 +0x00000000, 0x000000FF, 0x00020001, 0x00FF00FF,
51415 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
51416 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
51417 +0x00FF00FF, 0x010E010D, 0x00020003, 0x01090108,
51418 +0x0002010A, 0x02000003, 0x02020201, 0x02040203,
51419 +0x02060205, 0x02020200, 0x02040203, 0x020C020B,
51420 +0x020E020D, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
51421 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
51422 +0x00FF00FF, 0x000000FF, 0x00020001, 0x00FF00FF,
51423 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
51424 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
51425 +0x00FF00FF, 0x010E010D, 0x00020003, 0x01090108,
51426 +0x0002010A, 0x00030003, 0x02020201, 0x02040203,
51427 +0x02060205, 0x02020200, 0x02040203, 0x020C020B,
51428 +0x020E020D, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
51429 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
51430 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
51431 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
51432 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
51433 +0x00FF00FF, 0x010E010D, 0x00FF010F, 0x01090108,
51434 +0x010B010A, 0x0200010F, 0x02020201, 0x02040203,
51435 +0x02060205, 0x02020200, 0x02040203, 0x020C020B,
51436 +0x020E020D, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
51437 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
51438 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
51439 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
51440 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
51441 +0x00FF00FF, 0x010E010D, 0x00FF010F, 0x01090108,
51442 +0x010B010A, 0x010F010F, 0x02020201, 0x02040203,
51443 +0x02060205, 0x02020200, 0x02040203, 0x020C020B,
51444 +0x020E020D, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
51445 +0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
51446 +0x00FF00FF, 0x00205220, 0x00000046, 0x00000059,
51447 +0x73204142, 0x003D7165, 0x49544120, 0x0000204D,
51448 +0x00000000, 0x00000000, 0x002E0209, 0x80000101,
51449 +0x000409FA, 0x00FF0400, 0x05070000, 0x02000201,
51450 +0x82050700, 0x00020002, 0x03830507, 0x07010040,
51451 +0x40030405, 0x02090100, 0x0101002E, 0x09FA8000,
51452 +0x04000004, 0x000000FF, 0x02010507, 0x07000040,
51453 +0x40028205, 0x05070000, 0x00400383, 0x04050701,
51454 +0x00004002, 0x00000000, 0x00000000, 0x07090000,
51455 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51456 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51457 +0x00000000, 0x00000000, 0x00000000, 0x00000000,
51458 +};
51459 +
51460 +const u32_t zcFwImageSize=15936;
51461 --- /dev/null
51462 +++ b/drivers/staging/otus/hal/hpmain.c
51463 @@ -0,0 +1,4643 @@
51464 +/*
51465 + * Copyright (c) 2007-2008 Atheros Communications Inc.
51466 + *
51467 + * Permission to use, copy, modify, and/or distribute this software for any
51468 + * purpose with or without fee is hereby granted, provided that the above
51469 + * copyright notice and this permission notice appear in all copies.
51470 + *
51471 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
51472 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
51473 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
51474 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
51475 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
51476 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
51477 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
51478 + */
51479 +#include "../80211core/cprecomp.h"
51480 +#include "hpani.h"
51481 +#include "hpusb.h"
51482 +#include "otus.ini"
51483 +
51484 +extern const u32_t zcFwImage[];
51485 +extern const u32_t zcFwImageSize;
51486 +extern const u32_t zcDKFwImage[];
51487 +extern const u32_t zcDKFwImageSize;
51488 +extern const u32_t zcFwImageSPI[];
51489 +extern const u32_t zcFwImageSPISize;
51490 +
51491 +#ifdef ZM_OTUS_LINUX_PHASE_2
51492 +extern const u32_t zcFwBufImage[];
51493 +extern const u32_t zcFwBufImageSize;
51494 +extern const u32_t zcP2FwImage[];
51495 +extern const u32_t zcP2FwImageSize;
51496 +#endif
51497 +extern void zfInitCmdQueue(zdev_t* dev);
51498 +extern u16_t zfIssueCmd(zdev_t* dev, u32_t* cmd, u16_t cmdLen,
51499 + u16_t src, u8_t* buf);
51500 +extern void zfIdlRsp(zdev_t* dev, u32_t* rsp, u16_t rspLen);
51501 +extern u16_t zfDelayWriteInternalReg(zdev_t* dev, u32_t addr, u32_t val);
51502 +extern u16_t zfFlushDelayWrite(zdev_t* dev);
51503 +extern void zfUsbInit(zdev_t* dev);
51504 +extern u16_t zfFirmwareDownload(zdev_t* dev, u32_t* fw, u32_t len, u32_t offset);
51505 +extern u16_t zfFirmwareDownloadNotJump(zdev_t* dev, u32_t* fw, u32_t len, u32_t offset);
51506 +extern void zfUsbFree(zdev_t* dev);
51507 +extern u16_t zfCwmIsExtChanBusy(u32_t ctlBusy, u32_t extBusy);
51508 +extern void zfCoreCwmBusy(zdev_t* dev, u16_t busy);
51509 +
51510 +/* Prototypes */
51511 +void zfInitRf(zdev_t* dev, u32_t frequency);
51512 +void zfInitPhy(zdev_t* dev, u32_t frequency, u8_t bw40);
51513 +void zfInitMac(zdev_t* dev);
51514 +
51515 +void zfSetPowerCalTable(zdev_t* dev, u32_t frequency, u8_t bw40, u8_t extOffset);
51516 +void zfInitPowerCal(zdev_t* dev);
51517 +
51518 +#ifdef ZM_DRV_INIT_USB_MODE
51519 +void zfInitUsbMode(zdev_t* dev);
51520 +u16_t zfHpUsbReset(zdev_t* dev);
51521 +#endif
51522 +
51523 +/* Bank 0 1 2 3 5 6 7 */
51524 +void zfSetRfRegs(zdev_t* dev, u32_t frequency);
51525 +/* Bank 4 */
51526 +void zfSetBank4AndPowerTable(zdev_t* dev, u32_t frequency, u8_t bw40,
51527 + u8_t extOffset);
51528 +/* Get param for turnoffdyn */
51529 +void zfGetHwTurnOffdynParam(zdev_t* dev,
51530 + u32_t frequency, u8_t bw40, u8_t extOffset,
51531 + int* delta_slope_coeff_exp,
51532 + int* delta_slope_coeff_man,
51533 + int* delta_slope_coeff_exp_shgi,
51534 + int* delta_slope_coeff_man_shgi);
51535 +
51536 +void zfSelAdcClk(zdev_t* dev, u8_t bw40, u32_t frequency);
51537 +u32_t zfHpEchoCommand(zdev_t* dev, u32_t value);
51538 +
51539 +
51540 +
51541 +#define zm_hp_priv(x) (((struct zsHpPriv*)wd->hpPrivate)->x)
51542 +struct zsHpPriv zgHpPriv;
51543 +
51544 +#define ZM_FIRMWARE_WLAN_ADDR 0x200000
51545 +#define ZM_FIRMWARE_SPI_ADDR 0x114000
51546 +/* 0: real chip 1: FPGA test */
51547 +#define ZM_FPGA_PHY 0
51548 +
51549 +#define reg_write(addr, val) zfDelayWriteInternalReg(dev, addr+0x1bc000, val)
51550 +#define zm_min(A, B) ((A>B)? B:A)
51551 +
51552 +
51553 +/******************** Intialization ********************/
51554 +u16_t zfHpInit(zdev_t* dev, u32_t frequency)
51555 +{
51556 + u16_t ret;
51557 + zmw_get_wlan_dev(dev);
51558 +
51559 + /* Initializa HAL Plus private variables */
51560 + wd->hpPrivate = &zgHpPriv;
51561 +
51562 + ((struct zsHpPriv*)wd->hpPrivate)->halCapability = ZM_HP_CAP_11N;
51563 +
51564 + ((struct zsHpPriv*)wd->hpPrivate)->hwFrequency = 0;
51565 + ((struct zsHpPriv*)wd->hpPrivate)->hwBw40 = 0;
51566 + ((struct zsHpPriv*)wd->hpPrivate)->hwExtOffset = 0;
51567 +
51568 + ((struct zsHpPriv*)wd->hpPrivate)->disableDfsCh = 0;
51569 +
51570 + ((struct zsHpPriv*)wd->hpPrivate)->ledMode[0] = 1;
51571 + ((struct zsHpPriv*)wd->hpPrivate)->ledMode[1] = 1;
51572 + ((struct zsHpPriv*)wd->hpPrivate)->strongRSSI = 0;
51573 + ((struct zsHpPriv*)wd->hpPrivate)->rxStrongRSSI = 0;
51574 +
51575 + ((struct zsHpPriv*)wd->hpPrivate)->slotType = 1;
51576 + ((struct zsHpPriv*)wd->hpPrivate)->aggPktNum = 0x10000a;
51577 +
51578 + ((struct zsHpPriv*)wd->hpPrivate)->eepromImageIndex = 0;
51579 +
51580 +
51581 + ((struct zsHpPriv*)wd->hpPrivate)->eepromImageRdReq = 0;
51582 +#ifdef ZM_OTUS_RX_STREAM_MODE
51583 + ((struct zsHpPriv*)wd->hpPrivate)->remainBuf = NULL;
51584 + ((struct zsHpPriv*)wd->hpPrivate)->usbRxRemainLen = 0;
51585 + ((struct zsHpPriv*)wd->hpPrivate)->usbRxPktLen = 0;
51586 + ((struct zsHpPriv*)wd->hpPrivate)->usbRxPadLen = 0;
51587 + ((struct zsHpPriv*)wd->hpPrivate)->usbRxTransferLen = 0;
51588 +#endif
51589 +
51590 + ((struct zsHpPriv*)wd->hpPrivate)->enableBBHeavyClip = 1;
51591 + ((struct zsHpPriv*)wd->hpPrivate)->hwBBHeavyClip = 1; // force enable 8107
51592 + ((struct zsHpPriv*)wd->hpPrivate)->doBBHeavyClip = 0;
51593 + ((struct zsHpPriv*)wd->hpPrivate)->setValueHeavyClip = 0;
51594 +
51595 +
51596 + /* Initialize driver core */
51597 + zfInitCmdQueue(dev);
51598 +
51599 + /* Initialize USB */
51600 + zfUsbInit(dev);
51601 +
51602 +#if ZM_SW_LOOP_BACK != 1
51603 +
51604 + /* TODO : [Download FW] */
51605 + if (wd->modeMDKEnable)
51606 + {
51607 + /* download the MDK firmware */
51608 + if ((ret = zfFirmwareDownload(dev, (u32_t*)zcDKFwImage,
51609 + (u32_t)zcDKFwImageSize, ZM_FIRMWARE_WLAN_ADDR)) != ZM_SUCCESS)
51610 + {
51611 + /* TODO : exception handling */
51612 + //return 1;
51613 + }
51614 + }
51615 + else
51616 + {
51617 + #ifndef ZM_OTUS_LINUX_PHASE_2
51618 + /* donwload the normal frimware */
51619 + if ((ret = zfFirmwareDownload(dev, (u32_t*)zcFwImage,
51620 + (u32_t)zcFwImageSize, ZM_FIRMWARE_WLAN_ADDR)) != ZM_SUCCESS)
51621 + {
51622 + /* TODO : exception handling */
51623 + //return 1;
51624 + }
51625 + #else
51626 +
51627 + // 1-PH fw: ReadMac() store some global variable
51628 + if ((ret = zfFirmwareDownloadNotJump(dev, (u32_t*)zcFwBufImage,
51629 + (u32_t)zcFwBufImageSize, 0x102800)) != ZM_SUCCESS)
51630 + {
51631 + DbgPrint("Dl zcFwBufImage failed!");
51632 + }
51633 +
51634 + zfwSleep(dev, 1000);
51635 +
51636 + if ((ret = zfFirmwareDownload(dev, (u32_t*)zcFwImage,
51637 + (u32_t)zcFwImageSize, ZM_FIRMWARE_WLAN_ADDR)) != ZM_SUCCESS)
51638 + {
51639 + DbgPrint("Dl zcFwBufImage failed!");
51640 + }
51641 + #endif
51642 + }
51643 +#endif
51644 +
51645 +#ifdef ZM_DRV_INIT_USB_MODE
51646 + /* Init USB Mode */
51647 + zfInitUsbMode(dev);
51648 +
51649 + /* Do the USB Reset */
51650 + zfHpUsbReset(dev);
51651 +#endif
51652 +
51653 +/* Register setting */
51654 +/* ZM_DRIVER_MODEL_TYPE_MDK
51655 + * 1=>for MDK, disable init RF, PHY, and MAC,
51656 + * 0=>normal init
51657 + */
51658 +//#if ((ZM_SW_LOOP_BACK != 1) && (ZM_DRIVER_MODEL_TYPE_MDK !=1))
51659 +#if ZM_SW_LOOP_BACK != 1
51660 + if(!wd->modeMDKEnable)
51661 + {
51662 + /* Init MAC */
51663 + zfInitMac(dev);
51664 +
51665 + #if ZM_FW_LOOP_BACK != 1
51666 + /* Init PHY */
51667 + zfInitPhy(dev, frequency, 0);
51668 +
51669 + /* Init RF */
51670 + zfInitRf(dev, frequency);
51671 +
51672 + #if ZM_FPGA_PHY == 0
51673 + /* BringUp issue */
51674 + //zfDelayWriteInternalReg(dev, 0x9800+0x1bc000, 0x10000007);
51675 + //zfFlushDelayWrite(dev);
51676 + #endif
51677 +
51678 + #endif /* end of ZM_FW_LOOP_BACK != 1 */
51679 + }
51680 +#endif /* end of ((ZM_SW_LOOP_BACK != 1) && (ZM_DRIVER_MODEL_TYPE_MDK !=1)) */
51681 +
51682 + zfHpEchoCommand(dev, 0xAABBCCDD);
51683 +
51684 + return 0;
51685 +}
51686 +
51687 +
51688 +u16_t zfHpReinit(zdev_t* dev, u32_t frequency)
51689 +{
51690 + u16_t ret;
51691 + zmw_get_wlan_dev(dev);
51692 +
51693 + ((struct zsHpPriv*)wd->hpPrivate)->halReInit = 1;
51694 +
51695 + ((struct zsHpPriv*)wd->hpPrivate)->strongRSSI = 0;
51696 + ((struct zsHpPriv*)wd->hpPrivate)->rxStrongRSSI = 0;
51697 +
51698 +#ifdef ZM_OTUS_RX_STREAM_MODE
51699 + if (((struct zsHpPriv*)wd->hpPrivate)->remainBuf != NULL)
51700 + {
51701 + zfwBufFree(dev, ((struct zsHpPriv*)wd->hpPrivate)->remainBuf, 0);
51702 + }
51703 + ((struct zsHpPriv*)wd->hpPrivate)->remainBuf = NULL;
51704 + ((struct zsHpPriv*)wd->hpPrivate)->usbRxRemainLen = 0;
51705 + ((struct zsHpPriv*)wd->hpPrivate)->usbRxPktLen = 0;
51706 + ((struct zsHpPriv*)wd->hpPrivate)->usbRxPadLen = 0;
51707 + ((struct zsHpPriv*)wd->hpPrivate)->usbRxTransferLen = 0;
51708 +#endif
51709 +
51710 + zfInitCmdQueue(dev);
51711 + zfCoreReinit(dev);
51712 +
51713 + #ifndef ZM_OTUS_LINUX_PHASE_2
51714 + /* Download firmware */
51715 + if ((ret = zfFirmwareDownload(dev, (u32_t*)zcFwImage,
51716 + (u32_t)zcFwImageSize, ZM_FIRMWARE_WLAN_ADDR)) != ZM_SUCCESS)
51717 + {
51718 + /* TODO : exception handling */
51719 + //return 1;
51720 + }
51721 + #else
51722 + if ((ret = zfFirmwareDownload(dev, (u32_t*)zcP2FwImage,
51723 + (u32_t)zcP2FwImageSize, ZM_FIRMWARE_WLAN_ADDR)) != ZM_SUCCESS)
51724 + {
51725 + /* TODO : exception handling */
51726 + //return 1;
51727 + }
51728 + #endif
51729 +
51730 +#ifdef ZM_DRV_INIT_USB_MODE
51731 + /* Init USB Mode */
51732 + zfInitUsbMode(dev);
51733 +
51734 + /* Do the USB Reset */
51735 + zfHpUsbReset(dev);
51736 +#endif
51737 +
51738 + /* Init MAC */
51739 + zfInitMac(dev);
51740 +
51741 + /* Init PHY */
51742 + zfInitPhy(dev, frequency, 0);
51743 + /* Init RF */
51744 + zfInitRf(dev, frequency);
51745 +
51746 + #if ZM_FPGA_PHY == 0
51747 + /* BringUp issue */
51748 + //zfDelayWriteInternalReg(dev, 0x9800+0x1bc000, 0x10000007);
51749 + //zfFlushDelayWrite(dev);
51750 + #endif
51751 +
51752 + zfHpEchoCommand(dev, 0xAABBCCDD);
51753 +
51754 + return 0;
51755 +}
51756 +
51757 +
51758 +u16_t zfHpRelease(zdev_t* dev)
51759 +{
51760 + /* Free USB resource */
51761 + zfUsbFree(dev);
51762 +
51763 + return 0;
51764 +}
51765 +
51766 +/* MDK mode setting for dontRetransmit */
51767 +void zfHpConfigFM(zdev_t* dev, u32_t RxMaxSize, u32_t DontRetransmit)
51768 +{
51769 + u32_t cmd[3];
51770 + u16_t ret;
51771 +
51772 + cmd[0] = 8 | (ZM_CMD_CONFIG << 8);
51773 + cmd[1] = RxMaxSize; /* zgRxMaxSize */
51774 + cmd[2] = DontRetransmit; /* zgDontRetransmit */
51775 +
51776 + ret = zfIssueCmd(dev, cmd, 12, ZM_OID_INTERNAL_WRITE, 0);
51777 +}
51778 +
51779 +const u8_t zcXpdToPd[16] =
51780 +{
51781 + /* 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF */
51782 + 0x2, 0x2, 0x2, 0x1, 0x2, 0x2, 0x6, 0x2, 0x2, 0x3, 0x7, 0x2, 0xB, 0x2, 0x2, 0x2
51783 +};
51784 +
51785 +/******************** RF and PHY ********************/
51786 +
51787 +void zfInitPhy(zdev_t* dev, u32_t frequency, u8_t bw40)
51788 +{
51789 + u16_t i, j, k;
51790 + u16_t entries;
51791 + u16_t modesIndex = 0;
51792 + u16_t freqIndex = 0;
51793 + u32_t tmp, tmp1;
51794 + zmw_get_wlan_dev(dev);
51795 + struct zsHpPriv* hpPriv=wd->hpPrivate;
51796 + u32_t eepromBoardData[15][6] = {
51797 + /* Register A-20 A-20/40 G-20/40 G-20 G-Turbo */
51798 + {0x9964, 0, 0, 0, 0, 0},
51799 + {0x9960, 0, 0, 0, 0, 0},
51800 + {0xb960, 0, 0, 0, 0, 0},
51801 + {0x9844, 0, 0, 0, 0, 0},
51802 + {0x9850, 0, 0, 0, 0, 0},
51803 + {0x9834, 0, 0, 0, 0, 0},
51804 + {0x9828, 0, 0, 0, 0, 0},
51805 + {0xc864, 0, 0, 0, 0, 0},
51806 + {0x9848, 0, 0, 0, 0, 0},
51807 + {0xb848, 0, 0, 0, 0, 0},
51808 + {0xa20c, 0, 0, 0, 0, 0},
51809 + {0xc20c, 0, 0, 0, 0, 0},
51810 + {0x9920, 0, 0, 0, 0, 0},
51811 + {0xb920, 0, 0, 0, 0, 0},
51812 + {0xa258, 0, 0, 0, 0, 0},
51813 + };
51814 +
51815 + /* #1 Save the initial value of the related RIFS register settings */
51816 + //((struct zsHpPriv*)wd->hpPrivate)->isInitialPhy++;
51817 +
51818 + /*
51819 + * Setup the indices for the next set of register array writes
51820 + * PHY mode is static20 / 2040
51821 + * Frequency is 2.4GHz (B) / 5GHz (A)
51822 + */
51823 + if ( frequency > ZM_CH_G_14 )
51824 + {
51825 + /* 5GHz */
51826 + freqIndex = 1;
51827 + if (bw40)
51828 + {
51829 + modesIndex = 2;
51830 + zm_debug_msg0("init ar5416Modes in 2: A-20/40");
51831 + }
51832 + else
51833 + {
51834 + modesIndex = 1;
51835 + zm_debug_msg0("init ar5416Modes in 1: A-20");
51836 + }
51837 + }
51838 + else
51839 + {
51840 + /* 2.4GHz */
51841 + freqIndex = 2;
51842 + if (bw40)
51843 + {
51844 + modesIndex = 3;
51845 + zm_debug_msg0("init ar5416Modes in 3: G-20/40");
51846 + }
51847 + else
51848 + {
51849 + modesIndex = 4;
51850 + zm_debug_msg0("init ar5416Modes in 4: G-20");
51851 + }
51852 + }
51853 +
51854 +
51855 +#if ZM_FPGA_PHY == 1
51856 + /* Starting External Hainan Register Initialization */
51857 + /* TODO: */
51858 +
51859 + zfwSleep(dev, 10);
51860 +#endif
51861 +
51862 + /*
51863 + *Set correct Baseband to analog shift setting to access analog chips.
51864 + */
51865 + //reg_write(PHY_BASE, 0x00000007);
51866 +// reg_write(0x9800, 0x00000007);
51867 +
51868 + /*
51869 + * Write addac shifts
51870 + */
51871 + // do this in firmware
51872 +
51873 +
51874 +
51875 + /* Zeroize board data */
51876 + for (j=0; j<15; j++)
51877 + {
51878 + for (k=1; k<=4; k++)
51879 + {
51880 + eepromBoardData[j][k] = 0;
51881 + }
51882 + }
51883 + /*
51884 + * Register setting by mode
51885 + */
51886 +
51887 + entries = sizeof(ar5416Modes) / sizeof(*ar5416Modes);
51888 + zm_msg1_scan(ZM_LV_2, "Modes register setting entries=", entries);
51889 + for (i=0; i<entries; i++)
51890 + {
51891 +#if 0
51892 + if ( ((struct zsHpPriv*)wd->hpPrivate)->hwNotFirstInit && (ar5416Modes[i][0] == 0xa27c) )
51893 + {
51894 + /* Force disable CR671 bit20 / 7823 */
51895 + /* The bug has to do with the polarity of the pdadc offset calibration. There */
51896 + /* is an initial calibration that is OK, and there is a continuous */
51897 + /* calibration that updates the pddac with the wrong polarity. Fortunately */
51898 + /* the second loop can be disabled with a bit called en_pd_dc_offset_thr. */
51899 +
51900 + reg_write(ar5416Modes[i][0], (ar5416Modes[i][modesIndex]& 0xffefffff) );
51901 + ((struct zsHpPriv*)wd->hpPrivate)->hwNotFirstInit = 1;
51902 + }
51903 + else
51904 + {
51905 +#endif
51906 + /* FirstTime Init or not 0xa27c(CR671) */
51907 + reg_write(ar5416Modes[i][0], ar5416Modes[i][modesIndex]);
51908 +// }
51909 + /* Initialize board data */
51910 + for (j=0; j<15; j++)
51911 + {
51912 + if (ar5416Modes[i][0] == eepromBoardData[j][0])
51913 + {
51914 + for (k=1; k<=4; k++)
51915 + {
51916 + eepromBoardData[j][k] = ar5416Modes[i][k];
51917 + }
51918 + }
51919 + }
51920 + /* #1 Save the initial value of the related RIFS register settings */
51921 + //if( ((struct zsHpPriv*)wd->hpPrivate)->isInitialPhy == 1 )
51922 + {
51923 + switch(ar5416Modes[i][0])
51924 + {
51925 + case 0x9850 :
51926 + ((struct zsHpPriv*)wd->hpPrivate)->initDesiredSigSize = ar5416Modes[i][modesIndex];
51927 + break;
51928 + case 0x985c :
51929 + ((struct zsHpPriv*)wd->hpPrivate)->initAGC = ar5416Modes[i][modesIndex];
51930 + break;
51931 + case 0x9860 :
51932 + ((struct zsHpPriv*)wd->hpPrivate)->initAgcControl = ar5416Modes[i][modesIndex];
51933 + break;
51934 + case 0x9918 :
51935 + ((struct zsHpPriv*)wd->hpPrivate)->initSearchStartDelay = ar5416Modes[i][modesIndex];
51936 + break;
51937 + case 0x99ec :
51938 + ((struct zsHpPriv*)wd->hpPrivate)->initRIFSSearchParams = ar5416Modes[i][modesIndex];
51939 + break;
51940 + case 0xa388 :
51941 + ((struct zsHpPriv*)wd->hpPrivate)->initFastChannelChangeControl = ar5416Modes[i][modesIndex];
51942 + default :
51943 + break;
51944 + }
51945 + }
51946 + }
51947 +#if 0
51948 + zfFlushDelayWrite(dev);
51949 +
51950 + /*
51951 + * Common Register setting
51952 + */
51953 + entries = sizeof(ar5416Common) / sizeof(*ar5416Common);
51954 + for (i=0; i<entries; i++)
51955 + {
51956 + reg_write(ar5416Common[i][0], ar5416Common[i][1]);
51957 + }
51958 + zfFlushDelayWrite(dev);
51959 +
51960 + /*
51961 + * RF Gain setting by freqIndex
51962 + */
51963 + entries = sizeof(ar5416BB_RfGain) / sizeof(*ar5416BB_RfGain);
51964 + for (i=0; i<entries; i++)
51965 + {
51966 + reg_write(ar5416BB_RfGain[i][0], ar5416BB_RfGain[i][freqIndex]);
51967 + }
51968 + zfFlushDelayWrite(dev);
51969 +
51970 + /*
51971 + * Moved ar5416InitChainMask() here to ensure the swap bit is set before
51972 + * the pdadc table is written. Swap must occur before any radio dependent
51973 + * replicated register access. The pdadc curve addressing in particular
51974 + * depends on the consistent setting of the swap bit.
51975 + */
51976 + //ar5416InitChainMask(pDev);
51977 +
51978 + /* Setup the transmit power values. */
51979 + // TODO
51980 +#endif
51981 +
51982 + /* Update 5G board data */
51983 + //Ant control common
51984 + tmp = hpPriv->eepromImage[0x100+0x144*2/4];
51985 + eepromBoardData[0][1] = tmp;
51986 + eepromBoardData[0][2] = tmp;
51987 + //Ant control chain 0
51988 + tmp = hpPriv->eepromImage[0x100+0x140*2/4];
51989 + eepromBoardData[1][1] = tmp;
51990 + eepromBoardData[1][2] = tmp;
51991 + //Ant control chain 2
51992 + tmp = hpPriv->eepromImage[0x100+0x142*2/4];
51993 + eepromBoardData[2][1] = tmp;
51994 + eepromBoardData[2][2] = tmp;
51995 + //SwSettle
51996 + tmp = hpPriv->eepromImage[0x100+0x146*2/4];
51997 + tmp = (tmp >> 16) & 0x7f;
51998 + eepromBoardData[3][1] &= (~((u32_t)0x3f80));
51999 + eepromBoardData[3][1] |= (tmp << 7);
52000 +#if 0
52001 + //swSettleHt40
52002 + tmp = hpPriv->eepromImage[0x100+0x158*2/4];
52003 + tmp = (tmp) & 0x7f;
52004 + eepromBoardData[3][2] &= (~((u32_t)0x3f80));
52005 + eepromBoardData[3][2] |= (tmp << 7);
52006 +#endif
52007 + //adcDesired, pdaDesired
52008 + tmp = hpPriv->eepromImage[0x100+0x148*2/4];
52009 + tmp = (tmp >> 24);
52010 + tmp1 = hpPriv->eepromImage[0x100+0x14a*2/4];
52011 + tmp1 = tmp1 & 0xff;
52012 + tmp = tmp + (tmp1<<8);
52013 + eepromBoardData[4][1] &= (~((u32_t)0xffff));
52014 + eepromBoardData[4][1] |= tmp;
52015 + eepromBoardData[4][2] &= (~((u32_t)0xffff));
52016 + eepromBoardData[4][2] |= tmp;
52017 + //TxEndToXpaOff, TxFrameToXpaOn
52018 + tmp = hpPriv->eepromImage[0x100+0x14a*2/4];
52019 + tmp = (tmp >> 24) & 0xff;
52020 + tmp1 = hpPriv->eepromImage[0x100+0x14c*2/4];
52021 + tmp1 = (tmp1 >> 8) & 0xff;
52022 + tmp = (tmp<<24) + (tmp<<16) + (tmp1<<8) + tmp1;
52023 + eepromBoardData[5][1] = tmp;
52024 + eepromBoardData[5][2] = tmp;
52025 + //TxEnaToRxOm
52026 + tmp = hpPriv->eepromImage[0x100+0x14c*2/4] & 0xff;
52027 + eepromBoardData[6][1] &= (~((u32_t)0xff0000));
52028 + eepromBoardData[6][1] |= (tmp<<16);
52029 + eepromBoardData[6][2] &= (~((u32_t)0xff0000));
52030 + eepromBoardData[6][2] |= (tmp<<16);
52031 + //Thresh62
52032 + tmp = hpPriv->eepromImage[0x100+0x14c*2/4];
52033 + tmp = (tmp >> 16) & 0x7f;
52034 + eepromBoardData[7][1] &= (~((u32_t)0x7f000));
52035 + eepromBoardData[7][1] |= (tmp<<12);
52036 + eepromBoardData[7][2] &= (~((u32_t)0x7f000));
52037 + eepromBoardData[7][2] |= (tmp<<12);
52038 + //TxRxAtten chain_0
52039 + tmp = hpPriv->eepromImage[0x100+0x146*2/4];
52040 + tmp = (tmp >> 24) & 0x3f;
52041 + eepromBoardData[8][1] &= (~((u32_t)0x3f000));
52042 + eepromBoardData[8][1] |= (tmp<<12);
52043 + eepromBoardData[8][2] &= (~((u32_t)0x3f000));
52044 + eepromBoardData[8][2] |= (tmp<<12);
52045 + //TxRxAtten chain_2
52046 + tmp = hpPriv->eepromImage[0x100+0x148*2/4] & 0x3f;
52047 + eepromBoardData[9][1] &= (~((u32_t)0x3f000));
52048 + eepromBoardData[9][1] |= (tmp<<12);
52049 + eepromBoardData[9][2] &= (~((u32_t)0x3f000));
52050 + eepromBoardData[9][2] |= (tmp<<12);
52051 + //TxRxMargin chain_0
52052 + tmp = hpPriv->eepromImage[0x100+0x148*2/4];
52053 + tmp = (tmp >> 8) & 0x3f;
52054 + eepromBoardData[10][1] &= (~((u32_t)0xfc0000));
52055 + eepromBoardData[10][1] |= (tmp<<18);
52056 + eepromBoardData[10][2] &= (~((u32_t)0xfc0000));
52057 + eepromBoardData[10][2] |= (tmp<<18);
52058 + //TxRxMargin chain_2
52059 + tmp = hpPriv->eepromImage[0x100+0x148*2/4];
52060 + tmp = (tmp >> 16) & 0x3f;
52061 + eepromBoardData[11][1] &= (~((u32_t)0xfc0000));
52062 + eepromBoardData[11][1] |= (tmp<<18);
52063 + eepromBoardData[11][2] &= (~((u32_t)0xfc0000));
52064 + eepromBoardData[11][2] |= (tmp<<18);
52065 + //iqCall chain_0, iqCallQ chain_0
52066 + tmp = hpPriv->eepromImage[0x100+0x14e*2/4];
52067 + tmp = (tmp >> 24) & 0x3f;
52068 + tmp1 = hpPriv->eepromImage[0x100+0x150*2/4];
52069 + tmp1 = (tmp1 >> 8) & 0x1f;
52070 + tmp = (tmp<<5) + tmp1;
52071 + eepromBoardData[12][1] &= (~((u32_t)0x7ff));
52072 + eepromBoardData[12][1] |= (tmp);
52073 + eepromBoardData[12][2] &= (~((u32_t)0x7ff));
52074 + eepromBoardData[12][2] |= (tmp);
52075 + //iqCall chain_2, iqCallQ chain_2
52076 + tmp = hpPriv->eepromImage[0x100+0x150*2/4];
52077 + tmp = tmp & 0x3f;
52078 + tmp1 = hpPriv->eepromImage[0x100+0x150*2/4];
52079 + tmp1 = (tmp1 >> 16) & 0x1f;
52080 + tmp = (tmp<<5) + tmp1;
52081 + eepromBoardData[13][1] &= (~((u32_t)0x7ff));
52082 + eepromBoardData[13][1] |= (tmp);
52083 + eepromBoardData[13][2] &= (~((u32_t)0x7ff));
52084 + eepromBoardData[13][2] |= (tmp);
52085 + //bsw_Margin chain_0
52086 + tmp = hpPriv->eepromImage[0x100+0x156*2/4];
52087 + tmp = (tmp >> 16) & 0xf;
52088 + eepromBoardData[10][1] &= (~((u32_t)0x3c00));
52089 + eepromBoardData[10][1] |= (tmp << 10);
52090 + eepromBoardData[10][2] &= (~((u32_t)0x3c00));
52091 + eepromBoardData[10][2] |= (tmp << 10);
52092 + //xpd gain mask
52093 + tmp = hpPriv->eepromImage[0x100+0x14e*2/4];
52094 + tmp = (tmp >> 8) & 0xf;
52095 + eepromBoardData[14][1] &= (~((u32_t)0xf0000));
52096 + eepromBoardData[14][1] |= (zcXpdToPd[tmp] << 16);
52097 + eepromBoardData[14][2] &= (~((u32_t)0xf0000));
52098 + eepromBoardData[14][2] |= (zcXpdToPd[tmp] << 16);
52099 +#if 0
52100 + //bsw_Atten chain_0
52101 + tmp = hpPriv->eepromImage[0x100+0x156*2/4];
52102 + tmp = (tmp) & 0x1f;
52103 + eepromBoardData[10][1] &= (~((u32_t)0x1f));
52104 + eepromBoardData[10][1] |= (tmp);
52105 + eepromBoardData[10][2] &= (~((u32_t)0x1f));
52106 + eepromBoardData[10][2] |= (tmp);
52107 + //bsw_Margin chain_2
52108 + tmp = hpPriv->eepromImage[0x100+0x156*2/4];
52109 + tmp = (tmp >> 24) & 0xf;
52110 + eepromBoardData[11][1] &= (~((u32_t)0x3c00));
52111 + eepromBoardData[11][1] |= (tmp << 10);
52112 + eepromBoardData[11][2] &= (~((u32_t)0x3c00));
52113 + eepromBoardData[11][2] |= (tmp << 10);
52114 + //bsw_Atten chain_2
52115 + tmp = hpPriv->eepromImage[0x100+0x156*2/4];
52116 + tmp = (tmp >> 8) & 0x1f;
52117 + eepromBoardData[11][1] &= (~((u32_t)0x1f));
52118 + eepromBoardData[11][1] |= (tmp);
52119 + eepromBoardData[11][2] &= (~((u32_t)0x1f));
52120 + eepromBoardData[11][2] |= (tmp);
52121 +#endif
52122 +
52123 + /* Update 2.4G board data */
52124 + //Ant control common
52125 + tmp = hpPriv->eepromImage[0x100+0x170*2/4];
52126 + tmp = tmp >> 24;
52127 + tmp1 = hpPriv->eepromImage[0x100+0x172*2/4];
52128 + tmp = tmp + (tmp1 << 8);
52129 + eepromBoardData[0][3] = tmp;
52130 + eepromBoardData[0][4] = tmp;
52131 + //Ant control chain 0
52132 + tmp = hpPriv->eepromImage[0x100+0x16c*2/4];
52133 + tmp = tmp >> 24;
52134 + tmp1 = hpPriv->eepromImage[0x100+0x16e*2/4];
52135 + tmp = tmp + (tmp1 << 8);
52136 + eepromBoardData[1][3] = tmp;
52137 + eepromBoardData[1][4] = tmp;
52138 + //Ant control chain 2
52139 + tmp = hpPriv->eepromImage[0x100+0x16e*2/4];
52140 + tmp = tmp >> 24;
52141 + tmp1 = hpPriv->eepromImage[0x100+0x170*2/4];
52142 + tmp = tmp + (tmp1 << 8);
52143 + eepromBoardData[2][3] = tmp;
52144 + eepromBoardData[2][4] = tmp;
52145 + //SwSettle
52146 + tmp = hpPriv->eepromImage[0x100+0x174*2/4];
52147 + tmp = (tmp >> 8) & 0x7f;
52148 + eepromBoardData[3][4] &= (~((u32_t)0x3f80));
52149 + eepromBoardData[3][4] |= (tmp << 7);
52150 +#if 0
52151 + //swSettleHt40
52152 + tmp = hpPriv->eepromImage[0x100+0x184*2/4];
52153 + tmp = (tmp >> 24) & 0x7f;
52154 + eepromBoardData[3][3] &= (~((u32_t)0x3f80));
52155 + eepromBoardData[3][3] |= (tmp << 7);
52156 +#endif
52157 + //adcDesired, pdaDesired
52158 + tmp = hpPriv->eepromImage[0x100+0x176*2/4];
52159 + tmp = (tmp >> 16) & 0xff;
52160 + tmp1 = hpPriv->eepromImage[0x100+0x176*2/4];
52161 + tmp1 = tmp1 >> 24;
52162 + tmp = tmp + (tmp1<<8);
52163 + eepromBoardData[4][3] &= (~((u32_t)0xffff));
52164 + eepromBoardData[4][3] |= tmp;
52165 + eepromBoardData[4][4] &= (~((u32_t)0xffff));
52166 + eepromBoardData[4][4] |= tmp;
52167 + //TxEndToXpaOff, TxFrameToXpaOn
52168 + tmp = hpPriv->eepromImage[0x100+0x178*2/4];
52169 + tmp = (tmp >> 16) & 0xff;
52170 + tmp1 = hpPriv->eepromImage[0x100+0x17a*2/4];
52171 + tmp1 = tmp1 & 0xff;
52172 + tmp = (tmp << 24) + (tmp << 16) + (tmp1 << 8) + tmp1;
52173 + eepromBoardData[5][3] = tmp;
52174 + eepromBoardData[5][4] = tmp;
52175 + //TxEnaToRxOm
52176 + tmp = hpPriv->eepromImage[0x100+0x178*2/4];
52177 + tmp = (tmp >> 24);
52178 + eepromBoardData[6][3] &= (~((u32_t)0xff0000));
52179 + eepromBoardData[6][3] |= (tmp<<16);
52180 + eepromBoardData[6][4] &= (~((u32_t)0xff0000));
52181 + eepromBoardData[6][4] |= (tmp<<16);
52182 + //Thresh62
52183 + tmp = hpPriv->eepromImage[0x100+0x17a*2/4];
52184 + tmp = (tmp >> 8) & 0x7f;
52185 + eepromBoardData[7][3] &= (~((u32_t)0x7f000));
52186 + eepromBoardData[7][3] |= (tmp<<12);
52187 + eepromBoardData[7][4] &= (~((u32_t)0x7f000));
52188 + eepromBoardData[7][4] |= (tmp<<12);
52189 + //TxRxAtten chain_0
52190 + tmp = hpPriv->eepromImage[0x100+0x174*2/4];
52191 + tmp = (tmp >> 16) & 0x3f;
52192 + eepromBoardData[8][3] &= (~((u32_t)0x3f000));
52193 + eepromBoardData[8][3] |= (tmp<<12);
52194 + eepromBoardData[8][4] &= (~((u32_t)0x3f000));
52195 + eepromBoardData[8][4] |= (tmp<<12);
52196 + //TxRxAtten chain_2
52197 + tmp = hpPriv->eepromImage[0x100+0x174*2/4];
52198 + tmp = (tmp >> 24) & 0x3f;
52199 + eepromBoardData[9][3] &= (~((u32_t)0x3f000));
52200 + eepromBoardData[9][3] |= (tmp<<12);
52201 + eepromBoardData[9][4] &= (~((u32_t)0x3f000));
52202 + eepromBoardData[9][4] |= (tmp<<12);
52203 + //TxRxMargin chain_0
52204 + tmp = hpPriv->eepromImage[0x100+0x176*2/4];
52205 + tmp = (tmp) & 0x3f;
52206 + eepromBoardData[10][3] &= (~((u32_t)0xfc0000));
52207 + eepromBoardData[10][3] |= (tmp<<18);
52208 + eepromBoardData[10][4] &= (~((u32_t)0xfc0000));
52209 + eepromBoardData[10][4] |= (tmp<<18);
52210 + //TxRxMargin chain_2
52211 + tmp = hpPriv->eepromImage[0x100+0x176*2/4];
52212 + tmp = (tmp >> 8) & 0x3f;
52213 + eepromBoardData[11][3] &= (~((u32_t)0xfc0000));
52214 + eepromBoardData[11][3] |= (tmp<<18);
52215 + eepromBoardData[11][4] &= (~((u32_t)0xfc0000));
52216 + eepromBoardData[11][4] |= (tmp<<18);
52217 + //iqCall chain_0, iqCallQ chain_0
52218 + tmp = hpPriv->eepromImage[0x100+0x17c*2/4];
52219 + tmp = (tmp >> 16) & 0x3f;
52220 + tmp1 = hpPriv->eepromImage[0x100+0x17e*2/4];
52221 + tmp1 = (tmp1) & 0x1f;
52222 + tmp = (tmp<<5) + tmp1;
52223 + eepromBoardData[12][3] &= (~((u32_t)0x7ff));
52224 + eepromBoardData[12][3] |= (tmp);
52225 + eepromBoardData[12][4] &= (~((u32_t)0x7ff));
52226 + eepromBoardData[12][4] |= (tmp);
52227 + //iqCall chain_2, iqCallQ chain_2
52228 + tmp = hpPriv->eepromImage[0x100+0x17c*2/4];
52229 + tmp = (tmp>>24) & 0x3f;
52230 + tmp1 = hpPriv->eepromImage[0x100+0x17e*2/4];
52231 + tmp1 = (tmp1 >> 8) & 0x1f;
52232 + tmp = (tmp<<5) + tmp1;
52233 + eepromBoardData[13][3] &= (~((u32_t)0x7ff));
52234 + eepromBoardData[13][3] |= (tmp);
52235 + eepromBoardData[13][4] &= (~((u32_t)0x7ff));
52236 + eepromBoardData[13][4] |= (tmp);
52237 + //xpd gain mask
52238 + tmp = hpPriv->eepromImage[0x100+0x17c*2/4];
52239 + tmp = tmp & 0xf;
52240 + DbgPrint("xpd=0x%x, pd=0x%x\n", tmp, zcXpdToPd[tmp]);
52241 + eepromBoardData[14][3] &= (~((u32_t)0xf0000));
52242 + eepromBoardData[14][3] |= (zcXpdToPd[tmp] << 16);
52243 + eepromBoardData[14][4] &= (~((u32_t)0xf0000));
52244 + eepromBoardData[14][4] |= (zcXpdToPd[tmp] << 16);
52245 +#if 0
52246 + //bsw_Margin chain_0
52247 + tmp = hpPriv->eepromImage[0x100+0x184*2/4];
52248 + tmp = (tmp >> 8) & 0xf;
52249 + eepromBoardData[10][3] &= (~((u32_t)0x3c00));
52250 + eepromBoardData[10][3] |= (tmp << 10);
52251 + eepromBoardData[10][4] &= (~((u32_t)0x3c00));
52252 + eepromBoardData[10][4] |= (tmp << 10);
52253 + //bsw_Atten chain_0
52254 + tmp = hpPriv->eepromImage[0x100+0x182*2/4];
52255 + tmp = (tmp>>24) & 0x1f;
52256 + eepromBoardData[10][3] &= (~((u32_t)0x1f));
52257 + eepromBoardData[10][3] |= (tmp);
52258 + eepromBoardData[10][4] &= (~((u32_t)0x1f));
52259 + eepromBoardData[10][4] |= (tmp);
52260 + //bsw_Margin chain_2
52261 + tmp = hpPriv->eepromImage[0x100+0x184*2/4];
52262 + tmp = (tmp >> 16) & 0xf;
52263 + eepromBoardData[11][3] &= (~((u32_t)0x3c00));
52264 + eepromBoardData[11][3] |= (tmp << 10);
52265 + eepromBoardData[11][4] &= (~((u32_t)0x3c00));
52266 + eepromBoardData[11][4] |= (tmp << 10);
52267 + //bsw_Atten chain_2
52268 + tmp = hpPriv->eepromImage[0x100+0x184*2/4];
52269 + tmp = (tmp) & 0x1f;
52270 + eepromBoardData[11][3] &= (~((u32_t)0x1f));
52271 + eepromBoardData[11][3] |= (tmp);
52272 + eepromBoardData[11][4] &= (~((u32_t)0x1f));
52273 + eepromBoardData[11][4] |= (tmp);
52274 +#endif
52275 +
52276 +#if 0
52277 + for (j=0; j<14; j++)
52278 + {
52279 + DbgPrint("%04x, %08x, %08x, %08x, %08x\n", eepromBoardData[j][0], eepromBoardData[j][1], eepromBoardData[j][2], eepromBoardData[j][3], eepromBoardData[j][4]);
52280 + }
52281 +#endif
52282 +
52283 + if ((hpPriv->eepromImage[0x100+0x110*2/4]&0xff) == 0x80) //FEM TYPE
52284 + {
52285 + /* Update board data to registers */
52286 + for (j=0; j<15; j++)
52287 + {
52288 + reg_write(eepromBoardData[j][0], eepromBoardData[j][modesIndex]);
52289 +
52290 + /* #1 Save the initial value of the related RIFS register settings */
52291 + //if( ((struct zsHpPriv*)wd->hpPrivate)->isInitialPhy == 1 )
52292 + {
52293 + switch(eepromBoardData[j][0])
52294 + {
52295 + case 0x9850 :
52296 + ((struct zsHpPriv*)wd->hpPrivate)->initDesiredSigSize = eepromBoardData[j][modesIndex];
52297 + break;
52298 + case 0x985c :
52299 + ((struct zsHpPriv*)wd->hpPrivate)->initAGC = eepromBoardData[j][modesIndex];
52300 + break;
52301 + case 0x9860 :
52302 + ((struct zsHpPriv*)wd->hpPrivate)->initAgcControl = eepromBoardData[j][modesIndex];
52303 + break;
52304 + case 0x9918 :
52305 + ((struct zsHpPriv*)wd->hpPrivate)->initSearchStartDelay = eepromBoardData[j][modesIndex];
52306 + break;
52307 + case 0x99ec :
52308 + ((struct zsHpPriv*)wd->hpPrivate)->initRIFSSearchParams = eepromBoardData[j][modesIndex];
52309 + break;
52310 + case 0xa388 :
52311 + ((struct zsHpPriv*)wd->hpPrivate)->initFastChannelChangeControl = eepromBoardData[j][modesIndex];
52312 + default :
52313 + break;
52314 + }
52315 + }
52316 + }
52317 + } /* if ((hpPriv->eepromImage[0x100+0x110*2/4]&0xff) == 0x80) //FEM TYPE */
52318 +
52319 +
52320 + /* Bringup issue : force tx gain */
52321 + //reg_write(0xa258, 0x0cc65381);
52322 + //reg_write(0xa274, 0x0a1a7c15);
52323 + zfInitPowerCal(dev);
52324 +
52325 + if(frequency > ZM_CH_G_14)
52326 + {
52327 + zfDelayWriteInternalReg(dev, 0x1d4014, 0x5143);
52328 + }
52329 + else
52330 + {
52331 + zfDelayWriteInternalReg(dev, 0x1d4014, 0x5163);
52332 + }
52333 +
52334 + zfFlushDelayWrite(dev);
52335 +}
52336 +
52337 +
52338 +void zfInitRf(zdev_t* dev, u32_t frequency)
52339 +{
52340 + u32_t cmd[8];
52341 + u16_t ret;
52342 + int delta_slope_coeff_exp;
52343 + int delta_slope_coeff_man;
52344 + int delta_slope_coeff_exp_shgi;
52345 + int delta_slope_coeff_man_shgi;
52346 +
52347 + zmw_get_wlan_dev(dev);
52348 +
52349 + zm_debug_msg1(" initRf frequency = ", frequency);
52350 +
52351 + if (frequency == 0)
52352 + {
52353 + frequency = 2412;
52354 + }
52355 +
52356 + /* Bank 0 1 2 3 5 6 7 */
52357 + zfSetRfRegs(dev, frequency);
52358 + /* Bank 4 */
52359 + zfSetBank4AndPowerTable(dev, frequency, 0, 0);
52360 +
52361 + /* stroe frequency */
52362 + ((struct zsHpPriv*)wd->hpPrivate)->hwFrequency = (u16_t)frequency;
52363 +
52364 + zfGetHwTurnOffdynParam(dev,
52365 + frequency, 0, 0,
52366 + &delta_slope_coeff_exp,
52367 + &delta_slope_coeff_man,
52368 + &delta_slope_coeff_exp_shgi,
52369 + &delta_slope_coeff_man_shgi);
52370 +
52371 + /* related functions */
52372 + frequency = frequency*1000;
52373 + cmd[0] = 28 | (ZM_CMD_RF_INIT << 8);
52374 + cmd[1] = frequency;
52375 + cmd[2] = 0;//((struct zsHpPriv*)wd->hpPrivate)->hw_DYNAMIC_HT2040_EN;
52376 + cmd[3] = 1;//((wd->ExtOffset << 2) | ((struct zsHpPriv*)wd->hpPrivate)->hw_HT_ENABLE);
52377 + cmd[4] = delta_slope_coeff_exp;
52378 + cmd[5] = delta_slope_coeff_man;
52379 + cmd[6] = delta_slope_coeff_exp_shgi;
52380 + cmd[7] = delta_slope_coeff_man_shgi;
52381 +
52382 + ret = zfIssueCmd(dev, cmd, 32, ZM_OID_INTERNAL_WRITE, 0);
52383 +
52384 + // delay temporarily, wait for new PHY and RF
52385 + zfwSleep(dev, 1000);
52386 +}
52387 +
52388 +int tn(int exp)
52389 +{
52390 + int i;
52391 + int tmp = 1;
52392 + for(i=0; i<exp; i++)
52393 + tmp = tmp*2;
52394 +
52395 + return tmp;
52396 +}
52397 +
52398 +/*int zfFloor(double indata)
52399 +{
52400 + if(indata<0)
52401 + return (int)indata-1;
52402 + else
52403 + return (int)indata;
52404 +}
52405 +*/
52406 +u32_t reverse_bits(u32_t chan_sel)
52407 +{
52408 + /* reverse_bits */
52409 + u32_t chansel = 0;
52410 + u8_t i;
52411 +
52412 + for (i=0; i<8; i++)
52413 + chansel |= ((chan_sel>>(7-i) & 0x1) << i);
52414 + return chansel;
52415 +}
52416 +
52417 +/* Bank 0 1 2 3 5 6 7 */
52418 +void zfSetRfRegs(zdev_t* dev, u32_t frequency)
52419 +{
52420 + u16_t entries;
52421 + u16_t freqIndex = 0;
52422 + u16_t i;
52423 +
52424 + //zmw_get_wlan_dev(dev);
52425 +
52426 + if ( frequency > ZM_CH_G_14 )
52427 + {
52428 + /* 5G */
52429 + freqIndex = 1;
52430 + zm_msg0_scan(ZM_LV_2, "Set to 5GHz");
52431 +
52432 + }
52433 + else
52434 + {
52435 + /* 2.4G */
52436 + freqIndex = 2;
52437 + zm_msg0_scan(ZM_LV_2, "Set to 2.4GHz");
52438 + }
52439 +
52440 +#if 1
52441 + entries = sizeof(otusBank) / sizeof(*otusBank);
52442 + for (i=0; i<entries; i++)
52443 + {
52444 + reg_write(otusBank[i][0], otusBank[i][freqIndex]);
52445 + }
52446 +#else
52447 + /* Bank0 */
52448 + entries = sizeof(ar5416Bank0) / sizeof(*ar5416Bank0);
52449 + for (i=0; i<entries; i++)
52450 + {
52451 + reg_write(ar5416Bank0[i][0], ar5416Bank0[i][1]);
52452 + }
52453 + /* Bank1 */
52454 + entries = sizeof(ar5416Bank1) / sizeof(*ar5416Bank1);
52455 + for (i=0; i<entries; i++)
52456 + {
52457 + reg_write(ar5416Bank1[i][0], ar5416Bank1[i][1]);
52458 + }
52459 + /* Bank2 */
52460 + entries = sizeof(ar5416Bank2) / sizeof(*ar5416Bank2);
52461 + for (i=0; i<entries; i++)
52462 + {
52463 + reg_write(ar5416Bank2[i][0], ar5416Bank2[i][1]);
52464 + }
52465 + /* Bank3 */
52466 + entries = sizeof(ar5416Bank3) / sizeof(*ar5416Bank3);
52467 + for (i=0; i<entries; i++)
52468 + {
52469 + reg_write(ar5416Bank3[i][0], ar5416Bank3[i][freqIndex]);
52470 + }
52471 + /* Bank5 */
52472 + reg_write (0x98b0, 0x00000013);
52473 + reg_write (0x98e4, 0x00000002);
52474 + /* Bank6 */
52475 + entries = sizeof(ar5416Bank6) / sizeof(*ar5416Bank6);
52476 + for (i=0; i<entries; i++)
52477 + {
52478 + reg_write(ar5416Bank6[i][0], ar5416Bank6[i][freqIndex]);
52479 + }
52480 + /* Bank7 */
52481 + entries = sizeof(ar5416Bank7) / sizeof(*ar5416Bank7);
52482 + for (i=0; i<entries; i++)
52483 + {
52484 + reg_write(ar5416Bank7[i][0], ar5416Bank7[i][1]);
52485 + }
52486 +#endif
52487 +
52488 + zfFlushDelayWrite(dev);
52489 +}
52490 +
52491 +/* Bank 4 */
52492 +void zfSetBank4AndPowerTable(zdev_t* dev, u32_t frequency, u8_t bw40,
52493 + u8_t extOffset)
52494 +{
52495 + u32_t chup = 1;
52496 + u32_t bmode_LF_synth_freq = 0;
52497 + u32_t amode_refsel_1 = 0;
52498 + u32_t amode_refsel_0 = 1;
52499 + u32_t addr2 = 1;
52500 + u32_t addr1 = 0;
52501 + u32_t addr0 = 0;
52502 +
52503 + u32_t d1;
52504 + u32_t d0;
52505 + u32_t tmp_0;
52506 + u32_t tmp_1;
52507 + u32_t data0;
52508 + u32_t data1;
52509 +
52510 + u8_t chansel;
52511 + u8_t chan_sel;
52512 + u32_t temp_chan_sel;
52513 +
52514 + u16_t i;
52515 +
52516 + zmw_get_wlan_dev(dev);
52517 +
52518 +
52519 + /* if enable 802.11h, need to record curent channel index in channel array */
52520 + if (wd->sta.DFSEnable)
52521 + {
52522 + for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
52523 + {
52524 + if (wd->regulationTable.allowChannel[i].channel == frequency)
52525 + break;
52526 + }
52527 + wd->regulationTable.CurChIndex = i;
52528 + }
52529 +
52530 + if (bw40 == 1)
52531 + {
52532 + if (extOffset == 1)
52533 + {
52534 + frequency += 10;
52535 + }
52536 + else
52537 + {
52538 + frequency -= 10;
52539 + }
52540 +
52541 + }
52542 +
52543 +
52544 + if ( frequency > 3000 )
52545 + {
52546 + if ( frequency % 10 )
52547 + {
52548 + /* 5M */
52549 + chan_sel = (u8_t)((frequency - 4800)/5);
52550 + chan_sel = (u8_t)(chan_sel & 0xff);
52551 + chansel = (u8_t)reverse_bits(chan_sel);
52552 + }
52553 + else
52554 + {
52555 + /* 10M : improve Tx EVM */
52556 + chan_sel = (u8_t)((frequency - 4800)/10);
52557 + chan_sel = (u8_t)(chan_sel & 0xff)<<1;
52558 + chansel = (u8_t)reverse_bits(chan_sel);
52559 +
52560 + amode_refsel_1 = 1;
52561 + amode_refsel_0 = 0;
52562 + }
52563 + }
52564 + else
52565 + {
52566 + //temp_chan_sel = (((frequency - 672)*2) - 3040)/10;
52567 + if (frequency == 2484)
52568 + {
52569 + temp_chan_sel = 10 + (frequency - 2274)/5 ;
52570 + bmode_LF_synth_freq = 1;
52571 + }
52572 + else
52573 + {
52574 + temp_chan_sel = 16 + (frequency - 2272)/5 ;
52575 + bmode_LF_synth_freq = 0;
52576 + }
52577 + chan_sel = (u8_t)(temp_chan_sel << 2) & 0xff;
52578 + chansel = (u8_t)reverse_bits(chan_sel);
52579 + }
52580 +
52581 + d1 = chansel; //# 8 bits of chan
52582 + d0 = addr0<<7 | addr1<<6 | addr2<<5
52583 + | amode_refsel_0<<3 | amode_refsel_1<<2
52584 + | bmode_LF_synth_freq<<1 | chup;
52585 +
52586 + tmp_0 = d0 & 0x1f; //# 5-1
52587 + tmp_1 = d1 & 0x1f; //# 5-1
52588 + data0 = tmp_1<<5 | tmp_0;
52589 +
52590 + tmp_0 = d0>>5 & 0x7; //# 8-6
52591 + tmp_1 = d1>>5 & 0x7; //# 8-6
52592 + data1 = tmp_1<<5 | tmp_0;
52593 +
52594 + /* Bank4 */
52595 + reg_write (0x9800+(0x2c<<2), data0);
52596 + reg_write (0x9800+(0x3a<<2), data1);
52597 + //zm_debug_msg1("0x9800+(0x2c<<2 = ", data0);
52598 + //zm_debug_msg1("0x9800+(0x3a<<2 = ", data1);
52599 +
52600 +
52601 + zfFlushDelayWrite(dev);
52602 +
52603 + zfwSleep(dev, 10);
52604 +
52605 + return;
52606 +}
52607 +
52608 +
52609 +struct zsPhyFreqPara
52610 +{
52611 + u32_t coeff_exp;
52612 + u32_t coeff_man;
52613 + u32_t coeff_exp_shgi;
52614 + u32_t coeff_man_shgi;
52615 +};
52616 +
52617 +struct zsPhyFreqTable
52618 +{
52619 + u32_t frequency;
52620 + struct zsPhyFreqPara FpgaDynamicHT;
52621 + struct zsPhyFreqPara FpgaStaticHT;
52622 + struct zsPhyFreqPara ChipST20Mhz;
52623 + struct zsPhyFreqPara Chip2040Mhz;
52624 + struct zsPhyFreqPara Chip2040ExtAbove;
52625 +};
52626 +
52627 +const struct zsPhyFreqTable zgPhyFreqCoeff[] =
52628 +{
52629 +/*Index freq FPGA DYNAMIC_HT2040_EN FPGA STATIC_HT20 Real Chip static20MHz Real Chip 2040MHz Real Chip 2040Mhz */
52630 + /* fclk = 10.8 21.6 40 ext below 40 ext above 40 */
52631 +/* 0 */ {2412, {5, 23476, 5, 21128}, {4, 23476, 4, 21128}, {3, 21737, 3, 19563}, {3, 21827, 3, 19644}, {3, 21647, 3, 19482}},
52632 +/* 1 */ {2417, {5, 23427, 5, 21084}, {4, 23427, 4, 21084}, {3, 21692, 3, 19523}, {3, 21782, 3, 19604}, {3, 21602, 3, 19442}},
52633 +/* 2 */ {2422, {5, 23379, 5, 21041}, {4, 23379, 4, 21041}, {3, 21647, 3, 19482}, {3, 21737, 3, 19563}, {3, 21558, 3, 19402}},
52634 +/* 3 */ {2427, {5, 23330, 5, 20997}, {4, 23330, 4, 20997}, {3, 21602, 3, 19442}, {3, 21692, 3, 19523}, {3, 21514, 3, 19362}},
52635 +/* 4 */ {2432, {5, 23283, 5, 20954}, {4, 23283, 4, 20954}, {3, 21558, 3, 19402}, {3, 21647, 3, 19482}, {3, 21470, 3, 19323}},
52636 +/* 5 */ {2437, {5, 23235, 5, 20911}, {4, 23235, 4, 20911}, {3, 21514, 3, 19362}, {3, 21602, 3, 19442}, {3, 21426, 3, 19283}},
52637 +/* 6 */ {2442, {5, 23187, 5, 20868}, {4, 23187, 4, 20868}, {3, 21470, 3, 19323}, {3, 21558, 3, 19402}, {3, 21382, 3, 19244}},
52638 +/* 7 */ {2447, {5, 23140, 5, 20826}, {4, 23140, 4, 20826}, {3, 21426, 3, 19283}, {3, 21514, 3, 19362}, {3, 21339, 3, 19205}},
52639 +/* 8 */ {2452, {5, 23093, 5, 20783}, {4, 23093, 4, 20783}, {3, 21382, 3, 19244}, {3, 21470, 3, 19323}, {3, 21295, 3, 19166}},
52640 +/* 9 */ {2457, {5, 23046, 5, 20741}, {4, 23046, 4, 20741}, {3, 21339, 3, 19205}, {3, 21426, 3, 19283}, {3, 21252, 3, 19127}},
52641 +/* 10 */ {2462, {5, 22999, 5, 20699}, {4, 22999, 4, 20699}, {3, 21295, 3, 19166}, {3, 21382, 3, 19244}, {3, 21209, 3, 19088}},
52642 +/* 11 */ {2467, {5, 22952, 5, 20657}, {4, 22952, 4, 20657}, {3, 21252, 3, 19127}, {3, 21339, 3, 19205}, {3, 21166, 3, 19050}},
52643 +/* 12 */ {2472, {5, 22906, 5, 20615}, {4, 22906, 4, 20615}, {3, 21209, 3, 19088}, {3, 21295, 3, 19166}, {3, 21124, 3, 19011}},
52644 +/* 13 */ {2484, {5, 22795, 5, 20516}, {4, 22795, 4, 20516}, {3, 21107, 3, 18996}, {3, 21192, 3, 19073}, {3, 21022, 3, 18920}},
52645 +/* 14 */ {4920, {6, 23018, 6, 20716}, {5, 23018, 5, 20716}, {4, 21313, 4, 19181}, {4, 21356, 4, 19220}, {4, 21269, 4, 19142}},
52646 +/* 15 */ {4940, {6, 22924, 6, 20632}, {5, 22924, 5, 20632}, {4, 21226, 4, 19104}, {4, 21269, 4, 19142}, {4, 21183, 4, 19065}},
52647 +/* 16 */ {4960, {6, 22832, 6, 20549}, {5, 22832, 5, 20549}, {4, 21141, 4, 19027}, {4, 21183, 4, 19065}, {4, 21098, 4, 18988}},
52648 +/* 17 */ {4980, {6, 22740, 6, 20466}, {5, 22740, 5, 20466}, {4, 21056, 4, 18950}, {4, 21098, 4, 18988}, {4, 21014, 4, 18912}},
52649 +/* 18 */ {5040, {6, 22469, 6, 20223}, {5, 22469, 5, 20223}, {4, 20805, 4, 18725}, {4, 20846, 4, 18762}, {4, 20764, 4, 18687}},
52650 +/* 19 */ {5060, {6, 22381, 6, 20143}, {5, 22381, 5, 20143}, {4, 20723, 4, 18651}, {4, 20764, 4, 18687}, {4, 20682, 4, 18614}},
52651 +/* 20 */ {5080, {6, 22293, 6, 20063}, {5, 22293, 5, 20063}, {4, 20641, 4, 18577}, {4, 20682, 4, 18614}, {4, 20601, 4, 18541}},
52652 +/* 21 */ {5180, {6, 21862, 6, 19676}, {5, 21862, 5, 19676}, {4, 20243, 4, 18219}, {4, 20282, 4, 18254}, {4, 20204, 4, 18183}},
52653 +/* 22 */ {5200, {6, 21778, 6, 19600}, {5, 21778, 5, 19600}, {4, 20165, 4, 18148}, {4, 20204, 4, 18183}, {4, 20126, 4, 18114}},
52654 +/* 23 */ {5220, {6, 21695, 6, 19525}, {5, 21695, 5, 19525}, {4, 20088, 4, 18079}, {4, 20126, 4, 18114}, {4, 20049, 4, 18044}},
52655 +/* 24 */ {5240, {6, 21612, 6, 19451}, {5, 21612, 5, 19451}, {4, 20011, 4, 18010}, {4, 20049, 4, 18044}, {4, 19973, 4, 17976}},
52656 +/* 25 */ {5260, {6, 21530, 6, 19377}, {5, 21530, 5, 19377}, {4, 19935, 4, 17941}, {4, 19973, 4, 17976}, {4, 19897, 4, 17907}},
52657 +/* 26 */ {5280, {6, 21448, 6, 19303}, {5, 21448, 5, 19303}, {4, 19859, 4, 17873}, {4, 19897, 4, 17907}, {4, 19822, 4, 17840}},
52658 +/* 27 */ {5300, {6, 21367, 6, 19230}, {5, 21367, 5, 19230}, {4, 19784, 4, 17806}, {4, 19822, 4, 17840}, {4, 19747, 4, 17772}},
52659 +/* 28 */ {5320, {6, 21287, 6, 19158}, {5, 21287, 5, 19158}, {4, 19710, 4, 17739}, {4, 19747, 4, 17772}, {4, 19673, 4, 17706}},
52660 +/* 29 */ {5500, {6, 20590, 6, 18531}, {5, 20590, 5, 18531}, {4, 19065, 4, 17159}, {4, 19100, 4, 17190}, {4, 19030, 4, 17127}},
52661 +/* 30 */ {5520, {6, 20516, 6, 18464}, {5, 20516, 5, 18464}, {4, 18996, 4, 17096}, {4, 19030, 4, 17127}, {4, 18962, 4, 17065}},
52662 +/* 31 */ {5540, {6, 20442, 6, 18397}, {5, 20442, 5, 18397}, {4, 18927, 4, 17035}, {4, 18962, 4, 17065}, {4, 18893, 4, 17004}},
52663 +/* 32 */ {5560, {6, 20368, 6, 18331}, {5, 20368, 5, 18331}, {4, 18859, 4, 16973}, {4, 18893, 4, 17004}, {4, 18825, 4, 16943}},
52664 +/* 33 */ {5580, {6, 20295, 6, 18266}, {5, 20295, 5, 18266}, {4, 18792, 4, 16913}, {4, 18825, 4, 16943}, {4, 18758, 4, 16882}},
52665 +/* 34 */ {5600, {6, 20223, 6, 18200}, {5, 20223, 5, 18200}, {4, 18725, 4, 16852}, {4, 18758, 4, 16882}, {4, 18691, 4, 16822}},
52666 +/* 35 */ {5620, {6, 20151, 6, 18136}, {5, 20151, 5, 18136}, {4, 18658, 4, 16792}, {4, 18691, 4, 16822}, {4, 18625, 4, 16762}},
52667 +/* 36 */ {5640, {6, 20079, 6, 18071}, {5, 20079, 5, 18071}, {4, 18592, 4, 16733}, {4, 18625, 4, 16762}, {4, 18559, 4, 16703}},
52668 +/* 37 */ {5660, {6, 20008, 6, 18007}, {5, 20008, 5, 18007}, {4, 18526, 4, 16673}, {4, 18559, 4, 16703}, {4, 18493, 4, 16644}},
52669 +/* 38 */ {5680, {6, 19938, 6, 17944}, {5, 19938, 5, 17944}, {4, 18461, 4, 16615}, {4, 18493, 4, 16644}, {4, 18428, 4, 16586}},
52670 +/* 39 */ {5700, {6, 19868, 6, 17881}, {5, 19868, 5, 17881}, {4, 18396, 4, 16556}, {4, 18428, 4, 16586}, {4, 18364, 4, 16527}},
52671 +/* 40 */ {5745, {6, 19712, 6, 17741}, {5, 19712, 5, 17741}, {4, 18252, 4, 16427}, {4, 18284, 4, 16455}, {4, 18220, 4, 16398}},
52672 +/* 41 */ {5765, {6, 19644, 6, 17679}, {5, 19644, 5, 17679}, {4, 18189, 5, 32740}, {4, 18220, 4, 16398}, {4, 18157, 5, 32683}},
52673 +/* 42 */ {5785, {6, 19576, 6, 17618}, {5, 19576, 5, 17618}, {4, 18126, 5, 32626}, {4, 18157, 5, 32683}, {4, 18094, 5, 32570}},
52674 +/* 43 */ {5805, {6, 19508, 6, 17558}, {5, 19508, 5, 17558}, {4, 18063, 5, 32514}, {4, 18094, 5, 32570}, {4, 18032, 5, 32458}},
52675 +/* 44 */ {5825, {6, 19441, 6, 17497}, {5, 19441, 5, 17497}, {4, 18001, 5, 32402}, {4, 18032, 5, 32458}, {4, 17970, 5, 32347}},
52676 +/* 45 */ {5170, {6, 21904, 6, 19714}, {5, 21904, 5, 19714}, {4, 20282, 4, 18254}, {4, 20321, 4, 18289}, {4, 20243, 4, 18219}},
52677 +/* 46 */ {5190, {6, 21820, 6, 19638}, {5, 21820, 5, 19638}, {4, 20204, 4, 18183}, {4, 20243, 4, 18219}, {4, 20165, 4, 18148}},
52678 +/* 47 */ {5210, {6, 21736, 6, 19563}, {5, 21736, 5, 19563}, {4, 20126, 4, 18114}, {4, 20165, 4, 18148}, {4, 20088, 4, 18079}},
52679 +/* 48 */ {5230, {6, 21653, 6, 19488}, {5, 21653, 5, 19488}, {4, 20049, 4, 18044}, {4, 20088, 4, 18079}, {4, 20011, 4, 18010}}
52680 +};
52681 +/* to reduce search time, please modify this define if you add or delete channel in table */
52682 +#define First5GChannelIndex 14
52683 +
52684 +void zfGetHwTurnOffdynParam(zdev_t* dev,
52685 + u32_t frequency, u8_t bw40, u8_t extOffset,
52686 + int* delta_slope_coeff_exp,
52687 + int* delta_slope_coeff_man,
52688 + int* delta_slope_coeff_exp_shgi,
52689 + int* delta_slope_coeff_man_shgi)
52690 +{
52691 + /* Get param for turnoffdyn */
52692 + u16_t i, arraySize;
52693 +
52694 + //zmw_get_wlan_dev(dev);
52695 +
52696 + arraySize = sizeof(zgPhyFreqCoeff)/sizeof(struct zsPhyFreqTable);
52697 + if (frequency < 3000)
52698 + {
52699 + /* 2.4GHz Channel */
52700 + for (i = 0; i < First5GChannelIndex; i++)
52701 + {
52702 + if (frequency == zgPhyFreqCoeff[i].frequency)
52703 + break;
52704 + }
52705 +
52706 + if (i < First5GChannelIndex)
52707 + {
52708 + }
52709 + else
52710 + {
52711 + zm_msg1_scan(ZM_LV_0, "Unsupported 2.4G frequency = ", frequency);
52712 + return;
52713 + }
52714 + }
52715 + else
52716 + {
52717 + /* 5GHz Channel */
52718 + for (i = First5GChannelIndex; i < arraySize; i++)
52719 + {
52720 + if (frequency == zgPhyFreqCoeff[i].frequency)
52721 + break;
52722 + }
52723 +
52724 + if (i < arraySize)
52725 + {
52726 + }
52727 + else
52728 + {
52729 + zm_msg1_scan(ZM_LV_0, "Unsupported 5G frequency = ", frequency);
52730 + return;
52731 + }
52732 + }
52733 +
52734 + /* FPGA DYNAMIC_HT2040_EN fclk = 10.8 */
52735 + /* FPGA STATIC_HT20_ fclk = 21.6 */
52736 + /* Real Chip fclk = 40 */
52737 + #if ZM_FPGA_PHY == 1
52738 + //fclk = 10.8;
52739 + *delta_slope_coeff_exp = zgPhyFreqCoeff[i].FpgaDynamicHT.coeff_exp;
52740 + *delta_slope_coeff_man = zgPhyFreqCoeff[i].FpgaDynamicHT.coeff_man;
52741 + *delta_slope_coeff_exp_shgi = zgPhyFreqCoeff[i].FpgaDynamicHT.coeff_exp_shgi;
52742 + *delta_slope_coeff_man_shgi = zgPhyFreqCoeff[i].FpgaDynamicHT.coeff_man_shgi;
52743 + #else
52744 + //fclk = 40;
52745 + if (bw40)
52746 + {
52747 + /* ht2040 */
52748 + if (extOffset == 1) {
52749 + *delta_slope_coeff_exp = zgPhyFreqCoeff[i].Chip2040ExtAbove.coeff_exp;
52750 + *delta_slope_coeff_man = zgPhyFreqCoeff[i].Chip2040ExtAbove.coeff_man;
52751 + *delta_slope_coeff_exp_shgi = zgPhyFreqCoeff[i].Chip2040ExtAbove.coeff_exp_shgi;
52752 + *delta_slope_coeff_man_shgi = zgPhyFreqCoeff[i].Chip2040ExtAbove.coeff_man_shgi;
52753 + }
52754 + else {
52755 + *delta_slope_coeff_exp = zgPhyFreqCoeff[i].Chip2040Mhz.coeff_exp;
52756 + *delta_slope_coeff_man = zgPhyFreqCoeff[i].Chip2040Mhz.coeff_man;
52757 + *delta_slope_coeff_exp_shgi = zgPhyFreqCoeff[i].Chip2040Mhz.coeff_exp_shgi;
52758 + *delta_slope_coeff_man_shgi = zgPhyFreqCoeff[i].Chip2040Mhz.coeff_man_shgi;
52759 + }
52760 + }
52761 + else
52762 + {
52763 + /* static 20 */
52764 + *delta_slope_coeff_exp = zgPhyFreqCoeff[i].ChipST20Mhz.coeff_exp;
52765 + *delta_slope_coeff_man = zgPhyFreqCoeff[i].ChipST20Mhz.coeff_man;
52766 + *delta_slope_coeff_exp_shgi = zgPhyFreqCoeff[i].ChipST20Mhz.coeff_exp_shgi;
52767 + *delta_slope_coeff_man_shgi = zgPhyFreqCoeff[i].ChipST20Mhz.coeff_man_shgi;
52768 + }
52769 + #endif
52770 +}
52771 +
52772 +/* Main routin frequency setting function */
52773 +/* If 2.4G/5G switch, PHY need resetting BB and RF for band switch */
52774 +/* Do the setting switch in zfSendFrequencyCmd() */
52775 +void zfHpSetFrequencyEx(zdev_t* dev, u32_t frequency, u8_t bw40,
52776 + u8_t extOffset, u8_t initRF)
52777 +{
52778 + u32_t cmd[9];
52779 + u32_t cmdB[3];
52780 + u16_t ret;
52781 + u8_t old_band;
52782 + u8_t new_band;
52783 + u32_t checkLoopCount;
52784 + u32_t tmpValue;
52785 +
52786 + int delta_slope_coeff_exp;
52787 + int delta_slope_coeff_man;
52788 + int delta_slope_coeff_exp_shgi;
52789 + int delta_slope_coeff_man_shgi;
52790 +
52791 + zmw_get_wlan_dev(dev);
52792 + struct zsHpPriv* hpPriv = wd->hpPrivate;
52793 +
52794 + zm_msg1_scan(ZM_LV_1, "Frequency = ", frequency);
52795 + zm_msg1_scan(ZM_LV_1, "bw40 = ", bw40);
52796 + zm_msg1_scan(ZM_LV_1, "extOffset = ", extOffset);
52797 +
52798 + if ( hpPriv->coldResetNeedFreq )
52799 + {
52800 + hpPriv->coldResetNeedFreq = 0;
52801 + initRF = 2;
52802 + zm_debug_msg0("zfHpSetFrequencyEx: Do ColdReset ");
52803 + }
52804 + if ( hpPriv->isSiteSurvey == 2 )
52805 + {
52806 + /* wait time for AGC and noise calibration : not in sitesurvey and connected */
52807 + checkLoopCount = 2000; /* 2000*100 = 200ms */
52808 + }
52809 + else
52810 + {
52811 + /* wait time for AGC and noise calibration : in sitesurvey */
52812 + checkLoopCount = 1000; /* 1000*100 = 100ms */
52813 + }
52814 +
52815 + hpPriv->latestFrequency = frequency;
52816 + hpPriv->latestBw40 = bw40;
52817 + hpPriv->latestExtOffset = extOffset;
52818 +
52819 + if ((hpPriv->dot11Mode == ZM_HAL_80211_MODE_IBSS_GENERAL) ||
52820 + (hpPriv->dot11Mode == ZM_HAL_80211_MODE_IBSS_WPA2PSK))
52821 + {
52822 + if ( frequency <= ZM_CH_G_14 )
52823 + {
52824 + /* workaround for 11g Ad Hoc beacon distribution */
52825 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC0_CW, 0x7f0007);
52826 + //zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC1_AC0_AIFS, 0x1c04901c);
52827 + }
52828 + }
52829 +
52830 + /* AHB, DAC, ADC clock selection by static20/ht2040 */
52831 + zfSelAdcClk(dev, bw40, frequency);
52832 +
52833 + /* clear bb_heavy_clip_enable */
52834 + reg_write(0x99e0, 0x200);
52835 + zfFlushDelayWrite(dev);
52836 +
52837 + /* Set CTS/RTS rate */
52838 + if ( frequency > ZM_CH_G_14 )
52839 + {
52840 + //zfHpSetRTSCTSRate(dev, 0x10b010b); /* OFDM 6M */
52841 + new_band = 1;
52842 + }
52843 + else
52844 + {
52845 + //zfHpSetRTSCTSRate(dev, 0x30003); /* CCK 11M */
52846 + new_band = 0;
52847 + }
52848 +
52849 + if (((struct zsHpPriv*)wd->hpPrivate)->hwFrequency > ZM_CH_G_14)
52850 + old_band = 1;
52851 + else
52852 + old_band = 0;
52853 +
52854 + //Workaround for 2.4GHz only device
52855 + if ((hpPriv->OpFlags & 0x1) == 0)
52856 + {
52857 + if ((((struct zsHpPriv*)wd->hpPrivate)->hwFrequency == ZM_CH_G_1) && (frequency == ZM_CH_G_2))
52858 + {
52859 + /* Force to do band switching */
52860 + old_band = 1;
52861 + }
52862 + }
52863 +
52864 + /* Notify channel switch to firmware */
52865 + /* TX/RX must be stopped by now */
52866 + cmd[0] = 0 | (ZM_CMD_FREQ_STRAT << 8);
52867 + ret = zfIssueCmd(dev, cmd, 8, ZM_OID_INTERNAL_WRITE, 0);
52868 +
52869 + if ((initRF != 0) || (new_band != old_band)
52870 + || (((struct zsHpPriv*)wd->hpPrivate)->hwBw40 != bw40))
52871 + {
52872 + /* band switch */
52873 + zm_msg0_scan(ZM_LV_1, "=====band switch=====");
52874 +
52875 + if (initRF == 2 )
52876 + {
52877 + //Cold reset BB/ADDA
52878 + zfDelayWriteInternalReg(dev, 0x1d4004, 0x800);
52879 + zfFlushDelayWrite(dev);
52880 + zm_msg0_scan(ZM_LV_1, "Do cold reset BB/ADDA");
52881 + }
52882 + else
52883 + {
52884 + //Warm reset BB/ADDA
52885 + zfDelayWriteInternalReg(dev, 0x1d4004, 0x400);
52886 + zfFlushDelayWrite(dev);
52887 + }
52888 +
52889 + /* reset workaround state to default */
52890 + hpPriv->rxStrongRSSI = 0;
52891 + hpPriv->strongRSSI = 0;
52892 +
52893 + zfDelayWriteInternalReg(dev, 0x1d4004, 0x0);
52894 + zfFlushDelayWrite(dev);
52895 +
52896 + zfInitPhy(dev, frequency, bw40);
52897 +
52898 +// zfiCheckRifs(dev);
52899 +
52900 + /* Bank 0 1 2 3 5 6 7 */
52901 + zfSetRfRegs(dev, frequency);
52902 + /* Bank 4 */
52903 + zfSetBank4AndPowerTable(dev, frequency, bw40, extOffset);
52904 +
52905 + cmd[0] = 32 | (ZM_CMD_RF_INIT << 8);
52906 + }
52907 + else //((new_band == old_band) && !initRF)
52908 + {
52909 + /* same band */
52910 +
52911 + /* Force disable CR671 bit20 / 7823 */
52912 + /* The bug has to do with the polarity of the pdadc offset calibration. There */
52913 + /* is an initial calibration that is OK, and there is a continuous */
52914 + /* calibration that updates the pddac with the wrong polarity. Fortunately */
52915 + /* the second loop can be disabled with a bit called en_pd_dc_offset_thr. */
52916 +#if 0
52917 + cmdB[0] = 8 | (ZM_CMD_BITAND << 8);;
52918 + cmdB[1] = (0xa27c + 0x1bc000);
52919 + cmdB[2] = 0xffefffff;
52920 + ret = zfIssueCmd(dev, cmdB, 12, ZM_OID_INTERNAL_WRITE, 0);
52921 +#endif
52922 +
52923 + /* Bank 4 */
52924 + zfSetBank4AndPowerTable(dev, frequency, bw40, extOffset);
52925 +
52926 +
52927 + cmd[0] = 32 | (ZM_CMD_FREQUENCY << 8);
52928 + }
52929 +
52930 + /* Compatibility for new layout UB83 */
52931 + /* Setting code at CR1 here move from the func:zfHwHTEnable() in firmware */
52932 + if (((struct zsHpPriv*)wd->hpPrivate)->halCapability & ZM_HP_CAP_11N_ONE_TX_STREAM)
52933 + {
52934 + /* UB83 : one stream */
52935 + tmpValue = 0;
52936 + }
52937 + else
52938 + {
52939 + /* UB81, UB82 : two stream */
52940 + tmpValue = 0x100;
52941 + }
52942 +
52943 + if (1) //if (((struct zsHpPriv*)wd->hpPrivate)->hw_HT_ENABLE == 1)
52944 + {
52945 + if (bw40 == 1)
52946 + {
52947 + if (extOffset == 1) {
52948 + reg_write(0x9804, tmpValue | 0x2d4); //3d4 for real
52949 + }
52950 + else {
52951 + reg_write(0x9804, tmpValue | 0x2c4); //3c4 for real
52952 + }
52953 + //# Dyn HT2040.Refer to Reg 1.
52954 + //#[3]:single length (4us) 1st HT long training symbol; use Walsh spatial spreading for 2 chains 2 streams TX
52955 + //#[c]:allow short GI for HT40 packets; enable HT detection.
52956 + //#[4]:enable 20/40 MHz channel detection.
52957 + }
52958 + else
52959 + {
52960 + reg_write(0x9804, tmpValue | 0x240);
52961 + //# Static HT20
52962 + //#[3]:single length (4us) 1st HT long training symbol; use Walsh spatial spreading for 2 chains 2 streams TX
52963 + //#[4]:Otus don't allow short GI for HT20 packets yet; enable HT detection.
52964 + //#[0]:disable 20/40 MHz channel detection.
52965 + }
52966 + }
52967 + else
52968 + {
52969 + reg_write(0x9804, 0x0);
52970 + //# Legacy;# Direct Mapping for each chain.
52971 + //#Be modified by Oligo to add dynanic for legacy.
52972 + if (bw40 == 1)
52973 + {
52974 + reg_write(0x9804, 0x4); //# Dyn Legacy .Refer to reg 1.
52975 + }
52976 + else
52977 + {
52978 + reg_write(0x9804, 0x0); //# Static Legacy
52979 + }
52980 + }
52981 + zfFlushDelayWrite(dev);
52982 + /* end of ub83 compatibility */
52983 +
52984 + /* Set Power, TPC, Gain table... */
52985 + zfSetPowerCalTable(dev, frequency, bw40, extOffset);
52986 +
52987 +
52988 + /* store frequency */
52989 + ((struct zsHpPriv*)wd->hpPrivate)->hwFrequency = (u16_t)frequency;
52990 + ((struct zsHpPriv*)wd->hpPrivate)->hwBw40 = bw40;
52991 + ((struct zsHpPriv*)wd->hpPrivate)->hwExtOffset = extOffset;
52992 +
52993 + zfGetHwTurnOffdynParam(dev,
52994 + frequency, bw40, extOffset,
52995 + &delta_slope_coeff_exp,
52996 + &delta_slope_coeff_man,
52997 + &delta_slope_coeff_exp_shgi,
52998 + &delta_slope_coeff_man_shgi);
52999 +
53000 + /* related functions */
53001 + frequency = frequency*1000;
53002 + /* len[36] : type[0x30] : seq[?] */
53003 +// cmd[0] = 28 | (ZM_CMD_FREQUENCY << 8);
53004 + cmd[1] = frequency;
53005 + cmd[2] = bw40;//((struct zsHpPriv*)wd->hpPrivate)->hw_DYNAMIC_HT2040_EN;
53006 + cmd[3] = (extOffset<<2)|0x1;//((wd->ExtOffset << 2) | ((struct zsHpPriv*)wd->hpPrivate)->hw_HT_ENABLE);
53007 + cmd[4] = delta_slope_coeff_exp;
53008 + cmd[5] = delta_slope_coeff_man;
53009 + cmd[6] = delta_slope_coeff_exp_shgi;
53010 + cmd[7] = delta_slope_coeff_man_shgi;
53011 + cmd[8] = checkLoopCount;
53012 +
53013 + ret = zfIssueCmd(dev, cmd, 36, ZM_CMD_SET_FREQUENCY, 0);
53014 +
53015 + // delay temporarily, wait for new PHY and RF
53016 + //zfwSleep(dev, 1000);
53017 +}
53018 +
53019 +
53020 +/******************** Key ********************/
53021 +
53022 +u16_t zfHpResetKeyCache(zdev_t* dev)
53023 +{
53024 + u8_t i;
53025 + u32_t key[4] = {0, 0, 0, 0};
53026 +
53027 + zmw_get_wlan_dev(dev);
53028 + struct zsHpPriv* hpPriv=wd->hpPrivate;
53029 +
53030 + for(i=0;i<4;i++)
53031 + {
53032 + zfHpSetDefaultKey(dev, i, ZM_WEP64, key, NULL);
53033 + }
53034 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_ROLL_CALL_TBL_L, 0x00);
53035 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_ROLL_CALL_TBL_H, 0x00);
53036 + zfFlushDelayWrite(dev);
53037 +
53038 + hpPriv->camRollCallTable = (u64_t) 0;
53039 +
53040 + return 0;
53041 +}
53042 +
53043 +
53044 +/************************************************************************/
53045 +/* */
53046 +/* FUNCTION DESCRIPTION zfSetKey */
53047 +/* Set key. */
53048 +/* */
53049 +/* INPUTS */
53050 +/* dev : device pointer */
53051 +/* */
53052 +/* OUTPUTS */
53053 +/* 0 : success */
53054 +/* other : fail */
53055 +/* */
53056 +/* AUTHOR */
53057 +/* Stephen Chen ZyDAS Technology Corporation 2006.1 */
53058 +/* */
53059 +/************************************************************************/
53060 +/* ! please use zfCoreSetKey() in 80211Core for SetKey */
53061 +u32_t zfHpSetKey(zdev_t* dev, u8_t user, u8_t keyId, u8_t type,
53062 + u16_t* mac, u32_t* key)
53063 +{
53064 + u32_t cmd[(ZM_MAX_CMD_SIZE/4)];
53065 + u16_t ret;
53066 + u16_t i;
53067 +
53068 + zmw_get_wlan_dev(dev);
53069 + struct zsHpPriv* hpPriv=wd->hpPrivate;
53070 +
53071 +#if 0 /* remove to zfCoreSetKey() */
53072 + zmw_declare_for_critical_section();
53073 +
53074 + zmw_enter_critical_section(dev);
53075 + wd->sta.flagKeyChanging++;
53076 + zm_debug_msg1(" zfHpSetKey++++ ", wd->sta.flagKeyChanging);
53077 + zmw_leave_critical_section(dev);
53078 +#endif
53079 +
53080 + cmd[0] = 0x0000281C;
53081 + cmd[1] = ((u32_t)keyId<<16) + (u32_t)user;
53082 + cmd[2] = ((u32_t)mac[0]<<16) + (u32_t)type;
53083 + cmd[3] = ((u32_t)mac[2]<<16) + ((u32_t)mac[1]);
53084 +
53085 + for (i=0; i<4; i++)
53086 + {
53087 + cmd[4+i] = key[i];
53088 + }
53089 +
53090 + if (user < 64)
53091 + {
53092 + hpPriv->camRollCallTable |= ((u64_t) 1) << user;
53093 + }
53094 +
53095 + //ret = zfIssueCmd(dev, cmd, 32, ZM_OID_INTERNAL_WRITE, NULL);
53096 + ret = zfIssueCmd(dev, cmd, 32, ZM_CMD_SET_KEY, NULL);
53097 + return ret;
53098 +}
53099 +
53100 +
53101 +u32_t zfHpSetApPairwiseKey(zdev_t* dev, u16_t* staMacAddr, u8_t type,
53102 + u32_t* key, u32_t* micKey, u16_t staAid)
53103 +{
53104 + if ((staAid!=0) && (staAid<64))
53105 + {
53106 + zfHpSetKey(dev, (staAid-1), 0, type, staMacAddr, key);
53107 + if ((type == ZM_TKIP)
53108 +#ifdef ZM_ENABLE_CENC
53109 + || (type == ZM_CENC)
53110 +#endif //ZM_ENABLE_CENC
53111 + )
53112 + zfHpSetKey(dev, (staAid-1), 1, type, staMacAddr, micKey);
53113 + return 0;
53114 + }
53115 + return 1;
53116 +}
53117 +
53118 +u32_t zfHpSetApGroupKey(zdev_t* dev, u16_t* apMacAddr, u8_t type,
53119 + u32_t* key, u32_t* micKey, u16_t vapId)
53120 +{
53121 + zfHpSetKey(dev, ZM_USER_KEY_DEFAULT - 1 - vapId, 0, type, apMacAddr, key); // 6D18 modify from 0 to 1 ??
53122 + if ((type == ZM_TKIP)
53123 +#ifdef ZM_ENABLE_CENC
53124 + || (type == ZM_CENC)
53125 +#endif //ZM_ENABLE_CENC
53126 + )
53127 + zfHpSetKey(dev, ZM_USER_KEY_DEFAULT - 1 - vapId, 1, type, apMacAddr, micKey);
53128 + return 0;
53129 +}
53130 +
53131 +u32_t zfHpSetDefaultKey(zdev_t* dev, u8_t keyId, u8_t type, u32_t* key, u32_t* micKey)
53132 +{
53133 + u16_t macAddr[3] = {0, 0, 0};
53134 +
53135 + #ifdef ZM_ENABLE_IBSS_WPA2PSK
53136 + zmw_get_wlan_dev(dev);
53137 + struct zsHpPriv* hpPriv = wd->hpPrivate;
53138 +
53139 + if ( hpPriv->dot11Mode == ZM_HAL_80211_MODE_IBSS_WPA2PSK )
53140 + { /* If not wpa2psk , use traditional */
53141 + /* Because the bug of chip , defaultkey should follow the key map rule in register 700 */
53142 + if ( keyId == 0 )
53143 + zfHpSetKey(dev, ZM_USER_KEY_DEFAULT+keyId, 0, type, macAddr, key);
53144 + else
53145 + zfHpSetKey(dev, ZM_USER_KEY_DEFAULT+keyId, 1, type, macAddr, key);
53146 + }
53147 + else
53148 + zfHpSetKey(dev, ZM_USER_KEY_DEFAULT+keyId, 0, type, macAddr, key);
53149 + #else
53150 + zfHpSetKey(dev, ZM_USER_KEY_DEFAULT+keyId, 0, type, macAddr, key);
53151 + #endif
53152 + if ((type == ZM_TKIP)
53153 +
53154 +#ifdef ZM_ENABLE_CENC
53155 + || (type == ZM_CENC)
53156 +#endif //ZM_ENABLE_CENC
53157 + )
53158 + {
53159 + zfHpSetKey(dev, ZM_USER_KEY_DEFAULT+keyId, 1, type, macAddr, micKey);
53160 + }
53161 +
53162 + return 0;
53163 +}
53164 +
53165 +u32_t zfHpSetPerUserKey(zdev_t* dev, u8_t user, u8_t keyId, u8_t* mac, u8_t type, u32_t* key, u32_t* micKey)
53166 +{
53167 +#ifdef ZM_ENABLE_IBSS_WPA2PSK
53168 + zmw_get_wlan_dev(dev);
53169 + struct zsHpPriv* hpPriv = wd->hpPrivate;
53170 +
53171 + if ( hpPriv->dot11Mode == ZM_HAL_80211_MODE_IBSS_WPA2PSK )
53172 + { /* If not wpa2psk , use traditional */
53173 + if(keyId)
53174 + { /* Set Group Key */
53175 + zfHpSetKey(dev, user, 1, type, (u16_t *)mac, key);
53176 + }
53177 + else if(keyId == 0)
53178 + { /* Set Pairwise Key */
53179 + zfHpSetKey(dev, user, 0, type, (u16_t *)mac, key);
53180 + }
53181 + }
53182 + else
53183 + {
53184 + zfHpSetKey(dev, user, keyId, type, (u16_t *)mac, key);
53185 + }
53186 +#else
53187 + zfHpSetKey(dev, user, keyId, type, (u16_t *)mac, key);
53188 +#endif
53189 +
53190 + if ((type == ZM_TKIP)
53191 +#ifdef ZM_ENABLE_CENC
53192 + || (type == ZM_CENC)
53193 +#endif //ZM_ENABLE_CENC
53194 + )
53195 + {
53196 + zfHpSetKey(dev, user, keyId + 1, type, (u16_t *)mac, micKey);
53197 + }
53198 + return 0;
53199 +}
53200 +
53201 +/************************************************************************/
53202 +/* */
53203 +/* FUNCTION DESCRIPTION zfHpRemoveKey */
53204 +/* Remove key. */
53205 +/* */
53206 +/* INPUTS */
53207 +/* dev : device pointer */
53208 +/* */
53209 +/* OUTPUTS */
53210 +/* 0 : success */
53211 +/* other : fail */
53212 +/* */
53213 +/* AUTHOR */
53214 +/* Yuan-Gu Wei ZyDAS Technology Corporation 2006.6 */
53215 +/* */
53216 +/************************************************************************/
53217 +u16_t zfHpRemoveKey(zdev_t* dev, u16_t user)
53218 +{
53219 + u32_t cmd[(ZM_MAX_CMD_SIZE/4)];
53220 + u16_t ret = 0;
53221 +
53222 + cmd[0] = 0x00002904;
53223 + cmd[1] = (u32_t)user;
53224 +
53225 + ret = zfIssueCmd(dev, cmd, 8, ZM_OID_INTERNAL_WRITE, NULL);
53226 + return ret;
53227 +}
53228 +
53229 +
53230 +
53231 +/******************** DMA ********************/
53232 +u16_t zfHpStartRecv(zdev_t* dev)
53233 +{
53234 + zfDelayWriteInternalReg(dev, 0x1c3d30, 0x100);
53235 + zfFlushDelayWrite(dev);
53236 +
53237 + return 0;
53238 +}
53239 +
53240 +u16_t zfHpStopRecv(zdev_t* dev)
53241 +{
53242 + return 0;
53243 +}
53244 +
53245 +
53246 +/******************** MAC ********************/
53247 +void zfInitMac(zdev_t* dev)
53248 +{
53249 + /* ACK extension register */
53250 + // jhlee temp : change value 0x2c -> 0x40
53251 + // honda resolve short preamble problem : 0x40 -> 0x75
53252 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_ACK_EXTENSION, 0x40); // 0x28 -> 0x2c 6522:yflee
53253 +
53254 + /* TxQ0/1/2/3 Retry MAX=2 => transmit 3 times and degrade rate for retry */
53255 + /* PB42 AP crash issue: */
53256 + /* Workaround the crash issue by CTS/RTS, set retry max to zero for */
53257 + /* workaround tx underrun which enable CTS/RTS */
53258 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_RETRY_MAX, 0); // 0x11111 => 0
53259 +
53260 + /* use hardware MIC check */
53261 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_SNIFFER, 0x2000000);
53262 +
53263 + /* Set Rx threshold to 1600 */
53264 +#if ZM_LARGEPAYLOAD_TEST == 1
53265 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_RX_THRESHOLD, 0xc4000);
53266 +#else
53267 + #ifndef ZM_DISABLE_AMSDU8K_SUPPORT
53268 + /* The maximum A-MSDU length is 3839/7935 */
53269 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_RX_THRESHOLD, 0xc1f80);
53270 + #else
53271 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_RX_THRESHOLD, 0xc0f80);
53272 + #endif
53273 +#endif
53274 +
53275 + //zfDelayWriteInternalReg(dev, ZM_MAC_REG_DYNAMIC_SIFS_ACK, 0x10A);
53276 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_RX_PE_DELAY, 0x70);
53277 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_EIFS_AND_SIFS, 0xa144000);
53278 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_SLOT_TIME, 9<<10);
53279 +
53280 + /* CF-END mode */
53281 + zfDelayWriteInternalReg(dev, 0x1c3b2c, 0x19000000);
53282 +
53283 + //NAV protects ACK only (in TXOP)
53284 + zfDelayWriteInternalReg(dev, 0x1c3b38, 0x201);
53285 +
53286 +
53287 + /* Set Beacon PHY CTRL's TPC to 0x7, TA1=1 */
53288 + /* OTUS set AM to 0x1 */
53289 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_HT1, 0x8000170);
53290 +
53291 + /* TODO : wep backoff protection 0x63c */
53292 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_BACKOFF_PROTECT, 0x105);
53293 +
53294 + /* AGG test code*/
53295 + /* Aggregation MAX number and timeout */
53296 + zfDelayWriteInternalReg(dev, 0x1c3b9c, 0x10000a);
53297 + /* Filter any control frames, BAR is bit 24 */
53298 + zfDelayWriteInternalReg(dev, 0x1c368c, 0x0500ffff);
53299 + /* Enable deaggregator */
53300 + zfDelayWriteInternalReg(dev, 0x1c3c40, 0x1);
53301 +
53302 + /* Basic rate */
53303 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_BASIC_RATE, 0x150f);
53304 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_MANDATORY_RATE, 0x150f);
53305 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_RTS_CTS_RATE, 0x10b01bb);
53306 +
53307 + /* MIMO resposne control */
53308 + zfDelayWriteInternalReg(dev, 0x1c3694, 0x4003C1E);/* bit 26~28 otus-AM */
53309 +
53310 + /* Enable LED0 and LED1 */
53311 + zfDelayWriteInternalReg(dev, 0x1d0100, 0x3);
53312 + zfDelayWriteInternalReg(dev, 0x1d0104, 0x3);
53313 +
53314 + /* switch MAC to OTUS interface */
53315 + zfDelayWriteInternalReg(dev, 0x1c3600, 0x3);
53316 +
53317 + /* RXMAC A-MPDU length threshold */
53318 + zfDelayWriteInternalReg(dev, 0x1c3c50, 0xffff);
53319 +
53320 + /* Phy register read timeout */
53321 + zfDelayWriteInternalReg(dev, 0x1c3680, 0xf00008);
53322 +
53323 + /* Disable Rx TimeOut : workaround for BB.
53324 + * OTUS would interrupt the rx frame that sent by OWL TxUnderRun
53325 + * because OTUS rx timeout behavior, then OTUS would not ack the BA for
53326 + * this AMPDU from OWL.
53327 + * Fix by Perry Hwang. 2007/05/10.
53328 + * 0x1c362c : Rx timeout value : bit 27~16
53329 + */
53330 + zfDelayWriteInternalReg(dev, 0x1c362c, 0x0);
53331 +
53332 + //Set USB Rx stream mode MAX packet number to 2
53333 + // Max packet number = *0x1e1110 + 1
53334 + zfDelayWriteInternalReg(dev, 0x1e1110, 0x4);
53335 + //Set USB Rx stream mode timeout to 10us
53336 + zfDelayWriteInternalReg(dev, 0x1e1114, 0x80);
53337 +
53338 + //Set CPU clock frequency to 88/80MHz
53339 + zfDelayWriteInternalReg(dev, 0x1D4008, 0x73);
53340 +
53341 + //Set WLAN DMA interrupt mode : generate int per packet
53342 + zfDelayWriteInternalReg(dev, 0x1c3d7c, 0x110011);
53343 +
53344 + /* 7807 */
53345 + /* enable func : Reset FIFO1 and FIFO2 when queue-gnt is low */
53346 + /* 0x1c3bb0 Bit2 */
53347 + /* Disable SwReset in firmware for TxHang, enable reset FIFO func. */
53348 + zfDelayWriteInternalReg(dev, 0x1c3bb0, 0x4);
53349 +
53350 + /* Disables the CF_END frame */
53351 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_TXOP_NOT_ENOUGH_INDICATION, 0x141E0F48);
53352 +
53353 + /* Disable the SW Decrypt*/
53354 + zfDelayWriteInternalReg(dev, 0x1c3678, 0x70);
53355 + zfFlushDelayWrite(dev);
53356 + //---------------------
53357 +
53358 + /* Set TxQs CWMIN, CWMAX, AIFS and TXO to WME STA default. */
53359 + zfUpdateDefaultQosParameter(dev, 0);
53360 +
53361 + //zfSelAdcClk(dev, 0);
53362 +
53363 + return;
53364 +}
53365 +
53366 +
53367 +u16_t zfHpSetSnifferMode(zdev_t* dev, u16_t on)
53368 +{
53369 + if (on != 0)
53370 + {
53371 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_SNIFFER, 0x2000001);
53372 + }
53373 + else
53374 + {
53375 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_SNIFFER, 0x2000000);
53376 + }
53377 + zfFlushDelayWrite(dev);
53378 + return 0;
53379 +}
53380 +
53381 +
53382 +u16_t zfHpSetApStaMode(zdev_t* dev, u8_t mode)
53383 +{
53384 + zmw_get_wlan_dev(dev);
53385 +
53386 + struct zsHpPriv* hpPriv = wd->hpPrivate;
53387 + hpPriv->dot11Mode = mode;
53388 +
53389 + switch(mode)
53390 + {
53391 + case ZM_HAL_80211_MODE_AP:
53392 + zfDelayWriteInternalReg(dev, 0x1c3700, 0x0f0000a1);
53393 + zfDelayWriteInternalReg(dev, 0x1c3c40, 0x1);
53394 + break;
53395 +
53396 + case ZM_HAL_80211_MODE_STA:
53397 + zfDelayWriteInternalReg(dev, 0x1c3700, 0x0f000002);
53398 + zfDelayWriteInternalReg(dev, 0x1c3c40, 0x1);
53399 + break;
53400 +
53401 + case ZM_HAL_80211_MODE_IBSS_GENERAL:
53402 + zfDelayWriteInternalReg(dev, 0x1c3700, 0x0f000000);
53403 + zfDelayWriteInternalReg(dev, 0x1c3c40, 0x1);
53404 + break;
53405 +
53406 + case ZM_HAL_80211_MODE_IBSS_WPA2PSK:
53407 + zfDelayWriteInternalReg(dev, 0x1c3700, 0x0f0000e0);
53408 + zfDelayWriteInternalReg(dev, 0x1c3c40, 0x41); // for multiple ( > 2 ) stations IBSS network
53409 + break;
53410 +
53411 + default:
53412 + goto skip;
53413 + }
53414 +
53415 + zfFlushDelayWrite(dev);
53416 +
53417 +skip:
53418 + return 0;
53419 +}
53420 +
53421 +
53422 +u16_t zfHpSetBssid(zdev_t* dev, u8_t* bssidSrc)
53423 +{
53424 + u32_t address;
53425 + u16_t *bssid = (u16_t *)bssidSrc;
53426 +
53427 + address = bssid[0] + (((u32_t)bssid[1]) << 16);
53428 + zfDelayWriteInternalReg(dev, 0x1c3618, address);
53429 +
53430 + address = (u32_t)bssid[2];
53431 + zfDelayWriteInternalReg(dev, 0x1c361C, address);
53432 + zfFlushDelayWrite(dev);
53433 + return 0;
53434 +}
53435 +
53436 +
53437 +/************************************************************************/
53438 +/* */
53439 +/* FUNCTION DESCRIPTION zfHpUpdateQosParameter */
53440 +/* Update TxQs CWMIN, CWMAX, AIFS and TXOP. */
53441 +/* */
53442 +/* INPUTS */
53443 +/* dev : device pointer */
53444 +/* cwminTbl : CWMIN parameter for TxQs */
53445 +/* cwmaxTbl : CWMAX parameter for TxQs */
53446 +/* aifsTbl: AIFS parameter for TxQs */
53447 +/* txopTbl : TXOP parameter for TxQs */
53448 +/* */
53449 +/* OUTPUTS */
53450 +/* none */
53451 +/* */
53452 +/* AUTHOR */
53453 +/* Stephen ZyDAS Technology Corporation 2006.6 */
53454 +/* */
53455 +/************************************************************************/
53456 +u8_t zfHpUpdateQosParameter(zdev_t* dev, u16_t* cwminTbl, u16_t* cwmaxTbl,
53457 + u16_t* aifsTbl, u16_t* txopTbl)
53458 +{
53459 + zmw_get_wlan_dev(dev);
53460 + struct zsHpPriv* hpPriv = wd->hpPrivate;
53461 +
53462 + zm_msg0_mm(ZM_LV_0, "zfHalUpdateQosParameter()");
53463 +
53464 + /* Note : Do not change cwmin for Q0 in Ad Hoc mode */
53465 + /* otherwise driver will fail in Wifi beacon distribution */
53466 + if (hpPriv->dot11Mode == ZM_HAL_80211_MODE_STA)
53467 + {
53468 +#if 0 //Restore CWmin to improve down link throughput
53469 + //cheating in BE traffic
53470 + if (wd->sta.EnableHT == 1)
53471 + {
53472 + //cheating in BE traffic
53473 + cwminTbl[0] = 7;//15;
53474 + }
53475 +#endif
53476 + cwmaxTbl[0] = 127;//1023;
53477 + aifsTbl[0] = 2*9+10;//3 * 9 + 10;
53478 + }
53479 +
53480 + /* CWMIN and CWMAX */
53481 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC0_CW, cwminTbl[0]
53482 + + ((u32_t)cwmaxTbl[0]<<16));
53483 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC1_CW, cwminTbl[1]
53484 + + ((u32_t)cwmaxTbl[1]<<16));
53485 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC2_CW, cwminTbl[2]
53486 + + ((u32_t)cwmaxTbl[2]<<16));
53487 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC3_CW, cwminTbl[3]
53488 + + ((u32_t)cwmaxTbl[3]<<16));
53489 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC4_CW, cwminTbl[4]
53490 + + ((u32_t)cwmaxTbl[4]<<16));
53491 +
53492 + /* AIFS */
53493 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC1_AC0_AIFS, aifsTbl[0]
53494 + +((u32_t)aifsTbl[0]<<12)+((u32_t)aifsTbl[0]<<24));
53495 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC3_AC2_AIFS, (aifsTbl[0]>>8)
53496 + +((u32_t)aifsTbl[0]<<4)+((u32_t)aifsTbl[0]<<16));
53497 +
53498 + /* TXOP */
53499 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC1_AC0_TXOP, txopTbl[0]
53500 + + ((u32_t)txopTbl[1]<<16));
53501 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC3_AC2_TXOP, txopTbl[2]
53502 + + ((u32_t)txopTbl[3]<<16));
53503 +
53504 + zfFlushDelayWrite(dev);
53505 +
53506 + hpPriv->txop[0] = txopTbl[0];
53507 + hpPriv->txop[1] = txopTbl[1];
53508 + hpPriv->txop[2] = txopTbl[2];
53509 + hpPriv->txop[3] = txopTbl[3];
53510 + hpPriv->cwmin[0] = cwminTbl[0];
53511 + hpPriv->cwmax[0] = cwmaxTbl[0];
53512 + hpPriv->cwmin[1] = cwminTbl[1];
53513 + hpPriv->cwmax[1] = cwmaxTbl[1];
53514 +
53515 + return 0;
53516 +}
53517 +
53518 +
53519 +void zfHpSetAtimWindow(zdev_t* dev, u16_t atimWin)
53520 +{
53521 + zm_msg1_mm(ZM_LV_0, "Set ATIM window to ", atimWin);
53522 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_ATIM_WINDOW, atimWin);
53523 + zfFlushDelayWrite(dev);
53524 +}
53525 +
53526 +
53527 +void zfHpSetBasicRateSet(zdev_t* dev, u16_t bRateBasic, u16_t gRateBasic)
53528 +{
53529 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_BASIC_RATE, bRateBasic
53530 + | ((u16_t)gRateBasic<<8));
53531 + zfFlushDelayWrite(dev);
53532 +}
53533 +
53534 +
53535 +/* HT40 send by OFDM 6M */
53536 +/* otherwise use reg 0x638 */
53537 +void zfHpSetRTSCTSRate(zdev_t* dev, u32_t rate)
53538 +{
53539 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_RTS_CTS_RATE, rate);
53540 + zfFlushDelayWrite(dev);
53541 +}
53542 +
53543 +void zfHpSetMacAddress(zdev_t* dev, u16_t* macAddr, u16_t macAddrId)
53544 +{
53545 + if (macAddrId == 0)
53546 + {
53547 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_MAC_ADDR_L,
53548 + (((u32_t)macAddr[1])<<16) | macAddr[0]);
53549 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_MAC_ADDR_H, macAddr[2]);
53550 + }
53551 + else if (macAddrId <= 7)
53552 + {
53553 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_ACK_TABLE+((macAddrId-1)*8),
53554 + macAddr[0] + ((u32_t)macAddr[1]<<16));
53555 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_ACK_TABLE+((macAddrId-1)*8)+4,
53556 + macAddr[2]);
53557 + }
53558 + zfFlushDelayWrite(dev);
53559 +}
53560 +
53561 +void zfHpSetMulticastList(zdev_t* dev, u8_t size, u8_t* pList, u8_t bAllMulticast)
53562 +{
53563 + struct zsMulticastAddr* pMacList = (struct zsMulticastAddr*) pList;
53564 + u8_t i;
53565 + u32_t value;
53566 + u32_t swRegMulHashValueH, swRegMulHashValueL;
53567 +
53568 + swRegMulHashValueH = 0x80000000;
53569 + swRegMulHashValueL = 0;
53570 +
53571 + if ( bAllMulticast )
53572 + {
53573 + swRegMulHashValueH = swRegMulHashValueL = ~0;
53574 + }
53575 + else
53576 + {
53577 + for(i=0; i<size; i++)
53578 + {
53579 + value = pMacList[i].addr[5] >> 2;
53580 +
53581 + if ( value < 32 )
53582 + {
53583 + swRegMulHashValueL |= (1 << value);
53584 + }
53585 + else
53586 + {
53587 + swRegMulHashValueH |= (1 << (value-32));
53588 + }
53589 + }
53590 + }
53591 +
53592 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_GROUP_HASH_TBL_L,
53593 + swRegMulHashValueL);
53594 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_GROUP_HASH_TBL_H,
53595 + swRegMulHashValueH);
53596 + zfFlushDelayWrite(dev);
53597 + return;
53598 +}
53599 +
53600 +/******************** Beacon ********************/
53601 +void zfHpEnableBeacon(zdev_t* dev, u16_t mode, u16_t bcnInterval, u16_t dtim, u8_t enableAtim)
53602 +{
53603 + u32_t value;
53604 +
53605 + zmw_get_wlan_dev(dev);
53606 +
53607 + /* Beacon Ready */
53608 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_CTRL, 0);
53609 + /* Beacon DMA buffer address */
53610 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_ADDR, ZM_BEACON_BUFFER_ADDRESS);
53611 +
53612 + value = bcnInterval;
53613 +
53614 + value |= (((u32_t) dtim) << 16);
53615 +
53616 + if (mode == ZM_MODE_AP)
53617 + {
53618 +
53619 + value |= 0x1000000;
53620 + }
53621 + else if (mode == ZM_MODE_IBSS)
53622 + {
53623 + value |= 0x2000000;
53624 +
53625 + if ( enableAtim )
53626 + {
53627 + value |= 0x4000000;
53628 + }
53629 + ((struct zsHpPriv*)wd->hpPrivate)->ibssBcnEnabled = 1;
53630 + ((struct zsHpPriv*)wd->hpPrivate)->ibssBcnInterval = value;
53631 + }
53632 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_PRETBTT, (bcnInterval-6)<<16);
53633 +
53634 + /* Beacon period and beacon enable */
53635 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_PERIOD, value);
53636 + zfFlushDelayWrite(dev);
53637 +}
53638 +
53639 +void zfHpDisableBeacon(zdev_t* dev)
53640 +{
53641 + zmw_get_wlan_dev(dev);
53642 +
53643 + ((struct zsHpPriv*)wd->hpPrivate)->ibssBcnEnabled = 0;
53644 +
53645 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_PERIOD, 0);
53646 + zfFlushDelayWrite(dev);
53647 +}
53648 +
53649 +void zfHpLedCtrl(zdev_t* dev, u16_t ledId, u8_t mode)
53650 +{
53651 + u16_t state;
53652 + zmw_get_wlan_dev(dev);
53653 +
53654 + //zm_debug_msg1("LED ID=", ledId);
53655 + //zm_debug_msg1("LED mode=", mode);
53656 + if (ledId < 2)
53657 + {
53658 + if (((struct zsHpPriv*)wd->hpPrivate)->ledMode[ledId] != mode)
53659 + {
53660 + ((struct zsHpPriv*)wd->hpPrivate)->ledMode[ledId] = mode;
53661 +
53662 + state = ((struct zsHpPriv*)wd->hpPrivate)->ledMode[0]
53663 + | (((struct zsHpPriv*)wd->hpPrivate)->ledMode[1]<<1);
53664 + zfDelayWriteInternalReg(dev, 0x1d0104, state);
53665 + zfFlushDelayWrite(dev);
53666 + //zm_debug_msg0("Update LED");
53667 + }
53668 + }
53669 +}
53670 +
53671 +/************************************************************************/
53672 +/* */
53673 +/* FUNCTION DESCRIPTION zfHpResetTxRx */
53674 +/* Reset Tx and Rx Desc. */
53675 +/* */
53676 +/* INPUTS */
53677 +/* dev : device pointer */
53678 +/* */
53679 +/* OUTPUTS */
53680 +/* 0 : success */
53681 +/* other : fail */
53682 +/* */
53683 +/* AUTHOR */
53684 +/* Chao-Wen Yang ZyDAS Technology Corporation 2007.3 */
53685 +/* */
53686 +/************************************************************************/
53687 +u16_t zfHpUsbReset(zdev_t* dev)
53688 +{
53689 + u32_t cmd[(ZM_MAX_CMD_SIZE/4)];
53690 + u16_t ret = 0;
53691 +
53692 + //zm_debug_msg0("CWY - Reset Tx and Rx");
53693 +
53694 + cmd[0] = 0 | (ZM_CMD_RESET << 8);
53695 +
53696 + ret = zfIssueCmd(dev, cmd, 4, ZM_OID_INTERNAL_WRITE, NULL);
53697 + return ret;
53698 +}
53699 +
53700 +u16_t zfHpDKReset(zdev_t* dev, u8_t flag)
53701 +{
53702 + u32_t cmd[(ZM_MAX_CMD_SIZE/4)];
53703 + u16_t ret = 0;
53704 +
53705 + //zm_debug_msg0("CWY - Reset Tx and Rx");
53706 +
53707 + cmd[0] = 4 | (ZM_CMD_DKRESET << 8);
53708 + cmd[1] = flag;
53709 +
53710 + ret = zfIssueCmd(dev, cmd, 8, ZM_OID_INTERNAL_WRITE, NULL);
53711 + return ret;
53712 +}
53713 +
53714 +u32_t zfHpCwmUpdate(zdev_t* dev)
53715 +{
53716 + //u32_t cmd[3];
53717 + //u16_t ret;
53718 + //
53719 + //cmd[0] = 0x00000008;
53720 + //cmd[1] = 0x1c36e8;
53721 + //cmd[2] = 0x1c36ec;
53722 + //
53723 + //ret = zfIssueCmd(dev, cmd, 12, ZM_CWM_READ, 0);
53724 + //return ret;
53725 + zmw_get_wlan_dev(dev);
53726 +
53727 + struct zsHpPriv* hpPriv=wd->hpPrivate;
53728 +
53729 + zfCoreCwmBusy(dev, zfCwmIsExtChanBusy(hpPriv->ctlBusy, hpPriv->extBusy));
53730 +
53731 + hpPriv->ctlBusy = 0;
53732 + hpPriv->extBusy = 0;
53733 +
53734 + return 0;
53735 +}
53736 +
53737 +u32_t zfHpAniUpdate(zdev_t* dev)
53738 +{
53739 + u32_t cmd[5];
53740 + u16_t ret;
53741 +
53742 + cmd[0] = 0x00000010;
53743 + cmd[1] = 0x1c36e8;
53744 + cmd[2] = 0x1c36ec;
53745 + cmd[3] = 0x1c3cb4;
53746 + cmd[4] = 0x1c3cb8;
53747 +
53748 + ret = zfIssueCmd(dev, cmd, 20, ZM_ANI_READ, 0);
53749 + return ret;
53750 +}
53751 +
53752 +/*
53753 + * Update Beacon RSSI in ANI
53754 + */
53755 +u32_t zfHpAniUpdateRssi(zdev_t* dev, u8_t rssi)
53756 +{
53757 + zmw_get_wlan_dev(dev);
53758 +
53759 + struct zsHpPriv* hpPriv=wd->hpPrivate;
53760 +
53761 + hpPriv->stats.ast_nodestats.ns_avgbrssi = rssi;
53762 +
53763 + return 0;
53764 +}
53765 +
53766 +#define ZM_SEEPROM_MAC_ADDRESS_OFFSET (0x1400 + (0x106<<1))
53767 +#define ZM_SEEPROM_REGDOMAIN_OFFSET (0x1400 + (0x104<<1))
53768 +#define ZM_SEEPROM_VERISON_OFFSET (0x1400 + (0x102<<1))
53769 +#define ZM_SEEPROM_HARDWARE_TYPE_OFFSET (0x1374)
53770 +#define ZM_SEEPROM_HW_HEAVY_CLIP (0x161c)
53771 +
53772 +u32_t zfHpGetMacAddress(zdev_t* dev)
53773 +{
53774 + u32_t cmd[7];
53775 + u16_t ret;
53776 +
53777 + cmd[0] = 0x00000000 | 24;
53778 + cmd[1] = ZM_SEEPROM_MAC_ADDRESS_OFFSET;
53779 + cmd[2] = ZM_SEEPROM_MAC_ADDRESS_OFFSET+4;
53780 + cmd[3] = ZM_SEEPROM_REGDOMAIN_OFFSET;
53781 + cmd[4] = ZM_SEEPROM_VERISON_OFFSET;
53782 + cmd[5] = ZM_SEEPROM_HARDWARE_TYPE_OFFSET;
53783 + cmd[6] = ZM_SEEPROM_HW_HEAVY_CLIP;
53784 +
53785 + ret = zfIssueCmd(dev, cmd, 28, ZM_MAC_READ, 0);
53786 + return ret;
53787 +}
53788 +
53789 +u32_t zfHpGetTransmitPower(zdev_t* dev)
53790 +{
53791 + zmw_get_wlan_dev(dev);
53792 +
53793 + struct zsHpPriv* hpPriv = wd->hpPrivate;
53794 + u16_t tpc = 0;
53795 +
53796 + if (hpPriv->hwFrequency < 3000) {
53797 + tpc = hpPriv->tPow2x2g[0] & 0x3f;
53798 + wd->maxTxPower2 &= 0x3f;
53799 + tpc = (tpc > wd->maxTxPower2)? wd->maxTxPower2 : tpc;
53800 + } else {
53801 + tpc = hpPriv->tPow2x5g[0] & 0x3f;
53802 + wd->maxTxPower5 &= 0x3f;
53803 + tpc = (tpc > wd->maxTxPower5)? wd->maxTxPower5 : tpc;
53804 + }
53805 +
53806 + return tpc;
53807 +}
53808 +
53809 +u8_t zfHpGetMinTxPower(zdev_t* dev)
53810 +{
53811 + zmw_get_wlan_dev(dev);
53812 +
53813 + struct zsHpPriv* hpPriv = wd->hpPrivate;
53814 + u8_t tpc = 0;
53815 +
53816 + if (hpPriv->hwFrequency < 3000)
53817 + {
53818 + if(wd->BandWidth40)
53819 + {
53820 + //40M
53821 + tpc = (hpPriv->tPow2x2gHt40[7]&0x3f);
53822 + }
53823 + else
53824 + {
53825 + //20M
53826 + tpc = (hpPriv->tPow2x2gHt20[7]&0x3f);
53827 + }
53828 + }
53829 + else
53830 + {
53831 + if(wd->BandWidth40)
53832 + {
53833 + //40M
53834 + tpc = (hpPriv->tPow2x5gHt40[7]&0x3f);
53835 + }
53836 + else
53837 + {
53838 + //20M
53839 + tpc = (hpPriv->tPow2x5gHt20[7]&0x3f);
53840 + }
53841 + }
53842 +
53843 + return tpc;
53844 +}
53845 +
53846 +u8_t zfHpGetMaxTxPower(zdev_t* dev)
53847 +{
53848 + zmw_get_wlan_dev(dev);
53849 +
53850 + struct zsHpPriv* hpPriv = wd->hpPrivate;
53851 + u8_t tpc = 0;
53852 +
53853 + if (hpPriv->hwFrequency < 3000)
53854 + {
53855 + tpc = (hpPriv->tPow2xCck[0]&0x3f);
53856 + }
53857 + else
53858 + {
53859 + tpc =(hpPriv->tPow2x5g[0]&0x3f);
53860 + }
53861 +
53862 + return tpc;
53863 +}
53864 +
53865 +u32_t zfHpLoadEEPROMFromFW(zdev_t* dev)
53866 +{
53867 + u32_t cmd[16];
53868 + u32_t ret=0, i, j;
53869 + zmw_get_wlan_dev(dev);
53870 +
53871 + i = ((struct zsHpPriv*)wd->hpPrivate)->eepromImageRdReq;
53872 +
53873 + cmd[0] = ZM_HAL_MAX_EEPROM_PRQ*4;
53874 +
53875 + for (j=0; j<ZM_HAL_MAX_EEPROM_PRQ; j++)
53876 + {
53877 + cmd[j+1] = 0x1000 + (((i*ZM_HAL_MAX_EEPROM_PRQ) + j)*4);
53878 + }
53879 +
53880 + ret = zfIssueCmd(dev, cmd, (ZM_HAL_MAX_EEPROM_PRQ+1)*4, ZM_EEPROM_READ, 0);
53881 +
53882 + return ret;
53883 +}
53884 +
53885 +void zfHpHeartBeat(zdev_t* dev)
53886 +{
53887 + zmw_get_wlan_dev(dev);
53888 + struct zsHpPriv* hpPriv=wd->hpPrivate;
53889 + u8_t polluted = 0;
53890 + u8_t ackTpc;
53891 +
53892 + /* Workaround : Make OTUS fire more beacon in ad hoc mode in 2.4GHz */
53893 + if (hpPriv->ibssBcnEnabled != 0)
53894 + {
53895 + if (hpPriv->hwFrequency <= ZM_CH_G_14)
53896 + {
53897 + if ((wd->tick % 10) == 0)
53898 + {
53899 + if ((wd->tick % 40) == 0)
53900 + {
53901 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_PERIOD, hpPriv->ibssBcnInterval-1);
53902 + polluted = 1;
53903 + }
53904 + else
53905 + {
53906 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_PERIOD, hpPriv->ibssBcnInterval);
53907 + polluted = 1;
53908 + }
53909 + }
53910 + }
53911 + }
53912 +
53913 + if ((wd->tick & 0x3f) == 0x25)
53914 + {
53915 + /* Workaround for beacon stuck after SW reset */
53916 + if (hpPriv->ibssBcnEnabled != 0)
53917 + {
53918 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_ADDR, ZM_BEACON_BUFFER_ADDRESS);
53919 + polluted = 1;
53920 + }
53921 +
53922 + //DbgPrint("hpPriv->aggMaxDurationBE=%d", hpPriv->aggMaxDurationBE);
53923 + //DbgPrint("wd->sta.avgSizeOfReceivePackets=%d", wd->sta.avgSizeOfReceivePackets);
53924 + if (( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
53925 + && (zfStaIsConnected(dev))
53926 + && (wd->sta.EnableHT == 1) //11n mode
53927 + && (wd->BandWidth40 == 1) //40MHz mode
53928 + && (wd->sta.enableDrvBA ==0) //Marvel AP
53929 + && (hpPriv->aggMaxDurationBE > 2000) //BE TXOP > 2ms
53930 + && (wd->sta.avgSizeOfReceivePackets > 1420))
53931 + {
53932 + zfDelayWriteInternalReg(dev, 0x1c3b9c, 0x8000a);
53933 + polluted = 1;
53934 + }
53935 + else
53936 + {
53937 + zfDelayWriteInternalReg(dev, 0x1c3b9c, hpPriv->aggPktNum);
53938 + polluted = 1;
53939 + }
53940 +
53941 + if (wd->dynamicSIFSEnable == 0)
53942 + {
53943 + if (( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
53944 + && (zfStaIsConnected(dev))
53945 + && (wd->sta.EnableHT == 1) //11n mode
53946 + && (wd->BandWidth40 == 0) //20MHz mode
53947 + && (wd->sta.enableDrvBA ==0)) //Marvel AP
53948 + {
53949 + zfDelayWriteInternalReg(dev, 0x1c3698, 0x5144000);
53950 + polluted = 1;
53951 + }
53952 + else
53953 + {
53954 + zfDelayWriteInternalReg(dev, 0x1c3698, 0xA144000);
53955 + polluted = 1;
53956 + }
53957 + }
53958 + else
53959 + {
53960 + if (( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
53961 + && (zfStaIsConnected(dev))
53962 + && (wd->sta.EnableHT == 1) //11n mode
53963 + && (wd->sta.athOwlAp == 1)) //Atheros AP
53964 + {
53965 + if (hpPriv->retransmissionEvent)
53966 + {
53967 + switch(hpPriv->latestSIFS)
53968 + {
53969 + case 0:
53970 + hpPriv->latestSIFS = 1;
53971 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_EIFS_AND_SIFS, 0x8144000);
53972 + break;
53973 + case 1:
53974 + hpPriv->latestSIFS = 2;
53975 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_EIFS_AND_SIFS, 0xa144000);
53976 + break;
53977 + case 2:
53978 + hpPriv->latestSIFS = 3;
53979 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_EIFS_AND_SIFS, 0xc144000);
53980 + break;
53981 + case 3:
53982 + hpPriv->latestSIFS = 0;
53983 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_EIFS_AND_SIFS, 0xa144000);
53984 + break;
53985 + default:
53986 + hpPriv->latestSIFS = 0;
53987 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_EIFS_AND_SIFS, 0xa144000);
53988 + break;
53989 + }
53990 + polluted = 1;
53991 + zm_debug_msg1("##### Correct Tx retransmission issue #####, ", hpPriv->latestSIFS);
53992 + hpPriv->retransmissionEvent = 0;
53993 + }
53994 + }
53995 + else
53996 + {
53997 + hpPriv->latestSIFS = 0;
53998 + hpPriv->retransmissionEvent = 0;
53999 + zfDelayWriteInternalReg(dev, 0x1c3698, 0xA144000);
54000 + polluted = 1;
54001 + }
54002 + }
54003 +
54004 + if ((wd->sta.bScheduleScan == FALSE) && (wd->sta.bChannelScan == FALSE))
54005 + {
54006 +#define ZM_SIGNAL_THRESHOLD 66
54007 + if (( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
54008 + && (zfStaIsConnected(dev))
54009 + && (wd->SignalStrength > ZM_SIGNAL_THRESHOLD))
54010 + {
54011 + /* remove state handle, always rewrite register setting */
54012 + //if (hpPriv->strongRSSI == 0)
54013 + {
54014 + hpPriv->strongRSSI = 1;
54015 + /* Strong RSSI, set ACK to one Tx stream and lower Tx power 7dbm */
54016 + if (hpPriv->currentAckRtsTpc > (14+10))
54017 + {
54018 + ackTpc = hpPriv->currentAckRtsTpc - 14;
54019 + }
54020 + else
54021 + {
54022 + ackTpc = 10;
54023 + }
54024 + zfDelayWriteInternalReg(dev, 0x1c3694, ((ackTpc) << 20) | (0x1<<26));
54025 + zfDelayWriteInternalReg(dev, 0x1c3bb4, ((ackTpc) << 5 ) | (0x1<<11) |
54026 + ((ackTpc) << 21) | (0x1<<27) );
54027 + polluted = 1;
54028 + }
54029 + }
54030 + else
54031 + {
54032 + /* remove state handle, always rewrite register setting */
54033 + //if (hpPriv->strongRSSI == 1)
54034 + {
54035 + hpPriv->strongRSSI = 0;
54036 + if (hpPriv->halCapability & ZM_HP_CAP_11N_ONE_TX_STREAM)
54037 + {
54038 + zfDelayWriteInternalReg(dev, 0x1c3694, ((hpPriv->currentAckRtsTpc&0x3f) << 20) | (0x1<<26));
54039 + zfDelayWriteInternalReg(dev, 0x1c3bb4, ((hpPriv->currentAckRtsTpc&0x3f) << 5 ) | (0x1<<11) |
54040 + ((hpPriv->currentAckRtsTpc&0x3f) << 21) | (0x1<<27) );
54041 + }
54042 + else
54043 + {
54044 + zfDelayWriteInternalReg(dev, 0x1c3694, ((hpPriv->currentAckRtsTpc&0x3f) << 20) | (0x5<<26));
54045 + zfDelayWriteInternalReg(dev, 0x1c3bb4, ((hpPriv->currentAckRtsTpc&0x3f) << 5 ) | (0x5<<11) |
54046 + ((hpPriv->currentAckRtsTpc&0x3f) << 21) | (0x5<<27) );
54047 + }
54048 + polluted = 1;
54049 + }
54050 + }
54051 +#undef ZM_SIGNAL_THRESHOLD
54052 + }
54053 +
54054 + if ((hpPriv->halCapability & ZM_HP_CAP_11N_ONE_TX_STREAM) == 0)
54055 + {
54056 + if ((wd->sta.bScheduleScan == FALSE) && (wd->sta.bChannelScan == FALSE))
54057 + {
54058 + #define ZM_RX_SIGNAL_THRESHOLD_H 71
54059 + #define ZM_RX_SIGNAL_THRESHOLD_L 66
54060 + u8_t rxSignalThresholdH = ZM_RX_SIGNAL_THRESHOLD_H;
54061 + u8_t rxSignalThresholdL = ZM_RX_SIGNAL_THRESHOLD_L;
54062 + #undef ZM_RX_SIGNAL_THRESHOLD_H
54063 + #undef ZM_RX_SIGNAL_THRESHOLD_L
54064 +
54065 + if (( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
54066 + && (zfStaIsConnected(dev))
54067 + && (wd->SignalStrength > rxSignalThresholdH)
54068 + )//&& (hpPriv->rxStrongRSSI == 0))
54069 + {
54070 + hpPriv->rxStrongRSSI = 1;
54071 + //zfDelayWriteInternalReg(dev, 0x1c5964, 0x1220);
54072 + //zfDelayWriteInternalReg(dev, 0x1c5960, 0x900);
54073 + //zfDelayWriteInternalReg(dev, 0x1c6960, 0x900);
54074 + //zfDelayWriteInternalReg(dev, 0x1c7960, 0x900);
54075 + if ((hpPriv->eepromImage[0x100+0x110*2/4]&0xff) == 0x80) //FEM TYPE
54076 + {
54077 + if (hpPriv->hwFrequency <= ZM_CH_G_14)
54078 + {
54079 + zfDelayWriteInternalReg(dev, 0x1c8960, 0x900);
54080 + }
54081 + else
54082 + {
54083 + zfDelayWriteInternalReg(dev, 0x1c8960, 0x9b49);
54084 + }
54085 + }
54086 + else
54087 + {
54088 + zfDelayWriteInternalReg(dev, 0x1c8960, 0x0900);
54089 + }
54090 + polluted = 1;
54091 + }
54092 + else if (( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
54093 + && (zfStaIsConnected(dev))
54094 + && (wd->SignalStrength > rxSignalThresholdL)
54095 + )//&& (hpPriv->rxStrongRSSI == 1))
54096 + {
54097 + //Do nothing to prevent frequently Rx switching
54098 + }
54099 + else
54100 + {
54101 + /* remove state handle, always rewrite register setting */
54102 + //if (hpPriv->rxStrongRSSI == 1)
54103 + {
54104 + hpPriv->rxStrongRSSI = 0;
54105 + //zfDelayWriteInternalReg(dev, 0x1c5964, 0x1120);
54106 + //zfDelayWriteInternalReg(dev, 0x1c5960, 0x9b40);
54107 + //zfDelayWriteInternalReg(dev, 0x1c6960, 0x9b40);
54108 + //zfDelayWriteInternalReg(dev, 0x1c7960, 0x9b40);
54109 + if ((hpPriv->eepromImage[0x100+0x110*2/4]&0xff) == 0x80) //FEM TYPE
54110 + {
54111 + if (hpPriv->hwFrequency <= ZM_CH_G_14)
54112 + {
54113 + zfDelayWriteInternalReg(dev, 0x1c8960, 0x9b49);
54114 + }
54115 + else
54116 + {
54117 + zfDelayWriteInternalReg(dev, 0x1c8960, 0x0900);
54118 + }
54119 + }
54120 + else
54121 + {
54122 + zfDelayWriteInternalReg(dev, 0x1c8960, 0x9b40);
54123 + }
54124 + polluted = 1;
54125 + }
54126 + }
54127 +
54128 + }
54129 + }
54130 +
54131 + if (hpPriv->usbAcSendBytes[3] > (hpPriv->usbAcSendBytes[0]*2))
54132 + {
54133 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC1_AC0_TXOP, hpPriv->txop[3]);
54134 + polluted = 1;
54135 + }
54136 + else if (hpPriv->usbAcSendBytes[2] > (hpPriv->usbAcSendBytes[0]*2))
54137 + {
54138 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC1_AC0_TXOP, hpPriv->txop[2]);
54139 + polluted = 1;
54140 + }
54141 + else if (hpPriv->usbAcSendBytes[1] > (hpPriv->usbAcSendBytes[0]*2))
54142 + {
54143 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC0_CW, hpPriv->cwmin[1]+((u32_t)hpPriv->cwmax[1]<<16));
54144 + polluted = 1;
54145 + }
54146 + else
54147 + {
54148 + if (hpPriv->slotType == 1)
54149 + {
54150 + if ((wd->sta.enableDrvBA ==0) //Marvel AP
54151 + && (hpPriv->aggMaxDurationBE > 2000)) //BE TXOP > 2ms
54152 + {
54153 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC0_CW, (hpPriv->cwmin[0]/2)+((u32_t)hpPriv->cwmax[0]<<16));
54154 + }
54155 + else
54156 + {
54157 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC0_CW, hpPriv->cwmin[0]+((u32_t)hpPriv->cwmax[0]<<16));
54158 + }
54159 + polluted = 1;
54160 + }
54161 + else
54162 + {
54163 + /* Compensation for 20us slot time */
54164 + //zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC0_CW, 58+((u32_t)hpPriv->cwmax[0]<<16));
54165 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC0_CW, hpPriv->cwmin[0]+((u32_t)hpPriv->cwmax[0]<<16));
54166 + polluted = 1;
54167 + }
54168 +
54169 + if ((wd->sta.SWEncryptEnable & (ZM_SW_TKIP_ENCRY_EN|ZM_SW_WEP_ENCRY_EN)) == 0)
54170 + {
54171 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC1_AC0_TXOP, hpPriv->txop[0]);
54172 + polluted = 1;
54173 + }
54174 + else
54175 + {
54176 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_AC1_AC0_TXOP, 0x30);
54177 + polluted = 1;
54178 + }
54179 +
54180 + }
54181 + hpPriv->usbAcSendBytes[3] = 0;
54182 + hpPriv->usbAcSendBytes[2] = 0;
54183 + hpPriv->usbAcSendBytes[1] = 0;
54184 + hpPriv->usbAcSendBytes[0] = 0;
54185 + }
54186 +
54187 + if (polluted == 1)
54188 + {
54189 + zfFlushDelayWrite(dev);
54190 + }
54191 +
54192 + return;
54193 +}
54194 +
54195 +/*
54196 + * 0x1d4008 : AHB, DAC, ADC clock selection
54197 + * bit1~0 AHB_CLK : AHB clock selection,
54198 + * 00 : OSC 40MHz;
54199 + * 01 : 20MHz in A mode, 22MHz in G mode;
54200 + * 10 : 40MHz in A mode, 44MHz in G mode;
54201 + * 11 : 80MHz in A mode, 88MHz in G mode.
54202 + * bit3~2 CLK_SEL : Select the clock source of clk160 in ADDAC.
54203 + * 00 : PLL divider's output;
54204 + * 01 : PLL divider's output divided by 2;
54205 + * 10 : PLL divider's output divided by 4;
54206 + * 11 : REFCLK from XTALOSCPAD.
54207 + */
54208 +void zfSelAdcClk(zdev_t* dev, u8_t bw40, u32_t frequency)
54209 +{
54210 + if(bw40 == 1)
54211 + {
54212 + //zfDelayWriteInternalReg(dev, 0x1D4008, 0x73);
54213 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_DYNAMIC_SIFS_ACK, 0x10A);
54214 + zfFlushDelayWrite(dev);
54215 + }
54216 + else
54217 + {
54218 + //zfDelayWriteInternalReg(dev, 0x1D4008, 0x70);
54219 + if ( frequency <= ZM_CH_G_14 )
54220 + {
54221 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_DYNAMIC_SIFS_ACK, 0x105);
54222 + }
54223 + else
54224 + {
54225 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_DYNAMIC_SIFS_ACK, 0x104);
54226 + }
54227 + zfFlushDelayWrite(dev);
54228 + }
54229 +}
54230 +
54231 +u32_t zfHpEchoCommand(zdev_t* dev, u32_t value)
54232 +{
54233 + u32_t cmd[2];
54234 + u16_t ret;
54235 +
54236 + cmd[0] = 0x00008004;
54237 + cmd[1] = value;
54238 +
54239 + ret = zfIssueCmd(dev, cmd, 8, ZM_CMD_ECHO, NULL);
54240 + return ret;
54241 +}
54242 +
54243 +#ifdef ZM_DRV_INIT_USB_MODE
54244 +
54245 +#define ZM_USB_US_STREAM_MODE 0x00000000
54246 +#define ZM_USB_US_PACKET_MODE 0x00000008
54247 +#define ZM_USB_DS_ENABLE 0x00000001
54248 +#define ZM_USB_US_ENABLE 0x00000002
54249 +
54250 +#define ZM_USB_RX_STREAM_4K 0x00000000
54251 +#define ZM_USB_RX_STREAM_8K 0x00000010
54252 +#define ZM_USB_RX_STREAM_16K 0x00000020
54253 +#define ZM_USB_RX_STREAM_32K 0x00000030
54254 +
54255 +#define ZM_USB_TX_STREAM_MODE 0x00000040
54256 +
54257 +#define ZM_USB_MODE_CTRL_REG 0x001E1108
54258 +
54259 +void zfInitUsbMode(zdev_t* dev)
54260 +{
54261 + u32_t mode;
54262 + zmw_get_wlan_dev(dev);
54263 +
54264 + /* TODO: Set USB mode by reading registery */
54265 + mode = ZM_USB_DS_ENABLE | ZM_USB_US_ENABLE | ZM_USB_US_PACKET_MODE;
54266 +
54267 + zfDelayWriteInternalReg(dev, ZM_USB_MODE_CTRL_REG, mode);
54268 + zfFlushDelayWrite(dev);
54269 +}
54270 +#endif
54271 +
54272 +void zfDumpEepBandEdges(struct ar5416Eeprom* eepromImage);
54273 +void zfPrintTargetPower2G(u8_t* tPow2xCck, u8_t* tPow2x2g, u8_t* tPow2x2gHt20, u8_t* tPow2x2gHt40);
54274 +void zfPrintTargetPower5G(u8_t* tPow2x5g, u8_t* tPow2x5gHt20, u8_t* tPow2x5gHt40);
54275 +
54276 +
54277 +s32_t zfInterpolateFunc(s32_t x, s32_t x1, s32_t y1, s32_t x2, s32_t y2)
54278 +{
54279 + s32_t y;
54280 +
54281 + if (y2 == y1)
54282 + {
54283 + y = y1;
54284 + }
54285 + else if (x == x1)
54286 + {
54287 + y = y1;
54288 + }
54289 + else if (x == x2)
54290 + {
54291 + y = y2;
54292 + }
54293 + else if (x2 != x1)
54294 + {
54295 + y = y1 + (((y2-y1) * (x-x1))/(x2-x1));
54296 + }
54297 + else
54298 + {
54299 + y = y1;
54300 + }
54301 +
54302 + return y;
54303 +}
54304 +
54305 +//#define ZM_ENABLE_TPC_WINDOWS_DEBUG
54306 +//#define ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG
54307 +
54308 +/* the tx power offset workaround for ART vs NDIS/MDK */
54309 +#define HALTX_POWER_OFFSET 0
54310 +
54311 +u8_t zfInterpolateFuncX(u8_t x, u8_t x1, u8_t y1, u8_t x2, u8_t y2)
54312 +{
54313 + s32_t y;
54314 + s32_t inc;
54315 +
54316 + #define ZM_MULTIPLIER 8
54317 + y = zfInterpolateFunc((s32_t)x<<ZM_MULTIPLIER,
54318 + (s32_t)x1<<ZM_MULTIPLIER,
54319 + (s32_t)y1<<ZM_MULTIPLIER,
54320 + (s32_t)x2<<ZM_MULTIPLIER,
54321 + (s32_t)y2<<ZM_MULTIPLIER);
54322 +
54323 + inc = (y & (1<<(ZM_MULTIPLIER-1))) >> (ZM_MULTIPLIER-1);
54324 + y = (y >> ZM_MULTIPLIER) + inc;
54325 + #undef ZM_MULTIPLIER
54326 +
54327 + return (u8_t)y;
54328 +}
54329 +
54330 +u8_t zfGetInterpolatedValue(u8_t x, u8_t* x_array, u8_t* y_array)
54331 +{
54332 + s32_t y;
54333 + u16_t xIndex;
54334 +
54335 + if (x <= x_array[1])
54336 + {
54337 + xIndex = 0;
54338 + }
54339 + else if (x <= x_array[2])
54340 + {
54341 + xIndex = 1;
54342 + }
54343 + else if (x <= x_array[3])
54344 + {
54345 + xIndex = 2;
54346 + }
54347 + else //(x > x_array[3])
54348 + {
54349 + xIndex = 3;
54350 + }
54351 +
54352 + y = zfInterpolateFuncX(x,
54353 + x_array[xIndex],
54354 + y_array[xIndex],
54355 + x_array[xIndex+1],
54356 + y_array[xIndex+1]);
54357 +
54358 + return (u8_t)y;
54359 +}
54360 +
54361 +u8_t zfFindFreqIndex(u8_t f, u8_t* fArray, u8_t fArraySize)
54362 +{
54363 + u8_t i;
54364 +#ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG
54365 + DbgPrint("f=%d ", f);
54366 + for (i=0; i<fArraySize; i++)
54367 + {
54368 + DbgPrint("%d ", fArray[i]);
54369 + }
54370 + DbgPrint("\n");
54371 +#endif
54372 + i=fArraySize-2;
54373 + while(1)
54374 + {
54375 + if (f >= fArray[i])
54376 + {
54377 + return i;
54378 + }
54379 + if (i!=0)
54380 + {
54381 + i--;
54382 + }
54383 + else
54384 + {
54385 + return 0;
54386 + }
54387 + }
54388 +}
54389 +
54390 +
54391 +
54392 +
54393 +void zfInitPowerCal(zdev_t* dev)
54394 +{
54395 + //Program PHY Tx power relatives registers
54396 +#define zm_write_phy_reg(cr, val) reg_write((cr*4)+0x9800, val)
54397 +
54398 + zm_write_phy_reg(79, 0x7f);
54399 + zm_write_phy_reg(77, 0x3f3f3f3f);
54400 + zm_write_phy_reg(78, 0x3f3f3f3f);
54401 + zm_write_phy_reg(653, 0x3f3f3f3f);
54402 + zm_write_phy_reg(654, 0x3f3f3f3f);
54403 + zm_write_phy_reg(739, 0x3f3f3f3f);
54404 + zm_write_phy_reg(740, 0x3f3f3f3f);
54405 + zm_write_phy_reg(755, 0x3f3f3f3f);
54406 + zm_write_phy_reg(756, 0x3f3f3f3f);
54407 + zm_write_phy_reg(757, 0x3f3f3f3f);
54408 +
54409 +#undef zm_write_phy_reg
54410 +}
54411 +
54412 +
54413 +
54414 +void zfPrintTp(u8_t* pwr0, u8_t* vpd0, u8_t* pwr1, u8_t* vpd1)
54415 +{
54416 + #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG
54417 + DbgPrint("pwr0 : %d, %d, %d, %d ,%d\n", pwr0[0], pwr0[1], pwr0[2], pwr0[3], pwr0[4]);
54418 + DbgPrint("vpd0 : %d, %d, %d, %d ,%d\n", vpd0[0], vpd0[1], vpd0[2], vpd0[3], vpd0[4]);
54419 + DbgPrint("pwr1 : %d, %d, %d, %d ,%d\n", pwr1[0], pwr1[1], pwr1[2], pwr1[3], pwr1[4]);
54420 + DbgPrint("vpd1 : %d, %d, %d, %d ,%d\n", vpd1[0], vpd1[1], vpd1[2], vpd1[3], vpd1[4]);
54421 + #endif
54422 +}
54423 +
54424 +
54425 +/*
54426 + * To find CTL index(0~23)
54427 + * return 24(AR5416_NUM_CTLS)=>no desired index found
54428 + */
54429 +u8_t zfFindCtlEdgesIndex(zdev_t* dev, u8_t desired_CtlIndex)
54430 +{
54431 + u8_t i;
54432 + struct zsHpPriv* hpPriv;
54433 + struct ar5416Eeprom* eepromImage;
54434 +
54435 + zmw_get_wlan_dev(dev);
54436 +
54437 + hpPriv = wd->hpPrivate;
54438 +
54439 + eepromImage = (struct ar5416Eeprom*)&(hpPriv->eepromImage[(1024+512)/4]);
54440 +
54441 + //for (i = 0; (i < AR5416_NUM_CTLS) && eepromImage->ctlIndex[i]; i++)
54442 + for (i = 0; i < AR5416_NUM_CTLS; i++)
54443 + {
54444 + if(desired_CtlIndex == eepromImage->ctlIndex[i])
54445 + break;
54446 + }
54447 + return i;
54448 +}
54449 +
54450 +/**************************************************************************
54451 + * fbin2freq
54452 + *
54453 + * Get channel value from binary representation held in eeprom
54454 + * RETURNS: the frequency in MHz
54455 + */
54456 +u32_t
54457 +fbin2freq(u8_t fbin, u8_t is2GHz)
54458 +{
54459 + /*
54460 + * Reserved value 0xFF provides an empty definition both as
54461 + * an fbin and as a frequency - do not convert
54462 + */
54463 + if (fbin == AR5416_BCHAN_UNUSED) {
54464 + return fbin;
54465 + }
54466 +
54467 + return (u32_t)((is2GHz==1) ? (2300 + fbin) : (4800 + 5 * fbin));
54468 +}
54469 +
54470 +
54471 +u8_t zfGetMaxEdgePower(zdev_t* dev, CAL_CTL_EDGES *pCtlEdges, u32_t freq)
54472 +{
54473 + u8_t i;
54474 + u8_t maxEdgePower;
54475 + u8_t is2GHz;
54476 + struct zsHpPriv* hpPriv;
54477 + struct ar5416Eeprom* eepromImage;
54478 +
54479 + zmw_get_wlan_dev(dev);
54480 +
54481 + hpPriv = wd->hpPrivate;
54482 +
54483 + eepromImage = (struct ar5416Eeprom*)&(hpPriv->eepromImage[(1024+512)/4]);
54484 +
54485 + if(freq > ZM_CH_G_14)
54486 + is2GHz = 0;
54487 + else
54488 + is2GHz = 1;
54489 +
54490 + maxEdgePower = AR5416_MAX_RATE_POWER;
54491 +
54492 + /* Get the edge power */
54493 + for (i = 0; (i < AR5416_NUM_BAND_EDGES) && (pCtlEdges[i].bChannel != AR5416_BCHAN_UNUSED) ; i++)
54494 + {
54495 + /*
54496 + * If there's an exact channel match or an inband flag set
54497 + * on the lower channel use the given rdEdgePower
54498 + */
54499 + if (freq == fbin2freq(pCtlEdges[i].bChannel, is2GHz))
54500 + {
54501 + maxEdgePower = pCtlEdges[i].tPower;
54502 + #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG
54503 + zm_dbg(("zfGetMaxEdgePower index i = %d \n", i));
54504 + #endif
54505 + break;
54506 + }
54507 + else if ((i > 0) && (freq < fbin2freq(pCtlEdges[i].bChannel, is2GHz)))
54508 + {
54509 + if (fbin2freq(pCtlEdges[i - 1].bChannel, is2GHz) < freq && pCtlEdges[i - 1].flag)
54510 + {
54511 + maxEdgePower = pCtlEdges[i - 1].tPower;
54512 + #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG
54513 + zm_dbg(("zfGetMaxEdgePower index i-1 = %d \n", i-1));
54514 + #endif
54515 + }
54516 + /* Leave loop - no more affecting edges possible in this monotonic increasing list */
54517 + break;
54518 + }
54519 +
54520 + }
54521 +
54522 + if( i == AR5416_NUM_BAND_EDGES )
54523 + {
54524 + if (freq > fbin2freq(pCtlEdges[i - 1].bChannel, is2GHz) && pCtlEdges[i - 1].flag)
54525 + {
54526 + maxEdgePower = pCtlEdges[i - 1].tPower;
54527 + #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG
54528 + zm_dbg(("zfGetMaxEdgePower index=>i-1 = %d \n", i-1));
54529 + #endif
54530 + }
54531 + }
54532 +
54533 + zm_assert(maxEdgePower > 0);
54534 +
54535 + #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG
54536 + if ( maxEdgePower == AR5416_MAX_RATE_POWER )
54537 + {
54538 + zm_dbg(("zfGetMaxEdgePower = %d !!!\n", AR5416_MAX_RATE_POWER));
54539 + }
54540 + #endif
54541 + return maxEdgePower;
54542 +}
54543 +
54544 +u32_t zfAdjustHT40FreqOffset(zdev_t* dev, u32_t frequency, u8_t bw40, u8_t extOffset)
54545 +{
54546 + u32_t newFreq = frequency;
54547 +
54548 + if (bw40 == 1)
54549 + {
54550 + if (extOffset == 1)
54551 + {
54552 + newFreq += 10;
54553 + }
54554 + else
54555 + {
54556 + newFreq -= 10;
54557 + }
54558 + }
54559 + return newFreq;
54560 +}
54561 +
54562 +u32_t zfHpCheckDoHeavyClip(zdev_t* dev, u32_t freq, CAL_CTL_EDGES *pCtlEdges, u8_t bw40)
54563 +{
54564 + u32_t ret = 0;
54565 + u8_t i;
54566 + u8_t is2GHz;
54567 + struct zsHpPriv* hpPriv;
54568 +
54569 + zmw_get_wlan_dev(dev);
54570 +
54571 + hpPriv = wd->hpPrivate;
54572 +
54573 + if(freq > ZM_CH_G_14)
54574 + is2GHz = 0;
54575 + else
54576 + is2GHz = 1;
54577 +
54578 + /* HT40 force enable heavy clip */
54579 + if (bw40)
54580 + {
54581 + ret |= 0xf0;
54582 + }
54583 +#if 1
54584 + /* HT20 : frequency bandedge */
54585 + for (i = 0; (i < AR5416_NUM_BAND_EDGES) && (pCtlEdges[i].bChannel != AR5416_BCHAN_UNUSED) ; i++)
54586 + {
54587 + if (freq == fbin2freq(pCtlEdges[i].bChannel, is2GHz))
54588 + {
54589 + if (pCtlEdges[i].flag == 0)
54590 + {
54591 + ret |= 0xf;
54592 + }
54593 + break;
54594 + }
54595 + }
54596 +#endif
54597 +
54598 + return ret;
54599 +}
54600 +
54601 +
54602 +void zfSetPowerCalTable(zdev_t* dev, u32_t frequency, u8_t bw40, u8_t extOffset)
54603 +{
54604 + struct ar5416Eeprom* eepromImage;
54605 + u8_t pwr0[5];
54606 + u8_t pwr1[5];
54607 + u8_t vpd0[5];
54608 + u8_t vpd1[5];
54609 + u8_t vpd_chain1[128];
54610 + u8_t vpd_chain3[128];
54611 + u16_t boundary1 = 18; //CR 667
54612 + u16_t powerTxMax = 63; //CR 79
54613 + u8_t i;
54614 + struct zsHpPriv* hpPriv;
54615 + u8_t fbin;
54616 + u8_t index, max2gIndex, max5gIndex;
54617 + u8_t chain0pwrPdg0[5];
54618 + u8_t chain0vpdPdg0[5];
54619 + u8_t chain0pwrPdg1[5];
54620 + u8_t chain0vpdPdg1[5];
54621 + u8_t chain2pwrPdg0[5];
54622 + u8_t chain2vpdPdg0[5];
54623 + u8_t chain2pwrPdg1[5];
54624 + u8_t chain2vpdPdg1[5];
54625 + u8_t fbinArray[8];
54626 +
54627 + /* 4 CTL */
54628 + u8_t ctl_i;
54629 + u8_t desired_CtlIndex;
54630 +
54631 + u8_t ctlEdgesMaxPowerCCK = AR5416_MAX_RATE_POWER;
54632 + u8_t ctlEdgesMaxPower2G = AR5416_MAX_RATE_POWER;
54633 + u8_t ctlEdgesMaxPower2GHT20 = AR5416_MAX_RATE_POWER;
54634 + u8_t ctlEdgesMaxPower2GHT40 = AR5416_MAX_RATE_POWER;
54635 + u8_t ctlEdgesMaxPower5G = AR5416_MAX_RATE_POWER;
54636 + u8_t ctlEdgesMaxPower5GHT20 = AR5416_MAX_RATE_POWER;
54637 + u8_t ctlEdgesMaxPower5GHT40 = AR5416_MAX_RATE_POWER;
54638 +
54639 + u8_t ctlOffset;
54640 +
54641 + zmw_get_wlan_dev(dev);
54642 +
54643 + hpPriv = wd->hpPrivate;
54644 +
54645 + eepromImage = (struct ar5416Eeprom*)&(hpPriv->eepromImage[(1024+512)/4]);
54646 +
54647 + // Check the total bytes of the EEPROM structure to see the dongle have been calibrated or not.
54648 + if (eepromImage->baseEepHeader.length == 0xffff)
54649 + {
54650 + #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG
54651 + zm_dbg(("Warning! This dongle not been calibrated\n"));
54652 + #endif
54653 + return;
54654 + }
54655 +
54656 + #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG
54657 + DbgPrint("-----zfSetPowerCalTable : frequency=%d-----\n", frequency);
54658 + #endif
54659 + /* TODO : 1. boundary1 and powerTxMax should be refered to CR667 and CR79 */
54660 + /* in otus.ini file */
54661 +
54662 + #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG
54663 + /* 2. Interpolate pwr and vpd test points from frequency */
54664 + DbgPrint("calFreqPier5G : %d, %d, %d, %d ,%d, %d, %d, %d\n",
54665 + eepromImage->calFreqPier5G[0]*5+4800,
54666 + eepromImage->calFreqPier5G[1]*5+4800,
54667 + eepromImage->calFreqPier5G[2]*5+4800,
54668 + eepromImage->calFreqPier5G[3]*5+4800,
54669 + eepromImage->calFreqPier5G[4]*5+4800,
54670 + eepromImage->calFreqPier5G[5]*5+4800,
54671 + eepromImage->calFreqPier5G[6]*5+4800,
54672 + eepromImage->calFreqPier5G[7]*5+4800
54673 + );
54674 + DbgPrint("calFreqPier2G : %d, %d, %d, %d\n",
54675 + eepromImage->calFreqPier2G[0]+2300,
54676 + eepromImage->calFreqPier2G[1]+2300,
54677 + eepromImage->calFreqPier2G[2]+2300,
54678 + eepromImage->calFreqPier2G[3]+2300
54679 + );
54680 + #endif
54681 + if (frequency < 3000)
54682 + {
54683 + for (i=0; i<4; i++)
54684 + {
54685 + if (eepromImage->calFreqPier2G[i] == 0xff)
54686 + {
54687 + break;
54688 + }
54689 + }
54690 + max2gIndex = i;
54691 + #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG
54692 + DbgPrint("max2gIndex : %d\n", max2gIndex);
54693 + #endif
54694 + fbin = (u8_t)(frequency - 2300);
54695 + index = zfFindFreqIndex(fbin, eepromImage->calFreqPier2G, max2gIndex);
54696 + #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG
54697 + DbgPrint("2G index : %d\n", index);
54698 + DbgPrint("chain 0 index\n");
54699 + #endif
54700 + zfPrintTp(&eepromImage->calPierData2G[0][index].pwrPdg[0][0],
54701 + &eepromImage->calPierData2G[0][index].vpdPdg[0][0],
54702 + &eepromImage->calPierData2G[0][index].pwrPdg[1][0],
54703 + &eepromImage->calPierData2G[0][index].vpdPdg[1][0]
54704 + );
54705 + #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG
54706 + DbgPrint("chain 0 index+1\n");
54707 + #endif
54708 + zfPrintTp(&eepromImage->calPierData2G[0][index+1].pwrPdg[0][0],
54709 + &eepromImage->calPierData2G[0][index+1].vpdPdg[0][0],
54710 + &eepromImage->calPierData2G[0][index+1].pwrPdg[1][0],
54711 + &eepromImage->calPierData2G[0][index+1].vpdPdg[1][0]
54712 + );
54713 +
54714 + for (i=0; i<5; i++)
54715 + {
54716 + chain0pwrPdg0[i] = zfInterpolateFuncX(fbin,
54717 + eepromImage->calFreqPier2G[index],
54718 + eepromImage->calPierData2G[0][index].pwrPdg[0][i],
54719 + eepromImage->calFreqPier2G[index+1],
54720 + eepromImage->calPierData2G[0][index+1].pwrPdg[0][i]
54721 + );
54722 + chain0vpdPdg0[i] = zfInterpolateFuncX(fbin,
54723 + eepromImage->calFreqPier2G[index],
54724 + eepromImage->calPierData2G[0][index].vpdPdg[0][i],
54725 + eepromImage->calFreqPier2G[index+1],
54726 + eepromImage->calPierData2G[0][index+1].vpdPdg[0][i]
54727 + );
54728 + chain0pwrPdg1[i] = zfInterpolateFuncX(fbin,
54729 + eepromImage->calFreqPier2G[index],
54730 + eepromImage->calPierData2G[0][index].pwrPdg[1][i],
54731 + eepromImage->calFreqPier2G[index+1],
54732 + eepromImage->calPierData2G[0][index+1].pwrPdg[1][i]
54733 + );
54734 + chain0vpdPdg1[i] = zfInterpolateFuncX(fbin,
54735 + eepromImage->calFreqPier2G[index],
54736 + eepromImage->calPierData2G[0][index].vpdPdg[1][i],
54737 + eepromImage->calFreqPier2G[index+1],
54738 + eepromImage->calPierData2G[0][index+1].vpdPdg[1][i]
54739 + );
54740 +
54741 + chain2pwrPdg0[i] = zfInterpolateFuncX(fbin,
54742 + eepromImage->calFreqPier2G[index],
54743 + eepromImage->calPierData2G[1][index].pwrPdg[0][i],
54744 + eepromImage->calFreqPier2G[index+1],
54745 + eepromImage->calPierData2G[1][index+1].pwrPdg[0][i]
54746 + );
54747 + chain2vpdPdg0[i] = zfInterpolateFuncX(fbin,
54748 + eepromImage->calFreqPier2G[index],
54749 + eepromImage->calPierData2G[1][index].vpdPdg[0][i],
54750 + eepromImage->calFreqPier2G[index+1],
54751 + eepromImage->calPierData2G[1][index+1].vpdPdg[0][i]
54752 + );
54753 + chain2pwrPdg1[i] = zfInterpolateFuncX(fbin,
54754 + eepromImage->calFreqPier2G[index],
54755 + eepromImage->calPierData2G[1][index].pwrPdg[1][i],
54756 + eepromImage->calFreqPier2G[index+1],
54757 + eepromImage->calPierData2G[1][index+1].pwrPdg[1][i]
54758 + );
54759 + chain2vpdPdg1[i] = zfInterpolateFuncX(fbin,
54760 + eepromImage->calFreqPier2G[index],
54761 + eepromImage->calPierData2G[1][index].vpdPdg[1][i],
54762 + eepromImage->calFreqPier2G[index+1],
54763 + eepromImage->calPierData2G[1][index+1].vpdPdg[1][i]
54764 + );
54765 + }
54766 + }
54767 + else
54768 + {
54769 + for (i=0; i<8; i++)
54770 + {
54771 + if (eepromImage->calFreqPier5G[i] == 0xff)
54772 + {
54773 + break;
54774 + }
54775 + }
54776 + max5gIndex = i;
54777 + #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG
54778 + DbgPrint("max5gIndex : %d\n", max5gIndex);
54779 + #endif
54780 + fbin = (u8_t)((frequency - 4800)/5);
54781 + index = zfFindFreqIndex(fbin, eepromImage->calFreqPier5G, max5gIndex);
54782 + #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG
54783 + DbgPrint("5G index : %d\n", index);
54784 + #endif
54785 +
54786 + for (i=0; i<5; i++)
54787 + {
54788 + chain0pwrPdg0[i] = zfInterpolateFuncX(fbin,
54789 + eepromImage->calFreqPier5G[index],
54790 + eepromImage->calPierData5G[0][index].pwrPdg[0][i],
54791 + eepromImage->calFreqPier5G[index+1],
54792 + eepromImage->calPierData5G[0][index+1].pwrPdg[0][i]
54793 + );
54794 + chain0vpdPdg0[i] = zfInterpolateFuncX(fbin,
54795 + eepromImage->calFreqPier5G[index],
54796 + eepromImage->calPierData5G[0][index].vpdPdg[0][i],
54797 + eepromImage->calFreqPier5G[index+1],
54798 + eepromImage->calPierData5G[0][index+1].vpdPdg[0][i]
54799 + );
54800 + chain0pwrPdg1[i] = zfInterpolateFuncX(fbin,
54801 + eepromImage->calFreqPier5G[index],
54802 + eepromImage->calPierData5G[0][index].pwrPdg[1][i],
54803 + eepromImage->calFreqPier5G[index+1],
54804 + eepromImage->calPierData5G[0][index+1].pwrPdg[1][i]
54805 + );
54806 + chain0vpdPdg1[i] = zfInterpolateFuncX(fbin,
54807 + eepromImage->calFreqPier5G[index],
54808 + eepromImage->calPierData5G[0][index].vpdPdg[1][i],
54809 + eepromImage->calFreqPier5G[index+1],
54810 + eepromImage->calPierData5G[0][index+1].vpdPdg[1][i]
54811 + );
54812 +
54813 + chain2pwrPdg0[i] = zfInterpolateFuncX(fbin,
54814 + eepromImage->calFreqPier5G[index],
54815 + eepromImage->calPierData5G[1][index].pwrPdg[0][i],
54816 + eepromImage->calFreqPier5G[index+1],
54817 + eepromImage->calPierData5G[1][index+1].pwrPdg[0][i]
54818 + );
54819 + chain2vpdPdg0[i] = zfInterpolateFuncX(fbin,
54820 + eepromImage->calFreqPier5G[index],
54821 + eepromImage->calPierData5G[1][index].vpdPdg[0][i],
54822 + eepromImage->calFreqPier5G[index+1],
54823 + eepromImage->calPierData5G[1][index+1].vpdPdg[0][i]
54824 + );
54825 + chain2pwrPdg1[i] = zfInterpolateFuncX(fbin,
54826 + eepromImage->calFreqPier5G[index],
54827 + eepromImage->calPierData5G[1][index].pwrPdg[1][i],
54828 + eepromImage->calFreqPier5G[index+1],
54829 + eepromImage->calPierData5G[1][index+1].pwrPdg[1][i]
54830 + );
54831 + chain2vpdPdg1[i] = zfInterpolateFuncX(fbin,
54832 + eepromImage->calFreqPier5G[index],
54833 + eepromImage->calPierData5G[1][index].vpdPdg[1][i],
54834 + eepromImage->calFreqPier5G[index+1],
54835 + eepromImage->calPierData5G[1][index+1].vpdPdg[1][i]
54836 + );
54837 + }
54838 +
54839 + }
54840 +
54841 +
54842 + /* Chain 1 */
54843 + /* Get pwr and vpd test points from frequency */
54844 + for (i=0; i<5; i++)
54845 + {
54846 + pwr0[i] = chain0pwrPdg0[i]>>1;
54847 + vpd0[i] = chain0vpdPdg0[i];
54848 + pwr1[i] = chain0pwrPdg1[i]>>1;
54849 + vpd1[i] = chain0vpdPdg1[i];
54850 + }
54851 + #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG
54852 + DbgPrint("Test Points\n");
54853 + DbgPrint("pwr0 : %d, %d, %d, %d ,%d\n", pwr0[0], pwr0[1], pwr0[2], pwr0[3], pwr0[4]);
54854 + DbgPrint("vpd0 : %d, %d, %d, %d ,%d\n", vpd0[0], vpd0[1], vpd0[2], vpd0[3], vpd0[4]);
54855 + DbgPrint("pwr1 : %d, %d, %d, %d ,%d\n", pwr1[0], pwr1[1], pwr1[2], pwr1[3], pwr1[4]);
54856 + DbgPrint("vpd1 : %d, %d, %d, %d ,%d\n", vpd1[0], vpd1[1], vpd1[2], vpd1[3], vpd1[4]);
54857 + #endif
54858 + /* Generate the vpd arrays */
54859 + for (i=0; i<boundary1+1+6; i++)
54860 + {
54861 + vpd_chain1[i] = zfGetInterpolatedValue(i, &pwr0[0], &vpd0[0]);
54862 + }
54863 + for (; i<powerTxMax+1+6+6; i++)
54864 + {
54865 + vpd_chain1[i] = zfGetInterpolatedValue(i-6-6, &pwr1[0], &vpd1[0]);
54866 + }
54867 + #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG
54868 + DbgPrint("vpd_chain1\n");
54869 + for (i=0; i<powerTxMax+1+6+6; i+=10)
54870 + {
54871 + DbgPrint("%d, %d, %d, %d ,%d, %d, %d, %d, %d, %d\n",
54872 + vpd_chain1[i+0], vpd_chain1[i+1], vpd_chain1[i+2], vpd_chain1[i+3], vpd_chain1[i+4],
54873 + vpd_chain1[i+5], vpd_chain1[i+6], vpd_chain1[i+7], vpd_chain1[i+8], vpd_chain1[i+9]);
54874 + }
54875 + #endif
54876 + /* Write PHY regs 672-703 */
54877 + for (i=0; i<128; i+=4)
54878 + {
54879 + u32_t regAddr = 0x9800 + (672 * 4);
54880 + u32_t val;
54881 +
54882 + val = ((u32_t)vpd_chain1[i+3]<<24) |
54883 + ((u32_t)vpd_chain1[i+2]<<16) |
54884 + ((u32_t)vpd_chain1[i+1]<<8) |
54885 + ((u32_t)vpd_chain1[i]);
54886 +
54887 + #ifndef ZM_OTUS_LINUX_PHASE_2
54888 + reg_write(regAddr + i, val); /* CR672 */
54889 + #endif
54890 + }
54891 +
54892 + /* Chain 2 */
54893 + /* Get pwr and vpd test points from frequency */
54894 + for (i=0; i<5; i++)
54895 + {
54896 + pwr0[i] = chain2pwrPdg0[i]>>1;
54897 + vpd0[i] = chain2vpdPdg0[i];
54898 + pwr1[i] = chain2pwrPdg1[i]>>1;
54899 + vpd1[i] = chain2vpdPdg1[i];
54900 + }
54901 + #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG
54902 + DbgPrint("Test Points\n");
54903 + DbgPrint("pwr0 : %d, %d, %d, %d ,%d\n", pwr0[0], pwr0[1], pwr0[2], pwr0[3], pwr0[4]);
54904 + DbgPrint("vpd0 : %d, %d, %d, %d ,%d\n", vpd0[0], vpd0[1], vpd0[2], vpd0[3], vpd0[4]);
54905 + DbgPrint("pwr1 : %d, %d, %d, %d ,%d\n", pwr1[0], pwr1[1], pwr1[2], pwr1[3], pwr1[4]);
54906 + DbgPrint("vpd1 : %d, %d, %d, %d ,%d\n", vpd1[0], vpd1[1], vpd1[2], vpd1[3], vpd1[4]);
54907 + #endif
54908 + /* Generate the vpd arrays */
54909 + for (i=0; i<boundary1+1+6; i++)
54910 + {
54911 + vpd_chain3[i] = zfGetInterpolatedValue(i, &pwr0[0], &vpd0[0]);
54912 + }
54913 + for (; i<powerTxMax+1+6+6; i++)
54914 + {
54915 + vpd_chain3[i] = zfGetInterpolatedValue(i-6-6, &pwr1[0], &vpd1[0]);
54916 + }
54917 + #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG
54918 + DbgPrint("vpd_chain3\n");
54919 + for (i=0; i<powerTxMax+1+6+6; i+=10)
54920 + {
54921 + DbgPrint("%d, %d, %d, %d ,%d, %d, %d, %d, %d, %d\n",
54922 + vpd_chain3[i+0], vpd_chain3[i+1], vpd_chain3[i+2], vpd_chain3[i+3], vpd_chain3[i+4],
54923 + vpd_chain3[i+5], vpd_chain3[i+6], vpd_chain3[i+7], vpd_chain3[i+8], vpd_chain3[i+9]);
54924 + }
54925 + #endif
54926 +
54927 + /* Write PHY regs 672-703 + 0x1000 */
54928 + for (i=0; i<128; i+=4)
54929 + {
54930 + u32_t regAddr = 0x9800 + (672 * 4) + 0x1000;
54931 + u32_t val;
54932 +
54933 + val = ((u32_t)vpd_chain3[i+3]<<24) |
54934 + ((u32_t)vpd_chain3[i+2]<<16) |
54935 + ((u32_t)vpd_chain3[i+1]<<8) |
54936 + ((u32_t)vpd_chain3[i]);
54937 +
54938 + #ifndef ZM_OTUS_LINUX_PHASE_2
54939 + reg_write(regAddr + i, val); /* CR672 */
54940 + #endif
54941 + }
54942 +
54943 + zfFlushDelayWrite(dev);
54944 +
54945 + /* 3. Generate target power table */
54946 + if (frequency < 3000)
54947 + {
54948 + for (i=0; i<3; i++)
54949 + {
54950 + if (eepromImage->calTargetPowerCck[i].bChannel != 0xff)
54951 + {
54952 + fbinArray[i] = eepromImage->calTargetPowerCck[i].bChannel;
54953 + }
54954 + else
54955 + {
54956 + break;
54957 + }
54958 +
54959 + }
54960 + index = zfFindFreqIndex(fbin, fbinArray, i);
54961 + #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG
54962 + DbgPrint("CCK index=%d\n", index);
54963 + #endif
54964 + for (i=0; i<4; i++)
54965 + {
54966 + hpPriv->tPow2xCck[i] = zfInterpolateFuncX(fbin,
54967 + eepromImage->calTargetPowerCck[index].bChannel,
54968 + eepromImage->calTargetPowerCck[index].tPow2x[i],
54969 + eepromImage->calTargetPowerCck[index+1].bChannel,
54970 + eepromImage->calTargetPowerCck[index+1].tPow2x[i]
54971 + );
54972 + }
54973 +
54974 + for (i=0; i<4; i++)
54975 + {
54976 + if (eepromImage->calTargetPower2G[i].bChannel != 0xff)
54977 + {
54978 + fbinArray[i] = eepromImage->calTargetPower2G[i].bChannel;
54979 + }
54980 + else
54981 + {
54982 + break;
54983 + }
54984 +
54985 + }
54986 + index = zfFindFreqIndex(fbin, fbinArray, i);
54987 + #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG
54988 + DbgPrint("2G index=%d\n", index);
54989 + #endif
54990 + for (i=0; i<4; i++)
54991 + {
54992 + hpPriv->tPow2x2g[i] = zfInterpolateFuncX(fbin,
54993 + eepromImage->calTargetPower2G[index].bChannel,
54994 + eepromImage->calTargetPower2G[index].tPow2x[i],
54995 + eepromImage->calTargetPower2G[index+1].bChannel,
54996 + eepromImage->calTargetPower2G[index+1].tPow2x[i]
54997 + );
54998 + }
54999 +
55000 + for (i=0; i<4; i++)
55001 + {
55002 + if (eepromImage->calTargetPower2GHT20[i].bChannel != 0xff)
55003 + {
55004 + fbinArray[i] = eepromImage->calTargetPower2GHT20[i].bChannel;
55005 + }
55006 + else
55007 + {
55008 + break;
55009 + }
55010 +
55011 + }
55012 + index = zfFindFreqIndex(fbin, fbinArray, i);
55013 + #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG
55014 + DbgPrint("2G HT20 index=%d\n", index);
55015 + #endif
55016 + for (i=0; i<8; i++)
55017 + {
55018 + hpPriv->tPow2x2gHt20[i] = zfInterpolateFuncX(fbin,
55019 + eepromImage->calTargetPower2GHT20[index].bChannel,
55020 + eepromImage->calTargetPower2GHT20[index].tPow2x[i],
55021 + eepromImage->calTargetPower2GHT20[index+1].bChannel,
55022 + eepromImage->calTargetPower2GHT20[index+1].tPow2x[i]
55023 + );
55024 + }
55025 +
55026 + for (i=0; i<4; i++)
55027 + {
55028 + if (eepromImage->calTargetPower2GHT40[i].bChannel != 0xff)
55029 + {
55030 + fbinArray[i] = eepromImage->calTargetPower2GHT40[i].bChannel;
55031 + }
55032 + else
55033 + {
55034 + break;
55035 + }
55036 +
55037 + }
55038 + index = zfFindFreqIndex( (u8_t)zfAdjustHT40FreqOffset(dev, fbin, bw40, extOffset), fbinArray, i);
55039 + #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG
55040 + DbgPrint("2G HT40 index=%d\n", index);
55041 + #endif
55042 + for (i=0; i<8; i++)
55043 + {
55044 + hpPriv->tPow2x2gHt40[i] = zfInterpolateFuncX(
55045 + (u8_t)zfAdjustHT40FreqOffset(dev, fbin, bw40, extOffset),
55046 + eepromImage->calTargetPower2GHT40[index].bChannel,
55047 + eepromImage->calTargetPower2GHT40[index].tPow2x[i],
55048 + eepromImage->calTargetPower2GHT40[index+1].bChannel,
55049 + eepromImage->calTargetPower2GHT40[index+1].tPow2x[i]
55050 + );
55051 + }
55052 +
55053 + zfPrintTargetPower2G(hpPriv->tPow2xCck,
55054 + hpPriv->tPow2x2g,
55055 + hpPriv->tPow2x2gHt20,
55056 + hpPriv->tPow2x2gHt40);
55057 + }
55058 + else
55059 + {
55060 + /* 5G */
55061 + for (i=0; i<8; i++)
55062 + {
55063 + if (eepromImage->calTargetPower5G[i].bChannel != 0xff)
55064 + {
55065 + fbinArray[i] = eepromImage->calTargetPower5G[i].bChannel;
55066 + }
55067 + else
55068 + {
55069 + break;
55070 + }
55071 +
55072 + }
55073 + index = zfFindFreqIndex(fbin, fbinArray, i);
55074 + #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG
55075 + DbgPrint("5G index=%d\n", index);
55076 + #endif
55077 + for (i=0; i<4; i++)
55078 + {
55079 + hpPriv->tPow2x5g[i] = zfInterpolateFuncX(fbin,
55080 + eepromImage->calTargetPower5G[index].bChannel,
55081 + eepromImage->calTargetPower5G[index].tPow2x[i],
55082 + eepromImage->calTargetPower5G[index+1].bChannel,
55083 + eepromImage->calTargetPower5G[index+1].tPow2x[i]
55084 + );
55085 + }
55086 +
55087 + for (i=0; i<8; i++)
55088 + {
55089 + if (eepromImage->calTargetPower5GHT20[i].bChannel != 0xff)
55090 + {
55091 + fbinArray[i] = eepromImage->calTargetPower5GHT20[i].bChannel;
55092 + }
55093 + else
55094 + {
55095 + break;
55096 + }
55097 +
55098 + }
55099 + index = zfFindFreqIndex(fbin, fbinArray, i);
55100 + #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG
55101 + DbgPrint("5G HT20 index=%d\n", index);
55102 + #endif
55103 + for (i=0; i<8; i++)
55104 + {
55105 + hpPriv->tPow2x5gHt20[i] = zfInterpolateFuncX(fbin,
55106 + eepromImage->calTargetPower5GHT20[index].bChannel,
55107 + eepromImage->calTargetPower5GHT20[index].tPow2x[i],
55108 + eepromImage->calTargetPower5GHT20[index+1].bChannel,
55109 + eepromImage->calTargetPower5GHT20[index+1].tPow2x[i]
55110 + );
55111 + }
55112 +
55113 + for (i=0; i<8; i++)
55114 + {
55115 + if (eepromImage->calTargetPower5GHT40[i].bChannel != 0xff)
55116 + {
55117 + fbinArray[i] = eepromImage->calTargetPower5GHT40[i].bChannel;
55118 + }
55119 + else
55120 + {
55121 + break;
55122 + }
55123 +
55124 + }
55125 + index = zfFindFreqIndex((u8_t)zfAdjustHT40FreqOffset(dev, fbin, bw40, extOffset), fbinArray, i);
55126 + #ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG
55127 + DbgPrint("5G HT40 index=%d\n", index);
55128 + #endif
55129 + for (i=0; i<8; i++)
55130 + {
55131 + hpPriv->tPow2x5gHt40[i] = zfInterpolateFuncX(
55132 + (u8_t)zfAdjustHT40FreqOffset(dev, fbin, bw40, extOffset),
55133 + eepromImage->calTargetPower5GHT40[index].bChannel,
55134 + eepromImage->calTargetPower5GHT40[index].tPow2x[i],
55135 + eepromImage->calTargetPower5GHT40[index+1].bChannel,
55136 + eepromImage->calTargetPower5GHT40[index+1].tPow2x[i]
55137 + );
55138 + }
55139 +
55140 + zfPrintTargetPower5G(
55141 + hpPriv->tPow2x5g,
55142 + hpPriv->tPow2x5gHt20,
55143 + hpPriv->tPow2x5gHt40);
55144 + }
55145 +
55146 +
55147 +
55148 + /* 4. CTL */
55149 + /*
55150 + * 4.1 Get the bandedges tx power by frequency
55151 + * 2.4G we get ctlEdgesMaxPowerCCK
55152 + * ctlEdgesMaxPower2G
55153 + * ctlEdgesMaxPower2GHT20
55154 + * ctlEdgesMaxPower2GHT40
55155 + * 5G we get ctlEdgesMaxPower5G
55156 + * ctlEdgesMaxPower5GHT20
55157 + * ctlEdgesMaxPower5GHT40
55158 + * 4.2 Update (3.) target power table by 4.1
55159 + * 4.3 Tx power offset for ART - NDIS/MDK
55160 + * 4.4 Write MAC reg 0x694 for ACK's TPC
55161 + *
55162 + */
55163 +
55164 + //zfDumpEepBandEdges(eepromImage);
55165 +
55166 + /* get the cfg from Eeprom: regionCode => RegulatoryDomain : 0x10-FFC 0x30-eu 0x40-jap */
55167 + desired_CtlIndex = zfHpGetRegulatoryDomain(dev);
55168 + if ((desired_CtlIndex == 0x30) || (desired_CtlIndex == 0x40) || (desired_CtlIndex == 0x0))
55169 + {
55170 + /* skip CTL and heavy clip */
55171 + hpPriv->enableBBHeavyClip = 0;
55172 + #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG
55173 + zm_dbg(("RegulatoryDomain = 0, skip CTL and heavy clip\n"));
55174 + #endif
55175 + }
55176 + else
55177 + {
55178 + hpPriv->enableBBHeavyClip = 1;
55179 +
55180 + if (desired_CtlIndex == 0xff)
55181 + {
55182 + /* desired index not found */
55183 + desired_CtlIndex = 0x10;
55184 + }
55185 +
55186 + /* first part : 2.4G */
55187 + if (frequency <= ZM_CH_G_14)
55188 + {
55189 + /* 2.4G - CTL_11B */
55190 + ctl_i = zfFindCtlEdgesIndex(dev, desired_CtlIndex|CTL_11B);
55191 + if(ctl_i<AR5416_NUM_CTLS)
55192 + {
55193 + ctlEdgesMaxPowerCCK = zfGetMaxEdgePower(dev, eepromImage->ctlData[ctl_i].ctlEdges[1], frequency);
55194 + }
55195 + #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG
55196 + zm_dbg(("CTL_11B ctl_i = %d\n", ctl_i));
55197 + #endif
55198 +
55199 + /* 2.4G - CTL_11G */
55200 + ctl_i = zfFindCtlEdgesIndex(dev, desired_CtlIndex|CTL_11G);
55201 + if(ctl_i<AR5416_NUM_CTLS)
55202 + {
55203 + ctlEdgesMaxPower2G = zfGetMaxEdgePower(dev, eepromImage->ctlData[ctl_i].ctlEdges[1], frequency);
55204 + }
55205 + #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG
55206 + zm_dbg(("CTL_11G ctl_i = %d\n", ctl_i));
55207 + #endif
55208 +
55209 + /* 2.4G - CTL_2GHT20 */
55210 + ctl_i = zfFindCtlEdgesIndex(dev, desired_CtlIndex|CTL_2GHT20);
55211 + if(ctl_i<AR5416_NUM_CTLS)
55212 + {
55213 + ctlEdgesMaxPower2GHT20 = zfGetMaxEdgePower(dev, eepromImage->ctlData[ctl_i].ctlEdges[1], frequency);
55214 + }
55215 + else
55216 + {
55217 + /* workaround for no data in Eeprom, replace by normal 2G */
55218 + ctlEdgesMaxPower2GHT20 = ctlEdgesMaxPower2G;
55219 + }
55220 + #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG
55221 + zm_dbg(("CTL_2GHT20 ctl_i = %d\n", ctl_i));
55222 + #endif
55223 +
55224 + /* 2.4G - CTL_2GHT40 */
55225 + ctl_i = zfFindCtlEdgesIndex(dev, desired_CtlIndex|CTL_2GHT40);
55226 + if(ctl_i<AR5416_NUM_CTLS)
55227 + {
55228 + ctlEdgesMaxPower2GHT40 = zfGetMaxEdgePower(dev, eepromImage->ctlData[ctl_i].ctlEdges[1],
55229 + zfAdjustHT40FreqOffset(dev, frequency, bw40, extOffset));
55230 + }
55231 + else
55232 + {
55233 + /* workaround for no data in Eeprom, replace by normal 2G */
55234 + ctlEdgesMaxPower2GHT40 = ctlEdgesMaxPower2G;
55235 + }
55236 + #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG
55237 + zm_dbg(("CTL_2GHT40 ctl_i = %d\n", ctl_i));
55238 + #endif
55239 +
55240 +
55241 + /* 7a17 : */
55242 + /* Max power (dBm) for channel range when using DFS define by madwifi*/
55243 + for (i=0; i<wd->regulationTable.allowChannelCnt; i++)
55244 + {
55245 + if (wd->regulationTable.allowChannel[i].channel == frequency)
55246 + {
55247 + if (zfHpIsDfsChannel(dev, (u16_t)frequency))
55248 + {
55249 + zm_debug_msg1("frequency use DFS -- ", frequency);
55250 + ctlEdgesMaxPowerCCK = zm_min(ctlEdgesMaxPowerCCK, wd->regulationTable.allowChannel[i].maxRegTxPower*2);
55251 + ctlEdgesMaxPower2G = zm_min(ctlEdgesMaxPower2G, wd->regulationTable.allowChannel[i].maxRegTxPower*2);
55252 + ctlEdgesMaxPower2GHT20 = zm_min(ctlEdgesMaxPower2GHT20, wd->regulationTable.allowChannel[i].maxRegTxPower*2);
55253 + ctlEdgesMaxPower2GHT40 = zm_min(ctlEdgesMaxPower2GHT40, wd->regulationTable.allowChannel[i].maxRegTxPower*2);
55254 + }
55255 + break;
55256 + }
55257 + }
55258 +
55259 + /* Apply ctl mode to correct target power set */
55260 + #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG
55261 + zm_debug_msg1("ctlEdgesMaxPowerCCK = ", ctlEdgesMaxPowerCCK);
55262 + zm_debug_msg1("ctlEdgesMaxPower2G = ", ctlEdgesMaxPower2G);
55263 + zm_debug_msg1("ctlEdgesMaxPower2GHT20 = ", ctlEdgesMaxPower2GHT20);
55264 + zm_debug_msg1("ctlEdgesMaxPower2GHT40 = ", ctlEdgesMaxPower2GHT40);
55265 + #endif
55266 + for (i=0; i<4; i++)
55267 + {
55268 + hpPriv->tPow2xCck[i] = zm_min(hpPriv->tPow2xCck[i], ctlEdgesMaxPowerCCK) + HALTX_POWER_OFFSET;
55269 + }
55270 + hpPriv->tPow2x2g24HeavyClipOffset = 0;
55271 + if (hpPriv->enableBBHeavyClip)
55272 + {
55273 + ctlOffset = 2;
55274 + }
55275 + else
55276 + {
55277 + ctlOffset = 0;
55278 + }
55279 + for (i=0; i<4; i++)
55280 + {
55281 + if (((frequency == 2412) || (frequency == 2462)))
55282 + {
55283 + if (i != 0)
55284 + {
55285 + hpPriv->tPow2x2g[i] = zm_min(hpPriv->tPow2x2g[i], ctlEdgesMaxPower2G-ctlOffset) + HALTX_POWER_OFFSET;
55286 + }
55287 + else
55288 + {
55289 + hpPriv->tPow2x2g[i] = zm_min(hpPriv->tPow2x2g[i], ctlEdgesMaxPower2G) + HALTX_POWER_OFFSET;
55290 + if (hpPriv->tPow2x2g[i] > (ctlEdgesMaxPower2G-ctlOffset))
55291 + {
55292 + hpPriv->tPow2x2g24HeavyClipOffset = hpPriv->tPow2x2g[i] - (ctlEdgesMaxPower2G-ctlOffset);
55293 + }
55294 + }
55295 + }
55296 + else
55297 + {
55298 + hpPriv->tPow2x2g[i] = zm_min(hpPriv->tPow2x2g[i], ctlEdgesMaxPower2G) + HALTX_POWER_OFFSET;
55299 + }
55300 + }
55301 + for (i=0; i<8; i++)
55302 + {
55303 + if (((frequency == 2412) || (frequency == 2462)) && (i>=3))
55304 + {
55305 + hpPriv->tPow2x2gHt20[i] = zm_min(hpPriv->tPow2x2gHt20[i], ctlEdgesMaxPower2GHT20-ctlOffset) + HALTX_POWER_OFFSET;
55306 + }
55307 + else
55308 + {
55309 + hpPriv->tPow2x2gHt20[i] = zm_min(hpPriv->tPow2x2gHt20[i], ctlEdgesMaxPower2GHT20) + HALTX_POWER_OFFSET;
55310 + }
55311 + }
55312 + for (i=0; i<8; i++)
55313 + {
55314 + if ((frequency == 2412) && (i>=3))
55315 + {
55316 + hpPriv->tPow2x2gHt40[i] = zm_min(hpPriv->tPow2x2gHt40[i], ctlEdgesMaxPower2GHT40-ctlOffset) + HALTX_POWER_OFFSET;
55317 + }
55318 + else if ((frequency == 2462) && (i>=3))
55319 + {
55320 + hpPriv->tPow2x2gHt40[i] = zm_min(hpPriv->tPow2x2gHt40[i], ctlEdgesMaxPower2GHT40-(ctlOffset*2)) + HALTX_POWER_OFFSET;
55321 + }
55322 + else
55323 + {
55324 + hpPriv->tPow2x2gHt40[i] = zm_min(hpPriv->tPow2x2gHt40[i], ctlEdgesMaxPower2GHT40) + HALTX_POWER_OFFSET;
55325 + }
55326 + }
55327 + }
55328 + else
55329 + {
55330 + /* 5G - CTL_11A */
55331 + ctl_i = zfFindCtlEdgesIndex(dev, desired_CtlIndex|CTL_11A);
55332 + if(ctl_i<AR5416_NUM_CTLS)
55333 + {
55334 + ctlEdgesMaxPower5G = zfGetMaxEdgePower(dev, eepromImage->ctlData[ctl_i].ctlEdges[1], frequency);
55335 + }
55336 + #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG
55337 + zm_dbg(("CTL_11A ctl_i = %d\n", ctl_i));
55338 + #endif
55339 +
55340 + /* 5G - CTL_5GHT20 */
55341 + ctl_i = zfFindCtlEdgesIndex(dev, desired_CtlIndex|CTL_5GHT20);
55342 + if(ctl_i<AR5416_NUM_CTLS)
55343 + {
55344 + ctlEdgesMaxPower5GHT20 = zfGetMaxEdgePower(dev, eepromImage->ctlData[ctl_i].ctlEdges[1], frequency);
55345 + }
55346 + else
55347 + {
55348 + /* workaround for no data in Eeprom, replace by normal 5G */
55349 + ctlEdgesMaxPower5GHT20 = ctlEdgesMaxPower5G;
55350 + }
55351 + #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG
55352 + zm_dbg(("CTL_5GHT20 ctl_i = %d\n", ctl_i));
55353 + #endif
55354 +
55355 + /* 5G - CTL_5GHT40 */
55356 + ctl_i = zfFindCtlEdgesIndex(dev, desired_CtlIndex|CTL_5GHT40);
55357 + if(ctl_i<AR5416_NUM_CTLS)
55358 + {
55359 + ctlEdgesMaxPower5GHT40 = zfGetMaxEdgePower(dev, eepromImage->ctlData[ctl_i].ctlEdges[1],
55360 + zfAdjustHT40FreqOffset(dev, frequency, bw40, extOffset));
55361 + }
55362 + else
55363 + {
55364 + /* workaround for no data in Eeprom, replace by normal 5G */
55365 + ctlEdgesMaxPower5GHT40 = ctlEdgesMaxPower5G;
55366 + }
55367 + #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG
55368 + zm_dbg(("CTL_5GHT40 ctl_i = %d\n", ctl_i));
55369 + #endif
55370 +
55371 + /* 7a17 : */
55372 + /* Max power (dBm) for channel range when using DFS define by madwifi*/
55373 + for (i=0; i<wd->regulationTable.allowChannelCnt; i++)
55374 + {
55375 + if (wd->regulationTable.allowChannel[i].channel == frequency)
55376 + {
55377 + if (zfHpIsDfsChannel(dev, (u16_t)frequency))
55378 + {
55379 + zm_debug_msg1("frequency use DFS -- ", frequency);
55380 + ctlEdgesMaxPower5G = zm_min(ctlEdgesMaxPower5G, wd->regulationTable.allowChannel[i].maxRegTxPower*2);
55381 + ctlEdgesMaxPower5GHT20 = zm_min(ctlEdgesMaxPower5GHT20, wd->regulationTable.allowChannel[i].maxRegTxPower*2);
55382 + ctlEdgesMaxPower5GHT40 = zm_min(ctlEdgesMaxPower5GHT40, wd->regulationTable.allowChannel[i].maxRegTxPower*2);
55383 + }
55384 + break;
55385 + }
55386 + }
55387 +
55388 +
55389 + /* Apply ctl mode to correct target power set */
55390 + #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG
55391 + zm_debug_msg1("ctlEdgesMaxPower5G = ", ctlEdgesMaxPower5G);
55392 + zm_debug_msg1("ctlEdgesMaxPower5GHT20 = ", ctlEdgesMaxPower5GHT20);
55393 + zm_debug_msg1("ctlEdgesMaxPower5GHT40 = ", ctlEdgesMaxPower5GHT40);
55394 + #endif
55395 + for (i=0; i<4; i++)
55396 + {
55397 + hpPriv->tPow2x5g[i] = zm_min(hpPriv->tPow2x5g[i], ctlEdgesMaxPower5G) + HALTX_POWER_OFFSET;
55398 + }
55399 + for (i=0; i<8; i++)
55400 + {
55401 + hpPriv->tPow2x5gHt20[i] = zm_min(hpPriv->tPow2x5gHt20[i], ctlEdgesMaxPower5GHT20) + HALTX_POWER_OFFSET;
55402 + }
55403 + for (i=0; i<8; i++)
55404 + {
55405 + hpPriv->tPow2x5gHt40[i] = zm_min(hpPriv->tPow2x5gHt40[i], ctlEdgesMaxPower5GHT40) + HALTX_POWER_OFFSET;
55406 + }
55407 +
55408 + }/* end of bandedges of 5G */
55409 + }/* end of if ((desired_CtlIndex = zfHpGetRegulatoryDomain(dev)) == 0) */
55410 +
55411 + /* workaround */
55412 + /* 5. BB heavy clip */
55413 + /* only 2.4G do heavy clip */
55414 + if (hpPriv->enableBBHeavyClip && hpPriv->hwBBHeavyClip && (frequency <= ZM_CH_G_14))
55415 + {
55416 + if (frequency <= ZM_CH_G_14)
55417 + {
55418 + ctl_i = zfFindCtlEdgesIndex(dev, desired_CtlIndex|CTL_11G);
55419 + }
55420 + else
55421 + {
55422 + ctl_i = zfFindCtlEdgesIndex(dev, desired_CtlIndex|CTL_11A);
55423 + }
55424 +
55425 + hpPriv->setValueHeavyClip = zfHpCheckDoHeavyClip(dev, frequency, eepromImage->ctlData[ctl_i].ctlEdges[1], bw40);
55426 +
55427 + if (hpPriv->setValueHeavyClip)
55428 + {
55429 + hpPriv->doBBHeavyClip = 1;
55430 + }
55431 + else
55432 + {
55433 + hpPriv->doBBHeavyClip = 0;
55434 + }
55435 + #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG
55436 + zm_dbg(("zfHpCheckDoHeavyClip ret = %02x, doBBHeavyClip = %d\n",
55437 + hpPriv->setValueHeavyClip, hpPriv->doBBHeavyClip));
55438 + #endif
55439 +
55440 + if (hpPriv->doBBHeavyClip)
55441 + {
55442 + if (hpPriv->setValueHeavyClip & 0xf0)
55443 + {
55444 + hpPriv->tPow2x2gHt40[0] -= 1;
55445 + hpPriv->tPow2x2gHt40[1] -= 1;
55446 + hpPriv->tPow2x2gHt40[2] -= 1;
55447 + }
55448 +
55449 + if (hpPriv->setValueHeavyClip & 0xf)
55450 + {
55451 + hpPriv->tPow2x2gHt20[0] += 1;
55452 + hpPriv->tPow2x2gHt20[1] += 1;
55453 + hpPriv->tPow2x2gHt20[2] += 1;
55454 + }
55455 + }
55456 + }
55457 + else
55458 + {
55459 + hpPriv->doBBHeavyClip = 0;
55460 + hpPriv->setValueHeavyClip = 0;
55461 + }
55462 +
55463 + /* Final : write MAC register for some ctrl frame Tx power */
55464 + /* first part : 2.4G */
55465 + if (frequency <= ZM_CH_G_14)
55466 + {
55467 + /* Write MAC reg 0x694 for ACK's TPC */
55468 + /* Write MAC reg 0xbb4 RTS and SF-CTS frame power control */
55469 + /* Always use two stream for low legacy rate */
55470 + #if 0
55471 + //if (hpPriv->halCapability & ZM_HP_CAP_11N_ONE_TX_STREAM)
55472 + //{
55473 + zfDelayWriteInternalReg(dev, 0x1c3694, ((hpPriv->tPow2x2g[0]&0x3f) << 20) | (0x1<<26));
55474 + zfDelayWriteInternalReg(dev, 0x1c3bb4, ((hpPriv->tPow2x2g[0]&0x3f) << 5 ) | (0x1<<11) |
55475 + ((hpPriv->tPow2x2g[0]&0x3f) << 21) | (0x1<<27) );
55476 + //}
55477 + #endif
55478 + #if 1
55479 + //else
55480 + {
55481 + #ifndef ZM_OTUS_LINUX_PHASE_2
55482 + zfDelayWriteInternalReg(dev, 0x1c3694, ((hpPriv->tPow2x2g[0]&0x3f) << 20) | (0x5<<26));
55483 + zfDelayWriteInternalReg(dev, 0x1c3bb4, ((hpPriv->tPow2x2g[0]&0x3f) << 5 ) | (0x5<<11) |
55484 + ((hpPriv->tPow2x2g[0]&0x3f) << 21) | (0x5<<27) );
55485 + #endif
55486 + hpPriv->currentAckRtsTpc = hpPriv->tPow2x2g[0];
55487 + }
55488 + #endif
55489 + zfFlushDelayWrite(dev);
55490 +
55491 + zfPrintTargetPower2G(hpPriv->tPow2xCck,
55492 + hpPriv->tPow2x2g,
55493 + hpPriv->tPow2x2gHt20,
55494 + hpPriv->tPow2x2gHt40);
55495 + }
55496 + else
55497 + {
55498 + /* Write MAC reg 0x694 for ACK's TPC */
55499 + /* Write MAC reg 0xbb4 RTS and SF-CTS frame power control */
55500 + /* Always use two stream for low legacy rate */
55501 + if (hpPriv->halCapability & ZM_HP_CAP_11N_ONE_TX_STREAM)
55502 + {
55503 + #ifndef ZM_OTUS_LINUX_PHASE_2
55504 + zfDelayWriteInternalReg(dev, 0x1c3694, ((hpPriv->tPow2x5g[0]&0x3f) << 20) | (0x1<<26));
55505 + zfDelayWriteInternalReg(dev, 0x1c3bb4, ((hpPriv->tPow2x5g[0]&0x3f) << 5 ) | (0x1<<11) |
55506 + ((hpPriv->tPow2x5g[0]&0x3f) << 21) | (0x1<<27) );
55507 + #endif
55508 + }
55509 + else
55510 + {
55511 + #ifndef ZM_OTUS_LINUX_PHASE_2
55512 + zfDelayWriteInternalReg(dev, 0x1c3694, ((hpPriv->tPow2x5g[0]&0x3f) << 20) | (0x5<<26));
55513 + zfDelayWriteInternalReg(dev, 0x1c3bb4, ((hpPriv->tPow2x5g[0]&0x3f) << 5 ) | (0x5<<11) |
55514 + ((hpPriv->tPow2x5g[0]&0x3f) << 21) | (0x5<<27) );
55515 + #endif
55516 + hpPriv->currentAckRtsTpc = hpPriv->tPow2x2g[0];
55517 + }
55518 +
55519 +
55520 + zfFlushDelayWrite(dev);
55521 +
55522 + zfPrintTargetPower5G(
55523 + hpPriv->tPow2x5g,
55524 + hpPriv->tPow2x5gHt20,
55525 + hpPriv->tPow2x5gHt40);
55526 + }/* end of bandedges of 5G */
55527 +
55528 +}
55529 +
55530 +void zfDumpEepBandEdges(struct ar5416Eeprom* eepromImage)
55531 +{
55532 + #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG
55533 + u8_t i, j, k;
55534 +
55535 +#if 0
55536 + zm_dbg(("\n === BandEdges index dump ==== \n"));
55537 +
55538 + for (i = 0; i < AR5416_NUM_CTLS; i++)
55539 + {
55540 + zm_dbg(("%02x ", eepromImage->ctlIndex[i]));
55541 + }
55542 +
55543 + zm_dbg(("\n === BandEdges data dump ==== \n"));
55544 +
55545 + for (i = 0; i < AR5416_NUM_CTLS; i++)
55546 + {
55547 + for (j = 0; j < 2; j++)
55548 + {
55549 + for(k = 0; k < AR5416_NUM_BAND_EDGES; k++)
55550 + {
55551 + u8_t *pdata = (u8_t*)&(eepromImage->ctlData[i].ctlEdges[j][k]);
55552 + zm_dbg(("(%02x %02x)", pdata[0], pdata[1]));
55553 + }
55554 + zm_dbg(("\n"));
55555 + }
55556 + }
55557 +#else
55558 + zm_dbg(("\n === BandEdges index dump ==== \n"));
55559 + for (i = 0; i < 24; i+=8)
55560 + {
55561 + zm_dbg(("%02x %02x %02x %02x %02x %02x %02x %02x",
55562 + eepromImage->ctlIndex[i+0], eepromImage->ctlIndex[i+1], eepromImage->ctlIndex[i+2], eepromImage->ctlIndex[i+3],
55563 + eepromImage->ctlIndex[i+4], eepromImage->ctlIndex[i+5], eepromImage->ctlIndex[i+6], eepromImage->ctlIndex[i+7]
55564 + ));
55565 + }
55566 +
55567 + zm_dbg(("\n === BandEdges data dump ==== \n"));
55568 +
55569 + for (i = 0; i < AR5416_NUM_CTLS; i++)
55570 + {
55571 + for (j = 0; j < 2; j++)
55572 + {
55573 + u8_t *pdata = (u8_t*)&(eepromImage->ctlData[i].ctlEdges[j]);
55574 + zm_dbg(("(%03d %02x) (%03d %02x) (%03d %02x) (%03d %02x) \n",
55575 + pdata[0], pdata[1], pdata[2], pdata[3],
55576 + pdata[4], pdata[5], pdata[6], pdata[7]
55577 + ));
55578 + zm_dbg(("(%03d %02x) (%03d %02x) (%03d %02x) (%03d %02x) \n",
55579 + pdata[8], pdata[9], pdata[10], pdata[11],
55580 + pdata[12], pdata[13], pdata[14], pdata[15]
55581 + ));
55582 + }
55583 + }
55584 +#endif
55585 + #endif
55586 +}
55587 +
55588 +void zfPrintTargetPower2G(u8_t* tPow2xCck, u8_t* tPow2x2g, u8_t* tPow2x2gHt20, u8_t* tPow2x2gHt40)
55589 +{
55590 + //#ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG
55591 + #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG
55592 + DbgPrint("targetPwr CCK : %d, %d, %d, %d\n",
55593 + tPow2xCck[0],
55594 + tPow2xCck[1],
55595 + tPow2xCck[2],
55596 + tPow2xCck[3]
55597 + );
55598 + DbgPrint("targetPwr 2G : %d, %d, %d, %d\n",
55599 + tPow2x2g[0],
55600 + tPow2x2g[1],
55601 + tPow2x2g[2],
55602 + tPow2x2g[3]
55603 + );
55604 + DbgPrint("targetPwr 2GHT20 : %d, %d, %d, %d, %d, %d, %d, %d\n",
55605 + tPow2x2gHt20[0],
55606 + tPow2x2gHt20[1],
55607 + tPow2x2gHt20[2],
55608 + tPow2x2gHt20[3],
55609 + tPow2x2gHt20[4],
55610 + tPow2x2gHt20[5],
55611 + tPow2x2gHt20[6],
55612 + tPow2x2gHt20[7]
55613 + );
55614 + DbgPrint("targetPwr 2GHT40 : %d, %d, %d, %d, %d, %d, %d, %d\n",
55615 + tPow2x2gHt40[0],
55616 + tPow2x2gHt40[1],
55617 + tPow2x2gHt40[2],
55618 + tPow2x2gHt40[3],
55619 + tPow2x2gHt40[4],
55620 + tPow2x2gHt40[5],
55621 + tPow2x2gHt40[6],
55622 + tPow2x2gHt40[7]
55623 + );
55624 + #endif
55625 + return;
55626 +}
55627 +
55628 +void zfPrintTargetPower5G(u8_t* tPow2x5g, u8_t* tPow2x5gHt20, u8_t* tPow2x5gHt40)
55629 +{
55630 + //#ifdef ZM_ENABLE_TPC_WINDOWS_DEBUG
55631 + #ifdef ZM_ENABLE_BANDEDGES_WINDOWS_DEBUG
55632 + DbgPrint("targetPwr 5G : %d, %d, %d, %d\n",
55633 + tPow2x5g[0],
55634 + tPow2x5g[1],
55635 + tPow2x5g[2],
55636 + tPow2x5g[3]
55637 + );
55638 + DbgPrint("targetPwr 5GHT20 : %d, %d, %d, %d, %d, %d, %d, %d\n",
55639 + tPow2x5gHt20[0],
55640 + tPow2x5gHt20[1],
55641 + tPow2x5gHt20[2],
55642 + tPow2x5gHt20[3],
55643 + tPow2x5gHt20[4],
55644 + tPow2x5gHt20[5],
55645 + tPow2x5gHt20[6],
55646 + tPow2x5gHt20[7]
55647 + );
55648 + DbgPrint("targetPwr 5GHT40 : %d, %d, %d, %d, %d, %d, %d, %d\n",
55649 + tPow2x5gHt40[0],
55650 + tPow2x5gHt40[1],
55651 + tPow2x5gHt40[2],
55652 + tPow2x5gHt40[3],
55653 + tPow2x5gHt40[4],
55654 + tPow2x5gHt40[5],
55655 + tPow2x5gHt40[6],
55656 + tPow2x5gHt40[7]
55657 + );
55658 + #endif
55659 + return;
55660 +}
55661 +
55662 +void zfHpPowerSaveSetMode(zdev_t* dev, u8_t staMode, u8_t psMode, u16_t bcnInterval)
55663 +{
55664 + if ( staMode == 0 )
55665 + {
55666 + if ( psMode == 0 )
55667 + {
55668 + // Turn off pre-TBTT interrupt
55669 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_PRETBTT, 0);
55670 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_PERIOD, 0);
55671 + zfFlushDelayWrite(dev);
55672 + }
55673 + else
55674 + {
55675 + // Turn on pre-TBTT interrupt
55676 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_PRETBTT, (bcnInterval-6)<<16);
55677 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_PERIOD, bcnInterval);
55678 + zfFlushDelayWrite(dev);
55679 + }
55680 + }
55681 +}
55682 +
55683 +void zfHpPowerSaveSetState(zdev_t* dev, u8_t psState)
55684 +{
55685 + zmw_get_wlan_dev(dev);
55686 + struct zsHpPriv* hpPriv = wd->hpPrivate;
55687 +
55688 + //DbgPrint("INTO zfHpPowerSaveSetState");
55689 +
55690 + if ( psState == 0 ) //power up
55691 + {
55692 + //DbgPrint("zfHpPowerSaveSetState Wake up from PS\n");
55693 + reg_write(0x982C, 0x0000a000); //wake up ADDAC
55694 + reg_write(0x9808, 0x0); //enable all agc gain and offset updates to a2
55695 + //# bank 3
55696 + if (((struct zsHpPriv*)wd->hpPrivate)->hwFrequency <= ZM_CH_G_14)
55697 + {
55698 + /* 11g */
55699 + //reg_write (0x98f0, 0x01c00018);
55700 + reg_write (0x98f0, 0x01c20098);//syn_on+RX_ON
55701 + }
55702 + else
55703 + {
55704 + /* 11a */
55705 + //reg_write (0x98f0, 0x01400018);
55706 + reg_write (0x98f0, 0x01420098);//syn_on+RX_ON
55707 + }
55708 +
55709 + ////#bank 5
55710 + //reg_write(0x98b0, 0x00000013);
55711 + //reg_write(0x98e4, 0x00000002);
55712 +
55713 +
55714 + zfFlushDelayWrite(dev);
55715 + }
55716 + else //power down
55717 + {
55718 + //DbgPrint("zfHpPowerSaveSetState Go to PS\n");
55719 + //reg_write(0x982C, 0xa000a000);
55720 + reg_write(0x9808, 0x8000000); //disable all agc gain and offset updates to a2
55721 + reg_write(0x982C, 0xa000a000); //power down ADDAC
55722 + //# bank 3
55723 + if (((struct zsHpPriv*)wd->hpPrivate)->hwFrequency <= ZM_CH_G_14)
55724 + {
55725 + /* 11g */
55726 + reg_write (0x98f0, 0x00c00018);//syn_off+RX_off
55727 + }
55728 + else
55729 + {
55730 + /* 11a */
55731 + reg_write (0x98f0, 0x00400018);//syn_off+RX_off
55732 + }
55733 +
55734 + ////#bank 5
55735 + //reg_write(0x98b0, 0x000e0013);
55736 + //reg_write(0x98e4, 0x00018002);
55737 +
55738 +
55739 + zfFlushDelayWrite(dev);
55740 + }
55741 +}
55742 +
55743 +void zfHpSetAggPktNum(zdev_t* dev, u32_t num)
55744 +{
55745 + zmw_get_wlan_dev(dev);
55746 + struct zsHpPriv* hpPriv = wd->hpPrivate;
55747 +
55748 + num = (num << 16) | (0xa);
55749 +
55750 + hpPriv->aggPktNum = num;
55751 +
55752 + //aggregation number will be update in HAL heart beat
55753 + //zfDelayWriteInternalReg(dev, 0x1c3b9c, num);
55754 + //zfFlushDelayWrite(dev);
55755 +}
55756 +
55757 +void zfHpSetMPDUDensity(zdev_t* dev, u8_t density)
55758 +{
55759 + u32_t value;
55760 +
55761 + if (density > ZM_MPDU_DENSITY_8US)
55762 + {
55763 + return;
55764 + }
55765 +
55766 + /* Default value in this register */
55767 + value = 0x140A00 | density;
55768 +
55769 + zfDelayWriteInternalReg(dev, 0x1c3ba0, value);
55770 + zfFlushDelayWrite(dev);
55771 + return;
55772 +}
55773 +
55774 +void zfHpSetSlotTime(zdev_t* dev, u8_t type)
55775 +{
55776 + zmw_get_wlan_dev(dev);
55777 + struct zsHpPriv* hpPriv = wd->hpPrivate;
55778 +
55779 + if (type == 0)
55780 + {
55781 + //normal slot = 20us
55782 + hpPriv->slotType = 0;
55783 + }
55784 + else //if (type == 1)
55785 + {
55786 + //short slot = 9us
55787 + hpPriv->slotType = 1;
55788 + }
55789 +
55790 + return;
55791 +}
55792 +
55793 +void zfHpSetSlotTimeRegister(zdev_t* dev, u8_t type)
55794 +{
55795 + if(type == 0)
55796 + {
55797 + //normal slot = 20us
55798 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_SLOT_TIME, 20<<10);
55799 + }
55800 + else
55801 + {
55802 + //short slot = 9us
55803 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_SLOT_TIME, 9<<10);
55804 + }
55805 +}
55806 +
55807 +void zfHpSetRifs(zdev_t* dev, u8_t ht_enable, u8_t ht2040, u8_t g_mode)
55808 +{
55809 + zfDelayWriteInternalReg(dev, 0x1c6388, 0x0c000000);
55810 +
55811 + zfDelayWriteInternalReg(dev, 0x1c59ec, 0x0cc80caa);
55812 +
55813 + if (ht_enable)
55814 + {
55815 + if (ht2040)
55816 + {
55817 + zfDelayWriteInternalReg(dev, 0x1c5918, 40);
55818 + }
55819 + else
55820 + {
55821 + zfDelayWriteInternalReg(dev, 0x1c5918, 20);
55822 + }
55823 + }
55824 +
55825 + if (g_mode)
55826 + {
55827 + zfDelayWriteInternalReg(dev, 0x1c5850, 0xec08b4e2);
55828 + zfDelayWriteInternalReg(dev, 0x1c585c, 0x313a5d5e);
55829 + }
55830 + else
55831 + {
55832 + zfDelayWriteInternalReg(dev, 0x1c5850, 0xede8b4e0);
55833 + zfDelayWriteInternalReg(dev, 0x1c585c, 0x3139605e);
55834 + }
55835 +
55836 + zfFlushDelayWrite(dev);
55837 + return;
55838 +}
55839 +
55840 +void zfHpBeginSiteSurvey(zdev_t* dev, u8_t status)
55841 +{
55842 + zmw_get_wlan_dev(dev);
55843 + struct zsHpPriv* hpPriv=wd->hpPrivate;
55844 +
55845 + if ( status == 1 )
55846 + { // Connected
55847 + hpPriv->isSiteSurvey = 1;
55848 + }
55849 + else
55850 + { // Not connected
55851 + hpPriv->isSiteSurvey = 0;
55852 + }
55853 +
55854 + /* reset workaround state to default */
55855 +// if (hpPriv->rxStrongRSSI == 1)
55856 + {
55857 + hpPriv->rxStrongRSSI = 0;
55858 + if ((hpPriv->eepromImage[0x100+0x110*2/4]&0xff) == 0x80) //FEM TYPE
55859 + {
55860 + if (hpPriv->hwFrequency <= ZM_CH_G_14)
55861 + {
55862 + zfDelayWriteInternalReg(dev, 0x1c8960, 0x9b49);
55863 + }
55864 + else
55865 + {
55866 + zfDelayWriteInternalReg(dev, 0x1c8960, 0x0900);
55867 + }
55868 + }
55869 + else
55870 + {
55871 + zfDelayWriteInternalReg(dev, 0x1c8960, 0x9b40);
55872 + }
55873 + zfFlushDelayWrite(dev);
55874 + }
55875 +// if (hpPriv->strongRSSI == 1)
55876 + {
55877 + hpPriv->strongRSSI = 0;
55878 + zfDelayWriteInternalReg(dev, 0x1c3694, ((hpPriv->currentAckRtsTpc&0x3f) << 20) | (0x5<<26));
55879 + zfDelayWriteInternalReg(dev, 0x1c3bb4, ((hpPriv->currentAckRtsTpc&0x3f) << 5 ) | (0x5<<11) |
55880 + ((hpPriv->currentAckRtsTpc&0x3f) << 21) | (0x5<<27) );
55881 + zfFlushDelayWrite(dev);
55882 + }
55883 +}
55884 +
55885 +void zfHpFinishSiteSurvey(zdev_t* dev, u8_t status)
55886 +{
55887 + zmw_get_wlan_dev(dev);
55888 + struct zsHpPriv* hpPriv=wd->hpPrivate;
55889 +
55890 + zmw_declare_for_critical_section();
55891 +
55892 + zmw_enter_critical_section(dev);
55893 + if ( status == 1 )
55894 + {
55895 + hpPriv->isSiteSurvey = 2;
55896 + }
55897 + else
55898 + {
55899 + hpPriv->isSiteSurvey = 0;
55900 + }
55901 + zmw_leave_critical_section(dev);
55902 +}
55903 +
55904 +u16_t zfFwRetry(zdev_t* dev, u8_t enable)
55905 +{
55906 + u32_t cmd[(ZM_MAX_CMD_SIZE/4)];
55907 + u16_t ret = 0;
55908 +
55909 + cmd[0] = 4 | (0x92 << 8);
55910 + cmd[1] = (enable == 1) ? 0x01 : 0x00;
55911 +
55912 + ret = zfIssueCmd(dev, cmd, 8, ZM_OID_INTERNAL_WRITE, NULL);
55913 + return ret;
55914 +}
55915 +
55916 +u16_t zfHpEnableHwRetry(zdev_t* dev)
55917 +{
55918 + u16_t ret;
55919 +
55920 + ret = zfFwRetry(dev, 0);
55921 +
55922 + zfDelayWriteInternalReg(dev, 0x1c3b28, 0x33333);
55923 + zfFlushDelayWrite(dev);
55924 +
55925 + return ret;
55926 +}
55927 +
55928 +u16_t zfHpDisableHwRetry(zdev_t* dev)
55929 +{
55930 + u16_t ret;
55931 +
55932 + ret = zfFwRetry(dev, 1);
55933 +
55934 + zfDelayWriteInternalReg(dev, 0x1c3b28, 0x00000);
55935 + zfFlushDelayWrite(dev);
55936 +
55937 + return ret;
55938 +}
55939 +
55940 +/* Download SPI Fw */
55941 +#define ZM_FIRMWARE_WLAN 0
55942 +#define ZM_FIRMWARE_SPI_FLASH 1
55943 +
55944 +
55945 +u16_t zfHpFirmwareDownload(zdev_t* dev, u8_t fwType)
55946 +{
55947 + u16_t ret = ZM_SUCCESS;
55948 +
55949 + if (fwType == ZM_FIRMWARE_WLAN)
55950 + {
55951 + ret = zfFirmwareDownload(dev, (u32_t*)zcFwImage,
55952 + (u32_t)zcFwImageSize, ZM_FIRMWARE_WLAN_ADDR);
55953 + }
55954 + else if (fwType == ZM_FIRMWARE_SPI_FLASH)
55955 + {
55956 + ret = zfFirmwareDownload(dev, (u32_t*)zcFwImageSPI,
55957 + (u32_t)zcFwImageSPISize, ZM_FIRMWARE_SPI_ADDR);
55958 + }
55959 + else
55960 + {
55961 + zm_debug_msg1("Unknown firmware type = ", fwType);
55962 + ret = ZM_ERR_FIRMWARE_WRONG_TYPE;
55963 + }
55964 +
55965 + return ret;
55966 +}
55967 +
55968 +/* Enable software decryption */
55969 +void zfHpSWDecrypt(zdev_t* dev, u8_t enable)
55970 +{
55971 + u32_t value = 0x70;
55972 +
55973 + /* Bit 4 for enable software decryption */
55974 + if (enable == 1)
55975 + {
55976 + value = 0x78;
55977 + }
55978 +
55979 + zfDelayWriteInternalReg(dev, 0x1c3678, value);
55980 + zfFlushDelayWrite(dev);
55981 +}
55982 +
55983 +/* Enable software encryption */
55984 +void zfHpSWEncrypt(zdev_t* dev, u8_t enable)
55985 +{
55986 + /* Because encryption by software or hardware is judged by driver in Otus,
55987 + we don't need to do anything in the HAL layer.
55988 + */
55989 +}
55990 +
55991 +u32_t zfHpCapability(zdev_t* dev)
55992 +{
55993 + zmw_get_wlan_dev(dev);
55994 + struct zsHpPriv* hpPriv=wd->hpPrivate;
55995 +
55996 + return hpPriv->halCapability;
55997 +}
55998 +
55999 +void zfHpSetRollCallTable(zdev_t* dev)
56000 +{
56001 + zmw_get_wlan_dev(dev);
56002 + struct zsHpPriv* hpPriv=wd->hpPrivate;
56003 +
56004 + if (hpPriv->camRollCallTable != (u64_t) 0)
56005 + {
56006 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_ROLL_CALL_TBL_L, (u32_t)(hpPriv->camRollCallTable & 0xffffffff));
56007 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_ROLL_CALL_TBL_H, (u32_t)((hpPriv->camRollCallTable >> 32) & 0xffffffff));
56008 + zfFlushDelayWrite(dev);
56009 + }
56010 +}
56011 +
56012 +void zfHpSetTTSIFSTime(zdev_t* dev, u8_t sifs_time)
56013 +{
56014 + u32_t reg_value = 0;
56015 + zmw_get_wlan_dev(dev);
56016 +
56017 + sifs_time &= 0x3f;
56018 + reg_value = 0x14400b | (((u32_t)sifs_time)<<24);
56019 +
56020 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_EIFS_AND_SIFS, reg_value);
56021 + zfFlushDelayWrite(dev);
56022 +}
56023 +
56024 +/* #3 Enable RIFS function if the RIFS pattern matched ! */
56025 +void zfHpEnableRifs(zdev_t* dev, u8_t mode24g, u8_t modeHt, u8_t modeHt2040)
56026 +{
56027 +
56028 + /* # Enable Reset TDOMAIN
56029 + * $rddata = &$phyreg_read(0x9800+(738<<2));
56030 + * $wrdata = $rddata | (0x1 << 26) | (0x1 << 27);
56031 + * &$phyreg_write(0x9800+(738<<2), $wrdata);
56032 + */
56033 + reg_write (0x9800+(738<<2), 0x08000000 | (0x1 << 26) | (0x1 << 27));
56034 + //reg_write (0x9800+(738<<2), 0x08000000 | (0x1 << 26));
56035 +
56036 + /* # reg 123: heavy clip factor, xr / RIFS search parameters */
56037 + reg_write (0x99ec, 0x0cc80caa);
56038 +
56039 + /* # Reduce Search Start Delay for RIFS */
56040 + if (modeHt == 1) /* ($HT_ENABLE == 1) */
56041 + {
56042 + if (modeHt2040 == 0x1) /* ($DYNAMIC_HT2040_EN == 0x1) */
56043 + {
56044 + reg_write(0x9800+(70<<2), 40);/*40*/
56045 + }
56046 + else
56047 + {
56048 + reg_write(0x9800+(70<<2), 20);
56049 + if(mode24g == 0x0)
56050 + {
56051 + /* $rddata = &$phyreg_read(0x9800+(24<<2));#0x9860;0x1c5860
56052 + *$wrdata = ($rddata & 0xffffffc7) | (0x4 << 3);
56053 + * &$phyreg_write(0x9800+(24<<2), $wrdata);
56054 + */
56055 + reg_write(0x9800+(24<<2), (0x0004dd10 & 0xffffffc7) | (0x4 << 3));
56056 + }
56057 + }
56058 + }
56059 +
56060 + if (mode24g == 0x1)
56061 + {
56062 + reg_write(0x9850, 0xece8b4e4);/*org*/
56063 + //reg_write(0x9850, 0xece8b4e2);
56064 + reg_write(0x985c, 0x313a5d5e);
56065 + }
56066 + else
56067 + {
56068 + reg_write(0x9850, 0xede8b4e4);
56069 + reg_write(0x985c, 0x3139605e);
56070 + }
56071 +
56072 + zfFlushDelayWrite(dev);
56073 +
56074 + return;
56075 +}
56076 +
56077 +/* #4 Disable RIFS function if the RIFS timer is timeout ! */
56078 +void zfHpDisableRifs(zdev_t* dev)
56079 +{
56080 + zmw_get_wlan_dev(dev);
56081 +
56082 + /* Disable RIFS function is to store these HW register initial value while the device plug-in and
56083 + re-write to these register if the RIFS function is disabled */
56084 +
56085 + // reg : 9850
56086 + reg_write(0x9850, ((struct zsHpPriv*)wd->hpPrivate)->initDesiredSigSize);
56087 +
56088 + // reg : 985c
56089 + reg_write(0x985c, ((struct zsHpPriv*)wd->hpPrivate)->initAGC);
56090 +
56091 + // reg : 9860
56092 + reg_write(0x9800+(24<<2), ((struct zsHpPriv*)wd->hpPrivate)->initAgcControl);
56093 +
56094 + // reg : 9918
56095 + reg_write(0x9800+(70<<2), ((struct zsHpPriv*)wd->hpPrivate)->initSearchStartDelay);
56096 +
56097 + // reg : 991c
56098 + reg_write (0x99ec, ((struct zsHpPriv*)wd->hpPrivate)->initRIFSSearchParams);
56099 +
56100 + // reg : a388
56101 + reg_write (0x9800+(738<<2), ((struct zsHpPriv*)wd->hpPrivate)->initFastChannelChangeControl);
56102 +
56103 + zfFlushDelayWrite(dev);
56104 +
56105 + return;
56106 +}
56107 --- /dev/null
56108 +++ b/drivers/staging/otus/hal/hpreg.c
56109 @@ -0,0 +1,2481 @@
56110 +/*
56111 + * Copyright (c) 2000-2005 ZyDAS Technology Corporation
56112 + * Copyright (c) 2007-2008 Atheros Communications Inc.
56113 + *
56114 + * Permission to use, copy, modify, and/or distribute this software for any
56115 + * purpose with or without fee is hereby granted, provided that the above
56116 + * copyright notice and this permission notice appear in all copies.
56117 + *
56118 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
56119 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
56120 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
56121 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
56122 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
56123 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
56124 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
56125 + */
56126 +/* */
56127 +/* Module Name : hpreg.c */
56128 +/* */
56129 +/* Abstract */
56130 +/* This module contains Regulatory Table and related function. */
56131 +/* */
56132 +/* NOTES */
56133 +/* None */
56134 +/* */
56135 +/************************************************************************/
56136 +#include "../80211core/cprecomp.h"
56137 +#include "hpani.h"
56138 +#include "hpreg.h"
56139 +#include "hpusb.h"
56140 +
56141 +/* used throughout this file... */
56142 +#define N(a) (sizeof (a) / sizeof (a[0]))
56143 +
56144 +#define HAL_MODE_11A_TURBO HAL_MODE_108A
56145 +#define HAL_MODE_11G_TURBO HAL_MODE_108G
56146 +
56147 +#if 0
56148 +enum {
56149 + /* test groups */
56150 + FCC = 0x10,
56151 + MKK = 0x40,
56152 + ETSI = 0x30,
56153 + SD_NO_CTL = 0xe0,
56154 + NO_CTL = 0xff,
56155 + /* test modes */
56156 + CTL_MODE_M = 0x0f,
56157 + CTL_11A = 0,
56158 + CTL_11B = 1,
56159 + CTL_11G = 2,
56160 + CTL_TURBO = 3,
56161 + CTL_108G = 4,
56162 + CTL_2GHT20 = 5,
56163 + CTL_5GHT20 = 6,
56164 + CTL_2GHT40 = 7,
56165 + CTL_5GHT40 = 8
56166 +};
56167 +#endif
56168 +
56169 +/*
56170 + * The following are flags for different requirements per reg domain.
56171 + * These requirements are either inhereted from the reg domain pair or
56172 + * from the unitary reg domain if the reg domain pair flags value is
56173 + * 0
56174 + */
56175 +
56176 +enum {
56177 + NO_REQ = 0x00000000,
56178 + DISALLOW_ADHOC_11A = 0x00000001,
56179 + DISALLOW_ADHOC_11A_TURB = 0x00000002,
56180 + NEED_NFC = 0x00000004,
56181 +
56182 + ADHOC_PER_11D = 0x00000008, /* Start Ad-Hoc mode */
56183 + ADHOC_NO_11A = 0x00000010,
56184 +
56185 + PUBLIC_SAFETY_DOMAIN = 0x00000020, /* public safety domain */
56186 + LIMIT_FRAME_4MS = 0x00000040, /* 4msec limit on the frame length */
56187 +};
56188 +
56189 +#define MKK5GHZ_FLAG1 (DISALLOW_ADHOC_11A_TURB | NEED_NFC | LIMIT_FRAME_4MS)
56190 +#define MKK5GHZ_FLAG2 (DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB | NEED_NFC| LIMIT_FRAME_4MS)
56191 +
56192 +typedef enum {
56193 + DFS_UNINIT_DOMAIN = 0, /* Uninitialized dfs domain */
56194 + DFS_FCC_DOMAIN = 1, /* FCC3 dfs domain */
56195 + DFS_ETSI_DOMAIN = 2, /* ETSI dfs domain */
56196 +} HAL_DFS_DOMAIN;
56197 +
56198 +/*
56199 + * Used to set the RegDomain bitmask which chooses which frequency
56200 + * band specs are used.
56201 + */
56202 +
56203 +#define BMLEN 2 /* Use 2 64 bit uint for channel bitmask
56204 + NB: Must agree with macro below (BM) */
56205 +#define BMZERO {(u64_t) 0, (u64_t) 0} /* BMLEN zeros */
56206 +
56207 +#if 0
56208 +
56209 +#define BM(_fa, _fb, _fc, _fd, _fe, _ff, _fg, _fh, _fi, _fj, _fk, _fl) \
56210 + {((((_fa >= 0) && (_fa < 64)) ? (((u64_t) 1) << _fa) : (u64_t) 0) | \
56211 + (((_fb >= 0) && (_fb < 64)) ? (((u64_t) 1) << _fb) : (u64_t) 0) | \
56212 + (((_fc >= 0) && (_fc < 64)) ? (((u64_t) 1) << _fc) : (u64_t) 0) | \
56213 + (((_fd >= 0) && (_fd < 64)) ? (((u64_t) 1) << _fd) : (u64_t) 0) | \
56214 + (((_fe >= 0) && (_fe < 64)) ? (((u64_t) 1) << _fe) : (u64_t) 0) | \
56215 + (((_ff >= 0) && (_ff < 64)) ? (((u64_t) 1) << _ff) : (u64_t) 0) | \
56216 + (((_fg >= 0) && (_fg < 64)) ? (((u64_t) 1) << _fg) : (u64_t) 0) | \
56217 + (((_fh >= 0) && (_fh < 64)) ? (((u64_t) 1) << _fh) : (u64_t) 0) | \
56218 + (((_fi >= 0) && (_fi < 64)) ? (((u64_t) 1) << _fi) : (u64_t) 0) | \
56219 + (((_fj >= 0) && (_fj < 64)) ? (((u64_t) 1) << _fj) : (u64_t) 0) | \
56220 + (((_fk >= 0) && (_fk < 64)) ? (((u64_t) 1) << _fk) : (u64_t) 0) | \
56221 + (((_fl >= 0) && (_fl < 64)) ? (((u64_t) 1) << _fl) : (u64_t) 0) | \
56222 + ((((_fa > 63) && (_fa < 128)) ? (((u64_t) 1) << (_fa - 64)) : (u64_t) 0) | \
56223 + (((_fb > 63) && (_fb < 128)) ? (((u64_t) 1) << (_fb - 64)) : (u64_t) 0) | \
56224 + (((_fc > 63) && (_fc < 128)) ? (((u64_t) 1) << (_fc - 64)) : (u64_t) 0) | \
56225 + (((_fd > 63) && (_fd < 128)) ? (((u64_t) 1) << (_fd - 64)) : (u64_t) 0) | \
56226 + (((_fe > 63) && (_fe < 128)) ? (((u64_t) 1) << (_fe - 64)) : (u64_t) 0) | \
56227 + (((_ff > 63) && (_ff < 128)) ? (((u64_t) 1) << (_ff - 64)) : (u64_t) 0) | \
56228 + (((_fg > 63) && (_fg < 128)) ? (((u64_t) 1) << (_fg - 64)) : (u64_t) 0) | \
56229 + (((_fh > 63) && (_fh < 128)) ? (((u64_t) 1) << (_fh - 64)) : (u64_t) 0) | \
56230 + (((_fi > 63) && (_fi < 128)) ? (((u64_t) 1) << (_fi - 64)) : (u64_t) 0) | \
56231 + (((_fj > 63) && (_fj < 128)) ? (((u64_t) 1) << (_fj - 64)) : (u64_t) 0) | \
56232 + (((_fk > 63) && (_fk < 128)) ? (((u64_t) 1) << (_fk - 64)) : (u64_t) 0) | \
56233 + (((_fl > 63) && (_fl < 128)) ? (((u64_t) 1) << (_fl - 64)) : (u64_t) 0)))}
56234 +
56235 +#else
56236 +
56237 +#define BM(_fa, _fb, _fc, _fd, _fe, _ff, _fg, _fh, _fi, _fj, _fk, _fl) \
56238 + {((((_fa >= 0) && (_fa < 64)) ? (((u64_t) 1) << (_fa&0x3f)) : (u64_t) 0) | \
56239 + (((_fb >= 0) && (_fb < 64)) ? (((u64_t) 1) << (_fb&0x3f)) : (u64_t) 0) | \
56240 + (((_fc >= 0) && (_fc < 64)) ? (((u64_t) 1) << (_fc&0x3f)) : (u64_t) 0) | \
56241 + (((_fd >= 0) && (_fd < 64)) ? (((u64_t) 1) << (_fd&0x3f)) : (u64_t) 0) | \
56242 + (((_fe >= 0) && (_fe < 64)) ? (((u64_t) 1) << (_fe&0x3f)) : (u64_t) 0) | \
56243 + (((_ff >= 0) && (_ff < 64)) ? (((u64_t) 1) << (_ff&0x3f)) : (u64_t) 0) | \
56244 + (((_fg >= 0) && (_fg < 64)) ? (((u64_t) 1) << (_fg&0x3f)) : (u64_t) 0) | \
56245 + (((_fh >= 0) && (_fh < 64)) ? (((u64_t) 1) << (_fh&0x3f)) : (u64_t) 0) | \
56246 + (((_fi >= 0) && (_fi < 64)) ? (((u64_t) 1) << (_fi&0x3f)) : (u64_t) 0) | \
56247 + (((_fj >= 0) && (_fj < 64)) ? (((u64_t) 1) << (_fj&0x3f)) : (u64_t) 0) | \
56248 + (((_fk >= 0) && (_fk < 64)) ? (((u64_t) 1) << (_fk&0x3f)) : (u64_t) 0) | \
56249 + (((_fl >= 0) && (_fl < 64)) ? (((u64_t) 1) << (_fl&0x3f)) : (u64_t) 0) | \
56250 + ((((_fa > 63) && (_fa < 128)) ? (((u64_t) 1) << ((_fa - 64)&0x3f)) : (u64_t) 0) | \
56251 + (((_fb > 63) && (_fb < 128)) ? (((u64_t) 1) << ((_fb - 64)&0x3f)) : (u64_t) 0) | \
56252 + (((_fc > 63) && (_fc < 128)) ? (((u64_t) 1) << ((_fc - 64)&0x3f)) : (u64_t) 0) | \
56253 + (((_fd > 63) && (_fd < 128)) ? (((u64_t) 1) << ((_fd - 64)&0x3f)) : (u64_t) 0) | \
56254 + (((_fe > 63) && (_fe < 128)) ? (((u64_t) 1) << ((_fe - 64)&0x3f)) : (u64_t) 0) | \
56255 + (((_ff > 63) && (_ff < 128)) ? (((u64_t) 1) << ((_ff - 64)&0x3f)) : (u64_t) 0) | \
56256 + (((_fg > 63) && (_fg < 128)) ? (((u64_t) 1) << ((_fg - 64)&0x3f)) : (u64_t) 0) | \
56257 + (((_fh > 63) && (_fh < 128)) ? (((u64_t) 1) << ((_fh - 64)&0x3f)) : (u64_t) 0) | \
56258 + (((_fi > 63) && (_fi < 128)) ? (((u64_t) 1) << ((_fi - 64)&0x3f)) : (u64_t) 0) | \
56259 + (((_fj > 63) && (_fj < 128)) ? (((u64_t) 1) << ((_fj - 64)&0x3f)) : (u64_t) 0) | \
56260 + (((_fk > 63) && (_fk < 128)) ? (((u64_t) 1) << ((_fk - 64)&0x3f)) : (u64_t) 0) | \
56261 + (((_fl > 63) && (_fl < 128)) ? (((u64_t) 1) << ((_fl - 64)&0x3f)) : (u64_t) 0)))}
56262 +
56263 +#endif
56264 +
56265 +/* Mask to check whether a domain is a multidomain or a single
56266 + domain */
56267 +
56268 +#define MULTI_DOMAIN_MASK 0xFF00
56269 +
56270 +
56271 +/*
56272 + * The following describe the bit masks for different passive scan
56273 + * capability/requirements per regdomain.
56274 + */
56275 +#define NO_PSCAN 0x0ULL
56276 +#define PSCAN_FCC 0x0000000000000001ULL
56277 +#define PSCAN_FCC_T 0x0000000000000002ULL
56278 +#define PSCAN_ETSI 0x0000000000000004ULL
56279 +#define PSCAN_MKK1 0x0000000000000008ULL
56280 +#define PSCAN_MKK2 0x0000000000000010ULL
56281 +#define PSCAN_MKKA 0x0000000000000020ULL
56282 +#define PSCAN_MKKA_G 0x0000000000000040ULL
56283 +#define PSCAN_ETSIA 0x0000000000000080ULL
56284 +#define PSCAN_ETSIB 0x0000000000000100ULL
56285 +#define PSCAN_ETSIC 0x0000000000000200ULL
56286 +#define PSCAN_WWR 0x0000000000000400ULL
56287 +#define PSCAN_MKKA1 0x0000000000000800ULL
56288 +#define PSCAN_MKKA1_G 0x0000000000001000ULL
56289 +#define PSCAN_MKKA2 0x0000000000002000ULL
56290 +#define PSCAN_MKKA2_G 0x0000000000004000ULL
56291 +#define PSCAN_MKK3 0x0000000000008000ULL
56292 +#define PSCAN_DEFER 0x7FFFFFFFFFFFFFFFULL
56293 +#define IS_ECM_CHAN 0x8000000000000000ULL
56294 +
56295 +/*
56296 + * THE following table is the mapping of regdomain pairs specified by
56297 + * an 8 bit regdomain value to the individual unitary reg domains
56298 + */
56299 +
56300 +typedef struct reg_dmn_pair_mapping {
56301 + u16_t regDmnEnum; /* 16 bit reg domain pair */
56302 + u16_t regDmn5GHz; /* 5GHz reg domain */
56303 + u16_t regDmn2GHz; /* 2GHz reg domain */
56304 + u32_t flags5GHz; /* Requirements flags (AdHoc
56305 + disallow, noise floor cal needed,
56306 + etc) */
56307 + u32_t flags2GHz; /* Requirements flags (AdHoc
56308 + disallow, noise floor cal needed,
56309 + etc) */
56310 + u64_t pscanMask; /* Passive Scan flags which
56311 + can override unitary domain
56312 + passive scan flags. This
56313 + value is used as a mask on
56314 + the unitary flags*/
56315 + u16_t singleCC; /* Country code of single country if
56316 + a one-on-one mapping exists */
56317 +} REG_DMN_PAIR_MAPPING;
56318 +
56319 +static REG_DMN_PAIR_MAPPING regDomainPairs[] = {
56320 + {NO_ENUMRD, FCC2, DEBUG_REG_DMN, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56321 + {NULL1_WORLD, NULL1, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56322 + {NULL1_ETSIB, NULL1, ETSIB, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56323 + {NULL1_ETSIC, NULL1, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56324 +
56325 + {FCC2_FCCA, FCC2, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56326 + {FCC2_WORLD, FCC2, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56327 + {FCC2_ETSIC, FCC2, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56328 + {FCC3_FCCA, FCC3, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56329 + {FCC3_WORLD, FCC3, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56330 + {FCC4_FCCA, FCC4, FCCA, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 },
56331 + {FCC5_FCCA, FCC5, FCCA, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 },
56332 + {FCC6_FCCA, FCC6, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56333 + {FCC6_WORLD, FCC6, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56334 +
56335 + {ETSI1_WORLD, ETSI1, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 },
56336 + {ETSI2_WORLD, ETSI2, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 },
56337 + {ETSI3_WORLD, ETSI3, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 },
56338 + {ETSI4_WORLD, ETSI4, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 },
56339 + {ETSI5_WORLD, ETSI5, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 },
56340 + {ETSI6_WORLD, ETSI6, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 },
56341 +
56342 + {ETSI3_ETSIA, ETSI3, WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 },
56343 + {FRANCE_RES, ETSI3, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56344 +
56345 + {FCC1_WORLD, FCC1, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56346 + {FCC1_FCCA, FCC1, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56347 + {APL1_WORLD, APL1, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56348 + {APL2_WORLD, APL2, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56349 + {APL3_WORLD, APL3, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56350 + {APL4_WORLD, APL4, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56351 + {APL5_WORLD, APL5, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56352 + {APL6_WORLD, APL6, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56353 + {APL8_WORLD, APL8, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56354 + {APL9_WORLD, APL9, WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56355 +
56356 + {APL3_FCCA, APL3, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56357 + {APL1_ETSIC, APL1, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56358 + {APL2_ETSIC, APL2, ETSIC, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56359 + {APL2_FCCA, APL2, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56360 + {APL2_APLD, APL2, APLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0},
56361 + {APL7_FCCA, APL7, FCCA, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56362 +
56363 + {MKK1_MKKA, MKK1, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA, CTRY_JAPAN },
56364 + {MKK1_MKKB, MKK1, MKKA, MKK5GHZ_FLAG2, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN1 },
56365 + {MKK1_FCCA, MKK1, FCCA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1, CTRY_JAPAN2 },
56366 + {MKK1_MKKA1, MKK1, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_JAPAN4 },
56367 + {MKK1_MKKA2, MKK1, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN5 },
56368 + {MKK1_MKKC, MKK1, MKKC, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1, CTRY_JAPAN6 },
56369 +
56370 + /* MKK2 */
56371 + {MKK2_MKKA, MKK2, MKKA, MKK5GHZ_FLAG2, NEED_NFC, PSCAN_MKK2 | PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN3 },
56372 +
56373 + /* MKK3 */
56374 + {MKK3_MKKA, MKK3, MKKA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN25 },
56375 + {MKK3_MKKB, MKK3, MKKA, MKK5GHZ_FLAG2, NEED_NFC, PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN7 },
56376 + {MKK3_MKKA1, MKK3, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_JAPAN26 },
56377 + {MKK3_MKKA2, MKK3, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN8 },
56378 + {MKK3_MKKC, MKK3, MKKC, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN9 },
56379 + {MKK3_FCCA, MKK3, FCCA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN27 },
56380 +
56381 + /* MKK4 */
56382 + {MKK4_MKKB, MKK4, MKKA, MKK5GHZ_FLAG2, NEED_NFC, PSCAN_MKK3 | PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN10 },
56383 + {MKK4_MKKA1, MKK4, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK3 | PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_JAPAN28 },
56384 + {MKK4_MKKA2, MKK4, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK3 |PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN11 },
56385 + {MKK4_MKKC, MKK4, MKKC, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK3, CTRY_JAPAN12 },
56386 + {MKK4_FCCA, MKK4, FCCA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN29 },
56387 + {MKK4_MKKA, MKK4, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK3 | PSCAN_MKKA, CTRY_JAPAN36 },
56388 +
56389 + /* MKK5 */
56390 + {MKK5_MKKB, MKK5, MKKA, MKK5GHZ_FLAG2, NEED_NFC, PSCAN_MKK3 | PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN13 },
56391 + {MKK5_MKKA2, MKK5, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK3 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN14 },
56392 + {MKK5_MKKC, MKK5, MKKC, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK3, CTRY_JAPAN15 },
56393 +
56394 + /* MKK6 */
56395 + {MKK6_MKKB, MKK6, MKKA, MKK5GHZ_FLAG2, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN16 },
56396 + {MKK6_MKKA2, MKK6, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN17 },
56397 + {MKK6_MKKC, MKK6, MKKC, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1, CTRY_JAPAN18 },
56398 + {MKK6_MKKA1, MKK6, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_JAPAN30 },
56399 + {MKK6_FCCA, MKK6, FCCA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN31 },
56400 +
56401 + /* MKK7 */
56402 + {MKK7_MKKB, MKK7, MKKA, MKK5GHZ_FLAG2, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 | PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN19 },
56403 + {MKK7_MKKA, MKK7, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN20 },
56404 + {MKK7_MKKC, MKK7, MKKC, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3, CTRY_JAPAN21 },
56405 + {MKK7_MKKA1, MKK7, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_JAPAN32 },
56406 + {MKK7_FCCA, MKK7, FCCA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN33 },
56407 +
56408 + /* MKK8 */
56409 + {MKK8_MKKB, MKK8, MKKA, MKK5GHZ_FLAG2, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 | PSCAN_MKKA | PSCAN_MKKA_G, CTRY_JAPAN22 },
56410 + {MKK8_MKKA2, MKK8, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN23 },
56411 + {MKK8_MKKC, MKK8, MKKC, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 , CTRY_JAPAN24 },
56412 +
56413 + /* MKK9 */
56414 + {MKK9_MKKA, MKK9, MKKA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN34 },
56415 + {MKK9_FCCA, MKK9, FCCA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN37 },
56416 + {MKK9_MKKA1, MKK9, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_JAPAN38 },
56417 + {MKK9_MKKC, MKK9, MKKC, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN39 },
56418 + {MKK9_MKKA2, MKK9, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN40 },
56419 +
56420 + /* MKK10 */
56421 + {MKK10_MKKA, MKK10, MKKA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN35 },
56422 + {MKK10_FCCA, MKK10, FCCA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN41 },
56423 + {MKK10_MKKA1, MKK10, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_JAPAN42 },
56424 + {MKK10_MKKC, MKK10, MKKC, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN43 },
56425 + {MKK10_MKKA2, MKK10, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN44 },
56426 +
56427 + /* MKK11 */
56428 + {MKK11_MKKA, MKK11, MKKA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN45 },
56429 + {MKK11_FCCA, MKK11, FCCA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN46 },
56430 + {MKK11_MKKA1, MKK11, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_JAPAN47 },
56431 + {MKK11_MKKC, MKK11, MKKC, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN48 },
56432 + {MKK11_MKKA2, MKK11, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN49 },
56433 +
56434 + /* MKK12 */
56435 + {MKK12_MKKA, MKK12, MKKA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN50 },
56436 + {MKK12_FCCA, MKK12, FCCA, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN51 },
56437 + {MKK12_MKKA1, MKK12, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKKA1 | PSCAN_MKKA1_G, CTRY_JAPAN52 },
56438 + {MKK12_MKKC, MKK12, MKKC, MKK5GHZ_FLAG1, NEED_NFC, NO_PSCAN, CTRY_JAPAN53 },
56439 + {MKK12_MKKA2, MKK12, MKKA, MKK5GHZ_FLAG1, NEED_NFC, PSCAN_MKK1 | PSCAN_MKK3 | PSCAN_MKKA2 | PSCAN_MKKA2_G, CTRY_JAPAN54 },
56440 +
56441 +
56442 + /* These are super domains */
56443 + {WOR0_WORLD, WOR0_WORLD, WOR0_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56444 + {WOR1_WORLD, WOR1_WORLD, WOR1_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 },
56445 + {WOR2_WORLD, WOR2_WORLD, WOR2_WORLD, DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 },
56446 + {WOR3_WORLD, WOR3_WORLD, WOR3_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56447 + {WOR4_WORLD, WOR4_WORLD, WOR4_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 },
56448 + {WOR5_ETSIC, WOR5_ETSIC, WOR5_ETSIC, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 },
56449 + {WOR01_WORLD, WOR01_WORLD, WOR01_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56450 + {WOR02_WORLD, WOR02_WORLD, WOR02_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56451 + {EU1_WORLD, EU1_WORLD, EU1_WORLD, NO_REQ, NO_REQ, PSCAN_DEFER, 0 },
56452 + {WOR9_WORLD, WOR9_WORLD, WOR9_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 },
56453 + {WORA_WORLD, WORA_WORLD, WORA_WORLD, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB, NO_REQ, PSCAN_DEFER, 0 },
56454 +};
56455 +
56456 +/*
56457 + * The following table is the master list for all different freqeuncy
56458 + * bands with the complete matrix of all possible flags and settings
56459 + * for each band if it is used in ANY reg domain.
56460 + */
56461 +
56462 +#define DEF_REGDMN FCC1_FCCA
56463 +#define DEF_DMN_5 FCC1
56464 +#define DEF_DMN_2 FCCA
56465 +#define COUNTRY_ERD_FLAG 0x8000
56466 +#define WORLDWIDE_ROAMING_FLAG 0x4000
56467 +#define SUPER_DOMAIN_MASK 0x0fff
56468 +#define COUNTRY_CODE_MASK 0x03ff
56469 +#define CF_INTERFERENCE (CHANNEL_CW_INT | CHANNEL_RADAR_INT)
56470 +#define CHANNEL_14 (2484) /* 802.11g operation is not permitted on channel 14 */
56471 +#define IS_11G_CH14(_ch,_cf) \
56472 + (((_ch) == CHANNEL_14) && ((_cf) == CHANNEL_G))
56473 +
56474 +#define YES TRUE
56475 +#define NO FALSE
56476 +
56477 +enum {
56478 + CTRY_DEBUG = 0x1ff, /* debug country code */
56479 + CTRY_DEFAULT = 0 /* default country code */
56480 +};
56481 +
56482 +typedef struct {
56483 + HAL_CTRY_CODE countryCode;
56484 + HAL_REG_DOMAIN regDmnEnum;
56485 + const char* isoName;
56486 + const char* name;
56487 + HAL_BOOL allow11g;
56488 + HAL_BOOL allow11aTurbo;
56489 + HAL_BOOL allow11gTurbo;
56490 + HAL_BOOL allow11na; /* HT-40 allowed in 5GHz? */
56491 + HAL_BOOL allow11ng; /* HT-40 allowed in 2GHz? */
56492 + u16_t outdoorChanStart;
56493 +} COUNTRY_CODE_TO_ENUM_RD;
56494 +
56495 +static COUNTRY_CODE_TO_ENUM_RD allCountries[] = {
56496 + {CTRY_DEBUG, NO_ENUMRD, "DB", "DEBUG", YES, YES, YES, YES, YES, 7000 },
56497 + {CTRY_DEFAULT, DEF_REGDMN, "NA", "NO_COUNTRY_SET", YES, YES, YES, YES, YES, 7000 },
56498 + {CTRY_ALBANIA, NULL1_WORLD, "AL", "ALBANIA", YES, NO, YES, NO, YES, 7000 },
56499 + {CTRY_ALGERIA, NULL1_WORLD, "DZ", "ALGERIA", YES, NO, YES, NO, YES, 7000 },
56500 + {CTRY_ARGENTINA, APL3_WORLD, "AR", "ARGENTINA", YES, NO, NO, NO, NO, 7000 },
56501 + {CTRY_ARMENIA, ETSI4_WORLD, "AM", "ARMENIA", YES, NO, YES, NO, YES, 7000 },
56502 + {CTRY_AUSTRALIA, FCC6_WORLD, "AU", "AUSTRALIA", YES, YES, YES, YES, YES, 7000 },
56503 + {CTRY_AUSTRIA, ETSI2_WORLD, "AT", "AUSTRIA", YES, NO, YES, YES, YES, 7000 },
56504 + {CTRY_AZERBAIJAN, ETSI4_WORLD, "AZ", "AZERBAIJAN", YES, YES, YES, YES, YES, 7000 },
56505 + {CTRY_BAHRAIN, APL6_WORLD, "BH", "BAHRAIN", YES, NO, YES, NO, YES, 7000 },
56506 + {CTRY_BELARUS, ETSI1_WORLD, "BY", "BELARUS", YES, NO, YES, YES, YES, 7000 },
56507 + {CTRY_BELGIUM, ETSI1_WORLD, "BE", "BELGIUM", YES, NO, YES, YES, YES, 7000 },
56508 + {CTRY_BELIZE, APL1_ETSIC, "BZ", "BELIZE", YES, YES, YES, YES, YES, 7000 },
56509 + {CTRY_BOLIVIA, APL1_ETSIC, "BO", "BOLVIA", YES, YES, YES, YES, YES, 7000 },
56510 + {CTRY_BRAZIL, FCC3_WORLD, "BR", "BRAZIL", NO, NO, NO, NO, NO, 7000 },
56511 + {CTRY_BRUNEI_DARUSSALAM,APL1_WORLD,"BN", "BRUNEI DARUSSALAM", YES, YES, YES, YES, YES, 7000 },
56512 + {CTRY_BULGARIA, ETSI6_WORLD, "BG", "BULGARIA", YES, NO, YES, YES, YES, 7000 },
56513 + {CTRY_CANADA, FCC6_FCCA, "CA", "CANADA", YES, YES, YES, YES, YES, 7000 },
56514 + {CTRY_CHILE, APL6_WORLD, "CL", "CHILE", YES, YES, YES, YES, YES, 7000 },
56515 + {CTRY_CHINA, APL1_WORLD, "CN", "CHINA", YES, YES, YES, YES, YES, 7000 },
56516 + {CTRY_COLOMBIA, FCC1_FCCA, "CO", "COLOMBIA", YES, NO, YES, NO, YES, 7000 },
56517 + {CTRY_COSTA_RICA, FCC1_WORLD, "CR", "COSTA RICA", YES, NO, YES, NO, YES, 7000 },
56518 + {CTRY_CROATIA, ETSI3_WORLD, "HR", "CROATIA", YES, NO, YES, NO, YES, 7000 },
56519 + {CTRY_CYPRUS, ETSI3_WORLD, "CY", "CYPRUS", YES, YES, YES, YES, YES, 7000 },
56520 + {CTRY_CZECH, ETSI3_WORLD, "CZ", "CZECH REPUBLIC", YES, NO, YES, YES, YES, 7000 },
56521 + {CTRY_DENMARK, ETSI1_WORLD, "DK", "DENMARK", YES, NO, YES, YES, YES, 7000 },
56522 + {CTRY_DOMINICAN_REPUBLIC,FCC1_FCCA,"DO", "DOMINICAN REPUBLIC", YES, YES, YES, YES, YES, 7000 },
56523 + {CTRY_ECUADOR, FCC1_WORLD, "EC", "ECUADOR", YES, NO, NO, NO, YES, 7000 },
56524 + {CTRY_EGYPT, ETSI3_WORLD, "EG", "EGYPT", YES, NO, YES, NO, YES, 7000 },
56525 + {CTRY_EL_SALVADOR, FCC1_WORLD, "SV", "EL SALVADOR", YES, NO, YES, NO, YES, 7000 },
56526 + {CTRY_ESTONIA, ETSI1_WORLD, "EE", "ESTONIA", YES, NO, YES, YES, YES, 7000 },
56527 + {CTRY_FINLAND, ETSI1_WORLD, "FI", "FINLAND", YES, NO, YES, YES, YES, 7000 },
56528 + {CTRY_FRANCE, ETSI1_WORLD, "FR", "FRANCE", YES, NO, YES, YES, YES, 7000 },
56529 + {CTRY_FRANCE2, ETSI3_WORLD, "F2", "FRANCE_RES", YES, NO, YES, YES, YES, 7000 },
56530 + {CTRY_GEORGIA, ETSI4_WORLD, "GE", "GEORGIA", YES, YES, YES, YES, YES, 7000 },
56531 + {CTRY_GERMANY, ETSI1_WORLD, "DE", "GERMANY", YES, NO, YES, YES, YES, 7000 },
56532 + {CTRY_GREECE, ETSI1_WORLD, "GR", "GREECE", YES, NO, YES, YES, YES, 7000 },
56533 + {CTRY_GUATEMALA, FCC1_FCCA, "GT", "GUATEMALA", YES, YES, YES, YES, YES, 7000 },
56534 + {CTRY_HONDURAS, NULL1_WORLD, "HN", "HONDURAS", YES, NO, YES, NO, YES, 7000 },
56535 + {CTRY_HONG_KONG, FCC2_WORLD, "HK", "HONG KONG", YES, YES, YES, YES, YES, 7000 },
56536 + {CTRY_HUNGARY, ETSI4_WORLD, "HU", "HUNGARY", YES, NO, YES, YES, YES, 7000 },
56537 + {CTRY_ICELAND, ETSI1_WORLD, "IS", "ICELAND", YES, NO, YES, YES, YES, 7000 },
56538 + {CTRY_INDIA, APL6_WORLD, "IN", "INDIA", YES, NO, YES, NO, YES, 7000 },
56539 + {CTRY_INDONESIA, APL1_WORLD, "ID", "INDONESIA", YES, NO, YES, NO, YES, 7000 },
56540 + {CTRY_IRAN, APL1_WORLD, "IR", "IRAN", YES, YES, YES, YES, YES, 7000 },
56541 + {CTRY_IRELAND, ETSI1_WORLD, "IE", "IRELAND", YES, NO, YES, YES, YES, 7000 },
56542 + {CTRY_ISRAEL, ETSI3_WORLD, "IL", "ISRAEL", YES, NO, YES, NO, YES, 7000 },
56543 + {CTRY_ISRAEL2, NULL1_ETSIB, "ISR","ISRAEL_RES", YES, NO, YES, NO, YES, 7000 },
56544 + {CTRY_ITALY, ETSI1_WORLD, "IT", "ITALY", YES, NO, YES, YES, YES, 7000 },
56545 + {CTRY_JAMAICA, ETSI1_WORLD, "JM", "JAMAICA", YES, NO, YES, YES, YES, 7000 },
56546 + {CTRY_JAPAN, MKK1_MKKA, "JP", "JAPAN", YES, NO, NO, NO, NO, 7000 },
56547 + {CTRY_JAPAN1, MKK1_MKKB, "J1", "JAPAN1", YES, NO, NO, NO, NO, 7000 },
56548 + {CTRY_JAPAN2, MKK1_FCCA, "J2", "JAPAN2", YES, NO, NO, NO, NO, 7000 },
56549 + {CTRY_JAPAN3, MKK2_MKKA, "J3", "JAPAN3", YES, NO, NO, NO, NO, 7000 },
56550 + {CTRY_JAPAN4, MKK1_MKKA1, "J4", "JAPAN4", YES, NO, NO, NO, NO, 7000 },
56551 + {CTRY_JAPAN5, MKK1_MKKA2, "J5", "JAPAN5", YES, NO, NO, NO, NO, 7000 },
56552 + {CTRY_JAPAN6, MKK1_MKKC, "J6", "JAPAN6", YES, NO, NO, NO, NO, 7000 },
56553 + {CTRY_JAPAN7, MKK3_MKKB, "J7", "JAPAN7", YES, NO, NO, NO, NO, 7000 },
56554 + {CTRY_JAPAN8, MKK3_MKKA2, "J8", "JAPAN8", YES, NO, NO, NO, NO, 7000 },
56555 + {CTRY_JAPAN9, MKK3_MKKC, "J9", "JAPAN9", YES, NO, NO, NO, NO, 7000 },
56556 + {CTRY_JAPAN10, MKK4_MKKB, "J10", "JAPAN10", YES, NO, NO, NO, NO, 7000 },
56557 + {CTRY_JAPAN11, MKK4_MKKA2, "J11", "JAPAN11", YES, NO, NO, NO, NO, 7000 },
56558 + {CTRY_JAPAN12, MKK4_MKKC, "J12", "JAPAN12", YES, NO, NO, NO, NO, 7000 },
56559 + {CTRY_JAPAN13, MKK5_MKKB, "J13", "JAPAN13", YES, NO, NO, NO, NO, 7000 },
56560 + {CTRY_JAPAN14, MKK5_MKKA2, "J14", "JAPAN14", YES, NO, NO, NO, NO, 7000 },
56561 + {CTRY_JAPAN15, MKK5_MKKC, "J15", "JAPAN15", YES, NO, NO, NO, NO, 7000 },
56562 + {CTRY_JAPAN16, MKK6_MKKB, "J16", "JAPAN16", YES, NO, NO, NO, NO, 7000 },
56563 + {CTRY_JAPAN17, MKK6_MKKA2, "J17", "JAPAN17", YES, NO, NO, NO, NO, 7000 },
56564 + {CTRY_JAPAN18, MKK6_MKKC, "J18", "JAPAN18", YES, NO, NO, NO, NO, 7000 },
56565 + {CTRY_JAPAN19, MKK7_MKKB, "J19", "JAPAN19", YES, NO, NO, NO, NO, 7000 },
56566 + {CTRY_JAPAN20, MKK7_MKKA, "J20", "JAPAN20", YES, NO, NO, NO, NO, 7000 },
56567 + {CTRY_JAPAN21, MKK7_MKKC, "J21", "JAPAN21", YES, NO, NO, NO, NO, 7000 },
56568 + {CTRY_JAPAN22, MKK8_MKKB, "J22", "JAPAN22", YES, NO, NO, NO, NO, 7000 },
56569 + {CTRY_JAPAN23, MKK8_MKKA2, "J23", "JAPAN23", YES, NO, NO, NO, NO, 7000 },
56570 + {CTRY_JAPAN24, MKK8_MKKC, "J24", "JAPAN24", YES, NO, NO, NO, NO, 7000 },
56571 + {CTRY_JAPAN25, MKK3_MKKA, "J25", "JAPAN25", YES, NO, NO, NO, NO, 7000 },
56572 + {CTRY_JAPAN26, MKK3_MKKA1, "J26", "JAPAN26", YES, NO, NO, NO, NO, 7000 },
56573 + {CTRY_JAPAN27, MKK3_FCCA, "J27", "JAPAN27", YES, NO, NO, NO, NO, 7000 },
56574 + {CTRY_JAPAN28, MKK4_MKKA1, "J28", "JAPAN28", YES, NO, NO, NO, NO, 7000 },
56575 + {CTRY_JAPAN29, MKK4_FCCA, "J29", "JAPAN29", YES, NO, NO, NO, NO, 7000 },
56576 + {CTRY_JAPAN30, MKK6_MKKA1, "J30", "JAPAN30", YES, NO, NO, NO, NO, 7000 },
56577 + {CTRY_JAPAN31, MKK6_FCCA, "J31", "JAPAN31", YES, NO, NO, NO, NO, 7000 },
56578 + {CTRY_JAPAN32, MKK7_MKKA1, "J32", "JAPAN32", YES, NO, NO, NO, NO, 7000 },
56579 + {CTRY_JAPAN33, MKK7_FCCA, "J33", "JAPAN33", YES, NO, NO, NO, NO, 7000 },
56580 + {CTRY_JAPAN34, MKK9_MKKA, "J34", "JAPAN34", YES, NO, NO, NO, NO, 7000 },
56581 + {CTRY_JAPAN35, MKK10_MKKA, "J35", "JAPAN35", YES, NO, NO, NO, NO, 7000 },
56582 + {CTRY_JAPAN36, MKK4_MKKA, "J36", "JAPAN36", YES, NO, NO, NO, NO, 7000 },
56583 + {CTRY_JAPAN37, MKK9_FCCA, "J37", "JAPAN37", YES, NO, NO, NO, NO, 7000 },
56584 + {CTRY_JAPAN38, MKK9_MKKA1, "J38", "JAPAN38", YES, NO, NO, NO, NO, 7000 },
56585 + {CTRY_JAPAN39, MKK9_MKKC, "J39", "JAPAN39", YES, NO, NO, NO, NO, 7000 },
56586 + {CTRY_JAPAN40, MKK10_MKKA2, "J40", "JAPAN40", YES, NO, NO, NO, NO, 7000 },
56587 + {CTRY_JAPAN41, MKK10_FCCA, "J41", "JAPAN41", YES, NO, NO, NO, NO, 7000 },
56588 + {CTRY_JAPAN42, MKK10_MKKA1, "J42", "JAPAN42", YES, NO, NO, NO, NO, 7000 },
56589 + {CTRY_JAPAN43, MKK10_MKKC, "J43", "JAPAN43", YES, NO, NO, NO, NO, 7000 },
56590 + {CTRY_JAPAN44, MKK10_MKKA2, "J44", "JAPAN44", YES, NO, NO, NO, NO, 7000 },
56591 + {CTRY_JAPAN45, MKK11_MKKA, "J45", "JAPAN45", YES, NO, NO, NO, NO, 7000 },
56592 + {CTRY_JAPAN46, MKK11_FCCA, "J46", "JAPAN46", YES, NO, NO, NO, NO, 7000 },
56593 + {CTRY_JAPAN47, MKK11_MKKA1, "J47", "JAPAN47", YES, NO, NO, NO, NO, 7000 },
56594 + {CTRY_JAPAN48, MKK11_MKKC, "J48", "JAPAN48", YES, NO, NO, NO, NO, 7000 },
56595 + {CTRY_JAPAN49, MKK11_MKKA2, "J49", "JAPAN49", YES, NO, NO, NO, NO, 7000 },
56596 + {CTRY_JAPAN50, MKK12_MKKA, "J50", "JAPAN50", YES, NO, NO, NO, NO, 7000 },
56597 + {CTRY_JAPAN51, MKK12_FCCA, "J51", "JAPAN51", YES, NO, NO, NO, NO, 7000 },
56598 + {CTRY_JAPAN52, MKK12_MKKA1, "J52", "JAPAN52", YES, NO, NO, NO, NO, 7000 },
56599 + {CTRY_JAPAN53, MKK12_MKKC, "J53", "JAPAN53", YES, NO, NO, NO, NO, 7000 },
56600 + {CTRY_JAPAN54, MKK12_MKKA2, "J54", "JAPAN54", YES, NO, NO, NO, NO, 7000 },
56601 + {CTRY_JORDAN, ETSI2_WORLD, "JO", "JORDAN", YES, NO, YES, NO, YES, 7000 },
56602 + {CTRY_KAZAKHSTAN, NULL1_WORLD, "KZ", "KAZAKHSTAN", YES, NO, YES, NO, YES, 7000 },
56603 + {CTRY_KOREA_NORTH, APL9_WORLD, "KP", "NORTH KOREA", YES, NO, NO, YES, YES, 7000 },
56604 + {CTRY_KOREA_ROC, APL9_WORLD, "KR", "KOREA REPUBLIC", YES, NO, NO, NO, NO, 7000 },
56605 + {CTRY_KOREA_ROC2, APL2_APLD, "K2", "KOREA REPUBLIC2",YES, NO, NO, NO, NO, 7000 },
56606 + {CTRY_KOREA_ROC3, APL9_WORLD, "K3", "KOREA REPUBLIC3",YES, NO, NO, NO, NO, 7000 },
56607 + {CTRY_KUWAIT, NULL1_WORLD, "KW", "KUWAIT", YES, NO, YES, NO, YES, 7000 },
56608 + {CTRY_LATVIA, ETSI1_WORLD, "LV", "LATVIA", YES, NO, YES, YES, YES, 7000 },
56609 + {CTRY_LEBANON, NULL1_WORLD, "LB", "LEBANON", YES, NO, YES, NO, YES, 7000 },
56610 + {CTRY_LIECHTENSTEIN,ETSI1_WORLD, "LI", "LIECHTENSTEIN", YES, NO, YES, YES, YES, 7000 },
56611 + {CTRY_LITHUANIA, ETSI1_WORLD, "LT", "LITHUANIA", YES, NO, YES, YES, YES, 7000 },
56612 + {CTRY_LUXEMBOURG, ETSI1_WORLD, "LU", "LUXEMBOURG", YES, NO, YES, YES, YES, 7000 },
56613 + {CTRY_MACAU, FCC2_WORLD, "MO", "MACAU", YES, YES, YES, YES, YES, 7000 },
56614 + {CTRY_MACEDONIA, NULL1_WORLD, "MK", "MACEDONIA", YES, NO, YES, NO, YES, 7000 },
56615 + {CTRY_MALAYSIA, APL8_WORLD, "MY", "MALAYSIA", NO, NO, NO, NO, NO, 7000 },
56616 + {CTRY_MALTA, ETSI1_WORLD, "MT", "MALTA", YES, NO, YES, YES, YES, 7000 },
56617 + {CTRY_MEXICO, FCC1_FCCA, "MX", "MEXICO", YES, YES, YES, YES, YES, 7000 },
56618 + {CTRY_MONACO, ETSI4_WORLD, "MC", "MONACO", YES, YES, YES, YES, YES, 7000 },
56619 + {CTRY_MOROCCO, NULL1_WORLD, "MA", "MOROCCO", YES, NO, YES, NO, YES, 7000 },
56620 + {CTRY_NETHERLANDS, ETSI1_WORLD, "NL", "NETHERLANDS", YES, NO, YES, YES, YES, 7000 },
56621 + {CTRY_NETHERLANDS_ANT, ETSI1_WORLD, "AN", "NETHERLANDS-ANTILLES", YES, NO, YES, YES, YES, 7000 },
56622 + {CTRY_NEW_ZEALAND, FCC2_ETSIC, "NZ", "NEW ZEALAND", YES, NO, YES, NO, YES, 7000 },
56623 + {CTRY_NORWAY, ETSI1_WORLD, "NO", "NORWAY", YES, NO, YES, YES, YES, 7000 },
56624 + {CTRY_OMAN, APL6_WORLD, "OM", "OMAN", YES, NO, YES, NO, YES, 7000 },
56625 + {CTRY_PAKISTAN, NULL1_WORLD, "PK", "PAKISTAN", YES, NO, YES, NO, YES, 7000 },
56626 + {CTRY_PANAMA, FCC1_FCCA, "PA", "PANAMA", YES, YES, YES, YES, YES, 7000 },
56627 + {CTRY_PERU, APL1_WORLD, "PE", "PERU", YES, NO, YES, NO, YES, 7000 },
56628 + {CTRY_PHILIPPINES, APL1_WORLD, "PH", "PHILIPPINES", YES, YES, YES, YES, YES, 7000 },
56629 + {CTRY_POLAND, ETSI1_WORLD, "PL", "POLAND", YES, NO, YES, YES, YES, 7000 },
56630 + {CTRY_PORTUGAL, ETSI1_WORLD, "PT", "PORTUGAL", YES, NO, YES, YES, YES, 7000 },
56631 + {CTRY_PUERTO_RICO, FCC1_FCCA, "PR", "PUERTO RICO", YES, YES, YES, YES, YES, 7000 },
56632 + {CTRY_QATAR, NULL1_WORLD, "QA", "QATAR", YES, NO, YES, NO, YES, 7000 },
56633 + {CTRY_ROMANIA, NULL1_WORLD, "RO", "ROMANIA", YES, NO, YES, NO, YES, 7000 },
56634 + {CTRY_RUSSIA, NULL1_WORLD, "RU", "RUSSIA", YES, NO, YES, NO, YES, 7000 },
56635 + {CTRY_SAUDI_ARABIA,NULL1_WORLD, "SA", "SAUDI ARABIA", YES, NO, YES, NO, YES, 7000 },
56636 + {CTRY_SERBIA_MONT, ETSI1_WORLD, "CS", "SERBIA & MONTENEGRO", YES, NO, YES, YES, YES, 7000 },
56637 + {CTRY_SINGAPORE, APL6_WORLD, "SG", "SINGAPORE", YES, YES, YES, YES, YES, 7000 },
56638 + {CTRY_SLOVAKIA, ETSI1_WORLD, "SK", "SLOVAK REPUBLIC",YES, NO, YES, YES, YES, 7000 },
56639 + {CTRY_SLOVENIA, ETSI1_WORLD, "SI", "SLOVENIA", YES, NO, YES, YES, YES, 7000 },
56640 + {CTRY_SOUTH_AFRICA,FCC3_WORLD, "ZA", "SOUTH AFRICA", YES, NO, YES, NO, YES, 7000 },
56641 + {CTRY_SPAIN, ETSI1_WORLD, "ES", "SPAIN", YES, NO, YES, YES, YES, 7000 },
56642 + {CTRY_SRILANKA, FCC3_WORLD, "LK", "SRI LANKA", YES, NO, YES, NO, YES, 7000 },
56643 + {CTRY_SWEDEN, ETSI1_WORLD, "SE", "SWEDEN", YES, NO, YES, YES, YES, 7000 },
56644 + {CTRY_SWITZERLAND, ETSI1_WORLD, "CH", "SWITZERLAND", YES, NO, YES, YES, YES, 7000 },
56645 + {CTRY_SYRIA, NULL1_WORLD, "SY", "SYRIA", YES, NO, YES, NO, YES, 7000 },
56646 + {CTRY_TAIWAN, APL3_FCCA, "TW", "TAIWAN", YES, YES, YES, YES, YES, 7000 },
56647 + {CTRY_THAILAND, NULL1_WORLD, "TH", "THAILAND", YES, NO, YES, NO, YES, 7000 },
56648 + {CTRY_TRINIDAD_Y_TOBAGO,ETSI4_WORLD,"TT", "TRINIDAD & TOBAGO", YES, NO, YES, NO, YES, 7000 },
56649 + {CTRY_TUNISIA, ETSI3_WORLD, "TN", "TUNISIA", YES, NO, YES, NO, YES, 7000 },
56650 + {CTRY_TURKEY, ETSI3_WORLD, "TR", "TURKEY", YES, NO, YES, NO, YES, 7000 },
56651 + {CTRY_UKRAINE, NULL1_WORLD, "UA", "UKRAINE", YES, NO, YES, NO, YES, 7000 },
56652 + {CTRY_UAE, NULL1_WORLD, "AE", "UNITED ARAB EMIRATES", YES, NO, YES, NO, YES, 7000 },
56653 + {CTRY_UNITED_KINGDOM, ETSI1_WORLD,"GB", "UNITED KINGDOM", YES, NO, YES, NO, YES, 7000 },
56654 + {CTRY_UNITED_STATES, FCC3_FCCA, "US", "UNITED STATES", YES, YES, YES, YES, YES, 5825 },
56655 + {CTRY_UNITED_STATES_FCC49, FCC4_FCCA, "PS", "UNITED STATES (PUBLIC SAFETY)", YES, YES, YES, YES, YES, 7000 },
56656 + {CTRY_URUGUAY, FCC1_WORLD, "UY", "URUGUAY", YES, NO, YES, NO, YES, 7000 },
56657 + {CTRY_UZBEKISTAN, FCC3_FCCA, "UZ", "UZBEKISTAN", YES, YES, YES, YES, YES, 7000 },
56658 + {CTRY_VENEZUELA, APL2_ETSIC, "VE", "VENEZUELA", YES, NO, YES, NO, YES, 7000 },
56659 + {CTRY_VIET_NAM, NULL1_WORLD, "VN", "VIET NAM", YES, NO, YES, NO, YES, 7000 },
56660 + {CTRY_YEMEN, NULL1_WORLD, "YE", "YEMEN", YES, NO, YES, NO, YES, 7000 },
56661 + {CTRY_ZIMBABWE, NULL1_WORLD, "ZW", "ZIMBABWE", YES, NO, YES, NO, YES, 7000 }
56662 +};
56663 +
56664 +typedef struct RegDmnFreqBand {
56665 + u16_t lowChannel; /* Low channel center in MHz */
56666 + u16_t highChannel; /* High Channel center in MHz */
56667 + u8_t powerDfs; /* Max power (dBm) for channel
56668 + range when using DFS */
56669 + u8_t antennaMax; /* Max allowed antenna gain */
56670 + u8_t channelBW; /* Bandwidth of the channel */
56671 + u8_t channelSep; /* Channel separation within
56672 + the band */
56673 + u64_t useDfs; /* Use DFS in the RegDomain
56674 + if corresponding bit is set */
56675 + u64_t usePassScan; /* Use Passive Scan in the RegDomain
56676 + if corresponding bit is set */
56677 + u8_t regClassId; /* Regulatory class id */
56678 + u8_t useExtChanDfs; /* Regulatory class id */
56679 +} REG_DMN_FREQ_BAND;
56680 +
56681 +/* Bit masks for DFS per regdomain */
56682 +
56683 +enum {
56684 + NO_DFS = 0x0000000000000000ULL,
56685 + DFS_FCC3 = 0x0000000000000001ULL,
56686 + DFS_ETSI = 0x0000000000000002ULL,
56687 + DFS_MKK4 = 0x0000000000000004ULL,
56688 +};
56689 +
56690 +/* The table of frequency bands is indexed by a bitmask. The ordering
56691 + * must be consistent with the enum below. When adding a new
56692 + * frequency band, be sure to match the location in the enum with the
56693 + * comments
56694 + */
56695 +
56696 +/*
56697 + * 5GHz 11A channel tags
56698 + */
56699 +
56700 +enum {
56701 + F1_4915_4925,
56702 + F1_4935_4945,
56703 + F1_4920_4980,
56704 + F1_4942_4987,
56705 + F1_4945_4985,
56706 + F1_4950_4980,
56707 + F1_5035_5040,
56708 + F1_5040_5080,
56709 + F1_5055_5055,
56710 +
56711 + F1_5120_5240,
56712 +
56713 + F1_5170_5230,
56714 + F2_5170_5230,
56715 +
56716 + F1_5180_5240,
56717 + F2_5180_5240,
56718 + F3_5180_5240,
56719 + F4_5180_5240,
56720 + F5_5180_5240,
56721 + F6_5180_5240,
56722 + F7_5180_5240,
56723 +
56724 + F1_5180_5320,
56725 +
56726 + F1_5240_5280,
56727 +
56728 + F1_5260_5280,
56729 +
56730 + F1_5260_5320,
56731 + F2_5260_5320,
56732 + F3_5260_5320,
56733 + F4_5260_5320,
56734 + F5_5260_5320,
56735 + F6_5260_5320,
56736 + F7_5260_5320,
56737 +
56738 + F1_5260_5700,
56739 +
56740 + F1_5280_5320,
56741 +
56742 + F1_5500_5580,
56743 +
56744 + F1_5500_5620,
56745 +
56746 + F1_5500_5700,
56747 + F2_5500_5700,
56748 + F3_5500_5700,
56749 + F4_5500_5700,
56750 +
56751 + F1_5660_5700,
56752 +
56753 + F1_5745_5805,
56754 + F2_5745_5805,
56755 + F3_5745_5805,
56756 +
56757 + F1_5745_5825,
56758 + F2_5745_5825,
56759 + F3_5745_5825,
56760 + F4_5745_5825,
56761 + F5_5745_5825,
56762 + F6_5745_5825,
56763 +
56764 + W1_4920_4980,
56765 + W1_5040_5080,
56766 + W1_5170_5230,
56767 + W1_5180_5240,
56768 + W1_5260_5320,
56769 + W1_5745_5825,
56770 + W1_5500_5700,
56771 + W2_5260_5320,
56772 + W2_5180_5240,
56773 + W2_5825_5825,
56774 +};
56775 +
56776 +static REG_DMN_FREQ_BAND regDmn5GhzFreq[] = {
56777 + { 4915, 4925, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2, 16, 0 }, /* F1_4915_4925 */
56778 + { 4935, 4945, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2, 16, 0 }, /* F1_4935_4945 */
56779 + { 4920, 4980, 23, 0, 20, 20, NO_DFS, PSCAN_MKK2, 7, 0 }, /* F1_4920_4980 */
56780 + { 4942, 4987, 27, 6, 5, 5, DFS_FCC3, PSCAN_FCC, 0, 0 }, /* F1_4942_4987 */
56781 + { 4945, 4985, 30, 6, 10, 5, DFS_FCC3, PSCAN_FCC, 0, 0 }, /* F1_4945_4985 */
56782 + { 4950, 4980, 33, 6, 20, 5, DFS_FCC3, PSCAN_FCC, 0, 0 }, /* F1_4950_4980 */
56783 + { 5035, 5040, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2, 12, 0 }, /* F1_5035_5040 */
56784 + { 5040, 5080, 23, 0, 20, 20, NO_DFS, PSCAN_MKK2, 2, 0 }, /* F1_5040_5080 */
56785 + { 5055, 5055, 23, 0, 10, 5, NO_DFS, PSCAN_MKK2, 12, 0 }, /* F1_5055_5055 */
56786 +
56787 + { 5120, 5240, 5, 6, 20, 20, NO_DFS, NO_PSCAN, 0, 0 }, /* F1_5120_5240 */
56788 +
56789 + { 5170, 5230, 23, 0, 20, 20, NO_DFS, PSCAN_MKK1 | PSCAN_MKK2, 1, 0 }, /* F1_5170_5230 */
56790 + { 5170, 5230, 20, 0, 20, 20, NO_DFS, PSCAN_MKK1 | PSCAN_MKK2, 1, 0 }, /* F2_5170_5230 */
56791 +
56792 + { 5180, 5240, 15, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI, 0, 0 }, /* F1_5180_5240 */
56793 + { 5180, 5240, 17, 6, 20, 20, NO_DFS, PSCAN_FCC, 1, 0 }, /* F2_5180_5240 */
56794 + { 5180, 5240, 18, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI, 0, 0 }, /* F3_5180_5240 */
56795 + { 5180, 5240, 20, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI, 0, 0 }, /* F4_5180_5240 */
56796 + { 5180, 5240, 23, 0, 20, 20, NO_DFS, PSCAN_FCC | PSCAN_ETSI, 0, 0 }, /* F5_5180_5240 */
56797 + { 5180, 5240, 23, 6, 20, 20, NO_DFS, PSCAN_FCC, 0, 0 }, /* F6_5180_5240 */
56798 + { 5180, 5240, 23, 6, 20, 20, NO_DFS, NO_PSCAN, 0 }, /* F7_5180_5240 */
56799 +
56800 + { 5180, 5320, 20, 6, 20, 20, DFS_ETSI, PSCAN_ETSI, 0, 0 }, /* F1_5180_5320 */
56801 +
56802 + { 5240, 5280, 23, 0, 20, 20, DFS_FCC3, PSCAN_FCC | PSCAN_ETSI, 0, 0 }, /* F1_5240_5280 */
56803 +
56804 + { 5260, 5280, 23, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI, 0, 0 }, /* F1_5260_5280 */
56805 +
56806 + { 5260, 5320, 18, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI, 0, 0 }, /* F1_5260_5320 */
56807 +
56808 + { 5260, 5320, 20, 0, 20, 20, DFS_FCC3 | DFS_ETSI | DFS_MKK4, PSCAN_FCC | PSCAN_ETSI | PSCAN_MKK3 , 0, 0 },
56809 + /* F2_5260_5320 */
56810 +
56811 + { 5260, 5320, 20, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC, 2, 0 }, /* F3_5260_5320 */
56812 + { 5260, 5320, 23, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC, 2, 0 }, /* F4_5260_5320 */
56813 + { 5260, 5320, 23, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC, 0, 0 }, /* F5_5260_5320 */
56814 + { 5260, 5320, 30, 0, 20, 20, NO_DFS, NO_PSCAN, 0, 0 }, /* F6_5260_5320 */
56815 + { 5260, 5320, 17, 6, 20, 20, DFS_ETSI, PSCAN_ETSI, 0, 0 }, /* F7_5260_5320 */
56816 +
56817 + { 5260, 5700, 5, 6, 20, 20, DFS_FCC3 | DFS_ETSI, NO_PSCAN, 0, 0 }, /* F1_5260_5700 */
56818 +
56819 + { 5280, 5320, 17, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC, 0, 0 }, /* F1_5280_5320 */
56820 +
56821 + { 5500, 5580, 23, 6, 20, 20, DFS_FCC3, PSCAN_FCC, 0}, /* F1_5500_5580 */
56822 +
56823 + { 5500, 5620, 30, 6, 20, 20, DFS_ETSI, PSCAN_ETSI, 0, 0 }, /* F1_5500_5620 */
56824 +
56825 + { 5500, 5700, 20, 6, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC, 4, 0 }, /* F1_5500_5700 */
56826 + { 5500, 5700, 27, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI, 0, 0 }, /* F2_5500_5700 */
56827 + { 5500, 5700, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_FCC | PSCAN_ETSI, 0, 0 }, /* F3_5500_5700 */
56828 + { 5500, 5700, 20, 0, 20, 20, DFS_FCC3 | DFS_ETSI | DFS_MKK4, PSCAN_MKK3 | PSCAN_FCC, 0, 0 },
56829 + /* F4_5500_5700 */
56830 +
56831 + { 5660, 5700, 23, 6, 20, 20, DFS_FCC3, PSCAN_FCC, 0}, /* F1_5660_5700 */
56832 +
56833 + { 5745, 5805, 23, 0, 20, 20, NO_DFS, NO_PSCAN, 0, 0 }, /* F1_5745_5805 */
56834 + { 5745, 5805, 30, 6, 20, 20, NO_DFS, NO_PSCAN, 0, 0 }, /* F2_5745_5805 */
56835 + { 5745, 5805, 30, 6, 20, 20, DFS_ETSI, PSCAN_ETSI, 0, 0 }, /* F3_5745_5805 */
56836 + { 5745, 5825, 5, 6, 20, 20, NO_DFS, NO_PSCAN, 0, 0 }, /* F1_5745_5825 */
56837 + { 5745, 5825, 17, 0, 20, 20, NO_DFS, NO_PSCAN, 0, 0 }, /* F2_5745_5825 */
56838 + { 5745, 5825, 20, 0, 20, 20, DFS_ETSI, NO_PSCAN, 0, 0 }, /* F3_5745_5825 */
56839 + { 5745, 5825, 30, 0, 20, 20, NO_DFS, NO_PSCAN, 0, 0 }, /* F4_5745_5825 */
56840 + { 5745, 5825, 30, 6, 20, 20, NO_DFS, NO_PSCAN, 3, 0 }, /* F5_5745_5825 */
56841 + { 5745, 5825, 30, 6, 20, 20, NO_DFS, NO_PSCAN, 0, 0 }, /* F6_5745_5825 */
56842 +
56843 + /*
56844 + * Below are the world roaming channels
56845 + * All WWR domains have no power limit, instead use the card's CTL
56846 + * or max power settings.
56847 + */
56848 + { 4920, 4980, 30, 0, 20, 20, NO_DFS, PSCAN_WWR, 0, 0 }, /* W1_4920_4980 */
56849 + { 5040, 5080, 30, 0, 20, 20, NO_DFS, PSCAN_WWR, 0 }, /* W1_5040_5080 */
56850 + { 5170, 5230, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, 0, 0 }, /* W1_5170_5230 */
56851 + { 5180, 5240, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, 0, 0 }, /* W1_5180_5240 */
56852 + { 5260, 5320, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, 0, 0 }, /* W1_5260_5320 */
56853 + { 5745, 5825, 30, 0, 20, 20, NO_DFS, PSCAN_WWR, 0, 0 }, /* W1_5745_5825 */
56854 + { 5500, 5700, 30, 0, 20, 20, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, 0, 0 }, /* W1_5500_5700 */
56855 + { 5260, 5320, 30, 0, 20, 20, NO_DFS, NO_PSCAN, 0, 0 }, /* W2_5260_5320 */
56856 + { 5180, 5240, 30, 0, 20, 20, NO_DFS, NO_PSCAN, 0, 0 }, /* W2_5180_5240 */
56857 + { 5825, 5825, 30, 0, 20, 20, NO_DFS, PSCAN_WWR, 0, 0 }, /* W2_5825_5825 */
56858 +};
56859 +/*
56860 + * 5GHz Turbo (dynamic & static) tags
56861 + */
56862 +
56863 +enum {
56864 + T1_5130_5210,
56865 + T1_5250_5330,
56866 + T1_5370_5490,
56867 + T1_5530_5650,
56868 +
56869 + T1_5150_5190,
56870 + T1_5230_5310,
56871 + T1_5350_5470,
56872 + T1_5510_5670,
56873 +
56874 + T1_5200_5240,
56875 + T2_5200_5240,
56876 + T1_5210_5210,
56877 + T2_5210_5210,
56878 +
56879 + T1_5280_5280,
56880 + T2_5280_5280,
56881 + T1_5250_5250,
56882 + T1_5290_5290,
56883 + T1_5250_5290,
56884 + T2_5250_5290,
56885 +
56886 + T1_5540_5660,
56887 + T1_5760_5800,
56888 + T2_5760_5800,
56889 +
56890 + T1_5765_5805,
56891 +
56892 + WT1_5210_5250,
56893 + WT1_5290_5290,
56894 + WT1_5540_5660,
56895 + WT1_5760_5800,
56896 +};
56897 +
56898 +static REG_DMN_FREQ_BAND regDmn5GhzTurboFreq[] = {
56899 + { 5130, 5210, 5, 6, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* T1_5130_5210 */
56900 + { 5250, 5330, 5, 6, 40, 40, DFS_FCC3, NO_PSCAN, 0, 0}, /* T1_5250_5330 */
56901 + { 5370, 5490, 5, 6, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* T1_5370_5490 */
56902 + { 5530, 5650, 5, 6, 40, 40, DFS_FCC3, NO_PSCAN, 0, 0}, /* T1_5530_5650 */
56903 +
56904 + { 5150, 5190, 5, 6, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* T1_5150_5190 */
56905 + { 5230, 5310, 5, 6, 40, 40, DFS_FCC3, NO_PSCAN, 0, 0}, /* T1_5230_5310 */
56906 + { 5350, 5470, 5, 6, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* T1_5350_5470 */
56907 + { 5510, 5670, 5, 6, 40, 40, DFS_FCC3, NO_PSCAN, 0, 0}, /* T1_5510_5670 */
56908 +
56909 + { 5200, 5240, 17, 6, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* T1_5200_5240 */
56910 + { 5200, 5240, 23, 6, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* T2_5200_5240 */
56911 + { 5210, 5210, 17, 6, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* T1_5210_5210 */
56912 + { 5210, 5210, 23, 0, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* T2_5210_5210 */
56913 +
56914 + { 5280, 5280, 23, 6, 40, 40, DFS_FCC3, PSCAN_FCC_T, 0, 0}, /* T1_5280_5280 */
56915 + { 5280, 5280, 20, 6, 40, 40, DFS_FCC3, PSCAN_FCC_T, 0, 0}, /* T2_5280_5280 */
56916 + { 5250, 5250, 17, 0, 40, 40, DFS_FCC3, PSCAN_FCC_T, 0, 0}, /* T1_5250_5250 */
56917 + { 5290, 5290, 20, 0, 40, 40, DFS_FCC3, PSCAN_FCC_T, 0, 0}, /* T1_5290_5290 */
56918 + { 5250, 5290, 20, 0, 40, 40, DFS_FCC3, PSCAN_FCC_T, 0, 0}, /* T1_5250_5290 */
56919 + { 5250, 5290, 23, 6, 40, 40, DFS_FCC3, PSCAN_FCC_T, 0, 0}, /* T2_5250_5290 */
56920 +
56921 + { 5540, 5660, 20, 6, 40, 40, DFS_FCC3, PSCAN_FCC_T, 0, 0}, /* T1_5540_5660 */
56922 + { 5760, 5800, 20, 0, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* T1_5760_5800 */
56923 + { 5760, 5800, 30, 6, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* T2_5760_5800 */
56924 +
56925 + { 5765, 5805, 30, 6, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* T1_5765_5805 */
56926 +
56927 + /*
56928 + * Below are the WWR frequencies
56929 + */
56930 +
56931 + { 5210, 5250, 15, 0, 40, 40, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, 0, 0}, /* WT1_5210_5250 */
56932 + { 5290, 5290, 18, 0, 40, 40, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, 0, 0}, /* WT1_5290_5290 */
56933 + { 5540, 5660, 20, 0, 40, 40, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, 0, 0}, /* WT1_5540_5660 */
56934 + { 5760, 5800, 20, 0, 40, 40, NO_DFS, PSCAN_WWR, 0, 0}, /* WT1_5760_5800 */
56935 +};
56936 +
56937 +/*
56938 + * 2GHz 11b channel tags
56939 + */
56940 +enum {
56941 + F1_2312_2372,
56942 + F2_2312_2372,
56943 +
56944 + F1_2412_2472,
56945 + F2_2412_2472,
56946 + F3_2412_2472,
56947 +
56948 + F1_2412_2462,
56949 + F2_2412_2462,
56950 +
56951 + F1_2432_2442,
56952 +
56953 + F1_2457_2472,
56954 +
56955 + F1_2467_2472,
56956 +
56957 + F1_2484_2484,
56958 + F2_2484_2484,
56959 +
56960 + F1_2512_2732,
56961 +
56962 + W1_2312_2372,
56963 + W1_2412_2412,
56964 + W1_2417_2432,
56965 + W1_2437_2442,
56966 + W1_2447_2457,
56967 + W1_2462_2462,
56968 + W1_2467_2467,
56969 + W2_2467_2467,
56970 + W1_2472_2472,
56971 + W2_2472_2472,
56972 + W1_2484_2484,
56973 + W2_2484_2484,
56974 +};
56975 +
56976 +static REG_DMN_FREQ_BAND regDmn2GhzFreq[] = {
56977 + { 2312, 2372, 5, 6, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* F1_2312_2372 */
56978 + { 2312, 2372, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* F2_2312_2372 */
56979 +
56980 + { 2412, 2472, 5, 6, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* F1_2412_2472 */
56981 + { 2412, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA, 0, 0}, /* F2_2412_2472 */
56982 + { 2412, 2472, 30, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* F3_2412_2472 */
56983 +
56984 + { 2412, 2462, 27, 6, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* F1_2412_2462 */
56985 + { 2412, 2462, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA, 0, 0}, /* F2_2412_2462 */
56986 + { 2432, 2442, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* F1_2432_2442 */
56987 +
56988 + { 2457, 2472, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* F1_2457_2472 */
56989 +
56990 + { 2467, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA2 | PSCAN_MKKA, 0, 0}, /* F1_2467_2472 */
56991 +
56992 + { 2484, 2484, 5, 6, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* F1_2484_2484 */
56993 + { 2484, 2484, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA | PSCAN_MKKA1 | PSCAN_MKKA2, 0, 0}, /* F2_2484_2484 */
56994 +
56995 + { 2512, 2732, 5, 6, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* F1_2512_2732 */
56996 +
56997 + /*
56998 + * WWR have powers opened up to 20dBm. Limits should often come from CTL/Max powers
56999 + */
57000 +
57001 + { 2312, 2372, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* W1_2312_2372 */
57002 + { 2412, 2412, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* W1_2412_2412 */
57003 + { 2417, 2432, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* W1_2417_2432 */
57004 + { 2437, 2442, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* W1_2437_2442 */
57005 + { 2447, 2457, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* W1_2447_2457 */
57006 + { 2462, 2462, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* W1_2462_2462 */
57007 + { 2467, 2467, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN, 0, 0}, /* W1_2467_2467 */
57008 + { 2467, 2467, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN, 0, 0}, /* W2_2467_2467 */
57009 + { 2472, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN, 0, 0}, /* W1_2472_2472 */
57010 + { 2472, 2472, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN, 0, 0}, /* W2_2472_2472 */
57011 + { 2484, 2484, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN, 0, 0}, /* W1_2484_2484 */
57012 + { 2484, 2484, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN, 0, 0}, /* W2_2484_2484 */
57013 +};
57014 +
57015 +
57016 +/*
57017 + * 2GHz 11g channel tags
57018 + */
57019 +
57020 +enum {
57021 + G1_2312_2372,
57022 + G2_2312_2372,
57023 +
57024 + G1_2412_2472,
57025 + G2_2412_2472,
57026 + G3_2412_2472,
57027 +
57028 + G1_2412_2462,
57029 + G2_2412_2462,
57030 +
57031 + G1_2432_2442,
57032 +
57033 + G1_2457_2472,
57034 +
57035 + G1_2512_2732,
57036 +
57037 + G1_2467_2472 ,
57038 +
57039 + WG1_2312_2372,
57040 + WG1_2412_2412,
57041 + WG1_2417_2432,
57042 + WG1_2437_2442,
57043 + WG1_2447_2457,
57044 + WG1_2462_2462,
57045 + WG1_2467_2467,
57046 + WG2_2467_2467,
57047 + WG1_2472_2472,
57048 + WG2_2472_2472,
57049 +
57050 +};
57051 +static REG_DMN_FREQ_BAND regDmn2Ghz11gFreq[] = {
57052 + { 2312, 2372, 5, 6, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* G1_2312_2372 */
57053 + { 2312, 2372, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* G2_2312_2372 */
57054 +
57055 + { 2412, 2472, 5, 6, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* G1_2412_2472 */
57056 + { 2412, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA_G, 0, 0}, /* G2_2412_2472 */
57057 + { 2412, 2472, 30, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* G3_2412_2472 */
57058 +
57059 + { 2412, 2462, 27, 6, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* G1_2412_2462 */
57060 + { 2412, 2462, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA_G, 0, 0}, /* G2_2412_2462 */
57061 + { 2432, 2442, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* G1_2432_2442 */
57062 +
57063 + { 2457, 2472, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* G1_2457_2472 */
57064 +
57065 + { 2512, 2732, 5, 6, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* G1_2512_2732 */
57066 +
57067 + { 2467, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_MKKA2 | PSCAN_MKKA, 0, 0 }, /* G1_2467_2472 */
57068 +
57069 + /*
57070 + * WWR open up the power to 20dBm
57071 + */
57072 +
57073 + { 2312, 2372, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* WG1_2312_2372 */
57074 + { 2412, 2412, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* WG1_2412_2412 */
57075 + { 2417, 2432, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* WG1_2417_2432 */
57076 + { 2437, 2442, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* WG1_2437_2442 */
57077 + { 2447, 2457, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* WG1_2447_2457 */
57078 + { 2462, 2462, 20, 0, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* WG1_2462_2462 */
57079 + { 2467, 2467, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN, 0, 0}, /* WG1_2467_2467 */
57080 + { 2467, 2467, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN, 0, 0}, /* WG2_2467_2467 */
57081 + { 2472, 2472, 20, 0, 20, 5, NO_DFS, PSCAN_WWR | IS_ECM_CHAN, 0, 0}, /* WG1_2472_2472 */
57082 + { 2472, 2472, 20, 0, 20, 5, NO_DFS, NO_PSCAN | IS_ECM_CHAN, 0, 0}, /* WG2_2472_2472 */
57083 +};
57084 +/*
57085 + * 2GHz Dynamic turbo tags
57086 + */
57087 +
57088 +enum {
57089 + T1_2312_2372,
57090 + T1_2437_2437,
57091 + T2_2437_2437,
57092 + T3_2437_2437,
57093 + T1_2512_2732
57094 +};
57095 +
57096 +static REG_DMN_FREQ_BAND regDmn2Ghz11gTurboFreq[] = {
57097 + { 2312, 2372, 5, 6, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* T1_2312_2372 */
57098 + { 2437, 2437, 5, 6, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* T1_2437_2437 */
57099 + { 2437, 2437, 20, 6, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* T2_2437_2437 */
57100 + { 2437, 2437, 18, 6, 40, 40, NO_DFS, PSCAN_WWR, 0, 0}, /* T3_2437_2437 */
57101 + { 2512, 2732, 5, 6, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* T1_2512_2732 */
57102 +};
57103 +
57104 +
57105 +
57106 +/*
57107 + * 2GHz 11n frequency tags
57108 + */
57109 +enum {
57110 + NG1_2422_2452,
57111 + NG2_2422_2452,
57112 + NG3_2422_2452,
57113 +
57114 + NG_DEMO_ALL_CHANNELS,
57115 +};
57116 +
57117 +static REG_DMN_FREQ_BAND regDmn2Ghz11ngFreq[] = {
57118 + { 2422, 2452, 20, 0, 40, 5, NO_DFS, NO_PSCAN, 0, 0}, /* NG1_2422_2452 */
57119 + { 2422, 2452, 27, 0, 40, 5, NO_DFS, NO_PSCAN, 0, 0}, /* NG2_2422_2452 */
57120 + { 2422, 2452, 30, 0, 40, 5, NO_DFS, NO_PSCAN, 0, 0}, /* NG3_2422_2452 */
57121 +
57122 + { 2312, 2732, 27, 6, 20, 5, NO_DFS, NO_PSCAN, 0, 0}, /* NG_DEMO_ALL_CHANNELS */
57123 +};
57124 +
57125 +
57126 +/*
57127 + * 5GHz 11n frequency tags
57128 + */
57129 +enum {
57130 + NA1_5190_5230,
57131 + NA2_5190_5230,
57132 + NA3_5190_5230,
57133 + NA4_5190_5230,
57134 + NA5_5190_5230,
57135 +
57136 + NA1_5270_5270,
57137 +
57138 + NA1_5270_5310,
57139 + NA2_5270_5310,
57140 + NA3_5270_5310,
57141 + NA4_5270_5310,
57142 +
57143 + NA1_5310_5310,
57144 +
57145 + NA1_5510_5630,
57146 +
57147 + NA1_5510_5670,
57148 + NA2_5510_5670,
57149 + NA3_5510_5670,
57150 +
57151 + NA1_5755_5795,
57152 + NA2_5755_5795,
57153 + NA3_5755_5795,
57154 + NA4_5755_5795,
57155 + NA5_5755_5795,
57156 +
57157 + NA1_5795_5795,
57158 +
57159 + NA_DEMO_ALL_CHANNELS,
57160 +};
57161 +
57162 +static REG_DMN_FREQ_BAND regDmn5Ghz11naFreq[] = {
57163 + /*
57164 + * ToDo: This table needs to be completely populated with 5GHz 11n properties
57165 + */
57166 + { 5190, 5230, 15, 0, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* NA1_5190_5230 */
57167 + { 5190, 5230, 17, 6, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* NA2_5190_5230 */
57168 + { 5190, 5230, 18, 6, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* NA3_5190_5230 */
57169 + { 5190, 5230, 20, 0, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* NA4_5190_5230 */
57170 + { 5190, 5230, 23, 6, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* NA5_5190_5230 */
57171 +
57172 + { 5270, 5270, 23, 6, 40, 40, DFS_FCC3|DFS_ETSI, NO_PSCAN, 0, 1}, /* NA1_5270_5270 */
57173 +
57174 + { 5270, 5310, 18, 6, 40, 40, DFS_FCC3|DFS_ETSI, NO_PSCAN, 0, 1}, /* NA1_5270_5310 */
57175 + { 5270, 5310, 20, 0, 40, 40, DFS_FCC3|DFS_ETSI|DFS_MKK4, NO_PSCAN, 0, 1}, /* NA2_5270_5310 */
57176 + { 5270, 5310, 23, 6, 40, 40, DFS_FCC3|DFS_ETSI, NO_PSCAN, 0, 1}, /* NA3_5270_5310 */
57177 + { 5270, 5310, 30, 6, 40, 40, DFS_FCC3|DFS_ETSI, NO_PSCAN, 0, 1}, /* NA4_5270_5310 */
57178 +
57179 + { 5310, 5310, 17, 6, 40, 40, DFS_FCC3|DFS_ETSI, NO_PSCAN, 0, 1}, /* NA1_5310_5310 */
57180 +
57181 + { 5510, 5630, 30, 6, 40, 40, DFS_FCC3|DFS_ETSI, NO_PSCAN, 0, 1}, /* NA1_5510_5630 */
57182 +
57183 + { 5510, 5670, 20, 6, 40, 40, DFS_FCC3|DFS_ETSI|DFS_MKK4, NO_PSCAN, 0, 1}, /* NA1_5510_5670 */
57184 + { 5510, 5670, 27, 0, 40, 40, DFS_FCC3|DFS_ETSI, NO_PSCAN, 0, 1}, /* NA2_5510_5670 */
57185 + { 5510, 5670, 30, 6, 40, 40, DFS_FCC3, NO_PSCAN, 0, 1}, /* NA3_5510_5670 */
57186 +
57187 + { 5755, 5795, 17, 0, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* NA1_5755_5795 */
57188 + { 5755, 5795, 20, 6, 40, 40, DFS_ETSI, NO_PSCAN, 0, 0}, /* NA2_5755_5795 */
57189 + { 5755, 5795, 23, 0, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* NA3_5755_5795 */
57190 + { 5755, 5795, 30, 0, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* NA4_5755_5795 */
57191 + { 5755, 5795, 30, 6, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* NA5_5755_5795 */
57192 +
57193 + { 5795, 5795, 30, 6, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* NA1_5795_5795 */
57194 +
57195 + { 4920, 6100, 30, 6, 40, 40, NO_DFS, NO_PSCAN, 0, 0}, /* NA_DEMO_ALL_CHANNELS */
57196 +};
57197 +
57198 +typedef struct regDomain {
57199 + u16_t regDmnEnum; /* value from EnumRd table */
57200 + u8_t conformanceTestLimit;
57201 + u64_t dfsMask; /* DFS bitmask for 5Ghz tables */
57202 + u64_t pscan; /* Bitmask for passive scan */
57203 + u32_t flags; /* Requirement flags (AdHoc disallow, noise
57204 + floor cal needed, etc) */
57205 + u64_t chan11a[BMLEN];/* 128 bit bitmask for channel/band
57206 + selection */
57207 + u64_t chan11a_turbo[BMLEN];/* 128 bit bitmask for channel/band
57208 + selection */
57209 + u64_t chan11a_dyn_turbo[BMLEN]; /* 128 bit bitmask for channel/band
57210 + selection */
57211 + u64_t chan11b[BMLEN];/* 128 bit bitmask for channel/band
57212 + selection */
57213 + u64_t chan11g[BMLEN];/* 128 bit bitmask for channel/band
57214 + selection */
57215 + u64_t chan11g_turbo[BMLEN];/* 128 bit bitmask for channel/band
57216 + selection */
57217 + u64_t chan11ng[BMLEN];/* 128 bit bitmask for 11n in 2GHz */
57218 + u64_t chan11na[BMLEN];/* 128 bit bitmask for 11n in 5GHz */
57219 +} REG_DOMAIN;
57220 +
57221 +static REG_DOMAIN regDomains[] = {
57222 +
57223 + {DEBUG_REG_DMN, FCC, NO_DFS, NO_PSCAN, NO_REQ,
57224 + BM(F1_5120_5240, F1_5260_5700, F1_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57225 + BM(T1_5130_5210, T1_5250_5330, T1_5370_5490, T1_5530_5650, T1_5150_5190, T1_5230_5310, T1_5350_5470, T1_5510_5670, -1, -1, -1, -1),
57226 + BM(T1_5200_5240, T1_5280_5280, T1_5540_5660, T1_5765_5805, -1, -1, -1, -1, -1, -1, -1, -1),
57227 + BM(F1_2312_2372, F1_2412_2472, F1_2484_2484, F1_2512_2732, -1, -1, -1, -1, -1, -1, -1, -1),
57228 + BM(G1_2312_2372, G1_2412_2472, G1_2512_2732, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57229 + BM(T1_2312_2372, T1_2437_2437, T1_2512_2732, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57230 + BM(NG_DEMO_ALL_CHANNELS, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57231 + BM(NA_DEMO_ALL_CHANNELS, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57232 +
57233 + {APL1, ETSI, NO_DFS, NO_PSCAN, NO_REQ,
57234 + BM(F4_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57235 + BMZERO,
57236 + BMZERO,
57237 + BMZERO,
57238 + BMZERO,
57239 + BMZERO,
57240 + BMZERO,
57241 + BM(NA4_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57242 +
57243 + {APL2, ETSI, NO_DFS, NO_PSCAN, NO_REQ,
57244 + BM(F1_5745_5805, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57245 + BMZERO,
57246 + BMZERO,
57247 + BMZERO,
57248 + BMZERO,
57249 + BMZERO,
57250 + BMZERO,
57251 + BM(NA3_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57252 +
57253 + {APL3, FCC, NO_DFS, NO_PSCAN, NO_REQ,
57254 + BM(F1_5280_5320, F2_5745_5805, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57255 + BMZERO,
57256 + BMZERO,
57257 + BMZERO,
57258 + BMZERO,
57259 + BMZERO,
57260 + BMZERO,
57261 + BM(NA1_5310_5310, NA4_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57262 +
57263 + {APL4, ETSI, NO_DFS, NO_PSCAN, NO_REQ,
57264 + BM(F4_5180_5240, F3_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57265 + BMZERO,
57266 + BMZERO,
57267 + BMZERO,
57268 + BMZERO,
57269 + BMZERO,
57270 + BMZERO,
57271 + BM(NA4_5190_5230, NA2_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57272 +
57273 + {APL5, ETSI, NO_DFS, NO_PSCAN, NO_REQ,
57274 + BM(F2_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57275 + BMZERO,
57276 + BMZERO,
57277 + BMZERO,
57278 + BMZERO,
57279 + BMZERO,
57280 + BMZERO,
57281 + BM(NA1_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57282 +
57283 + {APL6, ETSI, DFS_ETSI, PSCAN_FCC_T | PSCAN_FCC , NO_REQ,
57284 + BM(F4_5180_5240, F2_5260_5320, F3_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57285 + BM(T2_5210_5210, T1_5250_5290, T1_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57286 + BMZERO,
57287 + BMZERO,
57288 + BMZERO,
57289 + BMZERO,
57290 + BMZERO,
57291 + BM(NA4_5190_5230, NA2_5270_5310, NA2_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57292 +
57293 + {APL7, FCC, NO_DFS, PSCAN_FCC_T | PSCAN_FCC , NO_REQ,
57294 + BM(F7_5260_5320, F4_5500_5700, F3_5745_5805, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57295 + BMZERO,
57296 + BMZERO,
57297 + BMZERO,
57298 + BMZERO,
57299 + BMZERO,
57300 + BMZERO,
57301 + BM(NA1_5310_5310, NA2_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57302 + {APL8, ETSI, NO_DFS, NO_PSCAN, DISALLOW_ADHOC_11A|DISALLOW_ADHOC_11A_TURB,
57303 + BM(F6_5260_5320, F4_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57304 + BMZERO,
57305 + BMZERO,
57306 + BMZERO,
57307 + BMZERO,
57308 + BMZERO,
57309 + BMZERO,
57310 + BM(NA4_5270_5310, NA4_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57311 +
57312 + {APL9, ETSI, DFS_ETSI, PSCAN_ETSI, DISALLOW_ADHOC_11A|DISALLOW_ADHOC_11A_TURB,
57313 + BM(F1_5180_5320, F1_5500_5620, F3_5745_5805, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57314 + BMZERO,
57315 + BMZERO,
57316 + BMZERO,
57317 + BMZERO,
57318 + BMZERO,
57319 + BMZERO,
57320 + BM(NA4_5190_5230, NA2_5270_5310, NA1_5510_5630, NA4_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1)},
57321 +
57322 + {ETSI1, ETSI, DFS_ETSI, PSCAN_ETSI, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB,
57323 + BM(W2_5180_5240, F2_5260_5320, F2_5500_5700, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57324 + BMZERO,
57325 + BMZERO,
57326 + BMZERO,
57327 + BMZERO,
57328 + BMZERO,
57329 + BMZERO,
57330 + BM(NA4_5190_5230, NA2_5270_5310, NA2_5510_5670, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57331 +
57332 + {ETSI2, ETSI, DFS_ETSI, PSCAN_ETSI, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB,
57333 + BM(F3_5180_5240, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57334 + BMZERO,
57335 + BMZERO,
57336 + BMZERO,
57337 + BMZERO,
57338 + BMZERO,
57339 + BMZERO,
57340 + BM(NA3_5190_5230, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57341 +
57342 + {ETSI3, ETSI, DFS_ETSI, PSCAN_ETSI, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB,
57343 + BM(W2_5180_5240, F2_5260_5320, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57344 + BMZERO,
57345 + BMZERO,
57346 + BMZERO,
57347 + BMZERO,
57348 + BMZERO,
57349 + BMZERO,
57350 + BM(NA4_5190_5230, NA2_5270_5310, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57351 +
57352 + {ETSI4, ETSI, DFS_ETSI, PSCAN_ETSI, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB,
57353 + BM(F3_5180_5240, F1_5260_5320, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57354 + BMZERO,
57355 + BMZERO,
57356 + BMZERO,
57357 + BMZERO,
57358 + BMZERO,
57359 + BMZERO,
57360 + BM(NA3_5190_5230, NA1_5270_5310, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57361 +
57362 + {ETSI5, ETSI, DFS_ETSI, PSCAN_ETSI, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB,
57363 + BM(F1_5180_5240, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57364 + BMZERO,
57365 + BMZERO,
57366 + BMZERO,
57367 + BMZERO,
57368 + BMZERO,
57369 + BMZERO,
57370 + BM(NA1_5190_5230, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57371 +
57372 + {ETSI6, ETSI, DFS_ETSI, PSCAN_ETSI, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB,
57373 + BM(F5_5180_5240, F1_5260_5280, F3_5500_5700, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57374 + BMZERO,
57375 + BMZERO,
57376 + BMZERO,
57377 + BMZERO,
57378 + BMZERO,
57379 + BMZERO,
57380 + BM(NA5_5190_5230, NA1_5270_5270, NA3_5510_5670, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57381 +
57382 + {FCC1, FCC, NO_DFS, NO_PSCAN, NO_REQ,
57383 + BM(F2_5180_5240, F4_5260_5320, F5_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57384 + BM(T1_5210_5210, T2_5250_5290, T2_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57385 + BM(T1_5200_5240, T1_5280_5280, T1_5765_5805, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57386 + BMZERO,
57387 + BMZERO,
57388 + BMZERO,
57389 + BMZERO,
57390 + BM(NA2_5190_5230, NA3_5270_5310, NA4_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57391 +
57392 + {FCC2, FCC, NO_DFS, NO_PSCAN, NO_REQ,
57393 + BM(F6_5180_5240, F5_5260_5320, F6_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57394 + BM(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57395 + BM(T2_5200_5240, T1_5280_5280, T1_5765_5805, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57396 + BMZERO,
57397 + BMZERO,
57398 + BMZERO,
57399 + BMZERO,
57400 + BM(NA5_5190_5230, NA3_5270_5310, NA4_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57401 +
57402 + {FCC3, FCC, DFS_FCC3, PSCAN_FCC | PSCAN_FCC_T, NO_REQ,
57403 + BM(F2_5180_5240, F3_5260_5320, F1_5500_5700, F5_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1),
57404 + BM(T1_5210_5210, T1_5250_5250, T1_5290_5290, T2_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1),
57405 + BM(T1_5200_5240, T2_5280_5280, T1_5540_5660, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57406 + BMZERO,
57407 + BMZERO,
57408 + BMZERO,
57409 + BMZERO,
57410 + BM(NA2_5190_5230, NA2_5270_5310, NA3_5510_5670, NA4_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1)},
57411 +
57412 + {FCC4, FCC, DFS_FCC3, PSCAN_FCC | PSCAN_FCC_T, NO_REQ,
57413 + BM(F1_4942_4987, F1_4945_4985, F1_4950_4980, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57414 + BMZERO,
57415 + BMZERO,
57416 + BMZERO,
57417 + BMZERO,
57418 + BMZERO,
57419 + BMZERO,
57420 + BMZERO},
57421 +
57422 + {FCC5, FCC, NO_DFS, NO_PSCAN, NO_REQ,
57423 + BM(F2_5180_5240, F5_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57424 + BMZERO,
57425 + BMZERO,
57426 + BMZERO,
57427 + BMZERO,
57428 + BMZERO,
57429 + BMZERO,
57430 + BM(NA2_5190_5230, NA4_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57431 +
57432 + {FCC6, FCC, DFS_FCC3, PSCAN_FCC, NO_REQ,
57433 + BM(F7_5180_5240, F5_5260_5320, F1_5500_5580, F1_5660_5700, F6_5745_5825, -1, -1, -1, -1, -1, -1, -1),
57434 + BM(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57435 + BM(T2_5200_5240, T1_5280_5280, T1_5765_5805, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57436 + BMZERO,
57437 + BMZERO,
57438 + BMZERO,
57439 + BMZERO,
57440 + BM(NA5_5190_5230, NA5_5755_5795, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57441 +
57442 + {MKK1, MKK, NO_DFS, PSCAN_MKK1, DISALLOW_ADHOC_11A_TURB,
57443 + BM(F1_5170_5230, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57444 + BMZERO,
57445 + BMZERO,
57446 + BMZERO,
57447 + BMZERO,
57448 + BMZERO,
57449 + BMZERO,
57450 + BMZERO},
57451 +
57452 + {MKK2, MKK, NO_DFS, PSCAN_MKK2, DISALLOW_ADHOC_11A_TURB,
57453 + BM(F1_4915_4925, F1_4935_4945, F1_4920_4980, F1_5035_5040, F1_5055_5055, F1_5040_5080, F1_5170_5230, -1, -1, -1, -1, -1),
57454 + BMZERO,
57455 + BMZERO,
57456 + BMZERO,
57457 + BMZERO,
57458 + BMZERO,
57459 + BMZERO,
57460 + BMZERO},
57461 +
57462 + /* UNI-1 even */
57463 + {MKK3, MKK, NO_DFS, PSCAN_MKK3, DISALLOW_ADHOC_11A_TURB,
57464 + BM(F4_5180_5240, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57465 + BMZERO,
57466 + BMZERO,
57467 + BMZERO,
57468 + BMZERO,
57469 + BMZERO,
57470 + BMZERO,
57471 + BM(NA4_5190_5230, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57472 +
57473 + /* UNI-1 even + UNI-2 */
57474 + {MKK4, MKK, DFS_MKK4, PSCAN_MKK3, DISALLOW_ADHOC_11A_TURB,
57475 + BM(F4_5180_5240, F2_5260_5320, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57476 + BMZERO,
57477 + BMZERO,
57478 + BMZERO,
57479 + BMZERO,
57480 + BMZERO,
57481 + BMZERO,
57482 + BM(NA4_5190_5230, NA2_5270_5310, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57483 +
57484 + /* UNI-1 even + UNI-2 + mid-band */
57485 + {MKK5, MKK, DFS_MKK4, PSCAN_MKK3, DISALLOW_ADHOC_11A_TURB,
57486 + BM(F4_5180_5240, F2_5260_5320, F4_5500_5700, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57487 + BMZERO,
57488 + BMZERO,
57489 + BMZERO,
57490 + BMZERO,
57491 + BMZERO,
57492 + BMZERO,
57493 + BM(NA4_5190_5230, NA2_5270_5310, NA1_5510_5670, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57494 +
57495 + /* UNI-1 odd + even */
57496 + {MKK6, MKK, DFS_MKK4, PSCAN_MKK1, DISALLOW_ADHOC_11A_TURB,
57497 + BM(F2_5170_5230, F4_5180_5240, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57498 + BMZERO,
57499 + BMZERO,
57500 + BMZERO,
57501 + BMZERO,
57502 + BMZERO,
57503 + BMZERO,
57504 + BM(NA4_5190_5230, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57505 +
57506 + /* UNI-1 odd + UNI-1 even + UNI-2 */
57507 + {MKK7, MKK, DFS_MKK4, PSCAN_MKK1 | PSCAN_MKK3 , DISALLOW_ADHOC_11A_TURB,
57508 + BM(F2_5170_5230, F4_5180_5240, F2_5260_5320, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57509 + BMZERO,
57510 + BMZERO,
57511 + BMZERO,
57512 + BMZERO,
57513 + BMZERO,
57514 + BMZERO,
57515 + BM(NA4_5190_5230, NA2_5270_5310, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57516 +
57517 + /* UNI-1 odd + UNI-1 even + UNI-2 + mid-band */
57518 + {MKK8, MKK, DFS_MKK4, PSCAN_MKK1 | PSCAN_MKK3 , DISALLOW_ADHOC_11A_TURB,
57519 + BM(F2_5170_5230, F4_5180_5240, F2_5260_5320, F4_5500_5700, -1, -1, -1, -1, -1, -1, -1, -1),
57520 + BMZERO,
57521 + BMZERO,
57522 + BMZERO,
57523 + BMZERO,
57524 + BMZERO,
57525 + BMZERO,
57526 + BM(NA4_5190_5230, NA2_5270_5310, NA1_5510_5670, -1, -1, -1, -1, -1, -1, -1, -1, -1)},
57527 +
57528 + /* UNI-1 even + 4.9 GHZ */
57529 + {MKK9, MKK, NO_DFS, NO_PSCAN, DISALLOW_ADHOC_11A_TURB,
57530 + BM(F1_4915_4925, F1_4935_4945, F1_4920_4980, F1_5035_5040, F1_5055_5055, F1_5040_5080, F4_5180_5240, -1, -1, -1, -1, -1),
57531 + BMZERO,
57532 + BMZERO,
57533 + BMZERO,
57534 + BMZERO,
57535 + BMZERO,
57536 + BMZERO,
57537 + BMZERO},
57538 +
57539 + /* UNI-1 even + UNI-2 + 4.9 GHZ */
57540 + {MKK10, MKK, DFS_MKK4, PSCAN_MKK3, DISALLOW_ADHOC_11A_TURB,
57541 + BM(F1_4915_4925, F1_4935_4945, F1_4920_4980, F1_5035_5040, F1_5055_5055, F1_5040_5080, F4_5180_5240, F2_5260_5320, -1, -1, -1, -1),
57542 + BMZERO,
57543 + BMZERO,
57544 + BMZERO,
57545 + BMZERO,
57546 + BMZERO,
57547 + BMZERO,
57548 + BMZERO},
57549 +
57550 + /* UNI-1 even + UNI-2 + 4.9 GHZ + mid-band */
57551 + {MKK11, MKK, DFS_MKK4, PSCAN_MKK3, DISALLOW_ADHOC_11A_TURB,
57552 + BM(F1_4915_4925, F1_4935_4945, F1_4920_4980, F1_5035_5040, F1_5055_5055, F1_5040_5080, F4_5180_5240, F2_5260_5320, F4_5500_5700, -1, -1, -1),
57553 + BMZERO,
57554 + BMZERO,
57555 + BMZERO,
57556 + BMZERO,
57557 + BMZERO,
57558 + BMZERO,
57559 + BMZERO},
57560 +
57561 + /* UNI-1 even + UNI-1 odd + UNI-2 + 4.9 GHZ + mid-band */
57562 + {MKK12, MKK, DFS_MKK4, PSCAN_MKK3, DISALLOW_ADHOC_11A_TURB,
57563 + BM(F1_4915_4925, F1_4935_4945, F1_4920_4980, F1_5035_5040, F1_5055_5055, F1_5040_5080, F1_5170_5230, F4_5180_5240, F2_5260_5320, F4_5500_5700, -1, -1),
57564 + BMZERO,
57565 + BMZERO,
57566 + BMZERO,
57567 + BMZERO,
57568 + BMZERO,
57569 + BMZERO,
57570 + BMZERO},
57571 +
57572 + /* Defined here to use when 2G channels are authorised for country K2 */
57573 + {APLD, NO_CTL, NO_DFS, NO_PSCAN, NO_REQ,
57574 + BMZERO,
57575 + BMZERO,
57576 + BMZERO,
57577 + BM(F2_2312_2372,F2_2412_2472, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57578 + BM(G2_2312_2372,G2_2412_2472, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57579 + BMZERO,
57580 + BMZERO,
57581 + BMZERO},
57582 +
57583 + {ETSIA, NO_CTL, NO_DFS, PSCAN_ETSIA, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB,
57584 + BMZERO,
57585 + BMZERO,
57586 + BMZERO,
57587 + BM(F1_2457_2472,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57588 + BM(G1_2457_2472,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57589 + BM(T2_2437_2437,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57590 + BMZERO,
57591 + BMZERO},
57592 +
57593 + {ETSIB, ETSI, NO_DFS, PSCAN_ETSIB, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB,
57594 + BMZERO,
57595 + BMZERO,
57596 + BMZERO,
57597 + BM(F1_2432_2442,-1,-1,-1,-1,-1,-1,-1, -1, -1, -1, -1),
57598 + BM(G1_2432_2442,-1,-1,-1,-1,-1,-1,-1, -1, -1, -1, -1),
57599 + BM(T2_2437_2437,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57600 + BMZERO,
57601 + BMZERO},
57602 +
57603 + {ETSIC, ETSI, NO_DFS, PSCAN_ETSIC, DISALLOW_ADHOC_11A | DISALLOW_ADHOC_11A_TURB,
57604 + BMZERO,
57605 + BMZERO,
57606 + BMZERO,
57607 + BM(F3_2412_2472,-1,-1,-1,-1,-1,-1,-1, -1, -1, -1, -1),
57608 + BM(G3_2412_2472,-1,-1,-1,-1,-1,-1,-1, -1, -1, -1, -1),
57609 + BM(T2_2437_2437,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57610 + BMZERO,
57611 + BMZERO},
57612 +
57613 + {FCCA, FCC, NO_DFS, NO_PSCAN, NO_REQ,
57614 + BMZERO,
57615 + BMZERO,
57616 + BMZERO,
57617 + BM(F1_2412_2462,-1,-1,-1,-1,-1,-1,-1, -1, -1, -1, -1),
57618 + BM(G1_2412_2462,-1,-1,-1,-1,-1,-1,-1, -1, -1, -1, -1),
57619 + BM(T2_2437_2437,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57620 + BM(NG2_2422_2452,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57621 + BMZERO},
57622 +
57623 + {MKKA, MKK, NO_DFS, PSCAN_MKKA | PSCAN_MKKA_G | PSCAN_MKKA1 | PSCAN_MKKA1_G | PSCAN_MKKA2 | PSCAN_MKKA2_G, DISALLOW_ADHOC_11A_TURB,
57624 + BMZERO,
57625 + BMZERO,
57626 + BMZERO,
57627 + BM(F2_2412_2462, F1_2467_2472, F2_2484_2484, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57628 + BM(G2_2412_2462, G1_2467_2472, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57629 + BM(T2_2437_2437,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57630 + BM(NG1_2422_2452,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57631 + BMZERO},
57632 +
57633 + {MKKC, MKK, NO_DFS, NO_PSCAN, NO_REQ,
57634 + BMZERO,
57635 + BMZERO,
57636 + BMZERO,
57637 + BM(F2_2412_2472,-1,-1,-1,-1,-1,-1,-1, -1, -1, -1, -1),
57638 + BM(G2_2412_2472,-1,-1,-1,-1,-1,-1,-1, -1, -1, -1, -1),
57639 + BM(T2_2437_2437,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57640 + BM(NG1_2422_2452,-1,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57641 + BMZERO},
57642 +
57643 + {WORLD, ETSI, NO_DFS, NO_PSCAN, NO_REQ,
57644 + BMZERO,
57645 + BMZERO,
57646 + BMZERO,
57647 + BM(F2_2412_2472,-1,-1,-1,-1,-1,-1,-1, -1, -1, -1, -1),
57648 + BM(G2_2412_2472,-1,-1,-1,-1,-1,-1,-1, -1, -1, -1, -1),
57649 + BM(T2_2437_2437,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57650 + BM(NG1_2422_2452,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57651 + BMZERO},
57652 +
57653 + {WOR0_WORLD, NO_CTL, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, ADHOC_PER_11D,
57654 + BM(W1_5260_5320, W1_5180_5240, W1_5170_5230, W1_5745_5825, W1_5500_5700, -1, -1, -1, -1, -1, -1, -1),
57655 + BM(WT1_5210_5250, WT1_5290_5290, WT1_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57656 + BMZERO,
57657 + BM(W1_2412_2412,W1_2437_2442,W1_2462_2462,W1_2472_2472,W1_2417_2432, W1_2447_2457, W1_2467_2467, W1_2484_2484, -1, -1, -1, -1),
57658 + BM(WG1_2412_2412,WG1_2437_2442,WG1_2462_2462,WG1_2472_2472,WG1_2417_2432,WG1_2447_2457,WG1_2467_2467, -1, -1, -1, -1, -1),
57659 + BM(T3_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57660 + BMZERO,
57661 + BMZERO},
57662 +
57663 + {WOR01_WORLD, NO_CTL, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, ADHOC_PER_11D,
57664 + BM(W1_5260_5320, W1_5180_5240, W1_5170_5230, W1_5745_5825, W1_5500_5700, -1, -1, -1, -1, -1, -1, -1),
57665 + BM(WT1_5210_5250, WT1_5290_5290, WT1_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57666 + BMZERO,
57667 + BM(W1_2412_2412, W1_2437_2442, W1_2462_2462, W1_2417_2432, W1_2447_2457, -1, -1, -1, -1, -1, -1, -1),
57668 + BM(WG1_2412_2412, WG1_2437_2442, WG1_2462_2462, WG1_2417_2432, WG1_2447_2457, -1, -1, -1, -1, -1, -1, -1),
57669 + BM(T3_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57670 + BMZERO,
57671 + BMZERO},
57672 +
57673 + {WOR02_WORLD, NO_CTL, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, ADHOC_PER_11D,
57674 + BM(W1_5260_5320, W1_5180_5240,W1_5170_5230,W1_5745_5825,W1_5500_5700, -1, -1, -1, -1, -1, -1, -1),
57675 + BM(WT1_5210_5250, WT1_5290_5290, WT1_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57676 + BMZERO,
57677 + BM(W1_2412_2412,W1_2437_2442,W1_2462_2462, W1_2472_2472,W1_2417_2432, W1_2447_2457, W1_2467_2467, -1, -1, -1, -1, -1),
57678 + BM(WG1_2412_2412,WG1_2437_2442,WG1_2462_2462, WG1_2472_2472,WG1_2417_2432, WG1_2447_2457, WG1_2467_2467, -1, -1, -1, -1, -1),
57679 + BM(T3_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57680 + BMZERO,
57681 + BMZERO},
57682 +
57683 + {EU1_WORLD, NO_CTL, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, ADHOC_PER_11D,
57684 + BM(W1_5260_5320, W1_5180_5240,W1_5170_5230,W1_5745_5825,W1_5500_5700, -1, -1, -1, -1, -1, -1, -1),
57685 + BM(WT1_5210_5250, WT1_5290_5290, WT1_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57686 + BMZERO,
57687 + BM(W1_2412_2412,W1_2437_2442,W1_2462_2462, W2_2472_2472,W1_2417_2432, W1_2447_2457, W2_2467_2467, -1, -1, -1, -1, -1),
57688 + BM(WG1_2412_2412,WG1_2437_2442,WG1_2462_2462, WG2_2472_2472,WG1_2417_2432, WG1_2447_2457, WG2_2467_2467, -1, -1, -1, -1, -1),
57689 + BM(T3_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57690 + BMZERO,
57691 + BMZERO},
57692 +
57693 + {WOR1_WORLD, NO_CTL, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, ADHOC_NO_11A,
57694 + BM(W1_5260_5320, W1_5180_5240, W1_5170_5230, W1_5745_5825, W1_5500_5700, -1, -1, -1, -1, -1, -1, -1),
57695 + BMZERO,
57696 + BMZERO,
57697 + BM(W1_2412_2412,W1_2437_2442,W1_2462_2462,W1_2472_2472,W1_2417_2432, W1_2447_2457, W1_2467_2467, W1_2484_2484, -1, -1, -1, -1),
57698 + BM(WG1_2412_2412,WG1_2437_2442,WG1_2462_2462,WG1_2472_2472,WG1_2417_2432,WG1_2447_2457,WG1_2467_2467, -1, -1, -1, -1, -1),
57699 + BM(T3_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57700 + BMZERO,
57701 + BMZERO},
57702 +
57703 + {WOR2_WORLD, NO_CTL, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, ADHOC_NO_11A,
57704 + BM(W1_5260_5320, W1_5180_5240, W1_5170_5230, W1_5745_5825, W1_5500_5700, -1, -1, -1, -1, -1, -1, -1),
57705 + BM(WT1_5210_5250, WT1_5290_5290, WT1_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57706 + BMZERO,
57707 + BM(W1_2412_2412,W1_2437_2442,W1_2462_2462,W1_2472_2472,W1_2417_2432, W1_2447_2457, W1_2467_2467, W1_2484_2484, -1, -1, -1, -1),
57708 + BM(WG1_2412_2412,WG1_2437_2442,WG1_2462_2462,WG1_2472_2472,WG1_2417_2432,WG1_2447_2457,WG1_2467_2467, -1, -1, -1, -1, -1),
57709 + BM(T3_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57710 + BMZERO,
57711 + BMZERO},
57712 +
57713 + {WOR3_WORLD, NO_CTL, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, ADHOC_PER_11D,
57714 + BM(W1_5260_5320, W1_5180_5240, W1_5170_5230, W1_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1),
57715 + BM(WT1_5210_5250, WT1_5290_5290, WT1_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57716 + BMZERO,
57717 + BM(W1_2412_2412,W1_2437_2442,W1_2462_2462,W1_2472_2472,W1_2417_2432, W1_2447_2457, W1_2467_2467, -1, -1, -1, -1, -1),
57718 + BM(WG1_2412_2412,WG1_2437_2442,WG1_2462_2462,WG1_2472_2472,WG1_2417_2432,WG1_2447_2457,WG1_2467_2467,-1, -1, -1, -1, -1),
57719 + BM(T3_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57720 + BMZERO,
57721 + BMZERO},
57722 +
57723 + {WOR4_WORLD, NO_CTL, DFS_FCC3, PSCAN_WWR, ADHOC_NO_11A,
57724 + BM(W2_5260_5320, W2_5180_5240, F2_5745_5805, W2_5825_5825, -1, -1, -1, -1, -1, -1, -1, -1),
57725 + BM(WT1_5210_5250, WT1_5290_5290, WT1_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57726 + BMZERO,
57727 + BM(W1_2412_2412,W1_2437_2442,W1_2462_2462, W1_2417_2432,W1_2447_2457,-1, -1, -1, -1, -1, -1, -1),
57728 + BM(WG1_2412_2412,WG1_2437_2442,WG1_2462_2462, WG1_2417_2432,WG1_2447_2457,-1, -1, -1, -1, -1, -1, -1),
57729 + BM(T3_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57730 + BMZERO,
57731 + BMZERO},
57732 +
57733 + {WOR5_ETSIC, NO_CTL, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, ADHOC_NO_11A,
57734 + BM(W1_5260_5320, W2_5180_5240, F6_5745_5825, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57735 + BMZERO,
57736 + BMZERO,
57737 + BM(W1_2412_2412, W1_2437_2442, W1_2462_2462, W2_2472_2472, W1_2417_2432, W1_2447_2457, W2_2467_2467, -1, -1, -1, -1, -1),
57738 + BM(WG1_2412_2412, WG1_2437_2442, WG1_2462_2462, WG1_2472_2472, WG1_2417_2432, WG1_2447_2457, WG1_2467_2467, -1, -1, -1, -1, -1),
57739 + BM(T3_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57740 + BMZERO,
57741 + BMZERO},
57742 +
57743 + {WOR9_WORLD, NO_CTL, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, ADHOC_NO_11A,
57744 + BM(W1_5260_5320, W1_5180_5240, W1_5745_5825, W1_5500_5700, -1, -1, -1, -1, -1, -1, -1, -1),
57745 + BM(WT1_5210_5250, WT1_5290_5290, WT1_5760_5800, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57746 + BMZERO,
57747 + BM(W1_2412_2412, W1_2437_2442, W1_2462_2462, W1_2417_2432, W1_2447_2457, -1, -1, -1, -1, -1, -1, -1),
57748 + BM(WG1_2412_2412, WG1_2437_2442, WG1_2462_2462, WG1_2417_2432, WG1_2447_2457, -1, -1, -1, -1, -1, -1, -1),
57749 + BM(T3_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57750 + BMZERO,
57751 + BMZERO},
57752 +
57753 + {WORA_WORLD, NO_CTL, DFS_FCC3 | DFS_ETSI, PSCAN_WWR, ADHOC_NO_11A,
57754 + BM(W1_5260_5320, W1_5180_5240, W1_5745_5825, W1_5500_5700, -1, -1, -1, -1, -1, -1, -1, -1),
57755 + BMZERO,
57756 + BMZERO,
57757 + BM(W1_2412_2412, W1_2437_2442, W1_2462_2462, W1_2472_2472, W1_2417_2432, W1_2447_2457, W1_2467_2467, -1, -1, -1, -1, -1),
57758 + BM(WG1_2412_2412, WG1_2437_2442, WG1_2462_2462, WG1_2472_2472, WG1_2417_2432, WG1_2447_2457, WG1_2467_2467, -1, -1, -1, -1, -1),
57759 + BM(T3_2437_2437, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1),
57760 + BMZERO,
57761 + BMZERO},
57762 +
57763 + {NULL1, NO_CTL, NO_DFS, NO_PSCAN, NO_REQ,
57764 + BMZERO,
57765 + BMZERO,
57766 + BMZERO,
57767 + BMZERO,
57768 + BMZERO,
57769 + BMZERO,
57770 + BMZERO,
57771 + BMZERO},
57772 +};
57773 +
57774 +struct cmode {
57775 + u16_t mode;
57776 + u32_t flags;
57777 +};
57778 +
57779 +static const struct cmode modes[] = {
57780 + { HAL_MODE_TURBO, CHANNEL_ST}, /* TURBO means 11a Static Turbo */
57781 + { HAL_MODE_11A, CHANNEL_A},
57782 + { HAL_MODE_11B, CHANNEL_B},
57783 + { HAL_MODE_11G, CHANNEL_G},
57784 + { HAL_MODE_11G_TURBO, CHANNEL_108G},
57785 + { HAL_MODE_11A_TURBO, CHANNEL_108A},
57786 + { HAL_MODE_11NA, CHANNEL_A_HT40},
57787 + { HAL_MODE_11NA, CHANNEL_A_HT20},
57788 + { HAL_MODE_11NG, CHANNEL_G_HT40},
57789 + { HAL_MODE_11NG, CHANNEL_G_HT20},
57790 +};
57791 +
57792 +/*
57793 + * Return the Wireless Mode Regulatory Domain based
57794 + * on the country code and the wireless mode.
57795 + */
57796 +u8_t GetWmRD(u16_t regionCode, u16_t channelFlag, REG_DOMAIN *rd)
57797 +{
57798 + s16_t i, found, regDmn;
57799 + u64_t flags=NO_REQ;
57800 + REG_DMN_PAIR_MAPPING *regPair=NULL;
57801 +
57802 + for (i=0, found=0; (i<N(regDomainPairs))&&(!found); i++)
57803 + {
57804 + if (regDomainPairs[i].regDmnEnum == regionCode)
57805 + {
57806 + regPair = &regDomainPairs[i];
57807 + found = 1;
57808 + }
57809 + }
57810 + if (!found)
57811 + {
57812 + zm_debug_msg1("Failed to find reg domain pair ", regionCode);
57813 + return FALSE;
57814 + }
57815 +
57816 + if (channelFlag & ZM_REG_FLAG_CHANNEL_2GHZ)
57817 + {
57818 + regDmn = regPair->regDmn2GHz;
57819 + flags = regPair->flags2GHz;
57820 + }
57821 + else
57822 + {
57823 + regDmn = regPair->regDmn5GHz;
57824 + flags = regPair->flags5GHz;
57825 + }
57826 +
57827 + /*
57828 + * We either started with a unitary reg domain or we've found the
57829 + * unitary reg domain of the pair
57830 + */
57831 +
57832 + for (i=0;i<N(regDomains); i++)
57833 + {
57834 + if (regDomains[i].regDmnEnum == regDmn)
57835 + {
57836 + if (rd != NULL)
57837 + {
57838 + zfMemoryCopy((u8_t *)rd, (u8_t *)&regDomains[i],
57839 + sizeof(REG_DOMAIN));
57840 + }
57841 + }
57842 + }
57843 + rd->pscan &= regPair->pscanMask;
57844 + rd->flags = (u32_t)flags;
57845 + return TRUE;
57846 +}
57847 +
57848 +/*
57849 + * Test to see if the bitmask array is all zeros
57850 + */
57851 +u8_t isChanBitMaskZero(u64_t *bitmask)
57852 +{
57853 + u16_t i;
57854 +
57855 + for (i=0; i<BMLEN; i++) {
57856 + if (bitmask[i] != 0)
57857 + return FALSE;
57858 + }
57859 + return TRUE;
57860 +}
57861 +
57862 +u8_t IS_BIT_SET(u32_t bit, u64_t *bitmask)
57863 +{
57864 + u32_t byteOffset, bitnum;
57865 + u64_t val;
57866 +
57867 + byteOffset = bit/64;
57868 + bitnum = bit - byteOffset*64;
57869 + val = ((u64_t) 1) << bitnum;
57870 + if (bitmask[byteOffset] & val)
57871 + return TRUE;
57872 + else
57873 + return FALSE;
57874 +}
57875 +
57876 +
57877 +void zfHpGetRegulationTable(zdev_t* dev, u16_t regionCode, u16_t c_lo, u16_t c_hi)
57878 +{
57879 + REG_DOMAIN rd5GHz, rd2GHz;
57880 + const struct cmode *cm;
57881 + s16_t next=0,b;
57882 + zmw_get_wlan_dev(dev);
57883 + struct zsHpPriv* hpPriv=wd->hpPrivate;
57884 +
57885 + zmw_declare_for_critical_section();
57886 +
57887 + if (!GetWmRD(regionCode, ~ZM_REG_FLAG_CHANNEL_2GHZ, &rd5GHz))
57888 + {
57889 + zm_debug_msg1("couldn't find unitary 5GHz reg domain for Region Code ", regionCode);
57890 + return;
57891 + }
57892 + if (!GetWmRD(regionCode, ZM_REG_FLAG_CHANNEL_2GHZ, &rd2GHz))
57893 + {
57894 + zm_debug_msg1("couldn't find unitary 2GHz reg domain for Region Code ", regionCode);
57895 + return;
57896 + }
57897 + if (wd->regulationTable.regionCode == regionCode)
57898 + {
57899 + zm_debug_msg1("current region code is the same with Region Code ", regionCode);
57900 + return;
57901 + }
57902 + else
57903 + {
57904 + wd->regulationTable.regionCode = regionCode;
57905 + }
57906 +
57907 + next = 0;
57908 +
57909 + zmw_enter_critical_section(dev);
57910 +
57911 + for (cm = modes; cm < &modes[N(modes)]; cm++)
57912 + {
57913 + u16_t c;
57914 + u64_t *channelBM=NULL;
57915 + REG_DOMAIN *rd=NULL;
57916 + REG_DMN_FREQ_BAND *fband=NULL,*freqs=NULL;
57917 +
57918 + switch (cm->mode)
57919 + {
57920 + case HAL_MODE_TURBO:
57921 + //we don't have turbo mode so we disable it
57922 + //zm_debug_msg0("CWY - HAL_MODE_TURBO");
57923 + channelBM = NULL;
57924 + //rd = &rd5GHz;
57925 + //channelBM = rd->chan11a_turbo;
57926 + //freqs = &regDmn5GhzTurboFreq[0];
57927 + //ctl = rd->conformanceTestLimit | CTL_TURBO;
57928 + break;
57929 + case HAL_MODE_11A:
57930 + if ((hpPriv->OpFlags & 0x1) != 0)
57931 + {
57932 + rd = &rd5GHz;
57933 + channelBM = rd->chan11a;
57934 + freqs = &regDmn5GhzFreq[0];
57935 + c_lo = 4920; //from channel 184
57936 + c_hi = 5825; //to channel 165
57937 + //ctl = rd->conformanceTestLimit;
57938 + //zm_debug_msg2("CWY - HAL_MODE_11A, channelBM = 0x", *channelBM);
57939 + }
57940 + //else
57941 + {
57942 + //channelBM = NULL;
57943 + }
57944 + break;
57945 + case HAL_MODE_11B:
57946 + //Disable 11B mode because it only has difference with 11G in PowerDFS Data,
57947 + //and we don't use this now.
57948 + //zm_debug_msg0("CWY - HAL_MODE_11B");
57949 + channelBM = NULL;
57950 + //rd = &rd2GHz;
57951 + //channelBM = rd->chan11b;
57952 + //freqs = &regDmn2GhzFreq[0];
57953 + //ctl = rd->conformanceTestLimit | CTL_11B;
57954 + //zm_debug_msg2("CWY - HAL_MODE_11B, channelBM = 0x", *channelBM);
57955 + break;
57956 + case HAL_MODE_11G:
57957 + if ((hpPriv->OpFlags & 0x2) != 0)
57958 + {
57959 + rd = &rd2GHz;
57960 + channelBM = rd->chan11g;
57961 + freqs = &regDmn2Ghz11gFreq[0];
57962 + c_lo = 2412; //from channel 1
57963 + //c_hi = 2462; //to channel 11
57964 + c_hi = 2472; //to channel 13
57965 + //ctl = rd->conformanceTestLimit | CTL_11G;
57966 + //zm_debug_msg2("CWY - HAL_MODE_11G, channelBM = 0x", *channelBM);
57967 + }
57968 + //else
57969 + {
57970 + //channelBM = NULL;
57971 + }
57972 + break;
57973 + case HAL_MODE_11G_TURBO:
57974 + //we don't have turbo mode so we disable it
57975 + //zm_debug_msg0("CWY - HAL_MODE_11G_TURBO");
57976 + channelBM = NULL;
57977 + //rd = &rd2GHz;
57978 + //channelBM = rd->chan11g_turbo;
57979 + //freqs = &regDmn2Ghz11gTurboFreq[0];
57980 + //ctl = rd->conformanceTestLimit | CTL_108G;
57981 + break;
57982 + case HAL_MODE_11A_TURBO:
57983 + //we don't have turbo mode so we disable it
57984 + //zm_debug_msg0("CWY - HAL_MODE_11A_TURBO");
57985 + channelBM = NULL;
57986 + //rd = &rd5GHz;
57987 + //channelBM = rd->chan11a_dyn_turbo;
57988 + //freqs = &regDmn5GhzTurboFreq[0];
57989 + //ctl = rd->conformanceTestLimit | CTL_108G;
57990 + break;
57991 + default:
57992 + zm_debug_msg1("Unkonwn HAL mode ", cm->mode);
57993 + continue;
57994 + }
57995 + if (channelBM == NULL)
57996 + {
57997 + //zm_debug_msg0("CWY - channelBM is NULL");
57998 + continue;
57999 + }
58000 + if (isChanBitMaskZero(channelBM))
58001 + {
58002 + //zm_debug_msg0("CWY - BitMask is Zero");
58003 + continue;
58004 + }
58005 +
58006 + // RAY:Is it ok??
58007 + if (freqs == NULL )
58008 + {
58009 + continue;
58010 + }
58011 +
58012 + for (b=0;b<64*BMLEN; b++)
58013 + {
58014 + if (IS_BIT_SET(b,channelBM))
58015 + {
58016 + fband = &freqs[b];
58017 +
58018 + //zm_debug_msg1("CWY - lowChannel = ", fband->lowChannel);
58019 + //zm_debug_msg1("CWY - highChannel = ", fband->highChannel);
58020 + //zm_debug_msg1("CWY - channelSep = ", fband->channelSep);
58021 + for (c=fband->lowChannel; c <= fband->highChannel;
58022 + c += fband->channelSep)
58023 + {
58024 + ZM_HAL_CHANNEL icv;
58025 +
58026 + //Disable all DFS channel
58027 + if ((hpPriv->disableDfsCh==0) || (!(fband->useDfs & rd->dfsMask)))
58028 + {
58029 + if( fband->channelBW < 20 )
58030 + {
58031 + /**************************************************************/
58032 + /* */
58033 + /* Temporary discard channel that BW < 20MHz (5 or 10MHz) */
58034 + /* Our architecture does not implemnt it !!! */
58035 + /* */
58036 + /**************************************************************/
58037 + continue;
58038 + }
58039 + if ((c >= c_lo) && (c <= c_hi))
58040 + {
58041 + icv.channel = c;
58042 + icv.channelFlags = cm->flags;
58043 + icv.maxRegTxPower = fband->powerDfs;
58044 + if (fband->usePassScan & rd->pscan)
58045 + icv.channelFlags |= ZM_REG_FLAG_CHANNEL_PASSIVE;
58046 + else
58047 + icv.channelFlags &= ~ZM_REG_FLAG_CHANNEL_PASSIVE;
58048 + if (fband->useDfs & rd->dfsMask)
58049 + icv.privFlags = ZM_REG_FLAG_CHANNEL_DFS;
58050 + else
58051 + icv.privFlags = 0;
58052 +
58053 + /* For now disable radar for FCC3 */
58054 + if (fband->useDfs & rd->dfsMask & DFS_FCC3)
58055 + {
58056 + icv.privFlags &= ~ZM_REG_FLAG_CHANNEL_DFS;
58057 + icv.privFlags |= ZM_REG_FLAG_CHANNEL_DFS_CLEAR;
58058 + }
58059 +
58060 + if(rd->flags & LIMIT_FRAME_4MS)
58061 + icv.privFlags |= ZM_REG_FLAG_CHANNEL_DFS_CLEAR;
58062 +
58063 + icv.minTxPower = 0;
58064 + icv.maxTxPower = 0;
58065 +
58066 + zm_assert(next < 60);
58067 +
58068 + wd->regulationTable.allowChannel[next++] = icv;
58069 + }
58070 + }
58071 + }
58072 + }
58073 + }
58074 + }
58075 + wd->regulationTable.allowChannelCnt = next;
58076 +
58077 + #if 0
58078 + {
58079 + /* debug print */
58080 + u32_t i;
58081 + DbgPrint("\n-------------------------------------------\n");
58082 + DbgPrint("zfHpGetRegulationTable print all channel info regincode = 0x%x\n", wd->regulationTable.regionCode);
58083 + DbgPrint("index channel channelFlags maxRegTxPower privFlags useDFS\n");
58084 +
58085 + for (i=0; i<wd->regulationTable.allowChannelCnt; i++)
58086 + {
58087 + DbgPrint("%02d %d %04x %02d %x %x\n",
58088 + i,
58089 + wd->regulationTable.allowChannel[i].channel,
58090 + wd->regulationTable.allowChannel[i].channelFlags,
58091 + wd->regulationTable.allowChannel[i].maxRegTxPower,
58092 + wd->regulationTable.allowChannel[i].privFlags,
58093 + wd->regulationTable.allowChannel[i].privFlags & ZM_REG_FLAG_CHANNEL_DFS);
58094 + }
58095 + }
58096 + #endif
58097 +
58098 + zmw_leave_critical_section(dev);
58099 +}
58100 +
58101 +void zfHpGetRegulationTablefromRegionCode(zdev_t* dev, u16_t regionCode)
58102 +{
58103 + u16_t c_lo = 2000, c_hi = 6000; //default channel is all enable
58104 + u8_t isoName[3] = {'N', 'A', 0};
58105 +
58106 + zfCoreSetIsoName(dev, isoName);
58107 +
58108 + zfHpGetRegulationTable(dev, regionCode, c_lo, c_hi);
58109 +}
58110 +
58111 +void zfHpGetRegulationTablefromCountry(zdev_t* dev, u16_t CountryCode)
58112 +{
58113 + u16_t i;
58114 + u16_t c_lo = 2000, c_hi = 6000; //default channel is all enable
58115 + u16_t RegDomain;
58116 +
58117 + zmw_get_wlan_dev(dev);
58118 +
58119 + zmw_declare_for_critical_section();
58120 +
58121 + for (i = 0; i < N(allCountries); i++)
58122 + {
58123 + if (CountryCode == allCountries[i].countryCode)
58124 + {
58125 + RegDomain = allCountries[i].regDmnEnum;
58126 +
58127 + // read the ACU country code from EEPROM
58128 + zfCoreSetIsoName(dev, (u8_t*)allCountries[i].isoName);
58129 +
58130 + //zm_debug_msg_s("CWY - Country Name = ", allCountries[i].name);
58131 +
58132 + if (wd->regulationTable.regionCode != RegDomain)
58133 + {
58134 + //zm_debug_msg0("CWY - Change regulatory table");
58135 +
58136 + zfHpGetRegulationTable(dev, RegDomain, c_lo, c_hi);
58137 + }
58138 + return;
58139 + }
58140 + }
58141 + zm_debug_msg1("Invalid CountryCode = ", CountryCode);
58142 +}
58143 +
58144 +u8_t zfHpGetRegulationTablefromISO(zdev_t* dev, u8_t *countryInfo, u8_t length)
58145 +{
58146 + u16_t i;
58147 + u16_t RegDomain;
58148 + u16_t c_lo = 2000, c_hi = 6000; //default channel is all enable
58149 + //u8_t strLen = 2;
58150 +
58151 + zmw_get_wlan_dev(dev);
58152 +
58153 + zmw_declare_for_critical_section();
58154 +
58155 + if (countryInfo[4] != 0x20)
58156 + { // with (I)ndoor/(O)utdoor info
58157 + //strLen = 3;
58158 + }
58159 + //zm_debug_msg_s("Desired iso name = ", isoName);
58160 + for (i = 0; i < N(allCountries); i++)
58161 + {
58162 + //zm_debug_msg_s("Current iso name = ", allCountries[i].isoName);
58163 + if (zfMemoryIsEqual((u8_t *)allCountries[i].isoName, (u8_t *)&countryInfo[2], length-1))
58164 + {
58165 + //DbgPrint("Set current iso name = %s\n", allCountries[i].isoName);
58166 + //zm_debug_msg0("iso name hit!!");
58167 +
58168 + RegDomain = allCountries[i].regDmnEnum;
58169 +
58170 + if (wd->regulationTable.regionCode != RegDomain)
58171 + {
58172 + zfHpGetRegulationTable(dev, RegDomain, c_lo, c_hi);
58173 + }
58174 +
58175 + //while (index < (countryInfo[1]+2))
58176 + //{
58177 + // if (countryInfo[index] <= 14)
58178 + // {
58179 + // /* calculate 2.4GHz low boundary channel frequency */
58180 + // ch = countryInfo[index];
58181 + // if ( ch == 14 )
58182 + // c_lo = ZM_CH_G_14;
58183 + // else
58184 + // c_lo = ZM_CH_G_1 + (ch - 1) * 5;
58185 + // /* calculate 2.4GHz high boundary channel frequency */
58186 + // ch = countryInfo[index] + countryInfo[index + 1] - 1;
58187 + // if ( ch == 14 )
58188 + // c_hi = ZM_CH_G_14;
58189 + // else
58190 + // c_hi = ZM_CH_G_1 + (ch - 1) * 5;
58191 + // }
58192 + // else
58193 + // {
58194 + // /* calculate 5GHz low boundary channel frequency */
58195 + // ch = countryInfo[index];
58196 + // if ( (ch >= 184)&&(ch <= 196) )
58197 + // c_lo = 4000 + ch*5;
58198 + // else
58199 + // c_lo = 5000 + ch*5;
58200 + // /* calculate 5GHz high boundary channel frequency */
58201 + // ch = countryInfo[index] + countryInfo[index + 1] - 1;
58202 + // if ( (ch >= 184)&&(ch <= 196) )
58203 + // c_hi = 4000 + ch*5;
58204 + // else
58205 + // c_hi = 5000 + ch*5;
58206 + // }
58207 + //
58208 + // zfHpGetRegulationTable(dev, RegDomain, c_lo, c_hi);
58209 + //
58210 + // index+=3;
58211 + //}
58212 +
58213 + return 0;
58214 + }
58215 + }
58216 + //zm_debug_msg_s("Invalid iso name = ", &countryInfo[2]);
58217 + return 1;
58218 +}
58219 +
58220 +const char* zfHpGetisoNamefromregionCode(zdev_t* dev, u16_t regionCode)
58221 +{
58222 + u16_t i;
58223 +
58224 + for (i = 0; i < N(allCountries); i++)
58225 + {
58226 + if (allCountries[i].regDmnEnum == regionCode)
58227 + {
58228 + return allCountries[i].isoName;
58229 + }
58230 + }
58231 + /* no matching item, return default */
58232 + return allCountries[0].isoName;
58233 +}
58234 +
58235 +u16_t zfHpGetRegionCodeFromIsoName(zdev_t* dev, u8_t *countryIsoName)
58236 +{
58237 + u16_t i;
58238 + u16_t regionCode;
58239 +
58240 + /* if no matching item, return default */
58241 + regionCode = DEF_REGDMN;
58242 +
58243 + for (i = 0; i < N(allCountries); i++)
58244 + {
58245 + if (zfMemoryIsEqual((u8_t *)allCountries[i].isoName, countryIsoName, 2))
58246 + {
58247 + regionCode = allCountries[i].regDmnEnum;
58248 + break;
58249 + }
58250 + }
58251 +
58252 + return regionCode;
58253 +}
58254 +
58255 +/************************************************************************/
58256 +/* */
58257 +/* FUNCTION DESCRIPTION zfHpDeleteAllowChannel */
58258 +/* Delete Allow Channel. */
58259 +/* */
58260 +/* INPUTS */
58261 +/* dev : device pointer */
58262 +/* freq : frequency */
58263 +/* */
58264 +/* OUTPUTS */
58265 +/* 0 : success */
58266 +/* other : fail */
58267 +/* */
58268 +/* AUTHOR */
58269 +/* Chao-Wen Yang ZyDAS Technology Corporation 2007.3 */
58270 +/* */
58271 +/************************************************************************/
58272 +u16_t zfHpDeleteAllowChannel(zdev_t* dev, u16_t freq)
58273 +{
58274 + u16_t i, bandIndex = 0;
58275 + u16_t dfs5GBand[][2] = {{5150, 5240}, {5260, 5350}, {5450, 5700}, {5725, 5825}};
58276 +
58277 + zmw_get_wlan_dev(dev);
58278 + /* Find which band does this frequency belong */
58279 + for (i = 0; i < 4; i++)
58280 + {
58281 + if ((freq >= dfs5GBand[i][0]) && (freq <= dfs5GBand[i][1]))
58282 + bandIndex = i + 1;
58283 + }
58284 +
58285 + if (bandIndex == 0)
58286 + {
58287 + /* 2.4G, don't care */
58288 + return 0;
58289 + }
58290 + else
58291 + {
58292 + bandIndex--;
58293 + }
58294 + /* Set all channels in this band to passive scan */
58295 + for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
58296 + {
58297 + if ((wd->regulationTable.allowChannel[i].channel >= dfs5GBand[bandIndex][0]) &&
58298 + (wd->regulationTable.allowChannel[i].channel <= dfs5GBand[bandIndex][1]))
58299 + {
58300 + /* if channel is not passive, set it to be passive and mark it */
58301 + if ((wd->regulationTable.allowChannel[i].channelFlags &
58302 + ZM_REG_FLAG_CHANNEL_PASSIVE) == 0)
58303 + {
58304 + wd->regulationTable.allowChannel[i].channelFlags |=
58305 + (ZM_REG_FLAG_CHANNEL_PASSIVE | ZM_REG_FLAG_CHANNEL_CSA);
58306 + }
58307 + }
58308 + }
58309 +
58310 + return 0;
58311 +}
58312 +
58313 +u16_t zfHpAddAllowChannel(zdev_t* dev, u16_t freq)
58314 +{
58315 + u16_t i, j, arrayIndex;
58316 +
58317 + zmw_get_wlan_dev(dev);
58318 +
58319 + for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
58320 + {
58321 + if (wd->regulationTable.allowChannel[i].channel == freq)
58322 + break;
58323 + }
58324 +
58325 + if ( i == wd->regulationTable.allowChannelCnt)
58326 + {
58327 + for (j = 0; j < wd->regulationTable.allowChannelCnt; j++)
58328 + {
58329 + if (wd->regulationTable.allowChannel[j].channel > freq)
58330 + break;
58331 + }
58332 +
58333 + //zm_debug_msg1("CWY - add frequency = ", freq);
58334 + //zm_debug_msg1("CWY - channel array index = ", j);
58335 +
58336 + arrayIndex = j;
58337 +
58338 + if (arrayIndex < wd->regulationTable.allowChannelCnt)
58339 + {
58340 + for (j = wd->regulationTable.allowChannelCnt; j > arrayIndex; j--)
58341 + wd->regulationTable.allowChannel[j] = wd->regulationTable.allowChannel[j - 1];
58342 + }
58343 + wd->regulationTable.allowChannel[arrayIndex].channel = freq;
58344 +
58345 + wd->regulationTable.allowChannelCnt++;
58346 + }
58347 +
58348 + return 0;
58349 +}
58350 +
58351 +u16_t zfHpIsDfsChannelNCS(zdev_t* dev, u16_t freq)
58352 +{
58353 + u8_t flag = ZM_REG_FLAG_CHANNEL_DFS;
58354 + u16_t i;
58355 + zmw_get_wlan_dev(dev);
58356 +
58357 + for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
58358 + {
58359 + //DbgPrint("DFS:freq=%d, chan=%d", freq, wd->regulationTable.allowChannel[i].channel);
58360 + if (wd->regulationTable.allowChannel[i].channel == freq)
58361 + {
58362 + flag = wd->regulationTable.allowChannel[i].privFlags;
58363 + break;
58364 + }
58365 + }
58366 +
58367 + return (flag & (ZM_REG_FLAG_CHANNEL_DFS|ZM_REG_FLAG_CHANNEL_DFS_CLEAR));
58368 +}
58369 +
58370 +u16_t zfHpIsDfsChannel(zdev_t* dev, u16_t freq)
58371 +{
58372 + u8_t flag = ZM_REG_FLAG_CHANNEL_DFS;
58373 + u16_t i;
58374 + zmw_get_wlan_dev(dev);
58375 +
58376 + zmw_declare_for_critical_section();
58377 +
58378 + zmw_enter_critical_section(dev);
58379 +
58380 + for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
58381 + {
58382 + //DbgPrint("DFS:freq=%d, chan=%d", freq, wd->regulationTable.allowChannel[i].channel);
58383 + if (wd->regulationTable.allowChannel[i].channel == freq)
58384 + {
58385 + flag = wd->regulationTable.allowChannel[i].privFlags;
58386 + break;
58387 + }
58388 + }
58389 +
58390 + zmw_leave_critical_section(dev);
58391 +
58392 + return (flag & (ZM_REG_FLAG_CHANNEL_DFS|ZM_REG_FLAG_CHANNEL_DFS_CLEAR));
58393 +}
58394 +
58395 +u16_t zfHpIsAllowedChannel(zdev_t* dev, u16_t freq)
58396 +{
58397 + u16_t i;
58398 + zmw_get_wlan_dev(dev);
58399 +
58400 + for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
58401 + {
58402 + if (wd->regulationTable.allowChannel[i].channel == freq)
58403 + {
58404 + return 1;
58405 + }
58406 + }
58407 +
58408 + return 0;
58409 +}
58410 +
58411 +u16_t zfHpFindFirstNonDfsChannel(zdev_t* dev, u16_t aBand)
58412 +{
58413 + u16_t chan = 2412;
58414 + u16_t i;
58415 + zmw_get_wlan_dev(dev);
58416 +
58417 + zmw_declare_for_critical_section();
58418 +
58419 + zmw_enter_critical_section(dev);
58420 +
58421 + for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
58422 + {
58423 + if ((wd->regulationTable.allowChannel[i].privFlags & ZM_REG_FLAG_CHANNEL_DFS) != 0)
58424 + {
58425 + if (aBand)
58426 + {
58427 + if (wd->regulationTable.allowChannel[i].channel > 3000)
58428 + {
58429 + chan = wd->regulationTable.allowChannel[i].channel;
58430 + break;
58431 + }
58432 + }
58433 + else
58434 + {
58435 + if (wd->regulationTable.allowChannel[i].channel < 3000)
58436 + {
58437 + chan = wd->regulationTable.allowChannel[i].channel;
58438 + break;
58439 + }
58440 + }
58441 + }
58442 + }
58443 +
58444 + zmw_leave_critical_section(dev);
58445 +
58446 + return chan;
58447 +}
58448 +
58449 +
58450 +/* porting from ACU */
58451 +/* save RegulatoryDomain in hpriv */
58452 +u8_t zfHpGetRegulatoryDomain(zdev_t* dev)
58453 +{
58454 + zmw_get_wlan_dev(dev);
58455 +
58456 + switch (wd->regulationTable.regionCode)
58457 + {
58458 + case NO_ENUMRD:
58459 + return 0;
58460 + break;
58461 + case FCC1_FCCA:
58462 + case FCC1_WORLD:
58463 + case FCC4_FCCA:
58464 + case FCC5_FCCA:
58465 + case FCC2_WORLD:
58466 + case FCC2_ETSIC:
58467 + case FCC3_FCCA:
58468 + case FCC3_WORLD:
58469 + case FCC1:
58470 + case FCC2:
58471 + case FCC3:
58472 + case FCC4:
58473 + case FCC5:
58474 + case FCCA:
58475 + return 0x10;//WG_AMERICAS DOT11_REG_DOMAIN_FCC United States
58476 + break;
58477 +
58478 + case FCC2_FCCA:
58479 + return 0x20;//DOT11_REG_DOMAIN_DOC Canada
58480 + break;
58481 +
58482 + case ETSI1_WORLD:
58483 + case ETSI3_ETSIA:
58484 + case ETSI2_WORLD:
58485 + case ETSI3_WORLD:
58486 + case ETSI4_WORLD:
58487 + case ETSI4_ETSIC:
58488 + case ETSI5_WORLD:
58489 + case ETSI6_WORLD:
58490 + case ETSI_RESERVED:
58491 + case ETSI1:
58492 + case ETSI2:
58493 + case ETSI3:
58494 + case ETSI4:
58495 + case ETSI5:
58496 + case ETSI6:
58497 + case ETSIA:
58498 + case ETSIB:
58499 + case ETSIC:
58500 + return 0x30;//WG_EMEA DOT11_REG_DOMAIN_ETSI Most of Europe
58501 + break;
58502 +
58503 + case MKK1_MKKA:
58504 + case MKK1_MKKB:
58505 + case MKK2_MKKA:
58506 + case MKK1_FCCA:
58507 + case MKK1_MKKA1:
58508 + case MKK1_MKKA2:
58509 + case MKK1_MKKC:
58510 + case MKK3_MKKB:
58511 + case MKK3_MKKA2:
58512 + case MKK3_MKKC:
58513 + case MKK4_MKKB:
58514 + case MKK4_MKKA2:
58515 + case MKK4_MKKC:
58516 + case MKK5_MKKB:
58517 + case MKK5_MKKA2:
58518 + case MKK5_MKKC:
58519 + case MKK6_MKKB:
58520 + case MKK6_MKKA2:
58521 + case MKK6_MKKC:
58522 + case MKK7_MKKB:
58523 + case MKK7_MKKA:
58524 + case MKK7_MKKC:
58525 + case MKK8_MKKB:
58526 + case MKK8_MKKA2:
58527 + case MKK8_MKKC:
58528 + case MKK6_MKKA1:
58529 + case MKK6_FCCA:
58530 + case MKK7_MKKA1:
58531 + case MKK7_FCCA:
58532 + case MKK9_FCCA:
58533 + case MKK9_MKKA1:
58534 + case MKK9_MKKC:
58535 + case MKK9_MKKA2:
58536 + case MKK10_FCCA:
58537 + case MKK10_MKKA1:
58538 + case MKK10_MKKC:
58539 + case MKK10_MKKA2:
58540 + case MKK11_MKKA:
58541 + case MKK11_FCCA:
58542 + case MKK11_MKKA1:
58543 + case MKK11_MKKC:
58544 + case MKK11_MKKA2:
58545 + case MKK12_MKKA:
58546 + case MKK12_FCCA:
58547 + case MKK12_MKKA1:
58548 + case MKK12_MKKC:
58549 + case MKK12_MKKA2:
58550 + case MKK3_MKKA:
58551 + case MKK3_MKKA1:
58552 + case MKK3_FCCA:
58553 + case MKK4_MKKA:
58554 + case MKK4_MKKA1:
58555 + case MKK4_FCCA:
58556 + case MKK9_MKKA:
58557 + case MKK10_MKKA:
58558 + case MKK1:
58559 + case MKK2:
58560 + case MKK3:
58561 + case MKK4:
58562 + case MKK5:
58563 + case MKK6:
58564 + case MKK7:
58565 + case MKK8:
58566 + case MKK9:
58567 + case MKK10:
58568 + case MKK11:
58569 + case MKK12:
58570 + case MKKA:
58571 + case MKKC:
58572 + return 0x40;//WG_JAPAN DOT11_REG_DOMAIN_MKK Japan
58573 + break;
58574 +
58575 + default:
58576 + break;
58577 + }
58578 + return 0xFF;// Didn't input RegDmn by mean to distinguish by customer
58579 +
58580 +}
58581 +
58582 +
58583 +void zfHpDisableDfsChannel(zdev_t* dev, u8_t disableFlag)
58584 +{
58585 + zmw_get_wlan_dev(dev);
58586 +
58587 + struct zsHpPriv* hpPriv=wd->hpPrivate;
58588 + hpPriv->disableDfsCh = disableFlag;
58589 + return;
58590 +}
58591 --- /dev/null
58592 +++ b/drivers/staging/otus/hal/hpreg.h
58593 @@ -0,0 +1,524 @@
58594 +/*
58595 + * Copyright (c) 2000-2005 ZyDAS Technology Corporation
58596 + * Copyright (c) 2007-2008 Atheros Communications Inc.
58597 + *
58598 + * Permission to use, copy, modify, and/or distribute this software for any
58599 + * purpose with or without fee is hereby granted, provided that the above
58600 + * copyright notice and this permission notice appear in all copies.
58601 + *
58602 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
58603 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
58604 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
58605 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
58606 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
58607 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
58608 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
58609 + */
58610 +/* Module Name : hpreg.h */
58611 +/* */
58612 +/* Abstract */
58613 +/* This module contains Regulatory Table definitions. */
58614 +/* */
58615 +/* NOTES */
58616 +/* None */
58617 +/* */
58618 +/************************************************************************/
58619 +
58620 +#ifndef _HPREG_H
58621 +#define _HPREG_H
58622 +
58623 +typedef u16_t HAL_CTRY_CODE; /* country code */
58624 +typedef u16_t HAL_REG_DOMAIN; /* regulatory domain code */
58625 +typedef enum {
58626 + AH_FALSE = 0, /* NB: lots of code assumes false is zero */
58627 + AH_TRUE = 1,
58628 +} HAL_BOOL;
58629 +
58630 +
58631 +/*
58632 + * Country/Region Codes from MS WINNLS.H
58633 + * Numbering from ISO 3166
58634 + */
58635 +enum CountryCode {
58636 + CTRY_ALBANIA = 8, /* Albania */
58637 + CTRY_ALGERIA = 12, /* Algeria */
58638 + CTRY_ARGENTINA = 32, /* Argentina */
58639 + CTRY_ARMENIA = 51, /* Armenia */
58640 + CTRY_AUSTRALIA = 36, /* Australia */
58641 + CTRY_AUSTRIA = 40, /* Austria */
58642 + CTRY_AZERBAIJAN = 31, /* Azerbaijan */
58643 + CTRY_BAHRAIN = 48, /* Bahrain */
58644 + CTRY_BELARUS = 112, /* Belarus */
58645 + CTRY_BELGIUM = 56, /* Belgium */
58646 + CTRY_BELIZE = 84, /* Belize */
58647 + CTRY_BOLIVIA = 68, /* Bolivia */
58648 + CTRY_BOSNIA = 70, /* Bosnia */
58649 + CTRY_BRAZIL = 76, /* Brazil */
58650 + CTRY_BRUNEI_DARUSSALAM = 96, /* Brunei Darussalam */
58651 + CTRY_BULGARIA = 100, /* Bulgaria */
58652 + CTRY_CANADA = 124, /* Canada */
58653 + CTRY_CHILE = 152, /* Chile */
58654 + CTRY_CHINA = 156, /* People's Republic of China */
58655 + CTRY_COLOMBIA = 170, /* Colombia */
58656 + CTRY_COSTA_RICA = 188, /* Costa Rica */
58657 + CTRY_CROATIA = 191, /* Croatia */
58658 + CTRY_CYPRUS = 196, /* Cyprus */
58659 + CTRY_CZECH = 203, /* Czech Republic */
58660 + CTRY_DENMARK = 208, /* Denmark */
58661 + CTRY_DOMINICAN_REPUBLIC = 214, /* Dominican Republic */
58662 + CTRY_ECUADOR = 218, /* Ecuador */
58663 + CTRY_EGYPT = 818, /* Egypt */
58664 + CTRY_EL_SALVADOR = 222, /* El Salvador */
58665 + CTRY_ESTONIA = 233, /* Estonia */
58666 + CTRY_FAEROE_ISLANDS = 234, /* Faeroe Islands */
58667 + CTRY_FINLAND = 246, /* Finland */
58668 + CTRY_FRANCE = 250, /* France */
58669 + CTRY_FRANCE2 = 255, /* France2 */
58670 + CTRY_GEORGIA = 268, /* Georgia */
58671 + CTRY_GERMANY = 276, /* Germany */
58672 + CTRY_GREECE = 300, /* Greece */
58673 + CTRY_GUATEMALA = 320, /* Guatemala */
58674 + CTRY_HONDURAS = 340, /* Honduras */
58675 + CTRY_HONG_KONG = 344, /* Hong Kong S.A.R., P.R.C. */
58676 + CTRY_HUNGARY = 348, /* Hungary */
58677 + CTRY_ICELAND = 352, /* Iceland */
58678 + CTRY_INDIA = 356, /* India */
58679 + CTRY_INDONESIA = 360, /* Indonesia */
58680 + CTRY_IRAN = 364, /* Iran */
58681 + CTRY_IRAQ = 368, /* Iraq */
58682 + CTRY_IRELAND = 372, /* Ireland */
58683 + CTRY_ISRAEL = 376, /* Israel */
58684 + CTRY_ISRAEL2 = 377, /* Israel2 */
58685 + CTRY_ITALY = 380, /* Italy */
58686 + CTRY_JAMAICA = 388, /* Jamaica */
58687 + CTRY_JAPAN = 392, /* Japan */
58688 + CTRY_JAPAN1 = 393, /* Japan (JP1) */
58689 + CTRY_JAPAN2 = 394, /* Japan (JP0) */
58690 + CTRY_JAPAN3 = 395, /* Japan (JP1-1) */
58691 + CTRY_JAPAN4 = 396, /* Japan (JE1) */
58692 + CTRY_JAPAN5 = 397, /* Japan (JE2) */
58693 + CTRY_JAPAN6 = 399, /* Japan (JP6) */
58694 +
58695 + CTRY_JAPAN7 = 4007, /* Japan (J7) */
58696 + CTRY_JAPAN8 = 4008, /* Japan (J8) */
58697 + CTRY_JAPAN9 = 4009, /* Japan (J9) */
58698 +
58699 + CTRY_JAPAN10 = 4010, /* Japan (J10) */
58700 + CTRY_JAPAN11 = 4011, /* Japan (J11) */
58701 + CTRY_JAPAN12 = 4012, /* Japan (J12) */
58702 +
58703 + CTRY_JAPAN13 = 4013, /* Japan (J13) */
58704 + CTRY_JAPAN14 = 4014, /* Japan (J14) */
58705 + CTRY_JAPAN15 = 4015, /* Japan (J15) */
58706 +
58707 + CTRY_JAPAN16 = 4016, /* Japan (J16) */
58708 + CTRY_JAPAN17 = 4017, /* Japan (J17) */
58709 + CTRY_JAPAN18 = 4018, /* Japan (J18) */
58710 +
58711 + CTRY_JAPAN19 = 4019, /* Japan (J19) */
58712 + CTRY_JAPAN20 = 4020, /* Japan (J20) */
58713 + CTRY_JAPAN21 = 4021, /* Japan (J21) */
58714 +
58715 + CTRY_JAPAN22 = 4022, /* Japan (J22) */
58716 + CTRY_JAPAN23 = 4023, /* Japan (J23) */
58717 + CTRY_JAPAN24 = 4024, /* Japan (J24) */
58718 +
58719 + CTRY_JAPAN25 = 4025, /* Japan (J25) */
58720 + CTRY_JAPAN26 = 4026, /* Japan (J26) */
58721 + CTRY_JAPAN27 = 4027, /* Japan (J27) */
58722 +
58723 + CTRY_JAPAN28 = 4028, /* Japan (J28) */
58724 + CTRY_JAPAN29 = 4029, /* Japan (J29) */
58725 + CTRY_JAPAN30 = 4030, /* Japan (J30) */
58726 +
58727 + CTRY_JAPAN31 = 4031, /* Japan (J31) */
58728 + CTRY_JAPAN32 = 4032, /* Japan (J32) */
58729 + CTRY_JAPAN33 = 4033, /* Japan (J33) */
58730 +
58731 + CTRY_JAPAN34 = 4034, /* Japan (J34) */
58732 + CTRY_JAPAN35 = 4035, /* Japan (J35) */
58733 + CTRY_JAPAN36 = 4036, /* Japan (J36) */
58734 +
58735 + CTRY_JAPAN37 = 4037, /* Japan (J37) */
58736 + CTRY_JAPAN38 = 4038, /* Japan (J38) */
58737 + CTRY_JAPAN39 = 4039, /* Japan (J39) */
58738 +
58739 + CTRY_JAPAN40 = 4040, /* Japan (J40) */
58740 + CTRY_JAPAN41 = 4041, /* Japan (J41) */
58741 + CTRY_JAPAN42 = 4042, /* Japan (J42) */
58742 + CTRY_JAPAN43 = 4043, /* Japan (J43) */
58743 + CTRY_JAPAN44 = 4044, /* Japan (J44) */
58744 + CTRY_JAPAN45 = 4045, /* Japan (J45) */
58745 + CTRY_JAPAN46 = 4046, /* Japan (J46) */
58746 + CTRY_JAPAN47 = 4047, /* Japan (J47) */
58747 + CTRY_JAPAN48 = 4048, /* Japan (J48) */
58748 + CTRY_JAPAN49 = 4049, /* Japan (J49) */
58749 +
58750 + CTRY_JAPAN50 = 4050, /* Japan (J50) */
58751 + CTRY_JAPAN51 = 4051, /* Japan (J51) */
58752 + CTRY_JAPAN52 = 4052, /* Japan (J52) */
58753 + CTRY_JAPAN53 = 4053, /* Japan (J53) */
58754 + CTRY_JAPAN54 = 4054, /* Japan (J54) */
58755 +
58756 + CTRY_JORDAN = 400, /* Jordan */
58757 + CTRY_KAZAKHSTAN = 398, /* Kazakhstan */
58758 + CTRY_KENYA = 404, /* Kenya */
58759 + CTRY_KOREA_NORTH = 408, /* North Korea */
58760 + CTRY_KOREA_ROC = 410, /* South Korea */
58761 + CTRY_KOREA_ROC2 = 411, /* South Korea */
58762 + CTRY_KOREA_ROC3 = 412, /* South Korea */
58763 + CTRY_KUWAIT = 414, /* Kuwait */
58764 + CTRY_LATVIA = 428, /* Latvia */
58765 + CTRY_LEBANON = 422, /* Lebanon */
58766 + CTRY_LIBYA = 434, /* Libya */
58767 + CTRY_LIECHTENSTEIN = 438, /* Liechtenstein */
58768 + CTRY_LITHUANIA = 440, /* Lithuania */
58769 + CTRY_LUXEMBOURG = 442, /* Luxembourg */
58770 + CTRY_MACAU = 446, /* Macau */
58771 + CTRY_MACEDONIA = 807, /* the Former Yugoslav Republic of Macedonia */
58772 + CTRY_MALAYSIA = 458, /* Malaysia */
58773 + CTRY_MALTA = 470, /* Malta */
58774 + CTRY_MEXICO = 484, /* Mexico */
58775 + CTRY_MONACO = 492, /* Principality of Monaco */
58776 + CTRY_MOROCCO = 504, /* Morocco */
58777 + CTRY_NETHERLANDS = 528, /* Netherlands */
58778 + CTRY_NETHERLANDS_ANT = 530, /* Netherlands-Antellis */
58779 + CTRY_NEW_ZEALAND = 554, /* New Zealand */
58780 + CTRY_NICARAGUA = 558, /* Nicaragua */
58781 + CTRY_NORWAY = 578, /* Norway */
58782 + CTRY_OMAN = 512, /* Oman */
58783 + CTRY_PAKISTAN = 586, /* Islamic Republic of Pakistan */
58784 + CTRY_PANAMA = 591, /* Panama */
58785 + CTRY_PARAGUAY = 600, /* Paraguay */
58786 + CTRY_PERU = 604, /* Peru */
58787 + CTRY_PHILIPPINES = 608, /* Republic of the Philippines */
58788 + CTRY_POLAND = 616, /* Poland */
58789 + CTRY_PORTUGAL = 620, /* Portugal */
58790 + CTRY_PUERTO_RICO = 630, /* Puerto Rico */
58791 + CTRY_QATAR = 634, /* Qatar */
58792 + CTRY_ROMANIA = 642, /* Romania */
58793 + CTRY_RUSSIA = 643, /* Russia */
58794 + CTRY_SAUDI_ARABIA = 682, /* Saudi Arabia */
58795 + CTRY_SERBIA_MONT = 891, /* Serbia and Montenegro */
58796 + CTRY_SINGAPORE = 702, /* Singapore */
58797 + CTRY_SLOVAKIA = 703, /* Slovak Republic */
58798 + CTRY_SLOVENIA = 705, /* Slovenia */
58799 + CTRY_SOUTH_AFRICA = 710, /* South Africa */
58800 + CTRY_SPAIN = 724, /* Spain */
58801 + CTRY_SRILANKA = 144, /* Srilanka */
58802 + CTRY_SWEDEN = 752, /* Sweden */
58803 + CTRY_SWITZERLAND = 756, /* Switzerland */
58804 + CTRY_SYRIA = 760, /* Syria */
58805 + CTRY_TAIWAN = 158, /* Taiwan */
58806 + CTRY_THAILAND = 764, /* Thailand */
58807 + CTRY_TRINIDAD_Y_TOBAGO = 780, /* Trinidad y Tobago */
58808 + CTRY_TUNISIA = 788, /* Tunisia */
58809 + CTRY_TURKEY = 792, /* Turkey */
58810 + CTRY_UAE = 784, /* U.A.E. */
58811 + CTRY_UKRAINE = 804, /* Ukraine */
58812 + CTRY_UNITED_KINGDOM = 826, /* United Kingdom */
58813 + CTRY_UNITED_STATES = 840, /* United States */
58814 + CTRY_UNITED_STATES_FCC49 = 842, /* United States (Public Safety)*/
58815 + CTRY_URUGUAY = 858, /* Uruguay */
58816 + CTRY_UZBEKISTAN = 860, /* Uzbekistan */
58817 + CTRY_VENEZUELA = 862, /* Venezuela */
58818 + CTRY_VIET_NAM = 704, /* Viet Nam */
58819 + CTRY_YEMEN = 887, /* Yemen */
58820 + CTRY_ZIMBABWE = 716 /* Zimbabwe */
58821 +};
58822 +
58823 +/* Enumerated Regulatory Domain Information 8 bit values indicate that
58824 + * the regdomain is really a pair of unitary regdomains. 12 bit values
58825 + * are the real unitary regdomains and are the only ones which have the
58826 + * frequency bitmasks and flags set.
58827 + */
58828 +enum EnumRd {
58829 + /*
58830 + * The following regulatory domain definitions are
58831 + * found in the EEPROM. Each regulatory domain
58832 + * can operate in either a 5GHz or 2.4GHz wireless mode or
58833 + * both 5GHz and 2.4GHz wireless modes.
58834 + * In general, the value holds no special
58835 + * meaning and is used to decode into either specific
58836 + * 2.4GHz or 5GHz wireless mode for that particular
58837 + * regulatory domain.
58838 + */
58839 + NO_ENUMRD = 0x00,
58840 + NULL1_WORLD = 0x03, /* For 11b-only countries (no 11a allowed) */
58841 + NULL1_ETSIB = 0x07, /* Israel */
58842 + NULL1_ETSIC = 0x08,
58843 + FCC1_FCCA = 0x10, /* USA */
58844 + FCC1_WORLD = 0x11, /* Hong Kong */
58845 + FCC4_FCCA = 0x12, /* USA - Public Safety */
58846 + FCC5_FCCA = 0x13, /* USA - with no DFS (UNII-1 + UNII-3 only) */
58847 + FCC6_FCCA = 0x14, /* Canada */
58848 +
58849 + FCC2_FCCA = 0x20, /* Canada */
58850 + FCC2_WORLD = 0x21, /* Australia & HK */
58851 + FCC2_ETSIC = 0x22,
58852 + FCC6_WORLD = 0x23, /* Australia */
58853 +
58854 + FRANCE_RES = 0x31, /* Legacy France for OEM */
58855 + FCC3_FCCA = 0x3A, /* USA & Canada w/5470 band, 11h, DFS enabled */
58856 + FCC3_WORLD = 0x3B, /* USA & Canada w/5470 band, 11h, DFS enabled */
58857 +
58858 + ETSI1_WORLD = 0x37,
58859 + ETSI3_ETSIA = 0x32, /* France (optional) */
58860 + ETSI2_WORLD = 0x35, /* Hungary & others */
58861 + ETSI3_WORLD = 0x36, /* France & others */
58862 + ETSI4_WORLD = 0x30,
58863 + ETSI4_ETSIC = 0x38,
58864 + ETSI5_WORLD = 0x39,
58865 + ETSI6_WORLD = 0x34, /* Bulgaria */
58866 + ETSI_RESERVED = 0x33, /* Reserved (Do not used) */
58867 +
58868 + MKK1_MKKA = 0x40, /* Japan (JP1) */
58869 + MKK1_MKKB = 0x41, /* Japan (JP0) */
58870 + APL4_WORLD = 0x42, /* Singapore */
58871 + MKK2_MKKA = 0x43, /* Japan with 4.9G channels */
58872 + APL_RESERVED = 0x44, /* Reserved (Do not used) */
58873 + APL2_WORLD = 0x45, /* Korea */
58874 + APL2_APLC = 0x46,
58875 + APL3_WORLD = 0x47,
58876 + MKK1_FCCA = 0x48, /* Japan (JP1-1) */
58877 + APL2_APLD = 0x49, /* Korea with 2.3G channels */
58878 + MKK1_MKKA1 = 0x4A, /* Japan (JE1) */
58879 + MKK1_MKKA2 = 0x4B, /* Japan (JE2) */
58880 + MKK1_MKKC = 0x4C, /* Japan (MKK1_MKKA,except Ch14) */
58881 +
58882 + APL3_FCCA = 0x50,
58883 + APL1_WORLD = 0x52, /* Latin America */
58884 + APL1_FCCA = 0x53,
58885 + APL1_APLA = 0x54,
58886 + APL1_ETSIC = 0x55,
58887 + APL2_ETSIC = 0x56, /* Venezuela */
58888 + APL2_FCCA = 0x57, /* new Latin America */
58889 + APL5_WORLD = 0x58, /* Chile */
58890 + APL6_WORLD = 0x5B, /* Singapore */
58891 + APL7_FCCA = 0x5C, /* Taiwan 5.47 Band */
58892 + APL8_WORLD = 0x5D, /* Malaysia 5GHz */
58893 + APL9_WORLD = 0x5E, /* Korea 5GHz */
58894 +
58895 + /*
58896 + * World mode SKUs
58897 + */
58898 + WOR0_WORLD = 0x60, /* World0 (WO0 SKU) */
58899 + WOR1_WORLD = 0x61, /* World1 (WO1 SKU) */
58900 + WOR2_WORLD = 0x62, /* World2 (WO2 SKU) */
58901 + WOR3_WORLD = 0x63, /* World3 (WO3 SKU) */
58902 + WOR4_WORLD = 0x64, /* World4 (WO4 SKU) */
58903 + WOR5_ETSIC = 0x65, /* World5 (WO5 SKU) */
58904 +
58905 + WOR01_WORLD = 0x66, /* World0-1 (WW0-1 SKU) */
58906 + WOR02_WORLD = 0x67, /* World0-2 (WW0-2 SKU) */
58907 + EU1_WORLD = 0x68, /* Same as World0-2 (WW0-2 SKU), except active scan ch1-13. No ch14 */
58908 +
58909 + WOR9_WORLD = 0x69, /* World9 (WO9 SKU) */
58910 + WORA_WORLD = 0x6A, /* WorldA (WOA SKU) */
58911 +
58912 + MKK3_MKKB = 0x80, /* Japan UNI-1 even + MKKB */
58913 + MKK3_MKKA2 = 0x81, /* Japan UNI-1 even + MKKA2 */
58914 + MKK3_MKKC = 0x82, /* Japan UNI-1 even + MKKC */
58915 +
58916 + MKK4_MKKB = 0x83, /* Japan UNI-1 even + UNI-2 + MKKB */
58917 + MKK4_MKKA2 = 0x84, /* Japan UNI-1 even + UNI-2 + MKKA2 */
58918 + MKK4_MKKC = 0x85, /* Japan UNI-1 even + UNI-2 + MKKC */
58919 +
58920 + MKK5_MKKB = 0x86, /* Japan UNI-1 even + UNI-2 + mid-band + MKKB */
58921 + MKK5_MKKA2 = 0x87, /* Japan UNI-1 even + UNI-2 + mid-band + MKKA2 */
58922 + MKK5_MKKC = 0x88, /* Japan UNI-1 even + UNI-2 + mid-band + MKKC */
58923 +
58924 + MKK6_MKKB = 0x89, /* Japan UNI-1 even + UNI-1 odd MKKB */
58925 + MKK6_MKKA2 = 0x8A, /* Japan UNI-1 even + UNI-1 odd + MKKA2 */
58926 + MKK6_MKKC = 0x8B, /* Japan UNI-1 even + UNI-1 odd + MKKC */
58927 +
58928 + MKK7_MKKB = 0x8C, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + MKKB */
58929 + MKK7_MKKA = 0x8D, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + MKKA2 */
58930 + MKK7_MKKC = 0x8E, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + MKKC */
58931 +
58932 + MKK8_MKKB = 0x8F, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + MKKB */
58933 + MKK8_MKKA2 = 0x90, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + MKKA2 */
58934 + MKK8_MKKC = 0x91, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + MKKC */
58935 +
58936 + MKK6_MKKA1 = 0xF8, /* Japan UNI-1 even + UNI-1 odd + MKKA1 */
58937 + MKK6_FCCA = 0xF9, /* Japan UNI-1 even + UNI-1 odd + FCCA */
58938 + MKK7_MKKA1 = 0xFA, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + MKKA1 */
58939 + MKK7_FCCA = 0xFB, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + FCCA */
58940 + MKK9_FCCA = 0xFC, /* Japan UNI-1 even + 4.9GHz + FCCA */
58941 + MKK9_MKKA1 = 0xFD, /* Japan UNI-1 even + 4.9GHz + MKKA1 */
58942 + MKK9_MKKC = 0xFE, /* Japan UNI-1 even + 4.9GHz + MKKC */
58943 + MKK9_MKKA2 = 0xFF, /* Japan UNI-1 even + 4.9GHz + MKKA2 */
58944 +
58945 + MKK10_FCCA = 0xD0, /* Japan UNI-1 even + UNI-2 + 4.9GHz + FCCA */
58946 + MKK10_MKKA1 = 0xD1, /* Japan UNI-1 even + UNI-2 + 4.9GHz + MKKA1 */
58947 + MKK10_MKKC = 0xD2, /* Japan UNI-1 even + UNI-2 + 4.9GHz + MKKC */
58948 + MKK10_MKKA2 = 0xD3, /* Japan UNI-1 even + UNI-2 + 4.9GHz + MKKA2 */
58949 +
58950 + MKK11_MKKA = 0xD4, /* Japan UNI-1 even + UNI-2 + Midband + 4.9GHz + MKKA */
58951 + MKK11_FCCA = 0xD5, /* Japan UNI-1 even + UNI-2 + Midband + 4.9GHz + FCCA */
58952 + MKK11_MKKA1 = 0xD6, /* Japan UNI-1 even + UNI-2 + Midband + 4.9GHz + MKKA1 */
58953 + MKK11_MKKC = 0xD7, /* Japan UNI-1 even + UNI-2 + Midband + 4.9GHz + MKKC */
58954 + MKK11_MKKA2 = 0xD8, /* Japan UNI-1 even + UNI-2 + Midband + 4.9GHz + MKKA2 */
58955 +
58956 + MKK12_MKKA = 0xD9, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + Midband + 4.9GHz + MKKA */
58957 + MKK12_FCCA = 0xDA, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + Midband + 4.9GHz + FCCA */
58958 + MKK12_MKKA1 = 0xDB, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + Midband + 4.9GHz + MKKA1 */
58959 + MKK12_MKKC = 0xDC, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + Midband + 4.9GHz + MKKC */
58960 + MKK12_MKKA2 = 0xDD, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + Midband + 4.9GHz + MKKA2 */
58961 +
58962 + /* Following definitions are used only by s/w to map old
58963 + * Japan SKUs.
58964 + */
58965 + MKK3_MKKA = 0xF0, /* Japan UNI-1 even + MKKA */
58966 + MKK3_MKKA1 = 0xF1, /* Japan UNI-1 even + MKKA1 */
58967 + MKK3_FCCA = 0xF2, /* Japan UNI-1 even + FCCA */
58968 + MKK4_MKKA = 0xF3, /* Japan UNI-1 even + UNI-2 + MKKA */
58969 + MKK4_MKKA1 = 0xF4, /* Japan UNI-1 even + UNI-2 + MKKA1 */
58970 + MKK4_FCCA = 0xF5, /* Japan UNI-1 even + UNI-2 + FCCA */
58971 + MKK9_MKKA = 0xF6, /* Japan UNI-1 even + 4.9GHz + MKKA*/
58972 + MKK10_MKKA = 0xF7, /* Japan UNI-1 even + UNI-2 + 4.9GHz + MKKA */
58973 +
58974 + /*
58975 + * Regulator domains ending in a number (e.g. APL1,
58976 + * MK1, ETSI4, etc) apply to 5GHz channel and power
58977 + * information. Regulator domains ending in a letter
58978 + * (e.g. APLA, FCCA, etc) apply to 2.4GHz channel and
58979 + * power information.
58980 + */
58981 + APL1 = 0x0150, /* LAT & Asia */
58982 + APL2 = 0x0250, /* LAT & Asia */
58983 + APL3 = 0x0350, /* Taiwan */
58984 + APL4 = 0x0450, /* Jordan */
58985 + APL5 = 0x0550, /* Chile */
58986 + APL6 = 0x0650, /* Singapore */
58987 + APL7 = 0x0750, /* Taiwan Middle */
58988 + APL8 = 0x0850, /* Malaysia */
58989 + APL9 = 0x0950, /* Korea (South) ROC 3 */
58990 +
58991 + ETSI1 = 0x0130, /* Europe & others */
58992 + ETSI2 = 0x0230, /* Europe & others */
58993 + ETSI3 = 0x0330, /* Europe & others */
58994 + ETSI4 = 0x0430, /* Europe & others */
58995 + ETSI5 = 0x0530, /* Europe & others */
58996 + ETSI6 = 0x0630, /* Europe & others */
58997 + ETSIA = 0x0A30, /* France */
58998 + ETSIB = 0x0B30, /* Israel */
58999 + ETSIC = 0x0C30, /* Latin America */
59000 +
59001 + FCC1 = 0x0110, /* US & others */
59002 + FCC2 = 0x0120, /* Canada, Australia & New Zealand */
59003 + FCC3 = 0x0160, /* US w/new middle band & DFS */
59004 + FCC4 = 0x0165, /* US Public Safety */
59005 + FCC5 = 0x0510, /* US no DFS */
59006 + FCC6 = 0x0610, /* Canada & Australia */
59007 +
59008 + FCCA = 0x0A10,
59009 +
59010 + APLD = 0x0D50, /* South Korea */
59011 +
59012 + MKK1 = 0x0140, /* Japan (UNI-1 odd)*/
59013 + MKK2 = 0x0240, /* Japan (4.9 GHz + UNI-1 odd) */
59014 + MKK3 = 0x0340, /* Japan (UNI-1 even) */
59015 + MKK4 = 0x0440, /* Japan (UNI-1 even + UNI-2) */
59016 + MKK5 = 0x0540, /* Japan (UNI-1 even + UNI-2 + mid-band) */
59017 + MKK6 = 0x0640, /* Japan (UNI-1 odd + UNI-1 even) */
59018 + MKK7 = 0x0740, /* Japan (UNI-1 odd + UNI-1 even + UNI-2 */
59019 + MKK8 = 0x0840, /* Japan (UNI-1 odd + UNI-1 even + UNI-2 + mid-band) */
59020 + MKK9 = 0x0940, /* Japan (UNI-1 even + 4.9 GHZ) */
59021 + MKK10 = 0x0B40, /* Japan (UNI-1 even + UNI-2 + 4.9 GHZ) */
59022 + MKK11 = 0x1140, /* Japan (UNI-1 even + UNI-2 + mid-band + 4.9 GHZ) */
59023 + MKK12 = 0x1240, /* Japan (UNI-1 even + UNI-1 odd + UNI-2 + mid-band + 4.9 GHZ) */
59024 + MKKA = 0x0A40, /* Japan */
59025 + MKKC = 0x0A50,
59026 +
59027 + NULL1 = 0x0198,
59028 + WORLD = 0x0199,
59029 + DEBUG_REG_DMN = 0x01ff,
59030 +};
59031 +
59032 +/* channelFlags */
59033 +#define ZM_REG_FLAG_CHANNEL_CW_INT 0x0002 /* CW interference detected on channel */
59034 +#define ZM_REG_FLAG_CHANNEL_TURBO 0x0010 /* Turbo Channel */
59035 +#define ZM_REG_FLAG_CHANNEL_CCK 0x0020 /* CCK channel */
59036 +#define ZM_REG_FLAG_CHANNEL_OFDM 0x0040 /* OFDM channel */
59037 +#define ZM_REG_FLAG_CHANNEL_2GHZ 0x0080 /* 2 GHz spectrum channel. */
59038 +#define ZM_REG_FLAG_CHANNEL_5GHZ 0x0100 /* 5 GHz spectrum channel */
59039 +#define ZM_REG_FLAG_CHANNEL_PASSIVE 0x0200 /* Only passive scan allowed in the channel */
59040 +#define ZM_REG_FLAG_CHANNEL_DYN 0x0400 /* dynamic CCK-OFDM channel */
59041 +#define ZM_REG_FLAG_CHANNEL_XR 0x0800 /* XR channel */
59042 +#define ZM_REG_FLAG_CHANNEL_CSA 0x1000 /* Channel by CSA(Channel Switch Announcement) */
59043 +#define ZM_REG_FLAG_CHANNEL_STURBO 0x2000 /* Static turbo, no 11a-only usage */
59044 +#define ZM_REG_FLAG_CHANNEL_HALF 0x4000 /* Half rate channel */
59045 +#define ZM_REG_FLAG_CHANNEL_QUARTER 0x8000 /* Quarter rate channel */
59046 +
59047 +/* channelFlags */
59048 +#define CHANNEL_CW_INT 0x0002 /* CW interference detected on channel */
59049 +#define CHANNEL_TURBO 0x0010 /* Turbo Channel */
59050 +#define CHANNEL_CCK 0x0020 /* CCK channel */
59051 +#define CHANNEL_OFDM 0x0040 /* OFDM channel */
59052 +#define CHANNEL_2GHZ 0x0080 /* 2 GHz spectrum channel. */
59053 +#define CHANNEL_5GHZ 0x0100 /* 5 GHz spectrum channel */
59054 +#define CHANNEL_PASSIVE 0x0200 /* Only passive scan allowed in the channel */
59055 +#define CHANNEL_DYN 0x0400 /* dynamic CCK-OFDM channel */
59056 +#define CHANNEL_XR 0x0800 /* XR channel */
59057 +#define CHANNEL_STURBO 0x2000 /* Static turbo, no 11a-only usage */
59058 +#define CHANNEL_HALF 0x4000 /* Half rate channel */
59059 +#define CHANNEL_QUARTER 0x8000 /* Quarter rate channel */
59060 +#define CHANNEL_HT20 0x10000 /* HT20 channel */
59061 +#define CHANNEL_HT40 0x20000 /* HT40 channel */
59062 +#define CHANNEL_HT40U 0x40000 /* control channel can be upper channel */
59063 +#define CHANNEL_HT40L 0x80000 /* control channel can be lower channel */
59064 +
59065 +/* privFlags */
59066 +#define ZM_REG_FLAG_CHANNEL_INTERFERENCE 0x01 /* Software use: channel interference
59067 + used for as AR as well as RADAR
59068 + interference detection */
59069 +#define ZM_REG_FLAG_CHANNEL_DFS 0x02 /* DFS required on channel */
59070 +#define ZM_REG_FLAG_CHANNEL_4MS_LIMIT 0x04 /* 4msec packet limit on this channel */
59071 +#define ZM_REG_FLAG_CHANNEL_DFS_CLEAR 0x08 /* if channel has been checked for DFS */
59072 +
59073 +#define CHANNEL_A (CHANNEL_5GHZ|CHANNEL_OFDM)
59074 +#define CHANNEL_B (CHANNEL_2GHZ|CHANNEL_CCK)
59075 +#define CHANNEL_PUREG (CHANNEL_2GHZ|CHANNEL_OFDM)
59076 +#ifdef notdef
59077 +#define CHANNEL_G (CHANNEL_2GHZ|CHANNEL_DYN)
59078 +#else
59079 +#define CHANNEL_G (CHANNEL_2GHZ|CHANNEL_OFDM)
59080 +#endif
59081 +#define CHANNEL_T (CHANNEL_5GHZ|CHANNEL_OFDM|CHANNEL_TURBO)
59082 +#define CHANNEL_ST (CHANNEL_T|CHANNEL_STURBO)
59083 +#define CHANNEL_108G (CHANNEL_2GHZ|CHANNEL_OFDM|CHANNEL_TURBO)
59084 +#define CHANNEL_108A CHANNEL_T
59085 +#define CHANNEL_X (CHANNEL_5GHZ|CHANNEL_OFDM|CHANNEL_XR)
59086 +#define CHANNEL_G_HT (CHANNEL_2GHZ | CHANNEL_OFDM | CHANNEL_HT20)
59087 +#define CHANNEL_A_HT (CHANNEL_5GHZ | CHANNEL_OFDM | CHANNEL_HT20)
59088 +
59089 +#define CHANNEL_G_HT20 (CHANNEL_2GHZ|CHANNEL_HT20)
59090 +#define CHANNEL_A_HT20 (CHANNEL_5GHZ|CHANNEL_HT20)
59091 +#define CHANNEL_G_HT40 (CHANNEL_2GHZ|CHANNEL_HT20|CHANNEL_HT40)
59092 +#define CHANNEL_A_HT40 (CHANNEL_5GHZ|CHANNEL_HT20|CHANNEL_HT40)
59093 +#define CHANNEL_ALL \
59094 + (CHANNEL_OFDM|CHANNEL_CCK| CHANNEL_2GHZ | CHANNEL_5GHZ | CHANNEL_TURBO | CHANNEL_HT20 | CHANNEL_HT40)
59095 +#define CHANNEL_ALL_NOTURBO (CHANNEL_ALL &~ CHANNEL_TURBO)
59096 +
59097 +enum {
59098 + HAL_MODE_11A = 0x001, /* 11a channels */
59099 + HAL_MODE_TURBO = 0x002, /* 11a turbo-only channels */
59100 + HAL_MODE_11B = 0x004, /* 11b channels */
59101 + HAL_MODE_PUREG = 0x008, /* 11g channels (OFDM only) */
59102 +#ifdef notdef
59103 + HAL_MODE_11G = 0x010, /* 11g channels (OFDM/CCK) */
59104 +#else
59105 + HAL_MODE_11G = 0x008, /* XXX historical */
59106 +#endif
59107 + HAL_MODE_108G = 0x020, /* 11a+Turbo channels */
59108 + HAL_MODE_108A = 0x040, /* 11g+Turbo channels */
59109 + HAL_MODE_XR = 0x100, /* XR channels */
59110 + HAL_MODE_11A_HALF_RATE = 0x200, /* 11A half rate channels */
59111 + HAL_MODE_11A_QUARTER_RATE = 0x400, /* 11A quarter rate channels */
59112 + HAL_MODE_11NG = 0x4000, /* 11ng channels */
59113 + HAL_MODE_11NA = 0x8000, /* 11na channels */
59114 + HAL_MODE_ALL = 0xffff
59115 +};
59116 +
59117 +#endif /* #ifndef _HPREG_H */
59118 --- /dev/null
59119 +++ b/drivers/staging/otus/hal/hprw.c
59120 @@ -0,0 +1,1557 @@
59121 +/*
59122 + * Copyright (c) 2007-2008 Atheros Communications Inc.
59123 + *
59124 + * Permission to use, copy, modify, and/or distribute this software for any
59125 + * purpose with or without fee is hereby granted, provided that the above
59126 + * copyright notice and this permission notice appear in all copies.
59127 + *
59128 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
59129 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
59130 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
59131 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
59132 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
59133 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
59134 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
59135 + */
59136 +#include "../80211core/cprecomp.h"
59137 +#include "hpani.h"
59138 +#include "hpusb.h"
59139 +#include "hpreg.h"
59140 +#include "../80211core/ratectrl.h"
59141 +
59142 +extern void zfIdlCmd(zdev_t* dev, u32_t* cmd, u16_t cmdLen);
59143 +
59144 +extern void zfCoreCwmBusy(zdev_t* dev, u16_t busy);
59145 +u16_t zfDelayWriteInternalReg(zdev_t* dev, u32_t addr, u32_t val);
59146 +u16_t zfFlushDelayWrite(zdev_t* dev);
59147 +
59148 +//#define zm_hp_priv(x) struct zsHpPriv* hpPriv=zgWlanDev.hpPrivate;
59149 +
59150 +void zfInitCmdQueue(zdev_t* dev)
59151 +{
59152 + zmw_get_wlan_dev(dev);
59153 + struct zsHpPriv* hpPriv = (struct zsHpPriv*)(wd->hpPrivate);
59154 +
59155 + zmw_declare_for_critical_section();
59156 +
59157 + zmw_enter_critical_section(dev);
59158 +#ifdef ZM_XP_USB_MULTCMD
59159 + hpPriv->cmdTail = hpPriv->cmdHead = hpPriv->cmdSend = 0;
59160 +#else
59161 + hpPriv->cmdTail = hpPriv->cmdHead = 0;
59162 +#endif
59163 + hpPriv->cmdPending = 0;
59164 + hpPriv->cmd.delayWcmdCount = 0;
59165 + zmw_leave_critical_section(dev);
59166 +}
59167 +
59168 +u16_t zfPutCmd(zdev_t* dev, u32_t* cmd, u16_t cmdLen, u16_t src, u8_t* buf)
59169 +{
59170 + u16_t i;
59171 +
59172 + zmw_get_wlan_dev(dev);
59173 + struct zsHpPriv* hpPriv=wd->hpPrivate;
59174 +
59175 + /* Make sure command length < ZM_MAX_CMD_SIZE */
59176 + zm_assert(cmdLen <= ZM_MAX_CMD_SIZE);
59177 + /* Make sure command queue not full */
59178 + //zm_assert(((hpPriv->cmdTail+1) & (ZM_CMD_QUEUE_SIZE-1)) != hpPriv->cmdHead);
59179 + if (((hpPriv->cmdTail+1) & (ZM_CMD_QUEUE_SIZE-1)) == hpPriv->cmdHead ) {
59180 + zm_debug_msg0("CMD queue full!!");
59181 + return 0;
59182 + }
59183 +
59184 + hpPriv->cmdQ[hpPriv->cmdTail].cmdLen = cmdLen;
59185 + hpPriv->cmdQ[hpPriv->cmdTail].src = src;
59186 + hpPriv->cmdQ[hpPriv->cmdTail].buf = buf;
59187 + for (i=0; i<(cmdLen>>2); i++)
59188 + {
59189 + hpPriv->cmdQ[hpPriv->cmdTail].cmd[i] = cmd[i];
59190 + }
59191 +
59192 + hpPriv->cmdTail = (hpPriv->cmdTail+1) & (ZM_CMD_QUEUE_SIZE-1);
59193 +
59194 + return 0;
59195 +}
59196 +
59197 +u16_t zfGetCmd(zdev_t* dev, u32_t* cmd, u16_t* cmdLen, u16_t* src, u8_t** buf)
59198 +{
59199 + u16_t i;
59200 +
59201 + zmw_get_wlan_dev(dev);
59202 + struct zsHpPriv* hpPriv=wd->hpPrivate;
59203 +
59204 + if (hpPriv->cmdTail == hpPriv->cmdHead)
59205 + {
59206 + return 3;
59207 + }
59208 +
59209 + *cmdLen = hpPriv->cmdQ[hpPriv->cmdHead].cmdLen;
59210 + *src = hpPriv->cmdQ[hpPriv->cmdHead].src;
59211 + *buf = hpPriv->cmdQ[hpPriv->cmdHead].buf;
59212 + for (i=0; i<((*cmdLen)>>2); i++)
59213 + {
59214 + cmd[i] = hpPriv->cmdQ[hpPriv->cmdHead].cmd[i];
59215 + }
59216 +
59217 + hpPriv->cmdHead = (hpPriv->cmdHead+1) & (ZM_CMD_QUEUE_SIZE-1);
59218 +
59219 + return 0;
59220 +}
59221 +
59222 +#ifdef ZM_XP_USB_MULTCMD
59223 +void zfSendCmdEx(zdev_t* dev)
59224 +{
59225 + u32_t ncmd[ZM_MAX_CMD_SIZE/4];
59226 + u16_t ncmdLen = 0;
59227 + u16_t cmdFlag = 0;
59228 + u16_t i;
59229 +
59230 + zmw_get_wlan_dev(dev);
59231 + struct zsHpPriv* hpPriv=wd->hpPrivate;
59232 +
59233 + zmw_declare_for_critical_section();
59234 +
59235 + zmw_enter_critical_section(dev);
59236 +
59237 + if (hpPriv->cmdPending == 0)
59238 + {
59239 + if (hpPriv->cmdTail != hpPriv->cmdSend)
59240 + {
59241 + cmdFlag = 1;
59242 + /* Get queueing command */
59243 + ncmdLen= hpPriv->cmdQ[hpPriv->cmdSend].cmdLen;
59244 + for (i=0; i<(ncmdLen>>2); i++)
59245 + {
59246 + ncmd[i] = hpPriv->cmdQ[hpPriv->cmdSend].cmd[i];
59247 + }
59248 + hpPriv->cmdSend = (hpPriv->cmdSend+1) & (ZM_CMD_QUEUE_SIZE-1);
59249 +
59250 + hpPriv->cmdPending = 1;
59251 + }
59252 + }
59253 +
59254 + zmw_leave_critical_section(dev);
59255 +
59256 + if ((cmdFlag == 1))
59257 + {
59258 + zfIdlCmd(dev, ncmd, ncmdLen);
59259 + }
59260 +}
59261 +
59262 +void zfiSendCmdComp(zdev_t* dev)
59263 +{
59264 + zmw_get_wlan_dev(dev);
59265 + struct zsHpPriv* hpPriv=wd->hpPrivate;
59266 +
59267 + zmw_declare_for_critical_section();
59268 +
59269 + zmw_enter_critical_section(dev);
59270 + hpPriv->cmdPending = 0;
59271 + zmw_leave_critical_section(dev);
59272 +
59273 + zfSendCmdEx(dev);
59274 +}
59275 +#endif
59276 +
59277 +u16_t zfIssueCmd(zdev_t* dev, u32_t* cmd, u16_t cmdLen, u16_t src, u8_t* buf)
59278 +{
59279 + u16_t cmdFlag = 0;
59280 + u16_t ret;
59281 +
59282 + zmw_get_wlan_dev(dev);
59283 + struct zsHpPriv* hpPriv=wd->hpPrivate;
59284 +
59285 + zmw_declare_for_critical_section();
59286 +
59287 + zm_msg2_mm(ZM_LV_1, "cmdLen=", cmdLen);
59288 +
59289 + zmw_enter_critical_section(dev);
59290 +
59291 +#ifdef ZM_XP_USB_MULTCMD
59292 + ret = zfPutCmd(dev, cmd, cmdLen, src, buf);
59293 + zmw_leave_critical_section(dev);
59294 +
59295 + if (ret != 0)
59296 + {
59297 + return 1;
59298 + }
59299 +
59300 + zfSendCmdEx(dev);
59301 +#else
59302 + if (hpPriv->cmdPending == 0)
59303 + {
59304 + hpPriv->cmdPending = 1;
59305 + cmdFlag = 1;
59306 + }
59307 + ret = zfPutCmd(dev, cmd, cmdLen, src, buf);
59308 +
59309 + zmw_leave_critical_section(dev);
59310 +
59311 + if (ret != 0)
59312 + {
59313 + return 1;
59314 + }
59315 +
59316 + if (cmdFlag == 1)
59317 + {
59318 + zfIdlCmd(dev, cmd, cmdLen);
59319 + }
59320 +#endif
59321 + return 0;
59322 +}
59323 +
59324 +void zfIdlRsp(zdev_t* dev, u32_t* rsp, u16_t rspLen)
59325 +{
59326 + u32_t cmd[ZM_MAX_CMD_SIZE/4];
59327 + u16_t cmdLen;
59328 + u16_t src;
59329 + u8_t* buf;
59330 + u32_t ncmd[ZM_MAX_CMD_SIZE/4];
59331 + u16_t ncmdLen = 0;
59332 + u16_t ret;
59333 + u16_t cmdFlag = 0;
59334 + u16_t i;
59335 + s32_t nf;
59336 + s32_t noisefloor[4];
59337 +
59338 + zmw_get_wlan_dev(dev);
59339 + struct zsHpPriv* hpPriv=wd->hpPrivate;
59340 +
59341 +
59342 + zmw_declare_for_critical_section();
59343 +
59344 + zmw_enter_critical_section(dev);
59345 +
59346 + ret = zfGetCmd(dev, cmd, &cmdLen, &src, &buf);
59347 + #if 0
59348 + zm_assert(ret == 0);
59349 + #else
59350 + if (ret != 0)
59351 + {
59352 + zm_debug_msg0("Error IdlRsp because none cmd!!\n");
59353 + #ifndef ZM_XP_USB_MULTCMD
59354 + zmw_leave_critical_section(dev);
59355 + return;
59356 + #endif
59357 + }
59358 + #endif
59359 +#ifdef ZM_XP_USB_MULTCMD
59360 + zmw_leave_critical_section(dev);
59361 +#else
59362 + if (hpPriv->cmdTail != hpPriv->cmdHead)
59363 + {
59364 + cmdFlag = 1;
59365 + /* Get queueing command */
59366 + ncmdLen= hpPriv->cmdQ[hpPriv->cmdHead].cmdLen;
59367 + for (i=0; i<(ncmdLen>>2); i++)
59368 + {
59369 + ncmd[i] = hpPriv->cmdQ[hpPriv->cmdHead].cmd[i];
59370 + }
59371 + }
59372 + else
59373 + {
59374 + hpPriv->cmdPending = 0;
59375 + }
59376 +
59377 + zmw_leave_critical_section(dev);
59378 +
59379 + if (cmdFlag == 1)
59380 + {
59381 + zfIdlCmd(dev, ncmd, ncmdLen);
59382 + }
59383 +#endif
59384 + if (src == ZM_OID_READ)
59385 + {
59386 + ZM_PERFORMANCE_REG(dev, 0x11772c, rsp[1]);
59387 + zfwDbgReadRegDone(dev, cmd[1], rsp[1]);
59388 + }
59389 + else if (src == ZM_OID_FLASH_CHKSUM)
59390 + {
59391 + zfwDbgGetFlashChkSumDone(dev, rsp+1);
59392 + }
59393 + else if (src == ZM_OID_FLASH_READ)
59394 + {
59395 + u32_t datalen;
59396 + u16_t i;
59397 +
59398 + datalen = (rsp[0] & 255);
59399 +
59400 + zfwDbgReadFlashDone(dev, cmd[1], rsp+1, datalen);
59401 + }
59402 + else if (src == ZM_OID_FLASH_PROGRAM)
59403 + {
59404 + /* Non do */
59405 + }
59406 + else if (src == ZM_OID_WRITE)
59407 + {
59408 + zfwDbgWriteRegDone(dev, cmd[1], cmd[2]);
59409 + }
59410 + else if (src == ZM_OID_TALLY)
59411 + {
59412 + zfCollectHWTally(dev, rsp, 0);
59413 + }
59414 + else if (src == ZM_OID_TALLY_APD)
59415 + {
59416 + zfCollectHWTally(dev, rsp, 1);
59417 + zfwDbgReadTallyDone(dev);
59418 +#ifdef ZM_ENABLE_BA_RATECTRL
59419 + zfRateCtrlAggrSta(dev);
59420 +#endif
59421 + }
59422 + else if (src == ZM_OID_DKTX_STATUS)
59423 + {
59424 + zm_debug_msg0("src = zm_OID_DKTX_STATUS");
59425 + zfwDbgQueryHwTxBusyDone(dev, rsp[1]);
59426 + }
59427 + else if (src == ZM_CMD_SET_FREQUENCY)
59428 + {
59429 +
59430 +//#ifdef ZM_OTUS_ENABLE_RETRY_FREQ_CHANGE
59431 +#if 0
59432 + zm_debug_msg1("Retry Set Frequency = ", rsp[1]);
59433 +
59434 + #if 1
59435 + // Read the Noise Floor value !
59436 + nf = ((rsp[2]>>19) & 0x1ff);
59437 + if ((nf & 0x100) != 0x0)
59438 + {
59439 + noisefloor[0] = 0 - ((nf ^ 0x1ff) + 1);
59440 + }
59441 + else
59442 + {
59443 + noisefloor[0] = nf;
59444 + }
59445 +
59446 + zm_debug_msg1("Noise Floor[1] = ", noisefloor[0]);
59447 +
59448 + nf = ((rsp[3]>>19) & 0x1ff);
59449 + if ((nf & 0x100) != 0x0)
59450 + {
59451 + noisefloor[1] = 0 - ((nf ^ 0x1ff) + 1);
59452 + }
59453 + else
59454 + {
59455 + noisefloor[1] = nf;
59456 + }
59457 +
59458 + zm_debug_msg1("Noise Floor[2] = ", noisefloor[1]);
59459 + zm_debug_msg1("Is Site Survey = ", hpPriv->isSiteSurvey);
59460 + #endif
59461 +
59462 + if ( (rsp[1] && hpPriv->freqRetryCounter == 0) ||
59463 + (((noisefloor[0]>-60)||(noisefloor[1]>-60)) && hpPriv->freqRetryCounter==0) ||
59464 + ((abs(noisefloor[0]-noisefloor[1])>=9) && hpPriv->freqRetryCounter==0) )
59465 + {
59466 + zm_debug_msg0("Retry to issue the frequency change command");
59467 +
59468 + if ( hpPriv->recordFreqRetryCounter == 1 )
59469 + {
59470 + zm_debug_msg0("Cold Reset");
59471 +
59472 + zfHpSetFrequencyEx(dev, hpPriv->latestFrequency,
59473 + hpPriv->latestBw40,
59474 + hpPriv->latestExtOffset,
59475 + 2);
59476 +
59477 + if ( hpPriv->isSiteSurvey != 2 )
59478 + {
59479 + hpPriv->freqRetryCounter++;
59480 + }
59481 + hpPriv->recordFreqRetryCounter = 0;
59482 + }
59483 + else
59484 + {
59485 + zfHpSetFrequencyEx(dev, hpPriv->latestFrequency,
59486 + hpPriv->latestBw40,
59487 + hpPriv->latestExtOffset,
59488 + 0);
59489 + }
59490 + hpPriv->recordFreqRetryCounter++;
59491 + }
59492 + else
59493 +#endif
59494 +
59495 +/* ret: Bit0: AGC calibration 0=>finish 1=>unfinish */
59496 +/* Bit1: Noise calibration 0=>finish 1=>unfinish */
59497 +/* Bit2: Noise calibration finish, but NF value unexcepted => 1 */
59498 + if ( (rsp[1] & 0x1) || (rsp[1] & 0x4) )
59499 + {
59500 + zm_debug_msg1("Set Frequency fail : ret = ", rsp[1]);
59501 +
59502 + /* 1. AGC Calibration fail */
59503 + /* 2. Noise Calibration finish but error NoiseFloor value */
59504 + /* and not in sitesurvey, try more twice */
59505 + if ( hpPriv->isSiteSurvey == 2 )
59506 + {
59507 + if ( hpPriv->recordFreqRetryCounter < 2 )
59508 + {
59509 + /* cold reset */
59510 + zfHpSetFrequencyEx(dev, hpPriv->latestFrequency,
59511 + hpPriv->latestBw40,
59512 + hpPriv->latestExtOffset,
59513 + 2);
59514 + hpPriv->recordFreqRetryCounter++;
59515 + zm_debug_msg1("Retry to issue the frequency change command(cold reset) counter = ", hpPriv->recordFreqRetryCounter);
59516 + }
59517 + else
59518 + {
59519 + /* Fail : we would not accept this result! */
59520 + zm_debug_msg0("\n\n\n\n Fail twice cold reset \n\n\n\n");
59521 + hpPriv->coldResetNeedFreq = 0;
59522 + hpPriv->recordFreqRetryCounter = 0;
59523 + zfCoreSetFrequencyComplete(dev);
59524 + }
59525 + }
59526 + else
59527 + {
59528 + /* in sitesurvey, coldreset in next channel */
59529 + hpPriv->coldResetNeedFreq = 1;
59530 + hpPriv->recordFreqRetryCounter = 0;
59531 + zfCoreSetFrequencyComplete(dev);
59532 + }
59533 + }
59534 + else if (rsp[1] & 0x2)
59535 + {
59536 + zm_debug_msg1("Set Frequency fail 2 : ret = ", rsp[1]);
59537 +
59538 + /* Noise Calibration un-finish */
59539 + /* and not in sitesurvey, try more once */
59540 + if ( hpPriv->isSiteSurvey == 2 )
59541 + {
59542 + if ( hpPriv->recordFreqRetryCounter < 1 )
59543 + {
59544 + /* cold reset */
59545 + zfHpSetFrequencyEx(dev, hpPriv->latestFrequency,
59546 + hpPriv->latestBw40,
59547 + hpPriv->latestExtOffset,
59548 + 2);
59549 + hpPriv->recordFreqRetryCounter++;
59550 + zm_debug_msg1("2 Retry to issue the frequency change command(cold reset) counter = ", hpPriv->recordFreqRetryCounter);
59551 + }
59552 + else
59553 + {
59554 + /* Fail : we would not accept this result! */
59555 + zm_debug_msg0("\n\n\n\n 2 Fail twice cold reset \n\n\n\n");
59556 + hpPriv->coldResetNeedFreq = 0;
59557 + hpPriv->recordFreqRetryCounter = 0;
59558 + zfCoreSetFrequencyComplete(dev);
59559 + }
59560 + }
59561 + else
59562 + {
59563 + /* in sitesurvey, skip this frequency */
59564 + hpPriv->coldResetNeedFreq = 0;
59565 + hpPriv->recordFreqRetryCounter = 0;
59566 + zfCoreSetFrequencyComplete(dev);
59567 + }
59568 + }
59569 + //else if (rsp[1] & 0x4)
59570 + //{
59571 + // zm_debug_msg1("Set Frequency fail 3 : ret = ", rsp[1]);
59572 + // hpPriv->coldResetNeedFreq = 0;
59573 + // hpPriv->recordFreqRetryCounter = 0;
59574 + // zfCoreSetFrequencyComplete(dev);
59575 + //}
59576 + else
59577 + {
59578 + //hpPriv->freqRetryCounter = 0;
59579 + zm_debug_msg2(" return complete, ret = ", rsp[1]);
59580 +
59581 + /* set bb_heavy_clip_enable */
59582 + if (hpPriv->enableBBHeavyClip && hpPriv->hwBBHeavyClip &&
59583 + hpPriv->doBBHeavyClip)
59584 + {
59585 + u32_t setValue = 0x200;
59586 +
59587 + setValue |= hpPriv->setValueHeavyClip;
59588 +
59589 + //zm_dbg(("Do heavy clip setValue = %d\n", setValue));
59590 +
59591 + zfDelayWriteInternalReg(dev, 0x99e0+0x1bc000, setValue);
59592 + zfFlushDelayWrite(dev);
59593 + }
59594 +
59595 + hpPriv->coldResetNeedFreq = 0;
59596 + hpPriv->recordFreqRetryCounter = 0;
59597 + zfCoreSetFrequencyComplete(dev);
59598 + }
59599 +
59600 + #if 1
59601 + // Read the Noise Floor value !
59602 + nf = ((rsp[2]>>19) & 0x1ff);
59603 + if ((nf & 0x100) != 0x0)
59604 + {
59605 + noisefloor[0] = 0 - ((nf ^ 0x1ff) + 1);
59606 + }
59607 + else
59608 + {
59609 + noisefloor[0] = nf;
59610 + }
59611 +
59612 + //zm_debug_msg1("Noise Floor[1] = ", noisefloor[0]);
59613 +
59614 + nf = ((rsp[3]>>19) & 0x1ff);
59615 + if ((nf & 0x100) != 0x0)
59616 + {
59617 + noisefloor[1] = 0 - ((nf ^ 0x1ff) + 1);
59618 + }
59619 + else
59620 + {
59621 + noisefloor[1] = nf;
59622 + }
59623 +
59624 + //zm_debug_msg1("Noise Floor[2] = ", noisefloor[1]);
59625 +
59626 + nf = ((rsp[5]>>23) & 0x1ff);
59627 + if ((nf & 0x100) != 0x0)
59628 + {
59629 + noisefloor[2] = 0 - ((nf ^ 0x1ff) + 1);
59630 + }
59631 + else
59632 + {
59633 + noisefloor[2] = nf;
59634 + }
59635 +
59636 + //zm_debug_msg1("Noise Floor ext[1] = ", noisefloor[2]);
59637 +
59638 + nf = ((rsp[6]>>23) & 0x1ff);
59639 + if ((nf & 0x100) != 0x0)
59640 + {
59641 + noisefloor[3] = 0 - ((nf ^ 0x1ff) + 1);
59642 + }
59643 + else
59644 + {
59645 + noisefloor[3] = nf;
59646 + }
59647 +
59648 + //zm_debug_msg1("Noise Floor ext[2] = ", noisefloor[3]);
59649 +
59650 + //zm_debug_msg1("Is Site Survey = ", hpPriv->isSiteSurvey);
59651 + #endif
59652 + }
59653 + else if (src == ZM_CMD_SET_KEY)
59654 + {
59655 + zfCoreSetKeyComplete(dev);
59656 + }
59657 + else if (src == ZM_CWM_READ)
59658 + {
59659 + zm_msg2_mm(ZM_LV_0, "CWM rsp[1]=", rsp[1]);
59660 + zm_msg2_mm(ZM_LV_0, "CWM rsp[2]=", rsp[2]);
59661 + zfCoreCwmBusy(dev, zfCwmIsExtChanBusy(rsp[1], rsp[2]));
59662 + }
59663 + else if (src == ZM_MAC_READ)
59664 + {
59665 + /* rsp[1] = ZM_SEEPROM_MAC_ADDRESS_OFFSET; */
59666 + /* rsp[2] = ZM_SEEPROM_MAC_ADDRESS_OFFSET+4; */
59667 + /* rsp[3] = ZM_SEEPROM_REGDOMAIN_OFFSET; */
59668 + /* rsp[4] = ZM_SEEPROM_VERISON_OFFSET; */
59669 + /* rsp[5] = ZM_SEEPROM_HARDWARE_TYPE_OFFSET; */
59670 + /* rsp[6] = ZM_SEEPROM_HW_HEAVY_CLIP; */
59671 +
59672 + u8_t addr[6], CCS, WWR;
59673 + u16_t CountryDomainCode;
59674 +
59675 + /* BB heavy clip */
59676 + //hpPriv->eepromHeavyClipFlag = (u8_t)((rsp[6]>>24) & 0xff); // force enable 8107
59677 + //zm_msg2_mm(ZM_LV_0, "eepromHeavyClipFlag", hpPriv->eepromHeavyClipFlag);
59678 + #if 0
59679 + if (hpPriv->hwBBHeavyClip)
59680 + {
59681 + zm_msg0_mm(ZM_LV_0, "enable BB Heavy Clip");
59682 + }
59683 + else
59684 + {
59685 + zm_msg0_mm(ZM_LV_0, "Not enable BB Heavy Clip");
59686 + }
59687 + #endif
59688 + zm_msg2_mm(ZM_LV_0, "MAC rsp[1]=", rsp[1]);
59689 + zm_msg2_mm(ZM_LV_0, "MAC rsp[2]=", rsp[2]);
59690 +
59691 + addr[0] = (u8_t)(rsp[1] & 0xff);
59692 + addr[1] = (u8_t)((rsp[1]>>8) & 0xff);
59693 + addr[2] = (u8_t)((rsp[1]>>16) & 0xff);
59694 + addr[3] = (u8_t)((rsp[1]>>24) & 0xff);
59695 + addr[4] = (u8_t)(rsp[2] & 0xff);
59696 + addr[5] = (u8_t)((rsp[2]>>8) & 0xff);
59697 +/*#ifdef ZM_FB50
59698 + addr[0] = (u8_t)(0 & 0xff);
59699 + addr[1] = (u8_t)(3 & 0xff);
59700 + addr[2] = (u8_t)(127 & 0xff);
59701 + addr[3] = (u8_t)(0 & 0xff);
59702 + addr[4] = (u8_t)(9 & 0xff);
59703 + addr[5] = (u8_t)(11 & 0xff);
59704 +#endif*/
59705 +
59706 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_MAC_ADDR_L,
59707 + ((((u32_t)addr[3])<<24) | (((u32_t)addr[2])<<16) | (((u32_t)addr[1])<<8) | addr[0]));
59708 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_MAC_ADDR_H,
59709 + ((((u32_t)addr[5])<<8) | addr[4]));
59710 + zfFlushDelayWrite(dev);
59711 +
59712 + wd->ledStruct.ledMode[0] = (u16_t)(rsp[5]&0xffff);
59713 + wd->ledStruct.ledMode[1] = (u16_t)(rsp[5]>>16);
59714 + zm_msg2_mm(ZM_LV_0, "ledMode[0]=", wd->ledStruct.ledMode[0]);
59715 + zm_msg2_mm(ZM_LV_0, "ledMode[1]=", wd->ledStruct.ledMode[1]);
59716 +
59717 + /* Regulatory Related Setting */
59718 + zm_msg2_mm(ZM_LV_0, "RegDomain rsp=", rsp[3]);
59719 + zm_msg2_mm(ZM_LV_0, "OpFlags+EepMisc=", rsp[4]);
59720 + hpPriv->OpFlags = (u8_t)((rsp[4]>>16) & 0xff);
59721 + if ((rsp[2] >> 24) == 0x1) //Tx mask == 0x1
59722 + {
59723 + zm_msg0_mm(ZM_LV_0, "OTUS 1x2");
59724 + hpPriv->halCapability |= ZM_HP_CAP_11N_ONE_TX_STREAM;
59725 + }
59726 + else
59727 + {
59728 + zm_msg0_mm(ZM_LV_0, "OTUS 2x2");
59729 + }
59730 + if (hpPriv->OpFlags & 0x1)
59731 + {
59732 + hpPriv->halCapability |= ZM_HP_CAP_5G;
59733 + }
59734 + if (hpPriv->OpFlags & 0x2)
59735 + {
59736 + hpPriv->halCapability |= ZM_HP_CAP_2G;
59737 + }
59738 +
59739 +
59740 + CCS = (u8_t)((rsp[3] & 0x8000) >> 15);
59741 + WWR = (u8_t)((rsp[3] & 0x4000) >> 14);
59742 + CountryDomainCode = (u16_t)(rsp[3] & 0x3FFF);
59743 +
59744 + if (rsp[3] != 0xffffffff)
59745 + {
59746 + if (CCS)
59747 + {
59748 + //zm_debug_msg0("CWY - Get Regulation Table from Country Code");
59749 + zfHpGetRegulationTablefromCountry(dev, CountryDomainCode);
59750 + }
59751 + else
59752 + {
59753 + //zm_debug_msg0("CWY - Get Regulation Table from Reg Domain");
59754 + zfHpGetRegulationTablefromRegionCode(dev, CountryDomainCode);
59755 + }
59756 + if (WWR)
59757 + {
59758 + //zm_debug_msg0("CWY - Enable 802.11d");
59759 + /* below line shall be unmarked after A band is ready */
59760 + //zfiWlanSetDot11DMode(dev, 1);
59761 + }
59762 + }
59763 + else
59764 + {
59765 + zfHpGetRegulationTablefromRegionCode(dev, NO_ENUMRD);
59766 + }
59767 +
59768 + zfCoreMacAddressNotify(dev, addr);
59769 +
59770 + }
59771 + else if (src == ZM_EEPROM_READ)
59772 + {
59773 +#if 0
59774 + u8_t addr[6], CCS, WWR;
59775 + u16_t CountryDomainCode;
59776 +#endif
59777 + for (i=0; i<ZM_HAL_MAX_EEPROM_PRQ; i++)
59778 + {
59779 + if (hpPriv->eepromImageIndex < 1024)
59780 + {
59781 + hpPriv->eepromImage[hpPriv->eepromImageIndex++] = rsp[i+1];
59782 + }
59783 + }
59784 +
59785 + if (hpPriv->eepromImageIndex == (ZM_HAL_MAX_EEPROM_REQ*ZM_HAL_MAX_EEPROM_PRQ))
59786 + {
59787 + #if 0
59788 + for (i=0; i<1024; i++)
59789 + {
59790 + zm_msg2_mm(ZM_LV_0, "index=", i);
59791 + zm_msg2_mm(ZM_LV_0, "eepromImage=", hpPriv->eepromImage[i]);
59792 + }
59793 + #endif
59794 + zm_msg2_mm(ZM_LV_0, "MAC [1]=", hpPriv->eepromImage[0x20c/4]);
59795 + zm_msg2_mm(ZM_LV_0, "MAC [2]=", hpPriv->eepromImage[0x210/4]);
59796 +#if 0
59797 + addr[0] = (u8_t)(hpPriv->eepromImage[0x20c/4] & 0xff);
59798 + addr[1] = (u8_t)((hpPriv->eepromImage[0x20c/4]>>8) & 0xff);
59799 + addr[2] = (u8_t)((hpPriv->eepromImage[0x20c/4]>>16) & 0xff);
59800 + addr[3] = (u8_t)((hpPriv->eepromImage[0x20c/4]>>24) & 0xff);
59801 + addr[4] = (u8_t)(hpPriv->eepromImage[0x210/4] & 0xff);
59802 + addr[5] = (u8_t)((hpPriv->eepromImage[0x210/4]>>8) & 0xff);
59803 +
59804 + zfCoreMacAddressNotify(dev, addr);
59805 +
59806 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_MAC_ADDR_L,
59807 + ((((u32_t)addr[3])<<24) | (((u32_t)addr[2])<<16) | (((u32_t)addr[1])<<8) | addr[0]));
59808 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_MAC_ADDR_H,
59809 + ((((u32_t)addr[5])<<8) | addr[4]));
59810 + zfFlushDelayWrite(dev);
59811 +
59812 + /* Regulatory Related Setting */
59813 + zm_msg2_mm(ZM_LV_0, "RegDomain =", hpPriv->eepromImage[0x208/4]);
59814 + CCS = (u8_t)((hpPriv->eepromImage[0x208/4] & 0x8000) >> 15);
59815 + WWR = (u8_t)((hpPriv->eepromImage[0x208/4] & 0x4000) >> 14);
59816 + /* below line shall be unmarked after A band is ready */
59817 + //CountryDomainCode = (u16_t)(hpPriv->eepromImage[0x208/4] & 0x3FFF);
59818 + CountryDomainCode = 8;
59819 + if (CCS)
59820 + {
59821 + //zm_debug_msg0("CWY - Get Regulation Table from Country Code");
59822 + zfHpGetRegulationTablefromCountry(dev, CountryDomainCode);
59823 + }
59824 + else
59825 + {
59826 + //zm_debug_msg0("CWY - Get Regulation Table from Reg Domain");
59827 + zfHpGetRegulationTablefromRegionCode(dev, CountryDomainCode);
59828 + }
59829 + if (WWR)
59830 + {
59831 + //zm_debug_msg0("CWY - Enable 802.11d");
59832 + /* below line shall be unmarked after A band is ready */
59833 + //zfiWlanSetDot11DMode(dev, 1);
59834 + }
59835 +#endif
59836 + zfCoreHalInitComplete(dev);
59837 + }
59838 + else
59839 + {
59840 + hpPriv->eepromImageRdReq++;
59841 + zfHpLoadEEPROMFromFW(dev);
59842 + }
59843 + }
59844 + else if (src == ZM_EEPROM_WRITE)
59845 + {
59846 + zfwDbgWriteEepromDone(dev, cmd[1], cmd[2]);
59847 + }
59848 + else if (src == ZM_ANI_READ)
59849 + {
59850 + u32_t cycleTime, ctlClear;
59851 +
59852 + zm_msg2_mm(ZM_LV_0, "ANI rsp[1]=", rsp[1]);
59853 + zm_msg2_mm(ZM_LV_0, "ANI rsp[2]=", rsp[2]);
59854 + zm_msg2_mm(ZM_LV_0, "ANI rsp[3]=", rsp[3]);
59855 + zm_msg2_mm(ZM_LV_0, "ANI rsp[4]=", rsp[4]);
59856 +
59857 + hpPriv->ctlBusy += rsp[1];
59858 + hpPriv->extBusy += rsp[2];
59859 +
59860 + cycleTime = 100000; //100 miniseconds
59861 +
59862 + if (cycleTime > rsp[1])
59863 + {
59864 + ctlClear = (cycleTime - rsp[1]) / 100;
59865 + }
59866 + else
59867 + {
59868 + ctlClear = 0;
59869 + }
59870 + if (wd->aniEnable)
59871 + zfHpAniArPoll(dev, ctlClear, rsp[3], rsp[4]);
59872 + }
59873 + else if (src == ZM_CMD_ECHO)
59874 + {
59875 + if ( ((struct zsHpPriv*)wd->hpPrivate)->halReInit )
59876 + {
59877 + zfCoreHalInitComplete(dev);
59878 + ((struct zsHpPriv*)wd->hpPrivate)->halReInit = 0;
59879 + }
59880 + else
59881 + {
59882 + zfHpLoadEEPROMFromFW(dev);
59883 + }
59884 + }
59885 + else if (src == ZM_OID_FW_DL_INIT)
59886 + {
59887 + zfwDbgDownloadFwInitDone(dev);
59888 + }
59889 + return;
59890 +}
59891 +
59892 +
59893 +/************************************************************************/
59894 +/* */
59895 +/* FUNCTION DESCRIPTION zfWriteRegInternalReg */
59896 +/* Write on chip internal register immediately. */
59897 +/* */
59898 +/* INPUTS */
59899 +/* dev : device pointer */
59900 +/* addr : register address */
59901 +/* val : value */
59902 +/* */
59903 +/* OUTPUTS */
59904 +/* 0 : success */
59905 +/* other : fail */
59906 +/* */
59907 +/* AUTHOR */
59908 +/* Stephen Chen ZyDAS Technology Corporation 2005.11 */
59909 +/* */
59910 +/************************************************************************/
59911 +u32_t zfWriteRegInternalReg(zdev_t* dev, u32_t addr, u32_t val)
59912 +{
59913 + u32_t cmd[3];
59914 + u16_t ret;
59915 +
59916 + cmd[0] = 0x00000108;
59917 + cmd[1] = addr;
59918 + cmd[2] = val;
59919 +
59920 + ret = zfIssueCmd(dev, cmd, 12, ZM_OID_INTERNAL_WRITE, NULL);
59921 + return ret;
59922 +}
59923 +
59924 +
59925 +/************************************************************************/
59926 +/* */
59927 +/* FUNCTION DESCRIPTION zfDelayWriteInternalReg */
59928 +/* Write on chip internal register, write operation may be */
59929 +/* postponed to form a multiple write command. */
59930 +/* */
59931 +/* INPUTS */
59932 +/* dev : device pointer */
59933 +/* addr : register address */
59934 +/* val : value */
59935 +/* */
59936 +/* OUTPUTS */
59937 +/* 0 : command been postponed */
59938 +/* 1 : commands been executed */
59939 +/* */
59940 +/* AUTHOR */
59941 +/* Stephen Chen ZyDAS Technology Corporation 2005.11 */
59942 +/* */
59943 +/************************************************************************/
59944 +u16_t zfDelayWriteInternalReg(zdev_t* dev, u32_t addr, u32_t val)
59945 +{
59946 + u32_t cmd[(ZM_MAX_CMD_SIZE/4)];
59947 + u16_t i;
59948 + u16_t ret;
59949 +
59950 + zmw_get_wlan_dev(dev);
59951 + struct zsHpPriv* hpPriv=wd->hpPrivate;
59952 +
59953 + zmw_declare_for_critical_section();
59954 +
59955 + /* enter critical section */
59956 + zmw_enter_critical_section(dev);
59957 +
59958 + /* Store command to global buffer */
59959 + hpPriv->cmd.delayWcmdAddr[hpPriv->cmd.delayWcmdCount] = addr;
59960 + hpPriv->cmd.delayWcmdVal[hpPriv->cmd.delayWcmdCount++] = val;
59961 +
59962 + /* If pending command reach size limit */
59963 + if ((hpPriv->cmd.delayWcmdCount) >= ((ZM_MAX_CMD_SIZE - 4) >> 3))
59964 + {
59965 + cmd[0] = 0x00000100 + (hpPriv->cmd.delayWcmdCount<<3);
59966 +
59967 + /* copy command to cmd buffer */
59968 + for (i=0; i<hpPriv->cmd.delayWcmdCount; i++)
59969 + {
59970 + cmd[1+(i<<1)] = hpPriv->cmd.delayWcmdAddr[i];
59971 + cmd[2+(i<<1)] = hpPriv->cmd.delayWcmdVal[i];
59972 + }
59973 + /* reset pending command */
59974 + hpPriv->cmd.delayWcmdCount = 0;
59975 +
59976 + /* leave critical section */
59977 + zmw_leave_critical_section(dev);
59978 +
59979 + /* issue write command */
59980 + ret = zfIssueCmd(dev, cmd, 4+(i<<3), ZM_OID_INTERNAL_WRITE, NULL);
59981 +
59982 + return 1;
59983 + }
59984 + else
59985 + {
59986 + /* leave critical section */
59987 + zmw_leave_critical_section(dev);
59988 +
59989 + return 0;
59990 + }
59991 +}
59992 +
59993 +
59994 +/************************************************************************/
59995 +/* */
59996 +/* FUNCTION DESCRIPTION zfFlushDelayWrite */
59997 +/* Flush pending write command. */
59998 +/* */
59999 +/* INPUTS */
60000 +/* dev : device pointer */
60001 +/* */
60002 +/* OUTPUTS */
60003 +/* 0 : no pending command */
60004 +/* 1 : commands been executed */
60005 +/* */
60006 +/* AUTHOR */
60007 +/* Stephen Chen ZyDAS Technology Corporation 2005.11 */
60008 +/* */
60009 +/************************************************************************/
60010 +u16_t zfFlushDelayWrite(zdev_t* dev)
60011 +{
60012 + u32_t cmd[(ZM_MAX_CMD_SIZE/4)];
60013 + u16_t i;
60014 + u16_t ret;
60015 + zmw_get_wlan_dev(dev);
60016 + struct zsHpPriv* hpPriv=wd->hpPrivate;
60017 +
60018 + zmw_declare_for_critical_section();
60019 +
60020 + /* enter critical section */
60021 + zmw_enter_critical_section(dev);
60022 +
60023 + /* If there is pending command */
60024 + if (hpPriv->cmd.delayWcmdCount > 0)
60025 + {
60026 + cmd[0] = 0x00000100 + (hpPriv->cmd.delayWcmdCount<<3);
60027 +
60028 + /* copy command to cmd buffer */
60029 + for (i=0; i<hpPriv->cmd.delayWcmdCount; i++)
60030 + {
60031 + cmd[1+(i<<1)] = hpPriv->cmd.delayWcmdAddr[i];
60032 + cmd[2+(i<<1)] = hpPriv->cmd.delayWcmdVal[i];
60033 + }
60034 + /* reset pending command */
60035 + hpPriv->cmd.delayWcmdCount = 0;
60036 +
60037 + /* leave critical section */
60038 + zmw_leave_critical_section(dev);
60039 +
60040 + /* issue write command */
60041 + ret = zfIssueCmd(dev, cmd, 4+(i<<3), ZM_OID_INTERNAL_WRITE, NULL);
60042 +
60043 + return 1;
60044 + }
60045 + else
60046 + {
60047 + /* leave critical section */
60048 + zmw_leave_critical_section(dev);
60049 +
60050 + return 0;
60051 + }
60052 +}
60053 +
60054 +
60055 +u32_t zfiDbgDelayWriteReg(zdev_t* dev, u32_t addr, u32_t val)
60056 +{
60057 + zfDelayWriteInternalReg(dev, addr, val);
60058 + return 0;
60059 +}
60060 +
60061 +u32_t zfiDbgFlushDelayWrite(zdev_t* dev)
60062 +{
60063 + zfFlushDelayWrite(dev);
60064 + return 0;
60065 +}
60066 +
60067 +/************************************************************************/
60068 +/* */
60069 +/* FUNCTION DESCRIPTION zfiDbgWriteReg */
60070 +/* Write register. */
60071 +/* */
60072 +/* INPUTS */
60073 +/* dev : device pointer */
60074 +/* addr : register address */
60075 +/* val : value */
60076 +/* */
60077 +/* OUTPUTS */
60078 +/* 0 : success */
60079 +/* other : fail */
60080 +/* */
60081 +/* AUTHOR */
60082 +/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
60083 +/* */
60084 +/************************************************************************/
60085 +u32_t zfiDbgWriteReg(zdev_t* dev, u32_t addr, u32_t val)
60086 +{
60087 + u32_t cmd[3];
60088 + u16_t ret;
60089 +
60090 + cmd[0] = 0x00000108;
60091 + cmd[1] = addr;
60092 + cmd[2] = val;
60093 +
60094 + ret = zfIssueCmd(dev, cmd, 12, ZM_OID_WRITE, 0);
60095 + return ret;
60096 +}
60097 +/************************************************************************/
60098 +/* */
60099 +/* FUNCTION DESCRIPTION zfiDbgWriteFlash */
60100 +/* Write flash. */
60101 +/* */
60102 +/* INPUTS */
60103 +/* dev : device pointer */
60104 +/* addr : register address */
60105 +/* val : value */
60106 +/* */
60107 +/* OUTPUTS */
60108 +/* 0 : success */
60109 +/* other : fail */
60110 +/* */
60111 +/* AUTHOR */
60112 +/* Yjsung ZyDAS Technology Corporation 2007.02 */
60113 +/* */
60114 +/************************************************************************/
60115 +u32_t zfiDbgWriteFlash(zdev_t* dev, u32_t addr, u32_t val)
60116 +{
60117 + u32_t cmd[3];
60118 + u16_t ret;
60119 +
60120 + //cmd[0] = 0x0000B008;
60121 + /* len[0] : type[0xB0] : seq[?] */
60122 + cmd[0] = 8 | (ZM_CMD_WFLASH << 8);
60123 + cmd[1] = addr;
60124 + cmd[2] = val;
60125 +
60126 + ret = zfIssueCmd(dev, cmd, 12, ZM_OID_WRITE, 0);
60127 + return ret;
60128 +}
60129 +
60130 +/************************************************************************/
60131 +/* */
60132 +/* FUNCTION DESCRIPTION zfiDbgWriteEeprom */
60133 +/* Write EEPROM. */
60134 +/* */
60135 +/* INPUTS */
60136 +/* dev : device pointer */
60137 +/* addr : register address */
60138 +/* val : value */
60139 +/* */
60140 +/* OUTPUTS */
60141 +/* 0 : success */
60142 +/* other : fail */
60143 +/* */
60144 +/* AUTHOR */
60145 +/* Paul ZyDAS Technology Corporation 2007.06 */
60146 +/* */
60147 +/************************************************************************/
60148 +u32_t zfiDbgWriteEeprom(zdev_t* dev, u32_t addr, u32_t val)
60149 +{
60150 + u32_t cmd[3];
60151 + u16_t ret;
60152 +
60153 + //cmd[0] = 0x0000B008;
60154 + /* len[0] : type[0xB0] : seq[?] */
60155 + cmd[0] = 8 | (ZM_CMD_WREEPROM << 8);
60156 + cmd[1] = addr;
60157 + cmd[2] = val;
60158 +
60159 + ret = zfIssueCmd(dev, cmd, 12, ZM_EEPROM_WRITE, 0);
60160 + return ret;
60161 +}
60162 +
60163 +/************************************************************************/
60164 +/* */
60165 +/* FUNCTION DESCRIPTION zfiDbgBlockWriteEeprom */
60166 +/* Block Write Eeprom. */
60167 +/* */
60168 +/* p.s: now,it will write 16 bytes register data per block (N=4) */
60169 +/* */
60170 +/* INPUTS */
60171 +/* dev : device pointer */
60172 +/* addr : register address */
60173 +/* buf : input data buffer pointer */
60174 +/* */
60175 +/* OUTPUTS */
60176 +/* 0 : success */
60177 +/* other : fail */
60178 +/* */
60179 +/* AUTHOR */
60180 +/* Paul ZyDAS Technology Corporation 2007.06 */
60181 +/* */
60182 +/************************************************************************/
60183 +//#define N buflen/4
60184 +//#define SIZE (2*N+1)
60185 +
60186 +u32_t zfiDbgBlockWriteEeprom(zdev_t* dev, u32_t addr, u32_t* buf)
60187 +{
60188 + u32_t cmd[9]; //2N+1
60189 + u16_t ret,i;
60190 +
60191 + //cmd[0] = 0x0000B008;
60192 + /* len[0] : type[0xB0] : seq[?] */
60193 +
60194 + //cmd[0] = (8*N) | (ZM_CMD_WFLASH << 8);
60195 + cmd[0] = 32 | (ZM_CMD_WREEPROM << 8); //8N
60196 +
60197 + for (i=0; i<4; i++) // i<N
60198 + {
60199 + cmd[(2*i)+1] = addr+(4*i);
60200 + cmd[(2*i)+2] = *(buf+i);
60201 + }
60202 +
60203 + ret = zfIssueCmd(dev, cmd, 36, ZM_EEPROM_WRITE, 0); //8N+4
60204 +
60205 + // added for EEPROMUpdate, wait a moment for prevent cmd queue full!
60206 + //zfwSleep(dev, 1);
60207 +
60208 + return ret;
60209 +}
60210 +
60211 +
60212 +/* write EEPROM with wrlen : wrlen must be 4*n */
60213 +/* command format : cmd_info(4) + addr(4) + eeprom(wrlen) */
60214 +u32_t zfiDbgBlockWriteEeprom_v2(zdev_t* dev, u32_t addr, u32_t* buf, u32_t wrlen)
60215 +{
60216 + u32_t cmd[16];
60217 + u16_t ret,i;
60218 +
60219 + /* len[0] : type[0xB0] : seq[?] */
60220 + /* len = addr(4) + eeprom_block(wrlen) */
60221 + cmd[0] = (wrlen+4) | (ZM_CMD_MEM_WREEPROM << 8);
60222 + cmd[1] = addr;
60223 +
60224 + for (i=0; i<(wrlen/4); i++) // i<wrlen/4
60225 + {
60226 + cmd[2+i] = *(buf+i);
60227 + }
60228 + /* cmd_info(4) + addr(4) + eeprom(wrlen) */
60229 + ret = zfIssueCmd(dev, cmd, (u16_t)(wrlen+8), ZM_EEPROM_WRITE, 0);
60230 +
60231 + return ret;
60232 +}
60233 +
60234 +/************************************************************************/
60235 +/* */
60236 +/* FUNCTION DESCRIPTION zfDbgOpenEeprom */
60237 +/* Open EEPROM. */
60238 +/* */
60239 +/* INPUTS */
60240 +/* dev : device pointer */
60241 +/* */
60242 +/* OUTPUTS */
60243 +/* */
60244 +/* AUTHOR */
60245 +/* Paul ZyDAS Technology Corporation 2007.06 */
60246 +/* */
60247 +/************************************************************************/
60248 +void zfDbgOpenEeprom(zdev_t* dev)
60249 +{
60250 + // unlock EEPROM
60251 + zfDelayWriteInternalReg(dev, 0x1D1400, 0x12345678);
60252 + zfDelayWriteInternalReg(dev, 0x1D1404, 0x55aa00ff);
60253 + zfDelayWriteInternalReg(dev, 0x1D1408, 0x13579ace);
60254 + zfDelayWriteInternalReg(dev, 0x1D1414, 0x0);
60255 + zfFlushDelayWrite(dev);
60256 +}
60257 +
60258 +/************************************************************************/
60259 +/* */
60260 +/* FUNCTION DESCRIPTION zfDbgCloseEeprom */
60261 +/* Close EEPROM. */
60262 +/* */
60263 +/* INPUTS */
60264 +/* dev : device pointer */
60265 +/* */
60266 +/* OUTPUTS */
60267 +/* */
60268 +/* AUTHOR */
60269 +/* Paul ZyDAS Technology Corporation 2007.05 */
60270 +/* */
60271 +/************************************************************************/
60272 +void zfDbgCloseEeprom(zdev_t* dev)
60273 +{
60274 + // lock EEPROM
60275 + zfDelayWriteInternalReg(dev, 0x1D1400, 0x87654321);
60276 + //zfDelayWriteInternalReg(dev, 0x1D1404, 0xffffffff);
60277 + //zfDelayWriteInternalReg(dev, 0x1D1408, 0xffffffff);
60278 + //zfDelayWriteInternalReg(dev, 0x1D1414, 0x100);
60279 + zfFlushDelayWrite(dev);
60280 +}
60281 +#if 0
60282 +/************************************************************************/
60283 +/* */
60284 +/* FUNCTION DESCRIPTION zfiSeriallyWriteEeprom */
60285 +/* Write EEPROM Serially. */
60286 +/* */
60287 +/* INPUTS */
60288 +/* dev : device pointer */
60289 +/* addr : start address of writing EEPROM */
60290 +/* buf : input data buffer */
60291 +/* buflen : size of input data buffer */
60292 +/* (length of data write into EEPROM) */
60293 +/* */
60294 +/* OUTPUTS */
60295 +/* */
60296 +/* */
60297 +/* */
60298 +/* AUTHOR */
60299 +/* Paul ZyDAS Technology Corporation 2007.06 */
60300 +/* */
60301 +/************************************************************************/
60302 +u32_t zfiSeriallyWriteEeprom(zdev_t* dev, u32_t addr, u32_t* buf, u32_t buflen)
60303 +{
60304 + u32_t count;
60305 + u16_t i,ret,blocksize;
60306 + u8_t temp[2];
60307 +
60308 + // per 4 bytes = 1 count
60309 + count = buflen/4;
60310 +
60311 + // Open EEPROM
60312 + zfDbgOpenEeprom(dev);
60313 +
60314 + // Write EEPROM
60315 + for (i=0; i<count; i++)
60316 + {
60317 + if (zfwWriteEeprom(dev, (addr+(4*i)), *(buf+i), 0) != 0)
60318 + {
60319 + // Update failed, Close EEPROM
60320 + zm_debug_msg0("zfwWriteEeprom failed \n");
60321 + zfDbgCloseEeprom(dev);
60322 + return 1;
60323 + }
60324 + }
60325 +
60326 + // Close EEPROM
60327 + zfDbgCloseEeprom(dev);
60328 + return 0;
60329 +}
60330 +#endif
60331 +#if 0
60332 +/************************************************************************/
60333 +/* */
60334 +/* FUNCTION DESCRIPTION zfiSeriallyBlockWriteEeprom */
60335 +/* Block Write EEPROM Serially. */
60336 +/* (BlockWrite: per 16bytes write EEPROM once) */
60337 +/* */
60338 +/* INPUTS */
60339 +/* dev : device pointer */
60340 +/* addr : register address */
60341 +/* buf : input data buffer */
60342 +/* buflen : access data size of buf */
60343 +/* */
60344 +/* OUTPUTS */
60345 +/* 0 : success */
60346 +/* other : fail */
60347 +/* */
60348 +/* AUTHOR */
60349 +/* Paul ZyDAS Technology Corporation 2007.05 */
60350 +/* */
60351 +/************************************************************************/
60352 +u32_t zfiSeriallyBlockWriteEeprom(zdev_t* dev, u32_t addr, u32_t* buf, u32_t buflen)
60353 +{
60354 + u32_t count;
60355 + u16_t i,ret,blocksize;
60356 + u8_t temp[2];
60357 +
60358 + // per 4 bytes = 1 count
60359 + count = buflen/4;
60360 +
60361 + // Open EEPROM
60362 + zfDbgOpenEeprom(dev);
60363 +
60364 + // Write EEPROM
60365 + // EEPROM Write start address from: 0x1000!?
60366 + // per 16bytes(N=4) block write EEPROM once
60367 + for (i=0; i<(count/4); i++) // count/N
60368 + {
60369 + //zfiDbgBlockWriteEeprom(dev, (addr+(4*N*i)), buf+(N*i));
60370 + //zfiDbgBlockWriteEeprom(dev, (addr+(16*i)), buf+(4*i));
60371 + if (zfwBlockWriteEeprom(dev, (addr+(16*i)), buf+(4*i), 0) != 0)
60372 + {
60373 + zm_debug_msg0("zfiDbgBlockWriteEeprom failed \n");
60374 + // Close EEPROM
60375 + zfDbgCloseEeprom(dev);
60376 + return 1;
60377 + }
60378 + }
60379 +
60380 + // Close EEPROM
60381 + zfDbgCloseEeprom(dev);
60382 + return 0;
60383 +}
60384 +#endif
60385 +#if 0
60386 +/************************************************************************/
60387 +/* */
60388 +/* FUNCTION DESCRIPTION zfiDbgDumpEeprom */
60389 +/* Dump EEPROM. */
60390 +/* */
60391 +/* INPUTS */
60392 +/* dev : device pointer */
60393 +/* addr : start address of dumping EEPROM */
60394 +/* datalen : length of access EEPROM data */
60395 +/* buf : point of buffer, the buffer saved dump data */
60396 +/* */
60397 +/* OUTPUTS */
60398 +/* 0 : success */
60399 +/* other : fail */
60400 +/* */
60401 +/* AUTHOR */
60402 +/* Paul ZyDAS Technology Corporation 2007.06 */
60403 +/* */
60404 +/************************************************************************/
60405 +u32_t zfiDbgDumpEeprom(zdev_t* dev, u32_t addr, u32_t datalen, u32_t* buf)
60406 +{
60407 + u32_t count;
60408 + u16_t i,ret;
60409 +
60410 + count = datalen/4;
60411 +
60412 + // over EEPROM length
60413 + if(datalen > 0x2000)
60414 + {
60415 + return 1;
60416 + }
60417 +
60418 + for(i=0; i<count; i++)
60419 + {
60420 + buf[i] = zfwReadEeprom(dev, addr+(4*i));
60421 + }
60422 +
60423 + return 0;
60424 +}
60425 +#endif
60426 +/************************************************************************/
60427 +/* */
60428 +/* FUNCTION DESCRIPTION zfiDbgReadReg */
60429 +/* Read register. */
60430 +/* */
60431 +/* INPUTS */
60432 +/* dev : device pointer */
60433 +/* addr : register address */
60434 +/* */
60435 +/* OUTPUTS */
60436 +/* 0 : success */
60437 +/* other : fail */
60438 +/* */
60439 +/* AUTHOR */
60440 +/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
60441 +/* */
60442 +/************************************************************************/
60443 +u32_t zfiDbgReadReg(zdev_t* dev, u32_t addr)
60444 +{
60445 + u32_t cmd[2];
60446 + u16_t ret;
60447 +
60448 + cmd[0] = 0x00000004;
60449 + cmd[1] = addr;
60450 +
60451 + ret = zfIssueCmd(dev, cmd, 8, ZM_OID_READ, 0);
60452 + return ret;
60453 +}
60454 +
60455 +
60456 +/************************************************************************/
60457 +/* */
60458 +/* FUNCTION DESCRIPTION zfiDbgReadTally */
60459 +/* Read register. */
60460 +/* */
60461 +/* INPUTS */
60462 +/* dev : device pointer */
60463 +/* */
60464 +/* OUTPUTS */
60465 +/* 0 : success */
60466 +/* other : fail */
60467 +/* */
60468 +/* AUTHOR */
60469 +/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
60470 +/* */
60471 +/************************************************************************/
60472 +u32_t zfiDbgReadTally(zdev_t* dev)
60473 +{
60474 + u32_t cmd[1];
60475 + u16_t ret;
60476 + zmw_get_wlan_dev(dev);
60477 +
60478 + if ( ((struct zsHpPriv*)wd->hpPrivate)->halReInit )
60479 + {
60480 + return 1;
60481 + }
60482 +
60483 + /* len[0] : type[0x81] : seq[?] */
60484 + cmd[0] = 0 | (ZM_CMD_TALLY << 8);
60485 + ret = zfIssueCmd(dev, cmd, 4, ZM_OID_TALLY, 0);
60486 +
60487 + /* len[0] : type[0x82] : seq[?] */
60488 + cmd[0] = 0 | (ZM_CMD_TALLY_APD << 8);
60489 + ret = zfIssueCmd(dev, cmd, 4, ZM_OID_TALLY_APD, 0);
60490 +
60491 + return ret;
60492 +}
60493 +
60494 +
60495 +u32_t zfiDbgSetIFSynthesizer(zdev_t* dev, u32_t value)
60496 +{
60497 + u32_t cmd[2];
60498 + u16_t ret;
60499 +
60500 + /* len[4] : type[0x32] : seq[?] */
60501 + cmd[0] = 0x4 | (ZM_OID_SYNTH << 8);
60502 + cmd[1] = value;
60503 +
60504 + ret = zfIssueCmd(dev, cmd, 8, ZM_OID_SYNTH, 0);
60505 + return ret;
60506 +}
60507 +
60508 +u32_t zfiDbgQueryHwTxBusy(zdev_t* dev)
60509 +{
60510 + u32_t cmd[1];
60511 + u16_t ret;
60512 +
60513 + /* len[4] : type[0xC0] : seq[?] */
60514 + cmd[0] = 0 | (ZM_CMD_DKTX_STATUS << 8);
60515 +
60516 + ret = zfIssueCmd(dev, cmd, 4, ZM_OID_DKTX_STATUS, 0);
60517 + return ret;
60518 +}
60519 +
60520 +//Paul++
60521 +#if 0
60522 +u16_t zfHpBlockEraseFlash(zdev_t *dev, u32_t addr)
60523 +{
60524 + u32_t cmd[(ZM_MAX_CMD_SIZE/4)];
60525 + u16_t ret;
60526 +
60527 + cmd[0] = 0x00000004 | (ZM_CMD_FLASH_ERASE << 8);
60528 + cmd[1] = addr;
60529 +
60530 + ret = zfIssueCmd(dev, cmd, 8, ZM_OID_INTERNAL_WRITE, NULL);
60531 + return ret;
60532 +}
60533 +#endif
60534 +
60535 +#if 0
60536 +u16_t zfiDbgProgramFlash(zdev_t *dev, u32_t offset, u32_t len, u32_t *data)
60537 +{
60538 + u32_t cmd[(ZM_MAX_CMD_SIZE/4)];
60539 + u16_t ret;
60540 + u16_t i;
60541 +
60542 +
60543 + cmd[0] = (ZM_CMD_FLASH_PROG << 8) | ((len+8) & 0xff);
60544 + cmd[1] = offset;
60545 + cmd[2] = len;
60546 +
60547 + for (i = 0; i < (len >> 2); i++)
60548 + {
60549 + cmd[3+i] = data[i];
60550 + }
60551 +
60552 + ret = zfIssueCmd(dev, cmd, 12, ZM_OID_FLASH_PROGRAM, NULL);
60553 +
60554 + return ret;
60555 +}
60556 +#endif
60557 +
60558 +/************************************************************************/
60559 +/* */
60560 +/* FUNCTION DESCRIPTION zfiDbgChipEraseFlash */
60561 +/* Chip Erase Flash. */
60562 +/* */
60563 +/* INPUTS */
60564 +/* dev : device pointer */
60565 +/* */
60566 +/* OUTPUTS */
60567 +/* 0 : success */
60568 +/* other : fail */
60569 +/* */
60570 +/* AUTHOR */
60571 +/* Paul Atheros Technology Corporation 2007.09 */
60572 +/* */
60573 +/************************************************************************/
60574 +u16_t zfiDbgChipEraseFlash(zdev_t *dev)
60575 +{
60576 + u32_t cmd[(ZM_MAX_CMD_SIZE/4)];
60577 + u16_t ret;
60578 +
60579 + cmd[0] = 0x00000000 | (ZM_CMD_FLASH_ERASE << 8);
60580 +
60581 + ret = zfIssueCmd(dev, cmd, 4, ZM_OID_INTERNAL_WRITE, NULL);
60582 + return ret;
60583 +}
60584 +/************************************************************************/
60585 +/* */
60586 +/* FUNCTION DESCRIPTION zfiDbgGetFlashCheckSum */
60587 +/* Get FlashCheckSum. */
60588 +/* */
60589 +/* INPUTS */
60590 +/* dev : device pointer */
60591 +/* addr : Start address of getchksum */
60592 +/* len : total lenth of calculate getchksum */
60593 +/* */
60594 +/* OUTPUTS */
60595 +/* 0 : success */
60596 +/* other : fail */
60597 +/* */
60598 +/* AUTHOR */
60599 +/* Paul Atheros Technology Corporation 2007.08 */
60600 +/* */
60601 +/************************************************************************/
60602 +u32_t zfiDbgGetFlashCheckSum(zdev_t *dev, u32_t addr, u32_t len)
60603 +{
60604 + u32_t cmd[(ZM_MAX_CMD_SIZE/4)];
60605 + u32_t ret;
60606 +
60607 + cmd[0] = 0x00000008 | (ZM_CMD_FLASH_CHKSUM << 8);
60608 + cmd[1] = addr;
60609 + cmd[2] = len;
60610 +
60611 + ret = zfIssueCmd(dev, cmd, 12, ZM_OID_FLASH_CHKSUM, NULL);
60612 +
60613 + return ret;
60614 +}
60615 +
60616 +/************************************************************************/
60617 +/* */
60618 +/* FUNCTION DESCRIPTION zfiDbgReadFlash */
60619 +/* Read Flash. */
60620 +/* */
60621 +/* INPUTS */
60622 +/* dev : device pointer */
60623 +/* addr : Start address of read flash */
60624 +/* len : total lenth of read flash data */
60625 +/* */
60626 +/* OUTPUTS */
60627 +/* 0 : success */
60628 +/* other : fail */
60629 +/* */
60630 +/* AUTHOR */
60631 +/* Paul Atheros Technology Corporation 2007.09 */
60632 +/* */
60633 +/************************************************************************/
60634 +u32_t zfiDbgReadFlash(zdev_t *dev, u32_t addr, u32_t len)
60635 +{
60636 + u32_t cmd[(ZM_MAX_CMD_SIZE/4)];
60637 + u32_t ret;
60638 +
60639 + cmd[0] = len | (ZM_CMD_FLASH_READ << 8);
60640 + cmd[1] = addr;
60641 +
60642 + ret = zfIssueCmd(dev, cmd, 8, ZM_OID_FLASH_READ, NULL);
60643 + return ret;
60644 +}
60645 +
60646 +/************************************************************************/
60647 +/* */
60648 +/* FUNCTION DESCRIPTION zfiDownloadFwSet */
60649 +/* Before Download FW, */
60650 +/* Command FW to Software reset and close watch dog control. */
60651 +/* */
60652 +/* */
60653 +/* INPUTS */
60654 +/* dev : device pointer */
60655 +/* */
60656 +/* OUTPUTS */
60657 +/* 0 : success */
60658 +/* other : fail */
60659 +/* */
60660 +/* AUTHOR */
60661 +/* Paul Atheros Technology Corporation 2007.09 */
60662 +/* */
60663 +/************************************************************************/
60664 +u32_t zfiDownloadFwSet(zdev_t *dev)
60665 +{
60666 +//softwarereset
60667 +//close watch dog
60668 + u32_t cmd[(ZM_MAX_CMD_SIZE/4)];
60669 + u32_t ret;
60670 +
60671 + cmd[0] = 0x00000008 | (ZM_CMD_FW_DL_INIT << 8);
60672 +
60673 + ret = zfIssueCmd(dev, cmd, 12, ZM_OID_FW_DL_INIT, NULL);
60674 +
60675 + return ret;
60676 +}
60677 +//Paul--
60678 --- /dev/null
60679 +++ b/drivers/staging/otus/hal/hpusb.c
60680 @@ -0,0 +1,1584 @@
60681 +/*
60682 + * Copyright (c) 2000-2005 ZyDAS Technology Corporation
60683 + * Copyright (c) 2007-2008 Atheros Communications Inc.
60684 + *
60685 + * Permission to use, copy, modify, and/or distribute this software for any
60686 + * purpose with or without fee is hereby granted, provided that the above
60687 + * copyright notice and this permission notice appear in all copies.
60688 + *
60689 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
60690 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
60691 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
60692 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
60693 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
60694 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
60695 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
60696 + */
60697 +/* */
60698 +/* Module Name : ud.c */
60699 +/* */
60700 +/* Abstract */
60701 +/* This module contains USB descriptor functions. */
60702 +/* */
60703 +/* NOTES */
60704 +/* None */
60705 +/* */
60706 +/************************************************************************/
60707 +#include "../80211core/cprecomp.h"
60708 +#include "hpani.h"
60709 +#include "hpusb.h"
60710 +
60711 +extern void zfwUsbCmd(zdev_t* dev, u8_t endpt, u32_t* cmd, u16_t cmdLen);
60712 +
60713 +extern void zfIdlRsp(zdev_t* dev, u32_t* rsp, u16_t rspLen);
60714 +extern u16_t zfDelayWriteInternalReg(zdev_t* dev, u32_t addr, u32_t val);
60715 +extern u16_t zfFlushDelayWrite(zdev_t* dev);
60716 +
60717 +
60718 +#define USB_ENDPOINT_TX_INDEX 1
60719 +#define USB_ENDPOINT_RX_INDEX 2
60720 +#define USB_ENDPOINT_INT_INDEX 3
60721 +#define USB_ENDPOINT_CMD_INDEX 4
60722 +
60723 +void zfIdlCmd(zdev_t* dev, u32_t* cmd, u16_t cmdLen)
60724 +{
60725 +#if ZM_SW_LOOP_BACK != 1
60726 + zfwUsbCmd(dev, USB_ENDPOINT_CMD_INDEX, cmd, cmdLen);
60727 +#endif
60728 +
60729 + return;
60730 +}
60731 +
60732 +
60733 +/* zfAdjustCtrlSetting: fit OUTS format */
60734 +/* convert MIMO2 to OUTS */
60735 +void zfAdjustCtrlSetting(zdev_t* dev, u16_t* header, zbuf_t* buf)
60736 +{
60737 + /* MIMO2 => OUTS FB-50 */
60738 + /* length not change, only modify format */
60739 +
60740 + u32_t oldMT;
60741 + u32_t oldMCS;
60742 +
60743 + u32_t phyCtrl;
60744 + u32_t oldPhyCtrl;
60745 +
60746 + u16_t tpc = 0;
60747 +
60748 + zmw_get_wlan_dev(dev);
60749 + struct zsHpPriv* hpPriv=wd->hpPrivate;
60750 +
60751 + /* mm */
60752 + if (header == NULL)
60753 + {
60754 + oldPhyCtrl = zmw_buf_readh(dev, buf, 4) | ((u32_t)zmw_buf_readh(dev, buf, 6) << 16);
60755 + }
60756 + else
60757 + {
60758 + oldPhyCtrl = header[2] | ((u32_t)header[3] <<16);
60759 + }
60760 +
60761 + phyCtrl = 0;
60762 +
60763 +
60764 + /* MT : Bit[1~0] */
60765 + oldMT = oldPhyCtrl&0x3;
60766 + phyCtrl |= oldMT;
60767 + if ( oldMT == 0x3 ) /* DL-OFDM (Duplicate Legacy OFDM) */
60768 + phyCtrl |= 0x1;
60769 +
60770 +
60771 + /* PT : Bit[2] HT PT: 0 Mixed mode 1 Green field */
60772 + phyCtrl |= (oldPhyCtrl&0x4);
60773 +
60774 + /* Bandwidth control : Bit[4~3] */
60775 + if ( oldPhyCtrl&0x800000 ) /* Bit23 : 40M */
60776 + {
60777 + #if 0
60778 + if (oldMT == 0x3) /* DL-OFDM */
60779 + phyCtrl |= (0x3<<3); /* 40M duplicate */
60780 + else
60781 + phyCtrl |= (0x2<<3); /* 40M shared */
60782 + #else
60783 + if (oldMT == 0x2 && ((struct zsHpPriv*)wd->hpPrivate)->hwBw40)
60784 + {
60785 + phyCtrl |= (0x2<<3); /* 40M shared */
60786 + }
60787 + #endif
60788 + }
60789 + else {
60790 + oldPhyCtrl &= ~0x80000000;
60791 + }
60792 +
60793 + /* MCS : Bit[24~18] */
60794 + oldMCS = (oldPhyCtrl&0x7f0000)>>16; /* Bit[22~16] */
60795 + phyCtrl |= (oldMCS<<18);
60796 +
60797 + /* Short GI : Bit[31]*/
60798 + phyCtrl |= (oldPhyCtrl&0x80000000);
60799 +
60800 + /* AM : Antenna mask */
60801 + //if ((oldMT == 2) && (oldMCS > 7))
60802 + if (hpPriv->halCapability & ZM_HP_CAP_11N_ONE_TX_STREAM)
60803 + {
60804 + phyCtrl |= (0x1<<15);
60805 + }
60806 + else
60807 + {
60808 + /* HT Tx 2 chain */
60809 + /* OFDM 6M/9M/12M/18M/24M Tx 2 chain */
60810 + /* OFDM 36M/48M/54M/ Tx 1 chain */
60811 + /* CCK Tx 2 chain */
60812 + if ((oldMT == 2) || (oldMT == 3))
60813 + {
60814 + phyCtrl |= (0x5<<15);
60815 + }
60816 + else if (oldMT == 1)
60817 + {
60818 + if ((oldMCS == 0xb) || (oldMCS == 0xf) ||
60819 + (oldMCS == 0xa) || (oldMCS == 0xe) ||
60820 + (oldMCS == 0x9)) //6M/9M/12M/18M/24M
60821 + {
60822 + phyCtrl |= (0x5<<15);
60823 + }
60824 + else
60825 + {
60826 + phyCtrl |= (0x1<<15);
60827 + }
60828 + }
60829 + else //(oldMT==0)
60830 + {
60831 + phyCtrl |= (0x5<<15);
60832 + }
60833 + }
60834 + //else
60835 + // phyCtrl |= (0x1<<15);
60836 +
60837 + /* TPC */
60838 + /* TODO : accelerating these code */
60839 + if (hpPriv->hwFrequency < 3000)
60840 + {
60841 + if (oldMT == 0)
60842 + {
60843 + /* CCK */
60844 + tpc = (hpPriv->tPow2xCck[oldMCS]&0x3f);
60845 + }
60846 + else if (oldMT == 1)
60847 + {
60848 + /* OFDM */
60849 + if (oldMCS == 0xc)
60850 + {
60851 + tpc = (hpPriv->tPow2x2g[3]&0x3f);
60852 + }
60853 + else if (oldMCS == 0x8)
60854 + {
60855 + tpc = (hpPriv->tPow2x2g[2]&0x3f);
60856 + }
60857 + else if (oldMCS == 0xd)
60858 + {
60859 + tpc = (hpPriv->tPow2x2g[1]&0x3f);
60860 + }
60861 + else if (oldMCS == 0x9)
60862 + {
60863 + tpc = ((hpPriv->tPow2x2g[0]-hpPriv->tPow2x2g24HeavyClipOffset)&0x3f);
60864 + }
60865 + else
60866 + {
60867 + tpc = (hpPriv->tPow2x2g[0]&0x3f);
60868 + }
60869 + }
60870 + else if (oldMT == 2)
60871 + {
60872 + if ( oldPhyCtrl&0x800000 ) /* Bit23 : 40M */
60873 + {
60874 + /* HT 40 */
60875 + tpc = (hpPriv->tPow2x2gHt40[oldMCS&0x7]&0x3f);
60876 + }
60877 + else
60878 + {
60879 + /* HT 20 */
60880 + tpc = (hpPriv->tPow2x2gHt20[oldMCS&0x7]&0x3f);
60881 + }
60882 + }
60883 + }
60884 + else //5GHz
60885 + {
60886 + if (oldMT == 1)
60887 + {
60888 + /* OFDM */
60889 + if (oldMCS == 0xc)
60890 + {
60891 + tpc = (hpPriv->tPow2x5g[3]&0x3f);
60892 + }
60893 + else if (oldMCS == 0x8)
60894 + {
60895 + tpc = (hpPriv->tPow2x5g[2]&0x3f);
60896 + }
60897 + else if (oldMCS == 0xd)
60898 + {
60899 + tpc = (hpPriv->tPow2x5g[1]&0x3f);
60900 + }
60901 + else
60902 + {
60903 + tpc = (hpPriv->tPow2x5g[0]&0x3f);
60904 + }
60905 + }
60906 + else if (oldMT == 2)
60907 + {
60908 + if ( oldPhyCtrl&0x800000 ) /* Bit23 : 40M */
60909 + {
60910 + /* HT 40 */
60911 + tpc = (hpPriv->tPow2x5gHt40[oldMCS&0x7]&0x3f);
60912 + }
60913 + else
60914 + {
60915 + /* HT 20 */
60916 + tpc = (hpPriv->tPow2x5gHt20[oldMCS&0x7]&0x3f);
60917 + }
60918 + }
60919 + }
60920 +
60921 + /* Tx power adjust for HT40 */
60922 + /* HT40 +1dBm */
60923 + if ((oldMT==2) && (oldPhyCtrl&0x800000) )
60924 + {
60925 + tpc += 2;
60926 + }
60927 + tpc &= 0x3f;
60928 +
60929 + /* Evl force tx TPC */
60930 + if(wd->forceTxTPC)
60931 + {
60932 + tpc = (u16_t)(wd->forceTxTPC & 0x3f);
60933 + }
60934 +
60935 + if (hpPriv->hwFrequency < 3000) {
60936 + wd->maxTxPower2 &= 0x3f;
60937 + tpc = (tpc > wd->maxTxPower2)? wd->maxTxPower2 : tpc;
60938 + } else {
60939 + wd->maxTxPower5 &= 0x3f;
60940 + tpc = (tpc > wd->maxTxPower5)? wd->maxTxPower5 : tpc;
60941 + }
60942 +
60943 +
60944 +#define ZM_MIN_TPC 5
60945 +#define ZM_TPC_OFFSET 5
60946 +#define ZM_SIGNAL_THRESHOLD 56
60947 + if ((wd->sta.bScheduleScan == FALSE) && (wd->sta.bChannelScan == FALSE))
60948 + {
60949 + if (( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
60950 + && (zfStaIsConnected(dev))
60951 + && (wd->SignalStrength > ZM_SIGNAL_THRESHOLD))
60952 + {
60953 + if (tpc > ((ZM_MIN_TPC+ZM_TPC_OFFSET)*2))
60954 + {
60955 + tpc -= (ZM_TPC_OFFSET*2);
60956 + }
60957 + else if (tpc > (ZM_MIN_TPC*2))
60958 + {
60959 + tpc = (ZM_MIN_TPC*2);
60960 + }
60961 + }
60962 + }
60963 +#undef ZM_MIN_TPC
60964 +#undef ZM_TPC_OFFSET
60965 +#undef ZM_SIGNAL_THRESHOLD
60966 +
60967 + #ifndef ZM_OTUS_LINUX_PHASE_2
60968 + phyCtrl |= (tpc & 0x3f) << 9;
60969 + #endif
60970 +
60971 + /* Set bits[8:6]BF-MCS for heavy clip */
60972 + if ((phyCtrl&0x3) == 2)
60973 + {
60974 + phyCtrl |= ((phyCtrl >> 12) & 0x1c0);
60975 + }
60976 +
60977 + /* PHY control */
60978 + if (header == NULL)
60979 + {
60980 + zmw_buf_writeh(dev, buf, 4, (u16_t) (phyCtrl&0xffff));
60981 + zmw_buf_writeh(dev, buf, 6, (u16_t) (phyCtrl>>16));
60982 + }
60983 + else
60984 + {
60985 + //PHY control L
60986 + header[2] = (u16_t) (phyCtrl&0xffff);
60987 + //PHY control H
60988 + header[3] = (u16_t) (phyCtrl>>16);
60989 + }
60990 +
60991 + zm_msg2_tx(ZM_LV_2, "old phy ctrl = ", oldPhyCtrl);
60992 + zm_msg2_tx(ZM_LV_2, "new phy ctrl = ", phyCtrl);
60993 + //DbgPrint("old phy ctrl =%08x \n", oldPhyCtrl);
60994 + //DbgPrint("new phy ctrl =%08x \n", phyCtrl);
60995 +}
60996 +
60997 +
60998 +#define EXTRA_INFO_LEN 24 //RSSI(7) + EVM(12) + PHY(1) + MACStatus(4)
60999 +u16_t zfHpSend(zdev_t* dev, u16_t* header, u16_t headerLen,
61000 + u16_t* snap, u16_t snapLen,
61001 + u16_t* tail, u16_t tailLen, zbuf_t* buf, u16_t offset,
61002 + u16_t bufType, u8_t ac, u8_t keyIdx)
61003 +{
61004 +#if ZM_SW_LOOP_BACK == 1
61005 + zbuf_t *rxbuf;
61006 + u8_t *puRxBuf;
61007 + u8_t *pHdr;
61008 + u8_t *psnap;
61009 + u16_t plcplen = 12;
61010 + u16_t i;
61011 + u16_t swlpOffset;
61012 +#endif /* #if ZM_SW_LOOP_BACK == 1 */
61013 + zmw_get_wlan_dev(dev);
61014 + struct zsHpPriv* hpPriv=wd->hpPrivate;
61015 +
61016 + zm_msg1_tx(ZM_LV_1, "zfHpSend(), len = ", 12 + headerLen-8 + snapLen + zfwBufGetSize(dev, buf) + 4 + 8);
61017 +
61018 + /* Adjust ctrl setting : 6N14 yjsung */
61019 + zfAdjustCtrlSetting(dev, header, buf);
61020 +
61021 +#if ZM_SW_LOOP_BACK != 1
61022 + hpPriv->usbSendBytes += zfwBufGetSize(dev, buf);
61023 + hpPriv->usbAcSendBytes[ac&0x3] += zfwBufGetSize(dev, buf);
61024 +
61025 + /* Submit USB Out Urb */
61026 + zfwUsbSend(dev, USB_ENDPOINT_TX_INDEX, (u8_t *)header, headerLen,
61027 + (u8_t *)snap, snapLen, (u8_t *)tail, tailLen, buf, offset);
61028 +#endif
61029 +
61030 +#if ZM_SW_LOOP_BACK == 1
61031 +
61032 + rxbuf = zfwBufAllocate(dev, plcplen + headerLen-8 + snapLen + (zfwBufGetSize(dev, buf)-offset) + 4 + EXTRA_INFO_LEN);
61033 + pHdr = (u8_t *) header+8;
61034 + psnap = (u8_t *) snap;
61035 +
61036 + zmw_enter_critical_section(dev);
61037 + /* software loop back */
61038 + /* Copy WLAN header and packet buffer */
61039 + swlpOffset = plcplen;
61040 +
61041 + for(i = 0; i < headerLen-8; i++)
61042 + {
61043 + zmw_rx_buf_writeb(dev, rxbuf, swlpOffset+i, pHdr[i]);
61044 + }
61045 +
61046 + swlpOffset += headerLen-8;
61047 +
61048 + /* Copy SNAP header */
61049 + for(i = 0; i < snapLen; i++)
61050 + {
61051 + zmw_rx_buf_writeb(dev, rxbuf, swlpOffset+i, psnap[i]);
61052 + }
61053 +
61054 + swlpOffset += snapLen;
61055 +
61056 + /* Copy body from tx buf to rxbuf */
61057 + for(i = 0; i < (zfwBufGetSize(dev, buf)-offset); i++)
61058 + {
61059 + u8_t value = zmw_rx_buf_readb(dev, buf, i+offset);
61060 + zmw_rx_buf_writeb(dev, rxbuf, swlpOffset+i, value);
61061 + }
61062 +
61063 + /* total length = PLCP + MacHeader + Payload + FCS + RXstatus */
61064 + /* 12 + headerLen-8 + snapLen + buf length + 4 + 8 */
61065 + zfwSetBufSetSize(dev, rxbuf, swlpOffset + (zfwBufGetSize(dev, buf)-offset) + 4 + EXTRA_INFO_LEN );
61066 +
61067 + zmw_leave_critical_section(dev);
61068 +
61069 + zfwBufFree(dev, buf, 0);
61070 +
61071 + //zfwDumpBuf(dev, rxbuf);
61072 + //-------------------------------------------------
61073 +
61074 + //zfCoreRecv(dev, rxbuf);
61075 +
61076 +#endif /* #if ZM_SW_LOOP_BACK */
61077 +
61078 + return ZM_SUCCESS;
61079 +}
61080 +
61081 +/* Report moniter Hal rx information about rssi, evm, bandwidth, SG etc */
61082 +void zfHpQueryMonHalRxInfo(zdev_t* dev, u8_t *monHalRxInfo)
61083 +{
61084 + zmw_get_wlan_dev(dev);
61085 + zfMemoryCopy(monHalRxInfo,
61086 + (u8_t*)&(((struct zsHpPriv*)wd->hpPrivate)->halRxInfo),
61087 + sizeof(struct zsHalRxInfo));
61088 +}
61089 +
61090 +
61091 +u8_t zfIsDataFrame(zdev_t* dev, zbuf_t* buf)
61092 +{
61093 + u8_t frameType;
61094 + u8_t mpduInd;
61095 +
61096 + mpduInd = zmw_rx_buf_readb(dev, buf, zfwBufGetSize(dev, buf)-1);
61097 +
61098 + /* sinlge or First */
61099 + if ((mpduInd & 0x30) == 0x00 || (mpduInd & 0x30) == 0x20)
61100 + {
61101 + frameType = zmw_rx_buf_readb(dev, buf, 12);
61102 + }
61103 + else
61104 + {
61105 + frameType = zmw_rx_buf_readb(dev, buf, 0);
61106 + }
61107 +
61108 + if((frameType & 0xf) == ZM_WLAN_DATA_FRAME)
61109 + return 1;
61110 + else
61111 + return 0;
61112 +}
61113 +
61114 +u32_t zfcConvertRateOFDM(zdev_t* dev, zbuf_t* buf)
61115 +{
61116 + // What's the default value??
61117 + u32_t MCS = 0;
61118 +
61119 + switch(zmw_rx_buf_readb(dev, buf, 0)& 0xf)
61120 + {
61121 + case 0xb:
61122 + MCS = 0x4;
61123 + break;
61124 + case 0xf:
61125 + MCS = 0x5;
61126 + break;
61127 + case 0xa:
61128 + MCS = 0x6;
61129 + break;
61130 + case 0xe:
61131 + MCS = 0x7;
61132 + break;
61133 + case 0x9:
61134 + MCS = 0x8;
61135 + break;
61136 + case 0xd:
61137 + MCS = 0x9;
61138 + break;
61139 + case 0x8:
61140 + MCS = 0xa;
61141 + break;
61142 + case 0xc:
61143 + MCS = 0xb;
61144 + break;
61145 + }
61146 + return MCS;
61147 +}
61148 +
61149 +u16_t zfHpGetPayloadLen(zdev_t* dev,
61150 + zbuf_t* buf,
61151 + u16_t len,
61152 + u16_t plcpHdrLen,
61153 + u32_t *rxMT,
61154 + u32_t *rxMCS,
61155 + u32_t *rxBW,
61156 + u32_t *rxSG
61157 + )
61158 +{
61159 + u8_t modulation,mpduInd;
61160 + u16_t low, high, msb;
61161 + s16_t payloadLen = 0;
61162 +
61163 + zmw_get_wlan_dev(dev);
61164 +
61165 + mpduInd = zmw_rx_buf_readb(dev, buf, len-1);
61166 + modulation = zmw_rx_buf_readb(dev, buf, (len-1)) & 0x3;
61167 + *rxMT = modulation;
61168 +
61169 + //zm_debug_msg1(" modulation= ", modulation);
61170 + switch (modulation) {
61171 + case 0: /* CCK Mode */
61172 + low = zmw_rx_buf_readb(dev, buf, 2);
61173 + high = zmw_rx_buf_readb(dev, buf, 3);
61174 + payloadLen = (low | high << 8) - 4;
61175 + if (wd->enableHALDbgInfo)
61176 + {
61177 + *rxMCS = zmw_rx_buf_readb(dev, buf, 0);
61178 + *rxBW = 0;
61179 + *rxSG = 0;
61180 + }
61181 + break;
61182 + case 1: /* Legacy-OFDM mode */
61183 + low = zmw_rx_buf_readb(dev, buf, 0) >> 5;
61184 + high = zmw_rx_buf_readb(dev, buf, 1);
61185 + msb = zmw_rx_buf_readb(dev, buf, 2) & 0x1;
61186 + payloadLen = (low | (high << 3) | (msb << 11)) - 4;
61187 + if (wd->enableHALDbgInfo)
61188 + {
61189 + *rxMCS = zfcConvertRateOFDM(dev, buf);
61190 + *rxBW = 0;
61191 + *rxSG = 0;
61192 + }
61193 + break;
61194 + case 2: /* HT OFDM mode */
61195 + //zm_debug_msg1("aggregation= ", (zmw_rx_buf_readb(dev, buf, 6) >> 3) &0x1 );
61196 + if ((mpduInd & 0x30) == 0x00 || (mpduInd & 0x30) == 0x10) //single or last mpdu
61197 + payloadLen = len - 24 - 4 - plcpHdrLen; // - rxStatus - fcs
61198 + else {
61199 + payloadLen = len - 4 - 4 - plcpHdrLen; // - rxStatus - fcs
61200 + //zm_debug_msg1("first or middle mpdu, plcpHdrLen= ", plcpHdrLen);
61201 + }
61202 + if (wd->enableHALDbgInfo)
61203 + {
61204 + *rxMCS = zmw_rx_buf_readb(dev, buf, 3) & 0x7f;
61205 + *rxBW = (zmw_rx_buf_readb(dev, buf, 3) >> 7) & 0x1;
61206 + *rxSG = (zmw_rx_buf_readb(dev, buf, 6) >> 7) & 0x1;
61207 + }
61208 + break;
61209 + default:
61210 + break;
61211 +
61212 + }
61213 + /* return the payload length - FCS */
61214 + if (payloadLen < 0) payloadLen = 0;
61215 + return payloadLen;
61216 +}
61217 +
61218 +/************************************************************************/
61219 +/* */
61220 +/* FUNCTION DESCRIPTION zfiUsbRecv */
61221 +/* Callback function for USB IN Transfer. */
61222 +/* */
61223 +/* INPUTS */
61224 +/* dev: device pointer */
61225 +/* */
61226 +/* OUTPUTS */
61227 +/* None */
61228 +/* */
61229 +/* AUTHOR */
61230 +/* Yuan-Gu Wei ZyDAS Technology Corporation 2005.10 */
61231 +/* */
61232 +/************************************************************************/
61233 +#define ZM_INT_USE_EP2 1
61234 +#define ZM_INT_USE_EP2_HEADER_SIZE 12
61235 +
61236 +#if ZM_INT_USE_EP2 == 1
61237 +void zfiUsbRegIn(zdev_t* dev, u32_t* rsp, u16_t rspLen);
61238 +#endif
61239 +
61240 +#ifdef ZM_OTUS_RX_STREAM_MODE
61241 +void zfiUsbRecvPerPkt(zdev_t *dev, zbuf_t *buf)
61242 +#else
61243 +void zfiUsbRecv(zdev_t *dev, zbuf_t *buf)
61244 +#endif
61245 +{
61246 +
61247 +
61248 +#if ZM_FW_LOOP_BACK != 1
61249 + u8_t mpduInd;
61250 + u16_t plcpHdrLen;
61251 + u16_t crcPlusRxStatusLen;
61252 + u16_t len, payloadLen=0;
61253 + u16_t i; //CWYang(+)
61254 + struct zsAdditionInfo addInfo;
61255 + u32_t rxMT;
61256 + u32_t rxMCS;
61257 + u32_t rxBW;
61258 + u32_t rxSG;
61259 + zmw_get_wlan_dev(dev);
61260 + struct zsHpPriv* hpPriv=wd->hpPrivate;
61261 +
61262 + //zm_msg0_rx(ZM_LV_0, "zfiUsbRecv()");
61263 +
61264 +#if ZM_INT_USE_EP2 == 1
61265 +
61266 + for (i=0; i<(ZM_INT_USE_EP2_HEADER_SIZE>>1); i++)
61267 + {
61268 + if (zmw_rx_buf_readh(dev, buf, i*2) != 0xffff)
61269 + break;
61270 + }
61271 +
61272 + if (i==(ZM_INT_USE_EP2_HEADER_SIZE>>1))
61273 + {
61274 + u32_t rsp[ZM_USB_MAX_EPINT_BUFFER/4];
61275 + u16_t rspLen;
61276 + u32_t rspi;
61277 + u8_t* pdst = (u8_t*)rsp;
61278 +
61279 + /* Interrupt Rsp */
61280 + rspLen = (u16_t) zfwBufGetSize(dev, buf)-ZM_INT_USE_EP2_HEADER_SIZE;
61281 +
61282 + if (rspLen > 60)
61283 + {
61284 + zm_debug_msg1("Get error len by EP2 = \n", rspLen);
61285 + /* free USB buf */
61286 + zfwBufFree(dev, buf, 0);
61287 + return;
61288 + }
61289 +
61290 + for (rspi=0; rspi<rspLen; rspi++)
61291 + {
61292 + *pdst = zmw_rx_buf_readb(dev, buf, rspi+ZM_INT_USE_EP2_HEADER_SIZE);
61293 + pdst++;
61294 + }
61295 +
61296 + //if (adapter->zfcbUsbRegIn)
61297 + // adapter->zfcbUsbRegIn(adapter, rsp, rspLen);
61298 + zfiUsbRegIn(dev, rsp, rspLen);
61299 +
61300 + /* free USB buf */
61301 + zfwBufFree(dev, buf, 0);
61302 + return;
61303 + }
61304 +#endif /* end of #if ZM_INT_USE_EP2 == 1 */
61305 +
61306 + ZM_PERFORMANCE_RX_MPDU(dev, buf);
61307 +
61308 + if (wd->swSniffer)
61309 + {
61310 + /* airopeek: Report everything up */
61311 + if (wd->zfcbRecv80211 != NULL)
61312 + {
61313 + wd->zfcbRecv80211(dev, buf, NULL);
61314 + }
61315 + }
61316 +
61317 + /* Read the last byte */
61318 + len = zfwBufGetSize(dev, buf);
61319 + mpduInd = zmw_rx_buf_readb(dev, buf, len-1);
61320 +
61321 + /* First MPDU */
61322 + if((mpduInd & 0x30) == 0x20)
61323 + {
61324 + u16_t duration;
61325 + if (zmw_rx_buf_readb(dev, buf, 36) == 0) //AC = BE
61326 + {
61327 + duration = zmw_rx_buf_readh(dev, buf, 14);
61328 + if (duration > hpPriv->aggMaxDurationBE)
61329 + {
61330 + hpPriv->aggMaxDurationBE = duration;
61331 + }
61332 + else
61333 + {
61334 + if (hpPriv->aggMaxDurationBE > 10)
61335 + {
61336 + hpPriv->aggMaxDurationBE--;
61337 + }
61338 + }
61339 + //DbgPrint("aggMaxDurationBE=%d", hpPriv->aggMaxDurationBE);
61340 + }
61341 + }
61342 +
61343 +#if 1
61344 + /* First MPDU or Single MPDU */
61345 + if(((mpduInd & 0x30) == 0x00) || ((mpduInd & 0x30) == 0x20))
61346 + //if ((mpduInd & 0x10) == 0x00)
61347 + {
61348 + plcpHdrLen = 12; // PLCP header length
61349 + }
61350 + else
61351 + {
61352 + if (zmw_rx_buf_readh(dev, buf, 4) == wd->macAddr[0] &&
61353 + zmw_rx_buf_readh(dev, buf, 6) == wd->macAddr[1] &&
61354 + zmw_rx_buf_readh(dev, buf, 8) == wd->macAddr[2]) {
61355 + plcpHdrLen = 0;
61356 + }
61357 + else if (zmw_rx_buf_readh(dev, buf, 16) == wd->macAddr[0] &&
61358 + zmw_rx_buf_readh(dev, buf, 18) == wd->macAddr[1] &&
61359 + zmw_rx_buf_readh(dev, buf, 20) == wd->macAddr[2]){
61360 + plcpHdrLen = 12;
61361 + }
61362 + else {
61363 + plcpHdrLen = 0;
61364 + }
61365 + }
61366 +
61367 + /* Last MPDU or Single MPDU */
61368 + if ((mpduInd & 0x30) == 0x00 || (mpduInd & 0x30) == 0x10)
61369 + {
61370 + crcPlusRxStatusLen = EXTRA_INFO_LEN + 4; // Extra bytes + FCS
61371 + }
61372 + else
61373 + {
61374 + crcPlusRxStatusLen = 4 + 4; // Extra 4 bytes + FCS
61375 + }
61376 +#else
61377 + plcpHdrLen = 12;
61378 + crcPlusRxStatusLen = EXTRA_INFO_LEN + 4; // Extra bytes + FCS
61379 +#endif
61380 +
61381 + if (len < (plcpHdrLen+10+crcPlusRxStatusLen))
61382 + {
61383 + zm_msg1_rx(ZM_LV_0, "Invalid Rx length=", len);
61384 + //zfwDumpBuf(dev, buf);
61385 +
61386 + zfwBufFree(dev, buf, 0);
61387 + return;
61388 + }
61389 +
61390 + /* display RSSI combined */
61391 + /*
61392 + * ¢z¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢{
61393 + * ¢x PLCP Header ¢x MPDU ¢x RSSI ¢x EVM ¢x PHY Err ¢x MAC Status ¢x
61394 + * ¢u¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢t
61395 + * ¢x 12 ¢x n ¢x 7 ¢x 12 ¢x 1 ¢x 4 ¢x
61396 + * ¢|¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢}
61397 + * RSSI filed (From BB and MAC just pass them to host)
61398 + * Byte1: RSSI for antenna 0.
61399 + * Byte2: RSSI for antenna 1.
61400 + * Byte3: RSSI for antenna 2.
61401 + * Byte4: RSSI for antenna 0 extension.
61402 + * Byte5: RSSI for antenna 1 extension.
61403 + * Byte6: RSSI for antenna 2 extension.
61404 + * Byte7: RSSI for antenna combined.
61405 + */
61406 +
61407 + //zm_debug_msg1(" recv RSSI = ", zmw_rx_buf_readb(dev, buf, (len-1)-17));
61408 +
61409 + payloadLen = zfHpGetPayloadLen(dev, buf, len, plcpHdrLen, &rxMT, &rxMCS, &rxBW, &rxSG);
61410 +
61411 + /* Hal Rx info */
61412 + /* First MPDU or Single MPDU */
61413 + if(((mpduInd & 0x30) == 0x00) || ((mpduInd & 0x30) == 0x20))
61414 + {
61415 + if (wd->enableHALDbgInfo && zfIsDataFrame(dev, buf))
61416 + {
61417 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxDataMT = rxMT;
61418 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxDataMCS = rxMCS;
61419 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxDataBW = rxBW;
61420 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxDataSG = rxSG;
61421 + }
61422 + }
61423 +
61424 + if ((plcpHdrLen + payloadLen) > len) {
61425 + zm_msg1_rx(ZM_LV_0, "Invalid payload length=", payloadLen);
61426 + zfwBufFree(dev, buf, 0);
61427 + return;
61428 + }
61429 +
61430 + //Store Rx Tail Infomation before Remove--CWYang(+)
61431 +
61432 +#if 0
61433 + for (i = 0; i < crcPlusRxStatusLen-4; i++)
61434 + {
61435 + addInfo.Tail.Byte[i] =
61436 + zmw_rx_buf_readb(dev, buf, len - crcPlusRxStatusLen + 4 + i);
61437 + }
61438 +#else
61439 +/*
61440 +* Brief format of OUTS chip
61441 +* ¢z¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢{
61442 +* ¢x PLCP Header ¢x MPDU ¢x RSSI ¢x EVM ¢x PHY Err ¢x MAC Status ¢x
61443 +* ¢u¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢t
61444 +* ¢x 12 ¢x n ¢x 7 ¢x 12 ¢x 1 ¢x 4 ¢x
61445 +* ¢|¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢}
61446 +* RSSI:
61447 +* Byte 1 antenna 0
61448 +* Byte 2 antenna 1
61449 +* Byte 3 antenna 2
61450 +* Byte 4 antenna 0 extension
61451 +* Byte 5 antenna 1 extension
61452 +* Byte 6 antenna 2 extension
61453 +* Byte 7 antenna combined
61454 +* EVM:
61455 +* Byte 1 Stream 0 pilot 0
61456 +* Byte 2 Stream 0 pilot 1
61457 +* Byte 3 Stream 0 pilot 2
61458 +* Byte 4 Stream 0 pilot 3
61459 +* Byte 5 Stream 0 pilot 4
61460 +* Byte 6 Stream 0 pilot 5
61461 +* Byte 7 Stream 1 pilot 0
61462 +* Byte 8 Stream 1 pilot 1
61463 +* Byte 9 Stream 1 pilot 2
61464 +* Byte 10 Stream 1 pilot 3
61465 +* Byte 11 Stream 1 pilot 4
61466 +* Byte 12 Stream 1 pilot 5
61467 +*/
61468 +
61469 + /* Fill the Tail information */
61470 + /* Last MPDU or Single MPDU */
61471 + if ((mpduInd & 0x30) == 0x00 || (mpduInd & 0x30) == 0x10)
61472 + {
61473 +#define ZM_RX_RSSI_COMPENSATION 27
61474 + u8_t zm_rx_rssi_compensation = ZM_RX_RSSI_COMPENSATION;
61475 +
61476 + /* RSSI information */
61477 + addInfo.Tail.Data.SignalStrength1 = zmw_rx_buf_readb(dev, buf,
61478 + (len-1) - 17) + ((hpPriv->rxStrongRSSI == 1)?zm_rx_rssi_compensation:0);
61479 +#undef ZM_RX_RSSI_COMPENSATION
61480 +
61481 + /* EVM */
61482 +
61483 + /* TODO: for RD/BB debug message */
61484 + /* save current rx hw infomration, report to DrvCore/Application */
61485 + if (wd->enableHALDbgInfo && zfIsDataFrame(dev, buf))
61486 + {
61487 + u8_t trssi;
61488 + for (i=0; i<7; i++)
61489 + {
61490 + trssi = zmw_rx_buf_readb(dev, buf, (len-1) - 23 + i);
61491 + if (trssi&0x80)
61492 + {
61493 + trssi = ((~((u8_t)trssi) & 0x7f) + 1) & 0x7f;
61494 + }
61495 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRSSI[i] = trssi;
61496 +
61497 + }
61498 + if (rxMT==2)
61499 + {
61500 + //if (rxBW)
61501 + //{
61502 + for (i=0; i<12; i++)
61503 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[i] =
61504 + zmw_rx_buf_readb(dev, buf, (len-1) - 16 + i);
61505 + //}
61506 + //else
61507 + //{
61508 + // for (i=0; i<4; i++)
61509 + // ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[i] =
61510 + // zmw_rx_buf_readb(dev, buf, (len-1) - 16 + i);
61511 + //}
61512 + }
61513 +
61514 + #if 0
61515 + /* print */
61516 + zm_dbg(("MT(%d) MCS(%d) BW(%d) SG(%d) RSSI:%d,%d,%d,%d,%d,%d,%d EVM:(%d,%d,%d,%d,%d,%d)(%d,%d,%d,%d,%d,%d)\n",
61517 + rxMT,
61518 + rxMCS,
61519 + rxBW,
61520 + rxSG,
61521 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRSSI[0],
61522 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRSSI[1],
61523 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRSSI[2],
61524 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRSSI[3],
61525 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRSSI[4],
61526 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRSSI[5],
61527 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRSSI[6],
61528 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[0],
61529 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[1],
61530 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[2],
61531 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[3],
61532 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[4],
61533 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[5],
61534 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[6],
61535 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[7],
61536 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[8],
61537 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[9],
61538 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[10],
61539 + ((struct zsHpPriv*)wd->hpPrivate)->halRxInfo.currentRxEVM[11]
61540 + ));
61541 + #endif
61542 + } /* if (wd->enableHALDbgInfo && zfIsDataFrame(dev, buf)) */
61543 +
61544 + }
61545 + else
61546 + {
61547 + /* Mid or First aggregate frame without phy rx information */
61548 + addInfo.Tail.Data.SignalStrength1 = 0;
61549 + }
61550 +
61551 + addInfo.Tail.Data.SignalStrength2 = 0;
61552 + addInfo.Tail.Data.SignalStrength3 = 0;
61553 + addInfo.Tail.Data.SignalQuality = 0;
61554 +
61555 + addInfo.Tail.Data.SAIndex = zmw_rx_buf_readb(dev, buf, len - 4);
61556 + addInfo.Tail.Data.DAIndex = zmw_rx_buf_readb(dev, buf, len - 3);
61557 + addInfo.Tail.Data.ErrorIndication = zmw_rx_buf_readb(dev, buf, len - 2);
61558 + addInfo.Tail.Data.RxMacStatus = zmw_rx_buf_readb(dev, buf, len - 1);
61559 +
61560 +#endif
61561 + /* Remove CRC and Rx Status */
61562 + zfwBufSetSize(dev, buf, (len-crcPlusRxStatusLen));
61563 + //zfwBufSetSize(dev, buf, payloadLen + plcpHdrLen); /* payloadLen + PLCP 12 - FCS 4*/
61564 +
61565 + //Store PLCP Header Infomation before Remove--CWYang(+)
61566 + if (plcpHdrLen != 0)
61567 + {
61568 + for (i = 0; i < plcpHdrLen; i++)
61569 + {
61570 + addInfo.PlcpHeader[i] = zmw_rx_buf_readb(dev, buf, i);
61571 + }
61572 + }
61573 + else
61574 + {
61575 + addInfo.PlcpHeader[0] = 0;
61576 + }
61577 + /* Remove PLCP header */
61578 + zfwBufRemoveHead(dev, buf, plcpHdrLen);
61579 +
61580 + /* handle 802.11 frame */
61581 + zfCoreRecv(dev, buf, &addInfo);
61582 +
61583 +#else
61584 + /* Firmware loopback: Rx frame = Tx frame */
61585 + /* convert Rx frame to fit receive frame format */
61586 + zbuf_t *new_buf;
61587 + u8_t ctrl_offset = 8;
61588 + u8_t PLCP_Len = 12;
61589 + u8_t data;
61590 + u8_t i;
61591 +
61592 +
61593 + /* Tx: | ctrl_setting | Mac hdr | data | */
61594 + /* 8 24 x */
61595 +
61596 + /* Rx: | PLCP | Mac hdr | data | FCS | Rxstatus | */
61597 + /* 12 24 x 4 8 */
61598 +
61599 + /* new allocate a rx format size buf */
61600 + new_buf = zfwBufAllocate(dev, zfwBufGetSize(dev, buf)-8+12+4+EXTRA_INFO_LEN);
61601 +
61602 + for (i=0; i<zfwBufGetSize(dev, buf)-ctrl_offset; i++)
61603 + {
61604 + data = zmw_rx_buf_readb(dev, buf, ctrl_offset+i);
61605 + zmw_rx_buf_writeb(dev, new_buf, PLCP_Len+i, data);
61606 + }
61607 +
61608 + zfwBufSetSize(dev, new_buf, zfwBufGetSize(dev, buf)-8+12+4+EXTRA_INFO_LEN);
61609 +
61610 + zfwBufFree(dev, buf, 0);
61611 +
61612 + /* receive the new_buf */
61613 + //zfCoreRecv(dev, new_buf);
61614 +
61615 +#endif
61616 +
61617 +}
61618 +
61619 +#ifdef ZM_OTUS_RX_STREAM_MODE
61620 +void zfiUsbRecv(zdev_t *dev, zbuf_t *buf)
61621 +{
61622 + u16_t index = 0;
61623 + u16_t chkIdx;
61624 + u32_t status = 0;
61625 + u16_t ii;
61626 + zbuf_t *newBuf;
61627 + zbuf_t *rxBufPool[8];
61628 + u16_t rxBufPoolIndex = 0;
61629 + struct zsHpPriv *halPriv;
61630 + u8_t *srcBufPtr;
61631 + u32_t bufferLength;
61632 + u16_t usbRxRemainLen;
61633 + u16_t usbRxPktLen;
61634 +
61635 + zmw_get_wlan_dev(dev);
61636 +
61637 + halPriv = (struct zsHpPriv*)wd->hpPrivate;
61638 + srcBufPtr = zmw_buf_get_buffer(dev, buf);
61639 +
61640 + bufferLength = zfwBufGetSize(dev, buf);
61641 +
61642 + /* Zero Length Transfer */
61643 + if (!bufferLength)
61644 + {
61645 + zfwBufFree(dev, buf, 0);
61646 + return;
61647 + }
61648 +
61649 + usbRxRemainLen = halPriv->usbRxRemainLen;
61650 + usbRxPktLen = halPriv->usbRxTransferLen;
61651 +
61652 + /* Check whether there is any data in the last transfer */
61653 + if (usbRxRemainLen != 0 )
61654 + {
61655 + zbuf_t *remainBufPtr = halPriv->remainBuf;
61656 + u8_t* BufPtr = NULL;
61657 +
61658 + if ( remainBufPtr != NULL )
61659 + {
61660 + BufPtr = zmw_buf_get_buffer(dev, remainBufPtr);
61661 + }
61662 +
61663 + index = usbRxRemainLen;
61664 + usbRxRemainLen -= halPriv->usbRxPadLen;
61665 +
61666 + /* Copy data */
61667 + if ( BufPtr != NULL )
61668 + {
61669 + zfwMemoryCopy(&(BufPtr[usbRxPktLen]), srcBufPtr, usbRxRemainLen);
61670 + }
61671 +
61672 + usbRxPktLen += usbRxRemainLen;
61673 + halPriv->usbRxRemainLen = 0;
61674 +
61675 + if ( remainBufPtr != NULL )
61676 + {
61677 + zfwBufSetSize(dev, remainBufPtr, usbRxPktLen);
61678 + rxBufPool[rxBufPoolIndex++] = remainBufPtr;
61679 + }
61680 + halPriv->remainBuf = NULL;
61681 + }
61682 +
61683 + //zm_debug_msg1("length: %d\n", (int)pUsbRxTransfer->pRxUrb->UrbBulkOrInterruptTransfer.TransferBufferLength);
61684 +
61685 + bufferLength = zfwBufGetSize(dev, buf);
61686 +//printk("bufferLength %d\n", bufferLength);
61687 + while(index < bufferLength)
61688 + {
61689 + u16_t pktLen;
61690 + u16_t pktTag;
61691 + //u8_t *ptr = (u8_t*)((struct zsBuffer*)pUsbRxTransfer->buf)->data;
61692 + u8_t *ptr = srcBufPtr;
61693 +
61694 + /* Retrieve packet length and tag */
61695 + pktLen = ptr[index] + (ptr[index+1] << 8);
61696 + pktTag = ptr[index+2] + (ptr[index+3] << 8);
61697 +
61698 + if (pktTag == ZM_USB_STREAM_MODE_TAG)
61699 + {
61700 + u16_t padLen;
61701 +
61702 + zm_assert(pktLen < ZM_WLAN_MAX_RX_SIZE);
61703 +
61704 + //printk("Get a packet, pktLen: 0x%04x\n", pktLen);
61705 + #if 0
61706 + /* Dump data */
61707 + for (ii = index; ii < pkt_len+4;)
61708 + {
61709 + DbgPrint("0x%02x ",
61710 + (zmw_rx_buf_readb(adapter, pUsbRxTransfer->buf, ii) & 0xff));
61711 +
61712 + if ((++ii % 16) == 0)
61713 + DbgPrint("\n");
61714 + }
61715 +
61716 + DbgPrint("\n");
61717 + #endif
61718 +
61719 + /* Calcuate the padding length, in the current design,
61720 + the length should be padded to 4 byte boundray. */
61721 + padLen = ZM_USB_STREAM_MODE_TAG_LEN - (pktLen & 0x3);
61722 +
61723 + if(padLen == ZM_USB_STREAM_MODE_TAG_LEN)
61724 + padLen = 0;
61725 +
61726 + chkIdx = index;
61727 + index = index + ZM_USB_STREAM_MODE_TAG_LEN + pktLen + padLen;
61728 +
61729 + if (chkIdx > ZM_MAX_USB_IN_TRANSFER_SIZE)
61730 + {
61731 + zm_debug_msg1("chkIdx is too large, chkIdx: %d\n", chkIdx);
61732 + zm_assert(0);
61733 + status = 1;
61734 + break;
61735 + }
61736 +
61737 + if (index > ZM_MAX_USB_IN_TRANSFER_SIZE)
61738 + {
61739 + //struct zsBuffer* BufPtr;
61740 + //struct zsBuffer* UsbBufPtr;
61741 + u8_t *BufPtr;
61742 + u8_t *UsbBufPtr;
61743 +
61744 + halPriv->usbRxRemainLen = index - ZM_MAX_USB_IN_TRANSFER_SIZE; // - padLen;
61745 + halPriv->usbRxTransferLen = ZM_MAX_USB_IN_TRANSFER_SIZE -
61746 + chkIdx - ZM_USB_STREAM_MODE_TAG_LEN;
61747 + halPriv->usbRxPadLen = padLen;
61748 + //check_index = index;
61749 +
61750 + if (halPriv->usbRxTransferLen > ZM_WLAN_MAX_RX_SIZE)
61751 + {
61752 + zm_debug_msg1("check_len is too large, chk_len: %d\n",
61753 + halPriv->usbRxTransferLen);
61754 + status = 1;
61755 + break;
61756 + }
61757 +
61758 + /* Allocate a skb buffer */
61759 + newBuf = zfwBufAllocate(dev, ZM_WLAN_MAX_RX_SIZE);
61760 +
61761 + if ( newBuf != NULL )
61762 + {
61763 + BufPtr = zmw_buf_get_buffer(dev, newBuf);
61764 + UsbBufPtr = srcBufPtr;
61765 +
61766 + /* Copy the buffer */
61767 + zfwMemoryCopy(BufPtr, &(UsbBufPtr[chkIdx+ZM_USB_STREAM_MODE_TAG_LEN]), halPriv->usbRxTransferLen);
61768 +
61769 + /* Record the buffer pointer */
61770 + halPriv->remainBuf = newBuf;
61771 + }
61772 + }
61773 + else
61774 + {
61775 + u8_t* BufPtr;
61776 + u8_t* UsbBufPtr;
61777 +
61778 + /* Allocate a skb buffer */
61779 + newBuf = zfwBufAllocate(dev, ZM_WLAN_MAX_RX_SIZE);
61780 + if ( newBuf != NULL )
61781 + {
61782 + BufPtr = zmw_buf_get_buffer(dev, newBuf);
61783 + UsbBufPtr = srcBufPtr;
61784 +
61785 + /* Copy the buffer */
61786 + zfwMemoryCopy(BufPtr, &(UsbBufPtr[chkIdx+ZM_USB_STREAM_MODE_TAG_LEN]), pktLen);
61787 +
61788 + zfwBufSetSize(dev, newBuf, pktLen);
61789 + rxBufPool[rxBufPoolIndex++] = newBuf;
61790 + }
61791 + }
61792 + }
61793 + else
61794 + {
61795 + u16_t i;
61796 +
61797 + DbgPrint("Can't find tag, pkt_len: 0x%04x, tag: 0x%04x\n",
61798 + pktLen, pktTag);
61799 +
61800 + #if 0
61801 + for(i = 0; i < 32; i++)
61802 + {
61803 + DbgPrint("%02x ", buf->data[index-16+i]);
61804 +
61805 + if ((i & 0xf) == 0xf)
61806 + DbgPrint("\n");
61807 + }
61808 + #endif
61809 +
61810 + break;
61811 + }
61812 + }
61813 +
61814 + /* Free buffer */
61815 + //zfwBufFree(adapter, pUsbRxTransfer->buf, 0);
61816 + zfwBufFree(dev, buf, 0);
61817 +
61818 + for(ii = 0; ii < rxBufPoolIndex; ii++)
61819 + {
61820 + zfiUsbRecvPerPkt(dev, rxBufPool[ii]);
61821 + }
61822 +}
61823 +#endif
61824 +
61825 +/************************************************************************/
61826 +/* */
61827 +/* FUNCTION DESCRIPTION zfUsbInit */
61828 +/* Initialize USB resource. */
61829 +/* */
61830 +/* INPUTS */
61831 +/* dev : device pointer */
61832 +/* */
61833 +/* OUTPUTS */
61834 +/* None */
61835 +/* */
61836 +/* AUTHOR */
61837 +/* Stephen Chen ZyDAS Technology Corporation 2005.12 */
61838 +/* */
61839 +/************************************************************************/
61840 +void zfUsbInit(zdev_t* dev)
61841 +{
61842 + /* Initialize Rx & INT endpoint for receiving data & interrupt */
61843 + zfwUsbEnableRxEpt(dev, USB_ENDPOINT_RX_INDEX);
61844 + zfwUsbEnableIntEpt(dev, USB_ENDPOINT_INT_INDEX);
61845 +
61846 + return;
61847 +}
61848 +
61849 +
61850 +/************************************************************************/
61851 +/* */
61852 +/* FUNCTION DESCRIPTION zfUsbFree */
61853 +/* Free PCI resource. */
61854 +/* */
61855 +/* INPUTS */
61856 +/* dev : device pointer */
61857 +/* */
61858 +/* OUTPUTS */
61859 +/* None */
61860 +/* */
61861 +/* AUTHOR */
61862 +/* Stephen Chen ZyDAS Technology Corporation 2005.12 */
61863 +/* */
61864 +/************************************************************************/
61865 +void zfUsbFree(zdev_t* dev)
61866 +{
61867 + struct zsHpPriv *halPriv;
61868 +
61869 + zmw_get_wlan_dev(dev);
61870 +
61871 + halPriv = (struct zsHpPriv*)wd->hpPrivate;
61872 +
61873 +#ifdef ZM_OTUS_RX_STREAM_MODE
61874 + if ( halPriv->remainBuf != NULL )
61875 + {
61876 + zfwBufFree(dev, halPriv->remainBuf, 0);
61877 + }
61878 +#endif
61879 +
61880 + return;
61881 +}
61882 +
61883 +void zfHpSendBeacon(zdev_t* dev, zbuf_t* buf, u16_t len)
61884 +{
61885 + u32_t hw, lw;
61886 + u16_t i;
61887 + zmw_get_wlan_dev(dev);
61888 +
61889 + /* Write to beacon buffer (ZM_BEACON_BUFFER_ADDRESS) */
61890 + for (i = 0; i<len; i+=4)
61891 + {
61892 + lw = zmw_tx_buf_readh(dev, buf, i);
61893 + hw = zmw_tx_buf_readh(dev, buf, i+2);
61894 +
61895 + zfDelayWriteInternalReg(dev, ZM_BEACON_BUFFER_ADDRESS+i, (hw<<16)+lw);
61896 + }
61897 +
61898 + /* Beacon PCLP header */
61899 + if (((struct zsHpPriv*)wd->hpPrivate)->hwFrequency < 3000)
61900 + {
61901 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_PLCP, ((len+4)<<(3+16))+0x0400);
61902 + }
61903 + else
61904 + {
61905 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_PLCP, ((len+4)<<(16))+0x001b);
61906 + }
61907 +
61908 + /* Beacon length (include CRC32) */
61909 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_LENGTH, len+4);
61910 +
61911 + /* Beacon Ready */
61912 + zfDelayWriteInternalReg(dev, ZM_MAC_REG_BCN_CTRL, 1);
61913 + zfFlushDelayWrite(dev);
61914 +
61915 + /* Free beacon buf */
61916 + zfwBufFree(dev, buf, 0);
61917 +
61918 + return;
61919 +}
61920 +
61921 +
61922 +#define ZM_STATUS_TX_COMP 0x00
61923 +#define ZM_STATUS_RETRY_COMP 0x01
61924 +#define ZM_STATUS_TX_FAILED 0x02
61925 +void zfiUsbRegIn(zdev_t* dev, u32_t* rsp, u16_t rspLen)
61926 +{
61927 + //u8_t len, type, i;
61928 + u8_t type;
61929 + u8_t *u8rsp;
61930 + u16_t status;
61931 + u32_t bitmap;
61932 + zmw_get_wlan_dev(dev);
61933 +
61934 + zm_msg0_mm(ZM_LV_3, "zfiUsbRegIn()");
61935 +
61936 + u8rsp = (u8_t *)rsp;
61937 +
61938 + //len = *u8rsp;
61939 + type = *(u8rsp+1);
61940 + u8rsp = u8rsp+4;
61941 +
61942 +
61943 + /* Interrupt event */
61944 + if ((type & 0xC0) == 0xC0)
61945 + {
61946 + if (type == 0xC0)
61947 + {
61948 + zfCoreEvent(dev, 0, u8rsp);
61949 +
61950 + }
61951 + else if (type == 0xC1)
61952 + {
61953 +#if 0
61954 + {
61955 + u16_t i;
61956 + DbgPrint("rspLen=%d\n", rspLen);
61957 + for (i=0; i<(rspLen/4); i++)
61958 + {
61959 + DbgPrint("rsp[%d]=0x%lx\n", i, rsp[i]);
61960 + }
61961 + }
61962 +#endif
61963 + status = (u16_t)(rsp[3] >> 16);
61964 +
61965 + ////6789
61966 + rsp[8] = rsp[8] >> 2 | (rsp[9] & 0x1) << 6;
61967 + switch (status)
61968 + {
61969 + case ZM_STATUS_RETRY_COMP :
61970 + zfCoreEvent(dev, 1, u8rsp);
61971 + break;
61972 + case ZM_STATUS_TX_FAILED :
61973 + zfCoreEvent(dev, 2, u8rsp);
61974 + break;
61975 + case ZM_STATUS_TX_COMP :
61976 + zfCoreEvent(dev, 3, u8rsp);
61977 + break;
61978 + }
61979 + }
61980 + else if (type == 0xC2)
61981 + {
61982 + zfBeaconCfgInterrupt(dev, u8rsp);
61983 + }
61984 + else if (type == 0xC3)
61985 + {
61986 + zfEndOfAtimWindowInterrupt(dev);
61987 + }
61988 + else if (type == 0xC4)
61989 + {
61990 +#if 0
61991 + {
61992 + u16_t i;
61993 + DbgPrint("0xC2:rspLen=%d\n", rspLen);
61994 + for (i=0; i<(rspLen/4); i++)
61995 + {
61996 + DbgPrint("0xC2:rsp[%d]=0x%lx\n", i, rsp[i]);
61997 + }
61998 + }
61999 +#endif
62000 + bitmap = (rsp[1] >> 16) + ((rsp[2] & 0xFFFF) << 16 );
62001 + //zfBawCore(dev, (u16_t)rsp[1] & 0xFFFF, bitmap, (u16_t)(rsp[2] >> 16) & 0xFF);
62002 + }
62003 + else if (type == 0xC5)
62004 + {
62005 + u16_t i;
62006 +#if 0
62007 +
62008 + for (i=0; i<(rspLen/4); i++) {
62009 + DbgPrint("0xC5:rsp[%d]=0x%lx\n", i, rsp[i]);
62010 + }
62011 +#endif
62012 + for (i=1; i<(rspLen/4); i++) {
62013 + u8rsp = (u8_t *)(rsp+i);
62014 + //DbgPrint("0xC5:rsp[%d]=0x%lx\n", i, ((u32_t*)u8rsp)[0]);
62015 + zfCoreEvent(dev, 4, u8rsp);
62016 + }
62017 + }
62018 + else if (type == 0xC6)
62019 + {
62020 + zm_debug_msg0("\n\n WatchDog interrupt!!! : 0xC6 \n\n");
62021 + if (wd->zfcbHwWatchDogNotify != NULL)
62022 + {
62023 + wd->zfcbHwWatchDogNotify(dev);
62024 + }
62025 + }
62026 + else if (type == 0xC8)
62027 + {
62028 + //PZSW_ADAPTER adapter;
62029 +
62030 + // for SPI flash program chk Flag
62031 + zfwDbgProgrameFlashChkDone(dev);
62032 + }
62033 + else if (type == 0xC9)
62034 + {
62035 + struct zsHpPriv* hpPriv=wd->hpPrivate;
62036 +
62037 + zm_debug_msg0("##### Tx retransmission 5 times event #####");
62038 +
62039 + /* correct tx retransmission issue */
62040 + hpPriv->retransmissionEvent = 1;
62041 + }
62042 + }
62043 + else
62044 + {
62045 + zfIdlRsp(dev, rsp, rspLen);
62046 + }
62047 +}
62048 +
62049 +
62050 +#define ZM_PROGRAM_RAM_ADDR 0x200000 //0x1000 //0x700000
62051 +#define FIRMWARE_DOWNLOAD 0x30
62052 +#define FIRMWARE_DOWNLOAD_COMP 0x31
62053 +#define FIRMWARE_CONFIRM 0x32
62054 +
62055 +u16_t zfFirmwareDownload(zdev_t* dev, u32_t* fw, u32_t len, u32_t offset)
62056 +{
62057 + u16_t ret = ZM_SUCCESS;
62058 + u32_t uCodeOfst = offset;
62059 + u8_t *image, *ptr;
62060 + u32_t result;
62061 +
62062 + image = (u8_t*) fw;
62063 + ptr = image;
62064 +
62065 + while (len > 0)
62066 + {
62067 + u32_t translen = (len > 4096) ? 4096 : len;
62068 +
62069 + result = zfwUsbSubmitControl(dev, FIRMWARE_DOWNLOAD,
62070 + (u16_t) (uCodeOfst >> 8),
62071 + 0, image, translen);
62072 +
62073 + if (result != ZM_SUCCESS)
62074 + {
62075 + zm_msg0_init(ZM_LV_0, "FIRMWARE_DOWNLOAD failed");
62076 + ret = 1;
62077 + goto exit;
62078 + }
62079 +
62080 + len -= translen;
62081 + image += translen;
62082 + uCodeOfst += translen; // in Word (16 bit)
62083 +
62084 + result = 0;
62085 + }
62086 +
62087 + /* If download firmware success, issue a command to firmware */
62088 + if (ret == 0)
62089 + {
62090 + result = zfwUsbSubmitControl(dev, FIRMWARE_DOWNLOAD_COMP,
62091 + 0, 0, NULL, 0);
62092 +
62093 + if (result != ZM_SUCCESS)
62094 + {
62095 + zm_msg0_init(ZM_LV_0, "FIRMWARE_DOWNLOAD_COMP failed");
62096 + ret = 1;
62097 + goto exit;
62098 + }
62099 + }
62100 +
62101 +#if 0
62102 + /* PCI code */
62103 + /* Wait for firmware ready */
62104 + result = zfwUsbSubmitControl(dev, FIRMWARE_CONFIRM, USB_DIR_IN | 0x40,
62105 + 0, 0, &ret_value, sizeof(ret_value), HZ);
62106 +
62107 + if (result != 0)
62108 + {
62109 + zm_msg0_init(ZM_LV_0, "Can't receive firmware ready: ", result);
62110 + ret = 1;
62111 + }
62112 +#endif
62113 +
62114 +exit:
62115 +
62116 + return ret;
62117 +
62118 +}
62119 +
62120 +u16_t zfFirmwareDownloadNotJump(zdev_t* dev, u32_t* fw, u32_t len, u32_t offset)
62121 +{
62122 + u16_t ret = ZM_SUCCESS;
62123 + u32_t uCodeOfst = offset;
62124 + u8_t *image, *ptr;
62125 + u32_t result;
62126 +
62127 + image = (u8_t*) fw;
62128 + ptr = image;
62129 +
62130 + while (len > 0)
62131 + {
62132 + u32_t translen = (len > 4096) ? 4096 : len;
62133 +
62134 + result = zfwUsbSubmitControl(dev, FIRMWARE_DOWNLOAD,
62135 + (u16_t) (uCodeOfst >> 8),
62136 + 0, image, translen);
62137 +
62138 + if (result != ZM_SUCCESS)
62139 + {
62140 + zm_msg0_init(ZM_LV_0, "FIRMWARE_DOWNLOAD failed");
62141 + ret = 1;
62142 + goto exit;
62143 + }
62144 +
62145 + len -= translen;
62146 + image += translen;
62147 + uCodeOfst += translen; // in Word (16 bit)
62148 +
62149 + result = 0;
62150 + }
62151 +
62152 +exit:
62153 +
62154 + return ret;
62155 +
62156 +}
62157 +
62158 +/************************************************************************/
62159 +/* */
62160 +/* FUNCTION DESCRIPTION zfIdlGetFreeTxdCount */
62161 +/* Get free PCI PCI TxD count. */
62162 +/* */
62163 +/* INPUTS */
62164 +/* dev : device pointer */
62165 +/* */
62166 +/* OUTPUTS */
62167 +/* None */
62168 +/* */
62169 +/* AUTHOR */
62170 +/* Stephen ZyDAS Technology Corporation 2006.6 */
62171 +/* */
62172 +/************************************************************************/
62173 +u32_t zfHpGetFreeTxdCount(zdev_t* dev)
62174 +{
62175 + return zfwUsbGetFreeTxQSize(dev);
62176 +}
62177 +
62178 +u32_t zfHpGetMaxTxdCount(zdev_t* dev)
62179 +{
62180 + //return 8;
62181 + return zfwUsbGetMaxTxQSize(dev);
62182 +}
62183 +
62184 +void zfiUsbRegOutComplete(zdev_t* dev)
62185 +{
62186 + return;
62187 +}
62188 +
62189 +extern void zfPushVtxq(zdev_t* dev);
62190 +
62191 +void zfiUsbOutComplete(zdev_t* dev, zbuf_t *buf, u8_t status, u8_t *hdr) {
62192 +#ifndef ZM_ENABLE_AGGREGATION
62193 + if (buf) {
62194 + zfwBufFree(dev, buf, 0);
62195 + }
62196 +#else
62197 + #ifdef ZM_BYPASS_AGGR_SCHEDULING
62198 + //Simply free the buf since BA retransmission is done in the firmware
62199 + if (buf)
62200 + {
62201 + zfwBufFree(dev, buf, 0);
62202 + }
62203 + zfPushVtxq(dev);
62204 + #else
62205 + zmw_get_wlan_dev(dev);
62206 +
62207 + #ifdef ZM_ENABLE_FW_BA_RETRANSMISSION
62208 + //Simply free the buf since BA retransmission is done in the firmware
62209 + if (buf)
62210 + {
62211 + zfwBufFree(dev, buf, 0);
62212 + }
62213 + #else
62214 + u8_t agg;
62215 + u16_t frameType;
62216 +
62217 + if(!hdr && buf) {
62218 + zfwBufFree(dev, buf, 0);
62219 + //zm_debug_msg0("buf Free due to hdr == NULL");
62220 + return;
62221 + }
62222 +
62223 + if(hdr && buf) {
62224 + frameType = hdr[8] & 0xf;
62225 + agg = (u8_t)(hdr[2] >> 5 ) & 0x1;
62226 + //zm_debug_msg1("AGG=", agg);
62227 +
62228 + if (!status) {
62229 + if (agg) {
62230 + //delete buf in ba fail queue??
62231 + //not ganna happen?
62232 + }
62233 + else {
62234 + zfwBufFree(dev, buf, 0);
62235 + }
62236 + }
62237 + else {
62238 + if (agg) {
62239 + //don't do anything
62240 + //zfwBufFree(dev, buf, 0);
62241 + }
62242 + else {
62243 + zfwBufFree(dev, buf, 0);
62244 + }
62245 + }
62246 + }
62247 + #endif
62248 +
62249 + if (wd->state != ZM_WLAN_STATE_ENABLED) {
62250 + return;
62251 + }
62252 +
62253 + if( (wd->wlanMode == ZM_MODE_AP) ||
62254 + (wd->wlanMode == ZM_MODE_INFRASTRUCTURE && wd->sta.EnableHT) ||
62255 + (wd->wlanMode == ZM_MODE_PSEUDO) ) {
62256 + zfAggTxScheduler(dev, 0);
62257 + }
62258 + #endif
62259 +#endif
62260 +
62261 + return;
62262 +
62263 +}
62264 +
62265 --- /dev/null
62266 +++ b/drivers/staging/otus/hal/hpusb.h
62267 @@ -0,0 +1,437 @@
62268 +/*
62269 + * Copyright (c) 2000-2005 ZyDAS Technology Corporation
62270 + * Copyright (c) 2007-2008 Atheros Communications Inc.
62271 + *
62272 + * Permission to use, copy, modify, and/or distribute this software for any
62273 + * purpose with or without fee is hereby granted, provided that the above
62274 + * copyright notice and this permission notice appear in all copies.
62275 + *
62276 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
62277 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
62278 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
62279 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
62280 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
62281 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
62282 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
62283 + */
62284 +/* Module Name : ud_defs.h */
62285 +/* */
62286 +/* Abstract */
62287 +/* This module contains USB data structure definitions. */
62288 +/* */
62289 +/* NOTES */
62290 +/* None */
62291 +/* */
62292 +/************************************************************************/
62293 +
62294 +#ifndef _HPUSB_H
62295 +#define _HPUSB_H
62296 +
62297 +#define ZM_OTUS_ENABLE_RETRY_FREQ_CHANGE
62298 +#define ZM_BEACON_BUFFER_ADDRESS 0x117900
62299 +
62300 +#define ZM_MAX_CMD_SIZE 64
62301 +#define ZM_HAL_MAX_EEPROM_REQ 510
62302 +#define ZM_HAL_MAX_EEPROM_PRQ 2
62303 +
62304 +/* For USB STREAM mode */
62305 +#ifdef ZM_DISABLE_AMSDU8K_SUPPORT
62306 +#define ZM_MAX_USB_IN_TRANSFER_SIZE 4096
62307 +#else
62308 +#define ZM_MAX_USB_IN_TRANSFER_SIZE 8192
62309 +#endif
62310 +#define ZM_USB_STREAM_MODE_TAG_LEN 4
62311 +#define ZM_USB_STREAM_MODE_TAG 0x4e00
62312 +#define ZM_USB_MAX_EPINT_BUFFER 64
62313 +
62314 +struct zsCmdQ
62315 +{
62316 + u16_t src;
62317 + u16_t cmdLen;
62318 + u8_t* buf;
62319 + u32_t cmd[ZM_MAX_CMD_SIZE/4];
62320 +};
62321 +
62322 +struct zsCommand
62323 +{
62324 + u16_t delayWcmdCount;
62325 + u32_t delayWcmdAddr[(ZM_CMD_QUEUE_SIZE-4)/4];
62326 + u32_t delayWcmdVal[(ZM_CMD_QUEUE_SIZE-4)/4];
62327 +};
62328 +
62329 +struct zsHalRxInfo
62330 +{
62331 + u32_t currentRSSI[7]; /* RSSI combined */
62332 + u32_t currentRxEVM[14];
62333 + u32_t currentRxDataMT;
62334 + u32_t currentRxDataMCS;
62335 + u32_t currentRxDataBW;
62336 + u32_t currentRxDataSG;
62337 +};
62338 +
62339 +struct zsHpPriv
62340 +{
62341 + u16_t hwFrequency;
62342 + u8_t hwBw40;
62343 + u8_t hwExtOffset;
62344 +
62345 + u8_t disableDfsCh;
62346 +
62347 + u32_t halCapability;
62348 +
62349 + /* Fortunately the second loop can be disabled with a bit */
62350 + /* called en_pd_dc_offset_thr */
62351 + u8_t hwNotFirstInit;
62352 +
62353 + /* command queue */
62354 + u16_t cmdHead;
62355 + u16_t cmdTail;
62356 +#ifdef ZM_XP_USB_MULTCMD
62357 + u16_t cmdSend; // Used for Mult send USB cmd
62358 +#endif
62359 + struct zsCmdQ cmdQ[ZM_CMD_QUEUE_SIZE];
62360 + u16_t cmdPending;
62361 + struct zsCommand cmd; /* buffer for delayed commands */
62362 + u8_t ledMode[2];
62363 + u32_t ctlBusy;
62364 + u32_t extBusy;
62365 +
62366 + /*
62367 + * ANI & Radar support.
62368 + */
62369 + u32_t procPhyErr; /* Process Phy errs */
62370 + u8_t hasHwPhyCounters; /* Hardware has phy counters */
62371 + u32_t aniPeriod; /* ani update list period */
62372 + struct zsAniStats stats; /* various statistics */
62373 + struct zsAniState *curani; /* cached last reference */
62374 + struct zsAniState ani[50]; /* per-channel state */
62375 +
62376 + /*
62377 + * Ani tables that change between the 5416 and 5312.
62378 + * These get set at attach time.
62379 + * XXX don't belong here
62380 + * XXX need better explanation
62381 + */
62382 + s32_t totalSizeDesired[5];
62383 + s32_t coarseHigh[5];
62384 + s32_t coarseLow[5];
62385 + s32_t firpwr[5];
62386 +
62387 + /*
62388 + * ANI related PHY register value.
62389 + */
62390 + u32_t regPHYDesiredSZ;
62391 + u32_t regPHYFindSig;
62392 + u32_t regPHYAgcCtl1;
62393 + u32_t regPHYSfcorr;
62394 + u32_t regPHYSfcorrLow;
62395 + u32_t regPHYTiming5;
62396 + u32_t regPHYCckDetect;
62397 +
62398 + u32_t eepromImage[1024];
62399 + u32_t eepromImageIndex;
62400 + u32_t eepromImageRdReq;
62401 +
62402 + u8_t halReInit;
62403 +
62404 + u8_t OpFlags;
62405 +
62406 + u8_t tPow2xCck[4];
62407 + u8_t tPow2x2g[4];
62408 + u8_t tPow2x2g24HeavyClipOffset;
62409 + u8_t tPow2x2gHt20[8];
62410 + u8_t tPow2x2gHt40[8];
62411 + u8_t tPow2x5g[4];
62412 + u8_t tPow2x5gHt20[8];
62413 + u8_t tPow2x5gHt40[8];
62414 +
62415 + /* hwBBHeavyClip : used compatibility */
62416 + /* 0 : dongle not support. */
62417 + /* !0: support heavy clip. */
62418 + u8_t hwBBHeavyClip;
62419 + u8_t enableBBHeavyClip; /* 0=>force disable 1=>enable */
62420 + u8_t doBBHeavyClip; /* set 1 if heavy clip need by each frequency switch */
62421 + u32_t setValueHeavyClip; /* save setting value for heavy clip when completed routine */
62422 +
62423 + /*
62424 + * Rxdata RSSI, EVM, Rate etc...
62425 + */
62426 + struct zsHalRxInfo halRxInfo;
62427 +
62428 + u32_t usbSendBytes;
62429 + u32_t usbAcSendBytes[4];
62430 +
62431 + u16_t aggMaxDurationBE;
62432 + u32_t aggPktNum;
62433 +
62434 + u16_t txop[4];
62435 + u16_t cwmin[4];
62436 + u16_t cwmax[4];
62437 + u8_t strongRSSI;
62438 + u8_t rxStrongRSSI;
62439 +
62440 + u8_t slotType; //0->20us, 1=>9us
62441 +
62442 +#ifdef ZM_OTUS_RX_STREAM_MODE
62443 + u16_t usbRxRemainLen;
62444 + u16_t usbRxPktLen;
62445 + u16_t usbRxPadLen;
62446 + u16_t usbRxTransferLen;
62447 + zbuf_t *remainBuf;
62448 +#endif
62449 +
62450 + u8_t dot11Mode;
62451 +
62452 + u8_t ibssBcnEnabled;
62453 + u32_t ibssBcnInterval;
62454 +
62455 + // For re-issue the frequency change command
62456 + u32_t latestFrequency;
62457 + u8_t latestBw40;
62458 + u8_t latestExtOffset;
62459 + u8_t freqRetryCounter;
62460 +
62461 + u8_t recordFreqRetryCounter;
62462 + u8_t isSiteSurvey;
62463 + u8_t coldResetNeedFreq;
62464 +
62465 + u64_t camRollCallTable;
62466 + u8_t currentAckRtsTpc;
62467 +
62468 + /* #1 Save the initial value of the related RIFS register settings */
62469 + //u32_t isInitialPhy;
62470 + u32_t initDesiredSigSize;
62471 + u32_t initAGC;
62472 + u32_t initAgcControl;
62473 + u32_t initSearchStartDelay;
62474 + u32_t initRIFSSearchParams;
62475 + u32_t initFastChannelChangeControl;
62476 +
62477 + /* Dynamic SIFS for retransmission event */
62478 + u8_t retransmissionEvent;
62479 + u8_t latestSIFS;
62480 +};
62481 +
62482 +extern u32_t zfHpLoadEEPROMFromFW(zdev_t* dev);
62483 +
62484 +
62485 +typedef u8_t A_UINT8;
62486 +typedef s8_t A_INT8;
62487 +typedef u16_t A_UINT16;
62488 +typedef u32_t A_UINT32;
62489 +#define __ATTRIB_PACK
62490 +
62491 +#pragma pack (push, 1)
62492 +
62493 +#define AR5416_EEP_VER 0xE
62494 +#define AR5416_EEP_VER_MINOR_MASK 0xFFF
62495 +#define AR5416_EEP_NO_BACK_VER 0x1
62496 +#define AR5416_EEP_MINOR_VER_2 0x2 // Adds modal params txFrameToPaOn, txFrametoDataStart, ht40PowerInc
62497 +#define AR5416_EEP_MINOR_VER_3 0x3 // Adds modal params bswAtten, bswMargin, swSettle and base OpFlags for HT20/40 Disable
62498 +
62499 +// 16-bit offset location start of calibration struct
62500 +#define AR5416_EEP_START_LOC 256
62501 +#define AR5416_NUM_5G_CAL_PIERS 8
62502 +#define AR5416_NUM_2G_CAL_PIERS 4
62503 +#define AR5416_NUM_5G_20_TARGET_POWERS 8
62504 +#define AR5416_NUM_5G_40_TARGET_POWERS 8
62505 +#define AR5416_NUM_2G_CCK_TARGET_POWERS 3
62506 +#define AR5416_NUM_2G_20_TARGET_POWERS 4
62507 +#define AR5416_NUM_2G_40_TARGET_POWERS 4
62508 +#define AR5416_NUM_CTLS 24
62509 +#define AR5416_NUM_BAND_EDGES 8
62510 +#define AR5416_NUM_PD_GAINS 4
62511 +#define AR5416_PD_GAINS_IN_MASK 4
62512 +#define AR5416_PD_GAIN_ICEPTS 5
62513 +#define AR5416_EEPROM_MODAL_SPURS 5
62514 +#define AR5416_MAX_RATE_POWER 63
62515 +#define AR5416_NUM_PDADC_VALUES 128
62516 +#define AR5416_NUM_RATES 16
62517 +#define AR5416_BCHAN_UNUSED 0xFF
62518 +#define AR5416_MAX_PWR_RANGE_IN_HALF_DB 64
62519 +#define AR5416_OPFLAGS_11A 0x01
62520 +#define AR5416_OPFLAGS_11G 0x02
62521 +#define AR5416_OPFLAGS_5G_HT40 0x04
62522 +#define AR5416_OPFLAGS_2G_HT40 0x08
62523 +#define AR5416_OPFLAGS_5G_HT20 0x10
62524 +#define AR5416_OPFLAGS_2G_HT20 0x20
62525 +#define AR5416_EEPMISC_BIG_ENDIAN 0x01
62526 +#define FREQ2FBIN(x,y) ((y) ? ((x) - 2300) : (((x) - 4800) / 5))
62527 +#define AR5416_MAX_CHAINS 2
62528 +#define AR5416_ANT_16S 25
62529 +
62530 +#define AR5416_NUM_ANT_CHAIN_FIELDS 7
62531 +#define AR5416_NUM_ANT_COMMON_FIELDS 4
62532 +#define AR5416_SIZE_ANT_CHAIN_FIELD 3
62533 +#define AR5416_SIZE_ANT_COMMON_FIELD 4
62534 +#define AR5416_ANT_CHAIN_MASK 0x7
62535 +#define AR5416_ANT_COMMON_MASK 0xf
62536 +#define AR5416_CHAIN_0_IDX 0
62537 +#define AR5416_CHAIN_1_IDX 1
62538 +#define AR5416_CHAIN_2_IDX 2
62539 +
62540 +
62541 +/* Capabilities Enum */
62542 +typedef enum {
62543 + EEPCAP_COMPRESS_DIS = 0x0001,
62544 + EEPCAP_AES_DIS = 0x0002,
62545 + EEPCAP_FASTFRAME_DIS = 0x0004,
62546 + EEPCAP_BURST_DIS = 0x0008,
62547 + EEPCAP_MAXQCU_M = 0x01F0,
62548 + EEPCAP_MAXQCU_S = 4,
62549 + EEPCAP_HEAVY_CLIP_EN = 0x0200,
62550 + EEPCAP_KC_ENTRIES_M = 0xF000,
62551 + EEPCAP_KC_ENTRIES_S = 12,
62552 +} EEPROM_CAPABILITIES;
62553 +
62554 +typedef enum Ar5416_Rates {
62555 + rate6mb, rate9mb, rate12mb, rate18mb,
62556 + rate24mb, rate36mb, rate48mb, rate54mb,
62557 + rate1l, rate2l, rate2s, rate5_5l,
62558 + rate5_5s, rate11l, rate11s, rateXr,
62559 + rateHt20_0, rateHt20_1, rateHt20_2, rateHt20_3,
62560 + rateHt20_4, rateHt20_5, rateHt20_6, rateHt20_7,
62561 + rateHt40_0, rateHt40_1, rateHt40_2, rateHt40_3,
62562 + rateHt40_4, rateHt40_5, rateHt40_6, rateHt40_7,
62563 + rateDupCck, rateDupOfdm, rateExtCck, rateExtOfdm,
62564 + Ar5416RateSize
62565 +} AR5416_RATES;
62566 +
62567 +typedef struct eepFlags {
62568 + A_UINT8 opFlags;
62569 + A_UINT8 eepMisc;
62570 +} __ATTRIB_PACK EEP_FLAGS;
62571 +
62572 +#define AR5416_CHECKSUM_LOCATION (AR5416_EEP_START_LOC + 1)
62573 +typedef struct BaseEepHeader {
62574 + A_UINT16 length;
62575 + A_UINT16 checksum;
62576 + A_UINT16 version;
62577 + EEP_FLAGS opCapFlags;
62578 + A_UINT16 regDmn[2];
62579 + A_UINT8 macAddr[6];
62580 + A_UINT8 rxMask;
62581 + A_UINT8 txMask;
62582 + A_UINT16 rfSilent;
62583 + A_UINT16 blueToothOptions;
62584 + A_UINT16 deviceCap;
62585 + A_UINT32 binBuildNumber;
62586 + A_UINT8 deviceType;
62587 + A_UINT8 futureBase[33];
62588 +} __ATTRIB_PACK BASE_EEP_HEADER; // 64 B
62589 +
62590 +typedef struct spurChanStruct {
62591 + A_UINT16 spurChan;
62592 + A_UINT8 spurRangeLow;
62593 + A_UINT8 spurRangeHigh;
62594 +} __ATTRIB_PACK SPUR_CHAN;
62595 +
62596 +typedef struct ModalEepHeader {
62597 + A_UINT32 antCtrlChain[AR5416_MAX_CHAINS]; // 12
62598 + A_UINT32 antCtrlCommon; // 4
62599 + A_INT8 antennaGainCh[AR5416_MAX_CHAINS]; // 3
62600 + A_UINT8 switchSettling; // 1
62601 + A_UINT8 txRxAttenCh[AR5416_MAX_CHAINS]; // 3
62602 + A_UINT8 rxTxMarginCh[AR5416_MAX_CHAINS]; // 3
62603 + A_INT8 adcDesiredSize; // 1
62604 + A_INT8 pgaDesiredSize; // 1
62605 + A_UINT8 xlnaGainCh[AR5416_MAX_CHAINS]; // 3
62606 + A_UINT8 txEndToXpaOff; // 1
62607 + A_UINT8 txEndToRxOn; // 1
62608 + A_UINT8 txFrameToXpaOn; // 1
62609 + A_UINT8 thresh62; // 1
62610 + A_INT8 noiseFloorThreshCh[AR5416_MAX_CHAINS]; // 3
62611 + A_UINT8 xpdGain; // 1
62612 + A_UINT8 xpd; // 1
62613 + A_INT8 iqCalICh[AR5416_MAX_CHAINS]; // 1
62614 + A_INT8 iqCalQCh[AR5416_MAX_CHAINS]; // 1
62615 + A_UINT8 pdGainOverlap; // 1
62616 + A_UINT8 ob; // 1
62617 + A_UINT8 db; // 1
62618 + A_UINT8 xpaBiasLvl; // 1
62619 + A_UINT8 pwrDecreaseFor2Chain; // 1
62620 + A_UINT8 pwrDecreaseFor3Chain; // 1 -> 48 B
62621 + A_UINT8 txFrameToDataStart; // 1
62622 + A_UINT8 txFrameToPaOn; // 1
62623 + A_UINT8 ht40PowerIncForPdadc; // 1
62624 + A_UINT8 bswAtten[AR5416_MAX_CHAINS]; // 3
62625 + A_UINT8 bswMargin[AR5416_MAX_CHAINS]; // 3
62626 + A_UINT8 swSettleHt40; // 1
62627 + A_UINT8 futureModal[22]; //
62628 + SPUR_CHAN spurChans[AR5416_EEPROM_MODAL_SPURS]; // 20 B
62629 +} __ATTRIB_PACK MODAL_EEP_HEADER; // == 100 B
62630 +
62631 +typedef struct calDataPerFreq {
62632 + A_UINT8 pwrPdg[AR5416_NUM_PD_GAINS][AR5416_PD_GAIN_ICEPTS];
62633 + A_UINT8 vpdPdg[AR5416_NUM_PD_GAINS][AR5416_PD_GAIN_ICEPTS];
62634 +} __ATTRIB_PACK CAL_DATA_PER_FREQ;
62635 +
62636 +typedef struct CalTargetPowerLegacy {
62637 + A_UINT8 bChannel;
62638 + A_UINT8 tPow2x[4];
62639 +} __ATTRIB_PACK CAL_TARGET_POWER_LEG;
62640 +
62641 +typedef struct CalTargetPowerHt {
62642 + A_UINT8 bChannel;
62643 + A_UINT8 tPow2x[8];
62644 +} __ATTRIB_PACK CAL_TARGET_POWER_HT;
62645 +
62646 +#if defined(ARCH_BIG_ENDIAN) || defined(BIG_ENDIAN)
62647 +typedef struct CalCtlEdges {
62648 + A_UINT8 bChannel;
62649 + A_UINT8 flag :2,
62650 + tPower :6;
62651 +} __ATTRIB_PACK CAL_CTL_EDGES;
62652 +#else
62653 +typedef struct CalCtlEdges {
62654 + A_UINT8 bChannel;
62655 + A_UINT8 tPower :6,
62656 + flag :2;
62657 +} __ATTRIB_PACK CAL_CTL_EDGES;
62658 +#endif
62659 +
62660 +typedef struct CalCtlData {
62661 + CAL_CTL_EDGES ctlEdges[AR5416_MAX_CHAINS][AR5416_NUM_BAND_EDGES];
62662 +} __ATTRIB_PACK CAL_CTL_DATA;
62663 +
62664 +typedef struct ar5416Eeprom {
62665 + BASE_EEP_HEADER baseEepHeader; // 64 B
62666 + A_UINT8 custData[64]; // 64 B
62667 + MODAL_EEP_HEADER modalHeader[2]; // 200 B
62668 + A_UINT8 calFreqPier5G[AR5416_NUM_5G_CAL_PIERS];
62669 + A_UINT8 calFreqPier2G[AR5416_NUM_2G_CAL_PIERS];
62670 + CAL_DATA_PER_FREQ calPierData5G[AR5416_MAX_CHAINS][AR5416_NUM_5G_CAL_PIERS];
62671 + CAL_DATA_PER_FREQ calPierData2G[AR5416_MAX_CHAINS][AR5416_NUM_2G_CAL_PIERS];
62672 + CAL_TARGET_POWER_LEG calTargetPower5G[AR5416_NUM_5G_20_TARGET_POWERS];
62673 + CAL_TARGET_POWER_HT calTargetPower5GHT20[AR5416_NUM_5G_20_TARGET_POWERS];
62674 + CAL_TARGET_POWER_HT calTargetPower5GHT40[AR5416_NUM_5G_40_TARGET_POWERS];
62675 + CAL_TARGET_POWER_LEG calTargetPowerCck[AR5416_NUM_2G_CCK_TARGET_POWERS];
62676 + CAL_TARGET_POWER_LEG calTargetPower2G[AR5416_NUM_2G_20_TARGET_POWERS];
62677 + CAL_TARGET_POWER_HT calTargetPower2GHT20[AR5416_NUM_2G_20_TARGET_POWERS];
62678 + CAL_TARGET_POWER_HT calTargetPower2GHT40[AR5416_NUM_2G_40_TARGET_POWERS];
62679 + A_UINT8 ctlIndex[AR5416_NUM_CTLS];
62680 + CAL_CTL_DATA ctlData[AR5416_NUM_CTLS];
62681 + A_UINT8 padding;
62682 +} __ATTRIB_PACK AR5416_EEPROM;
62683 +
62684 +#pragma pack (pop)
62685 +
62686 +typedef enum ConformanceTestLimits {
62687 + FCC = 0x10,
62688 + MKK = 0x40,
62689 + ETSI = 0x30,
62690 + SD_NO_CTL = 0xE0,
62691 + NO_CTL = 0xFF,
62692 + CTL_MODE_M = 0xF,
62693 + CTL_11A = 0,
62694 + CTL_11B = 1,
62695 + CTL_11G = 2,
62696 + CTL_TURBO = 3,
62697 + CTL_108G = 4,
62698 + CTL_2GHT20 = 5,
62699 + CTL_5GHT20 = 6,
62700 + CTL_2GHT40 = 7,
62701 + CTL_5GHT40 = 8,
62702 +} ATH_CTLS;
62703 +
62704 +#endif /* #ifndef _HPUSB_H */
62705 --- /dev/null
62706 +++ b/drivers/staging/otus/hal/otus.ini
62707 @@ -0,0 +1,414 @@
62708 +/* 8602 : update mismatch register between NDIS and ART */
62709 +static const u32_t ar5416Modes[][6] = {
62710 +/* Register A-20 A-20/40 G-20/40 G-20 G-Turbo */
62711 + {0x9800, 0x00000007, 0x00000007, 0x00000007, 0x00000007, 0},
62712 + {0x9804, 0x00000300, 0x000003c4, 0x000003c4, 0x00000300, 0},
62713 + {0x9808, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62714 + {0x980c, 0xad848e19, 0xad848e19, 0xad848e19, 0xad848e19, 0},
62715 + {0x9810, 0x7d14e000, 0x7d14e000, 0x7d14e000, 0x7d14e000, 0},
62716 + {0x9814, 0x9c0a9f6b, 0x9c0a9f6b, 0x9c0a9f6b, 0x9c0a9f6b, 0},
62717 + {0x9818, 0x00000090, 0x00000090, 0x00000090, 0x00000090, 0},
62718 + {0x981c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62719 + {0x9820, 0x02020200, 0x02020200, 0x02020200, 0x02020200, 0},
62720 + {0x9824, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0},
62721 + {0x9828, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001, 0},
62722 + {0x982c, 0x0000a000, 0x0000a000, 0x0000a000, 0x0000a000, 0},
62723 + {0x9830, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62724 + {0x9834, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0},
62725 + {0x9838, 0x00000007, 0x00000007, 0x00000007, 0x00000007, 0},
62726 + {0x983c, 0x00200400, 0x00200400, 0x00200400, 0x00200400, 0},
62727 + {0x9840, 0x206a002e, 0x206a002e, 0x206a002e, 0x206a002e, 0},
62728 + {0x9844, 0x1372161e, 0x13721c1e, 0x13721c24, 0x137216a4, 0},
62729 + {0x9848, 0x001a6a65, 0x001a6a65, 0x00197a68, 0x00197a68, 0},
62730 + {0x984c, 0x1284233c, 0x1284233c, 0x1284233c, 0x1284233c, 0},
62731 + {0x9850, 0x6c48b4e4, 0x6c48b4e4, 0x6c48b0e4, 0x6c48b0e4, 0},
62732 + {0x9854, 0x00000859, 0x00000859, 0x00000859, 0x00000859, 0},
62733 + {0x9858, 0x7ec80d2e, 0x7ec80d2e, 0x7ec80d2e, 0x7ec80d2e, 0},
62734 + {0x985c, 0x31395c5e, 0x31395c5e, 0x31395c5e, 0x31395c5e, 0},
62735 + {0x9860, 0x0004dd10, 0x0004dd10, 0x0004dd20, 0x0004dd20, 0},
62736 + {0x9868, 0x409a4190, 0x409a4190, 0x409a4190, 0x409a4190, 0},
62737 + {0x986c, 0x050cb081, 0x050cb081, 0x050cb081, 0x050cb081, 0},
62738 + {0x9900, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62739 + {0x9904, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62740 + {0x9908, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62741 + {0x990c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62742 + {0x9914, 0x000007d0, 0x000007d0, 0x00000898, 0x00000898, 0},
62743 + {0x9918, 0x00000118, 0x00000230, 0x00000268, 0x00000134, 0},
62744 + {0x991c, 0x10000fff, 0x10000fff, 0x10000fff, 0x10000fff, 0},
62745 + {0x9920, 0x0510081c, 0x0510081c, 0x0510001c, 0x0510001c, 0},
62746 + {0x9924, 0xd0058a15, 0xd0058a15, 0xd0058a15, 0xd0058a15, 0},
62747 + {0x9928, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0},
62748 + {0x992c, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0},
62749 + {0x9934, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0},
62750 + {0x9938, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0},
62751 + {0x993c, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0},
62752 + {0x9944, 0xdfb81020, 0xdfb81020, 0xdfb81020, 0xdfb81020, 0},
62753 + {0x9948, 0x9280b212, 0x9280b212, 0x9280b212, 0x9280b212, 0},
62754 + {0x994c, 0x00020028, 0x00020028, 0x00020028, 0x00020028, 0},
62755 + {0x9954, 0x5d50e188, 0x5d50e188, 0x5d50e188, 0x5d50e188, 0},
62756 + {0x9958, 0x00081fff, 0x00081fff, 0x00081fff, 0x00081fff, 0},
62757 + {0x9960, 0x00009b40, 0x00009b40, 0x00009b40, 0x00009b40, 0},
62758 + {0x9964, 0x00001120, 0x00001120, 0x00001120, 0x00001120, 0},
62759 + {0x9970, 0x190fb515, 0x190fb515, 0x190fb515, 0x190fb515, 0},
62760 + {0x9974, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62761 + {0x9978, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0},
62762 + {0x997c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62763 + {0x9980, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62764 + {0x9984, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62765 + {0x9988, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62766 + {0x998c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62767 + {0x9990, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62768 + {0x9994, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62769 + {0x9998, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62770 + {0x999c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62771 + {0x99a0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62772 + {0x99a4, 0x00000007, 0x00000007, 0x00000007, 0x00000007, 0},
62773 + {0x99a8, 0x001fff00, 0x001fff00, 0x001fff00, 0x001fff00, 0},
62774 + {0x99ac, 0x006f00c4, 0x006f00c4, 0x006f00c4, 0x006f00c4, 0},
62775 + {0x99b0, 0x03051000, 0x03051000, 0x03051000, 0x03051000, 0},
62776 + {0x99b4, 0x00000820, 0x00000820, 0x00000820, 0x00000820, 0},
62777 + {0x99c0, 0x038919be, 0x038919be, 0x038919be, 0x038919be, 0},
62778 + {0x99c4, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77, 0},
62779 + {0x99c8, 0x60f6532c, 0x60f6532c, 0x60f6532c, 0x60f6532c, 0},
62780 + {0x99cc, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0},
62781 + {0x99d0, 0x00046384, 0x00046384, 0x00046384, 0x00046384, 0},
62782 + {0x99d4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62783 + {0x99d8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62784 + {0x99dc, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62785 + {0x99e0, 0x00000200, 0x00000200, 0x00000200, 0x00000200, 0},
62786 + {0x99e4, 0x64646464, 0x64646464, 0x64646464, 0x64646464, 0},
62787 + {0x99e8, 0x3c787878, 0x3c787878, 0x3c787878, 0x3c787878, 0},
62788 + {0x99ec, 0x000000aa, 0x000000aa, 0x000000aa, 0x000000aa, 0},
62789 + {0x99f0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62790 + {0x99fc, 0x00001042, 0x00001042, 0x00001042, 0x00001042, 0},
62791 + {0x9a00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62792 + {0x9a04, 0x00000040, 0x00000040, 0x00000040, 0x00000040, 0},
62793 + {0x9a08, 0x00000080, 0x00000080, 0x00000080, 0x00000080, 0},
62794 + {0x9a0c, 0x000001a1, 0x000001a1, 0x00000141, 0x00000141, 0},
62795 + {0x9a10, 0x000001e1, 0x000001e1, 0x00000181, 0x00000181, 0},
62796 + {0x9a14, 0x00000021, 0x00000021, 0x000001c1, 0x000001c1, 0},
62797 + {0x9a18, 0x00000061, 0x00000061, 0x00000001, 0x00000001, 0},
62798 + {0x9a1c, 0x00000168, 0x00000168, 0x00000041, 0x00000041, 0},
62799 + {0x9a20, 0x000001a8, 0x000001a8, 0x000001a8, 0x000001a8, 0},
62800 + {0x9a24, 0x000001e8, 0x000001e8, 0x000001e8, 0x000001e8, 0},
62801 + {0x9a28, 0x00000028, 0x00000028, 0x00000028, 0x00000028, 0},
62802 + {0x9a2c, 0x00000068, 0x00000068, 0x00000068, 0x00000068, 0},
62803 + {0x9a30, 0x00000189, 0x00000189, 0x000000a8, 0x000000a8, 0},
62804 + {0x9a34, 0x000001c9, 0x000001c9, 0x00000169, 0x00000169, 0},
62805 + {0x9a38, 0x00000009, 0x00000009, 0x000001a9, 0x000001a9, 0},
62806 + {0x9a3c, 0x00000049, 0x00000049, 0x000001e9, 0x000001e9, 0},
62807 + {0x9a40, 0x00000089, 0x00000089, 0x00000029, 0x00000029, 0},
62808 + {0x9a44, 0x00000170, 0x00000170, 0x00000069, 0x00000069, 0},
62809 + {0x9a48, 0x000001b0, 0x000001b0, 0x00000190, 0x00000190, 0},
62810 + {0x9a4c, 0x000001f0, 0x000001f0, 0x000001d0, 0x000001d0, 0},
62811 + {0x9a50, 0x00000030, 0x00000030, 0x00000010, 0x00000010, 0},
62812 + {0x9a54, 0x00000070, 0x00000070, 0x00000050, 0x00000050, 0},
62813 + {0x9a58, 0x00000191, 0x00000191, 0x00000090, 0x00000090, 0},
62814 + {0x9a5c, 0x000001d1, 0x000001d1, 0x00000151, 0x00000151, 0},
62815 + {0x9a60, 0x00000011, 0x00000011, 0x00000191, 0x00000191, 0},
62816 + {0x9a64, 0x00000051, 0x00000051, 0x000001d1, 0x000001d1, 0},
62817 + {0x9a68, 0x00000091, 0x00000091, 0x00000011, 0x00000011, 0},
62818 + {0x9a6c, 0x000001b8, 0x000001b8, 0x00000051, 0x00000051, 0},
62819 + {0x9a70, 0x000001f8, 0x000001f8, 0x00000198, 0x00000198, 0},
62820 + {0x9a74, 0x00000038, 0x00000038, 0x000001d8, 0x000001d8, 0},
62821 + {0x9a78, 0x00000078, 0x00000078, 0x00000018, 0x00000018, 0},
62822 + {0x9a7c, 0x00000199, 0x00000199, 0x00000058, 0x00000058, 0},
62823 + {0x9a80, 0x000001d9, 0x000001d9, 0x00000098, 0x00000098, 0},
62824 + {0x9a84, 0x00000019, 0x00000019, 0x00000159, 0x00000159, 0},
62825 + {0x9a88, 0x00000059, 0x00000059, 0x00000199, 0x00000199, 0},
62826 + {0x9a8c, 0x00000099, 0x00000099, 0x000001d9, 0x000001d9, 0},
62827 + {0x9a90, 0x000000d9, 0x000000d9, 0x00000019, 0x00000019, 0},
62828 + {0x9a94, 0x000000f9, 0x000000f9, 0x00000059, 0x00000059, 0},
62829 + {0x9a98, 0x000000f9, 0x000000f9, 0x00000099, 0x00000099, 0},
62830 + {0x9a9c, 0x000000f9, 0x000000f9, 0x000000d9, 0x000000d9, 0},
62831 + {0x9aa0, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62832 + {0x9aa4, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62833 + {0x9aa8, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62834 + {0x9aac, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62835 + {0x9ab0, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62836 + {0x9ab4, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62837 + {0x9ab8, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62838 + {0x9abc, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62839 + {0x9ac0, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62840 + {0x9ac4, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62841 + {0x9ac8, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62842 + {0x9acc, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62843 + {0x9ad0, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62844 + {0x9ad4, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62845 + {0x9ad8, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62846 + {0x9adc, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62847 + {0x9ae0, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62848 + {0x9ae4, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62849 + {0x9ae8, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62850 + {0x9aec, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62851 + {0x9af0, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62852 + {0x9af4, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62853 + {0x9af8, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62854 + {0x9afc, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
62855 + {0x9b00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62856 + {0x9b04, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0},
62857 + {0x9b08, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0},
62858 + {0x9b0c, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0},
62859 + {0x9b10, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0},
62860 + {0x9b14, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0},
62861 + {0x9b18, 0x00000008, 0x00000008, 0x00000008, 0x00000008, 0},
62862 + {0x9b1c, 0x00000009, 0x00000009, 0x00000009, 0x00000009, 0},
62863 + {0x9b20, 0x0000000a, 0x0000000a, 0x0000000a, 0x0000000a, 0},
62864 + {0x9b24, 0x0000000b, 0x0000000b, 0x0000000b, 0x0000000b, 0},
62865 + {0x9b28, 0x0000000c, 0x0000000c, 0x0000000c, 0x0000000c, 0},
62866 + {0x9b2c, 0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d, 0},
62867 + {0x9b30, 0x00000010, 0x00000010, 0x00000010, 0x00000010, 0},
62868 + {0x9b34, 0x00000011, 0x00000011, 0x00000011, 0x00000011, 0},
62869 + {0x9b38, 0x00000012, 0x00000012, 0x00000012, 0x00000012, 0},
62870 + {0x9b3c, 0x00000013, 0x00000013, 0x00000013, 0x00000013, 0},
62871 + {0x9b40, 0x00000014, 0x00000014, 0x00000014, 0x00000014, 0},
62872 + {0x9b44, 0x00000015, 0x00000015, 0x00000015, 0x00000015, 0},
62873 + {0x9b48, 0x00000018, 0x00000018, 0x00000018, 0x00000018, 0},
62874 + {0x9b4c, 0x00000019, 0x00000019, 0x00000019, 0x00000019, 0},
62875 + {0x9b50, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a, 0},
62876 + {0x9b54, 0x0000001b, 0x0000001b, 0x0000001b, 0x0000001b, 0},
62877 + {0x9b58, 0x0000001c, 0x0000001c, 0x0000001c, 0x0000001c, 0},
62878 + {0x9b5c, 0x0000001d, 0x0000001d, 0x0000001d, 0x0000001d, 0},
62879 + {0x9b60, 0x00000020, 0x00000020, 0x00000020, 0x00000020, 0},
62880 + {0x9b64, 0x00000021, 0x00000021, 0x00000021, 0x00000021, 0},
62881 + {0x9b68, 0x00000022, 0x00000022, 0x00000022, 0x00000022, 0},
62882 + {0x9b6c, 0x00000023, 0x00000023, 0x00000023, 0x00000023, 0},
62883 + {0x9b70, 0x00000024, 0x00000024, 0x00000024, 0x00000024, 0},
62884 + {0x9b74, 0x00000025, 0x00000025, 0x00000025, 0x00000025, 0},
62885 + {0x9b78, 0x00000028, 0x00000028, 0x00000028, 0x00000028, 0},
62886 + {0x9b7c, 0x00000029, 0x00000029, 0x00000029, 0x00000029, 0},
62887 + {0x9b80, 0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a, 0},
62888 + {0x9b84, 0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b, 0},
62889 + {0x9b88, 0x0000002c, 0x0000002c, 0x0000002c, 0x0000002c, 0},
62890 + {0x9b8c, 0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d, 0},
62891 + {0x9b90, 0x00000030, 0x00000030, 0x00000030, 0x00000030, 0},
62892 + {0x9b94, 0x00000031, 0x00000031, 0x00000031, 0x00000031, 0},
62893 + {0x9b98, 0x00000032, 0x00000032, 0x00000032, 0x00000032, 0},
62894 + {0x9b9c, 0x00000033, 0x00000033, 0x00000033, 0x00000033, 0},
62895 + {0x9ba0, 0x00000034, 0x00000034, 0x00000034, 0x00000034, 0},
62896 + {0x9ba4, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
62897 + {0x9ba8, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
62898 + {0x9bac, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
62899 + {0x9bb0, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
62900 + {0x9bb4, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
62901 + {0x9bb8, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
62902 + {0x9bbc, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
62903 + {0x9bc0, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
62904 + {0x9bc4, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
62905 + {0x9bc8, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
62906 + {0x9bcc, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
62907 + {0x9bd0, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
62908 + {0x9bd4, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
62909 + {0x9bd8, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
62910 + {0x9bdc, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
62911 + {0x9be0, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
62912 + {0x9be4, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
62913 + {0x9be8, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
62914 + {0x9bec, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
62915 + {0x9bf0, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
62916 + {0x9bf4, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
62917 + {0x9bf8, 0x00000010, 0x00000010, 0x00000010, 0x00000010, 0},
62918 + {0x9bfc, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a, 0},
62919 + {0x9c00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62920 + {0x9c0c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62921 + {0x9c10, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62922 + {0x9c14, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62923 + {0x9c18, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62924 + {0x9c1c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62925 + {0x9c20, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62926 + {0x9c24, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62927 + {0x9c28, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62928 + {0x9c2c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62929 + {0x9c30, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62930 + {0x9c34, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62931 + {0x9c38, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62932 + {0x9c3c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62933 + {0x9cf0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62934 + {0x9cf4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62935 + {0x9cf8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62936 + {0x9cfc, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62937 + {0xa200, 0x00000008, 0x00000008, 0x0000000e, 0x0000000e, 0},
62938 + {0xa204, 0x00000440, 0x00000440, 0x00000440, 0x00000440, 0},
62939 + {0xa208, 0xd6be4788, 0xd6be4788, 0xd03e4788, 0xd03e4788, 0},
62940 + {0xa20c, 0x012e8160, 0x012e8160, 0x012a8160, 0x012a8160, 0},
62941 + {0xa210, 0x40806333, 0x40806333, 0x40806333, 0x40806333, 0},
62942 + {0xa214, 0x00106c10, 0x00106c10, 0x00106c10, 0x00106c10, 0},
62943 + {0xa218, 0x009c4060, 0x009c4060, 0x009c4060, 0x009c4060, 0},
62944 + {0xa21c, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a, 0},
62945 + {0xa220, 0x018830c6, 0x018830c6, 0x018830c6, 0x018830c6, 0},
62946 + {0xa224, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0},
62947 + {0xa228, 0x000009b5, 0x000009b5, 0x000009b5, 0x000009b5, 0},
62948 + {0xa22c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62949 + {0xa230, 0x00000108, 0x00000210, 0x00000210, 0x00000108, 0},
62950 + {0xa234, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0},
62951 + {0xa238, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0},
62952 + {0xa23c, 0x13c889af, 0x13c889af, 0x13c889af, 0x13c889af, 0},
62953 + {0xa240, 0x38490a20, 0x38490a20, 0x38490a20, 0x38490a20, 0},
62954 + {0xa244, 0x00007bb6, 0x00007bb6, 0x00007bb6, 0x00007bb6, 0},
62955 + {0xa248, 0x0fff3ffc, 0x0fff3ffc, 0x0fff3ffc, 0x0fff3ffc, 0},
62956 + {0xa24c, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0},
62957 + {0xa250, 0x0000a000, 0x0000a000, 0x0000a000, 0x0000a000, 0},
62958 + {0xa254, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62959 + {0xa258, 0x0cc75380, 0x0cc75380, 0x0cc75380, 0x0cc75380, 0},
62960 + {0xa25c, 0x0f0f0f01, 0x0f0f0f01, 0x0f0f0f01, 0x0f0f0f01, 0},
62961 + {0xa260, 0xdfa91f01, 0xdfa91f01, 0xdfa91f01, 0xdfa91f01, 0},
62962 + {0xa264, 0x00418a11, 0x00418a11, 0x00418a11, 0x00418a11, 0},
62963 + {0xa268, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62964 + {0xa26c, 0x09249126, 0x09249126, 0x09249126, 0x09249126, 0},
62965 + {0xa274, 0x0a1a9caa, 0x0a1a9caa, 0x0a1a7caa, 0x0a1a7caa, 0},
62966 + {0xa278, 0x1ce739ce, 0x1ce739ce, 0x1ce739ce, 0x1ce739ce, 0},
62967 + {0xa27c, 0x051701ce, 0x051701ce, 0x051701ce, 0x051701ce, 0},
62968 + {0xa300, 0x18010000, 0x18010000, 0x18010000, 0x18010000, 0},
62969 + {0xa304, 0x30032602, 0x30032602, 0x2e032402, 0x2e032402, 0},
62970 + {0xa308, 0x48073e06, 0x48073e06, 0x4a0a3c06, 0x4a0a3c06, 0},
62971 + {0xa30c, 0x560b4c0a, 0x560b4c0a, 0x621a540b, 0x621a540b, 0},
62972 + {0xa310, 0x641a600f, 0x641a600f, 0x764f6c1b, 0x764f6c1b, 0},
62973 + {0xa314, 0x7a4f6e1b, 0x7a4f6e1b, 0x845b7a5a, 0x845b7a5a, 0},
62974 + {0xa318, 0x8c5b7e5a, 0x8c5b7e5a, 0x950f8ccf, 0x950f8ccf, 0},
62975 + {0xa31c, 0x9d0f96cf, 0x9d0f96cf, 0xa5cf9b4f, 0xa5cf9b4f, 0},
62976 + {0xa320, 0xb51fa69f, 0xb51fa69f, 0xbddfaf1f, 0xbddfaf1f, 0},
62977 + {0xa324, 0xcb3fbd07, 0xcb3fbcbf, 0xd1ffc93f, 0xd1ffc93f, 0},
62978 + {0xa328, 0x0000d7bf, 0x0000d7bf, 0x00000000, 0x00000000, 0},
62979 + {0xa32c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62980 + {0xa330, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62981 + {0xa334, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62982 + {0xa338, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62983 + {0xa33c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62984 + {0xa340, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62985 + {0xa344, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62986 + {0xa348, 0x3fffffff, 0x3fffffff, 0x3fffffff, 0x3fffffff, 0},
62987 + {0xa34c, 0x3fffffff, 0x3fffffff, 0x3fffffff, 0x3fffffff, 0},
62988 + {0xa350, 0x3fffffff, 0x3fffffff, 0x3fffffff, 0x3fffffff, 0},
62989 + {0xa354, 0x0003ffff, 0x0003ffff, 0x0003ffff, 0x0003ffff, 0},
62990 + {0xa358, 0x79a8aa1f, 0x79a8aa1f, 0x79a8aa1f, 0x79a8aa1f, 0},
62991 + {0xa388, 0x08000000, 0x08000000, 0x08000000, 0x08000000, 0},
62992 + {0xa38c, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0},
62993 + {0xa390, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0},
62994 + {0xa394, 0x1ce739ce, 0x1ce739ce, 0x1ce739ce, 0x1ce739ce, 0},
62995 + {0xa398, 0x000001ce, 0x000001ce, 0x000001ce, 0x000001ce, 0},
62996 + {0xa39c, 0x00000007, 0x00000007, 0x00000007, 0x00000007, 0},
62997 + {0xa3a0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62998 + {0xa3a4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
62999 + {0xa3a8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
63000 + {0xa3ac, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
63001 + {0xa3b0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
63002 + {0xa3b4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
63003 + {0xa3b8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
63004 + {0xa3bc, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
63005 + {0xa3c0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
63006 + {0xa3c4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
63007 + {0xa3c8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
63008 + {0xa3cc, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0},
63009 + {0xa3d0, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0},
63010 + {0xa3d4, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0},
63011 + {0xa3d8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
63012 + {0xa3dc, 0x1ce739ce, 0x1ce739ce, 0x1ce739ce, 0x1ce739ce, 0},
63013 + {0xa3e0, 0x000000c0, 0x000000c0, 0x000000c0, 0x000000c0, 0},
63014 + {0xa848, 0x00180a65, 0x00180a65, 0x00180a68, 0x00180a68, 0},
63015 + {0xa920, 0x0510001c, 0x0510001c, 0x0510001c, 0x0510001c, 0},
63016 + {0xa960, 0x00009b40, 0x00009b40, 0x00009b40, 0x00009b40, 0},
63017 + {0xb20c, 0x012e8160, 0x012e8160, 0x012a8160, 0x012a8160, 0},
63018 + {0xb26c, 0x09249126, 0x09249126, 0x09249126, 0x09249126, 0},
63019 + {0xb848, 0x00180a65, 0x00180a65, 0x00180a68, 0x00180a68, 0},
63020 + {0xb920, 0x0510001c, 0x0510001c, 0x0510001c, 0x0510001c, 0},
63021 + {0xb960, 0x00009b40, 0x00009b40, 0x00009b40, 0x00009b40, 0},
63022 + {0xc20c, 0x012e8160, 0x012e8160, 0x012a8160, 0x012a8160, 0},
63023 + {0xc26c, 0x09249126, 0x09249126, 0x09249126, 0x09249126, 0},
63024 + //{0xc864, 0x0001ce00, 0x0001ce00, 0x0001ce00, 0x0001ce00, 0},
63025 + {0xc864, 0x0001c600, 0x0001c600, 0x0001c600, 0x0001c600, 0},
63026 + {0xc95c, 0x004b6a8e, 0x004b6a8e, 0x004b6a8e, 0x004b6a8e, 0},
63027 + {0xc968, 0x000003ce, 0x000003ce, 0x000003ce, 0x000003ce, 0},
63028 + {0xc9bc, 0x00181400, 0x00181400, 0x00181400, 0x00181400, 0},
63029 + {0xd270, 0x00820820, 0x00820820, 0x00820820, 0x00820820, 0},
63030 + {0xd35c, 0x066c420f, 0x066c420f, 0x066c420f, 0x066c420f, 0},
63031 + {0xd360, 0x0f282207, 0x0f282207, 0x0f282207, 0x0f282207, 0},
63032 + {0xd364, 0x17601685, 0x17601685, 0x17601685, 0x17601685, 0},
63033 + {0xd368, 0x1f801104, 0x1f801104, 0x1f801104, 0x1f801104, 0},
63034 + {0xd36c, 0x37a00c03, 0x37a00c03, 0x37a00c03, 0x37a00c03, 0},
63035 + {0xd370, 0x3fc40883, 0x3fc40883, 0x3fc40883, 0x3fc40883, 0},
63036 + {0xd374, 0x57c00803, 0x57c00803, 0x57c00803, 0x57c00803, 0},
63037 + {0xd378, 0x5fd80682, 0x5fd80682, 0x5fd80682, 0x5fd80682, 0},
63038 + {0xd37c, 0x7fe00482, 0x7fe00482, 0x7fe00482, 0x7fe00482, 0},
63039 + {0xd380, 0x7f3c7bba, 0x7f3c7bba, 0x7f3c7bba, 0x7f3c7bba, 0},
63040 + {0xd384, 0xf3307ff0, 0xf3307ff0, 0xf3307ff0, 0xf3307ff0, 0}
63041 +};
63042 +
63043 +
63044 +static const u32_t otusBank[][3] = {
63045 + //# bank 0
63046 + {0x98b0, 0x1e5795e5, 0x1e5795e5},
63047 + {0x98e0, 0x02008020, 0x02008020},
63048 + //# bank 1
63049 + {0x98b0, 0x02108421, 0x02108421},
63050 + {0x98ec, 0x00000008, 0x00000008},
63051 + //# bank 2
63052 + {0x98b0, 0x0e73ff17, 0x0e73ff17},
63053 + {0x98e0, 0x00000420, 0x00000420},
63054 + //# bank 3
63055 + {0x98f0, 0x01400018, 0x01c00018},
63056 + //# bank 4
63057 + {0x98b0, 0x000001a1, 0x000001a1},
63058 + {0x98e8, 0x00000001, 0x00000001},
63059 + //# bank 5
63060 + {0x98b0, 0x00000013, 0x00000013},
63061 + {0x98e4, 0x00000002, 0x00000002},
63062 + //# bank 6
63063 + {0x98b0, 0x00000000, 0x00000000},
63064 + {0x98b0, 0x00000000, 0x00000000},
63065 + {0x98b0, 0x00000000, 0x00000000},
63066 + {0x98b0, 0x00000000, 0x00000000},
63067 + {0x98b0, 0x00000000, 0x00000000},
63068 + {0x98b0, 0x00004000, 0x00004000},
63069 + {0x98b0, 0x00006c00, 0x00006c00},
63070 + {0x98b0, 0x00002c00, 0x00002c00},
63071 + {0x98b0, 0x00004800, 0x00004800},
63072 + {0x98b0, 0x00004000, 0x00004000},
63073 + {0x98b0, 0x00006000, 0x00006000},
63074 + {0x98b0, 0x00001000, 0x00001000},
63075 + {0x98b0, 0x00004000, 0x00004000},
63076 + {0x98b0, 0x00007c00, 0x00007c00},
63077 + {0x98b0, 0x00007c00, 0x00007c00},
63078 + {0x98b0, 0x00007c00, 0x00007c00},
63079 + {0x98b0, 0x00007c00, 0x00007c00},
63080 + {0x98b0, 0x00007c00, 0x00007c00},
63081 + {0x98b0, 0x00087c00, 0x00087c00},
63082 + {0x98b0, 0x00007c00, 0x00007c00},
63083 + {0x98b0, 0x00005400, 0x00005400},
63084 + {0x98b0, 0x00000c00, 0x00000c00},
63085 + {0x98b0, 0x00001800, 0x00001800},
63086 + {0x98b0, 0x00007c00, 0x00007c00},
63087 + {0x98b0, 0x00006c00, 0x00006c00},
63088 + {0x98b0, 0x00006c00, 0x00006c00},
63089 + {0x98b0, 0x00007c00, 0x00007c00},
63090 + {0x98b0, 0x00002c00, 0x00002c00},
63091 + {0x98b0, 0x00003c00, 0x00003c00},
63092 + {0x98b0, 0x00003800, 0x00003800},
63093 + {0x98b0, 0x00001c00, 0x00001c00},
63094 + {0x98b0, 0x00000800, 0x00000800},
63095 + {0x98b0, 0x00000408, 0x00000408},
63096 + {0x98b0, 0x00004c15, 0x00004c15},
63097 + {0x98b0, 0x00004188, 0x00004188},
63098 + {0x98b0, 0x0000201e, 0x0000201e},
63099 + {0x98b0, 0x00010408, 0x00010408},
63100 + {0x98b0, 0x00000801, 0x00000801},
63101 + {0x98b0, 0x00000c08, 0x00000c08},
63102 + {0x98b0, 0x0000181e, 0x0000181e},
63103 + {0x98b0, 0x00001016, 0x00001016},
63104 + {0x98b0, 0x00002800, 0x00002800},
63105 + {0x98b0, 0x00004010, 0x00004010},
63106 + {0x98b0, 0x0000081c, 0x0000081c},
63107 + {0x98b0, 0x00000115, 0x00000115},
63108 + {0x98b0, 0x00000015, 0x00000015},
63109 + {0x98b0, 0x00000066, 0x00000066},
63110 + {0x98b0, 0x0000001c, 0x0000001c},
63111 + {0x98b0, 0x00000000, 0x00000000},
63112 + {0x98b0, 0x00000004, 0x00000004},
63113 + {0x98b0, 0x00000015, 0x00000015},
63114 + {0x98b0, 0x0000001f, 0x0000001f},
63115 + {0x98e0, 0x00000000, 0x00000400},
63116 + //# bank 7
63117 + {0x98b0, 0x000000a0, 0x000000a0},
63118 + {0x98b0, 0x00000000, 0x00000000},
63119 + {0x98b0, 0x00000040, 0x00000040},
63120 + {0x98f0, 0x0000001c, 0x0000001c}
63121 +};
63122 --- /dev/null
63123 +++ b/drivers/staging/otus/ioctl.c
63124 @@ -0,0 +1,2936 @@
63125 +/*
63126 + * Copyright (c) 2007-2008 Atheros Communications Inc.
63127 + *
63128 + * Permission to use, copy, modify, and/or distribute this software for any
63129 + * purpose with or without fee is hereby granted, provided that the above
63130 + * copyright notice and this permission notice appear in all copies.
63131 + *
63132 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
63133 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
63134 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
63135 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
63136 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
63137 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
63138 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
63139 + */
63140 +/* */
63141 +/* Module Name : ioctl.c */
63142 +/* */
63143 +/* Abstract */
63144 +/* This module contains Linux wireless extension related functons. */
63145 +/* */
63146 +/* NOTES */
63147 +/* Platform dependent. */
63148 +/* */
63149 +/************************************************************************/
63150 +#include <linux/module.h>
63151 +#include <linux/if_arp.h>
63152 +#include <asm/uaccess.h>
63153 +
63154 +#include "usbdrv.h"
63155 +
63156 +#define ZD_IOCTL_WPA (SIOCDEVPRIVATE + 1)
63157 +#define ZD_IOCTL_PARAM (SIOCDEVPRIVATE + 2)
63158 +#define ZD_IOCTL_GETWPAIE (SIOCDEVPRIVATE + 3)
63159 +#ifdef ZM_ENABLE_CENC
63160 +#define ZM_IOCTL_CENC (SIOCDEVPRIVATE + 4)
63161 +#endif //ZM_ENABLE_CENC
63162 +#define ZD_PARAM_ROAMING 0x0001
63163 +#define ZD_PARAM_PRIVACY 0x0002
63164 +#define ZD_PARAM_WPA 0x0003
63165 +#define ZD_PARAM_COUNTERMEASURES 0x0004
63166 +#define ZD_PARAM_DROPUNENCRYPTED 0x0005
63167 +#define ZD_PARAM_AUTH_ALGS 0x0006
63168 +#define ZD_PARAM_WPS_FILTER 0x0007
63169 +
63170 +#ifdef ZM_ENABLE_CENC
63171 +#define P80211_PACKET_CENCFLAG 0x0001
63172 +#endif //ZM_ENABLE_CENC
63173 +#define P80211_PACKET_SETKEY 0x0003
63174 +
63175 +#define ZD_CMD_SET_ENCRYPT_KEY 0x0001
63176 +#define ZD_CMD_SET_MLME 0x0002
63177 +#define ZD_CMD_SCAN_REQ 0x0003
63178 +#define ZD_CMD_SET_GENERIC_ELEMENT 0x0004
63179 +#define ZD_CMD_GET_TSC 0x0005
63180 +
63181 +#define ZD_CRYPT_ALG_NAME_LEN 16
63182 +#define ZD_MAX_KEY_SIZE 32
63183 +#define ZD_MAX_GENERIC_SIZE 64
63184 +
63185 +#if WIRELESS_EXT > 12
63186 +#include <net/iw_handler.h>
63187 +#endif
63188 +
63189 +extern u16_t zfLnxGetVapId(zdev_t* dev);
63190 +
63191 +static const u32_t channel_frequency_11A[] =
63192 +{
63193 +//Even element for Channel Number, Odd for Frequency
63194 + 36,5180,
63195 + 40,5200,
63196 + 44,5220,
63197 + 48,5240,
63198 + 52,5260,
63199 + 56,5280,
63200 + 60,5300,
63201 + 64,5320,
63202 + 100,5500,
63203 + 104,5520,
63204 + 108,5540,
63205 + 112,5560,
63206 + 116,5580,
63207 + 120,5600,
63208 + 124,5620,
63209 + 128,5640,
63210 + 132,5660,
63211 + 136,5680,
63212 + 140,5700,
63213 +//
63214 + 184,4920,
63215 + 188,4940,
63216 + 192,4960,
63217 + 196,4980,
63218 + 8,5040,
63219 + 12,5060,
63220 + 16,5080,
63221 + 34,5170,
63222 + 38,5190,
63223 + 42,5210,
63224 + 46,5230,
63225 +//
63226 + 149,5745,
63227 + 153,5765,
63228 + 157,5785,
63229 + 161,5805,
63230 + 165,5825
63231 +//
63232 +};
63233 +
63234 +int usbdrv_freq2chan(u32_t freq)
63235 +{
63236 + /* 2.4G Hz */
63237 + if (freq > 2400 && freq < 3000)
63238 + {
63239 + return ((freq-2412)/5) + 1;
63240 + }
63241 + else
63242 + {
63243 + u16_t ii;
63244 + u16_t num_chan = sizeof(channel_frequency_11A)/sizeof(u32_t);
63245 +
63246 + for(ii = 1; ii < num_chan; ii += 2)
63247 + {
63248 + if (channel_frequency_11A[ii] == freq)
63249 + return channel_frequency_11A[ii-1];
63250 + }
63251 + }
63252 +
63253 + return 0;
63254 +}
63255 +
63256 +int usbdrv_chan2freq(int chan)
63257 +{
63258 + int freq;
63259 +
63260 + /* If channel number is out of range */
63261 + if (chan > 165 || chan <= 0)
63262 + return -1;
63263 +
63264 + /* 2.4G band */
63265 + if (chan >= 1 && chan <= 13)
63266 + {
63267 + freq = (2412 + (chan - 1) * 5);
63268 + return freq;
63269 + }
63270 + else if (chan >= 36 && chan <= 165)
63271 + {
63272 + u16_t ii;
63273 + u16_t num_chan = sizeof(channel_frequency_11A)/sizeof(u32_t);
63274 +
63275 + for(ii = 0; ii < num_chan; ii += 2)
63276 + {
63277 + if (channel_frequency_11A[ii] == chan)
63278 + return channel_frequency_11A[ii+1];
63279 + }
63280 +
63281 + /* Can't find desired frequency */
63282 + if (ii == num_chan)
63283 + return -1;
63284 + }
63285 +
63286 + /* Can't find deisred frequency */
63287 + return -1;
63288 +}
63289 +
63290 +int usbdrv_ioctl_setessid(struct net_device *dev, struct iw_point *erq)
63291 +{
63292 +#ifdef ZM_HOSTAPD_SUPPORT
63293 + //struct usbdrv_private *macp = dev->priv;
63294 + char essidbuf[IW_ESSID_MAX_SIZE+1];
63295 + int i;
63296 +
63297 + if(!netif_running(dev))
63298 + return -EINVAL;
63299 +
63300 + memset(essidbuf, 0, sizeof(essidbuf));
63301 +
63302 + printk(KERN_ERR "usbdrv_ioctl_setessid\n");
63303 +
63304 + //printk("ssidlen=%d\n", erq->length); //for any, it is 1.
63305 + if (erq->flags) {
63306 + if (erq->length > (IW_ESSID_MAX_SIZE+1))
63307 + return -E2BIG;
63308 +
63309 + if (copy_from_user(essidbuf, erq->pointer, erq->length))
63310 + return -EFAULT;
63311 + }
63312 +
63313 + //zd_DisasocAll(2);
63314 + //wait_ms(100);
63315 +
63316 + printk(KERN_ERR "essidbuf: ");
63317 +
63318 + for(i = 0; i < erq->length; i++)
63319 + {
63320 + printk(KERN_ERR "%02x ", essidbuf[i]);
63321 + }
63322 +
63323 + printk(KERN_ERR "\n");
63324 +
63325 + essidbuf[erq->length] = '\0';
63326 + //memcpy(macp->wd.ws.ssid, essidbuf, erq->length);
63327 + //macp->wd.ws.ssidLen = strlen(essidbuf)+2;
63328 + //macp->wd.ws.ssid[1] = strlen(essidbuf); // Update ssid length
63329 +
63330 + zfiWlanSetSSID(dev, essidbuf, erq->length);
63331 +#if 0
63332 + printk(KERN_ERR "macp->wd.ws.ssid: ");
63333 +
63334 + for(i = 0; i < macp->wd.ws.ssidLen; i++)
63335 + {
63336 + printk(KERN_ERR "%02x ", macp->wd.ws.ssid[i]);
63337 + }
63338 +
63339 + printk(KERN_ERR "\n");
63340 +#endif
63341 + zfiWlanDisable(dev, 0);
63342 + zfiWlanEnable(dev);
63343 +
63344 +#endif
63345 +
63346 + return 0;
63347 +}
63348 +
63349 +int usbdrv_ioctl_getessid(struct net_device *dev, struct iw_point *erq)
63350 +{
63351 + //struct usbdrv_private *macp = dev->priv;
63352 + u8_t essidbuf[IW_ESSID_MAX_SIZE+1];
63353 + u8_t len;
63354 + u8_t i;
63355 +
63356 +
63357 + //len = macp->wd.ws.ssidLen;
63358 + //memcpy(essidbuf, macp->wd.ws.ssid, macp->wd.ws.ssidLen);
63359 + zfiWlanQuerySSID(dev, essidbuf, &len);
63360 +
63361 + essidbuf[len] = 0;
63362 +
63363 + printk(KERN_ERR "ESSID: ");
63364 +
63365 + for(i = 0; i < len; i++)
63366 + {
63367 + printk(KERN_ERR "%c", essidbuf[i]);
63368 + }
63369 +
63370 + printk(KERN_ERR "\n");
63371 +
63372 + erq->flags= 1;
63373 + erq->length = strlen(essidbuf) + 1;
63374 +
63375 + if (erq->pointer)
63376 + if (copy_to_user(erq->pointer, essidbuf, erq->length))
63377 + return -EFAULT;
63378 +
63379 + return 0;
63380 +}
63381 +
63382 +
63383 +int usbdrv_ioctl_setrts(struct net_device *dev, struct iw_param *rrq)
63384 +{
63385 +
63386 + return 0;
63387 +}
63388 +
63389 +#if WIRELESS_EXT > 14
63390 +/*
63391 + * Encode a WPA or RSN information element as a custom
63392 + * element using the hostap format.
63393 + */
63394 +u32 encode_ie(void *buf, u32 bufsize, const u8 *ie, u32 ielen, const u8 *leader, u32 leader_len)
63395 +{
63396 + u8 *p;
63397 + u32 i;
63398 +
63399 + if (bufsize < leader_len)
63400 + return 0;
63401 + p = buf;
63402 + memcpy(p, leader, leader_len);
63403 + bufsize -= leader_len;
63404 + p += leader_len;
63405 + for (i = 0; i < ielen && bufsize > 2; i++)
63406 + p += sprintf(p, "%02x", ie[i]);
63407 + return (i == ielen ? p - (u8 *)buf : 0);
63408 +}
63409 +#endif /* WIRELESS_EXT > 14 */
63410 +
63411 +/*------------------------------------------------------------------*/
63412 +/*
63413 + * Translate scan data returned from the card to a card independent
63414 + * format that the Wireless Tools will understand
63415 + */
63416 +char *usbdrv_translate_scan(struct net_device *dev,
63417 + struct iw_request_info *info, char *current_ev,
63418 + char *end_buf, struct zsBssInfo *list)
63419 +{
63420 + struct iw_event iwe; /* Temporary buffer */
63421 + u16_t capabilities;
63422 + char *current_val; /* For rates */
63423 + char *last_ev;
63424 + int i;
63425 +#if WIRELESS_EXT > 14
63426 + char buf[64*2 + 30];
63427 +#endif
63428 +
63429 + last_ev = current_ev;
63430 +
63431 +/* First entry *MUST* be the AP MAC address */
63432 + iwe.cmd = SIOCGIWAP;
63433 + iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
63434 + memcpy(iwe.u.ap_addr.sa_data, list->bssid, ETH_ALEN);
63435 + current_ev = iwe_stream_add_event(
63436 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
63437 + info,
63438 +#endif
63439 + current_ev,
63440 + end_buf, &iwe, IW_EV_ADDR_LEN);
63441 +
63442 + /* Ran out of buffer */
63443 + if (last_ev == current_ev)
63444 + {
63445 + return end_buf;
63446 + }
63447 +
63448 + last_ev = current_ev;
63449 +
63450 +/* Other entries will be displayed in the order we give them */
63451 +
63452 +/* Add the ESSID */
63453 + iwe.u.data.length = list->ssid[1];
63454 + if(iwe.u.data.length > 32)
63455 + iwe.u.data.length = 32;
63456 + iwe.cmd = SIOCGIWESSID;
63457 + iwe.u.data.flags = 1;
63458 + current_ev = iwe_stream_add_point(
63459 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
63460 + info,
63461 +#endif
63462 + current_ev, end_buf, &iwe, &list->ssid[2]);
63463 +
63464 + /* Ran out of buffer */
63465 + if (last_ev == current_ev)
63466 + {
63467 + return end_buf;
63468 + }
63469 +
63470 + last_ev = current_ev;
63471 +
63472 +/* Add mode */
63473 + iwe.cmd = SIOCGIWMODE;
63474 + capabilities = (list->capability[1] << 8) + list->capability[0];
63475 + if(capabilities & (0x01 | 0x02))
63476 + {
63477 + if(capabilities & 0x01)
63478 + iwe.u.mode = IW_MODE_MASTER;
63479 + else
63480 + iwe.u.mode = IW_MODE_ADHOC;
63481 + current_ev = iwe_stream_add_event(
63482 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
63483 + info,
63484 +#endif
63485 + current_ev, end_buf, &iwe, IW_EV_UINT_LEN);
63486 + }
63487 +
63488 + /* Ran out of buffer */
63489 + if (last_ev == current_ev)
63490 + {
63491 + return end_buf;
63492 + }
63493 +
63494 + last_ev = current_ev;
63495 +
63496 +/* Add frequency */
63497 + iwe.cmd = SIOCGIWFREQ;
63498 + iwe.u.freq.m = list->channel;
63499 +/* Channel frequency in KHz */
63500 + if (iwe.u.freq.m > 14)
63501 + {
63502 + if ((184 <= iwe.u.freq.m) && (iwe.u.freq.m<=196))
63503 + iwe.u.freq.m = 4000 + iwe.u.freq.m * 5;
63504 + else
63505 + iwe.u.freq.m = 5000 + iwe.u.freq.m * 5;
63506 + }
63507 + else
63508 + {
63509 + if (iwe.u.freq.m == 14)
63510 + iwe.u.freq.m = 2484;
63511 + else
63512 + iwe.u.freq.m = 2412 + (iwe.u.freq.m - 1) * 5;
63513 + }
63514 + iwe.u.freq.e = 6;
63515 + current_ev = iwe_stream_add_event(
63516 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
63517 + info,
63518 +#endif
63519 + current_ev, end_buf, &iwe, IW_EV_FREQ_LEN);
63520 +
63521 + /* Ran out of buffer */
63522 + if (last_ev == current_ev)
63523 + {
63524 + return end_buf;
63525 + }
63526 +
63527 + last_ev = current_ev;
63528 +
63529 +/* Add quality statistics */
63530 + iwe.cmd = IWEVQUAL;
63531 +#if WIRELESS_EXT > 18
63532 + iwe.u.qual.updated = IW_QUAL_QUAL_UPDATED | IW_QUAL_LEVEL_UPDATED
63533 + |IW_QUAL_NOISE_UPDATED;
63534 +#endif
63535 + iwe.u.qual.level = list->signalStrength;
63536 + iwe.u.qual.noise = 0;
63537 + iwe.u.qual.qual = list->signalQuality;
63538 + current_ev = iwe_stream_add_event(
63539 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
63540 + info,
63541 +#endif
63542 + current_ev, end_buf, &iwe, IW_EV_QUAL_LEN);
63543 +
63544 + /* Ran out of buffer */
63545 + if (last_ev == current_ev)
63546 + {
63547 + return end_buf;
63548 + }
63549 +
63550 + last_ev = current_ev;
63551 +
63552 +/* Add encryption capability */
63553 +
63554 + iwe.cmd = SIOCGIWENCODE;
63555 + if(capabilities & 0x10)
63556 + iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
63557 + else
63558 + iwe.u.data.flags = IW_ENCODE_DISABLED;
63559 +
63560 + iwe.u.data.length = 0;
63561 + current_ev = iwe_stream_add_point(
63562 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
63563 + info,
63564 +#endif
63565 + current_ev, end_buf, &iwe, list->ssid);
63566 +
63567 + /* Ran out of buffer */
63568 + if (last_ev == current_ev)
63569 + {
63570 + return end_buf;
63571 + }
63572 +
63573 + last_ev = current_ev;
63574 +
63575 +/* Rate : stuffing multiple values in a single event require a bit
63576 + * more of magic */
63577 + current_val = current_ev + IW_EV_LCP_LEN;
63578 +
63579 + iwe.cmd = SIOCGIWRATE;
63580 +/* Those two flags are ignored... */
63581 + iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0;
63582 +
63583 + for(i = 0 ; i < list->supportedRates[1] ; i++)
63584 + {
63585 +/* Bit rate given in 500 kb/s units (+ 0x80) */
63586 + iwe.u.bitrate.value = ((list->supportedRates[i+2] & 0x7f) * 500000);
63587 +/* Add new value to event */
63588 + current_val = iwe_stream_add_value(
63589 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
63590 + info,
63591 +#endif
63592 + current_ev, current_val, end_buf, &iwe, IW_EV_PARAM_LEN);
63593 +
63594 + /* Ran out of buffer */
63595 + if (last_ev == current_val)
63596 + {
63597 + return end_buf;
63598 + }
63599 +
63600 + last_ev = current_val;
63601 + }
63602 +
63603 + for (i = 0 ; i < list->extSupportedRates[1] ; i++)
63604 + {
63605 +/* Bit rate given in 500 kb/s units (+ 0x80) */
63606 + iwe.u.bitrate.value = ((list->extSupportedRates[i+2] & 0x7f) * 500000);
63607 +/* Add new value to event */
63608 + current_val = iwe_stream_add_value(
63609 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
63610 + info,
63611 +#endif
63612 + current_ev, current_val, end_buf, &iwe, IW_EV_PARAM_LEN);
63613 +
63614 + /* Ran out of buffer */
63615 + if (last_ev == current_val)
63616 + {
63617 + return end_buf;
63618 + }
63619 +
63620 + last_ev = current_ev;
63621 + }
63622 +
63623 +/* Check if we added any event */
63624 + if((current_val - current_ev) > IW_EV_LCP_LEN)
63625 + current_ev = current_val;
63626 +#if WIRELESS_EXT > 14
63627 +#define IEEE80211_ELEMID_RSN 0x30
63628 + memset(&iwe, 0, sizeof(iwe));
63629 + iwe.cmd = IWEVCUSTOM;
63630 + snprintf(buf, sizeof(buf), "bcn_int=%d", (list->beaconInterval[1] << 8) + list->beaconInterval[0]);
63631 + iwe.u.data.length = strlen(buf);
63632 + current_ev = iwe_stream_add_point(
63633 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
63634 + info,
63635 +#endif
63636 + current_ev, end_buf, &iwe, buf);
63637 +
63638 + /* Ran out of buffer */
63639 + if (last_ev == current_ev)
63640 + {
63641 + return end_buf;
63642 + }
63643 +
63644 + last_ev = current_ev;
63645 +
63646 + if (list->wpaIe[1] != 0)
63647 + {
63648 + static const char rsn_leader[] = "rsn_ie=";
63649 + static const char wpa_leader[] = "wpa_ie=";
63650 +
63651 + memset(&iwe, 0, sizeof(iwe));
63652 + iwe.cmd = IWEVCUSTOM;
63653 + if (list->wpaIe[0] == IEEE80211_ELEMID_RSN)
63654 + iwe.u.data.length = encode_ie(buf, sizeof(buf),
63655 + list->wpaIe, list->wpaIe[1]+2,
63656 + rsn_leader, sizeof(rsn_leader)-1);
63657 + else
63658 + iwe.u.data.length = encode_ie(buf, sizeof(buf),
63659 + list->wpaIe, list->wpaIe[1]+2,
63660 + wpa_leader, sizeof(wpa_leader)-1);
63661 +
63662 + if (iwe.u.data.length != 0)
63663 + current_ev = iwe_stream_add_point(
63664 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
63665 + info,
63666 +#endif
63667 + current_ev, end_buf, &iwe, buf);
63668 +
63669 + /* Ran out of buffer */
63670 + if (last_ev == current_ev)
63671 + {
63672 + return end_buf;
63673 + }
63674 +
63675 + last_ev = current_ev;
63676 + }
63677 + if (list->rsnIe[1] != 0)
63678 + {
63679 + static const char rsn_leader[] = "rsn_ie=";
63680 + memset(&iwe, 0, sizeof(iwe));
63681 + iwe.cmd = IWEVCUSTOM;
63682 +
63683 + if (list->rsnIe[0] == IEEE80211_ELEMID_RSN)
63684 + {
63685 + iwe.u.data.length = encode_ie(buf, sizeof(buf),
63686 + list->rsnIe, list->rsnIe[1]+2,
63687 + rsn_leader, sizeof(rsn_leader)-1);
63688 + if (iwe.u.data.length != 0)
63689 + current_ev = iwe_stream_add_point(
63690 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27))
63691 + info,
63692 +#endif
63693 + current_ev, end_buf, &iwe, buf);
63694 +
63695 + /* Ran out of buffer */
63696 + if (last_ev == current_ev)
63697 + {
63698 + return end_buf;
63699 + }
63700 +
63701 + last_ev = current_ev;
63702 + }
63703 + }
63704 +#endif
63705 +/* The other data in the scan result are not really
63706 + * interesting, so for now drop it */
63707 + return current_ev;
63708 +}
63709 +
63710 +int usbdrvwext_giwname(struct net_device *dev,
63711 + struct iw_request_info *info,
63712 + union iwreq_data *wrq, char *extra)
63713 +{
63714 + //struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
63715 +
63716 + strcpy(wrq->name, "IEEE 802.11-MIMO");
63717 +
63718 + return 0;
63719 +}
63720 +
63721 +int usbdrvwext_siwfreq(struct net_device *dev,
63722 + struct iw_request_info *info,
63723 + struct iw_freq *freq, char *extra)
63724 +{
63725 + u32_t FreqKHz;
63726 + struct usbdrv_private *macp = dev->priv;
63727 +
63728 + if(!netif_running(dev))
63729 + return -EINVAL;
63730 +
63731 + if (freq->e > 1)
63732 + return -EINVAL;
63733 +
63734 + if (freq->e == 1)
63735 + {
63736 + FreqKHz = (freq->m / 100000);
63737 +
63738 + if (FreqKHz > 4000000)
63739 + {
63740 + if (FreqKHz > 5825000)
63741 + FreqKHz = 5825000;
63742 + else if (FreqKHz < 4920000)
63743 + FreqKHz = 4920000;
63744 + else if (FreqKHz < 5000000)
63745 + FreqKHz = (((FreqKHz - 4000000) / 5000) * 5000) + 4000000;
63746 + else
63747 + FreqKHz = (((FreqKHz - 5000000) / 5000) * 5000) + 5000000;
63748 + }
63749 + else
63750 + {
63751 + if (FreqKHz > 2484000)
63752 + FreqKHz = 2484000;
63753 + else if (FreqKHz < 2412000)
63754 + FreqKHz = 2412000;
63755 + else
63756 + FreqKHz = (((FreqKHz - 2412000) / 5000) * 5000) + 2412000;
63757 + }
63758 +
63759 + }
63760 + else
63761 + {
63762 + FreqKHz = usbdrv_chan2freq(freq->m);
63763 +
63764 + if (FreqKHz != -1)
63765 + FreqKHz *= 1000;
63766 + else
63767 + FreqKHz = 2412000;
63768 + }
63769 +
63770 + //printk("freq->m: %d, freq->e: %d\n", freq->m, freq->e);
63771 + //printk("FreqKHz: %d\n", FreqKHz);
63772 +
63773 + if (macp->DeviceOpened == 1)
63774 + {
63775 + zfiWlanSetFrequency(dev, FreqKHz, 0); // Immediate
63776 + //u8_t wpaieLen,wpaie[50];
63777 + //zfiWlanQueryWpaIe(dev, wpaie, &wpaieLen);
63778 + zfiWlanDisable(dev, 0);
63779 + zfiWlanEnable(dev);
63780 + //if (wpaieLen > 2)
63781 + // zfiWlanSetWpaIe(dev, wpaie, wpaieLen);
63782 + }
63783 +
63784 + return 0;
63785 +}
63786 +
63787 +int usbdrvwext_giwfreq(struct net_device *dev,
63788 + struct iw_request_info *info,
63789 + struct iw_freq *freq, char *extra)
63790 +{
63791 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
63792 +
63793 + if (macp->DeviceOpened != 1)
63794 + return 0;
63795 +
63796 + freq->m = zfiWlanQueryFrequency(dev);
63797 + freq->e = 3;
63798 +
63799 + return 0;
63800 +}
63801 +
63802 +int usbdrvwext_siwmode(struct net_device *dev,
63803 + struct iw_request_info *info,
63804 + union iwreq_data *wrq, char *extra)
63805 +{
63806 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
63807 + u8_t WlanMode;
63808 +
63809 + if(!netif_running(dev))
63810 + return -EINVAL;
63811 +
63812 + if (macp->DeviceOpened != 1)
63813 + return 0;
63814 +
63815 + switch(wrq->mode)
63816 + {
63817 + case IW_MODE_MASTER:
63818 + WlanMode = ZM_MODE_AP;
63819 + break;
63820 + case IW_MODE_INFRA:
63821 + WlanMode = ZM_MODE_INFRASTRUCTURE;
63822 + break;
63823 + case IW_MODE_ADHOC:
63824 + WlanMode = ZM_MODE_IBSS;
63825 + break;
63826 + default:
63827 + WlanMode = ZM_MODE_IBSS;
63828 + break;
63829 + }
63830 +
63831 + zfiWlanSetWlanMode(dev,WlanMode);
63832 + zfiWlanDisable(dev, 1);
63833 + zfiWlanEnable(dev);
63834 +
63835 + return 0;
63836 +}
63837 +
63838 +int usbdrvwext_giwmode(struct net_device *dev,
63839 + struct iw_request_info *info,
63840 + __u32 *mode, char *extra)
63841 +{
63842 + unsigned long irqFlag;
63843 + struct usbdrv_private *macp = dev->priv;
63844 +
63845 + if(!netif_running(dev))
63846 + return -EINVAL;
63847 +
63848 + if (macp->DeviceOpened != 1)
63849 + return 0;
63850 +
63851 + spin_lock_irqsave(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
63852 +
63853 + switch(zfiWlanQueryWlanMode(dev))
63854 + {
63855 + case ZM_MODE_AP:
63856 + *mode = IW_MODE_MASTER;
63857 + break;
63858 + case ZM_MODE_INFRASTRUCTURE:
63859 + *mode = IW_MODE_INFRA;
63860 + break;
63861 + case ZM_MODE_IBSS:
63862 + *mode = IW_MODE_ADHOC;
63863 + break;
63864 + default:
63865 + *mode = IW_MODE_ADHOC;
63866 + break;
63867 + }
63868 +
63869 + spin_unlock_irqrestore(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
63870 +
63871 + return 0;
63872 +}
63873 +
63874 +int usbdrvwext_siwsens(struct net_device *dev,
63875 + struct iw_request_info *info,
63876 + struct iw_param *sens, char *extra)
63877 +{
63878 + return 0;
63879 +}
63880 +
63881 +int usbdrvwext_giwsens(struct net_device *dev,
63882 + struct iw_request_info *info,
63883 + struct iw_param *sens, char *extra)
63884 +{
63885 + sens->value = 0;
63886 + sens->fixed = 1;
63887 +
63888 + return 0;
63889 +}
63890 +
63891 +int usbdrvwext_giwrange(struct net_device *dev,
63892 + struct iw_request_info *info,
63893 + struct iw_point *data, char *extra)
63894 +{
63895 + struct iw_range *range = (struct iw_range *) extra;
63896 + int i, val;
63897 + //int num_band_a;
63898 + u16_t channels[60];
63899 + u16_t channel_num;
63900 +
63901 + if(!netif_running(dev))
63902 + return -EINVAL;
63903 +
63904 +#if WIRELESS_EXT > 9
63905 + range->txpower_capa = IW_TXPOW_DBM;
63906 +// XXX what about min/max_pmp, min/max_pmt, etc.
63907 +#endif
63908 +
63909 +#if WIRELESS_EXT > 10
63910 + range->we_version_compiled = WIRELESS_EXT;
63911 + range->we_version_source = 13;
63912 +
63913 + range->retry_capa = IW_RETRY_LIMIT;
63914 + range->retry_flags = IW_RETRY_LIMIT;
63915 + range->min_retry = 0;
63916 + range->max_retry = 255;
63917 +#endif /* WIRELESS_EXT > 10 */
63918 +
63919 + channel_num = zfiWlanQueryAllowChannels(dev, channels);
63920 +
63921 + /* Gurantee reported channel numbers is less or equal to IW_MAX_FREQUENCIES */
63922 + if (channel_num > IW_MAX_FREQUENCIES)
63923 + channel_num = IW_MAX_FREQUENCIES;
63924 +
63925 + val = 0;
63926 +
63927 + for (i = 0; i < channel_num; i++)
63928 + {
63929 + range->freq[val].i = usbdrv_freq2chan(channels[i]);
63930 + range->freq[val].m = channels[i];
63931 + range->freq[val].e = 6;
63932 + val++;
63933 + }
63934 +
63935 + range->num_channels = channel_num;
63936 + range->num_frequency = channel_num;
63937 +
63938 +#if 0
63939 + range->num_channels = 14; // Only 2.4G
63940 +
63941 +/* XXX need to filter against the regulatory domain &| active set */
63942 + val = 0;
63943 + for (i = 1; i <= 14; i++) // B,G Bands
63944 + {
63945 + range->freq[val].i = i;
63946 + if (i == 14)
63947 + range->freq[val].m = 2484000;
63948 + else
63949 + range->freq[val].m = (2412+(i-1)*5)*1000;
63950 + range->freq[val].e = 3;
63951 + val++;
63952 + }
63953 +
63954 + num_band_a = (IW_MAX_FREQUENCIES - val);
63955 +
63956 + for (i = 0; i < num_band_a; i++) // A Bands
63957 + {
63958 + range->freq[val].i = channel_frequency_11A[2 * i];
63959 + range->freq[val].m = channel_frequency_11A[2 * i + 1] * 1000;
63960 + range->freq[val].e = 3;
63961 + val++;
63962 + }
63963 + // MIMO Rate Not Defined Now
63964 + //For 802.11a, there are too more frequency. We can't return them all
63965 + range->num_frequency = val;
63966 +#endif
63967 +
63968 +/* Max of /proc/net/wireless */
63969 + range->max_qual.qual = 100; //?? //92;
63970 + range->max_qual.level = 154; //??
63971 + range->max_qual.noise = 154; //??
63972 + range->sensitivity = 3; //??
63973 +
63974 +// XXX these need to be nsd-specific!
63975 + range->min_rts = 0;
63976 + range->max_rts = 2347;
63977 + range->min_frag = 256;
63978 + range->max_frag = 2346;
63979 + range->max_encoding_tokens = 4/*NUM_WEPKEYS*/; //??
63980 + range->num_encoding_sizes = 2; //??
63981 +
63982 + range->encoding_size[0] = 5; //?? //WEP Key Encoding Size
63983 + range->encoding_size[1] = 13;//??
63984 +
63985 +// XXX what about num_bitrates/throughput?
63986 + range->num_bitrates = 0; //??
63987 +
63988 +/* estimated max throughput */
63989 +// XXX need to cap it if we're running at ~2Mbps..
63990 +
63991 + range->throughput = 300000000;
63992 +
63993 + return 0;
63994 +}
63995 +
63996 +int usbdrvwext_siwap(struct net_device *dev, struct iw_request_info *info,
63997 + struct sockaddr *MacAddr, char *extra)
63998 +{
63999 + struct usbdrv_private *macp = dev->priv;
64000 +
64001 + if(!netif_running(dev))
64002 + return -EINVAL;
64003 +
64004 + if (zfiWlanQueryWlanMode(dev) == ZM_MODE_AP) // AP Mode
64005 + zfiWlanSetMacAddress(dev,(u16_t *)&MacAddr->sa_data[0]);
64006 + else //STA Mode
64007 + zfiWlanSetBssid(dev,&MacAddr->sa_data[0]);
64008 +
64009 + if (macp->DeviceOpened == 1)
64010 + {
64011 + //u8_t wpaieLen,wpaie[80];
64012 + //zfiWlanQueryWpaIe(dev, wpaie, &wpaieLen);
64013 + zfiWlanDisable(dev, 0);
64014 + zfiWlanEnable(dev);
64015 + //if (wpaieLen > 2)
64016 + // zfiWlanSetWpaIe(dev, wpaie, wpaieLen);
64017 + }
64018 +
64019 + return 0;
64020 +}
64021 +
64022 +int usbdrvwext_giwap(struct net_device *dev,
64023 + struct iw_request_info *info,
64024 + struct sockaddr *MacAddr, char *extra)
64025 +{
64026 + struct usbdrv_private *macp = dev->priv;
64027 +
64028 + if (macp->DeviceOpened != 1)
64029 + return 0;
64030 +
64031 + if (zfiWlanQueryWlanMode(dev) == ZM_MODE_AP) // AP Mode
64032 + zfiWlanQueryMacAddress(dev, &MacAddr->sa_data[0]);
64033 + else //STA Mode
64034 + {
64035 + if (macp->adapterState == ZM_STATUS_MEDIA_CONNECT)
64036 + {
64037 + zfiWlanQueryBssid(dev, &MacAddr->sa_data[0]);
64038 + }
64039 + else
64040 + {
64041 + u8_t zero_addr[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
64042 + memcpy(&MacAddr->sa_data[0], zero_addr, sizeof(zero_addr));
64043 + }
64044 + }
64045 +
64046 + return 0;
64047 +}
64048 +
64049 +int usbdrvwext_iwaplist(struct net_device *dev,
64050 + struct iw_request_info *info,
64051 + struct iw_point *data, char *extra)
64052 +{
64053 + //Don't know how to do yet--CWYang(+)
64054 + return 0;
64055 +
64056 +}
64057 +
64058 +int usbdrvwext_siwscan(struct net_device *dev, struct iw_request_info *info,
64059 + struct iw_point *data, char *extra)
64060 +{
64061 + struct usbdrv_private *macp = dev->priv;
64062 +
64063 + if (macp->DeviceOpened != 1)
64064 + return 0;
64065 +
64066 + printk("CWY - usbdrvwext_siwscan\n");
64067 +
64068 + zfiWlanScan(dev);
64069 +
64070 + return 0;
64071 +}
64072 +
64073 +int usbdrvwext_giwscan(struct net_device *dev,
64074 + struct iw_request_info *info,
64075 + struct iw_point *data, char *extra)
64076 +{
64077 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
64078 + //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev);
64079 + char *current_ev = extra;
64080 + char *end_buf;
64081 + int i;
64082 + //struct zsBssList BssList;
64083 + struct zsBssListV1 *pBssList = kmalloc(sizeof(struct zsBssListV1), GFP_KERNEL);
64084 + //BssList = wd->sta.pBssList;
64085 + //zmw_get_wlan_dev(dev);
64086 +
64087 + if (macp->DeviceOpened != 1)
64088 + return 0;
64089 +
64090 + if (data->length == 0)
64091 + {
64092 + end_buf = extra + IW_SCAN_MAX_DATA;
64093 + }
64094 + else
64095 + {
64096 + end_buf = extra + data->length;
64097 + }
64098 +
64099 + printk("giwscan - Report Scan Results\n");
64100 + //printk("giwscan - BssList Sreucture Len : %d\n", sizeof(BssList));
64101 + //printk("giwscan - BssList Count : %d\n", wd->sta.pBssList->bssCount);
64102 + //printk("giwscan - UpdateBssList Count : %d\n", wd->sta.pUpdateBssList->bssCount);
64103 + zfiWlanQueryBssListV1(dev, pBssList);
64104 + //zfiWlanQueryBssList(dev, &BssList);
64105 +
64106 +/* Read and parse all entries */
64107 + printk("giwscan - pBssList->bssCount : %d\n", pBssList->bssCount);
64108 + //printk("giwscan - BssList.bssCount : %d\n", BssList.bssCount);
64109 +
64110 + for (i = 0; i < pBssList->bssCount; i++)
64111 + {
64112 +/* Translate to WE format this entry */
64113 + //current_ev = usbdrv_translate_scan(dev, info, current_ev,
64114 + // extra + IW_SCAN_MAX_DATA, &pBssList->bssInfo[i]);
64115 + current_ev = usbdrv_translate_scan(dev, info, current_ev,
64116 + end_buf, &pBssList->bssInfo[i]);
64117 +
64118 +#if WIRELESS_EXT > 16
64119 + if (current_ev == end_buf)
64120 + {
64121 + kfree(pBssList);
64122 + data->length = current_ev - extra;
64123 + return -E2BIG;
64124 + }
64125 +#endif
64126 + }
64127 +
64128 +/* Length of data */
64129 + data->length = (current_ev - extra);
64130 + data->flags = 0; /* todo */
64131 +
64132 + kfree(pBssList);
64133 +
64134 + return 0;
64135 +}
64136 +
64137 +int usbdrvwext_siwessid(struct net_device *dev,
64138 + struct iw_request_info *info,
64139 + struct iw_point *essid, char *extra)
64140 +{
64141 + char EssidBuf[IW_ESSID_MAX_SIZE+1];
64142 + struct usbdrv_private *macp = dev->priv;
64143 +
64144 + if(!netif_running(dev))
64145 + return -EINVAL;
64146 +
64147 + if (essid->flags == 1)
64148 + {
64149 + if (essid->length > (IW_ESSID_MAX_SIZE+1))
64150 + return -E2BIG;
64151 +
64152 + if (copy_from_user(&EssidBuf, essid->pointer, essid->length))
64153 + return -EFAULT;
64154 +
64155 + EssidBuf[essid->length] = '\0';
64156 + //printk("siwessid - Set Essid : %s\n",EssidBuf);
64157 + //printk("siwessid - Essid Len : %d\n",essid->length);
64158 + //printk("siwessid - Essid Flag : %x\n",essid->flags);
64159 + if (macp->DeviceOpened == 1)
64160 + {
64161 + zfiWlanSetSSID(dev, EssidBuf, strlen(EssidBuf));
64162 + zfiWlanSetFrequency(dev, zfiWlanQueryFrequency(dev), FALSE);
64163 + zfiWlanSetEncryMode(dev, zfiWlanQueryEncryMode(dev));
64164 + //u8_t wpaieLen,wpaie[50];
64165 + //zfiWlanQueryWpaIe(dev, wpaie, &wpaieLen);
64166 + zfiWlanDisable(dev, 0);
64167 + zfiWlanEnable(dev);
64168 + //if (wpaieLen > 2)
64169 + // zfiWlanSetWpaIe(dev, wpaie, wpaieLen);
64170 + }
64171 + }
64172 +
64173 + return 0;
64174 +}
64175 +
64176 +int usbdrvwext_giwessid(struct net_device *dev,
64177 + struct iw_request_info *info,
64178 + struct iw_point *essid, char *extra)
64179 +{
64180 + struct usbdrv_private *macp = dev->priv;
64181 + u8_t EssidLen;
64182 + char EssidBuf[IW_ESSID_MAX_SIZE+1];
64183 + int ssid_len;
64184 +
64185 + if(!netif_running(dev))
64186 + return -EINVAL;
64187 +
64188 + if (macp->DeviceOpened != 1)
64189 + return 0;
64190 +
64191 + zfiWlanQuerySSID(dev, &EssidBuf[0], &EssidLen);
64192 +
64193 + /* Convert type from unsigned char to char */
64194 + ssid_len = (int)EssidLen;
64195 +
64196 + /* Make sure the essid length is not greater than IW_ESSID_MAX_SIZE */
64197 + if (ssid_len > IW_ESSID_MAX_SIZE)
64198 + ssid_len = IW_ESSID_MAX_SIZE;
64199 +
64200 + EssidBuf[ssid_len] = '\0';
64201 +
64202 + essid->flags = 1;
64203 + essid->length = strlen(EssidBuf);
64204 +
64205 + memcpy(extra, EssidBuf, essid->length);
64206 + // wireless.c in Kernel would handle copy_to_user -- line 679
64207 + /*if (essid->pointer)
64208 + {
64209 + if ( copy_to_user(essid->pointer, EssidBuf, essid->length) )
64210 + {
64211 + printk("giwessid - copy_to_user Fail\n");
64212 + return -EFAULT;
64213 + }
64214 + }*/
64215 +
64216 + return 0;
64217 +}
64218 +
64219 +int usbdrvwext_siwnickn(struct net_device *dev,
64220 + struct iw_request_info *info,
64221 + struct iw_point *data, char *nickname)
64222 +{
64223 + //Exist but junk--CWYang(+)
64224 + return 0;
64225 +}
64226 +
64227 +int usbdrvwext_giwnickn(struct net_device *dev,
64228 + struct iw_request_info *info,
64229 + struct iw_point *data, char *nickname)
64230 +{
64231 + struct usbdrv_private *macp = dev->priv;
64232 + u8_t EssidLen;
64233 + char EssidBuf[IW_ESSID_MAX_SIZE+1];
64234 +
64235 + if (macp->DeviceOpened != 1)
64236 + return 0;
64237 +
64238 + zfiWlanQuerySSID(dev, &EssidBuf[0], &EssidLen);
64239 + EssidBuf[EssidLen] = 0;
64240 +
64241 + data->flags = 1;
64242 + data->length = strlen(EssidBuf);
64243 +
64244 + memcpy(nickname, EssidBuf, data->length);
64245 +
64246 + return 0;
64247 +}
64248 +
64249 +int usbdrvwext_siwrate(struct net_device *dev,
64250 + struct iw_request_info *info,
64251 + struct iw_param *frq, char *extra)
64252 +{
64253 + struct usbdrv_private *macp = dev->priv;
64254 + //Array to Define Rate Number that Send to Driver
64255 + u16_t zcIndextoRateBG[16] = {1000, 2000, 5500, 11000, 0, 0, 0, 0, 48000,
64256 + 24000, 12000, 6000, 54000, 36000, 18000, 9000};
64257 + u16_t zcRateToMCS[] = {0xff, 0, 1, 2, 3, 0xb, 0xf, 0xa, 0xe, 0x9, 0xd,
64258 + 0x8, 0xc};
64259 + u8_t i,RateIndex = 4;
64260 + u16_t RateKbps;
64261 +
64262 + //printk("frq->disabled : 0x%x\n",frq->disabled);
64263 + //printk("frq->value : 0x%x\n",frq->value);
64264 +
64265 + RateKbps = frq->value / 1000;
64266 + //printk("RateKbps : %d\n", RateKbps);
64267 + for (i = 0; i < 16; i++)
64268 + {
64269 + if (RateKbps == zcIndextoRateBG[i])
64270 + RateIndex = i;
64271 + }
64272 + if (zcIndextoRateBG[RateIndex] == 0)
64273 + RateIndex = 0xff;
64274 + //printk("RateIndex : %x\n", RateIndex);
64275 + for (i = 0; i < 13; i++)
64276 + if (RateIndex == zcRateToMCS[i])
64277 + break;
64278 + //printk("Index : %x\n", i);
64279 + if (RateKbps == 65000)
64280 + {
64281 + RateIndex = 20;
64282 + printk("RateIndex : %d\n", RateIndex);
64283 + }
64284 + if (macp->DeviceOpened == 1)
64285 + {
64286 + zfiWlanSetTxRate(dev, i);
64287 + //zfiWlanDisable(dev);
64288 + //zfiWlanEnable(dev);
64289 + }
64290 +
64291 + return 0;
64292 +}
64293 +
64294 +int usbdrvwext_giwrate(struct net_device *dev,
64295 + struct iw_request_info *info,
64296 + struct iw_param *frq, char *extra)
64297 +{
64298 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
64299 +
64300 + if(!netif_running(dev))
64301 + return -EINVAL;
64302 +
64303 + if (macp->DeviceOpened != 1)
64304 + return 0;
64305 +
64306 + frq->fixed = 0;
64307 + frq->disabled = 0;
64308 + frq->value = zfiWlanQueryRxRate(dev) * 1000;
64309 +
64310 + return 0;
64311 +}
64312 +
64313 +int usbdrvwext_siwrts(struct net_device *dev,
64314 + struct iw_request_info *info,
64315 + struct iw_param *rts, char *extra)
64316 +{
64317 + struct usbdrv_private *macp = dev->priv;
64318 + int val = rts->value;
64319 +
64320 + if (macp->DeviceOpened != 1)
64321 + return 0;
64322 +
64323 + if (rts->disabled)
64324 + val = 2347;
64325 +
64326 + if ((val < 0) || (val > 2347))
64327 + return -EINVAL;
64328 +
64329 + zfiWlanSetRtsThreshold(dev,val);
64330 +
64331 + return 0;
64332 +}
64333 +
64334 +int usbdrvwext_giwrts(struct net_device *dev,
64335 + struct iw_request_info *info,
64336 + struct iw_param *rts, char *extra)
64337 +{
64338 + struct usbdrv_private *macp = dev->priv;
64339 +
64340 + if(!netif_running(dev))
64341 + return -EINVAL;
64342 +
64343 + if (macp->DeviceOpened != 1)
64344 + return 0;
64345 +
64346 + rts->value = zfiWlanQueryRtsThreshold(dev);
64347 + rts->disabled = (rts->value >= 2347);
64348 + rts->fixed = 1;
64349 +
64350 + return 0;
64351 +
64352 +}
64353 +
64354 +int usbdrvwext_siwfrag(struct net_device *dev,
64355 + struct iw_request_info *info,
64356 + struct iw_param *frag, char *extra)
64357 +{
64358 + struct usbdrv_private *macp = dev->priv;
64359 + u16_t fragThreshold;
64360 +
64361 + if (macp->DeviceOpened != 1)
64362 + return 0;
64363 +
64364 + if (frag->disabled)
64365 + fragThreshold = 0;
64366 + else
64367 + fragThreshold = frag->value;
64368 +
64369 + zfiWlanSetFragThreshold(dev,fragThreshold);
64370 +
64371 + return 0;
64372 +}
64373 +
64374 +int usbdrvwext_giwfrag(struct net_device *dev,
64375 + struct iw_request_info *info,
64376 + struct iw_param *frag, char *extra)
64377 +{
64378 + struct usbdrv_private *macp = dev->priv;
64379 + u16 val;
64380 + unsigned long irqFlag;
64381 +
64382 + if(!netif_running(dev))
64383 + return -EINVAL;
64384 +
64385 + if (macp->DeviceOpened != 1)
64386 + return 0;
64387 +
64388 + spin_lock_irqsave(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
64389 +
64390 + val = zfiWlanQueryFragThreshold(dev);
64391 +
64392 + frag->value = val;
64393 +
64394 + frag->disabled = (val >= 2346);
64395 + frag->fixed = 1;
64396 +
64397 + spin_unlock_irqrestore(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
64398 +
64399 + return 0;
64400 +}
64401 +
64402 +int usbdrvwext_siwtxpow(struct net_device *dev,
64403 + struct iw_request_info *info,
64404 + struct iw_param *rrq, char *extra)
64405 +{
64406 + //Not support yet--CWYng(+)
64407 + return 0;
64408 +}
64409 +
64410 +int usbdrvwext_giwtxpow(struct net_device *dev,
64411 + struct iw_request_info *info,
64412 + struct iw_param *rrq, char *extra)
64413 +{
64414 + //Not support yet--CWYng(+)
64415 + return 0;
64416 +}
64417 +
64418 +int usbdrvwext_siwretry(struct net_device *dev,
64419 + struct iw_request_info *info,
64420 + struct iw_param *rrq, char *extra)
64421 +{
64422 + //Do nothing--CWYang(+)
64423 + return 0;
64424 +}
64425 +
64426 +int usbdrvwext_giwretry(struct net_device *dev,
64427 + struct iw_request_info *info,
64428 + struct iw_param *rrq, char *extra)
64429 +{
64430 + //Do nothing--CWYang(+)
64431 + return 0;
64432 +}
64433 +
64434 +int usbdrvwext_siwencode(struct net_device *dev,
64435 + struct iw_request_info *info,
64436 + struct iw_point *erq, char *key)
64437 +{
64438 + struct zsKeyInfo keyInfo;
64439 + int i, WepState = ZM_ENCRYPTION_WEP_DISABLED;
64440 + struct usbdrv_private *macp = dev->priv;
64441 +
64442 + if(!netif_running(dev))
64443 + return -EINVAL;
64444 +
64445 + if ((erq->flags & IW_ENCODE_DISABLED) == 0)
64446 + {
64447 + keyInfo.key = key;
64448 + keyInfo.keyLength = erq->length;
64449 + keyInfo.keyIndex = (erq->flags & IW_ENCODE_INDEX) - 1;
64450 + if (keyInfo.keyIndex >= 4)
64451 + keyInfo.keyIndex = 0;
64452 + keyInfo.flag = ZM_KEY_FLAG_DEFAULT_KEY;
64453 +
64454 + zfiWlanSetKey(dev, keyInfo);
64455 + WepState = ZM_ENCRYPTION_WEP_ENABLED;
64456 + }
64457 + else
64458 + {
64459 + for (i = 1; i < 4; i++)
64460 + zfiWlanRemoveKey(dev, 0, i);
64461 + WepState = ZM_ENCRYPTION_WEP_DISABLED;
64462 + //zfiWlanSetEncryMode(dev, ZM_NO_WEP);
64463 + }
64464 +
64465 + if (macp->DeviceOpened == 1)
64466 + {
64467 + zfiWlanSetWepStatus(dev, WepState);
64468 + zfiWlanSetFrequency(dev, zfiWlanQueryFrequency(dev), FALSE);
64469 + //zfiWlanSetEncryMode(dev, zfiWlanQueryEncryMode(dev));
64470 + //u8_t wpaieLen,wpaie[50];
64471 + //zfiWlanQueryWpaIe(dev, wpaie, &wpaieLen);
64472 + zfiWlanDisable(dev, 0);
64473 + zfiWlanEnable(dev);
64474 + //if (wpaieLen > 2)
64475 + // zfiWlanSetWpaIe(dev, wpaie, wpaieLen);
64476 + }
64477 +
64478 + return 0;
64479 +}
64480 +
64481 +int usbdrvwext_giwencode(struct net_device *dev,
64482 + struct iw_request_info *info,
64483 + struct iw_point *erq, char *key)
64484 +{
64485 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
64486 + u8_t EncryptionMode;
64487 + u8_t keyLen = 0;
64488 +
64489 + if (macp->DeviceOpened != 1)
64490 + return 0;
64491 +
64492 + EncryptionMode = zfiWlanQueryEncryMode(dev);
64493 +
64494 + if (EncryptionMode)
64495 + {
64496 + erq->flags = IW_ENCODE_ENABLED;
64497 + }
64498 + else
64499 + {
64500 + erq->flags = IW_ENCODE_DISABLED;
64501 + }
64502 +
64503 +/* We can't return the key, so set the proper flag and return zero */
64504 + erq->flags |= IW_ENCODE_NOKEY;
64505 + memset(key, 0, 16);
64506 +
64507 +/* Copy the key to the user buffer */
64508 + switch(EncryptionMode)
64509 + {
64510 + case ZM_WEP64:
64511 + keyLen = 5;
64512 + break;
64513 + case ZM_WEP128:
64514 + keyLen = 13;
64515 + break;
64516 + case ZM_WEP256:
64517 + keyLen = 29;
64518 + break;
64519 + case ZM_AES:
64520 + keyLen = 16;
64521 + break;
64522 + case ZM_TKIP:
64523 + keyLen = 32;
64524 + break;
64525 +#ifdef ZM_ENABLE_CENC
64526 + case ZM_CENC:
64527 + keyLen = 32;
64528 + break;
64529 +#endif //ZM_ENABLE_CENC
64530 + case ZM_NO_WEP:
64531 + keyLen = 0;
64532 + break;
64533 + default :
64534 + keyLen = 0;
64535 + printk("Unknown EncryMode\n");
64536 + break;
64537 +
64538 + }
64539 + erq->length = keyLen;
64540 +
64541 + return 0;
64542 +}
64543 +
64544 +int usbdrvwext_siwpower(struct net_device *dev,
64545 + struct iw_request_info *info,
64546 + struct iw_param *frq, char *extra)
64547 +{
64548 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
64549 + u8_t PSMode;
64550 +
64551 + if (macp->DeviceOpened != 1)
64552 + return 0;
64553 +
64554 + if (frq->disabled)
64555 + PSMode = ZM_STA_PS_NONE;
64556 + else
64557 + PSMode = ZM_STA_PS_MAX;
64558 +
64559 + zfiWlanSetPowerSaveMode(dev,PSMode);
64560 +
64561 + return 0;
64562 +}
64563 +
64564 +int usbdrvwext_giwpower(struct net_device *dev,
64565 + struct iw_request_info *info,
64566 + struct iw_param *frq, char *extra)
64567 +{
64568 + unsigned long irqFlag;
64569 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
64570 +
64571 + if (macp->DeviceOpened != 1)
64572 + return 0;
64573 +
64574 + spin_lock_irqsave(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
64575 +
64576 + if (zfiWlanQueryPowerSaveMode(dev) == ZM_STA_PS_NONE)
64577 + frq->disabled = 1;
64578 + else
64579 + frq->disabled = 0;
64580 +
64581 + spin_unlock_irqrestore(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
64582 +
64583 + return 0;
64584 +}
64585 +
64586 +//int usbdrvwext_setparam(struct net_device *dev, struct iw_request_info *info,
64587 +// void *w, char *extra)
64588 +//{
64589 +// struct ieee80211vap *vap = dev->priv;
64590 +// struct ieee80211com *ic = vap->iv_ic;
64591 +// struct ieee80211_rsnparms *rsn = &vap->iv_bss->ni_rsn;
64592 +// int *i = (int *) extra;
64593 +// int param = i[0]; /* parameter id is 1st */
64594 +// int value = i[1]; /* NB: most values are TYPE_INT */
64595 +// int retv = 0;
64596 +// int j, caps;
64597 +// const struct ieee80211_authenticator *auth;
64598 +// const struct ieee80211_aclator *acl;
64599 +//
64600 +// switch (param) {
64601 +// case IEEE80211_PARAM_AUTHMODE:
64602 +// switch (value) {
64603 +// case IEEE80211_AUTH_WPA: /* WPA */
64604 +// case IEEE80211_AUTH_8021X: /* 802.1x */
64605 +// case IEEE80211_AUTH_OPEN: /* open */
64606 +// case IEEE80211_AUTH_SHARED: /* shared-key */
64607 +// case IEEE80211_AUTH_AUTO: /* auto */
64608 +// auth = ieee80211_authenticator_get(value);
64609 +// if (auth == NULL)
64610 +// return -EINVAL;
64611 +// break;
64612 +// default:
64613 +// return -EINVAL;
64614 +// }
64615 +// switch (value) {
64616 +// case IEEE80211_AUTH_WPA: /* WPA w/ 802.1x */
64617 +// vap->iv_flags |= IEEE80211_F_PRIVACY;
64618 +// value = IEEE80211_AUTH_8021X;
64619 +// break;
64620 +// case IEEE80211_AUTH_OPEN: /* open */
64621 +// vap->iv_flags &= ~(IEEE80211_F_WPA|IEEE80211_F_PRIVACY);
64622 +// break;
64623 +// case IEEE80211_AUTH_SHARED: /* shared-key */
64624 +// case IEEE80211_AUTH_AUTO: /* auto */
64625 +// case IEEE80211_AUTH_8021X: /* 802.1x */
64626 +// vap->iv_flags &= ~IEEE80211_F_WPA;
64627 +// /* both require a key so mark the PRIVACY capability */
64628 +// vap->iv_flags |= IEEE80211_F_PRIVACY;
64629 +// break;
64630 +// }
64631 +// /* NB: authenticator attach/detach happens on state change */
64632 +// vap->iv_bss->ni_authmode = value;
64633 +// /* XXX mixed/mode/usage? */
64634 +// vap->iv_auth = auth;
64635 +// retv = ENETRESET;
64636 +// break;
64637 +// case IEEE80211_PARAM_PROTMODE:
64638 +// if (value > IEEE80211_PROT_RTSCTS)
64639 +// return -EINVAL;
64640 +// ic->ic_protmode = value;
64641 +// /* NB: if not operating in 11g this can wait */
64642 +// if (ic->ic_bsschan != IEEE80211_CHAN_ANYC &&
64643 +// IEEE80211_IS_CHAN_ANYG(ic->ic_bsschan))
64644 +// retv = ENETRESET;
64645 +// break;
64646 +// case IEEE80211_PARAM_MCASTCIPHER:
64647 +// if ((vap->iv_caps & cipher2cap(value)) == 0 &&
64648 +// !ieee80211_crypto_available(value))
64649 +// return -EINVAL;
64650 +// rsn->rsn_mcastcipher = value;
64651 +// if (vap->iv_flags & IEEE80211_F_WPA)
64652 +// retv = ENETRESET;
64653 +// break;
64654 +// case IEEE80211_PARAM_MCASTKEYLEN:
64655 +// if (!(0 < value && value < IEEE80211_KEYBUF_SIZE))
64656 +// return -EINVAL;
64657 +// /* XXX no way to verify driver capability */
64658 +// rsn->rsn_mcastkeylen = value;
64659 +// if (vap->iv_flags & IEEE80211_F_WPA)
64660 +// retv = ENETRESET;
64661 +// break;
64662 +// case IEEE80211_PARAM_UCASTCIPHERS:
64663 +// /*
64664 +// * Convert cipher set to equivalent capabilities.
64665 +// * NB: this logic intentionally ignores unknown and
64666 +// * unsupported ciphers so folks can specify 0xff or
64667 +// * similar and get all available ciphers.
64668 +// */
64669 +// caps = 0;
64670 +// for (j = 1; j < 32; j++) /* NB: skip WEP */
64671 +// if ((value & (1<<j)) &&
64672 +// ((vap->iv_caps & cipher2cap(j)) ||
64673 +// ieee80211_crypto_available(j)))
64674 +// caps |= 1<<j;
64675 +// if (caps == 0) /* nothing available */
64676 +// return -EINVAL;
64677 +// /* XXX verify ciphers ok for unicast use? */
64678 +// /* XXX disallow if running as it'll have no effect */
64679 +// rsn->rsn_ucastcipherset = caps;
64680 +// if (vap->iv_flags & IEEE80211_F_WPA)
64681 +// retv = ENETRESET;
64682 +// break;
64683 +// case IEEE80211_PARAM_UCASTCIPHER:
64684 +// if ((rsn->rsn_ucastcipherset & cipher2cap(value)) == 0)
64685 +// return -EINVAL;
64686 +// rsn->rsn_ucastcipher = value;
64687 +// break;
64688 +// case IEEE80211_PARAM_UCASTKEYLEN:
64689 +// if (!(0 < value && value < IEEE80211_KEYBUF_SIZE))
64690 +// return -EINVAL;
64691 +// /* XXX no way to verify driver capability */
64692 +// rsn->rsn_ucastkeylen = value;
64693 +// break;
64694 +// case IEEE80211_PARAM_KEYMGTALGS:
64695 +// /* XXX check */
64696 +// rsn->rsn_keymgmtset = value;
64697 +// if (vap->iv_flags & IEEE80211_F_WPA)
64698 +// retv = ENETRESET;
64699 +// break;
64700 +// case IEEE80211_PARAM_RSNCAPS:
64701 +// /* XXX check */
64702 +// rsn->rsn_caps = value;
64703 +// if (vap->iv_flags & IEEE80211_F_WPA)
64704 +// retv = ENETRESET;
64705 +// break;
64706 +// case IEEE80211_PARAM_WPA:
64707 +// if (value > 3)
64708 +// return -EINVAL;
64709 +// /* XXX verify ciphers available */
64710 +// vap->iv_flags &= ~IEEE80211_F_WPA;
64711 +// switch (value) {
64712 +// case 1:
64713 +// vap->iv_flags |= IEEE80211_F_WPA1;
64714 +// break;
64715 +// case 2:
64716 +// vap->iv_flags |= IEEE80211_F_WPA2;
64717 +// break;
64718 +// case 3:
64719 +// vap->iv_flags |= IEEE80211_F_WPA1 | IEEE80211_F_WPA2;
64720 +// break;
64721 +// }
64722 +// retv = ENETRESET; /* XXX? */
64723 +// break;
64724 +// case IEEE80211_PARAM_ROAMING:
64725 +// if (!(IEEE80211_ROAMING_DEVICE <= value &&
64726 +// value <= IEEE80211_ROAMING_MANUAL))
64727 +// return -EINVAL;
64728 +// ic->ic_roaming = value;
64729 +// break;
64730 +// case IEEE80211_PARAM_PRIVACY:
64731 +// if (value) {
64732 +// /* XXX check for key state? */
64733 +// vap->iv_flags |= IEEE80211_F_PRIVACY;
64734 +// } else
64735 +// vap->iv_flags &= ~IEEE80211_F_PRIVACY;
64736 +// break;
64737 +// case IEEE80211_PARAM_DROPUNENCRYPTED:
64738 +// if (value)
64739 +// vap->iv_flags |= IEEE80211_F_DROPUNENC;
64740 +// else
64741 +// vap->iv_flags &= ~IEEE80211_F_DROPUNENC;
64742 +// break;
64743 +// case IEEE80211_PARAM_COUNTERMEASURES:
64744 +// if (value) {
64745 +// if ((vap->iv_flags & IEEE80211_F_WPA) == 0)
64746 +// return -EINVAL;
64747 +// vap->iv_flags |= IEEE80211_F_COUNTERM;
64748 +// } else
64749 +// vap->iv_flags &= ~IEEE80211_F_COUNTERM;
64750 +// break;
64751 +// case IEEE80211_PARAM_DRIVER_CAPS:
64752 +// vap->iv_caps = value; /* NB: for testing */
64753 +// break;
64754 +// case IEEE80211_PARAM_MACCMD:
64755 +// acl = vap->iv_acl;
64756 +// switch (value) {
64757 +// case IEEE80211_MACCMD_POLICY_OPEN:
64758 +// case IEEE80211_MACCMD_POLICY_ALLOW:
64759 +// case IEEE80211_MACCMD_POLICY_DENY:
64760 +// if (acl == NULL) {
64761 +// acl = ieee80211_aclator_get("mac");
64762 +// if (acl == NULL || !acl->iac_attach(vap))
64763 +// return -EINVAL;
64764 +// vap->iv_acl = acl;
64765 +// }
64766 +// acl->iac_setpolicy(vap, value);
64767 +// break;
64768 +// case IEEE80211_MACCMD_FLUSH:
64769 +// if (acl != NULL)
64770 +// acl->iac_flush(vap);
64771 +// /* NB: silently ignore when not in use */
64772 +// break;
64773 +// case IEEE80211_MACCMD_DETACH:
64774 +// if (acl != NULL) {
64775 +// vap->iv_acl = NULL;
64776 +// acl->iac_detach(vap);
64777 +// }
64778 +// break;
64779 +// }
64780 +// break;
64781 +// case IEEE80211_PARAM_WMM:
64782 +// if (ic->ic_caps & IEEE80211_C_WME){
64783 +// if (value) {
64784 +// vap->iv_flags |= IEEE80211_F_WME;
64785 +// vap->iv_ic->ic_flags |= IEEE80211_F_WME; /* XXX needed by ic_reset */
64786 +// }
64787 +// else {
64788 +// vap->iv_flags &= ~IEEE80211_F_WME;
64789 +// vap->iv_ic->ic_flags &= ~IEEE80211_F_WME; /* XXX needed by ic_reset */
64790 +// }
64791 +// retv = ENETRESET; /* Renegotiate for capabilities */
64792 +// }
64793 +// break;
64794 +// case IEEE80211_PARAM_HIDESSID:
64795 +// if (value)
64796 +// vap->iv_flags |= IEEE80211_F_HIDESSID;
64797 +// else
64798 +// vap->iv_flags &= ~IEEE80211_F_HIDESSID;
64799 +// retv = ENETRESET;
64800 +// break;
64801 +// case IEEE80211_PARAM_APBRIDGE:
64802 +// if (value == 0)
64803 +// vap->iv_flags |= IEEE80211_F_NOBRIDGE;
64804 +// else
64805 +// vap->iv_flags &= ~IEEE80211_F_NOBRIDGE;
64806 +// break;
64807 +// case IEEE80211_PARAM_INACT:
64808 +// vap->iv_inact_run = value / IEEE80211_INACT_WAIT;
64809 +// break;
64810 +// case IEEE80211_PARAM_INACT_AUTH:
64811 +// vap->iv_inact_auth = value / IEEE80211_INACT_WAIT;
64812 +// break;
64813 +// case IEEE80211_PARAM_INACT_INIT:
64814 +// vap->iv_inact_init = value / IEEE80211_INACT_WAIT;
64815 +// break;
64816 +// case IEEE80211_PARAM_ABOLT:
64817 +// caps = 0;
64818 +// /*
64819 +// * Map abolt settings to capability bits;
64820 +// * this also strips unknown/unwanted bits.
64821 +// */
64822 +// if (value & IEEE80211_ABOLT_TURBO_PRIME)
64823 +// caps |= IEEE80211_ATHC_TURBOP;
64824 +// if (value & IEEE80211_ABOLT_COMPRESSION)
64825 +// caps |= IEEE80211_ATHC_COMP;
64826 +// if (value & IEEE80211_ABOLT_FAST_FRAME)
64827 +// caps |= IEEE80211_ATHC_FF;
64828 +// if (value & IEEE80211_ABOLT_XR)
64829 +// caps |= IEEE80211_ATHC_XR;
64830 +// if (value & IEEE80211_ABOLT_AR)
64831 +// caps |= IEEE80211_ATHC_AR;
64832 +// if (value & IEEE80211_ABOLT_BURST)
64833 +// caps |= IEEE80211_ATHC_BURST;
64834 +// if (value & IEEE80211_ABOLT_WME_ELE)
64835 +// caps |= IEEE80211_ATHC_WME;
64836 +// /* verify requested capabilities are supported */
64837 +// if ((caps & ic->ic_ath_cap) != caps)
64838 +// return -EINVAL;
64839 +// if (vap->iv_ath_cap != caps) {
64840 +// if ((vap->iv_ath_cap ^ caps) & IEEE80211_ATHC_TURBOP) {
64841 +// if (ieee80211_set_turbo(dev, caps & IEEE80211_ATHC_TURBOP))
64842 +// return -EINVAL;
64843 +// ieee80211_scan_flush(ic);
64844 +// }
64845 +// vap->iv_ath_cap = caps;
64846 +// ic->ic_athcapsetup(vap->iv_ic, vap->iv_ath_cap);
64847 +// retv = ENETRESET;
64848 +// }
64849 +// break;
64850 +// case IEEE80211_PARAM_DTIM_PERIOD:
64851 +// if (vap->iv_opmode != IEEE80211_M_HOSTAP &&
64852 +// vap->iv_opmode != IEEE80211_M_IBSS)
64853 +// return -EINVAL;
64854 +// if (IEEE80211_DTIM_MIN <= value &&
64855 +// value <= IEEE80211_DTIM_MAX) {
64856 +// vap->iv_dtim_period = value;
64857 +// retv = ENETRESET; /* requires restart */
64858 +// } else
64859 +// retv = EINVAL;
64860 +// break;
64861 +// case IEEE80211_PARAM_BEACON_INTERVAL:
64862 +// if (vap->iv_opmode != IEEE80211_M_HOSTAP &&
64863 +// vap->iv_opmode != IEEE80211_M_IBSS)
64864 +// return -EINVAL;
64865 +// if (IEEE80211_BINTVAL_MIN <= value &&
64866 +// value <= IEEE80211_BINTVAL_MAX) {
64867 +// ic->ic_lintval = value; /* XXX multi-bss */
64868 +// retv = ENETRESET; /* requires restart */
64869 +// } else
64870 +// retv = EINVAL;
64871 +// break;
64872 +// case IEEE80211_PARAM_DOTH:
64873 +// if (value) {
64874 +// ic->ic_flags |= IEEE80211_F_DOTH;
64875 +// }
64876 +// else
64877 +// ic->ic_flags &= ~IEEE80211_F_DOTH;
64878 +// retv = ENETRESET; /* XXX: need something this drastic? */
64879 +// break;
64880 +// case IEEE80211_PARAM_PWRTARGET:
64881 +// ic->ic_curchanmaxpwr = value;
64882 +// break;
64883 +// case IEEE80211_PARAM_GENREASSOC:
64884 +// IEEE80211_SEND_MGMT(vap->iv_bss, IEEE80211_FC0_SUBTYPE_REASSOC_REQ, 0);
64885 +// break;
64886 +// case IEEE80211_PARAM_COMPRESSION:
64887 +// retv = ieee80211_setathcap(vap, IEEE80211_ATHC_COMP, value);
64888 +// break;
64889 +// case IEEE80211_PARAM_WMM_AGGRMODE:
64890 +// retv = ieee80211_setathcap(vap, IEEE80211_ATHC_WME, value);
64891 +// break;
64892 +// case IEEE80211_PARAM_FF:
64893 +// retv = ieee80211_setathcap(vap, IEEE80211_ATHC_FF, value);
64894 +// break;
64895 +// case IEEE80211_PARAM_TURBO:
64896 +// retv = ieee80211_setathcap(vap, IEEE80211_ATHC_TURBOP, value);
64897 +// if (retv == ENETRESET) {
64898 +// if(ieee80211_set_turbo(dev,value))
64899 +// return -EINVAL;
64900 +// ieee80211_scan_flush(ic);
64901 +// }
64902 +// break;
64903 +// case IEEE80211_PARAM_XR:
64904 +// retv = ieee80211_setathcap(vap, IEEE80211_ATHC_XR, value);
64905 +// break;
64906 +// case IEEE80211_PARAM_BURST:
64907 +// retv = ieee80211_setathcap(vap, IEEE80211_ATHC_BURST, value);
64908 +// break;
64909 +// case IEEE80211_PARAM_AR:
64910 +// retv = ieee80211_setathcap(vap, IEEE80211_ATHC_AR, value);
64911 +// break;
64912 +// case IEEE80211_PARAM_PUREG:
64913 +// if (value)
64914 +// vap->iv_flags |= IEEE80211_F_PUREG;
64915 +// else
64916 +// vap->iv_flags &= ~IEEE80211_F_PUREG;
64917 +// /* NB: reset only if we're operating on an 11g channel */
64918 +// if (ic->ic_bsschan != IEEE80211_CHAN_ANYC &&
64919 +// IEEE80211_IS_CHAN_ANYG(ic->ic_bsschan))
64920 +// retv = ENETRESET;
64921 +// break;
64922 +// case IEEE80211_PARAM_WDS:
64923 +// if (value)
64924 +// vap->iv_flags_ext |= IEEE80211_FEXT_WDS;
64925 +// else
64926 +// vap->iv_flags_ext &= ~IEEE80211_FEXT_WDS;
64927 +// break;
64928 +// case IEEE80211_PARAM_BGSCAN:
64929 +// if (value) {
64930 +// if ((vap->iv_caps & IEEE80211_C_BGSCAN) == 0)
64931 +// return -EINVAL;
64932 +// vap->iv_flags |= IEEE80211_F_BGSCAN;
64933 +// } else {
64934 +// /* XXX racey? */
64935 +// vap->iv_flags &= ~IEEE80211_F_BGSCAN;
64936 +// ieee80211_cancel_scan(vap); /* anything current */
64937 +// }
64938 +// break;
64939 +// case IEEE80211_PARAM_BGSCAN_IDLE:
64940 +// if (value >= IEEE80211_BGSCAN_IDLE_MIN)
64941 +// vap->iv_bgscanidle = value*HZ/1000;
64942 +// else
64943 +// retv = EINVAL;
64944 +// break;
64945 +// case IEEE80211_PARAM_BGSCAN_INTERVAL:
64946 +// if (value >= IEEE80211_BGSCAN_INTVAL_MIN)
64947 +// vap->iv_bgscanintvl = value*HZ;
64948 +// else
64949 +// retv = EINVAL;
64950 +// break;
64951 +// case IEEE80211_PARAM_MCAST_RATE:
64952 +// /* units are in KILObits per second */
64953 +// if (value >= 256 && value <= 54000)
64954 +// vap->iv_mcast_rate = value;
64955 +// else
64956 +// retv = EINVAL;
64957 +// break;
64958 +// case IEEE80211_PARAM_COVERAGE_CLASS:
64959 +// if (value >= 0 && value <= IEEE80211_COVERAGE_CLASS_MAX) {
64960 +// ic->ic_coverageclass = value;
64961 +// if (IS_UP_AUTO(vap))
64962 +// ieee80211_new_state(vap, IEEE80211_S_SCAN, 0);
64963 +// retv = 0;
64964 +// }
64965 +// else
64966 +// retv = EINVAL;
64967 +// break;
64968 +// case IEEE80211_PARAM_COUNTRY_IE:
64969 +// if (value)
64970 +// ic->ic_flags_ext |= IEEE80211_FEXT_COUNTRYIE;
64971 +// else
64972 +// ic->ic_flags_ext &= ~IEEE80211_FEXT_COUNTRYIE;
64973 +// retv = ENETRESET;
64974 +// break;
64975 +// case IEEE80211_PARAM_REGCLASS:
64976 +// if (value)
64977 +// ic->ic_flags_ext |= IEEE80211_FEXT_REGCLASS;
64978 +// else
64979 +// ic->ic_flags_ext &= ~IEEE80211_FEXT_REGCLASS;
64980 +// retv = ENETRESET;
64981 +// break;
64982 +// case IEEE80211_PARAM_SCANVALID:
64983 +// vap->iv_scanvalid = value*HZ;
64984 +// break;
64985 +// case IEEE80211_PARAM_ROAM_RSSI_11A:
64986 +// vap->iv_roam.rssi11a = value;
64987 +// break;
64988 +// case IEEE80211_PARAM_ROAM_RSSI_11B:
64989 +// vap->iv_roam.rssi11bOnly = value;
64990 +// break;
64991 +// case IEEE80211_PARAM_ROAM_RSSI_11G:
64992 +// vap->iv_roam.rssi11b = value;
64993 +// break;
64994 +// case IEEE80211_PARAM_ROAM_RATE_11A:
64995 +// vap->iv_roam.rate11a = value;
64996 +// break;
64997 +// case IEEE80211_PARAM_ROAM_RATE_11B:
64998 +// vap->iv_roam.rate11bOnly = value;
64999 +// break;
65000 +// case IEEE80211_PARAM_ROAM_RATE_11G:
65001 +// vap->iv_roam.rate11b = value;
65002 +// break;
65003 +// case IEEE80211_PARAM_UAPSDINFO:
65004 +// if (vap->iv_opmode == IEEE80211_M_HOSTAP) {
65005 +// if (ic->ic_caps & IEEE80211_C_UAPSD) {
65006 +// if (value)
65007 +// IEEE80211_VAP_UAPSD_ENABLE(vap);
65008 +// else
65009 +// IEEE80211_VAP_UAPSD_DISABLE(vap);
65010 +// retv = ENETRESET;
65011 +// }
65012 +// }
65013 +// else if (vap->iv_opmode == IEEE80211_M_STA) {
65014 +// vap->iv_uapsdinfo = value;
65015 +// IEEE80211_VAP_UAPSD_ENABLE(vap);
65016 +// retv = ENETRESET;
65017 +// }
65018 +// break;
65019 +// case IEEE80211_PARAM_SLEEP:
65020 +// /* XXX: Forced sleep for testing. Does not actually place the
65021 +// * HW in sleep mode yet. this only makes sense for STAs.
65022 +// */
65023 +// if (value) {
65024 +// /* goto sleep */
65025 +// IEEE80211_VAP_GOTOSLEEP(vap);
65026 +// }
65027 +// else {
65028 +// /* wakeup */
65029 +// IEEE80211_VAP_WAKEUP(vap);
65030 +// }
65031 +// ieee80211_send_nulldata(ieee80211_ref_node(vap->iv_bss));
65032 +// break;
65033 +// case IEEE80211_PARAM_QOSNULL:
65034 +// /* Force a QoS Null for testing. */
65035 +// ieee80211_send_qosnulldata(vap->iv_bss, value);
65036 +// break;
65037 +// case IEEE80211_PARAM_PSPOLL:
65038 +// /* Force a PS-POLL for testing. */
65039 +// ieee80211_send_pspoll(vap->iv_bss);
65040 +// break;
65041 +// case IEEE80211_PARAM_EOSPDROP:
65042 +// if (vap->iv_opmode == IEEE80211_M_HOSTAP) {
65043 +// if (value) IEEE80211_VAP_EOSPDROP_ENABLE(vap);
65044 +// else IEEE80211_VAP_EOSPDROP_DISABLE(vap);
65045 +// }
65046 +// break;
65047 +// case IEEE80211_PARAM_MARKDFS:
65048 +// if (value)
65049 +// ic->ic_flags_ext |= IEEE80211_FEXT_MARKDFS;
65050 +// else
65051 +// ic->ic_flags_ext &= ~IEEE80211_FEXT_MARKDFS;
65052 +// break;
65053 +// case IEEE80211_PARAM_CHANBW:
65054 +// switch (value) {
65055 +// case 0:
65056 +// ic->ic_chanbwflag = 0;
65057 +// break;
65058 +// case 1:
65059 +// ic->ic_chanbwflag = IEEE80211_CHAN_HALF;
65060 +// break;
65061 +// case 2:
65062 +// ic->ic_chanbwflag = IEEE80211_CHAN_QUARTER;
65063 +// break;
65064 +// default:
65065 +// retv = EINVAL;
65066 +// break;
65067 +// }
65068 +// break;
65069 +// case IEEE80211_PARAM_SHORTPREAMBLE:
65070 +// if (value) {
65071 +// ic->ic_caps |= IEEE80211_C_SHPREAMBLE;
65072 +// } else {
65073 +// ic->ic_caps &= ~IEEE80211_C_SHPREAMBLE;
65074 +// }
65075 +// retv = ENETRESET;
65076 +// break;
65077 +// default:
65078 +// retv = EOPNOTSUPP;
65079 +// break;
65080 +// }
65081 +// /* XXX should any of these cause a rescan? */
65082 +// if (retv == ENETRESET)
65083 +// retv = IS_UP_AUTO(vap) ? ieee80211_open(vap->iv_dev) : 0;
65084 +// return -retv;
65085 +//}
65086 +
65087 +int usbdrvwext_setmode(struct net_device *dev, struct iw_request_info *info,
65088 + void *w, char *extra)
65089 +{
65090 + return 0;
65091 +}
65092 +
65093 +int usbdrvwext_getmode(struct net_device *dev, struct iw_request_info *info,
65094 + void *w, char *extra)
65095 +{
65096 + //struct usbdrv_private *macp = dev->priv;
65097 + struct iw_point *wri = (struct iw_point *)extra;
65098 + char mode[8];
65099 +
65100 + strcpy(mode,"11g");
65101 + return (copy_to_user(wri->pointer, mode, 6) ? -EFAULT : 0);
65102 +}
65103 +
65104 +int zfLnxPrivateIoctl(struct net_device *dev, struct zdap_ioctl* zdreq)
65105 +{
65106 + //void* regp = macp->regp;
65107 + u16_t cmd;
65108 + //u32_t temp;
65109 + u32_t* p;
65110 + u32_t i;
65111 +
65112 + cmd = zdreq->cmd;
65113 + switch(cmd)
65114 + {
65115 + case ZM_IOCTL_REG_READ:
65116 + zfiDbgReadReg(dev, zdreq->addr);
65117 + break;
65118 +
65119 + case ZM_IOCTL_REG_WRITE:
65120 + zfiDbgWriteReg(dev, zdreq->addr, zdreq->value);
65121 + break;
65122 +
65123 + case ZM_IOCTL_MEM_READ:
65124 + p = (u32_t *) bus_to_virt(zdreq->addr);
65125 + printk(KERN_DEBUG "usbdrv: read memory addr: 0x%08x value: 0x%08x\n", zdreq->addr, *p);
65126 + break;
65127 +
65128 + case ZM_IOCTL_MEM_WRITE:
65129 + p = (u32_t *) bus_to_virt(zdreq->addr);
65130 + *p = zdreq->value;
65131 + printk(KERN_DEBUG "usbdrv: write value: 0x%08x to memory addr: 0x%08x\n", zdreq->value, zdreq->addr);
65132 + break;
65133 +
65134 + case ZM_IOCTL_TALLY :
65135 + zfiWlanShowTally(dev);
65136 + if (zdreq->addr)
65137 + zfiWlanResetTally(dev);
65138 + break;
65139 +
65140 + case ZM_IOCTL_TEST :
65141 + printk(KERN_DEBUG "ZM_IOCTL_TEST:len=%d\n", zdreq->addr);
65142 + //zfiWlanReadReg(dev, 0x10f400);
65143 + //zfiWlanReadReg(dev, 0x10f404);
65144 + printk("IOCTL TEST\n");
65145 + #if 1
65146 + //print packet
65147 + for (i=0; i<zdreq->addr; i++)
65148 + {
65149 + if ((i&0x7) == 0)
65150 + {
65151 + printk("\n");
65152 + }
65153 + printk("%02X ", (unsigned char)zdreq->data[i]);
65154 + }
65155 + printk("\n");
65156 + #endif
65157 +
65158 +
65159 + #if 0 //For Test?? 1 to 0 by CWYang(-)
65160 + {
65161 + struct sk_buff* s;
65162 +
65163 + /* Allocate a skb */
65164 + s = alloc_skb(2000, GFP_ATOMIC);
65165 +
65166 + /* Copy data to skb */
65167 + for (i=0; i<zdreq->addr; i++)
65168 + {
65169 + s->data[i] = zdreq->data[i];
65170 + }
65171 + s->len = zdreq->addr;
65172 +
65173 + /* Call zfIdlRecv() */
65174 + zfiRecv80211(dev, s, NULL);
65175 + }
65176 + #endif
65177 +
65178 + break;
65179 +
65180 +
65181 +/****************************** ZDCONFIG ******************************/
65182 + case ZM_IOCTL_FRAG :
65183 + zfiWlanSetFragThreshold(dev, zdreq->addr);
65184 + break;
65185 +
65186 + case ZM_IOCTL_RTS :
65187 + zfiWlanSetRtsThreshold(dev, zdreq->addr);
65188 + break;
65189 +
65190 + case ZM_IOCTL_SCAN :
65191 + zfiWlanScan(dev);
65192 + break;
65193 +
65194 + case ZM_IOCTL_KEY :
65195 + {
65196 + u8_t key[29];
65197 + struct zsKeyInfo keyInfo;
65198 + u32_t i;
65199 +
65200 + for (i=0; i<29; i++)
65201 + {
65202 + key[i] = 0;
65203 + }
65204 +
65205 + for (i=0; i<zdreq->addr; i++)
65206 + {
65207 + key[i] = zdreq->data[i];
65208 + }
65209 +
65210 + printk("key len=%d, key=%02x%02x%02x%02x%02x...\n",
65211 + zdreq->addr, key[0], key[1], key[2], key[3], key[4]);
65212 +
65213 + keyInfo.keyLength = zdreq->addr;
65214 + keyInfo.keyIndex = 0;
65215 + keyInfo.flag = 0;
65216 + keyInfo.key = key;
65217 + zfiWlanSetKey(dev, keyInfo);
65218 + }
65219 + break;
65220 +
65221 + case ZM_IOCTL_RATE :
65222 + zfiWlanSetTxRate(dev, zdreq->addr);
65223 + break;
65224 +
65225 + case ZM_IOCTL_ENCRYPTION_MODE :
65226 + zfiWlanSetEncryMode(dev, zdreq->addr);
65227 +
65228 + zfiWlanDisable(dev, 0);
65229 + zfiWlanEnable(dev);
65230 + break;
65231 + //CWYang(+)
65232 + case ZM_IOCTL_SIGNAL_STRENGTH :
65233 + {
65234 + u8_t buffer[2];
65235 + zfiWlanQuerySignalInfo(dev, &buffer[0]);
65236 + printk("Current Signal Strength : %02d\n", buffer[0]);
65237 + }
65238 + break;
65239 + //CWYang(+)
65240 + case ZM_IOCTL_SIGNAL_QUALITY :
65241 + {
65242 + u8_t buffer[2];
65243 + zfiWlanQuerySignalInfo(dev, &buffer[0]);
65244 + printk("Current Signal Quality : %02d\n", buffer[1]);
65245 + }
65246 + break;
65247 +
65248 + case ZM_IOCTL_SET_PIBSS_MODE:
65249 + if (zdreq->addr == 1)
65250 + zfiWlanSetWlanMode(dev, ZM_MODE_PSEUDO);
65251 + else
65252 + zfiWlanSetWlanMode(dev, ZM_MODE_INFRASTRUCTURE);
65253 +
65254 + zfiWlanDisable(dev, 0);
65255 + zfiWlanEnable(dev);
65256 +
65257 + break;
65258 +/****************************** ZDCONFIG ******************************/
65259 +
65260 + default :
65261 + printk(KERN_ERR "usbdrv: error command = %x\n", cmd);
65262 + break;
65263 + }
65264 +
65265 + return 0;
65266 +}
65267 +
65268 +int usbdrv_wpa_ioctl(struct net_device *dev, struct athr_wlan_param *zdparm)
65269 +{
65270 + int ret = 0;
65271 + u8_t bc_addr[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
65272 + u8_t mac_addr[80];
65273 + struct zsKeyInfo keyInfo;
65274 + struct usbdrv_private *macp = dev->priv;
65275 + u16_t vapId = 0;
65276 +
65277 + //zmw_get_wlan_dev(dev);
65278 +
65279 + switch(zdparm->cmd)
65280 + {
65281 + case ZD_CMD_SET_ENCRYPT_KEY:
65282 +
65283 + /* Set up key information */
65284 + keyInfo.keyLength = zdparm->u.crypt.key_len;
65285 + keyInfo.keyIndex = zdparm->u.crypt.idx;
65286 + if (zfiWlanQueryWlanMode(dev) == ZM_MODE_AP) // AP Mode
65287 + keyInfo.flag = ZM_KEY_FLAG_AUTHENTICATOR;
65288 + else
65289 + keyInfo.flag = 0;
65290 + keyInfo.key = zdparm->u.crypt.key;
65291 + keyInfo.initIv = zdparm->u.crypt.seq;
65292 + keyInfo.macAddr = (u16_t *)zdparm->sta_addr;
65293 +
65294 + /* Identify the MAC address information */
65295 + if (memcmp(zdparm->sta_addr, bc_addr, sizeof(bc_addr)) == 0)
65296 + {
65297 + keyInfo.flag |= ZM_KEY_FLAG_GK;
65298 + }
65299 + else
65300 + {
65301 + keyInfo.flag |= ZM_KEY_FLAG_PK;
65302 + }
65303 +
65304 + if (!strcmp(zdparm->u.crypt.alg, "NONE"))
65305 + {
65306 + //u8_t zero_mac[]={0,0,0,0,0,0};
65307 +
65308 + /* Set key length to zero */
65309 + keyInfo.keyLength = 0;
65310 +
65311 + if (zdparm->sta_addr[0] & 1)//del group key
65312 + {
65313 + //if (macp->cardSetting.WPAIeLen==0)
65314 + //{//802.1x dynamic WEP
65315 + // mDynKeyMode = 0;
65316 + // mKeyFormat[0] = 0;
65317 + // mPrivacyInvoked[0]=FALSE;
65318 + // mCap[0] &= ~CAP_PRIVACY;
65319 + // macp->cardSetting.EncryOnOff[0]=0;
65320 + //}
65321 + //mWpaBcKeyLen = mGkInstalled = 0;
65322 + }
65323 + else
65324 + {
65325 + //if (memcmp(zero_mac,zdparm->sta_addr, 6)==0)
65326 + //{
65327 + // mDynKeyMode=0;
65328 + // mKeyFormat[0]=0;
65329 + // pSetting->DynKeyMode=0;
65330 + // pSetting->EncryMode[0]=0;
65331 + // mDynKeyMode=0;
65332 + //}
65333 + }
65334 +
65335 + printk(KERN_ERR "Set Encryption Type NONE\n");
65336 + return ret;
65337 + }
65338 + else if (!strcmp(zdparm->u.crypt.alg, "TKIP"))
65339 + {
65340 + zfiWlanSetEncryMode(dev, ZM_TKIP);
65341 + //Linux Supplicant will inverse Tx/Rx key
65342 + //So we inverse it back //CWYang(+)
65343 + //zfMemoryCopy(&temp[0], &keyInfo.key[16], 8);
65344 + //zfMemoryCopy(&keyInfo.key[16], keyInfo.key[24], 8);
65345 + //zfMemoryCopy(&keyInfo.key[24], &temp[0], 8);
65346 + //u8_t temp;
65347 + //int k;
65348 + //for (k = 0; k < 8; k++)
65349 + //{
65350 + // temp = keyInfo.key[16 + k];
65351 + // keyInfo.key[16 + k] = keyInfo.key[24 + k];
65352 + // keyInfo.key[24 + k] = temp;
65353 + //}
65354 + //CamEncryType = ZM_TKIP;
65355 + ////if (idx == 0)
65356 + //{// Pairwise key
65357 + // mKeyFormat[0] = CamEncryType;
65358 + // mDynKeyMode = pSetting->DynKeyMode = DYN_KEY_TKIP;
65359 + //}
65360 + }
65361 + else if (!strcmp(zdparm->u.crypt.alg, "CCMP"))
65362 + {
65363 + zfiWlanSetEncryMode(dev, ZM_AES);
65364 + //CamEncryType = ZM_AES;
65365 + ////if (idx == 0)
65366 + //{// Pairwise key
65367 + // mKeyFormat[0] = CamEncryType;
65368 + // mDynKeyMode = pSetting->DynKeyMode = DYN_KEY_AES;
65369 + //}
65370 + }
65371 + else if (!strcmp(zdparm->u.crypt.alg, "WEP"))
65372 + {
65373 + if (keyInfo.keyLength == 5)
65374 + { // WEP 64
65375 + zfiWlanSetEncryMode(dev, ZM_WEP64);
65376 + // CamEncryType = ZM_WEP64;
65377 + // tmpDynKeyMode=DYN_KEY_WEP64;
65378 + }
65379 + else if (keyInfo.keyLength == 13)
65380 + {//keylen=13, WEP 128
65381 + zfiWlanSetEncryMode(dev, ZM_WEP128);
65382 + // CamEncryType = ZM_WEP128;
65383 + // tmpDynKeyMode=DYN_KEY_WEP128;
65384 + }
65385 + else
65386 + {
65387 + zfiWlanSetEncryMode(dev, ZM_WEP256);
65388 + }
65389 +
65390 + // For Dynamic WEP key (Non-WPA Radius), the key ID range: 0-3
65391 + // In WPA/RSN mode, the key ID range: 1-3, usually, a broadcast key.
65392 + // For WEP key setting: we set mDynKeyMode and mKeyFormat in following case:
65393 + // 1. For 802.1x dynamically generated WEP key method.
65394 + // 2. For WPA/RSN mode, but key id == 0. (But this is an impossible case)
65395 + // So, only check case 1.
65396 + //if (macp->cardSetting.WPAIeLen==0)
65397 + //{
65398 + // mKeyFormat[0] = CamEncryType;
65399 + // mDynKeyMode = pSetting->DynKeyMode = tmpDynKeyMode;
65400 + // mPrivacyInvoked[0]=TRUE;
65401 + // mCap[0] |= CAP_PRIVACY;
65402 + // macp->cardSetting.EncryOnOff[0]=1;
65403 + //}
65404 + }
65405 +
65406 + /* DUMP key context */
65407 +//#ifdef WPA_DEBUG
65408 + if (keyInfo.keyLength > 0)
65409 + {
65410 + int ii;
65411 + printk("Otus: Key Context:\n");
65412 + for(ii = 0; ii < keyInfo.keyLength;)
65413 + {
65414 + printk("0x%02x ", keyInfo.key[ii]);
65415 + if((++ii % 16) == 0)
65416 + printk("\n");
65417 + }
65418 + printk("\n");
65419 + }
65420 +//#endif
65421 +
65422 + /* Set encrypt mode */
65423 + //zfiWlanSetEncryMode(dev, CamEncryType);
65424 + vapId = zfLnxGetVapId(dev);
65425 + if (vapId == 0xffff)
65426 + keyInfo.vapId = 0;
65427 + else
65428 + keyInfo.vapId = vapId + 1;
65429 + keyInfo.vapAddr[0] = keyInfo.macAddr[0];
65430 + keyInfo.vapAddr[1] = keyInfo.macAddr[1];
65431 + keyInfo.vapAddr[2] = keyInfo.macAddr[2];
65432 +
65433 + zfiWlanSetKey(dev, keyInfo);
65434 +
65435 + //zfiWlanDisable(dev);
65436 + //zfiWlanEnable(dev);
65437 + break;
65438 +
65439 + case ZD_CMD_SET_MLME:
65440 + printk(KERN_ERR "usbdrv_wpa_ioctl: ZD_CMD_SET_MLME\n");
65441 +
65442 + /* Translate STA's address */
65443 + sprintf(mac_addr, "%02x:%02x:%02x:%02x:%02x:%02x", zdparm->sta_addr[0], zdparm->sta_addr[1],
65444 + zdparm->sta_addr[2], zdparm->sta_addr[3], zdparm->sta_addr[4], zdparm->sta_addr[5]);
65445 +
65446 + switch(zdparm->u.mlme.cmd)
65447 + {
65448 + case MLME_STA_DEAUTH:
65449 + printk(" -------Call zfiWlanDeauth, reason:%d\n",zdparm->u.mlme.reason_code);
65450 + if(zfiWlanDeauth(dev, (u16_t*) zdparm->sta_addr, zdparm->u.mlme.reason_code) != 0)
65451 + printk(KERN_ERR "Can't deauthencate STA: %s\n", mac_addr);
65452 + else
65453 + printk(KERN_ERR "Deauthenticate STA: %s with reason code: %d\n", mac_addr, zdparm->u.mlme.reason_code);
65454 + break;
65455 +
65456 + case MLME_STA_DISASSOC:
65457 + printk(" -------Call zfiWlanDeauth, reason:%d\n",zdparm->u.mlme.reason_code);
65458 + if(zfiWlanDeauth(dev, (u16_t*) zdparm->sta_addr, zdparm->u.mlme.reason_code) != 0)
65459 + printk(KERN_ERR "Can't disassociate STA: %s\n", mac_addr);
65460 + else
65461 + printk(KERN_ERR "Disassociate STA: %s with reason code: %d\n", mac_addr, zdparm->u.mlme.reason_code);
65462 + break;
65463 +
65464 + default:
65465 + printk(KERN_ERR "MLME command: 0x%04x not support\n", zdparm->u.mlme.cmd);
65466 + break;
65467 + }
65468 +
65469 + break;
65470 +
65471 + case ZD_CMD_SCAN_REQ:
65472 + printk(KERN_ERR "usbdrv_wpa_ioctl: ZD_CMD_SCAN_REQ\n");
65473 + break;
65474 +
65475 + case ZD_CMD_SET_GENERIC_ELEMENT:
65476 + printk(KERN_ERR "usbdrv_wpa_ioctl: ZD_CMD_SET_GENERIC_ELEMENT\n");
65477 +
65478 + /* Copy the WPA IE */
65479 + //zm_msg1_mm(ZM_LV_0, "CWY - wpaie Length : ", zdparm->u.generic_elem.len);
65480 + printk(KERN_ERR "wpaie Length : %d\n", zdparm->u.generic_elem.len);
65481 + if (zfiWlanQueryWlanMode(dev) == ZM_MODE_AP) // AP Mode
65482 + {
65483 + zfiWlanSetWpaIe(dev, zdparm->u.generic_elem.data, zdparm->u.generic_elem.len);
65484 + }
65485 + else
65486 + {
65487 + macp->supLen = zdparm->u.generic_elem.len;
65488 + memcpy(macp->supIe, zdparm->u.generic_elem.data, zdparm->u.generic_elem.len);
65489 + }
65490 + zfiWlanSetWpaSupport(dev, 1);
65491 + //zfiWlanSetWpaIe(dev, zdparm->u.generic_elem.data, zdparm->u.generic_elem.len);
65492 + {
65493 + int ii;
65494 + u8_t len = zdparm->u.generic_elem.len;
65495 + u8_t *wpaie = (u8_t *)zdparm->u.generic_elem.data;
65496 +
65497 + printk(KERN_ERR "wd->ap.wpaLen: %d\n", len);
65498 +
65499 + /* DUMP WPA IE */
65500 + for(ii = 0; ii < len;)
65501 + {
65502 + printk(KERN_ERR "0x%02x ", wpaie[ii]);
65503 +
65504 + if((++ii % 16) == 0)
65505 + printk(KERN_ERR "\n");
65506 + }
65507 + printk(KERN_ERR "\n");
65508 + }
65509 +
65510 +// #ifdef ZM_HOSTAPD_SUPPORT
65511 + //if (wd->wlanMode == ZM_MODE_AP)
65512 + //{// Update Beacon FIFO in the next TBTT.
65513 + // memcpy(&mWPAIe, pSetting->WPAIe, pSetting->WPAIeLen);
65514 + // printk(KERN_ERR "Copy WPA IE into mWPAIe\n");
65515 + //}
65516 +// #endif
65517 + break;
65518 +
65519 +// #ifdef ZM_HOSTAPD_SUPPORT
65520 + case ZD_CMD_GET_TSC:
65521 + printk(KERN_ERR "usbdrv_wpa_ioctl: ZD_CMD_GET_TSC\n");
65522 + break;
65523 +// #endif
65524 +
65525 + default:
65526 + printk(KERN_ERR "usbdrv_wpa_ioctl default: 0x%04x\n", zdparm->cmd);
65527 + ret = -EINVAL;
65528 + break;
65529 + }
65530 +
65531 + return ret;
65532 +}
65533 +
65534 +#ifdef ZM_ENABLE_CENC
65535 +int usbdrv_cenc_ioctl(struct net_device *dev, struct zydas_cenc_param *zdparm)
65536 +{
65537 + //struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
65538 + struct zsKeyInfo keyInfo;
65539 + u16_t apId;
65540 + u8_t bc_addr[6] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
65541 + int ret = 0;
65542 + int ii;
65543 +
65544 + /* Get the AP Id */
65545 + apId = zfLnxGetVapId(dev);
65546 +
65547 + if (apId == 0xffff)
65548 + {
65549 + apId = 0;
65550 + }
65551 + else
65552 + {
65553 + apId = apId+1;
65554 + }
65555 +
65556 + switch (zdparm->cmd)
65557 + {
65558 + case ZM_CMD_CENC_SETCENC:
65559 + printk(KERN_ERR "ZM_CMD_CENC_SETCENC\n");
65560 + printk(KERN_ERR "length: %d\n", zdparm->len);
65561 + printk(KERN_ERR "policy: %d\n", zdparm->u.info.cenc_policy);
65562 + break;
65563 + case ZM_CMD_CENC_SETKEY:
65564 + //ret = wai_ioctl_setkey(vap, ioctl_msg);
65565 + printk(KERN_ERR "ZM_CMD_CENC_SETKEY\n");
65566 +
65567 + printk(KERN_ERR "MAC address= ");
65568 + for(ii = 0; ii < 6; ii++)
65569 + {
65570 + printk(KERN_ERR "0x%02x ", zdparm->u.crypt.sta_addr[ii]);
65571 + }
65572 + printk(KERN_ERR "\n");
65573 +
65574 + printk(KERN_ERR "Key Index: %d\n", zdparm->u.crypt.keyid);
65575 + printk(KERN_ERR "Encryption key= ");
65576 + for(ii = 0; ii < 16; ii++)
65577 + {
65578 + printk(KERN_ERR "0x%02x ", zdparm->u.crypt.key[ii]);
65579 + }
65580 + printk(KERN_ERR "\n");
65581 +
65582 + printk(KERN_ERR "MIC key= ");
65583 + for(ii = 16; ii < ZM_CENC_KEY_SIZE; ii++)
65584 + {
65585 + printk(KERN_ERR "0x%02x ", zdparm->u.crypt.key[ii]);
65586 + }
65587 + printk(KERN_ERR "\n");
65588 +
65589 + /* Set up key information */
65590 + keyInfo.keyLength = ZM_CENC_KEY_SIZE;
65591 + keyInfo.keyIndex = zdparm->u.crypt.keyid;
65592 + keyInfo.flag = ZM_KEY_FLAG_AUTHENTICATOR | ZM_KEY_FLAG_CENC;
65593 + keyInfo.key = zdparm->u.crypt.key;
65594 + keyInfo.macAddr = (u16_t *)zdparm->u.crypt.sta_addr;
65595 +
65596 + /* Identify the MAC address information */
65597 + if (memcmp(zdparm->u.crypt.sta_addr, bc_addr, sizeof(bc_addr)) == 0)
65598 + {
65599 + keyInfo.flag |= ZM_KEY_FLAG_GK;
65600 + keyInfo.vapId = apId;
65601 + memcpy(keyInfo.vapAddr, dev->dev_addr, ETH_ALEN);
65602 + }
65603 + else
65604 + {
65605 + keyInfo.flag |= ZM_KEY_FLAG_PK;
65606 + }
65607 +
65608 + zfiWlanSetKey(dev, keyInfo);
65609 +
65610 + break;
65611 + case ZM_CMD_CENC_REKEY:
65612 + //ret = wai_ioctl_rekey(vap, ioctl_msg);
65613 + printk(KERN_ERR "ZM_CMD_CENC_REKEY\n");
65614 + break;
65615 + default:
65616 + ret = -EOPNOTSUPP;
65617 + break;
65618 +
65619 + }
65620 +
65621 + //if (retv == ENETRESET)
65622 + // retv = IS_UP_AUTO(vap) ? ieee80211_open(vap->iv_dev) : 0;
65623 +
65624 + return ret;
65625 +}
65626 +#endif //ZM_ENABLE_CENC
65627 +/////////////////////////////////////////
65628 +int usbdrv_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
65629 +{
65630 +// struct usbdrv_private *macp;
65631 +// void *regp;
65632 + struct zdap_ioctl zdreq;
65633 + struct iwreq *wrq = (struct iwreq *)ifr;
65634 + struct athr_wlan_param zdparm;
65635 + struct usbdrv_private *macp = dev->priv;
65636 +
65637 + int err = 0;
65638 + int changed = 0;
65639 +
65640 +// macp = dev->priv;
65641 +// regp = macp->regp;
65642 +
65643 + if(!netif_running(dev))
65644 + return -EINVAL;
65645 +
65646 + switch (cmd)
65647 + {
65648 + case SIOCGIWNAME:
65649 + strcpy(wrq->u.name, "IEEE 802.11-DS");
65650 + break;
65651 +
65652 + case SIOCGIWAP:
65653 + err = usbdrvwext_giwap(dev, NULL, &wrq->u.ap_addr, NULL);
65654 + break;
65655 +
65656 +
65657 + case SIOCSIWAP:
65658 + err = usbdrvwext_siwap(dev, NULL, &wrq->u.ap_addr, NULL);
65659 + break;
65660 +
65661 +
65662 + case SIOCGIWMODE:
65663 + err = usbdrvwext_giwmode(dev, NULL, &wrq->u.mode, NULL);
65664 + break;
65665 +
65666 +
65667 + case SIOCSIWESSID:
65668 + printk(KERN_ERR "CWY - usbdrvwext_siwessid\n");
65669 + //err = usbdrv_ioctl_setessid(dev, &wrq->u.essid);
65670 + err = usbdrvwext_siwessid(dev, NULL, &wrq->u.essid, NULL);
65671 +
65672 + if (! err)
65673 + changed = 1;
65674 + break;
65675 +
65676 +
65677 + case SIOCGIWESSID:
65678 + err = usbdrvwext_giwessid(dev, NULL, &wrq->u.essid, NULL);
65679 + break;
65680 +
65681 +
65682 + case SIOCSIWRTS:
65683 +
65684 + err = usbdrv_ioctl_setrts(dev, &wrq->u.rts);
65685 + if (! err)
65686 + changed = 1;
65687 + break;
65688 +
65689 +
65690 + case SIOCIWFIRSTPRIV + 0x2: /* set_auth */
65691 + {
65692 + //printk("CWY - SIOCIWFIRSTPRIV + 0x2 (set_auth)\n");
65693 + if (! capable(CAP_NET_ADMIN))
65694 + {
65695 + err = -EPERM;
65696 + break;
65697 + }
65698 + {
65699 + int val = *( (int *) wrq->u.name );
65700 + if ((val < 0) || (val > 2))
65701 + {
65702 + err = -EINVAL;
65703 + break;
65704 + }
65705 + else
65706 + {
65707 + zfiWlanSetAuthenticationMode(dev, val);
65708 +
65709 + if (macp->DeviceOpened == 1)
65710 + {
65711 + zfiWlanDisable(dev, 0);
65712 + zfiWlanEnable(dev);
65713 + }
65714 +
65715 + err = 0;
65716 + changed = 1;
65717 + }
65718 + }
65719 + }
65720 + break;
65721 +
65722 + case SIOCIWFIRSTPRIV + 0x3: /* get_auth */
65723 + {
65724 + int AuthMode = ZM_AUTH_MODE_OPEN;
65725 +
65726 + //printk("CWY - SIOCIWFIRSTPRIV + 0x3 (get_auth)\n");
65727 +
65728 + if (wrq->u.data.pointer)
65729 + {
65730 + wrq->u.data.flags = 1;
65731 +
65732 + AuthMode = zfiWlanQueryAuthenticationMode(dev, 0);
65733 + if (AuthMode == ZM_AUTH_MODE_OPEN)
65734 + {
65735 + wrq->u.data.length = 12;
65736 +
65737 + if (copy_to_user(wrq->u.data.pointer, "open system", 12))
65738 + {
65739 + return -EFAULT;
65740 + }
65741 + }
65742 + else if (AuthMode == ZM_AUTH_MODE_SHARED_KEY)
65743 + {
65744 + wrq->u.data.length = 11;
65745 +
65746 + if (copy_to_user(wrq->u.data.pointer, "shared key", 11))
65747 + {
65748 + return -EFAULT;
65749 + }
65750 + }
65751 + else if (AuthMode == ZM_AUTH_MODE_AUTO)
65752 + {
65753 + wrq->u.data.length = 10;
65754 +
65755 + if (copy_to_user(wrq->u.data.pointer, "auto mode", 10))
65756 + {
65757 + return -EFAULT;
65758 + }
65759 + }
65760 + else
65761 + {
65762 + return -EFAULT;
65763 + }
65764 + }
65765 + }
65766 + break;
65767 +
65768 +
65769 + case ZDAPIOCTL: //debug command
65770 + if (copy_from_user(&zdreq, ifr->ifr_data, sizeof (zdreq)))
65771 + {
65772 + printk(KERN_ERR "usbdrv: copy_from_user error\n");
65773 + return -EFAULT;
65774 + }
65775 +
65776 + //printk(KERN_DEBUG "usbdrv: cmd=%2x, reg=0x%04lx, value=0x%08lx\n",
65777 + // zdreq.cmd, zdreq.addr, zdreq.value);
65778 +
65779 + zfLnxPrivateIoctl(dev, &zdreq);
65780 +
65781 + err = 0;
65782 + break;
65783 +
65784 + case ZD_IOCTL_WPA:
65785 + if (copy_from_user(&zdparm, ifr->ifr_data, sizeof(struct athr_wlan_param)))
65786 + {
65787 + printk(KERN_ERR "usbdrv: copy_from_user error\n");
65788 + return -EFAULT;
65789 + }
65790 +
65791 + usbdrv_wpa_ioctl(dev, &zdparm);
65792 + err = 0;
65793 + break;
65794 +
65795 + case ZD_IOCTL_PARAM:
65796 + {
65797 + int *p;
65798 + int op;
65799 + int arg;
65800 +
65801 + /* Point to the name field and retrieve the
65802 + * op and arg elements. */
65803 + p = (int *)wrq->u.name;
65804 + op = *p++;
65805 + arg = *p;
65806 +
65807 + if(op == ZD_PARAM_ROAMING)
65808 + {
65809 + printk(KERN_ERR "************* ZD_PARAM_ROAMING: %d\n", arg);
65810 + //macp->cardSetting.ap_scan=(U8)arg;
65811 + }
65812 + if(op == ZD_PARAM_PRIVACY)
65813 + {
65814 + printk(KERN_ERR "ZD_IOCTL_PRIVACY: ");
65815 +
65816 + /* Turn on the privacy invoke flag */
65817 + if(arg)
65818 + {
65819 + // mCap[0] |= CAP_PRIVACY;
65820 + // macp->cardSetting.EncryOnOff[0] = 1;
65821 + printk(KERN_ERR "enable\n");
65822 +
65823 + }
65824 + else
65825 + {
65826 + // mCap[0] &= ~CAP_PRIVACY;
65827 + // macp->cardSetting.EncryOnOff[0] = 0;
65828 + printk(KERN_ERR "disable\n");
65829 + }
65830 + //changed=1;
65831 + }
65832 + if(op == ZD_PARAM_WPA)
65833 + {
65834 + printk(KERN_ERR "ZD_PARAM_WPA: ");
65835 +
65836 + if(arg)
65837 + {
65838 + printk(KERN_ERR "enable\n");
65839 +
65840 + if (zfiWlanQueryWlanMode(dev) != ZM_MODE_AP)
65841 + {
65842 + printk(KERN_ERR "Station Mode\n");
65843 + //zfiWlanQueryWpaIe(dev, (u8_t *)&wpaIe, &wpalen);
65844 + //printk("wpaIe : %2x,%2x,%2x\n", wpaIe[21], wpaIe[22], wpaIe[23]);
65845 + //printk("rsnIe : %2x,%2x,%2x\n", wpaIe[17], wpaIe[18], wpaIe[19]);
65846 + if ((macp->supIe[21] == 0x50) &&
65847 + (macp->supIe[22] == 0xf2) &&
65848 + (macp->supIe[23] == 0x2))
65849 + {
65850 + printk(KERN_ERR "wd->sta.authMode = ZM_AUTH_MODE_WPAPSK\n");
65851 + //wd->sta.authMode = ZM_AUTH_MODE_WPAPSK;
65852 + //wd->ws.authMode = ZM_AUTH_MODE_WPAPSK;
65853 + zfiWlanSetAuthenticationMode(dev, ZM_AUTH_MODE_WPAPSK);
65854 + }
65855 + else if ((macp->supIe[21] == 0x50) &&
65856 + (macp->supIe[22] == 0xf2) &&
65857 + (macp->supIe[23] == 0x1))
65858 + {
65859 + printk(KERN_ERR "wd->sta.authMode = ZM_AUTH_MODE_WPA\n");
65860 + //wd->sta.authMode = ZM_AUTH_MODE_WPA;
65861 + //wd->ws.authMode = ZM_AUTH_MODE_WPA;
65862 + zfiWlanSetAuthenticationMode(dev, ZM_AUTH_MODE_WPA);
65863 + }
65864 + else if ((macp->supIe[17] == 0xf) &&
65865 + (macp->supIe[18] == 0xac) &&
65866 + (macp->supIe[19] == 0x2))
65867 + {
65868 + printk(KERN_ERR "wd->sta.authMode = ZM_AUTH_MODE_WPA2PSK\n");
65869 + //wd->sta.authMode = ZM_AUTH_MODE_WPA2PSK;
65870 + //wd->ws.authMode = ZM_AUTH_MODE_WPA2PSK;
65871 + zfiWlanSetAuthenticationMode(dev, ZM_AUTH_MODE_WPA2PSK);
65872 + }
65873 + else if ((macp->supIe[17] == 0xf) &&
65874 + (macp->supIe[18] == 0xac) &&
65875 + (macp->supIe[19] == 0x1))
65876 + {
65877 + printk(KERN_ERR "wd->sta.authMode = ZM_AUTH_MODE_WPA2\n");
65878 + //wd->sta.authMode = ZM_AUTH_MODE_WPA2;
65879 + //wd->ws.authMode = ZM_AUTH_MODE_WPA2;
65880 + zfiWlanSetAuthenticationMode(dev, ZM_AUTH_MODE_WPA2);
65881 + }
65882 + if ((macp->supIe[21] == 0x50) || (macp->supIe[22] == 0xf2))//WPA or WPAPSK
65883 + {
65884 + if (macp->supIe[11] == 0x2)
65885 + {
65886 + printk(KERN_ERR "wd->sta.wepStatus = ZM_ENCRYPTION_TKIP\n");
65887 + //wd->sta.wepStatus = ZM_ENCRYPTION_TKIP;
65888 + //wd->ws.wepStatus = ZM_ENCRYPTION_TKIP;
65889 + zfiWlanSetWepStatus(dev, ZM_ENCRYPTION_TKIP);
65890 + }
65891 + else
65892 + {
65893 + printk(KERN_ERR "wd->sta.wepStatus = ZM_ENCRYPTION_AES\n");
65894 + //wd->sta.wepStatus = ZM_ENCRYPTION_AES;
65895 + //wd->ws.wepStatus = ZM_ENCRYPTION_AES;
65896 + zfiWlanSetWepStatus(dev, ZM_ENCRYPTION_AES);
65897 + }
65898 + }
65899 + if ((macp->supIe[17] == 0xf) || (macp->supIe[18] == 0xac)) //WPA2 or WPA2PSK
65900 + {
65901 + if (macp->supIe[13] == 0x2)
65902 + {
65903 + printk(KERN_ERR "wd->sta.wepStatus = ZM_ENCRYPTION_TKIP\n");
65904 + //wd->sta.wepStatus = ZM_ENCRYPTION_TKIP;
65905 + //wd->ws.wepStatus = ZM_ENCRYPTION_TKIP;
65906 + zfiWlanSetWepStatus(dev, ZM_ENCRYPTION_TKIP);
65907 + }
65908 + else
65909 + {
65910 + printk(KERN_ERR "wd->sta.wepStatus = ZM_ENCRYPTION_AES\n");
65911 + //wd->sta.wepStatus = ZM_ENCRYPTION_AES;
65912 + //wd->ws.wepStatus = ZM_ENCRYPTION_AES;
65913 + zfiWlanSetWepStatus(dev, ZM_ENCRYPTION_AES);
65914 + }
65915 + }
65916 + }
65917 + zfiWlanSetWpaSupport(dev, 1);
65918 + }
65919 + else
65920 + {
65921 + /* Reset the WPA related variables */
65922 + printk(KERN_ERR "disable\n");
65923 +
65924 + zfiWlanSetWpaSupport(dev, 0);
65925 + zfiWlanSetAuthenticationMode(dev, ZM_AUTH_MODE_OPEN);
65926 + zfiWlanSetWepStatus(dev, ZM_ENCRYPTION_WEP_DISABLED);
65927 +
65928 + /* Now we only set the length in the WPA IE
65929 + * field to zero. */
65930 + //macp->cardSetting.WPAIe[1] = 0;
65931 + }
65932 + }
65933 + if(op == ZD_PARAM_COUNTERMEASURES)
65934 + {
65935 + printk(KERN_ERR "================ZD_PARAM_COUNTERMEASURES: ");
65936 +
65937 + if(arg)
65938 + {
65939 + // mCounterMeasureState=1;
65940 + printk(KERN_ERR "enable\n");
65941 + }
65942 + else
65943 + {
65944 + // mCounterMeasureState=0;
65945 + printk(KERN_ERR "disable\n");
65946 + }
65947 + }
65948 + if(op == ZD_PARAM_DROPUNENCRYPTED)
65949 + {
65950 + printk(KERN_ERR "ZD_PARAM_DROPUNENCRYPTED: ");
65951 +
65952 + if(arg)
65953 + {
65954 + printk(KERN_ERR "enable\n");
65955 + }
65956 + else
65957 + {
65958 + printk(KERN_ERR "disable\n");
65959 + }
65960 + }
65961 + if(op == ZD_PARAM_AUTH_ALGS)
65962 + {
65963 + printk(KERN_ERR "ZD_PARAM_AUTH_ALGS: ");
65964 +
65965 + if(arg == 0)
65966 + {
65967 + printk(KERN_ERR "OPEN_SYSTEM\n");
65968 + }
65969 + else
65970 + {
65971 + printk(KERN_ERR "SHARED_KEY\n");
65972 + }
65973 + }
65974 + if(op == ZD_PARAM_WPS_FILTER)
65975 + {
65976 + printk(KERN_ERR "ZD_PARAM_WPS_FILTER: ");
65977 +
65978 + if(arg)
65979 + {
65980 + // mCounterMeasureState=1;
65981 + macp->forwardMgmt = 1;
65982 + printk(KERN_ERR "enable\n");
65983 + }
65984 + else
65985 + {
65986 + // mCounterMeasureState=0;
65987 + macp->forwardMgmt = 0;
65988 + printk(KERN_ERR "disable\n");
65989 + }
65990 + }
65991 + }
65992 + err = 0;
65993 + break;
65994 +
65995 + case ZD_IOCTL_GETWPAIE:
65996 + {
65997 + struct ieee80211req_wpaie req_wpaie;
65998 + u16_t apId, i, j;
65999 +
66000 + /* Get the AP Id */
66001 + apId = zfLnxGetVapId(dev);
66002 +
66003 + if (apId == 0xffff)
66004 + {
66005 + apId = 0;
66006 + }
66007 + else
66008 + {
66009 + apId = apId+1;
66010 + }
66011 +
66012 + if (copy_from_user(&req_wpaie, ifr->ifr_data, sizeof(struct ieee80211req_wpaie))){
66013 + printk(KERN_ERR "usbdrv: copy_from_user error\n");
66014 + return -EFAULT;
66015 + }
66016 +
66017 + for(i = 0; i < ZM_OAL_MAX_STA_SUPPORT; i++)
66018 + {
66019 + for(j = 0; j < IEEE80211_ADDR_LEN; j++)
66020 + {
66021 + if (macp->stawpaie[i].wpa_macaddr[j] != req_wpaie.wpa_macaddr[j])
66022 + break;
66023 + }
66024 + if (j == 6)
66025 + break;
66026 + }
66027 + if (i < ZM_OAL_MAX_STA_SUPPORT)
66028 + {
66029 + //printk("ZD_IOCTL_GETWPAIE - sta index = %d\n", i);
66030 + memcpy(req_wpaie.wpa_ie, macp->stawpaie[i].wpa_ie, IEEE80211_MAX_IE_SIZE);
66031 + }
66032 +
66033 + if (copy_to_user(wrq->u.data.pointer, &req_wpaie, sizeof(struct ieee80211req_wpaie)))
66034 + {
66035 + return -EFAULT;
66036 + }
66037 + }
66038 +
66039 + err = 0;
66040 + break;
66041 +#ifdef ZM_ENABLE_CENC
66042 + case ZM_IOCTL_CENC:
66043 + if (copy_from_user(&macp->zd_wpa_req, ifr->ifr_data, sizeof(struct athr_wlan_param)))
66044 + {
66045 + printk(KERN_ERR "usbdrv: copy_from_user error\n");
66046 + return -EFAULT;
66047 + }
66048 +
66049 + usbdrv_cenc_ioctl(dev, (struct zydas_cenc_param *)&macp->zd_wpa_req);
66050 + err = 0;
66051 + break;
66052 +#endif //ZM_ENABLE_CENC
66053 + default:
66054 + err = -EOPNOTSUPP;
66055 + break;
66056 + }
66057 +
66058 +
66059 + return err;
66060 +}
66061 --- /dev/null
66062 +++ b/drivers/staging/otus/Kconfig
66063 @@ -0,0 +1,32 @@
66064 +config OTUS
66065 + tristate "Atheros OTUS 802.11n USB wireless support"
66066 + depends on USB && WLAN_80211 && MAC80211
66067 + default N
66068 + ---help---
66069 + Enable support for Atheros 802.11n USB hardware:
66070 + * UB81 - 2x2 2.4 GHz
66071 + * UB82 - 2x2 2.4 GHz and 5 GHz
66072 + * UB83 - 1x2 2.4 GHz
66073 +
66074 + This includes the following devices currently on the market:
66075 + Dlink DWA-160A1, Netgear WNDA3100 and WN111v2, TP-Link
66076 + TL-WN821N, and AVM FRITZ!WLAN N USB Stick.
66077 +
66078 + This driver requires its own supplicant driver for
66079 + wpa_supplicant 0.4.8. For your convenience you can find the
66080 + tarball here:
66081 +
66082 + http://www.kernel.org/pub/linux/kernel/people/mcgrof/otus/wpa_supplicant-0.4.8_otus.tar.bz2
66083 +
66084 + Before compiling wpa_supplicant, ensure your .config has at
66085 + least the following:
66086 + CONFIG_WIRELESS_EXTENSION=y
66087 + CONFIG_EAP_WSC=y
66088 + CONFIG_WSC_IE=y
66089 + CONFIG_DRIVER_WEXT=y
66090 + CONFIG_DRIVER_OTUS=y
66091 +
66092 + After a successful compile, you can use the Atheros device as
66093 + shown in the example:
66094 + $ wpa_supplicant -Dotus -i <atheros device from ifconfig> -c /path/to/wpa_supplicant.conf -d
66095 +
66096 --- /dev/null
66097 +++ b/drivers/staging/otus/Makefile
66098 @@ -0,0 +1,67 @@
66099 +obj-$(CONFIG_OTUS) += arusb_lnx.o
66100 +
66101 +EXTRA_CFLAGS += -DAMAC
66102 +EXTRA_CFLAGS += -DGCCK
66103 +EXTRA_CFLAGS += -DOFDM
66104 +EXTRA_CFLAGS += -DTXQ_IN_ISR
66105 +EXTRA_CFLAGS += -DWLAN_HOSTIF=0 #0:USB, 1:PCI
66106 +
66107 +#Test Mode
66108 +EXTRA_CFLAGS += -DZM_USB_STREAM_MODE=1
66109 +EXTRA_CFLAGS += -DZM_USB_TX_STREAM_MODE=0
66110 +EXTRA_CFLAGS += -DZM_PCI_DMA_TEST=0
66111 +EXTRA_CFLAGS += -DZM_LARGEPAYLOAD_TEST=0
66112 +EXTRA_CFLAGS += -DZM_FW_LOOP_BACK=0
66113 +EXTRA_CFLAGS += -DZM_LINUX_TPC=1
66114 +#EXTRA_CFLAGS += -DZM_DONT_COPY_RX_BUFFER
66115 +
66116 +EXTRA_CFLAGS += -DZM_HOSTAPD_SUPPORT
66117 +#EXTRA_CFLAGS += -DfTX_GAIN_OFDM=0
66118 +#EXTRA_CFLAGS += -DZM_CONFIG_BIG_ENDIAN -DBIG_ENDIAN
66119 +EXTRA_CFLAGS += -DZM_HALPLUS_LOCK
66120 +EXTRA_CFLAGS += -DZM_OTUS_LINUX_PHASE_2
66121 +
66122 +arusb_lnx-objs := \
66123 + usbdrv.o \
66124 + zdusb.o \
66125 + ioctl.o \
66126 + wrap_buf.o \
66127 + wrap_mem.o \
66128 + wrap_ev.o \
66129 + wrap_usb.o \
66130 + wrap_pkt.o \
66131 + wrap_dbg.o \
66132 + wrap_mis.o \
66133 + wrap_sec.o \
66134 + wwrap.o \
66135 + 80211core/ccmd.o \
66136 + 80211core/chb.o \
66137 + 80211core/cinit.o \
66138 + 80211core/cmm.o \
66139 + 80211core/cmmap.o \
66140 + 80211core/cmmsta.o \
66141 + 80211core/cfunc.o \
66142 + 80211core/coid.o \
66143 + 80211core/ctkip.o \
66144 + 80211core/ctxrx.o \
66145 + 80211core/cic.o \
66146 + 80211core/cpsmgr.o \
66147 + 80211core/cscanmgr.o \
66148 + 80211core/ratectrl.o \
66149 + 80211core/ledmgr.o \
66150 + 80211core/amsdu.o \
66151 + 80211core/cwm.o \
66152 + 80211core/cagg.o \
66153 + 80211core/queue.o \
66154 + 80211core/freqctrl.o \
66155 + 80211core/cwep.o \
66156 + hal/hprw.o \
66157 + hal/hpmain.o \
66158 + hal/hpusb.o \
66159 + hal/hpreg.o \
66160 + hal/hpfwuinit.o \
66161 + hal/hpfwbu.o \
66162 + hal/hpfw2.o \
66163 + hal/hpDKfwu.o \
66164 + hal/hpfwspiu.o \
66165 + hal/hpani.o
66166 --- /dev/null
66167 +++ b/drivers/staging/otus/oal_dt.h
66168 @@ -0,0 +1,60 @@
66169 +/*
66170 + * Copyright (c) 2007-2008 Atheros Communications Inc.
66171 + *
66172 + * Permission to use, copy, modify, and/or distribute this software for any
66173 + * purpose with or without fee is hereby granted, provided that the above
66174 + * copyright notice and this permission notice appear in all copies.
66175 + *
66176 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
66177 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
66178 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
66179 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
66180 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
66181 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
66182 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
66183 + */
66184 +/* Module Name : oal_dt.h */
66185 +/* */
66186 +/* Abstract */
66187 +/* This module contains data type definition. */
66188 +/* */
66189 +/* NOTES */
66190 +/* Platform dependent. */
66191 +/* */
66192 +/************************************************************************/
66193 +
66194 +#ifndef _OAL_DT_H
66195 +#define _OAL_DT_H
66196 +
66197 +/* Please include header files for buffer type in the beginning of this file */
66198 +/* Please include header files for device type here */
66199 +#include <linux/netdevice.h>
66200 +
66201 +typedef unsigned long long u64_t;
66202 +typedef unsigned int u32_t;
66203 +typedef unsigned short u16_t;
66204 +typedef unsigned char u8_t;
66205 +typedef long long s64_t;
66206 +typedef long s32_t;
66207 +typedef short s16_t;
66208 +typedef char s8_t;
66209 +
66210 +#ifndef TRUE
66211 +#define TRUE (1==1)
66212 +#endif
66213 +
66214 +#ifndef FALSE
66215 +#define FALSE (1==0)
66216 +#endif
66217 +
66218 +#ifndef NULL
66219 +#define NULL 0
66220 +#endif
66221 +
66222 +/* Please include header files for buffer type in the beginning of this file */
66223 +typedef struct sk_buff zbuf_t;
66224 +
66225 +/* Please include header files for device type in the beginning of this file */
66226 +typedef struct net_device zdev_t;
66227 +
66228 +#endif /* #ifndef _OAL_DT_H */
66229 --- /dev/null
66230 +++ b/drivers/staging/otus/oal_marc.h
66231 @@ -0,0 +1,135 @@
66232 +/*
66233 + * Copyright (c) 2007-2008 Atheros Communications Inc.
66234 + *
66235 + * Permission to use, copy, modify, and/or distribute this software for any
66236 + * purpose with or without fee is hereby granted, provided that the above
66237 + * copyright notice and this permission notice appear in all copies.
66238 + *
66239 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
66240 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
66241 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
66242 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
66243 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
66244 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
66245 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
66246 + */
66247 +/* Module Name : oal_marc.h */
66248 +/* */
66249 +/* Abstract */
66250 +/* This module contains warpper definitions. */
66251 +/* */
66252 +/* NOTES */
66253 +/* Platform dependent. */
66254 +/* */
66255 +/************************************************************************/
66256 +
66257 +#ifndef _OAL_MARC_H
66258 +#define _OAL_MARC_H
66259 +
66260 +#include "oal_dt.h"
66261 +#include "usbdrv.h"
66262 +
66263 +#define ZM_OS_LINUX_FUNC
66264 +
66265 +/***** Critical section *****/
66266 +/* Declare for critical section */
66267 +#ifndef ZM_HALPLUS_LOCK
66268 +#define zmw_get_wlan_dev(dev) struct zsWlanDev *wd = (struct zsWlanDev*) ((((struct usbdrv_private*)dev->priv)->wd))
66269 +
66270 +#define zmw_declare_for_critical_section() unsigned long irqFlag;
66271 +
66272 +/* Enter critical section */
66273 +#define zmw_enter_critical_section(dev) \
66274 + spin_lock_irqsave(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
66275 +
66276 +/* leave critical section */
66277 +#define zmw_leave_critical_section(dev) \
66278 + spin_unlock_irqrestore(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
66279 +#else
66280 +#define zmw_get_wlan_dev(dev) struct zsWlanDev *wd = zfwGetWlanDev(dev);
66281 +
66282 +/* Declare for critical section */
66283 +#define zmw_declare_for_critical_section()
66284 +
66285 +/* Enter critical section */
66286 +#define zmw_enter_critical_section(dev) \
66287 + zfwEnterCriticalSection(dev);
66288 +
66289 +/* leave critical section */
66290 +#define zmw_leave_critical_section(dev) \
66291 + zfwLeaveCriticalSection(dev);
66292 +#endif
66293 +
66294 +/***** Byte order converting *****/
66295 +#ifdef ZM_CONFIG_BIG_ENDIAN
66296 +#define zmw_cpu_to_le32(v) (((v & 0xff000000) >> 24) | \
66297 + ((v & 0x00ff0000) >> 8) | \
66298 + ((v & 0x0000ff00) << 8) | \
66299 + ((v & 0x000000ff) << 24))
66300 +
66301 +#define zmw_le32_to_cpu(v) (((v & 0xff000000) >> 24) | \
66302 + ((v & 0x00ff0000) >> 8) | \
66303 + ((v & 0x0000ff00) << 8) | \
66304 + ((v & 0x000000ff) << 24))
66305 +
66306 +#define zmw_cpu_to_le16(v) (((v & 0xff00) >> 8) | \
66307 + ((v & 0x00ff) << 8))
66308 +
66309 +#define zmw_le16_to_cpu(v) (((v & 0xff00) >> 8) | \
66310 + ((v & 0x00ff) << 8))
66311 +#else
66312 +#define zmw_cpu_to_le32(v) (v)
66313 +#define zmw_le32_to_cpu(v) (v)
66314 +#define zmw_cpu_to_le16(v) (v)
66315 +#define zmw_le16_to_cpu(v) (v)
66316 +#endif
66317 +
66318 +/***** Buffer access *****/
66319 +/* Called to read/write buffer */
66320 +#ifndef ZM_HALPLUS_LOCK
66321 +
66322 +#define zmw_buf_readb(dev, buf, offset) *(u8_t*)((u8_t*)buf->data+offset)
66323 +#define zmw_buf_readh(dev, buf, offset) zmw_cpu_to_le16(*(u16_t*)((u8_t*)buf->data+offset))
66324 +#define zmw_buf_writeb(dev, buf, offset, value) *(u8_t*)((u8_t*)buf->data+offset) = value
66325 +#define zmw_buf_writeh(dev, buf, offset, value) *(u16_t*)((u8_t*)buf->data+offset) = zmw_cpu_to_le16(value)
66326 +#define zmw_buf_get_buffer(dev, buf) (u8_t*)(buf->data)
66327 +
66328 +#else
66329 +
66330 +#define zmw_buf_readb(dev, buf, offset) zfwBufReadByte(dev, buf, offset)
66331 +#define zmw_buf_readh(dev, buf, offset) zfwBufReadHalfWord(dev, buf, offset)
66332 +#define zmw_buf_writeb(dev, buf, offset, value) zfwBufWriteByte(dev, buf, offset, value)
66333 +#define zmw_buf_writeh(dev, buf, offset, value) zfwBufWriteHalfWord(dev, buf, offset, value)
66334 +#define zmw_buf_get_buffer(dev, buf) zfwGetBuffer(dev, buf)
66335 +
66336 +#endif
66337 +
66338 +/***** Debug message *****/
66339 +#if 0
66340 +#define zm_debug_msg0(msg) printk("%s:%s\n", __FUNCTION__, msg);
66341 +#define zm_debug_msg1(msg, val) printk("%s:%s%ld\n", __FUNCTION__, \
66342 + msg, (u32_t)val);
66343 +#define zm_debug_msg2(msg, val) printk("%s:%s%lxh\n", __FUNCTION__, \
66344 + msg, (u32_t)val);
66345 +#define zm_debug_msg_s(msg, val) printk("%s:%s%s\n", __FUNCTION__, \
66346 + msg, val);
66347 +#define zm_debug_msg_p(msg, val1, val2) printk("%s:%s%01ld.%02ld\n", __FUNCTION__, \
66348 + msg, (val1/val2), (((val1*100)/val2)%100));
66349 +#define zm_dbg(S) printk S
66350 +#else
66351 +#define zm_debug_msg0(msg)
66352 +#define zm_debug_msg1(msg, val)
66353 +#define zm_debug_msg2(msg, val)
66354 +#define zm_debug_msg_s(msg, val)
66355 +#define zm_debug_msg_p(msg, val1, val2)
66356 +#define zm_dbg(S)
66357 +#endif
66358 +
66359 +#define zm_assert(expr) if(!(expr)) { \
66360 + printk( "Atheors Assertion failed! %s,%s,%s,line=%d\n", \
66361 + #expr,__FILE__,__FUNCTION__,__LINE__); \
66362 + }
66363 +
66364 +#define DbgPrint printk
66365 +
66366 +#endif /* #ifndef _OAL_MARC_H */
66367 --- /dev/null
66368 +++ b/drivers/staging/otus/TODO
66369 @@ -0,0 +1,9 @@
66370 +TODO:
66371 + - checkpatch.pl cleanups
66372 + - sparse cleanups
66373 + - port to in-kernel 80211 stack
66374 + - proper network developer maintainer
66375 +
66376 +Please send any patches to Greg Kroah-Hartman <greg@kroah.com> and
66377 +Luis Rodriguez <Luis.Rodriguez@Atheros.com> and the
66378 +otus-devel@lists.madwifi-project.org mailing list.
66379 --- /dev/null
66380 +++ b/drivers/staging/otus/usbdrv.c
66381 @@ -0,0 +1,1210 @@
66382 +/*
66383 + * Copyright (c) 2007-2008 Atheros Communications Inc.
66384 + *
66385 + * Permission to use, copy, modify, and/or distribute this software for any
66386 + * purpose with or without fee is hereby granted, provided that the above
66387 + * copyright notice and this permission notice appear in all copies.
66388 + *
66389 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
66390 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
66391 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
66392 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
66393 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
66394 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
66395 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
66396 + */
66397 +/* Module Name : usbdrv.c */
66398 +/* */
66399 +/* Abstract */
66400 +/* This module contains network interface up/down related functions.*/
66401 +/* */
66402 +/* NOTES */
66403 +/* Platform dependent. */
66404 +/* */
66405 +/************************************************************************/
66406 +
66407 +/* src/usbdrv.c */
66408 +
66409 +#define ZM_PIBSS_MODE 0
66410 +#define ZM_AP_MODE 0
66411 +#define ZM_CHANNEL 11
66412 +#define ZM_WEP_MOME 0
66413 +#define ZM_SHARE_AUTH 0
66414 +#define ZM_DISABLE_XMIT 0
66415 +
66416 +#include "usbdrv.h"
66417 +#include "oal_dt.h"
66418 +#include "80211core/pub_zfi.h"
66419 +
66420 +#include "linux/netlink.h"
66421 +#include "linux/rtnetlink.h"
66422 +
66423 +#if WIRELESS_EXT > 12
66424 +#include <net/iw_handler.h>
66425 +#endif
66426 +
66427 +#ifdef ZM_HOSTAPD_SUPPORT
66428 +#include "athr_common.h"
66429 +#endif
66430 +
66431 +extern void zfDumpDescriptor(zdev_t* dev, u16_t type);
66432 +//extern void zfiWlanQueryMacAddress(zdev_t* dev, u8_t* addr);
66433 +
66434 +// ISR handler
66435 +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,0))
66436 +irqreturn_t usbdrv_intr(int, void *, struct pt_regs *);
66437 +#else
66438 +void usbdrv_intr(int, void *, struct pt_regs *);
66439 +#endif
66440 +
66441 +// Network Device interface related function
66442 +int usbdrv_open(struct net_device *);
66443 +int usbdrv_close(struct net_device *);
66444 +int usbdrv_change_mtu(struct net_device *, int);
66445 +int usbdrv_set_mac(struct net_device *, void *);
66446 +int usbdrv_xmit_frame(struct sk_buff *, struct net_device *);
66447 +void usbdrv_set_multi(struct net_device *);
66448 +struct net_device_stats *usbdrv_get_stats(struct net_device *);
66449 +
66450 +//wireless extension helper functions
66451 +int usbdrv_ioctl_setessid(struct net_device *dev, struct iw_point *erq);
66452 +int usbdrv_ioctl_getessid(struct net_device *dev, struct iw_point *erq);
66453 +int usbdrv_ioctl_setrts(struct net_device *dev, struct iw_param *rrq);
66454 +/* Wireless Extension Handler functions */
66455 +int usbdrvwext_giwmode(struct net_device *dev, struct iw_request_info* info,
66456 + __u32 *mode, char *extra);
66457 +int zfLnxPrivateIoctl(struct usbdrv_private *macp, struct zdap_ioctl *zdreq);
66458 +
66459 +void zfLnx10msTimer(struct net_device* dev);
66460 +int zfUnregisterWdsDev(struct net_device* parentDev, u16_t wdsId);
66461 +int zfRegisterWdsDev(struct net_device* parentDev, u16_t wdsId);
66462 +int zfWdsOpen(struct net_device *dev);
66463 +int zfWdsClose(struct net_device *dev);
66464 +int zfLnxVapOpen(struct net_device *dev);
66465 +int zfLnxVapClose(struct net_device *dev);
66466 +int zfLnxVapXmitFrame(struct sk_buff *skb, struct net_device *dev);
66467 +int zfLnxRegisterVapDev(struct net_device* parentDev, u16_t vapId);
66468 +int usbdrv_wpa_ioctl(struct net_device *dev, struct athr_wlan_param *zdparm);
66469 +extern u16_t zfLnxGetVapId(zdev_t* dev);
66470 +extern u16_t zfLnxCheckTxBufferCnt(zdev_t *dev);
66471 +extern UsbTxQ_t *zfLnxGetUsbTxBuffer(zdev_t *dev);
66472 +
66473 +extern u16_t zfLnxAuthNotify(zdev_t* dev, u16_t* macAddr);
66474 +extern u16_t zfLnxAsocNotify(zdev_t* dev, u16_t* macAddr, u8_t* body, u16_t bodySize, u16_t port);
66475 +extern u16_t zfLnxDisAsocNotify(zdev_t* dev, u8_t* macAddr, u16_t port);
66476 +extern u16_t zfLnxApConnectNotify(zdev_t* dev, u8_t* macAddr, u16_t port);
66477 +extern void zfLnxConnectNotify(zdev_t* dev, u16_t status, u16_t* bssid);
66478 +extern void zfLnxScanNotify(zdev_t* dev, struct zsScanResult* result);
66479 +extern void zfLnxStatisticsNotify(zdev_t* dev, struct zsStastics* result);
66480 +extern void zfLnxMicFailureNotify(zdev_t* dev, u16_t* addr, u16_t status);
66481 +extern void zfLnxApMicFailureNotify(zdev_t* dev, u8_t* addr, zbuf_t* buf);
66482 +extern void zfLnxIbssPartnerNotify(zdev_t* dev, u16_t status, struct zsPartnerNotifyEvent *event);
66483 +extern void zfLnxMacAddressNotify(zdev_t* dev, u8_t* addr);
66484 +extern void zfLnxSendCompleteIndication(zdev_t* dev, zbuf_t* buf);
66485 +extern void zfLnxRecvEth(zdev_t* dev, zbuf_t* buf, u16_t port);
66486 +extern void zfLnxRestoreBufData(zdev_t* dev, zbuf_t* buf);
66487 +#ifdef ZM_ENABLE_CENC
66488 +extern u16_t zfLnxCencAsocNotify(zdev_t* dev, u16_t* macAddr, u8_t* body, u16_t bodySize, u16_t port);
66489 +#endif //ZM_ENABLE_CENC
66490 +extern void zfLnxWatchDogNotify(zdev_t* dev);
66491 +extern void zfLnxRecv80211(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo);
66492 +extern u8_t zfLnxCreateThread(zdev_t *dev);
66493 +
66494 +/******************************************************************************
66495 +* P U B L I C D A T A
66496 +*******************************************************************************
66497 +*/
66498 +
66499 +/* Definition of Wireless Extension */
66500 +
66501 +#if WIRELESS_EXT > 12
66502 +#include <net/iw_handler.h>
66503 +#endif
66504 +//wireless extension helper functions
66505 +extern int usbdrv_ioctl_setessid(struct net_device *dev, struct iw_point *erq);
66506 +extern int usbdrv_ioctl_setrts(struct net_device *dev, struct iw_param *rrq);
66507 +/* Wireless Extension Handler functions */
66508 +extern int usbdrvwext_giwname(struct net_device *dev, struct iw_request_info *info,
66509 + union iwreq_data *wrq, char *extra);
66510 +extern int usbdrvwext_siwfreq(struct net_device *dev, struct iw_request_info *info,
66511 + struct iw_freq *freq, char *extra);
66512 +extern int usbdrvwext_giwfreq(struct net_device *dev, struct iw_request_info *info,
66513 + struct iw_freq *freq, char *extra);
66514 +extern int usbdrvwext_siwmode(struct net_device *dev, struct iw_request_info *info,
66515 + union iwreq_data *wrq, char *extra);
66516 +extern int usbdrvwext_giwmode(struct net_device *dev, struct iw_request_info *info,
66517 + __u32 *mode, char *extra);
66518 +extern int usbdrvwext_siwsens(struct net_device *dev, struct iw_request_info *info,
66519 + struct iw_param *sens, char *extra);
66520 +extern int usbdrvwext_giwsens(struct net_device *dev, struct iw_request_info *info,
66521 + struct iw_param *sens, char *extra);
66522 +extern int usbdrvwext_giwrange(struct net_device *dev, struct iw_request_info *info,
66523 + struct iw_point *data, char *extra);
66524 +extern int usbdrvwext_siwap(struct net_device *dev, struct iw_request_info *info,
66525 + struct sockaddr *MacAddr, char *extra);
66526 +extern int usbdrvwext_giwap(struct net_device *dev, struct iw_request_info *info,
66527 + struct sockaddr *MacAddr, char *extra);
66528 +extern int usbdrvwext_iwaplist(struct net_device *dev, struct iw_request_info *info,
66529 + struct iw_point *data, char *extra);
66530 +extern int usbdrvwext_siwscan(struct net_device *dev, struct iw_request_info *info,
66531 + struct iw_point *data, char *extra);
66532 +extern int usbdrvwext_giwscan(struct net_device *dev, struct iw_request_info *info,
66533 + struct iw_point *data, char *extra);
66534 +extern int usbdrvwext_siwessid(struct net_device *dev, struct iw_request_info *info,
66535 + struct iw_point *essid, char *extra);
66536 +extern int usbdrvwext_giwessid(struct net_device *dev, struct iw_request_info *info,
66537 + struct iw_point *essid, char *extra);
66538 +extern int usbdrvwext_siwnickn(struct net_device *dev, struct iw_request_info *info,
66539 + struct iw_point *data, char *nickname);
66540 +extern int usbdrvwext_giwnickn(struct net_device *dev, struct iw_request_info *info,
66541 + struct iw_point *data, char *nickname);
66542 +extern int usbdrvwext_siwrate(struct net_device *dev, struct iw_request_info *info,
66543 + struct iw_param *frq, char *extra);
66544 +extern int usbdrvwext_giwrate(struct net_device *dev, struct iw_request_info *info,
66545 + struct iw_param *frq, char *extra);
66546 +extern int usbdrvwext_siwrts(struct net_device *dev, struct iw_request_info *info,
66547 + struct iw_param *rts, char *extra);
66548 +extern int usbdrvwext_giwrts(struct net_device *dev, struct iw_request_info *info,
66549 + struct iw_param *rts, char *extra);
66550 +extern int usbdrvwext_siwfrag(struct net_device *dev, struct iw_request_info *info,
66551 + struct iw_param *frag, char *extra);
66552 +extern int usbdrvwext_giwfrag(struct net_device *dev, struct iw_request_info *info,
66553 + struct iw_param *frag, char *extra);
66554 +extern int usbdrvwext_siwtxpow(struct net_device *dev, struct iw_request_info *info,
66555 + struct iw_param *rrq, char *extra);
66556 +extern int usbdrvwext_giwtxpow(struct net_device *dev, struct iw_request_info *info,
66557 + struct iw_param *rrq, char *extra);
66558 +extern int usbdrvwext_siwretry(struct net_device *dev, struct iw_request_info *info,
66559 + struct iw_param *rrq, char *extra);
66560 +extern int usbdrvwext_giwretry(struct net_device *dev, struct iw_request_info *info,
66561 + struct iw_param *rrq, char *extra);
66562 +extern int usbdrvwext_siwencode(struct net_device *dev, struct iw_request_info *info,
66563 + struct iw_point *erq, char *key);
66564 +extern int usbdrvwext_giwencode(struct net_device *dev, struct iw_request_info *info,
66565 + struct iw_point *erq, char *key);
66566 +extern int usbdrvwext_siwpower(struct net_device *dev, struct iw_request_info *info,
66567 + struct iw_param *frq, char *extra);
66568 +extern int usbdrvwext_giwpower(struct net_device *dev, struct iw_request_info *info,
66569 + struct iw_param *frq, char *extra);
66570 +extern int usbdrv_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
66571 +/*
66572 + * Structures to export the Wireless Handlers
66573 + */
66574 +
66575 +struct iw_priv_args usbdrv_private_args[] = {
66576 +// { SIOCIWFIRSTPRIV + 0x0, 0, 0, "list_bss" },
66577 +// { SIOCIWFIRSTPRIV + 0x1, 0, 0, "card_reset" },
66578 + { SIOCIWFIRSTPRIV + 0x2, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_auth" }, /* 0 - open, 1 - shared key */
66579 + { SIOCIWFIRSTPRIV + 0x3, 0, IW_PRIV_TYPE_CHAR | 12, "get_auth" },
66580 +// { SIOCIWFIRSTPRIV + 0x4, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_preamble" }, /* 0 - long, 1 - short */
66581 +// { SIOCIWFIRSTPRIV + 0x5, 0, IW_PRIV_TYPE_CHAR | 6, "get_preamble" },
66582 +// { SIOCIWFIRSTPRIV + 0x6, 0, 0, "cnt" },
66583 +// { SIOCIWFIRSTPRIV + 0x7, 0, 0, "regs" },
66584 +// { SIOCIWFIRSTPRIV + 0x8, 0, 0, "probe" },
66585 +// { SIOCIWFIRSTPRIV + 0x9, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "dbg_flag" },
66586 +// { SIOCIWFIRSTPRIV + 0xA, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "connect" },
66587 +// { SIOCIWFIRSTPRIV + 0xB, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_mac_mode" },
66588 +// { SIOCIWFIRSTPRIV + 0xC, 0, IW_PRIV_TYPE_CHAR | 12, "get_mac_mode" },
66589 +};
66590 +
66591 +#if WIRELESS_EXT > 12
66592 +static iw_handler usbdrvwext_handler[] = {
66593 + (iw_handler) NULL, /* SIOCSIWCOMMIT */
66594 + (iw_handler) usbdrvwext_giwname, /* SIOCGIWNAME */
66595 + (iw_handler) NULL, /* SIOCSIWNWID */
66596 + (iw_handler) NULL, /* SIOCGIWNWID */
66597 + (iw_handler) usbdrvwext_siwfreq, /* SIOCSIWFREQ */
66598 + (iw_handler) usbdrvwext_giwfreq, /* SIOCGIWFREQ */
66599 + (iw_handler) usbdrvwext_siwmode, /* SIOCSIWMODE */
66600 + (iw_handler) usbdrvwext_giwmode, /* SIOCGIWMODE */
66601 + (iw_handler) usbdrvwext_siwsens, /* SIOCSIWSENS */
66602 + (iw_handler) usbdrvwext_giwsens, /* SIOCGIWSENS */
66603 + (iw_handler) NULL, /* not used */ /* SIOCSIWRANGE */
66604 + (iw_handler) usbdrvwext_giwrange, /* SIOCGIWRANGE */
66605 + (iw_handler) NULL, /* not used */ /* SIOCSIWPRIV */
66606 + (iw_handler) NULL, /* kernel code */ /* SIOCGIWPRIV */
66607 + (iw_handler) NULL, /* not used */ /* SIOCSIWSTATS */
66608 + (iw_handler) NULL, /* kernel code */ /* SIOCGIWSTATS */
66609 + (iw_handler) NULL, /* SIOCSIWSPY */
66610 + (iw_handler) NULL, /* SIOCGIWSPY */
66611 + (iw_handler) NULL, /* -- hole -- */
66612 + (iw_handler) NULL, /* -- hole -- */
66613 + (iw_handler) usbdrvwext_siwap, /* SIOCSIWAP */
66614 + (iw_handler) usbdrvwext_giwap, /* SIOCGIWAP */
66615 + (iw_handler) NULL, /* -- hole -- */
66616 + (iw_handler) usbdrvwext_iwaplist, /* SIOCGIWAPLIST */
66617 +#if WIRELESS_EXT > 13
66618 + (iw_handler) usbdrvwext_siwscan, /* SIOCSIWSCAN */
66619 + (iw_handler) usbdrvwext_giwscan, /* SIOCGIWSCAN */
66620 +#else /* WIRELESS_EXT > 13 */
66621 + (iw_handler) NULL, /* null */ /* SIOCSIWSCAN */
66622 + (iw_handler) NULL, /* null */ /* SIOCGIWSCAN */
66623 +#endif /* WIRELESS_EXT > 13 */
66624 + (iw_handler) usbdrvwext_siwessid, /* SIOCSIWESSID */
66625 + (iw_handler) usbdrvwext_giwessid, /* SIOCGIWESSID */
66626 +
66627 + (iw_handler) usbdrvwext_siwnickn, /* SIOCSIWNICKN */
66628 + (iw_handler) usbdrvwext_giwnickn, /* SIOCGIWNICKN */
66629 + (iw_handler) NULL, /* -- hole -- */
66630 + (iw_handler) NULL, /* -- hole -- */
66631 + (iw_handler) usbdrvwext_siwrate, /* SIOCSIWRATE */
66632 + (iw_handler) usbdrvwext_giwrate, /* SIOCGIWRATE */
66633 + (iw_handler) usbdrvwext_siwrts, /* SIOCSIWRTS */
66634 + (iw_handler) usbdrvwext_giwrts, /* SIOCGIWRTS */
66635 + (iw_handler) usbdrvwext_siwfrag, /* SIOCSIWFRAG */
66636 + (iw_handler) usbdrvwext_giwfrag, /* SIOCGIWFRAG */
66637 + (iw_handler) usbdrvwext_siwtxpow, /* SIOCSIWTXPOW */
66638 + (iw_handler) usbdrvwext_giwtxpow, /* SIOCGIWTXPOW */
66639 + (iw_handler) usbdrvwext_siwretry, /* SIOCSIWRETRY */
66640 + (iw_handler) usbdrvwext_giwretry, /* SIOCGIWRETRY */
66641 + (iw_handler) usbdrvwext_siwencode, /* SIOCSIWENCODE */
66642 + (iw_handler) usbdrvwext_giwencode, /* SIOCGIWENCODE */
66643 + (iw_handler) usbdrvwext_siwpower, /* SIOCSIWPOWER */
66644 + (iw_handler) usbdrvwext_giwpower, /* SIOCGIWPOWER */
66645 +};
66646 +
66647 +static const iw_handler usbdrv_private_handler[] =
66648 +{
66649 + //(iw_handler) usbdrvwext_setparam, /* SIOCWFIRSTPRIV+0 */
66650 + //(iw_handler) usbdrvwext_getparam, /* SIOCWFIRSTPRIV+1 */
66651 + //(iw_handler) usbdrvwext_setkey, /* SIOCWFIRSTPRIV+2 */
66652 + //(iw_handler) usbdrvwext_setwmmparams, /* SIOCWFIRSTPRIV+3 */
66653 + //(iw_handler) usbdrvwext_delkey, /* SIOCWFIRSTPRIV+4 */
66654 + //(iw_handler) usbdrvwext_getwmmparams, /* SIOCWFIRSTPRIV+5 */
66655 + //(iw_handler) usbdrvwext_setmlme, /* SIOCWFIRSTPRIV+6 */
66656 + //(iw_handler) usbdrvwext_getchaninfo, /* SIOCWFIRSTPRIV+7 */
66657 + //(iw_handler) usbdrvwext_setoptie, /* SIOCWFIRSTPRIV+8 */
66658 + //(iw_handler) usbdrvwext_getoptie, /* SIOCWFIRSTPRIV+9 */
66659 + //(iw_handler) usbdrvwext_addmac, /* SIOCWFIRSTPRIV+10 */
66660 + //(iw_handler) usbdrvwext_getscanresults, /* SIOCWFIRSTPRIV+11 */
66661 + //(iw_handler) usbdrvwext_delmac, /* SIOCWFIRSTPRIV+12 */
66662 + //(iw_handler) usbdrvwext_getchanlist, /* SIOCWFIRSTPRIV+13 */
66663 + //(iw_handler) usbdrvwext_setchanlist, /* SIOCWFIRSTPRIV+14 */
66664 + //(iw_handler) NULL, /* SIOCWFIRSTPRIV+15 */
66665 + //(iw_handler) usbdrvwext_chanswitch, /* SIOCWFIRSTPRIV+16 */
66666 + //(iw_handler) usbdrvwext_setmode, /* SIOCWFIRSTPRIV+17 */
66667 + //(iw_handler) usbdrvwext_getmode, /* SIOCWFIRSTPRIV+18 */
66668 + NULL, /* SIOCIWFIRSTPRIV */
66669 +};
66670 +
66671 +struct iw_handler_def p80211wext_handler_def = {
66672 + .num_standard = sizeof(usbdrvwext_handler) / sizeof(iw_handler),
66673 + .num_private = sizeof(usbdrv_private_handler)/sizeof(iw_handler),
66674 + .num_private_args = sizeof(usbdrv_private_args)/sizeof(struct iw_priv_args),
66675 + .standard = usbdrvwext_handler,
66676 + .private = (iw_handler *) usbdrv_private_handler,
66677 + .private_args = (struct iw_priv_args *) usbdrv_private_args
66678 +};
66679 +#endif
66680 +
66681 +/* WDS */
66682 +//struct zsWdsStruct wds[ZM_WDS_PORT_NUMBER];
66683 +//void zfInitWdsStruct(void);
66684 +
66685 +/* VAP */
66686 +struct zsVapStruct vap[ZM_VAP_PORT_NUMBER];
66687 +void zfLnxInitVapStruct(void);
66688 +
66689 +
66690 +/**
66691 + * usbdrv_intr - interrupt handler
66692 + * @irq: the IRQ number
66693 + * @dev_inst: the net_device struct
66694 + * @regs: registers (unused)
66695 + *
66696 + * This routine is the ISR for the usbdrv board. It services
66697 + * the RX & TX queues & starts the RU if it has stopped due
66698 + * to no resources.
66699 + */
66700 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
66701 +irqreturn_t usbdrv_intr(int irq, void *dev_inst, struct pt_regs *regs)
66702 +#else
66703 +void usbdrv_intr(int irq, void *dev_inst, struct pt_regs *regs)
66704 +#endif
66705 +{
66706 + struct net_device *dev;
66707 + struct usbdrv_private *macp;
66708 +
66709 + dev = dev_inst;
66710 + macp = dev->priv;
66711 +
66712 +
66713 + /* Read register error, card may be unpluged */
66714 + if (0)//(intr_status == -1)
66715 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
66716 + return IRQ_NONE;
66717 +#else
66718 + return;
66719 +#endif
66720 +
66721 + /* the device is closed, don't continue or else bad things may happen. */
66722 + if (!netif_running(dev)) {
66723 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
66724 + return IRQ_NONE;
66725 +#else
66726 + return;
66727 +#endif
66728 + }
66729 +
66730 + if (macp->driver_isolated) {
66731 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
66732 + return IRQ_NONE;
66733 +#else
66734 + return;
66735 +#endif
66736 + }
66737 +
66738 +#if (WLAN_HOSTIF == WLAN_PCI)
66739 + //zfiIsrPci(dev);
66740 +#endif
66741 +
66742 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
66743 + return IRQ_HANDLED;
66744 +#else
66745 + return;
66746 +#endif
66747 +}
66748 +
66749 +int usbdrv_open(struct net_device *dev)
66750 +{
66751 + struct usbdrv_private *macp = dev->priv;
66752 + int rc = 0;
66753 + u16_t size;
66754 + void* mem;
66755 + //unsigned char addr[6];
66756 + struct zsCbFuncTbl cbFuncTbl;
66757 +
66758 + printk("Enter open()\n");
66759 +
66760 +//#ifndef CONFIG_SMP
66761 +// read_lock(&(macp->isolate_lock));
66762 +//#endif
66763 + if (macp->driver_isolated) {
66764 + rc = -EBUSY;
66765 + goto exit;
66766 + }
66767 +
66768 + size = zfiGlobalDataSize(dev);
66769 + if ((mem = kmalloc(size, GFP_KERNEL)) == NULL)
66770 + {
66771 + rc = -EBUSY;
66772 + goto exit;
66773 + }
66774 + macp->wd = mem;
66775 +
66776 + memset(&cbFuncTbl, 0, sizeof(struct zsCbFuncTbl));
66777 + cbFuncTbl.zfcbAuthNotify = zfLnxAuthNotify;
66778 + cbFuncTbl.zfcbAuthNotify = zfLnxAuthNotify;
66779 + cbFuncTbl.zfcbAsocNotify = zfLnxAsocNotify;
66780 + cbFuncTbl.zfcbDisAsocNotify = zfLnxDisAsocNotify;
66781 + cbFuncTbl.zfcbApConnectNotify = zfLnxApConnectNotify;
66782 + cbFuncTbl.zfcbConnectNotify = zfLnxConnectNotify;
66783 + cbFuncTbl.zfcbScanNotify = zfLnxScanNotify;
66784 + cbFuncTbl.zfcbMicFailureNotify = zfLnxMicFailureNotify;
66785 + cbFuncTbl.zfcbApMicFailureNotify = zfLnxApMicFailureNotify;
66786 + cbFuncTbl.zfcbIbssPartnerNotify = zfLnxIbssPartnerNotify;
66787 + cbFuncTbl.zfcbMacAddressNotify = zfLnxMacAddressNotify;
66788 + cbFuncTbl.zfcbSendCompleteIndication = zfLnxSendCompleteIndication;
66789 + cbFuncTbl.zfcbRecvEth = zfLnxRecvEth;
66790 + cbFuncTbl.zfcbRecv80211 = zfLnxRecv80211;
66791 + cbFuncTbl.zfcbRestoreBufData = zfLnxRestoreBufData;
66792 +#ifdef ZM_ENABLE_CENC
66793 + cbFuncTbl.zfcbCencAsocNotify = zfLnxCencAsocNotify;
66794 +#endif //ZM_ENABLE_CENC
66795 + cbFuncTbl.zfcbHwWatchDogNotify = zfLnxWatchDogNotify;
66796 + zfiWlanOpen(dev, &cbFuncTbl);
66797 +
66798 +#if 0
66799 + {
66800 + //u16_t mac[3] = {0x1300, 0xb6d4, 0x5aaf};
66801 + u16_t mac[3] = {0x8000, 0x00ab, 0x0000};
66802 + //zfiWlanSetMacAddress(dev, mac);
66803 + }
66804 + /* MAC address */
66805 + zfiWlanQueryMacAddress(dev, addr);
66806 + dev->dev_addr[0] = addr[0];
66807 + dev->dev_addr[1] = addr[1];
66808 + dev->dev_addr[2] = addr[2];
66809 + dev->dev_addr[3] = addr[3];
66810 + dev->dev_addr[4] = addr[4];
66811 + dev->dev_addr[5] = addr[5];
66812 +#endif
66813 + //zfwMacAddressNotify() will be called to setup dev->dev_addr[]
66814 +
66815 + zfLnxCreateThread(dev);
66816 +
66817 + mod_timer(&(macp->hbTimer10ms), jiffies + (1*HZ)/100); //10 ms
66818 +
66819 + netif_carrier_on(dev);
66820 +
66821 + netif_start_queue(dev);
66822 +
66823 +#if ZM_AP_MODE == 1
66824 + zfiWlanSetWlanMode(dev, ZM_MODE_AP);
66825 + zfiWlanSetBasicRate(dev, 0xf, 0, 0);
66826 + zfiWlanSetSSID(dev, "OTUS_CWY", 8);
66827 + zfiWlanSetDtimCount(dev, 3);
66828 +
66829 + #if ZM_WEP_MOME == 1
66830 + {
66831 + u8_t key[16] = {0x12, 0x34, 0x56, 0x78, 0x90};
66832 + struct zsKeyInfo keyInfo;
66833 +
66834 + keyInfo.keyLength = 5;
66835 + keyInfo.keyIndex = 0;
66836 + keyInfo.flag = 0;
66837 + keyInfo.key = key;
66838 + zfiWlanSetKey(dev, keyInfo);
66839 +
66840 + zfiWlanSetEncryMode(dev, ZM_WEP64);
66841 + }
66842 +
66843 + #if ZM_SHARE_AUTH == 1
66844 + zfiWlanSetAuthenticationMode(dev, 1);
66845 + #endif //#if ZM_SHARE_AUTH == 1
66846 + #endif //#if ZM_WEP_MOME == 1
66847 +
66848 +#elif ZM_PIBSS_MODE == 1
66849 + zfiWlanSetWlanMode(dev, ZM_MODE_PSEUDO);
66850 +#else
66851 + zfiWlanSetWlanMode(dev, ZM_MODE_INFRASTRUCTURE);
66852 +#endif
66853 + //zfiWlanSetChannel(dev, ZM_CHANNEL, FALSE);
66854 + zfiWlanSetFrequency(dev, 2462000, FALSE);
66855 + zfiWlanSetRtsThreshold(dev, 32767);
66856 + zfiWlanSetFragThreshold(dev, 0);
66857 +
66858 + zfiWlanEnable(dev);
66859 +
66860 +#ifdef ZM_ENABLE_CENC
66861 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14)
66862 + macp->netlink_sk = netlink_kernel_create(NETLINK_USERSOCK, NULL);
66863 +#else
66864 + macp->netlink_sk = netlink_kernel_create(NETLINK_USERSOCK, 1, NULL, THIS_MODULE);
66865 +#endif
66866 +
66867 + if (macp->netlink_sk == NULL)
66868 + {
66869 + printk(KERN_ERR "Can't create NETLINK socket\n");
66870 + }
66871 +#endif
66872 +
66873 + macp->DeviceOpened = 1;
66874 +exit:
66875 +//#ifndef CONFIG_SMP
66876 +// read_unlock(&(macp->isolate_lock));
66877 +//#endif
66878 + //zfRegisterWdsDev(dev, 0);
66879 + //zfLnxRegisterVapDev(dev, 0);
66880 +
66881 + return rc;
66882 +}
66883 +
66884 +
66885 +
66886 +
66887 +/**
66888 + * usbdrv_get_stats - get driver statistics
66889 + * @dev: adapter's net_device struct
66890 + *
66891 + * This routine is called when the OS wants the adapter's stats returned.
66892 + * It returns the address of the net_device_stats stucture for the device.
66893 + * If the statistics are currently being updated, then they might be incorrect
66894 + * for a short while. However, since this cannot actually cause damage, no
66895 + * locking is used.
66896 + */
66897 +
66898 +struct net_device_stats * usbdrv_get_stats(struct net_device *dev)
66899 +{
66900 + struct usbdrv_private *macp = dev->priv;
66901 +
66902 + macp->drv_stats.net_stats.tx_errors =
66903 + macp->drv_stats.net_stats.tx_carrier_errors +
66904 + macp->drv_stats.net_stats.tx_aborted_errors;
66905 +
66906 + macp->drv_stats.net_stats.rx_errors =
66907 + macp->drv_stats.net_stats.rx_crc_errors +
66908 + macp->drv_stats.net_stats.rx_frame_errors +
66909 + macp->drv_stats.net_stats.rx_length_errors;
66910 +
66911 +
66912 + return &(macp->drv_stats.net_stats);
66913 +}
66914 +
66915 +
66916 +/**
66917 + * usbdrv_set_mac - set the MAC address
66918 + * @dev: adapter's net_device struct
66919 + * @addr: the new address
66920 + *
66921 + * This routine sets the ethernet address of the board
66922 + * Returns:
66923 + * 0 - if successful
66924 + * -1 - otherwise
66925 + */
66926 +
66927 +int usbdrv_set_mac(struct net_device *dev, void *addr)
66928 +{
66929 + struct usbdrv_private *macp;
66930 + int rc = -1;
66931 +
66932 + macp = dev->priv;
66933 + read_lock(&(macp->isolate_lock));
66934 +
66935 + if (macp->driver_isolated) {
66936 + goto exit;
66937 + }
66938 +
66939 + rc = 0;
66940 +
66941 +
66942 +exit:
66943 + read_unlock(&(macp->isolate_lock));
66944 + return rc;
66945 +}
66946 +
66947 +
66948 +
66949 +void
66950 +usbdrv_isolate_driver(struct usbdrv_private *macp)
66951 +{
66952 +#ifndef CONFIG_SMP
66953 + write_lock_irq(&(macp->isolate_lock));
66954 +#endif
66955 + macp->driver_isolated = TRUE;
66956 +#ifndef CONFIG_SMP
66957 + write_unlock_irq(&(macp->isolate_lock));
66958 +#endif
66959 +
66960 + if (netif_running(macp->device))
66961 + {
66962 + netif_carrier_off(macp->device);
66963 + netif_stop_queue(macp->device);
66964 + }
66965 +}
66966 +
66967 +#define VLAN_SIZE 4
66968 +int usbdrv_change_mtu(struct net_device *dev, int new_mtu)
66969 +{
66970 + if ((new_mtu < 68) || (new_mtu > (ETH_DATA_LEN + VLAN_SIZE)))
66971 + return -EINVAL;
66972 +
66973 + dev->mtu = new_mtu;
66974 + return 0;
66975 +}
66976 +
66977 +void zfLnxUnlinkAllUrbs(struct usbdrv_private *macp);
66978 +
66979 +int usbdrv_close(struct net_device *dev)
66980 +{
66981 +extern void zfHpLedCtrl(struct net_device *dev, u16_t ledId, u8_t mode);
66982 +
66983 + struct usbdrv_private *macp = dev->priv;
66984 +
66985 + printk(KERN_DEBUG "usbdrv_close\n");
66986 +
66987 + netif_carrier_off(macp->device);
66988 +
66989 + del_timer_sync(&macp->hbTimer10ms);
66990 +
66991 + printk(KERN_DEBUG "usbdrv_netif_carrier_off\n");
66992 +
66993 + usbdrv_isolate_driver(macp);
66994 +
66995 + printk(KERN_DEBUG "usbdrv_isolate_driver\n");
66996 +
66997 + netif_carrier_off(macp->device);
66998 +#ifdef ZM_ENABLE_CENC
66999 + /* CENC */
67000 + if (macp->netlink_sk != NULL)
67001 + {
67002 + // sock_release(macp->netlink_sk);
67003 + printk(KERN_ERR "usbdrv close netlink socket\n");
67004 + }
67005 +#endif //ZM_ENABLE_CENC
67006 +#if (WLAN_HOSTIF == WLAN_PCI)
67007 + //free_irq(dev->irq, dev);
67008 +#endif
67009 +
67010 + /* Turn off LED */
67011 + zfHpLedCtrl(dev, 0, 0);
67012 + zfHpLedCtrl(dev, 1, 0);
67013 +
67014 + /* Delay for a while */
67015 + mdelay(10);
67016 +
67017 + /* clear WPA/RSN IE */
67018 + macp->supIe[1] = 0;
67019 +
67020 + /* set the isolate flag to false, so usbdrv_open can be called */
67021 + macp->driver_isolated = FALSE;
67022 +
67023 + zfiWlanClose(dev);
67024 + kfree(macp->wd);
67025 +
67026 + zfLnxUnlinkAllUrbs(macp);
67027 +
67028 + return 0;
67029 +}
67030 +
67031 +
67032 +
67033 +
67034 +int usbdrv_xmit_frame(struct sk_buff *skb, struct net_device *dev)
67035 +{
67036 + int notify_stop = FALSE;
67037 + struct usbdrv_private *macp = dev->priv;
67038 +
67039 +#if 0
67040 + /* Test code */
67041 + {
67042 + struct sk_buff* s;
67043 +
67044 + s = skb_copy_expand(skb, 8, 0, GFP_ATOMIC);
67045 + skb_push(s, 8);
67046 + s->data[0] = 'z';
67047 + s->data[1] = 'y';
67048 + s->data[2] = 'd';
67049 + s->data[3] = 'a';
67050 + s->data[4] = 's';
67051 + printk("len1=%d, len2=%d", skb->len, s->len);
67052 + netlink_broadcast(rtnl, s, 0, RTMGRP_LINK, GFP_ATOMIC);
67053 + }
67054 +#endif
67055 +
67056 +#if ZM_DISABLE_XMIT
67057 + dev_kfree_skb_irq(skb);
67058 +#else
67059 + zfiTxSendEth(dev, skb, 0);
67060 +#endif
67061 + macp->drv_stats.net_stats.tx_bytes += skb->len;
67062 + macp->drv_stats.net_stats.tx_packets++;
67063 +
67064 + //dev_kfree_skb_irq(skb);
67065 +
67066 + if (notify_stop) {
67067 + netif_carrier_off(dev);
67068 + netif_stop_queue(dev);
67069 + }
67070 +
67071 + return 0;
67072 +}
67073 +
67074 +
67075 +
67076 +
67077 +void usbdrv_set_multi(struct net_device *dev)
67078 +{
67079 +
67080 +
67081 + if (!(dev->flags & IFF_UP))
67082 + return;
67083 +
67084 + return;
67085 +
67086 +}
67087 +
67088 +
67089 +
67090 +/**
67091 + * usbdrv_clear_structs - free resources
67092 +
67093 + * @dev: adapter's net_device struct
67094 + *
67095 + * Free all device specific structs, unmap i/o address, etc.
67096 + */
67097 +void usbdrv_clear_structs(struct net_device *dev)
67098 +{
67099 + struct usbdrv_private *macp = dev->priv;
67100 +
67101 +
67102 +#if (WLAN_HOSTIF == WLAN_PCI)
67103 + iounmap(macp->regp);
67104 +
67105 + pci_release_regions(macp->pdev);
67106 + pci_disable_device(macp->pdev);
67107 + pci_set_drvdata(macp->pdev, NULL);
67108 +#endif
67109 +
67110 + kfree(macp);
67111 +
67112 + kfree(dev);
67113 +
67114 +}
67115 +
67116 +void usbdrv_remove1(struct pci_dev *pcid)
67117 +{
67118 + struct net_device *dev;
67119 + struct usbdrv_private *macp;
67120 +
67121 + if (!(dev = (struct net_device *) pci_get_drvdata(pcid)))
67122 + return;
67123 +
67124 + macp = dev->priv;
67125 + unregister_netdev(dev);
67126 +
67127 + usbdrv_clear_structs(dev);
67128 +}
67129 +
67130 +
67131 +void zfLnx10msTimer(struct net_device* dev)
67132 +{
67133 + struct usbdrv_private *macp = dev->priv;
67134 +
67135 + mod_timer(&(macp->hbTimer10ms), jiffies + (1*HZ)/100); //10 ms
67136 + zfiHeartBeat(dev);
67137 + return;
67138 +}
67139 +
67140 +void zfLnxInitVapStruct(void)
67141 +{
67142 + u16_t i;
67143 +
67144 + for (i=0; i<ZM_VAP_PORT_NUMBER; i++)
67145 + {
67146 + vap[i].dev = NULL;
67147 + vap[i].openFlag = 0;
67148 + }
67149 +}
67150 +
67151 +int zfLnxVapOpen(struct net_device *dev)
67152 +{
67153 + u16_t vapId;
67154 +
67155 + vapId = zfLnxGetVapId(dev);
67156 +
67157 + if (vap[vapId].openFlag == 0)
67158 + {
67159 + vap[vapId].openFlag = 1;
67160 + printk("zfLnxVapOpen : device name=%s, vap ID=%d\n", dev->name, vapId);
67161 + zfiWlanSetSSID(dev, "vap1", 4);
67162 + zfiWlanEnable(dev);
67163 + netif_start_queue(dev);
67164 + }
67165 + else
67166 + {
67167 + printk("VAP opened error : vap ID=%d\n", vapId);
67168 + }
67169 + return 0;
67170 +}
67171 +
67172 +int zfLnxVapClose(struct net_device *dev)
67173 +{
67174 + u16_t vapId;
67175 +
67176 + vapId = zfLnxGetVapId(dev);
67177 +
67178 + if (vapId != 0xffff)
67179 + {
67180 + if (vap[vapId].openFlag == 1)
67181 + {
67182 + printk("zfLnxVapClose: device name=%s, vap ID=%d\n", dev->name, vapId);
67183 +
67184 + netif_stop_queue(dev);
67185 + vap[vapId].openFlag = 0;
67186 + }
67187 + else
67188 + {
67189 + printk("VAP port was not opened : vap ID=%d\n", vapId);
67190 + }
67191 + }
67192 + return 0;
67193 +}
67194 +
67195 +int zfLnxVapXmitFrame(struct sk_buff *skb, struct net_device *dev)
67196 +{
67197 + int notify_stop = FALSE;
67198 + struct usbdrv_private *macp = dev->priv;
67199 + u16_t vapId;
67200 +
67201 + vapId = zfLnxGetVapId(dev);
67202 + //printk("zfLnxVapXmitFrame: vap ID=%d\n", vapId);
67203 + //printk("zfLnxVapXmitFrame(), skb=%lxh\n", (u32_t)skb);
67204 +
67205 + if (vapId >= ZM_VAP_PORT_NUMBER)
67206 + {
67207 + dev_kfree_skb_irq(skb);
67208 + return 0;
67209 + }
67210 +#if 1
67211 + if (vap[vapId].openFlag == 0)
67212 + {
67213 + dev_kfree_skb_irq(skb);
67214 + return 0;
67215 + }
67216 +#endif
67217 +
67218 +
67219 + zfiTxSendEth(dev, skb, 0x1);
67220 +
67221 + macp->drv_stats.net_stats.tx_bytes += skb->len;
67222 + macp->drv_stats.net_stats.tx_packets++;
67223 +
67224 + //dev_kfree_skb_irq(skb);
67225 +
67226 + if (notify_stop) {
67227 + netif_carrier_off(dev);
67228 + netif_stop_queue(dev);
67229 + }
67230 +
67231 + return 0;
67232 +}
67233 +
67234 +int zfLnxRegisterVapDev(struct net_device* parentDev, u16_t vapId)
67235 +{
67236 + /* Allocate net device structure */
67237 + vap[vapId].dev = alloc_etherdev(0);
67238 + printk("Register vap dev=%x\n", (u32_t)vap[vapId].dev);
67239 +
67240 + if(vap[vapId].dev == NULL) {
67241 + printk("alloc_etherdev fail\n");
67242 + return -ENOMEM;
67243 + }
67244 +
67245 + /* Setup the default settings */
67246 + ether_setup(vap[vapId].dev);
67247 +
67248 + /* MAC address */
67249 + memcpy(vap[vapId].dev->dev_addr, parentDev->dev_addr, ETH_ALEN);
67250 +
67251 + vap[vapId].dev->irq = parentDev->irq;
67252 + vap[vapId].dev->base_addr = parentDev->base_addr;
67253 + vap[vapId].dev->mem_start = parentDev->mem_start;
67254 + vap[vapId].dev->mem_end = parentDev->mem_end;
67255 + vap[vapId].dev->priv = parentDev->priv;
67256 +
67257 + //dev->hard_start_xmit = &zd1212_wds_xmit_frame;
67258 + vap[vapId].dev->hard_start_xmit = &zfLnxVapXmitFrame;
67259 + vap[vapId].dev->open = &zfLnxVapOpen;
67260 + vap[vapId].dev->stop = &zfLnxVapClose;
67261 + vap[vapId].dev->get_stats = &usbdrv_get_stats;
67262 + vap[vapId].dev->change_mtu = &usbdrv_change_mtu;
67263 +#ifdef ZM_HOSTAPD_SUPPORT
67264 + vap[vapId].dev->do_ioctl = usbdrv_ioctl;
67265 +#else
67266 + vap[vapId].dev->do_ioctl = NULL;
67267 +#endif
67268 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
67269 + vap[vapId].dev->destructor = free_netdev;
67270 +#else
67271 + vap[vapId].dev->features |= NETIF_F_DYNALLOC;
67272 +#endif
67273 +
67274 + vap[vapId].dev->tx_queue_len = 0;
67275 +
67276 + vap[vapId].dev->dev_addr[0] = parentDev->dev_addr[0];
67277 + vap[vapId].dev->dev_addr[1] = parentDev->dev_addr[1];
67278 + vap[vapId].dev->dev_addr[2] = parentDev->dev_addr[2];
67279 + vap[vapId].dev->dev_addr[3] = parentDev->dev_addr[3];
67280 + vap[vapId].dev->dev_addr[4] = parentDev->dev_addr[4];
67281 + vap[vapId].dev->dev_addr[5] = parentDev->dev_addr[5] + (vapId+1);
67282 +
67283 + /* Stop the network queue first */
67284 + netif_stop_queue(vap[vapId].dev);
67285 +
67286 + sprintf(vap[vapId].dev->name, "vap%d", vapId);
67287 + printk("Register VAP dev success : %s\n", vap[vapId].dev->name);
67288 +
67289 + if(register_netdevice(vap[vapId].dev) != 0) {
67290 + printk("register VAP device fail\n");
67291 + vap[vapId].dev = NULL;
67292 + return -EINVAL;
67293 + }
67294 +
67295 + return 0;
67296 +}
67297 +
67298 +int zfLnxUnregisterVapDev(struct net_device* parentDev, u16_t vapId)
67299 +{
67300 + int ret = 0;
67301 +
67302 + printk("Unregister VAP dev : %s\n", vap[vapId].dev->name);
67303 +
67304 + if(vap[vapId].dev != NULL) {
67305 + printk("Unregister vap dev=%x\n", (u32_t)vap[vapId].dev);
67306 + //
67307 + //unregister_netdevice(wds[wdsId].dev);
67308 + unregister_netdev(vap[vapId].dev);
67309 +
67310 + printk("VAP unregister_netdevice\n");
67311 + vap[vapId].dev = NULL;
67312 + }
67313 + else {
67314 + printk("unregister VAP device: %d fail\n", vapId);
67315 + ret = -EINVAL;
67316 + }
67317 +
67318 + return ret;
67319 +}
67320 +
67321 +
67322 +
67323 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) /* tune me! */
67324 +# define SUBMIT_URB(u,f) usb_submit_urb(u,f)
67325 +# define USB_ALLOC_URB(u,f) usb_alloc_urb(u,f)
67326 +#else
67327 +# define SUBMIT_URB(u,f) usb_submit_urb(u)
67328 +# define USB_ALLOC_URB(u,f) usb_alloc_urb(u)
67329 +#endif
67330 +
67331 +//extern void zfiWlanQueryMacAddress(zdev_t* dev, u8_t* addr);
67332 +extern struct iw_handler_def p80211wext_handler_def;
67333 +
67334 +extern int usbdrv_open(struct net_device *dev);
67335 +extern int usbdrv_close(struct net_device *dev);
67336 +extern int usbdrv_xmit_frame(struct sk_buff *skb, struct net_device *dev);
67337 +extern int usbdrv_xmit_frame(struct sk_buff *skb, struct net_device *dev);
67338 +extern int usbdrv_change_mtu(struct net_device *dev, int new_mtu);
67339 +extern void usbdrv_set_multi(struct net_device *dev);
67340 +extern int usbdrv_set_mac(struct net_device *dev, void *addr);
67341 +extern struct net_device_stats * usbdrv_get_stats(struct net_device *dev);
67342 +extern int usbdrv_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd);
67343 +extern UsbTxQ_t *zfLnxGetUsbTxBuffer(struct net_device *dev);
67344 +
67345 +int zfLnxAllocAllUrbs(struct usbdrv_private *macp)
67346 +{
67347 + struct usb_interface *interface = macp->interface;
67348 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
67349 + struct usb_interface_descriptor *iface_desc = &interface->altsetting[0];
67350 +#else
67351 + struct usb_host_interface *iface_desc = &interface->altsetting[0];
67352 +#endif
67353 +
67354 + struct usb_endpoint_descriptor *endpoint;
67355 + int i;
67356 +
67357 + /* descriptor matches, let's find the endpoints needed */
67358 + /* check out the endpoints */
67359 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
67360 + for (i = 0; i < iface_desc->bNumEndpoints; ++i)
67361 + {
67362 + endpoint = &iface_desc->endpoint[i];
67363 +#else
67364 + for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i)
67365 + {
67366 + endpoint = &iface_desc->endpoint[i].desc;
67367 +#endif
67368 + if ((endpoint->bEndpointAddress & 0x80) &&
67369 + ((endpoint->bmAttributes & 3) == 0x02))
67370 + {
67371 + /* we found a bulk in endpoint */
67372 + printk(KERN_ERR "bulk in: wMaxPacketSize = %x\n", le16_to_cpu(endpoint->wMaxPacketSize));
67373 + }
67374 +
67375 + if (((endpoint->bEndpointAddress & 0x80) == 0x00) &&
67376 + ((endpoint->bmAttributes & 3) == 0x02))
67377 + {
67378 + /* we found a bulk out endpoint */
67379 + printk(KERN_ERR "bulk out: wMaxPacketSize = %x\n", le16_to_cpu(endpoint->wMaxPacketSize));
67380 + }
67381 +
67382 + if ((endpoint->bEndpointAddress & 0x80) &&
67383 + ((endpoint->bmAttributes & 3) == 0x03))
67384 + {
67385 + /* we found a interrupt in endpoint */
67386 + printk(KERN_ERR "interrupt in: wMaxPacketSize = %x\n", le16_to_cpu(endpoint->wMaxPacketSize));
67387 + printk(KERN_ERR "interrupt in: int_interval = %d\n", endpoint->bInterval);
67388 + }
67389 +
67390 + if (((endpoint->bEndpointAddress & 0x80) == 0x00) &&
67391 + ((endpoint->bmAttributes & 3) == 0x03))
67392 + {
67393 + /* we found a interrupt out endpoint */
67394 + printk(KERN_ERR "interrupt out: wMaxPacketSize = %x\n", le16_to_cpu(endpoint->wMaxPacketSize));
67395 + printk(KERN_ERR "interrupt out: int_interval = %d\n", endpoint->bInterval);
67396 + }
67397 + }
67398 +
67399 + /* Allocate all Tx URBs */
67400 + for (i = 0; i < ZM_MAX_TX_URB_NUM; i++)
67401 + {
67402 + macp->WlanTxDataUrb[i] = USB_ALLOC_URB(0, GFP_KERNEL);
67403 +
67404 + if (macp->WlanTxDataUrb[i] == 0)
67405 + {
67406 + int j;
67407 +
67408 + /* Free all urbs */
67409 + for (j = 0; j < i; j++)
67410 + {
67411 + usb_free_urb(macp->WlanTxDataUrb[j]);
67412 + }
67413 +
67414 + return 0;
67415 + }
67416 + }
67417 +
67418 + /* Allocate all Rx URBs */
67419 + for (i = 0; i < ZM_MAX_RX_URB_NUM; i++)
67420 + {
67421 + macp->WlanRxDataUrb[i] = USB_ALLOC_URB(0, GFP_KERNEL);
67422 +
67423 + if (macp->WlanRxDataUrb[i] == 0)
67424 + {
67425 + int j;
67426 +
67427 + /* Free all urbs */
67428 + for (j = 0; j < i; j++)
67429 + {
67430 + usb_free_urb(macp->WlanRxDataUrb[j]);
67431 + }
67432 +
67433 + for (j = 0; j < ZM_MAX_TX_URB_NUM; j++)
67434 + {
67435 + usb_free_urb(macp->WlanTxDataUrb[j]);
67436 + }
67437 +
67438 + return 0;
67439 + }
67440 + }
67441 +
67442 + /* Allocate Register Read/Write USB */
67443 + macp->RegOutUrb = USB_ALLOC_URB(0, GFP_KERNEL);
67444 + macp->RegInUrb = USB_ALLOC_URB(0, GFP_KERNEL);
67445 +
67446 + return 1;
67447 +}
67448 +
67449 +void zfLnxFreeAllUrbs(struct usbdrv_private *macp)
67450 +{
67451 + int i;
67452 +
67453 + /* Free all Tx URBs */
67454 + for (i = 0; i < ZM_MAX_TX_URB_NUM; i++)
67455 + {
67456 + if (macp->WlanTxDataUrb[i] != NULL)
67457 + {
67458 + usb_free_urb(macp->WlanTxDataUrb[i]);
67459 + }
67460 + }
67461 +
67462 + /* Free all Rx URBs */
67463 + for (i = 0; i < ZM_MAX_RX_URB_NUM; i++)
67464 + {
67465 + if (macp->WlanRxDataUrb[i] != NULL)
67466 + {
67467 + usb_free_urb(macp->WlanRxDataUrb[i]);
67468 + }
67469 + }
67470 +
67471 + /* Free USB Register Read/Write URB */
67472 + usb_free_urb(macp->RegOutUrb);
67473 + usb_free_urb(macp->RegInUrb);
67474 +}
67475 +
67476 +void zfLnxUnlinkAllUrbs(struct usbdrv_private *macp)
67477 +{
67478 + int i;
67479 +
67480 + /* Unlink all Tx URBs */
67481 + for (i = 0; i < ZM_MAX_TX_URB_NUM; i++)
67482 + {
67483 + if (macp->WlanTxDataUrb[i] != NULL)
67484 + {
67485 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)
67486 + macp->WlanTxDataUrb[i]->transfer_flags &= ~URB_ASYNC_UNLINK;
67487 +#endif
67488 + usb_unlink_urb(macp->WlanTxDataUrb[i]);
67489 + }
67490 + }
67491 +
67492 + /* Unlink all Rx URBs */
67493 + for (i = 0; i < ZM_MAX_RX_URB_NUM; i++)
67494 + {
67495 + if (macp->WlanRxDataUrb[i] != NULL)
67496 + {
67497 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)
67498 + macp->WlanRxDataUrb[i]->transfer_flags &= ~URB_ASYNC_UNLINK;
67499 +#endif
67500 + usb_unlink_urb(macp->WlanRxDataUrb[i]);
67501 + }
67502 + }
67503 +
67504 + /* Unlink USB Register Read/Write URB */
67505 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)
67506 + macp->RegOutUrb->transfer_flags &= ~URB_ASYNC_UNLINK;
67507 +#endif
67508 + usb_unlink_urb(macp->RegOutUrb);
67509 +
67510 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)
67511 + macp->RegInUrb->transfer_flags &= ~URB_ASYNC_UNLINK;
67512 +#endif
67513 + usb_unlink_urb(macp->RegInUrb);
67514 +}
67515 +
67516 +u8_t zfLnxInitSetup(struct net_device *dev, struct usbdrv_private *macp)
67517 +{
67518 + //unsigned char addr[6];
67519 +
67520 + //init_MUTEX(&macp->ps_sem);
67521 + //init_MUTEX(&macp->reg_sem);
67522 + //init_MUTEX(&macp->bcn_sem);
67523 + //init_MUTEX(&macp->config_sem);
67524 +
67525 + spin_lock_init(&(macp->cs_lock));
67526 +#if 0
67527 + /* MAC address */
67528 + zfiWlanQueryMacAddress(dev, addr);
67529 + dev->dev_addr[0] = addr[0];
67530 + dev->dev_addr[1] = addr[1];
67531 + dev->dev_addr[2] = addr[2];
67532 + dev->dev_addr[3] = addr[3];
67533 + dev->dev_addr[4] = addr[4];
67534 + dev->dev_addr[5] = addr[5];
67535 +#endif
67536 +#if WIRELESS_EXT > 12
67537 + dev->wireless_handlers = (struct iw_handler_def *)&p80211wext_handler_def;
67538 +#endif
67539 +
67540 + dev->open = usbdrv_open;
67541 + dev->hard_start_xmit = usbdrv_xmit_frame;
67542 + dev->stop = usbdrv_close;
67543 + dev->change_mtu = &usbdrv_change_mtu;
67544 + dev->get_stats = usbdrv_get_stats;
67545 + dev->set_multicast_list = usbdrv_set_multi;
67546 + dev->set_mac_address = usbdrv_set_mac;
67547 + dev->do_ioctl = usbdrv_ioctl;
67548 +
67549 + dev->flags |= IFF_MULTICAST;
67550 +
67551 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24))
67552 + dev->dev_addr[0] = 0x00;
67553 + dev->dev_addr[1] = 0x03;
67554 + dev->dev_addr[2] = 0x7f;
67555 + dev->dev_addr[3] = 0x11;
67556 + dev->dev_addr[4] = 0x22;
67557 + dev->dev_addr[5] = 0x33;
67558 +#endif
67559 +
67560 + /* Initialize Heart Beat timer */
67561 + init_timer(&macp->hbTimer10ms);
67562 + macp->hbTimer10ms.data = (unsigned long)dev;
67563 + macp->hbTimer10ms.function = (void *)&zfLnx10msTimer;
67564 +
67565 + /* Initialize WDS and VAP data structure */
67566 + //zfInitWdsStruct();
67567 + zfLnxInitVapStruct();
67568 +
67569 + return 1;
67570 +}
67571 +
67572 +u8_t zfLnxClearStructs(struct net_device *dev)
67573 +{
67574 + u16_t ii;
67575 + u16_t TxQCnt;
67576 +
67577 + TxQCnt = zfLnxCheckTxBufferCnt(dev);
67578 +
67579 + printk(KERN_ERR "TxQCnt: %d\n", TxQCnt);
67580 +
67581 + for(ii = 0; ii < TxQCnt; ii++)
67582 + {
67583 + UsbTxQ_t *TxQ = zfLnxGetUsbTxBuffer(dev);
67584 +
67585 + printk(KERN_ERR "dev_kfree_skb_any\n");
67586 + /* Free buffer */
67587 + dev_kfree_skb_any(TxQ->buf);
67588 + }
67589 +
67590 + return 0;
67591 +}
67592 --- /dev/null
67593 +++ b/drivers/staging/otus/usbdrv.h
67594 @@ -0,0 +1,257 @@
67595 +/*
67596 + * Copyright (c) 2007-2008 Atheros Communications Inc.
67597 + *
67598 + * Permission to use, copy, modify, and/or distribute this software for any
67599 + * purpose with or without fee is hereby granted, provided that the above
67600 + * copyright notice and this permission notice appear in all copies.
67601 + *
67602 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
67603 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
67604 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
67605 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
67606 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
67607 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
67608 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
67609 + */
67610 +/* */
67611 +/* Module Name : usbdrv.h */
67612 +/* */
67613 +/* Abstract */
67614 +/* This module contains network interface up/down related definition*/
67615 +/* */
67616 +/* NOTES */
67617 +/* Platform dependent. */
67618 +/* */
67619 +/************************************************************************/
67620 +
67621 +#ifndef _USBDRV_H
67622 +#define _USBDRV_H
67623 +
67624 +#define WLAN_USB 0
67625 +#define WLAN_PCI 1
67626 +
67627 +#include <linux/module.h>
67628 +#include <linux/pci.h>
67629 +#include <linux/netdevice.h>
67630 +#include <linux/etherdevice.h>
67631 +#include <linux/skbuff.h>
67632 +#include <linux/version.h>
67633 +#include <asm/uaccess.h>
67634 +#include <linux/wireless.h>
67635 +#include <linux/if_arp.h>
67636 +#include <asm/io.h>
67637 +
67638 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
67639 + #include <asm/div64.h>
67640 +#endif
67641 +
67642 +#include "zdcompat.h"
67643 +
67644 +#include "oal_dt.h"
67645 +#include "oal_marc.h"
67646 +#include "80211core/pub_zfi.h"
67647 +//#include "pub_zfw.h"
67648 +#include "80211core/pub_usb.h"
67649 +
67650 +#include <linux/usb.h>
67651 +/* Please include header files for device type in the beginning of this file */
67652 +#define urb_t struct urb
67653 +
67654 +#define usb_complete_t usb_complete_t
67655 +#define pipe_t u32_t
67656 +
67657 +/* USB Endpoint definition */
67658 +#define USB_WLAN_TX_PIPE 1
67659 +#define USB_WLAN_RX_PIPE 2
67660 +#define USB_REG_IN_PIPE 3
67661 +#define USB_REG_OUT_PIPE 4
67662 +
67663 +#if (WLAN_HOSTIF == WLAN_USB)
67664 +#include <linux/usb.h>
67665 +#endif
67666 +
67667 +#ifdef ZM_HOSTAPD_SUPPORT
67668 +#include "athr_common.h"
67669 +#endif
67670 +
67671 +/**************************************************************************
67672 +** Descriptor Data Structure
67673 +***************************************************************************/
67674 +struct driver_stats {
67675 + struct net_device_stats net_stats;
67676 +};
67677 +
67678 +#define ZM_MAX_RX_BUFFER_SIZE 8192
67679 +
67680 +#if ZM_USB_TX_STREAM_MODE == 1
67681 +#define ZM_MAX_TX_AGGREGATE_NUM 4
67682 +#define ZM_USB_TX_BUF_SIZE 8096
67683 +#define ZM_MAX_TX_URB_NUM 4
67684 +#else
67685 +#define ZM_USB_TX_BUF_SIZE 2048
67686 +#define ZM_MAX_TX_URB_NUM 8
67687 +#endif
67688 +#define ZM_USB_REG_MAX_BUF_SIZE 64
67689 +#define ZM_MAX_RX_URB_NUM 16
67690 +#define ZM_MAX_TX_BUF_NUM 128
67691 +
67692 +typedef struct UsbTxQ
67693 +{
67694 + zbuf_t *buf;
67695 + u8_t hdr[80];
67696 + u16_t hdrlen;
67697 + u8_t snap[8];
67698 + u16_t snapLen;
67699 + u8_t tail[16];
67700 + u16_t tailLen;
67701 + u16_t offset;
67702 +} UsbTxQ_t;
67703 +
67704 +
67705 +struct zdap_ioctl {
67706 + u16_t cmd; /* Command to run */
67707 + u32_t addr; /* Length of the data buffer */
67708 + u32_t value; /* Pointer to the data buffer */
67709 + u8_t data[0x100];
67710 +};
67711 +
67712 +#define ZM_OAL_MAX_STA_SUPPORT 16
67713 +
67714 +struct usbdrv_private
67715 +{
67716 + //linux used
67717 + struct net_device *device;
67718 +#if (WLAN_HOSTIF == WLAN_PCI)
67719 + struct pci_dev *pdev;
67720 +#endif
67721 +#if (WLAN_HOSTIF == WLAN_USB)
67722 + struct usb_device *udev;
67723 + struct usb_interface *interface;
67724 +#endif
67725 + struct driver_stats drv_stats;
67726 + char ifname[IFNAMSIZ];
67727 + int using_dac;
67728 + u8_t rev_id; /* adapter PCI revision ID */
67729 + rwlock_t isolate_lock;
67730 + spinlock_t cs_lock;
67731 + int driver_isolated;
67732 +#if (WLAN_HOSTIF == WLAN_PCI)
67733 + void *regp;
67734 +#endif
67735 +
67736 + /* timer for heart beat */
67737 + struct timer_list hbTimer10ms;
67738 +
67739 + /* For driver core */
67740 + void* wd;
67741 +
67742 +#if (WLAN_HOSTIF == WLAN_USB)
67743 + u8_t txUsbBuf[ZM_MAX_TX_URB_NUM][ZM_USB_TX_BUF_SIZE];
67744 + u8_t regUsbReadBuf[ZM_USB_REG_MAX_BUF_SIZE];
67745 + u8_t regUsbWriteBuf[ZM_USB_REG_MAX_BUF_SIZE];
67746 + urb_t *WlanTxDataUrb[ZM_MAX_TX_URB_NUM];
67747 + urb_t *WlanRxDataUrb[ZM_MAX_RX_URB_NUM];
67748 + urb_t *RegOutUrb;
67749 + urb_t *RegInUrb;
67750 + UsbTxQ_t UsbTxBufQ[ZM_MAX_TX_BUF_NUM];
67751 + zbuf_t *UsbRxBufQ[ZM_MAX_RX_URB_NUM];
67752 + u16_t TxBufHead;
67753 + u16_t TxBufTail;
67754 + u16_t TxBufCnt;
67755 + u16_t TxUrbHead;
67756 + u16_t TxUrbTail;
67757 + u16_t TxUrbCnt;
67758 + u16_t RxBufHead;
67759 + u16_t RxBufTail;
67760 + u16_t RxBufCnt;
67761 +#endif
67762 +
67763 +#if ZM_USB_STREAM_MODE == 1
67764 + zbuf_t *reamin_buf;
67765 +#endif
67766 +
67767 +#ifdef ZM_HOSTAPD_SUPPORT
67768 + struct athr_wlan_param athr_wpa_req;
67769 +#endif
67770 + struct sock *netlink_sk;
67771 + u8_t DeviceOpened; //CWYang(+)
67772 + u8_t supIe[50];
67773 + u8_t supLen;
67774 + struct ieee80211req_wpaie stawpaie[ZM_OAL_MAX_STA_SUPPORT];
67775 + u8_t forwardMgmt;
67776 +
67777 + struct zfCbUsbFuncTbl usbCbFunctions;
67778 +
67779 + /* For keventd */
67780 + u32_t flags;
67781 + unsigned long kevent_flags;
67782 + u16_t kevent_ready;
67783 +
67784 + struct semaphore ioctl_sem;
67785 + struct work_struct kevent;
67786 + wait_queue_head_t wait_queue_event;
67787 +#ifdef ZM_HALPLUS_LOCK
67788 + unsigned long hal_irqFlag;
67789 +#endif
67790 + u16_t adapterState;
67791 +};
67792 +
67793 +/* WDS */
67794 +#define ZM_WDS_PORT_NUMBER 6
67795 +
67796 +struct zsWdsStruct
67797 +{
67798 + struct net_device* dev;
67799 + u16_t openFlag;
67800 +};
67801 +
67802 +/* VAP */
67803 +#define ZM_VAP_PORT_NUMBER 7
67804 +
67805 +struct zsVapStruct
67806 +{
67807 + struct net_device* dev;
67808 + u16_t openFlag;
67809 +};
67810 +
67811 +/***************************************/
67812 +
67813 +#define ZM_IOCTL_REG_READ 0x01
67814 +#define ZM_IOCTL_REG_WRITE 0x02
67815 +#define ZM_IOCTL_MEM_DUMP 0x03
67816 +#define ZM_IOCTL_REG_DUMP 0x05
67817 +#define ZM_IOCTL_TXD_DUMP 0x06
67818 +#define ZM_IOCTL_RXD_DUMP 0x07
67819 +#define ZM_IOCTL_MEM_READ 0x0B
67820 +#define ZM_IOCTL_MEM_WRITE 0x0C
67821 +#define ZM_IOCTL_DMA_TEST 0x10
67822 +#define ZM_IOCTL_REG_TEST 0x11
67823 +#define ZM_IOCTL_TEST 0x80
67824 +#define ZM_IOCTL_TALLY 0x81 //CWYang(+)
67825 +#define ZM_IOCTL_RTS 0xA0
67826 +#define ZM_IOCTL_MIX_MODE 0xA1
67827 +#define ZM_IOCTL_FRAG 0xA2
67828 +#define ZM_IOCTL_SCAN 0xA3
67829 +#define ZM_IOCTL_KEY 0xA4
67830 +#define ZM_IOCTL_RATE 0xA5
67831 +#define ZM_IOCTL_ENCRYPTION_MODE 0xA6
67832 +#define ZM_IOCTL_GET_TXCNT 0xA7
67833 +#define ZM_IOCTL_GET_DEAGG_CNT 0xA8
67834 +#define ZM_IOCTL_DURATION_MODE 0xA9
67835 +#define ZM_IOCTL_SET_AES_KEY 0xAA
67836 +#define ZM_IOCTL_SET_AES_MODE 0xAB
67837 +#define ZM_IOCTL_SIGNAL_STRENGTH 0xAC //CWYang(+)
67838 +#define ZM_IOCTL_SIGNAL_QUALITY 0xAD //CWYang(+)
67839 +#define ZM_IOCTL_SET_PIBSS_MODE 0xAE
67840 +
67841 +#define ZDAPIOCTL SIOCDEVPRIVATE
67842 +
67843 +enum devState {
67844 + Opened,
67845 + Enabled,
67846 + Disabled,
67847 + Closed
67848 +};
67849 +
67850 +#endif /* _USBDRV_H */
67851 +
67852 --- /dev/null
67853 +++ b/drivers/staging/otus/wrap_buf.c
67854 @@ -0,0 +1,114 @@
67855 +/*
67856 + * Copyright (c) 2007-2008 Atheros Communications Inc.
67857 + *
67858 + * Permission to use, copy, modify, and/or distribute this software for any
67859 + * purpose with or without fee is hereby granted, provided that the above
67860 + * copyright notice and this permission notice appear in all copies.
67861 + *
67862 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
67863 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
67864 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
67865 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
67866 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
67867 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
67868 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
67869 + */
67870 +/* */
67871 +/* Module Name : wrap_buf.c */
67872 +/* */
67873 +/* Abstract */
67874 +/* This module contains wrapper functions for buffer management */
67875 +/* */
67876 +/* NOTES */
67877 +/* Platform dependent. */
67878 +/* */
67879 +/************************************************************************/
67880 +
67881 +#include "oal_dt.h"
67882 +#include "usbdrv.h"
67883 +
67884 +
67885 +#include <linux/netlink.h>
67886 +
67887 +#if WIRELESS_EXT > 12
67888 +#include <net/iw_handler.h>
67889 +#endif
67890 +
67891 +
67892 +
67893 +/* Called to allocate buffer, must return a continue buffer space */
67894 +zbuf_t* zfwBufAllocate(zdev_t* dev, u16_t len)
67895 +{
67896 + zbuf_t* buf;
67897 +
67898 + /* Allocate SKB for packet*/
67899 + buf = dev_alloc_skb(len);
67900 +
67901 + return buf;
67902 +}
67903 +
67904 +
67905 +/* Called to free buffer, replace below 3 functions */
67906 +void zfwBufFree(zdev_t* dev, zbuf_t* buf, u16_t status)
67907 +{
67908 + dev_kfree_skb_any(buf);
67909 +}
67910 +
67911 +/* Called to adjust buffer size and head pointer */
67912 +u16_t zfwBufRemoveHead(zdev_t* dev, zbuf_t* buf, u16_t size)
67913 +{
67914 + //zm_assert(buf->len > size);
67915 +
67916 + buf->data += size;
67917 + buf->len -= size;
67918 + return 0;
67919 +}
67920 +
67921 +
67922 +
67923 +
67924 +/* return tail if head==NULL, called to chain multiple buffer together */
67925 +/* Used to chain Rx buffer to form a frame. if the prepared Rx buffer */
67926 +/* is greater than an ethernet frame(1518+32 byte), then this function */
67927 +/* will only be called with head=NULL. */
67928 +u16_t zfwBufChain(zdev_t* dev, zbuf_t** head, zbuf_t* tail)
67929 +{
67930 +
67931 + *head = tail;
67932 + return 0;
67933 +}
67934 +
67935 +
67936 +/* Called when doing infra-bss forwarding */
67937 +u16_t zfwBufCopy(zdev_t* dev, zbuf_t* dst, zbuf_t* src)
67938 +{
67939 + memcpy(dst->data, src->data, src->len);
67940 + dst->tail = dst->data;
67941 + skb_put(dst, src->len);
67942 + return 0;
67943 +}
67944 +
67945 +
67946 +/* Called to adjust buffer size and tail pointer */
67947 +u16_t zfwBufSetSize(zdev_t* dev, zbuf_t* buf, u16_t size)
67948 +{
67949 +#ifdef NET_SKBUFF_DATA_USES_OFFSET
67950 + buf->tail = 0;
67951 + buf->len = 0;
67952 +#else
67953 + buf->tail = buf->data;
67954 + buf->len = 0;
67955 +#endif
67956 +
67957 + skb_put(buf, size);
67958 + return 0;
67959 +}
67960 +
67961 +u16_t zfwBufGetSize(zdev_t* dev, zbuf_t* buf)
67962 +{
67963 + return buf->len;
67964 +}
67965 +
67966 +void zfwCopyBufContext(zdev_t* dev, zbuf_t* source, zbuf_t* dst)
67967 +{
67968 +}
67969 --- /dev/null
67970 +++ b/drivers/staging/otus/wrap_dbg.c
67971 @@ -0,0 +1,101 @@
67972 +/*
67973 + * Copyright (c) 2007-2008 Atheros Communications Inc.
67974 + *
67975 + * Permission to use, copy, modify, and/or distribute this software for any
67976 + * purpose with or without fee is hereby granted, provided that the above
67977 + * copyright notice and this permission notice appear in all copies.
67978 + *
67979 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
67980 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
67981 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
67982 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
67983 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
67984 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
67985 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
67986 + */
67987 +/* Module Name : wrap_dbg.c */
67988 +/* */
67989 +/* Abstract */
67990 +/* This module contains wrapper functions for debug functions */
67991 +/* */
67992 +/* NOTES */
67993 +/* Platform dependent. */
67994 +/* */
67995 +/************************************************************************/
67996 +
67997 +#include "oal_dt.h"
67998 +#include "usbdrv.h"
67999 +
68000 +#include <linux/netlink.h>
68001 +
68002 +#if WIRELESS_EXT > 12
68003 +#include <net/iw_handler.h>
68004 +#endif
68005 +
68006 +void zfwDumpBuf(zdev_t* dev, zbuf_t* buf)
68007 +{
68008 + u16_t i;
68009 +
68010 + for (i=0; i<buf->len; i++)
68011 + {
68012 + printk("%02x ", *(((u8_t*)buf->data)+i));
68013 + if ((i&0xf)==0xf)
68014 + {
68015 + printk("\n");
68016 + }
68017 + }
68018 + printk("\n");
68019 +}
68020 +
68021 +
68022 +void zfwDbgReadRegDone(zdev_t* dev, u32_t addr, u32_t val)
68023 +{
68024 + printk("Read addr:%x = %x\n", addr, val);
68025 +}
68026 +
68027 +void zfwDbgWriteRegDone(zdev_t* dev, u32_t addr, u32_t val)
68028 +{
68029 + printk("Write addr:%x = %x\n", addr, val);
68030 +}
68031 +
68032 +void zfwDbgReadTallyDone(zdev_t* dev)
68033 +{
68034 + //printk("Read Tall Done\n");
68035 +}
68036 +
68037 +void zfwDbgWriteEepromDone(zdev_t* dev, u32_t addr, u32_t val)
68038 +{
68039 +}
68040 +
68041 +void zfwDbgQueryHwTxBusyDone(zdev_t* dev, u32_t val)
68042 +{
68043 +}
68044 +
68045 +//For Evl ++
68046 +void zfwDbgReadFlashDone(zdev_t* dev, u32_t addr, u32_t* rspdata, u32_t datalen)
68047 +{
68048 + printk("Read Flash addr:%x length:%x\n", addr, datalen);
68049 +}
68050 +
68051 +void zfwDbgProgrameFlashDone(zdev_t* dev)
68052 +{
68053 + printk("Program Flash Done\n");
68054 +}
68055 +
68056 +void zfwDbgProgrameFlashChkDone(zdev_t* dev)
68057 +{
68058 + printk("Program Flash Done\n");
68059 +}
68060 +
68061 +void zfwDbgGetFlashChkSumDone(zdev_t* dev, u32_t* rspdata)
68062 +{
68063 + printk("Get Flash ChkSum Done\n");
68064 +}
68065 +
68066 +void zfwDbgDownloadFwInitDone(zdev_t* dev)
68067 +{
68068 + printk("Download FW Init Done\n");
68069 +}
68070 +//For Evl --
68071 +
68072 +/* Leave an empty line below to remove warning message on some compiler */
68073 --- /dev/null
68074 +++ b/drivers/staging/otus/wrap_ev.c
68075 @@ -0,0 +1,283 @@
68076 +/*
68077 + * Copyright (c) 2007-2008 Atheros Communications Inc.
68078 + *
68079 + * Permission to use, copy, modify, and/or distribute this software for any
68080 + * purpose with or without fee is hereby granted, provided that the above
68081 + * copyright notice and this permission notice appear in all copies.
68082 + *
68083 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
68084 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
68085 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
68086 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
68087 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
68088 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
68089 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
68090 + */
68091 +/* */
68092 +/* Module Name : wrap_ev.c */
68093 +/* */
68094 +/* Abstract */
68095 +/* This module contains wrapper functions for events */
68096 +/* */
68097 +/* NOTES */
68098 +/* Platform dependent. */
68099 +/* */
68100 +/************************************************************************/
68101 +
68102 +#include "oal_dt.h"
68103 +#include "usbdrv.h"
68104 +
68105 +#include <linux/netlink.h>
68106 +
68107 +#if WIRELESS_EXT > 12
68108 +#include <net/iw_handler.h>
68109 +#endif
68110 +
68111 +
68112 +/***** Management *****/
68113 +u16_t zfLnxAuthNotify(zdev_t* dev, u16_t* macAddr)
68114 +{
68115 + return 0;
68116 +}
68117 +
68118 +u16_t zfLnxAsocNotify(zdev_t* dev, u16_t* macAddr, u8_t* body, u16_t bodySize, u16_t port)
68119 +{
68120 +//#ifdef ZM_HOSTAPD_SUPPORT
68121 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
68122 + union iwreq_data wreq;
68123 + u8_t *addr = (u8_t *) macAddr;
68124 + u16_t i, j;
68125 +
68126 + memset(&wreq, 0, sizeof(wreq));
68127 + memcpy(wreq.addr.sa_data, macAddr, ETH_ALEN);
68128 + wreq.addr.sa_family = ARPHRD_ETHER;
68129 + printk(KERN_DEBUG "join_event of MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
68130 + addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
68131 +
68132 + for(i = 0; i < ZM_OAL_MAX_STA_SUPPORT; i++)
68133 + {
68134 + for(j = 0; j < IEEE80211_ADDR_LEN; j++)
68135 + {
68136 + if ((macp->stawpaie[i].wpa_macaddr[j] != 0) &&
68137 + (macp->stawpaie[i].wpa_macaddr[j] != addr[j]))
68138 + break;
68139 + }
68140 + if (j == 6)
68141 + break;
68142 + }
68143 + if (i < ZM_OAL_MAX_STA_SUPPORT)
68144 + {
68145 + //printk("zfwAsocNotify - store wpa ie in macp, index = %d\n", i);
68146 + memcpy(macp->stawpaie[i].wpa_macaddr, macAddr, IEEE80211_ADDR_LEN);
68147 + memcpy(macp->stawpaie[i].wpa_ie, body, bodySize);
68148 + }
68149 + //if(macp->cardSetting.BssType == INFRASTRUCTURE_BSS) {
68150 + // //wireless_send_event(macp->device, SIOCGIWSCAN, &wreq, NULL);
68151 + // wireless_send_event(macp->device, SIOCGIWAP, &wreq, NULL);
68152 + //}
68153 +#if WIRELESS_EXT >= 15
68154 + //else if(macp->cardSetting.BssType == AP_BSS) {
68155 +// if (port == 0)
68156 +// {
68157 + wireless_send_event(dev, IWEVREGISTERED, &wreq, NULL);
68158 +// }
68159 +// else
68160 +// {
68161 +// /* Check whether the VAP device is valid */
68162 +// if (vap[port].dev != NULL)
68163 +// {
68164 +// wireless_send_event(vap[port].dev, IWEVREGISTERED, &wreq, NULL);
68165 +// }
68166 +// else
68167 +// {
68168 +// printk(KERN_ERR "Can' find a valid VAP device, port: %d\n", port);
68169 +// }
68170 +// }
68171 + //}
68172 +#endif
68173 +//#endif
68174 +
68175 + return 0;
68176 +}
68177 +
68178 +
68179 +/* Notification that a STA is disassociated from AP */
68180 +/* AP mode only */
68181 +u16_t zfLnxDisAsocNotify(zdev_t* dev, u8_t* macAddr, u16_t port)
68182 +{
68183 + union iwreq_data wreq;
68184 + u8_t *addr = (u8_t *) macAddr;
68185 +
68186 + memset(&wreq, 0, sizeof(wreq));
68187 + memcpy(wreq.addr.sa_data, macAddr, ETH_ALEN);
68188 + wreq.addr.sa_family = ARPHRD_ETHER;
68189 + printk(KERN_DEBUG "zfwDisAsocNotify(), MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
68190 + addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
68191 +
68192 +
68193 + return 0;
68194 +}
68195 +
68196 +/* Notification that a STA is connect to AP */
68197 +/* AP mode only */
68198 +u16_t zfLnxApConnectNotify(zdev_t* dev, u8_t* macAddr, u16_t port)
68199 +{
68200 + union iwreq_data wreq;
68201 + u8_t *addr = (u8_t *) macAddr;
68202 +
68203 + memset(&wreq, 0, sizeof(wreq));
68204 + memcpy(wreq.addr.sa_data, macAddr, ETH_ALEN);
68205 + wreq.addr.sa_family = ARPHRD_ETHER;
68206 + printk(KERN_DEBUG "zfwApConnectNotify(), MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
68207 + addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
68208 +
68209 +
68210 + return 0;
68211 +}
68212 +
68213 +
68214 +
68215 +void zfLnxConnectNotify(zdev_t* dev, u16_t status, u16_t* bssid)
68216 +{
68217 + union iwreq_data wreq;
68218 + u8_t *addr = (u8_t *) bssid;
68219 + struct usbdrv_private *macp = dev->priv;
68220 +
68221 + if (bssid != NULL)
68222 + {
68223 + memset(&wreq, 0, sizeof(wreq));
68224 + if (status == ZM_STATUS_MEDIA_CONNECT)
68225 + memcpy(wreq.addr.sa_data, bssid, ETH_ALEN);
68226 + wreq.addr.sa_family = ARPHRD_ETHER;
68227 +
68228 + if (status == ZM_STATUS_MEDIA_CONNECT)
68229 + {
68230 +#ifdef ZM_CONFIG_BIG_ENDIAN
68231 + printk(KERN_DEBUG "Connected to AP, MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
68232 + addr[1], addr[0], addr[3], addr[2], addr[5], addr[4]);
68233 +#else
68234 + printk(KERN_DEBUG "Connected to AP, MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
68235 + addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
68236 +#endif
68237 +
68238 + netif_start_queue(dev);
68239 + }
68240 + else if ((status == ZM_STATUS_MEDIA_DISCONNECT) ||
68241 + (status == ZM_STATUS_MEDIA_DISABLED) ||
68242 + (status == ZM_STATUS_MEDIA_CONNECTION_DISABLED) ||
68243 + (status == ZM_STATUS_MEDIA_CONNECTION_RESET) ||
68244 + (status == ZM_STATUS_MEDIA_RESET) ||
68245 + (status == ZM_STATUS_MEDIA_DISCONNECT_DEAUTH) ||
68246 + (status == ZM_STATUS_MEDIA_DISCONNECT_DISASOC) ||
68247 + (status == ZM_STATUS_MEDIA_DISCONNECT_BEACON_MISS) ||
68248 + (status == ZM_STATUS_MEDIA_DISCONNECT_NOT_FOUND) ||
68249 + (status == ZM_STATUS_MEDIA_DISCONNECT_TIMEOUT))
68250 + {
68251 + printk(KERN_DEBUG "Disconnection Notify\n");
68252 +
68253 + netif_stop_queue(dev);
68254 + }
68255 +
68256 + /* Save the connected status */
68257 + macp->adapterState = status;
68258 +
68259 + if(zfiWlanQueryWlanMode(dev) == ZM_MODE_INFRASTRUCTURE) {
68260 + // //wireless_send_event(dev, SIOCGIWSCAN, &wreq, NULL);
68261 + wireless_send_event(dev, SIOCGIWAP, &wreq, NULL);
68262 + }
68263 +#if WIRELESS_EXT >= 15
68264 + else if(zfiWlanQueryWlanMode(dev) == ZM_MODE_AP) {
68265 + //if (port == 0)
68266 + //{
68267 + wireless_send_event(dev, IWEVREGISTERED, &wreq, NULL);
68268 + //}
68269 + //else
68270 + //{
68271 + // /* Check whether the VAP device is valid */
68272 + // if (vap[port].dev != NULL)
68273 + // {
68274 + // wireless_send_event(vap[port].dev, IWEVREGISTERED, &wreq, NULL);
68275 + // }
68276 + // else
68277 + // {
68278 + // printk(KERN_ERR "Can' find a valid VAP device, port: %d\n", port);
68279 + // }
68280 + //}
68281 + }
68282 +#endif
68283 + }
68284 + //return 0;
68285 +}
68286 +
68287 +void zfLnxScanNotify(zdev_t* dev, struct zsScanResult* result)
68288 +{
68289 + return;
68290 +}
68291 +
68292 +void zfLnxStatisticsNotify(zdev_t* dev, struct zsStastics* result)
68293 +{
68294 + return;
68295 +}
68296 +
68297 +//void zfwMicFailureNotify(zdev_t* dev, u8_t* message, u16_t event)
68298 +void zfLnxMicFailureNotify(zdev_t* dev, u16_t* addr, u16_t status)
68299 +{
68300 + static const char *tag = "MLME-MICHAELMICFAILURE.indication";
68301 + union iwreq_data wrqu;
68302 + char buf[128];
68303 +
68304 + /* TODO: needed parameters: count, type, src address */
68305 + //snprintf(buf, sizeof(buf), "%s(%scast addr=%s)", tag,
68306 + // (status == ZM_MIC_GROUP_ERROR) ? "broad" : "uni",
68307 + // ether_sprintf((u8_t *)addr));
68308 +
68309 + if (zfiWlanQueryWlanMode(dev) == ZM_MODE_INFRASTRUCTURE)
68310 + {
68311 + strcpy(buf, tag);
68312 + }
68313 +
68314 + memset(&wrqu, 0, sizeof(wrqu));
68315 + wrqu.data.length = strlen(buf);
68316 + wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf);
68317 +}
68318 +
68319 +
68320 +void zfLnxApMicFailureNotify(zdev_t* dev, u8_t* addr, zbuf_t* buf)
68321 +{
68322 + union iwreq_data wreq;
68323 +
68324 + memset(&wreq, 0, sizeof(wreq));
68325 + memcpy(wreq.addr.sa_data, addr, ETH_ALEN);
68326 + wreq.addr.sa_family = ARPHRD_ETHER;
68327 + printk(KERN_DEBUG "zfwApMicFailureNotify(), MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
68328 + addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
68329 +
68330 + return;
68331 +}
68332 +
68333 +// status = 0 => partner lost
68334 +// = 1 => partner alive
68335 +//void zfwIbssPartnerNotify(zdev_t* dev, u8_t status)
68336 +void zfLnxIbssPartnerNotify(zdev_t* dev, u16_t status, struct zsPartnerNotifyEvent *event)
68337 +{
68338 +}
68339 +
68340 +void zfLnxMacAddressNotify(zdev_t* dev, u8_t* addr)
68341 +{
68342 + dev->dev_addr[0] = addr[0];
68343 + dev->dev_addr[1] = addr[1];
68344 + dev->dev_addr[2] = addr[2];
68345 + dev->dev_addr[3] = addr[3];
68346 + dev->dev_addr[4] = addr[4];
68347 + dev->dev_addr[5] = addr[5];
68348 +}
68349 +
68350 +void zfLnxSendCompleteIndication(zdev_t* dev, zbuf_t* buf)
68351 +{
68352 +}
68353 +
68354 +
68355 +void zfLnxRestoreBufData(zdev_t* dev, zbuf_t* buf) {
68356 +
68357 +}
68358 +/* Leave an empty line below to remove warning message on some compiler */
68359 --- /dev/null
68360 +++ b/drivers/staging/otus/wrap_mem.c
68361 @@ -0,0 +1,101 @@
68362 +/*
68363 + * Copyright (c) 2007-2008 Atheros Communications Inc.
68364 + *
68365 + * Permission to use, copy, modify, and/or distribute this software for any
68366 + * purpose with or without fee is hereby granted, provided that the above
68367 + * copyright notice and this permission notice appear in all copies.
68368 + *
68369 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
68370 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
68371 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
68372 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
68373 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
68374 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
68375 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
68376 + */
68377 +/* Module Name : wrap_mem.c */
68378 +/* */
68379 +/* Abstract */
68380 +/* This module contains wrapper functions for memory management */
68381 +/* */
68382 +/* NOTES */
68383 +/* Platform dependent. */
68384 +/* */
68385 +/************************************************************************/
68386 +
68387 +#include "oal_dt.h"
68388 +#include "usbdrv.h"
68389 +
68390 +#include <linux/netlink.h>
68391 +
68392 +#if WIRELESS_EXT > 12
68393 +#include <net/iw_handler.h>
68394 +#endif
68395 +
68396 +/* Memory management */
68397 +/* Called to allocate uncached memory, allocated memory must */
68398 +/* in 4-byte boundary */
68399 +void* zfwMemAllocate(zdev_t* dev, u32_t size)
68400 +{
68401 + void* mem = NULL;
68402 + mem = kmalloc(size, GFP_ATOMIC);
68403 + return mem;
68404 +}
68405 +
68406 +
68407 +/* Called to free allocated memory */
68408 +void zfwMemFree(zdev_t* dev, void* mem, u32_t size)
68409 +{
68410 + kfree(mem);
68411 + return;
68412 +}
68413 +
68414 +void zfwMemoryCopy(u8_t* dst, u8_t* src, u16_t length)
68415 +{
68416 + //u16_t i;
68417 +
68418 + memcpy(dst, src, length);
68419 + //for(i=0; i<length; i++)
68420 + //{
68421 + // dst[i] = src[i];
68422 + //}
68423 + return;
68424 +}
68425 +
68426 +void zfwZeroMemory(u8_t* va, u16_t length)
68427 +{
68428 + //u16_t i;
68429 + memset(va, 0, length);
68430 + //for(i=0; i<length; i++)
68431 + //{
68432 + // va[i] = 0;
68433 + //}
68434 + return;
68435 +}
68436 +
68437 +void zfwMemoryMove(u8_t* dst, u8_t* src, u16_t length)
68438 +{
68439 + memcpy(dst, src, length);
68440 + return;
68441 +}
68442 +
68443 +u8_t zfwMemoryIsEqual(u8_t* m1, u8_t* m2, u16_t length)
68444 +{
68445 + //u16_t i;
68446 + int ret;
68447 +
68448 + ret = memcmp(m1, m2, length);
68449 +
68450 + return ((ret==0)?TRUE:FALSE);
68451 + //for(i=0; i<length; i++)
68452 + //{
68453 + // if ( m1[i] != m2[i] )
68454 + // {
68455 + // return FALSE;
68456 + // }
68457 + //}
68458 +
68459 + //return TRUE;
68460 +}
68461 +
68462 +/* Leave an empty line below to remove warning message on some compiler */
68463 --- /dev/null
68464 +++ b/drivers/staging/otus/wrap_mis.c
68465 @@ -0,0 +1,108 @@
68466 +/*
68467 + * Copyright (c) 2007-2008 Atheros Communications Inc.
68468 + *
68469 + * Permission to use, copy, modify, and/or distribute this software for any
68470 + * purpose with or without fee is hereby granted, provided that the above
68471 + * copyright notice and this permission notice appear in all copies.
68472 + *
68473 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
68474 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
68475 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
68476 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
68477 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
68478 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
68479 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
68480 + */
68481 +/* */
68482 +/* Module Name : wrap_mis.c */
68483 +/* */
68484 +/* Abstract */
68485 +/* This module contains wrapper functions for misc functions */
68486 +/* */
68487 +/* NOTES */
68488 +/* Platform dependent. */
68489 +/* */
68490 +/************************************************************************/
68491 +
68492 +#include "oal_dt.h"
68493 +#include "usbdrv.h"
68494 +
68495 +#include <linux/netlink.h>
68496 +
68497 +#if WIRELESS_EXT > 12
68498 +#include <net/iw_handler.h>
68499 +#endif
68500 +
68501 +//extern struct zsWdsStruct wds[ZM_WDS_PORT_NUMBER];
68502 +extern struct zsVapStruct vap[ZM_VAP_PORT_NUMBER];
68503 +extern u16_t zfLnxGetVapId(zdev_t* dev);
68504 +
68505 +/* Simply return 0xffff if VAP function is not supported */
68506 +u16_t zfwGetVapId(zdev_t* dev)
68507 +{
68508 + return zfLnxGetVapId(dev);
68509 +}
68510 +
68511 +void zfwSleep(zdev_t* dev, u32_t ms)
68512 +{
68513 + if (in_interrupt() == 0)
68514 + {
68515 + mdelay(ms);
68516 + }
68517 + else
68518 + {
68519 + int ii;
68520 + int iter = 100000 * ms;
68521 +
68522 + for (ii = 0; ii < iter; ii++)
68523 + {
68524 +
68525 + }
68526 + }
68527 +}
68528 +
68529 +#ifdef ZM_HALPLUS_LOCK
68530 +asmlinkage struct zsWlanDev *zfwGetWlanDev(zdev_t* dev)
68531 +{
68532 + return ((struct zsWlanDev*)(((struct usbdrv_private*)dev->priv)->wd));
68533 +}
68534 +
68535 +asmlinkage void zfwEnterCriticalSection(zdev_t* dev)
68536 +{
68537 + spin_lock_irqsave(&(((struct usbdrv_private *)(dev->priv))->cs_lock),
68538 + (((struct usbdrv_private *)(dev->priv))->hal_irqFlag));
68539 +}
68540 +
68541 +asmlinkage void zfwLeaveCriticalSection(zdev_t* dev)
68542 +{
68543 + spin_unlock_irqrestore(&(((struct usbdrv_private *)(dev->priv))->cs_lock),
68544 + (((struct usbdrv_private *)(dev->priv))->hal_irqFlag));
68545 +}
68546 +
68547 +asmlinkage u8_t zfwBufReadByte(zdev_t* dev, zbuf_t* buf, u16_t offset)
68548 +{
68549 + return *(u8_t*)((u8_t*)buf->data+offset);
68550 +}
68551 +
68552 +asmlinkage u16_t zfwBufReadHalfWord(zdev_t* dev, zbuf_t* buf, u16_t offset)
68553 +{
68554 + return zmw_cpu_to_le16(*(u16_t*)((u8_t*)buf->data+offset));
68555 +}
68556 +
68557 +asmlinkage void zfwBufWriteByte(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t value)
68558 +{
68559 + *(u8_t*)((u8_t*)buf->data+offset) = value;
68560 +}
68561 +
68562 +asmlinkage void zfwBufWriteHalfWord(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t value)
68563 +{
68564 + *(u16_t*)((u8_t*)buf->data+offset) = zmw_cpu_to_le16(value);
68565 +}
68566 +
68567 +asmlinkage u8_t *zfwGetBuffer(zdev_t* dev, zbuf_t* buf)
68568 +{
68569 + return (u8_t*)(buf->data);
68570 +}
68571 +#endif
68572 +
68573 +/* Leave an empty line below to remove warning message on some compiler */
68574 --- /dev/null
68575 +++ b/drivers/staging/otus/wrap_pkt.c
68576 @@ -0,0 +1,178 @@
68577 +/*
68578 + * Copyright (c) 2007-2008 Atheros Communications Inc.
68579 + *
68580 + * Permission to use, copy, modify, and/or distribute this software for any
68581 + * purpose with or without fee is hereby granted, provided that the above
68582 + * copyright notice and this permission notice appear in all copies.
68583 + *
68584 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
68585 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
68586 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
68587 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
68588 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
68589 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
68590 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
68591 + */
68592 +/* */
68593 +/* Module Name : wrap_pkt.c */
68594 +/* */
68595 +/* Abstract */
68596 +/* This module contains wrapper functions for packet handling */
68597 +/* */
68598 +/* NOTES */
68599 +/* Platform dependent. */
68600 +/* */
68601 +/************************************************************************/
68602 +
68603 +#include "oal_dt.h"
68604 +#include "usbdrv.h"
68605 +
68606 +#include <linux/netlink.h>
68607 +
68608 +#if WIRELESS_EXT > 12
68609 +#include <net/iw_handler.h>
68610 +#endif
68611 +
68612 +
68613 +
68614 +//extern struct zsWdsStruct wds[ZM_WDS_PORT_NUMBER];
68615 +extern struct zsVapStruct vap[ZM_VAP_PORT_NUMBER];
68616 +
68617 +
68618 +/***** Rx *****/
68619 +void zfLnxRecv80211(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo)
68620 +{
68621 + u16_t frameType;
68622 + u16_t frameCtrl;
68623 + u16_t frameSubtype;
68624 + zbuf_t *skb1;
68625 + struct usbdrv_private *macp = dev->priv;
68626 +
68627 + //frameCtrl = zmw_buf_readb(dev, buf, 0);
68628 + frameCtrl = *(u8_t*)((u8_t*)buf->data);
68629 + frameType = frameCtrl & 0xf;
68630 + frameSubtype = frameCtrl & 0xf0;
68631 +
68632 + if ((frameType == 0x0) && (macp->forwardMgmt))
68633 + {
68634 + switch (frameSubtype)
68635 + {
68636 + /* Beacon */
68637 + case 0x80 :
68638 + /* Probe response */
68639 + case 0x50 :
68640 + skb1 = skb_copy(buf, GFP_ATOMIC);
68641 + if(skb1 != NULL)
68642 + {
68643 + skb1->dev = dev;
68644 + #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22))
68645 + skb1->mac.raw = skb1->data;
68646 + #else
68647 + skb1->mac_header = skb1->data;
68648 + #endif
68649 + skb1->ip_summed = CHECKSUM_NONE;
68650 + skb1->pkt_type = PACKET_OTHERHOST;
68651 + skb1->protocol = __constant_htons(0x0019); /* ETH_P_80211_RAW */
68652 + netif_rx(skb1);
68653 + }
68654 + break;
68655 + default:
68656 + break;
68657 + }
68658 + }
68659 +
68660 + zfiRecv80211(dev, buf, addInfo);
68661 + return;
68662 +}
68663 +
68664 +#define ZM_AVOID_UDP_LARGE_PACKET_FAIL
68665 +void zfLnxRecvEth(zdev_t* dev, zbuf_t* buf, u16_t port)
68666 +{
68667 +#ifdef ZM_AVOID_UDP_LARGE_PACKET_FAIL
68668 + zbuf_t *new_buf;
68669 +
68670 + //new_buf = dev_alloc_skb(2048);
68671 + new_buf = dev_alloc_skb(buf->len);
68672 +
68673 +#ifdef NET_SKBUFF_DATA_USES_OFFSET
68674 + new_buf->tail = 0;
68675 + new_buf->len = 0;
68676 +#else
68677 + new_buf->tail = new_buf->data;
68678 + new_buf->len = 0;
68679 +#endif
68680 +
68681 + skb_put(new_buf, buf->len);
68682 + memcpy(new_buf->data, buf->data, buf->len);
68683 +
68684 + /* Free buffer */
68685 + dev_kfree_skb_any(buf);
68686 +
68687 + if (port == 0)
68688 + {
68689 + new_buf->dev = dev;
68690 + new_buf->protocol = eth_type_trans(new_buf, dev);
68691 + }
68692 + else
68693 + {
68694 + /* VAP */
68695 + if (vap[0].dev != NULL)
68696 + {
68697 + new_buf->dev = vap[0].dev;
68698 + new_buf->protocol = eth_type_trans(new_buf, vap[0].dev);
68699 + }
68700 + else
68701 + {
68702 + new_buf->dev = dev;
68703 + new_buf->protocol = eth_type_trans(new_buf, dev);
68704 + }
68705 + }
68706 +
68707 + new_buf->ip_summed = CHECKSUM_NONE;
68708 + dev->last_rx = jiffies;
68709 +
68710 + switch(netif_rx(new_buf))
68711 +#else
68712 + if (port == 0)
68713 + {
68714 + buf->dev = dev;
68715 + buf->protocol = eth_type_trans(buf, dev);
68716 + }
68717 + else
68718 + {
68719 + /* VAP */
68720 + if (vap[0].dev != NULL)
68721 + {
68722 + buf->dev = vap[0].dev;
68723 + buf->protocol = eth_type_trans(buf, vap[0].dev);
68724 + }
68725 + else
68726 + {
68727 + buf->dev = dev;
68728 + buf->protocol = eth_type_trans(buf, dev);
68729 + }
68730 + }
68731 +
68732 + buf->ip_summed = CHECKSUM_NONE;
68733 + dev->last_rx = jiffies;
68734 +
68735 + switch(netif_rx(buf))
68736 +#endif
68737 + {
68738 + case NET_RX_BAD:
68739 + case NET_RX_DROP:
68740 + case NET_RX_CN_MOD:
68741 + case NET_RX_CN_HIGH:
68742 + break;
68743 + default:
68744 + ((struct usbdrv_private*)(dev->priv))->
68745 + drv_stats.net_stats.rx_packets++;
68746 + ((struct usbdrv_private*)(dev->priv))->
68747 + drv_stats.net_stats.rx_bytes += buf->len;
68748 + break;
68749 + }
68750 +
68751 + return;
68752 +}
68753 +
68754 +/* Leave an empty line below to remove warning message on some compiler */
68755 --- /dev/null
68756 +++ b/drivers/staging/otus/wrap_sec.c
68757 @@ -0,0 +1,127 @@
68758 +/*
68759 + * Copyright (c) 2007-2008 Atheros Communications Inc.
68760 + *
68761 + * Permission to use, copy, modify, and/or distribute this software for any
68762 + * purpose with or without fee is hereby granted, provided that the above
68763 + * copyright notice and this permission notice appear in all copies.
68764 + *
68765 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
68766 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
68767 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
68768 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
68769 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
68770 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
68771 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
68772 + */
68773 +/* */
68774 +/* Module Name : wrap_sec.c */
68775 +/* */
68776 +/* Abstract */
68777 +/* This module contains wrapper functions for CENC. */
68778 +/* */
68779 +/* NOTES */
68780 +/* Platform dependent. */
68781 +/* */
68782 +/************************************************************************/
68783 +
68784 +#include "oal_dt.h"
68785 +#include "usbdrv.h"
68786 +
68787 +#include <linux/netlink.h>
68788 +
68789 +#if WIRELESS_EXT > 12
68790 +#include <net/iw_handler.h>
68791 +#endif
68792 +
68793 +#ifdef ZM_ENABLE_CENC
68794 +extern int zfLnxCencSendMsg(struct sock *netlink_sk, u_int8_t *msg, int len);
68795 +
68796 +u16_t zfLnxCencAsocNotify(zdev_t* dev, u16_t* macAddr, u8_t* body, u16_t bodySize, u16_t port)
68797 +{
68798 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
68799 + struct zydas_cenc_sta_info cenc_info;
68800 + //struct sock *netlink_sk;
68801 + u8_t ie_len;
68802 + int ii;
68803 +
68804 + /* Create NETLINK socket */
68805 + //netlink_sk = netlink_kernel_create(NETLINK_USERSOCK, NULL);
68806 +
68807 + if (macp->netlink_sk == NULL)
68808 + {
68809 + printk(KERN_ERR "NETLINK Socket is NULL\n");
68810 + return -1;
68811 + }
68812 +
68813 + memset(&cenc_info, 0, sizeof(cenc_info));
68814 +
68815 + //memcpy(cenc_info.gsn, vap->iv_cencmsk_keys.wk_txiv, ZM_CENC_IV_LEN);
68816 + zfiWlanQueryGSN(dev, cenc_info.gsn, port);
68817 + cenc_info.datalen += ZM_CENC_IV_LEN;
68818 + ie_len = body[1] + 2;
68819 + memcpy(cenc_info.wie, body, ie_len);
68820 + cenc_info.datalen += ie_len;
68821 +
68822 + memcpy(cenc_info.sta_mac, macAddr, 6);
68823 + cenc_info.msg_type = ZM_CENC_WAI_REQUEST;
68824 + cenc_info.datalen += 6 + 2;
68825 +
68826 + printk(KERN_ERR "===== zfwCencSendMsg, bodySize: %d =====\n", bodySize);
68827 +
68828 + for(ii = 0; ii < bodySize; ii++)
68829 + {
68830 + printk(KERN_ERR "%02x ", body[ii]);
68831 +
68832 + if ((ii & 0xf) == 0xf)
68833 + {
68834 + printk(KERN_ERR "\n");
68835 + }
68836 + }
68837 +
68838 + zfLnxCencSendMsg(macp->netlink_sk, (u8_t *)&cenc_info, cenc_info.datalen+4);
68839 +
68840 + /* Close NETLINK socket */
68841 + //sock_release(netlink_sk);
68842 +
68843 + return 0;
68844 +}
68845 +#endif //ZM_ENABLE_CENC
68846 +
68847 +u8_t zfwCencHandleBeaconProbrespon(zdev_t* dev, u8_t *pWIEc,
68848 + u8_t *pPeerSSIDc, u8_t *pPeerAddrc)
68849 +{
68850 + return 0;
68851 +}
68852 +
68853 +u8_t zfwGetPktEncExemptionActionType(zdev_t* dev, zbuf_t* buf)
68854 +{
68855 + return ZM_ENCRYPTION_EXEMPT_NO_EXEMPTION;
68856 +}
68857 +
68858 +void copyToIntTxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* src,
68859 + u16_t offset, u16_t length)
68860 +{
68861 + u16_t i;
68862 +
68863 + for(i=0; i<length;i++)
68864 + {
68865 + //zmw_tx_buf_writeb(dev, buf, offset+i, src[i]);
68866 + *(u8_t*)((u8_t*)buf->data+offset+i) = src[i];
68867 + }
68868 +}
68869 +
68870 +u16_t zfwStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType)
68871 +{
68872 + struct usbdrv_private *macp = dev->priv;
68873 + //zm_msg1_mm(ZM_LV_0, "CWY - add wpaie content Length : ", macp->supIe[1]);
68874 + if (macp->supIe[1] != 0)
68875 + {
68876 + copyToIntTxBuffer(dev, buf, macp->supIe, offset, macp->supIe[1]+2);
68877 + //memcpy(buf->data[offset], macp->supIe, macp->supIe[1]+2);
68878 + offset += (macp->supIe[1]+2);
68879 + }
68880 +
68881 + return offset;
68882 +}
68883 +
68884 +/* Leave an empty line below to remove warning message on some compiler */
68885 --- /dev/null
68886 +++ b/drivers/staging/otus/wrap_usb.c
68887 @@ -0,0 +1,195 @@
68888 +/*
68889 + * Copyright (c) 2007-2008 Atheros Communications Inc.
68890 + *
68891 + * Permission to use, copy, modify, and/or distribute this software for any
68892 + * purpose with or without fee is hereby granted, provided that the above
68893 + * copyright notice and this permission notice appear in all copies.
68894 + *
68895 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
68896 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
68897 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
68898 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
68899 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
68900 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
68901 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
68902 + */
68903 +/* */
68904 +/* Module Name : wrap_usb.c */
68905 +/* */
68906 +/* Abstract */
68907 +/* This module contains wrapper functions for USB management */
68908 +/* */
68909 +/* NOTES */
68910 +/* Platform dependent. */
68911 +/* */
68912 +/************************************************************************/
68913 +
68914 +#include "oal_dt.h"
68915 +#include "usbdrv.h"
68916 +
68917 +#include <linux/netlink.h>
68918 +
68919 +#if WIRELESS_EXT > 12
68920 +#include <net/iw_handler.h>
68921 +#endif
68922 +
68923 +extern void zfLnxInitUsbTxQ(zdev_t* dev);
68924 +extern void zfLnxInitUsbRxQ(zdev_t* dev);
68925 +extern u32_t zfLnxSubmitRegInUrb(zdev_t *dev);
68926 +u32_t zfLnxUsbOut(zdev_t* dev, u8_t *hdr, u16_t hdrlen, u8_t *snap, u16_t snapLen,
68927 + u8_t *tail, u16_t tailLen, zbuf_t *buf, u16_t offset);
68928 +u32_t zfLnxUsbWriteReg(zdev_t* dev, u32_t* cmd, u16_t cmdLen);
68929 +
68930 +void zfwUsbRegisterCallBack(zdev_t* dev, struct zfCbUsbFuncTbl *zfUsbFunc) {
68931 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
68932 +
68933 + macp->usbCbFunctions.zfcbUsbRecv = zfUsbFunc->zfcbUsbRecv;
68934 + macp->usbCbFunctions.zfcbUsbRegIn = zfUsbFunc->zfcbUsbRegIn;
68935 + macp->usbCbFunctions.zfcbUsbOutComplete = zfUsbFunc->zfcbUsbOutComplete;
68936 +
68937 + return;
68938 +}
68939 +
68940 +u32_t zfwUsbGetFreeTxQSize(zdev_t* dev)
68941 +{
68942 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
68943 + u32_t freeTxQSize;
68944 + unsigned long irqFlag;
68945 + //zmw_declare_for_critical_section();
68946 +
68947 + //zmw_enter_critical_section(dev);
68948 + spin_lock_irqsave(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
68949 +
68950 + freeTxQSize = ZM_MAX_TX_BUF_NUM - macp->TxBufCnt;
68951 +
68952 + //zmw_leave_critical_section(dev);
68953 + spin_unlock_irqrestore(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
68954 +
68955 + return freeTxQSize;
68956 +}
68957 +
68958 +u32_t zfwUsbGetMaxTxQSize(zdev_t* dev)
68959 +{
68960 + return ZM_MAX_TX_BUF_NUM;
68961 +}
68962 +
68963 +u32_t zfwUsbEnableIntEpt(zdev_t *dev, u8_t endpt)
68964 +{
68965 + /* Initialize USB TxQ */
68966 + zfLnxInitUsbTxQ(dev);
68967 +
68968 + /* Initialize USB RxQ */
68969 + zfLnxInitUsbRxQ(dev);
68970 +
68971 + /* Initialize USB Register In URB */
68972 + //zfwUsbSubmitRegIn(dev);
68973 + /* Initialize USB Register In URB */
68974 + zfLnxSubmitRegInUrb(dev);
68975 +
68976 + return 0;
68977 +}
68978 +
68979 +int zfwUsbEnableRxEpt(zdev_t* dev, u8_t endpt)
68980 +{
68981 + return 0;
68982 +}
68983 +
68984 +u32_t zfwUsbSubmitControl(zdev_t* dev, u8_t req, u16_t value, u16_t index, void *data, u32_t size)
68985 +{
68986 + int result = 0;
68987 + u32_t ret = 0;
68988 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
68989 + u8_t* buf;
68990 +
68991 + if (size > 0)
68992 + {
68993 + buf = kmalloc(size, GFP_KERNEL);
68994 + memcpy(buf, (u8_t*)data, size);
68995 + }
68996 + else
68997 + {
68998 + buf = NULL;
68999 + }
69000 +
69001 +#if 0
69002 + printk(KERN_ERR "req = 0x%02x\n", req);
69003 + printk(KERN_ERR "value = 0x%04x\n", value);
69004 + printk(KERN_ERR "index = 0x%04x\n", index);
69005 + printk(KERN_ERR "data = 0x%lx\n", (u32_t) data);
69006 + printk(KERN_ERR "size = %ld\n", size);
69007 +#endif
69008 +
69009 + result = usb_control_msg(macp->udev, usb_sndctrlpipe(macp->udev, 0),
69010 + req, USB_DIR_OUT | 0x40, value, index, buf, size, HZ);
69011 +
69012 + if (result < 0)
69013 + {
69014 + printk("zfwUsbSubmitControl() failed, result=0x%x\n", result);
69015 + ret = 1;
69016 + }
69017 + kfree(buf);
69018 +
69019 + return ret;
69020 +}
69021 +
69022 +void zfwUsbCmd(zdev_t* dev, u8_t endpt, u32_t* cmd, u16_t cmdLen)
69023 +{
69024 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
69025 + u32_t ret;
69026 +
69027 + //MPUsbCommand(dev, endpt, cmd, cmdLen);
69028 + ret = zfLnxUsbWriteReg(dev, cmd, cmdLen);
69029 +
69030 + /* if zfLnxUsbWriteReg() return error, free and allocate urb, resend again */
69031 + if (ret != 0)
69032 + {
69033 + usb_free_urb(macp->RegOutUrb);
69034 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) /* tune me! */
69035 + macp->RegOutUrb = usb_alloc_urb(0, GFP_ATOMIC);
69036 +#else
69037 + macp->RegOutUrb = usb_alloc_urb(0);
69038 +#endif
69039 + ret = zfLnxUsbWriteReg(dev, cmd, cmdLen);
69040 + }
69041 +}
69042 +
69043 +u32_t zfwUsbSend(zdev_t* dev, u8_t endpt, u8_t *hdr, u16_t hdrlen, u8_t *snap, u16_t snapLen,
69044 + u8_t *tail, u16_t tailLen, zbuf_t *buf, u16_t offset)
69045 +{
69046 + u32_t status;
69047 +
69048 +#ifdef ZM_CONFIG_BIG_ENDIAN
69049 + u32_t ii = 0;
69050 + u16_t *pc = NULL;
69051 +
69052 + pc = (u16_t *)hdr;
69053 + for(ii=0; ii<(hdrlen>>1); ii++)
69054 + {
69055 + pc[ii] = cpu_to_le16(pc[ii]);
69056 + }
69057 +
69058 + pc = (u16_t *)snap;
69059 + for(ii=0; ii<(snapLen>>1); ii++)
69060 + {
69061 + pc[ii] = cpu_to_le16(pc[ii]);
69062 + }
69063 +
69064 + pc = (u16_t *)tail;
69065 + for(ii=0; ii<(tailLen>>1); ii++)
69066 + {
69067 + pc[ii] = cpu_to_le16(pc[ii]);
69068 + }
69069 +#endif
69070 +
69071 + status = zfLnxUsbOut(dev, hdr, hdrlen, snap, snapLen, tail, tailLen, buf, offset);
69072 + if ( status == 0 )
69073 + {
69074 + return 0;
69075 + }
69076 + else
69077 + {
69078 + return 1;
69079 + }
69080 +}
69081 +
69082 +/* Leave an empty line below to remove warning message on some compiler */
69083 --- /dev/null
69084 +++ b/drivers/staging/otus/wwrap.c
69085 @@ -0,0 +1,1207 @@
69086 +/*
69087 + * Copyright (c) 2007-2008 Atheros Communications Inc.
69088 + *
69089 + * Permission to use, copy, modify, and/or distribute this software for any
69090 + * purpose with or without fee is hereby granted, provided that the above
69091 + * copyright notice and this permission notice appear in all copies.
69092 + *
69093 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
69094 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
69095 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
69096 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
69097 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
69098 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
69099 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
69100 + */
69101 +/* Module Name : wwrap.c */
69102 +/* Abstract */
69103 +/* This module contains wrapper functions. */
69104 +/* */
69105 +/* NOTES */
69106 +/* Platform dependent. */
69107 +/* */
69108 +
69109 +/* Please include your header files here */
69110 +#include "oal_dt.h"
69111 +#include "usbdrv.h"
69112 +
69113 +#include <linux/netlink.h>
69114 +
69115 +#if WIRELESS_EXT > 12
69116 +#include <net/iw_handler.h>
69117 +#endif
69118 +
69119 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
69120 +#define URB_ZERO_PACKET USB_ZERO_PACKET
69121 +#endif
69122 +
69123 +extern void zfiRecv80211(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo);
69124 +extern void zfCoreRecv(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo);
69125 +extern void zfIdlChkRsp(zdev_t* dev, u32_t* rsp, u16_t rspLen);
69126 +extern void zfIdlRsp(zdev_t* dev, u32_t *rsp, u16_t rspLen);
69127 +
69128 +
69129 +
69130 +//extern struct zsWdsStruct wds[ZM_WDS_PORT_NUMBER];
69131 +extern struct zsVapStruct vap[ZM_VAP_PORT_NUMBER];
69132 +
69133 +u32_t zfLnxUsbSubmitTxData(zdev_t* dev);
69134 +u32_t zfLnxUsbIn(zdev_t* dev, urb_t *urb, zbuf_t *buf);
69135 +u32_t zfLnxSubmitRegInUrb(zdev_t *dev);
69136 +u32_t zfLnxUsbSubmitBulkUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction,
69137 + void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context);
69138 +u32_t zfLnxUsbSubmitIntUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction,
69139 + void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context,
69140 + u32_t interval);
69141 +
69142 +u16_t zfLnxGetFreeTxUrb(zdev_t *dev)
69143 +{
69144 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
69145 + u16_t idx;
69146 + unsigned long irqFlag;
69147 +
69148 + spin_lock_irqsave(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
69149 +
69150 + //idx = ((macp->TxUrbTail + 1) & (ZM_MAX_TX_URB_NUM - 1));
69151 +
69152 + //if (idx != macp->TxUrbHead)
69153 + if (macp->TxUrbCnt != 0)
69154 + {
69155 + idx = macp->TxUrbTail;
69156 + macp->TxUrbTail = ((macp->TxUrbTail + 1) & (ZM_MAX_TX_URB_NUM - 1));
69157 + macp->TxUrbCnt--;
69158 + }
69159 + else
69160 + {
69161 + //printk(KERN_ERR "macp->TxUrbCnt: %d\n", macp->TxUrbCnt);
69162 + idx = 0xffff;
69163 + }
69164 +
69165 + spin_unlock_irqrestore(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
69166 + return idx;
69167 +}
69168 +
69169 +void zfLnxPutTxUrb(zdev_t *dev)
69170 +{
69171 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
69172 + u16_t idx;
69173 + unsigned long irqFlag;
69174 +
69175 + spin_lock_irqsave(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
69176 +
69177 + idx = ((macp->TxUrbHead + 1) & (ZM_MAX_TX_URB_NUM - 1));
69178 +
69179 + //if (idx != macp->TxUrbTail)
69180 + if (macp->TxUrbCnt < ZM_MAX_TX_URB_NUM)
69181 + {
69182 + macp->TxUrbHead = idx;
69183 + macp->TxUrbCnt++;
69184 + }
69185 + else
69186 + {
69187 + printk("UsbTxUrbQ inconsistent: TxUrbHead: %d, TxUrbTail: %d\n",
69188 + macp->TxUrbHead, macp->TxUrbTail);
69189 + }
69190 +
69191 + spin_unlock_irqrestore(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
69192 +}
69193 +
69194 +u16_t zfLnxCheckTxBufferCnt(zdev_t *dev)
69195 +{
69196 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
69197 + u16_t TxBufCnt;
69198 + unsigned long irqFlag;
69199 +
69200 + spin_lock_irqsave(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
69201 +
69202 + TxBufCnt = macp->TxBufCnt;
69203 +
69204 + spin_unlock_irqrestore(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
69205 + return TxBufCnt;
69206 +}
69207 +
69208 +UsbTxQ_t *zfLnxGetUsbTxBuffer(zdev_t *dev)
69209 +{
69210 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
69211 + u16_t idx;
69212 + UsbTxQ_t *TxQ;
69213 + unsigned long irqFlag;
69214 +
69215 + spin_lock_irqsave(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
69216 +
69217 + idx = ((macp->TxBufHead+1) & (ZM_MAX_TX_BUF_NUM - 1));
69218 +
69219 + //if (idx != macp->TxBufTail)
69220 + if (macp->TxBufCnt > 0)
69221 + {
69222 + //printk("CWY - zfwGetUsbTxBuffer ,macp->TxBufCnt = %d\n", macp->TxBufCnt);
69223 + TxQ = (UsbTxQ_t *)&(macp->UsbTxBufQ[macp->TxBufHead]);
69224 + macp->TxBufHead = ((macp->TxBufHead+1) & (ZM_MAX_TX_BUF_NUM - 1));
69225 + macp->TxBufCnt--;
69226 + }
69227 + else
69228 + {
69229 + if (macp->TxBufHead != macp->TxBufTail)
69230 + {
69231 + printk(KERN_ERR "zfwGetUsbTxBuf UsbTxBufQ inconsistent: TxBufHead: %d, TxBufTail: %d\n",
69232 + macp->TxBufHead, macp->TxBufTail);
69233 + }
69234 +
69235 + spin_unlock_irqrestore(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
69236 + return NULL;
69237 + }
69238 +
69239 + spin_unlock_irqrestore(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
69240 + return TxQ;
69241 +}
69242 +
69243 +u16_t zfLnxPutUsbTxBuffer(zdev_t *dev, u8_t *hdr, u16_t hdrlen,
69244 + u8_t *snap, u16_t snapLen, u8_t *tail, u16_t tailLen,
69245 + zbuf_t *buf, u16_t offset)
69246 +{
69247 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
69248 + u16_t idx;
69249 + UsbTxQ_t *TxQ;
69250 + unsigned long irqFlag;
69251 +
69252 + spin_lock_irqsave(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
69253 +
69254 + idx = ((macp->TxBufTail+1) & (ZM_MAX_TX_BUF_NUM - 1));
69255 +
69256 + /* For Tx debug */
69257 + //zm_assert(macp->TxBufCnt >= 0); // deleted because of always true
69258 +
69259 + //if (idx != macp->TxBufHead)
69260 + if (macp->TxBufCnt < ZM_MAX_TX_BUF_NUM)
69261 + {
69262 + //printk("CWY - zfwPutUsbTxBuffer ,macp->TxBufCnt = %d\n", macp->TxBufCnt);
69263 + TxQ = (UsbTxQ_t *)&(macp->UsbTxBufQ[macp->TxBufTail]);
69264 + memcpy(TxQ->hdr, hdr, hdrlen);
69265 + TxQ->hdrlen = hdrlen;
69266 + memcpy(TxQ->snap, snap, snapLen);
69267 + TxQ->snapLen = snapLen;
69268 + memcpy(TxQ->tail, tail, tailLen);
69269 + TxQ->tailLen = tailLen;
69270 + TxQ->buf = buf;
69271 + TxQ->offset = offset;
69272 +
69273 + macp->TxBufTail = ((macp->TxBufTail+1) & (ZM_MAX_TX_BUF_NUM - 1));
69274 + macp->TxBufCnt++;
69275 + }
69276 + else
69277 + {
69278 + printk(KERN_ERR "zfLnxPutUsbTxBuffer UsbTxBufQ inconsistent: TxBufHead: %d, TxBufTail: %d, TxBufCnt: %d\n",
69279 + macp->TxBufHead, macp->TxBufTail, macp->TxBufCnt);
69280 + spin_unlock_irqrestore(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
69281 + return 0xffff;
69282 + }
69283 +
69284 + spin_unlock_irqrestore(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
69285 + return 0;
69286 +}
69287 +
69288 +zbuf_t *zfLnxGetUsbRxBuffer(zdev_t *dev)
69289 +{
69290 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
69291 + //u16_t idx;
69292 + zbuf_t *buf;
69293 + unsigned long irqFlag;
69294 +
69295 + spin_lock_irqsave(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
69296 +
69297 + //idx = ((macp->RxBufHead+1) & (ZM_MAX_RX_URB_NUM - 1));
69298 +
69299 + //if (idx != macp->RxBufTail)
69300 + if (macp->RxBufCnt != 0)
69301 + {
69302 + buf = macp->UsbRxBufQ[macp->RxBufHead];
69303 + macp->RxBufHead = ((macp->RxBufHead+1) & (ZM_MAX_RX_URB_NUM - 1));
69304 + macp->RxBufCnt--;
69305 + }
69306 + else
69307 + {
69308 + printk("RxBufQ inconsistent: RxBufHead: %d, RxBufTail: %d\n",
69309 + macp->RxBufHead, macp->RxBufTail);
69310 + spin_unlock_irqrestore(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
69311 + return NULL;
69312 + }
69313 +
69314 + spin_unlock_irqrestore(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
69315 + return buf;
69316 +}
69317 +
69318 +u32_t zfLnxPutUsbRxBuffer(zdev_t *dev, zbuf_t *buf)
69319 +{
69320 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
69321 + u16_t idx;
69322 + unsigned long irqFlag;
69323 +
69324 + spin_lock_irqsave(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
69325 +
69326 + idx = ((macp->RxBufTail+1) & (ZM_MAX_RX_URB_NUM - 1));
69327 +
69328 + //if (idx != macp->RxBufHead)
69329 + if (macp->RxBufCnt != ZM_MAX_RX_URB_NUM)
69330 + {
69331 + macp->UsbRxBufQ[macp->RxBufTail] = buf;
69332 + macp->RxBufTail = idx;
69333 + macp->RxBufCnt++;
69334 + }
69335 + else
69336 + {
69337 + printk("RxBufQ inconsistent: RxBufHead: %d, RxBufTail: %d\n",
69338 + macp->RxBufHead, macp->RxBufTail);
69339 + spin_unlock_irqrestore(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
69340 + return 0xffff;
69341 + }
69342 +
69343 + spin_unlock_irqrestore(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
69344 + return 0;
69345 +}
69346 +
69347 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
69348 +void zfLnxUsbDataOut_callback(urb_t *urb)
69349 +#else
69350 +void zfLnxUsbDataOut_callback(urb_t *urb, struct pt_regs *regs)
69351 +#endif
69352 +{
69353 + zdev_t* dev = urb->context;
69354 + //UsbTxQ_t *TxData;
69355 +
69356 + /* Give the urb back */
69357 + zfLnxPutTxUrb(dev);
69358 +
69359 + /* Check whether there is any pending buffer needed */
69360 + /* to be sent */
69361 + if (zfLnxCheckTxBufferCnt(dev) != 0)
69362 + {
69363 + //TxData = zfwGetUsbTxBuffer(dev);
69364 +
69365 + //if (TxData == NULL)
69366 + //{
69367 + // printk("Get a NULL buffer from zfwGetUsbTxBuffer\n");
69368 + // return;
69369 + //}
69370 + //else
69371 + //{
69372 + zfLnxUsbSubmitTxData(dev);
69373 + //}
69374 + }
69375 +}
69376 +
69377 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
69378 +void zfLnxUsbDataIn_callback(urb_t *urb)
69379 +#else
69380 +void zfLnxUsbDataIn_callback(urb_t *urb, struct pt_regs *regs)
69381 +#endif
69382 +{
69383 + zdev_t* dev = urb->context;
69384 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
69385 + zbuf_t *buf;
69386 + zbuf_t *new_buf;
69387 + int status;
69388 +
69389 +#if ZM_USB_STREAM_MODE == 1
69390 + static int remain_len = 0, check_pad = 0, check_len = 0;
69391 + int index = 0;
69392 + int chk_idx;
69393 + u16_t pkt_len;
69394 + u16_t pkt_tag;
69395 + u16_t ii;
69396 + zbuf_t *rxBufPool[8];
69397 + u16_t rxBufPoolIndex = 0;
69398 +#endif
69399 +
69400 + /* Check status for URB */
69401 + if (urb->status != 0){
69402 + printk("zfLnxUsbDataIn_callback() : status=0x%x\n", urb->status);
69403 + if ((urb->status != -ENOENT) && (urb->status != -ECONNRESET)
69404 + && (urb->status != -ESHUTDOWN))
69405 + {
69406 + #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
69407 + if (urb->status == USB_ST_INTERNALERROR)
69408 + status = -1;
69409 + #else
69410 + if (urb->status == -EPIPE){
69411 + //printk(KERN_ERR "nonzero read bulk status received: -EPIPE");
69412 + status = -1;
69413 + }
69414 +
69415 + if (urb->status == -EPROTO){
69416 + //printk(KERN_ERR "nonzero read bulk status received: -EPROTO");
69417 + status = -1;
69418 + }
69419 + #endif
69420 + }
69421 +
69422 + //printk(KERN_ERR "urb->status: 0x%08x\n", urb->status);
69423 +
69424 + /* Dequeue skb buffer */
69425 + buf = zfLnxGetUsbRxBuffer(dev);
69426 + dev_kfree_skb_any(buf);
69427 + #if 0
69428 + /* Enqueue skb buffer */
69429 + zfLnxPutUsbRxBuffer(dev, buf);
69430 +
69431 + /* Submit a Rx urb */
69432 + zfLnxUsbIn(dev, urb, buf);
69433 + #endif
69434 + return;
69435 + }
69436 +
69437 + if (urb->actual_length == 0)
69438 + {
69439 + printk(KERN_ERR "Get an URB whose length is zero");
69440 + status = -1;
69441 + }
69442 +
69443 + /* Dequeue skb buffer */
69444 + buf = zfLnxGetUsbRxBuffer(dev);
69445 +
69446 + //zfwBufSetSize(dev, buf, urb->actual_length);
69447 +#ifdef NET_SKBUFF_DATA_USES_OFFSET
69448 + buf->tail = 0;
69449 + buf->len = 0;
69450 +#else
69451 + buf->tail = buf->data;
69452 + buf->len = 0;
69453 +#endif
69454 +
69455 + if ((buf->tail + urb->actual_length) > buf->end)
69456 + BUG();
69457 +
69458 + skb_put(buf, urb->actual_length);
69459 +
69460 +#if ZM_USB_STREAM_MODE == 1
69461 + if (remain_len != 0)
69462 + {
69463 + zbuf_t *remain_buf = macp->reamin_buf;
69464 +
69465 + index = remain_len;
69466 + remain_len -= check_pad;
69467 +
69468 + /* Copy data */
69469 + memcpy(&(remain_buf->data[check_len]), buf->data, remain_len);
69470 + check_len += remain_len;
69471 + remain_len = 0;
69472 +
69473 + rxBufPool[rxBufPoolIndex++] = remain_buf;
69474 + }
69475 +
69476 + while(index < urb->actual_length)
69477 + {
69478 + pkt_len = buf->data[index] + (buf->data[index+1] << 8);
69479 + pkt_tag = buf->data[index+2] + (buf->data[index+3] << 8);
69480 +
69481 + if (pkt_tag == 0x4e00)
69482 + {
69483 + int pad_len;
69484 +
69485 + //printk("Get a packet, index: %d, pkt_len: 0x%04x\n", index, pkt_len);
69486 + #if 0
69487 + /* Dump data */
69488 + for (ii = index; ii < pkt_len+4;)
69489 + {
69490 + printk("%02x ", (buf->data[ii] & 0xff));
69491 +
69492 + if ((++ii % 16) == 0)
69493 + printk("\n");
69494 + }
69495 +
69496 + printk("\n");
69497 + #endif
69498 +
69499 + pad_len = 4 - (pkt_len & 0x3);
69500 +
69501 + if(pad_len == 4)
69502 + pad_len = 0;
69503 +
69504 + chk_idx = index;
69505 + index = index + 4 + pkt_len + pad_len;
69506 +
69507 + if (index > ZM_MAX_RX_BUFFER_SIZE)
69508 + {
69509 + remain_len = index - ZM_MAX_RX_BUFFER_SIZE; // - pad_len;
69510 + check_len = ZM_MAX_RX_BUFFER_SIZE - chk_idx - 4;
69511 + check_pad = pad_len;
69512 +
69513 + /* Allocate a skb buffer */
69514 + //new_buf = zfwBufAllocate(dev, ZM_MAX_RX_BUFFER_SIZE);
69515 + new_buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE);
69516 +
69517 + /* Set skb buffer length */
69518 + #ifdef NET_SKBUFF_DATA_USES_OFFSET
69519 + new_buf->tail = 0;
69520 + new_buf->len = 0;
69521 + #else
69522 + new_buf->tail = new_buf->data;
69523 + new_buf->len = 0;
69524 + #endif
69525 +
69526 + skb_put(new_buf, pkt_len);
69527 +
69528 + /* Copy the buffer */
69529 + memcpy(new_buf->data, &(buf->data[chk_idx+4]), check_len);
69530 +
69531 + /* Record the buffer pointer */
69532 + macp->reamin_buf = new_buf;
69533 + }
69534 + else
69535 + {
69536 + #ifdef ZM_DONT_COPY_RX_BUFFER
69537 + if (rxBufPoolIndex == 0)
69538 + {
69539 + new_buf = skb_clone(buf, GFP_ATOMIC);
69540 +
69541 + new_buf->data = &(buf->data[chk_idx+4]);
69542 + new_buf->len = pkt_len;
69543 + }
69544 + else
69545 + {
69546 + #endif
69547 + /* Allocate a skb buffer */
69548 + new_buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE);
69549 +
69550 + /* Set skb buffer length */
69551 + #ifdef NET_SKBUFF_DATA_USES_OFFSET
69552 + new_buf->tail = 0;
69553 + new_buf->len = 0;
69554 + #else
69555 + new_buf->tail = new_buf->data;
69556 + new_buf->len = 0;
69557 + #endif
69558 +
69559 + skb_put(new_buf, pkt_len);
69560 +
69561 + /* Copy the buffer */
69562 + memcpy(new_buf->data, &(buf->data[chk_idx+4]), pkt_len);
69563 +
69564 + #ifdef ZM_DONT_COPY_RX_BUFFER
69565 + }
69566 + #endif
69567 + rxBufPool[rxBufPoolIndex++] = new_buf;
69568 + }
69569 + }
69570 + else
69571 + {
69572 + printk(KERN_ERR "Can't find tag, pkt_len: 0x%04x, tag: 0x%04x\n", pkt_len, pkt_tag);
69573 +
69574 + /* Free buffer */
69575 + dev_kfree_skb_any(buf);
69576 +
69577 + /* Allocate a skb buffer */
69578 + new_buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE);
69579 +
69580 + /* Enqueue skb buffer */
69581 + zfLnxPutUsbRxBuffer(dev, new_buf);
69582 +
69583 + /* Submit a Rx urb */
69584 + zfLnxUsbIn(dev, urb, new_buf);
69585 +
69586 + return;
69587 + }
69588 + }
69589 +
69590 + /* Free buffer */
69591 + dev_kfree_skb_any(buf);
69592 +#endif
69593 +
69594 + /* Allocate a skb buffer */
69595 + new_buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE);
69596 +
69597 + /* Enqueue skb buffer */
69598 + zfLnxPutUsbRxBuffer(dev, new_buf);
69599 +
69600 + /* Submit a Rx urb */
69601 + zfLnxUsbIn(dev, urb, new_buf);
69602 +
69603 +#if ZM_USB_STREAM_MODE == 1
69604 + for(ii = 0; ii < rxBufPoolIndex; ii++)
69605 + {
69606 + macp->usbCbFunctions.zfcbUsbRecv(dev, rxBufPool[ii]);
69607 + }
69608 +#else
69609 + /* pass data to upper layer */
69610 + macp->usbCbFunctions.zfcbUsbRecv(dev, buf);
69611 +#endif
69612 +}
69613 +
69614 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
69615 +void zfLnxUsbRegOut_callback(urb_t *urb)
69616 +#else
69617 +void zfLnxUsbRegOut_callback(urb_t *urb, struct pt_regs *regs)
69618 +#endif
69619 +{
69620 + //dev_t* dev = urb->context;
69621 +
69622 + //printk(KERN_ERR "zfwUsbRegOut_callback\n");
69623 +}
69624 +
69625 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
69626 +void zfLnxUsbRegIn_callback(urb_t *urb)
69627 +#else
69628 +void zfLnxUsbRegIn_callback(urb_t *urb, struct pt_regs *regs)
69629 +#endif
69630 +{
69631 + zdev_t* dev = urb->context;
69632 + u32_t rsp[64/4];
69633 + int status;
69634 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
69635 +
69636 + /* Check status for URB */
69637 + if (urb->status != 0){
69638 + printk("zfLnxUsbRegIn_callback() : status=0x%x\n", urb->status);
69639 + if ((urb->status != -ENOENT) && (urb->status != -ECONNRESET)
69640 + && (urb->status != -ESHUTDOWN))
69641 + {
69642 + #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
69643 + if (urb->status == USB_ST_INTERNALERROR)
69644 + status = -1;
69645 + #else
69646 + if (urb->status == -EPIPE){
69647 + //printk(KERN_ERR "nonzero read bulk status received: -EPIPE");
69648 + status = -1;
69649 + }
69650 +
69651 + if (urb->status == -EPROTO){
69652 + //printk(KERN_ERR "nonzero read bulk status received: -EPROTO");
69653 + status = -1;
69654 + }
69655 + #endif
69656 + }
69657 +
69658 + //printk(KERN_ERR "urb->status: 0x%08x\n", urb->status);
69659 + return;
69660 + }
69661 +
69662 + if (urb->actual_length == 0)
69663 + {
69664 + printk(KERN_ERR "Get an URB whose length is zero");
69665 + status = -1;
69666 + }
69667 +
69668 + /* Copy data into respone buffer */
69669 + memcpy(rsp, macp->regUsbReadBuf, urb->actual_length);
69670 +
69671 + /* Notify to upper layer */
69672 + //zfIdlChkRsp(dev, rsp, (u16_t)urb->actual_length);
69673 + //zfiUsbRegIn(dev, rsp, (u16_t)urb->actual_length);
69674 + macp->usbCbFunctions.zfcbUsbRegIn(dev, rsp, (u16_t)urb->actual_length);
69675 +
69676 + /* Issue another USB IN URB */
69677 + zfLnxSubmitRegInUrb(dev);
69678 +}
69679 +
69680 +u32_t zfLnxSubmitRegInUrb(zdev_t *dev)
69681 +{
69682 + u32_t ret;
69683 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
69684 +
69685 + /* Submit a rx urb */
69686 + //ret = zfLnxUsbSubmitBulkUrb(macp->RegInUrb, macp->udev,
69687 + // USB_REG_IN_PIPE, USB_DIR_IN, macp->regUsbReadBuf,
69688 + // ZM_USB_REG_MAX_BUF_SIZE, zfLnxUsbRegIn_callback, dev);
69689 + //CWYang(-)
69690 + //if (ret != 0)
69691 + // printk("zfwUsbSubmitBulkUrb fail, status: 0x%08x\n", (int)ret);
69692 +
69693 + ret = zfLnxUsbSubmitIntUrb(macp->RegInUrb, macp->udev,
69694 + USB_REG_IN_PIPE, USB_DIR_IN, macp->regUsbReadBuf,
69695 + ZM_USB_REG_MAX_BUF_SIZE, zfLnxUsbRegIn_callback, dev, 1);
69696 +
69697 + return ret;
69698 +}
69699 +
69700 +u32_t zfLnxUsbSubmitTxData(zdev_t* dev)
69701 +{
69702 + u32_t i;
69703 + u32_t ret;
69704 + u16_t freeTxUrb;
69705 + u8_t *puTxBuf = NULL;
69706 + UsbTxQ_t *TxData;
69707 + int len = 0;
69708 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
69709 +#if ZM_USB_TX_STREAM_MODE == 1
69710 + u8_t ii;
69711 + u16_t offset = 0;
69712 + u16_t usbTxAggCnt;
69713 + u16_t *pUsbTxHdr;
69714 + UsbTxQ_t *TxQPool[ZM_MAX_TX_AGGREGATE_NUM];
69715 +#endif
69716 +
69717 + /* First check whether there is a free URB */
69718 + freeTxUrb = zfLnxGetFreeTxUrb(dev);
69719 +
69720 + /* If there is no any free Tx Urb */
69721 + if (freeTxUrb == 0xffff)
69722 + {
69723 + //printk(KERN_ERR "Can't get free Tx Urb\n");
69724 + //printk("CWY - Can't get free Tx Urb\n");
69725 + return 0xffff;
69726 + }
69727 +
69728 +#if ZM_USB_TX_STREAM_MODE == 1
69729 + usbTxAggCnt = zfLnxCheckTxBufferCnt(dev);
69730 +
69731 + if (usbTxAggCnt >= ZM_MAX_TX_AGGREGATE_NUM)
69732 + {
69733 + usbTxAggCnt = ZM_MAX_TX_AGGREGATE_NUM;
69734 + }
69735 + else
69736 + {
69737 + usbTxAggCnt = 1;
69738 + }
69739 +
69740 + //printk("usbTxAggCnt: %d\n", usbTxAggCnt);
69741 +#endif
69742 +
69743 +#if ZM_USB_TX_STREAM_MODE == 1
69744 + for(ii = 0; ii < usbTxAggCnt; ii++)
69745 + {
69746 +#endif
69747 + /* Dequeue the packet from UsbTxBufQ */
69748 + TxData = zfLnxGetUsbTxBuffer(dev);
69749 + if (TxData == NULL)
69750 + {
69751 + /* Give the urb back */
69752 + zfLnxPutTxUrb(dev);
69753 + return 0xffff;
69754 + }
69755 +
69756 + /* Point to the freeTxUrb buffer */
69757 + puTxBuf = macp->txUsbBuf[freeTxUrb];
69758 +
69759 +#if ZM_USB_TX_STREAM_MODE == 1
69760 + puTxBuf += offset;
69761 + pUsbTxHdr = (u16_t *)puTxBuf;
69762 +
69763 + /* Add the packet length and tag information */
69764 + *pUsbTxHdr++ = TxData->hdrlen + TxData->snapLen +
69765 + (TxData->buf->len - TxData->offset) + TxData->tailLen;
69766 +
69767 + *pUsbTxHdr++ = 0x697e;
69768 +
69769 + puTxBuf += 4;
69770 +#endif // #ifdef ZM_USB_TX_STREAM_MODE
69771 +
69772 + /* Copy WLAN header and packet buffer into USB buffer */
69773 + for(i = 0; i < TxData->hdrlen; i++)
69774 + {
69775 + *puTxBuf++ = TxData->hdr[i];
69776 + }
69777 +
69778 + /* Copy SNAP header */
69779 + for(i = 0; i < TxData->snapLen; i++)
69780 + {
69781 + *puTxBuf++ = TxData->snap[i];
69782 + }
69783 +
69784 + /* Copy packet buffer */
69785 + for(i = 0; i < TxData->buf->len - TxData->offset; i++)
69786 + {
69787 + //*puTxBuf++ = zmw_rx_buf_readb(dev, TxData->buf, i);
69788 + *puTxBuf++ = *(u8_t*)((u8_t*)TxData->buf->data+i+TxData->offset);
69789 + }
69790 +
69791 + /* Copy tail */
69792 + for(i = 0; i < TxData->tailLen; i++)
69793 + {
69794 + *puTxBuf++ = TxData->tail[i];
69795 + }
69796 +
69797 + len = TxData->hdrlen+TxData->snapLen+TxData->buf->len+TxData->tailLen-TxData->offset;
69798 +
69799 + #if 0
69800 + if (TxData->hdrlen != 0)
69801 + {
69802 + puTxBuf = macp->txUsbBuf[freeTxUrb];
69803 + for (i = 0; i < len; i++)
69804 + {
69805 + printk("%02x ", puTxBuf[i]);
69806 + if (i % 16 == 15)
69807 + printk("\n");
69808 + }
69809 + printk("\n");
69810 + }
69811 + #endif
69812 + #if 0
69813 + /* For debug purpose */
69814 + if(TxData->hdr[9] & 0x40)
69815 + {
69816 + int i;
69817 + u16_t ctrlLen = TxData->hdr[0] + (TxData->hdr[1] << 8);
69818 +
69819 + if (ctrlLen != len + 4)
69820 + {
69821 + /* Dump control setting */
69822 + for(i = 0; i < 8; i++)
69823 + {
69824 + printk(KERN_ERR "0x%02x ", TxData->hdr[i]);
69825 + }
69826 + printk(KERN_ERR "\n");
69827 +
69828 + printk(KERN_ERR "ctrLen: %d, hdrLen: %d, snapLen: %d\n", ctrlLen, TxData->hdrlen, TxData->snapLen);
69829 + printk(KERN_ERR "bufLen: %d, tailLen: %d, len: %d\n", TxData->buf->len, TxData->tailLen, len);
69830 + }
69831 + }
69832 + #endif
69833 +
69834 +#if ZM_USB_TX_STREAM_MODE == 1
69835 + // Add the Length and Tag
69836 + len += 4;
69837 +
69838 + //printk("%d packet, length: %d\n", ii+1, len);
69839 +
69840 + if (ii < (ZM_MAX_TX_AGGREGATE_NUM-1))
69841 + {
69842 + /* Pad the buffer to firmware descriptor boundary */
69843 + offset += (((len-1) / 4) + 1) * 4;
69844 + }
69845 +
69846 + if (ii == (ZM_MAX_TX_AGGREGATE_NUM-1))
69847 + {
69848 + len += offset;
69849 + }
69850 +
69851 + TxQPool[ii] = TxData;
69852 +
69853 + //DbgPrint("%d packet, offset: %d\n", ii+1, pUsbTxTransfer->offset);
69854 +
69855 + /* free packet */
69856 + //zfBufFree(dev, txData->buf);
69857 + }
69858 +#endif
69859 + //printk("CWY - call zfwUsbSubmitBulkUrb(), len = 0x%d\n", len);
69860 + /* Submit a tx urb */
69861 + ret = zfLnxUsbSubmitBulkUrb(macp->WlanTxDataUrb[freeTxUrb], macp->udev,
69862 + USB_WLAN_TX_PIPE, USB_DIR_OUT, macp->txUsbBuf[freeTxUrb],
69863 + len, zfLnxUsbDataOut_callback, dev);
69864 + //CWYang(-)
69865 + //if (ret != 0)
69866 + // printk("zfwUsbSubmitBulkUrb fail, status: 0x%08x\n", (int)ret);
69867 +
69868 + /* free packet */
69869 + //dev_kfree_skb_any(TxData->buf);
69870 +#if ZM_USB_TX_STREAM_MODE == 1
69871 + for(ii = 0; ii < usbTxAggCnt; ii++)
69872 + macp->usbCbFunctions.zfcbUsbOutComplete(dev, TxQPool[ii]->buf, 1, TxQPool[ii]->hdr);
69873 +#else
69874 + macp->usbCbFunctions.zfcbUsbOutComplete(dev, TxData->buf, 1, TxData->hdr);
69875 +#endif
69876 +
69877 + return ret;
69878 +}
69879 +
69880 +
69881 +
69882 +u32_t zfLnxUsbIn(zdev_t* dev, urb_t *urb, zbuf_t *buf)
69883 +{
69884 + u32_t ret;
69885 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
69886 +
69887 + /* Submit a rx urb */
69888 + ret = zfLnxUsbSubmitBulkUrb(urb, macp->udev, USB_WLAN_RX_PIPE,
69889 + USB_DIR_IN, buf->data, ZM_MAX_RX_BUFFER_SIZE,
69890 + zfLnxUsbDataIn_callback, dev);
69891 + //CWYang(-)
69892 + //if (ret != 0)
69893 + // printk("zfwUsbSubmitBulkUrb fail, status: 0x%08x\n", (int)ret);
69894 +
69895 + return ret;
69896 +}
69897 +
69898 +u32_t zfLnxUsbWriteReg(zdev_t* dev, u32_t* cmd, u16_t cmdLen)
69899 +{
69900 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
69901 + u32_t ret;
69902 +
69903 +#ifdef ZM_CONFIG_BIG_ENDIAN
69904 + int ii = 0;
69905 +
69906 + for(ii=0; ii<(cmdLen>>2); ii++)
69907 + cmd[ii] = cpu_to_le32(cmd[ii]);
69908 +#endif
69909 +
69910 + memcpy(macp->regUsbWriteBuf, cmd, cmdLen);
69911 +
69912 + /* Issue an USB Out transfer */
69913 + /* Submit a tx urb */
69914 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
69915 + ret = zfLnxUsbSubmitBulkUrb(macp->RegOutUrb, macp->udev,
69916 + USB_REG_OUT_PIPE, USB_DIR_OUT, macp->regUsbWriteBuf,
69917 + cmdLen, zfLnxUsbRegOut_callback, dev);
69918 +#else
69919 + ret = zfLnxUsbSubmitIntUrb(macp->RegOutUrb, macp->udev,
69920 + USB_REG_OUT_PIPE, USB_DIR_OUT, macp->regUsbWriteBuf,
69921 + cmdLen, zfLnxUsbRegOut_callback, dev, 1);
69922 +#endif
69923 +
69924 + return ret;
69925 +}
69926 +
69927 +
69928 +u32_t zfLnxUsbOut(zdev_t* dev, u8_t *hdr, u16_t hdrlen, u8_t *snap, u16_t snapLen,
69929 + u8_t *tail, u16_t tailLen, zbuf_t *buf, u16_t offset)
69930 +{
69931 + u32_t ret;
69932 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
69933 +
69934 + /* Check length of tail buffer */
69935 + //zm_assert((tailLen <= 16));
69936 +
69937 + /* Enqueue the packet into UsbTxBufQ */
69938 + if (zfLnxPutUsbTxBuffer(dev, hdr, hdrlen, snap, snapLen, tail, tailLen, buf, offset) == 0xffff)
69939 + {
69940 + /* free packet */
69941 + //printk("CWY - zfwPutUsbTxBuffer Error, free packet\n");
69942 + //dev_kfree_skb_any(buf);
69943 + macp->usbCbFunctions.zfcbUsbOutComplete(dev, buf, 0, hdr);
69944 + return 0xffff;
69945 + }
69946 +
69947 + //return 0;
69948 + //printk("CWY - call zfwUsbSubmitTxData()\n");
69949 + ret = zfLnxUsbSubmitTxData(dev);
69950 + return ret;
69951 +}
69952 +
69953 +void zfLnxInitUsbTxQ(zdev_t* dev)
69954 +{
69955 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
69956 +
69957 + printk(KERN_ERR "zfwInitUsbTxQ\n");
69958 +
69959 + /* Zero memory for UsbTxBufQ */
69960 + memset(macp->UsbTxBufQ, 0, sizeof(UsbTxQ_t) * ZM_MAX_TX_URB_NUM);
69961 +
69962 + macp->TxBufHead = 0;
69963 + macp->TxBufTail = 0;
69964 + macp->TxUrbHead = 0;
69965 + macp->TxUrbTail = 0;
69966 + macp->TxUrbCnt = ZM_MAX_TX_URB_NUM;
69967 +}
69968 +
69969 +void zfLnxInitUsbRxQ(zdev_t* dev)
69970 +{
69971 + u16_t i;
69972 + zbuf_t *buf;
69973 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
69974 +
69975 + /* Zero memory for UsbRxBufQ */
69976 + memset(macp->UsbRxBufQ, 0, sizeof(zbuf_t *) * ZM_MAX_RX_URB_NUM);
69977 +
69978 + macp->RxBufHead = 0;
69979 +
69980 + for (i = 0; i < ZM_MAX_RX_URB_NUM; i++)
69981 + {
69982 + //buf = zfwBufAllocate(dev, ZM_MAX_RX_BUFFER_SIZE);
69983 + buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE);
69984 + macp->UsbRxBufQ[i] = buf;
69985 + }
69986 +
69987 + //macp->RxBufTail = ZM_MAX_RX_URB_NUM - 1;
69988 + macp->RxBufTail = 0;
69989 +
69990 + /* Submit all Rx urbs */
69991 + for (i = 0; i < ZM_MAX_RX_URB_NUM; i++)
69992 + {
69993 + zfLnxPutUsbRxBuffer(dev, macp->UsbRxBufQ[i]);
69994 + zfLnxUsbIn(dev, macp->WlanRxDataUrb[i], macp->UsbRxBufQ[i]);
69995 + }
69996 +}
69997 +
69998 +
69999 +
70000 +u32_t zfLnxUsbSubmitBulkUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction,
70001 + void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context)
70002 +{
70003 + u32_t ret;
70004 +
70005 + if(direction == USB_DIR_OUT)
70006 + {
70007 + usb_fill_bulk_urb(urb, usb, usb_sndbulkpipe(usb, epnum),
70008 + transfer_buffer, buffer_length, complete, context);
70009 +
70010 + urb->transfer_flags |= URB_ZERO_PACKET;
70011 + }
70012 + else
70013 + {
70014 + usb_fill_bulk_urb(urb, usb, usb_rcvbulkpipe(usb, epnum),
70015 + transfer_buffer, buffer_length, complete, context);
70016 + }
70017 +
70018 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)
70019 + urb->transfer_flags |= URB_ASYNC_UNLINK;
70020 +#endif
70021 +
70022 + if (epnum == 4)
70023 + {
70024 + if (urb->hcpriv)
70025 + {
70026 + //printk("CWY - urb->hcpriv set by unknown reason, reset it\n");
70027 + //urb->hcpriv = 0;
70028 + }
70029 + }
70030 +
70031 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
70032 + ret = usb_submit_urb(urb, GFP_ATOMIC);
70033 +#else
70034 + ret = usb_submit_urb(urb);
70035 +#endif
70036 + if ((epnum == 4) & (ret != 0))
70037 + {
70038 + //printk("CWY - ret = %x\n", ret);
70039 + }
70040 + return ret;
70041 +}
70042 +
70043 +u32_t zfLnxUsbSubmitIntUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction,
70044 + void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context,
70045 + u32_t interval)
70046 +{
70047 + u32_t ret;
70048 +
70049 + if(direction == USB_DIR_OUT)
70050 + {
70051 + usb_fill_int_urb(urb, usb, usb_sndbulkpipe(usb, epnum),
70052 + transfer_buffer, buffer_length, complete, context, interval);
70053 + }
70054 + else
70055 + {
70056 + usb_fill_int_urb(urb, usb, usb_rcvbulkpipe(usb, epnum),
70057 + transfer_buffer, buffer_length, complete, context, interval);
70058 + }
70059 +
70060 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15)
70061 + urb->transfer_flags |= URB_ASYNC_UNLINK;
70062 +#endif
70063 +
70064 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
70065 + ret = usb_submit_urb(urb, GFP_ATOMIC);
70066 +#else
70067 + ret = usb_submit_urb(urb);
70068 +#endif
70069 +
70070 + return ret;
70071 +}
70072 +
70073 +#ifdef ZM_ENABLE_CENC
70074 +int zfLnxCencSendMsg(struct sock *netlink_sk, u_int8_t *msg, int len)
70075 +{
70076 +#define COMMTYPE_GROUP 8
70077 +#define WAI_K_MSG 0x11
70078 +
70079 + int ret = -1;
70080 + int size;
70081 + unsigned char *old_tail;
70082 + struct sk_buff *skb;
70083 + struct nlmsghdr *nlh;
70084 + char *pos = NULL;
70085 +
70086 + size = NLMSG_SPACE(len);
70087 + skb = alloc_skb(size, GFP_ATOMIC);
70088 +
70089 + if(skb == NULL)
70090 + {
70091 + printk("dev_alloc_skb failure \n");
70092 + goto out;
70093 + }
70094 + old_tail = skb->tail;
70095 +
70096 + /*ÌîдÊý¾Ý±¨Ïà¹ØÐÅÏ¢*/
70097 + nlh = NLMSG_PUT(skb, 0, 0, WAI_K_MSG, size-sizeof(*nlh));
70098 + pos = NLMSG_DATA(nlh);
70099 + memset(pos, 0, len);
70100 +
70101 + /*´«Êäµ½Óû§¿Õ¼äµÄÊý¾Ý*/
70102 + memcpy(pos, msg, len);
70103 + /*¼ÆËã¾­¹ý×Ö½Ú¶ÔÆäºóµÄÊý¾Ýʵ¼Ê³¤¶È*/
70104 + nlh->nlmsg_len = skb->tail - old_tail;
70105 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,14)
70106 + NETLINK_CB(skb).dst_groups = COMMTYPE_GROUP;
70107 +#else
70108 + NETLINK_CB(skb).dst_group = COMMTYPE_GROUP;
70109 +#endif
70110 + netlink_broadcast(netlink_sk, skb, 0, COMMTYPE_GROUP, GFP_ATOMIC);
70111 + ret = 0;
70112 +out:
70113 + return ret;
70114 +nlmsg_failure: /*NLMSG_PUT ʧ°Ü£¬Ôò³·ÏúÌ×½Ó×Ö»º´æ*/
70115 + if(skb)
70116 + kfree_skb(skb);
70117 + goto out;
70118 +
70119 +#undef COMMTYPE_GROUP
70120 +#undef WAI_K_MSG
70121 +}
70122 +#endif //ZM_ENABLE_CENC
70123 +
70124 +/* Simply return 0xffff if VAP function is not supported */
70125 +u16_t zfLnxGetVapId(zdev_t* dev)
70126 +{
70127 + u16_t i;
70128 +
70129 + for (i=0; i<ZM_VAP_PORT_NUMBER; i++)
70130 + {
70131 + if (vap[i].dev == dev)
70132 + {
70133 + return i;
70134 + }
70135 + }
70136 + return 0xffff;
70137 +}
70138 +
70139 +u32_t zfwReadReg(zdev_t* dev, u32_t offset)
70140 +{
70141 + return 0;
70142 +}
70143 +
70144 +#ifndef INIT_WORK
70145 +#define work_struct tq_struct
70146 +
70147 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0))
70148 +#define schedule_work(a) queue_task(a, &tq_scheduler)
70149 +#else
70150 +#define schedule_work(a) schedule_task(a)
70151 +#endif
70152 +
70153 +#define flush_scheduled_work flush_scheduled_tasks
70154 +#define INIT_WORK(_wq, _routine, _data) INIT_TQUEUE(_wq, _routine, _data)
70155 +#define PREPARE_WORK(_wq, _routine, _data) PREPARE_TQUEUE(_wq, _routine, _data)
70156 +#endif
70157 +
70158 +#define KEVENT_WATCHDOG 0x00000001
70159 +
70160 +u32_t smp_kevent_Lock = 0;
70161 +
70162 +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,20))
70163 +void kevent(struct work_struct *work)
70164 +#else
70165 +void kevent(void *data)
70166 +#endif
70167 +{
70168 +#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,20))
70169 + struct usbdrv_private *macp =
70170 + container_of(work, struct usbdrv_private, kevent);
70171 + zdev_t *dev = macp->device;
70172 +#else
70173 + zdev_t *dev = (zdev_t *) data;
70174 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
70175 +#endif
70176 +
70177 + if (macp == NULL)
70178 + {
70179 + return;
70180 + }
70181 +
70182 + if (test_and_set_bit(0, (void *)&smp_kevent_Lock))
70183 + {
70184 + //schedule_work(&macp->kevent);
70185 + return;
70186 + }
70187 +
70188 + down(&macp->ioctl_sem);
70189 +
70190 + if (test_and_clear_bit(KEVENT_WATCHDOG, &macp->kevent_flags))
70191 + {
70192 + extern u16_t zfHpStartRecv(zdev_t *dev);
70193 + //zfiHwWatchDogReinit(dev);
70194 + printk(("\n ************ Hw watchDog occur!! ************** \n"));
70195 + zfiWlanSuspend(dev);
70196 + zfiWlanResume(dev,0);
70197 + zfHpStartRecv(dev);
70198 + }
70199 +
70200 + clear_bit(0, (void *)&smp_kevent_Lock);
70201 + up(&macp->ioctl_sem);
70202 +}
70203 +
70204 +/************************************************************************/
70205 +/* */
70206 +/* FUNCTION DESCRIPTION zfLnxCreateThread */
70207 +/* Create a Thread */
70208 +/* */
70209 +/* INPUTS */
70210 +/* dev : device pointer */
70211 +/* */
70212 +/* OUTPUTS */
70213 +/* always 0 */
70214 +/* */
70215 +/* AUTHOR */
70216 +/* Yuan-Gu Wei Atheros Communications, INC. 2007.3 */
70217 +/* */
70218 +/************************************************************************/
70219 +u8_t zfLnxCreateThread(zdev_t *dev)
70220 +{
70221 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
70222 +
70223 + /* Create Mutex and keventd */
70224 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20))
70225 + INIT_WORK(&macp->kevent, kevent, dev);
70226 +#else
70227 + INIT_WORK(&macp->kevent, kevent);
70228 +#endif
70229 + init_MUTEX(&macp->ioctl_sem);
70230 +
70231 + return 0;
70232 +}
70233 +
70234 +/************************************************************************/
70235 +/* */
70236 +/* FUNCTION DESCRIPTION zfLnxSignalThread */
70237 +/* Signal Thread with Flag */
70238 +/* */
70239 +/* INPUTS */
70240 +/* dev : device pointer */
70241 +/* flag : signal thread flag */
70242 +/* */
70243 +/* OUTPUTS */
70244 +/* none */
70245 +/* */
70246 +/* AUTHOR */
70247 +/* Yuan-Gu Wei Atheros Communications, INC. 2007.3 */
70248 +/* */
70249 +/************************************************************************/
70250 +void zfLnxSignalThread(zdev_t *dev, int flag)
70251 +{
70252 + struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
70253 +
70254 + if (macp == NULL)
70255 + {
70256 + printk("macp is NULL\n");
70257 + return;
70258 + }
70259 +
70260 + if (0 && macp->kevent_ready != 1)
70261 + {
70262 + printk("Kevent not ready\n");
70263 + return;
70264 + }
70265 +
70266 + set_bit(flag, &macp->kevent_flags);
70267 +
70268 + if (!schedule_work(&macp->kevent))
70269 + {
70270 + //Fails is Normal
70271 + //printk(KERN_ERR "schedule_task failed, flag = %x\n", flag);
70272 + }
70273 +}
70274 +
70275 +/* Notify wrapper todo redownload firmware and reinit procedure when */
70276 +/* hardware watchdog occur : zfiHwWatchDogReinit() */
70277 +void zfLnxWatchDogNotify(zdev_t* dev)
70278 +{
70279 + zfLnxSignalThread(dev, KEVENT_WATCHDOG);
70280 +}
70281 +
70282 +/* Query Durantion of Active Scan */
70283 +void zfwGetActiveScanDur(zdev_t* dev, u8_t* Dur)
70284 +{
70285 + *Dur = 30; // default 30 ms
70286 +}
70287 +
70288 +void zfwGetShowZeroLengthSSID(zdev_t* dev, u8_t* Dur)
70289 +{
70290 + *Dur = 0;
70291 +}
70292 +
70293 --- /dev/null
70294 +++ b/drivers/staging/otus/zdcompat.h
70295 @@ -0,0 +1,116 @@
70296 +/*
70297 + * Copyright (c) 2007-2008 Atheros Communications Inc.
70298 + *
70299 + * Permission to use, copy, modify, and/or distribute this software for any
70300 + * purpose with or without fee is hereby granted, provided that the above
70301 + * copyright notice and this permission notice appear in all copies.
70302 + *
70303 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
70304 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
70305 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
70306 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
70307 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
70308 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
70309 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
70310 + */
70311 +/* */
70312 +/* Module Name : zdcompat.h */
70313 +/* */
70314 +/* Abstract */
70315 +/* This module contains function defintion for compatibility. */
70316 +/* */
70317 +/* NOTES */
70318 +/* Platform dependent. */
70319 +/* */
70320 +/************************************************************************/
70321 +
70322 +#ifndef _ZDCOMPAT_H
70323 +#define _ZDCOMPAT_H
70324 +
70325 +#ifndef KERNEL_VERSION
70326 +#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
70327 +#endif
70328 +
70329 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
70330 +#ifndef INIT_TQUEUE
70331 +#define INIT_TQUEUE(_tq, _routine, _data) \
70332 + do { \
70333 + (_tq)->next = NULL; \
70334 + (_tq)->sync = 0; \
70335 + PREPARE_TQUEUE((_tq), (_routine), (_data)); \
70336 + } while (0)
70337 +#define PREPARE_TQUEUE(_tq, _routine, _data) \
70338 + do { \
70339 + (_tq)->routine = _routine; \
70340 + (_tq)->data = _data; \
70341 + } while (0)
70342 +#endif
70343 +
70344 +#ifndef INIT_WORK
70345 +#define work_struct tq_struct
70346 +
70347 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0))
70348 +#define schedule_work(a) queue_task(a, &tq_scheduler)
70349 +#else
70350 +#define schedule_work(a) schedule_task(a)
70351 +#endif
70352 +
70353 +#define flush_scheduled_work flush_scheduled_tasks
70354 +#define INIT_WORK(_wq, _routine, _data) INIT_TQUEUE(_wq, _routine, _data)
70355 +#define PREPARE_WORK(_wq, _routine, _data) PREPARE_TQUEUE(_wq, _routine, _data)
70356 +#endif
70357 +#endif // < 2.5 kernel
70358 +
70359 +
70360 +#ifndef DECLARE_TASKLET
70361 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0))
70362 +#define tasklet_schedule(a) queue_task(a, &tq_scheduler)
70363 +#else
70364 +#define tasklet_schedule(a) schedule_task(a)
70365 +#endif
70366 +#endif
70367 +
70368 +
70369 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,38))
70370 +typedef struct device netdevice_t;
70371 +#elif (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,4))
70372 +typedef struct net_device netdevice_t;
70373 +#else
70374 +#undef netdevice_t
70375 +typedef struct net_device netdevice_t;
70376 +#endif
70377 +
70378 +#ifdef WIRELESS_EXT
70379 +#if (WIRELESS_EXT < 13)
70380 +struct iw_request_info
70381 +{
70382 + __u16 cmd; /* Wireless Extension command */
70383 + __u16 flags; /* More to come ;-) */
70384 +};
70385 +#endif
70386 +#endif
70387 +
70388 +/* linux < 2.5.69 */
70389 +#ifndef IRQ_NONE
70390 +typedef void irqreturn_t;
70391 +#define IRQ_NONE
70392 +#define IRQ_HANDLED
70393 +#define IRQ_RETVAL(x)
70394 +#endif
70395 +
70396 +#ifndef in_atomic
70397 +#define in_atomic() 0
70398 +#endif
70399 +
70400 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) // fixme
70401 +#define URB_ASYNC_UNLINK USB_ASYNC_UNLINK
70402 +#else
70403 +#define USB_QUEUE_BULK 0
70404 +#endif
70405 +
70406 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0))
70407 +#define free_netdev(x) kfree(x)
70408 +#endif
70409 +
70410 +
70411 +#endif
70412 --- /dev/null
70413 +++ b/drivers/staging/otus/zdusb.c
70414 @@ -0,0 +1,295 @@
70415 +/*
70416 + * Copyright (c) 2007-2008 Atheros Communications Inc.
70417 + *
70418 + * Permission to use, copy, modify, and/or distribute this software for any
70419 + * purpose with or without fee is hereby granted, provided that the above
70420 + * copyright notice and this permission notice appear in all copies.
70421 + *
70422 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
70423 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
70424 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
70425 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
70426 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
70427 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
70428 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
70429 + */
70430 +/* */
70431 +/* Module Name : zdusb.c */
70432 +/* */
70433 +/* Abstract */
70434 +/* This module contains plug and play handling for USB device driver*/
70435 +/* */
70436 +/* NOTES */
70437 +/* Platform dependent. */
70438 +/* */
70439 +/************************************************************************/
70440 +
70441 +#include <linux/version.h>
70442 +#ifdef MODVERSIONS
70443 +#include <linux/modversions.h>
70444 +#endif
70445 +
70446 +#include <linux/module.h>
70447 +#include <linux/usb.h>
70448 +
70449 +#include "usbdrv.h"
70450 +#include "zdusb.h"
70451 +
70452 +int zfLnxAllocAllUrbs(struct usbdrv_private *macp);
70453 +void zfLnxFreeAllUrbs(struct usbdrv_private *macp);
70454 +void zfLnxUnlinkAllUrbs(struct usbdrv_private *macp);
70455 +
70456 +MODULE_AUTHOR("Atheros Communications");
70457 +MODULE_DESCRIPTION("Atheros 802.11n Wireless LAN adapter");
70458 +MODULE_LICENSE("Dual BSD/GPL");
70459 +
70460 +static const char driver_name[] = "Otus";
70461 +
70462 +/* table of devices that work with this driver */
70463 +static struct usb_device_id zd1221_ids [] = {
70464 + { USB_DEVICE(VENDOR_ATHR, PRODUCT_AR9170) },
70465 + { USB_DEVICE(VENDOR_DLINK, PRODUCT_DWA160A) },
70466 + { USB_DEVICE(0x0846, 0x9010) },
70467 + { } /* Terminating entry */
70468 +};
70469 +
70470 +MODULE_DEVICE_TABLE(usb, zd1221_ids);
70471 +
70472 +extern u8_t zfLnxInitSetup(struct net_device *dev, struct usbdrv_private *macp);
70473 +extern int usbdrv_close(struct net_device *dev);
70474 +extern u8_t zfLnxClearStructs(struct net_device *dev);
70475 +extern int zfWdsClose(struct net_device *dev);
70476 +extern int zfUnregisterWdsDev(struct net_device* parentDev, u16_t wdsId);
70477 +extern int zfLnxVapClose(struct net_device *dev);
70478 +extern int zfLnxUnregisterVapDev(struct net_device* parentDev, u16_t vapId);
70479 +
70480 +/* WDS */
70481 +extern struct zsWdsStruct wds[ZM_WDS_PORT_NUMBER];
70482 +
70483 +/* VAP */
70484 +extern struct zsVapStruct vap[ZM_VAP_PORT_NUMBER];
70485 +
70486 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
70487 +static void *zfLnxProbe(struct usb_device *dev, unsigned int ifnum,
70488 + const struct usb_device_id *id)
70489 +{
70490 + struct usb_interface *interface = &dev->actconfig->interface[ifnum];
70491 +#else
70492 +static int zfLnxProbe(struct usb_interface *interface,
70493 + const struct usb_device_id *id)
70494 +{
70495 + struct usb_device *dev = interface_to_usbdev(interface);
70496 +#endif
70497 +
70498 + struct net_device *net = NULL;
70499 + struct usbdrv_private *macp = NULL;
70500 + int vendor_id, product_id;
70501 + int result = 0;
70502 +
70503 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
70504 + usb_get_dev(dev);
70505 +#endif
70506 +
70507 + vendor_id = dev->descriptor.idVendor;
70508 + product_id = dev->descriptor.idProduct;
70509 +
70510 +#ifdef HMAC_DEBUG
70511 + printk(KERN_NOTICE "vendor_id = %04x\n", vendor_id);
70512 + printk(KERN_NOTICE "product_id = %04x\n", product_id);
70513 +
70514 + if (dev->speed == USB_SPEED_HIGH)
70515 + printk(KERN_NOTICE "USB 2.0 Host\n");
70516 + else
70517 + printk(KERN_NOTICE "USB 1.1 Host\n");
70518 +#endif
70519 +
70520 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
70521 + if (usb_set_configuration(dev, dev->config[0].bConfigurationValue))
70522 + {
70523 + printk(KERN_ERR "usb_set_configuration() failed\n");
70524 + result = -EIO;
70525 + goto fail;
70526 + }
70527 +#endif
70528 +
70529 + if (!(macp = kmalloc(sizeof(struct usbdrv_private), GFP_KERNEL)))
70530 + {
70531 + printk(KERN_ERR "out of memory allocating device structure\n");
70532 + result = -ENOMEM;
70533 + goto fail;
70534 + }
70535 +
70536 + /* Zero the memory */
70537 + memset(macp, 0, sizeof(struct usbdrv_private));
70538 +
70539 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
70540 + usb_inc_dev_use(dev);
70541 +#endif
70542 +
70543 + net = alloc_etherdev(0);
70544 +
70545 + if (net == NULL)
70546 + {
70547 + printk(KERN_ERR "zfLnxProbe: Not able to alloc etherdev struct\n");
70548 + result = -ENOMEM;
70549 + goto fail1;
70550 + }
70551 +
70552 + strcpy(net->name, "ath%d");
70553 +
70554 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
70555 + SET_MODULE_OWNER(net);
70556 +#endif
70557 +
70558 + net->priv = macp; //kernel 2.6
70559 + macp->udev = dev;
70560 + macp->device = net;
70561 +
70562 + /* set up the endpoint information */
70563 + /* check out the endpoints */
70564 + macp->interface = interface;
70565 +
70566 + //init_waitqueue_head(&macp->regSet_wait);
70567 + //init_waitqueue_head(&macp->iorwRsp_wait);
70568 + //init_waitqueue_head(&macp->term_wait);
70569 +
70570 + if (!zfLnxAllocAllUrbs(macp))
70571 + {
70572 + result = -ENOMEM;
70573 + goto fail2;
70574 + }
70575 +
70576 + if (!zfLnxInitSetup(net, macp))
70577 + {
70578 + result = -EIO;
70579 + goto fail3;
70580 + }
70581 + else
70582 + {
70583 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
70584 + usb_set_intfdata(interface, macp);
70585 + SET_NETDEV_DEV(net, &interface->dev);
70586 +#endif
70587 +
70588 + if (register_netdev(net) != 0)
70589 + {
70590 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
70591 + usb_set_intfdata(interface, NULL);
70592 +#endif
70593 + goto fail3;
70594 + }
70595 + }
70596 +
70597 + netif_carrier_off(net);
70598 + goto done;
70599 +
70600 +fail3:
70601 + zfLnxFreeAllUrbs(macp);
70602 +fail2:
70603 + free_netdev(net); //kernel 2.6
70604 +fail1:
70605 + kfree(macp);
70606 +
70607 +fail:
70608 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
70609 + usb_put_dev(dev);
70610 +#endif
70611 + macp = NULL;
70612 +
70613 +done:
70614 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
70615 + return macp;
70616 +#else
70617 + return result;
70618 +#endif
70619 +}
70620 +
70621 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
70622 +static void zfLnxDisconnect(struct usb_device *dev, void *ptr)
70623 +#else
70624 +static void zfLnxDisconnect(struct usb_interface *interface)
70625 +#endif
70626 +{
70627 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
70628 + struct usbdrv_private *macp = (struct usbdrv_private *) usb_get_intfdata(interface);
70629 +#else
70630 + struct usbdrv_private *macp = (struct usbdrv_private *)ptr;
70631 +#endif
70632 +
70633 + printk(KERN_DEBUG "zfLnxDisconnect\n");
70634 +
70635 + if (!macp)
70636 + {
70637 + printk(KERN_ERR "unregistering non-existant device\n");
70638 + return;
70639 + }
70640 +
70641 + if (macp->driver_isolated)
70642 + {
70643 + if (macp->device->flags & IFF_UP)
70644 + usbdrv_close(macp->device);
70645 + }
70646 +
70647 +#if 0
70648 + /* Close WDS */
70649 + //zfWdsClose(wds[0].dev);
70650 + /* Unregister WDS */
70651 + //zfUnregisterWdsDev(macp->device, 0);
70652 +
70653 + /* Close VAP */
70654 + zfLnxVapClose(vap[0].dev);
70655 + /* Unregister VAP */
70656 + zfLnxUnregisterVapDev(macp->device, 0);
70657 +#endif
70658 +
70659 + zfLnxClearStructs(macp->device);
70660 +
70661 + unregister_netdev(macp->device);
70662 +
70663 +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
70664 + usb_dec_dev_use(dev);
70665 +#else
70666 + usb_put_dev(interface_to_usbdev(interface));
70667 +#endif
70668 +
70669 + //printk(KERN_ERR "3. zfLnxUnlinkAllUrbs\n");
70670 + //zfLnxUnlinkAllUrbs(macp);
70671 +
70672 + /* Free network interface */
70673 + free_netdev(macp->device);
70674 +
70675 + zfLnxFreeAllUrbs(macp);
70676 + //zfLnxClearStructs(macp->device);
70677 + kfree(macp);
70678 + macp = NULL;
70679 +
70680 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
70681 + usb_set_intfdata(interface, NULL);
70682 +#endif
70683 +}
70684 +
70685 +static struct usb_driver zd1221_driver = {
70686 +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
70687 + #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15))
70688 + .owner = THIS_MODULE,
70689 + #endif
70690 +#endif
70691 + .name = driver_name,
70692 + .probe = zfLnxProbe,
70693 + .disconnect = zfLnxDisconnect,
70694 + .id_table = zd1221_ids,
70695 +};
70696 +
70697 +int __init zfLnxIinit(void)
70698 +{
70699 + printk(KERN_NOTICE "%s - version %s\n", DRIVER_NAME, VERSIONID);
70700 + return usb_register(&zd1221_driver);
70701 +}
70702 +
70703 +void __exit zfLnxExit(void)
70704 +{
70705 + usb_deregister(&zd1221_driver);
70706 +}
70707 +
70708 +module_init(zfLnxIinit);
70709 +module_exit(zfLnxExit);
70710 --- /dev/null
70711 +++ b/drivers/staging/otus/zdusb.h
70712 @@ -0,0 +1,43 @@
70713 +/*
70714 + * Copyright (c) 2007-2008 Atheros Communications Inc.
70715 + *
70716 + * Permission to use, copy, modify, and/or distribute this software for any
70717 + * purpose with or without fee is hereby granted, provided that the above
70718 + * copyright notice and this permission notice appear in all copies.
70719 + *
70720 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
70721 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
70722 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
70723 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
70724 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
70725 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
70726 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
70727 + */
70728 +/* */
70729 +/* Module Name : zdusb.h */
70730 +/* */
70731 +/* Abstract */
70732 +/* This module contains definitions for USB device driver */
70733 +/* */
70734 +/* NOTES */
70735 +/* Platform dependent. */
70736 +/* */
70737 +/************************************************************************/
70738 +
70739 +#ifndef _ZDUSB_H
70740 +#define _ZDUSB_H
70741 +
70742 +#ifndef DRIVER_NAME
70743 +#define DRIVER_NAME "arusb"
70744 +#endif
70745 +
70746 +#define VERSIONID "0.0.0.999"
70747 +
70748 +/* Define these values to match your device */
70749 +#define VENDOR_ATHR 0x0CF3 //Atheros
70750 +#define PRODUCT_AR9170 0x9170
70751 +
70752 +#define VENDOR_DLINK 0x07D1 //Dlink
70753 +#define PRODUCT_DWA160A 0x3C10
70754 +
70755 +#endif