Staging: add otus Atheros wireless network driver

Initial dump of the otus USB wireless network driver.
It builds properly, but a lot of work needs to be done cleaning
it up before it can be merged into the wireless driver tree.

Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Luis R. Rodriguez 2008-10-27 22:44:22 -07:00 committed by Greg Kroah-Hartman
parent e543c24141
commit 4bd43f507c
79 changed files with 70415 additions and 0 deletions

View File

@ -65,5 +65,7 @@ source "drivers/staging/poch/Kconfig"
source "drivers/staging/agnx/Kconfig"
source "drivers/staging/otus/Kconfig"
endif # !STAGING_EXCLUDE_BUILD
endif # STAGING

View File

@ -15,3 +15,4 @@ obj-$(CONFIG_ECHO) += echo/
obj-$(CONFIG_USB_ATMEL) += at76_usb/
obj-$(CONFIG_POCH) += poch/
obj-$(CONFIG_AGNX) += agnx/
obj-$(CONFIG_OTUS) += otus/

View File

@ -0,0 +1,134 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "cprecomp.h"
/************************************************************************/
/* */
/* FUNCTION DESCRIPTION zfGetAmsduSubFrame */
/* Get a subframe from a-MSDU. */
/* */
/* INPUTS */
/* dev : device pointer */
/* buf : A-MSDU frame buffer */
/* offset : offset of subframe in the A-MSDU */
/* */
/* OUTPUTS */
/* NULL or subframe */
/* */
/* AUTHOR */
/* Stephen Chen Atheros Communications, INC. 2007.2 */
/* */
/************************************************************************/
zbuf_t* zfGetAmsduSubFrame(zdev_t* dev, zbuf_t* buf, u16_t* offset)
{
u16_t subframeLen;
u16_t amsduLen = zfwBufGetSize(dev, buf);
zbuf_t* newBuf;
ZM_PERFORMANCE_RX_AMSDU(dev, buf, amsduLen);
/* Verify A-MSDU length */
if (amsduLen < (*offset + 14))
{
return NULL;
}
/* Locate A-MSDU subframe by offset and verify subframe length */
subframeLen = (zmw_buf_readb(dev, buf, *offset + 12) << 8) +
zmw_buf_readb(dev, buf, *offset + 13);
if (subframeLen == 0)
{
return NULL;
}
/* Verify A-MSDU subframe length */
if ((*offset+14+subframeLen) <= amsduLen)
{
/* Allocate a new buffer */
if ((newBuf = zfwBufAllocate(dev, 24+2+subframeLen)) != NULL)
{
#ifdef ZM_ENABLE_NATIVE_WIFI
/* Copy and convert subframe to wlan frame format */
/* SHALL NOT INCLUDE QOS and AMSDU header. Ray 20070807 For Vista */
zfRxBufferCopy(dev, newBuf, buf, 0, 0, 24);
zfRxBufferCopy(dev, newBuf, buf, 24, *offset+14, subframeLen);
zfwBufSetSize(dev, newBuf, 24+subframeLen);
#else
/* Copy subframe to new buffer */
zfRxBufferCopy(dev, newBuf, buf, 0, *offset, 14+subframeLen);
zfwBufSetSize(dev, newBuf, 14+subframeLen);
#endif
/* Update offset */
*offset += (((14+subframeLen)+3) & 0xfffc);
/* Return buffer pointer */
return newBuf;
}
}
return NULL;
}
/************************************************************************/
/* */
/* FUNCTION DESCRIPTION zfDeAmsdu */
/* De-AMSDU. */
/* */
/* INPUTS */
/* dev : device pointer */
/* buf : A-MSDU frame buffer */
/* vap : VAP port */
/* */
/* OUTPUTS */
/* None */
/* */
/* AUTHOR */
/* Stephen Chen Atheros Communications, INC. 2007.2 */
/* */
/************************************************************************/
void zfDeAmsdu(zdev_t* dev, zbuf_t* buf, u16_t vap, u8_t encryMode)
{
u16_t offset = ZM_SIZE_OF_WLAN_DATA_HEADER+ZM_SIZE_OF_QOS_CTRL;
zbuf_t* subframeBuf;
zmw_get_wlan_dev(dev);
ZM_BUFFER_TRACE(dev, buf)
if (encryMode == ZM_AES || encryMode == ZM_TKIP)
{
offset += (ZM_SIZE_OF_IV + ZM_SIZE_OF_EXT_IV);
}
else if (encryMode == ZM_WEP64 || encryMode == ZM_WEP128)
{
offset += ZM_SIZE_OF_IV;
}
/* Repeatly calling zfGetAmsduSubFrame() until NULL returned */
while ((subframeBuf = zfGetAmsduSubFrame(dev, buf, &offset)) != NULL)
{
wd->commTally.NotifyNDISRxFrmCnt++;
if (wd->zfcbRecvEth != NULL)
{
wd->zfcbRecvEth(dev, subframeBuf, (u8_t)vap);
ZM_PERFORMANCE_RX_MSDU(dev, wd->tick);
}
}
zfwBufFree(dev, buf, 0);
return;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,435 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* */
/* Module Name : cagg.h */
/* */
/* Abstract */
/* This module contains A-MPDU aggregation relatived functions. */
/* */
/* NOTES */
/* None */
/* */
/****************************************************************************/
/*Revision History: */
/* Who When What */
/* -------- -------- ----------------------------------------------*/
/* */
/* Honda 12-4-06 created */
/* */
/****************************************************************************/
#ifndef _CAGG_H
#define _CAGG_H
/*
* the aggregation functions flag, 0 if don't do aggregate
*/
#define ZM_AGG_FPGA_DEBUG 1
#define ZM_AGG_FPGA_REORDERING 1
#ifndef ZM_AGG_TALLY
//#define ZM_AGG_TALLY
#endif
/*
* Aggregate control
*/
#define ZM_AGG_POOL_SIZE 20
#define ZM_BAW_POOL_SIZE 32
#define ZM_AGGQ_SIZE 64
#define ZM_AGGQ_SIZE_MASK (ZM_AGGQ_SIZE-1)
#define ZM_AGG_LOW_THRESHOLD 1
#define ZM_AGG_HIGH_THRESHOLD 5
/*
* number of access categories (ac)
*/
#define ZM_AC 4
/*
* the timer to clear aggregation queue, unit: 1 tick
* if the packet is too old (current time - arrival time)
* the packet and the aggregate queue will be cleared
*/
#define ZM_AGG_CLEAR_TIME 10
/*
* delete the queue if idle for ZM_DELETE_TIME
* unit: 10ms
*/
#define ZM_AGG_DELETE_TIME 10000
/*
* block ack window size
*/
#define ZM_AGG_BAW_SIZE 64
#define ZM_AGG_BAW_MASK (ZM_AGG_BAW_SIZE-1)
/*
* originator ADDBA Resquest receiver
* |----------------------------->|
* 1| ACK |1
* |<-----------------------------|
* 2| ADDBA Response |2
* |<-----------------------------|
* 3| ACK |3
* |----------------------------->|
* 4 4
*/
#define ZM_AGG_ADDBA_REQUEST 1
#define ZM_AGG_ADDBA_REQUEST_ACK 2
#define ZM_AGG_ADDBA_RESPONSE 3
#define ZM_AGG_ADDBA_RESPONSE_ACK 4
#define ZM_AGG_SINGLE_MPDU 00
#define ZM_AGG_FIRST_MPDU 01
#define ZM_AGG_MIDDLE_MPDU 11
#define ZM_AGG_LAST_MPDU 10
/*
* end of Aggregate control
*/
#define TID_TX struct aggQueue*
#define TID_BAW struct baw_q*
#define BAW wd->baw_enabler
#define DESTQ wd->destQ
/*
* Queue access
*/
#define zm_agg_qlen(dev, head, tail) ((head - tail) & ZM_AGGQ_SIZE_MASK)
#define zm_agg_inQ(tid_tx, pt) ((((pt - tid_tx->aggTail) & ZM_AGGQ_SIZE_MASK) < \
((tid_tx->aggHead - tid_tx->aggTail) & ZM_AGGQ_SIZE_MASK))? TRUE:FALSE)
#define zm_agg_plus(pt) pt = (pt + 1) & ZM_AGGQ_SIZE_MASK
#define zm_agg_min(A, B) ((A>B)? B:A)
#define zm_agg_GetTime() wd->tick
#define TXQL (zfHpGetMaxTxdCount(dev) - zfHpGetFreeTxdCount(dev))
/* don't change AGG_MIN_TXQL easily, this might cause BAW BSOD */
#define AGG_MIN_TXQL 2
/*
* consider tcp,udp,ac(1234)
*/
#define zm_agg_dynamic_threshold(dev, ar) ((ar > 16)? 11: \
(ar > 12)? 8: \
(ar > 8)? 5: \
(ar > 4)? 2:1)
#define zm_agg_weight(ac) ((3 == ac)? 4: \
(2 == ac)? 3: \
(0 == ac)? 2:1)
/*
* the required free queue ratio per ac
*/
#define zm_agg_ratio(ac) ((3 == ac)? 3: \
(2 == ac)? (zfHpGetMaxTxdCount(dev)*1/4): \
(0 == ac)? (zfHpGetMaxTxdCount(dev)*2/4): \
(zfHpGetMaxTxdCount(dev)*3/4))
//#define zm_agg_ratio(ac) 3
/*
* end of Queue access
*/
#define ZM_AGGMSG_LEV ZM_LV_3
#define zm_msg0_agg(lv, msg) if (ZM_AGGMSG_LEV >= lv) \
{zm_debug_msg0(msg);}
#define zm_msg1_agg(lv, msg, val) if (ZM_AGGMSG_LEV >= lv) \
{zm_debug_msg1(msg, val);}
#define zm_msg2_agg(lv, msg, val) if (ZM_AGGMSG_LEV >= lv) \
{zm_debug_msg2(msg, val);}
#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
struct baw_header_r {
u16_t *header;
u16_t *mic;
u16_t *snap;
u16_t headerLen;
u16_t micLen;
u16_t snapLen;
u16_t removeLen;
u8_t keyIdx;
};
struct baw_header {
u16_t header[29];//[(8+30+2+18)/2]; 58 bytes /* ctr+(4+a1+a2+a3+2+a4)+qos+iv */
u16_t headerLen;
u16_t mic[4]; //[8/2]; 8 bytes
u16_t micLen;
u16_t snap[4]; //[8/2]; 8 bytes
u16_t snapLen;
u16_t removeLen;
u8_t keyIdx;
};
struct bufInfo {
zbuf_t* buf;
u8_t baw_retransmit;
u32_t timestamp;
struct baw_header *baw_header;
};
#endif
struct aggElement
{
zbuf_t* buf;
u32_t arrivalTime;
u8_t baw_retransmit;
struct zsAdditionInfo addInfo;
//struct baw_header baw_header;
};
#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
struct baw_buf
{
zbuf_t* buf;
u16_t baw_seq;
u32_t timestamp;
u8_t baw_retransmit;
struct baw_header baw_header;
};
struct baw_q {
struct baw_buf frame[ZM_VTXQ_SIZE];
u16_t enabled;
u16_t start_seq;
u16_t head;
u16_t tail;
u16_t size;
TID_TX tid_tx;
//struct baw_header *baw_header;
};
struct baw_enabler
{
struct baw_q tid_baw[ZM_BAW_POOL_SIZE];
u8_t delPoint;
void (*core)(zdev_t* dev, u16_t baw_seq, u32_t bitmap, u16_t aggLen);
//void (*core);
void (*init)(zdev_t* dev);
TID_BAW (*getNewQ)(zdev_t* dev, u16_t start_seq, TID_TX tid_tx);
TID_BAW (*getQ)(zdev_t* dev, u16_t baw_seq);
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);
struct bufInfo* (*pop)(zdev_t* dev, u16_t index, TID_BAW tid_baw);
void (*enable)(zdev_t* dev, TID_BAW tid_baw, u16_t start_seq);
void (*disable)(zdev_t* dev, TID_BAW tid_baw);
};
#endif
struct aggQueue
{
struct aggElement aggvtxq[ZM_AGGQ_SIZE];
u16_t aggHead;
u16_t aggTail;
s16_t size;
u16_t aggQSTA;
u16_t aggQEnabled;
u16_t ac;
u16_t tid;
u16_t aggReady;
u16_t clearFlag;
u16_t deleteFlag;
u32_t lastArrival;
u16_t aggFrameSize;
u16_t bar_ssn; /* starting sequence number in BAR */
u16_t dst[3];
u16_t complete; /* complete indication pointer */
};
struct aggSta
{
u16_t count[ZM_AC];
TID_TX tid_tx[8];
u16_t aggFlag[ZM_AC];
};
struct agg_tid_rx
{
u16_t aid;
u16_t ac;
u16_t addBaExchangeStatusCode;
//struct zsAdditionInfo *addInfo;
u16_t seq_start; /* first seq expected next */
u16_t baw_head; /* head of valid block ack window */
u16_t baw_tail; /* tail of valid block ack window */
//u16_t free_count; /* block ack window size */
u8_t sq_exceed_count;
u8_t sq_behind_count;
struct aggElement frame[ZM_AGG_BAW_SIZE + 1]; /* out-of-order rx frames */
};
struct aggControl
{
u16_t aggEnabled;
u16_t ampduIndication;
u16_t addbaIndication;
//TID_BAW tid_baw;
u32_t timestamp;
};
struct aggBaFrameParameter
{
zbuf_t* buf;
u16_t ba_parameter;
u8_t dialog;
u16_t ba_policy;
u16_t tid;
u16_t buffer_size;
u16_t ba_timeout;
u16_t ba_start_seq;
u16_t status_code;
};
struct aggBarControl
{
u16_t bar_ack_policy ;
u16_t multi_tid ;
u16_t compressed_bitmap ;
u16_t tid_info ;
};
struct aggTally
{
u32_t got_packets_sum;
u32_t got_bytes_sum;
u32_t sent_packets_sum;
u32_t sent_bytes_sum;
u32_t avg_got_packets;
u32_t avg_got_bytes;
u32_t avg_sent_packets;
u32_t avg_sent_bytes;
u16_t time;
};
struct destQ {
struct dest{
u16_t Qtype : 1; /* 0 aggr, 1 vtxq */
TID_TX tid_tx;
void* vtxq;
struct dest* next;
} *dest[4];
struct dest* Head[4];
//s16_t size[4];
u16_t ppri;
void (*insert)(zdev_t* dev, u16_t Qtype, u16_t ac, TID_TX tid_tx, void* vtxq);
void (*delete)(zdev_t* dev, u16_t Qtype, TID_TX tid_tx, void* vtxq);
void (*init)(zdev_t* dev);
struct dest* (*getNext)(zdev_t* dev, u16_t ac);
u16_t (*exist)(zdev_t* dev, u16_t Qtype, u16_t ac, TID_TX tid_tx, void* vtxq);
//void (*scan)(zdev_t* dev);
};
/*
* aggregation tx
*/
void zfAggInit(zdev_t* dev);
u16_t zfApFindSta(zdev_t* dev, u16_t* addr);
u16_t zfAggGetSta(zdev_t* dev, zbuf_t* buf);
TID_TX zfAggTxGetQueue(zdev_t* dev, u16_t aid, u16_t tid);
TID_TX zfAggTxNewQueue(zdev_t* dev, u16_t aid, u16_t tid, zbuf_t* buf);
u16_t zfAggTxEnqueue(zdev_t* dev, zbuf_t* buf, u16_t aid, TID_TX tid_tx);
u16_t zfAggTx(zdev_t* dev, zbuf_t* buf, u16_t tid);
u16_t zfAggTxReadyCount(zdev_t* dev, u16_t ac);
u16_t zfAggTxPartial(zdev_t* dev, u16_t ac, u16_t readycount);
u16_t zfAggTxSend(zdev_t* dev, u32_t freeTxd, TID_TX tid_tx);
TID_TX zfAggTxGetReadyQueue(zdev_t* dev, u16_t ac);
zbuf_t* zfAggTxGetVtxq(zdev_t* dev, TID_TX tid_tx);
u16_t zfAggTxDeleteQueue(zdev_t* dev, u16_t qnum);
u16_t zfAggScanAndClear(zdev_t* dev, u32_t time);
u16_t zfAggClearQueue(zdev_t* dev);
void zfAggTxScheduler(zdev_t* dev, u8_t ScanAndClear);
/* tid_tx manipulation */
#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
u16_t zfAggTidTxInsertHead(zdev_t* dev, struct bufInfo* buf_info, TID_TX tid_tx);
#endif
void zfAggDestInsert(zdev_t* dev, u16_t Qtype, u16_t ac, TID_TX tid_tx, void* vtxq);
void zfAggDestDelete(zdev_t* dev, u16_t Qtype, TID_TX tid_tx, void* vtxq);
void zfAggDestInit(zdev_t* dev);
struct dest* zfAggDestGetNext(zdev_t* dev, u16_t ac);
u16_t zfAggDestExist(zdev_t* dev, u16_t Qtype, u16_t ac, TID_TX tid_tx, void* vtxq);
/*
* aggregation rx
*/
struct agg_tid_rx *zfAggRxEnabled(zdev_t* dev, zbuf_t* buf);
u16_t zfAggRx(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo *addInfo, struct agg_tid_rx *tid_rx);
struct agg_tid_rx *zfAggRxGetQueue(zdev_t* dev, zbuf_t* buf);
u16_t zfAggRxEnqueue(zdev_t* dev, zbuf_t* buf, struct agg_tid_rx *tid_rx, struct zsAdditionInfo *addInfo);
u16_t zfAggRxFlush(zdev_t* dev, u16_t seq_no, struct agg_tid_rx *tid_rx);
u16_t zfAggRxFreeBuf(zdev_t* dev, u16_t destroy);
u16_t zfAggRxClear(zdev_t* dev, u32_t time);
void zfAggRecvBAR(zdev_t* dev, zbuf_t* buf);
/*
* end of aggregation rx
*/
/*
* ADDBA
*/
u16_t zfAggSendAddbaRequest(zdev_t* dev, u16_t *dst, u16_t ac, u16_t up);
u16_t zfAggSetAddbaFrameBody(zdev_t* dev,zbuf_t* buf, u16_t offset, u16_t ac, u16_t up);
u16_t zfAggGenAddbaHeader(zdev_t* dev, u16_t* dst,
u16_t* header, u16_t len, zbuf_t* buf, u16_t vap, u8_t encrypt);
u16_t zfAggProcessAction(zdev_t* dev, zbuf_t* buf);
u16_t zfAggBlockAckActionFrame(zdev_t* dev, zbuf_t* buf);
u16_t zfAggRecvAddbaRequest(zdev_t* dev, zbuf_t* buf);
u16_t zfAggRecvAddbaResponse(zdev_t* dev, zbuf_t* buf);
u16_t zfAggRecvDelba(zdev_t* dev, zbuf_t* buf);
u16_t zfAggSendAddbaResponse(zdev_t* dev, struct aggBaFrameParameter *bf);
u16_t zfAggSetAddbaResponseFrameBody(zdev_t* dev, zbuf_t* buf,
struct aggBaFrameParameter *bf, u16_t offset);
u16_t zfAggAddbaSetTidRx(zdev_t* dev, zbuf_t* buf,
struct aggBaFrameParameter *bf);
/*
* zfAggTxSendEth
*/
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);
/*
* statistics functions
*/
u16_t zfAggTallyReset(zdev_t* dev);
u16_t zfAggPrintTally(zdev_t* dev);
/*
* BAR
*/
void zfAggInvokeBar(zdev_t* dev, TID_TX tid_tx);
u16_t zfAggSendBar(zdev_t* dev, TID_TX tid_tx, struct aggBarControl *aggBarControl);
u16_t zfAggSetBarBody(zdev_t* dev, zbuf_t* buf, u16_t offset, TID_TX tid_tx, struct aggBarControl *aggBarControl);
u16_t zfAggGenBarHeader(zdev_t* dev, u16_t* dst,
u16_t* header, u16_t len, zbuf_t* buf, u16_t vap, u8_t encrypt);
#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
/* BAW BA retransmission */
void zfBawCore(zdev_t* dev, u16_t baw_seq, u32_t bitmap, u16_t aggLen);
void zfBawInit(zdev_t* dev);
TID_BAW zfBawGetNewQ(zdev_t* dev, u16_t start_seq, TID_TX tid_tx);
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);
struct bufInfo* zfBawPop(zdev_t* dev, u16_t index, TID_BAW tid_baw);
void zfBawEnable(zdev_t* dev, TID_BAW tid_baw, u16_t start_seq);
void zfBawDisable(zdev_t* dev, TID_BAW tid_baw);
TID_BAW zfBawGetQ(zdev_t* dev, u16_t baw_seq);
void zfAggTxRetransmit(zdev_t* dev, struct bufInfo *buf_info, struct aggControl *aggControl, TID_TX tid_tx);
#endif
/* extern functions */
extern zbuf_t* zfGetVtxq(zdev_t* dev, u8_t ac);
#endif /* #ifndef _CAGG_H */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,449 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* */
/* Module Name : func_extr.c */
/* */
/* Abstract */
/* This module contains function prototype. */
/* */
/* NOTES */
/* None */
/* */
/************************************************************************/
#ifndef _CFUNC_H
#define _CFUNC_H
#include "queue.h"
/* amsdu.c */
void zfDeAmsdu(zdev_t* dev, zbuf_t* buf, u16_t vap, u8_t encryMode);
/* cscanmgr.c */
void zfScanMgrInit(zdev_t* dev);
u8_t zfScanMgrScanStart(zdev_t* dev, u8_t scanType);
void zfScanMgrScanStop(zdev_t* dev, u8_t scanType);
void zfScanMgrScanAck(zdev_t* dev);
/* cpsmgr.c */
void zfPowerSavingMgrInit(zdev_t* dev);
void zfPowerSavingMgrSetMode(zdev_t* dev, u8_t mode);
void zfPowerSavingMgrMain(zdev_t* dev);
void zfPowerSavingMgrWakeup(zdev_t* dev);
u8_t zfPowerSavingMgrIsSleeping(zdev_t *dev);
void zfPowerSavingMgrProcessBeacon(zdev_t* dev, zbuf_t* buf);
void zfPowerSavingMgrAtimWinExpired(zdev_t* dev);
void zfPowerSavingMgrConnectNotify(zdev_t *dev);
void zfPowerSavingMgrPreTBTTInterrupt(zdev_t *dev);
/* ccmd.c */
u16_t zfWlanEnable(zdev_t* dev);
/* cfunc.c */
u8_t zfQueryOppositeRate(zdev_t* dev, u8_t dst_mac[6], u8_t frameType);
void zfCopyToIntTxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* src,
u16_t offset, u16_t length);
void zfCopyToRxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* src,
u16_t offset, u16_t length);
void zfCopyFromIntTxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* dst,
u16_t offset, u16_t length);
void zfCopyFromRxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* dst,
u16_t offset, u16_t length);
void zfMemoryCopy(u8_t* dst, u8_t* src, u16_t length);
void zfMemoryMove(u8_t* dst, u8_t* src, u16_t length);
void zfZeroMemory(u8_t* va, u16_t length);
u8_t zfMemoryIsEqual(u8_t* m1, u8_t* m2, u16_t length);
u8_t zfRxBufferEqualToStr(zdev_t* dev, zbuf_t* buf, const u8_t* str,
u16_t offset, u16_t length);
void zfTxBufferCopy(zdev_t*dev, zbuf_t* dst, zbuf_t* src,
u16_t dstOffset, u16_t srcOffset, u16_t length);
void zfRxBufferCopy(zdev_t*dev, zbuf_t* dst, zbuf_t* src,
u16_t dstOffset, u16_t srcOffset, u16_t length);
void zfCollectHWTally(zdev_t*dev, u32_t* rsp, u8_t id);
void zfTimerInit(zdev_t* dev);
u16_t zfTimerSchedule(zdev_t* dev, u16_t event, u32_t tick);
u16_t zfTimerCancel(zdev_t* dev, u16_t event);
void zfTimerClear(zdev_t* dev);
u16_t zfTimerCheckAndHandle(zdev_t* dev);
void zfProcessEvent(zdev_t* dev, u16_t* eventArray, u8_t eventCount);
void zfBssInfoCreate(zdev_t* dev);
void zfBssInfoDestroy(zdev_t* dev);
struct zsBssInfo* zfBssInfoAllocate(zdev_t* dev);
void zfBssInfoFree(zdev_t* dev, struct zsBssInfo* pBssInfo);
void zfBssInfoReorderList(zdev_t* dev);
void zfBssInfoInsertToList(zdev_t* dev, struct zsBssInfo* pBssInfo);
void zfBssInfoRemoveFromList(zdev_t* dev, struct zsBssInfo* pBssInfo);
void zfBssInfoRefresh(zdev_t* dev, u16_t mode);
void zfCoreSetFrequencyComplete(zdev_t* dev);
void zfCoreSetFrequency(zdev_t* dev, u16_t frequency);
void zfCoreSetFrequencyV2(zdev_t* dev, u16_t frequency,
zfpFreqChangeCompleteCb cb);
void zfCoreSetFrequencyEx(zdev_t* dev, u16_t frequency, u8_t bw40,
u8_t extOffset, zfpFreqChangeCompleteCb cb);
void zfCoreSetFrequencyExV2(zdev_t* dev, u16_t frequency, u8_t bw40,
u8_t extOffset, zfpFreqChangeCompleteCb cb, u8_t forceSetFreq);
void zfReSetCurrentFrequency(zdev_t* dev);
u32_t zfCoreSetKey(zdev_t* dev, u8_t user, u8_t keyId, u8_t type,
u16_t* mac, u32_t* key);
void zfCoreSetKeyComplete(zdev_t* dev);
void zfCoreReinit(zdev_t* dev);
void zfCoreMacAddressNotify(zdev_t* dev, u8_t *addr);
void zfCoreSetIsoName(zdev_t* dev, u8_t* isoName);
void zfGenerateRandomBSSID(zdev_t* dev, u8_t *MACAddr, u8_t *BSSID);
void zfCoreHalInitComplete(zdev_t* dev);
u16_t zfFindCleanFrequency(zdev_t* dev, u32_t adhocMode);
u16_t zfFindMinimumUtilizationChannelIndex(zdev_t* dev, u16_t* array, u16_t count);
u8_t zfCompareWithBssid(zdev_t* dev, u16_t* bssid);
/* chb.c */
void zfDumpBssList(zdev_t* dev);
u16_t zfIssueCmd(zdev_t* dev, u32_t* cmd, u16_t cmdLen, u16_t src, u8_t* buf);
/* cic.c */
void zfUpdateBssid(zdev_t* dev, u8_t* bssid);
void zfResetSupportRate(zdev_t* dev, u8_t type);
void zfUpdateSupportRate(zdev_t* dev, u8_t* rateArray);
u8_t zfIsGOnlyMode(zdev_t* dev, u16_t frequency, u8_t* rateArray);
void zfGatherBMode(zdev_t* dev, u8_t* rateArray, u8_t* extrateArray);
u8_t zfPSDeviceSleep(zdev_t* dev);
u16_t zfGetRandomNumber(zdev_t* dev, u16_t initValue);
void zfCoreEvent(zdev_t* dev, u16_t event, u8_t* rsp);
void zfBeaconCfgInterrupt(zdev_t* dev, u8_t* rsp);
void zfEndOfAtimWindowInterrupt(zdev_t* dev);
/* cinit.c */
u16_t zfTxGenWlanHeader(zdev_t* dev, zbuf_t* buf, u16_t* header, u16_t seq,
u8_t flag, u16_t plusLen, u16_t minusLen, u16_t port,
u16_t* da, u16_t* sa, u8_t up, u16_t *micLen,
u16_t* snap, u16_t snapLen, struct aggControl *aggControl);
u16_t zfTxGenMmHeader(zdev_t* dev, u8_t frameType, u16_t* dst,
u16_t* header, u16_t len, zbuf_t* buf, u16_t vap, u8_t encrypt);
void zfInitMacApMode(zdev_t* dev);
u16_t zfChGetNextChannel(zdev_t* dev, u16_t frequency, u8_t* pbPassive);
u16_t zfChGetFirstChannel(zdev_t* dev, u8_t* pbPassive);
u16_t zfChGetFirst2GhzChannel(zdev_t* dev);
u16_t zfChGetFirst5GhzChannel(zdev_t* dev);
u16_t zfChGetLastChannel(zdev_t* dev, u8_t* pbPassive);
u16_t zfChGetLast5GhzChannel(zdev_t* dev);
u16_t zfChNumToFreq(zdev_t* dev, u8_t ch, u8_t freqBand);
u8_t zfChFreqToNum(u16_t freq, u8_t* bIs5GBand);
/* cmm.c */
void zfProcessManagement(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo); //CWYang(m)
void zfSendMmFrame(zdev_t* dev, u8_t frameType, u16_t* dst,
u32_t p1, u32_t p2, u32_t p3);
u16_t zfFindElement(zdev_t* dev, zbuf_t* buf, u8_t eid);
u16_t zfFindWifiElement(zdev_t* dev, zbuf_t* buf, u8_t type, u8_t subtype);
u16_t zfFindSuperGElement(zdev_t* dev, zbuf_t* buf, u8_t type);
u16_t zfFindXRElement(zdev_t* dev, zbuf_t* buf, u8_t type);
u16_t zfRemoveElement(zdev_t* dev, u8_t* buf, u16_t size, u8_t eid);
u16_t zfUpdateElement(zdev_t* dev, u8_t* buf, u16_t size, u8_t* updateeid);
void zfProcessProbeReq(zdev_t* dev, zbuf_t* buf, u16_t* src);
void zfProcessProbeRsp(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo);
u16_t zfSendProbeReq(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t bWithSSID);
u16_t zfMmAddIeSupportRate(zdev_t* dev, zbuf_t* buf,
u16_t offset, u8_t eid, u8_t rateSet);
u16_t zfMmAddIeDs(zdev_t* dev, zbuf_t* buf, u16_t offset);
u16_t zfMmAddIeErp(zdev_t* dev, zbuf_t* buf, u16_t offset);
void zfUpdateDefaultQosParameter(zdev_t* dev, u8_t mode);
u16_t zfMmAddIeWpa(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t apId);
u16_t zfMmAddHTCapability(zdev_t* dev, zbuf_t* buf, u16_t offset); //CWYang(+)
u16_t zfMmAddPreNHTCapability(zdev_t* dev, zbuf_t* buf, u16_t offset);
u16_t zfMmAddExtendedHTCapability(zdev_t* dev, zbuf_t* buf, u16_t offset); //CWYang(+)
u16_t zfFindATHExtCap(zdev_t* dev, zbuf_t* buf, u8_t type, u8_t subtype);
u16_t zfFindBrdcmMrvlRlnkExtCap(zdev_t* dev, zbuf_t* buf);
u16_t zfFindMarvelExtCap(zdev_t* dev, zbuf_t* buf);
u16_t zfFindBroadcomExtCap(zdev_t* dev, zbuf_t* buf);
u16_t zfFindRlnkExtCap(zdev_t* dev, zbuf_t* buf);
/* cmmap.c */
void zfMmApTimeTick(zdev_t* dev);
void zfApAgingSta(zdev_t* dev);
u16_t zfApAddSta(zdev_t* dev, u16_t* addr, u16_t state, u16_t apId, u8_t type,
u8_t qosType, u8_t qosInfo);
void zfApProtctionMonitor(zdev_t* dev);
void zfApProcessBeacon(zdev_t* dev, zbuf_t* buf);
void zfApProcessAuth(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId);
void zfApProcessAsocReq(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId);
void zfApProcessAsocRsp(zdev_t* dev, zbuf_t* buf);
void zfApProcessDeauth(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId);
void zfApProcessDisasoc(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId);
void zfApProcessProbeRsp(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo);
void zfApStoreAsocReqIe(zdev_t* dev, zbuf_t* buf, u16_t aid);
u16_t zfApAddIeSsid(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t vap);
void zfApSendBeacon(zdev_t* dev);
u16_t zfApGetSTAInfo(zdev_t* dev, u16_t* addr, u16_t* state, u8_t* vap);
u16_t zfIntrabssForward(zdev_t* dev, zbuf_t* buf, u8_t srcVap);
u16_t zfApBufferPsFrame(zdev_t* dev, zbuf_t* buf, u16_t port);
void zfApInitStaTbl(zdev_t* dev);
void zfApGetStaTxRateAndQosType(zdev_t* dev, u16_t* addr, u32_t* phyCtrl,
u8_t* qosType, u16_t* rcProbingFlag);
void zfApGetStaQosType(zdev_t* dev, u16_t* addr, u8_t* qosType);
void zfApSetStaTxRate(zdev_t* dev, u16_t* addr, u32_t phyCtrl);
struct zsMicVar* zfApGetRxMicKey(zdev_t* dev, zbuf_t* buf);
struct zsMicVar* zfApGetTxMicKey(zdev_t* dev, zbuf_t* buf, u8_t* qosType);
u16_t zfApAddIeWmePara(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t vap);
u16_t zfApUpdatePsBit(zdev_t* dev, zbuf_t* buf, u8_t* vap, u8_t* uapsdTrig);
void zfApProcessPsPoll(zdev_t* dev, zbuf_t* buf);
u16_t zfApFindSta(zdev_t* dev, u16_t* addr);
void zfApGetStaEncryType(zdev_t* dev, u16_t* addr, u8_t* encryType);
void zfApGetStaWpaIv(zdev_t* dev, u16_t* addr, u16_t* iv16, u32_t* iv32);
void zfApSetStaWpaIv(zdev_t* dev, u16_t* addr, u16_t iv16, u32_t iv32);
void zfApClearStaKey(zdev_t* dev, u16_t* addr);
#ifdef ZM_ENABLE_CENC
void zfApGetStaCencIvAndKeyIdx(zdev_t* dev, u16_t* addr, u32_t *iv,
u8_t *keyIdx);
void zfApSetStaCencIv(zdev_t* dev, u16_t* addr, u32_t *iv);
#endif //ZM_ENABLE_CENC
void zfApSetProtectionMode(zdev_t* dev, u16_t mode);
void zfApFlushBufferedPsFrame(zdev_t* dev);
void zfApSendFailure(zdev_t* dev, u8_t* addr);
u8_t zfApRemoveFromPsQueue(zdev_t* dev, u16_t id, u16_t* src);
void zfApProcessAction(zdev_t* dev, zbuf_t* buf);
/* cmmsta.c */
void zfMmStaTimeTick(zdev_t* dev);
void zfReWriteBeaconStartAddress(zdev_t* dev); // Mxzeng
void zfStaProcessBeacon(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo); //CWYang(m)
void zfStaProcessAuth(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId);
void zfStaProcessAsocReq(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId);
void zfStaProcessAsocRsp(zdev_t* dev, zbuf_t* buf);
void zfStaProcessDeauth(zdev_t* dev, zbuf_t* buf);
void zfStaProcessDisasoc(zdev_t* dev, zbuf_t* buf);
void zfStaProcessProbeRsp(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo);
void zfStaProcessAtim(zdev_t* dev, zbuf_t* buf);
void zfStaStoreAsocRspIe(zdev_t* dev, zbuf_t* buf);
void zfStaChannelManagement(zdev_t* dev, u8_t scan);
void zfIbssConnectNetwork(zdev_t* dev);
void zfInfraConnectNetwork(zdev_t* dev);
u8_t zfCheckAuthentication(zdev_t* dev, struct zsBssInfo* pBssInfo);
u8_t zfChangeAdapterState(zdev_t* dev, u8_t newState);
u16_t zfStaAddIeSsid(zdev_t* dev, zbuf_t* buf, u16_t offset);
u16_t zfStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType);
u16_t zfStaAddIeIbss(zdev_t* dev, zbuf_t* buf, u16_t offset);
void zfStaStartConnect(zdev_t* dev, u8_t bIsSharedKey);
u8_t zfStaIsConnected(zdev_t* dev);
u8_t zfStaIsConnecting(zdev_t* dev);
u8_t zfStaIsDisconnect(zdev_t* dev);
void zfStaSendBeacon(zdev_t* dev);
void zfSendNullData(zdev_t* dev, u8_t type);
void zfSendPSPoll(zdev_t* dev);
void zfSendBA(zdev_t* dev, u16_t start_seq, u8_t *bitmap);
void zdRateInfoCountTx(zdev_t* dev, u16_t* macAddr);
struct zsMicVar* zfStaGetRxMicKey(zdev_t* dev, zbuf_t* buf);
struct zsMicVar* zfStaGetTxMicKey(zdev_t* dev, zbuf_t* buf);
u16_t zfStaRxValidateFrame(zdev_t* dev, zbuf_t* buf);
void zfStaMicFailureHandling(zdev_t* dev, zbuf_t* buf);
u8_t zfStaBlockWlanScan(zdev_t* dev);
void zfStaIbssPSCheckState(zdev_t* dev, zbuf_t* buf);
u8_t zfStaIbssPSQueueData(zdev_t* dev, zbuf_t* buf);
void zfStaIbssPSSend(zdev_t* dev);
void zfStaResetStatus(zdev_t* dev, u8_t bInit);
u16_t zfStaAddIeWmeInfo(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t qosInfo);
void zfInitPartnerNotifyEvent(zdev_t* dev, zbuf_t* buf, struct zsPartnerNotifyEvent *event);
void zfStaInitOppositeInfo(zdev_t* dev);
void zfStaIbssMonitoring(zdev_t* dev, u8_t reset);
struct zsBssInfo* zfStaFindBssInfo(zdev_t* dev, zbuf_t* buf, struct zsWlanProbeRspFrameHeader *pProbeRspHeader);
u8_t zfStaInitBssInfo(zdev_t* dev, zbuf_t* buf,
struct zsWlanProbeRspFrameHeader *pProbeRspHeader,
struct zsBssInfo* pBssInfo, struct zsAdditionInfo* AddInfo, u8_t type);
s8_t zfStaFindFreeOpposite(zdev_t* dev, u16_t *sa, int *pFoundIdx);
s8_t zfStaFindOppositeByMACAddr(zdev_t* dev, u16_t *sa, u8_t *pFoundIdx);
void zfStaRefreshBlockList(zdev_t* dev, u16_t flushFlag);
void zfStaConnectFail(zdev_t* dev, u16_t reason, u16_t* bssid, u8_t weight);
void zfStaGetTxRate(zdev_t* dev, u16_t* macAddr, u32_t* phyCtrl,
u16_t* rcProbingFlag);
u16_t zfStaProcessAction(zdev_t* dev, zbuf_t* buf);
struct zsTkipSeed* zfStaGetRxSeed(zdev_t* dev, zbuf_t* buf);
#ifdef ZM_ENABLE_CENC
/* CENC */
u16_t zfStaAddIeCenc(zdev_t* dev, zbuf_t* buf, u16_t offset);
#endif //ZM_ENABLE_CENC
void zfStaEnableSWEncryption(zdev_t *dev, u8_t value);
void zfStaDisableSWEncryption(zdev_t *dev);
u16_t zfComputeBssInfoWeightValue(zdev_t *dev, u8_t isBMode, u8_t isHT, u8_t isHT40, u8_t signalStrength);
u16_t zfStaAddIbssAdditionalIE(zdev_t* dev, zbuf_t* buf, u16_t offset);
/* ctkip.c */
void zfTkipInit(u8_t* key, u8_t* ta, struct zsTkipSeed* pSeed, u8_t* initIv);
void zfMicSetKey(u8_t* key, struct zsMicVar* pMic);
void zfMicAppendByte(u8_t b, struct zsMicVar* pMic);
void zfMicClear(struct zsMicVar* pMic);
void zfMicAppendTxBuf(zdev_t* dev, zbuf_t* buf, u8_t* da, u8_t* sa,
u16_t removeLen, u8_t* mic);
u8_t zfMicRxVerify(zdev_t* dev, zbuf_t* buf);
void zfMicGetMic(u8_t* dst, struct zsMicVar* pMic);
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);
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);
u16_t zfTKIPDecrypt(zdev_t *dev, zbuf_t *buf, u16_t offset, u8_t keyLen, u8_t* key);
void zfTkipGetseeds(u16_t iv16, u8_t *RC4Key, struct zsTkipSeed *Seed);
u8_t zfTkipPhase1KeyMix(u32_t iv32, struct zsTkipSeed* pSeed);
u8_t zfTkipPhase2KeyMix(u16_t iv16, struct zsTkipSeed* pSeed);
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);
u16_t zfWEPDecrypt(zdev_t *dev, zbuf_t *buf, u16_t offset, u8_t keyLen, u8_t* WepKey, u8_t *iv);
/* ctxrx.c */
u16_t zfSend80211Frame(zdev_t* dev, zbuf_t* buf);
void zfIsrPciTxComp(zdev_t* dev);
void zfTxPciDmaStart(zdev_t* dev);
u16_t zfTxPortControl(zdev_t* dev, zbuf_t* buf, u16_t port);
u16_t zfTxSendEth(zdev_t* dev, zbuf_t* buf, u16_t port,
u16_t bufType, u16_t flag);
u16_t zfTxGenWlanTail(zdev_t* dev, zbuf_t* buf, u16_t* snap, u16_t snaplen,
u16_t* mic);
u16_t zfTxGenWlanSnap(zdev_t* dev, zbuf_t* buf, u16_t* snap, u16_t* snaplen);
void zfTxGetIpTosAndFrag(zdev_t* dev, zbuf_t* buf, u8_t* up, u16_t* fragOff);
u16_t zfPutVtxq(zdev_t* dev, zbuf_t* buf);
void zfPushVtxq(zdev_t* dev);
u8_t zfIsVtxqEmpty(zdev_t* dev);
u16_t zfGetSeqCtrl(zdev_t* dev, zbuf_t* buf, u16_t offset);
u8_t zfGetFragNo(zdev_t* dev, zbuf_t* buf);
void zfShowRxEAPOL(zdev_t* dev, zbuf_t* buf, u16_t offset);
void zfShowTxEAPOL(zdev_t* dev, zbuf_t* buf, u16_t offset);
void zfCoreRecv(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo);
u16_t zfPutVmmq(zdev_t* dev, zbuf_t* buf);
void zfFlushVtxq(zdev_t* dev);
void zfAgingDefragList(zdev_t* dev, u16_t flushFlag);
void zfLed100msCtrl(zdev_t* dev);
void zf80211FrameSend(zdev_t* dev, zbuf_t* buf, u16_t* header, u16_t snapLen,
u16_t* da, u16_t* sa, u8_t up, u16_t headerLen, u16_t* snap,
u16_t* tail, u16_t tailLen, u16_t offset, u16_t bufType,
u8_t ac, u8_t keyIdx);
void zfCheckIsRIFSFrame(zdev_t* dev, zbuf_t* buf, u16_t frameSubType);
/* queue.c */
struct zsQueue* zfQueueCreate(zdev_t* dev, u16_t size);
void zfQueueDestroy(zdev_t* dev, struct zsQueue* q);
u16_t zfQueuePutNcs(zdev_t* dev, struct zsQueue* q, zbuf_t* buf, u32_t tick);
u16_t zfQueuePut(zdev_t* dev, struct zsQueue* q, zbuf_t* buf, u32_t tick);
zbuf_t* zfQueueGet(zdev_t* dev, struct zsQueue* q);
zbuf_t* zfQueueGetWithMac(zdev_t* dev, struct zsQueue* q, u8_t* addr, u8_t* mb);
void zfQueueFlush(zdev_t* dev, struct zsQueue* q);
void zfQueueAge(zdev_t* dev, struct zsQueue* q, u32_t tick, u32_t msAge);
void zfQueueGenerateUapsdTim(zdev_t* dev, struct zsQueue* q,
u8_t* uniBitMap, u16_t* highestByte);
/* hpmain.c */
u16_t zfHpInit(zdev_t* dev, u32_t frequency);
u16_t zfHpRelease(zdev_t* dev);
void zfHpSetFrequencyEx(zdev_t* dev, u32_t frequency, u8_t bw40,
u8_t extOffset, u8_t initRF);
u16_t zfHpStartRecv(zdev_t* dev);
u16_t zfHpStopRecv(zdev_t* dev);
u16_t zfHpResetKeyCache(zdev_t* dev);
u16_t zfHpSetApStaMode(zdev_t* dev, u8_t mode);
u16_t zfHpSetBssid(zdev_t* dev, u8_t* bssid);
u16_t zfHpSetSnifferMode(zdev_t* dev, u16_t on);
u8_t zfHpUpdateQosParameter(zdev_t* dev, u16_t* cwminTbl, u16_t* cwmaxTbl,
u16_t* aifsTbl, u16_t* txopTbl);
void zfHpSetAtimWindow(zdev_t* dev, u16_t atimWin);
void zfHpEnableBeacon(zdev_t* dev, u16_t mode, u16_t bcnInterval, u16_t dtim, u8_t enableAtim);
void zfHpDisableBeacon(zdev_t* dev);
void zfHpSetBasicRateSet(zdev_t* dev, u16_t bRateBasic, u16_t gRateBasic);
void zfHpSetRTSCTSRate(zdev_t* dev, u32_t rate);
void zfHpSetMacAddress(zdev_t* dev, u16_t* macAddr, u16_t macAddrId);
u32_t zfHpGetMacAddress(zdev_t* dev);
u32_t zfHpGetTransmitPower(zdev_t* dev);
void zfHpSetMulticastList(zdev_t* dev, u8_t size, u8_t* pList, u8_t bAllMulticast);
u16_t zfHpRemoveKey(zdev_t* dev, u16_t user);
u32_t zfHpSetKey(zdev_t* dev, u8_t user, u8_t keyId, u8_t type,
u16_t* mac, u32_t* key);
//u32_t zfHpSetStaPairwiseKey(zdev_t* dev, u16_t* apMacAddr, u8_t type,
// u32_t* key, u32_t* micKey);
//u32_t zfHpSetStaGroupKey(zdev_t* dev, u16_t* apMacAddr, u8_t type,
// u32_t* key, u32_t* micKey);
u32_t zfHpSetApPairwiseKey(zdev_t* dev, u16_t* staMacAddr, u8_t type,
u32_t* key, u32_t* micKey, u16_t staAid);
u32_t zfHpSetApGroupKey(zdev_t* dev, u16_t* apMacAddr, u8_t type,
u32_t* key, u32_t* micKey, u16_t vapId);
u32_t zfHpSetDefaultKey(zdev_t* dev, u8_t keyId, u8_t type, u32_t* key, u32_t* micKey);
u32_t zfHpSetPerUserKey(zdev_t* dev, u8_t user, u8_t keyId, u8_t* mac, u8_t type, u32_t* key, u32_t* micKey);
void zfHpSendBeacon(zdev_t* dev, zbuf_t* buf, u16_t len);
u16_t zfHpGetPayloadLen(zdev_t* dev,
zbuf_t* buf,
u16_t len,
u16_t plcpHdrLen,
u32_t *rxMT,
u32_t *rxMCS,
u32_t *rxBW,
u32_t *rxSG
);
u32_t zfHpGetFreeTxdCount(zdev_t* dev);
u32_t zfHpGetMaxTxdCount(zdev_t* dev);
u16_t zfHpSend(zdev_t* dev, u16_t* header, u16_t headerLen,
u16_t* snap, u16_t snapLen, u16_t* tail, u16_t tailLen, zbuf_t* buf,
u16_t offset, u16_t bufType, u8_t ac, u8_t keyIdx);
void zfHpGetRegulationTablefromRegionCode(zdev_t* dev, u16_t regionCode);
void zfHpGetRegulationTablefromCountry(zdev_t* dev, u16_t CountryCode);
u8_t zfHpGetRegulationTablefromISO(zdev_t* dev, u8_t *countryInfo, u8_t length);
const char* zfHpGetisoNamefromregionCode(zdev_t* dev, u16_t regionCode);
u16_t zfHpGetRegionCodeFromIsoName(zdev_t* dev, u8_t *countryIsoName);
u8_t zfHpGetRegulatoryDomain(zdev_t* dev);
void zfHpLedCtrl(zdev_t* dev, u16_t ledId, u8_t mode);
u16_t zfHpResetTxRx(zdev_t* dev);
u16_t zfHpDeleteAllowChannel(zdev_t* dev, u16_t freq);
u16_t zfHpAddAllowChannel(zdev_t* dev, u16_t freq);
u32_t zfHpCwmUpdate(zdev_t* dev);
u32_t zfHpAniUpdate(zdev_t* dev);
u32_t zfHpAniUpdateRssi(zdev_t* dev, u8_t rssi);
void zfHpAniAttach(zdev_t* dev);
void zfHpAniArPoll(zdev_t* dev, u32_t listenTime, u32_t phyCnt1, u32_t phyCnt2);
void zfHpHeartBeat(zdev_t* dev);
void zfHpPowerSaveSetState(zdev_t* dev, u8_t psState);
void zfHpPowerSaveSetMode(zdev_t* dev, u8_t staMode, u8_t psMode, u16_t bcnInterval);
u16_t zfHpIsDfsChannel(zdev_t* dev, u16_t freq);
u16_t zfHpIsDfsChannelNCS(zdev_t* dev, u16_t freq);
u16_t zfHpFindFirstNonDfsChannel(zdev_t* dev, u16_t aBand);
u16_t zfHpIsAllowedChannel(zdev_t* dev, u16_t freq);
void zfHpDisableDfsChannel(zdev_t* dev, u8_t disableFlag);
void zfHpSetTTSIFSTime(zdev_t* dev, u8_t sifs_time);
void zfHpQueryMonHalRxInfo(zdev_t* dev, u8_t *monHalRxInfo);
void zfDumpSSID(u8_t length, u8_t *value);
void zfHpSetAggPktNum(zdev_t* dev, u32_t num);
void zfHpSetMPDUDensity(zdev_t* dev, u8_t density);
void zfHpSetSlotTime(zdev_t* dev, u8_t type);
void zfHpSetSlotTimeRegister(zdev_t* dev, u8_t type);
void zfHpSetRifs(zdev_t* dev, u8_t ht_enable, u8_t ht2040, u8_t g_mode);
void zfHpBeginSiteSurvey(zdev_t* dev, u8_t status);
void zfHpFinishSiteSurvey(zdev_t* dev, u8_t status);
u16_t zfHpEnableHwRetry(zdev_t* dev);
u16_t zfHpDisableHwRetry(zdev_t* dev);
void zfHpSWDecrypt(zdev_t* dev, u8_t enable);
void zfHpSWEncrypt(zdev_t* dev, u8_t enable);
u32_t zfHpCapability(zdev_t* dev);
void zfHpSetRollCallTable(zdev_t* dev);
u8_t zfHpregulatoryDomain(zdev_t* dev);
u16_t zfStaAddIePowerCap(zdev_t* dev, zbuf_t* buf, u16_t offset);
u8_t zfHpGetMaxTxPower(zdev_t* dev);
u8_t zfHpGetMinTxPower(zdev_t* dev);
u16_t zfStaAddIeSupportCh(zdev_t* dev, zbuf_t* buf, u16_t offset);
void zfHpEnableRifs(zdev_t* dev, u8_t mode24g, u8_t modeHt, u8_t modeHt2040);
void zfHpDisableRifs(zdev_t* dev);
u16_t zfHpUsbReset(zdev_t* dev);
#endif /* #ifndef _CFUNC_H */

View File

@ -0,0 +1,200 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* */
/* Module Name : hb.c */
/* */
/* Abstract */
/* This module contains house keeping and timer functions. */
/* */
/* NOTES */
/* None */
/* */
/************************************************************************/
#include "cprecomp.h"
/* Called by wrapper every 10 msec */
void zfiHeartBeat(zdev_t* dev)
{
zmw_get_wlan_dev(dev);
wd->tick++;
#if 0
/* => every 1.28 seconds */
if (wd->cwm.cw_enable && ((wd->tick & 0x7f) == 0x3f))
{
zfHpCwmUpdate(dev);
}
#endif
/* => every 2.56 seconds */
if ((wd->tick & 0xff) == 0)
{
zfAgingDefragList(dev, 1);
}
/* Watch Dog */
//zfWatchDog();
/* LED Control (per 100ms) */
if ((wd->tick % 10) == 9)
{
zfLed100msCtrl(dev);
#ifdef ZM_ENABLE_BA_RATECTRL
if (!wd->modeMDKEnable)
{
zfiDbgReadTally(dev);
}
#endif
}
#ifdef ZM_ENABLE_REWRITE_BEACON_START_ADDRESS
if ( wd->wlanMode == ZM_MODE_IBSS )
{
if ( zfStaIsConnected(dev) )
{
zfReWriteBeaconStartAddress(dev);
}
}
#endif
if ( wd->wlanMode == ZM_MODE_IBSS )
{
if ( zfStaIsConnected(dev) )
{
wd->tickIbssReceiveBeacon++; // add 10ms
if ( (wd->sta.ibssSiteSurveyStatus == 2) &&
(wd->tickIbssReceiveBeacon == 300) &&
(wd->sta.ibssReceiveBeaconCount < 3) )
{
zm_debug_msg0("It is happen!!! No error message");
zfReSetCurrentFrequency(dev);
}
}
}
if(wd->sta.ReceivedPacketRateCounter <= 0)
{
wd->sta.ReceivedPktRatePerSecond = wd->sta.TotalNumberOfReceivePackets;
//zm_debug_msg1("Receive Packet Per Second = ", wd->sta.ReceivedPktRatePerSecond);
if (wd->sta.TotalNumberOfReceivePackets != 0)
{
wd->sta.avgSizeOfReceivePackets = wd->sta.TotalNumberOfReceiveBytes/wd->sta.TotalNumberOfReceivePackets;
}
else
{
wd->sta.avgSizeOfReceivePackets = 640;
}
wd->sta.TotalNumberOfReceivePackets = 0;
wd->sta.TotalNumberOfReceiveBytes = 0;
wd->sta.ReceivedPacketRateCounter = 100; /*for another 1s*/
}
else
{
wd->sta.ReceivedPacketRateCounter--;
}
/* => every 1.28 seconds */
if((wd->tick & 0x7f) == 0x3f)
{
if( wd->sta.NonNAPcount > 0)
{
wd->sta.RTSInAGGMode = TRUE;
wd->sta.NonNAPcount = 0;
}
else
{
wd->sta.RTSInAGGMode = FALSE;
}
}
/* Maintain management time tick */
zfMmApTimeTick(dev);
zfMmStaTimeTick(dev);
//zfPhyCrTuning(dev);
//zfTxPowerControl(dev);
zfHpHeartBeat(dev);
}
void zfDumpBssList(zdev_t* dev)
{
struct zsBssInfo* pBssInfo;
u8_t str[33];
u8_t i, j;
u32_t addr1, addr2;
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
zm_debug_msg0("***** Bss scan result *****");
zmw_enter_critical_section(dev);
pBssInfo = wd->sta.bssList.head;
for( i=0; i<wd->sta.bssList.bssCount; i++ )
{
if ( i )
{
zm_debug_msg0("---------------------------");
}
zm_debug_msg1("BSS #", i);
for(j=0; j<pBssInfo->ssid[1]; j++)
{
str[j] = pBssInfo->ssid[2+j];
}
str[pBssInfo->ssid[1]] = 0;
zm_debug_msg0("SSID = ");
zm_debug_msg0(str);
addr1 = (pBssInfo->bssid[0] << 16) + (pBssInfo->bssid[1] << 8 )
+ pBssInfo->bssid[2];
addr2 = (pBssInfo->bssid[3] << 16) + (pBssInfo->bssid[4] << 8 )
+ pBssInfo->bssid[5];
zm_debug_msg2("Bssid = ", addr1);
zm_debug_msg2(" ", addr2);
zm_debug_msg1("frequency = ", pBssInfo->frequency);
zm_debug_msg1("security type = ", pBssInfo->securityType);
zm_debug_msg1("WME = ", pBssInfo->wmeSupport);
zm_debug_msg1("beacon interval = ", pBssInfo->beaconInterval[0]
+ (pBssInfo->beaconInterval[1] << 8));
zm_debug_msg1("capability = ", pBssInfo->capability[0]
+ (pBssInfo->capability[1] << 8));
if ( pBssInfo->supportedRates[1] > 0 )
{
for( j=0; j<pBssInfo->supportedRates[1]; j++ )
{
zm_debug_msg2("supported rates = ", pBssInfo->supportedRates[2+j]);
}
}
for( j=0; j<pBssInfo->extSupportedRates[1]; j++ )
{
zm_debug_msg2("ext supported rates = ", pBssInfo->extSupportedRates[2+j]);
}
pBssInfo = pBssInfo->next;
}
zmw_leave_critical_section(dev);
zm_debug_msg0("***************************");
}

View File

@ -0,0 +1,496 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "cprecomp.h"
#include "ratectrl.h"
void zfUpdateBssid(zdev_t* dev, u8_t* bssid)
{
zmw_get_wlan_dev(dev);
//zmw_declare_for_critical_section();
//zmw_enter_critical_section(dev);
wd->sta.bssid[0] = bssid[0] + (((u16_t) bssid[1]) << 8);
wd->sta.bssid[1] = bssid[2] + (((u16_t) bssid[3]) << 8);
wd->sta.bssid[2] = bssid[4] + (((u16_t) bssid[5]) << 8);
//zmw_leave_critical_section(dev);
zfHpSetBssid(dev, bssid);
}
/************************************************************************************/
/* */
/* FUNCTION DESCRIPTION zfResetSupportRate */
/* Reset support rate to default value. */
/* */
/* INPUTS */
/* dev : device pointer */
/* type: ZM_DEFAULT_SUPPORT_RATE_ZERO => reset to zero */
/* ZM_DEFAULT_SUPPORT_RATE_DISCONNECT => reset to disconnect status */
/* ZM_DEFAULT_SUPPORT_RATE_IBSS_B => reset to IBSS creator(b mode) */
/* ZM_DEFAULT_SUPPORT_RATE_IBSS_AG => reset to IBSS creator(a/g mode) */
/* */
/************************************************************************************/
void zfResetSupportRate(zdev_t* dev, u8_t type)
{
zmw_get_wlan_dev(dev);
switch(type)
{
case ZM_DEFAULT_SUPPORT_RATE_ZERO:
wd->bRate = 0;
wd->bRateBasic = 0;
wd->gRate = 0;
wd->gRateBasic = 0;
break;
case ZM_DEFAULT_SUPPORT_RATE_DISCONNECT:
wd->bRate = 0xf;
wd->bRateBasic = 0xf;
wd->gRate = 0xff;
wd->gRateBasic = 0x15;
break;
case ZM_DEFAULT_SUPPORT_RATE_IBSS_B:
wd->bRate = 0xf;
wd->bRateBasic = 0xf;
wd->gRate = 0;
wd->gRateBasic = 0;
break;
case ZM_DEFAULT_SUPPORT_RATE_IBSS_AG:
wd->bRate = 0xf;
wd->bRateBasic = 0xf;
wd->gRate = 0xff;
wd->gRateBasic = 0;
break;
}
}
void zfUpdateSupportRate(zdev_t* dev, u8_t* rateArray)
{
u8_t bRate=0, bRateBasic=0, gRate=0, gRateBasic=0;
u8_t length = rateArray[1];
u8_t i, j;
zmw_get_wlan_dev(dev);
for(i=2; i<length+2; i++)
{
for(j=0; j<4; j++)
{
if ( (rateArray[i] & 0x7f) == zg11bRateTbl[j] )
{
bRate |= (1 << j);
if ( rateArray[i] & 0x80 )
{
bRateBasic |= (1 << j);
}
}
}
if ( j == 4 )
{
for(j=0; j<8; j++)
{
if ( (rateArray[i] & 0x7f) == zg11gRateTbl[j] )
{
gRate |= (1 << j);
if ( rateArray[i] & 0x80 )
{
gRateBasic |= (1 << j);
}
}
}
}
}
wd->bRate |= bRate;
wd->bRateBasic |= bRateBasic;
wd->gRate |= gRate;
wd->gRateBasic |= gRateBasic;
}
u8_t zfIsGOnlyMode(zdev_t* dev, u16_t frequency, u8_t* rateArray)
{
u8_t length = rateArray[1];
u8_t i, j;
if (frequency < 3000) {
for (i = 2; i < length+2; i++) {
for (j = 0; j < 8; j++) {
if ( ((rateArray[i] & 0x7f) == zg11gRateTbl[j])
&& (rateArray[i] & 0x80) ) {
return 1;
}
}
}
}
return 0;
}
void zfGatherBMode(zdev_t* dev, u8_t* rateArray, u8_t* extrateArray)
{
u8_t gatherBMode[ZM_MAX_SUPP_RATES_IE_SIZE + 2];
u8_t i, j, k = 0;
u8_t length;
gatherBMode[0] = ZM_WLAN_EID_SUPPORT_RATE;
gatherBMode[1] = 0;
length = rateArray[1];
for (i = 2; i < length+2; i++) {
for (j = 0; j < 4; j++) {
if ( (rateArray[i] & 0x7f) == zg11bRateTbl[j] ) {
gatherBMode[2+k] = rateArray[i];
gatherBMode[1]++;
k++;
}
}
}
length = extrateArray[1];
for (i = 2; i < length+2; i++) {
for (j = 0; j < 4; j++) {
if ( (extrateArray[i] & 0x7f) == zg11bRateTbl[j] ) {
gatherBMode[2+k] = extrateArray[i];
gatherBMode[1]++;
k++;
}
}
}
extrateArray[0] = extrateArray[1] = 0;
zfMemoryCopy(rateArray, gatherBMode, gatherBMode[1]+2);
}
u16_t zfGetRandomNumber(zdev_t* dev, u16_t initValue)
{
#if 0
/* Compiler/Linker error on Linux */
if ( initValue )
{
srand(initValue);
}
return ((u16_t)rand());
#endif
return 0;
}
u8_t zfPSDeviceSleep(zdev_t* dev)
{
//zmw_get_wlan_dev(dev);
/* enter PS mode */
return 0;
}
u8_t zcOfdmPhyCrtlToRate[] =
{
/* 0x8=48M, 0x9=24M, 0xa=12M, 0xb=6M, 0xc=54M, 0xd=36M, 0xe=18M, 0xf=9M */
10, 8, 6, 4, 11, 9, 7, 5
};
u8_t zfPhyCtrlToRate(u32_t phyCtrl)
{
u32_t mt, mcs, sg;
u8_t rate = 0;
mt = phyCtrl & 0x3;
mcs = (phyCtrl>>18) & 0x3f;
sg = (phyCtrl>>31) & 0x1;
if ((mt == 0) && (mcs <=3))
{
rate = (u8_t)mcs;
}
else if ((mt == 1) && (mcs >= 0x8) && (mcs <= 0xf))
{
rate = zcOfdmPhyCrtlToRate[mcs-8];
}
else if ((mt == 2) && (mcs <= 15))
{
rate = (u8_t)mcs + 12;
if(sg) {
if (mcs != 7)
{
rate = (u8_t)mcs + 12 + 2;
}
else //MCS7-SG
{
rate = (u8_t)30;
}
}
}
return rate;
}
void zfCoreEvent(zdev_t* dev, u16_t event, u8_t* rsp)
{
u16_t i;
zbuf_t* psBuf;
u8_t moreData;
u8_t vap = 0;
u8_t peerIdx;
s8_t res;
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
if (event == 0) //Beacon Event
{
if ( wd->wlanMode == ZM_MODE_AP )
{
zfApSendBeacon(dev);
if (wd->CurrentDtimCount == 0)
{
/* TODO : Send queued broadcast frames at BC/MC event */
do
{
psBuf = NULL;
moreData = 0;
zmw_enter_critical_section(dev);
if (wd->ap.bcmcTail[vap] != wd->ap.bcmcHead[vap])
{
//zm_msg0_mm(ZM_LV_0, "Send BCMC frames");
psBuf = wd->ap.bcmcArray[vap][wd->ap.bcmcHead[vap]];
wd->ap.bcmcHead[vap] = (wd->ap.bcmcHead[vap] + 1)
& (ZM_BCMC_ARRAY_SIZE - 1);
if (wd->ap.bcmcTail[vap] != wd->ap.bcmcHead[vap])
{
moreData = 0x20;
}
}
zmw_leave_critical_section(dev);
if (psBuf != NULL)
{
/* TODO : config moreData bit */
zfTxSendEth(dev, psBuf, 0, ZM_EXTERNAL_ALLOC_BUF,
moreData);
}
} while(psBuf != NULL);
}
}
else
{
/* STA mode */
if ( wd->sta.powerSaveMode > ZM_STA_PS_NONE )
{
/* send queued packets */
for(i=0; i<wd->sta.staPSDataCount; i++)
{
zfTxSendEth(dev, wd->sta.staPSDataQueue[i], 0,
ZM_EXTERNAL_ALLOC_BUF, 0);
}
wd->sta.staPSDataCount = 0;
}
if ( wd->wlanMode == ZM_MODE_IBSS )
{
zfStaSendBeacon(dev);
wd->sta.ibssAtimTimer = ZM_BIT_15 | wd->sta.atimWindow;
}
zfPowerSavingMgrPreTBTTInterrupt(dev);
}
} //if (event == 0) //Beacon Event
else if (event == 1) //Retry completed event
{
u32_t retryRate;
retryRate = (u32_t)(rsp[6]) + (((u32_t)(rsp[7]))<<8)
+ (((u32_t)(rsp[8]))<<16) + (((u32_t)(rsp[9]))<<24);
/* Degrade Tx Rate */
if (wd->wlanMode == ZM_MODE_AP)
{
zmw_enter_critical_section(dev);
if ((i=zfApFindSta(dev, (u16_t*)rsp)) != 0xffff)
{
zfRateCtrlTxFailEvent(dev, &wd->ap.staTable[i].rcCell, 0,(u32_t)zfPhyCtrlToRate(retryRate));
}
zmw_leave_critical_section(dev);
}
else
{
zmw_enter_critical_section(dev);
res = zfStaFindOppositeByMACAddr(dev, (u16_t*)rsp, &peerIdx);
if ( res == 0 )
{
zfRateCtrlTxFailEvent(dev, &wd->sta.oppositeInfo[peerIdx].rcCell, 0,(u32_t)zfPhyCtrlToRate(retryRate));
}
zmw_leave_critical_section(dev);
}
} //else if (event == 1) //Retry completed event
else if (event == 2) //Tx Fail event
{
u32_t retryRate;
retryRate = (u32_t)(rsp[6]) + (((u32_t)(rsp[7]))<<8)
+ (((u32_t)(rsp[8]))<<16) + (((u32_t)(rsp[9]))<<24);
/* Degrade Tx Rate */
if (wd->wlanMode == ZM_MODE_AP)
{
zmw_enter_critical_section(dev);
if ((i=zfApFindSta(dev, (u16_t*)rsp)) != 0xffff)
{
zfRateCtrlTxFailEvent(dev, &wd->ap.staTable[i].rcCell, 0,(u32_t)zfPhyCtrlToRate(retryRate));
}
zmw_leave_critical_section(dev);
zfApSendFailure(dev, rsp);
}
else
{
zmw_enter_critical_section(dev);
res = zfStaFindOppositeByMACAddr(dev, (u16_t*)rsp, &peerIdx);
if ( res == 0 )
{
zfRateCtrlTxFailEvent(dev, &wd->sta.oppositeInfo[peerIdx].rcCell, 0,(u32_t)zfPhyCtrlToRate(retryRate));
}
zmw_leave_critical_section(dev);
}
} //else if (event == 2) //Tx Fail event
else if (event == 3) //Tx Comp event
{
u32_t retryRate;
retryRate = (u32_t)(rsp[6]) + (((u32_t)(rsp[7]))<<8)
+ (((u32_t)(rsp[8]))<<16) + (((u32_t)(rsp[9]))<<24);
/* TODO : Tx completed, used for rate control probing */
if (wd->wlanMode == ZM_MODE_AP)
{
zmw_enter_critical_section(dev);
if ((i=zfApFindSta(dev, (u16_t*)rsp)) != 0xffff)
{
zfRateCtrlTxSuccessEvent(dev, &wd->ap.staTable[i].rcCell, zfPhyCtrlToRate(retryRate));
}
zmw_leave_critical_section(dev);
}
else
{
zmw_enter_critical_section(dev);
res = zfStaFindOppositeByMACAddr(dev, (u16_t*)rsp, &peerIdx);
if ( res == 0 )
{
zfRateCtrlTxSuccessEvent(dev, &wd->sta.oppositeInfo[peerIdx].rcCell, zfPhyCtrlToRate(retryRate));
}
zmw_leave_critical_section(dev);
}
} //else if (event == 3) //Tx Comp event
else if (event == 4) //BA failed count
{
u32_t fail;
u32_t rate;
peerIdx = 0;
fail=((u32_t*)rsp)[0] & 0xFFFF;
rate=((u32_t*)rsp)[0] >> 16;
if (rate > 15) {
rate = (rate & 0xF) + 12 + 2;
}
else {
rate = rate + 12;
}
zmw_enter_critical_section(dev);
zfRateCtrlTxFailEvent(dev, &wd->sta.oppositeInfo[peerIdx].rcCell, (u8_t)rate, fail);
zmw_leave_critical_section(dev);
}
}
void zfBeaconCfgInterrupt(zdev_t* dev, u8_t* rsp)
{
u32_t txBeaconCounter;
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
if ( wd->wlanMode == ZM_MODE_IBSS )
{
txBeaconCounter = *((u32_t *)rsp);
if ( wd->sta.beaconTxCnt != txBeaconCounter )
{
wd->sta.txBeaconInd = 1;
zmw_enter_critical_section(dev);
wd->tickIbssSendBeacon = 0;
zmw_leave_critical_section(dev);
}
else
{
wd->sta.txBeaconInd = 0;
}
#ifdef ZM_ENABLE_IBSS_DELAYED_JOIN_INDICATION
if ( wd->sta.txBeaconInd && wd->sta.ibssDelayedInd )
{
if (wd->zfcbIbssPartnerNotify != NULL)
{
wd->zfcbIbssPartnerNotify(dev, 1, &wd->sta.ibssDelayedIndEvent);
}
wd->sta.ibssDelayedInd = 0;
}
#endif
wd->sta.beaconTxCnt = txBeaconCounter;
// Need to check if the time is expired after ATIM window??
// Check if we have buffered any data for those stations that are sleeping
// If it's true, then transmitting ATIM pkt to notify them
#ifdef ZM_ENABLE_IBSS_PS
// TODO: Need to check if the station receive our ATIM pkt???
zfStaIbssPSSend(dev);
if ( wd->sta.atimWindow == 0 )
{
// We won't receive the end of ATIM isr so we fake it
zfPowerSavingMgrAtimWinExpired(dev);
}
#endif
}
}
void zfEndOfAtimWindowInterrupt(zdev_t* dev)
{
#ifdef ZM_ENABLE_IBSS_PS
zmw_get_wlan_dev(dev);
if ( wd->wlanMode == ZM_MODE_IBSS )
{
// Transmit any queued pkt for the stations!!
zfPowerSavingMgrAtimWinExpired(dev);
}
#endif
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,32 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef _CPRECOMP_H
#define _CPRECOMP_H
#include "../oal_dt.h"
#include "../oal_marc.h"
#include "pub_zfi.h"
#include "pub_zfw.h"
#include "pub_usb.h"
#include "wlan.h"
#include "struct.h"
#include "cfunc.h"
#include "cagg.h"
#include "cwm.h"
#include "performance.h"
#endif

View File

@ -0,0 +1,731 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/**
* The power saving manager is to save the power as much as possible.
* Generally speaking, it controls:
*
* - when to sleep
* -
*
*/
#include "cprecomp.h"
void zfPowerSavingMgrInit(zdev_t* dev)
{
zmw_get_wlan_dev(dev);
wd->sta.powerSaveMode = ZM_STA_PS_NONE;
wd->sta.psMgr.state = ZM_PS_MSG_STATE_ACTIVE;
wd->sta.psMgr.isSleepAllowed = 0;
wd->sta.psMgr.maxSleepPeriods = 1;
wd->sta.psMgr.ticks = 0;
wd->sta.psMgr.sleepAllowedtick = 0;
}
static u16_t zfPowerSavingMgrHandlePsNone(zdev_t* dev, u8_t *isWakeUpRequired)
{
u16_t ret = 0;
zmw_get_wlan_dev(dev);
switch(wd->sta.psMgr.state)
{
case ZM_PS_MSG_STATE_ACTIVE:
*isWakeUpRequired = 0;
break;
case ZM_PS_MSG_STATE_T1:
case ZM_PS_MSG_STATE_T2:
case ZM_PS_MSG_STATE_SLEEP:
default:
*isWakeUpRequired = 1;
zm_debug_msg0("zfPowerSavingMgrHandlePsNone: Wake up now\n");
if ( zfStaIsConnected(dev) )
{
zm_debug_msg0("zfPowerSavingMgrOnHandleT1 send Null data\n");
//zfSendNullData(dev, 0);
ret = 1;
}
wd->sta.psMgr.state = ZM_PS_MSG_STATE_ACTIVE;
break;
}
return ret;
}
static void zfPowerSavingMgrHandlePs(zdev_t* dev)
{
zmw_get_wlan_dev(dev);
switch(wd->sta.psMgr.state)
{
case ZM_PS_MSG_STATE_ACTIVE:
//zm_debug_msg0("zfPowerSavingMgrHandlePs: Prepare to sleep...\n");
//wd->sta.psMgr.state = ZM_PS_MSG_STATE_T1;
break;
case ZM_PS_MSG_STATE_T1:
case ZM_PS_MSG_STATE_T2:
case ZM_PS_MSG_STATE_SLEEP:
default:
break;
}
}
void zfPowerSavingMgrSetMode(zdev_t* dev, u8_t mode)
{
u16_t sendNull = 0;
u8_t isWakeUpRequired = 0;
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
zm_debug_msg1("mode = ", mode);
if (mode > ZM_STA_PS_LIGHT)
{
zm_debug_msg0("return - wrong power save mode");
return;
}
zmw_enter_critical_section(dev);
#if 1
switch(mode)
{
case ZM_STA_PS_NONE:
sendNull = zfPowerSavingMgrHandlePsNone(dev, &isWakeUpRequired);
break;
case ZM_STA_PS_FAST:
case ZM_STA_PS_LIGHT:
wd->sta.psMgr.maxSleepPeriods = 1;
zfPowerSavingMgrHandlePs(dev);
break;
case ZM_STA_PS_MAX:
wd->sta.psMgr.maxSleepPeriods = ZM_PS_MAX_SLEEP_PERIODS;
zfPowerSavingMgrHandlePs(dev);
break;
}
#else
switch(wd->sta.psMgr.state)
{
case ZM_PS_MSG_STATE_ACTIVE:
if ( mode != ZM_STA_PS_NONE )
{
zm_debug_msg0("zfPowerSavingMgrSetMode: switch from ZM_PS_MSG_STATE_ACTIVE to ZM_PS_MSG_STATE_T1\n");
// Stall the TX & start to wait the pending TX to be completed
wd->sta.psMgr.state = ZM_PS_MSG_STATE_T1;
}
break;
case ZM_PS_MSG_STATE_SLEEP:
break;
}
#endif
wd->sta.powerSaveMode = mode;
zmw_leave_critical_section(dev);
if ( isWakeUpRequired )
{
zfHpPowerSaveSetState(dev, 0);
wd->sta.psMgr.tempWakeUp = 0;
}
if ( zfStaIsConnected(dev)
&& (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) )
{
switch(mode)
{
case ZM_STA_PS_NONE:
zfHpPowerSaveSetMode(dev, 0, 0, wd->beaconInterval);
break;
case ZM_STA_PS_FAST:
case ZM_STA_PS_MAX:
case ZM_STA_PS_LIGHT:
zfHpPowerSaveSetMode(dev, 0, 1, wd->beaconInterval);
break;
default:
zfHpPowerSaveSetMode(dev, 0, 0, wd->beaconInterval);
break;
}
}
if (sendNull == 1)
{
zfSendNullData(dev, 0);
}
return;
}
static void zfPowerSavingMgrNotifyPSToAP(zdev_t *dev)
{
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
if ( (wd->sta.psMgr.tempWakeUp != 1)&&
(wd->sta.psMgr.lastTxUnicastFrm != wd->commTally.txUnicastFrm ||
wd->sta.psMgr.lastTxBroadcastFrm != wd->commTally.txBroadcastFrm ||
wd->sta.psMgr.lastTxMulticastFrm != wd->commTally.txMulticastFrm) )
{
zmw_enter_critical_section(dev);
wd->sta.psMgr.lastTxUnicastFrm = wd->commTally.txUnicastFrm;
wd->sta.psMgr.lastTxBroadcastFrm = wd->commTally.txBroadcastFrm;
wd->sta.psMgr.lastTxMulticastFrm = wd->commTally.txMulticastFrm;
zmw_leave_critical_section(dev);
zfSendNullData(dev, 1);
}
}
static void zfPowerSavingMgrOnHandleT1(zdev_t* dev)
{
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
// If the tx Q is not empty...return
if ( zfIsVtxqEmpty(dev) == FALSE )
{
return;
}
zm_debug_msg0("VtxQ is empty now...Check if HAL TXQ is empty\n");
// The the HAL TX Q is not empty...return
if ( zfHpGetFreeTxdCount(dev) != zfHpGetMaxTxdCount(dev) )
{
return;
}
zm_debug_msg0("HAL TXQ is empty now...Could go to sleep...\n");
zmw_enter_critical_section(dev);
if (wd->sta.powerSaveMode == ZM_STA_PS_LIGHT)
{
if (wd->sta.ReceivedPktRatePerSecond > 200)
{
zmw_leave_critical_section(dev);
return;
}
if ( zfStaIsConnected(dev)
&& (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) )
{
if (wd->sta.psMgr.sleepAllowedtick) {
wd->sta.psMgr.sleepAllowedtick--;
zmw_leave_critical_section(dev);
return;
}
}
}
wd->sta.psMgr.state = ZM_PS_MSG_STATE_T2;
zmw_leave_critical_section(dev);
// Send the Null pkt to AP to notify that I'm going to sleep
if ( zfStaIsConnected(dev) )
{
zm_debug_msg0("zfPowerSavingMgrOnHandleT1 send Null data\n");
zfPowerSavingMgrNotifyPSToAP(dev);
}
// Stall the TX now
// zfTxEngineStop(dev);
}
static void zfPowerSavingMgrOnHandleT2(zdev_t* dev)
{
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
// Wait until the Null pkt is transmitted
if ( zfHpGetFreeTxdCount(dev) != zfHpGetMaxTxdCount(dev) )
{
return;
}
zmw_enter_critical_section(dev);
wd->sta.psMgr.state = ZM_PS_MSG_STATE_SLEEP;
wd->sta.psMgr.lastTxUnicastFrm = wd->commTally.txUnicastFrm;
wd->sta.psMgr.lastTxBroadcastFrm = wd->commTally.txBroadcastFrm;
wd->sta.psMgr.lastTxMulticastFrm = wd->commTally.txMulticastFrm;
zmw_leave_critical_section(dev);
// Let CHIP sleep now
zm_debug_msg0("zfPowerSavingMgrOnHandleT2 zzzz....\n");
zfHpPowerSaveSetState(dev, 1);
wd->sta.psMgr.tempWakeUp = 0;
}
u8_t zfPowerSavingMgrIsSleeping(zdev_t *dev)
{
u8_t isSleeping = FALSE;
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
zmw_enter_critical_section(dev);
if ( wd->sta.psMgr.state == ZM_PS_MSG_STATE_SLEEP ||
wd->sta.psMgr.state == ZM_PS_MSG_STATE_T2)
{
isSleeping = TRUE;
}
zmw_leave_critical_section(dev);
return isSleeping;
}
static u8_t zfPowerSavingMgrIsIdle(zdev_t *dev)
{
u8_t isIdle = 0;
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
zmw_enter_critical_section(dev);
if ( zfStaIsConnected(dev) && wd->sta.psMgr.isSleepAllowed == 0 )
{
goto done;
}
if ( wd->sta.bChannelScan )
{
goto done;
}
if ( zfStaIsConnecting(dev) )
{
goto done;
}
if (wd->sta.powerSaveMode == ZM_STA_PS_LIGHT)
{
if (wd->sta.ReceivedPktRatePerSecond > 200)
{
goto done;
}
if ( zfStaIsConnected(dev)
&& (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) )
{
if (wd->sta.psMgr.sleepAllowedtick) {
wd->sta.psMgr.sleepAllowedtick--;
goto done;
}
}
}
isIdle = 1;
done:
zmw_leave_critical_section(dev);
if ( zfIsVtxqEmpty(dev) == FALSE )
{
isIdle = 0;
}
return isIdle;
}
static void zfPowerSavingMgrSleepIfIdle(zdev_t *dev)
{
u8_t isIdle;
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
isIdle = zfPowerSavingMgrIsIdle(dev);
if ( isIdle == 0 )
{
return;
}
zmw_enter_critical_section(dev);
switch(wd->sta.powerSaveMode)
{
case ZM_STA_PS_NONE:
break;
case ZM_STA_PS_MAX:
case ZM_STA_PS_FAST:
case ZM_STA_PS_LIGHT:
zm_debug_msg0("zfPowerSavingMgrSleepIfIdle: IDLE so slep now...\n");
wd->sta.psMgr.state = ZM_PS_MSG_STATE_T1;
break;
}
zmw_leave_critical_section(dev);
}
static void zfPowerSavingMgrDisconnectMain(zdev_t* dev)
{
zmw_get_wlan_dev(dev);
#ifdef ZM_ENABLE_DISCONNECT_PS
switch(wd->sta.psMgr.state)
{
case ZM_PS_MSG_STATE_ACTIVE:
zfPowerSavingMgrSleepIfIdle(dev);
break;
case ZM_PS_MSG_STATE_SLEEP:
break;
case ZM_PS_MSG_STATE_T1:
zfPowerSavingMgrOnHandleT1(dev);
break;
case ZM_PS_MSG_STATE_T2:
zfPowerSavingMgrOnHandleT2(dev);
break;
}
#else
zfPowerSavingMgrWakeup(dev);
#endif
}
static void zfPowerSavingMgrInfraMain(zdev_t* dev)
{
zmw_get_wlan_dev(dev);
switch(wd->sta.psMgr.state)
{
case ZM_PS_MSG_STATE_ACTIVE:
zfPowerSavingMgrSleepIfIdle(dev);
break;
case ZM_PS_MSG_STATE_SLEEP:
break;
case ZM_PS_MSG_STATE_T1:
zfPowerSavingMgrOnHandleT1(dev);
break;
case ZM_PS_MSG_STATE_T2:
zfPowerSavingMgrOnHandleT2(dev);
break;
}
}
void zfPowerSavingMgrAtimWinExpired(zdev_t* dev)
{
zmw_get_wlan_dev(dev);
//printk("zfPowerSavingMgrAtimWinExpired #1\n");
if ( wd->sta.powerSaveMode == ZM_STA_PS_NONE )
{
return;
}
//printk("zfPowerSavingMgrAtimWinExpired #2\n");
// if we received any ATIM window from the others to indicate we have buffered data
// at the other station, we can't go to sleep
if ( wd->sta.recvAtim )
{
wd->sta.recvAtim = 0;
zm_debug_msg0("Can't sleep due to receving ATIM window!");
return;
}
// if we are the one to tx beacon during last beacon interval. we can't go to sleep
// since we need to be alive to respond the probe request!
if ( wd->sta.txBeaconInd )
{
zm_debug_msg0("Can't sleep due to just transmit a beacon!");
return;
}
// If we buffer any data for the other stations. we could not go to sleep
if ( wd->sta.ibssPrevPSDataCount != 0 )
{
zm_debug_msg0("Can't sleep due to buffering data for the others!");
return;
}
// before sleeping, we still need to notify the others by transmitting null
// pkt with power mgmt bit turned on.
zfPowerSavingMgrOnHandleT1(dev);
}
static void zfPowerSavingMgrIBSSMain(zdev_t* dev)
{
// wait for the end of
// if need to wait to know if we are the one to transmit the beacon
// during the beacon interval. If it's me, we can't go to sleep.
zmw_get_wlan_dev(dev);
switch(wd->sta.psMgr.state)
{
case ZM_PS_MSG_STATE_ACTIVE:
case ZM_PS_MSG_STATE_SLEEP:
case ZM_PS_MSG_STATE_T1:
break;
case ZM_PS_MSG_STATE_T2:
zfPowerSavingMgrOnHandleT2(dev);
break;
}
return;
}
#if 1
void zfPowerSavingMgrMain(zdev_t* dev)
{
zmw_get_wlan_dev(dev);
switch (wd->sta.adapterState)
{
case ZM_STA_STATE_DISCONNECT:
zfPowerSavingMgrDisconnectMain(dev);
break;
case ZM_STA_STATE_CONNECTED:
{
if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) {
zfPowerSavingMgrInfraMain(dev);
} else if (wd->wlanMode == ZM_MODE_IBSS) {
zfPowerSavingMgrIBSSMain(dev);
}
}
break;
case ZM_STA_STATE_CONNECTING:
default:
break;
}
}
#else
void zfPowerSavingMgrMain(zdev_t* dev)
{
zmw_get_wlan_dev(dev);
if ( wd->wlanMode != ZM_MODE_INFRASTRUCTURE )
{
return;
}
switch(wd->sta.psMgr.state)
{
case ZM_PS_MSG_STATE_ACTIVE:
goto check_sleep;
break;
case ZM_PS_MSG_STATE_SLEEP:
goto sleeping;
break;
case ZM_PS_MSG_STATE_T1:
zfPowerSavingMgrOnHandleT1(dev);
break;
case ZM_PS_MSG_STATE_T2:
zfPowerSavingMgrOnHandleT2(dev);
break;
}
return;
sleeping:
return;
check_sleep:
zfPowerSavingMgrSleepIfIdle(dev);
return;
}
#endif
#ifdef ZM_ENABLE_POWER_SAVE
void zfPowerSavingMgrWakeup(zdev_t* dev)
{
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
//zm_debug_msg0("zfPowerSavingMgrWakeup");
//if ( wd->sta.psMgr.state != ZM_PS_MSG_STATE_ACTIVE && ( zfPowerSavingMgrIsIdle(dev) == 0 ))
if ( wd->sta.psMgr.state != ZM_PS_MSG_STATE_ACTIVE )
{
zmw_enter_critical_section(dev);
wd->sta.psMgr.isSleepAllowed = 0;
wd->sta.psMgr.state = ZM_PS_MSG_STATE_ACTIVE;
if ( wd->sta.powerSaveMode > ZM_STA_PS_NONE )
wd->sta.psMgr.tempWakeUp = 1;
zmw_leave_critical_section(dev);
// Wake up the CHIP now!!
zfHpPowerSaveSetState(dev, 0);
}
}
#else
void zfPowerSavingMgrWakeup(zdev_t* dev)
{
}
#endif
void zfPowerSavingMgrProcessBeacon(zdev_t* dev, zbuf_t* buf)
{
u8_t length, bitmap;
u16_t offset, n1, n2, q, r;
zbuf_t* psBuf;
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
if ( wd->sta.powerSaveMode == ZM_STA_PS_NONE )
//if ( wd->sta.psMgr.state != ZM_PS_MSG_STATE_SLEEP )
{
return;
}
wd->sta.psMgr.isSleepAllowed = 1;
if ( (offset=zfFindElement(dev, buf, ZM_WLAN_EID_TIM)) != 0xffff )
{
length = zmw_rx_buf_readb(dev, buf, offset+1);
if ( length > 3 )
{
n1 = zmw_rx_buf_readb(dev, buf, offset+4) & (~ZM_BIT_0);
n2 = length + n1 - 4;
q = wd->sta.aid >> 3;
r = wd->sta.aid & 7;
if ((q >= n1) && (q <= n2))
{
bitmap = zmw_rx_buf_readb(dev, buf, offset+5+q-n1);
if ( (bitmap >> r) & ZM_BIT_0 )
{
//if ( wd->sta.powerSaveMode == ZM_STA_PS_FAST )
if ( 0 )
{
wd->sta.psMgr.state = ZM_PS_MSG_STATE_S1;
//zfSendPSPoll(dev);
zfSendNullData(dev, 0);
}
else
{
if ((wd->sta.qosInfo&0xf) != 0xf)
{
/* send ps-poll */
//printk("zfSendPSPoll #1\n");
wd->sta.psMgr.isSleepAllowed = 0;
switch (wd->sta.powerSaveMode)
{
case ZM_STA_PS_MAX:
case ZM_STA_PS_FAST:
//zm_debug_msg0("wake up and send PS-Poll\n");
zfSendPSPoll(dev);
break;
case ZM_STA_PS_LIGHT:
zm_debug_msg0("wake up and send null data\n");
zmw_enter_critical_section(dev);
wd->sta.psMgr.sleepAllowedtick = 400;
zmw_leave_critical_section(dev);
zfSendNullData(dev, 0);
break;
}
wd->sta.psMgr.tempWakeUp = 0;
}
}
}
}
}
}
while ((psBuf = zfQueueGet(dev, wd->sta.uapsdQ)) != NULL)
{
zfTxSendEth(dev, psBuf, 0, ZM_EXTERNAL_ALLOC_BUF, 0);
}
//printk("zfPowerSavingMgrProcessBeacon #1\n");
zfPowerSavingMgrMain(dev);
}
void zfPowerSavingMgrConnectNotify(zdev_t *dev)
{
zmw_get_wlan_dev(dev);
if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
{
switch(wd->sta.powerSaveMode)
{
case ZM_STA_PS_NONE:
zfHpPowerSaveSetMode(dev, 0, 0, wd->beaconInterval);
break;
case ZM_STA_PS_FAST:
case ZM_STA_PS_MAX:
case ZM_STA_PS_LIGHT:
zfHpPowerSaveSetMode(dev, 0, 1, wd->beaconInterval);
break;
default:
zfHpPowerSaveSetMode(dev, 0, 0, wd->beaconInterval);
break;
}
}
}
void zfPowerSavingMgrPreTBTTInterrupt(zdev_t *dev)
{
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
/* disable TBTT interrupt when change from connection to disconnect */
if (zfStaIsDisconnect(dev)) {
zfHpPowerSaveSetMode(dev, 0, 0, 0);
zfPowerSavingMgrWakeup(dev);
return;
}
zmw_enter_critical_section(dev);
wd->sta.psMgr.ticks++;
if ( wd->sta.psMgr.ticks < wd->sta.psMgr.maxSleepPeriods )
{
zmw_leave_critical_section(dev);
return;
}
else
{
wd->sta.psMgr.ticks = 0;
}
zmw_leave_critical_section(dev);
zfPowerSavingMgrWakeup(dev);
}
/* Leave an empty line below to remove warning message on some compiler */

View File

@ -0,0 +1,535 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "cprecomp.h"
void zfScanMgrInit(zdev_t* dev)
{
zmw_get_wlan_dev(dev);
wd->sta.scanMgr.scanReqs[0] = 0;
wd->sta.scanMgr.scanReqs[1] = 0;
wd->sta.scanMgr.currScanType = ZM_SCAN_MGR_SCAN_NONE;
wd->sta.scanMgr.scanStartDelay = 3;
//wd->sta.scanMgr.scanStartDelay = 0;
}
u8_t zfScanMgrScanStart(zdev_t* dev, u8_t scanType)
{
u8_t i;
zmw_get_wlan_dev(dev);
zm_debug_msg1("scanType = ", scanType);
zmw_declare_for_critical_section();
if ( scanType != ZM_SCAN_MGR_SCAN_INTERNAL &&
scanType != ZM_SCAN_MGR_SCAN_EXTERNAL )
{
zm_debug_msg0("unknown scanType");
return 1;
}
else if (zfStaIsConnecting(dev))
{
zm_debug_msg0("reject scan request due to connecting");
return 1;
}
i = scanType - 1;
zmw_enter_critical_section(dev);
if ( wd->sta.scanMgr.scanReqs[i] == 1 )
{
zm_debug_msg1("scan rescheduled", scanType);
goto scan_done;
}
wd->sta.scanMgr.scanReqs[i] = 1;
zm_debug_msg1("scan scheduled: ", scanType);
// If there's no scan pending, we do the scan right away.
// If there's an internal scan and the new scan request is external one,
// we will restart the scan.
if ( wd->sta.scanMgr.currScanType == ZM_SCAN_MGR_SCAN_NONE )
{
goto schedule_scan;
}
else if ( wd->sta.scanMgr.currScanType == ZM_SCAN_MGR_SCAN_INTERNAL &&
scanType == ZM_SCAN_MGR_SCAN_EXTERNAL )
{
// Stop the internal scan & schedule external scan first
zfTimerCancel(dev, ZM_EVENT_SCAN);
/* Fix for WHQL sendrecv => we do not apply delay time in which the device
stop transmitting packet when we already connect to some AP */
wd->sta.bScheduleScan = FALSE;
zfTimerCancel(dev, ZM_EVENT_TIMEOUT_SCAN);
zfTimerCancel(dev, ZM_EVENT_IN_SCAN);
wd->sta.bChannelScan = FALSE;
goto schedule_scan;
}
else
{
zm_debug_msg0("Scan is busy...waiting later to start\n");
}
zmw_leave_critical_section(dev);
return 0;
scan_done:
zmw_leave_critical_section(dev);
return 1;
schedule_scan:
wd->sta.bScheduleScan = TRUE;
zfTimerSchedule(dev, ZM_EVENT_SCAN, wd->sta.scanMgr.scanStartDelay);
wd->sta.scanMgr.scanStartDelay = 3;
//wd->sta.scanMgr.scanStartDelay = 0;
wd->sta.scanMgr.currScanType = scanType;
zmw_leave_critical_section(dev);
if ((zfStaIsConnected(dev)) && (!zfPowerSavingMgrIsSleeping(dev)))
{
zfSendNullData(dev, 1);
}
return 0;
}
void zfScanMgrScanStop(zdev_t* dev, u8_t scanType)
{
u8_t scanNotifyRequired = 0;
u8_t theOtherScan = ZM_SCAN_MGR_SCAN_NONE;
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
zmw_enter_critical_section(dev);
if ( wd->sta.scanMgr.currScanType == ZM_SCAN_MGR_SCAN_NONE )
{
zm_assert(wd->sta.scanMgr.scanReqs[0] == 0);
zm_assert(wd->sta.scanMgr.scanReqs[1] == 0);
goto done;
}
switch(scanType)
{
case ZM_SCAN_MGR_SCAN_EXTERNAL:
scanNotifyRequired = 1;
theOtherScan = ZM_SCAN_MGR_SCAN_INTERNAL;
break;
case ZM_SCAN_MGR_SCAN_INTERNAL:
theOtherScan = ZM_SCAN_MGR_SCAN_EXTERNAL;
break;
default:
goto done;
}
if ( wd->sta.scanMgr.currScanType != scanType )
{
goto stop_done;
}
zfTimerCancel(dev, ZM_EVENT_SCAN);
/* Fix for WHQL sendrecv => we do not apply delay time in which the device
stop transmitting packet when we already connect to some AP */
wd->sta.bScheduleScan = FALSE;
zfTimerCancel(dev, ZM_EVENT_TIMEOUT_SCAN);
zfTimerCancel(dev, ZM_EVENT_IN_SCAN);
wd->sta.bChannelScan = FALSE;
wd->sta.scanFrequency = 0;
if ( wd->sta.scanMgr.scanReqs[theOtherScan - 1] )
{
wd->sta.scanMgr.currScanType = theOtherScan;
// Schedule the other scan after 1 second later
zfTimerSchedule(dev, ZM_EVENT_SCAN, 100);
}
else
{
wd->sta.scanMgr.currScanType = ZM_SCAN_MGR_SCAN_NONE;
}
stop_done:
wd->sta.scanMgr.scanReqs[scanType - 1] = 0;
zmw_leave_critical_section(dev);
/* avoid lose receive packet when site survey */
if ((zfStaIsConnected(dev)) && (!zfPowerSavingMgrIsSleeping(dev)))
{
zfSendNullData(dev, 0);
}
if ( scanNotifyRequired )
{
zm_debug_msg0("Scan notify after reset");
if (wd->zfcbScanNotify != NULL)
{
wd->zfcbScanNotify(dev, NULL);
}
}
return;
done:
zmw_leave_critical_section(dev);
return;
}
void zfScanMgrScanAck(zdev_t* dev)
{
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
zmw_enter_critical_section(dev);
wd->sta.scanMgr.scanStartDelay = 3;
//wd->sta.scanMgr.scanStartDelay = 0;
zmw_leave_critical_section(dev);
return;
}
extern void zfStaReconnect(zdev_t* dev);
static void zfScanSendProbeRequest(zdev_t* dev)
{
u8_t k;
u16_t dst[3] = { 0xffff, 0xffff, 0xffff };
zmw_get_wlan_dev(dev);
/* Increase rxBeaconCount to prevent beacon lost */
if (zfStaIsConnected(dev))
{
wd->sta.rxBeaconCount++;
}
if ( wd->sta.bPassiveScan )
{
return;
}
/* enable 802.l11h and in DFS Band , disable sending probe request */
if (wd->sta.DFSEnable)
{
if (zfHpIsDfsChannel(dev, wd->sta.scanFrequency))
{
return;
}
}
zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_PROBEREQ, dst, 0, 0, 0);
if ( wd->sta.disableProbingWithSsid )
{
return;
}
for (k=1; k<=ZM_MAX_PROBE_HIDDEN_SSID_SIZE; k++)
{
if ( wd->ws.probingSsidList[k-1].ssidLen != 0 )
{
zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_PROBEREQ, dst, k, 0, 0);
}
}
}
static void zfScanMgrEventSetFreqCompleteCb(zdev_t* dev)
{
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
//printk("zfScanMgrEventSetFreqCompleteCb #1\n");
zmw_enter_critical_section(dev);
zfTimerSchedule(dev, ZM_EVENT_IN_SCAN, ZM_TICK_IN_SCAN);
if (wd->sta.bPassiveScan)
{
zfTimerSchedule(dev, ZM_EVENT_TIMEOUT_SCAN, wd->sta.passiveScanTickPerChannel);
}
else
{
zfTimerSchedule(dev, ZM_EVENT_TIMEOUT_SCAN, wd->sta.activescanTickPerChannel);
}
zmw_leave_critical_section(dev);
zfScanSendProbeRequest(dev);
}
static void zfScanMgrEventScanCompleteCb(zdev_t* dev)
{
zmw_get_wlan_dev(dev);
if ((zfStaIsConnected(dev)) && (!zfPowerSavingMgrIsSleeping(dev)))
{
zfSendNullData(dev, 0);
}
return;
}
void zfScanMgrScanEventRetry(zdev_t* dev)
{
zmw_get_wlan_dev(dev);
if ( !wd->sta.bChannelScan )
{
return;
}
if ( !wd->sta.bPassiveScan )
{
zfScanSendProbeRequest(dev);
#if 0
zmw_enter_critical_section(dev);
zfTimerSchedule(dev, ZM_EVENT_IN_SCAN, ZM_TICK_IN_SCAN);
zmw_leave_critical_section(dev);
#endif
}
}
u8_t zfScanMgrScanEventTimeout(zdev_t* dev)
{
u16_t nextScanFrequency = 0;
u8_t temp;
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
zmw_enter_critical_section(dev);
if ( wd->sta.scanFrequency == 0 )
{
zmw_leave_critical_section(dev);
return -1;
}
nextScanFrequency = zfChGetNextChannel(dev, wd->sta.scanFrequency,
&wd->sta.bPassiveScan);
if ( (nextScanFrequency == 0xffff)
|| (wd->sta.scanFrequency == zfChGetLastChannel(dev, &temp)) )
{
u8_t currScanType;
u8_t isExternalScan = 0;
u8_t isInternalScan = 0;
//zm_debug_msg1("end scan = ", KeQueryInterruptTime());
wd->sta.scanFrequency = 0;
zm_debug_msg1("scan 1 type: ", wd->sta.scanMgr.currScanType);
zm_debug_msg1("scan channel count = ", wd->regulationTable.allowChannelCnt);
//zfBssInfoRefresh(dev);
zfTimerCancel(dev, ZM_EVENT_TIMEOUT_SCAN);
if ( wd->sta.bChannelScan == FALSE )
{
zm_debug_msg0("WOW!! scan is cancelled\n");
zmw_leave_critical_section(dev);
goto report_scan_result;
}
currScanType = wd->sta.scanMgr.currScanType;
switch(currScanType)
{
case ZM_SCAN_MGR_SCAN_EXTERNAL:
isExternalScan = 1;
if ( wd->sta.scanMgr.scanReqs[ZM_SCAN_MGR_SCAN_INTERNAL - 1] )
{
wd->sta.scanMgr.scanReqs[ZM_SCAN_MGR_SCAN_INTERNAL - 1] = 0;
isInternalScan = 1;
}
break;
case ZM_SCAN_MGR_SCAN_INTERNAL:
isInternalScan = 1;
if ( wd->sta.scanMgr.scanReqs[ZM_SCAN_MGR_SCAN_EXTERNAL - 1] )
{
// Because the external scan should pre-empts internal scan.
// So this shall not be happened!!
zm_assert(0);
}
break;
default:
zm_assert(0);
break;
}
wd->sta.scanMgr.scanReqs[currScanType - 1] = 0;
wd->sta.scanMgr.scanStartDelay = 100;
wd->sta.scanMgr.currScanType = ZM_SCAN_MGR_SCAN_NONE;
zmw_leave_critical_section(dev);
//Set channel according to AP's configuration
zfCoreSetFrequencyEx(dev, wd->frequency, wd->BandWidth40,
wd->ExtOffset, zfScanMgrEventScanCompleteCb);
wd->sta.bChannelScan = FALSE;
#if 1
if (zfStaIsConnected(dev))
{ // Finish site survey, reset the variable to detect using wrong frequency !
zfHpFinishSiteSurvey(dev, 1);
zmw_enter_critical_section(dev);
wd->sta.ibssSiteSurveyStatus = 2;
wd->tickIbssReceiveBeacon = 0;
wd->sta.ibssReceiveBeaconCount = 0;
zmw_leave_critical_section(dev);
/* #5 Re-enable RIFS function after the site survey ! */
/* This is because switch band will reset the BB register to initial value */
if( wd->sta.rifsState == ZM_RIFS_STATE_DETECTED )
{
zfHpEnableRifs(dev, ((wd->sta.currentFrequency<3000)?1:0), wd->sta.EnableHT, wd->sta.HT2040);
}
}
else
{
zfHpFinishSiteSurvey(dev, 0);
zmw_enter_critical_section(dev);
wd->sta.ibssSiteSurveyStatus = 0;
zmw_leave_critical_section(dev);
}
#endif
report_scan_result:
/* avoid lose receive packet when site survey */
//if ((zfStaIsConnected(dev)) && (!zfPowerSavingMgrIsSleeping(dev)))
//{
// zfSendNullData(dev, 0);
//}
if ( isExternalScan )//Quickly reboot
{
if (wd->zfcbScanNotify != NULL)
{
wd->zfcbScanNotify(dev, NULL);
}
}
if ( isInternalScan )
{
//wd->sta.InternalScanReq = 0;
zfStaReconnect(dev);
}
return 0;
}
else
{
wd->sta.scanFrequency = nextScanFrequency;
//zmw_enter_critical_section(dev);
zfTimerCancel(dev, ZM_EVENT_IN_SCAN);
zmw_leave_critical_section(dev);
zm_debug_msg0("scan 2");
zfCoreSetFrequencyV2(dev, wd->sta.scanFrequency, zfScanMgrEventSetFreqCompleteCb);
return 1;
}
}
void zfScanMgrScanEventStart(zdev_t* dev)
{
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
if ( wd->sta.bChannelScan )
{
return;
}
zfPowerSavingMgrWakeup(dev);
zmw_enter_critical_section(dev);
if ( wd->sta.scanMgr.currScanType == ZM_SCAN_MGR_SCAN_NONE )
{
goto no_scan;
}
//zfBssInfoRefresh(dev);
zfBssInfoRefresh(dev, 0);
wd->sta.bChannelScan = TRUE;
wd->sta.bScheduleScan = FALSE;
zfTimerCancel(dev, ZM_EVENT_IN_SCAN);
zfTimerCancel(dev, ZM_EVENT_TIMEOUT_SCAN);
//zm_debug_msg1("start scan = ", KeQueryInterruptTime());
wd->sta.scanFrequency = zfChGetFirstChannel(dev, &wd->sta.bPassiveScan);
zmw_leave_critical_section(dev);
/* avoid lose receive packet when site survey */
//if ((zfStaIsConnected(dev)) && (!zfPowerSavingMgrIsSleeping(dev)))
//{
// zfSendNullData(dev, 1);
//}
// zm_debug_msg0("scan 0");
// zfCoreSetFrequencyV2(dev, wd->sta.scanFrequency, zfScanMgrEventSetFreqCompleteCb);
#if 1
if (zfStaIsConnected(dev))
{// If doing site survey !
zfHpBeginSiteSurvey(dev, 1);
zmw_enter_critical_section(dev);
wd->sta.ibssSiteSurveyStatus = 1;
zmw_leave_critical_section(dev);
}
else
{
zfHpBeginSiteSurvey(dev, 0);
zmw_enter_critical_section(dev);
wd->sta.ibssSiteSurveyStatus = 0;
zmw_leave_critical_section(dev);
}
#endif
zm_debug_msg0("scan 0");
zfCoreSetFrequencyV2(dev, wd->sta.scanFrequency, zfScanMgrEventSetFreqCompleteCb);
return;
no_scan:
zmw_leave_critical_section(dev);
return;
}

View File

@ -0,0 +1,598 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* */
/* Module Name : ctkip.c */
/* */
/* Abstract */
/* This module contains Tx and Rx functions. */
/* */
/* NOTES */
/* None */
/* */
/************************************************************************/
#include "cprecomp.h"
u16_t zgTkipSboxLower[256] =
{
0xA5,0x84,0x99,0x8D,0x0D,0xBD,0xB1,0x54,
0x50,0x03,0xA9,0x7D,0x19,0x62,0xE6,0x9A,
0x45,0x9D,0x40,0x87,0x15,0xEB,0xC9,0x0B,
0xEC,0x67,0xFD,0xEA,0xBF,0xF7,0x96,0x5B,
0xC2,0x1C,0xAE,0x6A,0x5A,0x41,0x02,0x4F,
0x5C,0xF4,0x34,0x08,0x93,0x73,0x53,0x3F,
0x0C,0x52,0x65,0x5E,0x28,0xA1,0x0F,0xB5,
0x09,0x36,0x9B,0x3D,0x26,0x69,0xCD,0x9F,
0x1B,0x9E,0x74,0x2E,0x2D,0xB2,0xEE,0xFB,
0xF6,0x4D,0x61,0xCE,0x7B,0x3E,0x71,0x97,
0xF5,0x68,0x00,0x2C,0x60,0x1F,0xC8,0xED,
0xBE,0x46,0xD9,0x4B,0xDE,0xD4,0xE8,0x4A,
0x6B,0x2A,0xE5,0x16,0xC5,0xD7,0x55,0x94,
0xCF,0x10,0x06,0x81,0xF0,0x44,0xBA,0xE3,
0xF3,0xFE,0xC0,0x8A,0xAD,0xBC,0x48,0x04,
0xDF,0xC1,0x75,0x63,0x30,0x1A,0x0E,0x6D,
0x4C,0x14,0x35,0x2F,0xE1,0xA2,0xCC,0x39,
0x57,0xF2,0x82,0x47,0xAC,0xE7,0x2B,0x95,
0xA0,0x98,0xD1,0x7F,0x66,0x7E,0xAB,0x83,
0xCA,0x29,0xD3,0x3C,0x79,0xE2,0x1D,0x76,
0x3B,0x56,0x4E,0x1E,0xDB,0x0A,0x6C,0xE4,
0x5D,0x6E,0xEF,0xA6,0xA8,0xA4,0x37,0x8B,
0x32,0x43,0x59,0xB7,0x8C,0x64,0xD2,0xE0,
0xB4,0xFA,0x07,0x25,0xAF,0x8E,0xE9,0x18,
0xD5,0x88,0x6F,0x72,0x24,0xF1,0xC7,0x51,
0x23,0x7C,0x9C,0x21,0xDD,0xDC,0x86,0x85,
0x90,0x42,0xC4,0xAA,0xD8,0x05,0x01,0x12,
0xA3,0x5F,0xF9,0xD0,0x91,0x58,0x27,0xB9,
0x38,0x13,0xB3,0x33,0xBB,0x70,0x89,0xA7,
0xB6,0x22,0x92,0x20,0x49,0xFF,0x78,0x7A,
0x8F,0xF8,0x80,0x17,0xDA,0x31,0xC6,0xB8,
0xC3,0xB0,0x77,0x11,0xCB,0xFC,0xD6,0x3A
};
u16_t zgTkipSboxUpper[256] =
{
0xC6,0xF8,0xEE,0xF6,0xFF,0xD6,0xDE,0x91,
0x60,0x02,0xCE,0x56,0xE7,0xB5,0x4D,0xEC,
0x8F,0x1F,0x89,0xFA,0xEF,0xB2,0x8E,0xFB,
0x41,0xB3,0x5F,0x45,0x23,0x53,0xE4,0x9B,
0x75,0xE1,0x3D,0x4C,0x6C,0x7E,0xF5,0x83,
0x68,0x51,0xD1,0xF9,0xE2,0xAB,0x62,0x2A,
0x08,0x95,0x46,0x9D,0x30,0x37,0x0A,0x2F,
0x0E,0x24,0x1B,0xDF,0xCD,0x4E,0x7F,0xEA,
0x12,0x1D,0x58,0x34,0x36,0xDC,0xB4,0x5B,
0xA4,0x76,0xB7,0x7D,0x52,0xDD,0x5E,0x13,
0xA6,0xB9,0x00,0xC1,0x40,0xE3,0x79,0xB6,
0xD4,0x8D,0x67,0x72,0x94,0x98,0xB0,0x85,
0xBB,0xC5,0x4F,0xED,0x86,0x9A,0x66,0x11,
0x8A,0xE9,0x04,0xFE,0xA0,0x78,0x25,0x4B,
0xA2,0x5D,0x80,0x05,0x3F,0x21,0x70,0xF1,
0x63,0x77,0xAF,0x42,0x20,0xE5,0xFD,0xBF,
0x81,0x18,0x26,0xC3,0xBE,0x35,0x88,0x2E,
0x93,0x55,0xFC,0x7A,0xC8,0xBA,0x32,0xE6,
0xC0,0x19,0x9E,0xA3,0x44,0x54,0x3B,0x0B,
0x8C,0xC7,0x6B,0x28,0xA7,0xBC,0x16,0xAD,
0xDB,0x64,0x74,0x14,0x92,0x0C,0x48,0xB8,
0x9F,0xBD,0x43,0xC4,0x39,0x31,0xD3,0xF2,
0xD5,0x8B,0x6E,0xDA,0x01,0xB1,0x9C,0x49,
0xD8,0xAC,0xF3,0xCF,0xCA,0xF4,0x47,0x10,
0x6F,0xF0,0x4A,0x5C,0x38,0x57,0x73,0x97,
0xCB,0xA1,0xE8,0x3E,0x96,0x61,0x0D,0x0F,
0xE0,0x7C,0x71,0xCC,0x90,0x06,0xF7,0x1C,
0xC2,0x6A,0xAE,0x69,0x17,0x99,0x3A,0x27,
0xD9,0xEB,0x2B,0x22,0xD2,0xA9,0x07,0x33,
0x2D,0x3C,0x15,0xC9,0x87,0xAA,0x50,0xA5,
0x03,0x59,0x09,0x1A,0x65,0xD7,0x84,0xD0,
0x82,0x29,0x5A,0x1E,0x7B,0xA8,0x6D,0x2C
};
u16_t zfrotr1(u16_t a)
// rotate right by 1 bit.
{
u16_t b;
if (a & 0x01)
{
b = (a >> 1) | 0x8000;
}
else
{
b = (a >> 1) & 0x7fff;
}
return b;
}
/*************************************************************/
/* zfTkipSbox() */
/* Returns a 16 bit value from a 64K entry table. The Table */
/* is synthesized from two 256 entry byte wide tables. */
/*************************************************************/
u16_t zfTkipSbox(u16_t index)
{
u16_t low;
u16_t high;
u16_t left, right;
low = (index & 0xFF);
high = ((index >> 8) & 0xFF);
left = zgTkipSboxLower[low] + (zgTkipSboxUpper[low] << 8 );
right = zgTkipSboxUpper[high] + (zgTkipSboxLower[high] << 8 );
return (left ^ right);
}
u8_t zfTkipPhase1KeyMix(u32_t iv32, struct zsTkipSeed* pSeed)
{
u16_t tsc0;
u16_t tsc1;
u16_t i, j;
#if 0
/* Need not proceed this function with the same iv32 */
if ( iv32 == pSeed->iv32 )
{
return 1;
}
#endif
tsc0 = (u16_t) ((iv32 >> 16) & 0xffff); /* msb */
tsc1 = (u16_t) (iv32 & 0xffff);
/* Phase 1, step 1 */
pSeed->ttak[0] = tsc1;
pSeed->ttak[1] = tsc0;
pSeed->ttak[2] = (u16_t) (pSeed->ta[0] + (pSeed->ta[1] <<8));
pSeed->ttak[3] = (u16_t) (pSeed->ta[2] + (pSeed->ta[3] <<8));
pSeed->ttak[4] = (u16_t) (pSeed->ta[4] + (pSeed->ta[5] <<8));
/* Phase 1, step 2 */
for (i=0; i<8; i++)
{
j = 2*(i & 1);
pSeed->ttak[0] =(pSeed->ttak[0] + zfTkipSbox(pSeed->ttak[4]
^ ZM_BYTE_TO_WORD(pSeed->tk[1+j], pSeed->tk[j])))
& 0xffff;
pSeed->ttak[1] =(pSeed->ttak[1] + zfTkipSbox(pSeed->ttak[0]
^ ZM_BYTE_TO_WORD(pSeed->tk[5+j], pSeed->tk[4+j] )))
& 0xffff;
pSeed->ttak[2] =(pSeed->ttak[2] + zfTkipSbox(pSeed->ttak[1]
^ ZM_BYTE_TO_WORD(pSeed->tk[9+j], pSeed->tk[8+j] )))
& 0xffff;
pSeed->ttak[3] =(pSeed->ttak[3] + zfTkipSbox(pSeed->ttak[2]
^ ZM_BYTE_TO_WORD(pSeed->tk[13+j], pSeed->tk[12+j])))
& 0xffff;
pSeed->ttak[4] =(pSeed->ttak[4] + zfTkipSbox(pSeed->ttak[3]
^ ZM_BYTE_TO_WORD(pSeed->tk[1+j], pSeed->tk[j] )))
& 0xffff;
pSeed->ttak[4] =(pSeed->ttak[4] + i) & 0xffff;
}
if ( iv32 == (pSeed->iv32+1) )
{
pSeed->iv32tmp = iv32;
return 1;
}
return 0;
}
u8_t zfTkipPhase2KeyMix(u16_t iv16, struct zsTkipSeed* pSeed)
{
u16_t tsc2;
tsc2 = iv16;
/* Phase 2, Step 1 */
pSeed->ppk[0] = pSeed->ttak[0];
pSeed->ppk[1] = pSeed->ttak[1];
pSeed->ppk[2] = pSeed->ttak[2];
pSeed->ppk[3] = pSeed->ttak[3];
pSeed->ppk[4] = pSeed->ttak[4];
pSeed->ppk[5] = (pSeed->ttak[4] + tsc2) & 0xffff;
/* Phase2, Step 2 */
pSeed->ppk[0] = pSeed->ppk[0]
+ zfTkipSbox(pSeed->ppk[5] ^ ZM_BYTE_TO_WORD(pSeed->tk[1],pSeed->tk[0]));
pSeed->ppk[1] = pSeed->ppk[1]
+ zfTkipSbox(pSeed->ppk[0] ^ ZM_BYTE_TO_WORD(pSeed->tk[3],pSeed->tk[2]));
pSeed->ppk[2] = pSeed->ppk[2]
+ zfTkipSbox(pSeed->ppk[1] ^ ZM_BYTE_TO_WORD(pSeed->tk[5],pSeed->tk[4]));
pSeed->ppk[3] = pSeed->ppk[3]
+ zfTkipSbox(pSeed->ppk[2] ^ ZM_BYTE_TO_WORD(pSeed->tk[7],pSeed->tk[6]));
pSeed->ppk[4] = pSeed->ppk[4]
+ zfTkipSbox(pSeed->ppk[3] ^ ZM_BYTE_TO_WORD(pSeed->tk[9],pSeed->tk[8]));
pSeed->ppk[5] = pSeed->ppk[5]
+ zfTkipSbox(pSeed->ppk[4] ^ ZM_BYTE_TO_WORD(pSeed->tk[11],pSeed->tk[10]));
pSeed->ppk[0] = pSeed->ppk[0]
+ zfrotr1(pSeed->ppk[5] ^ ZM_BYTE_TO_WORD(pSeed->tk[13],pSeed->tk[12]));
pSeed->ppk[1] = pSeed->ppk[1]
+ zfrotr1(pSeed->ppk[0] ^ ZM_BYTE_TO_WORD(pSeed->tk[15],pSeed->tk[14]));
pSeed->ppk[2] = pSeed->ppk[2] + zfrotr1(pSeed->ppk[1]);
pSeed->ppk[3] = pSeed->ppk[3] + zfrotr1(pSeed->ppk[2]);
pSeed->ppk[4] = pSeed->ppk[4] + zfrotr1(pSeed->ppk[3]);
pSeed->ppk[5] = pSeed->ppk[5] + zfrotr1(pSeed->ppk[4]);
if (iv16 == 0)
{
if (pSeed->iv16 == 0xffff)
{
pSeed->iv16tmp=0;
return 1;
}
else
return 0;
}
else if (iv16 == (pSeed->iv16+1))
{
pSeed->iv16tmp = iv16;
return 1;
}
else
return 0;
}
void zfTkipInit(u8_t* key, u8_t* ta, struct zsTkipSeed* pSeed, u8_t* initIv)
{
u16_t iv16;
u32_t iv32;
u16_t i;
/* clear memory */
zfZeroMemory((u8_t*) pSeed, sizeof(struct zsTkipSeed));
/* set key to seed */
zfMemoryCopy(pSeed->ta, ta, 6);
zfMemoryCopy(pSeed->tk, key, 16);
iv16 = *initIv++;
iv16 += *initIv<<8;
initIv++;
iv32=0;
for(i=0; i<4; i++) // initiv is little endian
{
iv32 += *initIv<<(i*8);
*initIv++;
}
pSeed->iv32 = iv32+1; // Force Recalculating on Tkip Phase1
zfTkipPhase1KeyMix(iv32, pSeed);
pSeed->iv16 = iv16;
pSeed->iv32 = iv32;
}
u32_t zfGetU32t(u8_t* p)
{
u32_t res=0;
u16_t i;
for( i=0; i<4; i++ )
{
res |= (*p++) << (8*i);
}
return res;
}
void zfPutU32t(u8_t* p, u32_t value)
{
u16_t i;
for(i=0; i<4; i++)
{
*p++ = (u8_t) (value & 0xff);
value >>= 8;
}
}
void zfMicClear(struct zsMicVar* pMic)
{
pMic->left = pMic->k0;
pMic->right = pMic->k1;
pMic->nBytes = 0;
pMic->m = 0;
}
void zfMicSetKey(u8_t* key, struct zsMicVar* pMic)
{
pMic->k0 = zfGetU32t(key);
pMic->k1 = zfGetU32t(key+4);
zfMicClear(pMic);
}
void zfMicAppendByte(u8_t b, struct zsMicVar* pMic)
{
// Append the byte to our word-sized buffer
pMic->m |= b << (8* pMic->nBytes);
pMic->nBytes++;
// Process the word if it is full.
if ( pMic->nBytes >= 4 )
{
pMic->left ^= pMic->m;
pMic->right ^= ZM_ROL32(pMic->left, 17 );
pMic->left += pMic->right;
pMic->right ^= ((pMic->left & 0xff00ff00) >> 8) |
((pMic->left & 0x00ff00ff) << 8);
pMic->left += pMic->right;
pMic->right ^= ZM_ROL32( pMic->left, 3 );
pMic->left += pMic->right;
pMic->right ^= ZM_ROR32( pMic->left, 2 );
pMic->left += pMic->right;
// Clear the buffer
pMic->m = 0;
pMic->nBytes = 0;
}
}
void zfMicGetMic(u8_t* dst, struct zsMicVar* pMic)
{
// Append the minimum padding
zfMicAppendByte(0x5a, pMic);
zfMicAppendByte(0, pMic);
zfMicAppendByte(0, pMic);
zfMicAppendByte(0, pMic);
zfMicAppendByte(0, pMic);
// and then zeroes until the length is a multiple of 4
while( pMic->nBytes != 0 )
{
zfMicAppendByte(0, pMic);
}
// The appendByte function has already computed the result.
zfPutU32t(dst, pMic->left);
zfPutU32t(dst+4, pMic->right);
// Reset to the empty message.
zfMicClear(pMic);
}
u8_t zfMicRxVerify(zdev_t* dev, zbuf_t* buf)
{
struct zsMicVar* pMicKey;
struct zsMicVar MyMicKey;
u8_t mic[8];
u8_t da[6];
u8_t sa[6];
u8_t bValue;
u16_t i, payloadOffset, tailOffset;
zmw_get_wlan_dev(dev);
/* need not check MIC if pMicKEy is equal to NULL */
if ( wd->wlanMode == ZM_MODE_AP )
{
pMicKey = zfApGetRxMicKey(dev, buf);
if ( pMicKey != NULL )
{
zfCopyFromRxBuffer(dev, buf, sa, ZM_WLAN_HEADER_A2_OFFSET, 6);
zfCopyFromRxBuffer(dev, buf, da, ZM_WLAN_HEADER_A3_OFFSET, 6);
}
else
{
return ZM_MIC_SUCCESS;
}
}
else if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
{
pMicKey = zfStaGetRxMicKey(dev, buf);
if ( pMicKey != NULL )
{
zfCopyFromRxBuffer(dev, buf, sa, ZM_WLAN_HEADER_A3_OFFSET, 6);
zfCopyFromRxBuffer(dev, buf, da, ZM_WLAN_HEADER_A1_OFFSET, 6);
}
else
{
return ZM_MIC_SUCCESS;
}
}
else
{
return ZM_MIC_SUCCESS;
}
MyMicKey.k0=pMicKey->k0;
MyMicKey.k1=pMicKey->k1;
pMicKey = &MyMicKey;
zfMicClear(pMicKey);
tailOffset = zfwBufGetSize(dev, buf);
tailOffset -= 8;
/* append DA */
for(i=0; i<6; i++)
{
zfMicAppendByte(da[i], pMicKey);
}
/* append SA */
for(i=0; i<6; i++)
{
zfMicAppendByte(sa[i], pMicKey);
}
/* append for alignment */
if ((zmw_rx_buf_readb(dev, buf, 0) & 0x80) != 0)
zfMicAppendByte(zmw_rx_buf_readb(dev, buf,24)&0x7, pMicKey);
else
zfMicAppendByte(0, pMicKey);
zfMicAppendByte(0, pMicKey);
zfMicAppendByte(0, pMicKey);
zfMicAppendByte(0, pMicKey);
/* append payload */
payloadOffset = ZM_SIZE_OF_WLAN_DATA_HEADER +
ZM_SIZE_OF_IV +
ZM_SIZE_OF_EXT_IV;
if ((zmw_rx_buf_readb(dev, buf, 0) & 0x80) != 0)
{
/* Qos Packet, Plcpheader + 2 */
if (wd->wlanMode == ZM_MODE_AP)
{
/* TODO : Rx Qos element offset in software MIC check */
}
else if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)
{
if (wd->sta.wmeConnected != 0)
{
payloadOffset += 2;
}
}
}
for(i=payloadOffset; i<tailOffset; i++)
{
bValue = zmw_rx_buf_readb(dev, buf, i);
zfMicAppendByte(bValue, pMicKey);
}
zfMicGetMic(mic, pMicKey);
if ( !zfRxBufferEqualToStr(dev, buf, mic, tailOffset, 8) )
{
return ZM_MIC_FAILURE;
}
return ZM_MIC_SUCCESS;
}
void zfTkipGetseeds(u16_t iv16, u8_t *RC4Key, struct zsTkipSeed *Seed)
{
RC4Key[0] = ZM_HI8(iv16);
RC4Key[1] = (ZM_HI8(iv16) | 0x20) & 0x7f;
RC4Key[2] = ZM_LO8(iv16);
RC4Key[3] = ((Seed->ppk[5] ^ ZM_BYTE_TO_WORD(Seed->tk[1],Seed->tk[0]))>>1) & 0xff;
RC4Key[4] = Seed->ppk[0] & 0xff;
RC4Key[5] = Seed->ppk[0] >> 8;
RC4Key[6] = Seed->ppk[1] & 0xff;
RC4Key[7] = Seed->ppk[1] >> 8;
RC4Key[8] = Seed->ppk[2] & 0xff;
RC4Key[9] = Seed->ppk[2] >> 8;
RC4Key[10] = Seed->ppk[3] & 0xff;
RC4Key[11] = Seed->ppk[3] >> 8;
RC4Key[12] = Seed->ppk[4] & 0xff;
RC4Key[13] = Seed->ppk[4] >> 8;
RC4Key[14] = Seed->ppk[5] & 0xff;
RC4Key[15] = Seed->ppk[5] >> 8;
}
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)
{
struct zsMicVar* pMicKey;
u16_t i;
u16_t len;
u8_t bValue;
u8_t qosType;
u8_t *pDa = (u8_t *)da;
u8_t *pSa = (u8_t *)sa;
zmw_get_wlan_dev(dev);
/* need not check MIC if pMicKEy is equal to NULL */
if ( wd->wlanMode == ZM_MODE_AP )
{
pMicKey = zfApGetTxMicKey(dev, buf, &qosType);
if ( pMicKey == NULL )
return;
}
else if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
{
pMicKey = zfStaGetTxMicKey(dev, buf);
if ( pMicKey == NULL )
{
zm_debug_msg0("pMicKey is NULL");
return;
}
}
else
{
return;
}
zfMicClear(pMicKey);
len = zfwBufGetSize(dev, buf);
/* append DA */
for(i = 0; i < 6; i++)
{
zfMicAppendByte(pDa[i], pMicKey);
}
/* append SA */
for(i = 0; i < 6; i++)
{
zfMicAppendByte(pSa[i], pMicKey);
}
if (up != 0)
zfMicAppendByte((up&0x7), pMicKey);
else
zfMicAppendByte(0, pMicKey);
zfMicAppendByte(0, pMicKey);
zfMicAppendByte(0, pMicKey);
zfMicAppendByte(0, pMicKey);
/* For Snap header */
for(i = 0; i < snapLen; i++)
{
zfMicAppendByte(snap[i], pMicKey);
}
for(i = offset; i < len; i++)
{
bValue = zmw_tx_buf_readb(dev, buf, i);
zfMicAppendByte(bValue, pMicKey);
}
zfMicGetMic(mic, pMicKey);
}
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)
{
u8_t iv[3];
iv[0] = key[0];
iv[1] = key[1];
iv[2] = key[2];
keyLen -= 3;
zfWEPEncrypt(dev, buf, snap, snapLen, offset, keyLen, &key[3], iv);
}
u16_t zfTKIPDecrypt(zdev_t *dev, zbuf_t *buf, u16_t offset, u8_t keyLen, u8_t* key)
{
u16_t ret = ZM_ICV_SUCCESS;
u8_t iv[3];
iv[0] = key[0];
iv[1] = key[1];
iv[2] = key[2];
keyLen -= 3;
ret = zfWEPDecrypt(dev, buf, offset, keyLen, &key[3], iv);
return ret;
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,299 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* */
/* Module Name : cwep.c */
/* */
/* Abstract */
/* This module contains Tx and Rx functions. */
/* */
/* NOTES */
/* None */
/* */
/************************************************************************/
#include "cprecomp.h"
u32_t crc32_tab[] =
{
0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
0x2d02ef8dL
};
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)
{
u8_t S[256],S2[256];
u16_t ui;
u16_t i;
u16_t j;
u8_t temp;
u8_t K;
u32_t ltemp;
u16_t len;
u32_t icv;
u8_t key[32];
key[0] = iv[0];
key[1] = iv[1];
key[2] = iv[2];
/* Append Wep Key after IV */
zfMemoryCopy(&key[3], WepKey, keyLen);
keyLen += 3;
for(i = 0; i < 256; i++)
{
S[i] = (u8_t)i;
S2[i] = key[i&(keyLen-1)];
}
j = 0;
for(i = 0; i < 256; i++)
{
j = (j + S[i] + S2[i]) ;
j&=255 ;
// Swap S[i] and S[j]
temp = S[i];
S[i] = S[j];
S[j] = temp;
}
i = j = 0;
icv = -1;
/* For Snap Header */
for (ui = 0; ui < snapLen; ui++)
{
u8_t In;
i++;
i &= 255;
j += S[i];
j &= 255;
// Swap S[i] and S[j]
temp = S[i];
S[i] = S[j];
S[j] = temp;
// temp = (S[i] + temp) & 255;
temp += S[i];
temp &=255;
K = S[temp]; // Key used to Xor with input data
In = snap[ui];
icv = (icv>>8) ^ crc32_tab[(icv^In)&0xff];
snap[ui] = In ^ K;
//zmw_tx_buf_writeb(dev, buf, ui, In ^ K);
}
len = zfwBufGetSize(dev, buf);
for (ui = offset; ui < len; ui++)
{
u8_t In;
i++;
i &= 255;
j += S[i];
j &= 255;
// Swap S[i] and S[j]
temp = S[i];
S[i] = S[j];
S[j] = temp;
// temp = (S[i] + temp) & 255;
temp += S[i];
temp &=255;
K = S[temp]; // Key used to Xor with input data
In = zmw_tx_buf_readb(dev, buf, ui);
icv = (icv>>8) ^ crc32_tab[(icv^In)&0xff];
zmw_tx_buf_writeb(dev, buf, ui, In ^ K);
} //End of for (ui = 0; ui < Num_Bytes; ui++)
icv = ~(icv);
ltemp = (u32_t) icv;
for (ui = 0; ui < 4; ui++)
{
i ++;
i &= 255;
j += S[i];
j &= 255;
// Swap S[i] and S[j]
temp = S[i];
S[i] = S[j];
S[j] = temp;
temp += S[i];
temp &= 255;
K = S[temp]; // Key used to Xor with input data
//*Out++ = (u8_t)(ltemp ^ K)&0xff;
zmw_tx_buf_writeb(dev, buf, len+ui, (u8_t)(ltemp ^ K)&0xff);
ltemp >>= 8;
}
zfwBufSetSize(dev, buf, len+4);
}
u16_t zfWEPDecrypt(zdev_t *dev, zbuf_t *buf, u16_t offset, u8_t keyLen, u8_t* WepKey, u8_t *iv)
{
u8_t S[256];
u8_t S2[256];
u16_t ui;
u16_t i;
u16_t j;
u32_t icv_tmp;
u32_t *icv;
u32_t rxbuf_icv;
u8_t temp;
u8_t K;
u16_t len;
u8_t key[32];
/* Retrieve IV */
key[0] = iv[0];
key[1] = iv[1];
key[2] = iv[2];
/* Append Wep Key after IV */
zfMemoryCopy(&key[3], WepKey, keyLen);
keyLen += 3;
for(i = 0; i < 256; i++)
{
S[i] = (u8_t)i;
S2[i] = key[i&(keyLen-1)];
}
j = 0;
for(i = 0; i < 256; i++)
{
j = (j + S[i] + S2[i]);
j&=255 ;
// Swap S[i] and S[j]
temp = S[i];
S[i] = S[j];
S[j] = temp;
}
i = j = 0;
len = zfwBufGetSize(dev, buf);
for (ui = offset; ui < len; ui++)
{
u8_t In;
i++;
i &= 255;
j += S[i];
j &= 255;
// Swap S[i] and S[j]
temp = S[i];
S[i] = S[j];
S[j] = temp;
// temp = (S[i] + temp) & 255;
temp += S[i];
temp &=255;
K = S[temp]; // Key used to Xor with input data
In = zmw_rx_buf_readb(dev, buf, ui);
zmw_rx_buf_writeb(dev, buf, ui, In ^ K);
} //End of for (ui = 0; ui < Num_Bytes; ui++)
icv = &icv_tmp;
*icv = -1;
for (ui = offset; ui < len - 4; ui++)
{
u8_t In;
In = zmw_rx_buf_readb(dev, buf, ui);
*icv = (*icv>>8) ^ crc32_tab[(*icv^In)&0xff];
}
*icv = ~*icv;
rxbuf_icv = (zmw_rx_buf_readb(dev, buf, len-4) |
zmw_rx_buf_readb(dev, buf, len-3) << 8 |
zmw_rx_buf_readb(dev, buf, len-2) << 16 |
zmw_rx_buf_readb(dev, buf, len-1) << 24);
if (*icv != rxbuf_icv)
{
return ZM_ICV_FAILURE;
}
return ZM_ICV_SUCCESS;
}

View File

@ -0,0 +1,131 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* */
/* Module Name : cwm.c */
/* */
/* Abstract */
/* This module contains channel width related functions. */
/* */
/* NOTES */
/* None */
/* */
/************************************************************************/
#include "cprecomp.h"
void zfCwmInit(zdev_t* dev) {
//u16_t i;
zmw_get_wlan_dev(dev);
switch (wd->wlanMode) {
case ZM_MODE_AP:
wd->cwm.cw_mode = CWM_MODE2040;
wd->cwm.cw_width = CWM_WIDTH40;
wd->cwm.cw_enable = 1;
break;
case ZM_MODE_INFRASTRUCTURE:
case ZM_MODE_PSEUDO:
case ZM_MODE_IBSS:
default:
wd->cwm.cw_mode = CWM_MODE2040;
wd->cwm.cw_width = CWM_WIDTH20;
wd->cwm.cw_enable = 1;
break;
}
}
void zfCoreCwmBusy(zdev_t* dev, u16_t busy)
{
zmw_get_wlan_dev(dev);
zm_msg1_mm(ZM_LV_0, "CwmBusy=", busy);
if(wd->cwm.cw_mode == CWM_MODE20) {
wd->cwm.cw_width = CWM_WIDTH20;
return;
}
if(wd->cwm.cw_mode == CWM_MODE40) {
wd->cwm.cw_width = CWM_WIDTH40;
return;
}
if (busy) {
wd->cwm.cw_width = CWM_WIDTH20;
return;
}
if((wd->wlanMode == ZM_MODE_INFRASTRUCTURE || wd->wlanMode == ZM_MODE_PSEUDO ||
wd->wlanMode == ZM_MODE_IBSS)) {
if (wd->sta.ie.HtCap.HtCapInfo && HTCAP_SupChannelWidthSet != 0 &&
wd->sta.ie.HtInfo.ChannelInfo && ExtHtCap_RecomTxWidthSet != 0 &&
(wd->sta.ie.HtInfo.ChannelInfo && ExtHtCap_ExtChannelOffsetAbove) == 1) {
wd->cwm.cw_width = CWM_WIDTH40;
}
else {
wd->cwm.cw_width = CWM_WIDTH20;
}
return;
}
if(wd->wlanMode == ZM_MODE_AP) {
wd->cwm.cw_width = CWM_WIDTH40;
}
}
u16_t zfCwmIsExtChanBusy(u32_t ctlBusy, u32_t extBusy)
{
u32_t busy; /* percentage */
u32_t cycleTime, ctlClear;
cycleTime = 1280000; //1.28 seconds
if (cycleTime > ctlBusy) {
ctlClear = cycleTime - ctlBusy;
}
else
{
ctlClear = 0;
}
/* Compute ratio of extension channel busy to control channel clear
* as an approximation to extension channel cleanliness.
*
* According to the hardware folks, ext rxclear is undefined
* if the ctrl rxclear is de-asserted (i.e. busy)
*/
if (ctlClear) {
busy = (extBusy * 100) / ctlClear;
} else {
busy = 0;
}
if (busy > ATH_CWM_EXTCH_BUSY_THRESHOLD) {
return TRUE;
}
return FALSE;
}

View File

@ -0,0 +1,45 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* */
/* Module Name : cwm.h */
/* */
/* Abstract */
/* This module contains channel width relatived functions. */
/* */
/* NOTES */
/* None */
/* */
/****************************************************************************/
/*Revision History: */
/* Who When What */
/* -------- -------- ----------------------------------------------*/
/* */
/* Honda 3-19-07 created */
/* */
/****************************************************************************/
#ifndef _CWM_H
#define _CWM_H
#define ATH_CWM_EXTCH_BUSY_THRESHOLD 30 /* Extension Channel Busy Threshold (0-100%) */
void zfCwmInit(zdev_t* dev);
void zfCoreCwmBusy(zdev_t* dev, u16_t busy);
u16_t zfCwmIsExtChanBusy(u32_t ctlBusy, u32_t extBusy);
#endif /* #ifndef _CWM_H */

View File

@ -0,0 +1,259 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "cprecomp.h"
/* zfAddFreqChangeReq should be called inside the critical section */
static void zfAddFreqChangeReq(zdev_t* dev, u16_t frequency, u8_t bw40,
u8_t extOffset, zfpFreqChangeCompleteCb cb)
{
zmw_get_wlan_dev(dev);
//printk("zfAddFreqChangeReq freqReqQueueTail%d\n", wd->freqCtrl.freqReqQueueTail);
wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueTail] = frequency;
wd->freqCtrl.freqReqBw40[wd->freqCtrl.freqReqQueueTail] = bw40;
wd->freqCtrl.freqReqExtOffset[wd->freqCtrl.freqReqQueueTail] = extOffset;
wd->freqCtrl.freqChangeCompCb[wd->freqCtrl.freqReqQueueTail] = cb;
wd->freqCtrl.freqReqQueueTail++;
if ( wd->freqCtrl.freqReqQueueTail >= ZM_MAX_FREQ_REQ_QUEUE )
{
wd->freqCtrl.freqReqQueueTail = 0;
}
}
void zfCoreSetFrequencyV2(zdev_t* dev, u16_t frequency, zfpFreqChangeCompleteCb cb)
{
zfCoreSetFrequencyEx(dev, frequency, 0, 0, cb);
}
void zfCoreSetFrequencyExV2(zdev_t* dev, u16_t frequency, u8_t bw40,
u8_t extOffset, zfpFreqChangeCompleteCb cb, u8_t forceSetFreq)
{
u8_t setFreqImmed = 0;
u8_t initRF = 0;
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
zm_msg1_scan(ZM_LV_1, "Freq=", frequency);
zmw_enter_critical_section(dev);
if ((wd->sta.currentFrequency == frequency)
&& (wd->sta.currentBw40 == bw40)
&& (wd->sta.currentExtOffset == extOffset))
{
if ( forceSetFreq == 0 && wd->sta.flagFreqChanging == 0 )
{
goto done;
}
}
#ifdef ZM_FB50
/*if(frequency!=2437) {
zmw_leave_critical_section(dev);
return;
}*/
#endif
zfAddFreqChangeReq(dev, frequency, bw40, extOffset, cb);
// zm_assert( wd->sta.flagFreqChanging == 0 );
//wd->sta.flagFreqChanging = 1;
if ( wd->sta.flagFreqChanging == 0 )
{
if ((wd->sta.currentBw40 != bw40) || (wd->sta.currentExtOffset != extOffset))
{
initRF = 1;
}
wd->sta.currentFrequency = frequency;
wd->sta.currentBw40 = bw40;
wd->sta.currentExtOffset = extOffset;
setFreqImmed = 1;
}
wd->sta.flagFreqChanging++;
zmw_leave_critical_section(dev);
if ( setFreqImmed )
{
//zfHpSetFrequency(dev, frequency, 0);
if ( forceSetFreq )
{ // Cold reset to reset the frequency after scanning !
zm_debug_msg0("#6_1 20070917");
zm_debug_msg0("It is happen!!! No error message");
zfHpSetFrequencyEx(dev, frequency, bw40, extOffset, 2);
}
else
{
zfHpSetFrequencyEx(dev, frequency, bw40, extOffset, initRF);
}
if ( zfStaIsConnected(dev)
&& (frequency == wd->frequency)) {
wd->sta.connPowerInHalfDbm = zfHpGetTransmitPower(dev);
}
}
return;
done:
zmw_leave_critical_section(dev);
if ( cb != NULL )
{
cb(dev);
}
zfPushVtxq(dev);
return;
}
void zfCoreSetFrequencyEx(zdev_t* dev, u16_t frequency, u8_t bw40,
u8_t extOffset, zfpFreqChangeCompleteCb cb)
{
zfCoreSetFrequencyExV2(dev, frequency, bw40, extOffset, cb, 0);
}
void zfCoreSetFrequency(zdev_t* dev, u16_t frequency)
{
zfCoreSetFrequencyV2(dev, frequency, NULL);
}
/* zfRemoveFreqChangeReq SHOULD NOT be called inside the critical section */
static void zfRemoveFreqChangeReq(zdev_t* dev)
{
zfpFreqChangeCompleteCb cb = NULL;
u16_t frequency;
u8_t bw40;
u8_t extOffset;
u16_t compFreq = 0;
u8_t compBw40 = 0;
u8_t compExtOffset = 0;
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
zmw_enter_critical_section(dev);
if (wd->freqCtrl.freqReqQueueHead != wd->freqCtrl.freqReqQueueTail)
{
zm_msg1_scan(ZM_LV_1, "Freq=",
wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead]);
compFreq = wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead];
compBw40 = wd->freqCtrl.freqReqBw40[wd->freqCtrl.freqReqQueueHead];
compExtOffset = wd->freqCtrl.freqReqExtOffset[wd->freqCtrl.freqReqQueueHead];
wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead] = 0;
cb = wd->freqCtrl.freqChangeCompCb[wd->freqCtrl.freqReqQueueHead];
wd->freqCtrl.freqReqQueueHead++;
if ( wd->freqCtrl.freqReqQueueHead >= ZM_MAX_FREQ_REQ_QUEUE )
{
wd->freqCtrl.freqReqQueueHead = 0;
}
}
zmw_leave_critical_section(dev);
if ( cb != NULL )
{
cb(dev);
}
zmw_enter_critical_section(dev);
while (wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead] != 0)
{
frequency = wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead];
bw40 = wd->freqCtrl.freqReqBw40[wd->freqCtrl.freqReqQueueHead];
extOffset=wd->freqCtrl.freqReqExtOffset[wd->freqCtrl.freqReqQueueHead];
if ((compFreq == frequency)
&& (compBw40 == bw40)
&& (compExtOffset == extOffset))
{
/* Duplicated frequency command */
zm_msg1_scan(ZM_LV_1, "Duplicated Freq=", frequency);
cb = wd->freqCtrl.freqChangeCompCb[wd->freqCtrl.freqReqQueueHead];
wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead] = 0;
wd->freqCtrl.freqReqQueueHead++;
if ( wd->freqCtrl.freqReqQueueHead >= ZM_MAX_FREQ_REQ_QUEUE )
{
wd->freqCtrl.freqReqQueueHead = 0;
}
if ( wd->sta.flagFreqChanging != 0 )
{
wd->sta.flagFreqChanging--;
}
zmw_leave_critical_section(dev);
if ( cb != NULL )
{
cb(dev);
}
zmw_enter_critical_section(dev);
}
else
{
u8_t initRF = 0;
if ((wd->sta.currentBw40 != bw40) || (wd->sta.currentExtOffset != extOffset))
{
initRF = 1;
}
wd->sta.currentFrequency = frequency;
wd->sta.currentBw40 = bw40;
wd->sta.currentExtOffset = extOffset;
zmw_leave_critical_section(dev);
zfHpSetFrequencyEx(dev, frequency, bw40, extOffset, initRF);
if ( zfStaIsConnected(dev)
&& (frequency == wd->frequency)) {
wd->sta.connPowerInHalfDbm = zfHpGetTransmitPower(dev);
}
return;
}
}
zmw_leave_critical_section(dev);
return;
}
void zfCoreSetFrequencyComplete(zdev_t* dev)
{
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
zm_msg1_scan(ZM_LV_1, "flagFreqChanging=", wd->sta.flagFreqChanging);
zmw_enter_critical_section(dev);
//wd->sta.flagFreqChanging = 0;
if ( wd->sta.flagFreqChanging != 0 )
{
wd->sta.flagFreqChanging--;
}
zmw_leave_critical_section(dev);
zfRemoveFreqChangeReq(dev);
zfPushVtxq(dev);
return;
}
void zfReSetCurrentFrequency(zdev_t* dev)
{
zmw_get_wlan_dev(dev);
zm_debug_msg0("It is happen!!! No error message");
zfCoreSetFrequencyExV2(dev, wd->frequency, 0, 0, NULL, 1);
}

View File

@ -0,0 +1,557 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "cprecomp.h"
/************************************************************************/
/* */
/* FUNCTION DESCRIPTION zfLedCtrlType1 */
/* Traditional single-LED state */
/* */
/* INPUTS */
/* dev : device pointer */
/* */
/* OUTPUTS */
/* None */
/* */
/* AUTHOR */
/* Stephen Chen Atheros Communications, INC. 2007.6 */
/* */
/************************************************************************/
// bit 15-12 : Toff for Scan state
// 11-8 : Ton for Scan state
// 7 : Reserved
// 6 : mode
//--------------------------------------
// bit 6 = 0
// 5-4 : Connect state
// 00 => always off
// 01 => always on
// 10 => Idle off, acitve on
// 11 => Idle on, active off
//--------------------------------------
// bit 6 = 1
// 5-4 : freq
// 00 => 1Hz
// 01 => 0.5Hz
// 10 => 0.25Hz
// 11 => 0.125Hz
//--------------------------------------
// 3 : Power save state
// 0 => always off in power save state
// 1 => works as connect state
// 2 : Disable state
// 1 : Reserved
// 0 : Power-on state
void zfLedCtrlType1(zdev_t* dev)
{
u16_t i;
u32_t ton, toff, tmp, period;
zmw_get_wlan_dev(dev);
for (i=0; i<ZM_MAX_LED_NUMBER; i++)
{
if (zfStaIsConnected(dev) != TRUE)
{
//Scan state
ton = ((wd->ledStruct.ledMode[i] & 0xf00) >> 8) * 5;
toff = ((wd->ledStruct.ledMode[i] & 0xf000) >> 12) * 5;
if ((ton + toff) != 0)
{
tmp = wd->ledStruct.counter / (ton+toff);
tmp = wd->ledStruct.counter - (tmp * (ton+toff));
if (tmp < ton)
{
zfHpLedCtrl(dev, i, 1);
}
else
{
zfHpLedCtrl(dev, i, 0);
}
}
}
else
{
if ((zfPowerSavingMgrIsSleeping(dev)) && ((wd->ledStruct.ledMode[i] & 0x8) == 0))
{
zfHpLedCtrl(dev, i, 0);
}
else
{
//Connect state
if ((wd->ledStruct.ledMode[i] & 0x40) == 0)
{
if ((wd->ledStruct.counter & 1) == 0)
{
zfHpLedCtrl(dev, i, (wd->ledStruct.ledMode[i] & 0x10) >> 4);
}
else
{
if ((wd->ledStruct.txTraffic > 0) || (wd->ledStruct.rxTraffic > 0))
{
wd->ledStruct.txTraffic = wd->ledStruct.rxTraffic = 0;
if ((wd->ledStruct.ledMode[i] & 0x20) != 0)
{
zfHpLedCtrl(dev, i, ((wd->ledStruct.ledMode[i] & 0x10) >> 4)^1);
}
}
}
}// if ((wd->ledStruct.ledMode[i] & 0x40) == 0)
else
{
period = 5 * (1 << ((wd->ledStruct.ledMode[i] & 0x30) >> 4));
tmp = wd->ledStruct.counter / (period*2);
tmp = wd->ledStruct.counter - (tmp * (period*2));
if (tmp < period)
{
if ((wd->ledStruct.counter & 1) == 0)
{
zfHpLedCtrl(dev, i, 0);
}
else
{
if ((wd->ledStruct.txTraffic > 0) || (wd->ledStruct.rxTraffic > 0))
{
wd->ledStruct.txTraffic = wd->ledStruct.rxTraffic = 0;
zfHpLedCtrl(dev, i, 1);
}
}
}
else
{
if ((wd->ledStruct.counter & 1) == 0)
{
zfHpLedCtrl(dev, i, 1);
}
else
{
if ((wd->ledStruct.txTraffic > 0) || (wd->ledStruct.rxTraffic > 0))
{
wd->ledStruct.txTraffic = wd->ledStruct.rxTraffic = 0;
zfHpLedCtrl(dev, i, 0);
}
}
}
} //else, if ((wd->ledStruct.ledMode[i] & 0x40) == 0)
} //else, if (zfPowerSavingMgrIsSleeping(dev))
} //else : if (zfStaIsConnected(dev) != TRUE)
} //for (i=0; i<ZM_MAX_LED_NUMBER; i++)
}
/******************************************************************************/
/* */
/* FUNCTION DESCRIPTION zfLedCtrlType2 */
/* Customize for Netgear Dual-LED state ((bug#31292)) */
/* */
/* 1. Status: When dongle does not connect to 2.4G or 5G but in site */
/* survey/association */
/* LED status: Slow blinking, Amber then Blue per 500ms */
/* 2. Status: Connection at 2.4G in site survey/association */
/* LED status: Slow blinking, Amber/off per 500ms */
/* 3. Status: Connection at 5G in site survey/association */
/* LED status: Slow blinking, Blue/off per 500ms */
/* 4. Status: When transfer the packet */
/* LED status: Blink per packet, including TX and RX */
/* 5. Status: When linking is established but no traffic */
/* LED status: Always on */
/* 6. Status: When linking is dropped but no re-connection */
/* LED status: Always off */
/* 7. Status: From one connection(2.4G or 5G) to change to another band */
/* LED status: Amber/Blue =>Slow blinking, Amber then Blue per 500ms */
/* */
/* INPUTS */
/* dev : device pointer */
/* */
/* OUTPUTS */
/* None */
/* */
/* AUTHOR */
/* Shang-Chun Liu Atheros Communications, INC. 2007.11 */
/* */
/******************************************************************************/
void zfLedCtrlType2_scan(zdev_t* dev);
void zfLedCtrlType2(zdev_t* dev)
{
u32_t ton, toff, tmp, period;
u16_t OperateLED;
zmw_get_wlan_dev(dev);
if (zfStaIsConnected(dev) != TRUE)
{
// Disconnect state
if(wd->ledStruct.counter % 4 != 0)
{
// Update LED each 400ms(4*100)
// Prevent this situation
// _______ ___
// LED[0] ON | | | x |
// ------ OFF->+-+-+-+-+-+-+-+-+-+-+-+->>>...
// LED[1] ON
//
return;
}
if (((wd->state == ZM_WLAN_STATE_DISABLED) && (wd->sta.bChannelScan))
|| ((wd->state != ZM_WLAN_STATE_DISABLED) && (wd->sta.bAutoReconnect)))
{
// Scan/AutoReconnect state
zfLedCtrlType2_scan(dev);
}
else
{
// Neither Connected nor Scan
zfHpLedCtrl(dev, 0, 0);
zfHpLedCtrl(dev, 1, 0);
}
}
else
{
if( wd->sta.bChannelScan )
{
// Scan state
if(wd->ledStruct.counter % 4 != 0)
return;
zfLedCtrlType2_scan(dev);
return;
}
if(wd->frequency < 3000)
{
OperateLED = 0; // LED[0]: work on 2.4G (b/g band)
zfHpLedCtrl(dev, 1, 0);
}
else
{
OperateLED = 1; // LED[1]: work on 5G (a band)
zfHpLedCtrl(dev, 0, 0);
}
if ((zfPowerSavingMgrIsSleeping(dev)) && ((wd->ledStruct.ledMode[OperateLED] & 0x8) == 0))
{
// If Sleeping, turn OFF
zfHpLedCtrl(dev, OperateLED, 0);
}
else
{
//Connect state
if ((wd->ledStruct.counter & 1) == 0) // even
{
// No traffic, always ON
zfHpLedCtrl(dev, OperateLED, 1);
}
else // odd
{
if ((wd->ledStruct.txTraffic > 0) || (wd->ledStruct.rxTraffic > 0))
{
// If have traffic, turn OFF
// _____ _ _ _ _____
// LED[Operate] ON | | | | | | | |
// ------------ OFF->-+-+-+-+-+-+-+-+-+-+-+-+-+->>>...
//
wd->ledStruct.txTraffic = wd->ledStruct.rxTraffic = 0;
zfHpLedCtrl(dev, OperateLED, 0);
}
}
}
}
}
void zfLedCtrlType2_scan(zdev_t* dev)
{
zmw_get_wlan_dev(dev);
// When doing scan, blink(Amber/Blue) and off per 500ms (about 400ms in our driver)
// _______ _______
// LED[0] ON | | 8 12 | |
// ------ OFF->-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+->>>...
// LED[1] ON 0 4 |_______| 0 3
//
switch(wd->ledStruct.counter % 16)
{
case 0: // case 0~3, LED[0] on
if(wd->supportMode & ZM_WIRELESS_MODE_24)
{
zfHpLedCtrl(dev, 0, 1);
zfHpLedCtrl(dev, 1, 0);
}
else
{
zfHpLedCtrl(dev, 1, 1);
zfHpLedCtrl(dev, 0, 0);
}
break;
case 8: // case 8~11, LED[1] on
if(wd->supportMode & ZM_WIRELESS_MODE_5)
{
zfHpLedCtrl(dev, 1, 1);
zfHpLedCtrl(dev, 0, 0);
}
else
{
zfHpLedCtrl(dev, 0, 1);
zfHpLedCtrl(dev, 1, 0);
}
break;
default: // others, all off
zfHpLedCtrl(dev, 0, 0);
zfHpLedCtrl(dev, 1, 0);
break;
}
}
/**********************************************************************************/
/* */
/* FUNCTION DESCRIPTION zfLedCtrlType3 */
/* Customize for Netgear Single-LED state ((bug#32243)) */
/* */
/* ¡EOff: when the adapter is disabled or hasn't started to associate with AP */
/* yet. */
/* ¡EOn: Once adpater associate with AP successfully */
/* ¡ESlow blinking: whenever adapters do site-survey or try to associate with AP */
/* - If there is a connection already, and adapters do site-survey or */
/* re-associate action, the LED should keep LED backgraoud as ON, thus */
/* the blinking behavior SHOULD be OFF (200ms) - ON (800ms) and continue this*/
/* cycle. */
/* - If there is no connection yet, and adapters start to do site-survey or */
/* associate action, the LED should keep LED background as OFF, thus the */
/* blinking behavior SHOULD be ON (200ms) - OFF (800ms) and continue this */
/* cycle. */
/* - For the case that associate fail, adpater should keep associating, and the*/
/* LED should also keep slow blinking. */
/* ¡EQuick blinking: to blink OFF-ON cycle for each time that traffic packet is */
/* received or is transmitted. */
/* */
/* INPUTS */
/* dev : device pointer */
/* */
/* OUTPUTS */
/* None */
/* */
/* AUTHOR */
/* Shang-Chun Liu Atheros Communications, INC. 2008.01 */
/* */
/**********************************************************************************/
void zfLedCtrlType3_scan(zdev_t* dev, u16_t isConnect);
void zfLedCtrlType3(zdev_t* dev)
{
zmw_get_wlan_dev(dev);
if (zfStaIsConnected(dev) != TRUE)
{
// Disconnect state
if(wd->ledStruct.counter % 2 != 0)
{
// Update LED each 200ms(2*100)
// Prevent this situation
// ___ _
// LED[0] ON | | |x|
// ------ OFF->+-+-+-+-+-+-+->>>...
//
return;
}
if (((wd->state == ZM_WLAN_STATE_DISABLED) && (wd->sta.bChannelScan))
|| ((wd->state != ZM_WLAN_STATE_DISABLED) && (wd->sta.bAutoReconnect)))
{
// Scan/AutoReconnect state
zfLedCtrlType3_scan(dev, 0);
}
else
{
// Neither Connected nor Scan
zfHpLedCtrl(dev, 0, 0);
zfHpLedCtrl(dev, 1, 0);
}
}
else
{
if( wd->sta.bChannelScan )
{
// Scan state
if(wd->ledStruct.counter % 2 != 0)
return;
zfLedCtrlType3_scan(dev, 1);
return;
}
if ((zfPowerSavingMgrIsSleeping(dev)) && ((wd->ledStruct.ledMode[0] & 0x8) == 0))
{
// If Sleeping, turn OFF
zfHpLedCtrl(dev, 0, 0);
zfHpLedCtrl(dev, 1, 0);
}
else
{
//Connect state
if ((wd->ledStruct.counter & 1) == 0) // even
{
// No traffic, always ON
zfHpLedCtrl(dev, 0, 1);
zfHpLedCtrl(dev, 1, 1);
}
else // odd
{
if ((wd->ledStruct.txTraffic > 0) || (wd->ledStruct.rxTraffic > 0))
{
// If have traffic, turn OFF
// _____ _ _ _ _____
// LED[Operate] ON | | | | | | | |
// ------------ OFF->-+-+-+-+-+-+-+-+-+-+-+-+-+->>>...
//
wd->ledStruct.txTraffic = wd->ledStruct.rxTraffic = 0;
zfHpLedCtrl(dev, 0, 0);
zfHpLedCtrl(dev, 1, 0);
}
}
}
}
}
void zfLedCtrlType3_scan(zdev_t* dev, u16_t isConnect)
{
u32_t ton, toff, tmp;
zmw_get_wlan_dev(dev);
// Doing scan when :
// 1. Disconnected: ON (200ms) - OFF (800ms) (200ms-600ms in our driver)
// ___ ___ ___
// LED[0] ON | | | | | |
// ------ OFF->-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+->>>...
// 0 2 4 6 8 10 12 14 16
// 2. Connected: ON (800ms) - OFF (200ms) (600ms-200ms in our driver)
// ___________ ___________ ______
// LED[0] ON | | | | |
// ------ OFF->-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+->>>...
// 0 2 4 6 8 10 12 14 16
//Scan state
if(!isConnect)
ton = 2, toff = 6;
else
ton = 6, toff = 2;
if ((ton + toff) != 0)
{
tmp = wd->ledStruct.counter % (ton+toff);
if (tmp < ton)
{
zfHpLedCtrl(dev, 0, 1);
zfHpLedCtrl(dev, 1, 1);
}
else
{
zfHpLedCtrl(dev, 0, 0);
zfHpLedCtrl(dev, 1, 0);
}
}
}
/******************************************************************************/
/* */
/* FUNCTION DESCRIPTION zfLedCtrl_BlinkWhenScan_Alpha */
/* Customize for Alpha/DLink LED */
/* - Blink LED 12 times within 3 seconds when doing Active Scan */
/* ___ ___ ___ ___ */
/* LED[0] ON | | | | | | | | */
/* -------OFF->-+-+-+-+-+-+-+-+-+-+-+-+-+--+-->>>... */
/* */
/* INPUTS */
/* dev : device pointer */
/* */
/* OUTPUTS */
/* None */
/* */
/* AUTHOR */
/* Shang-Chun Liu Atheros Communications, INC. 2007.11 */
/* */
/******************************************************************************/
void zfLedCtrl_BlinkWhenScan_Alpha(zdev_t* dev)
{
static u32_t counter = 0;
zmw_get_wlan_dev(dev);
if(counter > 34) // counter for 3 sec
{
wd->ledStruct.LEDCtrlFlag &= ~(u8_t)ZM_LED_CTRL_FLAG_ALPHA;
counter = 0;
}
if( (counter % 3) < 2)
zfHpLedCtrl(dev, 0, 1);
else
zfHpLedCtrl(dev, 0, 0);
counter++;
}
/************************************************************************/
/* */
/* FUNCTION DESCRIPTION zfLed100msCtrl */
/* LED 100 milliseconds timer. */
/* */
/* INPUTS */
/* dev : device pointer */
/* */
/* OUTPUTS */
/* None */
/* */
/* AUTHOR */
/* Stephen Chen Atheros Communications, INC. 2007.6 */
/* */
/************************************************************************/
void zfLed100msCtrl(zdev_t* dev)
{
zmw_get_wlan_dev(dev);
wd->ledStruct.counter++;
if(wd->ledStruct.LEDCtrlFlag)
{
switch(wd->ledStruct.LEDCtrlFlag) {
case ZM_LED_CTRL_FLAG_ALPHA:
zfLedCtrl_BlinkWhenScan_Alpha(dev);
break;
}
}
else
{
switch(wd->ledStruct.LEDCtrlType) {
case 1: // Traditional 1 LED
zfLedCtrlType1(dev);
break;
case 2: // Dual-LEDs for Netgear
zfLedCtrlType2(dev);
break;
case 3: // Single-LED for Netgear (WN111v2)
zfLedCtrlType3(dev);
break;
default:
zfLedCtrlType1(dev);
break;
}
}
}

View File

@ -0,0 +1,431 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* */
/* Module Name : performance.c */
/* */
/* Abstract */
/* This module performance evaluation functions. */
/* */
/* NOTES */
/* None */
/* */
/************************************************************************/
#include "cprecomp.h"
#ifdef ZM_ENABLE_PERFORMANCE_EVALUATION
#define ZM_TP_SIZE 50
struct zsSummary zm_summary;
struct zsVariation zm_var;
struct zsThroughput zm_tp;
void zfiPerformanceInit(zdev_t* dev)
{
u16_t i;
zmw_get_wlan_dev(dev);
zm_summary.tick_base = wd->tick;
zm_summary.tx_msdu_count = 0;
zm_summary.tx_mpdu_count = 0;
zm_summary.rx_msdu_count = 0;
zm_summary.rx_mpdu_count = 0;
zm_summary.rx_broken_seq = 0;
zm_summary.rx_broken_sum = 0;
zm_summary.rx_seq_base = 0;
zm_summary.rx_broken_seq_dis = 0;
zm_summary.rx_duplicate_seq = 0;
zm_summary.rx_old_seq = 0;
zm_summary.reset_count = 0;
zm_summary.reset_sum = 0;
zm_summary.rx_lost_sum = 0;
zm_summary.rx_duplicate_error = 0;
zm_summary.rx_free = 0;
zm_summary.rx_amsdu_len = 0;
zm_summary.rx_flush = 0;
zm_summary.rx_clear = 0;
zm_summary.rx_reorder = 0;
for (i=0; i<100; i++)
{
zm_var.tx_msdu_tick[i] = zm_var.tx_mpdu_tick[i] = 0;
zm_var.rx_msdu_tick[i] = zm_var.rx_mpdu_tick[i] = 0;
}
zfTimerSchedule(dev, ZM_EVENT_TIMEOUT_PERFORMANCE, 100);
zm_tp.size = ZM_TP_SIZE;
zm_tp.head = zm_tp.size - 1;
zm_tp.tail = 0;
for (i=0; i<zm_tp.size; i++)
{
zm_tp.tx[i]=0;
zm_tp.rx[i]=0;
}
}
void zfiPerformanceGraph(zdev_t* dev)
{
s16_t i,j;
u8_t s[ZM_TP_SIZE+5];
zmw_get_wlan_dev(dev);
for (i=0; i<(zm_tp.size-1); i++)
{
zm_tp.tx[i] = zm_tp.tx[i+1];
zm_tp.rx[i] = zm_tp.rx[i+1];
}
zm_tp.tx[zm_tp.size-1] = zm_summary.tx_mpdu_count*1500*8/1000000;
zm_tp.rx[zm_tp.size-1] = zm_summary.rx_msdu_count*1500*8/1000000;
for (i=15; i>0; i--)
{
s[0] = (i/10) + '0';
s[1] = (i%10) + '0';
s[2] = '0';
s[3] = '|';
for (j=0; j<zm_tp.size; j++)
{
if ((zm_tp.tx[j]/10 == i) && (zm_tp.rx[j]/10 == i))
{
s[4+j] = 'X';
}
else if (zm_tp.tx[j]/10 == i)
{
s[4+j] = 'T';
}
else if (zm_tp.rx[j]/10 == i)
{
s[4+j] = 'R';
}
else
{
s[4+j] = ' ';
}
}
s[zm_tp.size+4] = '\0';
DbgPrint("%s",s);
}
DbgPrint("000|__________________________________________________");
}
void zfiPerformanceRefresh(zdev_t* dev)
{
u16_t i;
zmw_get_wlan_dev(dev);
zfiDbgReadReg(dev, 0x11772c);
zm_var.tx_msdu_mean = zm_summary.tx_msdu_count / 100;
zm_var.tx_mpdu_mean = zm_summary.tx_mpdu_count / 100;
zm_var.rx_msdu_mean = zm_summary.rx_msdu_count / 100;
zm_var.rx_mpdu_mean = zm_summary.rx_mpdu_count / 100;
zm_var.tx_msdu_sum = zm_var.tx_mpdu_sum = 0;
zm_var.rx_msdu_sum = zm_var.rx_mpdu_sum = 0;
zm_summary.tx_idle_count = zm_summary.rx_idle_count = 0;
for (i=0; i<100; i++)
{
zm_var.tx_msdu_sum += (zm_var.tx_msdu_tick[i] * zm_var.tx_msdu_tick[i]);
zm_var.tx_mpdu_sum += (zm_var.tx_mpdu_tick[i] * zm_var.tx_mpdu_tick[i]);
zm_var.rx_msdu_sum += (zm_var.rx_msdu_tick[i] * zm_var.rx_msdu_tick[i]);
zm_var.rx_mpdu_sum += (zm_var.rx_mpdu_tick[i] * zm_var.rx_mpdu_tick[i]);
if (!zm_var.tx_mpdu_tick[i]) zm_summary.tx_idle_count++;
if (!zm_var.rx_mpdu_tick[i]) zm_summary.rx_idle_count++;
}
zm_var.tx_msdu_var = (zm_var.tx_msdu_sum / 100) - (zm_var.tx_msdu_mean * zm_var.tx_msdu_mean);
zm_var.tx_mpdu_var = (zm_var.tx_mpdu_sum / 100) - (zm_var.tx_mpdu_mean * zm_var.tx_mpdu_mean);
zm_var.rx_msdu_var = (zm_var.rx_msdu_sum / 100) - (zm_var.rx_msdu_mean * zm_var.rx_msdu_mean);
zm_var.rx_mpdu_var = (zm_var.rx_mpdu_sum / 100) - (zm_var.rx_mpdu_mean * zm_var.rx_mpdu_mean);
zm_summary.tick_base = wd->tick;
zm_summary.rx_broken_sum += zm_summary.rx_broken_seq;
zm_summary.rx_lost_sum += (zm_summary.rx_broken_seq - zm_summary.rx_duplicate_seq - zm_summary.rx_old_seq);
zfiPerformanceGraph(dev);
DbgPrint("******************************************************\n");
DbgPrint("* TX: MSDU=%5d, VAR=%5d; MPDU=%5d, VAR=%5d\n", zm_summary.tx_msdu_count,
zm_var.tx_msdu_var, zm_summary.tx_mpdu_count, zm_var.tx_mpdu_var);
DbgPrint("* TX: idle=%5d,TxRate=%3d, PER=%5d\n", zm_summary.tx_idle_count,
wd->CurrentTxRateKbps/1000,
(u16_t)wd->PER[wd->sta.oppositeInfo[0].rcCell.currentRate]);
DbgPrint("* RX: MSDU=%5d, VAR=%5d; MPDU=%5d, VAR=%5d\n", zm_summary.rx_msdu_count,
zm_var.rx_msdu_var, zm_summary.rx_mpdu_count, zm_var.rx_mpdu_var);
DbgPrint("* RX: idle=%5d,RxRate=%3d,AMSDU=%5d\n", zm_summary.rx_idle_count,
wd->CurrentRxRateKbps/1000, zm_summary.rx_amsdu_len);
DbgPrint("* RX broken seq=%4d, distances=%4d, duplicates=%4d\n", zm_summary.rx_broken_seq,
zm_summary.rx_broken_seq_dis, zm_summary.rx_duplicate_seq);
DbgPrint("* RX old seq=%4d, lost=%4d, broken sum=%4d\n", zm_summary.rx_old_seq,
(zm_summary.rx_broken_seq - zm_summary.rx_duplicate_seq - zm_summary.rx_old_seq),
zm_summary.rx_broken_sum);
DbgPrint("* Rx lost sum=%4d,dup. error=%4d, free count=%4d\n", zm_summary.rx_lost_sum,
zm_summary.rx_duplicate_error, zm_summary.rx_free);
DbgPrint("* Rx flush sum=%4d, clear sum=%4d, reorder=%7d\n", zm_summary.rx_flush,
zm_summary.rx_clear, zm_summary.rx_reorder);
DbgPrint("* Firmware reset=%3d, reset sum=%4d\n", zm_summary.reset_count,
zm_summary.reset_sum);
DbgPrint("******************************************************\n\n");
//reset count 11772c
zm_summary.tx_msdu_count = 0;
zm_summary.tx_mpdu_count = 0;
zm_summary.rx_msdu_count = 0;
zm_summary.rx_mpdu_count = 0;
zm_summary.rx_broken_seq = 0;
zm_summary.rx_broken_seq_dis = 0;
zm_summary.rx_duplicate_seq = 0;
zm_summary.rx_old_seq = 0;
zm_summary.reset_count = 0;
zm_summary.rx_amsdu_len = 0;
for (i=0; i<100; i++)
{
zm_var.tx_msdu_tick[i] = zm_var.tx_mpdu_tick[i] = 0;
zm_var.rx_msdu_tick[i] = zm_var.rx_mpdu_tick[i] = 0;
}
zfTimerSchedule(dev, ZM_EVENT_TIMEOUT_PERFORMANCE, 100);
}
void zfiTxPerformanceMSDU(zdev_t* dev, u32_t tick)
{
u32_t index;
zm_summary.tx_msdu_count++;
index = tick - zm_summary.tick_base;
if (index < 100)
{
zm_var.tx_msdu_tick[index]++;
}
else
{
//DbgPrint("wd->tick exceeded tick_base+100!\n");
}
}
void zfiRxPerformanceMSDU(zdev_t* dev, u32_t tick)
{
u32_t index;
zm_summary.rx_msdu_count++;
index = tick - zm_summary.tick_base;
if (index < 100)
{
zm_var.rx_msdu_tick[index]++;
}
else
{
//DbgPrint("wd->tick exceeded tick_base+100!\n");
}
}
void zfiTxPerformanceMPDU(zdev_t* dev, u32_t tick)
{
u32_t index;
zm_summary.tx_mpdu_count++;
index = tick - zm_summary.tick_base;
if (index < 100)
{
zm_var.tx_mpdu_tick[index]++;
}
else
{
//DbgPrint("wd->tick exceeded tick_base+100!\n");
}
}
#ifndef ZM_INT_USE_EP2_HEADER_SIZE
#define ZM_INT_USE_EP2_HEADER_SIZE 12
#endif
void zfiRxPerformanceMPDU(zdev_t* dev, zbuf_t* buf)
{
u32_t index;
u16_t frameType;
u16_t frameCtrl;
u8_t mpduInd;
u16_t plcpHdrLen;
u16_t len;
zmw_get_wlan_dev(dev);
len = zfwBufGetSize(dev, buf);
mpduInd = zmw_rx_buf_readb(dev, buf, len-1);
/* First MPDU or Single MPDU */
if(((mpduInd & 0x30) == 0x00) || ((mpduInd & 0x30) == 0x20))
//if ((mpduInd & 0x10) == 0x00)
{
plcpHdrLen = 12; // PLCP header length
}
else
{
if (zmw_rx_buf_readh(dev, buf, 4) == wd->macAddr[0] &&
zmw_rx_buf_readh(dev, buf, 6) == wd->macAddr[1] &&
zmw_rx_buf_readh(dev, buf, 8) == wd->macAddr[2]) {
plcpHdrLen = 0;
}
else if (zmw_rx_buf_readh(dev, buf, 16) == wd->macAddr[0] &&
zmw_rx_buf_readh(dev, buf, 18) == wd->macAddr[1] &&
zmw_rx_buf_readh(dev, buf, 20) == wd->macAddr[2]){
plcpHdrLen = 12;
}
else {
plcpHdrLen = 0;
}
}
frameCtrl = zmw_rx_buf_readb(dev, buf, plcpHdrLen + 0);
frameType = frameCtrl & 0xf;
if (frameType != ZM_WLAN_DATA_FRAME)
{
return;
}
zm_summary.rx_mpdu_count++;
index = wd->tick - zm_summary.tick_base;
if (index < 100)
{
zm_var.rx_mpdu_tick[index]++;
}
else
{
//DbgPrint("wd->tick exceeded tick_base+100!\n");
}
}
void zfiRxPerformanceSeq(zdev_t* dev, zbuf_t* buf)
{
u16_t seq_no;
u16_t offset = 0;
u16_t old_dis = zm_summary.rx_broken_seq_dis;
//sys_time = KeQueryPerformanceCounter(&freq);
seq_no = zmw_rx_buf_readh(dev, buf, offset+22) >> 4;
ZM_SEQ_DEBUG("Out %5d\n", seq_no);
if (seq_no < zm_summary.rx_seq_base)
{
if (seq_no == 0)
{
if (zm_summary.rx_seq_base != 4095)
{
zm_summary.rx_broken_seq++;
ZM_SEQ_DEBUG("Broken seq");
zm_summary.rx_broken_seq_dis+=(4096 - zm_summary.rx_seq_base);
}
}
else if ((seq_no < 300) && (zm_summary.rx_seq_base > 3800))
{
zm_summary.rx_broken_seq++;
ZM_SEQ_DEBUG("Broken seq");
zm_summary.rx_broken_seq_dis+=(4096 - zm_summary.rx_seq_base + seq_no);
}
else
{
zm_summary.rx_broken_seq++;
ZM_SEQ_DEBUG("Broken seq");
zm_summary.rx_broken_seq_dis+=(zm_summary.rx_seq_base - seq_no);
zm_summary.rx_old_seq++;
}
}
else
{
if (seq_no != (zm_summary.rx_seq_base + 1))
{
if ((seq_no > 3800) && (zm_summary.rx_seq_base < 300))
{
zm_summary.rx_broken_seq++;
ZM_SEQ_DEBUG("Broken seq");
zm_summary.rx_broken_seq_dis+=(4096 - seq_no + zm_summary.rx_seq_base);
zm_summary.rx_old_seq++;
}
else
{
zm_summary.rx_broken_seq++;
ZM_SEQ_DEBUG("Broken seq");
zm_summary.rx_broken_seq_dis+=(seq_no - zm_summary.rx_seq_base);
}
}
}
if (seq_no == zm_summary.rx_seq_base)
{
zm_summary.rx_duplicate_seq++;
}
if ((zm_summary.rx_broken_seq_dis - old_dis) > 100)
{
DbgPrint("* seq_no=%4d, base_seq=%4d, dis_diff=%4d", seq_no,
zm_summary.rx_seq_base, zm_summary.rx_broken_seq_dis - old_dis);
}
zm_summary.rx_seq_base = seq_no;
}
void zfiRxPerformanceReg(zdev_t* dev, u32_t reg, u32_t rsp)
{
zm_summary.reset_count = (u16_t)rsp - zm_summary.reset_sum;
zm_summary.reset_sum = (u16_t)rsp;
}
void zfiRxPerformanceDup(zdev_t* dev, zbuf_t* buf1, zbuf_t* buf2)
{
u16_t seq_no1, seq_no2;
seq_no1 = zmw_rx_buf_readh(dev, buf1, 22) >> 4;
seq_no2 = zmw_rx_buf_readh(dev, buf2, 22) >> 4;
if (seq_no1 != seq_no2)
{
zm_summary.rx_duplicate_error++;
}
}
void zfiRxPerformanceFree(zdev_t* dev, zbuf_t* buf)
{
zm_summary.rx_free++;
}
void zfiRxPerformanceAMSDU(zdev_t* dev, zbuf_t* buf, u16_t len)
{
if (zm_summary.rx_amsdu_len < len)
{
zm_summary.rx_amsdu_len = len;
}
}
void zfiRxPerformanceFlush(zdev_t* dev)
{
zm_summary.rx_flush++;
}
void zfiRxPerformanceClear(zdev_t* dev)
{
zm_summary.rx_clear++;
ZM_SEQ_DEBUG("RxClear");
}
void zfiRxPerformanceReorder(zdev_t* dev)
{
zm_summary.rx_reorder++;
}
#endif /* end of ZM_ENABLE_PERFORMANCE_EVALUATION */

View File

@ -0,0 +1,97 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef _PERFORMANCE_H
#define _PERFORMANCE_H
#ifdef ZM_ENABLE_PERFORMANCE_EVALUATION
struct zsSummary
{
u32_t tx_msdu_count;
u32_t tx_mpdu_count;
u32_t rx_msdu_count;
u32_t rx_mpdu_count;
u32_t tick_base;
u16_t rx_seq_base;
u16_t rx_broken_seq;
u16_t rx_broken_sum;
u16_t rx_broken_seq_dis;
u16_t rx_duplicate_seq;
u16_t rx_duplicate_error;
u16_t rx_old_seq;
u16_t rx_lost_sum;
u16_t tx_idle_count;
u16_t rx_idle_count;
u16_t reset_count;
u16_t reset_sum;
u16_t rx_free;
u16_t rx_amsdu_len;
u16_t rx_flush;
u16_t rx_clear;
u32_t rx_reorder;
};
struct zsVariation
{
u32_t tx_msdu_tick[100];
u32_t tx_mpdu_tick[100];
u32_t rx_msdu_tick[100];
u32_t rx_mpdu_tick[100];
u32_t tx_msdu_mean;
u32_t tx_mpdu_mean;
u32_t rx_msdu_mean;
u32_t rx_mpdu_mean;
u32_t tx_msdu_sum;
u32_t tx_mpdu_sum;
u32_t rx_msdu_sum;
u32_t rx_mpdu_sum;
u32_t tx_msdu_var;
u32_t tx_mpdu_var;
u32_t rx_msdu_var;
u32_t rx_mpdu_var;
};
struct zsThroughput
{
u32_t tx[50];
u32_t rx[50];
u16_t head;
u16_t tail;
u16_t size;
LARGE_INTEGER sys_time;
LARGE_INTEGER freq;
};
void zfiPerformanceInit(zdev_t* dev);
void zfiPerformanceRefresh(zdev_t* dev);
void zfiTxPerformanceMSDU(zdev_t* dev, u32_t tick);
void zfiRxPerformanceMSDU(zdev_t* dev, u32_t tick);
void zfiTxPerformanceMPDU(zdev_t* dev, u32_t tick);
void zfiRxPerformanceMPDU(zdev_t* dev, zbuf_t* buf);
void zfiRxPerformanceSeq(zdev_t* dev, zbuf_t* buf);
void zfiRxPerformanceReg(zdev_t* dev, u32_t reg, u32_t rsp);
void zfiRxPerformanceDup(zdev_t* dev, zbuf_t* buf1, zbuf_t* buf2);
void zfiRxPerformanceFree(zdev_t* dev, zbuf_t* buf);
void zfiRxPerformanceAMSDU(zdev_t* dev, zbuf_t* buf, u16_t len);
void zfiRxPerformanceFlush(zdev_t* dev);
void zfiRxPerformanceClear(zdev_t* dev);
void zfiRxPerformanceReorder(zdev_t* dev);
#endif /* end of ZM_ENABLE_PERFORMANCE_EVALUATION */
#endif /* end of _PERFORMANCE_H */

View File

@ -0,0 +1,102 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef _PUB_USB_H
#define _PUB_USB_H
#include "../oal_dt.h"
#define ZM_HAL_80211_MODE_AP 0
#define ZM_HAL_80211_MODE_STA 1
#define ZM_HAL_80211_MODE_IBSS_GENERAL 2
#define ZM_HAL_80211_MODE_IBSS_WPA2PSK 3
/* USB module description */
/* Queue Management */
/* 80211core requires OAL to implement a transmission queue in OAL's */
/* USB module. Because there is only limited on-chip memory, so USB */
/* data transfer may be pending until on-chip memory is available. */
/* 80211core also requires OAL's USB module to provide two functions */
/* zfwUsbGetFreeTxQSize() and zfwUsbGetMaxTxQSize() for 80211core to */
/* query the status of this transmission queue. The main purpose of */
/* this queue is for QoS/WMM. Though there are hardware priority */
/* queues on the chip, and also software priority queues in the */
/* 80211core. There is still one and only one USB channel. So */
/* 80211core will use the information that zfwUsbGetFreeTxQSize() */
/* returned to schedule the traffic from the software priority */
/* queues to the hardware priority queues. For example, if 80211core */
/* found that USB transmission queue is going to be full, it will */
/* not allow packets with lower priority to enter the USB channel. */
/* Structure for USB call back functions */
struct zfCbUsbFuncTbl {
void (*zfcbUsbRecv)(zdev_t *dev, zbuf_t *buf);
void (*zfcbUsbRegIn)(zdev_t* dev, u32_t* rsp, u16_t rspLen);
void (*zfcbUsbOutComplete)(zdev_t* dev, zbuf_t *buf, u8_t status, u8_t *hdr);
void (*zfcbUsbRegOutComplete)(zdev_t* dev);
};
/* Call back functions */
/* Below are the functions that should be called by the OAL */
/* When data is available in endpoint 3, OAL shall embed the data in */
/* zbuf_t and supply to 80211core by calling this function */
/* void (*zfcbUsbRecv)(zdev_t *dev, zbuf_t *buf); */
/* When data is available in endpoint 2, OAL shall call this function */
/* void (*zfcbUsbRegIn)(zdev_t* dev, u32_t* rsp, u16_t rspLen); */
/* When USB data transfer completed in endpoint 1, OAL shall call this function */
/* void (*zfcbUsbOutComplete)(zdev_t* dev, zbuf_t *buf, u8_t status, u8_t *hdr); */
/* Call out functions */
/* Below are the functions that supply by the OAL for 80211core to */
/* manipulate the USB */
/* Return OAL's USB TxQ size */
extern u32_t zfwUsbGetMaxTxQSize(zdev_t* dev);
/* Return OAL's TxQ available size */
extern u32_t zfwUsbGetFreeTxQSize(zdev_t* dev);
/* Register call back function */
extern void zfwUsbRegisterCallBack(zdev_t* dev, struct zfCbUsbFuncTbl *zfUsbFunc);
/* Enable USB interrupt endpoint */
extern u32_t zfwUsbEnableIntEpt(zdev_t *dev, u8_t endpt);
/* Enable USB Rx endpoint */
extern int zfwUsbEnableRxEpt(zdev_t* dev, u8_t endpt);
/* 80211core call this function to send a USB request over endpoint 0 */
extern u32_t zfwUsbSubmitControl(zdev_t* dev, u8_t req, u16_t value,
u16_t index, void *data, u32_t size);
extern u32_t zfwUsbSubmitControlIo(zdev_t* dev, u8_t req, u8_t reqtype,
u16_t value, u16_t index, void *data, u32_t size);
/* 80211core call this function to transfer data out over endpoint 1 */
extern void zfwUsbCmd(zdev_t* dev, u8_t endpt, u32_t* cmd, u16_t cmdLen);
/* 80211core call this function to transfer data out over endpoint 4 */
extern u32_t zfwUsbSend(zdev_t* dev, u8_t endpt, u8_t *hdr, u16_t hdrlen, u8_t *snap, u16_t snapLen,
u8_t *tail, u16_t tailLen, zbuf_t *buf, u16_t offset);
/* 80211core call this function to set USB configuration */
extern u32_t zfwUsbSetConfiguration(zdev_t *dev, u16_t value);
#endif

View File

@ -0,0 +1,821 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef _PUB_DEFS_H
#define _PUB_DEFS_H
#include "../oal_dt.h"
/***** Section 1 : Tunable Parameters *****/
/* The defintions in this section are tunabel parameters */
/* Maximum number of BSS that could be scaned */
#define ZM_MAX_BSS 128
/* Maximum number of WPA2 PMKID that supported */
#define ZM_PMKID_MAX_BSS_CNT 8
/* Enable aggregation and deaggregation */
#define ZM_ENABLE_AGGREGATION
#ifdef ZM_ENABLE_AGGREGATION
/* Enable BA failed retransmission in firmware */
#define ZM_ENABLE_FW_BA_RETRANSMISSION
#define ZM_BYPASS_AGGR_SCHEDULING
//#define ZM_AGGR_BIT_ON
#endif
#ifndef ZM_FB50
//#define ZM_FB50
#endif
#ifndef ZM_AP_DEBUG
//#define ZM_AP_DEBUG
#endif
//#define ZM_ENABLE_BA_RATECTRL
/***** End of section 1 *****/
/***** Section 2 : Public Definitions, data structures and prototypes *****/
/* function return status */
#define ZM_STATUS_SUCCESS 0
#define ZM_STATUS_FAILURE 1
// media connect status
#define ZM_STATUS_MEDIA_CONNECT 0x00
#define ZM_STATUS_MEDIA_DISCONNECT 0x01
#define ZM_STATUS_MEDIA_DISCONNECT_NOT_FOUND 0x02
#define ZM_STATUS_MEDIA_DISABLED 0x03
#define ZM_STATUS_MEDIA_CONNECTION_DISABLED 0x04
#define ZM_STATUS_MEDIA_CONNECTION_RESET 0x05
#define ZM_STATUS_MEDIA_RESET 0x06
#define ZM_STATUS_MEDIA_DISCONNECT_DEAUTH 0x07
#define ZM_STATUS_MEDIA_DISCONNECT_DISASOC 0x08
#define ZM_STATUS_MEDIA_DISCONNECT_TIMEOUT 0x09
#define ZM_STATUS_MEDIA_DISCONNECT_AUTH_FAILED 0x0a
#define ZM_STATUS_MEDIA_DISCONNECT_ASOC_FAILED 0x0b
#define ZM_STATUS_MEDIA_DISCONNECT_MIC_FAIL 0x0c
#define ZM_STATUS_MEDIA_DISCONNECT_UNREACHABLE 0x0d
#define ZM_STATUS_MEDIA_DISCONNECT_BEACON_MISS 0x0e
// Packet Filter
#define ZM_PACKET_TYPE_DIRECTED 0x00000001
#define ZM_PACKET_TYPE_MULTICAST 0x00000002
#define ZM_PACKET_TYPE_ALL_MULTICAST 0x00000004
#define ZM_PACKET_TYPE_BROADCAST 0x00000008
#define ZM_PACKET_TYPE_PROMISCUOUS 0x00000020
/* BSS mode definition */
/* TODO : The definitions here are coupled with XP's NDIS OID. */
/* We can't be changed them freely, need to disarm this mine */
#define ZM_MODE_IBSS 0
#define ZM_MODE_INFRASTRUCTURE 1
#define ZM_MODE_UNKNOWN 2
#define ZM_MODE_INFRASTRUCTURE_MAX 3
#define ZM_MODE_AP 4
#define ZM_MODE_PSEUDO 5
/* Authentication mode */
#define ZM_AUTH_MODE_OPEN 0
#define ZM_AUTH_MODE_SHARED_KEY 1
#define ZM_AUTH_MODE_AUTO 2
#define ZM_AUTH_MODE_WPA 3
#define ZM_AUTH_MODE_WPAPSK 4
#define ZM_AUTH_MODE_WPA_NONE 5
#define ZM_AUTH_MODE_WPA2 6
#define ZM_AUTH_MODE_WPA2PSK 7
#ifdef ZM_ENABLE_CENC
#define ZM_AUTH_MODE_CENC 8
#endif //ZM_ENABLE_CENC
#define ZM_AUTH_MODE_WPA_AUTO 9
#define ZM_AUTH_MODE_WPAPSK_AUTO 10
// Encryption mode
#define ZM_NO_WEP 0x0
#define ZM_AES 0x4
#define ZM_TKIP 0x2
#define ZM_WEP64 0x1
#define ZM_WEP128 0x5
#define ZM_WEP256 0x6
#ifdef ZM_ENABLE_CENC
#define ZM_CENC 0x7
#endif //ZM_ENABLE_CENC
/* Encryption type for wep status */
#define ZM_ENCRYPTION_WEP_DISABLED 0
#define ZM_ENCRYPTION_WEP_ENABLED 1
#define ZM_ENCRYPTION_WEP_KEY_ABSENT 2
#define ZM_ENCRYPTION_NOT_SUPPORTED 3
#define ZM_ENCRYPTION_TKIP 4
#define ZM_ENCRYPTION_TKIP_KEY_ABSENT 5
#define ZM_ENCRYPTION_AES 6
#define ZM_ENCRYPTION_AES_KEY_ABSENT 7
#ifdef ZM_ENABLE_CENC
#define ZM_ENCRYPTION_CENC 8
#endif //ZM_ENABLE_CENC
/* security type */
#define ZM_SECURITY_TYPE_NONE 0
#define ZM_SECURITY_TYPE_WEP 1
#define ZM_SECURITY_TYPE_WPA 2
#ifdef ZM_ENABLE_CENC
#define ZM_SECURITY_TYPE_CENC 3
#endif //ZM_ENABLE_CENC
/* Encryption Exemption Action Type */
#define ZM_ENCRYPTION_EXEMPT_NO_EXEMPTION 0
#define ZM_ENCRYPTION_EXEMPT_ALWAYS 1
/* MIC failure */
#define ZM_MIC_PAIRWISE_ERROR 0x06
#define ZM_MIC_GROUP_ERROR 0x0E
/* power save mode */
#define ZM_STA_PS_NONE 0
#define ZM_STA_PS_MAX 1
#define ZM_STA_PS_FAST 2
#define ZM_STA_PS_LIGHT 3
/* WME AC Type */
#define ZM_WME_AC_BK 0 /* Background AC */
#define ZM_WME_AC_BE 1 /* Best-effort AC */
#define ZM_WME_AC_VIDEO 2 /* Video AC */
#define ZM_WME_AC_VOICE 3 /* Voice AC */
/* Preamble type */
#define ZM_PREAMBLE_TYPE_AUTO 0
#define ZM_PREAMBLE_TYPE_LONG 1
#define ZM_PREAMBLE_TYPE_SHORT 2
/* wireless modes constants */
#define ZM_WIRELESS_MODE_5_54 0x01 ///< 5 GHz 54 Mbps
#define ZM_WIRELESS_MODE_5_108 0x02 ///< 5 GHz 108 Mbps
#define ZM_WIRELESS_MODE_24_11 0x04 ///< 2.4 GHz 11 Mbps
#define ZM_WIRELESS_MODE_24_54 0x08 ///< 2.4 GHz 54 Mbps
#define ZM_WIRELESS_MODE_24_108 0x10 ///< 2.4 GHz 108 Mbps
#define ZM_WIRELESS_MODE_49_13 0x100 ///< 4.9 GHz 13.5 Mbps, quarter rate chn-bandwidth = 5
#define ZM_WIRELESS_MODE_49_27 0x200 ///< 4.9 GHz 27 Mbps, half rate chn-bandwidth = 10
#define ZM_WIRELESS_MODE_49_54 0x400 ///< 4.9 GHz 54 Mbps, full rate chn-bandwidth = 20
#define ZM_WIRELESS_MODE_5_300 0x1000 ///< 5 GHz 300 Mbps
#define ZM_WIRELESS_MODE_24_300 0x2000 ///< 2.4 GHz 300 Mbps
#define ZM_WIRELESS_MODE_5_130 0x4000 ///< 5 GHz 130 Mbps
#define ZM_WIRELESS_MODE_24_130 0x8000 ///< 2.4 GHz 130 Mbps
#define ZM_WIRELESS_MODE_24_N (ZM_WIRELESS_MODE_24_130|ZM_WIRELESS_MODE_24_300)
#define ZM_WIRELESS_MODE_5_N (ZM_WIRELESS_MODE_5_130|ZM_WIRELESS_MODE_5_300)
#define ZM_WIRELESS_MODE_24 (ZM_WIRELESS_MODE_24_11|ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)
#define ZM_WIRELESS_MODE_5 (ZM_WIRELESS_MODE_5_54|ZM_WIRELESS_MODE_5_N)
/* AdHoc Mode with different band */
#define ZM_ADHOCBAND_A 1
#define ZM_ADHOCBAND_B 2
#define ZM_ADHOCBAND_G 3
#define ZM_ADHOCBAND_BG 4
#define ZM_ADHOCBAND_ABG 5
/* Authentication algorithm in the field algNo of authentication frames */
#define ZM_AUTH_ALGO_OPEN_SYSTEM 0x10000 /* Open system */
#define ZM_AUTH_ALGO_SHARED_KEY 0x10001 /* Shared Key */
#define ZM_AUTH_ALGO_LEAP 0x10080 /* Leap */
struct zsScanResult
{
u32_t reserved;
};
struct zsStastics
{
u32_t reserved;
};
#define ZM_MAX_SUPP_RATES_IE_SIZE 12
#define ZM_MAX_IE_SIZE 50 //100
#define ZM_MAX_WPS_IE_SIZE 150
#define ZM_MAX_PROBE_FRAME_BODY_SIZE 512//300
#define ZM_MAX_COUNTRY_INFO_SIZE 20
#define ZM_MAX_SSID_LENGTH 32
struct zsBssInfo
{
u8_t macaddr[6];
u8_t bssid[6];
u8_t beaconInterval[2];
u8_t capability[2];
u8_t timeStamp[8];
u8_t ssid[ZM_MAX_SSID_LENGTH + 2]; // EID(1) + Length(1) + SSID(32)
u8_t supportedRates[ZM_MAX_SUPP_RATES_IE_SIZE + 2]; // EID(1) + Length(1) + supported rates [12]
u8_t channel;
u16_t frequency;
u16_t atimWindow;
u8_t erp;
u8_t extSupportedRates[ZM_MAX_SUPP_RATES_IE_SIZE + 2]; // EID(1) + Length(1) + extended supported rates [12]
u8_t wpaIe[ZM_MAX_IE_SIZE + 2];
u8_t wscIe[ZM_MAX_WPS_IE_SIZE + 2];
u8_t rsnIe[ZM_MAX_IE_SIZE + 2];
#ifdef ZM_ENABLE_CENC
u8_t cencIe[ZM_MAX_IE_SIZE + 2]; /* CENC */ /* half size because of memory exceed 64k boundary */
#endif //ZM_ENABLE_CENC
u8_t securityType;
u8_t signalStrength;
u8_t signalQuality;
u16_t sortValue;
u8_t wmeSupport;
u8_t flag;
u8_t EnableHT;
u8_t enableHT40;
u8_t SG40;
u8_t extChOffset;
u8_t apCap; // bit0:11N AP
u16_t frameBodysize;
u8_t frameBody[ZM_MAX_PROBE_FRAME_BODY_SIZE];
u8_t countryInfo[ZM_MAX_COUNTRY_INFO_SIZE + 2];
u16_t athOwlAp;
u16_t marvelAp;
u16_t broadcomHTAp;
u32_t tick;
struct zsBssInfo* next;
};
struct zsBssList
{
u8_t bssCount;
struct zsBssInfo* head;
struct zsBssInfo* tail;
};
struct zsBssListV1
{
u8_t bssCount;
struct zsBssInfo bssInfo[ZM_MAX_BSS];
};
#define ZM_KEY_FLAG_GK 0x0001
#define ZM_KEY_FLAG_PK 0X0002
#define ZM_KEY_FLAG_AUTHENTICATOR 0x0004
#define ZM_KEY_FLAG_INIT_IV 0x0008
#define ZM_KEY_FLAG_DEFAULT_KEY 0x0010
#ifdef ZM_ENABLE_CENC
#define ZM_KEY_FLAG_CENC 0x0020
#endif //ZM_ENABLE_CENC
// Comment: For TKIP, key[0]~key[15] => TKIP key
// key[16]~key[23] => Tx MIC key
// key[24]~key[31] => Rx MIC key
struct zsKeyInfo
{
u8_t* key;
u8_t keyLength;
u8_t keyIndex;
u8_t* initIv;
u16_t flag;
u8_t vapId;
u16_t vapAddr[3];
u16_t* macAddr;
};
/*
* Channels are specified by frequency.
*/
typedef struct {
u16_t channel; /* setting in Mhz */
u32_t channelFlags; /* see below */
u8_t privFlags;
s8_t maxRegTxPower; /* max regulatory tx power in dBm */
s8_t maxTxPower; /* max true tx power in 0.25 dBm */
s8_t minTxPower; /* min true tx power in 0.25 dBm */
} ZM_HAL_CHANNEL;
struct zsRegulationTable
{
u16_t regionCode;
u16_t CurChIndex;
u16_t allowChannelCnt;
ZM_HAL_CHANNEL allowChannel[60]; /* 2.4GHz: 14 channels, 5 GHz: 31 channels */
};
struct zsPartnerNotifyEvent
{
u8_t bssid[6]; // The BSSID of IBSS
u8_t peerMacAddr[6]; // The MAC address of peer station
};
#define ZM_RC_TRAINED_BIT 0x1
struct zsRcCell
{
u32_t txCount;
u32_t failCount;
u8_t currentRate;
u8_t currentRateIndex;
u32_t probingTime;
u8_t operationRateSet[24];
u8_t operationRateCount;
u16_t rxRssi;
u8_t flag;
u32_t lasttxCount;
u32_t lastTime;
};
struct zsOppositeInfo
{
u8_t macAddr[6];
struct zsRcCell rcCell;
u8_t valid; // This indicate if this opposite is still valid
u8_t aliveCounter;
u8_t pkInstalled;
#ifdef ZM_ENABLE_IBSS_WPA2PSK
/* For WPA2PSK ! */
u8_t wpaState;
u8_t camIdx;
u8_t encryMode;
u16_t iv16;
u32_t iv32;
#endif
};
typedef void (*zfpIBSSIteratePeerStationCb)(
zdev_t* dev, struct zsOppositeInfo *peerInfo, void *ctx, u8_t index);
typedef u16_t (*zfpStaRxSecurityCheckCb)(zdev_t* dev, zbuf_t* buf);
/* Communication Tally data structure */
struct zsCommTally
{
u32_t txUnicastFrm; // 0 txUnicastFrames
u32_t txMulticastFrm; // 1 txMulticastFrames
u32_t txUnicastOctets; // 2 txUniOctets byte size
u32_t txMulticastOctets; // 3 txMultiOctets byte size
u32_t txFrmUpperNDIS; // 4
u32_t txFrmDrvMgt; // 5
u32_t RetryFailCnt; // 6
u32_t Hw_TotalTxFrm; // 7 Hardware total Tx Frame
u32_t Hw_RetryCnt; // 8 txMultipleRetriesFrames
u32_t Hw_UnderrunCnt; // 9
u32_t DriverRxFrmCnt; // 10
u32_t rxUnicastFrm; // 11 rxUnicastFrames
u32_t rxMulticastFrm; // 12rxMulticastFrames
u32_t NotifyNDISRxFrmCnt; // 14
u32_t rxUnicastOctets; // 15 rxUniOctets byte size
u32_t rxMulticastOctets; // 16 rxMultiOctets byte size
u32_t DriverDiscardedFrm; // 17 Discard by ValidateFrame
u32_t LessThanDataMinLen; // 18
u32_t GreaterThanMaxLen; // 19
u32_t DriverDiscardedFrmCauseByMulticastList;
u32_t DriverDiscardedFrmCauseByFrmCtrl;
u32_t rxNeedFrgFrm; // 22 need more frg frm
u32_t DriverRxMgtFrmCnt;
u32_t rxBroadcastFrm; // 24 Receive broadcast frame count
u32_t rxBroadcastOctets; // 25 Receive broadcast frame byte size
u32_t rx11bDataFrame; // 26 Measured quality 11b data frame count
u32_t rxOFDMDataFrame; // 27 Measured quality 11g data frame count
u32_t Hw_TotalRxFrm; // 28
u32_t Hw_CRC16Cnt; // 29 rxPLCPCRCErrCnt
u32_t Hw_CRC32Cnt; // 30 rxCRC32ErrCnt
u32_t Hw_DecrypErr_UNI; // 31
u32_t Hw_DecrypErr_Mul; // 32
u32_t Hw_RxFIFOOverrun; // 34
u32_t Hw_RxTimeOut; // 35
u32_t LossAP; // 36
u32_t Tx_MPDU; // 37
u32_t BA_Fail; // 38
u32_t Hw_Tx_AMPDU; // 39
u32_t Hw_Tx_MPDU; // 40
u32_t RateCtrlTxMPDU;
u32_t RateCtrlBAFail;
u32_t txQosDropCount[5]; //41 42 43 44 45
u32_t Hw_RxMPDU; // 46
u32_t Hw_RxDropMPDU; // 47
u32_t Hw_RxDelMPDU; // 48
u32_t Hw_RxPhyMiscError; // 49
u32_t Hw_RxPhyXRError; // 50
u32_t Hw_RxPhyOFDMError; // 51
u32_t Hw_RxPhyCCKError; // 52
u32_t Hw_RxPhyHTError; // 53
u32_t Hw_RxPhyTotalCount; // 54
u32_t swRxFragmentCount; // 55
u32_t swRxUnicastMicFailCount; // 56
u32_t swRxMulticastMicFailCount; // 57
u32_t swRxDropUnencryptedCount; // 58
u32_t txBroadcastFrm;
u32_t txBroadcastOctets;
};
/* Traffic Monitor Tally data structure */
struct zsTrafTally
{
u32_t rxDuplicate;
u32_t rxSrcIsOwnMac;
//u32_t rxDataFrameCount;
//u32_t rxDataByteCount;
//u32_t rxDataBytesIn1000ms;
//u32_t rxDataTmpFor1000ms;
//u32_t rxDataBytesIn2000ms;
//u32_t rxDataTmpFor2000ms;
//u32_t txDataFrameCount;
//u32_t txDataByteCount;
//u32_t txDataBytesIn1000ms;
//u32_t txDataTmpFor1000ms;
u32_t txDataBytesIn2000ms;
u32_t txDataTmpFor2000ms;
};
/* Hal rx packet moniter information */
struct zsMonHalRxInfo
{
u32_t currentRSSI[7];
u32_t currentRxEVM[14];
u32_t currentRxDataMT;
u32_t currentRxDataMCS;
u32_t currentRxDataBW;
u32_t currentRxDataSG;
};
struct zsTail
{
u8_t SignalStrength1;
u8_t SignalStrength2;
u8_t SignalStrength3;
u8_t SignalQuality;
u8_t SAIndex;
u8_t DAIndex;
u8_t ErrorIndication;
u8_t RxMacStatus;
};
union zuTail
{
struct zsTail Data;
u8_t Byte[8];
};
struct zsAdditionInfo
{
u8_t PlcpHeader[12];
union zuTail Tail;
};
struct zsPmkidBssidInfo
{
u16_t bssid[3];
u8_t pmkid[16];
};
struct zsPmkidInfo
{
u32_t bssidCount;
struct zsPmkidBssidInfo bssidInfo[ZM_PMKID_MAX_BSS_CNT];
};
struct zsCbFuncTbl
{
u16_t (*zfcbAuthNotify)(zdev_t* dev, u16_t* macAddr);
u16_t (*zfcbAsocNotify)(zdev_t* dev, u16_t* macAddr, u8_t* body,
u16_t bodySize, u16_t port);
u16_t (*zfcbDisAsocNotify)(zdev_t* dev, u8_t* macAddr, u16_t port);
u16_t (*zfcbApConnectNotify)(zdev_t* dev, u8_t* macAddr, u16_t port);
void (*zfcbConnectNotify)(zdev_t* dev, u16_t status, u16_t* bssid);
void (*zfcbScanNotify)(zdev_t* dev, struct zsScanResult* result);
void (*zfcbMicFailureNotify)(zdev_t* dev, u16_t* addr, u16_t status);
void (*zfcbApMicFailureNotify)(zdev_t* dev, u8_t* addr, zbuf_t* buf);
void (*zfcbIbssPartnerNotify)(zdev_t* dev, u16_t status,
struct zsPartnerNotifyEvent *event);
void (*zfcbMacAddressNotify)(zdev_t* dev, u8_t* addr);
void (*zfcbSendCompleteIndication)(zdev_t* dev, zbuf_t* buf);
void (*zfcbRecvEth)(zdev_t* dev, zbuf_t* buf, u16_t port);
void (*zfcbRecv80211)(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo);
void (*zfcbRestoreBufData)(zdev_t* dev, zbuf_t* buf);
#ifdef ZM_ENABLE_CENC
u16_t (*zfcbCencAsocNotify)(zdev_t* dev, u16_t* macAddr, u8_t* body,
u16_t bodySize, u16_t port);
#endif //ZM_ENABLE_CENC
u8_t (*zfcbClassifyTxPacket)(zdev_t* dev, zbuf_t* buf);
void (*zfcbHwWatchDogNotify)(zdev_t* dev);
};
extern void zfZeroMemory(u8_t* va, u16_t length);
#define ZM_INIT_CB_FUNC_TABLE(p) zfZeroMemory((u8_t *)p, sizeof(struct zsCbFuncTbl));
//extern struct zsWlanDev zgWlanDev;
/* Initialize WLAN hardware and software, resource will be allocated */
/* for WLAN operation, must be called first before other function. */
extern u16_t zfiWlanOpen(zdev_t* dev, struct zsCbFuncTbl* cbFuncTbl);
/* WLAN hardware will be shutdown and all resource will be release */
extern u16_t zfiWlanClose(zdev_t* dev);
/* Enable/disable Wlan operation */
extern u16_t zfiWlanEnable(zdev_t* dev);
extern u16_t zfiWlanDisable(zdev_t* dev, u8_t ResetKeyCache);
extern u16_t zfiWlanResume(zdev_t* dev, u8_t doReconn);
extern u16_t zfiWlanSuspend(zdev_t* dev);
/* Enable/disable ISR interrupt */
extern u16_t zfiWlanInterruptEnable(zdev_t* dev);
extern u16_t zfiWlanInterruptDisable(zdev_t* dev);
/* Do WLAN site survey */
extern u16_t zfiWlanScan(zdev_t* dev);
/* Get WLAN stastics */
extern u16_t zfiWlanGetStatistics(zdev_t* dev);
/* Reset WLAN */
extern u16_t zfiWlanReset(zdev_t* dev);
/* Deauthenticate a STA */
extern u16_t zfiWlanDeauth(zdev_t* dev, u16_t* macAddr, u16_t reason);
extern u16_t zfiTxSendEth(zdev_t* dev, zbuf_t* buf, u16_t port);
extern u8_t zfiIsTxQueueFull(zdev_t* dev);
extern u16_t zfiTxSend80211Mgmt(zdev_t* dev, zbuf_t* buf, u16_t port);
extern void zfiIsrPci(zdev_t* dev);
extern u8_t zfiWlanIBSSGetPeerStationsCount(zdev_t* dev);
extern u8_t zfiWlanIBSSIteratePeerStations(zdev_t* dev, u8_t numToIterate, zfpIBSSIteratePeerStationCb callback, void *ctx);
extern void zfiWlanFlushAllQueuedBuffers(zdev_t* dev);
/* coid.c */
extern void zfiWlanQueryMacAddress(zdev_t* dev, u8_t* addr);
extern u16_t zfiGlobalDataSize(zdev_t* dev);
extern void zfiHeartBeat(zdev_t* dev);
extern void zfiWlanSetWlanMode(zdev_t* dev, u8_t wlanMode);
extern void zfiWlanSetAuthenticationMode(zdev_t* dev, u8_t authMode);
extern void zfiWlanSetWepStatus(zdev_t* dev, u8_t wepStatus);
extern void zfiWlanSetSSID(zdev_t* dev, u8_t* ssid, u8_t ssidLength);
extern void zfiWlanSetFragThreshold(zdev_t* dev, u16_t fragThreshold);
extern void zfiWlanSetRtsThreshold(zdev_t* dev, u16_t rtsThreshold);
extern void zfiWlanSetFrequency(zdev_t* dev, u32_t frequency, u8_t bImmediate);
extern void zfiWlanSetBssid(zdev_t* dev, u8_t* bssid);
extern void zfiWlanSetBeaconInterval(zdev_t* dev, u16_t beaconInterval,
u8_t bImmediate);
extern void zfiWlanSetDtimCount(zdev_t* dev, u8_t dtim);
extern void zfiWlanSetAtimWindow(zdev_t* dev, u16_t atimWindow, u8_t bImmediate);
extern void zfiWlanSetEncryMode(zdev_t* dev, u8_t encryMode);
extern u8_t zfiWlanSetKey(zdev_t* dev, struct zsKeyInfo keyInfo);
extern u8_t zfiWlanPSEUDOSetKey(zdev_t* dev, struct zsKeyInfo keyInfo);
extern void zfiWlanSetPowerSaveMode(zdev_t* dev, u8_t mode);
extern void zfiWlanQueryBssListV1(zdev_t* dev, struct zsBssListV1* bssListV1);
extern void zfiWlanQueryBssList(zdev_t* dev, struct zsBssList* pBssList);
extern void zfiWlanSetProtectionMode(zdev_t* dev, u8_t mode);
extern void zfiWlanFlushBssList(zdev_t* dev);
void zfiWlanDisableDfsChannel(zdev_t* dev, u8_t disableFlag);
extern u8_t zfiWlanQueryWlanMode(zdev_t* dev);
extern u16_t zfiWlanChannelToFrequency(zdev_t* dev, u8_t channel);
extern u8_t zfiWlanFrequencyToChannel(zdev_t* dev, u16_t freq);
#define ZM_WLAN_STATE_OPENED 0
#define ZM_WLAN_STATE_ENABLED 1
#define ZM_WLAN_STATE_DISABLED 2
#define ZM_WLAN_STATE_CLOSEDED 3
extern u8_t zfiWlanQueryAdapterState(zdev_t* dev);
extern u8_t zfiWlanQueryAuthenticationMode(zdev_t* dev, u8_t bWrapper);
extern u8_t zfiWlanQueryWepStatus(zdev_t* dev, u8_t bWrapper);
extern void zfiWlanQuerySSID(zdev_t* dev, u8_t* ssid, u8_t* pSsidLength);
extern u16_t zfiWlanQueryFragThreshold(zdev_t* dev);
extern u16_t zfiWlanQueryRtsThreshold(zdev_t* dev);
extern u32_t zfiWlanQueryFrequency(zdev_t* dev);
extern u32_t zfiWlanQueryCurrentFrequency(zdev_t* dev, u8_t qmode);
extern u32_t zfiWlanQueryFrequencyAttribute(zdev_t* dev, u32_t frequency);
extern void zfiWlanQueryFrequencyHT(zdev_t* dev, u32_t *bandWidth, u32_t *extOffset);
extern u8_t zfiWlanQueryCWMode(zdev_t* dev);
extern u32_t zfiWlanQueryCWEnable(zdev_t* dev);
extern void zfiWlanQueryBssid(zdev_t* dev, u8_t* bssid);
extern u16_t zfiWlanQueryBeaconInterval(zdev_t* dev);
extern u32_t zfiWlanQueryRxBeaconTotal(zdev_t* dev);
extern u16_t zfiWlanQueryAtimWindow(zdev_t* dev);
extern u8_t zfiWlanQueryEncryMode(zdev_t* dev);
extern u16_t zfiWlanQueryCapability(zdev_t* dev);
extern u16_t zfiWlanQueryAid(zdev_t* dev);
extern void zfiWlanQuerySupportRate(zdev_t* dev, u8_t* rateArray, u8_t* pLength);
extern void zfiWlanQueryExtSupportRate(zdev_t* dev, u8_t* rateArray, u8_t* pLength);
extern void zfiWlanQueryRsnIe(zdev_t* dev, u8_t* ie, u8_t* pLength);
extern void zfiWlanQueryWpaIe(zdev_t* dev, u8_t* ie, u8_t* pLength);
extern u8_t zfiWlanQueryHTMode(zdev_t* dev);
extern u8_t zfiWlanQueryBandWidth40(zdev_t* dev);
extern u8_t zfiWlanQueryMulticastCipherAlgo(zdev_t *dev);
extern u16_t zfiWlanQueryRegionCode(zdev_t* dev);
extern void zfiWlanSetWpaIe(zdev_t* dev, u8_t* ie, u8_t Length);
extern void zfiWlanSetWpaSupport(zdev_t* dev, u8_t WpaSupport);
extern void zfiWlanCheckStaWpaIe(zdev_t* dev);
extern void zfiWlanSetBasicRate(zdev_t* dev, u8_t bRateSet, u8_t gRateSet,
u32_t nRateSet);
extern void zfiWlanSetBGMode(zdev_t* dev, u8_t mode);
extern void zfiWlanSetpreambleType(zdev_t* dev, u8_t type);
extern u8_t zfiWlanQuerypreambleType(zdev_t* dev);
extern u8_t zfiWlanQueryPowerSaveMode(zdev_t* dev);
extern void zfiWlanSetMacAddress(zdev_t* dev, u16_t* mac);
extern u16_t zfiWlanSetTxRate(zdev_t* dev, u16_t rate);
extern u32_t zfiWlanQueryTxRate(zdev_t* dev);
extern void zfWlanUpdateRxRate(zdev_t* dev, struct zsAdditionInfo* addInfo);
extern u32_t zfiWlanQueryRxRate(zdev_t* dev);
extern u8_t zfiWlanSetPmkidInfo(zdev_t* dev, u16_t* bssid, u8_t* pmkid);
extern u32_t zfiWlanQueryPmkidInfo(zdev_t* dev, u8_t* buf, u32_t len);
extern void zfiWlanSetAllMulticast(zdev_t* dev, u32_t setting);
extern void zfiWlanSetHTCtrl(zdev_t* dev, u32_t *setting, u32_t forceTxTPC);
extern void zfiWlanQueryHTCtrl(zdev_t* dev, u32_t *setting, u32_t *forceTxTPC);
extern void zfiWlanDbg(zdev_t* dev, u8_t setting);
extern void zfiWlanResetTally(zdev_t* dev);
extern void zfiWlanQueryTally(zdev_t* dev, struct zsCommTally *tally);
extern void zfiWlanQueryTrafTally(zdev_t* dev, struct zsTrafTally *tally);
extern void zfiWlanQueryMonHalRxInfo(zdev_t* dev, struct zsMonHalRxInfo *halRxInfo);
extern u32_t zfiFWConfig(zdev_t* dev, u32_t size);
extern void zfiDKEnable(zdev_t* dev, u32_t enable);
extern void zfiWlanSetMulticastList(zdev_t* dev, u8_t size, u8_t* pList);
extern void zfiWlanRemoveKey(zdev_t* dev, u8_t keyType, u8_t keyId);
extern u8_t zfiWlanQueryIsPKInstalled(zdev_t *dev, u8_t *staMacAddr);
extern u32_t zfiWlanQueryPacketTypePromiscuous(zdev_t* dev);
extern void zfiWlanSetPacketTypePromiscuous(zdev_t* dev, u32_t setValue);
extern void zfiSetChannelManagement(zdev_t* dev, u32_t setting);
extern void zfiSetRifs(zdev_t* dev, u16_t setting);
extern void zfiCheckRifs(zdev_t* dev);
extern void zfiSetReorder(zdev_t* dev, u16_t value);
extern void zfiSetSeqDebug(zdev_t* dev, u16_t value);
extern u16_t zfiConfigWdsPort(zdev_t* dev, u8_t wdsPortId, u16_t flag, u16_t* wdsAddr,
u16_t encType, u32_t* wdsKey);
extern void zfiWlanQueryRegulationTable(zdev_t* dev, struct zsRegulationTable* pEntry);
extern void zfiWlanSetScanTimerPerChannel(zdev_t* dev, u16_t time);
extern void zfiWlanSetAutoReconnect(zdev_t* dev, u8_t enable);
extern u32_t zfiDebugCmd(zdev_t* dev, u32_t cmd, u32_t value);
extern void zfiWlanSetProbingHiddenSsid(zdev_t* dev, u8_t* ssid, u8_t ssidLen,
u16_t entry);
extern void zfiWlanSetDropUnencryptedPackets(zdev_t* dev, u8_t enable);
extern void zfiWlanSetIBSSJoinOnly(zdev_t* dev, u8_t joinOnly);
extern void zfiWlanSetDefaultKeyId(zdev_t* dev, u8_t keyId);
extern void zfiWlanSetDisableProbingWithSsid(zdev_t* dev, u8_t mode);
extern void zfiWlanQueryGSN(zdev_t* dev, u8_t *gsn, u16_t vapId);
extern u16_t zfiStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType);
extern u8_t zfiWlanSetDot11DMode(zdev_t* dev, u8_t mode);
extern u8_t zfiWlanSetDot11HDFSMode(zdev_t* dev, u8_t mode);
extern u8_t zfiWlanSetDot11HTPCMode(zdev_t* dev, u8_t mode);
extern u8_t zfiWlanSetAniMode(zdev_t* dev, u8_t mode);
extern void zfiWlanSetStaWme(zdev_t* dev, u8_t enable, u8_t uapsdInfo);
extern void zfiWlanSetApWme(zdev_t* dev, u8_t enable);
extern u8_t zfiWlanQuerywmeEnable(zdev_t* dev);
#ifdef ZM_OS_LINUX_FUNC
extern void zfiWlanShowTally(zdev_t* dev);
#endif
#ifdef ZM_ENABLE_CENC
/* CENC */
extern u8_t zfiWlanSetCencPairwiseKey(zdev_t* dev, u8_t keyid, u32_t *txiv, u32_t *rxiv,
u8_t *key, u8_t *mic);
extern u8_t zfiWlanSetCencGroupKey(zdev_t* dev, u8_t keyid, u32_t *rxiv,
u8_t *key, u8_t *mic);
#endif //ZM_ENABLE_CENC
extern void zfiWlanQuerySignalInfo(zdev_t* dev, u8_t *buffer);
extern void zfiWlanQueryAdHocCreatedBssDesc(zdev_t* dev, struct zsBssInfo *pBssInfo);
extern u8_t zfiWlanQueryAdHocIsCreator(zdev_t* dev);
extern u32_t zfiWlanQuerySupportMode(zdev_t* dev);
extern u32_t zfiWlanQueryTransmitPower(zdev_t* dev);
extern void zfiWlanEnableLeapConfig(zdev_t* dev, u8_t leapEnabled);
/* returned buffer allocated by driver core */
extern void zfiRecvEthComplete(zdev_t* dev, zbuf_t* buf);
extern void zfiRecv80211(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo);
extern void zfiWlanSetMaxTxPower(zdev_t* dev, u8_t power2, u8_t power5);
extern void zfiWlanQueryMaxTxPower(zdev_t* dev, u8_t *power2, u8_t *power5);
extern void zfiWlanSetConnectMode(zdev_t* dev, u8_t mode);
extern void zfiWlanSetSupportMode(zdev_t* dev, u32_t mode);
extern void zfiWlanSetAdhocMode(zdev_t* dev, u32_t mode);
extern u32_t zfiWlanQueryAdhocMode(zdev_t* dev, u8_t bWrapper);
extern u8_t zfiWlanSetCountryIsoName(zdev_t* dev, u8_t *countryIsoName, u8_t length);
extern const char* zfiWlanQueryCountryIsoName(zdev_t* dev);
extern u8_t zfiWlanQueryregulatoryDomain(zdev_t* dev);
extern u8_t zfiWlanQueryCCS(zdev_t* dev);
extern void zfiWlanSetCCS(zdev_t* dev, u8_t mode);
extern void zfiWlanSetRegulatory(zdev_t* dev, u8_t CCS, u16_t Code, u8_t bfirstChannel);
extern const char* zfiHpGetisoNamefromregionCode(zdev_t* dev, u16_t regionCode);
extern void zfiWlanSetLEDCtrlParam(zdev_t* dev, u8_t type, u8_t flag);
extern u32_t zfiWlanQueryReceivedPacket(zdev_t* dev);
extern void zfiWlanCheckSWEncryption(zdev_t* dev);
extern u16_t zfiWlanQueryAllowChannels(zdev_t *dev, u16_t *channels);
extern u16_t zfiWlanGetMulticastAddressCount(zdev_t* dev);
extern void zfiWlanGetMulticastList(zdev_t* dev, u8_t* pMCList);
extern void zfiWlanSetPacketFilter(zdev_t* dev, u32_t PacketFilter);
extern u8_t zfiCompareWithMulticastListAddress(zdev_t* dev, u16_t* dstMacAddr);
extern void zfiWlanSetSafeModeEnabled(zdev_t* dev, u8_t safeMode);
extern void zfiWlanSetIBSSAdditionalIELength(zdev_t* dev, u32_t ibssAdditionalIESize, u8_t* ibssAdditionalIE);
extern void zfiWlanSetXLinkMode(zdev_t* dev, u32_t setValue);
/* hprw.c */
extern u32_t zfiDbgWriteFlash(zdev_t* dev, u32_t addr, u32_t val);
extern u32_t zfiDbgWriteReg(zdev_t* dev, u32_t addr, u32_t val);
extern u32_t zfiDbgReadReg(zdev_t* dev, u32_t addr);
extern u32_t zfiDbgWriteEeprom(zdev_t* dev, u32_t addr, u32_t val);
extern u32_t zfiDbgBlockWriteEeprom(zdev_t* dev, u32_t addr, u32_t* buf);
extern u32_t zfiDbgBlockWriteEeprom_v2(zdev_t* dev, u32_t addr, u32_t* buf, u32_t wrlen);
extern u16_t zfiDbgChipEraseFlash(zdev_t *dev);
extern u16_t zfiDbgProgramFlash(zdev_t *dev, u32_t offset, u32_t len, u32_t *data);
extern u32_t zfiDbgGetFlashCheckSum(zdev_t *dev, u32_t addr, u32_t len);
extern u32_t zfiDbgReadFlash(zdev_t *dev, u32_t addr, u32_t len);
extern u32_t zfiDownloadFwSet(zdev_t *dev);
extern u32_t zfiDbgDelayWriteReg(zdev_t* dev, u32_t addr, u32_t val);
extern u32_t zfiDbgFlushDelayWrite(zdev_t* dev);
extern u32_t zfiDbgSetIFSynthesizer(zdev_t* dev, u32_t value);
extern u32_t zfiDbgReadTally(zdev_t* dev);
extern u32_t zfiDbgQueryHwTxBusy(zdev_t* dev);
extern u8_t zfiWlanGetDestAddrFromBuf(zdev_t *dev, zbuf_t *buf, u16_t *macAddr);
extern u32_t zfiWlanQueryHwCapability(zdev_t* dev);
extern void zfiWlanSetDynamicSIFSParam(zdev_t* dev, u8_t val);
/***** End of section 2 *****/
/***** section 3 performace evaluation *****/
#ifdef ZM_ENABLE_PERFORMANCE_EVALUATION
extern void zfiTxPerformanceMSDU(zdev_t* dev, u32_t tick);
extern void zfiRxPerformanceMPDU(zdev_t* dev, zbuf_t* buf);
extern void zfiRxPerformanceReg(zdev_t* dev, u32_t reg, u32_t rsp);
#define ZM_PERFORMANCE_INIT(dev) zfiPerformanceInit(dev);
#define ZM_PERFORMANCE_TX_MSDU(dev, tick) zfiTxPerformanceMSDU(dev, tick);
#define ZM_PERFORMANCE_RX_MSDU(dev, tick) zfiRxPerformanceMSDU(dev, tick);
#define ZM_PERFORMANCE_TX_MPDU(dev, tick) zfiTxPerformanceMPDU(dev, tick);
#define ZM_PERFORMANCE_RX_MPDU(dev, buf) zfiRxPerformanceMPDU(dev, buf);
#define ZM_PERFORMANCE_RX_SEQ(dev, buf) zfiRxPerformanceSeq(dev, buf);
#define ZM_PERFORMANCE_REG(dev, reg, rsp) {if(cmd[1] == reg) zfiRxPerformanceReg(dev, reg, rsp);}
#define ZM_PERFORMANCE_DUP(dev, buf1, buf2) zfiRxPerformanceDup(dev, buf1, buf2);
#define ZM_PERFORMANCE_FREE(dev, buf) zfiRxPerformanceFree(dev, buf);
#define ZM_PERFORMANCE_RX_AMSDU(dev, buf, len) zfiRxPerformanceAMSDU(dev, buf, len);
#define ZM_PERFORMANCE_RX_FLUSH(dev) zfiRxPerformanceFlush(dev);
#define ZM_PERFORMANCE_RX_CLEAR(dev) zfiRxPerformanceClear(dev);
#define ZM_SEQ_DEBUG if (wd->seq_debug) DbgPrint
#define ZM_PERFORMANCE_RX_REORDER(dev) zfiRxPerformanceReorder(dev);
#else
#define ZM_PERFORMANCE_INIT(dev)
#define ZM_PERFORMANCE_TX_MSDU(dev, tick)
#define ZM_PERFORMANCE_RX_MSDU(dev, tick)
#define ZM_PERFORMANCE_TX_MPDU(dev, tick)
#define ZM_PERFORMANCE_RX_MPDU(dev, buf)
#define ZM_PERFORMANCE_RX_SEQ(dev, buf)
#define ZM_PERFORMANCE_REG(dev, reg, rsp)
#define ZM_PERFORMANCE_DUP(dev, buf1, buf2)
#define ZM_PERFORMANCE_FREE(dev, buf)
#define ZM_PERFORMANCE_RX_AMSDU(dev, buf, len)
#define ZM_PERFORMANCE_RX_FLUSH(dev)
#define ZM_PERFORMANCE_RX_CLEAR(dev)
#define ZM_SEQ_DEBUG
#define ZM_PERFORMANCE_RX_REORDER(dev)
#endif
/***** End of section 3 *****/
#endif

View File

@ -0,0 +1,93 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef _PUB_ZFW_H
#define _PUB_ZFW_H
#include "../oal_dt.h"
/* Buffer management */
#ifdef ZM_ENABLE_BUFFER_DEBUG
extern zbuf_t* zfwBufAllocateWithContext(zdev_t* dev, u16_t len, u8_t *functionName, ULONG line);
#define zfwBufAllocate(dev, len) zfwBufAllocateWithContext(dev, len, (u8_t *)__FUNCTION__, __LINE__)
#else
extern zbuf_t* zfwBufAllocate(zdev_t* dev, u16_t len);
#endif
extern void zfwBufFree(zdev_t* dev, zbuf_t* buf, u16_t errCode);
extern u16_t zfwBufChain(zdev_t* dev, zbuf_t** head, zbuf_t* tail);
extern u16_t zfwBufCopy(zdev_t* dev, zbuf_t* dst, zbuf_t* src);
extern u16_t zfwBufSetSize(zdev_t* dev, zbuf_t* buf, u16_t size);
extern u16_t zfwBufRemoveHead(zdev_t* dev, zbuf_t* buf, u16_t size);
extern u16_t zfwBufGetSize(zdev_t* dev, zbuf_t* buf);
extern void zfwCopyBufContext(zdev_t* dev, zbuf_t* source, zbuf_t* dest);
/* Memory management */
extern void* zfwMemAllocate(zdev_t* dev, u32_t size);
extern void zfwMemFree(zdev_t* dev, void* mem, u32_t size);
extern void zfwMemoryCopy(u8_t* dst, u8_t* src, u16_t length);
extern void zfwMemoryMove(u8_t* dst, u8_t* src, u16_t length);
extern void zfwZeroMemory(u8_t* va, u16_t length);
extern u8_t zfwMemoryIsEqual(u8_t* m1, u8_t* m2, u16_t length);
/* Others */
extern void zfwSleep(zdev_t* dev, u32_t ms);
extern u16_t zfwGetVapId(zdev_t* dev);
extern u16_t zfwStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType);
extern u32_t zfwWaitForEvent(zdev_t *dev, u32_t event, u32_t timeout);
extern void zfwSendEvent(zdev_t* dev);
extern void zfwGetActiveScanDur(zdev_t* dev, u8_t* Dur );
extern void zfwGetShowZeroLengthSSID(zdev_t* dev, u8_t* Dur );
/* For debugging */
extern void zfwDumpBuf(zdev_t* dev, zbuf_t* buf);
extern void zfwDbgReadRegDone(zdev_t* dev, u32_t addr, u32_t val);
/* For Evl */
extern void zfwDbgDownloadFwInitDone(zdev_t* dev);
extern void zfwDbgReadFlashDone(zdev_t* dev, u32_t addr, u32_t* rspdata, u32_t datalen);
extern void zfwDbgGetFlashChkSumDone(zdev_t* dev, u32_t* rspdata);
extern void zfwDbgProgrameFlashDone(zdev_t* dev);
extern void zfwDbgProgrameFlashChkDone(zdev_t* dev);
extern void zfwDbgWriteRegDone(zdev_t* dev, u32_t addr, u32_t val);
extern void zfwDbgWriteEepromDone(zdev_t* dev, u32_t addr, u32_t val);
extern void zfwDbgReadTallyDone(zdev_t* dev);
extern void zfwWlanReadRegDone(zdev_t* dev, u32_t addr, u32_t val);
extern void zfwWlanWriteRegDone(zdev_t* dev, u32_t addr, u32_t val);
extern void zfwWlanReadTallyDone(zdev_t* dev);
extern void zfwDbgQueryHwTxBusyDone(zdev_t* dev, u32_t val);
extern u32_t zfwReadReg(zdev_t* dev, u32_t offset);
extern u32_t zfwReadEeprom(zdev_t* dev, u32_t addr);
/* Reserved for Vista, please return 0 */
extern u8_t zfwGetPktEncExemptionActionType(zdev_t* dev, zbuf_t* buf);
#ifdef ZM_ENABLE_CENC
/* Reserved for CENC, please return 0 */
extern u8_t zfwCencHandleBeaconProbrespon(zdev_t* dev, u8_t *pWIEc,
u8_t *pPeerSSIDc, u8_t *pPeerAddrc);
#endif //ZM_ENABLE_CENC
#ifdef ZM_HALPLUS_LOCK
extern asmlinkage struct zsWlanDev *zfwGetWlanDev(zdev_t* dev);
extern asmlinkage void zfwEnterCriticalSection(zdev_t* dev);
extern asmlinkage void zfwLeaveCriticalSection(zdev_t* dev);
extern asmlinkage u8_t zfwBufReadByte(zdev_t* dev, zbuf_t* buf, u16_t offset);
extern asmlinkage u16_t zfwBufReadHalfWord(zdev_t* dev, zbuf_t* buf, u16_t offset);
extern asmlinkage void zfwBufWriteByte(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t value);
extern asmlinkage void zfwBufWriteHalfWord(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t value);
extern asmlinkage u8_t *zfwGetBuffer(zdev_t* dev, zbuf_t* buf);
#endif
#endif //_PUB_ZFW_H

View File

@ -0,0 +1,303 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* */
/* Module Name : queue.c */
/* */
/* Abstract */
/* This module contains queue management functions. */
/* */
/* NOTES */
/* None */
/* */
/************************************************************************/
#include "cprecomp.h"
#include "queue.h"
struct zsQueue* zfQueueCreate(zdev_t* dev, u16_t size)
{
struct zsQueue* q;
if ((q = (struct zsQueue*)zfwMemAllocate(dev, sizeof(struct zsQueue)
+ (sizeof(struct zsQueueCell)*(size-1)))) != NULL)
{
q->size = size;
q->sizeMask = size-1;
q->head = 0;
q->tail = 0;
}
return q;
}
void zfQueueDestroy(zdev_t* dev, struct zsQueue* q)
{
u16_t size = sizeof(struct zsQueue) + (sizeof(struct zsQueueCell)*(q->size-1));
zfQueueFlush(dev, q);
zfwMemFree(dev, q, size);
return;
}
u16_t zfQueuePutNcs(zdev_t* dev, struct zsQueue* q, zbuf_t* buf, u32_t tick)
{
u16_t ret = ZM_ERR_QUEUE_FULL;
zm_msg0_mm(ZM_LV_1, "zfQueuePutNcs()");
if (((q->tail+1)&q->sizeMask) != q->head)
{
q->cell[q->tail].buf = buf;
q->cell[q->tail].tick = tick;
q->tail = (q->tail+1) & q->sizeMask;
ret = ZM_SUCCESS;
}
return ret;
}
u16_t zfQueuePut(zdev_t* dev, struct zsQueue* q, zbuf_t* buf, u32_t tick)
{
u16_t ret;
zmw_declare_for_critical_section();
zmw_enter_critical_section(dev);
ret = zfQueuePutNcs(dev, q, buf, tick);
zmw_leave_critical_section(dev);
return ret;
}
zbuf_t* zfQueueGet(zdev_t* dev, struct zsQueue* q)
{
zbuf_t* buf = NULL;
zmw_declare_for_critical_section();
zmw_enter_critical_section(dev);
if (q->head != q->tail)
{
buf = q->cell[q->head].buf;
q->head = (q->head+1) & q->sizeMask;
}
zmw_leave_critical_section(dev);
return buf;
}
u16_t zfCompareDstwithBuf(zdev_t* dev, zbuf_t* buf, u8_t* addr)
{
u16_t i;
u8_t dst[6];
for (i=0; i<6; i++)
{
dst[i] = zmw_buf_readb(dev, buf, i);
if (dst[i] != addr[i])
{
return 1+i;
}
}
return 0;
}
zbuf_t* zfQueueGetWithMac(zdev_t* dev, struct zsQueue* q, u8_t* addr, u8_t* mb)
{
zbuf_t* buf;
zbuf_t* retBuf = NULL;
u16_t index, next;
zmw_declare_for_critical_section();
*mb = 0;
zmw_enter_critical_section(dev);
index = q->head;
while (1)
{
if (index != q->tail)
{
buf = q->cell[index].buf;
//if buf's detination address == input addr
if (zfCompareDstwithBuf(dev, buf, addr) == 0)
{
retBuf = buf;
//Get it, and trace the whole queue to calculate more bit
while ((next =((index+1)&q->sizeMask)) != q->tail)
{
q->cell[index].buf = q->cell[next].buf;
q->cell[index].tick = q->cell[next].tick;
if ((*mb == 0) && (zfCompareDstwithBuf(dev,
q->cell[next].buf, addr) == 0))
{
*mb = 1;
}
index = next;
}
q->tail = (q->tail-1) & q->sizeMask;
zmw_leave_critical_section(dev);
return retBuf;
}
index = (index + 1) & q->sizeMask;
} //if (index != q->tail)
else
{
break;
}
}
zmw_leave_critical_section(dev);
return retBuf;
}
void zfQueueFlush(zdev_t* dev, struct zsQueue* q)
{
zbuf_t* buf;
while ((buf = zfQueueGet(dev, q)) != NULL)
{
zfwBufFree(dev, buf, 0);
}
return;
}
void zfQueueAge(zdev_t* dev, struct zsQueue* q, u32_t tick, u32_t msAge)
{
zbuf_t* buf;
u32_t buftick;
zmw_declare_for_critical_section();
while (1)
{
buf = NULL;
zmw_enter_critical_section(dev);
if (q->head != q->tail)
{
buftick = q->cell[q->head].tick;
if (((tick - buftick)*ZM_MS_PER_TICK) > msAge)
{
buf = q->cell[q->head].buf;
q->head = (q->head+1) & q->sizeMask;
}
}
zmw_leave_critical_section(dev);
if (buf != NULL)
{
zm_msg0_mm(ZM_LV_0, "Age frame in queue!");
zfwBufFree(dev, buf, 0);
}
else
{
break;
}
}
return;
}
u8_t zfQueueRemovewithIndex(zdev_t* dev, struct zsQueue* q, u16_t index, u8_t* addr)
{
u16_t next;
u8_t mb = 0;
//trace the whole queue to calculate more bit
while ((next =((index+1)&q->sizeMask)) != q->tail)
{
q->cell[index].buf = q->cell[next].buf;
q->cell[index].tick = q->cell[next].tick;
if ((mb == 0) && (zfCompareDstwithBuf(dev,
q->cell[next].buf, addr) == 0))
{
mb = 1;
}
index = next;
}
q->tail = (q->tail-1) & q->sizeMask;
return mb;
}
void zfQueueGenerateUapsdTim(zdev_t* dev, struct zsQueue* q,
u8_t* uniBitMap, u16_t* highestByte)
{
zbuf_t* psBuf;
u8_t dst[6];
u16_t id, aid, index, i;
u16_t bitPosition;
u16_t bytePosition;
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
zmw_enter_critical_section(dev);
index = q->head;
while (index != q->tail)
{
psBuf = q->cell[index].buf;
for (i=0; i<6; i++)
{
dst[i] = zmw_buf_readb(dev, psBuf, i);
}
/* TODO : use u8_t* fot MAC address */
if (((id = zfApFindSta(dev, (u16_t*)dst)) != 0xffff)
&& (wd->ap.staTable[id].psMode != 0))
{
/* Calculate PVB only when all AC are delivery-enabled */
if ((wd->ap.staTable[id].qosInfo & 0xf) == 0xf)
{
aid = id + 1;
bitPosition = (1 << (aid & 0x7));
bytePosition = (aid >> 3);
uniBitMap[bytePosition] |= bitPosition;
if (bytePosition>*highestByte)
{
*highestByte = bytePosition;
}
}
index = (index+1) & q->sizeMask;
}
else
{
/* Free garbage UAPSD frame */
zfQueueRemovewithIndex(dev, q, index, dst);
zfwBufFree(dev, psBuf, 0);
}
}
zmw_leave_critical_section(dev);
return;
}

View File

@ -0,0 +1,37 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef _QUEUE_H
#define _QUEUE_H
#include "../oal_dt.h"
struct zsQueueCell
{
u32_t tick;
zbuf_t* buf;
};
struct zsQueue
{
u16_t size;
u16_t sizeMask;
u16_t head;
u16_t tail;
struct zsQueueCell cell[1];
};
#endif //#ifndef _QUEUE_H

View File

@ -0,0 +1,874 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "cprecomp.h"
#include "ratectrl.h"
const u32_t zcRateToPhyCtrl[] =
{
/* 1M, 2M, 5M, 11M , 0 1 2 3*/
0x00000, 0x10000, 0x20000, 0x30000,
/* 6M 9M 12M 18M , 4 5 6 7*/
0xb0001, 0xf0001, 0xa0001, 0xe0001,
/* 24M 36M 48M 54M , 8 9 10 11*/
0x90001, 0xd0001, 0x80001, 0xc0001,
/* MCS0 MCS1 MCS2 MCS3, 12 13 14 15*/
0x00002, 0x10002, 0x20002, 0x30002,
/* MCS4 MCS5 MCS6 MCS7, 16 17 18 19*/
0x40002, 0x50002, 0x60002, 0x70002,
/* MCS8 MCS9 MCS10 MCS11, 20 21 22 23*/
0x80002, 0x90002, 0xa0002, 0xb0002,
/* MCS12 MCS13 MCS14 MCS15, 24 25 26 27*/
0xc0002, 0xd0002, 0xe0002, 0xf0002,
/* MCS14SG, MCS15SG MCS7SG , 28 29, 30*/
0x800e0002, 0x800f0002, 0x80070002
};
const u8_t zcHtRateTable[15][4] =
{ /*[5G 20MHz] [5G 40MHz] [2.4G 20MHz] [2.4G 40MHz]*/
{ 4, 4, 0, 0}, /*OFDM6M OFDM6M CCK1M CCK1M */
{ 5, 5, 1, 1}, /*OFDM9M OFDM9M CCK2M CCK2M */
{ 13, 12, 2, 2}, /*MCS1 MCS0 CCK5M CCK5M */
{ 14, 13, 3, 3}, /*MCS2 MCS1 CCK11M CCK11M */
{ 15, 14, 13, 12}, /*MCS3 MCS2 MCS1 MCS0 */
{ 16, 15, 14, 13}, /*MCS4 MCS3 MCS2 MCS1 */
{ 23, 16, 15, 14}, /*MCS11 MCS4 MCS3 MCS2 */
{ 24, 23, 16, 15}, /*MCS12 MCS11 MCS4 MCS3 */
{ 25, 24, 23, 16}, /*MCS13 MCS12 MCS11 MCS4 */
{ 26, 25, 24, 23}, /*MCS14 MCS13 MCS12 MCS11 */
{ 27, 26, 25, 24}, /*MCS15 MCS14 MCS13 MCS12 */
{ 0, 27, 26, 25}, /*0 MCS15 MCS14 MCS13 */
{ 0, 29, 27, 26}, /*0 MCS15SG MCS15 MCS14 */
{ 0, 0, 0, 28}, /*0 0 0 MCS14SG*/
{ 0, 0, 0, 29} /*0 0 0 MCS15SG*/
};
const u8_t zcHtOneTxStreamRateTable[15][4] =
{ /*[5G 20MHz] [5G 40MHz] [2.4G 20MHz] [2.4G 40MHz]*/
{ 4, 4, 0, 0}, /*OFDM6M OFDM6M CCK1M CCK1M */
{ 5, 5, 1, 1}, /*OFDM9M OFDM9M CCK2M CCK2M */
{ 13, 12, 2, 2}, /*MCS1 MCS0 CCK5M CCK5M */
{ 14, 13, 3, 3}, /*MCS2 MCS1 CCK11M CCK11M */
{ 15, 14, 13, 12}, /*MCS3 MCS2 MCS1 MCS0 */
{ 16, 15, 14, 13}, /*MCS4 MCS3 MCS2 MCS1 */
{ 17, 16, 15, 14}, /*MCS5 MCS4 MCS3 MCS2 */
{ 18, 17, 16, 15}, /*MCS6 MCS5 MCS4 MCS3 */
{ 19, 18, 17, 16}, /*MCS7 MCS6 MCS5 MCS4 */
{ 0, 19, 18, 17}, /*0 MCS7 MCS6 MCS5 */
{ 0, 30, 19, 18}, /*0 MCS7SG MCS7 MCS6 */
{ 0, 0, 0, 19}, /*0 0 0 MCS7 */
{ 0, 0, 0, 30}, /*0 0 0 MCS7SG */
{ 0, 0, 0, 0 }, /*0 0 0 0 */
{ 0, 0, 0, 0 } /*0 0 0 0 */
};
const u16_t zcRate[] =
{
1, 2, 5, 11, /* 1M, 2M, 5M, 11M , 0 1 2 3*/
6, 9, 12, 18, /* 6M 9M 12M 18M , 4 5 6 7*/
24, 36, 48, 54, /* 24M 36M 48M 54M , 8 9 10 11*/
13, 27, 40, 54, /* MCS0 MCS1 MCS2 MCS3 , 12 13 14 15*/
81, 108, 121, 135, /* MCS4 MCS5 MCS6 MCS7 , 16 17 18 19*/
27, 54, 81, 108, /* MCS8 MCS9 MCS10 MCS11 , 20 21 22 23*/
162, 216, 243, 270, /* MCS12 MCS13 MCS14 MCS15 , 24 25 26 27*/
270, 300, 150 /* MCS14SG, MCS15SG, MCS7SG , 28 29 30*/
};
const u16_t PERThreshold[] =
{
100, 50, 50, 50, /* 1M, 2M, 5M, 11M , 0 1 2 3*/
50, 50, 30, 30, /* 6M 9M 12M 18M , 4 5 6 7*/
25, 25, 25, 20, /* 24M 36M 48M 54M , 8 9 10 11*/
50, 50, 50, 40, /* MCS0 MCS1 MCS2 MCS3 , 12 13 14 15*/
30, 30, 30, 30, /* MCS4 MCS5 MCS6 MCS7 , 16 17 18 19*/
30, 30, 25, 25, /* MCS8 MCS9 MCS10 MCS11 , 20 21 22 23*/
25, 25, 15, 15, /* MCS12 MCS13 MCS14 MCS15 , 24 25 26 27*/
15, 15, 10 /* MCS14SG, MCS15SG , 28 29*/
};
const u16_t FailDiff[] =
{
40, 46, 40, 0, /* 1M, 2M, 5M, 11M , 0 1 2 3*/
24, 17, 22, 16, /* 6M 9M 12M 18M , 4 5 6 7*/
19, 13, 5, 0, /* 24M 36M 48M 54M , 8 9 10 11*/
36, 22, 15, 19, /* MCS0 MCS1 MCS2 MCS3 , 12 13 14 15*/
12, 5, 4, 7, /* MCS4 MCS5 MCS6 MCS7 , 16 17 18 19*/
0, 0, 0, 0, /* MCS8 MCS9 MCS10 MCS11 , 20 21 22 23*/
9, 4, 3, 3, /* MCS12 MCS13 MCS14 MCS15 , 24 25 26 27*/
3, 0, 0 /* MCS14SG, MCS15SG , 28 29*/
};
#ifdef ZM_ENABLE_BA_RATECTRL
u32_t TxMPDU[29];
u32_t BAFail[29];
u32_t BAPER[29];
const u16_t BADiff[] =
{
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
361, 220, 151, 187,
122, 48, 41, 65,
0, 0, 0, 0,
88, 33, 27, 25,
0
};
#endif
/************************************************************************/
/* */
/* FUNCTION DESCRIPTION zfRateCtrlInitCell */
/* Initialize rate control cell. */
/* */
/* INPUTS */
/* dev : device pointer */
/* type : 0=>11b, 1=>11a/g, 2=>11n, 3=>11n one Tx stream */
/* gBand : 1=>2.4G, 0=>5G */
/* */
/* OUTPUTS */
/* None */
/* */
/* AUTHOR */
/* Stephen Chen Atheros Communications, INC. 2007.2 */
/* */
/************************************************************************/
void zfRateCtrlInitCell(zdev_t* dev, struct zsRcCell* rcCell, u8_t type,
u8_t gBand, u8_t SG40)
{
u8_t i;
u8_t maxrate;
zmw_get_wlan_dev(dev);
if (SG40) SG40 = 1;
if (gBand != 0)
{
if (type == 1) //11g
{
for (i=0; i<4; i++) //1M 2M 5M 11M
{
rcCell->operationRateSet[i] = (u8_t)i;
}
for (i=4; i<10; i++) //12M 18M 24M 36M 48M 54M
{
rcCell->operationRateSet[i] = 2+i;
}
rcCell->operationRateCount = 10;
rcCell->currentRateIndex = 5; //18M
}
else if (type == 2) //11ng
{
if (wd->wlanMode == ZM_MODE_AP) //AP 11ng 40M
{
for (i=0; i<15; i++)
{
rcCell->operationRateSet[i] = zcHtRateTable[i][3];
}
if(!SG40) rcCell->operationRateSet[13] = 27;
rcCell->operationRateCount = 14+SG40;
rcCell->currentRateIndex = 10;
}
else //STA
{
if (wd->sta.htCtrlBandwidth == ZM_BANDWIDTH_40MHZ) //11ng 40M
{
for (i=0; i<15; i++)
{
rcCell->operationRateSet[i] = zcHtRateTable[i][3];
}
if(!SG40) rcCell->operationRateSet[13] = 27;
rcCell->operationRateCount = 14+SG40;
rcCell->currentRateIndex = 10;
}
else //11ng 20M
{
for (i=0; i<13; i++)
{
rcCell->operationRateSet[i] = zcHtRateTable[i][2];
}
rcCell->operationRateCount = 13;
rcCell->currentRateIndex = 9;
}
}
}
else if (type == 3) //11ng one Tx stream
{
if (wd->sta.htCtrlBandwidth == ZM_BANDWIDTH_40MHZ) //11ng 40M one Tx stream
{
if(SG40 != 0)
{
maxrate = 13;
}
else
{
maxrate = 12;
}
for (i=0; i<maxrate; i++)
{
rcCell->operationRateSet[i] = zcHtOneTxStreamRateTable[i][3];
}
rcCell->operationRateCount = i;
rcCell->currentRateIndex = ((i+1)*3)/4;
}
else //11ng 20M
{
for (i=0; i<11; i++)
{
rcCell->operationRateSet[i] = zcHtOneTxStreamRateTable[i][2];
}
rcCell->operationRateCount = i;
rcCell->currentRateIndex = ((i+1)*3)/4;
}
}
else //if (type == 0) //11b
{
for (i=0; i<4; i++)
{
rcCell->operationRateSet[i] = (u8_t)i;
}
rcCell->operationRateCount = 4;
rcCell->currentRateIndex = rcCell->operationRateCount-1;
}
}
else
{
if (type == 2) //11na
{
if (wd->wlanMode == ZM_MODE_AP) //AP 11na 40M
{
for (i=0; i<(12+SG40); i++)
{
rcCell->operationRateSet[i] = zcHtRateTable[i][1];
}
rcCell->operationRateCount = 12+SG40;
rcCell->currentRateIndex = 8;
}
else //STA
{
if (wd->sta.htCtrlBandwidth == ZM_BANDWIDTH_40MHZ) //11na 40M
{
for (i=0; i<(12+SG40); i++)
{
rcCell->operationRateSet[i] = zcHtRateTable[i][1];
}
rcCell->operationRateCount = 12+SG40;
rcCell->currentRateIndex = 8;
}
else //11na 20M
{
for (i=0; i<11; i++)
{
rcCell->operationRateSet[i] = zcHtRateTable[i][0];
}
rcCell->operationRateCount = 11;
rcCell->currentRateIndex = 7;
}
}
}
else if (type == 3) //11na one Tx stream
{
if (wd->sta.htCtrlBandwidth == ZM_BANDWIDTH_40MHZ) //11na 40M one Tx stream
{
if(SG40 != 0)
{
maxrate = 11;
}
else
{
maxrate = 10;
}
for (i=0; i<maxrate; i++)
{
rcCell->operationRateSet[i] = zcHtOneTxStreamRateTable[i][1];
}
rcCell->operationRateCount = i;
rcCell->currentRateIndex = ((i+1)*3)/4;
}
else //11ng 20M
{
for (i=0; i<9; i++)
{
rcCell->operationRateSet[i] = zcHtOneTxStreamRateTable[i][0];
}
rcCell->operationRateCount = i;
rcCell->currentRateIndex = ((i+1)*3)/4;
}
}
else //if (type == 1) //11a
{
for (i=0; i<8; i++) //6M 9M 12M 18M 24M 36M 48M 54M
{
rcCell->operationRateSet[i] = i+4;
}
rcCell->operationRateCount = 8;
rcCell->currentRateIndex = 4; //24M
}
}
rcCell->flag = 0;
rcCell->txCount = 0;
rcCell->failCount = 0;
rcCell->currentRate = rcCell->operationRateSet[rcCell->currentRateIndex];
rcCell->lasttxCount = 0;
rcCell->lastTime = wd->tick;
rcCell->probingTime = wd->tick;
for (i=0; i<ZM_RATE_TABLE_SIZE; i++) {
wd->PER[i] = 0;
wd->txMPDU[i] = wd->txFail[i] = 0;
}
wd->probeCount = 0;
wd->probeInterval = 0;
#ifdef ZM_ENABLE_BA_RATECTRL
for (i=0; i<29; i++) {
TxMPDU[i]=0;
BAFail[i]=0;
BAPER[i]=0;
}
#endif
return;
}
/************************************************************************/
/* */
/* FUNCTION DESCRIPTION zfRateCtrlGetHigherRate */
/* Get a higher rate. */
/* */
/* INPUTS */
/* rcCell : rate control cell */
/* */
/* OUTPUTS */
/* rate */
/* */
/* AUTHOR */
/* Stephen Chen Atheros Communications, INC. 2007.2 */
/* */
/************************************************************************/
u8_t zfRateCtrlGetHigherRate(struct zsRcCell* rcCell)
{
u8_t rateIndex;
rateIndex = rcCell->currentRateIndex
+ (((rcCell->currentRateIndex+1) < rcCell->operationRateCount)?1:0);
return rcCell->operationRateSet[rateIndex];
}
/************************************************************************/
/* */
/* FUNCTION DESCRIPTION zfRateCtrlNextLowerRate */
/* Get a lower rate. */
/* */
/* INPUTS */
/* rcCell : rate control cell */
/* */
/* OUTPUTS */
/* rate */
/* */
/* AUTHOR */
/* Stephen Chen Atheros Communications, INC. 2007.2 */
/* */
/************************************************************************/
u8_t zfRateCtrlNextLowerRate(zdev_t* dev, struct zsRcCell* rcCell)
{
zmw_get_wlan_dev(dev);
if (rcCell->currentRateIndex > 0)
{
rcCell->currentRateIndex--;
rcCell->currentRate = rcCell->operationRateSet[rcCell->currentRateIndex];
}
zm_msg1_tx(ZM_LV_0, "Lower Tx Rate=", rcCell->currentRate);
//DbgPrint("Lower Tx Rate=%d", rcCell->currentRate);
rcCell->failCount = rcCell->txCount = 0;
rcCell->lasttxCount = 0;
rcCell->lastTime = wd->tick;
return rcCell->currentRate;
}
/************************************************************************/
/* */
/* FUNCTION DESCRIPTION zfRateCtrlRateDiff */
/* Rate difference. */
/* */
/* INPUTS */
/* rcCell : rate control cell */
/* retryRate : retry rate */
/* */
/* OUTPUTS */
/* rate difference */
/* */
/* AUTHOR */
/* Stephen Chen Atheros Communications, INC. 2007.2 */
/* */
/************************************************************************/
u8_t zfRateCtrlRateDiff(struct zsRcCell* rcCell, u8_t retryRate)
{
u16_t i;
/* Find retryRate in operationRateSet[] */
for (i=0; i<rcCell->operationRateCount; i++)
{
if (retryRate == rcCell->operationRateSet[i])
{
if (i < rcCell->currentRateIndex)
{
return ((rcCell->currentRateIndex - i)+1)>>1;
}
else if (i == rcCell->currentRateIndex == 0)
{
return 1;
}
else
{
return 0;
}
}
}
/* TODO : retry rate not in operation rate set */
zm_msg1_tx(ZM_LV_0, "Not in operation rate set:", retryRate);
return 1;
}
u32_t zfRateCtrlUDPTP(zdev_t* dev, u16_t Rate, u32_t PER) {
if ((PER < 100) && (Rate > 0) && PER)
return 1168000/(((12304/Rate)+197)*(100+100*PER/(100-PER)));
else
return 0;
}
u8_t zfRateCtrlFindMaxUDPTP(zdev_t* dev, struct zsRcCell* rcCell) {
u8_t i, maxIndex=0, rateIndex;
u32_t max=0, UDPThroughput;
zmw_get_wlan_dev(dev);
rateIndex = zm_agg_min(rcCell->currentRateIndex+3, rcCell->operationRateCount-1);
for (i=rcCell->currentRateIndex; i < rateIndex; i++) {
UDPThroughput = zfRateCtrlUDPTP(dev, zcRate[rcCell->operationRateSet[i]],
wd->PER[rcCell->operationRateSet[i]]);
if (max < UDPThroughput) {
max = UDPThroughput;
maxIndex = i;
}
}
return rcCell->operationRateSet[maxIndex];
}
/************************************************************************/
/* */
/* FUNCTION DESCRIPTION zfRateCtrlGetTxRate */
/* Get transmission rate. */
/* */
/* INPUTS */
/* dev : device pointer */
/* rcCell : rate control cell */
/* probing : rate probing flag */
/* */
/* OUTPUTS */
/* Tx rate */
/* */
/* AUTHOR */
/* Stephen Chen Atheros Communications, INC. 2007.2 */
/* */
/************************************************************************/
u16_t zfRateCtrlGetTxRate(zdev_t* dev, struct zsRcCell* rcCell, u16_t* probing)
{
u8_t newRate, highRate;
zmw_get_wlan_dev(dev);
zm_msg1_tx(ZM_LV_3, "txCount=", rcCell->txCount);
zm_msg1_tx(ZM_LV_3, "probingTime=", rcCell->probingTime);
zm_msg1_tx(ZM_LV_3, "tick=", wd->tick);
*probing = 0;
newRate = rcCell->currentRate;
if (wd->probeCount && (wd->probeCount < wd->success_probing))
{
if (wd->probeInterval < 50)
{
wd->probeInterval++;
}
else
{
wd->probeInterval++;
if (wd->probeInterval > 52) //probe 51, 52, 53 three packets every 50 packets
{
wd->probeInterval = 0;
}
newRate=zfRateCtrlGetHigherRate(rcCell);
*probing = 1;
wd->probeCount++;
rcCell->probingTime = wd->tick;
}
}
/* Accumulate at least 1000ms and 8 packets or Accumulate over 1K packets */
else if ((((wd->tick - rcCell->probingTime) > (ZM_RATE_CTRL_PROBING_INTERVAL_MS/ZM_MS_PER_TICK))
&& (rcCell->txCount >= ZM_RATE_CTRL_MIN_PROBING_PACKET))
|| (rcCell->txCount >= 1000))
{
#ifndef ZM_DISABLE_RATE_CTRL
/* PER = fail/total */
wd->probeCount = 0;
wd->probeSuccessCount = 0;
if (wd->txMPDU[rcCell->currentRate] != 0) {
wd->PER[rcCell->currentRate] = zm_agg_min(100,
(wd->txFail[rcCell->currentRate]*100)/wd->txMPDU[rcCell->currentRate]);
if (!wd->PER[rcCell->currentRate]) wd->PER[rcCell->currentRate] ++;
}
/* if PER < threshold, do rate probing, return probing rate */
if ((wd->PER[rcCell->currentRate] <= (ZM_RATE_PROBING_THRESHOLD+15)) ||
((rcCell->currentRate <= 16) &&
((wd->PER[rcCell->currentRate]/2) <= ZM_RATE_PROBING_THRESHOLD)))
{
if ((newRate=zfRateCtrlGetHigherRate(rcCell)) != rcCell->currentRate)
{
*probing = 1;
wd->probeCount++;
wd->probeInterval = 0;
wd->success_probing =
(rcCell->currentRate <= 16)? (ZM_RATE_SUCCESS_PROBING/2) : ZM_RATE_SUCCESS_PROBING;
//DbgPrint("Start Probing");
zm_msg1_tx(ZM_LV_0, "Probing Rate=", newRate);
}
}
#endif
zm_msg0_tx(ZM_LV_1, "Diminish counter");
rcCell->failCount = rcCell->failCount>>1;
rcCell->txCount = rcCell->txCount>>1;
wd->txFail[rcCell->currentRate] = wd->txFail[rcCell->currentRate] >> 1;
wd->txMPDU[rcCell->currentRate] = wd->txMPDU[rcCell->currentRate] >> 1;
if (rcCell->currentRate > 15) {
highRate = zfRateCtrlGetHigherRate(rcCell);
if ((highRate != rcCell->currentRate) && wd->PER[highRate] &&
((wd->PER[rcCell->currentRate] + FailDiff[rcCell->currentRate]) >
wd->PER[highRate])) {
//DbgPrint("PER compare force raise rate to %d", highRate);
wd->probeSuccessCount = wd->probeCount = ZM_RATE_SUCCESS_PROBING;
zfRateCtrlTxSuccessEvent(dev, rcCell, highRate);
}
}
else {
highRate = zfRateCtrlFindMaxUDPTP(dev, rcCell);
if (rcCell->currentRate < highRate) {
//DbgPrint("UDP Throughput compare force raise rate to %d", highRate);
wd->probeSuccessCount = wd->probeCount = ZM_RATE_SUCCESS_PROBING;
zfRateCtrlTxSuccessEvent(dev, rcCell, highRate);
}
}
rcCell->probingTime = wd->tick;
}
if( (wd->tick > 1000)
&& ((wd->tick - rcCell->lastTime) > 3840) )
{
if (rcCell->lasttxCount < 70)
{
rcCell->failCount = rcCell->failCount>>1;
rcCell->txCount = rcCell->txCount>>1;
wd->txFail[rcCell->currentRate] = wd->txFail[rcCell->currentRate] >> 1;
wd->txMPDU[rcCell->currentRate] = wd->txMPDU[rcCell->currentRate] >> 1;
rcCell->failCount = (rcCell->failCount < rcCell->txCount)?
rcCell->failCount : rcCell->txCount;
wd->txFail[rcCell->currentRate] = (wd->txFail[rcCell->currentRate] < wd->txMPDU[rcCell->currentRate])?
wd->txFail[rcCell->currentRate] : wd->txMPDU[rcCell->currentRate];
}
rcCell->lastTime = wd->tick;
rcCell->lasttxCount = 0;
}
rcCell->txCount++;
rcCell->lasttxCount++;
wd->txMPDU[rcCell->currentRate]++;
zm_msg1_tx(ZM_LV_1, "Get Tx Rate=", newRate);
return newRate;
}
/************************************************************************/
/* */
/* FUNCTION DESCRIPTION zfRateCtrlTxFailEvent */
/* Tx fail event. Calculate PER and lower Tx rate if under */
/* PER under threshold. */
/* */
/* INPUTS */
/* rcCell : rate control cell */
/* retryRate : retry rate */
/* */
/* OUTPUTS */
/* None */
/* */
/* AUTHOR */
/* Stephen Chen Atheros Communications, INC. 2007.2 */
/* */
/************************************************************************/
void zfRateCtrlTxFailEvent(zdev_t* dev, struct zsRcCell* rcCell, u8_t aggRate, u32_t retryRate)
{
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
#ifndef ZM_DISABLE_RATE_CTRL
//DbgPrint("aggRate=%d, retryRate=%d", aggRate, retryRate);
if (aggRate && (aggRate != rcCell->currentRate)) {
wd->txFail[aggRate] += retryRate;
return;
}
if (!aggRate) {
retryRate = (zfRateCtrlRateDiff(rcCell, (u8_t)retryRate)+1)>>1;
if (rcCell->currentRate <12) //legacy rate
{
retryRate*=2;
}
}
rcCell->failCount += retryRate;
wd->txFail[rcCell->currentRate] += retryRate;
//DbgPrint("failCount=%d", rcCell->failCount);
if (rcCell->failCount > ZM_MIN_RATE_FAIL_COUNT)
{
if (wd->txMPDU[rcCell->currentRate] != 0) {
wd->PER[rcCell->currentRate] = zm_agg_min(100,
(wd->txFail[rcCell->currentRate]*100)/wd->txMPDU[rcCell->currentRate]);
if (!wd->PER[rcCell->currentRate]) wd->PER[rcCell->currentRate] ++;
}
//zm_msg1_tx(ZM_LV_1, "PER=", per);
//DbgPrint("PER=%d, txFail=%d, txMPDU=%d", wd->PER[rcCell->currentRate], wd->txFail[rcCell->currentRate], wd->txMPDU[rcCell->currentRate]);
if (wd->PER[rcCell->currentRate] > PERThreshold[rcCell->currentRate])
{
/* Lower Tx Rate if PER < THRESHOLD */
zfRateCtrlNextLowerRate(dev, rcCell);
rcCell->flag |= ZM_RC_TRAINED_BIT;
// Resolve compatibility problem with Marvell
if(rcCell->currentRate == 15)
{
zmw_leave_critical_section(dev);
zfHpSetAggPktNum(dev, 8);
zmw_enter_critical_section(dev);
}
wd->txFail[rcCell->currentRate] = wd->txFail[rcCell->currentRate] >> 1;
wd->txMPDU[rcCell->currentRate] = wd->txMPDU[rcCell->currentRate] >> 1;
wd->probeCount = wd->probeSuccessCount = 0;
}
}
#endif
return;
}
/************************************************************************/
/* */
/* FUNCTION DESCRIPTION zfRateCtrlTxSuccessEvent */
/* Tx success event. Raise Tx rate because rate probing success. */
/* */
/* INPUTS */
/* rcCell : rate control cell */
/* successRate : success rate */
/* */
/* OUTPUTS */
/* None */
/* */
/* AUTHOR */
/* Stephen Chen Atheros Communications, INC. 2007.2 */
/* */
/************************************************************************/
void zfRateCtrlTxSuccessEvent(zdev_t* dev, struct zsRcCell* rcCell, u8_t successRate)
{
/* Raise Tx Rate */
u16_t i, PERProbe;
u16_t pcount;
zmw_get_wlan_dev(dev);
zmw_declare_for_critical_section();
//DbgPrint("Probing successRate=%d", successRate);
/* Find successRate in operationRateSet[] */
wd->probeSuccessCount++;
if (wd->probeCount < wd->success_probing)
{
return;
}
pcount = wd->probeCount;
if (pcount != 0)
{
PERProbe = wd->probeSuccessCount * 100 / pcount;
}
else
{
PERProbe = 1;
}
if (PERProbe < ((rcCell->currentRate < 16)? 80:100))
{
return;
}
//DbgPrint("wd->probeCount=%d, wd->probeSuccessCount=%d", wd->probeCount, wd->probeSuccessCount);
wd->probeCount = wd->probeSuccessCount = 0;
for (i=0; i<rcCell->operationRateCount; i++)
{
if (successRate == rcCell->operationRateSet[i])
{
if (i > rcCell->currentRateIndex)
{
/* Raise current Tx rate */
zm_msg1_tx(ZM_LV_0, "Raise Tx Rate=", successRate);
//DbgPrint("Raise Tx Rate=%d", successRate);
// Resolve compatibility problem with Marvell
if((rcCell->currentRate <= 15) && (successRate > 15))
{
zmw_leave_critical_section(dev);
zfHpSetAggPktNum(dev, 16);
zmw_enter_critical_section(dev);
}
rcCell->currentRate = successRate;
rcCell->currentRateIndex = (u8_t)i;
rcCell->failCount = rcCell->txCount = 0;
rcCell->lasttxCount = 0;
rcCell->lastTime = wd->tick;
wd->txFail[rcCell->currentRate] = wd->txFail[rcCell->currentRate] >> 1;
wd->txMPDU[rcCell->currentRate] = wd->txMPDU[rcCell->currentRate] >> 1;
}
}
}
return;
}
/************************************************************************/
/* */
/* FUNCTION DESCRIPTION zfRateCtrlRxRssiEvent */
/* Rx RSSI event. Calculate RSSI moving average, accelarate */
/* rate probing if RSSI variation over threshold. */
/* */
/* INPUTS */
/* rcCell : rate control cell */
/* successRate : success rate */
/* */
/* OUTPUTS */
/* None */
/* */
/* AUTHOR */
/* Stephen Chen Atheros Communications, INC. 2007.2 */
/* */
/************************************************************************/
void zfRateCtrlRxRssiEvent(struct zsRcCell* rcCell, u16_t rxRssi)
{
/* if delta(rcCell->rxRssi, rxRssi) > ZM_RATE_CTRL_RSSI_VARIATION */
if ((rcCell->rxRssi - rxRssi) > ZM_RATE_CTRL_RSSI_VARIATION)
{
/* Accelerate rate probing via decreaing rcCell->probingTime */
rcCell->probingTime -= ZM_RATE_CTRL_PROBING_INTERVAL_MS/ZM_MS_PER_TICK;
}
/* Update RSSI moving average */
rcCell->rxRssi = (((rcCell->rxRssi*7) + rxRssi)+4) >> 3;
return;
}
#ifdef ZM_ENABLE_BA_RATECTRL
u8_t HigherRate(u8_t Rate) {
if (Rate < 28) Rate++; //28=MCS15SG, 27=MCS15, 26=MCS14, 25=MCS13
if (Rate > 28) Rate = 28;
while ((Rate >= 20) && (Rate <= 23)) {
Rate ++;
}
return Rate;
}
u8_t LowerRate(u8_t Rate) {
if (Rate > 1) Rate--;
while ((Rate >= 20) && (Rate <= 23)) {
Rate --;
}
return Rate;
}
u8_t RateMapToRateIndex(u8_t Rate, struct zsRcCell* rcCell) {
u8_t i;
for (i=0; i<rcCell->operationRateCount; i++) {
if (Rate == rcCell->operationRateSet[i]) {
return i;
}
}
return 0;
}
void zfRateCtrlAggrSta(zdev_t* dev) {
u8_t RateIndex, Rate;
u8_t HRate;
u8_t LRate;
u32_t RateCtrlTxMPDU, RateCtrlBAFail;
zmw_get_wlan_dev(dev);
RateIndex = wd->sta.oppositeInfo[0].rcCell.currentRateIndex;
Rate = wd->sta.oppositeInfo[0].rcCell.operationRateSet[RateIndex];
TxMPDU[Rate] = (TxMPDU[Rate] / 5) + (wd->commTally.RateCtrlTxMPDU * 4 / 5);
BAFail[Rate] = (BAFail[Rate] / 5) + (wd->commTally.RateCtrlBAFail * 4 / 5);
RateCtrlTxMPDU = wd->commTally.RateCtrlTxMPDU;
RateCtrlBAFail = wd->commTally.RateCtrlBAFail;
wd->commTally.RateCtrlTxMPDU = 0;
wd->commTally.RateCtrlBAFail = 0;
if (TxMPDU[Rate] > 0) {
BAPER[Rate] = BAFail[Rate] * 1000 / TxMPDU[Rate]; //PER*1000
BAPER[Rate] = (BAPER[Rate]>0)? BAPER[Rate]:1;
}
else {
return;
}
HRate = HigherRate(Rate);
LRate = LowerRate(Rate);
if (BAPER[Rate]>200) {
if ((RateCtrlTxMPDU > 100) && (BAPER[Rate]<300) && (HRate != Rate) && BAPER[HRate] &&
(BAPER[HRate] < BAPER[Rate] + BADiff[Rate])) {
Rate = HRate;
//DbgPrint("Rate improved to %d", Rate);
}
else {
Rate = LRate;
//DbgPrint("Rate decreased to %d", Rate);
}
}
else if (BAPER[Rate] && BAPER[Rate]<100) {
if (RateCtrlTxMPDU > 100) {
Rate = HRate;
//DbgPrint("Rate improved to %d", Rate);
}
}
wd->sta.oppositeInfo[0].rcCell.currentRate = Rate;
wd->sta.oppositeInfo[0].rcCell.currentRateIndex = RateMapToRateIndex(Rate, &wd->sta.oppositeInfo[0].rcCell);
}
#endif

View File

@ -0,0 +1,37 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef _RATECTRL_H
#define _RATECTRL_H
#define ZM_RATE_CTRL_PROBING_INTERVAL_MS 1000 //1000ms
#define ZM_RATE_CTRL_MIN_PROBING_PACKET 8
#define ZM_MIN_RATE_FAIL_COUNT 20
#define ZM_RATE_PROBING_THRESHOLD 15 //6%
#define ZM_RATE_SUCCESS_PROBING 10
#define ZM_RATE_CTRL_RSSI_VARIATION 5 //TBD
extern const u32_t zcRateToPhyCtrl[];
extern void zfRateCtrlInitCell(zdev_t* dev, struct zsRcCell* rcCell, u8_t type, u8_t gBand, u8_t SG40);
extern u16_t zfRateCtrlGetTxRate(zdev_t* dev, struct zsRcCell* rcCell, u16_t* probing);
extern void zfRateCtrlTxFailEvent(zdev_t* dev, struct zsRcCell* rcCell, u8_t aggRate, u32_t retryRate);
extern void zfRateCtrlTxSuccessEvent(zdev_t* dev, struct zsRcCell* rcCell, u8_t successRate);
extern void zfRateCtrlAggrSta(zdev_t* dev);
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,595 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* */
/* Module Name : wlan_defs.h */
/* */
/* Abstract */
/* This module contains WLAN definitions. */
/* */
/* NOTES */
/* None */
/* */
/************************************************************************/
#ifndef _WLAN_H
#define _WLAN_H
#define ZM_EXTERNAL_ALLOC_BUF 0
#define ZM_INTERNAL_ALLOC_BUF 1
#define ZM_SIZE_OF_CTRL_SET 8
#define ZM_SIZE_OF_IV 4
#define ZM_SIZE_OF_EXT_IV 4
#define ZM_SIZE_OF_MIC 8
#define ZM_SIZE_OF_CCX_MIC 8
#define ZM_SIZE_OF_WLAN_DATA_HEADER 24
#define ZM_SIZE_OF_QOS_CTRL 2
/* Header definition */
#define ZM_SIZE_OF_WLAN_WDS_HEADER 32
#define ZM_SIZE_OF_SNAP_HEADER 8
#define ZM_WLAN_HEADER_A1_OFFSET 4
#define ZM_WLAN_HEADER_A2_OFFSET 10
#define ZM_WLAN_HEADER_A3_OFFSET 16
#define ZM_WLAN_HEADER_A4_OFFSET 24
#define ZM_WLAN_HEADER_IV_OFFSET 24
#define ZM_SIZE_OF_WLAN_DATA_HEADER 24
/* Port definition */
#define ZM_PORT_DISABLED 0
#define ZM_PORT_ENABLED 1
/* Frame Type */
#define ZM_WLAN_MANAGEMENT_FRAME 0x0
#define ZM_WLAN_CONTROL_FRAME 0x4
#define ZM_WLAN_DATA_FRAME 0x8
/* Frame Subtype */
#define ZM_WLAN_FRAME_TYPE_ASOCREQ 0x00
#define ZM_WLAN_FRAME_TYPE_ASOCRSP 0x10
#define ZM_WLAN_FRAME_TYPE_REASOCREQ 0x20
#define ZM_WLAN_FRAME_TYPE_REASOCRSP 0x30
#define ZM_WLAN_FRAME_TYPE_PROBEREQ 0x40
#define ZM_WLAN_FRAME_TYPE_PROBERSP 0x50
/* 0x60, 0x70 => Reserved */
#define ZM_WLAN_FRAME_TYPE_BEACON 0x80
#define ZM_WLAN_FRAME_TYPE_ATIM 0x90
#define ZM_WLAN_FRAME_TYPE_DISASOC 0xA0
#define ZM_WLAN_FRAME_TYPE_AUTH 0xB0
#define ZM_WLAN_FRAME_TYPE_DEAUTH 0xC0
#define ZM_WLAN_FRAME_TYPE_ACTION 0xD0
/* Frame type and subtype */
#define ZM_WLAN_FRAME_TYPE_NULL 0x48
#define ZM_WLAN_FRAME_TYPE_BAR 0x84
#define ZM_WLAN_FRAME_TYPE_BA 0x94
#define ZM_WLAN_FRAME_TYPE_PSPOLL 0xA4
#define ZM_WLAN_FRAME_TYPE_RTS 0xB4
#define ZM_WLAN_FRAME_TYPE_CTS 0xC4
#define ZM_WLAN_FRAME_TYPE_QOS_NULL 0xC8
/* action frame */
#define ZM_WLAN_SPECTRUM_MANAGEMENT_ACTION_FRAME 0
#define ZM_WLAN_QOS_ACTION_FRAME 1
#define ZM_WLAN_DLS_ACTION_FRAME 2
#define ZM_WLAN_BLOCK_ACK_ACTION_FRAME 3
/* block ack action frame*/
#define ZM_WLAN_ADDBA_REQUEST_FRAME 0
#define ZM_WLAN_ADDBA_RESPONSE_FRAME 1
#define ZM_WLAN_DELBA_FRAME 2
/* Element ID */
#define ZM_WLAN_EID_SSID 0
#define ZM_WLAN_EID_SUPPORT_RATE 1
#define ZM_WLAN_EID_FH 2
#define ZM_WLAN_EID_DS 3
#define ZM_WLAN_EID_CFS 4
#define ZM_WLAN_EID_TIM 5
#define ZM_WLAN_EID_IBSS 6
#define ZM_WLAN_EID_COUNTRY 7
/* reserved 8-15 */
#define ZM_WLAN_EID_CHALLENGE 16
/* reserved 17-31 */
#define ZM_WLAN_EID_POWER_CONSTRAINT 32
#define ZM_WLAN_EID_POWER_CAPABILITY 33
#define ZM_WLAN_EID_TPC_REQUEST 34
#define ZM_WLAN_EID_TPC_REPORT 35
#define ZM_WLAN_EID_SUPPORTED_CHANNELS 36
#define ZM_WLAN_EID_CHANNEL_SWITCH_ANNOUNCE 37
#define ZM_WLAN_EID_MEASUREMENT_REQUEST 38
#define ZM_WLAN_EID_MEASUREMENT_REPORT 39
#define ZM_WLAN_EID_QUIET 40
#define ZM_WLAN_EID_IBSS_DFS 41
#define ZM_WLAN_EID_ERP 42
#define ZM_WLAN_PREN2_EID_HTCAPABILITY 45
#define ZM_WLAN_EID_RSN_IE 48
#define ZM_WLAN_EID_EXTENDED_RATE 50
#define ZM_WLAN_EID_HT_CAPABILITY 51
#define ZM_WLAN_EID_EXTENDED_HT_CAPABILITY 52
#define ZM_WLAN_EID_NEW_EXT_CHANNEL_OFFSET 53
#define ZM_WLAN_PREN2_EID_HTINFORMATION 61
#define ZM_WLAN_PREN2_EID_SECONDCHOFFSET 62
#ifdef ZM_ENABLE_CENC
#define ZM_WLAN_EID_CENC_IE 68
#endif //ZM_ENABLE_CENC
#define ZM_WLAN_EID_VENDOR_PRIVATE 221 /* Vendor private space; must demux OUI */
#define ZM_WLAN_EID_WPA_IE 221
#define ZM_WLAN_EID_WPS_IE 221
#define ZM_WLAN_EID_WIFI_IE 221
/* ERP information element */
#define ZM_WLAN_NON_ERP_PRESENT_BIT 0x1
#define ZM_WLAN_USE_PROTECTION_BIT 0x2
#define ZM_WLAN_BARKER_PREAMBLE_MODE_BIT 0x4
/* Channel frequency, in MHz */
#define ZM_CH_G_1 2412
#define ZM_CH_G_2 2417
#define ZM_CH_G_3 2422
#define ZM_CH_G_4 2427
#define ZM_CH_G_5 2432
#define ZM_CH_G_6 2437
#define ZM_CH_G_7 2442
#define ZM_CH_G_8 2447
#define ZM_CH_G_9 2452
#define ZM_CH_G_10 2457
#define ZM_CH_G_11 2462
#define ZM_CH_G_12 2467
#define ZM_CH_G_13 2472
#define ZM_CH_G_14 2484
#define ZM_CH_A_184 4920
#define ZM_CH_A_188 4940
#define ZM_CH_A_192 4960
#define ZM_CH_A_196 4980
#define ZM_CH_A_8 5040
#define ZM_CH_A_12 5060
#define ZM_CH_A_16 5080
#define ZM_CH_A_36 5180
#define ZM_CH_A_40 5200
#define ZM_CH_A_44 5220
#define ZM_CH_A_48 5240
#define ZM_CH_A_52 5260
#define ZM_CH_A_56 5280
#define ZM_CH_A_60 5300
#define ZM_CH_A_64 5320
#define ZM_CH_A_100 5500
#define ZM_CH_A_104 5520
#define ZM_CH_A_108 5540
#define ZM_CH_A_112 5560
#define ZM_CH_A_116 5580
#define ZM_CH_A_120 5600
#define ZM_CH_A_124 5620
#define ZM_CH_A_128 5640
#define ZM_CH_A_132 5660
#define ZM_CH_A_136 5680
#define ZM_CH_A_140 5700
#define ZM_CH_A_149 5745
#define ZM_CH_A_153 5765
#define ZM_CH_A_157 5785
#define ZM_CH_A_161 5805
#define ZM_CH_A_165 5825
/* AP : STA table => STA Type */
#define ZM_11B_STA 0x0
#define ZM_11G_STA 0x2
#define ZM_11N_STA 0x4
/* AP : timeout */
#define ZM_MS_PER_TICK 10
#define ZM_TICK_PER_SECOND (1000/ZM_MS_PER_TICK)
#define ZM_TICK_PER_MINUTE (60*1000/ZM_MS_PER_TICK)
#define ZM_PREAUTH_TIMEOUT_MS 1000 /* 1 sec */
#define ZM_AUTH_TIMEOUT_MS 1000 /* 1 sec */
/* Error code */
#define ZM_SUCCESS 0
#define ZM_ERR_TX_PORT_DISABLED 1
#define ZM_ERR_BUFFER_DMA_ADDR 2
#define ZM_ERR_FREE_TXD_EXHAUSTED 3
#define ZM_ERR_TX_BUFFER_UNAVAILABLE 4
#define ZM_ERR_BCMC_PS_BUFFER_UNAVAILABLE 5
#define ZM_ERR_UNI_PS_BUFFER_UNAVAILABLE 6
#define ZM_ERR_EXCEED_PRIORITY_THRESHOLD 7
#define ZM_ERR_VMMQ_FULL 8
#define ZM_ERR_FLUSH_PS_QUEUE 9
#define ZM_ERR_CMD_INT_MISSED 15 /* Polling cmd int timeout*/
/* Rx */
#define ZM_ERR_RX_FRAME_TYPE 20
#define ZM_ERR_MIN_RX_ENCRYPT_FRAME_LENGTH 21
#define ZM_ERR_MIN_RX_FRAME_LENGTH 22
#define ZM_ERR_MAX_RX_FRAME_LENGTH 23
#define ZM_ERR_RX_DUPLICATE 24
#define ZM_ERR_RX_SRC_ADDR_IS_OWN_MAC 25
#define ZM_ERR_MIN_RX_PROTOCOL_VERSION 26
#define ZM_ERR_WPA_GK_NOT_INSTALLED 27
#define ZM_ERR_STA_NOT_ASSOCIATED 28
#define ZM_ERR_DATA_BEFORE_CONNECTED 29
#define ZM_ERR_DATA_NOT_ENCRYPTED 30
#define ZM_ERR_DATA_BSSID_NOT_MATCHED 31
#define ZM_ERR_RX_BAR_FRAME 32
#define ZM_ERR_OUT_OF_ORDER_NULL_DATA 33
/* ZFI */
#define ZM_ERR_INVALID_TX_RATE 40
#define ZM_ERR_WDS_PORT_ID 41
/* QUEUE */
#define ZM_ERR_QUEUE_FULL 50
#define ZM_ERR_STA_UAPSD_QUEUE_FULL 51
#define ZM_ERR_AP_UAPSD_QUEUE_FULL 52
/* Maximum Rx frame length */
#if ZM_LARGEPAYLOAD_TEST == 1
#define ZM_WLAN_MAX_RX_SIZE 16384
#else
#define ZM_WLAN_MAX_RX_SIZE 8192
#endif
/* PCI DMA test error code */
#define ZM_ERR_INTERRUPT_MISSED 100
#define ZM_ERR_OWN_BIT_NOT_CLEARED 101
#define ZM_ERR_RX_SEQ_NUMBER 102
#define ZM_ERR_RX_LENGTH 103
#define ZM_ERR_RX_DATA 104
#define ZM_ERR_RX_DESCRIPTOR_NUM 105
/* Common register test error code */
#define ZM_ERR_REGISTER_ACCESS 110 /* Register R/W test fail*/
#define ZM_ERR_CLEAR_INTERRUPT_FLAG 111
#define ZM_ERR_COMMAND_RESPONSE 112
#define ZM_ERR_INTERRUPT_GENERATE 113
#define ZM_ERR_INTERRUPT_ACK 114
#define ZM_ERR_SCRATCH_ACCESS 115
#define ZM_ERR_INTERRUPT_MASK_ACCESS 116
#define ZM_ERR_SHARE_MEMORY_PCI_ACCESS 117
#define ZM_ERR_SHARE_MEMORY_FW_ACCESS 118
#define ZM_ERR_SHARE_MEMORY_DISABLE 119
#define ZM_ERR_SHARE_MEMORY_TEST_RESPONSE 120
/* Firmware Download error code */
#define ZM_ERR_FIRMWARE_DOWNLOAD_TIMEOUT 150
#define ZM_ERR_FIRMWARE_DOWNLOAD_INT_FLAG 151
#define ZM_ERR_FIRMWARE_READY_TIMEOUT 152
#define ZM_ERR_FIRMWARE_WRONG_TYPE 153
/* Debug */
#define ZM_LV_0 0//Debug level 0, Disable debug message
#define ZM_LV_1 1//Debug level 1, Show minimum information
#define ZM_LV_2 2//Debug level 2, Show medium message
#define ZM_LV_3 3//Debug level 3, Show all
#define ZM_SCANMSG_LEV ZM_LV_1
#define ZM_TXMSG_LEV ZM_LV_0//ZM_LV_0
#define ZM_RXMSG_LEV ZM_LV_0
#define ZM_MMMSG_LEV ZM_LV_0
#define ZM_DESMSG_LEV ZM_LV_0//ZM_LV_0
#define ZM_BUFMSG_LEV ZM_LV_0//ZM_LV_1
#define ZM_INITMSG_LEV ZM_LV_0
#define zm_msg0_scan(lv, msg) if (ZM_SCANMSG_LEV >= lv) \
{zm_debug_msg0(msg);}
#define zm_msg1_scan(lv, msg, val) if (ZM_SCANMSG_LEV >= lv) \
{zm_debug_msg1(msg, val);}
#define zm_msg2_scan(lv, msg, val) if (ZM_SCANMSG_LEV >= lv) \
{zm_debug_msg2(msg, val);}
#define zm_msg0_tx(lv, msg) if (ZM_TXMSG_LEV >= lv) \
{zm_debug_msg0(msg);}
#define zm_msg1_tx(lv, msg, val) if (ZM_TXMSG_LEV >= lv) \
{zm_debug_msg1(msg, val);}
#define zm_msg2_tx(lv, msg, val) if (ZM_TXMSG_LEV >= lv) \
{zm_debug_msg2(msg, val);}
#define zm_msg0_rx(lv, msg) if (ZM_RXMSG_LEV >= lv) \
{zm_debug_msg0(msg);}
#define zm_msg1_rx(lv, msg, val) if (ZM_RXMSG_LEV >= lv) \
{zm_debug_msg1(msg, val);}
#define zm_msg2_rx(lv, msg, val) if (ZM_RXMSG_LEV >= lv) \
{zm_debug_msg2(msg, val);}
#define zm_msg0_mm(lv, msg) if (ZM_MMMSG_LEV >= lv) \
{zm_debug_msg0(msg);}
#define zm_msg1_mm(lv, msg, val) if (ZM_MMMSG_LEV >= lv) \
{zm_debug_msg1(msg, val);}
#define zm_msg2_mm(lv, msg, val) if (ZM_MMMSG_LEV >= lv) \
{zm_debug_msg2(msg, val);}
#define zm_msg0_des(lv, msg) if (ZM_DESMSG_LEV >= lv) \
{zm_debug_msg0(msg);}
#define zm_msg1_des(lv, msg, val) if (ZM_DESMSG_LEV >= lv) \
{zm_debug_msg1(msg, val);}
#define zm_msg2_des(lv, msg, val) if (ZM_DESMSG_LEV >= lv) \
{zm_debug_msg2(msg, val);}
#define zm_msg0_buf(lv, msg) if (ZM_BUFMSG_LEV >= lv) \
{zm_debug_msg0(msg);}
#define zm_msg1_buf(lv, msg, val) if (ZM_BUFMSG_LEV >= lv) \
{zm_debug_msg1(msg, val);}
#define zm_msg2_buf(lv, msg, val) if (ZM_BUFMSG_LEV >= lv) \
{zm_debug_msg2(msg, val);}
#define zm_msg0_init(lv, msg) if (ZM_INITMSG_LEV >= lv) \
{zm_debug_msg0(msg);}
#define zm_msg1_init(lv, msg, val) if (ZM_INITMSG_LEV >= lv) \
{zm_debug_msg1(msg, val);}
#define zm_msg2_init(lv, msg, val) if (ZM_INITMSG_LEV >= lv) \
{zm_debug_msg2(msg, val);}
#define ZM_MAX_AP_SUPPORT 2 /* Must <= 8 */
#define ZM_MAX_WDS_SUPPORT 6 /* Must <= 6 */
#define ZM_MAX_STA_SUPPORT 16 /* Must <= 64 */
/* STA table state */
#define ZM_STATE_AUTH 1
#define ZM_STATE_PREAUTH 2
#define ZM_STATE_ASOC 3
/* Rate set */
#define ZM_RATE_SET_CCK 0
#define ZM_RATE_SET_OFDM 1
/* HT PT */
#define ZM_PREAMBLE_TYPE_MIXED_MODE 0
#define ZM_PREAMBLE_TYPE_GREEN_FIELD 1
/* HT bandwidth */
#define ZM_BANDWIDTH_20MHZ 0
#define ZM_BANDWIDTH_40MHZ 1
/* MIC status */
#define ZM_MIC_SUCCESS 0
#define ZM_MIC_FAILURE 1
/* ICV status */
#define ZM_ICV_SUCCESS 0
#define ZM_ICV_FAILURE 1
/* definition check */
#if (ZM_MAX_AP_SUPPORT > 8)
definition error, ZM_MAX_AP_SUPPORT > 8
#endif
#if (ZM_MAX_AP_SUPPORT > 64)
definition error, ZM_MAX_STA_SUPPORT > 64
#endif
/* Transmission Rate information */
/* WLAN frame format */
#define ZM_PLCP_HEADER_SIZE 5
#define ZM_ETHERNET_ADDRESS_LENGTH 6
#define ZM_TIMESTAMP_OFFSET 0
#define ZM_BEACON_INTERVAL_OFFSET 8
#define ZM_CAPABILITY_OFFSET 10
/* Reason Code */
/* An unsolicited notification management frame of */
/* type Disassocation or Deauthentication was generated. */
#ifdef ZM_REASON_CODE
#define ZM_WLAN_REASON_CODE_UNSPECIFIED 1
#define ZM_WLAN_FRAME_DISASOC_DEAUTH_REASON_CODE 24
#endif
struct zsWlanManagementFrameHeader
{
//u8_t plcpHdr[ZM_PLCP_HEADER_SIZE];
u8_t frameCtrl[2];
u8_t duration[2];
u8_t da[ZM_ETHERNET_ADDRESS_LENGTH];
u8_t sa[ZM_ETHERNET_ADDRESS_LENGTH];
u8_t bssid[ZM_ETHERNET_ADDRESS_LENGTH];
u8_t seqCtrl[2];
u8_t body[1];
};
struct zsWlanProbeRspFrameHeader
{
//u8_t plcpHdr[ZM_PLCP_HEADER_SIZE];
u8_t frameCtrl[2];
u8_t duration[2];
u8_t da[ZM_ETHERNET_ADDRESS_LENGTH];
u8_t sa[ZM_ETHERNET_ADDRESS_LENGTH];
u8_t bssid[ZM_ETHERNET_ADDRESS_LENGTH];
u8_t seqCtrl[2];
u8_t timeStamp[8];
u8_t beaconInterval[2];
u8_t capability[2];
u8_t ssid[ZM_MAX_SSID_LENGTH + 2]; // EID(1) + Length(1) + SSID(32)
} ;
#define zsWlanBeaconFrameHeader zsWlanProbeRspFrameHeader
struct zsWlanAuthFrameHeader
{
//u8_t plcpHdr[ZM_PLCP_HEADER_SIZE];
u8_t frameCtrl[2];
u8_t duration[2];
u8_t address1[ZM_ETHERNET_ADDRESS_LENGTH];
u8_t address2[ZM_ETHERNET_ADDRESS_LENGTH];
u8_t address3[ZM_ETHERNET_ADDRESS_LENGTH];
u8_t seqCtrl[2];
u16_t algo;
u16_t seq;
u16_t status;
u8_t challengeText[255]; // the first 2 bytes are information ID, length
};
struct zsWlanAssoFrameHeader
{
//u8_t plcpHdr[PLCP_HEADER_SIZE];
u8_t frameCtrl[2];
u8_t duration[2];
u8_t address1[ZM_ETHERNET_ADDRESS_LENGTH];
u8_t address2[ZM_ETHERNET_ADDRESS_LENGTH];
u8_t address3[ZM_ETHERNET_ADDRESS_LENGTH];
u8_t seqCtrl[2];
u8_t capability[2];
u16_t status;
u16_t aid;
//u8_t supportedRates[10];
};
struct zsFrag
{
zbuf_t* buf[16];
u16_t bufType[16];
u16_t seq[16];
u8_t flag[16];
};
//================================
// Hardware related definitions
//================================
#define ZM_MAC_REG_BASE 0x1c3000
#define ZM_MAC_REG_ATIM_WINDOW (ZM_MAC_REG_BASE + 0x51C)
#define ZM_MAC_REG_BCN_PERIOD (ZM_MAC_REG_BASE + 0x520)
#define ZM_MAC_REG_PRETBTT (ZM_MAC_REG_BASE + 0x524)
#define ZM_MAC_REG_MAC_ADDR_L (ZM_MAC_REG_BASE + 0x610)
#define ZM_MAC_REG_MAC_ADDR_H (ZM_MAC_REG_BASE + 0x614)
#define ZM_MAC_REG_GROUP_HASH_TBL_L (ZM_MAC_REG_BASE + 0x624)
#define ZM_MAC_REG_GROUP_HASH_TBL_H (ZM_MAC_REG_BASE + 0x628)
#define ZM_MAC_REG_BASIC_RATE (ZM_MAC_REG_BASE + 0x630)
#define ZM_MAC_REG_MANDATORY_RATE (ZM_MAC_REG_BASE + 0x634)
#define ZM_MAC_REG_RTS_CTS_RATE (ZM_MAC_REG_BASE + 0x638)
#define ZM_MAC_REG_BACKOFF_PROTECT (ZM_MAC_REG_BASE + 0x63c)
#define ZM_MAC_REG_RX_THRESHOLD (ZM_MAC_REG_BASE + 0x640)
#define ZM_MAC_REG_RX_PE_DELAY (ZM_MAC_REG_BASE + 0x64C)
#define ZM_MAC_REG_DYNAMIC_SIFS_ACK (ZM_MAC_REG_BASE + 0x658)
#define ZM_MAC_REG_SNIFFER (ZM_MAC_REG_BASE + 0x674)
#define ZM_MAC_REG_TX_UNDERRUN (ZM_MAC_REG_BASE + 0x688)
#define ZM_MAC_REG_RX_TOTAL (ZM_MAC_REG_BASE + 0x6A0)
#define ZM_MAC_REG_RX_CRC32 (ZM_MAC_REG_BASE + 0x6A4)
#define ZM_MAC_REG_RX_CRC16 (ZM_MAC_REG_BASE + 0x6A8)
#define ZM_MAC_REG_RX_ERR_UNI (ZM_MAC_REG_BASE + 0x6AC)
#define ZM_MAC_REG_RX_OVERRUN (ZM_MAC_REG_BASE + 0x6B0)
#define ZM_MAC_REG_RX_ERR_MUL (ZM_MAC_REG_BASE + 0x6BC)
#define ZM_MAC_REG_TX_RETRY (ZM_MAC_REG_BASE + 0x6CC)
#define ZM_MAC_REG_TX_TOTAL (ZM_MAC_REG_BASE + 0x6F4)
#define ZM_MAC_REG_ACK_EXTENSION (ZM_MAC_REG_BASE + 0x690)
#define ZM_MAC_REG_EIFS_AND_SIFS (ZM_MAC_REG_BASE + 0x698)
#define ZM_MAC_REG_SLOT_TIME (ZM_MAC_REG_BASE + 0x6F0)
#define ZM_MAC_REG_ROLL_CALL_TBL_L (ZM_MAC_REG_BASE + 0x704)
#define ZM_MAC_REG_ROLL_CALL_TBL_H (ZM_MAC_REG_BASE + 0x708)
#define ZM_MAC_REG_AC0_CW (ZM_MAC_REG_BASE + 0xB00)
#define ZM_MAC_REG_AC1_CW (ZM_MAC_REG_BASE + 0xB04)
#define ZM_MAC_REG_AC2_CW (ZM_MAC_REG_BASE + 0xB08)
#define ZM_MAC_REG_AC3_CW (ZM_MAC_REG_BASE + 0xB0C)
#define ZM_MAC_REG_AC4_CW (ZM_MAC_REG_BASE + 0xB10)
#define ZM_MAC_REG_AC1_AC0_AIFS (ZM_MAC_REG_BASE + 0xB14)
#define ZM_MAC_REG_AC3_AC2_AIFS (ZM_MAC_REG_BASE + 0xB18)
#define ZM_MAC_REG_RETRY_MAX (ZM_MAC_REG_BASE + 0xB28)
#define ZM_MAC_REG_TXOP_NOT_ENOUGH_INDICATION (ZM_MAC_REG_BASE + 0xB30)
#define ZM_MAC_REG_AC1_AC0_TXOP (ZM_MAC_REG_BASE + 0xB44)
#define ZM_MAC_REG_AC3_AC2_TXOP (ZM_MAC_REG_BASE + 0xB48)
#define ZM_MAC_REG_ACK_TABLE (ZM_MAC_REG_BASE + 0xC00)
#define ZM_MAC_REG_BCN_ADDR (ZM_MAC_REG_BASE + 0xD84)
#define ZM_MAC_REG_BCN_LENGTH (ZM_MAC_REG_BASE + 0xD88)
#define ZM_MAC_REG_BCN_PLCP (ZM_MAC_REG_BASE + 0xD90)
#define ZM_MAC_REG_BCN_CTRL (ZM_MAC_REG_BASE + 0xD94)
#define ZM_MAC_REG_BCN_HT1 (ZM_MAC_REG_BASE + 0xDA0)
#define ZM_MAC_REG_BCN_HT2 (ZM_MAC_REG_BASE + 0xDA4)
#define ZM_RX_STATUS_IS_MIC_FAIL(rxStatus) rxStatus->Tail.Data.ErrorIndication & ZM_BIT_6
//================================
//================================
#ifdef ZM_ENABLE_NATIVE_WIFI
#define ZM_80211_FRAME_HEADER_LEN 24
#define ZM_80211_FRAME_TYPE_OFFSET 30 // ZM_80211_FRAME_HEADER_LEN + SNAP
#define ZM_80211_FRAME_IP_OFFSET 32 // ZM_80211_FRAME_HEADER_LEN + SNAP + TYPE
#else
#define ZM_80211_FRAME_HEADER_LEN 14
#define ZM_80211_FRAME_TYPE_OFFSET 12 // ZM_80211_FRAME_HEADER_LEN + SNAP
#define ZM_80211_FRAME_IP_OFFSET 14 // ZM_80211_FRAME_HEADER_LEN + SNAP + TYPE
#endif
#define ZM_BSS_INFO_VALID_BIT 0x01
#define ZM_BSS_INFO_UPDATED_BIT 0x02
#define ZM_ERROR_INDICATION_RX_TIMEOUT 0x01
#define ZM_ERROR_INDICATION_OVERRUN 0x02
#define ZM_ERROR_INDICATION_DECRYPT_ERROR 0x04
#define ZM_ERROR_INDICATION_CRC32_ERROR 0x08
#define ZM_ERROR_INDICATION_ADDR_NOT_MATCH 0x10
#define ZM_ERROR_INDICATION_CRC16_ERROR 0x20
#define ZM_ERROR_INDICATION_MIC_ERROR 0x40
#define ZM_RXMAC_STATUS_MOD_TYPE_CCK 0x00
#define ZM_RXMAC_STATUS_MOD_TYPE_OFDM 0x01
#define ZM_RXMAC_STATUS_MOD_TYPE_HT_OFDM 0x02
#define ZM_RXMAC_STATUS_MOD_TYPE_DL_OFDM 0x03
#define ZM_RXMAC_STATUS_TOTAL_ERROR 0x80
#define ZM_MAX_LED_NUMBER 2
#define ZM_LED_DISABLE_MODE 0x0
#define ZM_LED_LINK_MODE 0x1
#define ZM_LED_LINK_TR_MODE 0x2
#define ZM_LED_TR_ON_MODE 0x3
#define ZM_LED_TR_OFF_MODE 0x4
#define ZM_LED_CTRL_FLAG_ALPHA 0x1
struct zsLedStruct
{
u32_t counter;
u32_t counter100ms;
u16_t ledLinkState;
u16_t ledMode[ZM_MAX_LED_NUMBER];
u32_t txTraffic;
u32_t rxTraffic;
u8_t LEDCtrlType;
u8_t LEDCtrlFlag; // Control Flag for vendors
u8_t LEDCtrlFlagFromReg; // Control Flag for vendors in registry
};
//HAL+ capability bits definition
#define ZM_HP_CAP_11N 0x1
#define ZM_HP_CAP_11N_ONE_TX_STREAM 0x2
#define ZM_HP_CAP_2G 0x4
#define ZM_HP_CAP_5G 0x8
#endif /* #ifndef _WLAN_H */

View File

@ -0,0 +1,32 @@
config OTUS
tristate "Atheros OTUS 802.11n USB wireless support"
depends on USB && WLAN_80211 && MAC80211
default N
---help---
Enable support for Atheros 802.11n USB hardware:
* UB81 - 2x2 2.4 GHz
* UB82 - 2x2 2.4 GHz and 5 GHz
* UB83 - 1x2 2.4 GHz
This includes the following devices currently on the market:
Dlink DWA-160A1, Netgear WNDA3100 and WN111v2, TP-Link
TL-WN821N, and AVM FRITZ!WLAN N USB Stick.
This driver requires its own supplicant driver for
wpa_supplicant 0.4.8. For your convenience you can find the
tarball here:
http://www.kernel.org/pub/linux/kernel/people/mcgrof/otus/wpa_supplicant-0.4.8_otus.tar.bz2
Before compiling wpa_supplicant, ensure your .config has at
least the following:
CONFIG_WIRELESS_EXTENSION=y
CONFIG_EAP_WSC=y
CONFIG_WSC_IE=y
CONFIG_DRIVER_WEXT=y
CONFIG_DRIVER_OTUS=y
After a successful compile, you can use the Atheros device as
shown in the example:
$ wpa_supplicant -Dotus -i <atheros device from ifconfig> -c /path/to/wpa_supplicant.conf -d

View File

@ -0,0 +1,67 @@
obj-$(CONFIG_OTUS) += arusb_lnx.o
EXTRA_CFLAGS += -DAMAC
EXTRA_CFLAGS += -DGCCK
EXTRA_CFLAGS += -DOFDM
EXTRA_CFLAGS += -DTXQ_IN_ISR
EXTRA_CFLAGS += -DWLAN_HOSTIF=0 #0:USB, 1:PCI
#Test Mode
EXTRA_CFLAGS += -DZM_USB_STREAM_MODE=1
EXTRA_CFLAGS += -DZM_USB_TX_STREAM_MODE=0
EXTRA_CFLAGS += -DZM_PCI_DMA_TEST=0
EXTRA_CFLAGS += -DZM_LARGEPAYLOAD_TEST=0
EXTRA_CFLAGS += -DZM_FW_LOOP_BACK=0
EXTRA_CFLAGS += -DZM_LINUX_TPC=1
#EXTRA_CFLAGS += -DZM_DONT_COPY_RX_BUFFER
EXTRA_CFLAGS += -DZM_HOSTAPD_SUPPORT
#EXTRA_CFLAGS += -DfTX_GAIN_OFDM=0
#EXTRA_CFLAGS += -DZM_CONFIG_BIG_ENDIAN -DBIG_ENDIAN
EXTRA_CFLAGS += -DZM_HALPLUS_LOCK
EXTRA_CFLAGS += -DZM_OTUS_LINUX_PHASE_2
arusb_lnx-objs := \
usbdrv.o \
zdusb.o \
ioctl.o \
wrap_buf.o \
wrap_mem.o \
wrap_ev.o \
wrap_usb.o \
wrap_pkt.o \
wrap_dbg.o \
wrap_mis.o \
wrap_sec.o \
wwrap.o \
80211core/ccmd.o \
80211core/chb.o \
80211core/cinit.o \
80211core/cmm.o \
80211core/cmmap.o \
80211core/cmmsta.o \
80211core/cfunc.o \
80211core/coid.o \
80211core/ctkip.o \
80211core/ctxrx.o \
80211core/cic.o \
80211core/cpsmgr.o \
80211core/cscanmgr.o \
80211core/ratectrl.o \
80211core/ledmgr.o \
80211core/amsdu.o \
80211core/cwm.o \
80211core/cagg.o \
80211core/queue.o \
80211core/freqctrl.o \
80211core/cwep.o \
hal/hprw.o \
hal/hpmain.o \
hal/hpusb.o \
hal/hpreg.o \
hal/hpfwuinit.o \
hal/hpfwbu.o \
hal/hpfw2.o \
hal/hpDKfwu.o \
hal/hpfwspiu.o \
hal/hpani.o

View File

@ -0,0 +1,9 @@
TODO:
- checkpatch.pl cleanups
- sparse cleanups
- port to in-kernel 80211 stack
- proper network developer maintainer
Please send any patches to Greg Kroah-Hartman <greg@kroah.com> and
Luis Rodriguez <Luis.Rodriguez@Atheros.com> and the
otus-devel@lists.madwifi-project.org mailing list.

View File

@ -0,0 +1,457 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* */
/* Module Name : apdbg.c */
/* */
/* Abstract */
/* Debug tools */
/* */
/* NOTES */
/* None */
/* */
/************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <linux/sockios.h>
#define ZM_IOCTL_REG_READ 0x01
#define ZM_IOCTL_REG_WRITE 0x02
#define ZM_IOCTL_MEM_DUMP 0x03
#define ZM_IOCTL_REG_DUMP 0x05
#define ZM_IOCTL_TXD_DUMP 0x06
#define ZM_IOCTL_RXD_DUMP 0x07
#define ZM_IOCTL_MEM_READ 0x0B
#define ZM_IOCTL_MEM_WRITE 0x0C
#define ZM_IOCTL_DMA_TEST 0x10
#define ZM_IOCTL_REG_TEST 0x11
#define ZM_IOCTL_TEST 0x80
#define ZM_IOCTL_TALLY 0x81 //CWYang(+)
#define ZM_IOCTL_RTS 0xA0
#define ZM_IOCTL_MIX_MODE 0xA1
#define ZM_IOCTL_FRAG 0xA2
#define ZM_IOCTL_SCAN 0xA3
#define ZM_IOCTL_KEY 0xA4
#define ZM_IOCTL_RATE 0xA5
#define ZM_IOCTL_ENCRYPTION_MODE 0xA6
#define ZM_IOCTL_GET_TXCNT 0xA7
#define ZM_IOCTL_GET_DEAGG_CNT 0xA8
#define ZM_IOCTL_DURATION_MODE 0xA9
#define ZM_IOCTL_SET_AES_KEY 0xAA
#define ZM_IOCTL_SET_AES_MODE 0xAB
#define ZM_IOCTL_SIGNAL_STRENGTH 0xAC //CWYang(+)
#define ZM_IOCTL_SIGNAL_QUALITY 0xAD //CWYang(+)
#define ZM_IOCTL_SET_PIBSS_MODE 0xAE
#define ZDAPIOCTL SIOCDEVPRIVATE
struct zdap_ioctl {
unsigned short cmd; /* Command to run */
unsigned int addr; /* Length of the data buffer */
unsigned int value; /* Pointer to the data buffer */
unsigned char data[0x100];
};
/* Declaration of macro and function for handling WEP Keys */
#if 0
#define SKIP_ELEM { \
while(isxdigit(*p)) \
p++; \
}
#define SKIP_DELIMETER { \
if(*p == ':' || *p == ' ') \
p++; \
}
#endif
char hex(char);
unsigned char asctohex(char *str);
char *prgname;
int set_ioctl(int sock, struct ifreq *req)
{
if (ioctl(sock, ZDAPIOCTL, req) < 0) {
fprintf(stderr, "%s: ioctl(SIOCGIFMAP): %s\n",
prgname, strerror(errno));
return -1;
}
return 0;
}
int read_reg(int sock, struct ifreq *req)
{
struct zdap_ioctl *zdreq = 0;
if (!set_ioctl(sock, req))
return -1;
//zdreq = (struct zdap_ioctl *)req->ifr_data;
//printf( "reg = %4x, value = %4x\n", zdreq->addr, zdreq->value);
return 0;
}
int read_mem(int sock, struct ifreq *req)
{
struct zdap_ioctl *zdreq = 0;
int i;
if (!set_ioctl(sock, req))
return -1;
/*zdreq = (struct zdap_ioctl *)req->ifr_data;
printf( "dump mem from %x, length = %x\n", zdreq->addr, zdreq->value);
for (i=0; i<zdreq->value; i++) {
printf("%02x", zdreq->data[i]);
printf(" ");
if ((i>0) && ((i+1)%16 == 0))
printf("\n");
}*/
return 0;
}
int main(int argc, char **argv)
{
int sock;
int addr, value;
struct ifreq req;
char *action = NULL;
struct zdap_ioctl zdreq;
prgname = argv[0];
if (argc < 3) {
fprintf(stderr,"%s: usage is \"%s <ifname> <operation> [<address>] [<value>]\"\n",
prgname, prgname);
fprintf(stderr,"valid operation: read, write, mem, reg,\n");
fprintf(stderr," : txd, rxd, rmem, wmem\n");
fprintf(stderr," : dmat, regt, test\n");
fprintf(stderr," scan, Channel Scan\n");
fprintf(stderr," rts <decimal>, Set RTS Threshold\n");
fprintf(stderr," frag <decimal>, Set Fragment Threshold\n");
fprintf(stderr," rate <0-28>, 0:AUTO, 1-4:CCK, 5-12:OFDM, 13-28:HT\n");
fprintf(stderr," TBD mix <0 or 1>, Set 1 to enable mixed mode\n");
fprintf(stderr," enc, <0-3>, 0=>OPEN, 1=>WEP64, 2=>WEP128, 3=>WEP256\n");
fprintf(stderr," skey <key>, Set WEP key\n");
fprintf(stderr," txcnt, Get TxQ Cnt\n");
fprintf(stderr," dagcnt, Get Deaggregate Cnt\n");
fprintf(stderr," durmode <mode>, Set Duration Mode 0=>HW, 1=>SW\n");
fprintf(stderr," aeskey <user> <key>\n");
fprintf(stderr," aesmode <mode>\n");
fprintf(stderr," wlanmode <0,1> 0:Station mode, 1:PIBSS mode\n");
fprintf(stderr," tal <0,1>, Get Current Tally Info, 0=>read, 1=>read and reset\n");
exit(1);
}
strcpy(req.ifr_name, argv[1]);
zdreq.addr = 0;
zdreq.value = 0;
/* a silly raw socket just for ioctl()ling it */
sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
if (sock < 0) {
fprintf(stderr, "%s: socket(): %s\n", argv[0], strerror(errno));
exit(1);
}
if (argc >= 4)
{
sscanf(argv[3], "%x", &addr);
}
if (argc >= 5)
{
sscanf(argv[4], "%x", &value);
}
zdreq.addr = addr;
zdreq.value = value;
if (!strcmp(argv[2], "read"))
{
zdreq.cmd = ZM_IOCTL_REG_READ;
}
else if (!strcmp(argv[2], "mem"))
{
zdreq.cmd = ZM_IOCTL_MEM_DUMP;
}
else if (!strcmp(argv[2], "write"))
{
zdreq.cmd = ZM_IOCTL_REG_WRITE;
}
else if (!strcmp(argv[2], "reg"))
{
zdreq.cmd = ZM_IOCTL_REG_DUMP;
}
else if (!strcmp(argv[2], "txd"))
{
zdreq.cmd = ZM_IOCTL_TXD_DUMP;
}
else if (!strcmp(argv[2], "rxd"))
{
zdreq.cmd = ZM_IOCTL_RXD_DUMP;
}
else if (!strcmp(argv[2], "rmem"))
{
zdreq.cmd = ZM_IOCTL_MEM_READ;
}
else if (!strcmp(argv[2], "wmem"))
{
zdreq.cmd = ZM_IOCTL_MEM_WRITE;
}
else if (!strcmp(argv[2], "dmat"))
{
zdreq.cmd = ZM_IOCTL_DMA_TEST;
}
else if (!strcmp(argv[2], "regt"))
{
zdreq.cmd = ZM_IOCTL_REG_TEST;
}
else if (!strcmp(argv[2], "test"))
{
zdreq.cmd = ZM_IOCTL_TEST;
}
else if (!strcmp(argv[2], "tal"))
{
sscanf(argv[3], "%d", &addr);
zdreq.addr = addr;
zdreq.cmd = ZM_IOCTL_TALLY;
}
else if (!strcmp(argv[2], "rts"))
{
sscanf(argv[3], "%d", &addr);
zdreq.addr = addr;
zdreq.cmd = ZM_IOCTL_RTS;
}
else if (!strcmp(argv[2], "mix"))
{
zdreq.cmd = ZM_IOCTL_MIX_MODE;
}
else if (!strcmp(argv[2], "frag"))
{
sscanf(argv[3], "%d", &addr);
zdreq.addr = addr;
zdreq.cmd = ZM_IOCTL_FRAG;
}
else if (!strcmp(argv[2], "scan"))
{
zdreq.cmd = ZM_IOCTL_SCAN;
}
else if (!strcmp(argv[2], "skey"))
{
zdreq.cmd = ZM_IOCTL_KEY;
if (argc >= 4)
{
unsigned char temp[29];
int i;
int keyLen;
int encType;
keyLen = strlen(argv[3]);
if (keyLen == 10)
{
sscanf(argv[3], "%02x%02x%02x%02x%02x", &temp[0], &temp[1],
&temp[2], &temp[3], &temp[4]);
}
else if (keyLen == 26)
{
sscanf(argv[3], "%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]);
}
else if (keyLen == 58)
{
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",
&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], &temp[16], &temp[17], &temp[18], &temp[19],
&temp[20], &temp[21], &temp[22], &temp[23], &temp[24],
&temp[25], &temp[26], &temp[27], &temp[28]);
}
else
{
fprintf(stderr, "Invalid key length\n");
exit(1);
}
zdreq.addr = keyLen/2;
for(i=0; i<zdreq.addr; i++)
{
zdreq.data[i] = temp[i];
}
}
else
{
printf("Error : Key required!\n");
}
}
else if (!strcmp(argv[2], "rate"))
{
sscanf(argv[3], "%d", &addr);
if (addr > 28)
{
fprintf(stderr, "Invalid rate, range:0~28\n");
exit(1);
}
zdreq.addr = addr;
zdreq.cmd = ZM_IOCTL_RATE;
}
else if (!strcmp(argv[2], "enc"))
{
sscanf(argv[3], "%d", &addr);
if (addr > 3)
{
fprintf(stderr, "Invalid encryption mode, range:0~3\n");
exit(1);
}
if (addr == 2)
{
addr = 5;
}
else if (addr == 3)
{
addr = 6;
}
zdreq.addr = addr;
zdreq.cmd = ZM_IOCTL_ENCRYPTION_MODE;
}
else if (!strcmp(argv[2], "txcnt"))
{
zdreq.cmd = ZM_IOCTL_GET_TXCNT;
}
else if (!strcmp(argv[2], "dagcnt"))
{
sscanf(argv[3], "%d", &addr);
if (addr != 0 && addr != 1)
{
fprintf(stderr, "The value should be 0 or 1\n");
exit(0);
}
zdreq.addr = addr;
zdreq.cmd = ZM_IOCTL_GET_DEAGG_CNT;
}
else if (!strcmp(argv[2], "durmode"))
{
sscanf(argv[3], "%d", &addr);
if (addr != 0 && addr != 1)
{
fprintf(stderr, "The Duration mode should be 0 or 1\n");
exit(0);
}
zdreq.addr = addr;
zdreq.cmd = ZM_IOCTL_DURATION_MODE;
}
else if (!strcmp(argv[2], "aeskey"))
{
unsigned char temp[16];
int i;
sscanf(argv[3], "%d", &addr);
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]);
for(i = 0; i < 16; i++)
{
zdreq.data[i] = temp[i];
}
zdreq.addr = addr;
zdreq.cmd = ZM_IOCTL_SET_AES_KEY;
}
else if (!strcmp(argv[2], "aesmode"))
{
sscanf(argv[3], "%d", &addr);
zdreq.addr = addr;
zdreq.cmd = ZM_IOCTL_SET_AES_MODE;
}
else if (!strcmp(argv[2], "wlanmode"))
{
sscanf(argv[3], "%d", &addr);
zdreq.addr = addr;
zdreq.cmd = ZM_IOCTL_SET_PIBSS_MODE;
}
else
{
fprintf(stderr, "error action\n");
exit(1);
}
req.ifr_data = (char *)&zdreq;
set_ioctl(sock, &req);
fail:
exit(0);
}
unsigned char asctohex(char *str)
{
unsigned char value;
value = hex(*str) & 0x0f;
value = value << 4;
str++;
value |= hex(*str) & 0x0f;
return value;
}
char hex(char v)
{
if(isdigit(v))
return v - '0';
else if(isxdigit(v))
return (tolower(v) - 'a' + 10);
else
return 0;
}

View File

@ -0,0 +1,141 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* Module Name : athr_common.h */
/* */
/* Abstract */
/* WPA related function and data structure definitions. */
/* */
/* NOTES */
/* Platform dependent. */
/* */
/************************************************************************/
#ifndef _ATHR_COMMON_H
#define _ATHR_COMMON_H
#define ZD_IOCTL_WPA (SIOCDEVPRIVATE + 1)
#define ZD_IOCTL_PARAM (SIOCDEVPRIVATE + 2)
#define ZD_IOCTL_GETWPAIE (SIOCDEVPRIVATE + 3)
#define ZD_PARAM_ROAMING 0x0001
#define ZD_PARAM_PRIVACY 0x0002
#define ZD_PARAM_WPA 0x0003
#define ZD_PARAM_COUNTERMEASURES 0x0004
#define ZD_PARAM_DROPUNENCRYPTED 0x0005
#define ZD_PARAM_AUTH_ALGS 0x0006
#define ZD_CMD_SET_ENCRYPT_KEY 0x0001
#define ZD_CMD_SET_MLME 0x0002
#define ZD_CMD_SCAN_REQ 0x0003
#define ZD_CMD_SET_GENERIC_ELEMENT 0x0004
#define ZD_CMD_GET_TSC 0x0005
#define ZD_FLAG_SET_TX_KEY 0x0001
#define ZD_GENERIC_ELEMENT_HDR_LEN \
((int) (&((struct athr_wlan_param *) 0)->u.generic_elem.data))
#define ZD_CRYPT_ALG_NAME_LEN 16
#define ZD_MAX_KEY_SIZE 32
#define ZD_MAX_GENERIC_SIZE 64
#define IEEE80211_ADDR_LEN 6
#define IEEE80211_MAX_IE_SIZE 256
#ifdef ZM_ENALBE_WAPI
#define ZM_CMD_WAPI_SETWAPI 0x0001
#define ZM_CMD_WAPI_GETWAPI 0x0002
#define ZM_CMD_WAPI_SETKEY 0x0003
#define ZM_CMD_WAPI_GETKEY 0x0004
#define ZM_CMD_WAPI_REKEY 0x0005
#define ZM_WAPI_WAI_REQUEST 0x00f1
#define ZM_WAPI_UNICAST_REKEY 0x00f2
#define ZM_WAPI_STA_AGING 0x00f3
#define ZM_WAPI_MULTI_REKEY 0x00f4
#define ZM_WAPI_KEY_SIZE 32
#define ZM_WAPI_IV_LEN 16
#endif //ZM_ENALBE_WAPI
/* structure definition */
struct athr_wlan_param {
u32 cmd;
u8 sta_addr[ETH_ALEN];
union {
struct {
u8 alg[ZD_CRYPT_ALG_NAME_LEN];
u32 flags;
u32 err;
u8 idx;
u8 seq[8]; /* sequence counter (set: RX, get: TX) */
u16 key_len;
u8 key[ZD_MAX_KEY_SIZE];
} crypt;
struct {
u32 flags_and;
u32 flags_or;
} set_flags_sta;
struct {
u8 len;
u8 data[ZD_MAX_GENERIC_SIZE];
} generic_elem;
struct {
#define MLME_STA_DEAUTH 0
#define MLME_STA_DISASSOC 1
u16 cmd;
u16 reason_code;
} mlme;
struct {
u8 ssid_len;
u8 ssid[32];
} scan_req;
} u;
};
struct ieee80211req_wpaie {
u8 wpa_macaddr[IEEE80211_ADDR_LEN];
u8 wpa_ie[IEEE80211_MAX_IE_SIZE];
};
#ifdef ZM_ENALBE_WAPI
struct athr_wapi_param {
u16 cmd;
u16 len;
union {
struct {
u8 sta_addr[ETH_ALEN];
u8 reserved;
u8 keyid;
u8 key[ZM_WAPI_KEY_SIZE];
} crypt;
struct {
u8 wapi_policy;
} info;
} u;
};
struct athr_wapi_sta_info
{
u16 msg_type;
u16 datalen;
u8 sta_mac[ETH_ALEN];
u8 reserve_data[2];
u8 gsn[ZM_WAPI_IV_LEN];
u8 wie[256];
};
#endif //ZM_ENALBE_WAPI
#endif

View File

@ -0,0 +1,832 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "../80211core/cprecomp.h"
const u32_t zcDKFwImage[] = {
0x0009000B, 0x4F222FE6, 0xDE3E7FFC, 0xE114D73E,
0x1E13D43E, 0x1E4C470B, 0x0009B017, 0x956EE600,
0xC84060E2, 0x2F028F03, 0x8FF93652, 0xD4387601,
0x4E0BDE38, 0xD4380009, 0x00094E0B, 0x4E0BD437,
0x7F040009, 0xA0364F26, 0x4F226EF6, 0x410BD134,
0xD4340009, 0x0009440B, 0x450BD533, 0xD7330009,
0xD233E1FF, 0x2712611D, 0xD4325029, 0xE1FFCB01,
0x1209E501, 0x12112212, 0xD52F2452, 0xD22F9740,
0xE7002572, 0xD42FD12E, 0x2270D62F, 0x2172E201,
0x26202420, 0xE4FFD62D, 0xE6002641, 0xE104D52C,
0x6063666D, 0x626D7601, 0x32124000, 0x05458FF8,
0x000B4F26, 0xEAC80009, 0xDB266AAC, 0xDD27DC26,
0xD828DE27, 0x4C0BE901, 0x4D0B0009, 0x4E0B0009,
0x60B20009, 0x89078801, 0x6242D423, 0x890332A6,
0x6050D522, 0x8BEE8801, 0x2B92D41F, 0x26686642,
0x480B89E9, 0xD51D0009, 0xAFE4E200, 0x27102520,
0x00000FA0, 0x001C001C, 0x00200ED4, 0x0000B38E,
0x00202F90, 0x00201356, 0x00202F9C, 0x00202FB4,
0x00201314, 0x00201412, 0x00200EF8, 0x001C3510,
0x001C3624, 0x001E212C, 0x00202F00, 0x00202A9C,
0x00202F08, 0x00202F14, 0x00202F20, 0x00202F22,
0x00202F26, 0x001C1028, 0x00201220, 0x0020294C,
0x00201D10, 0x00201EC8, 0x00203220, 0x00202F24,
0x2FB62F96, 0x2FD62FC6, 0x4F222FE6, 0xDE947F80,
0x61E0E024, 0x0F14D493, 0x710161E3, 0xD7926210,
0x470BE028, 0xD5910F24, 0x0009450B, 0x6D032008,
0x1F0B8F11, 0xD48FDC8E, 0xDD8F67C0, 0x657C4D0B,
0xDD8FD18E, 0x6B9C6910, 0x420862B3, 0x32B84208,
0x3D2C4208, 0xE0281FDB, 0xE58004FC, 0x604C66E2,
0x3050655C, 0x2D628F13, 0x01FCE024, 0x641CE500,
0x625DDE84, 0x8B013243, 0x0009A39E, 0x6753655D,
0x607037EC, 0x39DC6953, 0xAFF27501, 0x20088094,
0xE0248B13, 0xE50001FC, 0xA009DE7A, 0x655D641C,
0x32EC6253, 0x6C536B22, 0x3CDC67B2, 0x75041C71,
0x3243625D, 0xA37F8BF3, 0x88012D10, 0xE0248B16,
0xE40001FC, 0x671C2D40, 0x624DDE6E, 0x8B013273,
0x0009A372, 0x6CE3644D, 0x7C046943, 0x39EC6B43,
0x65923BCC, 0x74086DB2, 0x25D2AFEF, 0x8B198804,
0x01FCE024, 0x2D70E700, 0x1FD86D1C, 0x627DDE61,
0x8B0132D3, 0x0009A358, 0x6B73677D, 0x3BEC61E3,
0x710464B2, 0x3C1C6C73, 0x694265C2, 0x29597708,
0x2492AFED, 0x8B188805, 0x01FCE024, 0x2D40E400,
0xDE54671C, 0x3273624D, 0xA33D8B01, 0x644D0009,
0x6BE36D43, 0x65D23DEC, 0x61437B04, 0x6C1231BC,
0x74086952, 0xAFED29CB, 0x88312592, 0xDE4A8B20,
0x65E6DB4A, 0x61E6DC4A, 0x67E2D94A, 0x62E27E04,
0x1FEC7EE8, 0x7E0464E2, 0x6EE21FED, 0x5BFD2BE0,
0x60B27B04, 0xC9011FBE, 0x6BB22C00, 0x29B04B09,
0xDC412F26, 0x66134C0B, 0xE2007F04, 0x2D20A30C,
0x8B218830, 0xD939DE38, 0xE06465E6, 0x720462E3,
0x672666E2, 0x6E23DC36, 0x62227EE8, 0x6BE261E6,
0x29B01FEF, 0x7E040F16, 0xC90160E2, 0x6EE22C00,
0x4E09DC30, 0x2F262CE0, 0xD130E068, 0x04FE410B,
0xE2007F04, 0x2D20A2E8, 0x8B058833, 0x4E0BDE2C,
0xE1000009, 0x2D10A2E0, 0x89018828, 0x0009A106,
0xE143DE20, 0xE04062E1, 0x3217622D, 0x0FE68F04,
0x6023E240, 0x262106FE, 0x8B013217, 0x0009A0EF,
0x02FEE040, 0x8521E401, 0x8B013046, 0x0009A0E7,
0xE501E040, 0x2D5007FE, 0x6471B2C7, 0x09FEE040,
0x6291E143, 0x652DE068, 0x8D6B3517, 0xE6400F56,
0x8B273563, 0xE048E600, 0xE11A0F65, 0x72C0A031,
0x00117800, 0x00202FB8, 0x00201356, 0x00202480,
0x00202F1A, 0x00202FBC, 0x002013A2, 0x00202F19,
0x00202B40, 0x00117804, 0x00117810, 0x00202F15,
0x00202F16, 0x00202F17, 0x00200B84, 0x00200BD8,
0x00200BD4, 0x41216153, 0x41214121, 0x41214121,
0x45214521, 0x60534521, 0x6603C903, 0x0F65E048,
0xE0077118, 0xE0442209, 0x641D0F25, 0x65F3E04C,
0x0F46B314, 0x04FDE048, 0x0BFDE044, 0x61BD674D,
0x41084708, 0x0F16E050, 0xD2936073, 0x420B09FE,
0x6C07E00F, 0x607329C9, 0xE0400F96, 0x65F30EFE,
0x6D0D85E2, 0x01FEE050, 0x60D3420B, 0x6073290B,
0xE04C0F96, 0x04FEB2D9, 0x06FEE040, 0x6261E068,
0x0F56652D, 0x3563E640, 0xE000894E, 0x602381F8,
0x4008C903, 0x6B034000, 0xE0546103, 0xE0580FB6,
0xECFFDD7D, 0x6CCC0FF6, 0x0FD6E06C, 0x4D0B60C3,
0x42216253, 0x42214221, 0x64234221, 0x324C4200,
0xE05C6E07, 0x45214200, 0xE0400FE6, 0x0BFE4521,
0xC9036053, 0x30FC4008, 0x6D037B06, 0x85F81F05,
0x6C2D1FB7, 0x1FC66E03, 0x0FC6E060, 0x05FEE058,
0x64C3B2B4, 0x33FCE354, 0x563262D2, 0x22696132,
0x67B42D22, 0x490B5936, 0x220B607C, 0x05FEE058,
0x64C32D22, 0x7E01B289, 0xE70662ED, 0x8FE33273,
0xE0407C01, 0x626106FE, 0x06FEE040, 0x85614200,
0x302C760C, 0x6103701B, 0x64F3E500, 0x7501E704,
0x6B5D6966, 0x24923B73, 0x74048FF9, 0xB26C65F3,
0xE040641D, 0xB20506FE, 0xA1DD6461, 0xD44F0009,
0xE201D74F, 0x2D20470B, 0x0009A1D6, 0x8B078829,
0xEC00DE4C, 0x61E22DC0, 0x641DB1D7, 0x0009A1CC,
0x622CE281, 0x8B013020, 0x0009A118, 0x06FCE028,
0xE682626C, 0x3260666C, 0xA0EE8B01, 0xE6830009,
0x3260666C, 0xA0DC8B01, 0xE6900009, 0x3260666C,
0xA0D08B01, 0xE6910009, 0x3260666C, 0xA0B98B01,
0xE6B00009, 0x3260666C, 0xA07F8B01, 0xE6BB0009,
0x3260666C, 0xE6928920, 0x3260666C, 0xE4008B14,
0xEB04D531, 0x52516652, 0x8B073620, 0x624D7401,
0x8FF732B7, 0xE6007508, 0x52FBA002, 0xE60152FB,
0xE6041261, 0x2260A188, 0xD229D428, 0xD4296542,
0x0009420B, 0x0009A180, 0xE100E670, 0x601336FC,
0xE0248162, 0x0BFCD21F, 0x6BBC6722, 0x26727BFC,
0xEB0416B2, 0x06FEE078, 0x3263621D, 0xA16B8B01,
0xDE1D0009, 0x31EC611D, 0xD41C6E12, 0x410BD114,
0xE0700009, 0x450BD51A, 0xD41A04FE, 0x420BD210,
0xD2170009, 0x64E3420B, 0xD60DD417, 0x0009460B,
0x05FEE070, 0x01FDE074, 0x611DE600, 0x6253351C,
0x326C666D, 0x22E07601, 0x32B3626D, 0x4E198FF7,
0xE0747104, 0x0F15AFCE, 0x002029F8, 0x00202FDC,
0x00201356, 0x00117804, 0x00202B10, 0x00117800,
0x002013A2, 0x00203014, 0x00117808, 0x00202FF4,
0x0020139A, 0x00203008, 0x00203010, 0x02FCE024,
0x672CE07C, 0xEC000F76, 0xE07CEB04, 0x62CD07FE,
0x8B013273, 0x0009A118, 0x6CCDD7B9, 0x357C65C3,
0x62C37704, 0xD4B7327C, 0x6D52D7B7, 0x6E22470B,
0x470BD7B6, 0xD4B664D3, 0x420BD2B3, 0xD2B30009,
0x64E3420B, 0xD6B0D4B3, 0x0009460B, 0x67D3E600,
0x376C666D, 0x626D7601, 0x27E032B3, 0x4E198FF7,
0x7C08AFD3, 0x6212D1A6, 0x2228622C, 0xD2AA8B04,
0x0009420B, 0x0009A003, 0x420BD2A8, 0x56FB0009,
0xA0E1E200, 0xB1A62620, 0x56FB0009, 0xA0DBE200,
0x52FB2620, 0xE500D69A, 0x65622250, 0x7604D2A0,
0x62622252, 0xA0CFD69F, 0x56FB2620, 0x2610E124,
0x5217D19D, 0x52181621, 0x52191622, 0x521A1623,
0x551B1624, 0x1655E200, 0x1656551C, 0x1657551D,
0x1658551E, 0x1659551F, 0x11281127, 0x112A1129,
0x112C112B, 0x112E112D, 0x112FA0AE, 0xD68FD18E,
0x6262E040, 0x76046512, 0x2152352C, 0x55116266,
0x1151352C, 0x62626563, 0x75085612, 0x1162362C,
0x56136252, 0x362C75EC, 0x62521163, 0x75105614,
0x1164362C, 0x62526653, 0x76105515, 0x1155352C,
0x56166262, 0x362CD57E, 0x62561166, 0x362C5617,
0x66531167, 0x55186252, 0x352C7604, 0x62661158,
0x352C5519, 0x65631159, 0x561A6262, 0x362C7504,
0x6252116A, 0x7504561B, 0x116B362C, 0x561C6256,
0x116C362C, 0x561D6256, 0x116D362C, 0x62526653,
0x7604551E, 0x115E352C, 0x561F6262, 0x362CD569,
0x6252116F, 0x7594061E, 0x0166362C, 0x6653E044,
0x051E6252, 0x352C7644, 0xE0480156, 0x061E6262,
0x0166362C, 0xE054D660, 0x051E6262, 0x352C4229,
0x76040156, 0xE0586262, 0x4229061E, 0x0166362C,
0xE23856FB, 0xE0442620, 0xE048021E, 0x62121621,
0x55111622, 0x1653E200, 0x16545512, 0x16555515,
0x16565513, 0x16575516, 0xE040051E, 0x051E1658,
0x1659E050, 0x165A5514, 0xE04C051E, 0x051E165B,
0x165CE054, 0xE058051E, 0x051E165D, 0x165EE044,
0xE0480126, 0x11212122, 0x11251122, 0x11261123,
0xE0400126, 0xE0500126, 0x01261124, 0x0126E04C,
0x0126E054, 0x0126E058, 0x3F3C9358, 0x6EF64F26,
0x6CF66DF6, 0x000B6BF6, 0x4F2269F6, 0xE240614D,
0x89143123, 0x3127E21F, 0x8B09D734, 0xD434614D,
0xE00171E0, 0x5671440B, 0x26596507, 0x1761A007,
0xE001D42F, 0x6672440B, 0x26596507, 0x4F262762,
0x0009000B, 0x614D4F22, 0x3123E240, 0xE21F8912,
0xD7263127, 0x614D8B08, 0x5671D225, 0x420B71E0,
0x260BE001, 0x1761A006, 0x6672D221, 0xE001420B,
0x2762260B, 0x000B4F26, 0xE6400009, 0x46284618,
0x6252D51C, 0x89FC2268, 0x0009000B, 0x4618E680,
0xD5184628, 0x22686252, 0x000B89FC, 0xA0010009,
0x7201E200, 0x8BFC3242, 0x0009000B, 0x00000080,
0x00117804, 0x00202FF4, 0x00201356, 0x0020139A,
0x00203008, 0x00203010, 0x00200C38, 0x00200C12,
0x00202F00, 0x00202F14, 0x00202AA4, 0x001C36A0,
0x001C3CA0, 0x001C36F4, 0x001C3B88, 0x001C3704,
0x002029F8, 0x001C373C, 0x4618E680, 0xD52F4628,
0x22686252, 0x000B8BFC, 0x2FE60009, 0x7FFC4F22,
0xBFF16E53, 0x61E22F42, 0xE280D629, 0x54E11615,
0x16464218, 0x422855E2, 0x57E31657, 0x16786EF2,
0x26E22E2B, 0x4F267F04, 0x6EF6AFA8, 0x2FD62FC6,
0x4F222FE6, 0x6C53DD1E, 0x6E43BFD6, 0x2DE2BF95,
0x0009BFD2, 0x2C1251D5, 0x1C4154D6, 0x1C5255D7,
0x1C6356D8, 0x6EF64F26, 0x000B6DF6, 0x61636CF6,
0xA004E600, 0x62564109, 0x24227601, 0x36127404,
0x000B8BF9, 0x4F220009, 0xD10FD40E, 0x0009410B,
0xD40FD20E, 0xE5056022, 0x2202CB20, 0xD50D2452,
0x450BE700, 0xD70C2472, 0x0009470B, 0xE601D10B,
0x2162D20B, 0x4F264618, 0x2262000B, 0x001C3700,
0x001C370C, 0x00203028, 0x00201356, 0x001C3500,
0x001D4004, 0x002013CC, 0x00200EF8, 0x001E212C,
0x001C3D30, 0x0009A1A9, 0x2FE62FD6, 0xDD8F4F22,
0xA0049EA7, 0xD48E0009, 0x420BD28E, 0x62D265D2,
0x8BF822E8, 0x0009A004, 0xD28AD48B, 0x55D1420B,
0x22E852D1, 0xA0048BF8, 0xD4880009, 0x420BD285,
0x52D255D2, 0x8BF822E8, 0x0009A004, 0xD281D484,
0x55D3420B, 0x22E852D3, 0xA0048BF8, 0xD4810009,
0x420BD27C, 0x52D455D4, 0x8BF822E8, 0x6EF64F26,
0x6DF6000B, 0x2FD62FC6, 0x4F222FE6, 0x6E636D73,
0x6C53B018, 0x64C357F4, 0xB05465E3, 0xB06A66D3,
0xB09A0009, 0xB09E0009, 0xB0A20009, 0xB0BE0009,
0xB0C10009, 0xB1240009, 0x4F260009, 0x6DF66EF6,
0x6CF6A023, 0x3412D16C, 0xD66C0529, 0x2650D76C,
0x2742000B, 0x0009A014, 0x2FD62FC6, 0x4F222FE6,
0x6E636D73, 0x6C53BFEE, 0x64C357F4, 0xB02A65E3,
0xB10666D3, 0x4F260009, 0x6DF66EF6, 0x6CF6A005,
0xE603D260, 0x000B4618, 0xD25E2262, 0x000BE600,
0x4F222262, 0xE40ABF7E, 0x0009BF7E, 0xE104D25A,
0xE5004118, 0x2212E40A, 0x2252BF74, 0x6072D757,
0x4F26CB20, 0x2702000B, 0xD1554F22, 0xE400410B,
0x452BD554, 0x2FE64F26, 0x6E63D153, 0x44186612,
0x45289210, 0x26294408, 0x44084500, 0x4400265B,
0x4708264B, 0x47082162, 0x27EBD14C, 0x000B2172,
0x03F06EF6, 0x2FE61FFF, 0xDE494F22, 0xE40AE101,
0x2E12BF48, 0x726C62E3, 0xE401E100, 0x22122212,
0x22122212, 0x22122212, 0xE7302242, 0xE40AE503,
0x22122212, 0x22122212, 0x22122212, 0x22122212,
0x22122212, 0x22122212, 0x22522272, 0x22122212,
0x22122212, 0x22122212, 0x22122212, 0x121ABF22,
0x2E62E600, 0x000B4F26, 0xD2326EF6, 0xE441E101,
0x000B2212, 0xD1302242, 0xE605D430, 0x000B2162,
0xD52F2462, 0x6050D22F, 0x8B0E8801, 0x6040D42E,
0x8B078801, 0x9626D52D, 0x88016050, 0x96238B0C,
0x0009A00A, 0xA0079621, 0xE6000009, 0x2262D426,
0x88016040, 0xE6048B00, 0xAEF3E40A, 0xD2242262,
0xE40AE601, 0x2262AEEE, 0x2FC62FB6, 0x2FE62FD6,
0xDC204F22, 0x60C2ED00, 0xCB01EB64, 0x60C22C02,
0xA041C901, 0x03C46E03, 0x034003D4, 0x001C3B88,
0x0020302C, 0x002013A2, 0x00203034, 0x0020303C,
0x00203044, 0x0020304C, 0x0025E720, 0x0020321C,
0x00202F04, 0x001C5968, 0x001D4004, 0x001C3500,
0x00201154, 0x00201180, 0x001C5814, 0x001C59D0,
0x001C5830, 0x001C6268, 0x001C59A4, 0x001C639C,
0x00202F16, 0x001C5804, 0x00202F15, 0x00202F17,
0x001C581C, 0x001C5860, 0x89073DB2, 0xE40A60C2,
0xBE9FC901, 0x7D016E03, 0x8BF52EE8, 0x8B033DB2,
0xD23ED43D, 0x0009420B, 0x4F26E40A, 0x6DF66EF6,
0xAE8F6CF6, 0x44116BF6, 0x604B8F01, 0x000B6043,
0x2FB60009, 0x2FD62FC6, 0x4F222FE6, 0xDC347FFC,
0x60C2ED00, 0xCB02EB64, 0x60C22C02, 0xC9022F02,
0x6E03A009, 0x89083DB3, 0xE40A60C2, 0xC9022F02,
0x6E03BE70, 0x2EE87D01, 0x3DB38BF4, 0xD4298B08,
0x7F04D226, 0x6EF64F26, 0x6CF66DF6, 0x6BF6422B,
0x4F267F04, 0x6DF66EF6, 0x000B6CF6, 0xD5226BF6,
0x60525651, 0x000B4628, 0x2FB6306C, 0x2FD62FC6,
0x4F222FE6, 0x4F024F12, 0x6E43BFF1, 0xDC1B6B03,
0xBFECDD1B, 0x30B80009, 0x060A3C05, 0x46094609,
0x3D654601, 0x4209020A, 0x42094209, 0x8BF032E2,
0x4F164F06, 0x6EF64F26, 0x6CF66DF6, 0x6BF6000B,
0x4F222FE6, 0xE102DE0F, 0xE403E500, 0xBFD42E12,
0xE6062E52, 0xE7004618, 0x2E62E403, 0x4F262E72,
0x6EF6AFCB, 0x0009000B, 0x00203054, 0x00201356,
0x001C5860, 0x0020306C, 0x001C1040, 0xCCCCCCCD,
0x10624DD3, 0x001D4004, 0x2F962F86, 0x2FB62FA6,
0x2FD62FC6, 0x4F222FE6, 0xE5007FDC, 0x6453E110,
0x6C534128, 0xED096E53, 0x6653655D, 0x365C4608,
0x75014608, 0x6043361C, 0x0F66675D, 0xEB0060C3,
0x26C137D3, 0x81628161, 0x16B28163, 0x16B416E3,
0x74048FEA, 0xD9A668F2, 0x1981DAA6, 0x59F12982,
0x1A91D1A5, 0x5AF22A92, 0x5DF45BF3, 0x54F65EF5,
0x21A211A1, 0x11B211B3, 0x11D411D5, 0x11E611E7,
0x11481149, 0x55F7EE00, 0x57F8DD9C, 0x64E3D29C,
0xDB9DD99C, 0xE845EAB8, 0x2D521D51, 0x6AAC2272,
0x6EED4808, 0x4D086DE3, 0x3DEC65E3, 0x4D084508,
0x3D9C35EC, 0x450860C3, 0x81D12DC1, 0x4508E050,
0x45084008, 0x60C381D2, 0xE60035BC, 0x81D334A2,
0x1D531DD2, 0x8D01D489, 0xD4861D64, 0xB05C65D3,
0x64ED7E01, 0x8BDC3482, 0xDB88D182, 0xD2806812,
0x1B814829, 0x2FD26412, 0x2B92694D, 0xD97F6722,
0x1B734729, 0xD77C6822, 0x1BA26A8D, 0xD2806B72,
0x22B2D57B, 0xE0035D72, 0x5E7412D2, 0x12E44018,
0xD67C5176, 0x54781216, 0x1248E103, 0xD4796792,
0x6852127A, 0x28C1E7FF, 0x81916952, 0x6A52E050,
0x81A24008, 0x60C36B52, 0x6C5281B3, 0x6E521CC2,
0x62521E63, 0x1264E600, 0x46086563, 0x7501364C,
0x665D2672, 0x8BF83613, 0x4F267F24, 0x6DF66EF6,
0x6BF66CF6, 0x69F66AF6, 0x68F6000B, 0x60616642,
0x8D04C803, 0x6061E500, 0x8802C903, 0x52628B03,
0x51246563, 0x000B2412, 0x2FD66053, 0x4F222FE6,
0x6E537FEC, 0xE5506253, 0xE4006D43, 0xA0014508,
0x5224E101, 0x22116043, 0x81238121, 0x81226053,
0x362056E2, 0xD2548BF5, 0x64F316E4, 0x420BE614,
0x65E165E3, 0x2549E4FC, 0x61F12E51, 0x214965F3,
0x54D12F11, 0x410BD14C, 0x57D1E614, 0xCB016071,
0x1DE12701, 0x4F267F14, 0x000B6EF6, 0x2FD66DF6,
0x4F222FE6, 0x6E537FEC, 0xE5FC6653, 0x60616D43,
0xCB012059, 0x52E22601, 0x8B063260, 0x51E212E4,
0x8B0431E0, 0xA00252D1, 0xAFF01E22, 0xD23A5664,
0xE61464F3, 0x65E3420B, 0xE1FC67E1, 0x2E712719,
0x54D167F1, 0xD1342719, 0xE61465F3, 0x2F71410B,
0x602152D1, 0x2201CB01, 0x7F141DE1, 0x6EF64F26,
0x6DF6000B, 0x4F222FE6, 0xDE23624C, 0x42004208,
0x3E2CA005, 0xD41F5252, 0xBF8E5624, 0x65E22E62,
0x352052E1, 0xD6228BF6, 0x4F262622, 0x6EF6000B,
0x2FC62FB6, 0x2FE62FD6, 0xDC184F22, 0x52C1DB1F,
0x362066C2, 0x6061891C, 0x8801C903, 0xDE138918,
0xBF63DD1B, 0x650364E3, 0x66B28503, 0x3262620D,
0xD40B8907, 0x0009BF9B, 0x4D0BD416, 0xAFE60009,
0xBF620009, 0xD41464E3, 0x00094D0B, 0x0009AFDF,
0x2262D212, 0x6EF64F26, 0x6CF66DF6, 0x6BF6000B,
0x00202B00, 0x00202B08, 0x00202B10, 0x00202B38,
0x00202F1C, 0x001000B4, 0x00101680, 0x001E2108,
0x001C3D00, 0x00117880, 0x00200A9E, 0x00202F00,
0x00201356, 0x00203088, 0x0020308C, 0x001C3D28,
0x2FC62FB6, 0x2FE62FD6, 0x7FFC4F22, 0x6022D22B,
0x8D41C803, 0xDE2A2F01, 0xDB2BDC2A, 0xED01A017,
0xC9036051, 0x89168801, 0xD128D426, 0x0009410B,
0x61035503, 0xC8208551, 0xE0508903, 0x720102BE,
0xD2230B26, 0x420B64E3, 0xD6226513, 0x52C126D2,
0x352065C2, 0xDE208BE4, 0xDB21DD20, 0x52D1DC21,
0x352065D2, 0x60518918, 0x8801C903, 0xD41B8914,
0x460BD616, 0x57030009, 0x8F0437E0, 0xE2016503,
0xAFEC2B20, 0xD4182C52, 0x420BD218, 0xD6110009,
0x4118E101, 0x2612AFE3, 0xC80460F1, 0xD2148907,
0x4F267F04, 0x6DF66EF6, 0x422B6CF6, 0x7F046BF6,
0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, 0x001E2100,
0x00202B10, 0x00202B08, 0x00202AA4, 0x0020106C,
0x002010EE, 0x001C3D30, 0x00117880, 0x00202B00,
0x00202F20, 0x00202F1C, 0x00202B38, 0x0020108A,
0x00200170, 0xE601D203, 0x1265D503, 0x000B2252,
0x00001266, 0x001C1010, 0x0000C34F, 0x0009000B,
0x2FD62FC6, 0x4F222FE6, 0x6D436C53, 0xEE00A004,
0x7E0164D4, 0x644CBFF2, 0x8BF93EC2, 0x6EF64F26,
0x000B6DF6, 0xE5006CF6, 0x6643A002, 0x76017501,
0x22286260, 0xAFE38BFA, 0x2FE60009, 0x75076253,
0xE1086753, 0x6043EE0A, 0x4409C90F, 0x650330E2,
0x8D014409, 0xE630E637, 0x4110365C, 0x8FF22760,
0xE00077FF, 0x000B8028, 0x000B6EF6, 0x000BE000,
0x2FE6E000, 0x7FEC4F22, 0x6E436253, 0xBFDC65F3,
0xBFD06423, 0xBFCE64E3, 0xD40364F3, 0x0009BFCB,
0x4F267F14, 0x6EF6000B, 0x00203090, 0xE4FDD59A,
0xD69A6152, 0x25122149, 0x74016052, 0x2502CB01,
0xD1976752, 0x25722749, 0xC8406010, 0x60628902,
0x2602CB04, 0xE5016062, 0x2602CB08, 0xE4026062,
0x2602C9CF, 0x45186062, 0x2602CB03, 0x000B1642,
0xD58C1653, 0xD28DD78C, 0xE100D48D, 0x2511E600,
0x22102711, 0x2461AFD2, 0xD28A664C, 0x362C4600,
0xCB106060, 0x2600000B, 0xD286654C, 0x352C4500,
0xE1EF6650, 0x000B2619, 0x664C2560, 0x4600D282,
0x6060362C, 0x000BCB10, 0x654C2600, 0x4500D27E,
0x6650352C, 0x2619E1EF, 0x2560000B, 0xD279664C,
0x362C4600, 0xCB086060, 0x2600000B, 0xD275654C,
0x352C4500, 0xE1F76650, 0x000B2619, 0x664C2560,
0x4600D271, 0x6060362C, 0x000BCB08, 0x654C2600,
0x4500D26D, 0x6650352C, 0x2619E1F7, 0x2560000B,
0xD668624C, 0x326C4200, 0xC9086020, 0x40214021,
0x000B4021, 0x624C600C, 0x4200D663, 0x6020326C,
0x4021C908, 0x40214021, 0x600C000B, 0x644CD15F,
0x6240341C, 0x602C000B, 0x644CD15D, 0x6240341C,
0x602C000B, 0x4F222FE6, 0x645C6E43, 0x3467E60A,
0xBFEB8914, 0x640C0009, 0x880160EC, 0xE00F8B02,
0x2409A002, 0x44094409, 0xE60A624C, 0x89053263,
0x644CBFE2, 0x6023620C, 0x8B00C880, 0x6023E200,
0x000B4F26, 0x4F226EF6, 0x6062D64A, 0x8B038801,
0x0009B246, 0x0009A003, 0xE640D247, 0xD6472260,
0x4F26E200, 0x2622000B, 0xD6424F22, 0x88026062,
0xB28F8B01, 0xD6410009, 0x4F26E200, 0x2622000B,
0xD43DD53C, 0xE701E100, 0x000B2512, 0xD23A2470,
0x000BE604, 0x4F222260, 0xD13AD439, 0x0009410B,
0xE1FDD539, 0xD2396650, 0xE7002619, 0x4F262560,
0x2270000B, 0xD4364F22, 0x410BD132, 0xD5320009,
0x6650E7FB, 0x4F262679, 0x2560000B, 0xD4314F22,
0x410BD12C, 0xD52C0009, 0x6650E7F7, 0x4F262679,
0x2560000B, 0x942DD528, 0x22496250, 0x2520000B,
0xE4BFD525, 0x22496250, 0x2520000B, 0xD2264F22,
0x600D8522, 0x89112008, 0x89138801, 0x89158803,
0x89438805, 0x89498806, 0x894F8808, 0x89558809,
0x895B880A, 0x8961880B, 0x0009A068, 0x0009B06A,
0x600CA065, 0x0009B078, 0x600CA061, 0x0009B081,
0x600CA05D, 0x0000FF7F, 0x001E2148, 0x001E1108,
0x001E1000, 0x00202F60, 0x00202F62, 0x00202F81,
0x00202F44, 0x001E103F, 0x001E105F, 0x001E102F,
0x001E1090, 0x00202F68, 0x001E100B, 0x00202F64,
0x00203094, 0x00201356, 0x001E1028, 0x00202F80,
0x002030A0, 0x002030B0, 0x00202F38, 0x6260D684,
0x8B2B2228, 0x0009B061, 0x600CA029, 0x6260D680,
0x8B232228, 0x0009B069, 0x600CA021, 0x6260D67C,
0x8B1B2228, 0x0009B0C7, 0x600CA019, 0x6260D678,
0x8B132228, 0x0009B0CD, 0x600CA011, 0x6260D674,
0x8B0B2228, 0x0009B125, 0x600CA009, 0x6260D670,
0x8B032228, 0x0009B13D, 0x600CA001, 0x4F26E000,
0x0009000B, 0xD26CD16B, 0xD56C8412, 0x4000C90F,
0xD76B012D, 0xE403D66B, 0xE20F611C, 0x2540E001,
0x25202712, 0x2602000B, 0xE601D262, 0x30668523,
0xE0008D05, 0xD663D260, 0xE0018122, 0x000B2602,
0xD25C0009, 0x600D8523, 0x89052008, 0x8B0A8801,
0x6060D65D, 0x2600CB01, 0xD457D65A, 0xE001E101,
0x000B2612, 0x000B8142, 0xD152E000, 0x8513E501,
0x640D4518, 0x66033453, 0xE0008D05, 0xD551D253,
0x2260E001, 0x000B2502, 0x4F220009, 0x8513D149,
0x6453650D, 0x62494419, 0x227D672E, 0x8801602C,
0x88028909, 0x88038910, 0x8806891A, 0x88078935,
0xA04C893B, 0xD5460009, 0x6652D746, 0x2762D446,
0x622C6261, 0x2421A038, 0x2228625C, 0xD4438B3F,
0x6642D540, 0x2562D440, 0x24018561, 0x6203A02C,
0x2008605C, 0x88108907, 0x88208908, 0x88308909,
0xA02C890A, 0xD23A0009, 0x6222A008, 0xA005D239,
0xD2396222, 0x6222A002, 0x6262D638, 0xD432D531,
0x66212522, 0xA00F626C, 0xD6352421, 0x6261D52D,
0x622CD42D, 0xA0072562, 0xD6322421, 0x8561D529,
0x2562D429, 0x62032401, 0x662D8515, 0x3617610D,
0x65038F01, 0xB0CB2451, 0xA0010009, 0xE000E001,
0x000B4F26, 0xD6190009, 0xD427E101, 0x65412610,
0xD118D717, 0xE20F655D, 0x2752E001, 0x000B2620,
0x2FE62102, 0xD20F4F22, 0x640C8523, 0x8B082448,
0xD511D61D, 0x2621E200, 0x940F8451, 0xA0482049,
0xDE0D8051, 0xC84060E0, 0xE2018D32, 0x89443427,
0xD216D615, 0x2641420B, 0x0009A030, 0x0000FF7F,
0x00202F81, 0x00202F38, 0x00202F44, 0x001E1100,
0x001E100C, 0x00202F64, 0x001E1000, 0x001E1001,
0x00202F6C, 0x00202F4C, 0x00202F50, 0x00202F54,
0x00202F70, 0x00202F74, 0x00202F78, 0x00202F7C,
0x00203280, 0x0020328A, 0x00202F5E, 0x0020225A,
0x89123427, 0xD294D693, 0x2641420B, 0xCB8084E1,
0x80E1B0F5, 0xD69160E0, 0x2E00CB04, 0xC93F6060,
0xD68F2600, 0xA001E001, 0xE0002602, 0x000B4F26,
0xD68C6EF6, 0xC8806060, 0xD2868919, 0x88016021,
0xD2898B15, 0x8524E501, 0x89103056, 0xE203D187,
0x2120D487, 0xE00B6541, 0x0656655D, 0xE40FD585,
0x2140E702, 0xD77E2571, 0x000BE001, 0x000B2702,
0x2FE6E000, 0xDE804F22, 0xC88084E1, 0xD57A892C,
0x20088554, 0x61038F28, 0x8553D77C, 0x64036672,
0x8566650C, 0x3520620C, 0xD6798B1E, 0x651CD774,
0x2651644C, 0x60E02741, 0x8904C840, 0x420BD275,
0xA0030009, 0xD2680009, 0x0009420B, 0x0009B09F,
0xE201D167, 0x60E02122, 0xCB04D464, 0x60402E00,
0x2400C93F, 0x6023A001, 0x4F26E000, 0x6EF6000B,
0x2FB62FA6, 0x2FD62FC6, 0xDA622FE6, 0x66A1E240,
0x3622DC5E, 0x62638900, 0x6ED36D2C, 0x4E2136D8,
0x4E212A61, 0xDB61D460, 0xE700A00F, 0x770162B2,
0x71026123, 0x66212B12, 0x71026213, 0x61212B12,
0x651D666D, 0x356C4528, 0x627C2452, 0x8BED32E3,
0xC90360D3, 0x8B108803, 0x617367B2, 0x2B127102,
0x71026E13, 0x2B126571, 0x655D6DE1, 0x422862DD,
0x325CE107, 0xA00C2C10, 0x88022422, 0xA0038B01,
0x8801E203, 0xE2018B05, 0x66B22C20, 0x655D6561,
0xE60F2452, 0x67A12C60, 0x8B052778, 0xDD38DC44,
0xEB01EA00, 0x2DB22CA2, 0x6DF66EF6, 0x6BF66CF6,
0x6AF6000B, 0x2FE62FD6, 0xE240DD36, 0x362266D1,
0x62638900, 0x3678672C, 0x7703DE38, 0x47212D61,
0x64E2D635, 0xA00E4721, 0x6562E100, 0x62537101,
0x74012450, 0x24204219, 0x45297401, 0x74012450,
0x24504519, 0x621C7401, 0x8BEE3273, 0x66E24200,
0x420061D1, 0x2118362C, 0x2E628F06, 0xDD1CD728,
0xE501E400, 0x2D522742, 0x000B6EF6, 0x2FD66DF6,
0x4F222FE6, 0xED0AEE01, 0x64E3BC96, 0xBC9B64E3,
0x62EC7E01, 0x8BF732D7, 0xBC9EEE01, 0x64E364E3,
0x7E01BCA3, 0x32D762EC, 0x4F268BF7, 0x000B6EF6,
0xD1186DF6, 0xD418920D, 0x72122122, 0x2422D617,
0xD7177204, 0x72202622, 0x2722D116, 0x000B7230,
0x137A2122, 0x00202F5E, 0x00202366, 0x001E1015,
0x00202F64, 0x001E1001, 0x00202F38, 0x001E1100,
0x00202F62, 0x00202F50, 0x001E1000, 0x00202F54,
0x00202F60, 0x0020225A, 0x001E100C, 0x00202F4C,
0x00202F68, 0x00202F6C, 0x00202F70, 0x00202F74,
0x00202F78, 0x00202F7C, 0x4F222FE6, 0xD6507FFC,
0x88016060, 0xE2018951, 0x2620BFBB, 0xD54ED14D,
0xDE4E6010, 0x64E36552, 0x7402C840, 0x8D22D14C,
0xD24C7502, 0xE601D74C, 0xE7042722, 0x76016255,
0x626C2421, 0x8FF93273, 0xD4437402, 0x6242E601,
0x640D8528, 0x67494419, 0x275D657E, 0x81E4607C,
0xE417D542, 0x67557601, 0x3243626C, 0x8FF92171,
0xA0207102, 0xD23E0009, 0xE601D73B, 0xE7042722,
0x76016255, 0x626C2421, 0x8FF93273, 0xD4327402,
0x6242E601, 0x640D8528, 0x67494419, 0x275D657E,
0x81E4607C, 0xE417D533, 0x67557601, 0x3243626C,
0x8FF92171, 0x924A7102, 0xD2262E21, 0x5E23D72E,
0x64F22FE2, 0x604365F2, 0x2700C980, 0xC9606043,
0x80716103, 0xC9036043, 0x80724519, 0x65F2605C,
0x817266F2, 0x46194629, 0x606C4529, 0x4018645C,
0x8173304C, 0x21185E23, 0x64F22FE2, 0x6E4C62F2,
0x602C4219, 0x66F262F2, 0x46294018, 0x461930EC,
0x42298174, 0x652C606C, 0x305C4018, 0x81758F07,
0x0009BC9C, 0x2228620C, 0xA00A8908, 0x60130009,
0x8B038840, 0x0009B009, 0x0009A003, 0xE202D60F,
0x7F042622, 0x000B4F26, 0x000B6EF6, 0x060A0009,
0x00202F80, 0x001E1000, 0x00202F6C, 0x00203280,
0x0020328C, 0x00203224, 0x00202F54, 0x00203254,
0x00203252, 0x00203226, 0x00202F38, 0x00202F64,
0x4F222FE6, 0xDE937FFC, 0x200884E9, 0x2F008D06,
0xD692D491, 0x0009460B, 0x64F0B194, 0x6620D290,
0x89022668, 0xC9BF60E0, 0x7F042E00, 0x000B4F26,
0x000B6EF6, 0x2FE60009, 0xDE8A4F22, 0x60E0D68A,
0xCBC0D48A, 0x62602E00, 0xC803602C, 0x40218904,
0x70014021, 0x6603A002, 0x66034009, 0xD684616D,
0xE500A004, 0x75016262, 0x74042422, 0x3213625D,
0xD2808BF8, 0x0009420B, 0xC9BF84E2, 0x4F2680E2,
0x6EF6000B, 0x2FE62FD6, 0x7FFC4F22, 0x6260D67A,
0x89442228, 0xD56FE100, 0x60502610, 0xCB40D477,
0x2500440B, 0x8D052008, 0x62E06E03, 0x7104612C,
0x2F11A006, 0xD472D66A, 0xDD726760, 0x657C4D0B,
0xE23C6D1D, 0x8B033D27, 0xD264D46F, 0x0009420B,
0x4D214D21, 0xA005D76D, 0x66E6E400, 0x357C4508,
0x74012562, 0x35D3654D, 0xD7698BF7, 0x6172E003,
0x81114018, 0x6E7260F1, 0x81E2700C, 0xD4656172,
0xDD658113, 0x4D0BDE65, 0xE2016572, 0xD4642E22,
0x420BD252, 0xD6530009, 0xC93F6060, 0x7F042600,
0x6EF64F26, 0x6DF6000B, 0x2FC62FB6, 0x2FE62FD6,
0xD25C4F22, 0x6B436E73, 0x420B6C53, 0x20086D63,
0x61038F08, 0xD245D458, 0x6EF64F26, 0x6CF66DF6,
0x6BF6422B, 0x21B060C3, 0x60D38011, 0xE5008111,
0x64BCA007, 0x6053655D, 0x665300EC, 0x7501361C,
0x625D8064, 0x8BF53243, 0x6060D636, 0x2600C9BF,
0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, 0x7FC44F22,
0x720262F3, 0x22512F41, 0x45297202, 0x60632251,
0xE5C4E682, 0x67F38121, 0x655C666C, 0xE408BFBC,
0x4F267F3C, 0x0009000B, 0x2F962F86, 0x2FB62FA6,
0x2FD62FC6, 0x4F222FE6, 0xE1007FC4, 0x6513ECFF,
0x6B136CCD, 0xDE36D735, 0xEDFF64F3, 0xD835EA04,
0x6053655C, 0x027D4000, 0x32C0622D, 0x66038D0D,
0x09ED6063, 0x2491027D, 0x24217402, 0x698202ED,
0x3928622D, 0x74022892, 0x75017104, 0x6063625C,
0x07D532A2, 0x0EB58FE4, 0x2448641C, 0xE6808905,
0x67F3E5C5, 0xBF7F666C, 0x7F3C655C, 0x6EF64F26,
0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, 0xD11E68F6,
0x6012D21E, 0xCB20E405, 0x2102E500, 0x000B2242,
0x00002252, 0x001E1017, 0x002030BC, 0x00201356,
0x00202F1A, 0x001E1015, 0x001E10BF, 0x00117800,
0x001E10FC, 0x00200170, 0x00202F20, 0x002024BE,
0x002030C0, 0x002013A2, 0x002030DC, 0x0011788C,
0x00202F1C, 0x00202B00, 0x002010EE, 0x001E2130,
0x002030E4, 0x00202480, 0x002030E8, 0x00202F26,
0x00202F2E, 0x00203220, 0x001C3500, 0x001D4004,
0xD565D164, 0xE400D765, 0x2142E20F, 0x17411154,
0xD5632722, 0x9669D763, 0x15412572, 0x96661562,
0xE6011565, 0xD5601165, 0x666CE6F8, 0x25422542,
0x25422542, 0x25422542, 0x25622542, 0x7601E727,
0x67632572, 0x25627797, 0xE7042572, 0x2572E248,
0xE2192522, 0xE2702522, 0x25422542, 0x25422542,
0x25222542, 0x2522E20C, 0x25422542, 0x25422542,
0x25422542, 0x25422542, 0x000B154A, 0xE2081145,
0x0009422B, 0x2FE62FD6, 0x7FFC4F22, 0xC8206043,
0x6E438D02, 0x0009BE6D, 0xC81060E3, 0xBE6A8901,
0x60E30009, 0x8901C840, 0x0009BE8C, 0xC80160E3,
0xDD3E8938, 0xC80260D0, 0x2F008D03, 0x460BD63C,
0x60F00009, 0x8902C804, 0x460BD63A, 0x62F00009,
0xC8806023, 0x60D08902, 0x2D00C97F, 0xC8016023,
0xD6358906, 0x0009460B, 0x0009A007, 0x51630601,
0x8902C808, 0x460BD631, 0x60F00009, 0x8902C810,
0x420BD22F, 0xD52F0009, 0x88026052, 0xD22E8B03,
0xA005E604, 0x88012260, 0xD22B8B02, 0x2260E601,
0x2522E200, 0xC88060E3, 0xD628892E, 0x60E36E60,
0x8902C880, 0x420BD226, 0x60E30009, 0x8902C840,
0x420BD224, 0x60E30009, 0x8902C802, 0x420BD222,
0x60E30009, 0x890EC804, 0x410BD120, 0xBF0E0009,
0xBF4D0009, 0xD51E0009, 0x6050D41E, 0xC908D71E,
0xBF842500, 0x60E32472, 0x8905C808, 0x7F04D21B,
0x6EF64F26, 0x6DF6422B, 0x4F267F04, 0x000B6EF6,
0x00006DF6, 0x001C581C, 0xA000A000, 0x001D0100,
0x001D4000, 0x00040021, 0x001C589C, 0x001E1021,
0x00201536, 0x00201558, 0x00201B98, 0x00201570,
0x0020157E, 0x00202F64, 0x001E100B, 0x001E1028,
0x002015D4, 0x002015E0, 0x00201586, 0x002015A4,
0x001E1000, 0x0010F100, 0x12345678, 0x002015BC,
0x644CD6A7, 0x000B346C, 0xD6A62450, 0x346C644C,
0x2450000B, 0x644CD6A4, 0x000B346C, 0x625C2450,
0x4208616D, 0x42084119, 0x42006019, 0x670E614C,
0xD49E321C, 0x4200207D, 0x324CC90F, 0x2200000B,
0x4208625C, 0x42004208, 0x324C644C, 0x4200D498,
0x000B324C, 0x2FE62260, 0x614C4F12, 0x4100D493,
0x6710314C, 0xE29F666D, 0x27294619, 0x6E536269,
0x672E6573, 0x4221227D, 0x42214221, 0x7601662C,
0xE4014608, 0x34E84608, 0x644C4600, 0x071A0467,
0x2150257B, 0x000B4F16, 0x4F226EF6, 0xD2857FE8,
0x88016021, 0xD2848B7B, 0x26686621, 0xD2838B77,
0x26686621, 0xE50F8B73, 0xE401BFA2, 0xBFA4E501,
0xE586E400, 0xE400655C, 0x2F50BFA4, 0xBFA1E401,
0xE602E506, 0x60634618, 0x81F2E401, 0x6543BF9F,
0xE40185F2, 0xBFAB6543, 0x85F26603, 0x6543E401,
0x6603BFB1, 0xE40265F0, 0x6053756C, 0x80F8BF80,
0xBF82E402, 0x84F8E512, 0x7090E402, 0x6503BF82,
0x4618E602, 0x81F66063, 0xBF80E402, 0x85F6E500,
0x6603E402, 0xE500BF8C, 0xE40285F6, 0xBF926603,
0xE5FEE500, 0xE010655C, 0xBF61E403, 0xE5130F54,
0xE40EBF63, 0x05FCE010, 0xBF63E40E, 0xE5007585,
0xBF64E403, 0xE500E640, 0xBF71E403, 0xE500E640,
0xBF78E403, 0xE5FFE640, 0xE014655C, 0xBF47E404,
0xE40F0F54, 0xE504BF49, 0x05FCE014, 0xBF49E40F,
0xE5017584, 0xBF4AE640, 0xE501E404, 0xBF57E640,
0xE501E404, 0xE404E640, 0xAF5C7F18, 0x7F184F26,
0x000B4F26, 0x4F220009, 0xD2427FF0, 0x88016021,
0xD2418B71, 0x26686621, 0xD2408B6D, 0x26686621,
0xE50F8B69, 0xE401BF1C, 0xBF1EE501, 0xE586E400,
0xE400655C, 0x2F50BF1E, 0xBF1BE401, 0xE401E506,
0xBF1C6543, 0xE401E640, 0xBF296543, 0xE401E640,
0xBF306543, 0x65F0E640, 0x756CE402, 0xBEFF6053,
0xE40280F4, 0xE512BF01, 0xE40284F4, 0xBF017090,
0xE6406503, 0xBF02E402, 0xE640E500, 0xBF0FE402,
0xE640E500, 0xBF16E402, 0xE5FEE500, 0x6053655C,
0xBEE5E403, 0xE51380F8, 0xE40EBEE7, 0xE40E84F8,
0xBEE77085, 0xE5006503, 0xBEE8E640, 0xE500E403,
0xBEF5E640, 0xE500E403, 0xBEFCE640, 0xE5FFE403,
0x6053655C, 0xBECBE404, 0xE40F80FC, 0xE504BECD,
0xE40F84FC, 0xBECD7083, 0xE5016503, 0xBECEE640,
0xE501E404, 0xBEDBE640, 0xE501E404, 0xE404E640,
0xAEE07F10, 0x7F104F26, 0x000B4F26, 0x00000009,
0x001E102F, 0x001E1080, 0x001E1090, 0x001E103F,
0x001E103E, 0x00202F5E, 0x00202F60, 0x00202F62,
0xD21DD11C, 0x66206010, 0x676C7001, 0x3700C90F,
0xE5008D13, 0x67106210, 0x7701622C, 0x64232170,
0xD6166010, 0x44084408, 0x3428C90F, 0x62602100,
0x7201D513, 0x44082620, 0x000B354C, 0xD10F6053,
0x25586510, 0xE6008D13, 0xD60DD40B, 0x655C6540,
0x47086753, 0x37584708, 0x47086540, 0x24507501,
0x367C6040, 0x2400C90F, 0x72FF6210, 0x000B2120,
0x00006063, 0x00202F19, 0x00202F18, 0x00202F1A,
0x00202B40, 0x7FFC4F22, 0xE680D1A8, 0x666C6212,
0xD2A72F22, 0x67F36563, 0x420B7542, 0x7F04E404,
0x000B4F26, 0xE6800009, 0xD2A1666C, 0xE7006563,
0x422B7540, 0xE6806473, 0xD29D666C, 0xE7006563,
0x422B7543, 0x2FB66473, 0x2FD62FC6, 0x4F222FE6,
0x4D18ED01, 0xDB98DC97, 0x65C252C1, 0x89203520,
0xC9036051, 0x891C8801, 0xD194DE92, 0x64E3410B,
0x85036503, 0x670D66B2, 0x89073762, 0xD291D490,
0x0009420B, 0xE701D190, 0x2172AFE6, 0xDE8F64E3,
0x00094E0B, 0xD48FD68E, 0x410BD18F, 0xAFDB26D2,
0x4F260009, 0x6DF66EF6, 0x000B6CF6, 0x4F226BF6,
0x85467FF4, 0x2F01E681, 0x666C8547, 0x854881F1,
0x81F2D27B, 0x67F38542, 0x854381F3, 0x81F4E40C,
0x65636053, 0x420B81F5, 0x7F0C7540, 0x000B4F26,
0x2F860009, 0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6,
0x7FEC4F22, 0xE000D176, 0xD4782F12, 0x81F26103,
0xDC771F42, 0xD6776B13, 0xE0014B08, 0x460BDE76,
0x3BEC4B00, 0x66C21F03, 0x362052C1, 0xA1818B01,
0x60610009, 0x8801C903, 0xA17B8B01, 0x85610009,
0x8B01C801, 0x0009A080, 0x85D25D63, 0xC9036603,
0x85D36403, 0x6053650D, 0x40214021, 0x4500C93F,
0x322A6103, 0x6053252D, 0xC901E510, 0xD95E3153,
0x6E038D21, 0x4408D761, 0x44086870, 0x44006213,
0x28884200, 0x342C8F0E, 0x6043D25D, 0x60E3072D,
0x4A196A7D, 0x658E68A9, 0x285D8801, 0x6A7C8F0B,
0x6A13A009, 0x6043D257, 0x61ED0E2D, 0x68194119,
0x287D678E, 0xD1546AEC, 0x22286210, 0xEAFF8901,
0xEEFF6AAC, 0x6EEC65AD, 0x8B0F35E0, 0x4D0BDD3F,
0x540364C3, 0xBF72E502, 0xD44C6D03, 0x410BD13F,
0xD74B65D3, 0xD44BEE01, 0x27E2A025, 0x2679E7FC,
0x81D26063, 0x946085D3, 0x61032049, 0x4508268B,
0x251B6063, 0x605381D2, 0x85D481D3, 0x4118E108,
0x81D4201B, 0xEE0262C2, 0x20798521, 0x64C28121,
0x6041678D, 0xCB0137E3, 0x24018D04, 0xEEE785D2,
0x81D220E9, 0x490BD438, 0x60C20009, 0x52F366F2,
0x2B02CB01, 0x2622AF6F, 0xD2208561, 0x8F02C802,
0xA0D264C3, 0x420B0009, 0xD9300009, 0x5E036503,
0x079EE04C, 0x7701DD2E, 0x69D20976, 0x7901D626,
0x6D602D92, 0x89062DD8, 0xD218D424, 0xED01420B,
0xA0B3D723, 0x625127D2, 0x4118E10F, 0x2219E402,
0x32404418, 0x85518B46, 0x20D9EDFC, 0x60518151,
0xCB017DE3, 0x85E12501, 0x20D9D60A, 0x460B81E1,
0x69F264C3, 0xA09957F3, 0x7E032972, 0x001C3D9C,
0x00201E38, 0x00202B38, 0x00202F00, 0x0020106C,
0x00202B00, 0x002010EE, 0x001E2130, 0x0020108A,
0x001C3D30, 0x00203200, 0x00201356, 0x0020320C,
0x00202B10, 0x002029F8, 0x001C3D00, 0x0020321C,
0x00203100, 0x00203180, 0x00202F14, 0x00202B08,
0x001E212C, 0x00203204, 0x00203208, 0x00202AA4,
0x00203220, 0x6DDD6D51, 0x6DD94D19, 0x2D6D66DE,
0x60DC7D01, 0x41186103, 0x8F458801, 0xD65B2511,
0x74016462, 0x85E32642, 0x6063660D, 0x40214021,
0x4600C93F, 0x322A6D03, 0x6063262D, 0xD154C801,
0x8901D954, 0x2D6B96A1, 0xE010E600, 0x64DD0F64,
0x07FCE010, 0x4000607C, 0x622D021D, 0x8D123240,
0x60636603, 0xE7FF021D, 0x8B013270, 0x01D5A00B,
0x02FCE010, 0x7201E604, 0x622C0F24, 0x8BE73262,
0x666C06FC, 0x60634600, 0x7101019D, 0xD1420915,
0x697D6711, 0x89073940, 0x602D6211, 0x890388FF,
0xDD3E21D1, 0x2D20E201, 0xEDFC8551, 0x815120D9,
0xD23B6051, 0x64C3CB01, 0x2501420B, 0x02FCE010,
0x612CD438, 0x440BE001, 0x270267F2, 0xD23685EF,
0x420B54F2, 0xAE96650D, 0x420B0009, 0x54030009,
0x85446E03, 0x4D18ED08, 0x30D020D9, 0xBE568B03,
0xA007E501, 0x85410009, 0x620DDD2C, 0x890122D8,
0xE500BE4D, 0xD22BD42A, 0x65E3420B, 0xED01D72A,
0x27D2AE79, 0xEE0485F2, 0x610D7001, 0x81F231E7,
0x7C088D02, 0x0009AE66, 0x4F267F14, 0x6DF66EF6,
0x6BF66CF6, 0x69F66AF6, 0x68F6000B, 0x4F222FE6,
0x6E22D21E, 0xC84060E3, 0x22E28D02, 0x0009BDD2,
0x4218E240, 0x89012E28, 0x0009BDDD, 0xC81060E3,
0xD4178905, 0x420BD217, 0xBDDC0009, 0x60E30009,
0x8901C805, 0x0009BE2D, 0xC80260E3, 0x4F268902,
0x6EF6ADD9, 0x000B4F26, 0x80006EF6, 0x00203220,
0x00202F26, 0x00202F2E, 0x00202F22, 0x00202F24,
0x002010EE, 0x002029F8, 0x002013A2, 0x00008000,
0x00202B08, 0x0020108A, 0x001E212C, 0x001C3510,
0x00203214, 0x00201356, 0x080A0C0E, 0x00020406,
0x1A1C1E20, 0x12141618, 0x2E303234, 0x26282A2C,
0x3A3C3E40, 0x6C625648, 0x41112F26, 0xE2208F18,
0x890B3123, 0x321CD204, 0xD1026220, 0x412B312C,
0x00090009, 0x00202A22, 0x002029D8, 0x000BE000,
0x400062F6, 0x40004000, 0x40004000, 0x40004000,
0x62F6000B, 0x40004000, 0x40004000, 0x40004000,
0x40184000, 0x62F6000B, 0x40004000, 0x40004000,
0x40004000, 0x40284000, 0x62F6000B, 0x40004000,
0x40184000, 0x000B4028, 0xC90F62F6, 0x40054005,
0x40054005, 0x62F6000B, 0x4005C907, 0x40054005,
0x62F6000B, 0x4005C903, 0x000B4005, 0xC90162F6,
0x000B4005, 0x000062F6, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x544F0D0A, 0x46205355, 0x00003A57, 0x20636544,
0x32203231, 0x20373030, 0x333A3132, 0x34323A36,
0x00000000, 0x00000D0A, 0x00000043, 0x42707372,
0x3D206675, 0x554E203D, 0x202C4C4C, 0x6E49677A,
0x4E497274, 0x6D754E51, 0x0000003D, 0x61766E49,
0x2064696C, 0x72657375, 0x20726F20, 0x2079656B,
0x00214449, 0x52504545, 0x57204D4F, 0x65746972,
0x6461202C, 0x003D7264, 0x6C617620, 0x0000003D,
0x00000A0D, 0x6E6B6E55, 0x206E776F, 0x6D6D6F63,
0x3D646E61, 0x00000000, 0x000A0D52, 0x203A3051,
0x00000020, 0x203A3151, 0x00000020, 0x203A3251,
0x00000020, 0x203A3351, 0x00000020, 0x203A3451,
0x00000020, 0x61437748, 0x7262696C, 0x6F697461,
0x6620206E, 0x0A6C6961, 0x0000000D, 0x73696F4E,
0x61432065, 0x7262696C, 0x6F697461, 0x6166206E,
0x21216C69, 0x00000D0A, 0x00000072, 0x00205220,
0x00000D0A, 0x62735576, 0x7473725F, 0x00000A0D,
0x62735576, 0x7375735F, 0x646E6570, 0x00000A0D,
0x62735576, 0x7365725F, 0x000A0D6D, 0x00000042,
0x72746E49, 0x6D652051, 0x2C797470, 0x49677A20,
0x4972746E, 0x754E514E, 0x00003D6D, 0x654C7245,
0x0000006E, 0x00000049, 0x20746F4E, 0x756F6E65,
0x49206867, 0x4220514E, 0x0A0D6675, 0x00000000,
0x000000FF, 0x00020001, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x010E010D, 0x00020003, 0x01090108, 0x0002010A,
0x02000003, 0x02020201, 0x02040203, 0x02060205,
0x02020200, 0x02040203, 0x020C0207, 0x020E020D,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x010E010D, 0x00FF010F, 0x01090108, 0x010B010A,
0x020000FF, 0x02020201, 0x02040203, 0x02060205,
0x02020200, 0x02040203, 0x020C020B, 0x020E020D,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00205220, 0x00000046, 0x00000059, 0x73204142,
0x003D7165, 0x49544120, 0x0000204D, 0x00000000,
0x00000000, 0x002E0209, 0x80000101, 0x000409FA,
0x00FF0400, 0x05070000, 0x02000201, 0x82050700,
0x00020002, 0x03830507, 0x07010040, 0x40020405,
0x02090000, 0x0101002E, 0x09FA8000, 0x04000004,
0x000000FF, 0x02010507, 0x07000040, 0x40028205,
0x05070000, 0x00400383, 0x04050701, 0x00004002,
0x00000000, 0x00000000, 0x07090000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, };
const u32_t zcDKFwImageSize=12988;

View File

@ -0,0 +1,732 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "../80211core/cprecomp.h"
#include "hpani.h"
#include "hpusb.h"
extern u16_t zfDelayWriteInternalReg(zdev_t* dev, u32_t addr, u32_t val);
extern u16_t zfFlushDelayWrite(zdev_t* dev);
/*
* Anti noise immunity support. We track phy errors and react
* to excessive errors by adjusting the noise immunity parameters.
*/
/******************************************************************************
*
* New Ani Algorithm for Station side only
*
*****************************************************************************/
#define ZM_HAL_NOISE_IMMUNE_MAX 4 /* Max noise immunity level */
#define ZM_HAL_SPUR_IMMUNE_MAX 7 /* Max spur immunity level */
#define ZM_HAL_FIRST_STEP_MAX 2 /* Max first step level */
#define ZM_HAL_ANI_OFDM_TRIG_HIGH 500
#define ZM_HAL_ANI_OFDM_TRIG_LOW 200
#define ZM_HAL_ANI_CCK_TRIG_HIGH 200
#define ZM_HAL_ANI_CCK_TRIG_LOW 100
#define ZM_HAL_ANI_NOISE_IMMUNE_LVL 4
#define ZM_HAL_ANI_USE_OFDM_WEAK_SIG TRUE
#define ZM_HAL_ANI_CCK_WEAK_SIG_THR FALSE
#define ZM_HAL_ANI_SPUR_IMMUNE_LVL 7
#define ZM_HAL_ANI_FIRSTEP_LVL 0
#define ZM_HAL_ANI_RSSI_THR_HIGH 40
#define ZM_HAL_ANI_RSSI_THR_LOW 7
#define ZM_HAL_ANI_PERIOD 100
#define ZM_HAL_EP_RND(x, mul) \
((((x)%(mul)) >= ((mul)/2)) ? ((x) + ((mul) - 1)) / (mul) : (x)/(mul))
s32_t BEACON_RSSI(zdev_t* dev)
{
s32_t rssi;
zmw_get_wlan_dev(dev);
struct zsHpPriv *HpPriv = (struct zsHpPriv*)wd->hpPrivate;
rssi = ZM_HAL_EP_RND(HpPriv->stats.ast_nodestats.ns_avgbrssi, ZM_HAL_RSSI_EP_MULTIPLIER);
return rssi;
}
/*
* Setup ANI handling. Sets all thresholds and levels to default level AND
* resets the channel statistics
*/
void zfHpAniAttach(zdev_t* dev)
{
#define N(a) (sizeof(a) / sizeof(a[0]))
u32_t i;
zmw_get_wlan_dev(dev);
struct zsHpPriv *HpPriv = (struct zsHpPriv*)wd->hpPrivate;
const int totalSizeDesired[] = { -55, -55, -55, -55, -62 };
const int coarseHigh[] = { -14, -14, -14, -14, -12 };
const int coarseLow[] = { -64, -64, -64, -64, -70 };
const int firpwr[] = { -78, -78, -78, -78, -80 };
for (i = 0; i < 5; i++)
{
HpPriv->totalSizeDesired[i] = totalSizeDesired[i];
HpPriv->coarseHigh[i] = coarseHigh[i];
HpPriv->coarseLow[i] = coarseLow[i];
HpPriv->firpwr[i] = firpwr[i];
}
/* owl has phy counters */
HpPriv->hasHwPhyCounters = 1;
memset((char *)&HpPriv->ani, 0, sizeof(HpPriv->ani));
for (i = 0; i < N(wd->regulationTable.allowChannel); i++)
{
/* New ANI stuff */
HpPriv->ani[i].ofdmTrigHigh = ZM_HAL_ANI_OFDM_TRIG_HIGH;
HpPriv->ani[i].ofdmTrigLow = ZM_HAL_ANI_OFDM_TRIG_LOW;
HpPriv->ani[i].cckTrigHigh = ZM_HAL_ANI_CCK_TRIG_HIGH;
HpPriv->ani[i].cckTrigLow = ZM_HAL_ANI_CCK_TRIG_LOW;
HpPriv->ani[i].rssiThrHigh = ZM_HAL_ANI_RSSI_THR_HIGH;
HpPriv->ani[i].rssiThrLow = ZM_HAL_ANI_RSSI_THR_LOW;
HpPriv->ani[i].ofdmWeakSigDetectOff = !ZM_HAL_ANI_USE_OFDM_WEAK_SIG;
HpPriv->ani[i].cckWeakSigThreshold = ZM_HAL_ANI_CCK_WEAK_SIG_THR;
HpPriv->ani[i].spurImmunityLevel = ZM_HAL_ANI_SPUR_IMMUNE_LVL;
HpPriv->ani[i].firstepLevel = ZM_HAL_ANI_FIRSTEP_LVL;
if (HpPriv->hasHwPhyCounters)
{
HpPriv->ani[i].ofdmPhyErrBase = 0;//AR_PHY_COUNTMAX - ZM_HAL_ANI_OFDM_TRIG_HIGH;
HpPriv->ani[i].cckPhyErrBase = 0;//AR_PHY_COUNTMAX - ZM_HAL_ANI_CCK_TRIG_HIGH;
}
}
if (HpPriv->hasHwPhyCounters)
{
//zm_debug_msg2("Setting OfdmErrBase = 0x", HpPriv->ani[0].ofdmPhyErrBase);
//zm_debug_msg2("Setting cckErrBase = 0x", HpPriv->ani[0].cckPhyErrBase);
//OS_REG_WRITE(ah, AR_PHY_ERR_1, HpPriv->ani[0].ofdmPhyErrBase);
//OS_REG_WRITE(ah, AR_PHY_ERR_2, HpPriv->ani[0].cckPhyErrBase);
}
HpPriv->aniPeriod = ZM_HAL_ANI_PERIOD;
//if (ath_hal_enableANI)
HpPriv->procPhyErr |= ZM_HAL_PROCESS_ANI;
HpPriv->stats.ast_nodestats.ns_avgbrssi = ZM_RSSI_DUMMY_MARKER;
HpPriv->stats.ast_nodestats.ns_avgrssi = ZM_RSSI_DUMMY_MARKER;
HpPriv->stats.ast_nodestats.ns_avgtxrssi = ZM_RSSI_DUMMY_MARKER;
#undef N
}
/*
* Control Adaptive Noise Immunity Parameters
*/
u8_t zfHpAniControl(zdev_t* dev, ZM_HAL_ANI_CMD cmd, int param)
{
#define N(a) (sizeof(a)/sizeof(a[0]))
typedef s32_t TABLE[];
zmw_get_wlan_dev(dev);
struct zsHpPriv *HpPriv = (struct zsHpPriv*)wd->hpPrivate;
struct zsAniState *aniState = HpPriv->curani;
switch (cmd)
{
case ZM_HAL_ANI_NOISE_IMMUNITY_LEVEL:
{
u32_t level = param;
if (level >= N(HpPriv->totalSizeDesired))
{
zm_debug_msg1("level out of range, desired level : ", level);
zm_debug_msg1("max level : ", N(HpPriv->totalSizeDesired));
return FALSE;
}
zfDelayWriteInternalReg(dev, AR_PHY_DESIRED_SZ,
(HpPriv->regPHYDesiredSZ & ~AR_PHY_DESIRED_SZ_TOT_DES)
| ((HpPriv->totalSizeDesired[level] << AR_PHY_DESIRED_SZ_TOT_DES_S)
& AR_PHY_DESIRED_SZ_TOT_DES));
zfDelayWriteInternalReg(dev, AR_PHY_AGC_CTL1,
(HpPriv->regPHYAgcCtl1 & ~AR_PHY_AGC_CTL1_COARSE_LOW)
| ((HpPriv->coarseLow[level] << AR_PHY_AGC_CTL1_COARSE_LOW_S)
& AR_PHY_AGC_CTL1_COARSE_LOW));
zfDelayWriteInternalReg(dev, AR_PHY_AGC_CTL1,
(HpPriv->regPHYAgcCtl1 & ~AR_PHY_AGC_CTL1_COARSE_HIGH)
| ((HpPriv->coarseHigh[level] << AR_PHY_AGC_CTL1_COARSE_HIGH_S)
& AR_PHY_AGC_CTL1_COARSE_HIGH));
zfDelayWriteInternalReg(dev, AR_PHY_FIND_SIG,
(HpPriv->regPHYFindSig & ~AR_PHY_FIND_SIG_FIRPWR)
| ((HpPriv->firpwr[level] << AR_PHY_FIND_SIG_FIRPWR_S)
& AR_PHY_FIND_SIG_FIRPWR));
zfFlushDelayWrite(dev);
if (level > aniState->noiseImmunityLevel)
HpPriv->stats.ast_ani_niup++;
else if (level < aniState->noiseImmunityLevel)
HpPriv->stats.ast_ani_nidown++;
aniState->noiseImmunityLevel = (u8_t)level;
break;
}
case ZM_HAL_ANI_OFDM_WEAK_SIGNAL_DETECTION:
{
const TABLE m1ThreshLow = { 127, 50 };
const TABLE m2ThreshLow = { 127, 40 };
const TABLE m1Thresh = { 127, 0x4d };
const TABLE m2Thresh = { 127, 0x40 };
const TABLE m2CountThr = { 31, 16 };
const TABLE m2CountThrLow = { 63, 48 };
u32_t on = param ? 1 : 0;
zfDelayWriteInternalReg(dev, AR_PHY_SFCORR_LOW,
(HpPriv->regPHYSfcorrLow & ~AR_PHY_SFCORR_LOW_M1_THRESH_LOW)
| ((m1ThreshLow[on] << AR_PHY_SFCORR_LOW_M1_THRESH_LOW_S)
& AR_PHY_SFCORR_LOW_M1_THRESH_LOW));
zfDelayWriteInternalReg(dev, AR_PHY_SFCORR_LOW,
(HpPriv->regPHYSfcorrLow & ~AR_PHY_SFCORR_LOW_M2_THRESH_LOW)
| ((m2ThreshLow[on] << AR_PHY_SFCORR_LOW_M2_THRESH_LOW_S)
& AR_PHY_SFCORR_LOW_M2_THRESH_LOW));
zfDelayWriteInternalReg(dev, AR_PHY_SFCORR,
(HpPriv->regPHYSfcorr & ~AR_PHY_SFCORR_M1_THRESH)
| ((m1Thresh[on] << AR_PHY_SFCORR_M1_THRESH_S)
& AR_PHY_SFCORR_M1_THRESH));
zfDelayWriteInternalReg(dev, AR_PHY_SFCORR,
(HpPriv->regPHYSfcorr & ~AR_PHY_SFCORR_M2_THRESH)
| ((m2Thresh[on] << AR_PHY_SFCORR_M2_THRESH_S)
& AR_PHY_SFCORR_M2_THRESH));
zfDelayWriteInternalReg(dev, AR_PHY_SFCORR,
(HpPriv->regPHYSfcorr & ~AR_PHY_SFCORR_M2COUNT_THR)
| ((m2CountThr[on] << AR_PHY_SFCORR_M2COUNT_THR_S)
& AR_PHY_SFCORR_M2COUNT_THR));
zfDelayWriteInternalReg(dev, AR_PHY_SFCORR_LOW,
(HpPriv->regPHYSfcorrLow & ~AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW)
| ((m2CountThrLow[on] << AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW_S)
& AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW));
if (on)
{
zfDelayWriteInternalReg(dev, AR_PHY_SFCORR_LOW,
HpPriv->regPHYSfcorrLow | AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW);
}
else
{
zfDelayWriteInternalReg(dev, AR_PHY_SFCORR_LOW,
HpPriv->regPHYSfcorrLow & ~AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW);
}
zfFlushDelayWrite(dev);
if (!on != aniState->ofdmWeakSigDetectOff)
{
if (on)
HpPriv->stats.ast_ani_ofdmon++;
else
HpPriv->stats.ast_ani_ofdmoff++;
aniState->ofdmWeakSigDetectOff = !on;
}
break;
}
case ZM_HAL_ANI_CCK_WEAK_SIGNAL_THR:
{
const TABLE weakSigThrCck = { 8, 6 };
u32_t high = param ? 1 : 0;
zfDelayWriteInternalReg(dev, AR_PHY_CCK_DETECT,
(HpPriv->regPHYCckDetect & ~AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK)
| ((weakSigThrCck[high] << AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK_S)
& AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK));
zfFlushDelayWrite(dev);
if (high != aniState->cckWeakSigThreshold)
{
if (high)
HpPriv->stats.ast_ani_cckhigh++;
else
HpPriv->stats.ast_ani_ccklow++;
aniState->cckWeakSigThreshold = (u8_t)high;
}
break;
}
case ZM_HAL_ANI_FIRSTEP_LEVEL:
{
const TABLE firstep = { 0, 4, 8 };
u32_t level = param;
if (level >= N(firstep))
{
zm_debug_msg1("level out of range, desired level : ", level);
zm_debug_msg1("max level : ", N(firstep));
return FALSE;
}
zfDelayWriteInternalReg(dev, AR_PHY_FIND_SIG,
(HpPriv->regPHYFindSig & ~AR_PHY_FIND_SIG_FIRSTEP)
| ((firstep[level] << AR_PHY_FIND_SIG_FIRSTEP_S)
& AR_PHY_FIND_SIG_FIRSTEP));
zfFlushDelayWrite(dev);
if (level > aniState->firstepLevel)
HpPriv->stats.ast_ani_stepup++;
else if (level < aniState->firstepLevel)
HpPriv->stats.ast_ani_stepdown++;
aniState->firstepLevel = (u8_t)level;
break;
}
case ZM_HAL_ANI_SPUR_IMMUNITY_LEVEL:
{
const TABLE cycpwrThr1 = { 2, 4, 6, 8, 10, 12, 14, 16 };
u32_t level = param;
if (level >= N(cycpwrThr1))
{
zm_debug_msg1("level out of range, desired level : ", level);
zm_debug_msg1("max level : ", N(cycpwrThr1));
return FALSE;
}
zfDelayWriteInternalReg(dev, AR_PHY_TIMING5,
(HpPriv->regPHYTiming5 & ~AR_PHY_TIMING5_CYCPWR_THR1)
| ((cycpwrThr1[level] << AR_PHY_TIMING5_CYCPWR_THR1_S)
& AR_PHY_TIMING5_CYCPWR_THR1));
zfFlushDelayWrite(dev);
if (level > aniState->spurImmunityLevel)
HpPriv->stats.ast_ani_spurup++;
else if (level < aniState->spurImmunityLevel)
HpPriv->stats.ast_ani_spurdown++;
aniState->spurImmunityLevel = (u8_t)level;
break;
}
case ZM_HAL_ANI_PRESENT:
break;
#ifdef AH_PRIVATE_DIAG
case ZM_HAL_ANI_MODE:
if (param == 0)
{
HpPriv->procPhyErr &= ~ZM_HAL_PROCESS_ANI;
/* Turn off HW counters if we have them */
zfHpAniDetach(dev);
//zfHpSetRxFilter(dev, zfHpGetRxFilter(dev) &~ HAL_RX_FILTER_PHYERR);
}
else
{ /* normal/auto mode */
HpPriv->procPhyErr |= ZM_HAL_PROCESS_ANI;
if (HpPriv->hasHwPhyCounters)
{
//zfHpSetRxFilter(dev, zfHpGetRxFilter(dev) &~ HAL_RX_FILTER_PHYERR);
}
else
{
//zfHpSetRxFilter(dev, zfHpGetRxFilter(dev) | HAL_RX_FILTER_PHYERR);
}
}
break;
case ZM_HAL_ANI_PHYERR_RESET:
HpPriv->stats.ast_ani_ofdmerrs = 0;
HpPriv->stats.ast_ani_cckerrs = 0;
break;
#endif /* AH_PRIVATE_DIAG */
default:
zm_debug_msg1("invalid cmd ", cmd);
return FALSE;
}
return TRUE;
#undef N
}
void zfHpAniRestart(zdev_t* dev)
{
struct zsAniState *aniState;
zmw_get_wlan_dev(dev);
struct zsHpPriv *HpPriv = (struct zsHpPriv*)wd->hpPrivate;
aniState = HpPriv->curani;
aniState->listenTime = 0;
if (HpPriv->hasHwPhyCounters)
{
//if (aniState->ofdmTrigHigh > AR_PHY_COUNTMAX)
//{
// aniState->ofdmPhyErrBase = 0;
// zm_debug_msg0("OFDM Trigger is too high for hw counters");
//}
//else
// aniState->ofdmPhyErrBase = AR_PHY_COUNTMAX - aniState->ofdmTrigHigh;
//if (aniState->cckTrigHigh > AR_PHY_COUNTMAX)
//{
// aniState->cckPhyErrBase = 0;
// zm_debug_msg0("CCK Trigger is too high for hw counters");
//}
//else
// aniState->cckPhyErrBase = AR_PHY_COUNTMAX - aniState->cckTrigHigh;
//zm_debug_msg2("Writing ofdmbase = 0x", aniState->ofdmPhyErrBase);
//zm_debug_msg2("Writing cckbase = 0x", aniState->cckPhyErrBase);
//OS_REG_WRITE(ah, AR_PHY_ERR_1, aniState->ofdmPhyErrBase);
//OS_REG_WRITE(ah, AR_PHY_ERR_2, aniState->cckPhyErrBase);
//OS_REG_WRITE(ah, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING);
//OS_REG_WRITE(ah, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING);
aniState->ofdmPhyErrBase = 0;
aniState->cckPhyErrBase = 0;
}
aniState->ofdmPhyErrCount = 0;
aniState->cckPhyErrCount = 0;
}
void zfHpAniOfdmErrTrigger(zdev_t* dev)
{
struct zsAniState *aniState;
s32_t rssi;
zmw_get_wlan_dev(dev);
struct zsHpPriv *HpPriv = (struct zsHpPriv*)wd->hpPrivate;
//HALASSERT(chan != NULL);
if ((HpPriv->procPhyErr & ZM_HAL_PROCESS_ANI) == 0)
return;
aniState = HpPriv->curani;
/* First, raise noise immunity level, up to max */
if (aniState->noiseImmunityLevel < ZM_HAL_NOISE_IMMUNE_MAX)
{
zfHpAniControl(dev, ZM_HAL_ANI_NOISE_IMMUNITY_LEVEL, aniState->noiseImmunityLevel + 1);
return;
}
/* then, raise spur immunity level, up to max */
if (aniState->spurImmunityLevel < ZM_HAL_SPUR_IMMUNE_MAX)
{
zfHpAniControl(dev, ZM_HAL_ANI_SPUR_IMMUNITY_LEVEL, aniState->spurImmunityLevel + 1);
return;
}
rssi = BEACON_RSSI(dev);
if (rssi > aniState->rssiThrHigh)
{
/*
* Beacon rssi is high, can turn off ofdm weak sig detect.
*/
if (!aniState->ofdmWeakSigDetectOff)
{
zfHpAniControl(dev, ZM_HAL_ANI_OFDM_WEAK_SIGNAL_DETECTION, FALSE);
zfHpAniControl(dev, ZM_HAL_ANI_SPUR_IMMUNITY_LEVEL, 0);
return;
}
/*
* If weak sig detect is already off, as last resort, raise
* first step level
*/
if (aniState->firstepLevel < ZM_HAL_FIRST_STEP_MAX)
{
zfHpAniControl(dev, ZM_HAL_ANI_FIRSTEP_LEVEL, aniState->firstepLevel + 1);
return;
}
}
else if (rssi > aniState->rssiThrLow)
{
/*
* Beacon rssi in mid range, need ofdm weak signal detect,
* but we can raise firststepLevel
*/
if (aniState->ofdmWeakSigDetectOff)
zfHpAniControl(dev, ZM_HAL_ANI_OFDM_WEAK_SIGNAL_DETECTION, TRUE);
if (aniState->firstepLevel < ZM_HAL_FIRST_STEP_MAX)
zfHpAniControl(dev, ZM_HAL_ANI_FIRSTEP_LEVEL, aniState->firstepLevel + 1);
return;
}
else
{
/*
* Beacon rssi is low, if in 11b/g mode, turn off ofdm
* weak sign detction and zero firstepLevel to maximize
* CCK sensitivity
*/
if (wd->frequency < 3000)
{
if (!aniState->ofdmWeakSigDetectOff)
zfHpAniControl(dev, ZM_HAL_ANI_OFDM_WEAK_SIGNAL_DETECTION, FALSE);
if (aniState->firstepLevel > 0)
zfHpAniControl(dev, ZM_HAL_ANI_FIRSTEP_LEVEL, 0);
return;
}
}
}
void zfHpAniCckErrTrigger(zdev_t* dev)
{
struct zsAniState *aniState;
s32_t rssi;
zmw_get_wlan_dev(dev);
struct zsHpPriv *HpPriv = (struct zsHpPriv*)wd->hpPrivate;
//HALASSERT(chan != NULL);
if ((HpPriv->procPhyErr & ZM_HAL_PROCESS_ANI) == 0)
return;
/* first, raise noise immunity level, up to max */
aniState = HpPriv->curani;
if (aniState->noiseImmunityLevel < ZM_HAL_NOISE_IMMUNE_MAX)
{
zfHpAniControl(dev, ZM_HAL_ANI_NOISE_IMMUNITY_LEVEL,
aniState->noiseImmunityLevel + 1);
return;
}
rssi = BEACON_RSSI(dev);
if (rssi > aniState->rssiThrLow)
{
/*
* Beacon signal in mid and high range, raise firsteplevel.
*/
if (aniState->firstepLevel < ZM_HAL_FIRST_STEP_MAX)
zfHpAniControl(dev, ZM_HAL_ANI_FIRSTEP_LEVEL, aniState->firstepLevel + 1);
}
else
{
/*
* Beacon rssi is low, zero firstepLevel to maximize
* CCK sensitivity.
*/
if (wd->frequency < 3000)
{
if (aniState->firstepLevel > 0)
zfHpAniControl(dev, ZM_HAL_ANI_FIRSTEP_LEVEL, 0);
}
}
}
void zfHpAniLowerImmunity(zdev_t* dev)
{
struct zsAniState *aniState;
s32_t rssi;
zmw_get_wlan_dev(dev);
struct zsHpPriv *HpPriv = (struct zsHpPriv*)wd->hpPrivate;
aniState = HpPriv->curani;
rssi = BEACON_RSSI(dev);
if (rssi > aniState->rssiThrHigh)
{
/*
* Beacon signal is high, leave ofdm weak signal detection off
* or it may oscillate. Let it fall through.
*/
}
else if (rssi > aniState->rssiThrLow)
{
/*
* Beacon rssi in mid range, turn on ofdm weak signal
* detection or lower first step level.
*/
if (aniState->ofdmWeakSigDetectOff)
{
zfHpAniControl(dev, ZM_HAL_ANI_OFDM_WEAK_SIGNAL_DETECTION, TRUE);
return;
}
if (aniState->firstepLevel > 0)
{
zfHpAniControl(dev, ZM_HAL_ANI_FIRSTEP_LEVEL, aniState->firstepLevel - 1);
return;
}
}
else
{
/*
* Beacon rssi is low, reduce first step level.
*/
if (aniState->firstepLevel > 0)
{
zfHpAniControl(dev, ZM_HAL_ANI_FIRSTEP_LEVEL, aniState->firstepLevel - 1);
return;
}
}
/* then lower spur immunity level, down to zero */
if (aniState->spurImmunityLevel > 0)
{
zfHpAniControl(dev, ZM_HAL_ANI_SPUR_IMMUNITY_LEVEL, aniState->spurImmunityLevel - 1);
return;
}
/*
* if all else fails, lower noise immunity level down to a min value
* zero for now
*/
if (aniState->noiseImmunityLevel > 0)
{
zfHpAniControl(dev, ZM_HAL_ANI_NOISE_IMMUNITY_LEVEL, aniState->noiseImmunityLevel - 1);
return;
}
}
#define CLOCK_RATE 44000 /* XXX use mac_usec or similar */
/* convert HW counter values to ms using 11g clock rate, goo9d enough
for 11a and Turbo */
/*
* Return an approximation of the time spent ``listening'' by
* deducting the cycles spent tx'ing and rx'ing from the total
* cycle count since our last call. A return value <0 indicates
* an invalid/inconsistent time.
*/
s32_t zfHpAniGetListenTime(zdev_t* dev)
{
struct zsAniState *aniState;
u32_t txFrameCount, rxFrameCount, cycleCount;
s32_t listenTime;
zmw_get_wlan_dev(dev);
struct zsHpPriv *HpPriv = (struct zsHpPriv*)wd->hpPrivate;
txFrameCount = 0;//OS_REG_READ(ah, AR_TFCNT);
rxFrameCount = 0;//OS_REG_READ(ah, AR_RFCNT);
cycleCount = 0;//OS_REG_READ(ah, AR_CCCNT);
aniState = HpPriv->curani;
if (aniState->cycleCount == 0 || aniState->cycleCount > cycleCount)
{
/*
* Cycle counter wrap (or initial call); it's not possible
* to accurately calculate a value because the registers
* right shift rather than wrap--so punt and return 0.
*/
listenTime = 0;
HpPriv->stats.ast_ani_lzero++;
}
else
{
s32_t ccdelta = cycleCount - aniState->cycleCount;
s32_t rfdelta = rxFrameCount - aniState->rxFrameCount;
s32_t tfdelta = txFrameCount - aniState->txFrameCount;
listenTime = (ccdelta - rfdelta - tfdelta) / CLOCK_RATE;
}
aniState->cycleCount = cycleCount;
aniState->txFrameCount = txFrameCount;
aniState->rxFrameCount = rxFrameCount;
return listenTime;
}
/*
* Do periodic processing. This routine is called from the
* driver's rx interrupt handler after processing frames.
*/
void zfHpAniArPoll(zdev_t* dev, u32_t listenTime, u32_t phyCnt1, u32_t phyCnt2)
{
struct zsAniState *aniState;
//s32_t listenTime;
zmw_get_wlan_dev(dev);
struct zsHpPriv *HpPriv = (struct zsHpPriv*)wd->hpPrivate;
/*
* Since we're called from end of rx tasklet, we also check for
* AR processing now
*/
aniState = HpPriv->curani;
//HpPriv->stats.ast_nodestats = *stats; /* XXX optimize? */
//listenTime = zfHpAniGetListenTime(dev);
//if (listenTime < 0)
//{
// HpPriv->stats.ast_ani_lneg++;
// /* restart ANI period if listenTime is invalid */
// zfHpAniRestart(dev);
// return;
//}
/* XXX beware of overflow? */
aniState->listenTime += listenTime;
if (HpPriv->hasHwPhyCounters)
{
//u32_t phyCnt1, phyCnt2;
u32_t ofdmPhyErrCnt, cckPhyErrCnt;
/* NB: these are not reset-on-read */
//phyCnt1 = 0;//OS_REG_READ(ah, AR_PHY_ERR_1);
//phyCnt2 = 0;//OS_REG_READ(ah, AR_PHY_ERR_2);
/* XXX sometimes zero, why? */
//if (phyCnt1 < aniState->ofdmPhyErrBase ||
// phyCnt2 < aniState->cckPhyErrBase)
//{
// if (phyCnt1 < aniState->ofdmPhyErrBase)
// {
// zm_debug_msg2("phyCnt1 = 0x", phyCnt1);
// zm_debug_msg2("resetting counter value to 0x", aniState->ofdmPhyErrBase);
// //OS_REG_WRITE(ah, AR_PHY_ERR_1, aniState->ofdmPhyErrBase);
// //OS_REG_WRITE(ah, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING);
// }
// if (phyCnt2 < aniState->cckPhyErrBase)
// {
// zm_debug_msg2("phyCnt2 = 0x", phyCnt2);
// zm_debug_msg2("resetting counter value to 0x", aniState->cckPhyErrBase);
// //OS_REG_WRITE(ah, AR_PHY_ERR_2, aniState->cckPhyErrBase);
// //OS_REG_WRITE(ah, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING);
// }
// return; /* XXX */
//}
/* NB: only use ast_ani_*errs with AH_PRIVATE_DIAG */
//ofdmPhyErrCnt = phyCnt1 - aniState->ofdmPhyErrBase;
//HpPriv->stats.ast_ani_ofdmerrs += ofdmPhyErrCnt - aniState->ofdmPhyErrCount;
//aniState->ofdmPhyErrCount = ofdmPhyErrCnt;
ofdmPhyErrCnt = phyCnt1;
HpPriv->stats.ast_ani_ofdmerrs += ofdmPhyErrCnt;
aniState->ofdmPhyErrCount += ofdmPhyErrCnt;
//cckPhyErrCnt = phyCnt2 - aniState->cckPhyErrBase;
//HpPriv->stats.ast_ani_cckerrs += cckPhyErrCnt - aniState->cckPhyErrCount;
//aniState->cckPhyErrCount = cckPhyErrCnt;
cckPhyErrCnt = phyCnt2;
HpPriv->stats.ast_ani_cckerrs += cckPhyErrCnt;
aniState->cckPhyErrCount += cckPhyErrCnt;
}
/*
* If ani is not enabled, return after we've collected
* statistics
*/
if ((HpPriv->procPhyErr & ZM_HAL_PROCESS_ANI) == 0)
return;
if (aniState->listenTime > 5 * HpPriv->aniPeriod)
{
/*
* Check to see if need to lower immunity if
* 5 aniPeriods have passed
*/
if (aniState->ofdmPhyErrCount <= aniState->listenTime *
aniState->ofdmTrigLow/1000 &&
aniState->cckPhyErrCount <= aniState->listenTime *
aniState->cckTrigLow/1000)
zfHpAniLowerImmunity(dev);
zfHpAniRestart(dev);
}
else if (aniState->listenTime > HpPriv->aniPeriod)
{
/* check to see if need to raise immunity */
if (aniState->ofdmPhyErrCount > aniState->listenTime *
aniState->ofdmTrigHigh / 1000)
{
zfHpAniOfdmErrTrigger(dev);
zfHpAniRestart(dev);
}
else if (aniState->cckPhyErrCount > aniState->listenTime *
aniState->cckTrigHigh / 1000)
{
zfHpAniCckErrTrigger(dev);
zfHpAniRestart(dev);
}
}
}

View File

@ -0,0 +1,420 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "../80211core/cprecomp.h"
typedef struct {
u32_t ackrcv_bad;
u32_t rts_bad;
u32_t rts_good;
u32_t fcs_bad;
u32_t beacons;
} ZM_HAL_MIB_STATS;
/*
* Per-node statistics maintained by the driver for use in
* optimizing signal quality and other operational aspects.
*/
typedef struct {
u32_t ns_avgbrssi; /* average beacon rssi */
u32_t ns_avgrssi; /* average data rssi */
u32_t ns_avgtxrssi; /* average tx rssi */
} ZM_HAL_NODE_STATS;
#define ZM_HAL_RSSI_EP_MULTIPLIER (1<<7) /* pow2 to optimize out * and / */
struct zsAniStats {
u32_t ast_ani_niup; /* ANI increased noise immunity */
u32_t ast_ani_nidown; /* ANI decreased noise immunity */
u32_t ast_ani_spurup; /* ANI increased spur immunity */
u32_t ast_ani_spurdown;/* ANI descreased spur immunity */
u32_t ast_ani_ofdmon; /* ANI OFDM weak signal detect on */
u32_t ast_ani_ofdmoff;/* ANI OFDM weak signal detect off */
u32_t ast_ani_cckhigh;/* ANI CCK weak signal threshold high */
u32_t ast_ani_ccklow; /* ANI CCK weak signal threshold low */
u32_t ast_ani_stepup; /* ANI increased first step level */
u32_t ast_ani_stepdown;/* ANI decreased first step level */
u32_t ast_ani_ofdmerrs;/* ANI cumulative ofdm phy err count */
u32_t ast_ani_cckerrs;/* ANI cumulative cck phy err count */
u32_t ast_ani_reset; /* ANI parameters zero'd for non-STA */
u32_t ast_ani_lzero; /* ANI listen time forced to zero */
u32_t ast_ani_lneg; /* ANI listen time calculated < 0 */
ZM_HAL_MIB_STATS ast_mibstats; /* MIB counter stats */
ZM_HAL_NODE_STATS ast_nodestats; /* Latest rssi stats from driver */
};
/*
* Per-channel ANI state private to the driver.
*/
struct zsAniState {
ZM_HAL_CHANNEL c;
u8_t noiseImmunityLevel;
u8_t spurImmunityLevel;
u8_t firstepLevel;
u8_t ofdmWeakSigDetectOff;
u8_t cckWeakSigThreshold;
/* Thresholds */
u32_t listenTime;
u32_t ofdmTrigHigh;
u32_t ofdmTrigLow;
s32_t cckTrigHigh;
s32_t cckTrigLow;
s32_t rssiThrLow;
s32_t rssiThrHigh;
u32_t noiseFloor; /* The current noise floor */
u32_t txFrameCount; /* Last txFrameCount */
u32_t rxFrameCount; /* Last rx Frame count */
u32_t cycleCount; /* Last cycleCount (can detect wrap-around) */
u32_t ofdmPhyErrCount;/* OFDM err count since last reset */
u32_t cckPhyErrCount; /* CCK err count since last reset */
u32_t ofdmPhyErrBase; /* Base value for ofdm err counter */
u32_t cckPhyErrBase; /* Base value for cck err counters */
s16_t pktRssi[2]; /* Average rssi of pkts for 2 antennas */
s16_t ofdmErrRssi[2]; /* Average rssi of ofdm phy errs for 2 ant */
s16_t cckErrRssi[2]; /* Average rssi of cck phy errs for 2 ant */
};
typedef enum {
ZM_HAL_ANI_PRESENT, /* is ANI support present */
ZM_HAL_ANI_NOISE_IMMUNITY_LEVEL, /* set level */
ZM_HAL_ANI_OFDM_WEAK_SIGNAL_DETECTION, /* enable/disable */
ZM_HAL_ANI_CCK_WEAK_SIGNAL_THR, /* enable/disable */
ZM_HAL_ANI_FIRSTEP_LEVEL, /* set level */
ZM_HAL_ANI_SPUR_IMMUNITY_LEVEL, /* set level */
ZM_HAL_ANI_MODE, /* 0 => manual, 1 => auto */
ZM_HAL_ANI_PHYERR_RESET, /* reset phy error stats */
} ZM_HAL_ANI_CMD;
#define AR_PHY_COUNTMAX (3 << 22) // Max counted before intr
#define ZM_HAL_PROCESS_ANI 0x00000001 /* ANI state setup */
#define ZM_RSSI_DUMMY_MARKER 0x127
/* PHY registers in ar5416, related base and register offsets
may need to be changed in otus BB */
#define AR_PHY_BASE 0x1C5800 /* base address of phy regs */
#define AR_PHY(_n) (AR_PHY_BASE + ((_n)<<2))
#define AR_PHY_TEST 0x1C5800 /* PHY test control */
#define PHY_AGC_CLR 0x10000000 /* disable AGC to A2 */
#define RFSILENT_BB 0x00002000 /* shush bb */
#define AR_PHY_TURBO 0x1C5804 /* frame control register */
#define AR_PHY_FC_TURBO_MODE 0x00000001 /* Set turbo mode bits */
#define AR_PHY_FC_TURBO_SHORT 0x00000002 /* Set short symbols to turbo mode setting */
#define AR_PHY_FC_DYN2040_EN 0x00000004 /* Enable dyn 20/40 mode */
#define AR_PHY_FC_DYN2040_PRI_ONLY 0x00000008 /* dyn 20/40 - primary only */
#define AR_PHY_FC_DYN2040_PRI_CH 0x00000010 /* dyn 20/40 - primary ch offset (0=+10MHz, 1=-10MHz)*/
#define AR_PHY_FC_DYN2040_EXT_CH 0x00000020 /* dyn 20/40 - ext ch spacing (0=20MHz/ 1=25MHz) */
#define AR_PHY_FC_HT_EN 0x00000040 /* ht enable */
#define AR_PHY_FC_SHORT_GI_40 0x00000080 /* allow short GI for HT 40 */
#define AR_PHY_FC_WALSH 0x00000100 /* walsh spatial spreading for 2 chains,2 streams TX */
#define AR_PHY_FC_SINGLE_HT_LTF1 0x00000200 /* single length (4us) 1st HT long training symbol */
#define AR_PHY_TIMING2 0x1C5810 /* Timing Control 2 */
#define AR_PHY_TIMING2_USE_FORCE 0x00001000
#define AR_PHY_TIMING2_FORCE_VAL 0x00000fff
#define AR_PHY_TIMING3 0x1C5814 /* Timing control 3 */
#define AR_PHY_TIMING3_DSC_MAN 0xFFFE0000
#define AR_PHY_TIMING3_DSC_MAN_S 17
#define AR_PHY_TIMING3_DSC_EXP 0x0001E000
#define AR_PHY_TIMING3_DSC_EXP_S 13
#define AR_PHY_CHIP_ID 0x1C5818 /* PHY chip revision ID */
#define AR_PHY_CHIP_ID_REV_0 0x80 /* 5416 Rev 0 (owl 1.0) BB */
#define AR_PHY_CHIP_ID_REV_1 0x81 /* 5416 Rev 1 (owl 2.0) BB */
#define AR_PHY_ACTIVE 0x1C581C /* activation register */
#define AR_PHY_ACTIVE_EN 0x00000001 /* Activate PHY chips */
#define AR_PHY_ACTIVE_DIS 0x00000000 /* Deactivate PHY chips */
#define AR_PHY_RF_CTL2 0x1C5824
#define AR_PHY_TX_END_DATA_START 0x000000FF
#define AR_PHY_TX_END_DATA_START_S 0
#define AR_PHY_TX_END_PA_ON 0x0000FF00
#define AR_PHY_TX_END_PA_ON_S 8
#define AR_PHY_RF_CTL3 0x1C5828
#define AR_PHY_TX_END_TO_A2_RX_ON 0x00FF0000
#define AR_PHY_TX_END_TO_A2_RX_ON_S 16
#define AR_PHY_ADC_CTL 0x1C582C
#define AR_PHY_ADC_CTL_OFF_INBUFGAIN 0x00000003
#define AR_PHY_ADC_CTL_OFF_INBUFGAIN_S 0
#define AR_PHY_ADC_CTL_OFF_PWDDAC 0x00002000
#define AR_PHY_ADC_CTL_OFF_PWDBANDGAP 0x00004000 /* BB Rev 4.2+ only */
#define AR_PHY_ADC_CTL_OFF_PWDADC 0x00008000 /* BB Rev 4.2+ only */
#define AR_PHY_ADC_CTL_ON_INBUFGAIN 0x00030000
#define AR_PHY_ADC_CTL_ON_INBUFGAIN_S 16
#define AR_PHY_ADC_SERIAL_CTL 0x1C5830
#define AR_PHY_SEL_INTERNAL_ADDAC 0x00000000
#define AR_PHY_SEL_EXTERNAL_RADIO 0x00000001
#define AR_PHY_RF_CTL4 0x1C5834
#define AR_PHY_RF_CTL4_TX_END_XPAB_OFF 0xFF000000
#define AR_PHY_RF_CTL4_TX_END_XPAB_OFF_S 24
#define AR_PHY_RF_CTL4_TX_END_XPAA_OFF 0x00FF0000
#define AR_PHY_RF_CTL4_TX_END_XPAA_OFF_S 16
#define AR_PHY_RF_CTL4_FRAME_XPAB_ON 0x0000FF00
#define AR_PHY_RF_CTL4_FRAME_XPAB_ON_S 8
#define AR_PHY_RF_CTL4_FRAME_XPAA_ON 0x000000FF
#define AR_PHY_RF_CTL4_FRAME_XPAA_ON_S 0
#define AR_PHY_SETTLING 0x1C5844
#define AR_PHY_SETTLING_SWITCH 0x00003F80
#define AR_PHY_SETTLING_SWITCH_S 7
#define AR_PHY_RXGAIN 0x1C5848
#define AR_PHY_RXGAIN_TXRX_ATTEN 0x0003F000
#define AR_PHY_RXGAIN_TXRX_ATTEN_S 12
#define AR_PHY_RXGAIN_TXRX_RF_MAX 0x007C0000
#define AR_PHY_RXGAIN_TXRX_RF_MAX_S 18
#define AR_PHY_DESIRED_SZ 0x1C5850
#define AR_PHY_DESIRED_SZ_ADC 0x000000FF
#define AR_PHY_DESIRED_SZ_ADC_S 0
#define AR_PHY_DESIRED_SZ_PGA 0x0000FF00
#define AR_PHY_DESIRED_SZ_PGA_S 8
#define AR_PHY_DESIRED_SZ_TOT_DES 0x0FF00000
#define AR_PHY_DESIRED_SZ_TOT_DES_S 20
#define AR_PHY_FIND_SIG 0x1C5858
#define AR_PHY_FIND_SIG_FIRSTEP 0x0003F000
#define AR_PHY_FIND_SIG_FIRSTEP_S 12
#define AR_PHY_FIND_SIG_FIRPWR 0x03FC0000
#define AR_PHY_FIND_SIG_FIRPWR_S 18
#define AR_PHY_AGC_CTL1 0x1C585C
#define AR_PHY_AGC_CTL1_COARSE_LOW 0x00007F80
#define AR_PHY_AGC_CTL1_COARSE_LOW_S 7
#define AR_PHY_AGC_CTL1_COARSE_HIGH 0x003F8000
#define AR_PHY_AGC_CTL1_COARSE_HIGH_S 15
#define AR_PHY_AGC_CONTROL 0x1C5860 /* chip calibration and noise floor setting */
#define AR_PHY_AGC_CONTROL_CAL 0x00000001 /* do internal calibration */
#define AR_PHY_AGC_CONTROL_NF 0x00000002 /* do noise-floor calculation */
#define AR_PHY_CCA 0x1C5864
#define AR_PHY_MINCCA_PWR 0x1FF00000
#define AR_PHY_MINCCA_PWR_S 19
#define AR_PHY_CCA_THRESH62 0x0007F000
#define AR_PHY_CCA_THRESH62_S 12
#define AR_PHY_SFCORR_LOW 0x1C586C
#define AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW 0x00000001
#define AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW 0x00003F00
#define AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW_S 8
#define AR_PHY_SFCORR_LOW_M1_THRESH_LOW 0x001FC000
#define AR_PHY_SFCORR_LOW_M1_THRESH_LOW_S 14
#define AR_PHY_SFCORR_LOW_M2_THRESH_LOW 0x0FE00000
#define AR_PHY_SFCORR_LOW_M2_THRESH_LOW_S 21
#define AR_PHY_SFCORR 0x1C5868
#define AR_PHY_SFCORR_M2COUNT_THR 0x0000001F
#define AR_PHY_SFCORR_M2COUNT_THR_S 0
#define AR_PHY_SFCORR_M1_THRESH 0x00FE0000
#define AR_PHY_SFCORR_M1_THRESH_S 17
#define AR_PHY_SFCORR_M2_THRESH 0x7F000000
#define AR_PHY_SFCORR_M2_THRESH_S 24
#define AR_PHY_SLEEP_CTR_CONTROL 0x1C5870
#define AR_PHY_SLEEP_CTR_LIMIT 0x1C5874
#define AR_PHY_SLEEP_SCAL 0x1C5878
#define AR_PHY_PLL_CTL 0x1C587c /* PLL control register */
#define AR_PHY_PLL_CTL_40 0xaa /* 40 MHz */
#define AR_PHY_PLL_CTL_40_5413 0x04
#define AR_PHY_PLL_CTL_44 0xab /* 44 MHz for 11b, 11g */
#define AR_PHY_PLL_CTL_44_2133 0xeb /* 44 MHz for 11b, 11g */
#define AR_PHY_PLL_CTL_40_2133 0xea /* 40 MHz for 11a, turbos */
#define AR_PHY_RX_DELAY 0x1C5914 /* analog pow-on time (100ns) */
#define AR_PHY_RX_DELAY_DELAY 0x00003FFF /* delay from wakeup to rx ena */
#define AR_PHY_TIMING_CTRL4 0x1C5920 /* timing control */
#define AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF 0x01F /* Mask for kcos_theta-1 for q correction */
#define AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF_S 0 /* shift for Q_COFF */
#define AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF 0x7E0 /* Mask for sin_theta for i correction */
#define AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF_S 5 /* Shift for sin_theta for i correction */
#define AR_PHY_TIMING_CTRL4_IQCORR_ENABLE 0x800 /* enable IQ correction */
#define AR_PHY_TIMING_CTRL4_IQCAL_LOG_COUNT_MAX 0xF000 /* Mask for max number of samples (logarithmic) */
#define AR_PHY_TIMING_CTRL4_IQCAL_LOG_COUNT_MAX_S 12 /* Shift for max number of samples */
#define AR_PHY_TIMING_CTRL4_DO_IQCAL 0x10000 /* perform IQ calibration */
#define AR_PHY_TIMING5 0x1C5924
#define AR_PHY_TIMING5_CYCPWR_THR1 0x000000FE
#define AR_PHY_TIMING5_CYCPWR_THR1_S 1
#define AR_PHY_POWER_TX_RATE1 0x1C5934
#define AR_PHY_POWER_TX_RATE2 0x1C5938
#define AR_PHY_POWER_TX_RATE_MAX 0x1C593c
#define AR_PHY_POWER_TX_RATE_MAX_TPC_ENABLE 0x00000040
#define AR_PHY_FRAME_CTL 0x1C5944
#define AR_PHY_FRAME_CTL_TX_CLIP 0x00000038
#define AR_PHY_FRAME_CTL_TX_CLIP_S 3
#define AR_PHY_TXPWRADJ 0x1C594C /* BB Rev 4.2+ only */
#define AR_PHY_TXPWRADJ_CCK_GAIN_DELTA 0x00000FC0
#define AR_PHY_TXPWRADJ_CCK_GAIN_DELTA_S 6
#define AR_PHY_TXPWRADJ_CCK_PCDAC_INDEX 0x00FC0000
#define AR_PHY_TXPWRADJ_CCK_PCDAC_INDEX_S 18
#define AR_PHY_RADAR_0 0x1C5954 /* radar detection settings */
#define AR_PHY_RADAR_0_ENA 0x00000001 /* Enable radar detection */
#define AR_PHY_RADAR_0_INBAND 0x0000003e /* Inband pulse threshold */
#define AR_PHY_RADAR_0_INBAND_S 1
#define AR_PHY_RADAR_0_PRSSI 0x00000FC0 /* Pulse rssi threshold */
#define AR_PHY_RADAR_0_PRSSI_S 6
#define AR_PHY_RADAR_0_HEIGHT 0x0003F000 /* Pulse height threshold */
#define AR_PHY_RADAR_0_HEIGHT_S 12
#define AR_PHY_RADAR_0_RRSSI 0x00FC0000 /* Radar rssi threshold */
#define AR_PHY_RADAR_0_RRSSI_S 18
#define AR_PHY_RADAR_0_FIRPWR 0x7F000000 /* Radar firpwr threshold */
#define AR_PHY_RADAR_0_FIRPWR_S 24
#define AR_PHY_SWITCH_CHAIN_0 0x1C5960
#define AR_PHY_SWITCH_COM 0x1C5964
#define AR_PHY_SIGMA_DELTA 0x1C596C /* AR5312 only */
#define AR_PHY_SIGMA_DELTA_ADC_SEL 0x00000003
#define AR_PHY_SIGMA_DELTA_ADC_SEL_S 0
#define AR_PHY_SIGMA_DELTA_FILT2 0x000000F8
#define AR_PHY_SIGMA_DELTA_FILT2_S 3
#define AR_PHY_SIGMA_DELTA_FILT1 0x00001F00
#define AR_PHY_SIGMA_DELTA_FILT1_S 8
#define AR_PHY_SIGMA_DELTA_ADC_CLIP 0x01FFE000
#define AR_PHY_SIGMA_DELTA_ADC_CLIP_S 13
#define AR_PHY_RESTART 0x1C5970 /* restart */
#define AR_PHY_RESTART_DIV_GC 0x001C0000 /* bb_ant_fast_div_gc_limit */
#define AR_PHY_RESTART_DIV_GC_S 18
#define AR_PHY_RFBUS_REQ 0x1C597C
#define AR_PHY_RFBUS_REQ_EN 0x00000001
#define AR_PHY_RX_CHAINMASK 0x1C59a4
#define AR_PHY_EXT_CCA 0x1C59bc
#define AR_PHY_EXT_MINCCA_PWR 0xFF800000
#define AR_PHY_EXT_MINCCA_PWR_S 23
#define AR_PHY_HALFGI 0x1C59D0 /* Timing control 3 */
#define AR_PHY_HALFGI_DSC_MAN 0x0007FFF0
#define AR_PHY_HALFGI_DSC_MAN_S 4
#define AR_PHY_HALFGI_DSC_EXP 0x0000000F
#define AR_PHY_HALFGI_DSC_EXP_S 0
#define AR_PHY_HEAVY_CLIP_ENABLE 0x1C59E0
#define AR_PHY_M_SLEEP 0x1C59f0 /* sleep control registers */
#define AR_PHY_REFCLKDLY 0x1C59f4
#define AR_PHY_REFCLKPD 0x1C59f8
/* PHY IQ calibration results */
#define AR_PHY_IQCAL_RES_PWR_MEAS_I 0x1C5C10 /* power measurement for I */
#define AR_PHY_IQCAL_RES_PWR_MEAS_Q 0x1C5C14 /* power measurement for Q */
#define AR_PHY_IQCAL_RES_IQ_CORR_MEAS 0x1C5C18 /* IQ correlation measurement */
#define AR_PHY_CURRENT_RSSI 0x1C5C1c /* rssi of current frame rx'd */
#define AR_PHY_RFBUS_GRANT 0x1C5C20
#define AR_PHY_RFBUS_GRANT_EN 0x00000001
#define AR_PHY_MODE 0x1C6200 /* Mode register */
#define AR_PHY_MODE_AR2133 0x08 /* AR2133 */
#define AR_PHY_MODE_AR5111 0x00 /* AR5111/AR2111 */
#define AR_PHY_MODE_AR5112 0x08 /* AR5112*/
#define AR_PHY_MODE_DYNAMIC 0x04 /* dynamic CCK/OFDM mode */
#define AR_PHY_MODE_RF2GHZ 0x02 /* 2.4 GHz */
#define AR_PHY_MODE_RF5GHZ 0x00 /* 5 GHz */
#define AR_PHY_MODE_CCK 0x01 /* CCK */
#define AR_PHY_MODE_OFDM 0x00 /* OFDM */
#define AR_PHY_CCK_TX_CTRL 0x1C6204
#define AR_PHY_CCK_TX_CTRL_JAPAN 0x00000010
#define AR_PHY_CCK_DETECT 0x1C6208
#define AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK 0x0000003F
#define AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK_S 0
#define AR_PHY_CCK_DETECT_ANT_SWITCH_TIME 0x00001FC0 // [12:6] settling time for antenna switch
#define AR_PHY_CCK_DETECT_ANT_SWITCH_TIME_S 6
#define AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV 0x2000
#define AR_PHY_GAIN_2GHZ 0x1C620C
#define AR_PHY_GAIN_2GHZ_RXTX_MARGIN 0x00FC0000
#define AR_PHY_GAIN_2GHZ_RXTX_MARGIN_S 18
#define AR_PHY_GAIN_2GHZ_BSW_MARGIN 0x00003C00
#define AR_PHY_GAIN_2GHZ_BSW_MARGIN_S 10
#define AR_PHY_GAIN_2GHZ_BSW_ATTEN 0x0000001F
#define AR_PHY_GAIN_2GHZ_BSW_ATTEN_S 0
#define AR_PHY_CCK_RXCTRL4 0x1C621C
#define AR_PHY_CCK_RXCTRL4_FREQ_EST_SHORT 0x01F80000
#define AR_PHY_CCK_RXCTRL4_FREQ_EST_SHORT_S 19
#define AR_PHY_DAG_CTRLCCK 0x1C6228
#define AR_PHY_DAG_CTRLCCK_EN_RSSI_THR 0x00000200 /* BB Rev 4.2+ only */
#define AR_PHY_DAG_CTRLCCK_RSSI_THR 0x0001FC00 /* BB Rev 4.2+ only */
#define AR_PHY_DAG_CTRLCCK_RSSI_THR_S 10 /* BB Rev 4.2+ only */
#define AR_PHY_POWER_TX_RATE3 0x1C6234
#define AR_PHY_POWER_TX_RATE4 0x1C6238
#define AR_PHY_SCRM_SEQ_XR 0x1C623C
#define AR_PHY_HEADER_DETECT_XR 0x1C6240
#define AR_PHY_CHIRP_DETECTED_XR 0x1C6244
#define AR_PHY_BLUETOOTH 0x1C6254
#define AR_PHY_TPCRG1 0x1C6258 /* ar2413 power control */
#define AR_PHY_TPCRG1_NUM_PD_GAIN 0x0000c000
#define AR_PHY_TPCRG1_NUM_PD_GAIN_S 14
#define AR_PHY_TPCRG1_PD_GAIN_1 0x00030000
#define AR_PHY_TPCRG1_PD_GAIN_1_S 16
#define AR_PHY_TPCRG1_PD_GAIN_2 0x000C0000
#define AR_PHY_TPCRG1_PD_GAIN_2_S 18
#define AR_PHY_TPCRG1_PD_GAIN_3 0x00300000
#define AR_PHY_TPCRG1_PD_GAIN_3_S 20
//
#define AR_PHY_ANALOG_SWAP 0xa268
#define AR_PHY_SWAP_ALT_CHAIN 0x00000040
#define AR_PHY_TPCRG5 0x1C626C /* ar2413 power control */
#define AR_PHY_TPCRG5_PD_GAIN_OVERLAP 0x0000000F
#define AR_PHY_TPCRG5_PD_GAIN_OVERLAP_S 0
#define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_1 0x000003F0
#define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_1_S 4
#define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_2 0x0000FC00
#define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_2_S 10
#define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_3 0x003F0000
#define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_3_S 16
#define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_4 0x0FC00000
#define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_4_S 22
#define AR_PHY_POWER_TX_RATE5 0x1C638C
#define AR_PHY_POWER_TX_RATE6 0x1C6390
#define AR_PHY_CAL_CHAINMASK 0x1C639C
#define AR_PHY_POWER_TX_SUB 0x1C63C8
#define AR_PHY_POWER_TX_RATE7 0x1C63CC
#define AR_PHY_POWER_TX_RATE8 0x1C63D0
#define AR_PHY_POWER_TX_RATE9 0x1C63D4

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,655 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "../80211core/cprecomp.h"
const u32_t zcFwImageSPI[]={
0x0009000B, 0x4F222FE6, 0xB0187FFC, 0xE6000009,
0x943DD520, 0xC8406052, 0x2F028F03, 0x8FF93642,
0xD41D7601, 0x4E0BDE1D, 0xD41D0009, 0x00094E0B,
0x4E0BD41C, 0x7F040009, 0xA0214F26, 0x4F226EF6,
0xE205D119, 0x2122E400, 0x92222142, 0x8BFD4210,
0x450BD516, 0xD6160009, 0x0009460B, 0xE5FFD715,
0x2752655D, 0xE1FFD714, 0xD4145079, 0x1709CB01,
0x17112712, 0x2412E101, 0x4F26D411, 0x2410000B,
0xDE11DD10, 0x00094D0B, 0x00094E0B, 0x0009AFFA,
0x03E82710, 0x001C001C, 0x00116594, 0x00114EBE,
0x001165A4, 0x001165BC, 0x001D4004, 0x00114FA0,
0x00114378, 0x001C3510, 0x001C3624, 0x001E212C,
0x001164FC, 0x00114700, 0x0011589C, 0x2FA62F96,
0x2FC62FB6, 0x2FE62FD6, 0x7FC84F22, 0xD28DDD8C,
0x61D360D0, 0x80F47101, 0x420B6010, 0x200880F8,
0x6E038F10, 0xDB89D488, 0xD4896A40, 0x4B0BDC89,
0x67C065AC, 0x697CDE88, 0x41086193, 0x31984108,
0x3E1C4108, 0x66D284F8, 0x2008600C, 0x2E628F13,
0xE40084F4, 0xDA81670C, 0x3273624D, 0xA0D38B01,
0x644D0009, 0x35AC6543, 0x69436652, 0x39EC6B62,
0xAFF119B1, 0x88017404, 0x84F48B15, 0x2E70E700,
0xDA766E0C, 0x32E3627D, 0xA0C48B01, 0x677D0009,
0x6C7366A3, 0x65737604, 0x356C3CAC, 0x6D5264C2,
0xAFEF7708, 0xE2B024D2, 0x3020622C, 0x84F48B30,
0x650CEC00, 0xDA691F53, 0x55F3E904, 0x325362CD,
0xA0A88B01, 0x6CCD0009, 0x67C36EA3, 0x6BC37E04,
0x3BEC37AC, 0x6EB26D72, 0xDB62D461, 0x00094B0B,
0x410BD161, 0xD46164D3, 0x00094B0B, 0x450BD55E,
0xD45F64E3, 0x00094B0B, 0x61D3E600, 0x316C666D,
0x646D7601, 0x21E03493, 0x4E198FF7, 0x7C08AFD5,
0x622CE2B1, 0x8B113020, 0xD552D456, 0xDA56DC4F,
0x0009450B, 0x4A0BE400, 0xD75467C2, 0x470BDB52,
0x4B0B0009, 0xE900E403, 0x2E90A06D, 0x622CE2B2,
0x89683020, 0x622CE2B3, 0x8B1D3020, 0xDA45D44C,
0x4A0BD942, 0x65960009, 0x6792D44A, 0x1F74DD3B,
0x1F5D4D0B, 0xD639D448, 0x460BDB48, 0x55F455F4,
0x4B0BD936, 0xD44654FD, 0x490B6503, 0x5DF51F05,
0x1ED1EC04, 0x2EC0A047, 0x622CE2B4, 0x8B3E3020,
0xDA34D440, 0x4A0BDD31, 0x84F40009, 0x600C6CD2,
0x1F072F02, 0x1FC6C903, 0xE6001F08, 0xD73AE030,
0x6CF2DB3A, 0x1F790F65, 0xA0211FBA, 0x51F6E904,
0x6D63666D, 0x4C1536EC, 0xD2353D1C, 0x1F6B8F05,
0x89023C93, 0xA00264D3, 0xE50455F8, 0x420B64D3,
0x5BFB0009, 0xD61954FA, 0x460B65D3, 0x54F91B01,
0xDA1655B1, 0x7CFC4A0B, 0x06FDE030, 0x0F657604,
0x626D55F7, 0x8BDA3253, 0xA00484F4, 0xD4252E00,
0x420BD20E, 0x7F3865D2, 0x6EF64F26, 0x6CF66DF6,
0x6AF66BF6, 0x69F6000B, 0xE6006163, 0x4109A004,
0x76016256, 0x74042422, 0x8BF93612, 0x0009000B,
0x00117800, 0x00115FF0, 0x001164F6, 0x00114F2C,
0x001165C0, 0x001164F5, 0x0011611C, 0x00117804,
0x001165E0, 0x00114EBE, 0x00114F02, 0x001165F4,
0x001165FC, 0x00116600, 0x00114BF0, 0x001148FC,
0x00116618, 0x00116634, 0x00116640, 0x00114E56,
0x0011664C, 0x00116658, 0x0011667C, 0x00116670,
0x00114BC4, 0x00116688, 0x2F962F86, 0x2FB62FA6,
0x2FD62FC6, 0x4F222FE6, 0xE5007FD8, 0x6453E110,
0x6C534128, 0x655DEE0A, 0x46086653, 0x4608365C,
0x361C7501, 0x675D6043, 0x60C30F66, 0x37E3ED00,
0x816126C1, 0x81638162, 0x16D316D2, 0x8FEA16D4,
0x68F27404, 0xDAB3D9B2, 0x29821981, 0xD1B259F1,
0x2A921A91, 0x5BF35AF2, 0x5EF55DF4, 0x11A154F6,
0x11B321A2, 0x11D511B2, 0x11E711D4, 0x114911E6,
0x55F71148, 0xEE00DBA9, 0xDDA957F8, 0xD6A952F9,
0x1B5164E3, 0xDBA82B52, 0xEAB8D8A8, 0x2D72E945,
0x6AAC2622, 0x6EED4908, 0x4D086DE3, 0x3DEC61E3,
0x4D084108, 0x3DBC31EC, 0x410860C3, 0x81D12DC1,
0x4108E050, 0x41084008, 0x60C381D2, 0xE500318C,
0x81D334A2, 0x1D131DD2, 0x8D01D494, 0xD4911D54,
0xB08165D3, 0x64ED7E01, 0x8BDC3492, 0xDB94D18D,
0xD28B6812, 0x1B814829, 0x2FD26412, 0x2B92694D,
0xD98A6722, 0x1B734729, 0xD7876822, 0x1BA26A8D,
0xD28C6B72, 0x22B2D586, 0xE0035D72, 0x5E7412D2,
0x12E44018, 0xD6885176, 0x54781216, 0x1248E1FF,
0xD4856792, 0x6852127A, 0x28C1E703, 0x81916952,
0x6A52E050, 0x81A24008, 0x60C36B52, 0x6D5281B3,
0x6E521DD2, 0x62521E63, 0x1264E600, 0x46086563,
0x7501364C, 0x665D2612, 0x8BF83673, 0xE003D471,
0x40186542, 0x674225C1, 0x8171D274, 0xEE006842,
0x69421882, 0x1923E024, 0xE5806A42, 0x6B421AE4,
0x81B266E3, 0xD46D6C42, 0x655C81C3, 0x6D63666D,
0x616D7604, 0x31533D4C, 0x2DE28FF8, 0xD569D268,
0x74042422, 0x7F282452, 0x6EF64F26, 0x6CF66DF6,
0x6AF66BF6, 0x000B69F6, 0x664268F6, 0xC8036061,
0xE5008D04, 0xC9036061, 0x8B038802, 0x65635262,
0x24125124, 0x6053000B, 0x2FE62FD6, 0x7FEC4F22,
0x62536E53, 0x6D43E550, 0x4508E400, 0xE101A001,
0x60435224, 0x81212211, 0x60538123, 0x56E28122,
0x8BF53620, 0x16E4D250, 0xE61464F3, 0x65E3420B,
0xE4FC65E1, 0x2E512549, 0x65F361F1, 0x2F112149,
0xD14954D1, 0xE614410B, 0x607157D1, 0x2701CB01,
0x7F141DE1, 0x6EF64F26, 0x6DF6000B, 0x2FE62FD6,
0x7FEC4F22, 0x66536E53, 0x6D43E5FC, 0x20596061,
0x2601CB01, 0x326052E2, 0x12E48B06, 0x31E051E2,
0x52D18B04, 0x1E22A002, 0x5664AFF0, 0x64F3D236,
0x420BE614, 0x67E165E3, 0x2719E1FC, 0x67F12E71,
0x271954D1, 0x65F3D130, 0x410BE614, 0x52D12F71,
0xCB016021, 0x1DE12201, 0x4F267F14, 0x000B6EF6,
0x2FE66DF6, 0x624C4F22, 0x4208DE1B, 0xA0054200,
0x52523E2C, 0x5624D417, 0x2E62BF8E, 0x52E165E2,
0x8BF63520, 0x2622D61B, 0x000B4F26, 0x2FB66EF6,
0x2FD62FC6, 0x4F222FE6, 0xDB1CDC10, 0x66C252C1,
0x89403620, 0xC9036061, 0x893C8801, 0xDD18DE0B,
0x64E3BF63, 0x85036503, 0x620D66B2, 0x892B3262,
0xBF9BD403, 0xD4130009, 0x00094D0B, 0x0009AFE6,
0x001160DC, 0x001160E4, 0x001160EC, 0x00116114,
0x001164F8, 0x00116500, 0x001000C8, 0x00101680,
0x001E2108, 0x001C3D00, 0x00117880, 0x00117780,
0x00040020, 0x0026C401, 0x001142F8, 0x001164DC,
0x00114EBE, 0x0011669C, 0x64E3BF3E, 0x4D0BD406,
0xAFBB0009, 0xD2050009, 0x4F262262, 0x6DF66EF6,
0x000B6CF6, 0x00006BF6, 0x001166A0, 0x001C3D28,
0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6,
0xD23C7FFC, 0xC8036022, 0x2F018F3D, 0x0009A061,
0xC9036061, 0x893B8801, 0xD238D837, 0x420BD938,
0xE4006483, 0x6A036D03, 0x5C02490B, 0xD236DB35,
0x56D385D2, 0x650D6422, 0x4B0BE740, 0xD1326E03,
0x64126EED, 0x214234EC, 0x3DC05DD4, 0x85D28BEF,
0x70FF56D3, 0xE740650D, 0x6C034B0B, 0x490BDB2A,
0x66B2E403, 0x36CC6CCD, 0xE700D928, 0x2B62E5C8,
0x6473E650, 0x490BDC26, 0x6483655C, 0x65A34C0B,
0xEE01D124, 0xD11C21E2, 0x66125211, 0x8BBF3620,
0xDD22DE21, 0xDC23DB22, 0x65D252D1, 0x89183520,
0xC9036051, 0x89148801, 0xD114D41C, 0x0009410B,
0x36E05603, 0x65038F04, 0x2B20E201, 0x2C52AFEC,
0xD213D419, 0x0009420B, 0xE101D618, 0xAFE34118,
0x60F12612, 0x8902C804, 0x420BD215, 0x7F040009,
0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6, 0x000B69F6,
0x000068F6, 0x001E2100, 0x001160E4, 0x0011453A,
0x00114BF0, 0x00114E0C, 0x00116714, 0x001159B0,
0x00114558, 0x001E212C, 0x00117880, 0x001160DC,
0x001164FC, 0x001164F8, 0x00116114, 0x001C3D30,
0x001140CC, 0xD6C2D5C1, 0x26226252, 0xC8016060,
0x000B8BFA, 0x2FE60009, 0xBFF34F22, 0xD2BD0009,
0xE405E100, 0x22402212, 0x6422DEB8, 0xE700D5B8,
0x25721E42, 0xC98F8451, 0xC9F0CB10, 0x8051CB02,
0xCB026050, 0x62522500, 0x2E22BFDC, 0xD6B250E4,
0x4F262602, 0x6EF6000B, 0x4F222FD6, 0x0009BFDB,
0x620CDDAE, 0x60D02D22, 0x8906C801, 0x0009BFD3,
0x2D22620C, 0xC80160D0, 0x4F268BF8, 0x6DF6000B,
0x4F222FE6, 0x6E43BFE8, 0xE100D2A2, 0x22E02212,
0x6422D59E, 0xE600DE9E, 0x2E621542, 0xC9F084E1,
0x80E1CB01, 0xCB0260E0, 0x67E22E00, 0x4F262572,
0x6EF6AFA8, 0xE406AFE4, 0xE404AFE2, 0xBFF94F22,
0xE4C70009, 0x644CBFDC, 0x4F26AFF6, 0xE406AFD8,
0xE404AFD6, 0x4F222FE6, 0x6E43BFF8, 0xD58DD28D,
0xE401E100, 0x221260E3, 0x80512240, 0x6622D187,
0xE700DE87, 0x2E721162, 0xC9F084E1, 0x80E1CB02,
0xCB0260E0, 0x62E22E00, 0x2122BF7C, 0xAFDF4F26,
0x2FD66EF6, 0x4F222FE6, 0xBFCB6D53, 0xBF9B6E43,
0xD27C0009, 0x22E061D3, 0x6022DE7D, 0x411821E9,
0x201BC9FF, 0x2202D577, 0xD6768453, 0x60D38051,
0xD4728053, 0xD1726762, 0x1472ED00, 0x841121D2,
0xCB04C9F0, 0x60108011, 0x2100CB02, 0xBF516212,
0x4F262422, 0xAFA76EF6, 0x65436DF6, 0xAFD0E4D8,
0x6543644C, 0xAFCCE4D8, 0x2FC6644C, 0x2FE62FD6,
0x6E534F22, 0xBF676D43, 0xD7626C63, 0x27D0D264,
0x61E36072, 0x41182129, 0x201BC9FF, 0x2702D45D,
0xD15B8443, 0x60E38041, 0xDE588043, 0xE6006472,
0x21621E42, 0x65DC8411, 0x60C36203, 0x4008C907,
0x67034008, 0xE29F6023, 0x622CC98F, 0x3520207B,
0x80118D18, 0x7C048411, 0x60C36603, 0x6203C90F,
0xC9F06063, 0x8011202B, 0x880B6053, 0x84118B14,
0xC90F6603, 0xC90F7001, 0x60636203, 0x202BC9F0,
0x8011A00A, 0x7C018411, 0x60C36603, 0x6203C90F,
0xC9F06063, 0x8011202B, 0xCB026010, 0x62122100,
0x2E22BEF0, 0xD63C50E4, 0x4F262602, 0x6DF66EF6,
0x6CF6000B, 0x2FC62FB6, 0x2FE62FD6, 0x6C634F22,
0x6E436D53, 0x6B73BF36, 0x0009BF06, 0x61D3D231,
0xDE3322E0, 0x21E96022, 0xC9FF4118, 0xD42D201B,
0x84432202, 0x8041D72F, 0x804360D3, 0x6622D427,
0x1462D127, 0x14C327C2, 0x21C2EC00, 0x7B048411,
0x60B36D03, 0x6503C90F, 0xC9F060D3, 0x8011205B,
0xCB026010, 0x62122100, 0x4F262422, 0x6DF66EF6,
0xAEAF6CF6, 0x2FB66BF6, 0x2FD62FC6, 0x4F222FE6,
0x6C536D63, 0xBEFD6E43, 0xBECD6B73, 0xD2150009,
0x22E061C3, 0x6022DE16, 0x411821E9, 0x201BC9FF,
0x2202D110, 0xD60F8413, 0x60C38011, 0xDE0B8013,
0xD40B6762, 0xEC006BBD, 0x1EB51E72, 0x844124C2,
0xC9F04B21, 0x8041CB04, 0xE1406040, 0x2400CB06,
0xE5006242, 0x4B212E22, 0x4128A014, 0x001D1200,
0x00116528, 0x00116530, 0x00116538, 0x00116544,
0x00FFFFFF, 0x00116534, 0x6053655D, 0x06DE4008,
0x21627501, 0x32B3625D, 0x4F268BF6, 0x6DF66EF6,
0xAE5F6CF6, 0x4F226BF6, 0xBF73677C, 0xAEB3644C,
0x4F224F26, 0xBFA6677D, 0xAEAD644C, 0x4F224F26,
0xE500E49F, 0xBF08E603, 0x4F26644C, 0x600C000B,
0xE49F4F22, 0xE603E500, 0x644CBEFF, 0x4F264019,
0x600D000B, 0x6543665C, 0xE403AEF7, 0x6543665C,
0xE40BAEF3, 0xD175D674, 0x60436262, 0xC8012122,
0x8F016010, 0xC9EFCB10, 0x62122100, 0x2622000B,
0x4F222FE6, 0xE0004F13, 0xBE2C401E, 0xD56C6E43,
0x2522620C, 0xE401BFE6, 0x6063D669, 0x60ECCF80,
0x89072008, 0x89098801, 0x890D8802, 0x89118803,
0x0009A013, 0xC9E36060, 0x2600A00F, 0xCB106060,
0xCB04C9F7, 0x2600A009, 0xCB106060, 0xCB08C9FB,
0x2600A003, 0xCB1C6060, 0xD5592600, 0xBE616252,
0xE400642C, 0x4F264F17, 0x6EF6AFBC, 0x2F962F86,
0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6, 0x60C36C7C,
0x6A638802, 0x69538F09, 0x65436290, 0x662CE4AF,
0xBEF7E701, 0xA00A644C, 0x2CC80009, 0x88018901,
0x65438B05, 0xE600E4AF, 0xBEEBE701, 0xBDD1644C,
0xED010009, 0xDE43EBAF, 0xE800A02C, 0x0009BDF4,
0x60C3D141, 0x8802E200, 0xD5402122, 0x21B08D06,
0x89082CC8, 0x890A8801, 0x0009A00C, 0x009C60D3,
0xA007D639, 0xD2388061, 0xA0036083, 0xD2368021,
0x802160D3, 0xD1356412, 0x1E42E600, 0x84512162,
0xC9F07D01, 0x8051CB02, 0xCB026050, 0x67122500,
0x2E72BDA0, 0x8BD13DA2, 0x0009BDF6, 0x0009BDA3,
0x620CD627, 0x4F262622, 0x6DF66EF6, 0x6BF66CF6,
0x69F66AF6, 0x68F6000B, 0xE702AF98, 0x2F962F86,
0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6, 0x3F3C9331,
0x0F569030, 0xE8FF70FC, 0x688C0F46, 0xE900A049,
0x4018E010, 0xE50404FE, 0xBF33349C, 0x88FF6A43,
0x901F893E, 0xE1100CFE, 0x41183C98, 0x8B033C16,
0x64A3BE1B, 0x0009A031, 0x4018E010, 0xED000BFE,
0xA0073BCC, 0x64D36EF3, 0xBF1F34BC, 0x2E00E501,
0x7E017D01, 0x8BF63DC2, 0x64A3BE07, 0xA01AED00,
0xEFF86EF3, 0x00001004, 0x001D1204, 0x0011652C,
0x00116544, 0x001D1200, 0x00116530, 0x00116528,
0x666C66E0, 0x89043680, 0x35BC65D3, 0xBE51E701,
0x7D01E402, 0x3DC27E01, 0xE1108BF2, 0x391C4118,
0x90547904, 0x391201FE, 0x93518BB2, 0x4F263F3C,
0x6DF66EF6, 0x6BF66CF6, 0x69F66AF6, 0x68F6000B,
0x676D6253, 0x66236543, 0xE402AEC3, 0x2FA62F96,
0x2FC62FB6, 0x2FE62FD6, 0x697D4F22, 0x4A216A93,
0x4A084A21, 0x6C436D63, 0xA0086B73, 0x64C36E53,
0x669365D3, 0x6BBDBFE4, 0x3DAC3CBC, 0x6EEF3EB8,
0x8BF42EE8, 0x4F26E000, 0x6DF66EF6, 0x6BF66CF6,
0x000B6AF6, 0x2FA669F6, 0x2FC62FB6, 0x2FE62FD6,
0xEC004F22, 0x6B536EC3, 0xA0066D43, 0x64D3EA01,
0x65A3BEA8, 0x7D013C0C, 0x3EB27E01, 0x60C38BF7,
0x6EF64F26, 0x6CF66DF6, 0x000B6BF6, 0x10046AF6,
0x00001008, 0x0009000B, 0x2FD62FC6, 0x4F222FE6,
0x6D436C53, 0xEE00A004, 0x7E0164D4, 0x644CBFF2,
0x8BF93EC2, 0x6EF64F26, 0x000B6DF6, 0xE5006CF6,
0x6643A002, 0x76017501, 0x22286260, 0xAFE38BFA,
0x2FE60009, 0x75076253, 0xE1086753, 0x6043EE0A,
0x4409C90F, 0x650330E2, 0x8D014409, 0xE630E637,
0x4110365C, 0x8FF22760, 0xE00077FF, 0x000B8028,
0x4F226EF6, 0xBFE47FEC, 0xBFD865F3, 0x7F1464F3,
0x000B4F26, 0x4F22E000, 0xBFDA7FEC, 0x64F365F3,
0x7406BFCD, 0x4F267F14, 0xE000000B, 0x4F222FE6,
0x62537FEC, 0x65F36E43, 0x6423BFCB, 0x64E3BFBF,
0x64F3BFBD, 0xBFBAD403, 0x7F140009, 0x000B4F26,
0x00006EF6, 0x001166A4, 0xE4FDD29A, 0xD79A6122,
0x22122149, 0x74016022, 0x2202CB01, 0xD5976622,
0x22622649, 0xC8406070, 0x60528902, 0x2502CB04,
0xE1F76452, 0x25422419, 0xE7016052, 0x2502C9CF,
0xE6026052, 0x2502CB03, 0x15624718, 0x1573000B,
0xD78CD58B, 0xD48DD28C, 0xE600E100, 0x27112511,
0xAFD12210, 0x664C2461, 0x4600D289, 0x6060362C,
0x000BCB10, 0x654C2600, 0x4500D285, 0x6650352C,
0x2619E1EF, 0x2560000B, 0xD282664C, 0x362C4600,
0xCB106060, 0x2600000B, 0xD27E654C, 0x352C4500,
0xE1EF6650, 0x000B2619, 0x664C2560, 0x4600D278,
0x6060362C, 0x000BCB08, 0x654C2600, 0x4500D274,
0x6650352C, 0x2619E1F7, 0x2560000B, 0xD271664C,
0x362C4600, 0xCB086060, 0x2600000B, 0xD26D654C,
0x352C4500, 0xE1F76650, 0x000B2619, 0x624C2560,
0x4200D667, 0x6020326C, 0x4021C908, 0x40214021,
0x600C000B, 0xD663624C, 0x326C4200, 0xC9086020,
0x40214021, 0x000B4021, 0xD15F600C, 0x341C644C,
0x000B6240, 0xD15D602C, 0x341C644C, 0x000B6240,
0x2FE6602C, 0x6E434F22, 0xE60A645C, 0x89143467,
0x0009BFEB, 0x60EC640C, 0x8B028801, 0xA002E00F,
0x44092409, 0x624C4409, 0x3263E60A, 0xBFE28905,
0x620C644C, 0xC8806023, 0xE2008B00, 0x4F266023,
0x6EF6000B, 0xD64A4F22, 0x88016062, 0xB2458B03,
0xA0030009, 0xD2470009, 0x2260E640, 0xE200D646,
0x000B4F26, 0x4F222622, 0x6062D641, 0x8B018802,
0x0009B28E, 0xE200D640, 0x000B4F26, 0xD53C2622,
0xE100D43C, 0x2512E701, 0x2470000B, 0xE604D239,
0x2260000B, 0xD4394F22, 0x410BD139, 0xD5390009,
0x6650E1FD, 0x2619D238, 0x2560E700, 0x000B4F26,
0x4F222270, 0xD132D435, 0x0009410B, 0xE7FBD531,
0x26796650, 0x000B4F26, 0x4F222560, 0xD12CD430,
0x0009410B, 0xE7F7D52B, 0x26796650, 0x000B4F26,
0xD5282560, 0x6250942D, 0x000B2249, 0xD5252520,
0x6250E4BF, 0x000B2249, 0x4F222520, 0x8522D225,
0x2008600D, 0x88018911, 0x88038913, 0x88058915,
0x88068942, 0x88088948, 0x8809894E, 0x880A8954,
0x880B895A, 0xA0678960, 0xB0690009, 0xA0640009,
0xB077600C, 0xA0600009, 0xB080600C, 0xA05C0009,
0xFF7F600C, 0x001E2148, 0x001E1000, 0x001E1108,
0x00116570, 0x00116572, 0x00116591, 0x00116554,
0x001E103F, 0x001E105F, 0x001E102F, 0x001E1090,
0x00116578, 0x001E100B, 0x00116574, 0x001166A8,
0x00114EBE, 0x001E1028, 0x00116590, 0x001166B4,
0x001166C4, 0x00116548, 0x6260D684, 0x8B2B2228,
0x0009B061, 0x600CA029, 0x6260D680, 0x8B232228,
0x0009B069, 0x600CA021, 0x6260D67C, 0x8B1B2228,
0x0009B0C7, 0x600CA019, 0x6260D678, 0x8B132228,
0x0009B0CD, 0x600CA011, 0x6260D674, 0x8B0B2228,
0x0009B125, 0x600CA009, 0x6260D670, 0x8B032228,
0x0009B13D, 0x600CA001, 0x4F26E000, 0x0009000B,
0xD26CD16B, 0xD56C8412, 0x4000C90F, 0xD76B012D,
0xE403D66B, 0xE20F611C, 0x2540E001, 0x25202712,
0x2602000B, 0xE601D262, 0x30668523, 0xE0008D05,
0xD663D260, 0xE0018122, 0x000B2602, 0xD25C0009,
0x600D8523, 0x89052008, 0x8B0A8801, 0x6060D65D,
0x2600CB01, 0xD457D65A, 0xE001E101, 0x000B2612,
0x000B8142, 0xD152E000, 0x8513E501, 0x640D4518,
0x66033453, 0xE0008D05, 0xD551D253, 0x2260E001,
0x000B2502, 0x4F220009, 0x8513D149, 0x6453650D,
0x62494419, 0x227D672E, 0x8801602C, 0x88028909,
0x88038910, 0x8806891A, 0x88078935, 0xA04C893B,
0xD5460009, 0x6652D746, 0x2762D446, 0x622C6261,
0x2421A038, 0x2228625C, 0xD4438B3F, 0x6642D540,
0x2562D440, 0x24018561, 0x6203A02C, 0x2008605C,
0x88108907, 0x88208908, 0x88308909, 0xA02C890A,
0xD23A0009, 0x6222A008, 0xA005D239, 0xD2396222,
0x6222A002, 0x6262D638, 0xD432D531, 0x66212522,
0xA00F626C, 0xD6352421, 0x6261D52D, 0x622CD42D,
0xA0072562, 0xD6322421, 0x8561D529, 0x2562D429,
0x62032401, 0x662D8515, 0x3617610D, 0x65038F01,
0xB0CB2451, 0xA0010009, 0xE000E001, 0x000B4F26,
0xD6190009, 0xD427E101, 0x65412610, 0xD118D717,
0xE20F655D, 0x2752E001, 0x000B2620, 0x2FE62102,
0xD20F4F22, 0x640C8523, 0x8B082448, 0xD511D61D,
0x2621E200, 0x940F8451, 0xA0482049, 0xDE0D8051,
0xC84060E0, 0xE2018D32, 0x89443427, 0xD216D615,
0x2641420B, 0x0009A030, 0x0000FF7F, 0x00116591,
0x00116548, 0x00116554, 0x001E1100, 0x001E100C,
0x00116574, 0x001E1000, 0x001E1001, 0x0011657C,
0x0011655C, 0x00116560, 0x00116564, 0x00116580,
0x00116584, 0x00116588, 0x0011658C, 0x00116774,
0x0011677E, 0x0011656E, 0x00115DCA, 0x89123427,
0xD294D693, 0x2641420B, 0xCB8084E1, 0x80E1B0F5,
0xD69160E0, 0x2E00CB04, 0xC93F6060, 0xD68F2600,
0xA001E001, 0xE0002602, 0x000B4F26, 0xD68C6EF6,
0xC8806060, 0xD2868919, 0x88016021, 0xD2898B15,
0x8524E501, 0x89103056, 0xE203D187, 0x2120D487,
0xE00B6541, 0x0656655D, 0xE40FD585, 0x2140E702,
0xD77E2571, 0x000BE001, 0x000B2702, 0x2FE6E000,
0xDE804F22, 0xC88084E1, 0xD57A892C, 0x20088554,
0x61038F28, 0x8553D77C, 0x64036672, 0x8566650C,
0x3520620C, 0xD6798B1E, 0x651CD774, 0x2651644C,
0x60E02741, 0x8904C840, 0x420BD275, 0xA0030009,
0xD2680009, 0x0009420B, 0x0009B09F, 0xE201D167,
0x60E02122, 0xCB04D464, 0x60402E00, 0x2400C93F,
0x6023A001, 0x4F26E000, 0x6EF6000B, 0x2FB62FA6,
0x2FD62FC6, 0xDA622FE6, 0x66A1E240, 0x3622DC5E,
0x62638900, 0x6ED36D2C, 0x4E2136D8, 0x4E212A61,
0xDB61D460, 0xE700A00F, 0x770162B2, 0x71026123,
0x66212B12, 0x71026213, 0x61212B12, 0x651D666D,
0x356C4528, 0x627C2452, 0x8BED32E3, 0xC90360D3,
0x8B108803, 0x617367B2, 0x2B127102, 0x71026E13,
0x2B126571, 0x655D6DE1, 0x422862DD, 0x325CE107,
0xA00C2C10, 0x88022422, 0xA0038B01, 0x8801E203,
0xE2018B05, 0x66B22C20, 0x655D6561, 0xE60F2452,
0x67A12C60, 0x8B052778, 0xDD38DC44, 0xEB01EA00,
0x2DB22CA2, 0x6DF66EF6, 0x6BF66CF6, 0x6AF6000B,
0x2FE62FD6, 0xE240DD36, 0x362266D1, 0x62638900,
0x3678672C, 0x7703DE38, 0x47212D61, 0x64E2D635,
0xA00E4721, 0x6562E100, 0x62537101, 0x74012450,
0x24204219, 0x45297401, 0x74012450, 0x24504519,
0x621C7401, 0x8BEE3273, 0x66E24200, 0x420061D1,
0x2118362C, 0x2E628F06, 0xDD1CD728, 0xE501E400,
0x2D522742, 0x000B6EF6, 0x2FD66DF6, 0x4F222FE6,
0xED0AEE01, 0x64E3BC97, 0xBC9C64E3, 0x62EC7E01,
0x8BF732D7, 0xBC9FEE01, 0x64E364E3, 0x7E01BCA4,
0x32D762EC, 0x4F268BF7, 0x000B6EF6, 0xD1186DF6,
0xD418920D, 0x72122122, 0x2422D617, 0xD7177204,
0x72202622, 0x2722D116, 0x000B7230, 0x137A2122,
0x0011656E, 0x00115ED6, 0x001E1015, 0x00116574,
0x001E1001, 0x00116548, 0x001E1100, 0x00116572,
0x00116560, 0x001E1000, 0x00116564, 0x00116570,
0x00115DCA, 0x001E100C, 0x0011655C, 0x00116578,
0x0011657C, 0x00116580, 0x00116584, 0x00116588,
0x0011658C, 0x4F222FE6, 0xD6507FFC, 0x88016060,
0xE2018951, 0x2620BFBB, 0xD54ED14D, 0xDE4E6010,
0x64E36552, 0x7402C840, 0x8D22D14C, 0xD24C7502,
0xE601D74C, 0xE7042722, 0x76016255, 0x626C2421,
0x8FF93273, 0xD4437402, 0x6242E601, 0x640D8528,
0x67494419, 0x275D657E, 0x81E4607C, 0xE417D542,
0x67557601, 0x3243626C, 0x8FF92171, 0xA0207102,
0xD23E0009, 0xE601D73B, 0xE7042722, 0x76016255,
0x626C2421, 0x8FF93273, 0xD4327402, 0x6242E601,
0x640D8528, 0x67494419, 0x275D657E, 0x81E4607C,
0xE417D533, 0x67557601, 0x3243626C, 0x8FF92171,
0x924A7102, 0xD2262E21, 0x5E23D72E, 0x64F22FE2,
0x604365F2, 0x2700C980, 0xC9606043, 0x80716103,
0xC9036043, 0x80724519, 0x65F2605C, 0x817266F2,
0x46194629, 0x606C4529, 0x4018645C, 0x8173304C,
0x21185E23, 0x64F22FE2, 0x6E4C62F2, 0x602C4219,
0x66F262F2, 0x46294018, 0x461930EC, 0x42298174,
0x652C606C, 0x305C4018, 0x81758F07, 0x0009BC9D,
0x2228620C, 0xA00A8908, 0x60130009, 0x8B038840,
0x0009B009, 0x0009A003, 0xE202D60F, 0x7F042622,
0x000B4F26, 0x000B6EF6, 0x060A0009, 0x00116590,
0x001E1000, 0x0011657C, 0x00116774, 0x00116780,
0x00116718, 0x00116564, 0x00116748, 0x00116746,
0x0011671A, 0x00116548, 0x00116574, 0x4F222FE6,
0x84E9DE8E, 0x2448640C, 0xB18B8901, 0xD28C0009,
0x26686620, 0x60E08902, 0x2E00C9BF, 0x000B4F26,
0x000B6EF6, 0x2FE60009, 0xDE864F22, 0x60E0D686,
0xCBC0D486, 0x62602E00, 0xC803602C, 0x40218904,
0x70014021, 0x6603A002, 0x66034009, 0xD680616D,
0xE500A004, 0x75016262, 0x74042422, 0x3213625D,
0xD27C8BF8, 0x0009420B, 0xC9BF84E2, 0x4F2680E2,
0x6EF6000B, 0x2FE62FD6, 0x7FFC4F22, 0x6260D676,
0x89402228, 0xD56DE100, 0x60502610, 0xCB40D473,
0x2500440B, 0x8D052008, 0x62E06E03, 0x7104612C,
0x2F11A006, 0xD46ED666, 0xDD6E6760, 0x657C4D0B,
0xE23C6D1D, 0x8B033D27, 0xD26CD46B, 0x0009420B,
0x4D214D21, 0xA005D76A, 0x66E6E400, 0x357C4508,
0x74012562, 0x35D3654D, 0xD7668BF7, 0x6E72E003,
0x81E14018, 0x6E7260F1, 0x81E2700C, 0xD4626172,
0xDD628113, 0x65724D0B, 0xD652D261, 0x2212E101,
0xC93F6060, 0x7F042600, 0x6EF64F26, 0x6DF6000B,
0x2FC62FB6, 0x2FE62FD6, 0xD25A4F22, 0x6B436E73,
0x420B6C53, 0x20086D63, 0x61038F08, 0xD24FD456,
0x6EF64F26, 0x6CF66DF6, 0x6BF6422B, 0x21B060C3,
0x60D38011, 0xE5008111, 0x64BCA007, 0x6053655D,
0x665300EC, 0x7501361C, 0x625D8064, 0x8BF53243,
0x6060D636, 0x2600C9BF, 0x6EF64F26, 0x6CF66DF6,
0x6BF6000B, 0x7FC44F22, 0x720262F3, 0x22512F41,
0x45297202, 0x60632251, 0xE5C4E682, 0x67F38121,
0x655C666C, 0xE408BFBC, 0x4F267F3C, 0x0009000B,
0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6,
0xE1007FC4, 0x6513ECFF, 0x6B136CCD, 0xDE34D733,
0xEDFF64F3, 0xD833EA04, 0x6053655C, 0x027D4000,
0x32C0622D, 0x66038D0D, 0x09ED6063, 0x2491027D,
0x24217402, 0x698202ED, 0x3928622D, 0x74022892,
0x75017104, 0x6063625C, 0x07D532A2, 0x0EB58FE4,
0x2448641C, 0xE6808905, 0x67F3E5C5, 0xBF7F666C,
0x7F3C655C, 0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6,
0x000B69F6, 0xD11C68F6, 0x6012D21C, 0xCB20E405,
0x2102E500, 0x000B2242, 0x00002252, 0x001E1017,
0x001164F6, 0x001E1015, 0x001E10BF, 0x00117800,
0x001E10FC, 0x001140CC, 0x001164FC, 0x0011602E,
0x001166D0, 0x00114F2C, 0x001166EC, 0x00114EBE,
0x0011788C, 0x001164F8, 0x001160DC, 0x001145BC,
0x001E2130, 0x00115FF0, 0x001166F4, 0x00116510,
0x00116518, 0x00116710, 0x001C3500, 0x001D4004,
0xD565D164, 0xE400D765, 0x2142E20F, 0x17411154,
0xD5632722, 0x9669D763, 0x15412572, 0x96661562,
0xE6011565, 0xD5601165, 0x666CE6F8, 0x25422542,
0x25422542, 0x25422542, 0x25622542, 0x7601E727,
0x67632572, 0x25627797, 0xE7042572, 0x2572E248,
0xE2192522, 0xE2702522, 0x25422542, 0x25422542,
0x25222542, 0x2522E20C, 0x25422542, 0x25422542,
0x25422542, 0x25422542, 0x000B154A, 0xE2081145,
0x0009422B, 0x2FE62FD6, 0x7FFC4F22, 0xC8206043,
0x6E438D02, 0x0009BE75, 0xC81060E3, 0xBE728901,
0x60E30009, 0x8901C840, 0x0009BE94, 0xC80160E3,
0xDD3E8938, 0xC80260D0, 0x2F008D03, 0x460BD63C,
0x60F00009, 0x8902C804, 0x460BD63A, 0x62F00009,
0xC8806023, 0x60D08902, 0x2D00C97F, 0xC8016023,
0xD6358906, 0x0009460B, 0x0009A007, 0x51630601,
0x8902C808, 0x460BD631, 0x60F00009, 0x8902C810,
0x420BD22F, 0xD52F0009, 0x88026052, 0xD22E8B03,
0xA005E604, 0x88012260, 0xD22B8B02, 0x2260E601,
0x2522E200, 0xC88060E3, 0xD628892E, 0x60E36E60,
0x8902C880, 0x420BD226, 0x60E30009, 0x8902C840,
0x420BD224, 0x60E30009, 0x8902C802, 0x420BD222,
0x60E30009, 0x890EC804, 0x410BD120, 0xBF120009,
0xBF4D0009, 0xD51E0009, 0x6050D41E, 0xC908D71E,
0xBF842500, 0x60E32472, 0x8905C808, 0x7F04D21B,
0x6EF64F26, 0x6DF6422B, 0x4F267F04, 0x000B6EF6,
0x00006DF6, 0x001C581C, 0xA000A000, 0x001D0100,
0x001D4000, 0x00040021, 0x001C589C, 0x001E1021,
0x001150C4, 0x001150E6, 0x00115724, 0x001150FE,
0x0011510C, 0x00116574, 0x001E100B, 0x001E1028,
0x00115162, 0x0011516E, 0x00115114, 0x00115132,
0x001E1000, 0x0010F100, 0x12345678, 0x0011514A,
0x644CD6A7, 0x000B346C, 0xD6A62450, 0x346C644C,
0x2450000B, 0x644CD6A4, 0x000B346C, 0x625C2450,
0x4208616D, 0x42084119, 0x42006019, 0x670E614C,
0xD49E321C, 0x4200207D, 0x324CC90F, 0x2200000B,
0x4208625C, 0x42004208, 0x324C644C, 0x4200D498,
0x000B324C, 0x2FE62260, 0x614C4F12, 0x4100D493,
0x6710314C, 0xE29F666D, 0x27294619, 0x6E536269,
0x672E6573, 0x4221227D, 0x42214221, 0x7601662C,
0xE4014608, 0x34E84608, 0x644C4600, 0x071A0467,
0x2150257B, 0x000B4F16, 0x4F226EF6, 0xD2857FE8,
0x88016021, 0xD2848B7B, 0x26686621, 0xD2838B77,
0x26686621, 0xE50F8B73, 0xE401BFA2, 0xBFA4E501,
0xE586E400, 0xE400655C, 0x2F50BFA4, 0xBFA1E401,
0xE602E506, 0x60634618, 0x81F2E401, 0x6543BF9F,
0xE40185F2, 0xBFAB6543, 0x85F26603, 0x6543E401,
0x6603BFB1, 0xE40265F0, 0x6053756C, 0x80F8BF80,
0xBF82E402, 0x84F8E512, 0x7090E402, 0x6503BF82,
0x4618E602, 0x81F66063, 0xBF80E402, 0x85F6E500,
0x6603E402, 0xE500BF8C, 0xE40285F6, 0xBF926603,
0xE5FEE500, 0xE010655C, 0xBF61E403, 0xE5130F54,
0xE40EBF63, 0x05FCE010, 0xBF63E40E, 0xE5007585,
0xBF64E403, 0xE500E640, 0xBF71E403, 0xE500E640,
0xBF78E403, 0xE5FFE640, 0xE014655C, 0xBF47E404,
0xE40F0F54, 0xE504BF49, 0x05FCE014, 0xBF49E40F,
0xE5017584, 0xBF4AE640, 0xE501E404, 0xBF57E640,
0xE501E404, 0xE404E640, 0xAF5C7F18, 0x7F184F26,
0x000B4F26, 0x4F220009, 0xD2427FF0, 0x88016021,
0xD2418B71, 0x26686621, 0xD2408B6D, 0x26686621,
0xE50F8B69, 0xE401BF1C, 0xBF1EE501, 0xE586E400,
0xE400655C, 0x2F50BF1E, 0xBF1BE401, 0xE401E506,
0xBF1C6543, 0xE401E640, 0xBF296543, 0xE401E640,
0xBF306543, 0x65F0E640, 0x756CE402, 0xBEFF6053,
0xE40280F4, 0xE512BF01, 0xE40284F4, 0xBF017090,
0xE6406503, 0xBF02E402, 0xE640E500, 0xBF0FE402,
0xE640E500, 0xBF16E402, 0xE5FEE500, 0x6053655C,
0xBEE5E403, 0xE51380F8, 0xE40EBEE7, 0xE40E84F8,
0xBEE77085, 0xE5006503, 0xBEE8E640, 0xE500E403,
0xBEF5E640, 0xE500E403, 0xBEFCE640, 0xE5FFE403,
0x6053655C, 0xBECBE404, 0xE40F80FC, 0xE504BECD,
0xE40F84FC, 0xBECD7083, 0xE5016503, 0xBECEE640,
0xE501E404, 0xBEDBE640, 0xE501E404, 0xE404E640,
0xAEE07F10, 0x7F104F26, 0x000B4F26, 0x00000009,
0x001E102F, 0x001E1080, 0x001E1090, 0x001E103F,
0x001E103E, 0x0011656E, 0x00116570, 0x00116572,
0xD21DD11C, 0x66206010, 0x676C7001, 0x3700C90F,
0xE5008D13, 0x67106210, 0x7701622C, 0x64232170,
0xD6166010, 0x44084408, 0x3428C90F, 0x62602100,
0x7201D513, 0x44082620, 0x000B354C, 0xD10F6053,
0x25586510, 0xE6008D13, 0xD60DD40B, 0x655C6540,
0x47086753, 0x37584708, 0x47086540, 0x24507501,
0x367C6040, 0x2400C90F, 0x72FF6210, 0x000B2120,
0x00006063, 0x001164F5, 0x001164F4, 0x001164F6,
0x0011611C, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x544F0D0A, 0x53205355, 0x46204950,
0x00003A57, 0x2074634F, 0x32203220, 0x20373030,
0x333A3831, 0x36343A32, 0x00000000, 0x00000D0A,
0x42707372, 0x3D206675, 0x554E203D, 0x202C4C4C,
0x6E49677A, 0x4E497274, 0x6D754E51, 0x0000003D,
0x52504545, 0x57204D4F, 0x65746972, 0x6461202C,
0x003D7264, 0x6C617620, 0x0000003D, 0x00000A0D,
0x5A205746, 0x4D435F4D, 0x4C465F44, 0x5F485341,
0x53415245, 0x000A0D45, 0x5A205746, 0x4D435F4D,
0x4C465F44, 0x5F485341, 0x534B4843, 0x0A0D4D55,
0x00000000, 0x2D495053, 0x72646461, 0x0000003D,
0x2D495053, 0x676E656C, 0x003D6874, 0x2D495053,
0x736B6863, 0x003D6D75, 0x5A205746, 0x4D435F4D,
0x4C465F44, 0x5F485341, 0x44414552, 0x00000A0D,
0x61202072, 0x3D726464, 0x00000000, 0x72202020,
0x75427073, 0x00003D66, 0x6E6B6E55, 0x206E776F,
0x6D6D6F63, 0x3D646E61, 0x00000000, 0x00000072,
0x00205220, 0x00000D0A, 0x62735576, 0x7473725F,
0x00000A0D, 0x62735576, 0x7375735F, 0x646E6570,
0x00000A0D, 0x62735576, 0x7365725F, 0x000A0D6D,
0x72746E49, 0x6D652051, 0x2C797470, 0x49677A20,
0x4972746E, 0x754E514E, 0x00003D6D, 0x654C7245,
0x0000006E, 0x20746F4E, 0x756F6E65, 0x49206867,
0x4220514E, 0x0A0D6675, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x002E0209, 0x80000101,
0x000409FA, 0x00FF0400, 0x05070000, 0x02000201,
0x82050700, 0x00020002, 0x03830507, 0x07010040,
0x40020405, 0x02090000, 0x0101002E, 0x09FA8000,
0x04000004, 0x000000FF, 0x02010507, 0x07000040,
0x40028205, 0x05070000, 0x00400383, 0x04050701,
0x00004002, 0x00000000, 0x00000000, 0x07090000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, };
const u32_t zcFwImageSPISize=10156;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,742 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "cprecomp.h"
const u32_t zcFwImage[] = {
0x0009000B, 0x4F222FE6, 0xDE297FFC, 0xE114D729,
0x1E13D429, 0x1E4C470B, 0x0009B018, 0xA0039545,
0x3652E600, 0x76018D04, 0xC84060E2, 0x2F028DF9,
0xDE23D422, 0x00094E0B, 0x4E0BD422, 0xD4220009,
0x00094E0B, 0x4F267F04, 0x6EF6A024, 0xD11F4F22,
0x0009410B, 0x440BD41E, 0xD51E0009, 0x0009450B,
0xE1FFD71D, 0xD21D611D, 0x50292712, 0xCB01D41C,
0xE501E1FF, 0x22121209, 0x24521211, 0xD61AD519,
0xE2009714, 0xD4192572, 0xD6192620, 0x4F262422,
0x2622000B, 0xDD18DC17, 0x4C0BDE18, 0x4D0B0009,
0x4E0B0009, 0xAFF80009, 0x27100009, 0x00000640,
0x001C001C, 0x00200BC4, 0x0000B38E, 0x002029F8,
0x00200F72, 0x00202A04, 0x00202A1C, 0x00200F20,
0x00201056, 0x00200C1C, 0x001C3510, 0x001C3624,
0x001E212C, 0x00202994, 0x00202530, 0x0020299C,
0x002029A8, 0x00200E50, 0x002023E6, 0x00201920,
0x2FC62F96, 0x2FE62FD6, 0x7F904F22, 0xE020DE8D,
0xD48D61E0, 0x61E30F14, 0x62107101, 0xE024D78B,
0x0F24470B, 0x450BD58A, 0x20080009, 0x8F116D03,
0xDD881F0A, 0x67D0D488, 0x410BD188, 0xD288657C,
0x6920DD88, 0x66C36C9C, 0x46084608, 0x460836C8,
0x1FDA3D6C, 0x04FCE024, 0x66E2E580, 0x655C604C,
0x8F163050, 0xE0202D62, 0xE50001FC, 0xDE7E641C,
0x3243625D, 0xA32C8B01, 0x655D0009, 0x36EC6653,
0xE02C6760, 0x69530F74, 0x39DC607E, 0xAFEF8094,
0x20087501, 0xE0208B14, 0xE50001FC, 0xA00ADE72,
0x655D641C, 0x39EC6953, 0x67536C92, 0x37DC62C2,
0x75041721, 0x625D1F2C, 0x8BF23243, 0x2D10A309,
0x8B178801, 0x01FCE020, 0x2D70E700, 0x1FD76D1C,
0x627DDE65, 0x8B0132D3, 0x0009A2FB, 0x65E3677D,
0x75046673, 0x36EC6C73, 0x64623C5C, 0x770869C2,
0x2492AFEF, 0x8B188804, 0x01FCE020, 0x2D40E400,
0xDE59671C, 0x3273624D, 0xA2E28B01, 0x644D0009,
0x6CE36D43, 0x65D23DEC, 0x61437C04, 0x621231CC,
0x74086952, 0xAFED2929, 0x88052592, 0xE0208B18,
0xE40001FC, 0x671C2D40, 0x624DDE4B, 0x8B013273,
0x0009A2C7, 0x6943644D, 0x39EC61E3, 0x71046592,
0x3C1C6C43, 0x6D5262C2, 0x2D2B7408, 0x25D2AFED,
0x8B1B8831, 0xD942D241, 0x72046422, 0x72046622,
0x72046722, 0x72E86C22, 0x1F2E1F4D, 0x72046422,
0x72046E22, 0x652229E0, 0x2950D93A, 0xDE3A2FC6,
0x55FE4E0B, 0xE2007F04, 0x2D20A29B, 0x8B1D8830,
0xDE33D232, 0x72046522, 0x72046122, 0x72046722,
0x72E86922, 0x72046422, 0x72046C22, 0x6E222EC0,
0x1F9FD62C, 0x7FFC26E0, 0x09FEE040, 0x2F92DC2B,
0x66134C0B, 0xE2007F04, 0x2D20A27B, 0x89018828,
0x0009A109, 0xE143DE20, 0xE04062E1, 0x3617662D,
0x0FE68F03, 0x660302FE, 0x36172201, 0xA0F38B01,
0xE0400009, 0xE50104FE, 0x30568541, 0xA0EB8B01,
0xE0400009, 0x09FEE701, 0xB2612D70, 0xE0406491,
0xE1430CFE, 0xE06862C1, 0x3517652D, 0x0F568D68,
0x3563E640, 0xE6008B24, 0x0F65E048, 0xA02EE11A,
0x000072C0, 0x00117800, 0x00202A20, 0x00200F72,
0x00201FDC, 0x002029B0, 0x00202A24, 0x00200FBC,
0x002029AF, 0x002025D4, 0x00117804, 0x00117810,
0x002029AC, 0x002029AD, 0x00200948, 0x00200994,
0x41216153, 0x41214121, 0x41214121, 0x45214521,
0x60534521, 0x6603C903, 0x0F65E048, 0xE0077118,
0xE0442209, 0x641D0F25, 0x65F3E04C, 0x0F46B291,
0x0EFDE048, 0x0DFDE044, 0x61DD67ED, 0x41084708,
0x0F16E050, 0xDD946073, 0x4D0B06FE, 0x6E07E00F,
0x607326E9, 0xE0400F66, 0x65F30CFE, 0x690D85C2,
0x01FEE050, 0x60934D0B, 0x6073260B, 0xE04C0F66,
0x04FEB256, 0x07FEE040, 0x6271E068, 0x0F56652D,
0x3563E640, 0xED008954, 0x0FD5E064, 0xC9036023,
0x40004008, 0x61036903, 0x0F96E054, 0xDE7EE058,
0x0FF6ECFF, 0xE06C6CCC, 0x60C30FE6, 0x62534E0B,
0x42214221, 0x42214221, 0x42006723, 0x6107327C,
0x4200E05C, 0x0F164521, 0x4521E040, 0x60530CFE,
0x4008C903, 0x7C0630FC, 0x6E031FC6, 0x1FD56D2D,
0x1F04A01E, 0x0FD6E060, 0x05FEE058, 0x64D3B231,
0x62E2E05C, 0xE05409FE, 0x2E222299, 0x64D361C4,
0x01FE661C, 0x07FEE06C, 0x6063470B, 0xE058220B,
0xB20505FE, 0xE0642E22, 0x7D0102FD, 0x0F257201,
0x02FDE064, 0x3262E606, 0xE0408BDC, 0x626106FE,
0x05FEE040, 0x85514200, 0x302C750C, 0x6103701B,
0x64F3E600, 0xE704A004, 0x76016256, 0x74042422,
0x3273626D, 0x65F38BF8, 0x641DB1E2, 0x06FEE040,
0x6461B19E, 0x0009A175, 0xD74DD44C, 0x470BE201,
0xA16E2D20, 0x88290009, 0xDE4A8B07, 0x2D20E200,
0xB16D66E2, 0xA164646D, 0xE2810009, 0x3020622C,
0xA0A78B01, 0xE0240009, 0x626C06FC, 0x666CE682,
0x8B213260, 0xE42452FA, 0xD43F2240, 0x12615647,
0x12625648, 0x12635649, 0x1264564A, 0x1265564B,
0x1266564C, 0x1267564D, 0x1268564E, 0x1269564F,
0x1427E200, 0x14291428, 0x142B142A, 0x142D142C,
0x142F142E, 0x1F6CA135, 0x666CE683, 0x8B073260,
0xE60052FA, 0xD22B2260, 0x6222D62C, 0x2622A129,
0x666CE690, 0x8B183260, 0xE60052FA, 0xD2282260,
0x6022E605, 0x2202CB20, 0x2262D226, 0x2262E600,
0x460BD625, 0xD2250009, 0x0009420B, 0xE601D224,
0xD2242262, 0xA10C4618, 0xE6B02262, 0x3260666C,
0xD5188B22, 0xD216D420, 0x75046D52, 0x6E52420B,
0x420BD21E, 0xD41E64D3, 0x450BD511, 0xD21B0009,
0x64E3420B, 0xD60ED41B, 0x0009460B, 0xE600E504,
0x3253626D, 0xA0EC8B01, 0x666D0009, 0x326C62D3,
0x22E07601, 0x4E19AFF4, 0xD214D413, 0xD4146542,
0x0009420B, 0x0009A0DD, 0x0020248C, 0x00202A44,
0x00200F72, 0x00117804, 0x00202538, 0x00202994,
0x001C3500, 0x001D4004, 0x00201056, 0x00200C1C,
0x001E212C, 0x001C3D30, 0x00202A5C, 0x00200FB4,
0x00202A70, 0x00202A78, 0x00117800, 0x00200FBC,
0x00202A7C, 0xD6AED4AD, 0x6262E040, 0x76046542,
0x2452352C, 0x62626563, 0x75045641, 0x1461362C,
0x62526653, 0x76085542, 0x1452352C, 0x55436262,
0x352C76EC, 0x65631453, 0x56446262, 0x362C7510,
0x66531464, 0x55456252, 0x352C7610, 0x65621455,
0xD69C5246, 0x1426325C, 0x55476262, 0x352C7604,
0x62621457, 0x76045548, 0x1458352C, 0x62626563,
0x75045649, 0x1469362C, 0x564A6252, 0x362C7504,
0x6653146A, 0x554B6252, 0x352C7604, 0x6262145B,
0x7604554C, 0x145C352C, 0x62626563, 0x7504564D,
0x146D362C, 0x62526653, 0x7604554E, 0x145E352C,
0x524F6562, 0x325CD684, 0x6262142F, 0x7694054E,
0x0456352C, 0x6263E044, 0x054E6662, 0x356C7244,
0xE0480456, 0x054E6622, 0xD67C356C, 0x62620456,
0x054EE054, 0x352C4229, 0x76040456, 0xE0586262,
0x4229064E, 0x52FA362C, 0xE6380466, 0xE0442260,
0xE048064E, 0x66421261, 0x56411262, 0x56421263,
0x56451264, 0x56431265, 0x56461266, 0x064E1267,
0x1268E040, 0xE050064E, 0x56441269, 0x064E126A,
0x126BE04C, 0xE054064E, 0x064E126C, 0x126DE058,
0xE044064E, 0xE200126E, 0xE0480426, 0x14212422,
0x14251422, 0x14261423, 0xE0400426, 0xE0500426,
0x04261424, 0x0426E04C, 0x0426E054, 0x0426E058,
0x7F701F6C, 0x6EF64F26, 0x6CF66DF6, 0x69F6000B,
0x614D4F22, 0x3123E240, 0xE21F8917, 0x89083127,
0xD550D44F, 0x450BE001, 0x67076642, 0xA00C2679,
0xE23F2462, 0x89083127, 0xD64AD749, 0xE00171E0,
0x5571460B, 0x25296207, 0x4F261751, 0x0009000B,
0x614D4F22, 0x3123E240, 0xE21F8915, 0x89073127,
0xD240D43F, 0x420B6642, 0x260BE001, 0x2462A00B,
0x3127E23F, 0xD73A8907, 0x5571D63A, 0x460B71E0,
0x250BE001, 0x4F261751, 0x0009000B, 0x4618E640,
0xD5354628, 0x22686252, 0x000B89FC, 0xE6800009,
0x46284618, 0x6252D530, 0x89FC2268, 0x0009000B,
0xE200A001, 0x32427201, 0x000B8BFC, 0xE6800009,
0x46284618, 0x6252D529, 0x8BFC2268, 0x0009000B,
0x4F222FE6, 0x6E537FFC, 0x2F42BFF1, 0xD62461E2,
0x1615E280, 0x421854E1, 0x55E21646, 0x16574228,
0x6EF257E3, 0x2E2B1678, 0x7F0426E2, 0xAFCE4F26,
0x2FC66EF6, 0x2FE62FD6, 0xDD194F22, 0xBFD66C53,
0xBFBB6E43, 0xBFD22DE2, 0x51D50009, 0x54D62C12,
0x55D71C41, 0x56D81C52, 0x4F261C63, 0x6DF66EF6,
0x6CF6000B, 0xE6006163, 0x4109A004, 0x76016256,
0x74042422, 0x8BF93612, 0x0009000B, 0x00202538,
0x001C36A0, 0x001C3CA0, 0x001C36F4, 0x001C3B88,
0x001C3704, 0x0020248C, 0x001C373C, 0x001C3700,
0x001C370C, 0x0009A109, 0x2FD62FC6, 0x4F222FE6,
0x6E636D73, 0x6C53B016, 0x64C357F4, 0xB02965E3,
0xB03D66D3, 0xB06D0009, 0xB0710009, 0xB0750009,
0xB08A0009, 0xB08D0009, 0x4F260009, 0x6DF66EF6,
0x6CF6A0B4, 0x3412D190, 0xD6900529, 0x2650D790,
0x2742000B, 0x2FD62FC6, 0x4F222FE6, 0x6E636D73,
0x6C53BFF0, 0x64C357F4, 0x66D365E3, 0x6EF64F26,
0x6CF66DF6, 0xD1872FE6, 0x66126E63, 0x92BC4418,
0x44084528, 0x45002629, 0x265B4408, 0x264B4400,
0x21624708, 0xD1804708, 0x217227EB, 0x6EF6000B,
0x4F222FE6, 0xE101DE7D, 0xBFABE40A, 0x62E32E12,
0xE100726C, 0x2212E401, 0x22122212, 0x22122212,
0x22422212, 0xE503E730, 0x2212E40A, 0x22122212,
0x22122212, 0x22122212, 0x22122212, 0x22122212,
0x22722212, 0x22122252, 0x22122212, 0x22122212,
0x22122212, 0xBF852212, 0xE600121A, 0x4F262E62,
0x6EF6000B, 0xE101D266, 0x2212E441, 0x2242000B,
0xD465D164, 0x2162E605, 0x2462000B, 0xD264D563,
0x88016050, 0xD4638B07, 0x60409668, 0x8B098801,
0xA0079665, 0xE6000009, 0x2262D45E, 0x88016040,
0xE6048B00, 0xAF5DE40A, 0xD25B2262, 0xE40AE601,
0x2262AF58, 0x2FC62FB6, 0x2FE62FD6, 0xDC574F22,
0x60C2ED00, 0xCB01EB64, 0x60C22C02, 0xA008C901,
0x3DB26E03, 0x60C28907, 0xC901E40A, 0x6E03BF42,
0x2EE87D01, 0x3DB28BF5, 0xD44D8B03, 0x420BD24D,
0xE40A0009, 0x6EF64F26, 0x6CF66DF6, 0x6BF6AF32,
0x8F014411, 0x6043604B, 0x0009000B, 0x2FC62FB6,
0x2FE62FD6, 0x7FFC4F22, 0xED00DC40, 0xEB6460C2,
0x2C02CB02, 0x2F0260C2, 0xA009C902, 0x3DB36E03,
0x60C28908, 0x2F02E40A, 0xBF13C902, 0x7D016E03,
0x8BF42EE8, 0x8B0B3DB3, 0xD236D437, 0x4F267F04,
0x6DF66EF6, 0x422B6CF6, 0x1FFF6BF6, 0x03C40340,
0x4F267F04, 0x6DF66EF6, 0x000B6CF6, 0xD52F6BF6,
0x60525651, 0x000B4628, 0x2FB6306C, 0x2FD62FC6,
0x4F222FE6, 0x4F024F12, 0x6E43BFF1, 0xDC286B03,
0xBFECDD28, 0x30B80009, 0x060A3C05, 0x46094609,
0x3D654601, 0x4209020A, 0x42094209, 0x8BF032E2,
0x4F164F06, 0x6EF64F26, 0x6CF66DF6, 0x6BF6000B,
0x4F222FE6, 0xE102DE1C, 0xE403E500, 0xBFD42E12,
0xE6062E52, 0xE7004618, 0x2E62E403, 0x4F262E72,
0x6EF6AFCB, 0x0009000B, 0x0025E720, 0x00202C3C,
0x00202998, 0x001C5814, 0x001C59D0, 0x001C5830,
0x001C6268, 0x001C59A4, 0x001C639C, 0x002029AD,
0x001C5804, 0x002029AC, 0x001C581C, 0x001C5860,
0x00202A90, 0x00200F72, 0x00202AA8, 0x001C1040,
0xCCCCCCCD, 0x10624DD3, 0x001D4004, 0x2F962F86,
0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6, 0xE4007FE0,
0x4528E510, 0x67436C43, 0xE108A00F, 0x6043644D,
0x0F564008, 0xEE0060C3, 0x815125C1, 0x81538152,
0x157315E2, 0x751415E4, 0x624D7401, 0x8BED3213,
0xDA7251F1, 0x1A1154F2, 0xD1712A12, 0x56F455F3,
0x58F657F5, 0x21421141, 0x11521153, 0x11641165,
0x11761177, 0x11881189, 0xD96A6DF2, 0xDB6A52F7,
0x29D219D1, 0x2B221B21, 0xD868EB45, 0xE9B8EA50,
0x4A084B08, 0xA020699C, 0x6EEDEE00, 0x61E36DE3,
0x41084D08, 0x31EC3DEC, 0x41084D08, 0x60C33D8C,
0xD75F4108, 0x81D12DC1, 0x410860A3, 0x60C381D2,
0xE200317C, 0x81D33492, 0x1D131DD2, 0x8D01D456,
0xD4521D24, 0x65D3B03C, 0x64ED7E01, 0x8BDC34B2,
0xDB54D14E, 0xD24F6512, 0x1B514529, 0xD14C6412,
0x2B72674D, 0xD6506722, 0x1B734729, 0x2FD26922,
0x1B82689D, 0x26926912, 0x16A25A12, 0xDA465B14,
0x5C1616B4, 0x5D1816C6, 0x6EA216D8, 0x7F2016EA,
0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6, 0x000B69F6,
0x664268F6, 0xC8036061, 0xE5008D04, 0xC9036061,
0x8B038802, 0x65635262, 0x24125124, 0x6053000B,
0x2FE62FD6, 0x7FEC4F22, 0x62536E53, 0x6D43E550,
0x4508E400, 0xE101A001, 0x60435224, 0x81212211,
0x60538123, 0x56E28122, 0x8BF53620, 0x16E4D22F,
0xE61464F3, 0x65E3420B, 0xE4FC65E1, 0x2E512549,
0x65F361F1, 0x2F112149, 0xD12854D1, 0xE614410B,
0x607157D1, 0x2701CB01, 0x7F141DE1, 0x6EF64F26,
0x6DF6000B, 0x2FE62FD6, 0x7FEC4F22, 0x66536E53,
0x6D43E5FC, 0x20596061, 0x2601CB01, 0x326052E2,
0x12E48B06, 0x31E051E2, 0x52D18B04, 0x1E22A002,
0x5664AFF0, 0x64F3D215, 0x420BE614, 0x67E165E3,
0x2719E1FC, 0x67F12E71, 0x271954D1, 0x65F3D10F,
0x410BE614, 0x52D12F71, 0xCB016021, 0x1DE12201,
0x4F267F14, 0x000B6EF6, 0x00006DF6, 0x0020259C,
0x002025A4, 0x00202594, 0x002025CC, 0x001000A0,
0x00101640, 0x001E2108, 0x001C3D00, 0x00200904,
0x2FC62FB6, 0x2FE62FD6, 0x7FFC4F22, 0x6022D225,
0x8D35C803, 0xDE242F01, 0xDB25DC24, 0xED01A016,
0xC9036061, 0x89158801, 0xD122D420, 0x0009410B,
0x65035603, 0xC8208561, 0xE0508903, 0x720102BE,
0xD21D0B26, 0x64E3420B, 0x21D2D11C, 0x66C252C1,
0x8BE53620, 0xDD1AEE01, 0x4E18A00E, 0xC9036061,
0x890D8801, 0xD713D416, 0x470BDB16, 0xD4160009,
0x65034B0B, 0x21E2D111, 0x66D252D1, 0x8BED3620,
0xC80460F1, 0xD2118907, 0x4F267F04, 0x6DF66EF6,
0x422B6CF6, 0x7F046BF6, 0x6EF64F26, 0x6CF66DF6,
0x6BF6000B, 0x001E2100, 0x002025A4, 0x0020259C,
0x00202538, 0x00200D42, 0x00200DC4, 0x001C3D30,
0x00202594, 0x00200D60, 0x002025CC, 0x00200100,
0xE601D203, 0x1265D503, 0x000B2252, 0x00001266,
0x001C1010, 0x0000C34F, 0xD62A7FFC, 0x2642644C,
0xC8205066, 0x2F028DFC, 0x7F04000B, 0x2FD62FC6,
0x4F222FE6, 0x6D436C53, 0xEE00A004, 0x7E0164D4,
0x644CBFEA, 0x8BF93EC2, 0x6EF64F26, 0x000B6DF6,
0xA0016CF6, 0x76016643, 0x22286260, 0x36488BFB,
0x6563AFE4, 0x62532FE6, 0x67537507, 0xEE0AE108,
0xC90F6043, 0x30E24409, 0x44096503, 0xE6378D01,
0x365CE630, 0x27604110, 0x77FF8FF2, 0x8028E000,
0x6EF6000B, 0xE000000B, 0xE000000B, 0x4F222FE6,
0x62537FEC, 0x65F36E43, 0x6423BFDC, 0x64E3BFD1,
0x64F3BFCF, 0xBFCCD404, 0x7F140009, 0x000B4F26,
0x00006EF6, 0x001C0004, 0x00202AC4, 0xE110D5A1,
0xE6406050, 0x2500C9FD, 0xE0FF75E9, 0x80516453,
0x80538052, 0x80568055, 0x251075EF, 0xE1EF6250,
0x2219E001, 0xE7202520, 0x24608052, 0x2570000B,
0xE4FDD595, 0xE7026152, 0x25122149, 0x74016052,
0x2502CB01, 0xD1916652, 0x25622649, 0x92C46012,
0x2102CB08, 0xC9CF6012, 0x60122102, 0x2102CB03,
0x000B1172, 0x4F221123, 0xD78AD589, 0xD48BD28A,
0xE600E100, 0x27112511, 0xBFBF2210, 0xAFD72461,
0x664C4F26, 0x4600D286, 0x6060362C, 0x000BCB10,
0x654C2600, 0x4500D282, 0x6650352C, 0x2619E1EF,
0x2560000B, 0xD27F664C, 0x362C4600, 0xCB106060,
0x2600000B, 0xD27B654C, 0x352C4500, 0xE1EF6650,
0x000B2619, 0x664C2560, 0x4600D275, 0x6060362C,
0x000BCB08, 0x654C2600, 0x4500D271, 0x6650352C,
0x2619E1F7, 0x2560000B, 0xD26E664C, 0x362C4600,
0xCB086060, 0x2600000B, 0xD26A654C, 0x352C4500,
0xE1F76650, 0x000B2619, 0x624C2560, 0x4200D664,
0x6020326C, 0x4021C908, 0x40214021, 0x600C000B,
0xD660624C, 0x326C4200, 0xC9086020, 0x40214021,
0x000B4021, 0x644C600C, 0x74FFD15B, 0x6240341C,
0x602C000B, 0x644CD159, 0x6240341C, 0x602C000B,
0x4F222FE6, 0xE60A655C, 0x8D153567, 0xBFEA6E43,
0x640C6453, 0x880160EC, 0xE00F8B02, 0x2409A002,
0x44094409, 0xE60A624C, 0x89053263, 0x644CBFE2,
0x6023620C, 0x8B00C880, 0x6023E200, 0x000B4F26,
0x4F226EF6, 0x6062D646, 0x8B038801, 0x0009B241,
0x0009A003, 0xE640D243, 0xD6432260, 0x4F26E200,
0x2622000B, 0xD63E4F22, 0x88026062, 0xB28B8B01,
0xD63D0009, 0x4F26E200, 0x2622000B, 0xD439D538,
0xE701E100, 0x000B2512, 0x0FFF2470, 0xE604D235,
0x2260000B, 0xD4354F22, 0x410BD135, 0xD5250009,
0x6650E1FD, 0x2619D233, 0x2560E700, 0x000B4F26,
0x4F222270, 0xD12ED430, 0x0009410B, 0xE7FBD51D,
0x26796650, 0x000B4F26, 0x4F222560, 0xD128D42B,
0x0009410B, 0xE7F7D517, 0x26796650, 0x000B4F26,
0xD5142560, 0x62509425, 0x000B2249, 0xD5112520,
0x6250E4BF, 0x000B2249, 0x4F222520, 0x8522D220,
0x2008600D, 0x88018911, 0x8803893C, 0x8805893E,
0x88068940, 0x88088946, 0x8809894C, 0x880A8952,
0x880B8958, 0xA065895E, 0xB0670009, 0xA0620009,
0xFF7F600C, 0x001E1028, 0x001E2148, 0x001E1108,
0x002029DC, 0x002029DE, 0x002029E9, 0x002029C0,
0x001E103F, 0x001E105F, 0x001E1030, 0x001E1090,
0x002029E4, 0x001E100B, 0x002029E0, 0x00202AC8,
0x00200F72, 0x002029E8, 0x00202AD4, 0x00202AE4,
0x002029B4, 0x0009B04C, 0x600CA035, 0x0009B056,
0x600CA031, 0x6260D67C, 0x8B2B2228, 0x0009B062,
0x600CA029, 0x6260D678, 0x8B232228, 0x0009B06A,
0x600CA021, 0x6260D674, 0x8B1B2228, 0x0009B0B4,
0x600CA019, 0x6260D670, 0x8B132228, 0x0009B0BA,
0x600CA011, 0x6260D66C, 0x8B0B2228, 0x0009B11A,
0x600CA009, 0x6260D668, 0x8B032228, 0x0009B132,
0x600CA001, 0x4F26E000, 0x0009000B, 0xD264D163,
0xD5648412, 0x4000C90F, 0xD763012D, 0x611CE403,
0xD662E20F, 0x27122540, 0xE0012520, 0x2602000B,
0xE601D25A, 0x30668523, 0xE0008D06, 0xE000D258,
0x8122D65A, 0x2602E001, 0x0009000B, 0x8523D253,
0x2008600D, 0x88018905, 0xD6558B0A, 0xCB016060,
0xD6522600, 0xE101D44E, 0x2612E001, 0x8142000B,
0xE000000B, 0xE501D149, 0x45188513, 0x3453640D,
0x8D056603, 0xD24BE000, 0xE001D548, 0x25022260,
0x0009000B, 0xD1414F22, 0x650D8513, 0x44196453,
0x672E6249, 0x602C227D, 0x89098801, 0x890C8802,
0x89108803, 0x89268806, 0x89298807, 0x0009A038,
0xD63ED53D, 0xA027E212, 0x625C2652, 0x8B2F2228,
0xA01ED63B, 0x605C6262, 0x89052008, 0x89088810,
0x890B8820, 0x0009A024, 0xD634D436, 0xA013E204,
0xD7352642, 0xE20CD631, 0x2672A00E, 0xD62FD533,
0xA009E218, 0xD4322652, 0xE20AD62C, 0x2642A004,
0xD62AD230, 0xE22E2622, 0xD42F8515, 0x3277670D,
0x8F012421, 0x24516503, 0x0009B0DB, 0xE001A001,
0x4F26E000, 0x0009000B, 0xE101D61A, 0x2610D427,
0xD7196541, 0x655DD119, 0xE001E20F, 0x26202752,
0x2102000B, 0x4F222FE6, 0x8523D210, 0x2448640C,
0xD61E8B08, 0xE200D512, 0x84512621, 0x20499412,
0x8051A050, 0x60E0DE0E, 0x8D35C840, 0x3427E201,
0xD116894C, 0x420BD216, 0xD5162141, 0xCB046052,
0x2502A035, 0x0000FF7F, 0x002029E9, 0x002029B4,
0x002029C0, 0x001E1100, 0x001E100C, 0x002029E0,
0x001E1000, 0x001E1001, 0x00202C40, 0x002029C8,
0x002029D0, 0x00202CAE, 0x00202CB2, 0x00202CBE,
0x00202CD6, 0x00202CE0, 0x002029CC, 0x002029DA,
0x00201DB6, 0x001E1108, 0x89173427, 0xD794D293,
0x2241470B, 0xE5FBD693, 0x21596162, 0x84E12612,
0xB0FFCB80, 0x60E080E1, 0xCB04D68F, 0x60602E00,
0x2600C93F, 0xE001D68D, 0x2602A001, 0x4F26E000,
0x6EF6000B, 0x6060D68A, 0x8919C880, 0x6021D283,
0x8B158801, 0xE501D287, 0x30568524, 0xD1868910,
0xD486E203, 0x65412120, 0x655DE00B, 0xD5840656,
0xE702E40F, 0x25712140, 0xE001D77C, 0x2702000B,
0xE000000B, 0x4F222FE6, 0x84E1DE7E, 0x8934C880,
0x8554D578, 0x8F302008, 0xD77B6103, 0x66728553,
0x650C6403, 0x620C8566, 0x8B263520, 0xD773D677,
0x644C651C, 0x27412651, 0xC84060E0, 0xD2748907,
0x0009420B, 0x6062D667, 0xA008CB04, 0xD1642602,
0x0009410B, 0xE5FBD663, 0x24596462, 0xB0A12642,
0xD5620009, 0x2522E201, 0xD75F60E0, 0x2E00CB04,
0xC93F6070, 0xA0012700, 0xE0006023, 0x000B4F26,
0x2FA66EF6, 0x2FC62FB6, 0x2FE62FD6, 0xE240DA5C,
0xDC5966A1, 0x3123616D, 0x62638900, 0x6ED36D2C,
0x4E2136D8, 0x4E212A61, 0xDB5BD45A, 0xE700A00F,
0x770166B2, 0x71026163, 0x65612B12, 0x71026613,
0x62612B12, 0x622D655D, 0x325C4228, 0x627C2422,
0x8BED32E3, 0xC90360D3, 0x8B108803, 0xED076EB2,
0x710261E3, 0x67132B12, 0x62E17102, 0x65712B12,
0x655D622D, 0x352C4528, 0xA00C2CD0, 0x88022452,
0xA0038B01, 0x8801E203, 0xE2018B05, 0x66B22C20,
0x677D6761, 0xEB0F2472, 0x6DA12CB0, 0x8B052DD8,
0xD432D23E, 0xE101EE00, 0x241222E2, 0x6DF66EF6,
0x6BF66CF6, 0x6AF6000B, 0x2FE62FD6, 0xE240DD30,
0x616D66D1, 0x89003123, 0x672C6263, 0xDE323678,
0x2D617703, 0xD62F4721, 0x472164E2, 0xE100A00E,
0x71016562, 0x24506253, 0x42197401, 0x74012420,
0x24504529, 0x45197401, 0x74012450, 0x3273621C,
0x42008BEE, 0x64D166E2, 0x362C4200, 0x8F062448,
0xDD222E62, 0xE500DE15, 0x2D52E701, 0x6EF62E72,
0x6DF6000B, 0x2FE62FD6, 0xEE014F22, 0xED0AA005,
0x64E3BC97, 0x64E3BC9D, 0x62EC7E01, 0x8BF732D7,
0xEE01A005, 0x64E3BC9E, 0x64E3BCA4, 0x62EC7E01,
0x8BF732D7, 0x6EF64F26, 0x6DF6000B, 0x002029DA,
0x00201EC2, 0x001E1108, 0x001E1015, 0x002029E0,
0x001E1001, 0x002029B4, 0x001E1100, 0x002029DE,
0x002029CC, 0x001E1000, 0x002029D0, 0x002029DC,
0x00201DB6, 0x001E100C, 0x002029C8, 0x002029E4,
0x2FE62FD6, 0x7FFC4F22, 0x6060D64C, 0x89488801,
0xE101D44B, 0xD74B8548, 0x650D2610, 0x45196070,
0x6659DD49, 0x61D3626E, 0xC840262D, 0x74027102,
0x8D1AD746, 0xD246666C, 0xE501DE46, 0xA0042E22,
0x6245EE04, 0x21217501, 0x625C7102, 0x8BF832E3,
0x81D46063, 0xD540E601, 0x626CE417, 0x891E3243,
0x76016255, 0xAFF82721, 0xD23C7702, 0xE501DE39,
0xA0042E22, 0x6245EE04, 0x21217501, 0x625C7102,
0x8BF832E3, 0x81D46063, 0xD535E601, 0xE417A004,
0x76016255, 0x77022721, 0x3243626C, 0x924B8BF8,
0xD4302D21, 0x6142D730, 0x65F22F12, 0x60536DF2,
0x2700C980, 0xC9606053, 0x80716103, 0x6EF26053,
0xC90365F2, 0x45294D19, 0x60DC8072, 0x81724519,
0x605C4E29, 0x401862EC, 0x8173302C, 0x21186D42,
0x6EF22FD2, 0x66F262F2, 0x46294219, 0x66F2656C,
0x64EC602C, 0x46294018, 0x4619304C, 0x606C8174,
0x305C4018, 0x81758F07, 0x0009BCBF, 0x2228620C,
0xA00A8908, 0x60130009, 0x8B038840, 0x0009B00A,
0x0009A003, 0xE202D611, 0x7F042622, 0x6EF64F26,
0x6DF6000B, 0x0009000B, 0x0000060A, 0x002029E8,
0x00202C40, 0x001E1000, 0x00202CD6, 0x00202CE2,
0x00202C52, 0x002029D0, 0x00202C82, 0x00202C80,
0x00202C54, 0x001E100C, 0x002029B4, 0x002029E0,
0x4F222FE6, 0xDE907FFC, 0x200884E9, 0x2F008D06,
0xD68FD48E, 0x0009460B, 0x64F0B146, 0x6620D28D,
0x89022668, 0xC9BF60E0, 0x7F042E00, 0x000B4F26,
0x000B6EF6, 0x2FE60009, 0xDE874F22, 0x60E0D687,
0xCBC0D487, 0x62602E00, 0xC803602C, 0x40218904,
0x70014021, 0x6603A002, 0x66034009, 0xD681616D,
0xE500A004, 0x75016262, 0x74042422, 0x3213625D,
0xD27D8BF8, 0x0009420B, 0xC9BF84E2, 0x4F2680E2,
0x6EF6000B, 0x2FD62FC6, 0x4F222FE6, 0xDC727FFC,
0x84C2D276, 0xCB40DD76, 0x80C2420B, 0x8D042008,
0x62E06E03, 0xA006642C, 0xD66A7404, 0x6160D471,
0x470BD771, 0x644D651C, 0x45216543, 0xA0044521,
0x62E6E600, 0x2F227601, 0x626D2D22, 0x8BF83253,
0xC9036043, 0x89122008, 0x89058803, 0x89068802,
0x89078801, 0x0009A008, 0xA005E007, 0xE00380D8,
0x80D8A002, 0x80D8E001, 0x2F2262E2, 0xE00F2D22,
0x80D8D65E, 0xCB086060, 0x60C02600, 0x2C00C93F,
0x4F267F04, 0x6DF66EF6, 0x6CF6000B, 0x2FC62FB6,
0x2FE62FD6, 0xD2564F22, 0x6E436D73, 0x420B6B53,
0x20086C63, 0x64038F08, 0xD245D452, 0x6EF64F26,
0x6CF66DF6, 0x6BF6422B, 0x24E060B3, 0x60C38041,
0xA0078141, 0x655DE500, 0x00DC6053, 0x324C6253,
0x80247501, 0x6EEC625D, 0x8BF432E3, 0x6060D636,
0x2600C9BF, 0x6EF64F26, 0x6CF66DF6, 0x6BF6000B,
0x7FC44F22, 0x720262F3, 0x22512F41, 0x45297202,
0x60632251, 0xE5C4E682, 0x67F38121, 0x655C666C,
0xE408BFBC, 0x4F267F3C, 0x0009000B, 0xD237D136,
0xE4056012, 0xE500CB20, 0x22422102, 0x2252000B,
0xD534D133, 0xE400D734, 0x2142E20F, 0x17411154,
0xD5322722, 0x9635D732, 0x15412572, 0x96321562,
0xE6011565, 0xD52F1165, 0x666CE6F8, 0x25422542,
0x25422542, 0x25422542, 0x25622542, 0x7601E727,
0x67632572, 0x25627797, 0xE7042572, 0x2572E248,
0xE2192522, 0xE2702522, 0x25422542, 0x25422542,
0x25222542, 0x2522E20C, 0x25422542, 0x25422542,
0x25422542, 0x25422542, 0x000B154A, 0xE2081145,
0x0009422B, 0x51630601, 0x001E1017, 0x00202AF0,
0x00200F72, 0x002029B0, 0x001E1015, 0x001E10BF,
0x00117800, 0x001E10FC, 0x00200100, 0x0020201A,
0x001E10F8, 0x00202AF4, 0x00200FBC, 0x001E10AE,
0x00201FDC, 0x00202B10, 0x001C3500, 0x001D4004,
0x001C581C, 0xA000A000, 0x001D0100, 0x001D4000,
0x00040021, 0x001C589C, 0x2FE62FD6, 0x7FFC4F22,
0xC8206043, 0x6E438D02, 0x0009BEBB, 0xC81060E3,
0xBEB88901, 0x60E30009, 0x8901C840, 0x0009BEDA,
0xC80160E3, 0xDD378936, 0xC80260D0, 0x2F008D03,
0x460BD635, 0x60F00009, 0x8902C804, 0x460BD633,
0x62F00009, 0xC8806023, 0x60D08902, 0x2D00C97F,
0xC8016023, 0xD62E8904, 0x0009460B, 0x0009A005,
0x8902C808, 0x460BD62B, 0x60F00009, 0x8902C810,
0x420BD229, 0xD5290009, 0x88026052, 0xD2288B03,
0xA005E604, 0x88012260, 0xD2258B02, 0x2260E601,
0x2522E200, 0xC88060E3, 0xD622892E, 0x60E36E60,
0x8902C880, 0x420BD220, 0x60E30009, 0x8902C840,
0x420BD21E, 0x60E30009, 0x8902C802, 0x420BD21C,
0x60E30009, 0x890EC804, 0x410BD11A, 0xBF150009,
0xBF1D0009, 0xD5180009, 0x6050D418, 0xC908D718,
0xBF542500, 0x60E32472, 0x8905C808, 0x7F04D215,
0x6EF64F26, 0x6DF6422B, 0x4F267F04, 0x000B6EF6,
0x00006DF6, 0x001E1021, 0x00201182, 0x002011A4,
0x002017B0, 0x002011BC, 0x002011CC, 0x002029E0,
0x001E100B, 0x001E1028, 0x00201222, 0x0020122E,
0x002011D4, 0x002011F2, 0x001E1000, 0x0010F100,
0x12345678, 0x0020120A, 0xD6A8644C, 0x346C74FF,
0x2450000B, 0x644CD6A6, 0x000B346C, 0xD6A52450,
0x346C644C, 0x2450000B, 0x616D625C, 0x41194208,
0x60194208, 0x644C4200, 0x324C670E, 0x207DD19E,
0xC90F4200, 0x000B321C, 0x67632200, 0x4208625C,
0x42004208, 0x324C644C, 0x4200D198, 0x000B321C,
0x2FE62270, 0x614C4F12, 0x4100D493, 0x6710314C,
0x2729E29F, 0x65736E53, 0x4719676D, 0x672E6279,
0x4221227D, 0x42214221, 0x7601662C, 0xE4014608,
0x34E84608, 0x644C4600, 0x0E1A0467, 0x215025EB,
0x000B4F16, 0x4F226EF6, 0xD2857FE8, 0x88016021,
0xD2848B7B, 0x26686621, 0xD2838B77, 0x26686621,
0xE50F8B73, 0xE401BFA0, 0xBFA3E501, 0xE586E400,
0xE400655C, 0x2F50BFA3, 0xBFA0E401, 0xE602E506,
0x60634618, 0x81F2E401, 0x6543BF9E, 0xE40185F2,
0xBFAA6543, 0x85F26603, 0x6543E401, 0x6603BFB1,
0xE40265F0, 0x6053756C, 0x80F8BF7E, 0xBF81E402,
0x84F8E512, 0x7090E402, 0x6503BF81, 0x4618E602,
0x81F66063, 0xBF7FE402, 0x85F6E500, 0x6603E402,
0xE500BF8B, 0xE40285F6, 0xBF926603, 0xE5FEE500,
0xE010655C, 0xBF5FE403, 0xE5130F54, 0xE40EBF62,
0x05FCE010, 0xBF62E40E, 0xE5007585, 0xBF63E403,
0xE500E640, 0xBF70E403, 0xE500E640, 0xBF78E403,
0xE5FFE640, 0xE014655C, 0xBF45E404, 0xE40F0F54,
0xE504BF48, 0x05FCE014, 0xBF48E40F, 0xE5017584,
0xBF49E640, 0xE501E404, 0xBF56E640, 0xE501E404,
0xE404E640, 0xAF5C7F18, 0x7F184F26, 0x000B4F26,
0x4F220009, 0xD2427FF0, 0x88016021, 0xD2418B71,
0x26686621, 0xD2408B6D, 0x26686621, 0xE50F8B69,
0xE401BF1A, 0xBF1DE501, 0xE586E400, 0xE400655C,
0x2F50BF1D, 0xBF1AE401, 0xE401E506, 0xBF1B6543,
0xE401E640, 0xBF286543, 0xE401E640, 0xBF306543,
0x65F0E640, 0x756CE402, 0xBEFD6053, 0xE40280F4,
0xE512BF00, 0xE40284F4, 0xBF007090, 0xE6406503,
0xBF01E402, 0xE640E500, 0xBF0EE402, 0xE640E500,
0xBF16E402, 0xE5FEE500, 0x6053655C, 0xBEE3E403,
0xE51380F8, 0xE40EBEE6, 0xE40E84F8, 0xBEE67085,
0xE5006503, 0xBEE7E640, 0xE500E403, 0xBEF4E640,
0xE500E403, 0xBEFCE640, 0xE5FFE403, 0x6053655C,
0xBEC9E404, 0xE40F80FC, 0xE504BECC, 0xE40F84FC,
0xBECC7083, 0xE5016503, 0xBECDE640, 0xE501E404,
0xBEDAE640, 0xE501E404, 0xE404E640, 0xAEE07F10,
0x7F104F26, 0x000B4F26, 0x00000009, 0x001E1030,
0x001E1080, 0x001E1090, 0x001E103F, 0x001E103E,
0x002029DA, 0x002029DC, 0x002029DE, 0xD21DD11C,
0x66206010, 0x676C7001, 0x3700C90F, 0xE5008D13,
0x67106210, 0x7701622C, 0x64232170, 0xD6166010,
0x44084408, 0x3428C90F, 0x62602100, 0x7201D513,
0x44082620, 0x000B354C, 0xD10F6053, 0x25586510,
0xE6008D13, 0xD60DD40B, 0x655C6540, 0x47086753,
0x37584708, 0x47086540, 0x24507501, 0x367C6040,
0x2400C90F, 0x72FF6210, 0x000B2120, 0x00006063,
0x002029AF, 0x002029AE, 0x002029B0, 0x002025D4,
0x7FFC4F22, 0xE680D19D, 0x666C6212, 0xD29C2F22,
0x67F36563, 0x420B7542, 0x7F04E404, 0x000B4F26,
0xE6800009, 0xD296666C, 0xE7006563, 0x422B7540,
0xE6806473, 0xD292666C, 0xE7006563, 0x422B7543,
0x2FB66473, 0x2FD62FC6, 0x4F222FE6, 0x4D18ED01,
0xDB8DDC8C, 0x65C252C1, 0x89203520, 0xC9036051,
0x891C8801, 0xD189DE87, 0x64E3410B, 0x85036503,
0x670D66B2, 0x89073762, 0xD286D485, 0x0009420B,
0xE701D185, 0x2172AFE6, 0xDE8464E3, 0x00094E0B,
0xD484D683, 0x410BD184, 0xAFDB26D2, 0x4F260009,
0x6DF66EF6, 0x000B6CF6, 0x4F226BF6, 0x85467FF4,
0x2F01E681, 0x666C8547, 0x854881F1, 0x81F2D270,
0x67F38542, 0x854381F3, 0x81F4E40C, 0x65636053,
0x420B81F5, 0x7F0C7540, 0x000B4F26, 0x2F860009,
0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6, 0x7FF44F22,
0xDC6EE200, 0x2F21A136, 0xDD6D6A13, 0xE0014A08,
0x4D0BD96C, 0x3A9C4A00, 0x1F917930, 0x66C21F02,
0x362052C1, 0xA1218B01, 0x60610009, 0x8801C903,
0xA11B8B01, 0x85610009, 0x8977C801, 0x85D25D63,
0xC9036603, 0x85D36403, 0x6053650D, 0x40214021,
0x4500C93F, 0x322A6103, 0x6053252D, 0xC901E210,
0xD9553123, 0x6E038D21, 0x4408D757, 0x44086570,
0x44006213, 0x25584200, 0x342C8F0E, 0x6043D253,
0x60E3072D, 0x4B196B7D, 0x658E68B9, 0x285D8801,
0x6B7C8F0B, 0x6B13A009, 0x6043D24D, 0x61ED0E2D,
0x68194119, 0x287D678E, 0xD14A6BEC, 0x22286212,
0xEBFF8901, 0xEEFF6BBC, 0x6EEC65BD, 0x8B0F35E0,
0x4D0BDD36, 0x540364C3, 0xBF76E502, 0xD4426D03,
0x410BD136, 0xD74165D3, 0xD441EE01, 0x27E2A01D,
0x26E9EEFC, 0x81D26063, 0x914E85D3, 0x81D32019,
0x450885D2, 0x81D2208B, 0xE20885D3, 0x81D3205B,
0x421885D4, 0x81D4202B, 0x854164C2, 0x814120E9,
0xD43465C2, 0xCB016051, 0x490B2501, 0x60C20009,
0x52F256F1, 0x2A02CB01, 0x2622AF79, 0x420BD21B,
0x5E0364C3, 0x85E16D03, 0x6053650D, 0x897BC820,
0x6210D129, 0x8B112228, 0xD72785EF, 0x4221620D,
0x42214221, 0xE501D625, 0x27504221, 0xD725D924,
0x2621D425, 0x2960E600, 0x24612762, 0x852162C2,
0x8B43C802, 0xD912D71E, 0xE0016270, 0x612C490B,
0x6692D91C, 0xA03E260B, 0x7E032962, 0x001C3D9C,
0x00201A3C, 0x002025CC, 0x00202994, 0x00200D42,
0x00202594, 0x00200DC4, 0x001E2130, 0x00200D60,
0x001C3D30, 0x00202C28, 0x00200F72, 0x002025A4,
0x0020248C, 0x001C3D00, 0x00202C3C, 0x00202B28,
0x00202BA8, 0x002029A8, 0x0020259C, 0x001E212C,
0x00202C2C, 0x00202C30, 0x00202D10, 0x002029EE,
0x002029EC, 0x002029F0, 0x002029F4, 0xE04CD139,
0x7201021E, 0xD9380126, 0x6290D438, 0x72016541,
0x29207501, 0x85E12451, 0x4618E640, 0x891D2068,
0xD934D733, 0x665D6171, 0x6592D733, 0x641D470B,
0xE200DE32, 0x2E20A012, 0xE90885E4, 0x49186203,
0x32902299, 0xE5018B04, 0x64E3BEB7, 0x0009A006,
0x2598D92B, 0xE5008902, 0x64E3BEAF, 0xD22AD429,
0x65D3420B, 0xEE01D729, 0x27E2AED9, 0x7C0862F1,
0x2F217201, 0xEE0462F1, 0x31E7612D, 0xAEC38901,
0x7F0C0009, 0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6,
0x000B69F6, 0x2FE668F6, 0xD21D4F22, 0x60E36E22,
0x8D02C840, 0xBE3322E2, 0xE2400009, 0x2E284218,
0xBE3E8901, 0x60E30009, 0x8905C810, 0xD216D415,
0x0009420B, 0x0009BE3D, 0xC80560E3, 0xBE8E8901,
0x60E30009, 0x8902C802, 0xAE3A4F26, 0x4F266EF6,
0x6EF6000B, 0x00202538, 0x002029EC, 0x002029F4,
0x002029EE, 0x002029F0, 0x00201AA0, 0x00202D10,
0x00008000, 0x0020259C, 0x00200D60, 0x001E212C,
0x001C3510, 0x00202C34, 0x00200F72, 0x080A0C0E,
0x00020406, 0x1A1C1E20, 0x12141618, 0x2E303234,
0x26282A2C, 0x3A3C3E40, 0x6C625648, 0x41112F26,
0xE2208F18, 0x890B3123, 0x321CD204, 0xD1026220,
0x412B312C, 0x00090009, 0x002024B6, 0x0020246C,
0x000BE000, 0x400062F6, 0x40004000, 0x40004000,
0x40004000, 0x62F6000B, 0x40004000, 0x40004000,
0x40004000, 0x40184000, 0x62F6000B, 0x40004000,
0x40004000, 0x40004000, 0x40284000, 0x62F6000B,
0x40004000, 0x40184000, 0x000B4028, 0xC90F62F6,
0x40054005, 0x40054005, 0x62F6000B, 0x4005C907,
0x40054005, 0x62F6000B, 0x4005C903, 0x000B4005,
0xC90162F6, 0x000B4005, 0x000062F6, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x544F0D0A, 0x46205355,
0x00003A57, 0x2079614D, 0x32203033, 0x20373030,
0x333A3231, 0x38313A37, 0x00000000, 0x00000D0A,
0x00000043, 0x42707372, 0x3D206675, 0x554E203D,
0x202C4C4C, 0x6E49677A, 0x4E497274, 0x6D754E51,
0x0000003D, 0x61766E49, 0x2064696C, 0x72657375,
0x20726F20, 0x2079656B, 0x00214449, 0x52504545,
0x57204D4F, 0x65746972, 0x6461202C, 0x003D7264,
0x6C617620, 0x0000003D, 0x00000A0D, 0x6E6B6E55,
0x206E776F, 0x6D6D6F63, 0x3D646E61, 0x00000000,
0x61437748, 0x7262696C, 0x6F697461, 0x6620206E,
0x0A6C6961, 0x0000000D, 0x73696F4E, 0x61432065,
0x7262696C, 0x6F697461, 0x6166206E, 0x21216C69,
0x00000D0A, 0x00000D0A, 0x62735576, 0x7473725F,
0x00000A0D, 0x62735576, 0x7375735F, 0x646E6570,
0x00000A0D, 0x62735576, 0x7365725F, 0x000A0D6D,
0x00000042, 0x72746E49, 0x6D652051, 0x2C797470,
0x49677A20, 0x4972746E, 0x754E514E, 0x00003D6D,
0x20746F4E, 0x756F6E65, 0x49206867, 0x4220514E,
0x0A0D6675, 0x00000000, 0x000000FF, 0x00020001,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x010E010D, 0x00020003,
0x01090108, 0x0002010A, 0x00030002, 0x02020201,
0x02040203, 0x02060205, 0x02080207, 0x020A0209,
0x020C020B, 0x020E020D, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x010E010D, 0x00FF010F,
0x01090108, 0x010B010A, 0x00030002, 0x02020201,
0x02040203, 0x02060205, 0x02080207, 0x020A0209,
0x020C020B, 0x020E020D, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00205220, 0x00000046,
0x00000059, 0x49544120, 0x0000204D, 0x00000000,
0x02000112, 0x40FFFFFF, 0x91700CF3, 0x20104890,
0x02090100, 0x0101002E, 0x09FA8000, 0x04000004,
0x000000FF, 0x02010507, 0x07000200, 0x00028205,
0x05070002, 0x00400383, 0x04050701, 0x01004003,
0x002E0209, 0x80000101, 0x000409FA, 0x00FF0400,
0x05070000, 0x00400201, 0x82050700, 0x00004002,
0x03830507, 0x07010040, 0x40030405, 0x03040100,
0x030C0409, 0x0079005A, 0x00410044, 0x03180053,
0x00530055, 0x00320042, 0x0030002E, 0x00570020,
0x0041004C, 0x0000004E, 0x00000000, 0x00000000,
0x00000709, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, };
const u32_t zcFwImageSize=11540;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,874 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "cprecomp.h"
const u32_t zcFwImage[] = {
0x0009000B, 0x4F222FE6, 0xDE917FFC, 0xE114D791,
0x1E13D491, 0x1E4C470B, 0x0009B017, 0x95C2E600,
0xC84060E2, 0x2F028F03, 0x8FF93652, 0xD48B7601,
0x4E0BDE8B, 0xD48B0009, 0x00094E0B, 0x4E0BD48A,
0x7F040009, 0xA0474F26, 0x4F226EF6, 0x410BD187,
0xD4870009, 0x0009440B, 0x450BD586, 0xD7860009,
0x611DE1FF, 0xD1852712, 0x6012E2FF, 0xCB01D484,
0x71DC2102, 0x71042122, 0x2122E501, 0xD5812452,
0xD2819792, 0xE7002572, 0xD481D180, 0x2270D681,
0x2172E201, 0x26202470, 0xE4FFD67F, 0xE6002641,
0xE104D57E, 0x6063666D, 0x626D7601, 0x32124000,
0x05458FF8, 0xE501D27A, 0xD17A2250, 0xD57BD47A,
0xE700E600, 0x25722470, 0x11622162, 0x11691166,
0x4F26116A, 0x116E000B, 0xD1757FC4, 0x2F12D875,
0xD476D175, 0xD577D676, 0x1F87D777, 0xD97778FC,
0x1F1BD277, 0x1F417104, 0x1F647404, 0x1F887604,
0x71F41F1C, 0x1F42E8C8, 0x1F651F53, 0x1F991F76,
0x1F1D1F2A, 0xDD6F688C, 0xDA70DE6F, 0xDC71DB70,
0x00094A0B, 0x00094B0B, 0x00094C0B, 0x6010D15E,
0x8B0F8801, 0xE950D15D, 0x49186212, 0x8B073296,
0x56FAD159, 0x2120E200, 0xCB016062, 0x2602A002,
0x21227201, 0x880160D2, 0xD1638907, 0x32866212,
0xD1628903, 0x88016010, 0x64E28BDA, 0x52F751F8,
0x55E12142, 0x2252D15E, 0x661254FB, 0x246259FC,
0x29725711, 0x880160D2, 0x66E28B53, 0x362052E1,
0x6061894C, 0x8801C90F, 0xD1568B48, 0x36206212,
0xA0438903, 0x27102162, 0xD5530FA0, 0x6651E710,
0x626D7601, 0x8F3C3273, 0x65F22561, 0x695251F2,
0x54F359F1, 0x679252F4, 0x61426512, 0x56F66922,
0x642252F5, 0xCB206062, 0xE6002602, 0x76011F1E,
0x626DE110, 0x32134118, 0x51FE8FF8, 0x267256F1,
0x56F457F2, 0x55F32752, 0x251257F5, 0x27422692,
0x51F969E2, 0x2192D43D, 0xE90161F2, 0x2192440B,
0x491865F2, 0xD9382592, 0xE200D539, 0x62512921,
0x720154FD, 0x622D2521, 0x2422A003, 0xE200D932,
0xE9012921, 0x2D92D12C, 0x26686612, 0xAF6F8B01,
0xD6300009, 0x0009460B, 0xE700D128, 0x2170AF68,
0x001C001C, 0x00200F7C, 0x0000B38E, 0x0020322C,
0x0020145E, 0x00203238, 0x00203250, 0x0020141C,
0x0020151C, 0x00200FA0, 0x001C3510, 0x001C3648,
0x001E212C, 0x00203188, 0x00202D24, 0x00203190,
0x0020319C, 0x002031A8, 0x002031B8, 0x002031BC,
0x002031B0, 0x00117708, 0x002031B1, 0x002031B4,
0x001C3D30, 0x00117718, 0x00117734, 0x001C3B9C,
0x001C3704, 0x001C3D98, 0x001C3500, 0x001C3D00,
0x001C36F8, 0x001C1028, 0x00202D98, 0x00201328,
0x00202C04, 0x00201E18, 0x002034BC, 0x002031BA,
0x00202D90, 0x002031CC, 0x002031D0, 0x00201276,
0x002031D2, 0x00201FD0, 0x2FB62F96, 0x2FD62FC6,
0x4F222FE6, 0xDE947F8C, 0x61E0E024, 0x0F14D493,
0x710161E3, 0xD7926210, 0x470BE028, 0xD5910F24,
0x0009450B, 0x6D032008, 0x1F0B8F11, 0xD48FDC8E,
0xDD8F67C0, 0x657C4D0B, 0xDD8FD18E, 0x6B9C6910,
0x420862B3, 0x32B84208, 0x3D2C4208, 0xE0281FDB,
0xE58004FC, 0x604C66E2, 0x3050655C, 0x2D628F13,
0x01FCE024, 0x641CE500, 0x625DDE84, 0x8B013243,
0x0009A33D, 0x6753655D, 0x607037EC, 0x39DC6953,
0xAFF27501, 0x20088094, 0xE0248B13, 0xE50001FC,
0xA009DE7A, 0x655D641C, 0x32EC6253, 0x6C536B22,
0x3CDC67B2, 0x75041C71, 0x3243625D, 0xA31E8BF3,
0x88012D10, 0xE0248B16, 0xE40001FC, 0x671C2D40,
0x624DDE6E, 0x8B013273, 0x0009A311, 0x6CE3644D,
0x7C046943, 0x39EC6B43, 0x65923BCC, 0x74086DB2,
0x25D2AFEF, 0x8B198804, 0x01FCE024, 0x2D70E700,
0x1FD86D1C, 0x627DDE61, 0x8B0132D3, 0x0009A2F7,
0x6B73677D, 0x3BEC61E3, 0x710464B2, 0x3C1C6C73,
0x694265C2, 0x29597708, 0x2492AFED, 0x8B188805,
0x01FCE024, 0x2D40E400, 0xDE54671C, 0x3273624D,
0xA2DC8B01, 0x644D0009, 0x6BE36D43, 0x65D23DEC,
0x61437B04, 0x6C1231BC, 0x74086952, 0xAFED29CB,
0x88312592, 0xDE4A8B20, 0x65E6DB4A, 0x61E6DC4A,
0x67E2D94A, 0x62E27E04, 0x1FEC7EE8, 0x7E0464E2,
0x6EE21FED, 0x5BFD2BE0, 0x60B27B04, 0xC9011FBE,
0x6BB22C00, 0x29B04B09, 0xDC412F26, 0x66134C0B,
0xE2007F04, 0x2D20A2AB, 0x8B218830, 0xD939DE38,
0xE06465E6, 0x720462E3, 0x672666E2, 0x6E23DC36,
0x62227EE8, 0x6BE261E6, 0x29B01FEF, 0x7E040F16,
0xC90160E2, 0x6EE22C00, 0x4E09DC30, 0x2F262CE0,
0xD130E068, 0x04FE410B, 0xE2007F04, 0x2D20A287,
0x8B058833, 0x4E0BDE2C, 0xE1000009, 0x2D10A27F,
0x89018828, 0x0009A106, 0xE143DE20, 0xE04062E1,
0x3217622D, 0x0FE68F04, 0x6023E240, 0x262106FE,
0x8B013217, 0x0009A0EF, 0x02FEE040, 0x8521E401,
0x8B013046, 0x0009A0E7, 0xE501E040, 0x2D5007FE,
0x6471B265, 0x09FEE040, 0x6291E143, 0x652DE068,
0x8D6B3517, 0xE6400F56, 0x8B273563, 0xE048E600,
0xE11A0F65, 0x72C0A031, 0x00117800, 0x00203254,
0x0020145E, 0x00202588, 0x002031A2, 0x00203258,
0x002014AA, 0x002031A1, 0x00202DC8, 0x00117804,
0x00117810, 0x0020319D, 0x0020319E, 0x0020319F,
0x00200C2C, 0x00200C80, 0x00200C7C, 0x41216153,
0x41214121, 0x41214121, 0x45214521, 0x60534521,
0x6603C903, 0x0F65E048, 0xE0077118, 0xE0442209,
0x641D0F25, 0x65F3E04C, 0x0F46B28C, 0x04FDE048,
0x0BFDE044, 0x61BD674D, 0x41084708, 0x0F16E050,
0xD29B6073, 0x420B09FE, 0x6C07E00F, 0x607329C9,
0xE0400F96, 0x65F30EFE, 0x6D0D85E2, 0x01FEE050,
0x60D3420B, 0x6073290B, 0xE04C0F96, 0x04FEB251,
0x06FEE040, 0x6261E068, 0x0F56652D, 0x3563E640,
0xE000894E, 0x602381F8, 0x4008C903, 0x6B034000,
0xE0546103, 0xE0580FB6, 0xECFFDD85, 0x6CCC0FF6,
0x0FD6E06C, 0x4D0B60C3, 0x42216253, 0x42214221,
0x64234221, 0x324C4200, 0xE05C6E07, 0x45214200,
0xE0400FE6, 0x0BFE4521, 0xC9036053, 0x30FC4008,
0x6D037B06, 0x85F81F05, 0x6C2D1FB7, 0x1FC66E03,
0x0FC6E060, 0x05FEE058, 0x64C3B22C, 0x33FCE354,
0x563262D2, 0x22696132, 0x67B42D22, 0x490B5936,
0x220B607C, 0x05FEE058, 0x64C32D22, 0x7E01B201,
0xE70662ED, 0x8FE33273, 0xE0407C01, 0x626106FE,
0x06FEE040, 0x85614200, 0x302C760C, 0x6103701B,
0x64F3E500, 0x7501E704, 0x6B5D6966, 0x24923B73,
0x74048FF9, 0xB1E465F3, 0xE040641D, 0xB1A306FE,
0xA17C6461, 0xD4570009, 0xE201D757, 0x2D20470B,
0x0009A175, 0x8B078829, 0xEC00DE54, 0x61E22DC0,
0x641DB175, 0x0009A16B, 0x622CE281, 0x8B013020,
0x0009A0B6, 0x06FCE028, 0xE682626C, 0x3260666C,
0x56FB8B20, 0x2610E124, 0x5217D149, 0x52181621,
0x52191622, 0x521A1623, 0x551B1624, 0x1655E200,
0x1656551C, 0x1657551D, 0x1658551E, 0x1659551F,
0x11281127, 0x112A1129, 0x112C112B, 0x112E112D,
0x112FA13D, 0x666CE683, 0x8B0B3260, 0xD63752FB,
0x2250E500, 0xD2376562, 0x22527604, 0xD6366262,
0x2620A12D, 0x666CE690, 0x8B033260, 0x0009B1C7,
0x0009A011, 0x666CE691, 0x8B103260, 0x6252D52B,
0x2228622C, 0xD22D8904, 0x0009420B, 0x0009A003,
0x420BD22B, 0x56FB0009, 0xA110E200, 0xE6B02620,
0x3260666C, 0xE0248B34, 0xE07002FC, 0x0F16612C,
0xEB04EC00, 0x01FEE070, 0x321362CD, 0xA0FE8B01,
0xD21A0009, 0x6DC36CCD, 0x72043D2C, 0x312C61C3,
0x6D126ED2, 0xD114D41B, 0x0009410B, 0x410BD11A,
0xD41A64E3, 0x420BD210, 0xD2170009, 0x64D3420B,
0xD60DD417, 0x0009460B, 0x61E3E600, 0x316C666D,
0x626D7601, 0x21D032B3, 0x4D198FF7, 0x7C08AFD2,
0xD211D410, 0xD4116542, 0x0009420B, 0x0009A0CF,
0x00202C80, 0x00203278, 0x0020145E, 0x00117804,
0x00202D2C, 0x00203188, 0x0020319C, 0x00200CBA,
0x00200CE0, 0x00203290, 0x002014A2, 0x002032A4,
0x002032AC, 0x00117800, 0x002014AA, 0x002032B0,
0xD5B5D1B4, 0x6252E040, 0x75046612, 0x2162362C,
0x56116256, 0x1161362C, 0x62526653, 0x76085512,
0x1152352C, 0x55136262, 0x352C76EC, 0x65631153,
0x56146262, 0x362C7510, 0x66531164, 0x55156252,
0x352C7610, 0x62621155, 0x362C5616, 0xD6A31166,
0x55176262, 0x352C7604, 0x62661157, 0x352C5518,
0x65631158, 0x56196262, 0x362C7504, 0x62561169,
0x362C561A, 0x6256116A, 0x362C561B, 0x6653116B,
0x551C6252, 0x352C7604, 0x6266115C, 0x352C551D,
0x6263115D, 0x551E6662, 0x356C7204, 0x6622115E,
0xD58F521F, 0x112F326C, 0x061E6252, 0x362C7594,
0xE0440166, 0x62526653, 0x7644051E, 0x0156352C,
0x6262E048, 0x362C061E, 0xD6860166, 0x6262E054,
0x4229051E, 0x0156352C, 0x62627604, 0x061EE058,
0x362C4229, 0x56FB0166, 0x2620E238, 0x021EE044,
0x1621E048, 0x16226212, 0x16235211, 0xE2005512,
0x55151654, 0x55131655, 0x55161656, 0x051E1657,
0x1658E040, 0xE050051E, 0x55141659, 0x051E165A,
0x165BE04C, 0xE054051E, 0x051E165C, 0x165DE058,
0xE044051E, 0x0126165E, 0x2122E048, 0x11221121,
0x11231125, 0x01261126, 0x0126E040, 0x1124E050,
0xE04C0126, 0xE0540126, 0xE0580126, 0x7F740126,
0x6EF64F26, 0x6CF66DF6, 0x000B6BF6, 0x4F2269F6,
0xE240614D, 0x89143123, 0x3127E21F, 0x8B09D75A,
0xD45A614D, 0xE00171E0, 0x5671440B, 0x26596507,
0x1761A007, 0xE001D455, 0x6672440B, 0x26596507,
0x4F262762, 0x0009000B, 0x614D4F22, 0x3123E240,
0xE21F8912, 0xD74C3127, 0x614D8B08, 0x5671D24B,
0x420B71E0, 0x260BE001, 0x1761A006, 0x6672D247,
0xE001420B, 0x2762260B, 0x000B4F26, 0xE6400009,
0x46284618, 0x6252D542, 0x89FC2268, 0x0009000B,
0x4618E680, 0xD53E4628, 0x22686252, 0x000B89FC,
0xA0010009, 0x7201E200, 0x8BFC3242, 0x0009000B,
0x4618E680, 0xD5374628, 0x22686252, 0x000B8BFC,
0x2FE60009, 0x7FFC4F22, 0xBFF16E53, 0x61E22F42,
0xE280D631, 0x54E11615, 0x16464218, 0x422855E2,
0x57E31657, 0x16786EF2, 0x26E22E2B, 0x4F267F04,
0x6EF6AFCE, 0x2FD62FC6, 0x4F222FE6, 0x6C53DD26,
0x6E43BFD6, 0x2DE2BFBB, 0x0009BFD2, 0x2C1251D5,
0x1C4154D6, 0x1C5255D7, 0x1C6356D8, 0x6EF64F26,
0x000B6DF6, 0x61636CF6, 0xA004E600, 0x62564109,
0x24227601, 0x36127404, 0x000B8BF9, 0x4F220009,
0xD117D416, 0x0009410B, 0xD417D216, 0xE5056022,
0x2202CB20, 0xD5152452, 0x450BE700, 0xD7142472,
0x0009470B, 0xE601D113, 0x2162D213, 0x4F264618,
0x2262000B, 0x00202D2C, 0x001C36A0, 0x001C3CA0,
0x001C36F4, 0x001C3B88, 0x001C3704, 0x00202C80,
0x001C373C, 0x001C3700, 0x001C370C, 0x002032C4,
0x0020145E, 0x001C3500, 0x001D4004, 0x002014D4,
0x00200FA0, 0x001E212C, 0x001C3D30, 0x0009A1A9,
0x2FE62FD6, 0xDD8F4F22, 0xA0049EA7, 0xD48E0009,
0x420BD28E, 0x62D265D2, 0x8BF822E8, 0x0009A004,
0xD28AD48B, 0x55D1420B, 0x22E852D1, 0xA0048BF8,
0xD4880009, 0x420BD285, 0x52D255D2, 0x8BF822E8,
0x0009A004, 0xD281D484, 0x55D3420B, 0x22E852D3,
0xA0048BF8, 0xD4810009, 0x420BD27C, 0x52D455D4,
0x8BF822E8, 0x6EF64F26, 0x6DF6000B, 0x2FD62FC6,
0x4F222FE6, 0x6E636D73, 0x6C53B018, 0x64C357F4,
0xB05465E3, 0xB06A66D3, 0xB09A0009, 0xB09E0009,
0xB0A20009, 0xB0BE0009, 0xB0C10009, 0xB1240009,
0x4F260009, 0x6DF66EF6, 0x6CF6A023, 0x3412D16C,
0xD66C0529, 0x2650D76C, 0x2742000B, 0x0009A014,
0x2FD62FC6, 0x4F222FE6, 0x6E636D73, 0x6C53BFEE,
0x64C357F4, 0xB02A65E3, 0xB10666D3, 0x4F260009,
0x6DF66EF6, 0x6CF6A005, 0xE603D260, 0x000B4618,
0xD25E2262, 0x000BE600, 0x4F222262, 0xE40ABF7E,
0x0009BF7E, 0xE104D25A, 0xE5004118, 0x2212E40A,
0x2252BF74, 0x6072D757, 0x4F26CB20, 0x2702000B,
0xD1554F22, 0xE400410B, 0x452BD554, 0x2FE64F26,
0x6E63D153, 0x44186612, 0x45289210, 0x26294408,
0x44084500, 0x4400265B, 0x4708264B, 0x47082162,
0x27EBD14C, 0x000B2172, 0x03F06EF6, 0x2FE61FFF,
0xDE494F22, 0xE40AE101, 0x2E12BF48, 0x726C62E3,
0xE401E100, 0x22122212, 0x22122212, 0x22122212,
0xE7302242, 0xE40AE503, 0x22122212, 0x22122212,
0x22122212, 0x22122212, 0x22122212, 0x22122212,
0x22522272, 0x22122212, 0x22122212, 0x22122212,
0x22122212, 0x121ABF22, 0x2E62E600, 0x000B4F26,
0xD2326EF6, 0xE441E101, 0x000B2212, 0xD1302242,
0xE605D430, 0x000B2162, 0xD52F2462, 0x6050D22F,
0x8B0E8801, 0x6040D42E, 0x8B078801, 0x9626D52D,
0x88016050, 0x96238B0C, 0x0009A00A, 0xA0079621,
0xE6000009, 0x2262D426, 0x88016040, 0xE6048B00,
0xAEF3E40A, 0xD2242262, 0xE40AE601, 0x2262AEEE,
0x2FC62FB6, 0x2FE62FD6, 0xDC204F22, 0x60C2ED00,
0xCB01EB64, 0x60C22C02, 0xA041C901, 0x03C46E03,
0x034003D4, 0x001C3B88, 0x002032C8, 0x002014AA,
0x002032D0, 0x002032D8, 0x002032E0, 0x002032E8,
0x0025E720, 0x002034B8, 0x0020318C, 0x001C5968,
0x001D4004, 0x001C3500, 0x0020124A, 0x00201276,
0x001C5814, 0x001C59D0, 0x001C5830, 0x001C6268,
0x001C59A4, 0x001C639C, 0x0020319E, 0x001C5804,
0x0020319D, 0x0020319F, 0x001C581C, 0x001C5860,
0x89073DB2, 0xE40A60C2, 0xBE9FC901, 0x7D016E03,
0x8BF52EE8, 0x8B033DB2, 0xD23ED43D, 0x0009420B,
0x4F26E40A, 0x6DF66EF6, 0xAE8F6CF6, 0x44116BF6,
0x604B8F01, 0x000B6043, 0x2FB60009, 0x2FD62FC6,
0x4F222FE6, 0xDC347FFC, 0x60C2ED00, 0xCB02EB64,
0x60C22C02, 0xC9022F02, 0x6E03A009, 0x89083DB3,
0xE40A60C2, 0xC9022F02, 0x6E03BE70, 0x2EE87D01,
0x3DB38BF4, 0xD4298B08, 0x7F04D226, 0x6EF64F26,
0x6CF66DF6, 0x6BF6422B, 0x4F267F04, 0x6DF66EF6,
0x000B6CF6, 0xD5226BF6, 0x60525651, 0x000B4628,
0x2FB6306C, 0x2FD62FC6, 0x4F222FE6, 0x4F024F12,
0x6E43BFF1, 0xDC1B6B03, 0xBFECDD1B, 0x30B80009,
0x060A3C05, 0x46094609, 0x3D654601, 0x4209020A,
0x42094209, 0x8BF032E2, 0x4F164F06, 0x6EF64F26,
0x6CF66DF6, 0x6BF6000B, 0x4F222FE6, 0xE102DE0F,
0xE403E500, 0xBFD42E12, 0xE6062E52, 0xE7004618,
0x2E62E403, 0x4F262E72, 0x6EF6AFCB, 0x0009000B,
0x002032F0, 0x0020145E, 0x001C5860, 0x00203308,
0x001C1040, 0xCCCCCCCD, 0x10624DD3, 0x001D4004,
0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6,
0xE5007FD8, 0x6453E110, 0x6C534128, 0x655DEE0A,
0x46086653, 0x4608365C, 0x361C7501, 0x675D6043,
0x60C30F66, 0x37E3ED00, 0x816126C1, 0x81638162,
0x16D316D2, 0x8FEA16D4, 0x68F27404, 0xDAB3D9B2,
0x29821981, 0xD1B259F1, 0x2A921A91, 0x5BF35AF2,
0x5EF55DF4, 0x11A154F6, 0x11B321A2, 0x11D511B2,
0x11E711D4, 0x114911E6, 0x55F71148, 0xEE00DBA9,
0xDDA957F8, 0xD6A952F9, 0x1B5164E3, 0xDBA82B52,
0xEAB8D8A8, 0x2D72E945, 0x6AAC2622, 0x6EED4908,
0x4D086DE3, 0x3DEC61E3, 0x4D084108, 0x3DBC31EC,
0x410860C3, 0x81D12DC1, 0x4108E050, 0x41084008,
0x60C381D2, 0xE500318C, 0x81D334A2, 0x1D131DD2,
0x8D01D494, 0xD4911D54, 0xB08165D3, 0x64ED7E01,
0x8BDC3492, 0xDB94D18D, 0xD28B6812, 0x1B814829,
0x2FD26412, 0x2B92694D, 0xD98A6722, 0x1B734729,
0xD7876822, 0x1BA26A8D, 0xD28C6B72, 0x22B2D586,
0xE0035D72, 0x5E7412D2, 0x12E44018, 0xD6885176,
0x54781216, 0x1248E1FF, 0xD4856792, 0x6852127A,
0x28C1E703, 0x81916952, 0x6A52E050, 0x81A24008,
0x60C36B52, 0x6D5281B3, 0x6E521DD2, 0x62521E63,
0x1264E600, 0x46086563, 0x7501364C, 0x665D2612,
0x8BF83673, 0xE003D471, 0x40186542, 0x674225C1,
0x8171D274, 0xEE006842, 0x69421882, 0x1923E024,
0xE5806A42, 0x6B421AE4, 0x81B266E3, 0xD46D6C42,
0x655C81C3, 0x6D63666D, 0x616D7604, 0x31533D4C,
0x2DE28FF8, 0xD569D268, 0x74042422, 0x7F282452,
0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6, 0x000B69F6,
0x664268F6, 0xC8036061, 0xE5008D04, 0xC9036061,
0x8B038802, 0x65635262, 0x24125124, 0x6053000B,
0x2FE62FD6, 0x7FEC4F22, 0x62536E53, 0x6D43E550,
0x4508E400, 0xE101A001, 0x60435224, 0x81212211,
0x60538123, 0x56E28122, 0x8BF53620, 0x16E4D250,
0xE61464F3, 0x65E3420B, 0xE4FC65E1, 0x2E512549,
0x65F361F1, 0x2F112149, 0xD14954D1, 0xE614410B,
0x607157D1, 0x2701CB01, 0x7F141DE1, 0x6EF64F26,
0x6DF6000B, 0x2FE62FD6, 0x7FEC4F22, 0x66536E53,
0x6D43E5FC, 0x20596061, 0x2601CB01, 0x326052E2,
0x12E48B06, 0x31E051E2, 0x52D18B04, 0x1E22A002,
0x5664AFF0, 0x64F3D236, 0x420BE614, 0x67E165E3,
0x2719E1FC, 0x67F12E71, 0x271954D1, 0x65F3D130,
0x410BE614, 0x52D12F71, 0xCB016021, 0x1DE12201,
0x4F267F14, 0x000B6EF6, 0x2FE66DF6, 0x624C4F22,
0x4208DE1B, 0xA0054200, 0x52523E2C, 0x5624D417,
0x2E62BF8E, 0x52E165E2, 0x8BF63520, 0x2622D61B,
0x000B4F26, 0x2FB66EF6, 0x2FD62FC6, 0x4F222FE6,
0xDB1CDC10, 0x66C252C1, 0x89403620, 0xC9036061,
0x893C8801, 0xDD18DE0B, 0x64E3BF63, 0x85036503,
0x620D66B2, 0x892B3262, 0xBF9BD403, 0xD4130009,
0x00094D0B, 0x0009AFE6, 0x00202D88, 0x00202D90,
0x00202D98, 0x00202DC0, 0x002031A4, 0x002031AC,
0x001000C8, 0x00101680, 0x001E2108, 0x001C3D00,
0x00117880, 0x00117780, 0x00040020, 0x0026C401,
0x00200B26, 0x00203188, 0x0020145E, 0x00203324,
0x64E3BF3E, 0x4D0BD406, 0xAFBB0009, 0xD2050009,
0x4F262262, 0x6DF66EF6, 0x000B6CF6, 0x00006BF6,
0x00203328, 0x001C3D28, 0x2FC62FB6, 0x2FE62FD6,
0x7FFC4F22, 0x6022D22B, 0x8D41C803, 0xDE2A2F01,
0xDB2BDC2A, 0xED01A017, 0xC9036051, 0x89168801,
0xD128D426, 0x0009410B, 0x61035503, 0xC8208551,
0xE0508903, 0x720102BE, 0xD2230B26, 0x420B64E3,
0xD6226513, 0x52C126D2, 0x352065C2, 0xDE208BE4,
0xDB21DD20, 0x52D1DC21, 0x352065D2, 0x60518918,
0x8801C903, 0xD41B8914, 0x460BD616, 0x57030009,
0x8F0437E0, 0xE2016503, 0xAFEC2B20, 0xD4182C52,
0x420BD218, 0xD6110009, 0x4118E101, 0x2612AFE3,
0xC80460F1, 0xD2148907, 0x4F267F04, 0x6DF66EF6,
0x422B6CF6, 0x7F046BF6, 0x6EF64F26, 0x6CF66DF6,
0x6BF6000B, 0x001E2100, 0x00202D98, 0x00202D90,
0x00202D2C, 0x00201162, 0x002011E4, 0x001C3D30,
0x00117880, 0x00202D88, 0x002031A8, 0x002031A4,
0x00202DC0, 0x00201180, 0x00200308, 0xE601D203,
0x1265D503, 0x000B2252, 0x00001266, 0x001C1010,
0x0000C34F, 0x0009000B, 0x2FD62FC6, 0x4F222FE6,
0x6D436C53, 0xEE00A004, 0x7E0164D4, 0x644CBFF2,
0x8BF93EC2, 0x6EF64F26, 0x000B6DF6, 0xE5006CF6,
0x6643A002, 0x76017501, 0x22286260, 0xAFE38BFA,
0x2FE60009, 0x75076253, 0xE1086753, 0x6043EE0A,
0x4409C90F, 0x650330E2, 0x8D014409, 0xE630E637,
0x4110365C, 0x8FF22760, 0xE00077FF, 0x000B8028,
0x000B6EF6, 0x000BE000, 0x2FE6E000, 0x7FEC4F22,
0x6E436253, 0xBFDC65F3, 0xBFD06423, 0xBFCE64E3,
0xD40364F3, 0x0009BFCB, 0x4F267F14, 0x6EF6000B,
0x0020332C, 0xE4FDD29A, 0xD79A6122, 0x22122149,
0x74016022, 0x2202CB01, 0xD5976622, 0x22622649,
0xC8406070, 0x60528902, 0x2502CB04, 0xE1F76452,
0x25422419, 0xE7016052, 0x2502C9CF, 0xE6026052,
0x2502CB03, 0x15624718, 0x1573000B, 0xD78CD58B,
0xD48DD28C, 0xE600E100, 0x27112511, 0xAFD12210,
0x664C2461, 0x4600D289, 0x6060362C, 0x000BCB10,
0x654C2600, 0x4500D285, 0x6650352C, 0x2619E1EF,
0x2560000B, 0xD282664C, 0x362C4600, 0xCB106060,
0x2600000B, 0xD27E654C, 0x352C4500, 0xE1EF6650,
0x000B2619, 0x664C2560, 0x4600D278, 0x6060362C,
0x000BCB08, 0x654C2600, 0x4500D274, 0x6650352C,
0x2619E1F7, 0x2560000B, 0xD271664C, 0x362C4600,
0xCB086060, 0x2600000B, 0xD26D654C, 0x352C4500,
0xE1F76650, 0x000B2619, 0x624C2560, 0x4200D667,
0x6020326C, 0x4021C908, 0x40214021, 0x600C000B,
0xD663624C, 0x326C4200, 0xC9086020, 0x40214021,
0x000B4021, 0xD15F600C, 0x341C644C, 0x000B6240,
0xD15D602C, 0x341C644C, 0x000B6240, 0x2FE6602C,
0x6E434F22, 0xE60A645C, 0x89143467, 0x0009BFEB,
0x60EC640C, 0x8B028801, 0xA002E00F, 0x44092409,
0x624C4409, 0x3263E60A, 0xBFE28905, 0x620C644C,
0xC8806023, 0xE2008B00, 0x4F266023, 0x6EF6000B,
0xD64A4F22, 0x88016062, 0xB2458B03, 0xA0030009,
0xD2470009, 0x2260E640, 0xE200D646, 0x000B4F26,
0x4F222622, 0x6062D641, 0x8B018802, 0x0009B28E,
0xE200D640, 0x000B4F26, 0xD53C2622, 0xE100D43C,
0x2512E701, 0x2470000B, 0xE604D239, 0x2260000B,
0xD4394F22, 0x410BD139, 0xD5390009, 0x6650E1FD,
0x2619D238, 0x2560E700, 0x000B4F26, 0x4F222270,
0xD132D435, 0x0009410B, 0xE7FBD531, 0x26796650,
0x000B4F26, 0x4F222560, 0xD12CD430, 0x0009410B,
0xE7F7D52B, 0x26796650, 0x000B4F26, 0xD5282560,
0x6250942D, 0x000B2249, 0xD5252520, 0x6250E4BF,
0x000B2249, 0x4F222520, 0x8522D225, 0x2008600D,
0x88018911, 0x88038913, 0x88058915, 0x88068942,
0x88088948, 0x8809894E, 0x880A8954, 0x880B895A,
0xA0678960, 0xB0690009, 0xA0640009, 0xB077600C,
0xA0600009, 0xB080600C, 0xA05C0009, 0xFF7F600C,
0x001E2148, 0x001E1000, 0x001E1108, 0x002031FC,
0x002031FE, 0x0020321D, 0x002031E0, 0x001E103F,
0x001E105F, 0x001E102F, 0x001E1090, 0x00203204,
0x001E100B, 0x00203200, 0x00203330, 0x0020145E,
0x001E1028, 0x0020321C, 0x0020333C, 0x0020334C,
0x002031D4, 0x6260D684, 0x8B2B2228, 0x0009B061,
0x600CA029, 0x6260D680, 0x8B232228, 0x0009B069,
0x600CA021, 0x6260D67C, 0x8B1B2228, 0x0009B0C7,
0x600CA019, 0x6260D678, 0x8B132228, 0x0009B0CD,
0x600CA011, 0x6260D674, 0x8B0B2228, 0x0009B125,
0x600CA009, 0x6260D670, 0x8B032228, 0x0009B13D,
0x600CA001, 0x4F26E000, 0x0009000B, 0xD26CD16B,
0xD56C8412, 0x4000C90F, 0xD76B012D, 0xE403D66B,
0xE20F611C, 0x2540E001, 0x25202712, 0x2602000B,
0xE601D262, 0x30668523, 0xE0008D05, 0xD663D260,
0xE0018122, 0x000B2602, 0xD25C0009, 0x600D8523,
0x89052008, 0x8B0A8801, 0x6060D65D, 0x2600CB01,
0xD457D65A, 0xE001E101, 0x000B2612, 0x000B8142,
0xD152E000, 0x8513E501, 0x640D4518, 0x66033453,
0xE0008D05, 0xD551D253, 0x2260E001, 0x000B2502,
0x4F220009, 0x8513D149, 0x6453650D, 0x62494419,
0x227D672E, 0x8801602C, 0x88028909, 0x88038910,
0x8806891A, 0x88078935, 0xA04C893B, 0xD5460009,
0x6652D746, 0x2762D446, 0x622C6261, 0x2421A038,
0x2228625C, 0xD4438B3F, 0x6642D540, 0x2562D440,
0x24018561, 0x6203A02C, 0x2008605C, 0x88108907,
0x88208908, 0x88308909, 0xA02C890A, 0xD23A0009,
0x6222A008, 0xA005D239, 0xD2396222, 0x6222A002,
0x6262D638, 0xD432D531, 0x66212522, 0xA00F626C,
0xD6352421, 0x6261D52D, 0x622CD42D, 0xA0072562,
0xD6322421, 0x8561D529, 0x2562D429, 0x62032401,
0x662D8515, 0x3617610D, 0x65038F01, 0xB0CB2451,
0xA0010009, 0xE000E001, 0x000B4F26, 0xD6190009,
0xD427E101, 0x65412610, 0xD118D717, 0xE20F655D,
0x2752E001, 0x000B2620, 0x2FE62102, 0xD20F4F22,
0x640C8523, 0x8B082448, 0xD511D61D, 0x2621E200,
0x940F8451, 0xA0482049, 0xDE0D8051, 0xC84060E0,
0xE2018D32, 0x89443427, 0xD216D615, 0x2641420B,
0x0009A030, 0x0000FF7F, 0x0020321D, 0x002031D4,
0x002031E0, 0x001E1100, 0x001E100C, 0x00203200,
0x001E1000, 0x001E1001, 0x00203208, 0x002031E8,
0x002031EC, 0x002031F0, 0x0020320C, 0x00203210,
0x00203214, 0x00203218, 0x0020351C, 0x00203526,
0x002031FA, 0x00202362, 0x89123427, 0xD294D693,
0x2641420B, 0xCB8084E1, 0x80E1B0F5, 0xD69160E0,
0x2E00CB04, 0xC93F6060, 0xD68F2600, 0xA001E001,
0xE0002602, 0x000B4F26, 0xD68C6EF6, 0xC8806060,
0xD2868919, 0x88016021, 0xD2898B15, 0x8524E501,
0x89103056, 0xE203D187, 0x2120D487, 0xE00B6541,
0x0656655D, 0xE40FD585, 0x2140E702, 0xD77E2571,
0x000BE001, 0x000B2702, 0x2FE6E000, 0xDE804F22,
0xC88084E1, 0xD57A892C, 0x20088554, 0x61038F28,
0x8553D77C, 0x64036672, 0x8566650C, 0x3520620C,
0xD6798B1E, 0x651CD774, 0x2651644C, 0x60E02741,
0x8904C840, 0x420BD275, 0xA0030009, 0xD2680009,
0x0009420B, 0x0009B09F, 0xE201D167, 0x60E02122,
0xCB04D464, 0x60402E00, 0x2400C93F, 0x6023A001,
0x4F26E000, 0x6EF6000B, 0x2FB62FA6, 0x2FD62FC6,
0xDA622FE6, 0x66A1E240, 0x3622DC5E, 0x62638900,
0x6ED36D2C, 0x4E2136D8, 0x4E212A61, 0xDB61D460,
0xE700A00F, 0x770162B2, 0x71026123, 0x66212B12,
0x71026213, 0x61212B12, 0x651D666D, 0x356C4528,
0x627C2452, 0x8BED32E3, 0xC90360D3, 0x8B108803,
0x617367B2, 0x2B127102, 0x71026E13, 0x2B126571,
0x655D6DE1, 0x422862DD, 0x325CE107, 0xA00C2C10,
0x88022422, 0xA0038B01, 0x8801E203, 0xE2018B05,
0x66B22C20, 0x655D6561, 0xE60F2452, 0x67A12C60,
0x8B052778, 0xDD38DC44, 0xEB01EA00, 0x2DB22CA2,
0x6DF66EF6, 0x6BF66CF6, 0x6AF6000B, 0x2FE62FD6,
0xE240DD36, 0x362266D1, 0x62638900, 0x3678672C,
0x7703DE38, 0x47212D61, 0x64E2D635, 0xA00E4721,
0x6562E100, 0x62537101, 0x74012450, 0x24204219,
0x45297401, 0x74012450, 0x24504519, 0x621C7401,
0x8BEE3273, 0x66E24200, 0x420061D1, 0x2118362C,
0x2E628F06, 0xDD1CD728, 0xE501E400, 0x2D522742,
0x000B6EF6, 0x2FD66DF6, 0x4F222FE6, 0xED0AEE01,
0x64E3BC97, 0xBC9C64E3, 0x62EC7E01, 0x8BF732D7,
0xBC9FEE01, 0x64E364E3, 0x7E01BCA4, 0x32D762EC,
0x4F268BF7, 0x000B6EF6, 0xD1186DF6, 0xD418920D,
0x72122122, 0x2422D617, 0xD7177204, 0x72202622,
0x2722D116, 0x000B7230, 0x137A2122, 0x002031FA,
0x0020246E, 0x001E1015, 0x00203200, 0x001E1001,
0x002031D4, 0x001E1100, 0x002031FE, 0x002031EC,
0x001E1000, 0x002031F0, 0x002031FC, 0x00202362,
0x001E100C, 0x002031E8, 0x00203204, 0x00203208,
0x0020320C, 0x00203210, 0x00203214, 0x00203218,
0x4F222FE6, 0xD6507FFC, 0x88016060, 0xE2018951,
0x2620BFBB, 0xD54ED14D, 0xDE4E6010, 0x64E36552,
0x7402C840, 0x8D22D14C, 0xD24C7502, 0xE601D74C,
0xE7042722, 0x76016255, 0x626C2421, 0x8FF93273,
0xD4437402, 0x6242E601, 0x640D8528, 0x67494419,
0x275D657E, 0x81E4607C, 0xE417D542, 0x67557601,
0x3243626C, 0x8FF92171, 0xA0207102, 0xD23E0009,
0xE601D73B, 0xE7042722, 0x76016255, 0x626C2421,
0x8FF93273, 0xD4327402, 0x6242E601, 0x640D8528,
0x67494419, 0x275D657E, 0x81E4607C, 0xE417D533,
0x67557601, 0x3243626C, 0x8FF92171, 0x924A7102,
0xD2262E21, 0x5E23D72E, 0x64F22FE2, 0x604365F2,
0x2700C980, 0xC9606043, 0x80716103, 0xC9036043,
0x80724519, 0x65F2605C, 0x817266F2, 0x46194629,
0x606C4529, 0x4018645C, 0x8173304C, 0x21185E23,
0x64F22FE2, 0x6E4C62F2, 0x602C4219, 0x66F262F2,
0x46294018, 0x461930EC, 0x42298174, 0x652C606C,
0x305C4018, 0x81758F07, 0x0009BC9D, 0x2228620C,
0xA00A8908, 0x60130009, 0x8B038840, 0x0009B009,
0x0009A003, 0xE202D60F, 0x7F042622, 0x000B4F26,
0x000B6EF6, 0x060A0009, 0x0020321C, 0x001E1000,
0x00203208, 0x0020351C, 0x00203528, 0x002034C0,
0x002031F0, 0x002034F0, 0x002034EE, 0x002034C2,
0x002031D4, 0x00203200, 0x4F222FE6, 0xDE937FFC,
0x200884E9, 0x2F008D06, 0xD692D491, 0x0009460B,
0x64F0B194, 0x6620D290, 0x89022668, 0xC9BF60E0,
0x7F042E00, 0x000B4F26, 0x000B6EF6, 0x2FE60009,
0xDE8A4F22, 0x60E0D68A, 0xCBC0D48A, 0x62602E00,
0xC803602C, 0x40218904, 0x70014021, 0x6603A002,
0x66034009, 0xD684616D, 0xE500A004, 0x75016262,
0x74042422, 0x3213625D, 0xD2808BF8, 0x0009420B,
0xC9BF84E2, 0x4F2680E2, 0x6EF6000B, 0x2FE62FD6,
0x7FFC4F22, 0x6260D67A, 0x89442228, 0xD56FE100,
0x60502610, 0xCB40D477, 0x2500440B, 0x8D052008,
0x62E06E03, 0x7104612C, 0x2F11A006, 0xD472D66A,
0xDD726760, 0x657C4D0B, 0xE23C6D1D, 0x8B033D27,
0xD264D46F, 0x0009420B, 0x4D214D21, 0xA005D76D,
0x66E6E400, 0x357C4508, 0x74012562, 0x35D3654D,
0xD7698BF7, 0x6172E003, 0x81114018, 0x6E7260F1,
0x81E2700C, 0xD4656172, 0xDD658113, 0x4D0BDE65,
0xE2016572, 0xD4642E22, 0x420BD252, 0xD6530009,
0xC93F6060, 0x7F042600, 0x6EF64F26, 0x6DF6000B,
0x2FC62FB6, 0x2FE62FD6, 0xD25C4F22, 0x6B436E73,
0x420B6C53, 0x20086D63, 0x61038F08, 0xD245D458,
0x6EF64F26, 0x6CF66DF6, 0x6BF6422B, 0x21B060C3,
0x60D38011, 0xE5008111, 0x64BCA007, 0x6053655D,
0x665300EC, 0x7501361C, 0x625D8064, 0x8BF53243,
0x6060D636, 0x2600C9BF, 0x6EF64F26, 0x6CF66DF6,
0x6BF6000B, 0x7FC44F22, 0x720262F3, 0x22512F41,
0x45297202, 0x60632251, 0xE5C4E682, 0x67F38121,
0x655C666C, 0xE408BFBC, 0x4F267F3C, 0x0009000B,
0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6,
0xE1007FC4, 0x6513ECFF, 0x6B136CCD, 0xDE36D735,
0xEDFF64F3, 0xD835EA04, 0x6053655C, 0x027D4000,
0x32C0622D, 0x66038D0D, 0x09ED6063, 0x2491027D,
0x24217402, 0x698202ED, 0x3928622D, 0x74022892,
0x75017104, 0x6063625C, 0x07D532A2, 0x0EB58FE4,
0x2448641C, 0xE6808905, 0x67F3E5C5, 0xBF7F666C,
0x7F3C655C, 0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6,
0x000B69F6, 0xD11E68F6, 0x6012D21E, 0xCB20E405,
0x2102E500, 0x000B2242, 0x00002252, 0x001E1017,
0x00203358, 0x0020145E, 0x002031A2, 0x001E1015,
0x001E10BF, 0x00117800, 0x001E10FC, 0x00200308,
0x002031A8, 0x002025C6, 0x0020335C, 0x002014AA,
0x00203378, 0x0011788C, 0x002031A4, 0x00202D88,
0x002011E4, 0x001E2130, 0x00203380, 0x00202588,
0x00203384, 0x002031BC, 0x002031C4, 0x002034BC,
0x001C3500, 0x001D4004, 0xD565D164, 0xE400D765,
0x2142E20F, 0x17411154, 0xD5632722, 0x9669D763,
0x15412572, 0x96661562, 0xE6011565, 0xD5601165,
0x666CE6F8, 0x25422542, 0x25422542, 0x25422542,
0x25622542, 0x7601E727, 0x67632572, 0x25627797,
0xE7042572, 0x2572E248, 0xE2192522, 0xE2702522,
0x25422542, 0x25422542, 0x25222542, 0x2522E20C,
0x25422542, 0x25422542, 0x25422542, 0x25422542,
0x000B154A, 0xE2081145, 0x0009422B, 0x2FE62FD6,
0x7FFC4F22, 0xC8206043, 0x6E438D02, 0x0009BE6D,
0xC81060E3, 0xBE6A8901, 0x60E30009, 0x8901C840,
0x0009BE8C, 0xC80160E3, 0xDD3E8938, 0xC80260D0,
0x2F008D03, 0x460BD63C, 0x60F00009, 0x8902C804,
0x460BD63A, 0x62F00009, 0xC8806023, 0x60D08902,
0x2D00C97F, 0xC8016023, 0xD6358906, 0x0009460B,
0x0009A007, 0x51630601, 0x8902C808, 0x460BD631,
0x60F00009, 0x8902C810, 0x420BD22F, 0xD52F0009,
0x88026052, 0xD22E8B03, 0xA005E604, 0x88012260,
0xD22B8B02, 0x2260E601, 0x2522E200, 0xC88060E3,
0xD628892E, 0x60E36E60, 0x8902C880, 0x420BD226,
0x60E30009, 0x8902C840, 0x420BD224, 0x60E30009,
0x8902C802, 0x420BD222, 0x60E30009, 0x890EC804,
0x410BD120, 0xBF0E0009, 0xBF4D0009, 0xD51E0009,
0x6050D41E, 0xC908D71E, 0xBF842500, 0x60E32472,
0x8905C808, 0x7F04D21B, 0x6EF64F26, 0x6DF6422B,
0x4F267F04, 0x000B6EF6, 0x00006DF6, 0x001C581C,
0xA000A000, 0x001D0100, 0x001D4000, 0x00040021,
0x001C589C, 0x001E1021, 0x00201640, 0x00201662,
0x00201CA0, 0x0020167A, 0x00201688, 0x00203200,
0x001E100B, 0x001E1028, 0x002016DE, 0x002016EA,
0x00201690, 0x002016AE, 0x001E1000, 0x0010F100,
0x12345678, 0x002016C6, 0x644CD6A7, 0x000B346C,
0xD6A62450, 0x346C644C, 0x2450000B, 0x644CD6A4,
0x000B346C, 0x625C2450, 0x4208616D, 0x42084119,
0x42006019, 0x670E614C, 0xD49E321C, 0x4200207D,
0x324CC90F, 0x2200000B, 0x4208625C, 0x42004208,
0x324C644C, 0x4200D498, 0x000B324C, 0x2FE62260,
0x614C4F12, 0x4100D493, 0x6710314C, 0xE29F666D,
0x27294619, 0x6E536269, 0x672E6573, 0x4221227D,
0x42214221, 0x7601662C, 0xE4014608, 0x34E84608,
0x644C4600, 0x071A0467, 0x2150257B, 0x000B4F16,
0x4F226EF6, 0xD2857FE8, 0x88016021, 0xD2848B7B,
0x26686621, 0xD2838B77, 0x26686621, 0xE50F8B73,
0xE401BFA2, 0xBFA4E501, 0xE586E400, 0xE400655C,
0x2F50BFA4, 0xBFA1E401, 0xE602E506, 0x60634618,
0x81F2E401, 0x6543BF9F, 0xE40185F2, 0xBFAB6543,
0x85F26603, 0x6543E401, 0x6603BFB1, 0xE40265F0,
0x6053756C, 0x80F8BF80, 0xBF82E402, 0x84F8E512,
0x7090E402, 0x6503BF82, 0x4618E602, 0x81F66063,
0xBF80E402, 0x85F6E500, 0x6603E402, 0xE500BF8C,
0xE40285F6, 0xBF926603, 0xE5FEE500, 0xE010655C,
0xBF61E403, 0xE5130F54, 0xE40EBF63, 0x05FCE010,
0xBF63E40E, 0xE5007585, 0xBF64E403, 0xE500E640,
0xBF71E403, 0xE500E640, 0xBF78E403, 0xE5FFE640,
0xE014655C, 0xBF47E404, 0xE40F0F54, 0xE504BF49,
0x05FCE014, 0xBF49E40F, 0xE5017584, 0xBF4AE640,
0xE501E404, 0xBF57E640, 0xE501E404, 0xE404E640,
0xAF5C7F18, 0x7F184F26, 0x000B4F26, 0x4F220009,
0xD2427FF0, 0x88016021, 0xD2418B71, 0x26686621,
0xD2408B6D, 0x26686621, 0xE50F8B69, 0xE401BF1C,
0xBF1EE501, 0xE586E400, 0xE400655C, 0x2F50BF1E,
0xBF1BE401, 0xE401E506, 0xBF1C6543, 0xE401E640,
0xBF296543, 0xE401E640, 0xBF306543, 0x65F0E640,
0x756CE402, 0xBEFF6053, 0xE40280F4, 0xE512BF01,
0xE40284F4, 0xBF017090, 0xE6406503, 0xBF02E402,
0xE640E500, 0xBF0FE402, 0xE640E500, 0xBF16E402,
0xE5FEE500, 0x6053655C, 0xBEE5E403, 0xE51380F8,
0xE40EBEE7, 0xE40E84F8, 0xBEE77085, 0xE5006503,
0xBEE8E640, 0xE500E403, 0xBEF5E640, 0xE500E403,
0xBEFCE640, 0xE5FFE403, 0x6053655C, 0xBECBE404,
0xE40F80FC, 0xE504BECD, 0xE40F84FC, 0xBECD7083,
0xE5016503, 0xBECEE640, 0xE501E404, 0xBEDBE640,
0xE501E404, 0xE404E640, 0xAEE07F10, 0x7F104F26,
0x000B4F26, 0x00000009, 0x001E102F, 0x001E1080,
0x001E1090, 0x001E103F, 0x001E103E, 0x002031FA,
0x002031FC, 0x002031FE, 0xD21DD11C, 0x66206010,
0x676C7001, 0x3700C90F, 0xE5008D13, 0x67106210,
0x7701622C, 0x64232170, 0xD6166010, 0x44084408,
0x3428C90F, 0x62602100, 0x7201D513, 0x44082620,
0x000B354C, 0xD10F6053, 0x25586510, 0xE6008D13,
0xD60DD40B, 0x655C6540, 0x47086753, 0x37584708,
0x47086540, 0x24507501, 0x367C6040, 0x2400C90F,
0x72FF6210, 0x000B2120, 0x00006063, 0x002031A1,
0x002031A0, 0x002031A2, 0x00202DC8, 0x7FFC4F22,
0xE680D19D, 0x666C6212, 0xD29C2F22, 0x67F36563,
0x420B7542, 0x7F04E404, 0x000B4F26, 0xE6800009,
0xD296666C, 0xE7006563, 0x422B7540, 0xE6806473,
0xD292666C, 0xE7006563, 0x422B7543, 0x2F866473,
0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6, 0x7FF44F22,
0xDD8CD28B, 0x72011F21, 0xDB8B1F22, 0x6AF2E840,
0x5211D18A, 0x36206612, 0xA0A78B01, 0x60610009,
0x8801C903, 0xA0A18B01, 0xD9840009, 0x420BD284,
0x55036493, 0x845C6A03, 0x30E0EE84, 0xD1818B79,
0x606C6610, 0x8B3D8801, 0x6210D17F, 0x892F2228,
0xD57EE701, 0x64522B72, 0x1442E003, 0xD57C6252,
0xE6004018, 0x21608121, 0xD17A6453, 0x6E527404,
0x60126742, 0xCB20DC78, 0x76012102, 0x3283626D,
0x25E28BFB, 0x2472DE71, 0x62E267C2, 0x1274D173,
0x604164E2, 0x2401CB01, 0xEE0066E2, 0xDC702C62,
0xEC012C62, 0x2DC2410B, 0x4C18EC01, 0x2BE22DC2,
0xD764DE6C, 0xD16C60E2, 0xCB01E202, 0x27202E02,
0x2122A02F, 0x8B2C2008, 0xE701DE68, 0xD466EC00,
0x2170D264, 0xEE012EC2, 0x612224E2, 0x2169E6FE,
0xE01E2212, 0x54F10C5C, 0x24C0E01F, 0x56F2025C,
0x26207510, 0xD75EE600, 0xEE06D45E, 0x76018456,
0x6C542700, 0x31E3616C, 0x740124C0, 0x77018FF6,
0xE494D259, 0x72012240, 0x2250E500, 0xE605720F,
0xD2562260, 0x65A36493, 0xEE01420B, 0xAF6F4E18,
0x2FA22DE2, 0xD45265F2, 0x66428553, 0x3262620D,
0xD4508907, 0x410BD150, 0xD7500009, 0xAF57E601,
0xD43A2762, 0xDD37D149, 0x65F2410B, 0xD44CEE01,
0x4E18D64C, 0x2DE2460B, 0x0009AF4A, 0x7F0C2FA2,
0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6, 0x000B69F6,
0x4F2268F6, 0x85467FF4, 0x2F01E681, 0x666C8547,
0x854881F1, 0x81F2D225, 0x67F38542, 0x854381F3,
0x81F4E40C, 0x65636053, 0x420B81F5, 0x7F0C7540,
0x000B4F26, 0x2F860009, 0x2FA62F96, 0x2FC62FB6,
0x2FE62FD6, 0x7FEC4F22, 0xE800D11A, 0xD4322F12,
0x1F416183, 0x6A13DB20, 0x4A08D630, 0xDE20E001,
0x4A00460B, 0x1F023AEC, 0x52B166B2, 0x8B013620,
0x0009A19B, 0xC9036061, 0x8B018801, 0x0009A195,
0xDE275263, 0x8B4F32E0, 0x420BD20D, 0xDE2564B3,
0xD70DD50E, 0xED01DC0B, 0x2E02E100, 0x27D02502,
0xAFE12C10, 0x00002E16, 0x001C3D9C, 0x00201F40,
0x0011779A, 0x001C3D30, 0x001D0104, 0x00202DC0,
0x00201162, 0x002031B1, 0x002031B0, 0x002031AC,
0x001C3B9C, 0x001C3500, 0x00202D98, 0x00201276,
0x001C3D00, 0x001C36F8, 0x00117708, 0x002031B4,
0x0011778C, 0x00117792, 0x00117788, 0x00201180,
0x00203188, 0x00202D88, 0x002011E4, 0x001E2130,
0x0020349C, 0x0020145E, 0x002034A8, 0x00202C80,
0x00117780, 0x0011770C, 0xC8018561, 0x5C63897A,
0x660385C2, 0x6403C903, 0x650D85C3, 0x40216053,
0xC93F4021, 0x6E034500, 0x252D322A, 0xE2106053,
0x3E23C901, 0x6D038D23, 0x4408D79D, 0x44086570,
0x440062E3, 0x25584200, 0x342C8F0F, 0x6043D299,
0x697D072D, 0x60994919, 0x201D610E, 0x60D381F6,
0x8F0C8801, 0xA00A697C, 0xD29369E3, 0x052D6043,
0x4219625D, 0x670E6029, 0x81F6207D, 0xD18F695C,
0x22286210, 0xE9FF8901, 0xEEFF699C, 0x6EEC659D,
0x8B0F35E0, 0x4C0BDC8A, 0x540364B3, 0xBF20E502,
0xD4886E03, 0x410BD188, 0xD78865E3, 0xD488ED01,
0x27D2A01E, 0x26E9EEFC, 0x81C26063, 0x97C585C3,
0x62032079, 0x450885F6, 0x6063260B, 0x81C2252B,
0x81C36053, 0xE10885C4, 0x201B4118, 0x62B281C4,
0x20E98521, 0x64B28121, 0xCB016041, 0xD4792401,
0x450BD579, 0x60B20009, 0x57F266F2, 0x2A02CB01,
0x2672AF22, 0xD26E8561, 0x8F02C802, 0xA09F64B3,
0x420B0009, 0xDC710009, 0x5E036503, 0x07CEE04C,
0x7701DD6F, 0x6CD20C76, 0x7C01D664, 0x6D602DC2,
0x89062DD8, 0xD264D463, 0xED01420B, 0xA07ED763,
0x625127D2, 0x4118E10F, 0x2219E402, 0x32404418,
0x85518B11, 0x20D9EDFC, 0x60518151, 0xCB017DE3,
0x85E12501, 0x20D9D65F, 0x460B81E1, 0x6CF264B3,
0xA06457F2, 0x6D512C72, 0x4D196DDD, 0x66DE6DD9,
0x7D012D6D, 0x610360DC, 0x88014118, 0x25118F45,
0x6462D653, 0x26427401, 0x660D85E3, 0x40216063,
0xC93F4021, 0x6D034600, 0x262D322A, 0xC8016063,
0xDC4ED14D, 0x964A8901, 0xE6002D6B, 0x0F64E010,
0xE01064DD, 0x607C07FC, 0x021D4000, 0x3240622D,
0x66038D12, 0x021D6063, 0x3270E7FF, 0xA00B8B01,
0xE01001D5, 0xE60402FC, 0x0F247201, 0x3262622C,
0x06FC8BE7, 0x4600666C, 0x01CD6063, 0x0C157101,
0x6711D13B, 0x3C406C7D, 0x62118907, 0x88FF602D,
0x21D18903, 0xE201DD37, 0x85512D20, 0x20D9EDFC,
0x60518151, 0xCB01D22F, 0x420B64B3, 0xE0102501,
0xD43102FC, 0xE001612C, 0x67F2440B, 0x85EF2702,
0x54F1D22E, 0x650D420B, 0x0009AE7E, 0x80007E03,
0x0009420B, 0x6E035403, 0xED088544, 0x20D94D18,
0x8B0330D0, 0xE501BE3D, 0x0009A007, 0xDD248541,
0x22D8620D, 0xBE348901, 0xD412E500, 0x420BD212,
0xD71265E3, 0xAE5FED01, 0x780127D2, 0xEE04618D,
0x8D0231E7, 0xAE4E7B08, 0x7F140009, 0x6EF64F26,
0x6CF66DF6, 0x6AF66BF6, 0x000B69F6, 0x000068F6,
0x002034B8, 0x0020339C, 0x0020341C, 0x0020319C,
0x00201162, 0x00202D90, 0x00201180, 0x001E212C,
0x002034A0, 0x002034A4, 0x0020145E, 0x00202D2C,
0x002034BC, 0x002011E4, 0x002031BC, 0x002031C4,
0x002031B8, 0x002031BA, 0x00202C80, 0x002014AA,
0x00008000, 0x4F222FE6, 0x6E22D212, 0xC84060E3,
0x22E28D02, 0x0009BCFA, 0x4218E240, 0x89012E28,
0x0009BD05, 0xC81060E3, 0xD40B8905, 0x420BD20B,
0xBD040009, 0x60E30009, 0x8901C805, 0x0009BDEB,
0xC80260E3, 0x4F268902, 0x6EF6AD01, 0x000B4F26,
0x00006EF6, 0x001C3510, 0x002034B0, 0x0020145E,
0x080A0C0E, 0x00020406, 0x1A1C1E20, 0x12141618,
0x2E303234, 0x26282A2C, 0x3A3C3E40, 0x6C625648,
0x41112F26, 0xE2208F18, 0x890B3123, 0x321CD204,
0xD1026220, 0x412B312C, 0x00090009, 0x00202CAA,
0x00202C60, 0x000BE000, 0x400062F6, 0x40004000,
0x40004000, 0x40004000, 0x62F6000B, 0x40004000,
0x40004000, 0x40004000, 0x40184000, 0x62F6000B,
0x40004000, 0x40004000, 0x40004000, 0x40284000,
0x62F6000B, 0x40004000, 0x40184000, 0x000B4028,
0xC90F62F6, 0x40054005, 0x40054005, 0x62F6000B,
0x4005C907, 0x40054005, 0x62F6000B, 0x4005C903,
0x000B4005, 0xC90162F6, 0x000B4005, 0x000062F6,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x544F0D0A,
0x46205355, 0x00003A57, 0x206C754A, 0x32203532,
0x20373030, 0x313A3132, 0x37323A32, 0x00000000,
0x00000D0A, 0x00000043, 0x42707372, 0x3D206675,
0x554E203D, 0x202C4C4C, 0x6E49677A, 0x4E497274,
0x6D754E51, 0x0000003D, 0x61766E49, 0x2064696C,
0x72657375, 0x20726F20, 0x2079656B, 0x00214449,
0x52504545, 0x57204D4F, 0x65746972, 0x6461202C,
0x003D7264, 0x6C617620, 0x0000003D, 0x00000A0D,
0x6E6B6E55, 0x206E776F, 0x6D6D6F63, 0x3D646E61,
0x00000000, 0x000A0D52, 0x203A3051, 0x00000020,
0x203A3151, 0x00000020, 0x203A3251, 0x00000020,
0x203A3351, 0x00000020, 0x203A3451, 0x00000020,
0x61437748, 0x7262696C, 0x6F697461, 0x6620206E,
0x0A6C6961, 0x0000000D, 0x73696F4E, 0x61432065,
0x7262696C, 0x6F697461, 0x6166206E, 0x21216C69,
0x00000D0A, 0x00000072, 0x00205220, 0x00000D0A,
0x62735576, 0x7473725F, 0x00000A0D, 0x62735576,
0x7375735F, 0x646E6570, 0x00000A0D, 0x62735576,
0x7365725F, 0x000A0D6D, 0x00000042, 0x72746E49,
0x6D652051, 0x2C797470, 0x49677A20, 0x4972746E,
0x754E514E, 0x00003D6D, 0x654C7245, 0x0000006E,
0x00000049, 0x20746F4E, 0x756F6E65, 0x49206867,
0x4220514E, 0x0A0D6675, 0x00000000, 0x000000FF,
0x00020001, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x010E010D,
0x00020003, 0x01090108, 0x0002010A, 0x02000003,
0x02020201, 0x02040203, 0x02060205, 0x02020200,
0x02040203, 0x020C0207, 0x020E020D, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x010E010D,
0x00FF010F, 0x01090108, 0x010B010A, 0x020000FF,
0x02020201, 0x02040203, 0x02060205, 0x02020200,
0x02040203, 0x020C020B, 0x020E020D, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00205220,
0x00000046, 0x00000059, 0x73204142, 0x003D7165,
0x49544120, 0x0000204D, 0x00000000, 0x00000000,
0x002E0209, 0x80000101, 0x000409FA, 0x00FF0400,
0x05070000, 0x02000201, 0x82050700, 0x00020002,
0x03830507, 0x07010040, 0x40020405, 0x02090000,
0x0101002E, 0x09FA8000, 0x04000004, 0x000000FF,
0x02010507, 0x07000040, 0x40028205, 0x05070000,
0x00400383, 0x04050701, 0x00004002, 0x00000000,
0x00000000, 0x07090000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, };
const u32_t zcFwImageSize=13656;

View File

@ -0,0 +1,721 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "cprecomp.h"
const u32_t zcFwImage[] = {
0x0009000B, 0x4F222FE6, 0xD2287FFC, 0x0009420B,
0x0009B019, 0x9446D526, 0xE600A003, 0x8D043642,
0x60527601, 0x8DF9C840, 0xD4222F02, 0x4E0BDE22,
0xD4220009, 0x00094E0B, 0x4E0BD421, 0x7F040009,
0xA0254F26, 0x4F226EF6, 0x410BD11E, 0xD41E0009,
0x0009440B, 0x450BD51D, 0xD71D0009, 0x611DE1FF,
0x2712D21C, 0xD41C5029, 0xE1FFCB01, 0x1209E501,
0x12112212, 0xD5192452, 0xD6199716, 0xE7002572,
0x2670D218, 0x2272D618, 0x4F26E201, 0x2622000B,
0xDD17DC16, 0x4C0BDE17, 0x4D0B0009, 0x4E0B0009,
0xAFF80009, 0x27100009, 0x00000640, 0x0020095A,
0x001C001C, 0x00202940, 0x00200E2A, 0x0020294C,
0x00202964, 0x00200CF0, 0x00200F26, 0x002009C4,
0x001C3510, 0x001C3624, 0x001E212C, 0x002028EC,
0x00202850, 0x002028F4, 0x00202900, 0x00200BEC,
0x00201FD4, 0x002017B8, 0x2FD62FC6, 0x4F222FE6,
0xDEA17FA4, 0x61E0E01C, 0x7D016DE3, 0x61D00F14,
0xD59FD49E, 0x450BE020, 0xE0200F14, 0xE78004FC,
0x604C66E2, 0x7D7F677C, 0x1F693070, 0x2D628F17,
0x01FCE01C, 0x641CE500, 0xD797DE96, 0x3243625D,
0xA21A8B01, 0x655D0009, 0x31EC6153, 0xE0286C10,
0x6D530FC4, 0x3D7C62CE, 0xAFEF2D20, 0x20087501,
0xE01C8B15, 0xE50001FC, 0xD78BDE8A, 0x641CA00A,
0x6C53655D, 0x66C23CEC, 0x66626253, 0x2262327C,
0x1F697504, 0x3243625D, 0xA1F68BF2, 0x88012D10,
0xE01C8B16, 0xE40001FC, 0x671C2D40, 0x624DDE7D,
0x8B013273, 0x0009A1E9, 0x62E3644D, 0x72046D43,
0x3DEC6143, 0x65D2312C, 0x74086C12, 0x25C2AFEF,
0x8B188804, 0x01FCE01C, 0x2D40E400, 0xDE71671C,
0x3273624D, 0xA1D08B01, 0x644D0009, 0x62E36D43,
0x65D23DEC, 0x61437204, 0x6612312C, 0x74086C52,
0xAFED2C69, 0x880525C2, 0xE01C8B18, 0xE40001FC,
0x671C2D40, 0x624DDE63, 0x8B013273, 0x0009A1B5,
0x6C43644D, 0x3CEC62E3, 0x720465C2, 0x3D2C6D43,
0x615266D2, 0x216B7408, 0x2512AFED, 0x8B138830,
0xE200DE58, 0x64E22D20, 0x8B042448, 0x420BD257,
0xA19A0009, 0x55E10009, 0x57E356E2, 0xDD545CE4,
0x2FC64D0B, 0x7F04A191, 0x89018828, 0x0009A0EA,
0xE143DE4C, 0x622D62E1, 0x8F033217, 0x56FB1FEB,
0x2621E240, 0x8B013217, 0x0009A0D5, 0xE1015EFB,
0x301685E1, 0xA0CE8B01, 0xE4010009, 0x2D4055FB,
0x6451B179, 0xE14357FB, 0xE0546271, 0x3517652D,
0x0F568D41, 0x3563E640, 0xE6008B05, 0x0F65E034,
0xA00FE11A, 0x615372C0, 0x41214121, 0x41214121,
0x45214121, 0x45214521, 0xC9036053, 0xE0346603,
0x71180F65, 0x2209E007, 0x641DE030, 0x0F2565F3,
0x1F4EB1F1, 0x04FDE034, 0x674DE030, 0x47080CFD,
0x607361CD, 0x4108D22B, 0xE00F0CFE, 0x1F1F420B,
0x2CD96D07, 0x5EFB6073, 0x85E20FC6, 0x420B51FF,
0x2C0B600D, 0x54FE6073, 0xB1BB0FC6, 0xE05465F3,
0x652D62E1, 0xE6400F56, 0x89623563, 0xE050E100,
0x60230F15, 0x4008C903, 0x6D034000, 0xE0406103,
0xE0440FD6, 0xD217EEFF, 0x6EEC0FF6, 0x0F26E058,
0x60E3420B, 0x42216253, 0x42214221, 0x66234221,
0x326C4200, 0x45214200, 0xE0486707, 0x0F764521,
0xC9036053, 0x40085CFB, 0x7C0630FC, 0x6E036D2D,
0x1FD51FC6, 0x1F04A02E, 0x00117D00, 0x00202968,
0x00200E2A, 0x00117D04, 0x00117D84, 0x00200700,
0x0020074C, 0x00202034, 0x0FD6E04C, 0x05FEE044,
0x64D3B189, 0x64E2E048, 0xE04006FE, 0x2E422469,
0x01FE67C4, 0x667CE058, 0x420B02FE, 0x240B6063,
0x05FEE044, 0xB15D2E42, 0xE05064D3, 0x7D0101FD,
0x0F157101, 0x02FDE050, 0x3262E606, 0x56FB8BDC,
0x55FB6261, 0x85514200, 0x302C750C, 0x6103701B,
0x64F3E600, 0xE704A004, 0x76016256, 0x74042422,
0x3273626D, 0x65F38BF8, 0x641DB13C, 0xB0D256FB,
0xA0AA6461, 0xD4880009, 0xE201D588, 0x2D20450B,
0x0009A0A3, 0x8B078829, 0xE200DE85, 0x66E22D20,
0x646DB0A1, 0x0009A099, 0x622CE281, 0x8B3D3020,
0xD680E738, 0xE0442D70, 0xE0480C6E, 0x6E621DC1,
0x51611DE2, 0x54621D13, 0x55651D44, 0x57631D55,
0x5C661D76, 0x0E6E1DC7, 0x1DE8E040, 0xE050016E,
0x54641D19, 0x056E1D4A, 0x1D5BE04C, 0xE054076E,
0x0C6E1D7C, 0x1DCDE058, 0xE044026E, 0xED001D2E,
0xE04806D6, 0x16D126D2, 0x16D516D2, 0x16D616D3,
0xE04006D6, 0xE05006D6, 0x06D616D4, 0x06D6E04C,
0x06D6E054, 0x06D6E058, 0x1F29A057, 0x622CE282,
0x89313020, 0x05FCE020, 0x625CE683, 0x3260666C,
0xD65D8B07, 0x2650E500, 0x52617680, 0xA044D65B,
0xE6902622, 0x3260666C, 0xD2578B16, 0xE500D658,
0x60622250, 0xCB20D257, 0xE6052602, 0xD6562262,
0x2252460B, 0x420BD255, 0xD2550009, 0x2262E601,
0x4618D254, 0x2262A029, 0xD254D453, 0xD4546542,
0x0009420B, 0x0009A021, 0xE524D647, 0xD5452650,
0x16215257, 0x16225258, 0x16235259, 0x1624525A,
0x1625525B, 0x1626525C, 0x1627525D, 0x1628525E,
0x1F29525F, 0xE2001629, 0x15281527, 0x152A1529,
0x152C152B, 0x152E152D, 0x7F5C152F, 0x6EF64F26,
0x000B6DF6, 0x4F226CF6, 0xE240614D, 0x89173123,
0x3127E21F, 0xD43B8908, 0xE001D53B, 0x6642450B,
0x26796707, 0x2462A00C, 0x3127E23F, 0xD7358908,
0x71E0D635, 0x460BE001, 0x62075571, 0x17512529,
0x000B4F26, 0x4F220009, 0xE240614D, 0x89153123,
0x3127E21F, 0xD42B8907, 0x6642D22B, 0xE001420B,
0xA00B260B, 0xE23F2462, 0x89073127, 0xD626D725,
0x71E05571, 0xE001460B, 0x1751250B, 0x000B4F26,
0xE6400009, 0x46284618, 0x6252D520, 0x89FC2268,
0x0009000B, 0x4618E680, 0xD51C4628, 0x22686252,
0x000B89FC, 0xA0010009, 0x7201E200, 0x8BFC3242,
0x0009000B, 0x4618E680, 0xD5154628, 0x22686252,
0x000B8BFC, 0x00000009, 0x0020296C, 0x00200E2A,
0x00117D04, 0x00202858, 0x00117D80, 0x002028EC,
0x001C3500, 0x001D4004, 0x00200F26, 0x002009C4,
0x001E212C, 0x001C3D28, 0x00117D00, 0x00200E8A,
0x00202984, 0x001C3704, 0x00202034, 0x001C373C,
0x001C3700, 0x4F222FE6, 0x6E537FFC, 0x2F42BFCA,
0xD61561E2, 0x1615E280, 0x421854E1, 0x55E21646,
0x16574228, 0x6EF257E3, 0x2E2B1678, 0x7F0426E2,
0xAFA74F26, 0x2FC66EF6, 0x2FE62FD6, 0xDD0A4F22,
0xBFAF6C53, 0xBF946E43, 0xBFAB2DE2, 0x51D50009,
0x54D62C12, 0x55D71C41, 0x56D81C52, 0x4F261C63,
0x6DF66EF6, 0x6CF6000B, 0x001C370C, 0x0009A0F8,
0xD19B4F22, 0xD49B9299, 0x2122B00D, 0x9795E605,
0xB0229595, 0xB0366463, 0xB03A0009, 0xB03D0009,
0xA06C0009, 0x4F124F26, 0xD1934F02, 0x94873145,
0x4609060A, 0x46094609, 0x00293646, 0xD78CD58F,
0x2500CA01, 0x4F062762, 0x4F16000B, 0xBFEA4F22,
0xB0230009, 0xA0520009, 0x2FE64F26, 0x6E63D188,
0x44186612, 0x4528926D, 0x26294408, 0x44084500,
0x4400265B, 0x4708264B, 0x47082162, 0x27EBD181,
0x000B2172, 0xD1806EF6, 0xE603D480, 0x000B2162,
0xD27F2462, 0xE40A9656, 0x2262AFB0, 0x2FC62FB6,
0x2FE62FD6, 0xDC7B4F22, 0x2C22E201, 0xBFA5E40A,
0x60C27C44, 0xCB01ED00, 0x60C22C02, 0xC901EB64,
0x6E03A008, 0x89073DB2, 0xE40160C2, 0xBF95C901,
0x7D016E03, 0x8BF52EE8, 0x8B033DB2, 0xD26FD46E,
0x0009420B, 0x4F26E40A, 0x6DF66EF6, 0xAF856CF6,
0x44116BF6, 0x604B8F01, 0x000B6043, 0x2F860009,
0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6, 0x7FFC4F22,
0x6DA3EA00, 0xDC626BA3, 0x9914E864, 0x8B4E2BB8,
0x3AE3EE0A, 0x60C2894B, 0xCB02ED00, 0x62C22C02,
0x2F0260C2, 0xA010C902, 0x096C6E03, 0x5BB45288,
0x1FFF09B4, 0x01FF03C4, 0x89083D83, 0xE46460C2,
0xC9022F02, 0x6E03BF52, 0x2EE87D01, 0xD1518BF4,
0x54C1D551, 0x66526412, 0x6269EE01, 0x4220622F,
0x622F4219, 0x4E182299, 0x8D0322E8, 0xE4FF6423,
0x3428229A, 0x6572D749, 0x622F6259, 0x42194220,
0x2299622F, 0x8D0322E8, 0xE6FF6623, 0x3628229A,
0x3468BFA7, 0x30E2EE02, 0xAFB78901, 0xD240EB01,
0x6EECEEE6, 0xBF21E40A, 0xAFAF22E2, 0xEE0A7A01,
0x89013AE3, 0x8B033D83, 0xD234D43A, 0x0009420B,
0x4F267F04, 0x6DF66EF6, 0x6BF66CF6, 0x69F66AF6,
0x68F6000B, 0x5651D534, 0x46286052, 0x306C000B,
0x2FC62FB6, 0x2FE62FD6, 0x4F124F22, 0xBFF14F02,
0x6B036E43, 0xDD1CDC2D, 0x0009BFEC, 0x3C0530B8,
0x4609060A, 0x46014609, 0x020A3D65, 0x42094209,
0x32E24209, 0x4F068BF0, 0x4F264F16, 0x6DF66EF6,
0x000B6CF6, 0x2FE66BF6, 0xDE214F22, 0xE500E102,
0x2E12E403, 0x2E52BFD4, 0x4618E606, 0xE403E700,
0x2E722E62, 0xAFCB4F26, 0x4F226EF6, 0x0009BFEB,
0xE6E6D213, 0xE40A666C, 0x2262BFC2, 0x4F26AFE3,
0x002028F0, 0x0024CDE0, 0x10624DD3, 0x00202AF0,
0x001C5814, 0x001C59D0, 0x001C59A4, 0x001C639C,
0x001C5804, 0x001C581C, 0x00202998, 0x00200E2A,
0x001C5860, 0x001C6864, 0x001C59BC, 0x001C69BC,
0x001C947C, 0x002029B0, 0x001C1040, 0xCCCCCCCD,
0x001D4004, 0x2F962F86, 0x2FB62FA6, 0x2FD62FC6,
0x4F222FE6, 0xE4007FE4, 0x4528E510, 0x67436C43,
0xE107A00F, 0x6043644D, 0x0F564008, 0xEE0060C3,
0x815125C1, 0x81538152, 0x157315E2, 0x751415E4,
0x624D7401, 0x8BED3213, 0xDA6F51F1, 0x1A1154F2,
0xD16E2A12, 0x57F455F3, 0x6DF258F5, 0x1141D96C,
0x11532142, 0x11751152, 0x11871174, 0x52F61186,
0x19D1D668, 0xD86829D2, 0xDA68E950, 0x1621EBB4,
0x6BBC2622, 0xA0214908, 0x6EEDEE00, 0x61E36DE3,
0x41084D08, 0x31EC3DEC, 0x41084D08, 0x60C33D8C,
0xE7904108, 0x81D12DC1, 0x41086093, 0x81D2677C,
0x31AC60C3, 0x3472E200, 0x1DD281D3, 0xD4551D13,
0x1D248D01, 0xB03AD450, 0x7E0165D3, 0x34B264ED,
0xD14D8BDB, 0x6512DB52, 0x4529D24D, 0x64121B51,
0x674DD14A, 0x67222B72, 0x4729D64E, 0x69221B73,
0x689D2FD2, 0x69121B82, 0x5A122692, 0x5B1416A2,
0x16B4DA44, 0x16C65C16, 0x16EA6EA2, 0x4F267F1C,
0x6DF66EF6, 0x6BF66CF6, 0x69F66AF6, 0x68F6000B,
0x60616642, 0x8D04C803, 0x6061E500, 0x8802C903,
0x52628B03, 0x51246563, 0x000B2412, 0x2FD66053,
0x4F222FE6, 0x6E537FEC, 0xE5506253, 0xE4006D43,
0xA0014508, 0x5224E101, 0x22116043, 0x81238121,
0x81226053, 0x362056E2, 0xD22F8BF5, 0x64F316E4,
0x420BE614, 0x65E165E3, 0x2549E4FC, 0x61F12E51,
0x214965F3, 0x54D12F11, 0x410BD127, 0x57D1E614,
0xCB016071, 0x1DE12701, 0x4F267F14, 0x000B6EF6,
0x2FD66DF6, 0x4F222FE6, 0x6E537FEC, 0xE5FC6653,
0x60616D43, 0xCB012059, 0x52E22601, 0x8B063260,
0x51E212E4, 0x8B0431E0, 0xA00252D1, 0xAFF01E22,
0xD2155664, 0xE61464F3, 0x65E3420B, 0xE1FC67E1,
0x2E712719, 0x54D167F1, 0xD10F2719, 0xE61465F3,
0x2F71410B, 0x602152D1, 0x2201CB01, 0x7F141DE1,
0x6EF64F26, 0x6DF6000B, 0x002028BC, 0x002028C4,
0x002028B4, 0x002028E4, 0x0010008C, 0x00100EC0,
0x001E2108, 0x001C3D00, 0x00202194, 0x2FC62FB6,
0x2FE62FD6, 0xD6314F22, 0x60D36D62, 0x894DC803,
0xDB30DC2F, 0x0009A02C, 0xC9036061, 0x892B8801,
0xD22DD42B, 0x0009420B, 0x65035603, 0xC8208561,
0xE0508903, 0x720102BE, 0x85620B26, 0x4000600D,
0x4000366A, 0x40004624, 0x206D4624, 0xD423C903,
0x40086E03, 0xD1224000, 0x340C410B, 0x61E3D521,
0xD721E001, 0x450BD221, 0x64E37E30, 0x2702420B,
0x66C252C1, 0x8BCF3620, 0x4E18EE01, 0xA011DB1C,
0x6061EC75, 0x8801C903, 0xD4198910, 0x460BD612,
0xD4180009, 0x470BD718, 0xD2136503, 0x64C3D113,
0x22E2410B, 0x66B252B1, 0x8BEA3620, 0xC80460D3,
0xD2128906, 0x6EF64F26, 0x6CF66DF6, 0x6BF6422B,
0x6EF64F26, 0x6CF66DF6, 0x6BF6000B, 0x001E2100,
0x002028BC, 0x00202858, 0x00200AE0, 0x002028C4,
0x00200B62, 0x00202034, 0x001C3D30, 0x00200DF0,
0x002028B4, 0x002028E4, 0x00200AFE, 0x002000F8,
0xE601D237, 0x1265D537, 0x000B2252, 0xD6361266,
0x88016062, 0xE1018B62, 0xD5342612, 0x5451D134,
0xE0406212, 0x2122324C, 0x54115752, 0x1141347C,
0x57125453, 0x1172374C, 0x52135755, 0x1123327C,
0x56146452, 0x1164364C, 0x54155754, 0x1145347C,
0x56165458, 0x1166364C, 0x6762D626, 0x327C5217,
0x57611127, 0x327C5218, 0x57621128, 0x327C5219,
0x57631129, 0x347C541A, 0x5764114A, 0x347C541B,
0x5765114B, 0x347C541C, 0x5266114C, 0x372C571D,
0x5267117D, 0x342C541E, 0x5268114E, 0x362C561F,
0xD615116F, 0x041E6262, 0x342C7694, 0xE0440146,
0x061E6262, 0x0166362C, 0x525CE048, 0xD60F051E,
0x0156352C, 0xE0546262, 0x4229051E, 0x0156352C,
0xE0585561, 0x4529061E, 0x0166365C, 0x0009000B,
0x001C1010, 0x0000C34F, 0x001C1028, 0x001C369C,
0x00202858, 0x001C3CA0, 0x001C36F4, 0x001C3B88,
0xD62F7FFC, 0x2642644C, 0xC8205066, 0x2F028DFC,
0x7F04000B, 0x2FD62FC6, 0x4F222FE6, 0x6D436C53,
0xEE00A004, 0x7E0164D4, 0x644CBFEA, 0x8BF93EC2,
0x6EF64F26, 0x000B6DF6, 0xA0016CF6, 0x76016643,
0x22286260, 0x36488BFB, 0x6563AFE4, 0x2FB62F96,
0x2FD62FC6, 0x4F222FE6, 0xEC1CED08, 0xDB196E53,
0x61C3E90A, 0x60434B0B, 0x3092C90F, 0x66038D02,
0x7630A001, 0x4D107637, 0x7E012E60, 0x7CFC8FF1,
0x8058E000, 0x6EF64F26, 0x6CF66DF6, 0x000B6BF6,
0x000B69F6, 0x000BE000, 0x2FE6E000, 0x7FEC4F22,
0x6E436253, 0xBFD165F3, 0xBFC66423, 0xBFC464E3,
0xD40564F3, 0x0009BFC1, 0x4F267F14, 0x6EF6000B,
0x001C0004, 0x002020F4, 0x002029CC, 0xE110D59C,
0xE6406050, 0x2500C9FD, 0xE0FF75E9, 0x80516453,
0x80538052, 0x80568055, 0x251075EF, 0xE1EF6250,
0x2219E001, 0xE7202520, 0x24608052, 0x2570000B,
0xE4FDD590, 0xE7026152, 0x25122149, 0x74016052,
0x2502CB01, 0xD18C6652, 0x25622649, 0x92C26012,
0x2102CB08, 0xC9CF6012, 0x60122102, 0x2102CB03,
0x000B1172, 0x4F221123, 0xE100D484, 0xD285D784,
0xD5852410, 0x2711D485, 0x2211E700, 0xBFBD2511,
0xD5832471, 0x2560E600, 0x4F26AFD2, 0xD281664C,
0x362C4600, 0xCB106060, 0x2600000B, 0xD27D654C,
0x352C4500, 0xE1EF6650, 0x000B2619, 0x664C2560,
0x4600D279, 0x6060362C, 0x000BCB10, 0x654C2600,
0x4500D275, 0x6650352C, 0x2619E1EF, 0x2560000B,
0xD270664C, 0x362C4600, 0xCB086060, 0x2600000B,
0xD26C654C, 0x352C4500, 0xE1F76650, 0x000B2619,
0x664C2560, 0x4600D268, 0x6060362C, 0x000BCB08,
0x654C2600, 0x4500D264, 0x6650352C, 0x2619E1F7,
0x2560000B, 0xD65F624C, 0x326C4200, 0xC9086020,
0x40214021, 0x000B4021, 0x624C600C, 0x4200D65A,
0x6020326C, 0x4021C908, 0x40214021, 0x600C000B,
0xD156644C, 0x341C74FF, 0x000B6240, 0xD154602C,
0x341C644C, 0x000B6240, 0x2FE6602C, 0x655C4F22,
0x3567E60A, 0x6E438D15, 0x6453BFEA, 0x60EC640C,
0x8B028801, 0xA002E00F, 0x44092409, 0x624C4409,
0x3263E60A, 0xBFE28905, 0x620C644C, 0xC8806023,
0xE2008B00, 0x4F266023, 0x6EF6000B, 0xD6414F22,
0x88016062, 0xB2228B03, 0xA0030009, 0xD23E0009,
0x2260E640, 0xE200D63D, 0x000B4F26, 0x4F222622,
0x6062D638, 0x8B018802, 0x0009B26C, 0xE200D637,
0x000B4F26, 0x0FFF2622, 0xD433D532, 0xE701E100,
0x000B2512, 0xD2302470, 0x000BE604, 0xD5202260,
0x6150E4FD, 0x2149D62E, 0x2510E700, 0x2670000B,
0xE4FBD51B, 0x22496250, 0x2520000B, 0xE4F7D518,
0x22496250, 0x2520000B, 0xD2264F22, 0x600D8522,
0x89112008, 0x89138801, 0x89158803, 0x89178805,
0x89418806, 0x89478808, 0x894D8809, 0x8953880A,
0x8959880B, 0x0009A060, 0x0009B062, 0x600CA05D,
0x0009B070, 0x600CA059, 0x0009B07A, 0x600CA055,
0x6260D606, 0x8B4F2228, 0x0009B086, 0x600CA04D,
0x001E1028, 0x001E2148, 0x001E1108, 0x0020293D,
0x0020292C, 0x0020292E, 0x00202930, 0x00202910,
0x001E1008, 0x001E103F, 0x001E105F, 0x001E1030,
0x001E1090, 0x00202938, 0x001E100B, 0x00202934,
0x0020293C, 0x00202904, 0x6260D687, 0x8B232228,
0x0009B06A, 0x600CA021, 0x6260D683, 0x8B1B2228,
0x0009B0B4, 0x600CA019, 0x6260D67F, 0x8B132228,
0x0009B0BA, 0x600CA011, 0x6260D67B, 0x8B0B2228,
0x0009B11E, 0x600CA009, 0x6260D677, 0x8B032228,
0x0009B136, 0x600CA001, 0x4F26E000, 0x0009000B,
0xD273D172, 0xD5738412, 0x4000C90F, 0xD772012D,
0x611CE403, 0xD671E20F, 0x27122540, 0xE0012520,
0x2602000B, 0xE601D269, 0x30668523, 0xE0008D06,
0xE000D267, 0x8122D669, 0x2602E001, 0x0009000B,
0x8523D262, 0x2008600D, 0x88018905, 0xD6648B0A,
0xCB016060, 0xD6612600, 0xE101D45D, 0x2612E001,
0x8142000B, 0xE000000B, 0xE501D158, 0x45188513,
0x3453640D, 0x8D056603, 0xD25AE000, 0xE001D557,
0x25022260, 0x0009000B, 0xD1504F22, 0x650D8513,
0x44196453, 0x672E6249, 0x602C227D, 0x89098801,
0x890C8802, 0x89108803, 0x89268806, 0x89298807,
0x0009A038, 0xD64DD54C, 0xA027E212, 0x625C2652,
0x8B2F2228, 0xA01ED64A, 0x605C6262, 0x89052008,
0x89088810, 0x890B8820, 0x0009A024, 0xD643D445,
0xA013E204, 0xD7442642, 0xE20CD640, 0x2672A00E,
0xD63ED542, 0xA009E218, 0xD4412652, 0xE20AD63B,
0x2642A004, 0xD639D23F, 0xE22E2622, 0xD43E8515,
0x3277670D, 0x8F012421, 0x24516503, 0x0009B0DF,
0xE001A001, 0x4F26E000, 0x0009000B, 0xE101D629,
0x2610D436, 0xD7286541, 0x655DD128, 0xE001E20F,
0x26202752, 0x2102000B, 0x4F222FE6, 0x8523D21F,
0x2448640C, 0xD62D8B08, 0xE200D521, 0x84512621,
0x20499430, 0x8051A026, 0x60E0DE1D, 0x8D0BC840,
0x3427E201, 0xD1258922, 0x420BD225, 0xD5252141,
0xCB046052, 0x2502A00B, 0x89173427, 0xD722D21F,
0x2241470B, 0xE5FBD61F, 0x21596162, 0x84E12612,
0xB12DCB80, 0x60E080E1, 0xCB04D61C, 0x60602E00,
0x2600C93F, 0xE001D609, 0x2602A001, 0x4F26E000,
0x6EF6000B, 0x0000FF7F, 0x0020293D, 0x00202904,
0x00202910, 0x001E1100, 0x001E100C, 0x00202934,
0x001E1000, 0x001E1001, 0x00202AF4, 0x00202918,
0x00202920, 0x00202B62, 0x00202B66, 0x00202B72,
0x00202B8A, 0x00202B94, 0x0020291C, 0x0020292A,
0x00201AB6, 0x001E1108, 0x00201BC2, 0x001E1015,
0x6060D696, 0x8919C880, 0x6021D295, 0x8B158801,
0xE501D294, 0x30568524, 0xD1938910, 0xD493E203,
0x65412120, 0x655DE00B, 0xD5910656, 0xE702E40F,
0x25712140, 0xE001D78F, 0x2702000B, 0xE000000B,
0x4F222FE6, 0x84E1DE8C, 0x8934C880, 0x8554D585,
0x8F302008, 0xD7896103, 0x66728553, 0x650C6403,
0x620C8566, 0x8B263520, 0xD780D685, 0x644C651C,
0x27412651, 0xC84060E0, 0xD2828907, 0x0009420B,
0x6062D681, 0xA008CB04, 0xD1802602, 0x0009410B,
0xE5FBD67D, 0x24596462, 0xB0A12642, 0xD5750009,
0x2522E201, 0xD77A60E0, 0x2E00CB04, 0xC93F6070,
0xA0012700, 0xE0006023, 0x000B4F26, 0x2FA66EF6,
0x2FC62FB6, 0x2FE62FD6, 0xE240DA69, 0xDC6666A1,
0x3123616D, 0x62638900, 0x6ED36D2C, 0x4E2136D8,
0x4E212A61, 0xDB6CD46B, 0xE700A00F, 0x770166B2,
0x71026163, 0x65612B12, 0x71026613, 0x62612B12,
0x622D655D, 0x325C4228, 0x627C2422, 0x8BED32E3,
0xC90360D3, 0x8B108803, 0xED076EB2, 0x710261E3,
0x67132B12, 0x62E17102, 0x65712B12, 0x655D622D,
0x352C4528, 0xA00C2CD0, 0x88022452, 0xA0038B01,
0x8801E203, 0xE2018B05, 0x66B22C20, 0x677D6761,
0xEB0F2472, 0x6DA12CB0, 0x8B052DD8, 0xD445D24F,
0xE101EE00, 0x241222E2, 0x6DF66EF6, 0x6BF66CF6,
0x6AF6000B, 0x2FE62FD6, 0xE240DD3D, 0x616D66D1,
0x89003123, 0x672C6263, 0xDE433678, 0x2D617703,
0xD6404721, 0x472164E2, 0xE100A00E, 0x71016562,
0x24506253, 0x42197401, 0x74012420, 0x24504529,
0x45197401, 0x74012450, 0x3273621C, 0x42008BEE,
0x64D166E2, 0x362C4200, 0x8F062448, 0xDD332E62,
0xE500DE28, 0x2D52E701, 0x6EF62E72, 0x6DF6000B,
0x2FE62FD6, 0xEE014F22, 0xED0AA005, 0x64E3BCB6,
0x64E3BCBC, 0x62EC7E01, 0x8BF732D7, 0xEE01A005,
0x64E3BCBD, 0x64E3BCC3, 0x62EC7E01, 0x8BF732D7,
0x6EF64F26, 0x6DF6000B, 0x2FE62FD6, 0x7FFC4F22,
0x6060D61F, 0x89758801, 0xE101D41E, 0xD7128548,
0x650D2610, 0x45196070, 0x6659DD1B, 0x61D3626E,
0xC840262D, 0x74027102, 0x8D47D718, 0xD218666C,
0xE501DE0A, 0xA0312E22, 0x0000EE04, 0x001E1001,
0x0020292A, 0x00202904, 0x001E1100, 0x0020292E,
0x0020291C, 0x00202934, 0x001E1000, 0x00202920,
0x0020292C, 0x00201AB6, 0x001E1108, 0x00201BC2,
0x001E1015, 0x001E100C, 0x00202918, 0x00202938,
0x0020293C, 0x00202AF4, 0x00202B8A, 0x00202B96,
0x00202B06, 0x75016245, 0x71022121, 0x32E3625C,
0x60638BF8, 0xE60181D4, 0xE417D538, 0x3243626C,
0x6255891E, 0x27217601, 0x7702AFF8, 0xDE35D234,
0x2E22E501, 0xEE04A004, 0x75016245, 0x71022121,
0x32E3625C, 0x60638BF8, 0xE60181D4, 0xA004D52E,
0x6255E417, 0x27217601, 0x626C7702, 0x8BF83243,
0x2D21924B, 0xD72AD429, 0x2F126142, 0x6DF265F2,
0xC9806053, 0x60532700, 0x6103C960, 0x60538071,
0x65F26EF2, 0x4D19C903, 0x80724529, 0x451960DC,
0x4E298172, 0x62EC605C, 0x302C4018, 0x6D428173,
0x2FD22118, 0x62F26EF2, 0x421966F2, 0x656C4629,
0x602C66F2, 0x401864EC, 0x304C4629, 0x81744619,
0x4018606C, 0x8F07305C, 0xBCB58175, 0x620C0009,
0x89082228, 0x0009A00A, 0x88406013, 0xB00A8B03,
0xA0030009, 0xD60B0009, 0x2622E202, 0x4F267F04,
0x000B6EF6, 0x000B6DF6, 0x060A0009, 0x00202B36,
0x00202B34, 0x00202920, 0x00202B08, 0x001E100C,
0x00202904, 0x00202934, 0x7FFC4F22, 0x6620D27E,
0x8D082668, 0xD47D2F60, 0x420BD27D, 0x64F00009,
0xA0907F04, 0x7F044F26, 0x000B4F26, 0x000B0009,
0x2FE60009, 0xDE774F22, 0x60E0D677, 0xCBC0D477,
0x62602E00, 0xC803602C, 0x40218904, 0x70014021,
0x6603A002, 0x66034009, 0xD671616D, 0xE500A004,
0x75016262, 0x74042422, 0x3213625D, 0xD16D8BF8,
0x0009410B, 0xE401D66C, 0x84E22641, 0x80E2C9BF,
0x000B4F26, 0x2FE66EF6, 0xD5687FFC, 0x6250DE61,
0x642C84E2, 0xCB407404, 0x80E2614D, 0x44216413,
0xD7634421, 0xE600A004, 0x76016256, 0x27222F22,
0x3243626D, 0x60138BF8, 0x2008C903, 0x88038912,
0x88028905, 0x88018906, 0xA0088907, 0xE0070009,
0x8078A005, 0xA002E003, 0xE0018078, 0x62528078,
0x27222F22, 0xD650E00F, 0x60618078, 0x8B018801,
0x2621E200, 0x6060D64F, 0x2600CB08, 0xC93F60E0,
0x7F042E00, 0x6EF6000B, 0x6021D247, 0x8D188801,
0xD2466143, 0x22106053, 0x60638021, 0xD4468121,
0xE500A007, 0x027C605D, 0x364C6603, 0x26207001,
0x625D6503, 0x3213611C, 0xD6408BF4, 0xC9BF6060,
0x000B2600, 0x2FD60009, 0x4F222FE6, 0x60437FFC,
0x8D02C820, 0xBF6A6E43, 0x60E30009, 0x8901C810,
0x0009BF67, 0xC84060E3, 0xBF8C8901, 0x60E30009,
0x8929C801, 0x60D0DD32, 0x8D03C802, 0xD6312F00,
0x0009460B, 0xC80460F0, 0xD62F8902, 0x0009460B,
0x602362F0, 0x8902C880, 0xC97F60D0, 0x60232D00,
0x8902C801, 0x420BD229, 0xD5290009, 0x88026052,
0xD2288B03, 0xA005E604, 0x88012260, 0xD2258B02,
0x2260E601, 0x2522E200, 0xC88060E3, 0xD2228916,
0x60E36E20, 0x8902C802, 0x420BD220, 0x60E30009,
0x8902C804, 0x420BD21E, 0x60E30009, 0x8905C808,
0x7F04D21C, 0x6EF64F26, 0x6DF6422B, 0x4F267F04,
0x000B6EF6, 0x00006DF6, 0x001E1020, 0x002029D0,
0x00200E2A, 0x001E1015, 0x001E10BF, 0x00117D00,
0x001E10FC, 0x002000F8, 0x00202930, 0x00117D80,
0x001E10F8, 0x001E10AE, 0x00117D84, 0x001E1017,
0x001E1021, 0x0020105C, 0x0020107E, 0x00201608,
0x00202934, 0x001E100B, 0x001E1028, 0x002010AE,
0x002010C0, 0x002010CC, 0xD6A8644C, 0x346C74FF,
0x2450000B, 0x644CD6A6, 0x000B346C, 0xD6A52450,
0x346C644C, 0x2450000B, 0x616D625C, 0x41194208,
0x60194208, 0x644C4200, 0x324C670E, 0x207DD19E,
0xC90F4200, 0x000B321C, 0x67632200, 0x4208625C,
0x42004208, 0x324C644C, 0x4200D198, 0x000B321C,
0x2FE62270, 0x614C4F12, 0x4100D493, 0x6710314C,
0x2729E29F, 0x65736E53, 0x4719676D, 0x672E6279,
0x4221227D, 0x42214221, 0x7601662C, 0xE4014608,
0x34E84608, 0x644C4600, 0x0E1A0467, 0x215025EB,
0x000B4F16, 0x4F226EF6, 0xD2857FE8, 0x88016021,
0xD2848B7B, 0x26686621, 0xD2838B77, 0x26686621,
0xE50F8B73, 0xE401BFA0, 0xBFA3E501, 0xE586E400,
0xE400655C, 0x2F50BFA3, 0xBFA0E401, 0xE602E506,
0x60634618, 0x81F2E401, 0x6543BF9E, 0xE40185F2,
0xBFAA6543, 0x85F26603, 0x6543E401, 0x6603BFB1,
0xE40265F0, 0x6053756C, 0x80F8BF7E, 0xBF81E402,
0x84F8E512, 0x7090E402, 0x6503BF81, 0x4618E602,
0x81F66063, 0xBF7FE402, 0x85F6E500, 0x6603E402,
0xE500BF8B, 0xE40285F6, 0xBF926603, 0xE5FEE500,
0xE010655C, 0xBF5FE403, 0xE5130F54, 0xE40EBF62,
0x05FCE010, 0xBF62E40E, 0xE5007585, 0xBF63E403,
0xE500E640, 0xBF70E403, 0xE500E640, 0xBF78E403,
0xE5FFE640, 0xE014655C, 0xBF45E404, 0xE40F0F54,
0xE504BF48, 0x05FCE014, 0xBF48E40F, 0xE5017584,
0xBF49E640, 0xE501E404, 0xBF56E640, 0xE501E404,
0xE404E640, 0xAF5C7F18, 0x7F184F26, 0x000B4F26,
0x4F220009, 0xD2427FF0, 0x88016021, 0xD2418B71,
0x26686621, 0xD2408B6D, 0x26686621, 0xE50F8B69,
0xE401BF1A, 0xBF1DE501, 0xE586E400, 0xE400655C,
0x2F50BF1D, 0xBF1AE401, 0xE401E506, 0xBF1B6543,
0xE401E640, 0xBF286543, 0xE401E640, 0xBF306543,
0x65F0E640, 0x756CE402, 0xBEFD6053, 0xE40280F4,
0xE512BF00, 0xE40284F4, 0xBF007090, 0xE6406503,
0xBF01E402, 0xE640E500, 0xBF0EE402, 0xE640E500,
0xBF16E402, 0xE5FEE500, 0x6053655C, 0xBEE3E403,
0xE51380F8, 0xE40EBEE6, 0xE40E84F8, 0xBEE67085,
0xE5006503, 0xBEE7E640, 0xE500E403, 0xBEF4E640,
0xE500E403, 0xBEFCE640, 0xE5FFE403, 0x6053655C,
0xBEC9E404, 0xE40F80FC, 0xE504BECC, 0xE40F84FC,
0xBECC7083, 0xE5016503, 0xBECDE640, 0xE501E404,
0xBEDAE640, 0xE501E404, 0xE404E640, 0xAEE07F10,
0x7F104F26, 0x000B4F26, 0x00000009, 0x001E1030,
0x001E1080, 0x001E1090, 0x001E103F, 0x001E103E,
0x0020292A, 0x0020292C, 0x0020292E, 0x0009000B,
0x666CE680, 0x6563D2A0, 0x7540E700, 0x6473422B,
0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6, 0x4C18EC01,
0xDA9BDB9A, 0x65B252B1, 0x89223520, 0xC9036051,
0x891E8801, 0xD197DE95, 0x64E3410B, 0x85036503,
0x670D66A2, 0xDD943762, 0xD494890A, 0x420BD294,
0xD1940009, 0xE701D494, 0x21724D0B, 0x0009AFE2,
0x420BD292, 0xD69264E3, 0x4D0BD492, 0xAFD926C2,
0x4F260009, 0x6DF66EF6, 0x6BF66CF6, 0x6AF6000B,
0x7FF44F22, 0xE6818546, 0x85472F01, 0x81F1666C,
0xD27D8548, 0x854281F2, 0x81F367F3, 0xE40C8543,
0x605381F4, 0x81F56563, 0x7540420B, 0x4F267F0C,
0x0009000B, 0x2F962F86, 0x2FB62FA6, 0x2FD62FC6,
0x4F222FE6, 0xE2007FEC, 0xA0CBDB7B, 0x6A132F21,
0x4A08D27A, 0xDE7AE001, 0x4A00420B, 0x7E303AEC,
0x1F021FE1, 0x66B2DD77, 0x362052B1, 0xA0B58B01,
0x60610009, 0x8801C903, 0xA0AF8B01, 0x85610009,
0x8974C801, 0xEE105163, 0xDC638512, 0xC9036603,
0x85136403, 0x4021600D, 0xC93F4021, 0x8D2030E3,
0xD7696503, 0x62704408, 0x44004408, 0x22284500,
0x345C8F0C, 0x6043D265, 0x625D052D, 0x60294219,
0x207D670E, 0x605C81F6, 0x81F8A00B, 0x6043D260,
0x685D052D, 0x60894819, 0x209D690E, 0x605C81F6,
0xD75C81F8, 0x22286272, 0xE0FF8902, 0x81F8600C,
0xEEFF85F8, 0x6EEC650D, 0x8B0F35E0, 0x4E0BDE45,
0x540364B3, 0xBF7BE502, 0xD4536803, 0x410BD147,
0xD7526583, 0xD452E901, 0x2792A020, 0x26E9EEFC,
0x81126063, 0x946E8513, 0x81132049, 0x45088512,
0x62036953, 0xE50885F6, 0x8112202B, 0x45188513,
0x8113209B, 0xD4478514, 0x8114205B, 0x851161B2,
0x811120E9, 0x602162B2, 0x2201CB01, 0x00094C0B,
0x56F160B2, 0xCB0152F2, 0xAF7C2A02, 0x85612622,
0xC802DC3A, 0xD938D227, 0x8D0FD82C, 0x420B64B3,
0x65030009, 0x480B6493, 0xE8015E03, 0x85EF2C82,
0x650DD635, 0x64D3460B, 0x0009AF65, 0x0009420B,
0x6E035403, 0xE5088544, 0x45186103, 0x31502159,
0xBF258B03, 0xA007E501, 0x85410009, 0x620DD52B,
0x89012258, 0xE500BF1C, 0x480B6493, 0xD42865E3,
0xE801D611, 0x2C82460B, 0x0009AF45, 0x7B0862F1,
0x2F217201, 0xEE0362F1, 0x31E7612D, 0xAF2E8901,
0x7F140009, 0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6,
0x000B69F6, 0xFE0368F6, 0x002018B8, 0x002028E4,
0x002028EC, 0x00200AE0, 0x00200E2A, 0x002028B4,
0x00200B62, 0x001E2130, 0x00202AD4, 0x00200AFE,
0x001C3D30, 0x00202AD8, 0x002028C4, 0x00202034,
0x001C3D00, 0x00202AE4, 0x00202AF0, 0x002029D4,
0x00202A54, 0x00202900, 0x002028BC, 0x001E212C,
0x00202ADC, 0x00202AE0, 0x00200E8A, 0x00008000,
0x00202AEC, 0x4F222FE6, 0x6E22D20D, 0xC84060E3,
0x22E28D02, 0x0009BE7A, 0x4218E240, 0x89012E28,
0x0009BE76, 0xC80560E3, 0xBECB8901, 0x60E30009,
0x8902C802, 0xAE734F26, 0x4F266EF6, 0x6EF6000B,
0x001C3510, 0x080A0C0E, 0x00020406, 0x1A1C1E20,
0x12141618, 0x2E303234, 0x26282A2C, 0x3A3C3E40,
0x6C625648, 0x41112F26, 0xE2208F18, 0x890B3123,
0x321CD204, 0xD1026220, 0x412B312C, 0x00090009,
0x0020205E, 0x00202014, 0x000BE000, 0x400062F6,
0x40004000, 0x40004000, 0x40004000, 0x62F6000B,
0x40004000, 0x40004000, 0x40004000, 0x40184000,
0x62F6000B, 0x40004000, 0x40004000, 0x40004000,
0x40284000, 0x62F6000B, 0x40004000, 0x40184000,
0x000B4028, 0xC90F62F6, 0x40054005, 0x40054005,
0x62F6000B, 0x4005C907, 0x40054005, 0x62F6000B,
0x4005C903, 0x000B4005, 0xC90162F6, 0x000B4005,
0x000062F6, 0x080A0C0E, 0x00020406, 0x1A1C1E20,
0x12141618, 0x2E303234, 0x26282A2C, 0x3A3C3E40,
0x6C625648, 0x41112F26, 0xE2208F18, 0x890B3123,
0x321CD204, 0xD1026220, 0x412B312C, 0x00090009,
0x0020211E, 0x002020D4, 0x000BE000, 0x400162F6,
0x40014001, 0x40014001, 0x40014001, 0x62F6000B,
0x40014001, 0x40014001, 0x40014001, 0x40194001,
0x62F6000B, 0x40014001, 0x40014001, 0x40014001,
0x40294001, 0x62F6000B, 0x40014001, 0x40194001,
0x000B4029, 0x400462F6, 0x40044004, 0xC90F4004,
0x62F6000B, 0x40044004, 0xC9074004, 0x62F6000B,
0x40044004, 0x000BC903, 0x400462F6, 0x000BC901,
0x000062F6, 0x3622E218, 0x67438F12, 0x0009A004,
0x76FF6254, 0x74012420, 0xC8036053, 0x60438BF8,
0x8902C803, 0x422BD22B, 0xD22B0009, 0x0009422B,
0x2FE66473, 0x8D4A3450, 0x27786763, 0x62438947,
0x227B225B, 0xC9016023, 0x8D203452, 0x2EE86E03,
0x60238B15, 0x8B08C803, 0x47096643, 0x47106256,
0x8FFB2622, 0xA0327604, 0x47010009, 0x61436673,
0x46106255, 0x8FFB2121, 0xA0287102, 0x66430009,
0x47106254, 0x8FFB2620, 0xA0207601, 0x61430009,
0x2EE8357C, 0x8F15317C, 0x60236653, 0x8B07C803,
0x76FC4709, 0x47106262, 0x21268FFB, 0x0009A00F,
0x65634701, 0x75FE6673, 0x46106251, 0x21258FFB,
0x0009A005, 0x626076FF, 0x8FFB4710, 0x60432124,
0x6EF6000B, 0x00202306, 0x002027B2, 0xE21E2FE6,
0x67633626, 0x8D1B6153, 0x3E106E43, 0x3E128916,
0x65E38908, 0x3672E600, 0x62148910, 0x25207601,
0x7501AFF9, 0x317C64E3, 0x6513347C, 0xE600A004,
0x625075FF, 0x24247601, 0x8BF93672, 0x60E3A011,
0x890831E2, 0x327C6213, 0x8B0432E6, 0x651364E3,
0xA0086673, 0xD28F6EF6, 0x651364E3, 0x422B6673,
0x000B6EF6, 0xE2046EF6, 0x67433622, 0x8F10356C,
0xA004346C, 0x75FF0009, 0x76FF6250, 0x60532424,
0x8BF8C803, 0xC8036043, 0xA1058901, 0xA2770009,
0xA2990009, 0x2FB60009, 0x2FD62FC6, 0x7FE42FE6,
0x6C636043, 0x66521F62, 0xC9037504, 0x1F516E53,
0x45086503, 0xE1FC6D43, 0x2D194500, 0x1F732558,
0x1F651F44, 0x2FD28D0B, 0x88086053, 0x88108923,
0x8818895B, 0xA0898B01, 0xA0BD0009, 0x62630009,
0x2D22E600, 0x7CFC7D04, 0xEB10A00D, 0xE60064E6,
0x7CF065E6, 0x62E261E6, 0x1D512D42, 0x1D231D12,
0x7E047D10, 0x3CB21FE1, 0x1F6589F0, 0x2FD21FC2,
0xA0A11FE6, 0x64D21FD4, 0x44286263, 0x44294418,
0x42184419, 0x4629242B, 0x2D424619, 0x65637D04,
0xA0217CFD, 0x67E6EB10, 0x62E67CF0, 0x64E66673,
0x256B4618, 0x2D5261E2, 0x65234729, 0x45184719,
0x4229275B, 0x42191D71, 0x47186743, 0x4429227B,
0x44196713, 0x247B4718, 0x1D431D22, 0x41194129,
0x65137D10, 0x1FE17E04, 0x89DC3CB2, 0x1FE67EFF,
0x1FC21F55, 0xA0672FD2, 0x6CF21FD4, 0x66C257F5,
0x46286273, 0x42284629, 0x2C62262B, 0x7C045DF2,
0x7DFE4729, 0xA01CEB10, 0x65E65EF1, 0x66E66273,
0x47286753, 0x6763227B, 0x452961E6, 0x257B4728,
0x2C2264E6, 0x65131C51, 0x45284629, 0x1C62265B,
0x41296643, 0x216B4628, 0x44291C13, 0x67437C10,
0x3DB27DF0, 0x1FD289E1, 0x7EFEA034, 0x51F56CF2,
0x621366C2, 0x42284618, 0x42184619, 0x2C62262B,
0x7C045DF2, 0x7DFF4119, 0xA01FEB10, 0x65E65EF1,
0x64E67DF0, 0x42286253, 0x421867E6, 0x66E6212B,
0x61432C12, 0x45194128, 0x251B4118, 0x65731C51,
0x44194528, 0x245B4518, 0x64631C42, 0x47194428,
0x274B4418, 0x46191C73, 0x61637C10, 0x89DE3DB2,
0x7EFD1FD2, 0x1FC41FE6, 0x5DF2E704, 0xA00D5EF6,
0x62E451F4, 0x66E47DFC, 0x65E464E4, 0x71012120,
0x71012160, 0x71012140, 0x71012150, 0x89F03D72,
0x66D357F3, 0x641365E3, 0x6EF67F1C, 0x6CF66DF6,
0x6BF6A190, 0x00202194, 0x2FC62FB6, 0x2FE62FD6,
0x60437FE4, 0x6C63C903, 0x66031F62, 0x460875FC,
0x61526E43, 0x4600E2FC, 0x26682E29, 0x1F441F73,
0x1F516D53, 0x8D0B1F15, 0x60632FE2, 0x891F8808,
0x89538810, 0x8B018818, 0x0009A081, 0x0009A0B9,
0xEB10A00D, 0x52D37DF0, 0x54D156D2, 0x2E1665D2,
0x2E662E26, 0x2E427EFC, 0x1FD16153, 0x3CB27CF0,
0x7D0489F0, 0x1F151FD6, 0x2FE21FC2, 0x1FE4A0A1,
0x621366E2, 0x42294619, 0x42194618, 0x2E62262B,
0x7CFF4118, 0xEB10A021, 0x54D37DF0, 0x624357D2,
0x42194229, 0x55D1212B, 0x2E1666D2, 0x41296173,
0x41194418, 0x2E46241B, 0x44296453, 0x44194718,
0x2E76274B, 0x47296763, 0x47194518, 0x257B7EFC,
0x46182E52, 0x1FD16163, 0x3CB27CF0, 0x7D0389DC,
0x1F151FD6, 0x2FE21FC2, 0x1FE4A06B, 0x57F56EF2,
0x627366E2, 0x46284629, 0x262B4229, 0x2E625CF2,
0x7CFE4728, 0xA01BEB10, 0x7DF05DF1, 0x55D251D3,
0x46296613, 0x54D1276B, 0x2E7662D2, 0x41286753,
0x217B4729, 0x61432E16, 0x41294528, 0x2E56251B,
0x44286523, 0x245B4529, 0x42282E46, 0x7CF06723,
0x89E23CB2, 0x1FD67D02, 0xA03A1FC2, 0x67F21FE4,
0x657251F5, 0x45296213, 0x45284519, 0x42194518,
0x5CF2252B, 0x41282752, 0x7CFD4118, 0xA022EB10,
0x7DF05DF1, 0x54D256D3, 0x45196563, 0x52D14628,
0x4618215B, 0x6ED26543, 0x45192716, 0x265B4428,
0x65436163, 0x45186423, 0x42284419, 0x4218254B,
0x271664E3, 0x44196623, 0x264B2756, 0x4E282766,
0x61E34E18, 0x3CB27CF0, 0x7D0189DB, 0x1FC21FD6,
0xE7041F74, 0x51F45DF2, 0x5EF6A00D, 0x84E27EFC,
0x620364E0, 0x7DFC84E1, 0x84E36503, 0x21646603,
0x21542124, 0x3D722144, 0x57F389F0, 0x641366D3,
0x7F1C65E3, 0x6DF66EF6, 0xA09D6CF6, 0x2F866BF6,
0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6, 0x614374E0,
0x6A636873, 0x6B56E920, 0x6C567AE0, 0x6D567120,
0x6E563A92, 0x64566756, 0x62566656, 0x11C121B2,
0x11E311D2, 0x11451174, 0x8DEC1166, 0x71201127,
0x6613A004, 0x7AFF6254, 0x76012620, 0x8BF92AA8,
0x6EF66083, 0x6CF66DF6, 0x6AF66BF6, 0x000B69F6,
0x2F8668F6, 0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6,
0x6A636873, 0x75E0E920, 0x56565257, 0x57545155,
0x5D525E53, 0x6B525C51, 0x24662426, 0x24762416,
0x7AE024E6, 0x24C624D6, 0x8DEC3A92, 0x66A324B6,
0x6EF66783, 0x6CF66DF6, 0x6AF66BF6, 0xA04369F6,
0x2FE668F6, 0xC8046063, 0x8D046E63, 0x62166153,
0x24227EFC, 0x60E37404, 0x8908C818, 0x71046513,
0x62526616, 0x24227EF8, 0xAFF41461, 0xE2047408,
0x65133E22, 0x66E38D02, 0x6EF6A01C, 0x6EF6AF87,
0xC8046063, 0x61638D04, 0x625275FC, 0x242671FC,
0xC8186013, 0x75F88906, 0x66525251, 0x24662426,
0x71F8AFF6, 0x3122E204, 0x66138F02, 0x0009AFA1,
0x0009A00A, 0x0009A004, 0x76FF6254, 0x74012420,
0x8BF92668, 0x6073000B, 0x0009A004, 0x625075FF,
0x242476FF, 0x8BF92668, 0x6073000B, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x544F0D0A, 0x46205355, 0x00003A57, 0x2072614D,
0x32203232, 0x20373030, 0x353A3731, 0x37333A32,
0x00000000, 0x00000D0A, 0x00000043, 0x61766E49,
0x2064696C, 0x72657375, 0x20726F20, 0x2079656B,
0x00214449, 0x6E6B6E55, 0x206E776F, 0x6D6D6F63,
0x3D646E61, 0x00000000, 0x61437748, 0x7262696C,
0x6F697461, 0x6620206E, 0x0A6C6961, 0x0000000D,
0x73696F4E, 0x61432065, 0x7262696C, 0x6F697461,
0x6166206E, 0x21216C69, 0x00000D0A, 0x00000D0A,
0x00000042, 0x000000FF, 0x00020001, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x010E010D, 0x00020003, 0x01090108,
0x0002010A, 0x00030002, 0x02020201, 0x02040203,
0x02060205, 0x02080207, 0x020A0209, 0x020C020B,
0x020E020D, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x010E010D, 0x00FF010F, 0x01090108,
0x010B010A, 0x00030002, 0x02020201, 0x02040203,
0x02060205, 0x02080207, 0x020A0209, 0x020C020B,
0x020E020D, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00000072, 0x00205220, 0x00000046,
0x00000059, 0x73204142, 0x003D7165, 0x00000074,
0x00000000, 0x02000112, 0x40FFFFFF, 0x12210ACE,
0x20104890, 0x02090100, 0x0101002E, 0x09FA8000,
0x04000004, 0x000000FF, 0x02010507, 0x07000200,
0x00028205, 0x05070002, 0x00400383, 0x04050701,
0x01004003, 0x002E0209, 0x80000101, 0x000409FA,
0x00FF0400, 0x05070000, 0x00400201, 0x82050700,
0x00004002, 0x03830507, 0x07010040, 0x40030405,
0x03040100, 0x030C0409, 0x0079005A, 0x00410044,
0x03180053, 0x00530055, 0x00320042, 0x0030002E,
0x00570020, 0x0041004C, 0x0000004E, 0x00000000,
0x00000000, 0x00000709, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, };
const u32_t zcFwImageSize=11204;

View File

@ -0,0 +1,715 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "cprecomp.h"
const u32_t zcFwImage[] = {
0x0009000B, 0x4F222FE6, 0xDE287FFC, 0xE114D728,
0x1E13D428, 0x1E4C470B, 0x0009B018, 0xA0039543,
0x3652E600, 0x76018D04, 0xC84060E2, 0x2F028DF9,
0xDE22D421, 0x00094E0B, 0x4E0BD421, 0xD4210009,
0x00094E0B, 0x4F267F04, 0x6EF6A022, 0xD11E4F22,
0x0009410B, 0x440BD41D, 0xD51D0009, 0x0009450B,
0xE1FFD71C, 0xD21C611D, 0x50292712, 0xCB01E1FF,
0xD61BD41A, 0x22121209, 0xE5011211, 0x2452E200,
0xD5182622, 0x970FD618, 0x4F262572, 0x2620000B,
0xDD17DC16, 0x4C0BDE17, 0x4D0B0009, 0x4E0B0009,
0xAFF80009, 0x27100009, 0x00000640, 0x001C001C,
0x002008EA, 0x0000B38E, 0x002028DC, 0x00200DA6,
0x002028E8, 0x00202900, 0x00200C6C, 0x00200EA2,
0x00200940, 0x001C3510, 0x001C3624, 0x001E212C,
0x00202894, 0x0020288C, 0x002027F0, 0x00200B68,
0x00201F74, 0x00201734, 0x2FD62FC6, 0x4F222FE6,
0xDEA17FA4, 0x61E0E01C, 0x7D016DE3, 0x61D00F14,
0xD59FD49E, 0x450BE020, 0xE0200F14, 0xE78004FC,
0x604C66E2, 0x7D7F677C, 0x1F693070, 0x2D628F17,
0x01FCE01C, 0x641CE500, 0xD797DE96, 0x3243625D,
0xA21A8B01, 0x655D0009, 0x31EC6153, 0xE0286C10,
0x6D530FC4, 0x3D7C62CE, 0xAFEF2D20, 0x20087501,
0xE01C8B15, 0xE50001FC, 0xD78BDE8A, 0x641CA00A,
0x6C53655D, 0x66C23CEC, 0x66626253, 0x2262327C,
0x1F697504, 0x3243625D, 0xA1F68BF2, 0x88012D10,
0xE01C8B16, 0xE40001FC, 0x671C2D40, 0x624DDE7D,
0x8B013273, 0x0009A1E9, 0x62E3644D, 0x72046D43,
0x3DEC6143, 0x65D2312C, 0x74086C12, 0x25C2AFEF,
0x8B188804, 0x01FCE01C, 0x2D40E400, 0xDE71671C,
0x3273624D, 0xA1D08B01, 0x644D0009, 0x62E36D43,
0x65D23DEC, 0x61437204, 0x6612312C, 0x74086C52,
0xAFED2C69, 0x880525C2, 0xE01C8B18, 0xE40001FC,
0x671C2D40, 0x624DDE63, 0x8B013273, 0x0009A1B5,
0x6C43644D, 0x3CEC62E3, 0x720465C2, 0x3D2C6D43,
0x615266D2, 0x216B7408, 0x2512AFED, 0x8B138830,
0xE200DE58, 0x64E22D20, 0x8B042448, 0x420BD257,
0xA19A0009, 0x55E10009, 0x57E356E2, 0xDD545CE4,
0x2FC64D0B, 0x7F04A191, 0x89018828, 0x0009A0EA,
0xE143DE4C, 0x622D62E1, 0x8F033217, 0x56FB1FEB,
0x2621E240, 0x8B013217, 0x0009A0D5, 0xE1015EFB,
0x301685E1, 0xA0CE8B01, 0xE4010009, 0x2D4055FB,
0x6451B179, 0xE14357FB, 0xE0546271, 0x3517652D,
0x0F568D41, 0x3563E640, 0xE6008B05, 0x0F65E034,
0xA00FE11A, 0x615372C0, 0x41214121, 0x41214121,
0x45214121, 0x45214521, 0xC9036053, 0xE0346603,
0x71180F65, 0x2209E007, 0x641DE030, 0x0F2565F3,
0x1F4EB1F1, 0x04FDE034, 0x674DE030, 0x47080CFD,
0x607361CD, 0x4108D22B, 0xE00F0CFE, 0x1F1F420B,
0x2CD96D07, 0x5EFB6073, 0x85E20FC6, 0x420B51FF,
0x2C0B600D, 0x54FE6073, 0xB1BB0FC6, 0xE05465F3,
0x652D62E1, 0xE6400F56, 0x89623563, 0xE050E100,
0x60230F15, 0x4008C903, 0x6D034000, 0xE0406103,
0xE0440FD6, 0xD217EEFF, 0x6EEC0FF6, 0x0F26E058,
0x60E3420B, 0x42216253, 0x42214221, 0x66234221,
0x326C4200, 0x45214200, 0xE0486707, 0x0F764521,
0xC9036053, 0x40085CFB, 0x7C0630FC, 0x6E036D2D,
0x1FD51FC6, 0x1F04A02E, 0x00117D00, 0x00202904,
0x00200DA6, 0x00117D04, 0x00117D84, 0x00200700,
0x0020074C, 0x00201FD4, 0x0FD6E04C, 0x05FEE044,
0x64D3B189, 0x64E2E048, 0xE04006FE, 0x2E422469,
0x01FE67C4, 0x667CE058, 0x420B02FE, 0x240B6063,
0x05FEE044, 0xB15D2E42, 0xE05064D3, 0x7D0101FD,
0x0F157101, 0x02FDE050, 0x3262E606, 0x56FB8BDC,
0x55FB6261, 0x85514200, 0x302C750C, 0x6103701B,
0x64F3E600, 0xE704A004, 0x76016256, 0x74042422,
0x3273626D, 0x65F38BF8, 0x641DB13C, 0xB0D256FB,
0xA0AA6461, 0xD4880009, 0xE201D588, 0x2D20450B,
0x0009A0A3, 0x8B078829, 0xE200DE85, 0x66E22D20,
0x646DB0A1, 0x0009A099, 0x622CE281, 0x8B3D3020,
0xD680E738, 0xE0442D70, 0xE0480C6E, 0x6E621DC1,
0x51611DE2, 0x54621D13, 0x55651D44, 0x57631D55,
0x5C661D76, 0x0E6E1DC7, 0x1DE8E040, 0xE050016E,
0x54641D19, 0x056E1D4A, 0x1D5BE04C, 0xE054076E,
0x0C6E1D7C, 0x1DCDE058, 0xE044026E, 0xED001D2E,
0xE04806D6, 0x16D126D2, 0x16D516D2, 0x16D616D3,
0xE04006D6, 0xE05006D6, 0x06D616D4, 0x06D6E04C,
0x06D6E054, 0x06D6E058, 0x1F29A057, 0x622CE282,
0x89313020, 0x05FCE020, 0x625CE683, 0x3260666C,
0xD65D8B07, 0x2650E500, 0x52617680, 0xA044D65B,
0xE6902622, 0x3260666C, 0xD2578B16, 0xE500D658,
0x60622250, 0xCB20D257, 0xE6052602, 0xD6562262,
0x2252460B, 0x420BD255, 0xD2550009, 0x2262E601,
0x4618D254, 0x2262A029, 0xD254D453, 0xD4546542,
0x0009420B, 0x0009A021, 0xE524D647, 0xD5452650,
0x16215257, 0x16225258, 0x16235259, 0x1624525A,
0x1625525B, 0x1626525C, 0x1627525D, 0x1628525E,
0x1F29525F, 0xE2001629, 0x15281527, 0x152A1529,
0x152C152B, 0x152E152D, 0x7F5C152F, 0x6EF64F26,
0x000B6DF6, 0x4F226CF6, 0xE240614D, 0x89173123,
0x3127E21F, 0xD43B8908, 0xE001D53B, 0x6642450B,
0x26796707, 0x2462A00C, 0x3127E23F, 0xD7358908,
0x71E0D635, 0x460BE001, 0x62075571, 0x17512529,
0x000B4F26, 0x4F220009, 0xE240614D, 0x89153123,
0x3127E21F, 0xD42B8907, 0x6642D22B, 0xE001420B,
0xA00B260B, 0xE23F2462, 0x89073127, 0xD626D725,
0x71E05571, 0xE001460B, 0x1751250B, 0x000B4F26,
0xE6400009, 0x46284618, 0x6252D520, 0x89FC2268,
0x0009000B, 0x4618E680, 0xD51C4628, 0x22686252,
0x000B89FC, 0xA0010009, 0x7201E200, 0x8BFC3242,
0x0009000B, 0x4618E680, 0xD5154628, 0x22686252,
0x000B8BFC, 0x00000009, 0x00202908, 0x00200DA6,
0x00117D04, 0x002027F8, 0x00117D80, 0x0020288C,
0x001C3500, 0x001D4004, 0x00200EA2, 0x00200940,
0x001E212C, 0x001C3D28, 0x00117D00, 0x00200E06,
0x00202920, 0x001C3704, 0x00201FD4, 0x001C373C,
0x001C3700, 0x4F222FE6, 0x6E537FFC, 0x2F42BFCA,
0xD61561E2, 0x1615E280, 0x421854E1, 0x55E21646,
0x16574228, 0x6EF257E3, 0x2E2B1678, 0x7F0426E2,
0xAFA74F26, 0x2FC66EF6, 0x2FE62FD6, 0xDD0A4F22,
0xBFAF6C53, 0xBF946E43, 0xBFAB2DE2, 0x51D50009,
0x54D62C12, 0x55D71C41, 0x56D81C52, 0x4F261C63,
0x6DF66EF6, 0x6CF6000B, 0x001C370C, 0x0009A0C0,
0xD17B4F22, 0xD47B92B6, 0x2122B00D, 0x97B2E605,
0xB02295B2, 0xB0366463, 0xB0360009, 0xB0390009,
0xA0680009, 0x4F124F26, 0xD1734F02, 0x94A43145,
0x4609060A, 0x46094609, 0x00293646, 0xD76CD56F,
0x2500CA01, 0x4F062762, 0x4F16000B, 0xBFEA4F22,
0xB01F0009, 0xA04E0009, 0x2FE64F26, 0x6E63D168,
0x44186612, 0x4528928A, 0x26294408, 0x44084500,
0x4400265B, 0x4708264B, 0x47082162, 0x27EBD161,
0x000B2172, 0x000B6EF6, 0xD25F0009, 0xE40A9677,
0x2262AFB4, 0x2FC62FB6, 0x2FE62FD6, 0xDC5B4F22,
0x2C22E201, 0xBFA9E40A, 0x60C27C44, 0xCB01ED00,
0x60C22C02, 0xC901EB64, 0x6E03A008, 0x89073DB2,
0xE40160C2, 0xBF99C901, 0x7D016E03, 0x8BF52EE8,
0x8B033DB2, 0xD24FD44E, 0x0009420B, 0x4F26E40A,
0x6DF66EF6, 0xAF896CF6, 0x44116BF6, 0x604B8F01,
0x000B6043, 0x2FB60009, 0x2FD62FC6, 0x4F222FE6,
0xDC457FFC, 0x60C2ED00, 0xCB02EB64, 0x60C22C02,
0xC9022F02, 0x6E03A009, 0x89083DB3, 0xE46460C2,
0xC9022F02, 0x6E03BF6A, 0x2EE87D01, 0xD73B8BF4,
0x617251C1, 0xDE3BDC3A, 0xD23CD13B, 0x64C23DB3,
0x651264E2, 0x65228F09, 0xD232D439, 0x4F267F04,
0x6DF66EF6, 0x422B6CF6, 0x7F046BF6, 0x6EF64F26,
0x6CF66DF6, 0x6BF6000B, 0x5651D532, 0x46286052,
0x306C000B, 0x5288096C, 0x09B45BB4, 0x03C41FFF,
0x2FC62FB6, 0x2FE62FD6, 0x4F124F22, 0xBFEB4F02,
0x6B036E43, 0xDD18DC28, 0x0009BFE6, 0x3C0530B8,
0x4609060A, 0x46014609, 0x020A3D65, 0x42094209,
0x32E24209, 0x4F068BF0, 0x4F264F16, 0x6DF66EF6,
0x000B6CF6, 0x2FE66BF6, 0xDE1C4F22, 0xE500E102,
0x2E12E403, 0x2E52BFD4, 0x4618E606, 0xE403E700,
0x2E722E62, 0xAFCB4F26, 0x000B6EF6, 0x00000009,
0x00202890, 0x0024CDE0, 0x10624DD3, 0x00202A8C,
0x001C5814, 0x001C59D0, 0x001C5804, 0x001C581C,
0x00202934, 0x00200DA6, 0x001C5860, 0x001C6864,
0x001C7864, 0x001C59BC, 0x001C69BC, 0x001C79BC,
0x0020294C, 0x001C1040, 0xCCCCCCCD, 0x001D4004,
0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6,
0xE4007FE4, 0x4528E510, 0x67436C43, 0xE107A00F,
0x6043644D, 0x0F564008, 0xEE0060C3, 0x815125C1,
0x81538152, 0x157315E2, 0x751415E4, 0x624D7401,
0x8BED3213, 0xDA6F51F1, 0x1A1154F2, 0xD16E2A12,
0x57F455F3, 0x6DF258F5, 0x1141D96C, 0x11532142,
0x11751152, 0x11871174, 0x52F61186, 0x19D1D668,
0xD86829D2, 0xDA68E950, 0x1621EBB4, 0x6BBC2622,
0xA0214908, 0x6EEDEE00, 0x61E36DE3, 0x41084D08,
0x31EC3DEC, 0x41084D08, 0x60C33D8C, 0xE7904108,
0x81D12DC1, 0x41086093, 0x81D2677C, 0x31AC60C3,
0x3472E200, 0x1DD281D3, 0xD4551D13, 0x1D248D01,
0xB03AD450, 0x7E0165D3, 0x34B264ED, 0xD14D8BDB,
0x6512DB52, 0x4529D24D, 0x64121B51, 0x674DD14A,
0x67222B72, 0x4729D64E, 0x69221B73, 0x689D2FD2,
0x69121B82, 0x5A122692, 0x5B1416A2, 0x16B4DA44,
0x16C65C16, 0x16EA6EA2, 0x4F267F1C, 0x6DF66EF6,
0x6BF66CF6, 0x69F66AF6, 0x68F6000B, 0x60616642,
0x8D04C803, 0x6061E500, 0x8802C903, 0x52628B03,
0x51246563, 0x000B2412, 0x2FD66053, 0x4F222FE6,
0x6E537FEC, 0xE5506253, 0xE4006D43, 0xA0014508,
0x5224E101, 0x22116043, 0x81238121, 0x81226053,
0x362056E2, 0xD22F8BF5, 0x64F316E4, 0x420BE614,
0x65E165E3, 0x2549E4FC, 0x61F12E51, 0x214965F3,
0x54D12F11, 0x410BD127, 0x57D1E614, 0xCB016071,
0x1DE12701, 0x4F267F14, 0x000B6EF6, 0x2FD66DF6,
0x4F222FE6, 0x6E537FEC, 0xE5FC6653, 0x60616D43,
0xCB012059, 0x52E22601, 0x8B063260, 0x51E212E4,
0x8B0431E0, 0xA00252D1, 0xAFF01E22, 0xD2155664,
0xE61464F3, 0x65E3420B, 0xE1FC67E1, 0x2E712719,
0x54D167F1, 0xD10F2719, 0xE61465F3, 0x2F71410B,
0x602152D1, 0x2201CB01, 0x7F141DE1, 0x6EF64F26,
0x6DF6000B, 0x0020285C, 0x00202864, 0x00202854,
0x00202884, 0x0010008C, 0x00100EC0, 0x001E2108,
0x001C3D00, 0x00202134, 0x2FC62FB6, 0x2FE62FD6,
0xD6314F22, 0x60D36D62, 0x894DC803, 0xDB30DC2F,
0x0009A02C, 0xC9036061, 0x892B8801, 0xD22DD42B,
0x0009420B, 0x65035603, 0xC8208561, 0xE0508903,
0x720102BE, 0x85620B26, 0x4000600D, 0x4000366A,
0x40004624, 0x206D4624, 0xD423C903, 0x40086E03,
0xD1224000, 0x340C410B, 0x61E3D521, 0xD721E001,
0x450BD221, 0x64E37E30, 0x2702420B, 0x66C252C1,
0x8BCF3620, 0x4E18EE01, 0xA011DB1C, 0x6061EC75,
0x8801C903, 0xD4198910, 0x460BD612, 0xD4180009,
0x470BD718, 0xD2136503, 0x64C3D113, 0x22E2410B,
0x66B252B1, 0x8BEA3620, 0xC80460D3, 0xD2128906,
0x6EF64F26, 0x6CF66DF6, 0x6BF6422B, 0x6EF64F26,
0x6CF66DF6, 0x6BF6000B, 0x001E2100, 0x0020285C,
0x002027F8, 0x00200A5C, 0x00202864, 0x00200ADE,
0x00201FD4, 0x001C3D30, 0x00200D6C, 0x00202854,
0x00202884, 0x00200A7A, 0x002000F8, 0xE601D237,
0x1265D537, 0x000B2252, 0xD6361266, 0x88016062,
0xE1018B62, 0xD5342612, 0x5451D134, 0xE0406212,
0x2122324C, 0x54115752, 0x1141347C, 0x57125453,
0x1172374C, 0x52135755, 0x1123327C, 0x56146452,
0x1164364C, 0x54155754, 0x1145347C, 0x56165458,
0x1166364C, 0x6762D626, 0x327C5217, 0x57611127,
0x327C5218, 0x57621128, 0x327C5219, 0x57631129,
0x347C541A, 0x5764114A, 0x347C541B, 0x5765114B,
0x347C541C, 0x5266114C, 0x372C571D, 0x5267117D,
0x342C541E, 0x5268114E, 0x362C561F, 0xD615116F,
0x041E6262, 0x342C7694, 0xE0440146, 0x061E6262,
0x0166362C, 0x525CE048, 0xD60F051E, 0x0156352C,
0xE0546262, 0x4229051E, 0x0156352C, 0xE0585561,
0x4529061E, 0x0166365C, 0x0009000B, 0x001C1010,
0x0000C34F, 0x001C1028, 0x001C369C, 0x002027F8,
0x001C3CA0, 0x001C36F4, 0x001C3B88, 0xD62F7FFC,
0x2642644C, 0xC8205066, 0x2F028DFC, 0x7F04000B,
0x2FD62FC6, 0x4F222FE6, 0x6D436C53, 0xEE00A004,
0x7E0164D4, 0x644CBFEA, 0x8BF93EC2, 0x6EF64F26,
0x000B6DF6, 0xA0016CF6, 0x76016643, 0x22286260,
0x36488BFB, 0x6563AFE4, 0x2FB62F96, 0x2FD62FC6,
0x4F222FE6, 0xEC1CED08, 0xDB196E53, 0x61C3E90A,
0x60434B0B, 0x3092C90F, 0x66038D02, 0x7630A001,
0x4D107637, 0x7E012E60, 0x7CFC8FF1, 0x8058E000,
0x6EF64F26, 0x6CF66DF6, 0x000B6BF6, 0x000B69F6,
0x000BE000, 0x2FE6E000, 0x7FEC4F22, 0x6E436253,
0xBFD165F3, 0xBFC66423, 0xBFC464E3, 0xD40564F3,
0x0009BFC1, 0x4F267F14, 0x6EF6000B, 0x001C0004,
0x00202094, 0x00202968, 0xE110D59C, 0xE6406050,
0x2500C9FD, 0xE0FF75E9, 0x80516453, 0x80538052,
0x80568055, 0x251075EF, 0xE1EF6250, 0x2219E001,
0xE7202520, 0x24608052, 0x2570000B, 0xE4FDD590,
0xE7026152, 0x25122149, 0x74016052, 0x2502CB01,
0xD18C6652, 0x25622649, 0x92C26012, 0x2102CB08,
0xC9CF6012, 0x60122102, 0x2102CB03, 0x000B1172,
0x4F221123, 0xE100D484, 0xD285D784, 0xD5852410,
0x2711D485, 0x2211E700, 0xBFBD2511, 0xD5832471,
0x2560E600, 0x4F26AFD2, 0xD281664C, 0x362C4600,
0xCB106060, 0x2600000B, 0xD27D654C, 0x352C4500,
0xE1EF6650, 0x000B2619, 0x664C2560, 0x4600D279,
0x6060362C, 0x000BCB10, 0x654C2600, 0x4500D275,
0x6650352C, 0x2619E1EF, 0x2560000B, 0xD270664C,
0x362C4600, 0xCB086060, 0x2600000B, 0xD26C654C,
0x352C4500, 0xE1F76650, 0x000B2619, 0x664C2560,
0x4600D268, 0x6060362C, 0x000BCB08, 0x654C2600,
0x4500D264, 0x6650352C, 0x2619E1F7, 0x2560000B,
0xD65F624C, 0x326C4200, 0xC9086020, 0x40214021,
0x000B4021, 0x624C600C, 0x4200D65A, 0x6020326C,
0x4021C908, 0x40214021, 0x600C000B, 0xD156644C,
0x341C74FF, 0x000B6240, 0xD154602C, 0x341C644C,
0x000B6240, 0x2FE6602C, 0x655C4F22, 0x3567E60A,
0x6E438D15, 0x6453BFEA, 0x60EC640C, 0x8B028801,
0xA002E00F, 0x44092409, 0x624C4409, 0x3263E60A,
0xBFE28905, 0x620C644C, 0xC8806023, 0xE2008B00,
0x4F266023, 0x6EF6000B, 0xD6414F22, 0x88016062,
0xB2228B03, 0xA0030009, 0xD23E0009, 0x2260E640,
0xE200D63D, 0x000B4F26, 0x4F222622, 0x6062D638,
0x8B018802, 0x0009B26C, 0xE200D637, 0x000B4F26,
0x0FFF2622, 0xD433D532, 0xE701E100, 0x000B2512,
0xD2302470, 0x000BE604, 0xD5202260, 0x6150E4FD,
0x2149D62E, 0x2510E700, 0x2670000B, 0xE4FBD51B,
0x22496250, 0x2520000B, 0xE4F7D518, 0x22496250,
0x2520000B, 0xD2264F22, 0x600D8522, 0x89112008,
0x89138801, 0x89158803, 0x89178805, 0x89418806,
0x89478808, 0x894D8809, 0x8953880A, 0x8959880B,
0x0009A060, 0x0009B062, 0x600CA05D, 0x0009B070,
0x600CA059, 0x0009B07A, 0x600CA055, 0x6260D606,
0x8B4F2228, 0x0009B086, 0x600CA04D, 0x001E1028,
0x001E2148, 0x001E1108, 0x002028D9, 0x002028C8,
0x002028CA, 0x002028CC, 0x002028AC, 0x001E1008,
0x001E103F, 0x001E105F, 0x001E1030, 0x001E1090,
0x002028D4, 0x001E100B, 0x002028D0, 0x002028D8,
0x002028A0, 0x6260D687, 0x8B232228, 0x0009B06A,
0x600CA021, 0x6260D683, 0x8B1B2228, 0x0009B0B4,
0x600CA019, 0x6260D67F, 0x8B132228, 0x0009B0BA,
0x600CA011, 0x6260D67B, 0x8B0B2228, 0x0009B11E,
0x600CA009, 0x6260D677, 0x8B032228, 0x0009B136,
0x600CA001, 0x4F26E000, 0x0009000B, 0xD273D172,
0xD5738412, 0x4000C90F, 0xD772012D, 0x611CE403,
0xD671E20F, 0x27122540, 0xE0012520, 0x2602000B,
0xE601D269, 0x30668523, 0xE0008D06, 0xE000D267,
0x8122D669, 0x2602E001, 0x0009000B, 0x8523D262,
0x2008600D, 0x88018905, 0xD6648B0A, 0xCB016060,
0xD6612600, 0xE101D45D, 0x2612E001, 0x8142000B,
0xE000000B, 0xE501D158, 0x45188513, 0x3453640D,
0x8D056603, 0xD25AE000, 0xE001D557, 0x25022260,
0x0009000B, 0xD1504F22, 0x650D8513, 0x44196453,
0x672E6249, 0x602C227D, 0x89098801, 0x890C8802,
0x89108803, 0x89268806, 0x89298807, 0x0009A038,
0xD64DD54C, 0xA027E212, 0x625C2652, 0x8B2F2228,
0xA01ED64A, 0x605C6262, 0x89052008, 0x89088810,
0x890B8820, 0x0009A024, 0xD643D445, 0xA013E204,
0xD7442642, 0xE20CD640, 0x2672A00E, 0xD63ED542,
0xA009E218, 0xD4412652, 0xE20AD63B, 0x2642A004,
0xD639D23F, 0xE22E2622, 0xD43E8515, 0x3277670D,
0x8F012421, 0x24516503, 0x0009B0DF, 0xE001A001,
0x4F26E000, 0x0009000B, 0xE101D629, 0x2610D436,
0xD7286541, 0x655DD128, 0xE001E20F, 0x26202752,
0x2102000B, 0x4F222FE6, 0x8523D21F, 0x2448640C,
0xD62D8B08, 0xE200D521, 0x84512621, 0x20499430,
0x8051A026, 0x60E0DE1D, 0x8D0BC840, 0x3427E201,
0xD1258922, 0x420BD225, 0xD5252141, 0xCB046052,
0x2502A00B, 0x89173427, 0xD722D21F, 0x2241470B,
0xE5FBD61F, 0x21596162, 0x84E12612, 0xB12DCB80,
0x60E080E1, 0xCB04D61C, 0x60602E00, 0x2600C93F,
0xE001D609, 0x2602A001, 0x4F26E000, 0x6EF6000B,
0x0000FF7F, 0x002028D9, 0x002028A0, 0x002028AC,
0x001E1100, 0x001E100C, 0x002028D0, 0x001E1000,
0x001E1001, 0x00202A90, 0x002028B4, 0x002028BC,
0x00202AFE, 0x00202B02, 0x00202B0E, 0x00202B26,
0x00202B30, 0x002028B8, 0x002028C6, 0x00201A32,
0x001E1108, 0x00201B3E, 0x001E1015, 0x6060D696,
0x8919C880, 0x6021D295, 0x8B158801, 0xE501D294,
0x30568524, 0xD1938910, 0xD493E203, 0x65412120,
0x655DE00B, 0xD5910656, 0xE702E40F, 0x25712140,
0xE001D78F, 0x2702000B, 0xE000000B, 0x4F222FE6,
0x84E1DE8C, 0x8934C880, 0x8554D585, 0x8F302008,
0xD7896103, 0x66728553, 0x650C6403, 0x620C8566,
0x8B263520, 0xD780D685, 0x644C651C, 0x27412651,
0xC84060E0, 0xD2828907, 0x0009420B, 0x6062D681,
0xA008CB04, 0xD1802602, 0x0009410B, 0xE5FBD67D,
0x24596462, 0xB0A12642, 0xD5750009, 0x2522E201,
0xD77A60E0, 0x2E00CB04, 0xC93F6070, 0xA0012700,
0xE0006023, 0x000B4F26, 0x2FA66EF6, 0x2FC62FB6,
0x2FE62FD6, 0xE240DA69, 0xDC6666A1, 0x3123616D,
0x62638900, 0x6ED36D2C, 0x4E2136D8, 0x4E212A61,
0xDB6CD46B, 0xE700A00F, 0x770166B2, 0x71026163,
0x65612B12, 0x71026613, 0x62612B12, 0x622D655D,
0x325C4228, 0x627C2422, 0x8BED32E3, 0xC90360D3,
0x8B108803, 0xED076EB2, 0x710261E3, 0x67132B12,
0x62E17102, 0x65712B12, 0x655D622D, 0x352C4528,
0xA00C2CD0, 0x88022452, 0xA0038B01, 0x8801E203,
0xE2018B05, 0x66B22C20, 0x677D6761, 0xEB0F2472,
0x6DA12CB0, 0x8B052DD8, 0xD445D24F, 0xE101EE00,
0x241222E2, 0x6DF66EF6, 0x6BF66CF6, 0x6AF6000B,
0x2FE62FD6, 0xE240DD3D, 0x616D66D1, 0x89003123,
0x672C6263, 0xDE433678, 0x2D617703, 0xD6404721,
0x472164E2, 0xE100A00E, 0x71016562, 0x24506253,
0x42197401, 0x74012420, 0x24504529, 0x45197401,
0x74012450, 0x3273621C, 0x42008BEE, 0x64D166E2,
0x362C4200, 0x8F062448, 0xDD332E62, 0xE500DE28,
0x2D52E701, 0x6EF62E72, 0x6DF6000B, 0x2FE62FD6,
0xEE014F22, 0xED0AA005, 0x64E3BCB6, 0x64E3BCBC,
0x62EC7E01, 0x8BF732D7, 0xEE01A005, 0x64E3BCBD,
0x64E3BCC3, 0x62EC7E01, 0x8BF732D7, 0x6EF64F26,
0x6DF6000B, 0x2FE62FD6, 0x7FFC4F22, 0x6060D61F,
0x89758801, 0xE101D41E, 0xD7128548, 0x650D2610,
0x45196070, 0x6659DD1B, 0x61D3626E, 0xC840262D,
0x74027102, 0x8D47D718, 0xD218666C, 0xE501DE0A,
0xA0312E22, 0x0000EE04, 0x001E1001, 0x002028C6,
0x002028A0, 0x001E1100, 0x002028CA, 0x002028B8,
0x002028D0, 0x001E1000, 0x002028BC, 0x002028C8,
0x00201A32, 0x001E1108, 0x00201B3E, 0x001E1015,
0x001E100C, 0x002028B4, 0x002028D4, 0x002028D8,
0x00202A90, 0x00202B26, 0x00202B32, 0x00202AA2,
0x75016245, 0x71022121, 0x32E3625C, 0x60638BF8,
0xE60181D4, 0xE417D538, 0x3243626C, 0x6255891E,
0x27217601, 0x7702AFF8, 0xDE35D234, 0x2E22E501,
0xEE04A004, 0x75016245, 0x71022121, 0x32E3625C,
0x60638BF8, 0xE60181D4, 0xA004D52E, 0x6255E417,
0x27217601, 0x626C7702, 0x8BF83243, 0x2D21924B,
0xD72AD429, 0x2F126142, 0x6DF265F2, 0xC9806053,
0x60532700, 0x6103C960, 0x60538071, 0x65F26EF2,
0x4D19C903, 0x80724529, 0x451960DC, 0x4E298172,
0x62EC605C, 0x302C4018, 0x6D428173, 0x2FD22118,
0x62F26EF2, 0x421966F2, 0x656C4629, 0x602C66F2,
0x401864EC, 0x304C4629, 0x81744619, 0x4018606C,
0x8F07305C, 0xBCB58175, 0x620C0009, 0x89082228,
0x0009A00A, 0x88406013, 0xB00A8B03, 0xA0030009,
0xD60B0009, 0x2622E202, 0x4F267F04, 0x000B6EF6,
0x000B6DF6, 0x060A0009, 0x00202AD2, 0x00202AD0,
0x002028BC, 0x00202AA4, 0x001E100C, 0x002028A0,
0x002028D0, 0x7FFC4F22, 0x6620D27E, 0x8D082668,
0xD47D2F60, 0x420BD27D, 0x64F00009, 0xA0907F04,
0x7F044F26, 0x000B4F26, 0x000B0009, 0x2FE60009,
0xDE774F22, 0x60E0D677, 0xCBC0D477, 0x62602E00,
0xC803602C, 0x40218904, 0x70014021, 0x6603A002,
0x66034009, 0xD671616D, 0xE500A004, 0x75016262,
0x74042422, 0x3213625D, 0xD16D8BF8, 0x0009410B,
0xE401D66C, 0x84E22641, 0x80E2C9BF, 0x000B4F26,
0x2FE66EF6, 0xD5687FFC, 0x6250DE61, 0x642C84E2,
0xCB407404, 0x80E2614D, 0x44216413, 0xD7634421,
0xE600A004, 0x76016256, 0x27222F22, 0x3243626D,
0x60138BF8, 0x2008C903, 0x88038912, 0x88028905,
0x88018906, 0xA0088907, 0xE0070009, 0x8078A005,
0xA002E003, 0xE0018078, 0x62528078, 0x27222F22,
0xD650E00F, 0x60618078, 0x8B018801, 0x2621E200,
0x6060D64F, 0x2600CB08, 0xC93F60E0, 0x7F042E00,
0x6EF6000B, 0x6021D247, 0x8D188801, 0xD2466143,
0x22106053, 0x60638021, 0xD4468121, 0xE500A007,
0x027C605D, 0x364C6603, 0x26207001, 0x625D6503,
0x3213611C, 0xD6408BF4, 0xC9BF6060, 0x000B2600,
0x2FD60009, 0x4F222FE6, 0x60437FFC, 0x8D02C820,
0xBF6A6E43, 0x60E30009, 0x8901C810, 0x0009BF67,
0xC84060E3, 0xBF8C8901, 0x60E30009, 0x8929C801,
0x60D0DD32, 0x8D03C802, 0xD6312F00, 0x0009460B,
0xC80460F0, 0xD62F8902, 0x0009460B, 0x602362F0,
0x8902C880, 0xC97F60D0, 0x60232D00, 0x8902C801,
0x420BD229, 0xD5290009, 0x88026052, 0xD2288B03,
0xA005E604, 0x88012260, 0xD2258B02, 0x2260E601,
0x2522E200, 0xC88060E3, 0xD2228916, 0x60E36E20,
0x8902C802, 0x420BD220, 0x60E30009, 0x8902C804,
0x420BD21E, 0x60E30009, 0x8905C808, 0x7F04D21C,
0x6EF64F26, 0x6DF6422B, 0x4F267F04, 0x000B6EF6,
0x00006DF6, 0x001E1020, 0x0020296C, 0x00200DA6,
0x001E1015, 0x001E10BF, 0x00117D00, 0x001E10FC,
0x002000F8, 0x002028CC, 0x00117D80, 0x001E10F8,
0x001E10AE, 0x00117D84, 0x001E1017, 0x001E1021,
0x00200FD8, 0x00200FFA, 0x00201584, 0x002028D0,
0x001E100B, 0x001E1028, 0x0020102A, 0x0020103C,
0x00201048, 0xD6A8644C, 0x346C74FF, 0x2450000B,
0x644CD6A6, 0x000B346C, 0xD6A52450, 0x346C644C,
0x2450000B, 0x616D625C, 0x41194208, 0x60194208,
0x644C4200, 0x324C670E, 0x207DD19E, 0xC90F4200,
0x000B321C, 0x67632200, 0x4208625C, 0x42004208,
0x324C644C, 0x4200D198, 0x000B321C, 0x2FE62270,
0x614C4F12, 0x4100D493, 0x6710314C, 0x2729E29F,
0x65736E53, 0x4719676D, 0x672E6279, 0x4221227D,
0x42214221, 0x7601662C, 0xE4014608, 0x34E84608,
0x644C4600, 0x0E1A0467, 0x215025EB, 0x000B4F16,
0x4F226EF6, 0xD2857FE8, 0x88016021, 0xD2848B7B,
0x26686621, 0xD2838B77, 0x26686621, 0xE50F8B73,
0xE401BFA0, 0xBFA3E501, 0xE586E400, 0xE400655C,
0x2F50BFA3, 0xBFA0E401, 0xE602E506, 0x60634618,
0x81F2E401, 0x6543BF9E, 0xE40185F2, 0xBFAA6543,
0x85F26603, 0x6543E401, 0x6603BFB1, 0xE40265F0,
0x6053756C, 0x80F8BF7E, 0xBF81E402, 0x84F8E512,
0x7090E402, 0x6503BF81, 0x4618E602, 0x81F66063,
0xBF7FE402, 0x85F6E500, 0x6603E402, 0xE500BF8B,
0xE40285F6, 0xBF926603, 0xE5FEE500, 0xE010655C,
0xBF5FE403, 0xE5130F54, 0xE40EBF62, 0x05FCE010,
0xBF62E40E, 0xE5007585, 0xBF63E403, 0xE500E640,
0xBF70E403, 0xE500E640, 0xBF78E403, 0xE5FFE640,
0xE014655C, 0xBF45E404, 0xE40F0F54, 0xE504BF48,
0x05FCE014, 0xBF48E40F, 0xE5017584, 0xBF49E640,
0xE501E404, 0xBF56E640, 0xE501E404, 0xE404E640,
0xAF5C7F18, 0x7F184F26, 0x000B4F26, 0x4F220009,
0xD2427FF0, 0x88016021, 0xD2418B71, 0x26686621,
0xD2408B6D, 0x26686621, 0xE50F8B69, 0xE401BF1A,
0xBF1DE501, 0xE586E400, 0xE400655C, 0x2F50BF1D,
0xBF1AE401, 0xE401E506, 0xBF1B6543, 0xE401E640,
0xBF286543, 0xE401E640, 0xBF306543, 0x65F0E640,
0x756CE402, 0xBEFD6053, 0xE40280F4, 0xE512BF00,
0xE40284F4, 0xBF007090, 0xE6406503, 0xBF01E402,
0xE640E500, 0xBF0EE402, 0xE640E500, 0xBF16E402,
0xE5FEE500, 0x6053655C, 0xBEE3E403, 0xE51380F8,
0xE40EBEE6, 0xE40E84F8, 0xBEE67085, 0xE5006503,
0xBEE7E640, 0xE500E403, 0xBEF4E640, 0xE500E403,
0xBEFCE640, 0xE5FFE403, 0x6053655C, 0xBEC9E404,
0xE40F80FC, 0xE504BECC, 0xE40F84FC, 0xBECC7083,
0xE5016503, 0xBECDE640, 0xE501E404, 0xBEDAE640,
0xE501E404, 0xE404E640, 0xAEE07F10, 0x7F104F26,
0x000B4F26, 0x00000009, 0x001E1030, 0x001E1080,
0x001E1090, 0x001E103F, 0x001E103E, 0x002028C6,
0x002028C8, 0x002028CA, 0x0009000B, 0x666CE680,
0x6563D2A8, 0x7540E700, 0x6473422B, 0x2FB62FA6,
0x2FD62FC6, 0x4F222FE6, 0x4C18EC01, 0xDAA3DBA2,
0x65B252B1, 0x89223520, 0xC9036051, 0x891E8801,
0xD19FDE9D, 0x64E3410B, 0x85036503, 0x670D66A2,
0xDD9C3762, 0xD49C890A, 0x420BD29C, 0xD19C0009,
0xE701D49C, 0x21724D0B, 0x0009AFE2, 0x420BD29A,
0xD69A64E3, 0x4D0BD49A, 0xAFD926C2, 0x4F260009,
0x6DF66EF6, 0x6BF66CF6, 0x6AF6000B, 0x7FF44F22,
0xE6818546, 0x85472F01, 0x81F1666C, 0xD2858548,
0x854281F2, 0x81F367F3, 0xE40C8543, 0x605381F4,
0x81F56563, 0x7540420B, 0x4F267F0C, 0x0009000B,
0x2F962F86, 0x2FB62FA6, 0x2FD62FC6, 0x4F222FE6,
0xDC847FF0, 0xE800A0DD, 0xD2836B13, 0xE0014B08,
0x4B00420B, 0x1F03DE81, 0x3BEC85F2, 0x2F827E30,
0x1FE26803, 0x66C2DD7E, 0x362052C1, 0xA0C38B01,
0x60610009, 0x8801C903, 0xA0BD8B01, 0x85610009,
0x8965C801, 0xEE105163, 0xDA6A8512, 0xC9036603,
0x85136403, 0x4021600D, 0xC93F4021, 0x8D1C30E3,
0xD7706503, 0x62704408, 0x44004408, 0x22284500,
0x345C8F0A, 0x6043D26C, 0x697D072D, 0x68994919,
0x697C6E8E, 0x28EDA009, 0x6043D268, 0x697D072D,
0x68994919, 0x697C6E8E, 0xEEFF28ED, 0x6EEC629D,
0x8B0F32E0, 0x410BD152, 0x540364C3, 0xBF85E502,
0xD45F6E03, 0x460BD654, 0xD75E65E3, 0xD45EEE01,
0x27E2A01D, 0x26E9EEFC, 0x81126063, 0x97888513,
0x20794208, 0x85128113, 0x8112208B, 0x202B8513,
0x85148113, 0x4218E208, 0x8114202B, 0x854164C2,
0x814120E9, 0xD45165C2, 0xCB016051, 0x4A0B2501,
0x60C20009, 0x52F356F2, 0x2B02CB01, 0x2622AF8B,
0xD2378561, 0x8D2EC802, 0x420B64C3, 0xD6480009,
0x5E036503, 0x076EE04C, 0x7701D146, 0x60120676,
0x8B058801, 0xEA0C85E1, 0x20AB4A18, 0x81E1A007,
0x88026012, 0x85E18B03, 0x20A9EADF, 0x855181E1,
0x20A9EAFC, 0x60518151, 0xCB01DA28, 0x4A0B64C3,
0x56F22501, 0xD73851F3, 0x85EF2612, 0x470B64D3,
0xAF58650D, 0x420B0009, 0x54030009, 0x85446E03,
0x4A18EA08, 0x30A020A9, 0x8B03DA1A, 0xE501BF16,
0x0009A007, 0xD62D8541, 0x2268620D, 0xBF0D8901,
0xD423E500, 0x420BD218, 0xD72265E3, 0xEE01D428,
0x27E24A0B, 0x0009AF37, 0x68F26083, 0x780181F2,
0x618D7C08, 0x31E7EE03, 0xAF1D8901, 0x7F100009,
0x6EF64F26, 0x6CF66DF6, 0x6AF66BF6, 0x000B69F6,
0xFE0368F6, 0x00201834, 0x00202884, 0x0020288C,
0x00200A5C, 0x00200DA6, 0x00202854, 0x00200ADE,
0x001E2130, 0x00202A70, 0x00200A7A, 0x001C3D30,
0x00202A74, 0x00202864, 0x00201FD4, 0x001C3D00,
0x00202A80, 0x00202A8C, 0x00202970, 0x002029F0,
0x0020285C, 0x001E212C, 0x00202A78, 0x00202A7C,
0x002027F8, 0x002027F4, 0x00200E06, 0x00008000,
0x00202A88, 0x4F222FE6, 0x6E22D20D, 0xC84060E3,
0x22E28D02, 0x0009BE68, 0x4218E240, 0x89012E28,
0x0009BE64, 0xC80560E3, 0xBEB98901, 0x60E30009,
0x8902C802, 0xAE614F26, 0x4F266EF6, 0x6EF6000B,
0x001C3510, 0x080A0C0E, 0x00020406, 0x1A1C1E20,
0x12141618, 0x2E303234, 0x26282A2C, 0x3A3C3E40,
0x6C625648, 0x41112F26, 0xE2208F18, 0x890B3123,
0x321CD204, 0xD1026220, 0x412B312C, 0x00090009,
0x00201FFE, 0x00201FB4, 0x000BE000, 0x400062F6,
0x40004000, 0x40004000, 0x40004000, 0x62F6000B,
0x40004000, 0x40004000, 0x40004000, 0x40184000,
0x62F6000B, 0x40004000, 0x40004000, 0x40004000,
0x40284000, 0x62F6000B, 0x40004000, 0x40184000,
0x000B4028, 0xC90F62F6, 0x40054005, 0x40054005,
0x62F6000B, 0x4005C907, 0x40054005, 0x62F6000B,
0x4005C903, 0x000B4005, 0xC90162F6, 0x000B4005,
0x000062F6, 0x080A0C0E, 0x00020406, 0x1A1C1E20,
0x12141618, 0x2E303234, 0x26282A2C, 0x3A3C3E40,
0x6C625648, 0x41112F26, 0xE2208F18, 0x890B3123,
0x321CD204, 0xD1026220, 0x412B312C, 0x00090009,
0x002020BE, 0x00202074, 0x000BE000, 0x400162F6,
0x40014001, 0x40014001, 0x40014001, 0x62F6000B,
0x40014001, 0x40014001, 0x40014001, 0x40194001,
0x62F6000B, 0x40014001, 0x40014001, 0x40014001,
0x40294001, 0x62F6000B, 0x40014001, 0x40194001,
0x000B4029, 0x400462F6, 0x40044004, 0xC90F4004,
0x62F6000B, 0x40044004, 0xC9074004, 0x62F6000B,
0x40044004, 0x000BC903, 0x400462F6, 0x000BC901,
0x000062F6, 0x3622E218, 0x67438F12, 0x0009A004,
0x76FF6254, 0x74012420, 0xC8036053, 0x60438BF8,
0x8902C803, 0x422BD22B, 0xD22B0009, 0x0009422B,
0x2FE66473, 0x8D4A3450, 0x27786763, 0x62438947,
0x227B225B, 0xC9016023, 0x8D203452, 0x2EE86E03,
0x60238B15, 0x8B08C803, 0x47096643, 0x47106256,
0x8FFB2622, 0xA0327604, 0x47010009, 0x61436673,
0x46106255, 0x8FFB2121, 0xA0287102, 0x66430009,
0x47106254, 0x8FFB2620, 0xA0207601, 0x61430009,
0x2EE8357C, 0x8F15317C, 0x60236653, 0x8B07C803,
0x76FC4709, 0x47106262, 0x21268FFB, 0x0009A00F,
0x65634701, 0x75FE6673, 0x46106251, 0x21258FFB,
0x0009A005, 0x626076FF, 0x8FFB4710, 0x60432124,
0x6EF6000B, 0x002022A6, 0x00202752, 0xE21E2FE6,
0x67633626, 0x8D1B6153, 0x3E106E43, 0x3E128916,
0x65E38908, 0x3672E600, 0x62148910, 0x25207601,
0x7501AFF9, 0x317C64E3, 0x6513347C, 0xE600A004,
0x625075FF, 0x24247601, 0x8BF93672, 0x60E3A011,
0x890831E2, 0x327C6213, 0x8B0432E6, 0x651364E3,
0xA0086673, 0xD28F6EF6, 0x651364E3, 0x422B6673,
0x000B6EF6, 0xE2046EF6, 0x67433622, 0x8F10356C,
0xA004346C, 0x75FF0009, 0x76FF6250, 0x60532424,
0x8BF8C803, 0xC8036043, 0xA1058901, 0xA2770009,
0xA2990009, 0x2FB60009, 0x2FD62FC6, 0x7FE42FE6,
0x6C636043, 0x66521F62, 0xC9037504, 0x1F516E53,
0x45086503, 0xE1FC6D43, 0x2D194500, 0x1F732558,
0x1F651F44, 0x2FD28D0B, 0x88086053, 0x88108923,
0x8818895B, 0xA0898B01, 0xA0BD0009, 0x62630009,
0x2D22E600, 0x7CFC7D04, 0xEB10A00D, 0xE60064E6,
0x7CF065E6, 0x62E261E6, 0x1D512D42, 0x1D231D12,
0x7E047D10, 0x3CB21FE1, 0x1F6589F0, 0x2FD21FC2,
0xA0A11FE6, 0x64D21FD4, 0x44286263, 0x44294418,
0x42184419, 0x4629242B, 0x2D424619, 0x65637D04,
0xA0217CFD, 0x67E6EB10, 0x62E67CF0, 0x64E66673,
0x256B4618, 0x2D5261E2, 0x65234729, 0x45184719,
0x4229275B, 0x42191D71, 0x47186743, 0x4429227B,
0x44196713, 0x247B4718, 0x1D431D22, 0x41194129,
0x65137D10, 0x1FE17E04, 0x89DC3CB2, 0x1FE67EFF,
0x1FC21F55, 0xA0672FD2, 0x6CF21FD4, 0x66C257F5,
0x46286273, 0x42284629, 0x2C62262B, 0x7C045DF2,
0x7DFE4729, 0xA01CEB10, 0x65E65EF1, 0x66E66273,
0x47286753, 0x6763227B, 0x452961E6, 0x257B4728,
0x2C2264E6, 0x65131C51, 0x45284629, 0x1C62265B,
0x41296643, 0x216B4628, 0x44291C13, 0x67437C10,
0x3DB27DF0, 0x1FD289E1, 0x7EFEA034, 0x51F56CF2,
0x621366C2, 0x42284618, 0x42184619, 0x2C62262B,
0x7C045DF2, 0x7DFF4119, 0xA01FEB10, 0x65E65EF1,
0x64E67DF0, 0x42286253, 0x421867E6, 0x66E6212B,
0x61432C12, 0x45194128, 0x251B4118, 0x65731C51,
0x44194528, 0x245B4518, 0x64631C42, 0x47194428,
0x274B4418, 0x46191C73, 0x61637C10, 0x89DE3DB2,
0x7EFD1FD2, 0x1FC41FE6, 0x5DF2E704, 0xA00D5EF6,
0x62E451F4, 0x66E47DFC, 0x65E464E4, 0x71012120,
0x71012160, 0x71012140, 0x71012150, 0x89F03D72,
0x66D357F3, 0x641365E3, 0x6EF67F1C, 0x6CF66DF6,
0x6BF6A190, 0x00202134, 0x2FC62FB6, 0x2FE62FD6,
0x60437FE4, 0x6C63C903, 0x66031F62, 0x460875FC,
0x61526E43, 0x4600E2FC, 0x26682E29, 0x1F441F73,
0x1F516D53, 0x8D0B1F15, 0x60632FE2, 0x891F8808,
0x89538810, 0x8B018818, 0x0009A081, 0x0009A0B9,
0xEB10A00D, 0x52D37DF0, 0x54D156D2, 0x2E1665D2,
0x2E662E26, 0x2E427EFC, 0x1FD16153, 0x3CB27CF0,
0x7D0489F0, 0x1F151FD6, 0x2FE21FC2, 0x1FE4A0A1,
0x621366E2, 0x42294619, 0x42194618, 0x2E62262B,
0x7CFF4118, 0xEB10A021, 0x54D37DF0, 0x624357D2,
0x42194229, 0x55D1212B, 0x2E1666D2, 0x41296173,
0x41194418, 0x2E46241B, 0x44296453, 0x44194718,
0x2E76274B, 0x47296763, 0x47194518, 0x257B7EFC,
0x46182E52, 0x1FD16163, 0x3CB27CF0, 0x7D0389DC,
0x1F151FD6, 0x2FE21FC2, 0x1FE4A06B, 0x57F56EF2,
0x627366E2, 0x46284629, 0x262B4229, 0x2E625CF2,
0x7CFE4728, 0xA01BEB10, 0x7DF05DF1, 0x55D251D3,
0x46296613, 0x54D1276B, 0x2E7662D2, 0x41286753,
0x217B4729, 0x61432E16, 0x41294528, 0x2E56251B,
0x44286523, 0x245B4529, 0x42282E46, 0x7CF06723,
0x89E23CB2, 0x1FD67D02, 0xA03A1FC2, 0x67F21FE4,
0x657251F5, 0x45296213, 0x45284519, 0x42194518,
0x5CF2252B, 0x41282752, 0x7CFD4118, 0xA022EB10,
0x7DF05DF1, 0x54D256D3, 0x45196563, 0x52D14628,
0x4618215B, 0x6ED26543, 0x45192716, 0x265B4428,
0x65436163, 0x45186423, 0x42284419, 0x4218254B,
0x271664E3, 0x44196623, 0x264B2756, 0x4E282766,
0x61E34E18, 0x3CB27CF0, 0x7D0189DB, 0x1FC21FD6,
0xE7041F74, 0x51F45DF2, 0x5EF6A00D, 0x84E27EFC,
0x620364E0, 0x7DFC84E1, 0x84E36503, 0x21646603,
0x21542124, 0x3D722144, 0x57F389F0, 0x641366D3,
0x7F1C65E3, 0x6DF66EF6, 0xA09D6CF6, 0x2F866BF6,
0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6, 0x614374E0,
0x6A636873, 0x6B56E920, 0x6C567AE0, 0x6D567120,
0x6E563A92, 0x64566756, 0x62566656, 0x11C121B2,
0x11E311D2, 0x11451174, 0x8DEC1166, 0x71201127,
0x6613A004, 0x7AFF6254, 0x76012620, 0x8BF92AA8,
0x6EF66083, 0x6CF66DF6, 0x6AF66BF6, 0x000B69F6,
0x2F8668F6, 0x2FA62F96, 0x2FC62FB6, 0x2FE62FD6,
0x6A636873, 0x75E0E920, 0x56565257, 0x57545155,
0x5D525E53, 0x6B525C51, 0x24662426, 0x24762416,
0x7AE024E6, 0x24C624D6, 0x8DEC3A92, 0x66A324B6,
0x6EF66783, 0x6CF66DF6, 0x6AF66BF6, 0xA04369F6,
0x2FE668F6, 0xC8046063, 0x8D046E63, 0x62166153,
0x24227EFC, 0x60E37404, 0x8908C818, 0x71046513,
0x62526616, 0x24227EF8, 0xAFF41461, 0xE2047408,
0x65133E22, 0x66E38D02, 0x6EF6A01C, 0x6EF6AF87,
0xC8046063, 0x61638D04, 0x625275FC, 0x242671FC,
0xC8186013, 0x75F88906, 0x66525251, 0x24662426,
0x71F8AFF6, 0x3122E204, 0x66138F02, 0x0009AFA1,
0x0009A00A, 0x0009A004, 0x76FF6254, 0x74012420,
0x8BF92668, 0x6073000B, 0x0009A004, 0x625075FF,
0x242476FF, 0x8BF92668, 0x6073000B, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x544F0D0A,
0x46205355, 0x00003A57, 0x2072614D, 0x32203232,
0x20373030, 0x353A3431, 0x33353A34, 0x00000000,
0x00000D0A, 0x00000043, 0x61766E49, 0x2064696C,
0x72657375, 0x20726F20, 0x2079656B, 0x00214449,
0x6E6B6E55, 0x206E776F, 0x6D6D6F63, 0x3D646E61,
0x00000000, 0x61437748, 0x7262696C, 0x6F697461,
0x6620206E, 0x0A6C6961, 0x0000000D, 0x73696F4E,
0x61432065, 0x7262696C, 0x6F697461, 0x6166206E,
0x21216C69, 0x00000D0A, 0x00000D0A, 0x00000042,
0x000000FF, 0x00020001, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x010E010D, 0x00020003, 0x01090108, 0x0002010A,
0x00030002, 0x02020201, 0x02040203, 0x02060205,
0x02080207, 0x020A0209, 0x020C020B, 0x020E020D,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x010E010D, 0x00FF010F, 0x01090108, 0x010B010A,
0x00030002, 0x02020201, 0x02040203, 0x02060205,
0x02080207, 0x020A0209, 0x020C020B, 0x020E020D,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00FF00FF, 0x00FF00FF, 0x00FF00FF, 0x00FF00FF,
0x00000072, 0x00205220, 0x00000046, 0x00000059,
0x73204142, 0x003D7165, 0x00000074, 0x00000000,
0x02000112, 0x40FFFFFF, 0x12210ACE, 0x20104890,
0x02090100, 0x0101002E, 0x09FA8000, 0x04000004,
0x000000FF, 0x02010507, 0x07000200, 0x00028205,
0x05070002, 0x00400383, 0x04050701, 0x01004003,
0x002E0209, 0x80000101, 0x000409FA, 0x00FF0400,
0x05070000, 0x00400201, 0x82050700, 0x00004002,
0x03830507, 0x07010040, 0x40030405, 0x03040100,
0x030C0409, 0x0079005A, 0x00410044, 0x03180053,
0x00530055, 0x00320042, 0x0030002E, 0x00570020,
0x0041004C, 0x0000004E, 0x00000000, 0x00000000,
0x00000709, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
};
const u32_t zcFwImageSize=11104;

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,240 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include "../80211core/cprecomp.h"
const u32_t zcFwImage[] = {
0x0009000B, 0x7FFC4F22, 0xD695D494, 0x0009460B,
0xD494E570, 0x4518B01E, 0x89042008, 0xD690D492,
0x462B7F04, 0xB0124F26, 0xD2900009, 0x420BD490,
0xE6000009, 0x949AD58F, 0xC8406052, 0x2F028F03,
0x8FF93642, 0x7F047601, 0x000B4F26, 0xD28A0009,
0x0009422B, 0x2FD62FC6, 0x4F222FE6, 0xD6877FEC,
0x626061F3, 0x2F208461, 0x846280F1, 0x80F27110,
0x6D438463, 0x846480F3, 0x80F46413, 0x6C538465,
0x846680F5, 0x80F6E500, 0xD77D8467, 0x846880F7,
0x80F8EE04, 0x80F98469, 0x80FA846A, 0x80FB846B,
0x80FC846C, 0x80FD846D, 0x80FE846E, 0x80FF846F,
0x6653655C, 0x7501367C, 0x665C6260, 0x242036E3,
0x74018FF6, 0x66F32F16, 0xE7107604, 0xB00D65C3,
0x6E0364D3, 0xD46B7F04, 0x420BD26B, 0x60E36503,
0x4F267F14, 0x6DF66EF6, 0x6CF6000B, 0x2FB62FA6,
0x2FD62FC6, 0x4F222FE6, 0x3F3C933A, 0x4108E141,
0x31FCE200, 0x11733526, 0x21521162, 0x11418D02,
0xE0FFA098, 0x4A18EA01, 0x262066F3, 0x32A27201,
0x76018FFB, 0x6BE3EE00, 0xE0446CF3, 0x00FE4008,
0x450BD556, 0x660361B3, 0x4008E043, 0x6DC004FE,
0x014C6063, 0x31EC3EDC, 0x60E36E1C, 0x7B0107FC,
0x2C703BA2, 0x8FE80FD4, 0xE0427C01, 0xEB004008,
0x70FC07FE, 0x6EB36CB3, 0xA0200AFE, 0x2710EDFF,
0x7C01FEE0, 0x60C36CCC, 0x657002FC, 0x6BBC3B2C,
0x01FC60B3, 0x0F1460C3, 0x0F2460B3, 0x04FC60C3,
0x342C7E01, 0x01FC604C, 0x251A62D3, 0xD43C225A,
0x2750602C, 0x064E4008, 0x2D6A4D19, 0x3EA27701,
0x66D78BDF, 0x4018E001, 0x0F646563, 0x70014519,
0x0F544629, 0x0F647001, 0x70014619, 0x90420F64,
0xE0450EFE, 0xEA014008, 0xE0460FF6, 0x4A184008,
0xED0067F3, 0x0FF637AC, 0x0FF67004, 0xE345E104,
0x7C014308, 0x6CCC33FC, 0x60C36432, 0x5531024C,
0x6BBC3B2C, 0x045C60B3, 0x60C35A32, 0x60B30A44,
0x60C30F24, 0x6A7006FC, 0x606C362C, 0x66E005FC,
0x6A5C64AC, 0x626C24AA, 0x89053420, 0x4D084D08,
0xCB0460D3, 0x600BA006, 0x7D014110, 0x8FD67701,
0xE0007E01, 0x3F3C9308, 0x6EF64F26, 0x6CF66DF6,
0x000B6BF6, 0x01386AF6, 0x00000120, 0x00200D54,
0x002002BE, 0x00102800, 0x00200D64, 0x0010F00A,
0x0010F000, 0x001C001C, 0x00103252, 0x00200DA0,
0x0010FFFC, 0x00200D7C, 0x0020032C, 0x00200370,
0x00200954, 0x0009000B, 0x2FD62FC6, 0x4F222FE6,
0x6D436C53, 0xEE00A004, 0x7E0164D4, 0x644CBFF2,
0x8BF93EC2, 0x6EF64F26, 0x000B6DF6, 0xE5006CF6,
0x6643A002, 0x76017501, 0x22286260, 0xAFE38BFA,
0x2FE60009, 0x75076253, 0xE1086753, 0x6043EE0A,
0x4409C90F, 0x650330E2, 0x8D014409, 0xE630E637,
0x4110365C, 0x8FF22760, 0xE00077FF, 0x000B8028,
0x4F226EF6, 0xBFE47FEC, 0xBFD865F3, 0x7F1464F3,
0x000B4F26, 0x4F22E000, 0xBFDA7FEC, 0x64F365F3,
0x7406BFCD, 0x4F267F14, 0xE000000B, 0x4F222FE6,
0x62537FEC, 0x65F36E43, 0x6423BFCB, 0x64E3BFBF,
0x64F3BFBD, 0xBFBAD403, 0x7F140009, 0x000B4F26,
0x00006EF6, 0x00200DB0, 0x89004011, 0x4111600B,
0x4F228906, 0x611BB004, 0x000B4F26, 0x0009600B,
0x620D2F26, 0x8F413020, 0x40180019, 0x8B0D3016,
0x31043104, 0x31043104, 0x31043104, 0x31043104,
0x890062F6, 0x4119310C, 0x6013000B, 0x41296219,
0x20084018, 0x31048927, 0x31043104, 0x31043104,
0x31043104, 0x31043104, 0x31043104, 0x31043104,
0x31043104, 0x61193104, 0x3204221D, 0x32043204,
0x32043204, 0x32043204, 0x32043204, 0x32043204,
0x32043204, 0x32043204, 0x89003204, 0x4229320C,
0x000B6023, 0xE00062F6, 0x62F6000B, 0x42286213,
0x42244129, 0x42243104, 0x42243104, 0x42243104,
0x42243104, 0x42243104, 0x42243104, 0x42243104,
0x42243104, 0x42243104, 0x42243104, 0x42243104,
0x42243104, 0x42243104, 0x42243104, 0x42243104,
0x89003104, 0x6013310C, 0x62F6000B, 0x2F262F16,
0x51F552F3, 0x52F22129, 0x52F41210, 0x212951F6,
0x121152F2, 0x000B62F6, 0x000061F6, 0x51F32F16,
0x310050F1, 0x51F48B02, 0x310050F2, 0x000B0029,
0x000061F6, 0x51F32F16, 0x310050F1, 0x51F48B06,
0x310050F2, 0xCA010029, 0x61F6000B, 0x000BE001,
0x000061F6, 0x50F0000B, 0x2F262F16, 0xE10052F2,
0x12001211, 0x000B62F6, 0x000061F6, 0x2F162F06,
0x8B264115, 0x3103E040, 0x2F26892B, 0x52F62F36,
0xE02053F5, 0x8B053103, 0xE3006233, 0x89093100,
0x3108A002, 0x8B0F2338, 0xD0064F22, 0x6023400B,
0x4F266203, 0x112151F4, 0x63F61130, 0x61F662F6,
0x60F6000B, 0x002007F4, 0x4100C709, 0x0123011D,
0x51F20009, 0x110150F4, 0x110050F3, 0x000B61F6,
0x51F260F6, 0x1101E000, 0x61F61100, 0x60F6000B,
0x01300000, 0x0128012C, 0x01200124, 0x0118011C,
0x0106010A, 0x00FE0102, 0x00E200E6, 0x00DA00DE,
0x00CC00D0, 0x00C400C8, 0x00A800AC, 0x00A000A4,
0x008C0090, 0x00840088, 0x0066006A, 0x005E0062,
0x42244300, 0x42244300, 0x42244300, 0x43286133,
0x43084318, 0x42284308, 0x42084218, 0x41094208,
0xAFAF4109, 0x4300221B, 0x43004224, 0x43004224,
0x61334224, 0x43184328, 0x42184228, 0xAFA14119,
0x4300221B, 0x43004224, 0x43004224, 0x61334224,
0x43084328, 0x42284308, 0x42084208, 0x41094119,
0xAF8F4109, 0x4300221B, 0x43004224, 0x43004224,
0x61334224, 0x212D4328, 0x6213AF84, 0x42244300,
0x42244300, 0x42244300, 0x43186133, 0x43084308,
0x42084218, 0x41294208, 0x41094109, 0x221BAF72,
0x42244300, 0x42244300, 0x42244300, 0x43186133,
0x41294218, 0xAF654119, 0x4300221B, 0x43004224,
0x43004224, 0x43004224, 0x43004224, 0x43004224,
0x43004224, 0x4224AF56, 0x2F162F06, 0x8B264115,
0x3103E040, 0x2F26892B, 0x52F62F36, 0xE02053F5,
0x8B053103, 0xE2006323, 0x89093100, 0x3108A002,
0x8B0F2228, 0xD0064F22, 0x6033400B, 0x4F266303,
0x112151F4, 0x63F61130, 0x61F662F6, 0x60F6000B,
0x002008B4, 0x4100C709, 0x0123011D, 0x51F20009,
0x110150F4, 0x110050F3, 0x000B61F6, 0x51F260F6,
0x1101E000, 0x61F61100, 0x60F6000B, 0x012E0000,
0x0126012A, 0x011E0122, 0x0116011A, 0x01040108,
0x00FC0100, 0x00E000E4, 0x00D800DC, 0x00CC00D0,
0x00C400C8, 0x00A800AC, 0x00A000A4, 0x008C0090,
0x00840088, 0x0066006A, 0x005E0062, 0x43254201,
0x43254201, 0x43254201, 0x42296123, 0x42094219,
0x43294209, 0x43094319, 0x41084309, 0xAFAF4108,
0x4201231B, 0x42014325, 0x42014325, 0x61234325,
0x42194229, 0x43194329, 0xAFA14118, 0x4201231B,
0x42014325, 0x42014325, 0x61234325, 0x42094229,
0x43294209, 0x43094309, 0x41084118, 0xAF8F4108,
0x4201231B, 0x42014325, 0x42014325, 0x61234325,
0xAF854229, 0x4201231D, 0x42014325, 0x42014325,
0x61234325, 0x42094219, 0x43194209, 0x43094309,
0x41084128, 0xAF734108, 0x4201231B, 0x42014325,
0x42014325, 0x61234325, 0x43194219, 0x41184128,
0x231BAF66, 0x43254201, 0x43254201, 0x43254201,
0x43254201, 0x43254201, 0x43254201, 0xAF574201,
0x00004325, 0x080A0C0E, 0x00020406, 0x1A1C1E20,
0x12141618, 0x2E303234, 0x26282A2C, 0x3A3C3E40,
0x6C625648, 0x41112F26, 0xE2208F18, 0x890B3123,
0x321CD204, 0xD1026220, 0x412B312C, 0x00090009,
0x0020081E, 0x002007D4, 0x000BE000, 0x400062F6,
0x40004000, 0x40004000, 0x40004000, 0x62F6000B,
0x40004000, 0x40004000, 0x40004000, 0x40184000,
0x62F6000B, 0x40004000, 0x40004000, 0x40004000,
0x40284000, 0x62F6000B, 0x40004000, 0x40184000,
0x000B4028, 0xC90F62F6, 0x40054005, 0x40054005,
0x62F6000B, 0x4005C907, 0x40054005, 0x62F6000B,
0x4005C903, 0x000B4005, 0xC90162F6, 0x000B4005,
0x000062F6, 0x080A0C0E, 0x00020406, 0x1A1C1E20,
0x12141618, 0x2E303234, 0x26282A2C, 0x3A3C3E40,
0x6C625648, 0x41112F26, 0xE2208F18, 0x890B3123,
0x321CD204, 0xD1026220, 0x412B312C, 0x00090009,
0x002008DE, 0x00200894, 0x000BE000, 0x400162F6,
0x40014001, 0x40014001, 0x40014001, 0x62F6000B,
0x40014001, 0x40014001, 0x40014001, 0x40194001,
0x62F6000B, 0x40014001, 0x40014001, 0x40014001,
0x40294001, 0x62F6000B, 0x40014001, 0x40194001,
0x000B4029, 0x400462F6, 0x40044004, 0xC90F4004,
0x62F6000B, 0x40044004, 0xC9074004, 0x62F6000B,
0x40044004, 0x000BC903, 0x400462F6, 0x000BC901,
0x000062F6, 0x00000000, 0x77073096, 0xEE0E612C,
0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535,
0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E,
0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07,
0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148,
0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551,
0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A,
0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63,
0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4,
0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD,
0xA50AB56B, 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6,
0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF,
0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180,
0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599,
0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2,
0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB,
0xB6662D3D, 0x76DC4190, 0x01DB7106, 0x98D220BC,
0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5,
0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E,
0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97,
0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8,
0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1,
0xF50FC457, 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA,
0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3,
0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074,
0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D,
0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846,
0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F,
0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010,
0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409,
0xCE61E49F, 0x5EDEF90E, 0x29D9C998, 0xB0D09822,
0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B,
0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C,
0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615,
0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E,
0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27,
0x7D079EB1, 0xF00F9344, 0x8708A3D2, 0x1E01F268,
0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671,
0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A,
0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43,
0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4,
0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD,
0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6,
0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF,
0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0,
0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9,
0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92,
0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B,
0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C,
0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785,
0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE,
0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7,
0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8,
0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1,
0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA,
0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3,
0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354,
0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D,
0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66,
0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F,
0x30B5FFE9, 0xBDBDF21C, 0xCABAC28A, 0x53B39330,
0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729,
0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02,
0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B,
0x2D02EF8D, 0x544F0D0A, 0x50205355, 0x20312D48,
0x003A5746, 0x72636564, 0x69747079, 0x65206E6F,
0x726F7272, 0x0A0D2121, 0x00000000, 0x6564667A,
0x70797263, 0x65725F74, 0x616C7567, 0x79726F74,
0x6261745F, 0x7220656C, 0x203D7465, 0x00000000,
0x45485441, 0x38731652, 0x89ACFF91, 0xEE55D178,
0xEE000D0A, };
const u32_t zcFwImageSize=3508;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,524 @@
/*
* Copyright (c) 2000-2005 ZyDAS Technology Corporation
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* Module Name : hpreg.h */
/* */
/* Abstract */
/* This module contains Regulatory Table definitions. */
/* */
/* NOTES */
/* None */
/* */
/************************************************************************/
#ifndef _HPREG_H
#define _HPREG_H
typedef u16_t HAL_CTRY_CODE; /* country code */
typedef u16_t HAL_REG_DOMAIN; /* regulatory domain code */
typedef enum {
AH_FALSE = 0, /* NB: lots of code assumes false is zero */
AH_TRUE = 1,
} HAL_BOOL;
/*
* Country/Region Codes from MS WINNLS.H
* Numbering from ISO 3166
*/
enum CountryCode {
CTRY_ALBANIA = 8, /* Albania */
CTRY_ALGERIA = 12, /* Algeria */
CTRY_ARGENTINA = 32, /* Argentina */
CTRY_ARMENIA = 51, /* Armenia */
CTRY_AUSTRALIA = 36, /* Australia */
CTRY_AUSTRIA = 40, /* Austria */
CTRY_AZERBAIJAN = 31, /* Azerbaijan */
CTRY_BAHRAIN = 48, /* Bahrain */
CTRY_BELARUS = 112, /* Belarus */
CTRY_BELGIUM = 56, /* Belgium */
CTRY_BELIZE = 84, /* Belize */
CTRY_BOLIVIA = 68, /* Bolivia */
CTRY_BOSNIA = 70, /* Bosnia */
CTRY_BRAZIL = 76, /* Brazil */
CTRY_BRUNEI_DARUSSALAM = 96, /* Brunei Darussalam */
CTRY_BULGARIA = 100, /* Bulgaria */
CTRY_CANADA = 124, /* Canada */
CTRY_CHILE = 152, /* Chile */
CTRY_CHINA = 156, /* People's Republic of China */
CTRY_COLOMBIA = 170, /* Colombia */
CTRY_COSTA_RICA = 188, /* Costa Rica */
CTRY_CROATIA = 191, /* Croatia */
CTRY_CYPRUS = 196, /* Cyprus */
CTRY_CZECH = 203, /* Czech Republic */
CTRY_DENMARK = 208, /* Denmark */
CTRY_DOMINICAN_REPUBLIC = 214, /* Dominican Republic */
CTRY_ECUADOR = 218, /* Ecuador */
CTRY_EGYPT = 818, /* Egypt */
CTRY_EL_SALVADOR = 222, /* El Salvador */
CTRY_ESTONIA = 233, /* Estonia */
CTRY_FAEROE_ISLANDS = 234, /* Faeroe Islands */
CTRY_FINLAND = 246, /* Finland */
CTRY_FRANCE = 250, /* France */
CTRY_FRANCE2 = 255, /* France2 */
CTRY_GEORGIA = 268, /* Georgia */
CTRY_GERMANY = 276, /* Germany */
CTRY_GREECE = 300, /* Greece */
CTRY_GUATEMALA = 320, /* Guatemala */
CTRY_HONDURAS = 340, /* Honduras */
CTRY_HONG_KONG = 344, /* Hong Kong S.A.R., P.R.C. */
CTRY_HUNGARY = 348, /* Hungary */
CTRY_ICELAND = 352, /* Iceland */
CTRY_INDIA = 356, /* India */
CTRY_INDONESIA = 360, /* Indonesia */
CTRY_IRAN = 364, /* Iran */
CTRY_IRAQ = 368, /* Iraq */
CTRY_IRELAND = 372, /* Ireland */
CTRY_ISRAEL = 376, /* Israel */
CTRY_ISRAEL2 = 377, /* Israel2 */
CTRY_ITALY = 380, /* Italy */
CTRY_JAMAICA = 388, /* Jamaica */
CTRY_JAPAN = 392, /* Japan */
CTRY_JAPAN1 = 393, /* Japan (JP1) */
CTRY_JAPAN2 = 394, /* Japan (JP0) */
CTRY_JAPAN3 = 395, /* Japan (JP1-1) */
CTRY_JAPAN4 = 396, /* Japan (JE1) */
CTRY_JAPAN5 = 397, /* Japan (JE2) */
CTRY_JAPAN6 = 399, /* Japan (JP6) */
CTRY_JAPAN7 = 4007, /* Japan (J7) */
CTRY_JAPAN8 = 4008, /* Japan (J8) */
CTRY_JAPAN9 = 4009, /* Japan (J9) */
CTRY_JAPAN10 = 4010, /* Japan (J10) */
CTRY_JAPAN11 = 4011, /* Japan (J11) */
CTRY_JAPAN12 = 4012, /* Japan (J12) */
CTRY_JAPAN13 = 4013, /* Japan (J13) */
CTRY_JAPAN14 = 4014, /* Japan (J14) */
CTRY_JAPAN15 = 4015, /* Japan (J15) */
CTRY_JAPAN16 = 4016, /* Japan (J16) */
CTRY_JAPAN17 = 4017, /* Japan (J17) */
CTRY_JAPAN18 = 4018, /* Japan (J18) */
CTRY_JAPAN19 = 4019, /* Japan (J19) */
CTRY_JAPAN20 = 4020, /* Japan (J20) */
CTRY_JAPAN21 = 4021, /* Japan (J21) */
CTRY_JAPAN22 = 4022, /* Japan (J22) */
CTRY_JAPAN23 = 4023, /* Japan (J23) */
CTRY_JAPAN24 = 4024, /* Japan (J24) */
CTRY_JAPAN25 = 4025, /* Japan (J25) */
CTRY_JAPAN26 = 4026, /* Japan (J26) */
CTRY_JAPAN27 = 4027, /* Japan (J27) */
CTRY_JAPAN28 = 4028, /* Japan (J28) */
CTRY_JAPAN29 = 4029, /* Japan (J29) */
CTRY_JAPAN30 = 4030, /* Japan (J30) */
CTRY_JAPAN31 = 4031, /* Japan (J31) */
CTRY_JAPAN32 = 4032, /* Japan (J32) */
CTRY_JAPAN33 = 4033, /* Japan (J33) */
CTRY_JAPAN34 = 4034, /* Japan (J34) */
CTRY_JAPAN35 = 4035, /* Japan (J35) */
CTRY_JAPAN36 = 4036, /* Japan (J36) */
CTRY_JAPAN37 = 4037, /* Japan (J37) */
CTRY_JAPAN38 = 4038, /* Japan (J38) */
CTRY_JAPAN39 = 4039, /* Japan (J39) */
CTRY_JAPAN40 = 4040, /* Japan (J40) */
CTRY_JAPAN41 = 4041, /* Japan (J41) */
CTRY_JAPAN42 = 4042, /* Japan (J42) */
CTRY_JAPAN43 = 4043, /* Japan (J43) */
CTRY_JAPAN44 = 4044, /* Japan (J44) */
CTRY_JAPAN45 = 4045, /* Japan (J45) */
CTRY_JAPAN46 = 4046, /* Japan (J46) */
CTRY_JAPAN47 = 4047, /* Japan (J47) */
CTRY_JAPAN48 = 4048, /* Japan (J48) */
CTRY_JAPAN49 = 4049, /* Japan (J49) */
CTRY_JAPAN50 = 4050, /* Japan (J50) */
CTRY_JAPAN51 = 4051, /* Japan (J51) */
CTRY_JAPAN52 = 4052, /* Japan (J52) */
CTRY_JAPAN53 = 4053, /* Japan (J53) */
CTRY_JAPAN54 = 4054, /* Japan (J54) */
CTRY_JORDAN = 400, /* Jordan */
CTRY_KAZAKHSTAN = 398, /* Kazakhstan */
CTRY_KENYA = 404, /* Kenya */
CTRY_KOREA_NORTH = 408, /* North Korea */
CTRY_KOREA_ROC = 410, /* South Korea */
CTRY_KOREA_ROC2 = 411, /* South Korea */
CTRY_KOREA_ROC3 = 412, /* South Korea */
CTRY_KUWAIT = 414, /* Kuwait */
CTRY_LATVIA = 428, /* Latvia */
CTRY_LEBANON = 422, /* Lebanon */
CTRY_LIBYA = 434, /* Libya */
CTRY_LIECHTENSTEIN = 438, /* Liechtenstein */
CTRY_LITHUANIA = 440, /* Lithuania */
CTRY_LUXEMBOURG = 442, /* Luxembourg */
CTRY_MACAU = 446, /* Macau */
CTRY_MACEDONIA = 807, /* the Former Yugoslav Republic of Macedonia */
CTRY_MALAYSIA = 458, /* Malaysia */
CTRY_MALTA = 470, /* Malta */
CTRY_MEXICO = 484, /* Mexico */
CTRY_MONACO = 492, /* Principality of Monaco */
CTRY_MOROCCO = 504, /* Morocco */
CTRY_NETHERLANDS = 528, /* Netherlands */
CTRY_NETHERLANDS_ANT = 530, /* Netherlands-Antellis */
CTRY_NEW_ZEALAND = 554, /* New Zealand */
CTRY_NICARAGUA = 558, /* Nicaragua */
CTRY_NORWAY = 578, /* Norway */
CTRY_OMAN = 512, /* Oman */
CTRY_PAKISTAN = 586, /* Islamic Republic of Pakistan */
CTRY_PANAMA = 591, /* Panama */
CTRY_PARAGUAY = 600, /* Paraguay */
CTRY_PERU = 604, /* Peru */
CTRY_PHILIPPINES = 608, /* Republic of the Philippines */
CTRY_POLAND = 616, /* Poland */
CTRY_PORTUGAL = 620, /* Portugal */
CTRY_PUERTO_RICO = 630, /* Puerto Rico */
CTRY_QATAR = 634, /* Qatar */
CTRY_ROMANIA = 642, /* Romania */
CTRY_RUSSIA = 643, /* Russia */
CTRY_SAUDI_ARABIA = 682, /* Saudi Arabia */
CTRY_SERBIA_MONT = 891, /* Serbia and Montenegro */
CTRY_SINGAPORE = 702, /* Singapore */
CTRY_SLOVAKIA = 703, /* Slovak Republic */
CTRY_SLOVENIA = 705, /* Slovenia */
CTRY_SOUTH_AFRICA = 710, /* South Africa */
CTRY_SPAIN = 724, /* Spain */
CTRY_SRILANKA = 144, /* Srilanka */
CTRY_SWEDEN = 752, /* Sweden */
CTRY_SWITZERLAND = 756, /* Switzerland */
CTRY_SYRIA = 760, /* Syria */
CTRY_TAIWAN = 158, /* Taiwan */
CTRY_THAILAND = 764, /* Thailand */
CTRY_TRINIDAD_Y_TOBAGO = 780, /* Trinidad y Tobago */
CTRY_TUNISIA = 788, /* Tunisia */
CTRY_TURKEY = 792, /* Turkey */
CTRY_UAE = 784, /* U.A.E. */
CTRY_UKRAINE = 804, /* Ukraine */
CTRY_UNITED_KINGDOM = 826, /* United Kingdom */
CTRY_UNITED_STATES = 840, /* United States */
CTRY_UNITED_STATES_FCC49 = 842, /* United States (Public Safety)*/
CTRY_URUGUAY = 858, /* Uruguay */
CTRY_UZBEKISTAN = 860, /* Uzbekistan */
CTRY_VENEZUELA = 862, /* Venezuela */
CTRY_VIET_NAM = 704, /* Viet Nam */
CTRY_YEMEN = 887, /* Yemen */
CTRY_ZIMBABWE = 716 /* Zimbabwe */
};
/* Enumerated Regulatory Domain Information 8 bit values indicate that
* the regdomain is really a pair of unitary regdomains. 12 bit values
* are the real unitary regdomains and are the only ones which have the
* frequency bitmasks and flags set.
*/
enum EnumRd {
/*
* The following regulatory domain definitions are
* found in the EEPROM. Each regulatory domain
* can operate in either a 5GHz or 2.4GHz wireless mode or
* both 5GHz and 2.4GHz wireless modes.
* In general, the value holds no special
* meaning and is used to decode into either specific
* 2.4GHz or 5GHz wireless mode for that particular
* regulatory domain.
*/
NO_ENUMRD = 0x00,
NULL1_WORLD = 0x03, /* For 11b-only countries (no 11a allowed) */
NULL1_ETSIB = 0x07, /* Israel */
NULL1_ETSIC = 0x08,
FCC1_FCCA = 0x10, /* USA */
FCC1_WORLD = 0x11, /* Hong Kong */
FCC4_FCCA = 0x12, /* USA - Public Safety */
FCC5_FCCA = 0x13, /* USA - with no DFS (UNII-1 + UNII-3 only) */
FCC6_FCCA = 0x14, /* Canada */
FCC2_FCCA = 0x20, /* Canada */
FCC2_WORLD = 0x21, /* Australia & HK */
FCC2_ETSIC = 0x22,
FCC6_WORLD = 0x23, /* Australia */
FRANCE_RES = 0x31, /* Legacy France for OEM */
FCC3_FCCA = 0x3A, /* USA & Canada w/5470 band, 11h, DFS enabled */
FCC3_WORLD = 0x3B, /* USA & Canada w/5470 band, 11h, DFS enabled */
ETSI1_WORLD = 0x37,
ETSI3_ETSIA = 0x32, /* France (optional) */
ETSI2_WORLD = 0x35, /* Hungary & others */
ETSI3_WORLD = 0x36, /* France & others */
ETSI4_WORLD = 0x30,
ETSI4_ETSIC = 0x38,
ETSI5_WORLD = 0x39,
ETSI6_WORLD = 0x34, /* Bulgaria */
ETSI_RESERVED = 0x33, /* Reserved (Do not used) */
MKK1_MKKA = 0x40, /* Japan (JP1) */
MKK1_MKKB = 0x41, /* Japan (JP0) */
APL4_WORLD = 0x42, /* Singapore */
MKK2_MKKA = 0x43, /* Japan with 4.9G channels */
APL_RESERVED = 0x44, /* Reserved (Do not used) */
APL2_WORLD = 0x45, /* Korea */
APL2_APLC = 0x46,
APL3_WORLD = 0x47,
MKK1_FCCA = 0x48, /* Japan (JP1-1) */
APL2_APLD = 0x49, /* Korea with 2.3G channels */
MKK1_MKKA1 = 0x4A, /* Japan (JE1) */
MKK1_MKKA2 = 0x4B, /* Japan (JE2) */
MKK1_MKKC = 0x4C, /* Japan (MKK1_MKKA,except Ch14) */
APL3_FCCA = 0x50,
APL1_WORLD = 0x52, /* Latin America */
APL1_FCCA = 0x53,
APL1_APLA = 0x54,
APL1_ETSIC = 0x55,
APL2_ETSIC = 0x56, /* Venezuela */
APL2_FCCA = 0x57, /* new Latin America */
APL5_WORLD = 0x58, /* Chile */
APL6_WORLD = 0x5B, /* Singapore */
APL7_FCCA = 0x5C, /* Taiwan 5.47 Band */
APL8_WORLD = 0x5D, /* Malaysia 5GHz */
APL9_WORLD = 0x5E, /* Korea 5GHz */
/*
* World mode SKUs
*/
WOR0_WORLD = 0x60, /* World0 (WO0 SKU) */
WOR1_WORLD = 0x61, /* World1 (WO1 SKU) */
WOR2_WORLD = 0x62, /* World2 (WO2 SKU) */
WOR3_WORLD = 0x63, /* World3 (WO3 SKU) */
WOR4_WORLD = 0x64, /* World4 (WO4 SKU) */
WOR5_ETSIC = 0x65, /* World5 (WO5 SKU) */
WOR01_WORLD = 0x66, /* World0-1 (WW0-1 SKU) */
WOR02_WORLD = 0x67, /* World0-2 (WW0-2 SKU) */
EU1_WORLD = 0x68, /* Same as World0-2 (WW0-2 SKU), except active scan ch1-13. No ch14 */
WOR9_WORLD = 0x69, /* World9 (WO9 SKU) */
WORA_WORLD = 0x6A, /* WorldA (WOA SKU) */
MKK3_MKKB = 0x80, /* Japan UNI-1 even + MKKB */
MKK3_MKKA2 = 0x81, /* Japan UNI-1 even + MKKA2 */
MKK3_MKKC = 0x82, /* Japan UNI-1 even + MKKC */
MKK4_MKKB = 0x83, /* Japan UNI-1 even + UNI-2 + MKKB */
MKK4_MKKA2 = 0x84, /* Japan UNI-1 even + UNI-2 + MKKA2 */
MKK4_MKKC = 0x85, /* Japan UNI-1 even + UNI-2 + MKKC */
MKK5_MKKB = 0x86, /* Japan UNI-1 even + UNI-2 + mid-band + MKKB */
MKK5_MKKA2 = 0x87, /* Japan UNI-1 even + UNI-2 + mid-band + MKKA2 */
MKK5_MKKC = 0x88, /* Japan UNI-1 even + UNI-2 + mid-band + MKKC */
MKK6_MKKB = 0x89, /* Japan UNI-1 even + UNI-1 odd MKKB */
MKK6_MKKA2 = 0x8A, /* Japan UNI-1 even + UNI-1 odd + MKKA2 */
MKK6_MKKC = 0x8B, /* Japan UNI-1 even + UNI-1 odd + MKKC */
MKK7_MKKB = 0x8C, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + MKKB */
MKK7_MKKA = 0x8D, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + MKKA2 */
MKK7_MKKC = 0x8E, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + MKKC */
MKK8_MKKB = 0x8F, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + MKKB */
MKK8_MKKA2 = 0x90, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + MKKA2 */
MKK8_MKKC = 0x91, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + mid-band + MKKC */
MKK6_MKKA1 = 0xF8, /* Japan UNI-1 even + UNI-1 odd + MKKA1 */
MKK6_FCCA = 0xF9, /* Japan UNI-1 even + UNI-1 odd + FCCA */
MKK7_MKKA1 = 0xFA, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + MKKA1 */
MKK7_FCCA = 0xFB, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + FCCA */
MKK9_FCCA = 0xFC, /* Japan UNI-1 even + 4.9GHz + FCCA */
MKK9_MKKA1 = 0xFD, /* Japan UNI-1 even + 4.9GHz + MKKA1 */
MKK9_MKKC = 0xFE, /* Japan UNI-1 even + 4.9GHz + MKKC */
MKK9_MKKA2 = 0xFF, /* Japan UNI-1 even + 4.9GHz + MKKA2 */
MKK10_FCCA = 0xD0, /* Japan UNI-1 even + UNI-2 + 4.9GHz + FCCA */
MKK10_MKKA1 = 0xD1, /* Japan UNI-1 even + UNI-2 + 4.9GHz + MKKA1 */
MKK10_MKKC = 0xD2, /* Japan UNI-1 even + UNI-2 + 4.9GHz + MKKC */
MKK10_MKKA2 = 0xD3, /* Japan UNI-1 even + UNI-2 + 4.9GHz + MKKA2 */
MKK11_MKKA = 0xD4, /* Japan UNI-1 even + UNI-2 + Midband + 4.9GHz + MKKA */
MKK11_FCCA = 0xD5, /* Japan UNI-1 even + UNI-2 + Midband + 4.9GHz + FCCA */
MKK11_MKKA1 = 0xD6, /* Japan UNI-1 even + UNI-2 + Midband + 4.9GHz + MKKA1 */
MKK11_MKKC = 0xD7, /* Japan UNI-1 even + UNI-2 + Midband + 4.9GHz + MKKC */
MKK11_MKKA2 = 0xD8, /* Japan UNI-1 even + UNI-2 + Midband + 4.9GHz + MKKA2 */
MKK12_MKKA = 0xD9, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + Midband + 4.9GHz + MKKA */
MKK12_FCCA = 0xDA, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + Midband + 4.9GHz + FCCA */
MKK12_MKKA1 = 0xDB, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + Midband + 4.9GHz + MKKA1 */
MKK12_MKKC = 0xDC, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + Midband + 4.9GHz + MKKC */
MKK12_MKKA2 = 0xDD, /* Japan UNI-1 even + UNI-1 odd + UNI-2 + Midband + 4.9GHz + MKKA2 */
/* Following definitions are used only by s/w to map old
* Japan SKUs.
*/
MKK3_MKKA = 0xF0, /* Japan UNI-1 even + MKKA */
MKK3_MKKA1 = 0xF1, /* Japan UNI-1 even + MKKA1 */
MKK3_FCCA = 0xF2, /* Japan UNI-1 even + FCCA */
MKK4_MKKA = 0xF3, /* Japan UNI-1 even + UNI-2 + MKKA */
MKK4_MKKA1 = 0xF4, /* Japan UNI-1 even + UNI-2 + MKKA1 */
MKK4_FCCA = 0xF5, /* Japan UNI-1 even + UNI-2 + FCCA */
MKK9_MKKA = 0xF6, /* Japan UNI-1 even + 4.9GHz + MKKA*/
MKK10_MKKA = 0xF7, /* Japan UNI-1 even + UNI-2 + 4.9GHz + MKKA */
/*
* Regulator domains ending in a number (e.g. APL1,
* MK1, ETSI4, etc) apply to 5GHz channel and power
* information. Regulator domains ending in a letter
* (e.g. APLA, FCCA, etc) apply to 2.4GHz channel and
* power information.
*/
APL1 = 0x0150, /* LAT & Asia */
APL2 = 0x0250, /* LAT & Asia */
APL3 = 0x0350, /* Taiwan */
APL4 = 0x0450, /* Jordan */
APL5 = 0x0550, /* Chile */
APL6 = 0x0650, /* Singapore */
APL7 = 0x0750, /* Taiwan Middle */
APL8 = 0x0850, /* Malaysia */
APL9 = 0x0950, /* Korea (South) ROC 3 */
ETSI1 = 0x0130, /* Europe & others */
ETSI2 = 0x0230, /* Europe & others */
ETSI3 = 0x0330, /* Europe & others */
ETSI4 = 0x0430, /* Europe & others */
ETSI5 = 0x0530, /* Europe & others */
ETSI6 = 0x0630, /* Europe & others */
ETSIA = 0x0A30, /* France */
ETSIB = 0x0B30, /* Israel */
ETSIC = 0x0C30, /* Latin America */
FCC1 = 0x0110, /* US & others */
FCC2 = 0x0120, /* Canada, Australia & New Zealand */
FCC3 = 0x0160, /* US w/new middle band & DFS */
FCC4 = 0x0165, /* US Public Safety */
FCC5 = 0x0510, /* US no DFS */
FCC6 = 0x0610, /* Canada & Australia */
FCCA = 0x0A10,
APLD = 0x0D50, /* South Korea */
MKK1 = 0x0140, /* Japan (UNI-1 odd)*/
MKK2 = 0x0240, /* Japan (4.9 GHz + UNI-1 odd) */
MKK3 = 0x0340, /* Japan (UNI-1 even) */
MKK4 = 0x0440, /* Japan (UNI-1 even + UNI-2) */
MKK5 = 0x0540, /* Japan (UNI-1 even + UNI-2 + mid-band) */
MKK6 = 0x0640, /* Japan (UNI-1 odd + UNI-1 even) */
MKK7 = 0x0740, /* Japan (UNI-1 odd + UNI-1 even + UNI-2 */
MKK8 = 0x0840, /* Japan (UNI-1 odd + UNI-1 even + UNI-2 + mid-band) */
MKK9 = 0x0940, /* Japan (UNI-1 even + 4.9 GHZ) */
MKK10 = 0x0B40, /* Japan (UNI-1 even + UNI-2 + 4.9 GHZ) */
MKK11 = 0x1140, /* Japan (UNI-1 even + UNI-2 + mid-band + 4.9 GHZ) */
MKK12 = 0x1240, /* Japan (UNI-1 even + UNI-1 odd + UNI-2 + mid-band + 4.9 GHZ) */
MKKA = 0x0A40, /* Japan */
MKKC = 0x0A50,
NULL1 = 0x0198,
WORLD = 0x0199,
DEBUG_REG_DMN = 0x01ff,
};
/* channelFlags */
#define ZM_REG_FLAG_CHANNEL_CW_INT 0x0002 /* CW interference detected on channel */
#define ZM_REG_FLAG_CHANNEL_TURBO 0x0010 /* Turbo Channel */
#define ZM_REG_FLAG_CHANNEL_CCK 0x0020 /* CCK channel */
#define ZM_REG_FLAG_CHANNEL_OFDM 0x0040 /* OFDM channel */
#define ZM_REG_FLAG_CHANNEL_2GHZ 0x0080 /* 2 GHz spectrum channel. */
#define ZM_REG_FLAG_CHANNEL_5GHZ 0x0100 /* 5 GHz spectrum channel */
#define ZM_REG_FLAG_CHANNEL_PASSIVE 0x0200 /* Only passive scan allowed in the channel */
#define ZM_REG_FLAG_CHANNEL_DYN 0x0400 /* dynamic CCK-OFDM channel */
#define ZM_REG_FLAG_CHANNEL_XR 0x0800 /* XR channel */
#define ZM_REG_FLAG_CHANNEL_CSA 0x1000 /* Channel by CSA(Channel Switch Announcement) */
#define ZM_REG_FLAG_CHANNEL_STURBO 0x2000 /* Static turbo, no 11a-only usage */
#define ZM_REG_FLAG_CHANNEL_HALF 0x4000 /* Half rate channel */
#define ZM_REG_FLAG_CHANNEL_QUARTER 0x8000 /* Quarter rate channel */
/* channelFlags */
#define CHANNEL_CW_INT 0x0002 /* CW interference detected on channel */
#define CHANNEL_TURBO 0x0010 /* Turbo Channel */
#define CHANNEL_CCK 0x0020 /* CCK channel */
#define CHANNEL_OFDM 0x0040 /* OFDM channel */
#define CHANNEL_2GHZ 0x0080 /* 2 GHz spectrum channel. */
#define CHANNEL_5GHZ 0x0100 /* 5 GHz spectrum channel */
#define CHANNEL_PASSIVE 0x0200 /* Only passive scan allowed in the channel */
#define CHANNEL_DYN 0x0400 /* dynamic CCK-OFDM channel */
#define CHANNEL_XR 0x0800 /* XR channel */
#define CHANNEL_STURBO 0x2000 /* Static turbo, no 11a-only usage */
#define CHANNEL_HALF 0x4000 /* Half rate channel */
#define CHANNEL_QUARTER 0x8000 /* Quarter rate channel */
#define CHANNEL_HT20 0x10000 /* HT20 channel */
#define CHANNEL_HT40 0x20000 /* HT40 channel */
#define CHANNEL_HT40U 0x40000 /* control channel can be upper channel */
#define CHANNEL_HT40L 0x80000 /* control channel can be lower channel */
/* privFlags */
#define ZM_REG_FLAG_CHANNEL_INTERFERENCE 0x01 /* Software use: channel interference
used for as AR as well as RADAR
interference detection */
#define ZM_REG_FLAG_CHANNEL_DFS 0x02 /* DFS required on channel */
#define ZM_REG_FLAG_CHANNEL_4MS_LIMIT 0x04 /* 4msec packet limit on this channel */
#define ZM_REG_FLAG_CHANNEL_DFS_CLEAR 0x08 /* if channel has been checked for DFS */
#define CHANNEL_A (CHANNEL_5GHZ|CHANNEL_OFDM)
#define CHANNEL_B (CHANNEL_2GHZ|CHANNEL_CCK)
#define CHANNEL_PUREG (CHANNEL_2GHZ|CHANNEL_OFDM)
#ifdef notdef
#define CHANNEL_G (CHANNEL_2GHZ|CHANNEL_DYN)
#else
#define CHANNEL_G (CHANNEL_2GHZ|CHANNEL_OFDM)
#endif
#define CHANNEL_T (CHANNEL_5GHZ|CHANNEL_OFDM|CHANNEL_TURBO)
#define CHANNEL_ST (CHANNEL_T|CHANNEL_STURBO)
#define CHANNEL_108G (CHANNEL_2GHZ|CHANNEL_OFDM|CHANNEL_TURBO)
#define CHANNEL_108A CHANNEL_T
#define CHANNEL_X (CHANNEL_5GHZ|CHANNEL_OFDM|CHANNEL_XR)
#define CHANNEL_G_HT (CHANNEL_2GHZ | CHANNEL_OFDM | CHANNEL_HT20)
#define CHANNEL_A_HT (CHANNEL_5GHZ | CHANNEL_OFDM | CHANNEL_HT20)
#define CHANNEL_G_HT20 (CHANNEL_2GHZ|CHANNEL_HT20)
#define CHANNEL_A_HT20 (CHANNEL_5GHZ|CHANNEL_HT20)
#define CHANNEL_G_HT40 (CHANNEL_2GHZ|CHANNEL_HT20|CHANNEL_HT40)
#define CHANNEL_A_HT40 (CHANNEL_5GHZ|CHANNEL_HT20|CHANNEL_HT40)
#define CHANNEL_ALL \
(CHANNEL_OFDM|CHANNEL_CCK| CHANNEL_2GHZ | CHANNEL_5GHZ | CHANNEL_TURBO | CHANNEL_HT20 | CHANNEL_HT40)
#define CHANNEL_ALL_NOTURBO (CHANNEL_ALL &~ CHANNEL_TURBO)
enum {
HAL_MODE_11A = 0x001, /* 11a channels */
HAL_MODE_TURBO = 0x002, /* 11a turbo-only channels */
HAL_MODE_11B = 0x004, /* 11b channels */
HAL_MODE_PUREG = 0x008, /* 11g channels (OFDM only) */
#ifdef notdef
HAL_MODE_11G = 0x010, /* 11g channels (OFDM/CCK) */
#else
HAL_MODE_11G = 0x008, /* XXX historical */
#endif
HAL_MODE_108G = 0x020, /* 11a+Turbo channels */
HAL_MODE_108A = 0x040, /* 11g+Turbo channels */
HAL_MODE_XR = 0x100, /* XR channels */
HAL_MODE_11A_HALF_RATE = 0x200, /* 11A half rate channels */
HAL_MODE_11A_QUARTER_RATE = 0x400, /* 11A quarter rate channels */
HAL_MODE_11NG = 0x4000, /* 11ng channels */
HAL_MODE_11NA = 0x8000, /* 11na channels */
HAL_MODE_ALL = 0xffff
};
#endif /* #ifndef _HPREG_H */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,437 @@
/*
* Copyright (c) 2000-2005 ZyDAS Technology Corporation
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* Module Name : ud_defs.h */
/* */
/* Abstract */
/* This module contains USB data structure definitions. */
/* */
/* NOTES */
/* None */
/* */
/************************************************************************/
#ifndef _HPUSB_H
#define _HPUSB_H
#define ZM_OTUS_ENABLE_RETRY_FREQ_CHANGE
#define ZM_BEACON_BUFFER_ADDRESS 0x117900
#define ZM_MAX_CMD_SIZE 64
#define ZM_HAL_MAX_EEPROM_REQ 510
#define ZM_HAL_MAX_EEPROM_PRQ 2
/* For USB STREAM mode */
#ifdef ZM_DISABLE_AMSDU8K_SUPPORT
#define ZM_MAX_USB_IN_TRANSFER_SIZE 4096
#else
#define ZM_MAX_USB_IN_TRANSFER_SIZE 8192
#endif
#define ZM_USB_STREAM_MODE_TAG_LEN 4
#define ZM_USB_STREAM_MODE_TAG 0x4e00
#define ZM_USB_MAX_EPINT_BUFFER 64
struct zsCmdQ
{
u16_t src;
u16_t cmdLen;
u8_t* buf;
u32_t cmd[ZM_MAX_CMD_SIZE/4];
};
struct zsCommand
{
u16_t delayWcmdCount;
u32_t delayWcmdAddr[(ZM_CMD_QUEUE_SIZE-4)/4];
u32_t delayWcmdVal[(ZM_CMD_QUEUE_SIZE-4)/4];
};
struct zsHalRxInfo
{
u32_t currentRSSI[7]; /* RSSI combined */
u32_t currentRxEVM[14];
u32_t currentRxDataMT;
u32_t currentRxDataMCS;
u32_t currentRxDataBW;
u32_t currentRxDataSG;
};
struct zsHpPriv
{
u16_t hwFrequency;
u8_t hwBw40;
u8_t hwExtOffset;
u8_t disableDfsCh;
u32_t halCapability;
/* Fortunately the second loop can be disabled with a bit */
/* called en_pd_dc_offset_thr */
u8_t hwNotFirstInit;
/* command queue */
u16_t cmdHead;
u16_t cmdTail;
#ifdef ZM_XP_USB_MULTCMD
u16_t cmdSend; // Used for Mult send USB cmd
#endif
struct zsCmdQ cmdQ[ZM_CMD_QUEUE_SIZE];
u16_t cmdPending;
struct zsCommand cmd; /* buffer for delayed commands */
u8_t ledMode[2];
u32_t ctlBusy;
u32_t extBusy;
/*
* ANI & Radar support.
*/
u32_t procPhyErr; /* Process Phy errs */
u8_t hasHwPhyCounters; /* Hardware has phy counters */
u32_t aniPeriod; /* ani update list period */
struct zsAniStats stats; /* various statistics */
struct zsAniState *curani; /* cached last reference */
struct zsAniState ani[50]; /* per-channel state */
/*
* Ani tables that change between the 5416 and 5312.
* These get set at attach time.
* XXX don't belong here
* XXX need better explanation
*/
s32_t totalSizeDesired[5];
s32_t coarseHigh[5];
s32_t coarseLow[5];
s32_t firpwr[5];
/*
* ANI related PHY register value.
*/
u32_t regPHYDesiredSZ;
u32_t regPHYFindSig;
u32_t regPHYAgcCtl1;
u32_t regPHYSfcorr;
u32_t regPHYSfcorrLow;
u32_t regPHYTiming5;
u32_t regPHYCckDetect;
u32_t eepromImage[1024];
u32_t eepromImageIndex;
u32_t eepromImageRdReq;
u8_t halReInit;
u8_t OpFlags;
u8_t tPow2xCck[4];
u8_t tPow2x2g[4];
u8_t tPow2x2g24HeavyClipOffset;
u8_t tPow2x2gHt20[8];
u8_t tPow2x2gHt40[8];
u8_t tPow2x5g[4];
u8_t tPow2x5gHt20[8];
u8_t tPow2x5gHt40[8];
/* hwBBHeavyClip : used compatibility */
/* 0 : dongle not support. */
/* !0: support heavy clip. */
u8_t hwBBHeavyClip;
u8_t enableBBHeavyClip; /* 0=>force disable 1=>enable */
u8_t doBBHeavyClip; /* set 1 if heavy clip need by each frequency switch */
u32_t setValueHeavyClip; /* save setting value for heavy clip when completed routine */
/*
* Rxdata RSSI, EVM, Rate etc...
*/
struct zsHalRxInfo halRxInfo;
u32_t usbSendBytes;
u32_t usbAcSendBytes[4];
u16_t aggMaxDurationBE;
u32_t aggPktNum;
u16_t txop[4];
u16_t cwmin[4];
u16_t cwmax[4];
u8_t strongRSSI;
u8_t rxStrongRSSI;
u8_t slotType; //0->20us, 1=>9us
#ifdef ZM_OTUS_RX_STREAM_MODE
u16_t usbRxRemainLen;
u16_t usbRxPktLen;
u16_t usbRxPadLen;
u16_t usbRxTransferLen;
zbuf_t *remainBuf;
#endif
u8_t dot11Mode;
u8_t ibssBcnEnabled;
u32_t ibssBcnInterval;
// For re-issue the frequency change command
u32_t latestFrequency;
u8_t latestBw40;
u8_t latestExtOffset;
u8_t freqRetryCounter;
u8_t recordFreqRetryCounter;
u8_t isSiteSurvey;
u8_t coldResetNeedFreq;
u64_t camRollCallTable;
u8_t currentAckRtsTpc;
/* #1 Save the initial value of the related RIFS register settings */
//u32_t isInitialPhy;
u32_t initDesiredSigSize;
u32_t initAGC;
u32_t initAgcControl;
u32_t initSearchStartDelay;
u32_t initRIFSSearchParams;
u32_t initFastChannelChangeControl;
/* Dynamic SIFS for retransmission event */
u8_t retransmissionEvent;
u8_t latestSIFS;
};
extern u32_t zfHpLoadEEPROMFromFW(zdev_t* dev);
typedef u8_t A_UINT8;
typedef s8_t A_INT8;
typedef u16_t A_UINT16;
typedef u32_t A_UINT32;
#define __ATTRIB_PACK
#pragma pack (push, 1)
#define AR5416_EEP_VER 0xE
#define AR5416_EEP_VER_MINOR_MASK 0xFFF
#define AR5416_EEP_NO_BACK_VER 0x1
#define AR5416_EEP_MINOR_VER_2 0x2 // Adds modal params txFrameToPaOn, txFrametoDataStart, ht40PowerInc
#define AR5416_EEP_MINOR_VER_3 0x3 // Adds modal params bswAtten, bswMargin, swSettle and base OpFlags for HT20/40 Disable
// 16-bit offset location start of calibration struct
#define AR5416_EEP_START_LOC 256
#define AR5416_NUM_5G_CAL_PIERS 8
#define AR5416_NUM_2G_CAL_PIERS 4
#define AR5416_NUM_5G_20_TARGET_POWERS 8
#define AR5416_NUM_5G_40_TARGET_POWERS 8
#define AR5416_NUM_2G_CCK_TARGET_POWERS 3
#define AR5416_NUM_2G_20_TARGET_POWERS 4
#define AR5416_NUM_2G_40_TARGET_POWERS 4
#define AR5416_NUM_CTLS 24
#define AR5416_NUM_BAND_EDGES 8
#define AR5416_NUM_PD_GAINS 4
#define AR5416_PD_GAINS_IN_MASK 4
#define AR5416_PD_GAIN_ICEPTS 5
#define AR5416_EEPROM_MODAL_SPURS 5
#define AR5416_MAX_RATE_POWER 63
#define AR5416_NUM_PDADC_VALUES 128
#define AR5416_NUM_RATES 16
#define AR5416_BCHAN_UNUSED 0xFF
#define AR5416_MAX_PWR_RANGE_IN_HALF_DB 64
#define AR5416_OPFLAGS_11A 0x01
#define AR5416_OPFLAGS_11G 0x02
#define AR5416_OPFLAGS_5G_HT40 0x04
#define AR5416_OPFLAGS_2G_HT40 0x08
#define AR5416_OPFLAGS_5G_HT20 0x10
#define AR5416_OPFLAGS_2G_HT20 0x20
#define AR5416_EEPMISC_BIG_ENDIAN 0x01
#define FREQ2FBIN(x,y) ((y) ? ((x) - 2300) : (((x) - 4800) / 5))
#define AR5416_MAX_CHAINS 2
#define AR5416_ANT_16S 25
#define AR5416_NUM_ANT_CHAIN_FIELDS 7
#define AR5416_NUM_ANT_COMMON_FIELDS 4
#define AR5416_SIZE_ANT_CHAIN_FIELD 3
#define AR5416_SIZE_ANT_COMMON_FIELD 4
#define AR5416_ANT_CHAIN_MASK 0x7
#define AR5416_ANT_COMMON_MASK 0xf
#define AR5416_CHAIN_0_IDX 0
#define AR5416_CHAIN_1_IDX 1
#define AR5416_CHAIN_2_IDX 2
/* Capabilities Enum */
typedef enum {
EEPCAP_COMPRESS_DIS = 0x0001,
EEPCAP_AES_DIS = 0x0002,
EEPCAP_FASTFRAME_DIS = 0x0004,
EEPCAP_BURST_DIS = 0x0008,
EEPCAP_MAXQCU_M = 0x01F0,
EEPCAP_MAXQCU_S = 4,
EEPCAP_HEAVY_CLIP_EN = 0x0200,
EEPCAP_KC_ENTRIES_M = 0xF000,
EEPCAP_KC_ENTRIES_S = 12,
} EEPROM_CAPABILITIES;
typedef enum Ar5416_Rates {
rate6mb, rate9mb, rate12mb, rate18mb,
rate24mb, rate36mb, rate48mb, rate54mb,
rate1l, rate2l, rate2s, rate5_5l,
rate5_5s, rate11l, rate11s, rateXr,
rateHt20_0, rateHt20_1, rateHt20_2, rateHt20_3,
rateHt20_4, rateHt20_5, rateHt20_6, rateHt20_7,
rateHt40_0, rateHt40_1, rateHt40_2, rateHt40_3,
rateHt40_4, rateHt40_5, rateHt40_6, rateHt40_7,
rateDupCck, rateDupOfdm, rateExtCck, rateExtOfdm,
Ar5416RateSize
} AR5416_RATES;
typedef struct eepFlags {
A_UINT8 opFlags;
A_UINT8 eepMisc;
} __ATTRIB_PACK EEP_FLAGS;
#define AR5416_CHECKSUM_LOCATION (AR5416_EEP_START_LOC + 1)
typedef struct BaseEepHeader {
A_UINT16 length;
A_UINT16 checksum;
A_UINT16 version;
EEP_FLAGS opCapFlags;
A_UINT16 regDmn[2];
A_UINT8 macAddr[6];
A_UINT8 rxMask;
A_UINT8 txMask;
A_UINT16 rfSilent;
A_UINT16 blueToothOptions;
A_UINT16 deviceCap;
A_UINT32 binBuildNumber;
A_UINT8 deviceType;
A_UINT8 futureBase[33];
} __ATTRIB_PACK BASE_EEP_HEADER; // 64 B
typedef struct spurChanStruct {
A_UINT16 spurChan;
A_UINT8 spurRangeLow;
A_UINT8 spurRangeHigh;
} __ATTRIB_PACK SPUR_CHAN;
typedef struct ModalEepHeader {
A_UINT32 antCtrlChain[AR5416_MAX_CHAINS]; // 12
A_UINT32 antCtrlCommon; // 4
A_INT8 antennaGainCh[AR5416_MAX_CHAINS]; // 3
A_UINT8 switchSettling; // 1
A_UINT8 txRxAttenCh[AR5416_MAX_CHAINS]; // 3
A_UINT8 rxTxMarginCh[AR5416_MAX_CHAINS]; // 3
A_INT8 adcDesiredSize; // 1
A_INT8 pgaDesiredSize; // 1
A_UINT8 xlnaGainCh[AR5416_MAX_CHAINS]; // 3
A_UINT8 txEndToXpaOff; // 1
A_UINT8 txEndToRxOn; // 1
A_UINT8 txFrameToXpaOn; // 1
A_UINT8 thresh62; // 1
A_INT8 noiseFloorThreshCh[AR5416_MAX_CHAINS]; // 3
A_UINT8 xpdGain; // 1
A_UINT8 xpd; // 1
A_INT8 iqCalICh[AR5416_MAX_CHAINS]; // 1
A_INT8 iqCalQCh[AR5416_MAX_CHAINS]; // 1
A_UINT8 pdGainOverlap; // 1
A_UINT8 ob; // 1
A_UINT8 db; // 1
A_UINT8 xpaBiasLvl; // 1
A_UINT8 pwrDecreaseFor2Chain; // 1
A_UINT8 pwrDecreaseFor3Chain; // 1 -> 48 B
A_UINT8 txFrameToDataStart; // 1
A_UINT8 txFrameToPaOn; // 1
A_UINT8 ht40PowerIncForPdadc; // 1
A_UINT8 bswAtten[AR5416_MAX_CHAINS]; // 3
A_UINT8 bswMargin[AR5416_MAX_CHAINS]; // 3
A_UINT8 swSettleHt40; // 1
A_UINT8 futureModal[22]; //
SPUR_CHAN spurChans[AR5416_EEPROM_MODAL_SPURS]; // 20 B
} __ATTRIB_PACK MODAL_EEP_HEADER; // == 100 B
typedef struct calDataPerFreq {
A_UINT8 pwrPdg[AR5416_NUM_PD_GAINS][AR5416_PD_GAIN_ICEPTS];
A_UINT8 vpdPdg[AR5416_NUM_PD_GAINS][AR5416_PD_GAIN_ICEPTS];
} __ATTRIB_PACK CAL_DATA_PER_FREQ;
typedef struct CalTargetPowerLegacy {
A_UINT8 bChannel;
A_UINT8 tPow2x[4];
} __ATTRIB_PACK CAL_TARGET_POWER_LEG;
typedef struct CalTargetPowerHt {
A_UINT8 bChannel;
A_UINT8 tPow2x[8];
} __ATTRIB_PACK CAL_TARGET_POWER_HT;
#if defined(ARCH_BIG_ENDIAN) || defined(BIG_ENDIAN)
typedef struct CalCtlEdges {
A_UINT8 bChannel;
A_UINT8 flag :2,
tPower :6;
} __ATTRIB_PACK CAL_CTL_EDGES;
#else
typedef struct CalCtlEdges {
A_UINT8 bChannel;
A_UINT8 tPower :6,
flag :2;
} __ATTRIB_PACK CAL_CTL_EDGES;
#endif
typedef struct CalCtlData {
CAL_CTL_EDGES ctlEdges[AR5416_MAX_CHAINS][AR5416_NUM_BAND_EDGES];
} __ATTRIB_PACK CAL_CTL_DATA;
typedef struct ar5416Eeprom {
BASE_EEP_HEADER baseEepHeader; // 64 B
A_UINT8 custData[64]; // 64 B
MODAL_EEP_HEADER modalHeader[2]; // 200 B
A_UINT8 calFreqPier5G[AR5416_NUM_5G_CAL_PIERS];
A_UINT8 calFreqPier2G[AR5416_NUM_2G_CAL_PIERS];
CAL_DATA_PER_FREQ calPierData5G[AR5416_MAX_CHAINS][AR5416_NUM_5G_CAL_PIERS];
CAL_DATA_PER_FREQ calPierData2G[AR5416_MAX_CHAINS][AR5416_NUM_2G_CAL_PIERS];
CAL_TARGET_POWER_LEG calTargetPower5G[AR5416_NUM_5G_20_TARGET_POWERS];
CAL_TARGET_POWER_HT calTargetPower5GHT20[AR5416_NUM_5G_20_TARGET_POWERS];
CAL_TARGET_POWER_HT calTargetPower5GHT40[AR5416_NUM_5G_40_TARGET_POWERS];
CAL_TARGET_POWER_LEG calTargetPowerCck[AR5416_NUM_2G_CCK_TARGET_POWERS];
CAL_TARGET_POWER_LEG calTargetPower2G[AR5416_NUM_2G_20_TARGET_POWERS];
CAL_TARGET_POWER_HT calTargetPower2GHT20[AR5416_NUM_2G_20_TARGET_POWERS];
CAL_TARGET_POWER_HT calTargetPower2GHT40[AR5416_NUM_2G_40_TARGET_POWERS];
A_UINT8 ctlIndex[AR5416_NUM_CTLS];
CAL_CTL_DATA ctlData[AR5416_NUM_CTLS];
A_UINT8 padding;
} __ATTRIB_PACK AR5416_EEPROM;
#pragma pack (pop)
typedef enum ConformanceTestLimits {
FCC = 0x10,
MKK = 0x40,
ETSI = 0x30,
SD_NO_CTL = 0xE0,
NO_CTL = 0xFF,
CTL_MODE_M = 0xF,
CTL_11A = 0,
CTL_11B = 1,
CTL_11G = 2,
CTL_TURBO = 3,
CTL_108G = 4,
CTL_2GHT20 = 5,
CTL_5GHT20 = 6,
CTL_2GHT40 = 7,
CTL_5GHT40 = 8,
} ATH_CTLS;
#endif /* #ifndef _HPUSB_H */

View File

@ -0,0 +1,414 @@
/* 8602 : update mismatch register between NDIS and ART */
static const u32_t ar5416Modes[][6] = {
/* Register A-20 A-20/40 G-20/40 G-20 G-Turbo */
{0x9800, 0x00000007, 0x00000007, 0x00000007, 0x00000007, 0},
{0x9804, 0x00000300, 0x000003c4, 0x000003c4, 0x00000300, 0},
{0x9808, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x980c, 0xad848e19, 0xad848e19, 0xad848e19, 0xad848e19, 0},
{0x9810, 0x7d14e000, 0x7d14e000, 0x7d14e000, 0x7d14e000, 0},
{0x9814, 0x9c0a9f6b, 0x9c0a9f6b, 0x9c0a9f6b, 0x9c0a9f6b, 0},
{0x9818, 0x00000090, 0x00000090, 0x00000090, 0x00000090, 0},
{0x981c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9820, 0x02020200, 0x02020200, 0x02020200, 0x02020200, 0},
{0x9824, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0},
{0x9828, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001, 0},
{0x982c, 0x0000a000, 0x0000a000, 0x0000a000, 0x0000a000, 0},
{0x9830, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9834, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0},
{0x9838, 0x00000007, 0x00000007, 0x00000007, 0x00000007, 0},
{0x983c, 0x00200400, 0x00200400, 0x00200400, 0x00200400, 0},
{0x9840, 0x206a002e, 0x206a002e, 0x206a002e, 0x206a002e, 0},
{0x9844, 0x1372161e, 0x13721c1e, 0x13721c24, 0x137216a4, 0},
{0x9848, 0x001a6a65, 0x001a6a65, 0x00197a68, 0x00197a68, 0},
{0x984c, 0x1284233c, 0x1284233c, 0x1284233c, 0x1284233c, 0},
{0x9850, 0x6c48b4e4, 0x6c48b4e4, 0x6c48b0e4, 0x6c48b0e4, 0},
{0x9854, 0x00000859, 0x00000859, 0x00000859, 0x00000859, 0},
{0x9858, 0x7ec80d2e, 0x7ec80d2e, 0x7ec80d2e, 0x7ec80d2e, 0},
{0x985c, 0x31395c5e, 0x31395c5e, 0x31395c5e, 0x31395c5e, 0},
{0x9860, 0x0004dd10, 0x0004dd10, 0x0004dd20, 0x0004dd20, 0},
{0x9868, 0x409a4190, 0x409a4190, 0x409a4190, 0x409a4190, 0},
{0x986c, 0x050cb081, 0x050cb081, 0x050cb081, 0x050cb081, 0},
{0x9900, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9904, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9908, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x990c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9914, 0x000007d0, 0x000007d0, 0x00000898, 0x00000898, 0},
{0x9918, 0x00000118, 0x00000230, 0x00000268, 0x00000134, 0},
{0x991c, 0x10000fff, 0x10000fff, 0x10000fff, 0x10000fff, 0},
{0x9920, 0x0510081c, 0x0510081c, 0x0510001c, 0x0510001c, 0},
{0x9924, 0xd0058a15, 0xd0058a15, 0xd0058a15, 0xd0058a15, 0},
{0x9928, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0},
{0x992c, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0},
{0x9934, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0},
{0x9938, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0},
{0x993c, 0x0000007f, 0x0000007f, 0x0000007f, 0x0000007f, 0},
{0x9944, 0xdfb81020, 0xdfb81020, 0xdfb81020, 0xdfb81020, 0},
{0x9948, 0x9280b212, 0x9280b212, 0x9280b212, 0x9280b212, 0},
{0x994c, 0x00020028, 0x00020028, 0x00020028, 0x00020028, 0},
{0x9954, 0x5d50e188, 0x5d50e188, 0x5d50e188, 0x5d50e188, 0},
{0x9958, 0x00081fff, 0x00081fff, 0x00081fff, 0x00081fff, 0},
{0x9960, 0x00009b40, 0x00009b40, 0x00009b40, 0x00009b40, 0},
{0x9964, 0x00001120, 0x00001120, 0x00001120, 0x00001120, 0},
{0x9970, 0x190fb515, 0x190fb515, 0x190fb515, 0x190fb515, 0},
{0x9974, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9978, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0},
{0x997c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9980, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9984, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9988, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x998c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9990, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9994, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9998, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x999c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x99a0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x99a4, 0x00000007, 0x00000007, 0x00000007, 0x00000007, 0},
{0x99a8, 0x001fff00, 0x001fff00, 0x001fff00, 0x001fff00, 0},
{0x99ac, 0x006f00c4, 0x006f00c4, 0x006f00c4, 0x006f00c4, 0},
{0x99b0, 0x03051000, 0x03051000, 0x03051000, 0x03051000, 0},
{0x99b4, 0x00000820, 0x00000820, 0x00000820, 0x00000820, 0},
{0x99c0, 0x038919be, 0x038919be, 0x038919be, 0x038919be, 0},
{0x99c4, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77, 0},
{0x99c8, 0x60f6532c, 0x60f6532c, 0x60f6532c, 0x60f6532c, 0},
{0x99cc, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0},
{0x99d0, 0x00046384, 0x00046384, 0x00046384, 0x00046384, 0},
{0x99d4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x99d8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x99dc, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x99e0, 0x00000200, 0x00000200, 0x00000200, 0x00000200, 0},
{0x99e4, 0x64646464, 0x64646464, 0x64646464, 0x64646464, 0},
{0x99e8, 0x3c787878, 0x3c787878, 0x3c787878, 0x3c787878, 0},
{0x99ec, 0x000000aa, 0x000000aa, 0x000000aa, 0x000000aa, 0},
{0x99f0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x99fc, 0x00001042, 0x00001042, 0x00001042, 0x00001042, 0},
{0x9a00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9a04, 0x00000040, 0x00000040, 0x00000040, 0x00000040, 0},
{0x9a08, 0x00000080, 0x00000080, 0x00000080, 0x00000080, 0},
{0x9a0c, 0x000001a1, 0x000001a1, 0x00000141, 0x00000141, 0},
{0x9a10, 0x000001e1, 0x000001e1, 0x00000181, 0x00000181, 0},
{0x9a14, 0x00000021, 0x00000021, 0x000001c1, 0x000001c1, 0},
{0x9a18, 0x00000061, 0x00000061, 0x00000001, 0x00000001, 0},
{0x9a1c, 0x00000168, 0x00000168, 0x00000041, 0x00000041, 0},
{0x9a20, 0x000001a8, 0x000001a8, 0x000001a8, 0x000001a8, 0},
{0x9a24, 0x000001e8, 0x000001e8, 0x000001e8, 0x000001e8, 0},
{0x9a28, 0x00000028, 0x00000028, 0x00000028, 0x00000028, 0},
{0x9a2c, 0x00000068, 0x00000068, 0x00000068, 0x00000068, 0},
{0x9a30, 0x00000189, 0x00000189, 0x000000a8, 0x000000a8, 0},
{0x9a34, 0x000001c9, 0x000001c9, 0x00000169, 0x00000169, 0},
{0x9a38, 0x00000009, 0x00000009, 0x000001a9, 0x000001a9, 0},
{0x9a3c, 0x00000049, 0x00000049, 0x000001e9, 0x000001e9, 0},
{0x9a40, 0x00000089, 0x00000089, 0x00000029, 0x00000029, 0},
{0x9a44, 0x00000170, 0x00000170, 0x00000069, 0x00000069, 0},
{0x9a48, 0x000001b0, 0x000001b0, 0x00000190, 0x00000190, 0},
{0x9a4c, 0x000001f0, 0x000001f0, 0x000001d0, 0x000001d0, 0},
{0x9a50, 0x00000030, 0x00000030, 0x00000010, 0x00000010, 0},
{0x9a54, 0x00000070, 0x00000070, 0x00000050, 0x00000050, 0},
{0x9a58, 0x00000191, 0x00000191, 0x00000090, 0x00000090, 0},
{0x9a5c, 0x000001d1, 0x000001d1, 0x00000151, 0x00000151, 0},
{0x9a60, 0x00000011, 0x00000011, 0x00000191, 0x00000191, 0},
{0x9a64, 0x00000051, 0x00000051, 0x000001d1, 0x000001d1, 0},
{0x9a68, 0x00000091, 0x00000091, 0x00000011, 0x00000011, 0},
{0x9a6c, 0x000001b8, 0x000001b8, 0x00000051, 0x00000051, 0},
{0x9a70, 0x000001f8, 0x000001f8, 0x00000198, 0x00000198, 0},
{0x9a74, 0x00000038, 0x00000038, 0x000001d8, 0x000001d8, 0},
{0x9a78, 0x00000078, 0x00000078, 0x00000018, 0x00000018, 0},
{0x9a7c, 0x00000199, 0x00000199, 0x00000058, 0x00000058, 0},
{0x9a80, 0x000001d9, 0x000001d9, 0x00000098, 0x00000098, 0},
{0x9a84, 0x00000019, 0x00000019, 0x00000159, 0x00000159, 0},
{0x9a88, 0x00000059, 0x00000059, 0x00000199, 0x00000199, 0},
{0x9a8c, 0x00000099, 0x00000099, 0x000001d9, 0x000001d9, 0},
{0x9a90, 0x000000d9, 0x000000d9, 0x00000019, 0x00000019, 0},
{0x9a94, 0x000000f9, 0x000000f9, 0x00000059, 0x00000059, 0},
{0x9a98, 0x000000f9, 0x000000f9, 0x00000099, 0x00000099, 0},
{0x9a9c, 0x000000f9, 0x000000f9, 0x000000d9, 0x000000d9, 0},
{0x9aa0, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9aa4, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9aa8, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9aac, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9ab0, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9ab4, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9ab8, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9abc, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9ac0, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9ac4, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9ac8, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9acc, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9ad0, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9ad4, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9ad8, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9adc, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9ae0, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9ae4, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9ae8, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9aec, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9af0, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9af4, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9af8, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9afc, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0},
{0x9b00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9b04, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0},
{0x9b08, 0x00000002, 0x00000002, 0x00000002, 0x00000002, 0},
{0x9b0c, 0x00000003, 0x00000003, 0x00000003, 0x00000003, 0},
{0x9b10, 0x00000004, 0x00000004, 0x00000004, 0x00000004, 0},
{0x9b14, 0x00000005, 0x00000005, 0x00000005, 0x00000005, 0},
{0x9b18, 0x00000008, 0x00000008, 0x00000008, 0x00000008, 0},
{0x9b1c, 0x00000009, 0x00000009, 0x00000009, 0x00000009, 0},
{0x9b20, 0x0000000a, 0x0000000a, 0x0000000a, 0x0000000a, 0},
{0x9b24, 0x0000000b, 0x0000000b, 0x0000000b, 0x0000000b, 0},
{0x9b28, 0x0000000c, 0x0000000c, 0x0000000c, 0x0000000c, 0},
{0x9b2c, 0x0000000d, 0x0000000d, 0x0000000d, 0x0000000d, 0},
{0x9b30, 0x00000010, 0x00000010, 0x00000010, 0x00000010, 0},
{0x9b34, 0x00000011, 0x00000011, 0x00000011, 0x00000011, 0},
{0x9b38, 0x00000012, 0x00000012, 0x00000012, 0x00000012, 0},
{0x9b3c, 0x00000013, 0x00000013, 0x00000013, 0x00000013, 0},
{0x9b40, 0x00000014, 0x00000014, 0x00000014, 0x00000014, 0},
{0x9b44, 0x00000015, 0x00000015, 0x00000015, 0x00000015, 0},
{0x9b48, 0x00000018, 0x00000018, 0x00000018, 0x00000018, 0},
{0x9b4c, 0x00000019, 0x00000019, 0x00000019, 0x00000019, 0},
{0x9b50, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a, 0},
{0x9b54, 0x0000001b, 0x0000001b, 0x0000001b, 0x0000001b, 0},
{0x9b58, 0x0000001c, 0x0000001c, 0x0000001c, 0x0000001c, 0},
{0x9b5c, 0x0000001d, 0x0000001d, 0x0000001d, 0x0000001d, 0},
{0x9b60, 0x00000020, 0x00000020, 0x00000020, 0x00000020, 0},
{0x9b64, 0x00000021, 0x00000021, 0x00000021, 0x00000021, 0},
{0x9b68, 0x00000022, 0x00000022, 0x00000022, 0x00000022, 0},
{0x9b6c, 0x00000023, 0x00000023, 0x00000023, 0x00000023, 0},
{0x9b70, 0x00000024, 0x00000024, 0x00000024, 0x00000024, 0},
{0x9b74, 0x00000025, 0x00000025, 0x00000025, 0x00000025, 0},
{0x9b78, 0x00000028, 0x00000028, 0x00000028, 0x00000028, 0},
{0x9b7c, 0x00000029, 0x00000029, 0x00000029, 0x00000029, 0},
{0x9b80, 0x0000002a, 0x0000002a, 0x0000002a, 0x0000002a, 0},
{0x9b84, 0x0000002b, 0x0000002b, 0x0000002b, 0x0000002b, 0},
{0x9b88, 0x0000002c, 0x0000002c, 0x0000002c, 0x0000002c, 0},
{0x9b8c, 0x0000002d, 0x0000002d, 0x0000002d, 0x0000002d, 0},
{0x9b90, 0x00000030, 0x00000030, 0x00000030, 0x00000030, 0},
{0x9b94, 0x00000031, 0x00000031, 0x00000031, 0x00000031, 0},
{0x9b98, 0x00000032, 0x00000032, 0x00000032, 0x00000032, 0},
{0x9b9c, 0x00000033, 0x00000033, 0x00000033, 0x00000033, 0},
{0x9ba0, 0x00000034, 0x00000034, 0x00000034, 0x00000034, 0},
{0x9ba4, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
{0x9ba8, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
{0x9bac, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
{0x9bb0, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
{0x9bb4, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
{0x9bb8, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
{0x9bbc, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
{0x9bc0, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
{0x9bc4, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
{0x9bc8, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
{0x9bcc, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
{0x9bd0, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
{0x9bd4, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
{0x9bd8, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
{0x9bdc, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
{0x9be0, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
{0x9be4, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
{0x9be8, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
{0x9bec, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
{0x9bf0, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
{0x9bf4, 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0},
{0x9bf8, 0x00000010, 0x00000010, 0x00000010, 0x00000010, 0},
{0x9bfc, 0x0000001a, 0x0000001a, 0x0000001a, 0x0000001a, 0},
{0x9c00, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9c0c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9c10, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9c14, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9c18, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9c1c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9c20, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9c24, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9c28, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9c2c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9c30, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9c34, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9c38, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9c3c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9cf0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9cf4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9cf8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0x9cfc, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa200, 0x00000008, 0x00000008, 0x0000000e, 0x0000000e, 0},
{0xa204, 0x00000440, 0x00000440, 0x00000440, 0x00000440, 0},
{0xa208, 0xd6be4788, 0xd6be4788, 0xd03e4788, 0xd03e4788, 0},
{0xa20c, 0x012e8160, 0x012e8160, 0x012a8160, 0x012a8160, 0},
{0xa210, 0x40806333, 0x40806333, 0x40806333, 0x40806333, 0},
{0xa214, 0x00106c10, 0x00106c10, 0x00106c10, 0x00106c10, 0},
{0xa218, 0x009c4060, 0x009c4060, 0x009c4060, 0x009c4060, 0},
{0xa21c, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a, 0},
{0xa220, 0x018830c6, 0x018830c6, 0x018830c6, 0x018830c6, 0},
{0xa224, 0x00000400, 0x00000400, 0x00000400, 0x00000400, 0},
{0xa228, 0x000009b5, 0x000009b5, 0x000009b5, 0x000009b5, 0},
{0xa22c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa230, 0x00000108, 0x00000210, 0x00000210, 0x00000108, 0},
{0xa234, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0},
{0xa238, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0},
{0xa23c, 0x13c889af, 0x13c889af, 0x13c889af, 0x13c889af, 0},
{0xa240, 0x38490a20, 0x38490a20, 0x38490a20, 0x38490a20, 0},
{0xa244, 0x00007bb6, 0x00007bb6, 0x00007bb6, 0x00007bb6, 0},
{0xa248, 0x0fff3ffc, 0x0fff3ffc, 0x0fff3ffc, 0x0fff3ffc, 0},
{0xa24c, 0x00000001, 0x00000001, 0x00000001, 0x00000001, 0},
{0xa250, 0x0000a000, 0x0000a000, 0x0000a000, 0x0000a000, 0},
{0xa254, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa258, 0x0cc75380, 0x0cc75380, 0x0cc75380, 0x0cc75380, 0},
{0xa25c, 0x0f0f0f01, 0x0f0f0f01, 0x0f0f0f01, 0x0f0f0f01, 0},
{0xa260, 0xdfa91f01, 0xdfa91f01, 0xdfa91f01, 0xdfa91f01, 0},
{0xa264, 0x00418a11, 0x00418a11, 0x00418a11, 0x00418a11, 0},
{0xa268, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa26c, 0x09249126, 0x09249126, 0x09249126, 0x09249126, 0},
{0xa274, 0x0a1a9caa, 0x0a1a9caa, 0x0a1a7caa, 0x0a1a7caa, 0},
{0xa278, 0x1ce739ce, 0x1ce739ce, 0x1ce739ce, 0x1ce739ce, 0},
{0xa27c, 0x051701ce, 0x051701ce, 0x051701ce, 0x051701ce, 0},
{0xa300, 0x18010000, 0x18010000, 0x18010000, 0x18010000, 0},
{0xa304, 0x30032602, 0x30032602, 0x2e032402, 0x2e032402, 0},
{0xa308, 0x48073e06, 0x48073e06, 0x4a0a3c06, 0x4a0a3c06, 0},
{0xa30c, 0x560b4c0a, 0x560b4c0a, 0x621a540b, 0x621a540b, 0},
{0xa310, 0x641a600f, 0x641a600f, 0x764f6c1b, 0x764f6c1b, 0},
{0xa314, 0x7a4f6e1b, 0x7a4f6e1b, 0x845b7a5a, 0x845b7a5a, 0},
{0xa318, 0x8c5b7e5a, 0x8c5b7e5a, 0x950f8ccf, 0x950f8ccf, 0},
{0xa31c, 0x9d0f96cf, 0x9d0f96cf, 0xa5cf9b4f, 0xa5cf9b4f, 0},
{0xa320, 0xb51fa69f, 0xb51fa69f, 0xbddfaf1f, 0xbddfaf1f, 0},
{0xa324, 0xcb3fbd07, 0xcb3fbcbf, 0xd1ffc93f, 0xd1ffc93f, 0},
{0xa328, 0x0000d7bf, 0x0000d7bf, 0x00000000, 0x00000000, 0},
{0xa32c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa330, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa334, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa338, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa33c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa340, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa344, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa348, 0x3fffffff, 0x3fffffff, 0x3fffffff, 0x3fffffff, 0},
{0xa34c, 0x3fffffff, 0x3fffffff, 0x3fffffff, 0x3fffffff, 0},
{0xa350, 0x3fffffff, 0x3fffffff, 0x3fffffff, 0x3fffffff, 0},
{0xa354, 0x0003ffff, 0x0003ffff, 0x0003ffff, 0x0003ffff, 0},
{0xa358, 0x79a8aa1f, 0x79a8aa1f, 0x79a8aa1f, 0x79a8aa1f, 0},
{0xa388, 0x08000000, 0x08000000, 0x08000000, 0x08000000, 0},
{0xa38c, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0},
{0xa390, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0},
{0xa394, 0x1ce739ce, 0x1ce739ce, 0x1ce739ce, 0x1ce739ce, 0},
{0xa398, 0x000001ce, 0x000001ce, 0x000001ce, 0x000001ce, 0},
{0xa39c, 0x00000007, 0x00000007, 0x00000007, 0x00000007, 0},
{0xa3a0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa3a4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa3a8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa3ac, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa3b0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa3b4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa3b8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa3bc, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa3c0, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa3c4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa3c8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa3cc, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0},
{0xa3d0, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0},
{0xa3d4, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f, 0},
{0xa3d8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0},
{0xa3dc, 0x1ce739ce, 0x1ce739ce, 0x1ce739ce, 0x1ce739ce, 0},
{0xa3e0, 0x000000c0, 0x000000c0, 0x000000c0, 0x000000c0, 0},
{0xa848, 0x00180a65, 0x00180a65, 0x00180a68, 0x00180a68, 0},
{0xa920, 0x0510001c, 0x0510001c, 0x0510001c, 0x0510001c, 0},
{0xa960, 0x00009b40, 0x00009b40, 0x00009b40, 0x00009b40, 0},
{0xb20c, 0x012e8160, 0x012e8160, 0x012a8160, 0x012a8160, 0},
{0xb26c, 0x09249126, 0x09249126, 0x09249126, 0x09249126, 0},
{0xb848, 0x00180a65, 0x00180a65, 0x00180a68, 0x00180a68, 0},
{0xb920, 0x0510001c, 0x0510001c, 0x0510001c, 0x0510001c, 0},
{0xb960, 0x00009b40, 0x00009b40, 0x00009b40, 0x00009b40, 0},
{0xc20c, 0x012e8160, 0x012e8160, 0x012a8160, 0x012a8160, 0},
{0xc26c, 0x09249126, 0x09249126, 0x09249126, 0x09249126, 0},
//{0xc864, 0x0001ce00, 0x0001ce00, 0x0001ce00, 0x0001ce00, 0},
{0xc864, 0x0001c600, 0x0001c600, 0x0001c600, 0x0001c600, 0},
{0xc95c, 0x004b6a8e, 0x004b6a8e, 0x004b6a8e, 0x004b6a8e, 0},
{0xc968, 0x000003ce, 0x000003ce, 0x000003ce, 0x000003ce, 0},
{0xc9bc, 0x00181400, 0x00181400, 0x00181400, 0x00181400, 0},
{0xd270, 0x00820820, 0x00820820, 0x00820820, 0x00820820, 0},
{0xd35c, 0x066c420f, 0x066c420f, 0x066c420f, 0x066c420f, 0},
{0xd360, 0x0f282207, 0x0f282207, 0x0f282207, 0x0f282207, 0},
{0xd364, 0x17601685, 0x17601685, 0x17601685, 0x17601685, 0},
{0xd368, 0x1f801104, 0x1f801104, 0x1f801104, 0x1f801104, 0},
{0xd36c, 0x37a00c03, 0x37a00c03, 0x37a00c03, 0x37a00c03, 0},
{0xd370, 0x3fc40883, 0x3fc40883, 0x3fc40883, 0x3fc40883, 0},
{0xd374, 0x57c00803, 0x57c00803, 0x57c00803, 0x57c00803, 0},
{0xd378, 0x5fd80682, 0x5fd80682, 0x5fd80682, 0x5fd80682, 0},
{0xd37c, 0x7fe00482, 0x7fe00482, 0x7fe00482, 0x7fe00482, 0},
{0xd380, 0x7f3c7bba, 0x7f3c7bba, 0x7f3c7bba, 0x7f3c7bba, 0},
{0xd384, 0xf3307ff0, 0xf3307ff0, 0xf3307ff0, 0xf3307ff0, 0}
};
static const u32_t otusBank[][3] = {
//# bank 0
{0x98b0, 0x1e5795e5, 0x1e5795e5},
{0x98e0, 0x02008020, 0x02008020},
//# bank 1
{0x98b0, 0x02108421, 0x02108421},
{0x98ec, 0x00000008, 0x00000008},
//# bank 2
{0x98b0, 0x0e73ff17, 0x0e73ff17},
{0x98e0, 0x00000420, 0x00000420},
//# bank 3
{0x98f0, 0x01400018, 0x01c00018},
//# bank 4
{0x98b0, 0x000001a1, 0x000001a1},
{0x98e8, 0x00000001, 0x00000001},
//# bank 5
{0x98b0, 0x00000013, 0x00000013},
{0x98e4, 0x00000002, 0x00000002},
//# bank 6
{0x98b0, 0x00000000, 0x00000000},
{0x98b0, 0x00000000, 0x00000000},
{0x98b0, 0x00000000, 0x00000000},
{0x98b0, 0x00000000, 0x00000000},
{0x98b0, 0x00000000, 0x00000000},
{0x98b0, 0x00004000, 0x00004000},
{0x98b0, 0x00006c00, 0x00006c00},
{0x98b0, 0x00002c00, 0x00002c00},
{0x98b0, 0x00004800, 0x00004800},
{0x98b0, 0x00004000, 0x00004000},
{0x98b0, 0x00006000, 0x00006000},
{0x98b0, 0x00001000, 0x00001000},
{0x98b0, 0x00004000, 0x00004000},
{0x98b0, 0x00007c00, 0x00007c00},
{0x98b0, 0x00007c00, 0x00007c00},
{0x98b0, 0x00007c00, 0x00007c00},
{0x98b0, 0x00007c00, 0x00007c00},
{0x98b0, 0x00007c00, 0x00007c00},
{0x98b0, 0x00087c00, 0x00087c00},
{0x98b0, 0x00007c00, 0x00007c00},
{0x98b0, 0x00005400, 0x00005400},
{0x98b0, 0x00000c00, 0x00000c00},
{0x98b0, 0x00001800, 0x00001800},
{0x98b0, 0x00007c00, 0x00007c00},
{0x98b0, 0x00006c00, 0x00006c00},
{0x98b0, 0x00006c00, 0x00006c00},
{0x98b0, 0x00007c00, 0x00007c00},
{0x98b0, 0x00002c00, 0x00002c00},
{0x98b0, 0x00003c00, 0x00003c00},
{0x98b0, 0x00003800, 0x00003800},
{0x98b0, 0x00001c00, 0x00001c00},
{0x98b0, 0x00000800, 0x00000800},
{0x98b0, 0x00000408, 0x00000408},
{0x98b0, 0x00004c15, 0x00004c15},
{0x98b0, 0x00004188, 0x00004188},
{0x98b0, 0x0000201e, 0x0000201e},
{0x98b0, 0x00010408, 0x00010408},
{0x98b0, 0x00000801, 0x00000801},
{0x98b0, 0x00000c08, 0x00000c08},
{0x98b0, 0x0000181e, 0x0000181e},
{0x98b0, 0x00001016, 0x00001016},
{0x98b0, 0x00002800, 0x00002800},
{0x98b0, 0x00004010, 0x00004010},
{0x98b0, 0x0000081c, 0x0000081c},
{0x98b0, 0x00000115, 0x00000115},
{0x98b0, 0x00000015, 0x00000015},
{0x98b0, 0x00000066, 0x00000066},
{0x98b0, 0x0000001c, 0x0000001c},
{0x98b0, 0x00000000, 0x00000000},
{0x98b0, 0x00000004, 0x00000004},
{0x98b0, 0x00000015, 0x00000015},
{0x98b0, 0x0000001f, 0x0000001f},
{0x98e0, 0x00000000, 0x00000400},
//# bank 7
{0x98b0, 0x000000a0, 0x000000a0},
{0x98b0, 0x00000000, 0x00000000},
{0x98b0, 0x00000040, 0x00000040},
{0x98f0, 0x0000001c, 0x0000001c}
};

2936
drivers/staging/otus/ioctl.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,60 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* Module Name : oal_dt.h */
/* */
/* Abstract */
/* This module contains data type definition. */
/* */
/* NOTES */
/* Platform dependent. */
/* */
/************************************************************************/
#ifndef _OAL_DT_H
#define _OAL_DT_H
/* Please include header files for buffer type in the beginning of this file */
/* Please include header files for device type here */
#include <linux/netdevice.h>
typedef unsigned long long u64_t;
typedef unsigned int u32_t;
typedef unsigned short u16_t;
typedef unsigned char u8_t;
typedef long long s64_t;
typedef long s32_t;
typedef short s16_t;
typedef char s8_t;
#ifndef TRUE
#define TRUE (1==1)
#endif
#ifndef FALSE
#define FALSE (1==0)
#endif
#ifndef NULL
#define NULL 0
#endif
/* Please include header files for buffer type in the beginning of this file */
typedef struct sk_buff zbuf_t;
/* Please include header files for device type in the beginning of this file */
typedef struct net_device zdev_t;
#endif /* #ifndef _OAL_DT_H */

View File

@ -0,0 +1,135 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* Module Name : oal_marc.h */
/* */
/* Abstract */
/* This module contains warpper definitions. */
/* */
/* NOTES */
/* Platform dependent. */
/* */
/************************************************************************/
#ifndef _OAL_MARC_H
#define _OAL_MARC_H
#include "oal_dt.h"
#include "usbdrv.h"
#define ZM_OS_LINUX_FUNC
/***** Critical section *****/
/* Declare for critical section */
#ifndef ZM_HALPLUS_LOCK
#define zmw_get_wlan_dev(dev) struct zsWlanDev *wd = (struct zsWlanDev*) ((((struct usbdrv_private*)dev->priv)->wd))
#define zmw_declare_for_critical_section() unsigned long irqFlag;
/* Enter critical section */
#define zmw_enter_critical_section(dev) \
spin_lock_irqsave(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
/* leave critical section */
#define zmw_leave_critical_section(dev) \
spin_unlock_irqrestore(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
#else
#define zmw_get_wlan_dev(dev) struct zsWlanDev *wd = zfwGetWlanDev(dev);
/* Declare for critical section */
#define zmw_declare_for_critical_section()
/* Enter critical section */
#define zmw_enter_critical_section(dev) \
zfwEnterCriticalSection(dev);
/* leave critical section */
#define zmw_leave_critical_section(dev) \
zfwLeaveCriticalSection(dev);
#endif
/***** Byte order converting *****/
#ifdef ZM_CONFIG_BIG_ENDIAN
#define zmw_cpu_to_le32(v) (((v & 0xff000000) >> 24) | \
((v & 0x00ff0000) >> 8) | \
((v & 0x0000ff00) << 8) | \
((v & 0x000000ff) << 24))
#define zmw_le32_to_cpu(v) (((v & 0xff000000) >> 24) | \
((v & 0x00ff0000) >> 8) | \
((v & 0x0000ff00) << 8) | \
((v & 0x000000ff) << 24))
#define zmw_cpu_to_le16(v) (((v & 0xff00) >> 8) | \
((v & 0x00ff) << 8))
#define zmw_le16_to_cpu(v) (((v & 0xff00) >> 8) | \
((v & 0x00ff) << 8))
#else
#define zmw_cpu_to_le32(v) (v)
#define zmw_le32_to_cpu(v) (v)
#define zmw_cpu_to_le16(v) (v)
#define zmw_le16_to_cpu(v) (v)
#endif
/***** Buffer access *****/
/* Called to read/write buffer */
#ifndef ZM_HALPLUS_LOCK
#define zmw_buf_readb(dev, buf, offset) *(u8_t*)((u8_t*)buf->data+offset)
#define zmw_buf_readh(dev, buf, offset) zmw_cpu_to_le16(*(u16_t*)((u8_t*)buf->data+offset))
#define zmw_buf_writeb(dev, buf, offset, value) *(u8_t*)((u8_t*)buf->data+offset) = value
#define zmw_buf_writeh(dev, buf, offset, value) *(u16_t*)((u8_t*)buf->data+offset) = zmw_cpu_to_le16(value)
#define zmw_buf_get_buffer(dev, buf) (u8_t*)(buf->data)
#else
#define zmw_buf_readb(dev, buf, offset) zfwBufReadByte(dev, buf, offset)
#define zmw_buf_readh(dev, buf, offset) zfwBufReadHalfWord(dev, buf, offset)
#define zmw_buf_writeb(dev, buf, offset, value) zfwBufWriteByte(dev, buf, offset, value)
#define zmw_buf_writeh(dev, buf, offset, value) zfwBufWriteHalfWord(dev, buf, offset, value)
#define zmw_buf_get_buffer(dev, buf) zfwGetBuffer(dev, buf)
#endif
/***** Debug message *****/
#if 0
#define zm_debug_msg0(msg) printk("%s:%s\n", __FUNCTION__, msg);
#define zm_debug_msg1(msg, val) printk("%s:%s%ld\n", __FUNCTION__, \
msg, (u32_t)val);
#define zm_debug_msg2(msg, val) printk("%s:%s%lxh\n", __FUNCTION__, \
msg, (u32_t)val);
#define zm_debug_msg_s(msg, val) printk("%s:%s%s\n", __FUNCTION__, \
msg, val);
#define zm_debug_msg_p(msg, val1, val2) printk("%s:%s%01ld.%02ld\n", __FUNCTION__, \
msg, (val1/val2), (((val1*100)/val2)%100));
#define zm_dbg(S) printk S
#else
#define zm_debug_msg0(msg)
#define zm_debug_msg1(msg, val)
#define zm_debug_msg2(msg, val)
#define zm_debug_msg_s(msg, val)
#define zm_debug_msg_p(msg, val1, val2)
#define zm_dbg(S)
#endif
#define zm_assert(expr) if(!(expr)) { \
printk( "Atheors Assertion failed! %s,%s,%s,line=%d\n", \
#expr,__FILE__,__FUNCTION__,__LINE__); \
}
#define DbgPrint printk
#endif /* #ifndef _OAL_MARC_H */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,257 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* */
/* Module Name : usbdrv.h */
/* */
/* Abstract */
/* This module contains network interface up/down related definition*/
/* */
/* NOTES */
/* Platform dependent. */
/* */
/************************************************************************/
#ifndef _USBDRV_H
#define _USBDRV_H
#define WLAN_USB 0
#define WLAN_PCI 1
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/version.h>
#include <asm/uaccess.h>
#include <linux/wireless.h>
#include <linux/if_arp.h>
#include <asm/io.h>
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
#include <asm/div64.h>
#endif
#include "zdcompat.h"
#include "oal_dt.h"
#include "oal_marc.h"
#include "80211core/pub_zfi.h"
//#include "pub_zfw.h"
#include "80211core/pub_usb.h"
#include <linux/usb.h>
/* Please include header files for device type in the beginning of this file */
#define urb_t struct urb
#define usb_complete_t usb_complete_t
#define pipe_t u32_t
/* USB Endpoint definition */
#define USB_WLAN_TX_PIPE 1
#define USB_WLAN_RX_PIPE 2
#define USB_REG_IN_PIPE 3
#define USB_REG_OUT_PIPE 4
#if (WLAN_HOSTIF == WLAN_USB)
#include <linux/usb.h>
#endif
#ifdef ZM_HOSTAPD_SUPPORT
#include "athr_common.h"
#endif
/**************************************************************************
** Descriptor Data Structure
***************************************************************************/
struct driver_stats {
struct net_device_stats net_stats;
};
#define ZM_MAX_RX_BUFFER_SIZE 8192
#if ZM_USB_TX_STREAM_MODE == 1
#define ZM_MAX_TX_AGGREGATE_NUM 4
#define ZM_USB_TX_BUF_SIZE 8096
#define ZM_MAX_TX_URB_NUM 4
#else
#define ZM_USB_TX_BUF_SIZE 2048
#define ZM_MAX_TX_URB_NUM 8
#endif
#define ZM_USB_REG_MAX_BUF_SIZE 64
#define ZM_MAX_RX_URB_NUM 16
#define ZM_MAX_TX_BUF_NUM 128
typedef struct UsbTxQ
{
zbuf_t *buf;
u8_t hdr[80];
u16_t hdrlen;
u8_t snap[8];
u16_t snapLen;
u8_t tail[16];
u16_t tailLen;
u16_t offset;
} UsbTxQ_t;
struct zdap_ioctl {
u16_t cmd; /* Command to run */
u32_t addr; /* Length of the data buffer */
u32_t value; /* Pointer to the data buffer */
u8_t data[0x100];
};
#define ZM_OAL_MAX_STA_SUPPORT 16
struct usbdrv_private
{
//linux used
struct net_device *device;
#if (WLAN_HOSTIF == WLAN_PCI)
struct pci_dev *pdev;
#endif
#if (WLAN_HOSTIF == WLAN_USB)
struct usb_device *udev;
struct usb_interface *interface;
#endif
struct driver_stats drv_stats;
char ifname[IFNAMSIZ];
int using_dac;
u8_t rev_id; /* adapter PCI revision ID */
rwlock_t isolate_lock;
spinlock_t cs_lock;
int driver_isolated;
#if (WLAN_HOSTIF == WLAN_PCI)
void *regp;
#endif
/* timer for heart beat */
struct timer_list hbTimer10ms;
/* For driver core */
void* wd;
#if (WLAN_HOSTIF == WLAN_USB)
u8_t txUsbBuf[ZM_MAX_TX_URB_NUM][ZM_USB_TX_BUF_SIZE];
u8_t regUsbReadBuf[ZM_USB_REG_MAX_BUF_SIZE];
u8_t regUsbWriteBuf[ZM_USB_REG_MAX_BUF_SIZE];
urb_t *WlanTxDataUrb[ZM_MAX_TX_URB_NUM];
urb_t *WlanRxDataUrb[ZM_MAX_RX_URB_NUM];
urb_t *RegOutUrb;
urb_t *RegInUrb;
UsbTxQ_t UsbTxBufQ[ZM_MAX_TX_BUF_NUM];
zbuf_t *UsbRxBufQ[ZM_MAX_RX_URB_NUM];
u16_t TxBufHead;
u16_t TxBufTail;
u16_t TxBufCnt;
u16_t TxUrbHead;
u16_t TxUrbTail;
u16_t TxUrbCnt;
u16_t RxBufHead;
u16_t RxBufTail;
u16_t RxBufCnt;
#endif
#if ZM_USB_STREAM_MODE == 1
zbuf_t *reamin_buf;
#endif
#ifdef ZM_HOSTAPD_SUPPORT
struct athr_wlan_param athr_wpa_req;
#endif
struct sock *netlink_sk;
u8_t DeviceOpened; //CWYang(+)
u8_t supIe[50];
u8_t supLen;
struct ieee80211req_wpaie stawpaie[ZM_OAL_MAX_STA_SUPPORT];
u8_t forwardMgmt;
struct zfCbUsbFuncTbl usbCbFunctions;
/* For keventd */
u32_t flags;
unsigned long kevent_flags;
u16_t kevent_ready;
struct semaphore ioctl_sem;
struct work_struct kevent;
wait_queue_head_t wait_queue_event;
#ifdef ZM_HALPLUS_LOCK
unsigned long hal_irqFlag;
#endif
u16_t adapterState;
};
/* WDS */
#define ZM_WDS_PORT_NUMBER 6
struct zsWdsStruct
{
struct net_device* dev;
u16_t openFlag;
};
/* VAP */
#define ZM_VAP_PORT_NUMBER 7
struct zsVapStruct
{
struct net_device* dev;
u16_t openFlag;
};
/***************************************/
#define ZM_IOCTL_REG_READ 0x01
#define ZM_IOCTL_REG_WRITE 0x02
#define ZM_IOCTL_MEM_DUMP 0x03
#define ZM_IOCTL_REG_DUMP 0x05
#define ZM_IOCTL_TXD_DUMP 0x06
#define ZM_IOCTL_RXD_DUMP 0x07
#define ZM_IOCTL_MEM_READ 0x0B
#define ZM_IOCTL_MEM_WRITE 0x0C
#define ZM_IOCTL_DMA_TEST 0x10
#define ZM_IOCTL_REG_TEST 0x11
#define ZM_IOCTL_TEST 0x80
#define ZM_IOCTL_TALLY 0x81 //CWYang(+)
#define ZM_IOCTL_RTS 0xA0
#define ZM_IOCTL_MIX_MODE 0xA1
#define ZM_IOCTL_FRAG 0xA2
#define ZM_IOCTL_SCAN 0xA3
#define ZM_IOCTL_KEY 0xA4
#define ZM_IOCTL_RATE 0xA5
#define ZM_IOCTL_ENCRYPTION_MODE 0xA6
#define ZM_IOCTL_GET_TXCNT 0xA7
#define ZM_IOCTL_GET_DEAGG_CNT 0xA8
#define ZM_IOCTL_DURATION_MODE 0xA9
#define ZM_IOCTL_SET_AES_KEY 0xAA
#define ZM_IOCTL_SET_AES_MODE 0xAB
#define ZM_IOCTL_SIGNAL_STRENGTH 0xAC //CWYang(+)
#define ZM_IOCTL_SIGNAL_QUALITY 0xAD //CWYang(+)
#define ZM_IOCTL_SET_PIBSS_MODE 0xAE
#define ZDAPIOCTL SIOCDEVPRIVATE
enum devState {
Opened,
Enabled,
Disabled,
Closed
};
#endif /* _USBDRV_H */

View File

@ -0,0 +1,114 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* */
/* Module Name : wrap_buf.c */
/* */
/* Abstract */
/* This module contains wrapper functions for buffer management */
/* */
/* NOTES */
/* Platform dependent. */
/* */
/************************************************************************/
#include "oal_dt.h"
#include "usbdrv.h"
#include <linux/netlink.h>
#if WIRELESS_EXT > 12
#include <net/iw_handler.h>
#endif
/* Called to allocate buffer, must return a continue buffer space */
zbuf_t* zfwBufAllocate(zdev_t* dev, u16_t len)
{
zbuf_t* buf;
/* Allocate SKB for packet*/
buf = dev_alloc_skb(len);
return buf;
}
/* Called to free buffer, replace below 3 functions */
void zfwBufFree(zdev_t* dev, zbuf_t* buf, u16_t status)
{
dev_kfree_skb_any(buf);
}
/* Called to adjust buffer size and head pointer */
u16_t zfwBufRemoveHead(zdev_t* dev, zbuf_t* buf, u16_t size)
{
//zm_assert(buf->len > size);
buf->data += size;
buf->len -= size;
return 0;
}
/* return tail if head==NULL, called to chain multiple buffer together */
/* Used to chain Rx buffer to form a frame. if the prepared Rx buffer */
/* is greater than an ethernet frame(1518+32 byte), then this function */
/* will only be called with head=NULL. */
u16_t zfwBufChain(zdev_t* dev, zbuf_t** head, zbuf_t* tail)
{
*head = tail;
return 0;
}
/* Called when doing infra-bss forwarding */
u16_t zfwBufCopy(zdev_t* dev, zbuf_t* dst, zbuf_t* src)
{
memcpy(dst->data, src->data, src->len);
dst->tail = dst->data;
skb_put(dst, src->len);
return 0;
}
/* Called to adjust buffer size and tail pointer */
u16_t zfwBufSetSize(zdev_t* dev, zbuf_t* buf, u16_t size)
{
#ifdef NET_SKBUFF_DATA_USES_OFFSET
buf->tail = 0;
buf->len = 0;
#else
buf->tail = buf->data;
buf->len = 0;
#endif
skb_put(buf, size);
return 0;
}
u16_t zfwBufGetSize(zdev_t* dev, zbuf_t* buf)
{
return buf->len;
}
void zfwCopyBufContext(zdev_t* dev, zbuf_t* source, zbuf_t* dst)
{
}

View File

@ -0,0 +1,101 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* Module Name : wrap_dbg.c */
/* */
/* Abstract */
/* This module contains wrapper functions for debug functions */
/* */
/* NOTES */
/* Platform dependent. */
/* */
/************************************************************************/
#include "oal_dt.h"
#include "usbdrv.h"
#include <linux/netlink.h>
#if WIRELESS_EXT > 12
#include <net/iw_handler.h>
#endif
void zfwDumpBuf(zdev_t* dev, zbuf_t* buf)
{
u16_t i;
for (i=0; i<buf->len; i++)
{
printk("%02x ", *(((u8_t*)buf->data)+i));
if ((i&0xf)==0xf)
{
printk("\n");
}
}
printk("\n");
}
void zfwDbgReadRegDone(zdev_t* dev, u32_t addr, u32_t val)
{
printk("Read addr:%x = %x\n", addr, val);
}
void zfwDbgWriteRegDone(zdev_t* dev, u32_t addr, u32_t val)
{
printk("Write addr:%x = %x\n", addr, val);
}
void zfwDbgReadTallyDone(zdev_t* dev)
{
//printk("Read Tall Done\n");
}
void zfwDbgWriteEepromDone(zdev_t* dev, u32_t addr, u32_t val)
{
}
void zfwDbgQueryHwTxBusyDone(zdev_t* dev, u32_t val)
{
}
//For Evl ++
void zfwDbgReadFlashDone(zdev_t* dev, u32_t addr, u32_t* rspdata, u32_t datalen)
{
printk("Read Flash addr:%x length:%x\n", addr, datalen);
}
void zfwDbgProgrameFlashDone(zdev_t* dev)
{
printk("Program Flash Done\n");
}
void zfwDbgProgrameFlashChkDone(zdev_t* dev)
{
printk("Program Flash Done\n");
}
void zfwDbgGetFlashChkSumDone(zdev_t* dev, u32_t* rspdata)
{
printk("Get Flash ChkSum Done\n");
}
void zfwDbgDownloadFwInitDone(zdev_t* dev)
{
printk("Download FW Init Done\n");
}
//For Evl --
/* Leave an empty line below to remove warning message on some compiler */

View File

@ -0,0 +1,283 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* */
/* Module Name : wrap_ev.c */
/* */
/* Abstract */
/* This module contains wrapper functions for events */
/* */
/* NOTES */
/* Platform dependent. */
/* */
/************************************************************************/
#include "oal_dt.h"
#include "usbdrv.h"
#include <linux/netlink.h>
#if WIRELESS_EXT > 12
#include <net/iw_handler.h>
#endif
/***** Management *****/
u16_t zfLnxAuthNotify(zdev_t* dev, u16_t* macAddr)
{
return 0;
}
u16_t zfLnxAsocNotify(zdev_t* dev, u16_t* macAddr, u8_t* body, u16_t bodySize, u16_t port)
{
//#ifdef ZM_HOSTAPD_SUPPORT
struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
union iwreq_data wreq;
u8_t *addr = (u8_t *) macAddr;
u16_t i, j;
memset(&wreq, 0, sizeof(wreq));
memcpy(wreq.addr.sa_data, macAddr, ETH_ALEN);
wreq.addr.sa_family = ARPHRD_ETHER;
printk(KERN_DEBUG "join_event of MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
for(i = 0; i < ZM_OAL_MAX_STA_SUPPORT; i++)
{
for(j = 0; j < IEEE80211_ADDR_LEN; j++)
{
if ((macp->stawpaie[i].wpa_macaddr[j] != 0) &&
(macp->stawpaie[i].wpa_macaddr[j] != addr[j]))
break;
}
if (j == 6)
break;
}
if (i < ZM_OAL_MAX_STA_SUPPORT)
{
//printk("zfwAsocNotify - store wpa ie in macp, index = %d\n", i);
memcpy(macp->stawpaie[i].wpa_macaddr, macAddr, IEEE80211_ADDR_LEN);
memcpy(macp->stawpaie[i].wpa_ie, body, bodySize);
}
//if(macp->cardSetting.BssType == INFRASTRUCTURE_BSS) {
// //wireless_send_event(macp->device, SIOCGIWSCAN, &wreq, NULL);
// wireless_send_event(macp->device, SIOCGIWAP, &wreq, NULL);
//}
#if WIRELESS_EXT >= 15
//else if(macp->cardSetting.BssType == AP_BSS) {
// if (port == 0)
// {
wireless_send_event(dev, IWEVREGISTERED, &wreq, NULL);
// }
// else
// {
// /* Check whether the VAP device is valid */
// if (vap[port].dev != NULL)
// {
// wireless_send_event(vap[port].dev, IWEVREGISTERED, &wreq, NULL);
// }
// else
// {
// printk(KERN_ERR "Can' find a valid VAP device, port: %d\n", port);
// }
// }
//}
#endif
//#endif
return 0;
}
/* Notification that a STA is disassociated from AP */
/* AP mode only */
u16_t zfLnxDisAsocNotify(zdev_t* dev, u8_t* macAddr, u16_t port)
{
union iwreq_data wreq;
u8_t *addr = (u8_t *) macAddr;
memset(&wreq, 0, sizeof(wreq));
memcpy(wreq.addr.sa_data, macAddr, ETH_ALEN);
wreq.addr.sa_family = ARPHRD_ETHER;
printk(KERN_DEBUG "zfwDisAsocNotify(), MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
return 0;
}
/* Notification that a STA is connect to AP */
/* AP mode only */
u16_t zfLnxApConnectNotify(zdev_t* dev, u8_t* macAddr, u16_t port)
{
union iwreq_data wreq;
u8_t *addr = (u8_t *) macAddr;
memset(&wreq, 0, sizeof(wreq));
memcpy(wreq.addr.sa_data, macAddr, ETH_ALEN);
wreq.addr.sa_family = ARPHRD_ETHER;
printk(KERN_DEBUG "zfwApConnectNotify(), MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
return 0;
}
void zfLnxConnectNotify(zdev_t* dev, u16_t status, u16_t* bssid)
{
union iwreq_data wreq;
u8_t *addr = (u8_t *) bssid;
struct usbdrv_private *macp = dev->priv;
if (bssid != NULL)
{
memset(&wreq, 0, sizeof(wreq));
if (status == ZM_STATUS_MEDIA_CONNECT)
memcpy(wreq.addr.sa_data, bssid, ETH_ALEN);
wreq.addr.sa_family = ARPHRD_ETHER;
if (status == ZM_STATUS_MEDIA_CONNECT)
{
#ifdef ZM_CONFIG_BIG_ENDIAN
printk(KERN_DEBUG "Connected to AP, MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
addr[1], addr[0], addr[3], addr[2], addr[5], addr[4]);
#else
printk(KERN_DEBUG "Connected to AP, MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
#endif
netif_start_queue(dev);
}
else if ((status == ZM_STATUS_MEDIA_DISCONNECT) ||
(status == ZM_STATUS_MEDIA_DISABLED) ||
(status == ZM_STATUS_MEDIA_CONNECTION_DISABLED) ||
(status == ZM_STATUS_MEDIA_CONNECTION_RESET) ||
(status == ZM_STATUS_MEDIA_RESET) ||
(status == ZM_STATUS_MEDIA_DISCONNECT_DEAUTH) ||
(status == ZM_STATUS_MEDIA_DISCONNECT_DISASOC) ||
(status == ZM_STATUS_MEDIA_DISCONNECT_BEACON_MISS) ||
(status == ZM_STATUS_MEDIA_DISCONNECT_NOT_FOUND) ||
(status == ZM_STATUS_MEDIA_DISCONNECT_TIMEOUT))
{
printk(KERN_DEBUG "Disconnection Notify\n");
netif_stop_queue(dev);
}
/* Save the connected status */
macp->adapterState = status;
if(zfiWlanQueryWlanMode(dev) == ZM_MODE_INFRASTRUCTURE) {
// //wireless_send_event(dev, SIOCGIWSCAN, &wreq, NULL);
wireless_send_event(dev, SIOCGIWAP, &wreq, NULL);
}
#if WIRELESS_EXT >= 15
else if(zfiWlanQueryWlanMode(dev) == ZM_MODE_AP) {
//if (port == 0)
//{
wireless_send_event(dev, IWEVREGISTERED, &wreq, NULL);
//}
//else
//{
// /* Check whether the VAP device is valid */
// if (vap[port].dev != NULL)
// {
// wireless_send_event(vap[port].dev, IWEVREGISTERED, &wreq, NULL);
// }
// else
// {
// printk(KERN_ERR "Can' find a valid VAP device, port: %d\n", port);
// }
//}
}
#endif
}
//return 0;
}
void zfLnxScanNotify(zdev_t* dev, struct zsScanResult* result)
{
return;
}
void zfLnxStatisticsNotify(zdev_t* dev, struct zsStastics* result)
{
return;
}
//void zfwMicFailureNotify(zdev_t* dev, u8_t* message, u16_t event)
void zfLnxMicFailureNotify(zdev_t* dev, u16_t* addr, u16_t status)
{
static const char *tag = "MLME-MICHAELMICFAILURE.indication";
union iwreq_data wrqu;
char buf[128];
/* TODO: needed parameters: count, type, src address */
//snprintf(buf, sizeof(buf), "%s(%scast addr=%s)", tag,
// (status == ZM_MIC_GROUP_ERROR) ? "broad" : "uni",
// ether_sprintf((u8_t *)addr));
if (zfiWlanQueryWlanMode(dev) == ZM_MODE_INFRASTRUCTURE)
{
strcpy(buf, tag);
}
memset(&wrqu, 0, sizeof(wrqu));
wrqu.data.length = strlen(buf);
wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf);
}
void zfLnxApMicFailureNotify(zdev_t* dev, u8_t* addr, zbuf_t* buf)
{
union iwreq_data wreq;
memset(&wreq, 0, sizeof(wreq));
memcpy(wreq.addr.sa_data, addr, ETH_ALEN);
wreq.addr.sa_family = ARPHRD_ETHER;
printk(KERN_DEBUG "zfwApMicFailureNotify(), MAC: %02x:%02x:%02x:%02x:%02x:%02x\n",
addr[0], addr[1], addr[2], addr[3], addr[4], addr[5]);
return;
}
// status = 0 => partner lost
// = 1 => partner alive
//void zfwIbssPartnerNotify(zdev_t* dev, u8_t status)
void zfLnxIbssPartnerNotify(zdev_t* dev, u16_t status, struct zsPartnerNotifyEvent *event)
{
}
void zfLnxMacAddressNotify(zdev_t* dev, u8_t* addr)
{
dev->dev_addr[0] = addr[0];
dev->dev_addr[1] = addr[1];
dev->dev_addr[2] = addr[2];
dev->dev_addr[3] = addr[3];
dev->dev_addr[4] = addr[4];
dev->dev_addr[5] = addr[5];
}
void zfLnxSendCompleteIndication(zdev_t* dev, zbuf_t* buf)
{
}
void zfLnxRestoreBufData(zdev_t* dev, zbuf_t* buf) {
}
/* Leave an empty line below to remove warning message on some compiler */

View File

@ -0,0 +1,101 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* Module Name : wrap_mem.c */
/* */
/* Abstract */
/* This module contains wrapper functions for memory management */
/* */
/* NOTES */
/* Platform dependent. */
/* */
/************************************************************************/
#include "oal_dt.h"
#include "usbdrv.h"
#include <linux/netlink.h>
#if WIRELESS_EXT > 12
#include <net/iw_handler.h>
#endif
/* Memory management */
/* Called to allocate uncached memory, allocated memory must */
/* in 4-byte boundary */
void* zfwMemAllocate(zdev_t* dev, u32_t size)
{
void* mem = NULL;
mem = kmalloc(size, GFP_ATOMIC);
return mem;
}
/* Called to free allocated memory */
void zfwMemFree(zdev_t* dev, void* mem, u32_t size)
{
kfree(mem);
return;
}
void zfwMemoryCopy(u8_t* dst, u8_t* src, u16_t length)
{
//u16_t i;
memcpy(dst, src, length);
//for(i=0; i<length; i++)
//{
// dst[i] = src[i];
//}
return;
}
void zfwZeroMemory(u8_t* va, u16_t length)
{
//u16_t i;
memset(va, 0, length);
//for(i=0; i<length; i++)
//{
// va[i] = 0;
//}
return;
}
void zfwMemoryMove(u8_t* dst, u8_t* src, u16_t length)
{
memcpy(dst, src, length);
return;
}
u8_t zfwMemoryIsEqual(u8_t* m1, u8_t* m2, u16_t length)
{
//u16_t i;
int ret;
ret = memcmp(m1, m2, length);
return ((ret==0)?TRUE:FALSE);
//for(i=0; i<length; i++)
//{
// if ( m1[i] != m2[i] )
// {
// return FALSE;
// }
//}
//return TRUE;
}
/* Leave an empty line below to remove warning message on some compiler */

View File

@ -0,0 +1,108 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* */
/* Module Name : wrap_mis.c */
/* */
/* Abstract */
/* This module contains wrapper functions for misc functions */
/* */
/* NOTES */
/* Platform dependent. */
/* */
/************************************************************************/
#include "oal_dt.h"
#include "usbdrv.h"
#include <linux/netlink.h>
#if WIRELESS_EXT > 12
#include <net/iw_handler.h>
#endif
//extern struct zsWdsStruct wds[ZM_WDS_PORT_NUMBER];
extern struct zsVapStruct vap[ZM_VAP_PORT_NUMBER];
extern u16_t zfLnxGetVapId(zdev_t* dev);
/* Simply return 0xffff if VAP function is not supported */
u16_t zfwGetVapId(zdev_t* dev)
{
return zfLnxGetVapId(dev);
}
void zfwSleep(zdev_t* dev, u32_t ms)
{
if (in_interrupt() == 0)
{
mdelay(ms);
}
else
{
int ii;
int iter = 100000 * ms;
for (ii = 0; ii < iter; ii++)
{
}
}
}
#ifdef ZM_HALPLUS_LOCK
asmlinkage struct zsWlanDev *zfwGetWlanDev(zdev_t* dev)
{
return ((struct zsWlanDev*)(((struct usbdrv_private*)dev->priv)->wd));
}
asmlinkage void zfwEnterCriticalSection(zdev_t* dev)
{
spin_lock_irqsave(&(((struct usbdrv_private *)(dev->priv))->cs_lock),
(((struct usbdrv_private *)(dev->priv))->hal_irqFlag));
}
asmlinkage void zfwLeaveCriticalSection(zdev_t* dev)
{
spin_unlock_irqrestore(&(((struct usbdrv_private *)(dev->priv))->cs_lock),
(((struct usbdrv_private *)(dev->priv))->hal_irqFlag));
}
asmlinkage u8_t zfwBufReadByte(zdev_t* dev, zbuf_t* buf, u16_t offset)
{
return *(u8_t*)((u8_t*)buf->data+offset);
}
asmlinkage u16_t zfwBufReadHalfWord(zdev_t* dev, zbuf_t* buf, u16_t offset)
{
return zmw_cpu_to_le16(*(u16_t*)((u8_t*)buf->data+offset));
}
asmlinkage void zfwBufWriteByte(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t value)
{
*(u8_t*)((u8_t*)buf->data+offset) = value;
}
asmlinkage void zfwBufWriteHalfWord(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t value)
{
*(u16_t*)((u8_t*)buf->data+offset) = zmw_cpu_to_le16(value);
}
asmlinkage u8_t *zfwGetBuffer(zdev_t* dev, zbuf_t* buf)
{
return (u8_t*)(buf->data);
}
#endif
/* Leave an empty line below to remove warning message on some compiler */

View File

@ -0,0 +1,178 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* */
/* Module Name : wrap_pkt.c */
/* */
/* Abstract */
/* This module contains wrapper functions for packet handling */
/* */
/* NOTES */
/* Platform dependent. */
/* */
/************************************************************************/
#include "oal_dt.h"
#include "usbdrv.h"
#include <linux/netlink.h>
#if WIRELESS_EXT > 12
#include <net/iw_handler.h>
#endif
//extern struct zsWdsStruct wds[ZM_WDS_PORT_NUMBER];
extern struct zsVapStruct vap[ZM_VAP_PORT_NUMBER];
/***** Rx *****/
void zfLnxRecv80211(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo)
{
u16_t frameType;
u16_t frameCtrl;
u16_t frameSubtype;
zbuf_t *skb1;
struct usbdrv_private *macp = dev->priv;
//frameCtrl = zmw_buf_readb(dev, buf, 0);
frameCtrl = *(u8_t*)((u8_t*)buf->data);
frameType = frameCtrl & 0xf;
frameSubtype = frameCtrl & 0xf0;
if ((frameType == 0x0) && (macp->forwardMgmt))
{
switch (frameSubtype)
{
/* Beacon */
case 0x80 :
/* Probe response */
case 0x50 :
skb1 = skb_copy(buf, GFP_ATOMIC);
if(skb1 != NULL)
{
skb1->dev = dev;
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22))
skb1->mac.raw = skb1->data;
#else
skb1->mac_header = skb1->data;
#endif
skb1->ip_summed = CHECKSUM_NONE;
skb1->pkt_type = PACKET_OTHERHOST;
skb1->protocol = __constant_htons(0x0019); /* ETH_P_80211_RAW */
netif_rx(skb1);
}
break;
default:
break;
}
}
zfiRecv80211(dev, buf, addInfo);
return;
}
#define ZM_AVOID_UDP_LARGE_PACKET_FAIL
void zfLnxRecvEth(zdev_t* dev, zbuf_t* buf, u16_t port)
{
#ifdef ZM_AVOID_UDP_LARGE_PACKET_FAIL
zbuf_t *new_buf;
//new_buf = dev_alloc_skb(2048);
new_buf = dev_alloc_skb(buf->len);
#ifdef NET_SKBUFF_DATA_USES_OFFSET
new_buf->tail = 0;
new_buf->len = 0;
#else
new_buf->tail = new_buf->data;
new_buf->len = 0;
#endif
skb_put(new_buf, buf->len);
memcpy(new_buf->data, buf->data, buf->len);
/* Free buffer */
dev_kfree_skb_any(buf);
if (port == 0)
{
new_buf->dev = dev;
new_buf->protocol = eth_type_trans(new_buf, dev);
}
else
{
/* VAP */
if (vap[0].dev != NULL)
{
new_buf->dev = vap[0].dev;
new_buf->protocol = eth_type_trans(new_buf, vap[0].dev);
}
else
{
new_buf->dev = dev;
new_buf->protocol = eth_type_trans(new_buf, dev);
}
}
new_buf->ip_summed = CHECKSUM_NONE;
dev->last_rx = jiffies;
switch(netif_rx(new_buf))
#else
if (port == 0)
{
buf->dev = dev;
buf->protocol = eth_type_trans(buf, dev);
}
else
{
/* VAP */
if (vap[0].dev != NULL)
{
buf->dev = vap[0].dev;
buf->protocol = eth_type_trans(buf, vap[0].dev);
}
else
{
buf->dev = dev;
buf->protocol = eth_type_trans(buf, dev);
}
}
buf->ip_summed = CHECKSUM_NONE;
dev->last_rx = jiffies;
switch(netif_rx(buf))
#endif
{
case NET_RX_BAD:
case NET_RX_DROP:
case NET_RX_CN_MOD:
case NET_RX_CN_HIGH:
break;
default:
((struct usbdrv_private*)(dev->priv))->
drv_stats.net_stats.rx_packets++;
((struct usbdrv_private*)(dev->priv))->
drv_stats.net_stats.rx_bytes += buf->len;
break;
}
return;
}
/* Leave an empty line below to remove warning message on some compiler */

View File

@ -0,0 +1,127 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* */
/* Module Name : wrap_sec.c */
/* */
/* Abstract */
/* This module contains wrapper functions for CENC. */
/* */
/* NOTES */
/* Platform dependent. */
/* */
/************************************************************************/
#include "oal_dt.h"
#include "usbdrv.h"
#include <linux/netlink.h>
#if WIRELESS_EXT > 12
#include <net/iw_handler.h>
#endif
#ifdef ZM_ENABLE_CENC
extern int zfLnxCencSendMsg(struct sock *netlink_sk, u_int8_t *msg, int len);
u16_t zfLnxCencAsocNotify(zdev_t* dev, u16_t* macAddr, u8_t* body, u16_t bodySize, u16_t port)
{
struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
struct zydas_cenc_sta_info cenc_info;
//struct sock *netlink_sk;
u8_t ie_len;
int ii;
/* Create NETLINK socket */
//netlink_sk = netlink_kernel_create(NETLINK_USERSOCK, NULL);
if (macp->netlink_sk == NULL)
{
printk(KERN_ERR "NETLINK Socket is NULL\n");
return -1;
}
memset(&cenc_info, 0, sizeof(cenc_info));
//memcpy(cenc_info.gsn, vap->iv_cencmsk_keys.wk_txiv, ZM_CENC_IV_LEN);
zfiWlanQueryGSN(dev, cenc_info.gsn, port);
cenc_info.datalen += ZM_CENC_IV_LEN;
ie_len = body[1] + 2;
memcpy(cenc_info.wie, body, ie_len);
cenc_info.datalen += ie_len;
memcpy(cenc_info.sta_mac, macAddr, 6);
cenc_info.msg_type = ZM_CENC_WAI_REQUEST;
cenc_info.datalen += 6 + 2;
printk(KERN_ERR "===== zfwCencSendMsg, bodySize: %d =====\n", bodySize);
for(ii = 0; ii < bodySize; ii++)
{
printk(KERN_ERR "%02x ", body[ii]);
if ((ii & 0xf) == 0xf)
{
printk(KERN_ERR "\n");
}
}
zfLnxCencSendMsg(macp->netlink_sk, (u8_t *)&cenc_info, cenc_info.datalen+4);
/* Close NETLINK socket */
//sock_release(netlink_sk);
return 0;
}
#endif //ZM_ENABLE_CENC
u8_t zfwCencHandleBeaconProbrespon(zdev_t* dev, u8_t *pWIEc,
u8_t *pPeerSSIDc, u8_t *pPeerAddrc)
{
return 0;
}
u8_t zfwGetPktEncExemptionActionType(zdev_t* dev, zbuf_t* buf)
{
return ZM_ENCRYPTION_EXEMPT_NO_EXEMPTION;
}
void copyToIntTxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* src,
u16_t offset, u16_t length)
{
u16_t i;
for(i=0; i<length;i++)
{
//zmw_tx_buf_writeb(dev, buf, offset+i, src[i]);
*(u8_t*)((u8_t*)buf->data+offset+i) = src[i];
}
}
u16_t zfwStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType)
{
struct usbdrv_private *macp = dev->priv;
//zm_msg1_mm(ZM_LV_0, "CWY - add wpaie content Length : ", macp->supIe[1]);
if (macp->supIe[1] != 0)
{
copyToIntTxBuffer(dev, buf, macp->supIe, offset, macp->supIe[1]+2);
//memcpy(buf->data[offset], macp->supIe, macp->supIe[1]+2);
offset += (macp->supIe[1]+2);
}
return offset;
}
/* Leave an empty line below to remove warning message on some compiler */

View File

@ -0,0 +1,195 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* */
/* Module Name : wrap_usb.c */
/* */
/* Abstract */
/* This module contains wrapper functions for USB management */
/* */
/* NOTES */
/* Platform dependent. */
/* */
/************************************************************************/
#include "oal_dt.h"
#include "usbdrv.h"
#include <linux/netlink.h>
#if WIRELESS_EXT > 12
#include <net/iw_handler.h>
#endif
extern void zfLnxInitUsbTxQ(zdev_t* dev);
extern void zfLnxInitUsbRxQ(zdev_t* dev);
extern u32_t zfLnxSubmitRegInUrb(zdev_t *dev);
u32_t zfLnxUsbOut(zdev_t* dev, u8_t *hdr, u16_t hdrlen, u8_t *snap, u16_t snapLen,
u8_t *tail, u16_t tailLen, zbuf_t *buf, u16_t offset);
u32_t zfLnxUsbWriteReg(zdev_t* dev, u32_t* cmd, u16_t cmdLen);
void zfwUsbRegisterCallBack(zdev_t* dev, struct zfCbUsbFuncTbl *zfUsbFunc) {
struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
macp->usbCbFunctions.zfcbUsbRecv = zfUsbFunc->zfcbUsbRecv;
macp->usbCbFunctions.zfcbUsbRegIn = zfUsbFunc->zfcbUsbRegIn;
macp->usbCbFunctions.zfcbUsbOutComplete = zfUsbFunc->zfcbUsbOutComplete;
return;
}
u32_t zfwUsbGetFreeTxQSize(zdev_t* dev)
{
struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
u32_t freeTxQSize;
unsigned long irqFlag;
//zmw_declare_for_critical_section();
//zmw_enter_critical_section(dev);
spin_lock_irqsave(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
freeTxQSize = ZM_MAX_TX_BUF_NUM - macp->TxBufCnt;
//zmw_leave_critical_section(dev);
spin_unlock_irqrestore(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
return freeTxQSize;
}
u32_t zfwUsbGetMaxTxQSize(zdev_t* dev)
{
return ZM_MAX_TX_BUF_NUM;
}
u32_t zfwUsbEnableIntEpt(zdev_t *dev, u8_t endpt)
{
/* Initialize USB TxQ */
zfLnxInitUsbTxQ(dev);
/* Initialize USB RxQ */
zfLnxInitUsbRxQ(dev);
/* Initialize USB Register In URB */
//zfwUsbSubmitRegIn(dev);
/* Initialize USB Register In URB */
zfLnxSubmitRegInUrb(dev);
return 0;
}
int zfwUsbEnableRxEpt(zdev_t* dev, u8_t endpt)
{
return 0;
}
u32_t zfwUsbSubmitControl(zdev_t* dev, u8_t req, u16_t value, u16_t index, void *data, u32_t size)
{
int result = 0;
u32_t ret = 0;
struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
u8_t* buf;
if (size > 0)
{
buf = kmalloc(size, GFP_KERNEL);
memcpy(buf, (u8_t*)data, size);
}
else
{
buf = NULL;
}
#if 0
printk(KERN_ERR "req = 0x%02x\n", req);
printk(KERN_ERR "value = 0x%04x\n", value);
printk(KERN_ERR "index = 0x%04x\n", index);
printk(KERN_ERR "data = 0x%lx\n", (u32_t) data);
printk(KERN_ERR "size = %ld\n", size);
#endif
result = usb_control_msg(macp->udev, usb_sndctrlpipe(macp->udev, 0),
req, USB_DIR_OUT | 0x40, value, index, buf, size, HZ);
if (result < 0)
{
printk("zfwUsbSubmitControl() failed, result=0x%x\n", result);
ret = 1;
}
kfree(buf);
return ret;
}
void zfwUsbCmd(zdev_t* dev, u8_t endpt, u32_t* cmd, u16_t cmdLen)
{
struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
u32_t ret;
//MPUsbCommand(dev, endpt, cmd, cmdLen);
ret = zfLnxUsbWriteReg(dev, cmd, cmdLen);
/* if zfLnxUsbWriteReg() return error, free and allocate urb, resend again */
if (ret != 0)
{
usb_free_urb(macp->RegOutUrb);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) /* tune me! */
macp->RegOutUrb = usb_alloc_urb(0, GFP_ATOMIC);
#else
macp->RegOutUrb = usb_alloc_urb(0);
#endif
ret = zfLnxUsbWriteReg(dev, cmd, cmdLen);
}
}
u32_t zfwUsbSend(zdev_t* dev, u8_t endpt, u8_t *hdr, u16_t hdrlen, u8_t *snap, u16_t snapLen,
u8_t *tail, u16_t tailLen, zbuf_t *buf, u16_t offset)
{
u32_t status;
#ifdef ZM_CONFIG_BIG_ENDIAN
u32_t ii = 0;
u16_t *pc = NULL;
pc = (u16_t *)hdr;
for(ii=0; ii<(hdrlen>>1); ii++)
{
pc[ii] = cpu_to_le16(pc[ii]);
}
pc = (u16_t *)snap;
for(ii=0; ii<(snapLen>>1); ii++)
{
pc[ii] = cpu_to_le16(pc[ii]);
}
pc = (u16_t *)tail;
for(ii=0; ii<(tailLen>>1); ii++)
{
pc[ii] = cpu_to_le16(pc[ii]);
}
#endif
status = zfLnxUsbOut(dev, hdr, hdrlen, snap, snapLen, tail, tailLen, buf, offset);
if ( status == 0 )
{
return 0;
}
else
{
return 1;
}
}
/* Leave an empty line below to remove warning message on some compiler */

1207
drivers/staging/otus/wwrap.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,116 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* */
/* Module Name : zdcompat.h */
/* */
/* Abstract */
/* This module contains function defintion for compatibility. */
/* */
/* NOTES */
/* Platform dependent. */
/* */
/************************************************************************/
#ifndef _ZDCOMPAT_H
#define _ZDCOMPAT_H
#ifndef KERNEL_VERSION
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
#endif
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
#ifndef INIT_TQUEUE
#define INIT_TQUEUE(_tq, _routine, _data) \
do { \
(_tq)->next = NULL; \
(_tq)->sync = 0; \
PREPARE_TQUEUE((_tq), (_routine), (_data)); \
} while (0)
#define PREPARE_TQUEUE(_tq, _routine, _data) \
do { \
(_tq)->routine = _routine; \
(_tq)->data = _data; \
} while (0)
#endif
#ifndef INIT_WORK
#define work_struct tq_struct
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0))
#define schedule_work(a) queue_task(a, &tq_scheduler)
#else
#define schedule_work(a) schedule_task(a)
#endif
#define flush_scheduled_work flush_scheduled_tasks
#define INIT_WORK(_wq, _routine, _data) INIT_TQUEUE(_wq, _routine, _data)
#define PREPARE_WORK(_wq, _routine, _data) PREPARE_TQUEUE(_wq, _routine, _data)
#endif
#endif // < 2.5 kernel
#ifndef DECLARE_TASKLET
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0))
#define tasklet_schedule(a) queue_task(a, &tq_scheduler)
#else
#define tasklet_schedule(a) schedule_task(a)
#endif
#endif
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,38))
typedef struct device netdevice_t;
#elif (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,4))
typedef struct net_device netdevice_t;
#else
#undef netdevice_t
typedef struct net_device netdevice_t;
#endif
#ifdef WIRELESS_EXT
#if (WIRELESS_EXT < 13)
struct iw_request_info
{
__u16 cmd; /* Wireless Extension command */
__u16 flags; /* More to come ;-) */
};
#endif
#endif
/* linux < 2.5.69 */
#ifndef IRQ_NONE
typedef void irqreturn_t;
#define IRQ_NONE
#define IRQ_HANDLED
#define IRQ_RETVAL(x)
#endif
#ifndef in_atomic
#define in_atomic() 0
#endif
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) // fixme
#define URB_ASYNC_UNLINK USB_ASYNC_UNLINK
#else
#define USB_QUEUE_BULK 0
#endif
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0))
#define free_netdev(x) kfree(x)
#endif
#endif

View File

@ -0,0 +1,295 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* */
/* Module Name : zdusb.c */
/* */
/* Abstract */
/* This module contains plug and play handling for USB device driver*/
/* */
/* NOTES */
/* Platform dependent. */
/* */
/************************************************************************/
#include <linux/version.h>
#ifdef MODVERSIONS
#include <linux/modversions.h>
#endif
#include <linux/module.h>
#include <linux/usb.h>
#include "usbdrv.h"
#include "zdusb.h"
int zfLnxAllocAllUrbs(struct usbdrv_private *macp);
void zfLnxFreeAllUrbs(struct usbdrv_private *macp);
void zfLnxUnlinkAllUrbs(struct usbdrv_private *macp);
MODULE_AUTHOR("Atheros Communications");
MODULE_DESCRIPTION("Atheros 802.11n Wireless LAN adapter");
MODULE_LICENSE("Dual BSD/GPL");
static const char driver_name[] = "Otus";
/* table of devices that work with this driver */
static struct usb_device_id zd1221_ids [] = {
{ USB_DEVICE(VENDOR_ATHR, PRODUCT_AR9170) },
{ USB_DEVICE(VENDOR_DLINK, PRODUCT_DWA160A) },
{ USB_DEVICE(0x0846, 0x9010) },
{ } /* Terminating entry */
};
MODULE_DEVICE_TABLE(usb, zd1221_ids);
extern u8_t zfLnxInitSetup(struct net_device *dev, struct usbdrv_private *macp);
extern int usbdrv_close(struct net_device *dev);
extern u8_t zfLnxClearStructs(struct net_device *dev);
extern int zfWdsClose(struct net_device *dev);
extern int zfUnregisterWdsDev(struct net_device* parentDev, u16_t wdsId);
extern int zfLnxVapClose(struct net_device *dev);
extern int zfLnxUnregisterVapDev(struct net_device* parentDev, u16_t vapId);
/* WDS */
extern struct zsWdsStruct wds[ZM_WDS_PORT_NUMBER];
/* VAP */
extern struct zsVapStruct vap[ZM_VAP_PORT_NUMBER];
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
static void *zfLnxProbe(struct usb_device *dev, unsigned int ifnum,
const struct usb_device_id *id)
{
struct usb_interface *interface = &dev->actconfig->interface[ifnum];
#else
static int zfLnxProbe(struct usb_interface *interface,
const struct usb_device_id *id)
{
struct usb_device *dev = interface_to_usbdev(interface);
#endif
struct net_device *net = NULL;
struct usbdrv_private *macp = NULL;
int vendor_id, product_id;
int result = 0;
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
usb_get_dev(dev);
#endif
vendor_id = dev->descriptor.idVendor;
product_id = dev->descriptor.idProduct;
#ifdef HMAC_DEBUG
printk(KERN_NOTICE "vendor_id = %04x\n", vendor_id);
printk(KERN_NOTICE "product_id = %04x\n", product_id);
if (dev->speed == USB_SPEED_HIGH)
printk(KERN_NOTICE "USB 2.0 Host\n");
else
printk(KERN_NOTICE "USB 1.1 Host\n");
#endif
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
if (usb_set_configuration(dev, dev->config[0].bConfigurationValue))
{
printk(KERN_ERR "usb_set_configuration() failed\n");
result = -EIO;
goto fail;
}
#endif
if (!(macp = kmalloc(sizeof(struct usbdrv_private), GFP_KERNEL)))
{
printk(KERN_ERR "out of memory allocating device structure\n");
result = -ENOMEM;
goto fail;
}
/* Zero the memory */
memset(macp, 0, sizeof(struct usbdrv_private));
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
usb_inc_dev_use(dev);
#endif
net = alloc_etherdev(0);
if (net == NULL)
{
printk(KERN_ERR "zfLnxProbe: Not able to alloc etherdev struct\n");
result = -ENOMEM;
goto fail1;
}
strcpy(net->name, "ath%d");
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
SET_MODULE_OWNER(net);
#endif
net->priv = macp; //kernel 2.6
macp->udev = dev;
macp->device = net;
/* set up the endpoint information */
/* check out the endpoints */
macp->interface = interface;
//init_waitqueue_head(&macp->regSet_wait);
//init_waitqueue_head(&macp->iorwRsp_wait);
//init_waitqueue_head(&macp->term_wait);
if (!zfLnxAllocAllUrbs(macp))
{
result = -ENOMEM;
goto fail2;
}
if (!zfLnxInitSetup(net, macp))
{
result = -EIO;
goto fail3;
}
else
{
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
usb_set_intfdata(interface, macp);
SET_NETDEV_DEV(net, &interface->dev);
#endif
if (register_netdev(net) != 0)
{
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
usb_set_intfdata(interface, NULL);
#endif
goto fail3;
}
}
netif_carrier_off(net);
goto done;
fail3:
zfLnxFreeAllUrbs(macp);
fail2:
free_netdev(net); //kernel 2.6
fail1:
kfree(macp);
fail:
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
usb_put_dev(dev);
#endif
macp = NULL;
done:
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
return macp;
#else
return result;
#endif
}
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
static void zfLnxDisconnect(struct usb_device *dev, void *ptr)
#else
static void zfLnxDisconnect(struct usb_interface *interface)
#endif
{
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
struct usbdrv_private *macp = (struct usbdrv_private *) usb_get_intfdata(interface);
#else
struct usbdrv_private *macp = (struct usbdrv_private *)ptr;
#endif
printk(KERN_DEBUG "zfLnxDisconnect\n");
if (!macp)
{
printk(KERN_ERR "unregistering non-existant device\n");
return;
}
if (macp->driver_isolated)
{
if (macp->device->flags & IFF_UP)
usbdrv_close(macp->device);
}
#if 0
/* Close WDS */
//zfWdsClose(wds[0].dev);
/* Unregister WDS */
//zfUnregisterWdsDev(macp->device, 0);
/* Close VAP */
zfLnxVapClose(vap[0].dev);
/* Unregister VAP */
zfLnxUnregisterVapDev(macp->device, 0);
#endif
zfLnxClearStructs(macp->device);
unregister_netdev(macp->device);
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
usb_dec_dev_use(dev);
#else
usb_put_dev(interface_to_usbdev(interface));
#endif
//printk(KERN_ERR "3. zfLnxUnlinkAllUrbs\n");
//zfLnxUnlinkAllUrbs(macp);
/* Free network interface */
free_netdev(macp->device);
zfLnxFreeAllUrbs(macp);
//zfLnxClearStructs(macp->device);
kfree(macp);
macp = NULL;
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
usb_set_intfdata(interface, NULL);
#endif
}
static struct usb_driver zd1221_driver = {
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,15))
.owner = THIS_MODULE,
#endif
#endif
.name = driver_name,
.probe = zfLnxProbe,
.disconnect = zfLnxDisconnect,
.id_table = zd1221_ids,
};
int __init zfLnxIinit(void)
{
printk(KERN_NOTICE "%s - version %s\n", DRIVER_NAME, VERSIONID);
return usb_register(&zd1221_driver);
}
void __exit zfLnxExit(void)
{
usb_deregister(&zd1221_driver);
}
module_init(zfLnxIinit);
module_exit(zfLnxExit);

View File

@ -0,0 +1,43 @@
/*
* Copyright (c) 2007-2008 Atheros Communications Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* */
/* Module Name : zdusb.h */
/* */
/* Abstract */
/* This module contains definitions for USB device driver */
/* */
/* NOTES */
/* Platform dependent. */
/* */
/************************************************************************/
#ifndef _ZDUSB_H
#define _ZDUSB_H
#ifndef DRIVER_NAME
#define DRIVER_NAME "arusb"
#endif
#define VERSIONID "0.0.0.999"
/* Define these values to match your device */
#define VENDOR_ATHR 0x0CF3 //Atheros
#define PRODUCT_AR9170 0x9170
#define VENDOR_DLINK 0x07D1 //Dlink
#define PRODUCT_DWA160A 0x3C10
#endif